All pastes #108889 Raw Edit

freeone3000

public text v1 · immutable
#108889 ·published 2006-07-31 18:59 UTC
rendered paste body
void process_message(Uint8 protocol, Uint8 * in_data, int len)
{
	switch (protocol) {
	case RAW_TEXT:
		{
			if (len < 4)
				return;
			check_message_type(in_data, len);
		}
		break;
	case ADD_NEW_ACTOR:
		add_actor(in_data, 0);
		break;
	case ADD_NEW_ENHANCED_ACTOR:
		add_actor(in_data, 1);
		break;
	case ADD_ACTOR_COMMAND:
		add_actor_command(*((short *) (in_data)), *(in_data + 2));
		break;
	case REMOVE_ACTOR:
		remove_actor(*((short *) (in_data)));
		break;
	case KILL_ALL_ACTORS:
		remove_all_actors();
		break;
	case NEW_MINUTE:
		game_minute = *((short *) (in_data));
		new_minute = 1;
		break;
	case LOG_IN_OK:
		{
			char str[200];
			sprintf(str, "Succesful login");
			add_to_buffer(str, strlen(str), CONSOLE_TEXT, 1);
			break;
		}
	case LOG_IN_NOT_OK:
		{
			char str[200];
			sprintf(str, "Unsuccesful login");
			add_to_buffer(str, strlen(str), CONSOLE_TEXT, 1);
		}
		break;
	case YOU_DONT_EXIST:
		{
			char str[200];
			sprintf(str, "%s does not exist", login_name);
			add_to_buffer(str, strlen(str), CONSOLE_TEXT, 1);
		}
		break;
	case PONG:
		{
			char str[200];
			sprintf(str, "Server latency: %i",
				SDL_GetTicks() - *((Uint32 *) (in_data)));
			add_to_buffer(str, strlen(str), CONSOLE_TEXT, 1);
		}
	case YOU_ARE:
		actor_me = *((short *) (in_data));
		break;
	case BUDDY_EVENT:
		break;
	case CHANGE_MAP:
		have_map = 0;
		getting_location_str = 1;
		send_message(el_socket, NULL, LOCATE_ME, 0);
		break;
	case GET_ACTIVE_CHANNELS:
		set_active_channels(in_data[3], (Uint32*)(in_data+4), (len-2)/4);
		break;
	default:
		break;
	}
}

unsigned char in_data[1024];

int read_server()
{
	Uint16 len;
	char protocol[3];
	if ((SDLNet_TCP_Recv(el_socket, protocol, 3)) == 3) {
		len = *((short *) (protocol + 1)) - 1;

		if (len > 1024)	//Ugh, the message was too long - this is bad, so don't add it to the buffer
		{
			disconnected = 1;
			return 1;
		}

		if (SDLNet_TCP_Recv(el_socket, in_data, len) == len) {
			in_data[len] = 0;
			process_message(*protocol, in_data, len);
		} else {
			disconnected = 1;
			return 1;
		}
	} else {
		disconnected = 1;
		return 0;
	}

	return 1;
}

int send_message(TCPsocket socket, char *message, int type, int length)
{
	char str[1024] = { 0 };
	if (disconnected)
		return 0;
	last_heart_beat = cur_time;
	str[0] = type;
	*((short *) (str + 1)) = (short) length + 1;
	memcpy(&str[3], message, length);
	return SDLNet_TCP_Send(socket, str, length + 3);
}
void set_active_channels (Uint8 active, const Uint32 *channels, int nchan) {
	int i;
	for(i=0; i<nchan; i++) {
		cur_chans[i] = SDL_SwapLE32(channels[i]);
	}
	for(; i<MAX_ACTIVE_CHANNELS; i++) {
		cur_chans[i] = 0;
	}
#ifdef ELC_CHAT_DEBUG
	char *c = malloc(sizeof(char)*100);
	add_to_text_log("set_active_channels called!");
	for(i=0; i<nchan; i++) {
		sprintf(c, "Channel %d is %d instead of %d", i, cur_chans[i], channels[i]);
		add_to_text_log(c);
	}
	//Free c here.
#endif
	cur_chan = active;
}