From f9008a4860dc9af9ca2e2ceb643064745269dcec Mon Sep 17 00:00:00 2001 From: Gargaj Date: Tue, 1 Dec 2015 23:12:44 +0100 Subject: allow use failures to propagate from the entity/block to the player --- Server/Plugins/APIDump/Hooks/OnPlayerUsingBlock.lua | 3 ++- src/BlockEntities/BeaconEntity.cpp | 3 ++- src/BlockEntities/BeaconEntity.h | 2 +- src/BlockEntities/BlockEntity.h | 5 +++-- src/BlockEntities/BrewingstandEntity.cpp | 3 ++- src/BlockEntities/BrewingstandEntity.h | 2 +- src/BlockEntities/ChestEntity.cpp | 3 ++- src/BlockEntities/ChestEntity.h | 2 +- src/BlockEntities/CommandBlockEntity.cpp | 3 ++- src/BlockEntities/CommandBlockEntity.h | 2 +- src/BlockEntities/DropSpenserEntity.cpp | 3 ++- src/BlockEntities/DropSpenserEntity.h | 2 +- src/BlockEntities/EnderChestEntity.cpp | 5 +++-- src/BlockEntities/EnderChestEntity.h | 2 +- src/BlockEntities/FlowerPotEntity.cpp | 5 +++-- src/BlockEntities/FlowerPotEntity.h | 3 ++- src/BlockEntities/FurnaceEntity.cpp | 3 ++- src/BlockEntities/FurnaceEntity.h | 2 +- src/BlockEntities/HopperEntity.cpp | 3 ++- src/BlockEntities/HopperEntity.h | 2 +- src/BlockEntities/JukeboxEntity.cpp | 5 ++++- src/BlockEntities/JukeboxEntity.h | 2 +- src/BlockEntities/MobHeadEntity.cpp | 3 ++- src/BlockEntities/MobHeadEntity.h | 2 +- src/BlockEntities/MobSpawnerEntity.cpp | 6 ++++-- src/BlockEntities/MobSpawnerEntity.h | 2 +- src/BlockEntities/NoteEntity.cpp | 3 ++- src/BlockEntities/NoteEntity.h | 2 +- src/BlockEntities/SignEntity.cpp | 3 ++- src/BlockEntities/SignEntity.h | 2 +- src/Blocks/BlockAnvil.h | 3 ++- src/Blocks/BlockBed.cpp | 3 ++- src/Blocks/BlockBed.h | 2 +- src/Blocks/BlockButton.h | 7 ++++--- src/Blocks/BlockCake.h | 5 +++-- src/Blocks/BlockCauldron.h | 3 ++- src/Blocks/BlockComparator.h | 3 ++- src/Blocks/BlockDoor.cpp | 4 +++- src/Blocks/BlockDoor.h | 2 +- src/Blocks/BlockEnchantmentTable.h | 3 ++- src/Blocks/BlockEntity.h | 4 ++-- src/Blocks/BlockFenceGate.h | 3 ++- src/Blocks/BlockHandler.h | 5 +++-- src/Blocks/BlockLever.h | 3 ++- src/Blocks/BlockMobSpawner.h | 4 ++-- src/Blocks/BlockRedstoneRepeater.h | 3 ++- src/Blocks/BlockTrapdoor.h | 6 ++++-- src/Blocks/BlockWorkbench.h | 3 ++- src/Blocks/ChunkInterface.cpp | 4 ++-- src/Blocks/ChunkInterface.h | 4 +++- src/Chunk.cpp | 5 +++-- src/Chunk.h | 4 +++- src/ChunkMap.cpp | 6 +++--- src/ChunkMap.h | 5 +++-- src/ClientHandle.cpp | 15 ++++++++------- 55 files changed, 120 insertions(+), 77 deletions(-) diff --git a/Server/Plugins/APIDump/Hooks/OnPlayerUsingBlock.lua b/Server/Plugins/APIDump/Hooks/OnPlayerUsingBlock.lua index b4ecb5ca1..3c496cfb1 100644 --- a/Server/Plugins/APIDump/Hooks/OnPlayerUsingBlock.lua +++ b/Server/Plugins/APIDump/Hooks/OnPlayerUsingBlock.lua @@ -35,7 +35,8 @@ return Returns = [[ If the function returns false or no value, other plugins' callbacks are called and then Cuberite processes the interaction. If the function returns true, no other callbacks are called for this - event and the interaction is silently dropped. + event and the block is treated like any other block (i.e. if it's possible to place a torch on, + it will be placed, and so on.) ]], }, -- HOOK_PLAYER_USING_BLOCK } diff --git a/src/BlockEntities/BeaconEntity.cpp b/src/BlockEntities/BeaconEntity.cpp index a0de281ba..6eb42384d 100644 --- a/src/BlockEntities/BeaconEntity.cpp +++ b/src/BlockEntities/BeaconEntity.cpp @@ -282,7 +282,7 @@ bool cBeaconEntity::Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) -void cBeaconEntity::UsedBy(cPlayer * a_Player) +bool cBeaconEntity::UsedBy(cPlayer * a_Player) { cWindow * Window = GetWindow(); if (Window == nullptr) @@ -299,6 +299,7 @@ void cBeaconEntity::UsedBy(cPlayer * a_Player) a_Player->OpenWindow(Window); } } + return true; } diff --git a/src/BlockEntities/BeaconEntity.h b/src/BlockEntities/BeaconEntity.h index 4f723c617..6ec00fd1a 100644 --- a/src/BlockEntities/BeaconEntity.h +++ b/src/BlockEntities/BeaconEntity.h @@ -31,7 +31,7 @@ public: // cBlockEntity overrides: virtual void SendTo(cClientHandle & a_Client) override; virtual bool Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override; - virtual void UsedBy(cPlayer * a_Player) override; + virtual bool UsedBy(cPlayer * a_Player) override; /** Modify the beacon level. (It is needed to load the beacon corectly) */ void SetBeaconLevel(char a_Level) { m_BeaconLevel = a_Level; } diff --git a/src/BlockEntities/BlockEntity.h b/src/BlockEntities/BlockEntity.h index f1c470ec3..183210e25 100644 --- a/src/BlockEntities/BlockEntity.h +++ b/src/BlockEntities/BlockEntity.h @@ -102,8 +102,9 @@ public: // tolua_end - /** Called when a player uses this entity; should open the UI window */ - virtual void UsedBy( cPlayer * a_Player) = 0; + /** Called when a player uses this entity; should open the UI window. + returns true if the use was successful, return false to use the block as a "normal" block */ + virtual bool UsedBy( cPlayer * a_Player) = 0; /** Sends the packet defining the block entity to the client specified. To send to all eligible clients, use cWorld::BroadcastBlockEntity() */ diff --git a/src/BlockEntities/BrewingstandEntity.cpp b/src/BlockEntities/BrewingstandEntity.cpp index 38403a59c..3c42bee0e 100644 --- a/src/BlockEntities/BrewingstandEntity.cpp +++ b/src/BlockEntities/BrewingstandEntity.cpp @@ -51,7 +51,7 @@ cBrewingstandEntity::~cBrewingstandEntity() -void cBrewingstandEntity::UsedBy(cPlayer * a_Player) +bool cBrewingstandEntity::UsedBy(cPlayer * a_Player) { cWindow * Window = GetWindow(); if (Window == nullptr) @@ -76,6 +76,7 @@ void cBrewingstandEntity::UsedBy(cPlayer * a_Player) { BroadcastProgress(0, 0); } + return true; } diff --git a/src/BlockEntities/BrewingstandEntity.h b/src/BlockEntities/BrewingstandEntity.h index a895c4bde..89f836e71 100644 --- a/src/BlockEntities/BrewingstandEntity.h +++ b/src/BlockEntities/BrewingstandEntity.h @@ -44,7 +44,7 @@ public: // cBlockEntity overrides: virtual void SendTo(cClientHandle & a_Client) override; virtual bool Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override; - virtual void UsedBy(cPlayer * a_Player) override; + virtual bool UsedBy(cPlayer * a_Player) override; virtual void Destroy() override { m_IsDestroyed = true; diff --git a/src/BlockEntities/ChestEntity.cpp b/src/BlockEntities/ChestEntity.cpp index 21baac977..bd6c19a2a 100644 --- a/src/BlockEntities/ChestEntity.cpp +++ b/src/BlockEntities/ChestEntity.cpp @@ -45,7 +45,7 @@ void cChestEntity::SendTo(cClientHandle & a_Client) -void cChestEntity::UsedBy(cPlayer * a_Player) +bool cChestEntity::UsedBy(cPlayer * a_Player) { // If the window is not created, open it anew: cWindow * Window = GetWindow(); @@ -71,6 +71,7 @@ void cChestEntity::UsedBy(cPlayer * a_Player) int ChunkX, ChunkZ; cChunkDef::BlockToChunk(m_PosX, m_PosZ, ChunkX, ChunkZ); m_World->MarkChunkDirty(ChunkX, ChunkZ, true); + return true; } diff --git a/src/BlockEntities/ChestEntity.h b/src/BlockEntities/ChestEntity.h index 6eb72fc77..72e1c20e8 100644 --- a/src/BlockEntities/ChestEntity.h +++ b/src/BlockEntities/ChestEntity.h @@ -37,7 +37,7 @@ public: // cBlockEntity overrides: virtual void SendTo(cClientHandle & a_Client) override; - virtual void UsedBy(cPlayer * a_Player) override; + virtual bool UsedBy(cPlayer * a_Player) override; /** Opens a new chest window for this chest. Scans for neighbors to open a double chest window, if appropriate. */ diff --git a/src/BlockEntities/CommandBlockEntity.cpp b/src/BlockEntities/CommandBlockEntity.cpp index 13c2637dc..2709201f4 100644 --- a/src/BlockEntities/CommandBlockEntity.cpp +++ b/src/BlockEntities/CommandBlockEntity.cpp @@ -29,10 +29,11 @@ cCommandBlockEntity::cCommandBlockEntity(int a_X, int a_Y, int a_Z, cWorld * a_W -void cCommandBlockEntity::UsedBy(cPlayer * a_Player) +bool cCommandBlockEntity::UsedBy(cPlayer * a_Player) { // Nothing to do UNUSED(a_Player); + return true; } diff --git a/src/BlockEntities/CommandBlockEntity.h b/src/BlockEntities/CommandBlockEntity.h index 959a40681..0f93ff916 100644 --- a/src/BlockEntities/CommandBlockEntity.h +++ b/src/BlockEntities/CommandBlockEntity.h @@ -35,7 +35,7 @@ public: virtual bool Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override; virtual void SendTo(cClientHandle & a_Client) override; - virtual void UsedBy(cPlayer * a_Player) override; + virtual bool UsedBy(cPlayer * a_Player) override; void SetLastOutput(const AString & a_LastOut); diff --git a/src/BlockEntities/DropSpenserEntity.cpp b/src/BlockEntities/DropSpenserEntity.cpp index 211bf8662..6a8b5311e 100644 --- a/src/BlockEntities/DropSpenserEntity.cpp +++ b/src/BlockEntities/DropSpenserEntity.cpp @@ -154,7 +154,7 @@ void cDropSpenserEntity::SendTo(cClientHandle & a_Client) -void cDropSpenserEntity::UsedBy(cPlayer * a_Player) +bool cDropSpenserEntity::UsedBy(cPlayer * a_Player) { cWindow * Window = GetWindow(); if (Window == nullptr) @@ -170,6 +170,7 @@ void cDropSpenserEntity::UsedBy(cPlayer * a_Player) a_Player->OpenWindow(Window); } } + return true; } diff --git a/src/BlockEntities/DropSpenserEntity.h b/src/BlockEntities/DropSpenserEntity.h index 5cdb59b28..9e73269fb 100644 --- a/src/BlockEntities/DropSpenserEntity.h +++ b/src/BlockEntities/DropSpenserEntity.h @@ -49,7 +49,7 @@ public: // cBlockEntity overrides: virtual bool Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override; virtual void SendTo(cClientHandle & a_Client) override; - virtual void UsedBy(cPlayer * a_Player) override; + virtual bool UsedBy(cPlayer * a_Player) override; // tolua_begin diff --git a/src/BlockEntities/EnderChestEntity.cpp b/src/BlockEntities/EnderChestEntity.cpp index 8783c1610..74ca8d8ad 100644 --- a/src/BlockEntities/EnderChestEntity.cpp +++ b/src/BlockEntities/EnderChestEntity.cpp @@ -33,13 +33,13 @@ cEnderChestEntity::~cEnderChestEntity() -void cEnderChestEntity::UsedBy(cPlayer * a_Player) +bool cEnderChestEntity::UsedBy(cPlayer * a_Player) { // TODO: cats are an obstruction if ((GetPosY() < cChunkDef::Height - 1) && !cBlockInfo::IsTransparent(GetWorld()->GetBlock(GetPosX(), GetPosY() + 1, GetPosZ()))) { // Obstruction, don't open - return; + return false; } // If the window is not created, open it anew: cWindow * Window = GetWindow(); @@ -57,6 +57,7 @@ void cEnderChestEntity::UsedBy(cPlayer * a_Player) a_Player->OpenWindow(Window); } } + return true; } diff --git a/src/BlockEntities/EnderChestEntity.h b/src/BlockEntities/EnderChestEntity.h index af59cf170..ba207aaa8 100644 --- a/src/BlockEntities/EnderChestEntity.h +++ b/src/BlockEntities/EnderChestEntity.h @@ -24,7 +24,7 @@ public: virtual ~cEnderChestEntity(); // cBlockEntity overrides: - virtual void UsedBy(cPlayer * a_Player) override; + virtual bool UsedBy(cPlayer * a_Player) override; virtual void SendTo(cClientHandle & a_Client) override { UNUSED(a_Client); } static void LoadFromJson(const Json::Value & a_Value, cItemGrid & a_Grid); diff --git a/src/BlockEntities/FlowerPotEntity.cpp b/src/BlockEntities/FlowerPotEntity.cpp index 64b7edd02..30c7c0745 100644 --- a/src/BlockEntities/FlowerPotEntity.cpp +++ b/src/BlockEntities/FlowerPotEntity.cpp @@ -22,11 +22,11 @@ cFlowerPotEntity::cFlowerPotEntity(int a_BlockX, int a_BlockY, int a_BlockZ, cWo // It don't do anything when 'used' -void cFlowerPotEntity::UsedBy(cPlayer * a_Player) +bool cFlowerPotEntity::UsedBy(cPlayer * a_Player) { if (IsItemInPot()) { - return; + return false; } cItem SelectedItem = a_Player->GetInventory().GetEquippedItem(); @@ -39,6 +39,7 @@ void cFlowerPotEntity::UsedBy(cPlayer * a_Player) } m_World->BroadcastBlockEntity(m_PosX, m_PosY, m_PosZ, a_Player->GetClientHandle()); } + return true; } diff --git a/src/BlockEntities/FlowerPotEntity.h b/src/BlockEntities/FlowerPotEntity.h index a4246bb7d..c7aa02c15 100644 --- a/src/BlockEntities/FlowerPotEntity.h +++ b/src/BlockEntities/FlowerPotEntity.h @@ -46,7 +46,8 @@ public: // tolua_end - virtual void UsedBy(cPlayer * a_Player) override; + /** Called when the player is using the entity; returns true if it was a successful use, return false if it should be treated as a normal block */ + virtual bool UsedBy(cPlayer * a_Player) override; virtual void SendTo(cClientHandle & a_Client) override; static bool IsFlower(short m_ItemType, short m_ItemData); diff --git a/src/BlockEntities/FurnaceEntity.cpp b/src/BlockEntities/FurnaceEntity.cpp index d1588160d..7aeede620 100644 --- a/src/BlockEntities/FurnaceEntity.cpp +++ b/src/BlockEntities/FurnaceEntity.cpp @@ -56,7 +56,7 @@ cFurnaceEntity::~cFurnaceEntity() -void cFurnaceEntity::UsedBy(cPlayer * a_Player) +bool cFurnaceEntity::UsedBy(cPlayer * a_Player) { cWindow * Window = GetWindow(); if (Window == nullptr) @@ -74,6 +74,7 @@ void cFurnaceEntity::UsedBy(cPlayer * a_Player) } UpdateProgressBars(true); + return true; } diff --git a/src/BlockEntities/FurnaceEntity.h b/src/BlockEntities/FurnaceEntity.h index 8734d763c..52d81353c 100644 --- a/src/BlockEntities/FurnaceEntity.h +++ b/src/BlockEntities/FurnaceEntity.h @@ -43,7 +43,7 @@ public: // cBlockEntity overrides: virtual void SendTo(cClientHandle & a_Client) override; virtual bool Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override; - virtual void UsedBy(cPlayer * a_Player) override; + virtual bool UsedBy(cPlayer * a_Player) override; virtual void Destroy() override { m_IsDestroyed = true; diff --git a/src/BlockEntities/HopperEntity.cpp b/src/BlockEntities/HopperEntity.cpp index 33ca974d5..b57f0a638 100644 --- a/src/BlockEntities/HopperEntity.cpp +++ b/src/BlockEntities/HopperEntity.cpp @@ -80,7 +80,7 @@ void cHopperEntity::SendTo(cClientHandle & a_Client) -void cHopperEntity::UsedBy(cPlayer * a_Player) +bool cHopperEntity::UsedBy(cPlayer * a_Player) { // If the window is not created, open it anew: cWindow * Window = GetWindow(); @@ -106,6 +106,7 @@ void cHopperEntity::UsedBy(cPlayer * a_Player) int ChunkX, ChunkZ; cChunkDef::BlockToChunk(m_PosX, m_PosZ, ChunkX, ChunkZ); m_World->MarkChunkDirty(ChunkX, ChunkZ); + return true; } diff --git a/src/BlockEntities/HopperEntity.h b/src/BlockEntities/HopperEntity.h index ba0fe28f3..59645ebb7 100644 --- a/src/BlockEntities/HopperEntity.h +++ b/src/BlockEntities/HopperEntity.h @@ -49,7 +49,7 @@ protected: // cBlockEntity overrides: virtual bool Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override; virtual void SendTo(cClientHandle & a_Client) override; - virtual void UsedBy(cPlayer * a_Player) override; + virtual bool UsedBy(cPlayer * a_Player) override; /** Opens a new chest window for this chest. Scans for neighbors to open a double chest window, if appropriate. */ void OpenNewWindow(void); diff --git a/src/BlockEntities/JukeboxEntity.cpp b/src/BlockEntities/JukeboxEntity.cpp index 1f3f4f324..467a3a28a 100644 --- a/src/BlockEntities/JukeboxEntity.cpp +++ b/src/BlockEntities/JukeboxEntity.cpp @@ -28,11 +28,12 @@ cJukeboxEntity::~cJukeboxEntity() -void cJukeboxEntity::UsedBy(cPlayer * a_Player) +bool cJukeboxEntity::UsedBy(cPlayer * a_Player) { if (IsPlayingRecord()) { EjectRecord(); + return true; } else { @@ -40,8 +41,10 @@ void cJukeboxEntity::UsedBy(cPlayer * a_Player) if (PlayRecord(HeldItem.m_ItemType)) { a_Player->GetInventory().RemoveOneEquippedItem(); + return true; } } + return false; } diff --git a/src/BlockEntities/JukeboxEntity.h b/src/BlockEntities/JukeboxEntity.h index 000f7d87e..3724922ae 100644 --- a/src/BlockEntities/JukeboxEntity.h +++ b/src/BlockEntities/JukeboxEntity.h @@ -44,7 +44,7 @@ public: // tolua_end - virtual void UsedBy(cPlayer * a_Player) override; + virtual bool UsedBy(cPlayer * a_Player) override; virtual void SendTo(cClientHandle &) override {} private: diff --git a/src/BlockEntities/MobHeadEntity.cpp b/src/BlockEntities/MobHeadEntity.cpp index 328ade23a..3275bf7f2 100644 --- a/src/BlockEntities/MobHeadEntity.cpp +++ b/src/BlockEntities/MobHeadEntity.cpp @@ -23,9 +23,10 @@ cMobHeadEntity::cMobHeadEntity(int a_BlockX, int a_BlockY, int a_BlockZ, cWorld -void cMobHeadEntity::UsedBy(cPlayer * a_Player) +bool cMobHeadEntity::UsedBy(cPlayer * a_Player) { UNUSED(a_Player); + return true; } diff --git a/src/BlockEntities/MobHeadEntity.h b/src/BlockEntities/MobHeadEntity.h index b6760b40a..f25cb3a16 100644 --- a/src/BlockEntities/MobHeadEntity.h +++ b/src/BlockEntities/MobHeadEntity.h @@ -53,7 +53,7 @@ public: // tolua_end - virtual void UsedBy(cPlayer * a_Player) override; + virtual bool UsedBy(cPlayer * a_Player) override; virtual void SendTo(cClientHandle & a_Client) override; private: diff --git a/src/BlockEntities/MobSpawnerEntity.cpp b/src/BlockEntities/MobSpawnerEntity.cpp index 4418dca15..7f1b88c9b 100644 --- a/src/BlockEntities/MobSpawnerEntity.cpp +++ b/src/BlockEntities/MobSpawnerEntity.cpp @@ -33,14 +33,14 @@ void cMobSpawnerEntity::SendTo(cClientHandle & a_Client) -void cMobSpawnerEntity::UsedBy(cPlayer * a_Player) +bool cMobSpawnerEntity::UsedBy(cPlayer * a_Player) { if (a_Player->GetEquippedItem().m_ItemType == E_ITEM_SPAWN_EGG) { eMonsterType MonsterType = cItemSpawnEggHandler::ItemDamageToMonsterType(a_Player->GetEquippedItem().m_ItemDamage); if (MonsterType == eMonsterType::mtInvalidType) { - return; + return false; } m_Entity = MonsterType; @@ -50,7 +50,9 @@ void cMobSpawnerEntity::UsedBy(cPlayer * a_Player) a_Player->GetInventory().RemoveOneEquippedItem(); } LOGD("Changed monster spawner at {%d, %d, %d} to type %s.", GetPosX(), GetPosY(), GetPosZ(), cMonster::MobTypeToString(MonsterType).c_str()); + return true; } + return false; } diff --git a/src/BlockEntities/MobSpawnerEntity.h b/src/BlockEntities/MobSpawnerEntity.h index b572e6657..e3bb8c634 100644 --- a/src/BlockEntities/MobSpawnerEntity.h +++ b/src/BlockEntities/MobSpawnerEntity.h @@ -28,7 +28,7 @@ public: cMobSpawnerEntity(int a_BlockX, int a_BlockY, int a_BlockZ, cWorld * a_World); virtual void SendTo(cClientHandle & a_Client) override; - virtual void UsedBy(cPlayer * a_Player) override; + virtual bool UsedBy(cPlayer * a_Player) override; virtual bool Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override; // tolua_begin diff --git a/src/BlockEntities/NoteEntity.cpp b/src/BlockEntities/NoteEntity.cpp index 53685233b..0b110b14e 100644 --- a/src/BlockEntities/NoteEntity.cpp +++ b/src/BlockEntities/NoteEntity.cpp @@ -19,11 +19,12 @@ cNoteEntity::cNoteEntity(int a_BlockX, int a_BlockY, int a_BlockZ, cWorld * a_Wo -void cNoteEntity::UsedBy(cPlayer * a_Player) +bool cNoteEntity::UsedBy(cPlayer * a_Player) { UNUSED(a_Player); IncrementPitch(); MakeSound(); + return true; } diff --git a/src/BlockEntities/NoteEntity.h b/src/BlockEntities/NoteEntity.h index eb2e23fa2..3a70ffec5 100644 --- a/src/BlockEntities/NoteEntity.h +++ b/src/BlockEntities/NoteEntity.h @@ -49,7 +49,7 @@ public: // tolua_end - virtual void UsedBy(cPlayer * a_Player) override; + virtual bool UsedBy(cPlayer * a_Player) override; virtual void SendTo(cClientHandle &) override {} virtual void SetRedstonePower(bool a_Value) override diff --git a/src/BlockEntities/SignEntity.cpp b/src/BlockEntities/SignEntity.cpp index 9a2695b3f..64f42e425 100644 --- a/src/BlockEntities/SignEntity.cpp +++ b/src/BlockEntities/SignEntity.cpp @@ -22,9 +22,10 @@ cSignEntity::cSignEntity(BLOCKTYPE a_BlockType, int a_X, int a_Y, int a_Z, cWorl -void cSignEntity::UsedBy(cPlayer * a_Player) +bool cSignEntity::UsedBy(cPlayer * a_Player) { UNUSED(a_Player); + return true; } diff --git a/src/BlockEntities/SignEntity.h b/src/BlockEntities/SignEntity.h index 373f5e294..50b9d7330 100644 --- a/src/BlockEntities/SignEntity.h +++ b/src/BlockEntities/SignEntity.h @@ -43,7 +43,7 @@ public: // tolua_end - virtual void UsedBy(cPlayer * a_Player) override; + virtual bool UsedBy(cPlayer * a_Player) override; virtual void SendTo(cClientHandle & a_Client) override; private: diff --git a/src/Blocks/BlockAnvil.h b/src/Blocks/BlockAnvil.h index ebfe472c5..539316682 100644 --- a/src/Blocks/BlockAnvil.h +++ b/src/Blocks/BlockAnvil.h @@ -24,10 +24,11 @@ public: a_Pickups.push_back(cItem(E_BLOCK_ANVIL, 1, a_BlockMeta >> 2)); } - virtual void 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) override + virtual bool 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) override { cWindow * Window = new cAnvilWindow(a_BlockX, a_BlockY, a_BlockZ); a_Player->OpenWindow(Window); + return true; } virtual bool GetPlacementBlockTypeMeta( diff --git a/src/Blocks/BlockBed.cpp b/src/Blocks/BlockBed.cpp index dfa392d9b..b980f80e0 100644 --- a/src/Blocks/BlockBed.cpp +++ b/src/Blocks/BlockBed.cpp @@ -81,7 +81,7 @@ private: -void 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) +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) { @@ -138,6 +138,7 @@ void cBlockBedHandler::OnUse(cChunkInterface & a_ChunkInterface, cWorldInterface a_Player->SendMessageFailure("You can only sleep at night"); } } + return true; } diff --git a/src/Blocks/BlockBed.h b/src/Blocks/BlockBed.h index 43ed9beb3..c104a7cb5 100644 --- a/src/Blocks/BlockBed.h +++ b/src/Blocks/BlockBed.h @@ -23,7 +23,7 @@ public: } virtual void OnDestroyed(cChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface, int a_BlockX, int a_BlockY, int a_BlockZ) override; - virtual void 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) override; + virtual bool 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) override; virtual bool IsUseable(void) override { diff --git a/src/Blocks/BlockButton.h b/src/Blocks/BlockButton.h index c24945ea8..7f6c3e56f 100644 --- a/src/Blocks/BlockButton.h +++ b/src/Blocks/BlockButton.h @@ -16,7 +16,7 @@ public: { } - virtual void 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) override + virtual bool 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) override { NIBBLETYPE Meta = a_ChunkInterface.GetBlockMeta(a_BlockX, a_BlockY, a_BlockZ); @@ -27,7 +27,7 @@ public: // If button is already on do nothing if (Meta & 0x08) { - return; + return false; } // Set p the ON bit to on @@ -46,7 +46,8 @@ public: { a_World.BroadcastSoundEffect("random.click", x, y, z, 0.5f, 0.5f); }); - + + return true; } virtual void ConvertToPickups(cItems & a_Pickups, NIBBLETYPE a_BlockMeta) override diff --git a/src/Blocks/BlockCake.h b/src/Blocks/BlockCake.h index eeba666dc..7c7208b05 100644 --- a/src/Blocks/BlockCake.h +++ b/src/Blocks/BlockCake.h @@ -15,13 +15,13 @@ public: { } - virtual void 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) override + virtual bool 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) override { NIBBLETYPE Meta = a_ChunkInterface.GetBlockMeta(a_BlockX, a_BlockY, a_BlockZ); if (!a_Player->Feed(2, 0.4)) { - return; + return false; } if (Meta >= 5) @@ -32,6 +32,7 @@ public: { a_ChunkInterface.SetBlockMeta(a_BlockX, a_BlockY, a_BlockZ, Meta + 1); } + return true; } virtual void ConvertToPickups(cItems & a_Pickups, NIBBLETYPE a_BlockMeta) override diff --git a/src/Blocks/BlockCauldron.h b/src/Blocks/BlockCauldron.h index fa1dc3d7b..2d6a8eef2 100644 --- a/src/Blocks/BlockCauldron.h +++ b/src/Blocks/BlockCauldron.h @@ -21,7 +21,7 @@ public: a_Pickups.push_back(cItem(E_ITEM_CAULDRON, 1, 0)); } - virtual void 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) override + virtual bool 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) override { NIBBLETYPE Meta = a_ChunkInterface.GetBlockMeta(a_BlockX, a_BlockY, a_BlockZ); switch (a_Player->GetEquippedItem().m_ItemType) @@ -52,6 +52,7 @@ public: break; } } + return true; } virtual bool IsUseable() override diff --git a/src/Blocks/BlockComparator.h b/src/Blocks/BlockComparator.h index 3a69f2186..d4ec08dff 100644 --- a/src/Blocks/BlockComparator.h +++ b/src/Blocks/BlockComparator.h @@ -18,11 +18,12 @@ public: { } - virtual void 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) override + virtual bool 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) override { NIBBLETYPE Meta = a_ChunkInterface.GetBlockMeta(a_BlockX, a_BlockY, a_BlockZ); Meta ^= 0x04; // Toggle 3rd (addition / subtraction) bit with XOR a_ChunkInterface.SetBlockMeta(a_BlockX, a_BlockY, a_BlockZ, Meta); + return true; } virtual void OnCancelRightClick(cChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface, cPlayer * a_Player, int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace) override diff --git a/src/Blocks/BlockDoor.cpp b/src/Blocks/BlockDoor.cpp index 30a8b8386..94c49a4b8 100644 --- a/src/Blocks/BlockDoor.cpp +++ b/src/Blocks/BlockDoor.cpp @@ -43,7 +43,7 @@ void cBlockDoorHandler::OnDestroyed(cChunkInterface & a_ChunkInterface, cWorldIn -void cBlockDoorHandler::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) +bool cBlockDoorHandler::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) { UNUSED(a_WorldInterface); UNUSED(a_BlockFace); @@ -75,6 +75,8 @@ void cBlockDoorHandler::OnUse(cChunkInterface & a_ChunkInterface, cWorldInterfac break; } } + + return true; } diff --git a/src/Blocks/BlockDoor.h b/src/Blocks/BlockDoor.h index ca2719a8b..a5f2c61c3 100644 --- a/src/Blocks/BlockDoor.h +++ b/src/Blocks/BlockDoor.h @@ -18,7 +18,7 @@ public: cBlockDoorHandler(BLOCKTYPE a_BlockType); virtual void OnDestroyed(cChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface, int a_BlockX, int a_BlockY, int a_BlockZ) override; - virtual void 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) override; + virtual bool 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) override; virtual void OnCancelRightClick(cChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface, cPlayer * a_Player, int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace) override; virtual NIBBLETYPE MetaRotateCCW(NIBBLETYPE a_Meta) override; diff --git a/src/Blocks/BlockEnchantmentTable.h b/src/Blocks/BlockEnchantmentTable.h index 85951984f..e8ce734b3 100644 --- a/src/Blocks/BlockEnchantmentTable.h +++ b/src/Blocks/BlockEnchantmentTable.h @@ -18,10 +18,11 @@ public: { } - virtual void 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) override + virtual bool 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) override { cWindow * Window = new cEnchantingWindow(a_BlockX, a_BlockY, a_BlockZ); a_Player->OpenWindow(Window); + return true; } virtual bool IsUseable(void) override diff --git a/src/Blocks/BlockEntity.h b/src/Blocks/BlockEntity.h index 7f86a22b2..416e16069 100644 --- a/src/Blocks/BlockEntity.h +++ b/src/Blocks/BlockEntity.h @@ -15,9 +15,9 @@ public: { } - virtual void 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) override + virtual bool 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) override { - a_ChunkInterface.UseBlockEntity(a_Player, a_BlockX, a_BlockY, a_BlockZ); + return a_ChunkInterface.UseBlockEntity(a_Player, a_BlockX, a_BlockY, a_BlockZ); } virtual bool IsUseable() override diff --git a/src/Blocks/BlockFenceGate.h b/src/Blocks/BlockFenceGate.h index 241771a90..9e7c10cf5 100644 --- a/src/Blocks/BlockFenceGate.h +++ b/src/Blocks/BlockFenceGate.h @@ -34,7 +34,7 @@ public: return true; } - virtual void 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) override + virtual bool 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) override { NIBBLETYPE OldMetaData = a_ChunkInterface.GetBlockMeta(a_BlockX, a_BlockY, a_BlockZ); NIBBLETYPE NewMetaData = PlayerYawToMetaData(a_Player->GetYaw()); @@ -51,6 +51,7 @@ public: a_ChunkInterface.SetBlockMeta(a_BlockX, a_BlockY, a_BlockZ, OldMetaData); } a_Player->GetWorld()->BroadcastSoundParticleEffect(EffectID::SFX_RANDOM_DOOR_OPEN_CLOSE, a_BlockX, a_BlockY, a_BlockZ, 0, a_Player->GetClientHandle()); + return true; } virtual void OnCancelRightClick(cChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface, cPlayer * a_Player, int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace) override diff --git a/src/Blocks/BlockHandler.h b/src/Blocks/BlockHandler.h index 0159230a2..4a7b76019 100644 --- a/src/Blocks/BlockHandler.h +++ b/src/Blocks/BlockHandler.h @@ -70,8 +70,9 @@ public: /** Called when the player starts digging the block. */ virtual void OnDigging(cChunkInterface & cChunkInterface, cWorldInterface & a_WorldInterface, cPlayer * a_Player, int a_BlockX, int a_BlockY, int a_BlockZ) {} - /** Called if the user right clicks the block and the block is useable */ - virtual void 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) {} + /** Called if the user right clicks the block and the block is useable + returns true if the use was successful, return false to use the block as a "normal" block */ + virtual bool 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) { return false; } /** Called when a right click to this block is cancelled */ virtual void OnCancelRightClick(cChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface, cPlayer * a_Player, int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace) {} diff --git a/src/Blocks/BlockLever.h b/src/Blocks/BlockLever.h index 698b74ec8..85fd2f28d 100644 --- a/src/Blocks/BlockLever.h +++ b/src/Blocks/BlockLever.h @@ -17,7 +17,7 @@ public: { } - virtual void 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) override + virtual bool 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) override { // Flip the ON bit on / off using the XOR bitwise operation NIBBLETYPE Meta = (a_ChunkInterface.GetBlockMeta(a_BlockX, a_BlockY, a_BlockZ) ^ 0x08); @@ -25,6 +25,7 @@ public: a_ChunkInterface.SetBlockMeta(a_BlockX, a_BlockY, a_BlockZ, Meta); a_WorldInterface.WakeUpSimulators(a_BlockX, a_BlockY, a_BlockZ); a_WorldInterface.GetBroadcastManager().BroadcastSoundEffect("random.click", static_cast(a_BlockX), static_cast(a_BlockY), static_cast(a_BlockZ), 0.5f, (Meta & 0x08) ? 0.6f : 0.5f); + return true; } virtual void ConvertToPickups(cItems & a_Pickups, NIBBLETYPE a_BlockMeta) override diff --git a/src/Blocks/BlockMobSpawner.h b/src/Blocks/BlockMobSpawner.h index 4f389c397..67102c78d 100644 --- a/src/Blocks/BlockMobSpawner.h +++ b/src/Blocks/BlockMobSpawner.h @@ -19,9 +19,9 @@ public: } - virtual void 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) override + virtual bool 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) override { - a_ChunkInterface.UseBlockEntity(a_Player, a_BlockX, a_BlockY, a_BlockZ); + return a_ChunkInterface.UseBlockEntity(a_Player, a_BlockX, a_BlockY, a_BlockZ); } diff --git a/src/Blocks/BlockRedstoneRepeater.h b/src/Blocks/BlockRedstoneRepeater.h index 09d0df167..5f413e10a 100644 --- a/src/Blocks/BlockRedstoneRepeater.h +++ b/src/Blocks/BlockRedstoneRepeater.h @@ -30,9 +30,10 @@ public: return true; } - virtual void 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) override + virtual bool 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) override { a_ChunkInterface.SetBlockMeta(a_BlockX, a_BlockY, a_BlockZ, ((a_ChunkInterface.GetBlockMeta(a_BlockX, a_BlockY, a_BlockZ) + 0x04) & 0x0f)); + return true; } virtual void OnCancelRightClick(cChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface, cPlayer * a_Player, int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace) override diff --git a/src/Blocks/BlockTrapdoor.h b/src/Blocks/BlockTrapdoor.h index 4c5cb410b..bd10a63da 100644 --- a/src/Blocks/BlockTrapdoor.h +++ b/src/Blocks/BlockTrapdoor.h @@ -28,12 +28,12 @@ public: return true; } - virtual void 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) override + virtual bool 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) override { if (m_BlockType == E_BLOCK_IRON_TRAPDOOR) { // Iron doors can only be toggled by redstone, not by right-clicking - return; + return false; } // Flip the ON bit on / off using the XOR bitwise operation @@ -42,6 +42,8 @@ public: cWorld * World = static_cast(&a_WorldInterface); World->BroadcastSoundParticleEffect(EffectID::SFX_RANDOM_DOOR_OPEN_CLOSE, a_BlockX, a_BlockY, a_BlockZ, 0, a_Player->GetClientHandle()); + + return true; } virtual void OnCancelRightClick(cChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface, cPlayer * a_Player, int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace) override diff --git a/src/Blocks/BlockWorkbench.h b/src/Blocks/BlockWorkbench.h index ed78f224d..cafc11af8 100644 --- a/src/Blocks/BlockWorkbench.h +++ b/src/Blocks/BlockWorkbench.h @@ -18,10 +18,11 @@ public: { } - virtual void 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) override + virtual bool 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) override { cWindow * Window = new cCraftingWindow(a_BlockX, a_BlockY, a_BlockZ); a_Player->OpenWindow(Window); + return true; } virtual bool IsUseable(void) override diff --git a/src/Blocks/ChunkInterface.cpp b/src/Blocks/ChunkInterface.cpp index 817640e98..d8a7fc919 100644 --- a/src/Blocks/ChunkInterface.cpp +++ b/src/Blocks/ChunkInterface.cpp @@ -106,9 +106,9 @@ void cChunkInterface::FastSetBlock(const Vector3i & a_Pos, BLOCKTYPE a_BlockType -void cChunkInterface::UseBlockEntity(cPlayer * a_Player, int a_BlockX, int a_BlockY, int a_BlockZ) +bool cChunkInterface::UseBlockEntity(cPlayer * a_Player, int a_BlockX, int a_BlockY, int a_BlockZ) { - m_ChunkMap->UseBlockEntity(a_Player, a_BlockX, a_BlockY, a_BlockZ); + return m_ChunkMap->UseBlockEntity(a_Player, a_BlockX, a_BlockY, a_BlockZ); } diff --git a/src/Blocks/ChunkInterface.h b/src/Blocks/ChunkInterface.h index 2f0cfea11..7b5f0d7fc 100644 --- a/src/Blocks/ChunkInterface.h +++ b/src/Blocks/ChunkInterface.h @@ -39,7 +39,9 @@ public: void FastSetBlock(const Vector3i & a_Pos, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta); - void UseBlockEntity(cPlayer * a_Player, int a_BlockX, int a_BlockY, int a_BlockZ); + /** Use block entity on coordinate. + returns true if the use was successful, return false to use the block as a "normal" block */ + bool UseBlockEntity(cPlayer * a_Player, int a_BlockX, int a_BlockY, int a_BlockZ); virtual bool ForEachChunkInRect(int a_MinChunkX, int a_MaxChunkX, int a_MinChunkZ, int a_MaxChunkZ, cChunkDataCallback & a_Callback) override; diff --git a/src/Chunk.cpp b/src/Chunk.cpp index e1edc0167..b991e073f 100644 --- a/src/Chunk.cpp +++ b/src/Chunk.cpp @@ -1726,13 +1726,14 @@ void cChunk::SetAlwaysTicked(bool a_AlwaysTicked) -void cChunk::UseBlockEntity(cPlayer * a_Player, int a_X, int a_Y, int a_Z) +bool cChunk::UseBlockEntity(cPlayer * a_Player, int a_X, int a_Y, int a_Z) { cBlockEntity * be = GetBlockEntity(a_X, a_Y, a_Z); if (be != nullptr) { - be->UsedBy(a_Player); + return be->UsedBy(a_Player); } + return false; } diff --git a/src/Chunk.h b/src/Chunk.h index ca818a378..a382f3e17 100644 --- a/src/Chunk.h +++ b/src/Chunk.h @@ -317,7 +317,9 @@ public: /** Retrieves the test on the sign at the specified coords; returns false if there's no sign at those coords, true if found */ bool GetSignLines (int a_BlockX, int a_BlockY, int a_BlockZ, AString & a_Line1, AString & a_Line2, AString & a_Line3, AString & a_Line4); // Lua-accessible - void UseBlockEntity(cPlayer * a_Player, int a_X, int a_Y, int a_Z); // [x, y, z] in world block coords + /** Use block entity on coordinate. + returns true if the use was successful, return false to use the block as a "normal" block */ + bool UseBlockEntity(cPlayer * a_Player, int a_X, int a_Y, int a_Z); // [x, y, z] in world block coords void CalculateHeightmap(const BLOCKTYPE * a_BlockTypes); diff --git a/src/ChunkMap.cpp b/src/ChunkMap.cpp index 435a53595..f2b22f4b9 100644 --- a/src/ChunkMap.cpp +++ b/src/ChunkMap.cpp @@ -745,7 +745,7 @@ void cChunkMap::SendBlockEntity(int a_BlockX, int a_BlockY, int a_BlockZ, cClien -void cChunkMap::UseBlockEntity(cPlayer * a_Player, int a_BlockX, int a_BlockY, int a_BlockZ) +bool cChunkMap::UseBlockEntity(cPlayer * a_Player, int a_BlockX, int a_BlockY, int a_BlockZ) { // a_Player rclked block entity at the coords specified, handle it cCSLock Lock(m_CSLayers); @@ -754,9 +754,9 @@ void cChunkMap::UseBlockEntity(cPlayer * a_Player, int a_BlockX, int a_BlockY, i cChunkPtr Chunk = GetChunkNoGen(ChunkX, ChunkZ); if ((Chunk == nullptr) || !Chunk->IsValid()) { - return; + return false; } - Chunk->UseBlockEntity(a_Player, a_BlockX, a_BlockY, a_BlockZ); + return Chunk->UseBlockEntity(a_Player, a_BlockX, a_BlockY, a_BlockZ); } diff --git a/src/ChunkMap.h b/src/ChunkMap.h index 6148d0a82..a43e43895 100644 --- a/src/ChunkMap.h +++ b/src/ChunkMap.h @@ -100,8 +100,9 @@ public: /** Sends the block entity, if it is at the coords specified, to a_Client */ void SendBlockEntity(int a_BlockX, int a_BlockY, int a_BlockZ, cClientHandle & a_Client); - /** a_Player rclked block entity at the coords specified, handle it */ - void UseBlockEntity(cPlayer * a_Player, int a_X, int a_Y, int a_Z); + /** a_Player rclked block entity at the coords specified, handle it + returns true if the use was successful, return false to use the block as a "normal" block */ + bool UseBlockEntity(cPlayer * a_Player, int a_X, int a_Y, int a_Z); /** Calls the callback for the chunk specified, with ChunkMapCS locked; returns false if the chunk doesn't exist, otherwise returns the same value as the callback */ bool DoWithChunk(int a_ChunkX, int a_ChunkZ, cChunkCallback & a_Callback); diff --git a/src/ClientHandle.cpp b/src/ClientHandle.cpp index 28fc6756b..9062d8cab 100644 --- a/src/ClientHandle.cpp +++ b/src/ClientHandle.cpp @@ -1383,15 +1383,16 @@ void cClientHandle::HandleRightClick(int a_BlockX, int a_BlockY, int a_BlockZ, e if (BlockHandler->IsUseable() && !m_Player->IsCrouched()) { - if (PlgMgr->CallHookPlayerUsingBlock(*m_Player, a_BlockX, a_BlockY, a_BlockZ, a_BlockFace, a_CursorX, a_CursorY, a_CursorZ, BlockType, BlockMeta)) + if (!PlgMgr->CallHookPlayerUsingBlock(*m_Player, a_BlockX, a_BlockY, a_BlockZ, a_BlockFace, a_CursorX, a_CursorY, a_CursorZ, BlockType, BlockMeta)) { - // A plugin doesn't agree with using the block, abort - return; + cChunkInterface ChunkInterface(World->GetChunkMap()); + if (BlockHandler->OnUse(ChunkInterface, *World, m_Player, a_BlockX, a_BlockY, a_BlockZ, a_BlockFace, a_CursorX, a_CursorY, a_CursorZ)) + { + // block use was successful, we're done + PlgMgr->CallHookPlayerUsedBlock(*m_Player, a_BlockX, a_BlockY, a_BlockZ, a_BlockFace, a_CursorX, a_CursorY, a_CursorZ, BlockType, BlockMeta); + return; + } } - cChunkInterface ChunkInterface(World->GetChunkMap()); - BlockHandler->OnUse(ChunkInterface, *World, m_Player, a_BlockX, a_BlockY, a_BlockZ, a_BlockFace, a_CursorX, a_CursorY, a_CursorZ); - PlgMgr->CallHookPlayerUsedBlock(*m_Player, a_BlockX, a_BlockY, a_BlockZ, a_BlockFace, a_CursorX, a_CursorY, a_CursorZ, BlockType, BlockMeta); - return; } } -- cgit v1.2.3