Ejemplo n.º 1
0
void GameEventsEnqueue(CArray *store, GameEvent e)
{
	if (store->elemSize == 0)
	{
		return;
	}
	// If we're the server, broadcast any events that clients need
	switch (e.Type)
	{
	case GAME_EVENT_ACTOR_ADD:
		NetServerBroadcastMsg(
			&gNetServer, SERVER_MSG_ACTOR_ADD, &e.u.ActorAdd);
		break;
	case GAME_EVENT_ACTOR_MOVE:
		NetServerBroadcastMsg(
			&gNetServer, SERVER_MSG_ACTOR_MOVE, &e.u.ActorMove);
		break;
	case GAME_EVENT_MISSION_END:
		NetServerBroadcastMsg(&gNetServer, SERVER_MSG_GAME_END, NULL);
		break;
	default:
		// do nothing
		break;
	}
	CArrayPushBack(store, &e);
}
Ejemplo n.º 2
0
static void StartPlayers(const int maxHealth, const int mission)
{
	for (int i = 0; i < (int)gPlayerDatas.size; i++)
	{
		PlayerData *p = CArrayGet(&gPlayerDatas, i);
		if (!p->IsUsed)
		{
			return;
		}
		PlayerDataStart(p, maxHealth, mission);
		NetServerBroadcastMsg(&gNetServer, SERVER_MSG_PLAYER_DATA, p);
	}
}
Ejemplo n.º 3
0
bool PlayerEquip(void)
{
	PlayerEquipData data;
	memset(&data, 0, sizeof data);
	data.IsOK = true;
	for (int i = 0, idx = 0; i < (int)gPlayerDatas.size; i++, idx++)
	{
		PlayerData *p = CArrayGet(&gPlayerDatas, i);
		if (!p->IsLocal)
		{
			idx--;
			continue;
		}

		// Remove unavailable weapons from players inventories
		RemoveUnavailableWeapons(p, &gMission.Weapons);

		WeaponMenuCreate(
			&data.menus[idx], GetNumPlayers(false, false, true), idx, i,
			&gEventHandlers, &gGraphicsDevice);
		// For AI players, pre-pick their weapons and go straight to menu end
		if (p->inputDevice == INPUT_DEVICE_AI)
		{
			const int lastMenuIndex =
				(int)data.menus[idx].ms.root->u.normal.subMenus.size - 1;
			data.menus[idx].ms.current = CArrayGet(
				&data.menus[idx].ms.root->u.normal.subMenus, lastMenuIndex);
			AICoopSelectWeapons(p, idx, &gMission.Weapons);
		}
	}

	GameLoopData gData = GameLoopDataNew(
		&data, PlayerEquipUpdate, &data, PlayerEquipDraw);
	GameLoop(&gData);

	for (int i = 0, idx = 0; i < (int)gPlayerDatas.size; i++, idx++)
	{
		PlayerData *p = CArrayGet(&gPlayerDatas, i);
		if (!p->IsLocal)
		{
			idx--;
			continue;
		}
		const NetMsgPlayerData d = NetMsgMakePlayerData(p);
		// Ready player definitions
		p->IsUsed = true;
		if (gCampaign.IsClient)
		{
			NetClientSendMsg(&gNetClient, MSG_PLAYER_DATA, &d);
		}
		else
		{
			NetServerBroadcastMsg(&gNetServer, MSG_PLAYER_DATA, &d);
		}
	}

	for (int i = 0; i < GetNumPlayers(false, false, true); i++)
	{
		MenuSystemTerminate(&data.menus[i].ms);
	}

	return data.IsOK;
}