int MultiPlayer::Play(const string &url) { vector<string> urls; StringUtil::Split(url, ' ', urls); for (auto iter = urls.begin(); iter != urls.end(); iter++) { shared_ptr<OnePlayer> onePlayer(new OnePlayer()); shared_ptr<Player> player = shared_ptr<Player>(new Player()); player->SetPlayerProcdule(this, onePlayer.get()); player->Open(*iter, ""); onePlayer->mplayer = player; onePlayer->mid = mopenCount++; onePlayer->mindex = onePlayer->mid; this->mplayerList.push_back(onePlayer); } return 0; }
inline void KOTHEventHandler::process(bz_EventData * eventData) { if (!koth.enabled) // King of the Hill disabled - we can leave return; if (onePlayer()) // Not enough players - we can leave return; float pos[3] = { 0 }; int playerID = -1; switch (eventData->eventType) { case bz_ePlayerUpdateEvent: pos[0] = ((bz_PlayerUpdateEventData_V1 *) eventData)->state.pos[0]; pos[1] = ((bz_PlayerUpdateEventData_V1 *) eventData)->state.pos[1]; pos[2] = ((bz_PlayerUpdateEventData_V1 *) eventData)->state.pos[2]; playerID = ((bz_PlayerUpdateEventData_V1 *) eventData)->playerID; break; case bz_eShotFiredEvent: pos[0] = ((bz_ShotFiredEventData_V1 *) eventData)->pos[0]; pos[1] = ((bz_ShotFiredEventData_V1 *) eventData)->pos[1]; pos[2] = ((bz_ShotFiredEventData_V1 *) eventData)->pos[2]; playerID = ((bz_ShotFiredEventData_V1 *) eventData)->playerID; break; default: return; } if (!koth.toldHillOpen && koth.id == -1) // Hill is open - inform players { bz_sendTextMessage(BZ_SERVER, BZ_ALLUSERS, "Hill is not controlled - take it!"); koth.toldHillOpen = true; } if (kothzone.pointIn(pos)) // player is on Hill { bz_BasePlayerRecord *player = bz_getPlayerByIndex(playerID); if (player) { if (player->playerID != koth.playerJustWon && player->spawned) { if ((koth.id == -1 && player->team != koth.team) || (koth.id == -1 && teamClear(koth.team))) initiatekoth(player->team, player->callsign, player->playerID); double timeStanding = bz_getCurrentTime() - koth.startTime; if (timeStanding >= koth.adjustedTime && koth.id != -1) // time's up - kill 'em { if (koth.teamPlay && koth.team != eRogueTeam) killTeams(koth.team, koth.callsign); else killPlayers(koth.id, koth.callsign); if (!koth.teamPlay || koth.team == eRogueTeam) bz_sendTextMessage(BZ_SERVER, koth.id, "You are King of the Hill! You must leave hill to retake it."); else bz_sendTextMessage(BZ_SERVER, koth.team, "Your team is King of the Hill! Entire team must leave hill to retake it."); koth.playerJustWon = koth.id; koth.id = -1; return; } if (koth.id != -1) sendWarnings(getTeamColor(koth.team), koth.callsign, koth.startTime); } } bz_freePlayerRecord(player); } else { // player is off Hill if (playerID == koth.playerJustWon) koth.playerJustWon = -1; if (playerID == koth.id) { koth.id = -1; koth.team = eNoTeam; } } }