fix: game crash

This commit is contained in:
2021-11-06 16:20:12 +01:00
parent 672e4c2f03
commit eb8a43cd1a
4 changed files with 8 additions and 17 deletions

View File

@@ -80,7 +80,7 @@ private:
MobLevel m_Level;
Direction m_Direction;
std::vector<EffectDuration> m_Effects;
const Tower* m_KillTower; // the tower that killed the mob
const Tower* m_LastDamage; // the tower that damaged the mob
utils::Timer m_EffectFireTimer;
utils::Timer m_EffectPoisonTimer;
@@ -107,10 +107,9 @@ public:
float getHealth() const { return m_Health; }
bool isDead() const { return m_Health <= 0; }
bool isAlive() const { return m_Health > 0; }
const Tower* getKillTower() { return m_KillTower; }
void setKillTower(const Tower* killTower) { m_KillTower = killTower; }
const Tower* getLastDamageTower() { return m_LastDamage; }
void damage(float dmg) { m_Health -= dmg; }
void damage(float dmg, const Tower* damager) { m_Health -= dmg; m_LastDamage = damager; }
void heal(float heal) { m_Health = std::min((float)getStats()->getMaxLife(), m_Health + heal); }
float getX() const { return m_X; }

View File

@@ -63,18 +63,12 @@ void Mob::updateEffects(std::uint64_t delta) {
}
if(hasEffect(EffectType::Fire)){
if(m_EffectFireTimer.update(delta)){
damage(3);
if(isDead()){
setKillTower(getEffect(EffectType::Fire).tower);
}
damage(3, getEffect(EffectType::Fire).tower);
}
}
if(hasEffect(EffectType::Poison)){
if(m_EffectPoisonTimer.update(delta)){
damage(1);
if(isDead()){
setKillTower(getEffect(EffectType::Poison).tower);
}
damage(3, getEffect(EffectType::Poison).tower);
}
}
if(hasEffect(EffectType::Heal)){

View File

@@ -233,7 +233,7 @@ 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
mob->damage(damage);
mob->damage(damage, this);
wasTowerActive = true;
}
}

View File

@@ -251,7 +251,7 @@ void World::cleanDeadMobs() {
Player& sender = m_Game->getPlayerById(mob->getSender());
sender.addExp(mob->getStats()->getExpReward());
Player& killer = m_Game->getPlayerById(mob->getKillTower()->getBuilder());
Player& killer = m_Game->getPlayerById(mob->getLastDamageTower()->getBuilder());
killer.addGold(mob->getStats()->getMoneyCost());
m_Mobs.erase(m_Mobs.begin() + i);
@@ -287,9 +287,7 @@ void World::OnArrowShot(MobPtr target, Tower* shooter) {
if (explosiveArrows) {
// aoe damage
} else {
target->damage(shooter->getStats()->getDamage());
if (target->isDead())
target->setKillTower(shooter);
target->damage(shooter->getStats()->getDamage(), shooter);
}
}