int on_d2gs_chat(void *p) { d2gs_packet_t *packet = D2GS_CAST(p); char *player = (char *) (packet->data + 9); char *message = (char *) (packet->data + 9 + strlen(player) + 1); if (!strcmp(message, ".continue")) { plugin_print("dclone", "%s took over - continuing hunt\n", player); relieved = TRUE; } return FORWARD_PACKET; }
int process_incoming_packet(void *p) { d2gs_packet_t *packet = D2GS_CAST(p); switch(packet->id) { case 0x51: { if (net_get_data(packet->data, 0, byte) == 0x02 && net_get_data(packet->data, 5, word) == 0x00ed) { wp.id = net_get_data(packet->data, 1, dword); wp.location.x = net_get_data(packet->data, 7, word); wp.location.y = net_get_data(packet->data, 9, word); } break; } case 0x59: { word x = net_get_data(packet->data, 21, word); word y = net_get_data(packet->data, 23, word); if (!x && !y) { bot.id = net_get_data(packet->data, 0, dword); } else if (bot.id == net_get_data(packet->data, 0, dword)) { bot.location.x = x; bot.location.y = y; } break; } case 0x5a: { // auto-accept party if (net_get_data(packet->data, 0, byte) == 0x07) { if (net_get_data(packet->data, 1, byte) == 0x02) { dword id = net_get_data(packet->data, 2, dword); if (net_get_data(packet->data, 6, byte) == 0x05) { d2gs_send(0x5e, "08 %d", id); } } } break; } } return FORWARD_PACKET; }
int d2gs_char_location_update(void *p) { d2gs_packet_t *packet = D2GS_CAST(p); switch (packet->id) { case 0x15: { // received packet if (bot.id == net_get_data(packet->data, 1, dword)) { bot.location.x = net_get_data(packet->data, 5, word); bot.location.y = net_get_data(packet->data, 7, word); } } break; case 0x95: { // received packet bot.location.x = net_extract_bits(packet->data, 45, 15); bot.location.y = net_extract_bits(packet->data, 61, 15); } break; case 0x01: case 0x03: { // sent packets bot.location.x = net_get_data(packet->data, 0, word); bot.location.y = net_get_data(packet->data, 2, word); } break; /*case 0x0c: { // sent packet //if (cur_rskill == 0x36) { bot.location.x = net_get_data(packet->data, 0, word); bot.location.y = net_get_data(packet->data, 2, word); //} }*/ break; } return FORWARD_PACKET; }
int invoke_packet_handlers(packet_t type, void *packet) { int forward = FORWARD_PACKET; packet_handler_t *handler; byte id; switch (type) { case BNCS_RECEIVED: case BNCS_SENT: id = BNCS_CAST(packet)->id; break; case MCP_RECEIVED: case MCP_SENT: id = MCP_CAST(packet)->id; break; case D2GS_RECEIVED: case D2GS_SENT: id = D2GS_CAST(packet)->id; break; case INTERNAL: id = INTERNAL_CAST(packet)->id; break; default: return forward; } struct iterator i = list_iterator(&packet_handlers[type][id]); while ((handler = iterator_next(&i))) { void *c; void *data = NULL; switch (type) { case BNCS_RECEIVED: case BNCS_SENT: c = calloc(1, sizeof(bncs_packet_t)); BNCS_CAST(c)->id = id; BNCS_CAST(c)->len = BNCS_CAST(packet)->len; if (bncs_has_payload(BNCS_CAST(packet))) { BNCS_CAST(c)->data = malloc(BNCS_CAST(packet)->len); data = BNCS_CAST(c)->data; memcpy(BNCS_CAST(c)->data, BNCS_CAST(packet)->data, BNCS_CAST(packet)->len - BNCS_HEADER_SIZE); } break; case MCP_RECEIVED: case MCP_SENT: c = calloc(1, sizeof(mcp_packet_t)); MCP_CAST(c)->id = id; MCP_CAST(c)->len = MCP_CAST(packet)->len; if (mcp_has_payload(MCP_CAST(packet))) { MCP_CAST(c)->data = malloc(MCP_CAST(packet)->len); data = MCP_CAST(c)->data; memcpy(MCP_CAST(c)->data, MCP_CAST(packet)->data, MCP_CAST(packet)->len - MCP_HEADER_SIZE); } break; case D2GS_RECEIVED: case D2GS_SENT: c = calloc(1, sizeof(d2gs_packet_t)); D2GS_CAST(c)->id = id; D2GS_CAST(c)->len = D2GS_CAST(packet)->len; if (d2gs_has_payload(D2GS_CAST(packet))) { D2GS_CAST(c)->data = malloc(D2GS_CAST(packet)->len); data = D2GS_CAST(c)->data; memcpy(D2GS_CAST(c)->data, D2GS_CAST(packet)->data, D2GS_CAST(packet)->len - D2GS_HEADER_SIZE); } break; case INTERNAL: c = calloc(1, sizeof(internal_packet_t)); INTERNAL_CAST(c)->id = id; INTERNAL_CAST(c)->len = INTERNAL_CAST(packet)->len; if (internal_has_payload(INTERNAL_CAST(packet))) { INTERNAL_CAST(c)->data = malloc(INTERNAL_CAST(packet)->len); data = INTERNAL_CAST(c)->data; memcpy(INTERNAL_CAST(c)->data, INTERNAL_CAST(packet)->data, INTERNAL_CAST(packet)->len - INTERNAL_HEADER_SIZE); } break; default: return forward; } forward = (*handler)((void *) c); free(c); if (data) { free(data); } if (forward == HIDE_PACKET || forward == BLOCK_PACKET) { iterator_destroy(&i); break; } } return forward; }