rendered paste bodyvoid 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;
}