// Makes sure that the mTeams[] structure has the proper player counts // Needs to be called manually before accessing the structure // Bot counts do work on client. Yay! // Rating may only work on server... not tested on client void Game::countTeamPlayers() const { for(S32 i = 0; i < getTeamCount(); i++) { TNLAssert(dynamic_cast<Team *>(getTeam(i)), "Invalid team"); // Assert for safety static_cast<Team *>(getTeam(i))->clearStats(); // static_cast for speed } for(S32 i = 0; i < getClientCount(); i++) { ClientInfo *clientInfo = getClientInfo(i); S32 teamIndex = clientInfo->getTeamIndex(); if(teamIndex >= 0 && teamIndex < getTeamCount()) { // Robot could be neutral or hostile, skip out-of-range team numbers TNLAssert(dynamic_cast<Team *>(getTeam(teamIndex)), "Invalid team"); Team *team = static_cast<Team *>(getTeam(teamIndex)); if(clientInfo->isRobot()) team->incrementBotCount(); else team->incrementPlayerCount(); // The following bit won't work on the client... if(isServer()) { const F32 BASE_RATING = .1f; team->addRating(max(clientInfo->getCalculatedRating(), BASE_RATING)); } } } }
/** * @luafunc table Team::getPlayers() * * @brief Get a table containing all players on a team. * * @code * local players = team:getPlayers() * for i, v in ipairs(players) do * print(v:getName()) * end * @endcode * * @return A table of \link LuaPlayerInfo LuaPlayerInfos \endlink currently on this * team. */ S32 Team::lua_getPlayers(lua_State *L) { ServerGame *game = GameManager::getServerGame(); TNLAssert(game->getPlayerCount() == game->getClientCount(), "Mismatched player counts!"); S32 pushed = 0; lua_newtable(L); // Create a table, with no slots pre-allocated for our data for(S32 i = 0; i < game->getClientCount(); i++) { ClientInfo *clientInfo = game->getClientInfo(i); if(clientInfo->getTeamIndex() == mTeamIndex) { clientInfo->getPlayerInfo()->push(L); pushed++; // Increment pushed before using it because Lua uses 1-based arrays lua_rawseti(L, 1, pushed); } } for(S32 i = 0; i < game->getRobotCount(); i ++) { if(game->getBot(i)->getTeam() == mTeamIndex) { game->getBot(i)->getPlayerInfo()->push(L); pushed++; // Increment pushed before using it because Lua uses 1-based arrays lua_rawseti(L, 1, pushed); } } return 1; }
// By rebuilding everything every tick, menus can be dynamically updated void PlayerMenuUserInterface::idle(U32 timeDelta) { clearMenuItems(); GameConnection *conn = getGame()->getConnectionToServer(); if(!conn) return; char c[] = "A"; // Dummy shortcut key for(S32 i = 0; i < getGame()->getClientCount(); i++) { ClientInfo *clientInfo = ((Game *)getGame())->getClientInfo(i); // Lame! strncpy(c, clientInfo->getName().getString(), 1); // Grab first char of name for a shortcut key // Will be used to show admin/player/robot prefix on menu PlayerType pt = clientInfo->isRobot() ? PlayerTypeRobot : (clientInfo->isAdmin() ? PlayerTypeAdmin : PlayerTypePlayer); PlayerMenuItem *newItem = new PlayerMenuItem(i, clientInfo->getName().getString(), playerSelectedCallback, InputCodeManager::stringToInputCode(c), pt); newItem->setUnselectedColor(getGame()->getTeamColor(clientInfo->getTeamIndex())); addMenuItem(newItem); } sortMenuItems(); if(action == PlayerActionKick) mMenuTitle = "CHOOSE PLAYER TO KICK"; else if(action == PlayerActionChangeTeam) mMenuTitle = "CHOOSE WHOSE TEAM TO CHANGE"; else TNLAssert(false, "Unknown action!"); }
// Given a player's name, return his team S32 Game::getTeamIndex(const StringTableEntry &playerName) { ClientInfo *clientInfo = findClientInfo(playerName); // Returns NULL if player can't be found return clientInfo ? clientInfo->getTeamIndex() : TEAM_NEUTRAL; // If we can't find the team, let's call it neutral }