refactor: mob die event

This commit is contained in:
2021-12-11 19:51:45 +01:00
parent 0af4cd506c
commit a241d7691b
5 changed files with 32 additions and 27 deletions

View File

@@ -214,20 +214,23 @@ bool World::CanPlaceBigTower(const glm::vec2& worldPos, PlayerID playerID) const
return false;
}
void World::OnMobDie(Mob* mob) {
if (mob->OnDeath(this)) { // check if the mob is actually dead (slimes ...)
//reward players
Player* sender = m_Game->getPlayerById(mob->getSender());
sender->addExp(mob->getStats()->getExpReward());
Player* killer = m_Game->getPlayerById(mob->getLastDamageTower()->getBuilder());
killer->addGold(mob->getStats()->getMoneyCost());
}
}
void World::cleanDeadMobs() {
// safely remove mobs when unused
for (std::size_t i = 0; i < m_Mobs.size(); i++) {
MobPtr mob = m_Mobs[i];
if (mob->isDead()) {
if (mob->OnDeath(this)) {
//reward players
Player* sender = m_Game->getPlayerById(mob->getSender());
sender->addExp(mob->getStats()->getExpReward());
Player* killer = m_Game->getPlayerById(mob->getLastDamageTower()->getBuilder());
killer->addGold(mob->getStats()->getMoneyCost());
m_Mobs.erase(m_Mobs.begin() + i);
}
m_Mobs.erase(m_Mobs.begin() + i);
}
}
}
@@ -266,7 +269,7 @@ void World::OnArcherTowerShot(MobPtr target, ArcherTower* shooter) {
}
void World::OnArrowShot(MobPtr target, bool fireArrow, Tower* shooter) {
getMobNotifier().notifyListeners(&MobListener::OnMobDamage, target, shooter->getStats()->getDamage(), shooter);
getMobNotifier().notifyListeners(&MobListener::OnMobDamage, target.get(), shooter->getStats()->getDamage(), shooter);
if (fireArrow) {
target->addEffect(EffectType::Fire, ArcherTower::FireDurationSec, shooter);
}
@@ -277,12 +280,12 @@ 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;
getMobNotifier().notifyListeners(&MobListener::OnMobDamage, mob, explosionDamage, shooter);
getMobNotifier().notifyListeners(&MobListener::OnMobDamage, mob.get(), explosionDamage, shooter);
}
}
}
void World::OnMobDamage(MobPtr target, float damage, Tower* source) {
void World::OnMobDamage(Mob* target, float damage, Tower* source) {
target->damage(damage, source);
if (target->isDead()) {
getMobNotifier().notifyListeners(&MobListener::OnMobDie, target);