Пример #1
0
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;
}
Пример #2
0
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;
}
Пример #3
0
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;
}
Пример #4
0
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;
}