refactor: separate mob ans world listener

This commit is contained in:
2021-12-11 18:43:49 +01:00
parent a802b5cef5
commit 1474220a77
7 changed files with 38 additions and 21 deletions

View File

@@ -213,7 +213,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)) {
world->notifyListeners(&WorldListener::OnArcherTowerShot, mob, this);
world->getWorldNotifier().notifyListeners(&WorldListener::OnArcherTowerShot, mob, this);
m_Timer.applyCooldown();
arrowsShot++;
if (arrowsShot >= arrows)
@@ -229,8 +229,8 @@ void IceTower::tick(std::uint64_t delta, World* world) {
for (MobPtr mob : world->getMobList()) {
if (isMobInRange(mob)) {
mob->addEffect(EffectType::Slowness, 1, this); // slowness for 1s every second
if(damage > 0)
world->notifyListeners(&WorldListener::OnMobDamage, mob, damage, this);
if (damage > 0)
world->getMobNotifier().notifyListeners(&MobListener::OnMobDamage, mob, damage, this);
m_Timer.applyCooldown();
}
}
@@ -253,7 +253,7 @@ void PoisonTower::tick(std::uint64_t delta, World* world) {
for (MobPtr mob : world->getMobList()) {
if (isMobInRange(mob)) {
if (getLevel().getPath() == TowerPath::Bottom) {
world->notifyListeners(&WorldListener::OnMobDamage, mob, getStats()->getDamage(), this);
world->getMobNotifier().notifyListeners(&MobListener::OnMobDamage, mob, getStats()->getDamage(), this);
} else {
float durationSec;
switch (getLevel().getLevel()) {

View File

@@ -13,7 +13,8 @@ namespace td {
namespace game {
World::World(Game* game) : m_Game(game) {
bindListener(this);
getWorldNotifier().bindListener(this);
getMobNotifier().bindListener(this);
}
TilePtr World::getTile(std::int32_t x, std::int32_t y) const {
@@ -413,14 +414,14 @@ void World::OnArcherTowerShot(MobPtr target, ArcherTower* shooter) {
bool fireArrows = shooter->getLevel().getPath() == TowerPath::Bottom;
bool explosiveArrows = shooter->getLevel().getLevel() == 4 && fireArrows;
notifyListeners(&WorldListener::OnArrowShot, target, fireArrows, shooter);
getWorldNotifier().notifyListeners(&WorldListener::OnArrowShot, target, fireArrows, shooter);
if (explosiveArrows) {
notifyListeners(&WorldListener::OnExplosion, utils::shape::Circle{ target->getCenterX(), target->getCenterY(), ArcherTower::ExplosionRadius }, shooter->getStats()->getDamage(), shooter);
getWorldNotifier().notifyListeners(&WorldListener::OnExplosion, utils::shape::Circle{ target->getCenterX(), target->getCenterY(), ArcherTower::ExplosionRadius }, shooter->getStats()->getDamage(), shooter);
}
}
void World::OnArrowShot(MobPtr target, bool fireArrow, Tower* shooter) {
notifyListeners(&WorldListener::OnMobDamage, target, shooter->getStats()->getDamage(), shooter);
getMobNotifier().notifyListeners(&MobListener::OnMobDamage, target, shooter->getStats()->getDamage(), shooter);
if (fireArrow) {
target->addEffect(EffectType::Fire, ArcherTower::FireDurationSec, shooter);
}
@@ -431,7 +432,7 @@ void World::OnExplosion(utils::shape::Circle explosion, float centerDamage, Towe
if (mob->isAlive() && mob->collidesWith(explosion)) {
// linear distance damage reduction
float explosionDamage = mob->distance(explosion) / explosion.getRadius() * centerDamage;
notifyListeners(&WorldListener::OnMobDamage, mob, explosionDamage, shooter);
getMobNotifier().notifyListeners(&MobListener::OnMobDamage, mob, explosionDamage, shooter);
}
}
}
@@ -439,7 +440,7 @@ void World::OnExplosion(utils::shape::Circle explosion, float centerDamage, Towe
void World::OnMobDamage(MobPtr target, float damage, Tower* source) {
target->damage(damage, source);
if (target->isDead()) {
notifyListeners(&WorldListener::OnMobDead, target);
getMobNotifier().notifyListeners(&MobListener::OnMobDie, target);
}
}

View File

@@ -37,14 +37,14 @@ void WorldClient::HandlePacket(const protocol::UpgradeTowerPacket* packet) {
void WorldClient::HandlePacket(const protocol::WorldAddTowerPacket* packet) {
game::TowerPtr newTower = placeTowerAt(packet->getTowerID(), packet->getTowerType(), packet->getTowerX(), packet->getTowerY(), packet->getBuilder());
notifyListeners(&WorldListener::OnTowerAdd, newTower);
getWorldNotifier().notifyListeners(&WorldListener::OnTowerAdd, newTower);
}
void WorldClient::HandlePacket(const protocol::RemoveTowerPacket* packet) {
game::TowerPtr tower = removeTower(packet->getTowerID());
if (tower != nullptr) {
notifyListeners(&WorldListener::OnTowerRemove, tower);
getWorldNotifier().notifyListeners(&WorldListener::OnTowerRemove, tower);
}
}

View File

@@ -160,7 +160,7 @@ void ServerConnexion::HandlePacket(const protocol::PlaceTowerPacket* packet) {
game::TowerPtr tower = world->placeTowerAt(towerType, packet->getTowerX(), packet->getTowerY(), m_ID);
world->notifyListeners(&game::WorldListener::OnTowerAdd, tower);
world->getWorldNotifier().notifyListeners(&game::WorldListener::OnTowerAdd, tower);
protocol::WorldAddTowerPacket addTowerPacket(tower->getID(), packet->getTowerX(), packet->getTowerY(), packet->getTowerType(), m_ID);
m_Server->broadcastPacket(&addTowerPacket);

View File

@@ -37,7 +37,7 @@ WorldRenderer::WorldRenderer(game::World* world, client::ClientGame* client) : m
m_Renderer->setCamMovement({});
m_TowerPlacePopup = std::make_unique<gui::TowerPlacePopup>(m_Client->getClient());
m_MobTooltip = std::make_unique<gui::MobTooltip>(m_Client->getClient());
m_Client->getWorld().bindListener(this);
m_Client->getWorld().getWorldNotifier().bindListener(this);
}
void WorldRenderer::updateCursorPos() {