remove player from team when leaving
This commit is contained in:
@@ -67,6 +67,8 @@ public:
|
|||||||
|
|
||||||
const TeamList& GetTeams() const { return m_Teams; }
|
const TeamList& GetTeams() const { return m_Teams; }
|
||||||
|
|
||||||
|
void RemovePlayer(PlayerID pId);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace game
|
} // namespace game
|
||||||
|
|||||||
@@ -74,6 +74,7 @@ public:
|
|||||||
|
|
||||||
void AddPlayer(Player* newPlayer);
|
void AddPlayer(Player* newPlayer);
|
||||||
void RemovePlayer(const Player* player);
|
void RemovePlayer(const Player* player);
|
||||||
|
void ClearPlayers();
|
||||||
|
|
||||||
TeamColor GetColor() const;
|
TeamColor GetColor() const;
|
||||||
|
|
||||||
|
|||||||
@@ -163,13 +163,14 @@ void Server::BroadcastPacket(const protocol::Packet* packet) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Server::RemoveConnexion(std::uint8_t connexionID) {
|
void Server::RemoveConnexion(std::uint8_t connexionID) {
|
||||||
auto it = GetPlayers().find(connexionID);
|
std::string playerName = GetGame().GetPlayerById(connexionID)->GetName();
|
||||||
if (it != GetPlayers().end()) {
|
|
||||||
GetPlayers().erase(it);
|
GetGame().RemovePlayer(connexionID);
|
||||||
utils::LOG(utils::format("\t[%s] left !", it->second.GetName().c_str()));
|
|
||||||
}
|
|
||||||
m_Connections.erase(connexionID);
|
m_Connections.erase(connexionID);
|
||||||
m_Lobby.OnPlayerLeave(connexionID);
|
m_Lobby.OnPlayerLeave(connexionID);
|
||||||
|
|
||||||
|
utils::LOG(utils::format("\t[%s] left !", playerName.c_str()));
|
||||||
|
|
||||||
OnPlayerLeave(connexionID);
|
OnPlayerLeave(connexionID);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -28,7 +28,7 @@
|
|||||||
|
|
||||||
#define KEEP_ALIVE_TIMEOUT 10 * 1000 // 10s
|
#define KEEP_ALIVE_TIMEOUT 10 * 1000 // 10s
|
||||||
|
|
||||||
#define SAFE_CHECK(expr) if(expr) return
|
#define SAFE_CHECK(expr) if(!(expr)) return
|
||||||
|
|
||||||
namespace td {
|
namespace td {
|
||||||
namespace server {
|
namespace server {
|
||||||
@@ -116,12 +116,20 @@ void ServerConnexion::HandlePacket(const protocol::PlayerLoginPacket* packet) {
|
|||||||
protocol::PlayerListPacket listPacket(playerNames);
|
protocol::PlayerListPacket listPacket(playerNames);
|
||||||
SendPacket(&listPacket);
|
SendPacket(&listPacket);
|
||||||
|
|
||||||
|
protocol::UpdateGameStatePacket statePacket(m_Server->GetGame().GetGameState());
|
||||||
|
SendPacket(&statePacket);
|
||||||
|
|
||||||
|
protocol::WorldBeginDataPacket headerDataPacket(m_Server->GetGame().GetWorld());
|
||||||
|
protocol::WorldBeginDataPacket dataPacket(m_Server->GetGame().GetWorld());
|
||||||
|
SendPacket(&headerDataPacket);
|
||||||
|
SendPacket(&dataPacket);
|
||||||
|
|
||||||
m_Server->GetGame().NotifyListeners(&game::GameListener::OnPlayerJoin, m_ID);
|
m_Server->GetGame().NotifyListeners(&game::GameListener::OnPlayerJoin, m_ID);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ServerConnexion::HandlePacket(const protocol::SelectTeamPacket* packet) {
|
void ServerConnexion::HandlePacket(const protocol::SelectTeamPacket* packet) {
|
||||||
SAFE_CHECK(m_Server->GetGame().GetGameState() != game::GameState::Lobby);
|
SAFE_CHECK(m_Server->GetGame().GetGameState() == game::GameState::Lobby);
|
||||||
|
|
||||||
if (static_cast<std::int8_t>(packet->GetSelectedTeam()) >= -1 || static_cast<std::int8_t>(packet->GetSelectedTeam()) <= 1) {
|
if (static_cast<std::int8_t>(packet->GetSelectedTeam()) >= -1 || static_cast<std::int8_t>(packet->GetSelectedTeam()) <= 1) {
|
||||||
if (m_Player->GetTeamColor() == game::TeamColor::None) { // join a team
|
if (m_Player->GetTeamColor() == game::TeamColor::None) { // join a team
|
||||||
@@ -156,18 +164,8 @@ void ServerConnexion::SetServer(Server* server) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ServerConnexion::InitConnection() {
|
void ServerConnexion::InitConnection() {
|
||||||
protocol::UpdateGameStatePacket statePacket(m_Server->GetGame().GetGameState());
|
|
||||||
SendPacket(&statePacket);
|
|
||||||
|
|
||||||
protocol::ConnexionInfoPacket conPacket(m_ID);
|
protocol::ConnexionInfoPacket conPacket(m_ID);
|
||||||
SendPacket(&conPacket);
|
SendPacket(&conPacket);
|
||||||
|
|
||||||
SAFE_CHECK(m_Server->GetGame().GetGameState() != game::GameState::Game);
|
|
||||||
|
|
||||||
protocol::WorldBeginDataPacket headerDataPacket(m_Server->GetGame().GetWorld());
|
|
||||||
protocol::WorldBeginDataPacket dataPacket(m_Server->GetGame().GetWorld());
|
|
||||||
SendPacket(&headerDataPacket);
|
|
||||||
SendPacket(&dataPacket);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ServerConnexion::HandlePacket(const protocol::PlaceTowerPacket* packet) {
|
void ServerConnexion::HandlePacket(const protocol::PlaceTowerPacket* packet) {
|
||||||
@@ -177,10 +175,10 @@ void ServerConnexion::HandlePacket(const protocol::PlaceTowerPacket* packet) {
|
|||||||
|
|
||||||
Vec2f towerPos = { static_cast<float>(packet->GetTowerX()), static_cast<float>(packet->GetTowerY()) };
|
Vec2f towerPos = { static_cast<float>(packet->GetTowerX()), static_cast<float>(packet->GetTowerY()) };
|
||||||
|
|
||||||
SAFE_CHECK(!world->CanPlaceLittleTower(towerPos, m_ID));
|
SAFE_CHECK(world->CanPlaceLittleTower(towerPos, m_ID));
|
||||||
|
|
||||||
if (towerInfo.IsBigTower())
|
if (towerInfo.IsBigTower())
|
||||||
SAFE_CHECK(!world->CanPlaceBigTower(towerPos, m_ID));
|
SAFE_CHECK(world->CanPlaceBigTower(towerPos, m_ID));
|
||||||
|
|
||||||
game::TowerPtr tower = world->PlaceTowerAt(towerType, packet->GetTowerX(), packet->GetTowerY(), m_ID);
|
game::TowerPtr tower = world->PlaceTowerAt(towerType, packet->GetTowerX(), packet->GetTowerY(), m_ID);
|
||||||
|
|
||||||
|
|||||||
@@ -20,6 +20,10 @@ void Game::Tick(std::uint64_t delta) {
|
|||||||
void Game::Reset() {
|
void Game::Reset() {
|
||||||
m_World->Reset();
|
m_World->Reset();
|
||||||
|
|
||||||
|
for (auto team : m_Teams) {
|
||||||
|
team.ClearPlayers();
|
||||||
|
}
|
||||||
|
|
||||||
for (auto& [id, player] : m_Players) {
|
for (auto& [id, player] : m_Players) {
|
||||||
player.SetExp(0);
|
player.SetExp(0);
|
||||||
player.SetGold(0);
|
player.SetGold(0);
|
||||||
@@ -43,5 +47,20 @@ const Player* Game::GetPlayerById(PlayerID id) const {
|
|||||||
return &it->second;
|
return &it->second;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Game::RemovePlayer(PlayerID pId) {
|
||||||
|
Player* player = GetPlayerById(pId);
|
||||||
|
|
||||||
|
if (!player) return;
|
||||||
|
|
||||||
|
TeamColor team = player->GetTeamColor();
|
||||||
|
|
||||||
|
GetTeam(team).RemovePlayer(player);
|
||||||
|
auto it = GetPlayers().find(pId);
|
||||||
|
|
||||||
|
if (it == GetPlayers().end()) return;
|
||||||
|
|
||||||
|
GetPlayers().erase(it);
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace game
|
} // namespace game
|
||||||
} // namespace td
|
} // namespace td
|
||||||
|
|||||||
@@ -23,6 +23,10 @@ std::uint8_t Team::GetPlayerCount() const {
|
|||||||
return m_Players.size();
|
return m_Players.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Team::ClearPlayers() {
|
||||||
|
m_Players.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
} // namespace game
|
} // namespace game
|
||||||
} // namespace td
|
} // namespace td
|
||||||
|
|||||||
Reference in New Issue
Block a user