示例#1
0
文件: chat.c 项目: showkoba/JoyNet
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
文件: game.c 项目: showkoba/JoyNet
/* 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);
		}
	}
}
示例#3
0
文件: game.c 项目: showkoba/JoyNet
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;
}
示例#4
0
文件: game.c 项目: NewCreature/JoyNet
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);
				}
			}
		}
	}
}