diff options
Diffstat (limited to 'src/ClientHandle.cpp')
-rw-r--r-- | src/ClientHandle.cpp | 73 |
1 files changed, 51 insertions, 22 deletions
diff --git a/src/ClientHandle.cpp b/src/ClientHandle.cpp index c6ecb293d..878f84782 100644 --- a/src/ClientHandle.cpp +++ b/src/ClientHandle.cpp @@ -1660,9 +1660,9 @@ void cClientHandle::HandleSlotSelected(Int16 a_SlotNum) void cClientHandle::HandleSpectate(const cUUID & a_PlayerUUID) { - m_Player->GetWorld()->DoWithPlayerByUUID(a_PlayerUUID, [=](cPlayer & a_ToSpectate) + m_Player->GetWorld()->DoWithPlayerByUUID(a_PlayerUUID, [=](cPlayer * a_ToSpectate) { - m_Player->TeleportToEntity(a_ToSpectate); + m_Player->TeleportToEntity(*a_ToSpectate); return true; }); } @@ -1734,9 +1734,9 @@ void cClientHandle::HandleUseEntity(UInt32 a_TargetEntityID, bool a_IsLeftClick) // If the player is a spectator, let him spectate if (m_Player->IsGameModeSpectator() && a_IsLeftClick) { - m_Player->GetWorld()->DoWithEntityByID(a_TargetEntityID, [=](cEntity & a_Entity) + m_Player->GetWorld()->DoWithEntityByID(a_TargetEntityID, [=](cEntity * a_Entity) { - m_Player->AttachTo(&a_Entity); + m_Player->AttachTo(a_Entity); return true; }); return; @@ -1745,18 +1745,20 @@ void cClientHandle::HandleUseEntity(UInt32 a_TargetEntityID, bool a_IsLeftClick) // If it is a right click, call the entity's OnRightClicked() handler: if (!a_IsLeftClick) { - cWorld * World = m_Player->GetWorld(); - World->DoWithEntityByID(a_TargetEntityID, [=](cEntity & a_Entity) + class cRclkEntity : public cEntityCallback + { + cPlayer & m_Player; + virtual bool Item(cEntity * a_Entity) override { if ( - cPluginManager::Get()->CallHookPlayerRightClickingEntity(*m_Player, a_Entity) || + cPluginManager::Get()->CallHookPlayerRightClickingEntity(m_Player, *a_Entity) || ( - m_Player->IsGameModeSpectator() && // Spectators cannot interact with every entity + m_Player.IsGameModeSpectator() && // Spectators cannot interact with every entity ( - !a_Entity.IsMinecart() || // They can only interact with minecarts + !a_Entity->IsMinecart() || // They can only interact with minecarts ( - (static_cast<cMinecart &>(a_Entity).GetPayload() != cMinecart::mpChest) && // And only if the type matches a minecart with a chest or - (static_cast<cMinecart &>(a_Entity).GetPayload() != cMinecart::mpHopper) // a minecart with a hopper + (reinterpret_cast<cMinecart *>(a_Entity)->GetPayload() != cMinecart::mpChest) && // And only if the type matches a minecart with a chest or + (reinterpret_cast<cMinecart *>(a_Entity)->GetPayload() != cMinecart::mpHopper) // a minecart with a hopper ) ) ) @@ -1764,34 +1766,52 @@ void cClientHandle::HandleUseEntity(UInt32 a_TargetEntityID, bool a_IsLeftClick) { return false; } - a_Entity.OnRightClicked(*m_Player); + a_Entity->OnRightClicked(m_Player); return false; } - ); + public: + cRclkEntity(cPlayer & a_Player) : m_Player(a_Player) {} + } Callback (*m_Player); + + cWorld * World = m_Player->GetWorld(); + World->DoWithEntityByID(a_TargetEntityID, Callback); return; } // If it is a left click, attack the entity: - m_Player->GetWorld()->DoWithEntityByID(a_TargetEntityID, [=](cEntity & a_Entity) + class cDamageEntity : public cEntityCallback + { + public: + cPlayer * m_Me; + + cDamageEntity(cPlayer * a_Player) : + m_Me(a_Player) + { + } + + virtual bool Item(cEntity * a_Entity) override { - if (!a_Entity.GetWorld()->IsPVPEnabled()) + if (!a_Entity->GetWorld()->IsPVPEnabled()) { // PVP is disabled, disallow players hurting other players: - if (a_Entity.IsPlayer()) + if (a_Entity->IsPlayer()) { // Player is hurting another player which is not allowed when PVP is disabled so ignore it return true; } } - a_Entity.TakeDamage(*m_Player); - m_Player->AddFoodExhaustion(0.3); - if (a_Entity.IsPawn()) + a_Entity->TakeDamage(*m_Me); + m_Me->AddFoodExhaustion(0.3); + if (a_Entity->IsPawn()) { - m_Player->NotifyNearbyWolves(static_cast<cPawn*>(&a_Entity), true); + m_Me->NotifyNearbyWolves(static_cast<cPawn*>(a_Entity), true); } return true; } - ); + } Callback(m_Player); + + cWorld * World = m_Player->GetWorld(); + World->DoWithEntityByID(a_TargetEntityID, Callback); } @@ -1840,8 +1860,17 @@ bool cClientHandle::CheckMultiLogin(const AString & a_Username) return false; } + class cCallback : + public cPlayerListCallback + { + virtual bool Item(cPlayer * a_Player) override + { + return true; + } + } Callback; + // Check if the player is in any World. - if (cRoot::Get()->DoWithPlayer(a_Username, [](cPlayer &) { return true; })) + if (cRoot::Get()->DoWithPlayer(a_Username, Callback)) { Kick("A player of the username is already logged in"); return false; |