refactor: mob die event
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user