diff options
-rw-r--r-- | src/Mobs/Creeper.cpp | 215 |
1 files changed, 109 insertions, 106 deletions
diff --git a/src/Mobs/Creeper.cpp b/src/Mobs/Creeper.cpp index f84a8acd7..65576ff25 100644 --- a/src/Mobs/Creeper.cpp +++ b/src/Mobs/Creeper.cpp @@ -11,11 +11,11 @@ cCreeper::cCreeper(void) : - super("Creeper", mtCreeper, "entity.creeper.hurt", "entity.creeper.death", 0.6, 1.8), - m_bIsBlowing(false), - m_bIsCharged(false), - m_BurnedWithFlintAndSteel(false), - m_ExplodingTimer(0) + super("Creeper", mtCreeper, "entity.creeper.hurt", "entity.creeper.death", 0.6, 1.8), + m_bIsBlowing(false), + m_bIsCharged(false), + m_BurnedWithFlintAndSteel(false), + m_ExplodingTimer(0) { } @@ -25,35 +25,38 @@ cCreeper::cCreeper(void) : void cCreeper::Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) { - super::Tick(a_Dt, a_Chunk); - if (!IsTicking()) - { - // The base class tick destroyed us - return; - } - - if (((GetTarget() == nullptr) || !TargetIsInRange()) && !m_BurnedWithFlintAndSteel) - { - if (m_bIsBlowing) - { - m_ExplodingTimer = 0; - m_bIsBlowing = false; - m_World->BroadcastEntityMetadata(*this); - } - } - else - { - if (m_bIsBlowing) - { - m_ExplodingTimer += 1; - } - - if ((m_ExplodingTimer == 30) && (GetHealth() > 0.0)) // only explode when not already dead - { - m_World->DoExplosionAt((m_bIsCharged ? 5 : 3), GetPosX(), GetPosY(), GetPosZ(), false, esMonster, this); - Destroy(); // Just in case we aren't killed by the explosion - } - } + super::Tick(a_Dt, a_Chunk); + /* mobTodo + + if (!IsTicking()) + { + // The base class tick destroyed us + return; + } + + if (((GetTarget() == nullptr) || !TargetIsInRange()) && !m_BurnedWithFlintAndSteel) + { + if (m_bIsBlowing) + { + m_ExplodingTimer = 0; + m_bIsBlowing = false; + m_World->BroadcastEntityMetadata(*this); + } + } + else + { + if (m_bIsBlowing) + { + m_ExplodingTimer += 1; + } + + if ((m_ExplodingTimer == 30) && (GetHealth() > 0.0)) // only explode when not already dead + { + m_World->DoExplosionAt((m_bIsCharged ? 5 : 3), GetPosX(), GetPosY(), GetPosZ(), false, esMonster, this); + Destroy(); // Just in case we aren't killed by the explosion + } + } */ + } @@ -62,44 +65,44 @@ void cCreeper::Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) void cCreeper::GetDrops(cItems & a_Drops, cEntity * a_Killer) { - if (m_ExplodingTimer == 30) - { - // Exploded creepers drop naught but charred flesh, which Minecraft doesn't have - return; - } - - unsigned int LootingLevel = 0; - if (a_Killer != nullptr) - { - LootingLevel = a_Killer->GetEquippedWeapon().m_Enchantments.GetLevel(cEnchantments::enchLooting); - } - AddRandomDropItem(a_Drops, 0, 2 + LootingLevel, E_ITEM_GUNPOWDER); - - // If the creeper was killed by a skeleton, add a random music disc drop: - if ( - (a_Killer != nullptr) && - a_Killer->IsProjectile() && - ((reinterpret_cast<cProjectileEntity *>(a_Killer))->GetCreatorUniqueID() != cEntity::INVALID_ID)) - { - class cProjectileCreatorCallback : public cEntityCallback - { - public: - cProjectileCreatorCallback(void) {} - - virtual bool Item(cEntity * a_Entity) override - { - if (a_Entity->IsMob() && ((reinterpret_cast<cMonster *>(a_Entity))->GetMobType() == mtSkeleton)) - { - return true; - } - return false; - } - } PCC; - if (GetWorld()->DoWithEntityByID((reinterpret_cast<cProjectileEntity *>(a_Killer))->GetCreatorUniqueID(), PCC)) - { - AddRandomDropItem(a_Drops, 1, 1, static_cast<short>(m_World->GetTickRandomNumber(11) + E_ITEM_FIRST_DISC)); - } - } + if (m_ExplodingTimer == 30) + { + // Exploded creepers drop naught but charred flesh, which Minecraft doesn't have + return; + } + + unsigned int LootingLevel = 0; + if (a_Killer != nullptr) + { + LootingLevel = a_Killer->GetEquippedWeapon().m_Enchantments.GetLevel(cEnchantments::enchLooting); + } + AddRandomDropItem(a_Drops, 0, 2 + LootingLevel, E_ITEM_GUNPOWDER); + + // If the creeper was killed by a skeleton, add a random music disc drop: + if ( + (a_Killer != nullptr) && + a_Killer->IsProjectile() && + ((reinterpret_cast<cProjectileEntity *>(a_Killer))->GetCreatorUniqueID() != cEntity::INVALID_ID)) + { + class cProjectileCreatorCallback : public cEntityCallback + { + public: + cProjectileCreatorCallback(void) {} + + virtual bool Item(cEntity * a_Entity) override + { + if (a_Entity->IsMob() && ((reinterpret_cast<cMonster *>(a_Entity))->GetMobType() == mtSkeleton)) + { + return true; + } + return false; + } + } PCC; + if (GetWorld()->DoWithEntityByID((reinterpret_cast<cProjectileEntity *>(a_Killer))->GetCreatorUniqueID(), PCC)) + { + AddRandomDropItem(a_Drops, 1, 1, static_cast<short>(m_World->GetTickRandomNumber(11) + E_ITEM_FIRST_DISC)); + } + } } @@ -108,18 +111,18 @@ void cCreeper::GetDrops(cItems & a_Drops, cEntity * a_Killer) bool cCreeper::DoTakeDamage(TakeDamageInfo & a_TDI) { - if (!super::DoTakeDamage(a_TDI)) - { - return false; - } - - if (a_TDI.DamageType == dtLightning) - { - m_bIsCharged = true; - } - - m_World->BroadcastEntityMetadata(*this); - return true; + if (!super::DoTakeDamage(a_TDI)) + { + return false; + } + + if (a_TDI.DamageType == dtLightning) + { + m_bIsCharged = true; + } + + m_World->BroadcastEntityMetadata(*this); + return true; } @@ -129,17 +132,17 @@ bool cCreeper::DoTakeDamage(TakeDamageInfo & a_TDI) /* bool cCreeper::Attack(std::chrono::milliseconds a_Dt) { - UNUSED(a_Dt); + UNUSED(a_Dt); - if (!m_bIsBlowing) - { - m_World->BroadcastSoundEffect("entity.creeper.primed", GetPosX(), GetPosY(), GetPosZ(), 1.f, (0.75f + (static_cast<float>((GetUniqueID() * 23) % 32)) / 64)); - m_bIsBlowing = true; - m_World->BroadcastEntityMetadata(*this); + if (!m_bIsBlowing) + { + m_World->BroadcastSoundEffect("entity.creeper.primed", GetPosX(), GetPosY(), GetPosZ(), 1.f, (0.75f + (static_cast<float>((GetUniqueID() * 23) % 32)) / 64)); + m_bIsBlowing = true; + m_World->BroadcastEntityMetadata(*this); - return true; - } - return false; + return true; + } + return false; }*/ @@ -148,18 +151,18 @@ bool cCreeper::Attack(std::chrono::milliseconds a_Dt) void cCreeper::OnRightClicked(cPlayer & a_Player) { - super::OnRightClicked(a_Player); - - if ((a_Player.GetEquippedItem().m_ItemType == E_ITEM_FLINT_AND_STEEL)) - { - if (!a_Player.IsGameModeCreative()) - { - a_Player.UseEquippedItem(); - } - m_World->BroadcastSoundEffect("entity.creeper.primed", GetPosX(), GetPosY(), GetPosZ(), 1.f, (0.75f + (static_cast<float>((GetUniqueID() * 23) % 32)) / 64)); - m_bIsBlowing = true; - m_World->BroadcastEntityMetadata(*this); - m_BurnedWithFlintAndSteel = true; - } + super::OnRightClicked(a_Player); + + if ((a_Player.GetEquippedItem().m_ItemType == E_ITEM_FLINT_AND_STEEL)) + { + if (!a_Player.IsGameModeCreative()) + { + a_Player.UseEquippedItem(); + } + m_World->BroadcastSoundEffect("entity.creeper.primed", GetPosX(), GetPosY(), GetPosZ(), 1.f, (0.75f + (static_cast<float>((GetUniqueID() * 23) % 32)) / 64)); + m_bIsBlowing = true; + m_World->BroadcastEntityMetadata(*this); + m_BurnedWithFlintAndSteel = true; + } } |