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