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; } } }
void joynet_send_client_chat(JOYNET_CLIENT * cp, char * message, int group) { if(cp->peer) { ENetPacket * packet; if(group) { packet = joynet_build_packet(JOYNET_CHAT_MESSAGE_GROUP_TALK, message, strlen(message) + 1); } else { packet = joynet_build_packet(JOYNET_CHAT_MESSAGE_TALK, message, strlen(message) + 1); } enet_peer_send(cp->peer, JOYNET_CHANNEL_CHAT, packet); enet_host_flush(cp->host); } }
void joynet_set_client_screen_name(JOYNET_CLIENT * cp, char * screen_name) { if(cp->peer) { ENetPacket * pp = joynet_build_packet(JOYNET_CHAT_MESSAGE_SET_NAME, screen_name, strlen(screen_name) + 1); enet_peer_send(cp->peer, JOYNET_CHANNEL_CHAT, pp); } }
void joynet_send_client_voip_data(JOYNET_CLIENT * cp, void * data, int size) { ENetPacket * pp; if(cp->peer) { pp = joynet_build_packet(JOYNET_CHAT_MESSAGE_VOIP, data, size); enet_peer_send(cp->peer, JOYNET_CHANNEL_CHAT, pp); } }
/* if we have new input send INPUT message * send NO_INPUT message when no new input has been received * call this once per tick */ void joynet_update_game_server(JOYNET_SERVER * sp, JOYNET_GAME * gp) { ENetPacket * pp; char data[1024]; int i, j; if(gp->state == JOYNET_GAME_STATE_PLAYING) { switch(gp->type) { case JOYNET_GAME_TYPE_MOUSE: { if(gp->input_buffer->frames) { /* pull the next input frame from the buffer and send it to everyone */ joynet_read_input_buffer_frame(joynet_current_server_game->input_buffer, data); for(i = 0; i < sp->max_clients; i++) { if(sp->client[i]->peer && (sp->client[i]->playing || sp->client[i]->spectating == 1)) { pp = joynet_build_packet(JOYNET_GAME_MESSAGE_INPUT, data, joynet_current_server_game->input_buffer->frame_size); enet_peer_send(sp->client[i]->peer, JOYNET_CHANNEL_GAME, pp); } } /* decode the input so we have a copy of the current inputs on the server */ joynet_serialize(gp->serial_data, data); if(gp->controller_axes > 0) { joynet_getw(gp->serial_data, &gp->player_mouse[0]->x); } if(gp->controller_axes > 1) { joynet_getw(gp->serial_data, &gp->player_mouse[0]->y); } if(gp->controller_axes > 2) { joynet_getw(gp->serial_data, &gp->player_mouse[0]->z); } if(gp->controller_buttons > 0) { joynet_getc(gp->serial_data, &gp->player_mouse[0]->b); } } /* if we have no buffered input, send NO_INPUT message */ else { for(i = 0; i < sp->max_clients; i++) { if(sp->client[i]->peer && (sp->client[i]->playing || sp->client[i]->spectating == 1)) { pp = joynet_create_packet(JOYNET_GAME_MESSAGE_NO_INPUT, NULL); enet_peer_send(sp->client[i]->peer, JOYNET_CHANNEL_GAME, pp); } } } break; } case JOYNET_GAME_TYPE_CONTROLLERS: { /* read next input frame and send to everyone */ if(joynet_current_server_game->input_buffer->frames) { joynet_read_input_buffer_frame(joynet_current_server_game->input_buffer, data); for(i = 0; i < sp->max_clients; i++) { if(sp->client[i]->peer && (sp->client[i]->playing || sp->client[i]->spectating == 1)) { pp = joynet_build_packet(JOYNET_GAME_MESSAGE_INPUT, data, joynet_current_server_game->input_buffer->frame_size); enet_peer_send(sp->client[i]->peer, JOYNET_CHANNEL_GAME, pp); } } } /* send NO_INPUT message if we don't have anything in the buffer */ else { for(i = 0; i < sp->max_clients; i++) { if(sp->client[i]->peer && (sp->client[i]->playing || sp->client[i]->spectating == 1)) { pp = joynet_create_packet(JOYNET_GAME_MESSAGE_NO_INPUT, NULL); enet_peer_send(sp->client[i]->peer, JOYNET_CHANNEL_GAME, pp); } } } unsigned char axis_data; joynet_serialize(gp->serial_data, data); for(i = 0; i < gp->players; i++) { if(gp->player[i]->playing) { if(gp->controller_axes > 0) { joynet_getc(gp->serial_data, (char *)(&axis_data)); gp->player_controller[i]->axis[0] = (float)axis_data / 127.5 - 1.0; } if(gp->controller_axes > 1) { joynet_getc(gp->serial_data, (char *)(&axis_data)); gp->player_controller[i]->axis[1] = (float)axis_data / 127.5 - 1.0; } if(gp->controller_axes > 2) { joynet_getc(gp->serial_data, (char *)(&axis_data)); gp->player_controller[i]->axis[2] = (float)axis_data / 127.5 - 1.0; } if(gp->controller_buttons > 0) { joynet_getc(gp->serial_data, &gp->player_controller[i]->bits[0]); for(j = 0; j < 8; j++) { gp->player_controller[i]->button[j] = ((gp->player_controller[i]->bits[0] >> j) & 1); } } if(gp->controller_buttons > 8) { joynet_getc(gp->serial_data, &gp->player_controller[i]->bits[1]); for(j = 0; j < 8; j++) { gp->player_controller[i]->button[j + 8] = ((gp->player_controller[i]->bits[1] >> j) & 1); } } } } break; } }