From e225b7f8262df48ad4d7094bc295add3007b0649 Mon Sep 17 00:00:00 2001 From: peterbell10 Date: Mon, 11 Sep 2017 22:20:49 +0100 Subject: Replace ItemCallbacks with lambdas (#3993) --- src/Items/ItemFishingRod.h | 52 ++++++++++---------------------- src/Items/ItemMobHead.h | 75 +++++++++++++++------------------------------- 2 files changed, 39 insertions(+), 88 deletions(-) (limited to 'src/Items') diff --git a/src/Items/ItemFishingRod.h b/src/Items/ItemFishingRod.h index 012f13a6c..0720cb3e1 100644 --- a/src/Items/ItemFishingRod.h +++ b/src/Items/ItemFishingRod.h @@ -20,8 +20,7 @@ //////////////////////////////////////////////////////////////////////////////// // cFloaterCallback -class cFloaterCallback : - public cEntityCallback +class cFloaterCallback { public: cFloaterCallback(void) : @@ -30,13 +29,14 @@ public: { } - virtual bool Item(cEntity * a_Entity) override + bool operator () (cEntity & a_Entity) { - m_CanPickup = reinterpret_cast(a_Entity)->CanPickup(); - m_Pos = Vector3d(a_Entity->GetPosX(), a_Entity->GetPosY(), a_Entity->GetPosZ()); - m_BitePos = reinterpret_cast(a_Entity)->GetBitePos(); - m_AttachedMobID = reinterpret_cast(a_Entity)->GetAttachedMobID(); - a_Entity->Destroy(true); + auto & Floater = static_cast(a_Entity); + m_CanPickup = Floater.CanPickup(); + m_Pos = Floater.GetPosition(); + m_BitePos = Floater.GetBitePos(); + m_AttachedMobID = Floater.GetAttachedMobID(); + Floater.Destroy(true); return true; } @@ -57,33 +57,6 @@ protected: -//////////////////////////////////////////////////////////////////////////////// -// cSweepEntityCallback: - -class cSweepEntityCallback : - public cEntityCallback -{ -public: - cSweepEntityCallback(Vector3d a_PlayerPos) : - m_PlayerPos(a_PlayerPos) - { - } - - virtual bool Item(cEntity * a_Entity) override - { - Vector3d Speed = m_PlayerPos - a_Entity->GetPosition(); - a_Entity->AddSpeed(Speed); - return true; - } - -protected: - Vector3d m_PlayerPos; -} ; - - - - - class cItemFishingRodHandler : public cItemHandler { @@ -117,8 +90,13 @@ public: if (FloaterInfo.IsAttached()) { - cSweepEntityCallback SweepEntity(a_Player->GetPosition()); - a_World->DoWithEntityByID(FloaterInfo.GetAttachedMobID(), SweepEntity); + a_World->DoWithEntityByID(FloaterInfo.GetAttachedMobID(), [=](cEntity & a_Entity) + { + Vector3d Speed = a_Player->GetPosition() - a_Entity.GetPosition(); + a_Entity.AddSpeed(Speed); + return true; + } + ); } else if (FloaterInfo.CanPickup()) { diff --git a/src/Items/ItemMobHead.h b/src/Items/ItemMobHead.h index fdecabbbf..5cbcf52f7 100644 --- a/src/Items/ItemMobHead.h +++ b/src/Items/ItemMobHead.h @@ -62,42 +62,30 @@ public: int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace ) { - // Use a callback to set the properties of the mob head block entity: - class cCallback : public cBlockEntityCallback - { - cPlayer & m_Player; - eMobHeadType m_HeadType; - NIBBLETYPE m_BlockMeta; + auto HeadType = static_cast(a_EquippedItem.m_ItemDamage); + auto BlockMeta = static_cast(a_BlockFace); - virtual bool Item(cBlockEntity * a_BlockEntity) + // Use a callback to set the properties of the mob head block entity: + a_World.DoWithBlockEntityAt(a_BlockX, a_BlockY, a_BlockZ, [&](cBlockEntity & a_BlockEntity) { - if (a_BlockEntity->GetBlockType() != E_BLOCK_HEAD) + if (a_BlockEntity.GetBlockType() != E_BLOCK_HEAD) { return false; } - auto MobHeadEntity = static_cast(a_BlockEntity); + auto & MobHeadEntity = static_cast(a_BlockEntity); int Rotation = 0; - if (m_BlockMeta == 1) + if (BlockMeta == 1) { - Rotation = FloorC(m_Player.GetYaw() * 16.0f / 360.0f + 0.5f) & 0x0f; + Rotation = FloorC(a_Player.GetYaw() * 16.0f / 360.0f + 0.5f) & 0x0f; } - MobHeadEntity->SetType(m_HeadType); - MobHeadEntity->SetRotation(static_cast(Rotation)); - MobHeadEntity->GetWorld()->BroadcastBlockEntity(MobHeadEntity->GetPosX(), MobHeadEntity->GetPosY(), MobHeadEntity->GetPosZ()); + MobHeadEntity.SetType(HeadType); + MobHeadEntity.SetRotation(static_cast(Rotation)); + MobHeadEntity.GetWorld()->BroadcastBlockEntity(MobHeadEntity.GetPosX(), MobHeadEntity.GetPosY(), MobHeadEntity.GetPosZ()); return false; } - - public: - cCallback (cPlayer & a_CBPlayer, eMobHeadType a_HeadType, NIBBLETYPE a_BlockMeta) : - m_Player(a_CBPlayer), - m_HeadType(a_HeadType), - m_BlockMeta(a_BlockMeta) - {} - }; - cCallback Callback(a_Player, static_cast(a_EquippedItem.m_ItemDamage), static_cast(a_BlockFace)); - a_World.DoWithBlockEntityAt(a_BlockX, a_BlockY, a_BlockZ, Callback); + ); } @@ -243,24 +231,16 @@ public: // If it is a mob head, check the correct head type using the block entity: if (BlockType == E_BLOCK_HEAD) { - class cHeadCallback: public cBlockEntityCallback - { - virtual bool Item(cBlockEntity * a_Entity) override + bool IsWitherHead = false; + a_World.DoWithBlockEntityAt(BlockX, BlockY, BlockZ, [&](cBlockEntity & a_Entity) { - ASSERT(a_Entity->GetBlockType() == E_BLOCK_HEAD); - cMobHeadEntity * MobHead = static_cast(a_Entity); - m_IsWitherHead = (MobHead->GetType() == SKULL_TYPE_WITHER); + ASSERT(a_Entity.GetBlockType() == E_BLOCK_HEAD); + auto & MobHead = static_cast(a_Entity); + IsWitherHead = (MobHead.GetType() == SKULL_TYPE_WITHER); return true; } - public: - cHeadCallback(void): - m_IsWitherHead(false) - { - } - bool m_IsWitherHead; - } callback; - a_World.DoWithBlockEntityAt(BlockX, BlockY, BlockZ, callback); - if (!callback.m_IsWitherHead) + ); + if (!IsWitherHead) { return false; } @@ -287,25 +267,18 @@ public: /** Awards the achievement to all players close to the specified point. */ void AwardSpawnWitherAchievement(cWorld & a_World, int a_BlockX, int a_BlockY, int a_BlockZ) { - class cPlayerCallback : public cPlayerListCallback - { - Vector3f m_Pos; - - virtual bool Item(cPlayer * a_Player) + Vector3f Pos{ static_cast(a_BlockX), static_cast(a_BlockY), static_cast(a_BlockZ) }; + a_World.ForEachPlayer([=](cPlayer & a_Player) { // If player is close, award achievement: - double Dist = (a_Player->GetPosition() - m_Pos).Length(); + double Dist = (a_Player.GetPosition() - Pos).Length(); if (Dist < 50.0) { - a_Player->AwardAchievement(achSpawnWither); + a_Player.AwardAchievement(achSpawnWither); } return false; } - - public: - cPlayerCallback(const Vector3f & a_Pos) : m_Pos(a_Pos) {} - } PlayerCallback(Vector3f(static_cast(a_BlockX), static_cast(a_BlockY), static_cast(a_BlockZ))); - a_World.ForEachPlayer(PlayerCallback); + ); } -- cgit v1.2.3