From 8b105ee51a5fcd67c861de04466e3ca2e1cacefa Mon Sep 17 00:00:00 2001 From: LogicParrot Date: Tue, 22 Aug 2017 13:53:41 +0300 Subject: d --- src/Mobs/Behaviors/BehaviorItemFollower.cpp | 48 +++---- src/Mobs/Behaviors/BehaviorItemFollower.h | 11 +- src/Mobs/Creeper.cpp | 216 ++++++++++++++-------------- src/Mobs/Monster.cpp | 5 + src/Mobs/Monster.h | 1 + 5 files changed, 141 insertions(+), 140 deletions(-) diff --git a/src/Mobs/Behaviors/BehaviorItemFollower.cpp b/src/Mobs/Behaviors/BehaviorItemFollower.cpp index 7cc0f8dfc..89e25ed57 100644 --- a/src/Mobs/Behaviors/BehaviorItemFollower.cpp +++ b/src/Mobs/Behaviors/BehaviorItemFollower.cpp @@ -5,16 +5,12 @@ #include "../../World.h" #include "../../Entities/Player.h" -iBehaviorItemFollower::~iBehaviorItemFollower() -{ - -} -cBehaviorItemFollower::cBehaviorItemFollower(iBehaviorItemFollower * a_ParentInterface) : - m_ParentInterface(a_ParentInterface) +cBehaviorItemFollower::cBehaviorItemFollower(cMonster * a_Parent) : + m_ParentInterface(a_ParentInterface) { - m_Parent = dynamic_cast(m_ParentInterface); - ASSERT(m_Parent != nullptr); + m_Parent = a_Parent; + ASSERT(m_Parent != nullptr); } @@ -23,22 +19,22 @@ cBehaviorItemFollower::cBehaviorItemFollower(iBehaviorItemFollower * a_ParentInt bool cBehaviorItemFollower::ActiveTick() { - cWorld * World = m_Parent->GetWorld(); - cItems FollowedItems; - m_ParentInterface->GetFollowedItems(FollowedItems); - if (FollowedItems.Size() > 0) - { - cPlayer * a_Closest_Player = m_Parent->GetNearestPlayer(); - if (a_Closest_Player != nullptr) - { - cItem EquippedItem = a_Closest_Player->GetEquippedItem(); - if (FollowedItems.ContainsType(EquippedItem)) - { - Vector3d PlayerPos = a_Closest_Player->GetPosition(); - m_Parent->MoveToPosition(PlayerPos); - return true; // We took control of the monster, prevent other Behaviors from doing so - } - } - } - return false; + cWorld * World = m_Parent->GetWorld(); + cItems FollowedItems; + m_ParentInterface->GetFollowedItems(FollowedItems); + if (FollowedItems.Size() > 0) + { + cPlayer * a_Closest_Player = m_Parent->GetNearestPlayer(); + if (a_Closest_Player != nullptr) + { + cItem EquippedItem = a_Closest_Player->GetEquippedItem(); + if (FollowedItems.ContainsType(EquippedItem)) + { + Vector3d PlayerPos = a_Closest_Player->GetPosition(); + m_Parent->MoveToPosition(PlayerPos); + return true; // We took control of the monster, prevent other Behaviors from doing so + } + } + } + return false; } diff --git a/src/Mobs/Behaviors/BehaviorItemFollower.h b/src/Mobs/Behaviors/BehaviorItemFollower.h index ed47dab04..2abdeb381 100644 --- a/src/Mobs/Behaviors/BehaviorItemFollower.h +++ b/src/Mobs/Behaviors/BehaviorItemFollower.h @@ -16,14 +16,13 @@ class cItems; class cBehaviorItemFollower { public: - cBehaviorItemFollower(iBehaviorItemFollower * a_Parent); + cBehaviorItemFollower(cMonster * a_Parent); - // Functions our host Monster should invoke: - bool ActiveTick(); + // Functions our host Monster should invoke: + bool ActiveTick(); private: - /** Our parent */ - iBehaviorItemFollower * m_ParentInterface; - cMonster * m_Parent; + /** Our parent */ + cMonster * m_Parent; }; diff --git a/src/Mobs/Creeper.cpp b/src/Mobs/Creeper.cpp index 84b68cf7c..505e637b0 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,35 @@ 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); + 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 +62,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(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(a_Entity))->GetMobType() == mtSkeleton)) - { - return true; - } - return false; - } - } PCC; - if (GetWorld()->DoWithEntityByID((reinterpret_cast(a_Killer))->GetCreatorUniqueID(), PCC)) - { - AddRandomDropItem(a_Drops, 1, 1, static_cast(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(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(a_Entity))->GetMobType() == mtSkeleton)) + { + return true; + } + return false; + } + } PCC; + if (GetWorld()->DoWithEntityByID((reinterpret_cast(a_Killer))->GetCreatorUniqueID(), PCC)) + { + AddRandomDropItem(a_Drops, 1, 1, static_cast(m_World->GetTickRandomNumber(11) + E_ITEM_FIRST_DISC)); + } + } } @@ -108,38 +108,38 @@ 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; } - +/* 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((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((GetUniqueID() * 23) % 32)) / 64)); + m_bIsBlowing = true; + m_World->BroadcastEntityMetadata(*this); - return true; - } - return false; -} + return true; + } + return false; +}*/ @@ -147,18 +147,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((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((GetUniqueID() * 23) % 32)) / 64)); + m_bIsBlowing = true; + m_World->BroadcastEntityMetadata(*this); + m_BurnedWithFlintAndSteel = true; + } } diff --git a/src/Mobs/Monster.cpp b/src/Mobs/Monster.cpp index f2af7b716..059edbcbc 100644 --- a/src/Mobs/Monster.cpp +++ b/src/Mobs/Monster.cpp @@ -1174,6 +1174,11 @@ void cMonster::InheritFromParents(cMonster * a_Parent1, cMonster * a_Parent2) return; } +void cMonster::GetFollowedItems(cItems & a_Items) +{ + return; +} + diff --git a/src/Mobs/Monster.h b/src/Mobs/Monster.h index 616c5d184..6308b2945 100644 --- a/src/Mobs/Monster.h +++ b/src/Mobs/Monster.h @@ -228,6 +228,7 @@ public: // Polymorphic behavior functions virtual void InheritFromParents(cMonster * a_Parent1, cMonster * a_Parent2); + virtual void GetFollowedItems(cItems & a_Items); protected: -- cgit v1.2.3