/** * @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; }
TEST(ObjectScopeTest, TestItemPropagation) { for(S32 i = 0; i < testInfos.size(); i++) { // Create a GamePair using our text item code, with 2 clients; one will be red, the other blue. // The test will confirm which players get the red text item, the blue line, and the zone object. string levelCode = getLevelCodeForItemPropagationTests(testInfos[i].itemToTest); GamePair gamePair(levelCode, 2); // First, ensure we have two players, one red, one blue ServerGame *serverGame = gamePair.server; ASSERT_EQ(2, serverGame->getPlayerCount()); ASSERT_EQ(Colors::blue.toHexString(), serverGame->getTeamColor(0).toHexString()); ASSERT_EQ(Colors::red.toHexString(), serverGame->getTeamColor(1).toHexString()); // Do the following rigamarole to break dependency on assumption client0 is blue and client1 is red ClientGame *client0 = gamePair.getClient(0); ClientGame *client1 = gamePair.getClient(1); ClientGame *blue = (serverGame->getTeamColor(client0->getLocalRemoteClientInfo()->getTeamIndex()).toHexString() == Colors::blue.toHexString()) ? client0 : client1; ClientGame *red = (serverGame->getTeamColor(client0->getLocalRemoteClientInfo()->getTeamIndex()).toHexString() == Colors::red.toHexString()) ? client0 : client1; ASSERT_EQ(Colors::blue.toHexString(), serverGame->getTeamColor(blue->getLocalRemoteClientInfo()->getTeamIndex()).toHexString()); ASSERT_EQ(Colors::red.toHexString(), serverGame->getTeamColor(red->getLocalRemoteClientInfo()->getTeamIndex()).toHexString()); ASSERT_FALSE(serverGame->getClientInfos()->get(0)->getConnection()->mInCommanderMap); ASSERT_FALSE(serverGame->getClientInfos()->get(1)->getConnection()->mInCommanderMap); // Now that we know which client is which, we can check to see which objects are available where { SCOPED_TRACE("Not in CommandersMap // " + testInfos[i].itemToTest); testScope(serverGame, blue, red, testInfos[i], testInfos[i].startingCondition); } // Turn on cmdrs map... should not affect results red->setUsingCommandersMap(true); blue->setUsingCommandersMap(true); gamePair.idle(10, 5); // Let things settle ASSERT_TRUE(serverGame->getClientInfos()->get(0)->getConnection()->mInCommanderMap); ASSERT_TRUE(serverGame->getClientInfos()->get(1)->getConnection()->mInCommanderMap); { SCOPED_TRACE("In CommandersMap // " + testInfos[i].itemToTest); testScope(serverGame, blue, red, testInfos[i], testInfos[i].startingCondition); } Vector<DatabaseObject *> fillVector; // Change the textitem from red to blue serverGame->getLevel()->findObjects(testInfos[i].objectTypeNumber, fillVector); ASSERT_EQ(1, fillVector.size()); BfObject *obj = static_cast<BfObject *>(fillVector[0]); obj->setTeam(0); // Blue team gamePair.idle(10, 5); // Let things settle { SCOPED_TRACE("Item Moved To Blue // " + testInfos[i].itemToTest); testScope(serverGame, blue, red, testInfos[i], testInfos[i].itemMovedToBlue); } obj->setTeam(1); // Back to red gamePair.idle(10, 5); // Let things settle { SCOPED_TRACE("Item Moved To Red // " + testInfos[i].itemToTest); testScope(serverGame, blue, red, testInfos[i], testInfos[i].itemMovedToRed); } // Now change the player's team from blue to red blue->changeOwnTeam(1); EXPECT_EQ(0, blue->getLocalRemoteClientInfo()->getTeamIndex()) << "Expect this client to be on team 0 (change hasn't propagated yet)"; gamePair.idle(10, 5); // Let things settle EXPECT_EQ(1, blue->getLocalRemoteClientInfo()->getTeamIndex()) << "Expect this client to be on team 1 (change should have propagated)"; EXPECT_EQ(1, serverGame->getClientInfos()->get(0)->getTeamIndex()); EXPECT_EQ(1, serverGame->getClientInfos()->get(1)->getTeamIndex()); { SCOPED_TRACE("Blue Player Moved To Red, Items On Red // " + testInfos[i].itemToTest); testScope(serverGame, blue, red, testInfos[i], testInfos[i].playersMovedToRed); } // And put both players on blue blue->changeOwnTeam(0); red->changeOwnTeam(0); EXPECT_EQ(1, blue->getLocalRemoteClientInfo()->getTeamIndex()) << "Expect this client to be on team 1 (change hasn't propagated yet)"; EXPECT_EQ(1, red->getLocalRemoteClientInfo()->getTeamIndex()) << "Expect this client to be on team 1 (change hasn't propagated yet)"; gamePair.idle(10, 5); // Let things settle EXPECT_EQ(0, blue->getLocalRemoteClientInfo()->getTeamIndex()) << "Expect this client to be on team 0 (change should have propagated)"; EXPECT_EQ(0, blue->getLocalRemoteClientInfo()->getTeamIndex()) << "Expect this client to be on team 0 (change should have propagated)"; EXPECT_EQ(0, serverGame->getClientInfos()->get(0)->getTeamIndex()); EXPECT_EQ(0, serverGame->getClientInfos()->get(1)->getTeamIndex()); { SCOPED_TRACE("Both Players Moved To Blue, Items On Red // " + testInfos[i].itemToTest); testScope(serverGame, blue, red, testInfos[i], testInfos[i].playersMovedToBlue); } // Make items neutral and see if they propagate properly fillVector.clear(); serverGame->getLevel()->findObjects(testInfos[i].objectTypeNumber, fillVector); ASSERT_EQ(1, fillVector.size()); for(S32 j = 0; j < fillVector.size(); j++) static_cast<BfObject *>(fillVector[j])->setTeam(TEAM_NEUTRAL); gamePair.idle(10, 5); // Let things settle { SCOPED_TRACE("Items On Neutral // " + testInfos[i].itemToTest); testScope(serverGame, blue, red, testInfos[i], testInfos[i].itemMovedToNeutral); } for(S32 j = 0; j < fillVector.size(); j++) static_cast<BfObject *>(fillVector[j])->setTeam(TEAM_HOSTILE); gamePair.idle(10, 5); // Let things settle { SCOPED_TRACE("Items On Hostile // " + testInfos[i].itemToTest); testScope(serverGame, blue, red, testInfos[i], testInfos[i].itemsMovedToHostile); } } }