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); }
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); } }
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; }