void joynet_handle_server_chat_message(JOYNET_SERVER * sp, JOYNET_MESSAGE * mp) { switch(mp->type) { case JOYNET_CHAT_MESSAGE_SET_NAME: { int client = joynet_get_client_from_peer(sp, mp->event->peer); ENetPacket * packet; /* send SET_NAME message back to client to finalize the change */ strcpy(sp->client[client]->screen_name, mp->data); packet = joynet_build_packet(JOYNET_CHAT_MESSAGE_SET_NAME, mp->data, strlen(mp->data) + 1); enet_peer_send(sp->client[client]->peer, JOYNET_CHANNEL_CHAT, packet); break; } case JOYNET_CHAT_MESSAGE_SET_GROUP: { int client = joynet_get_client_from_peer(sp, mp->event->peer); ENetPacket * packet; joynet_serialize(sp->serial_data, mp->data); joynet_getw(sp->serial_data, &sp->client[client]->group); /* send SET_GROUP message back to client to finalize the change */ packet = joynet_build_packet(JOYNET_CHAT_MESSAGE_SET_GROUP, mp->data, sizeof(short)); enet_peer_send(sp->client[client]->peer, JOYNET_CHANNEL_CHAT, packet); break; } case JOYNET_CHAT_MESSAGE_TALK: case JOYNET_CHAT_MESSAGE_GROUP_TALK: { int client = joynet_get_client_from_peer(sp, mp->event->peer); char data[1024] = {0}; short name_length = strlen(sp->client[client]->screen_name) + 1; short message_length = strlen(mp->data) + 1; ENetPacket * packet; int i; /* TALK message is different for client, contains user name and message */ joynet_serialize(sp->serial_data, data); joynet_putw(sp->serial_data, name_length); joynet_putw(sp->serial_data, message_length); joynet_write(sp->serial_data, sp->client[client]->screen_name, name_length); joynet_write(sp->serial_data, mp->data, message_length); packet = joynet_create_packet(JOYNET_CHAT_MESSAGE_TALK, sp->serial_data); for(i = 0; i < sp->max_clients; i++) { if((sp->client[i]->peer) && ((mp->type == JOYNET_CHAT_MESSAGE_GROUP_TALK) || (sp->client[i]->group == sp->client[client]->group))) { enet_peer_send(sp->client[i]->peer, JOYNET_CHANNEL_CHAT, packet); } } break; } } }
/* high level functions */ void joynet_update_player_options(JOYNET_GAME * gp, int player) { char data[1024] = {0}; ENetPacket * pp; int i; if(gp->client && gp->player[player]->local) { joynet_serialize(gp->client->serial_data, data); joynet_putw(gp->client->serial_data, player); joynet_putw(gp->client->serial_data, strlen(gp->player[player]->name) + 1); joynet_write(gp->client->serial_data, gp->player[player]->name, strlen(gp->player[player]->name) + 1); joynet_putw(gp->client->serial_data, gp->player[player]->options); for(i = 0; i < gp->player[player]->options; i++) { joynet_putl(gp->client->serial_data, *gp->player[player]->option[i]); } pp = joynet_create_packet(JOYNET_GAME_MESSAGE_UPDATE_PLAYER_OPTIONS, gp->client->serial_data); enet_peer_send(gp->client->peer, JOYNET_CHANNEL_GAME, pp); } else { JOYNET_MESSAGE message; if(gp->callback) { joynet_serialize(gp->serial_data, data); joynet_putw(gp->serial_data, player); joynet_putw(gp->serial_data, strlen(gp->player[player]->name) + 1); joynet_write(gp->serial_data, gp->player[player]->name, strlen(gp->player[player]->name) + 1); joynet_putw(gp->serial_data, gp->player[player]->options); for(i = 0; i < gp->player[player]->options; i++) { joynet_putl(gp->serial_data, *gp->player[player]->option[i]); } message.type = JOYNET_GAME_MESSAGE_UPDATE_PLAYER_OPTIONS; message.data = data; message.data_size = joynet_get_serial_size(gp->serial_data); message.event = NULL; gp->callback(&message); } } }
int joynet_connect_to_game_server(JOYNET_GAME * gp, JOYNET_CLIENT * cp, char * address, int port) { char data[256]; ENetPacket * pp; if(joynet_connect_client_to_server(cp, address, port)) { joynet_serialize(cp->serial_data, data); joynet_putw(cp->serial_data, strlen(gp->name) + 1); joynet_write(cp->serial_data, gp->name, strlen(gp->name) + 1); pp = joynet_create_packet(JOYNET_GAME_MESSAGE_CHECK_ID, cp->serial_data); enet_peer_send(cp->peer, JOYNET_CHANNEL_GAME, pp); joynet_reset_game(gp); joynet_current_game = gp; return 1; } return 0; }
void joynet_connect_to_game(JOYNET_GAME * gp, short controller, short player) { char data[6] = {0}; ENetPacket * pp; int assigned_player = player; int i; if(gp->client) { joynet_serialize(gp->client->serial_data, data); joynet_putw(gp->client->serial_data, controller); joynet_putw(gp->client->serial_data, player); pp = joynet_create_packet(JOYNET_GAME_MESSAGE_CONNECT, gp->client->serial_data); enet_peer_send(gp->client->peer, JOYNET_CHANNEL_GAME, pp); } else { if(player < 0) { for(i = 0; i < gp->players; i++) { if(!gp->player[i]->playing) { assigned_player = i; break; } } } if(assigned_player >= 0) { if(!gp->player[assigned_player]->playing) { gp->player[assigned_player]->playing = 1; if(gp->type == JOYNET_GAME_TYPE_CONTROLLERS) { gp->player_controller[assigned_player]->port = assigned_player; } else if(gp->type == JOYNET_GAME_TYPE_MOUSE) { gp->player_mouse[assigned_player]->port = assigned_player; } gp->player[assigned_player]->local = 1; gp->player_count++; if(gp->type == JOYNET_GAME_TYPE_CONTROLLERS) { gp->controller[controller]->port = assigned_player; } else if(gp->type == JOYNET_GAME_TYPE_MOUSE) { gp->mouse[controller]->port = assigned_player; } /* reset selections to prevent bugs */ memset(gp->player[assigned_player]->selected_content, 0, sizeof(unsigned long) * JOYNET_GAME_MAX_CONTENT_LISTS); memset(gp->player[assigned_player]->selected_content_index, 0, sizeof(int) * JOYNET_GAME_MAX_CONTENT_LISTS); if(gp->callback) { JOYNET_MESSAGE message; /* send connect message */ message.type = JOYNET_GAME_MESSAGE_CONNECT; joynet_serialize(gp->serial_data, data); joynet_putw(gp->serial_data, controller); joynet_putw(gp->serial_data, assigned_player); message.data = data; message.data_size = 4; message.event = NULL; gp->callback(&message); /* send add player message */ message.type = JOYNET_GAME_MESSAGE_ADD_PLAYER; joynet_serialize(gp->serial_data, data); joynet_putw(gp->serial_data, assigned_player); joynet_putw(gp->serial_data, 2); joynet_write(gp->serial_data, "", 2); message.data = data; message.data_size = 6; message.event = NULL; gp->callback(&message); } } } } }