From ef764376706c95ffaf5f6d73a78afc1ca27f0e36 Mon Sep 17 00:00:00 2001 From: Persson-dev Date: Wed, 29 Sep 2021 14:48:25 +0200 Subject: [PATCH] feat: basic arrow shoot event --- include/game/Towers.h | 2 -- include/game/World.h | 3 +++ include/game/client/WorldClient.h | 2 ++ include/game/server/ServerWorld.h | 2 ++ src/game/Towers.cpp | 11 +---------- src/game/World.cpp | 9 +++++++++ src/game/client/WorldClient.cpp | 6 ++++-- src/game/server/ServerWorld.cpp | 4 ++++ 8 files changed, 25 insertions(+), 14 deletions(-) diff --git a/include/game/Towers.h b/include/game/Towers.h index 56eb6ac..22071d3 100644 --- a/include/game/Towers.h +++ b/include/game/Towers.h @@ -162,8 +162,6 @@ public: virtual TowerType getType() const { return TowerType::Archer; } virtual void tick(std::uint64_t delta, World* world); -private: - void shootArrow(MobPtr target); }; class IceTower : public LittleTower { diff --git a/include/game/World.h b/include/game/World.h index 9addafc..68cda93 100644 --- a/include/game/World.h +++ b/include/game/World.h @@ -182,6 +182,9 @@ public: const Team& getTeam(TeamColor team) const; const TowerList& getTowers() const { return m_Towers; }; + + // Archer Tower + virtual void OnArrowShot(MobPtr target, Tower* shooter); private: void moveMobs(std::uint64_t delta); void cleanDeadMobs(); diff --git a/include/game/client/WorldClient.h b/include/game/client/WorldClient.h index 8d7e2ad..c51b456 100644 --- a/include/game/client/WorldClient.h +++ b/include/game/client/WorldClient.h @@ -17,6 +17,8 @@ public: virtual void HandlePacket(protocol::WorldBeginDataPacket* packet); virtual void HandlePacket(protocol::WorldDataPacket* packet); virtual void HandlePacket(protocol::SpawnMobPacket* packet); + + virtual void OnArrowShot(game::MobPtr target, game::Tower* shooter) override; }; } // namespace client diff --git a/include/game/server/ServerWorld.h b/include/game/server/ServerWorld.h index 81c7208..1d373b6 100644 --- a/include/game/server/ServerWorld.h +++ b/include/game/server/ServerWorld.h @@ -18,6 +18,8 @@ public: void spawnMobs(game::MobType type, std::uint8_t level, game::PlayerID sender, std::uint8_t count); game::TowerPtr placeTowerAt(game::TowerType type, std::int32_t x, std::int32_t y, game::PlayerID builder); + + virtual void OnArrowShot(game::MobPtr target, game::Tower* shooter) override; }; } // namespace server diff --git a/src/game/Towers.cpp b/src/game/Towers.cpp index c9f9594..0f8950b 100644 --- a/src/game/Towers.cpp +++ b/src/game/Towers.cpp @@ -173,7 +173,7 @@ void ArcherTower::tick(std::uint64_t delta, World* world) { std::uint8_t arrows = explosiveArrows ? 2 : getLevel().getLevel(); for (MobPtr mob : world->getMobList()) { if (isMobInRange(mob)) { - shootArrow(mob); + world->OnArrowShot(mob, this); arrowsShot++; if(arrowsShot >= arrows) break; @@ -182,15 +182,6 @@ void ArcherTower::tick(std::uint64_t delta, World* world) { } } -void ArcherTower::shootArrow(MobPtr target){ - bool explosiveArrows = getLevel().getPath() == TowerPath::Bottom; - if(explosiveArrows){ - - }else{ - target->damage(getStats()->getDamage()); - } -} - void IceTower::tick(std::uint64_t delta, World* world) { } diff --git a/src/game/World.cpp b/src/game/World.cpp index 2edcc1b..b05d332 100644 --- a/src/game/World.cpp +++ b/src/game/World.cpp @@ -457,6 +457,15 @@ void World::cleanDeadMobs(){ } } +void World::OnArrowShot(MobPtr target, Tower* shooter){ + bool explosiveArrows = shooter->getLevel().getPath() == TowerPath::Bottom; + if(explosiveArrows){ + // aoe damage + }else{ + target->damage(shooter->getStats()->getDamage()); + } +} + Team& World::getRedTeam() { return m_Game->getRedTeam(); } diff --git a/src/game/client/WorldClient.cpp b/src/game/client/WorldClient.cpp index b681190..d94506d 100644 --- a/src/game/client/WorldClient.cpp +++ b/src/game/client/WorldClient.cpp @@ -3,8 +3,6 @@ #include "game/client/ClientGame.h" #include "render/WorldRenderer.h" -#include - namespace td { namespace client { @@ -27,5 +25,9 @@ void WorldClient::HandlePacket(protocol::SpawnMobPacket* packet) { packet->getMobX(), packet->getMobY(), packet->getMobDirection()); } +void WorldClient::OnArrowShot(game::MobPtr target, game::Tower* tower){ + World::OnArrowShot(target, tower); +} + } // namespace client } // namespace td diff --git a/src/game/server/ServerWorld.cpp b/src/game/server/ServerWorld.cpp index 304b873..d6c6b7a 100644 --- a/src/game/server/ServerWorld.cpp +++ b/src/game/server/ServerWorld.cpp @@ -52,5 +52,9 @@ game::TowerPtr ServerWorld::placeTowerAt(game::TowerType type, std::int32_t x, s return tower; } +void ServerWorld::OnArrowShot(game::MobPtr target, game::Tower* shooter){ + World::OnArrowShot(target, shooter); +} + } // namespace server } // namespace td