summaryrefslogtreecommitdiffstats
path: root/src/Blocks
diff options
context:
space:
mode:
authorpeterbell10 <peterbell10@live.co.uk>2017-09-11 23:20:49 +0200
committerMattes D <github@xoft.cz>2017-09-11 23:20:49 +0200
commite225b7f8262df48ad4d7094bc295add3007b0649 (patch)
treea42e9afcc88cfe6e9d1258458e3ad42764083d0e /src/Blocks
parentcBlockArea: change MakeIndex to return size_t (diff)
downloadcuberite-e225b7f8262df48ad4d7094bc295add3007b0649.tar
cuberite-e225b7f8262df48ad4d7094bc295add3007b0649.tar.gz
cuberite-e225b7f8262df48ad4d7094bc295add3007b0649.tar.bz2
cuberite-e225b7f8262df48ad4d7094bc295add3007b0649.tar.lz
cuberite-e225b7f8262df48ad4d7094bc295add3007b0649.tar.xz
cuberite-e225b7f8262df48ad4d7094bc295add3007b0649.tar.zst
cuberite-e225b7f8262df48ad4d7094bc295add3007b0649.zip
Diffstat (limited to 'src/Blocks')
-rw-r--r--src/Blocks/BlockBed.cpp130
-rw-r--r--src/Blocks/BlockMobHead.h22
-rw-r--r--src/Blocks/WorldInterface.h23
3 files changed, 57 insertions, 118 deletions
diff --git a/src/Blocks/BlockBed.cpp b/src/Blocks/BlockBed.cpp
index 77572a254..0032ec079 100644
--- a/src/Blocks/BlockBed.cpp
+++ b/src/Blocks/BlockBed.cpp
@@ -1,12 +1,12 @@
-
+
// BlockBed.cpp
#include "Globals.h"
#include "BlockBed.h"
#include "BroadcastInterface.h"
-#include "Entities/../World.h"
#include "Entities/Player.h"
+#include "../World.h"
#include "../BoundingBox.h"
#include "../Mobs/Monster.h"
#include "../BlockEntities/BedEntity.h"
@@ -53,66 +53,6 @@ void cBlockBedHandler::OnDestroyed(cChunkInterface & a_ChunkInterface, cWorldInt
-class cFindMobs :
- public cEntityCallback
-{
- virtual bool Item(cEntity * a_Entity) override
- {
- return (
- (a_Entity->GetEntityType() == cEntity::etMonster) &&
- (static_cast<cMonster*>(a_Entity)->GetMobFamily() == cMonster::mfHostile)
- );
- }
-};
-
-
-
-
-
-class cTimeFastForwardTester :
- public cPlayerListCallback
-{
- virtual bool Item(cPlayer * a_Player) override
- {
- if (!a_Player->IsInBed())
- {
- return true;
- }
-
- return false;
- }
-};
-
-
-
-
-
-class cPlayerBedStateUnsetter :
- public cPlayerListCallback
-{
-public:
- cPlayerBedStateUnsetter(Vector3i a_Position, cChunkInterface & a_ChunkInterface) :
- m_Position(a_Position),
- m_ChunkInterface(a_ChunkInterface)
- {
- }
-
- virtual bool Item(cPlayer * a_Player) override
- {
- cBlockBedHandler::SetBedOccupationState(m_ChunkInterface, a_Player->GetLastBedPos(), false);
- a_Player->SetIsInBed(false);
- return false;
- }
-
-private:
- Vector3i m_Position;
- cChunkInterface & m_ChunkInterface;
-};
-
-
-
-
-
bool cBlockBedHandler::OnUse(cChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface, cPlayer & a_Player, int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace, int a_CursorX, int a_CursorY, int a_CursorZ)
{
if (a_WorldInterface.GetDimension() != dimOverworld)
@@ -133,7 +73,14 @@ bool cBlockBedHandler::OnUse(cChunkInterface & a_ChunkInterface, cWorldInterface
}
else
{
- cFindMobs FindMobs;
+ auto FindMobs = [](cEntity & a_Entity)
+ {
+ return (
+ (a_Entity.GetEntityType() == cEntity::etMonster) &&
+ (static_cast<cMonster&>(a_Entity).GetMobFamily() == cMonster::mfHostile)
+ );
+ };
+
if (!a_Player.GetWorld()->ForEachEntityInBox(cBoundingBox(a_Player.GetPosition() - Vector3i(0, 5, 0), 8, 10), FindMobs))
{
a_Player.SendMessageFailure("You may not rest now, there are monsters nearby");
@@ -164,11 +111,24 @@ bool cBlockBedHandler::OnUse(cChunkInterface & a_ChunkInterface, cWorldInterface
a_Player.SetIsInBed(true);
a_Player.SendMessageSuccess("Home position set successfully");
- cTimeFastForwardTester Tester;
- if (a_WorldInterface.ForEachPlayer(Tester))
+ auto TimeFastForwardTester = [](cPlayer & a_OtherPlayer)
{
- cPlayerBedStateUnsetter Unsetter(Vector3i(a_BlockX + PillowDirection.x, a_BlockY, a_BlockZ + PillowDirection.z), a_ChunkInterface);
- a_WorldInterface.ForEachPlayer(Unsetter);
+ if (!a_OtherPlayer.IsInBed())
+ {
+ return true;
+ }
+ return false;
+ };
+
+ if (a_WorldInterface.ForEachPlayer(TimeFastForwardTester))
+ {
+ a_WorldInterface.ForEachPlayer([&](cPlayer & a_OtherPlayer)
+ {
+ cBlockBedHandler::SetBedOccupationState(a_ChunkInterface, a_OtherPlayer.GetLastBedPos(), false);
+ a_OtherPlayer.SetIsInBed(false);
+ return false;
+ }
+ );
a_WorldInterface.SetTimeOfDay(0);
a_ChunkInterface.SetBlockMeta(a_BlockX, a_BlockY, a_BlockZ, Meta & 0x0b); // Clear the "occupied" bit of the bed's block
}
@@ -184,25 +144,12 @@ bool cBlockBedHandler::OnUse(cChunkInterface & a_ChunkInterface, cWorldInterface
void cBlockBedHandler::OnPlacedByPlayer(cChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface, cPlayer & a_Player, const sSetBlock & a_BlockChange)
{
- class cBedColor :
- public cBedCallback
- {
- public:
- short m_Color;
-
- cBedColor(short a_Color) :
- m_Color(a_Color)
+ a_Player.GetWorld()->DoWithBedAt(a_BlockChange.GetX(), a_BlockChange.GetY(), a_BlockChange.GetZ(), [&](cBedEntity & a_Bed)
{
- }
-
- virtual bool Item(cBedEntity * a_Bed) override
- {
- a_Bed->SetColor(m_Color);
+ a_Bed.SetColor(a_Player.GetEquippedItem().m_ItemDamage);
return true;
}
- };
- cBedColor BedCallback(a_Player.GetEquippedItem().m_ItemDamage);
- a_Player.GetWorld()->DoWithBedAt(a_BlockChange.GetX(), a_BlockChange.GetY(), a_BlockChange.GetZ(), BedCallback);
+ );
}
@@ -211,19 +158,12 @@ void cBlockBedHandler::OnPlacedByPlayer(cChunkInterface & a_ChunkInterface, cWor
void cBlockBedHandler::ConvertToPickups(cWorldInterface & a_WorldInterface, cItems & a_Pickups, NIBBLETYPE a_BlockMeta, int a_BlockX, int a_BlockY, int a_BlockZ)
{
- class cBedColor :
- public cBedCallback
- {
- public:
- short m_Color = E_META_WOOL_RED;
-
- virtual bool Item(cBedEntity * a_Bed) override
+ short Color = E_META_WOOL_RED;
+ a_WorldInterface.DoWithBedAt(a_BlockX, a_BlockY, a_BlockZ, [&](cBedEntity & a_Bed)
{
- m_Color = a_Bed->GetColor();
+ Color = a_Bed.GetColor();
return true;
}
- };
- cBedColor BedCallback;
- a_WorldInterface.DoWithBedAt(a_BlockX, a_BlockY, a_BlockZ, BedCallback);
- a_Pickups.Add(cItem(E_ITEM_BED, 1, BedCallback.m_Color));
+ );
+ a_Pickups.Add(cItem(E_ITEM_BED, 1, Color));
}
diff --git a/src/Blocks/BlockMobHead.h b/src/Blocks/BlockMobHead.h
index 30aba2491..764cd7f65 100644
--- a/src/Blocks/BlockMobHead.h
+++ b/src/Blocks/BlockMobHead.h
@@ -30,36 +30,32 @@ public:
return;
}
- class cCallback : public cBlockEntityCallback
- {
- virtual bool Item(cBlockEntity * a_BlockEntity)
+ a_WorldInterface.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;
}
- cMobHeadEntity * MobHeadEntity = static_cast<cMobHeadEntity*>(a_BlockEntity);
+ auto & MobHeadEntity = static_cast<cMobHeadEntity&>(a_BlockEntity);
cItems Pickups;
- Pickups.Add(E_ITEM_HEAD, 1, static_cast<short>(MobHeadEntity->GetType()));
+ Pickups.Add(E_ITEM_HEAD, 1, static_cast<short>(MobHeadEntity.GetType()));
auto & r1 = GetRandomProvider();
// Mid-block position first
double MicroX, MicroY, MicroZ;
- MicroX = MobHeadEntity->GetPosX() + 0.5;
- MicroY = MobHeadEntity->GetPosY() + 0.5;
- MicroZ = MobHeadEntity->GetPosZ() + 0.5;
+ MicroX = MobHeadEntity.GetPosX() + 0.5;
+ MicroY = MobHeadEntity.GetPosY() + 0.5;
+ MicroZ = MobHeadEntity.GetPosZ() + 0.5;
// Add random offset second
MicroX += r1.RandReal<double>(-0.5, 0.5);
MicroZ += r1.RandReal<double>(-0.5, 0.5);
- MobHeadEntity->GetWorld()->SpawnItemPickups(Pickups, MicroX, MicroY, MicroZ);
+ MobHeadEntity.GetWorld()->SpawnItemPickups(Pickups, MicroX, MicroY, MicroZ);
return false;
}
- } Callback;
-
- a_WorldInterface.DoWithBlockEntityAt(a_BlockX, a_BlockY, a_BlockZ, Callback);
+ );
}
virtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) override
diff --git a/src/Blocks/WorldInterface.h b/src/Blocks/WorldInterface.h
index 524e8d642..1619a8fce 100644
--- a/src/Blocks/WorldInterface.h
+++ b/src/Blocks/WorldInterface.h
@@ -1,15 +1,18 @@
-
+
#pragma once
-
+#include "FunctionRef.h"
#include "../Mobs/MonsterTypes.h"
-
-typedef cItemCallback<cBlockEntity> cBlockEntityCallback;
+class cBedEntity;
+class cBlockEntity;
class cBroadcastInterface;
class cItems;
class cPlayer;
+using cBedCallback = cFunctionRef<bool(cBedEntity &)>;
+using cBlockEntityCallback = cFunctionRef<bool(cBlockEntity &)>;
+using cPlayerListCallback = cFunctionRef<bool(cPlayer &)>;
@@ -28,7 +31,10 @@ public:
virtual void DoExplosionAt(double a_ExplosionSize, double a_BlockX, double a_BlockY, double a_BlockZ, bool a_CanCauseFire, eExplosionSource a_Source, void * a_SourceData) = 0;
- virtual bool DoWithBedAt(int a_BlockX, int a_BlockY, int a_BlockZ, cBedCallback & a_Callback) = 0;
+ virtual bool DoWithBedAt(int a_BlockX, int a_BlockY, int a_BlockZ, cBedCallback a_Callback) = 0;
+
+ /** Calls the callback for the block entity at the specified coords; returns false if there's no block entity at those coords, true if found */
+ virtual bool DoWithBlockEntityAt(int a_BlockX, int a_BlockY, int a_BlockZ, cBlockEntityCallback a_Callback) = 0;
/** Spawns item pickups for each item in the list. May compress pickups if too many entities: */
virtual void SpawnItemPickups(const cItems & a_Pickups, double a_BlockX, double a_BlockY, double a_BlockZ, double a_FlyAwaySpeed = 1.0, bool IsPlayerCreated = false) = 0;
@@ -46,19 +52,16 @@ public:
Returns the UniqueID of the spawned experience orb, or cEntity::INVALID_ID on failure. */
virtual UInt32 SpawnExperienceOrb(double a_X, double a_Y, double a_Z, int a_Reward) = 0;
- /** Calls the callback for the block entity at the specified coords; returns false if there's no block entity at those coords, true if found */
- virtual bool DoWithBlockEntityAt(int a_BlockX, int a_BlockY, int a_BlockZ, cBlockEntityCallback & a_Callback) = 0;
-
/** Sends the block on those coords to the player */
virtual void SendBlockTo(int a_BlockX, int a_BlockY, int a_BlockZ, cPlayer & a_Player) = 0;
/** Calls the callback for each player in the list; returns true if all players processed, false if the callback aborted by returning true */
- virtual bool ForEachPlayer(cItemCallback<cPlayer> & a_Callback) = 0;
+ virtual bool ForEachPlayer(cPlayerListCallback a_Callback) = 0;
/** Calls the callback for each entity that has a nonempty intersection with the specified boundingbox.
Returns true if all entities processed, false if the callback aborted by returning true.
If any chunk in the box is missing, ignores the entities in that chunk silently. */
- virtual bool ForEachEntityInBox(const cBoundingBox & a_Box, cEntityCallback & a_Callback) = 0;
+ virtual bool ForEachEntityInBox(const cBoundingBox & a_Box, cEntityCallback a_Callback) = 0;
virtual void SetTimeOfDay(int a_TimeOfDay) = 0;