From 94e1ef6606f1d788a410f2669aa00e21ec3e8f35 Mon Sep 17 00:00:00 2001 From: Persson-dev Date: Sun, 19 Sep 2021 19:30:49 +0200 Subject: [PATCH] fix: check team when placing tower --- include/game/World.h | 4 ++-- src/game/World.cpp | 12 ++++++++++-- src/game/server/ServerConnexion.cpp | 6 +++--- src/render/WorldRenderer.cpp | 4 ++-- 4 files changed, 17 insertions(+), 9 deletions(-) diff --git a/include/game/World.h b/include/game/World.h index 9966d82..09deaf6 100644 --- a/include/game/World.h +++ b/include/game/World.h @@ -157,8 +157,8 @@ public: return m_TilePalette.at(index - 1); } - bool CanPlaceLittleTower(const glm::vec2& worldPos) const; - bool CanPlaceBigTower(const glm::vec2& worldPos) const; + bool CanPlaceLittleTower(const glm::vec2& worldPos, PlayerID player) const; + bool CanPlaceBigTower(const glm::vec2& worldPos, PlayerID player) const; const std::unordered_map& getChunks() const { return m_Chunks; } diff --git a/src/game/World.cpp b/src/game/World.cpp index 66041fd..cdedead 100644 --- a/src/game/World.cpp +++ b/src/game/World.cpp @@ -394,14 +394,18 @@ const Color* World::getTileColor(TilePtr tile) const { return nullptr; } -bool World::CanPlaceLittleTower(const glm::vec2& worldPos) const { +bool World::CanPlaceLittleTower(const glm::vec2& worldPos, PlayerID playerID) const { TilePtr tile = getTile(worldPos.x, worldPos.y); + const Player& player = m_Game->getPlayers()[playerID]; if (tile == nullptr) { return false; } if (tile->getType() == game::TileType::Tower) { + const TowerTile* towerTile = (const TowerTile*) tile.get(); + if(towerTile->team_owner != player.getTeamColor()) + return false; for (int x = -1; x < 2; x++) { for (int y = -1; y < 2; y++) { game::TilePtr adjacentTile = getTile(worldPos.x + x, worldPos.y + y); @@ -416,14 +420,18 @@ bool World::CanPlaceLittleTower(const glm::vec2& worldPos) const { return false; } -bool World::CanPlaceBigTower(const glm::vec2& worldPos) const { +bool World::CanPlaceBigTower(const glm::vec2& worldPos, PlayerID playerID) const { TilePtr tile = getTile(worldPos.x, worldPos.y); + const Player& player = m_Game->getPlayers()[playerID]; if (tile == nullptr) { return false; } if (tile->getType() == game::TileType::Tower) { + const TowerTile* towerTile = (const TowerTile*) tile.get(); + if(towerTile->team_owner != player.getTeamColor()) + return false; for (int x = -2; x < 3; x++) { for (int y = -2; y < 3; y++) { game::TilePtr adjacentTile = getTile(worldPos.x + x, worldPos.y + y); diff --git a/src/game/server/ServerConnexion.cpp b/src/game/server/ServerConnexion.cpp index 1b5e766..d2be271 100644 --- a/src/game/server/ServerConnexion.cpp +++ b/src/game/server/ServerConnexion.cpp @@ -148,13 +148,13 @@ void ServerConnexion::HandlePacket(protocol::PlaceTowerPacket* packet) { const game::TowerInfo& towerInfo = game::getTowerInfo(towerType); game::World* world = m_Server->getGame().getWorld(); if (towerInfo.isBigTower()) { - if (!world->CanPlaceBigTower({ packet->getTowerX(), packet->getTowerY() })) + if (!world->CanPlaceBigTower({ packet->getTowerX(), packet->getTowerY() }, m_ID)) return; } else { - if (!world->CanPlaceLittleTower({ packet->getTowerX(), packet->getTowerY() })) + if (!world->CanPlaceLittleTower({ packet->getTowerX(), packet->getTowerY() }, m_ID)) return; } - + world->placeTowerAt(towerType, packet->getTowerX(), packet->getTowerY(), m_ID); protocol::WorldAddTowerPacket addTowerPacket(packet->getTowerX(), packet->getTowerY(), packet->getTowerType(), m_ID); diff --git a/src/render/WorldRenderer.cpp b/src/render/WorldRenderer.cpp index 3c8168c..67676f4 100644 --- a/src/render/WorldRenderer.cpp +++ b/src/render/WorldRenderer.cpp @@ -110,7 +110,7 @@ void WorldRenderer::changeZoom(float zoomStep) { } void WorldRenderer::click() { - if (m_Client->getWorld().CanPlaceLittleTower(getClickWorldPos())) { + if (m_Client->getWorld().CanPlaceLittleTower(getClickWorldPos(), m_Client->getPlayer()->getID())) { ImGui::OpenPopup("TowerPlace"); m_TowerPlacePopupOpened = true; } @@ -126,7 +126,7 @@ void WorldRenderer::renderPopups() const { for (int i = 0; i < (int)game::TowerType::TowerCount; i++) { game::TowerType towerType = game::TowerType(i); const game::TowerInfo& towerInfo = game::getTowerInfo(towerType); - if (!towerInfo.isBigTower() || (towerInfo.isBigTower() && m_Client->getWorld().CanPlaceBigTower(getClickWorldPos()))) { + if (!towerInfo.isBigTower() || (towerInfo.isBigTower() && m_Client->getWorld().CanPlaceBigTower(getClickWorldPos(), m_Client->getPlayer()->getID()))) { if (ImGui::Button(game::getTowerInfo(towerType).getName().c_str())) { m_Client->PlaceTower(towerType, getClickWorldPos()); ImGui::CloseCurrentPopup();