fix: game crash
This commit is contained in:
@@ -80,7 +80,7 @@ private:
|
|||||||
MobLevel m_Level;
|
MobLevel m_Level;
|
||||||
Direction m_Direction;
|
Direction m_Direction;
|
||||||
std::vector<EffectDuration> m_Effects;
|
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_EffectFireTimer;
|
||||||
utils::Timer m_EffectPoisonTimer;
|
utils::Timer m_EffectPoisonTimer;
|
||||||
@@ -107,10 +107,9 @@ public:
|
|||||||
float getHealth() const { return m_Health; }
|
float getHealth() const { return m_Health; }
|
||||||
bool isDead() const { return m_Health <= 0; }
|
bool isDead() const { return m_Health <= 0; }
|
||||||
bool isAlive() const { return m_Health > 0; }
|
bool isAlive() const { return m_Health > 0; }
|
||||||
const Tower* getKillTower() { return m_KillTower; }
|
const Tower* getLastDamageTower() { return m_LastDamage; }
|
||||||
void setKillTower(const Tower* killTower) { m_KillTower = killTower; }
|
|
||||||
|
|
||||||
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); }
|
void heal(float heal) { m_Health = std::min((float)getStats()->getMaxLife(), m_Health + heal); }
|
||||||
|
|
||||||
float getX() const { return m_X; }
|
float getX() const { return m_X; }
|
||||||
|
|||||||
@@ -63,18 +63,12 @@ void Mob::updateEffects(std::uint64_t delta) {
|
|||||||
}
|
}
|
||||||
if(hasEffect(EffectType::Fire)){
|
if(hasEffect(EffectType::Fire)){
|
||||||
if(m_EffectFireTimer.update(delta)){
|
if(m_EffectFireTimer.update(delta)){
|
||||||
damage(3);
|
damage(3, getEffect(EffectType::Fire).tower);
|
||||||
if(isDead()){
|
|
||||||
setKillTower(getEffect(EffectType::Fire).tower);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(hasEffect(EffectType::Poison)){
|
if(hasEffect(EffectType::Poison)){
|
||||||
if(m_EffectPoisonTimer.update(delta)){
|
if(m_EffectPoisonTimer.update(delta)){
|
||||||
damage(1);
|
damage(3, getEffect(EffectType::Poison).tower);
|
||||||
if(isDead()){
|
|
||||||
setKillTower(getEffect(EffectType::Poison).tower);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(hasEffect(EffectType::Heal)){
|
if(hasEffect(EffectType::Heal)){
|
||||||
|
|||||||
@@ -233,7 +233,7 @@ void IceTower::tick(std::uint64_t delta, World* world) {
|
|||||||
for (MobPtr mob : world->getMobList()) {
|
for (MobPtr mob : world->getMobList()) {
|
||||||
if (isMobInRange(mob)) {
|
if (isMobInRange(mob)) {
|
||||||
mob->addEffect(EffectType::Slowness, 1, this); // slowness for 1s every second
|
mob->addEffect(EffectType::Slowness, 1, this); // slowness for 1s every second
|
||||||
mob->damage(damage);
|
mob->damage(damage, this);
|
||||||
wasTowerActive = true;
|
wasTowerActive = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -251,7 +251,7 @@ void World::cleanDeadMobs() {
|
|||||||
Player& sender = m_Game->getPlayerById(mob->getSender());
|
Player& sender = m_Game->getPlayerById(mob->getSender());
|
||||||
sender.addExp(mob->getStats()->getExpReward());
|
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());
|
killer.addGold(mob->getStats()->getMoneyCost());
|
||||||
|
|
||||||
m_Mobs.erase(m_Mobs.begin() + i);
|
m_Mobs.erase(m_Mobs.begin() + i);
|
||||||
@@ -287,9 +287,7 @@ void World::OnArrowShot(MobPtr target, Tower* shooter) {
|
|||||||
if (explosiveArrows) {
|
if (explosiveArrows) {
|
||||||
// aoe damage
|
// aoe damage
|
||||||
} else {
|
} else {
|
||||||
target->damage(shooter->getStats()->getDamage());
|
target->damage(shooter->getStats()->getDamage(), shooter);
|
||||||
if (target->isDead())
|
|
||||||
target->setKillTower(shooter);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user