From 4cae1b9c507f3d31c83ad62cb90d52c65b054fff Mon Sep 17 00:00:00 2001 From: Quentin Bazin Date: Sat, 8 Feb 2020 01:30:39 +0900 Subject: [PATCH] [BlockCursor] It is now required to press Sneak key to place a block on a workbench/furnace without activating their GUI. --- client/source/hud/BlockCursor.cpp | 12 ++++++------ common/include/world/Block.hpp | 2 ++ common/source/world/Block.cpp | 4 ++-- server/include/world/ServerBlock.hpp | 2 +- 4 files changed, 11 insertions(+), 9 deletions(-) diff --git a/client/source/hud/BlockCursor.cpp b/client/source/hud/BlockCursor.cpp index 021b98d18..60fd0490a 100644 --- a/client/source/hud/BlockCursor.cpp +++ b/client/source/hud/BlockCursor.cpp @@ -13,6 +13,7 @@ */ #include +#include #include #include #include @@ -22,6 +23,7 @@ #include "ClientCommandHandler.hpp" #include "ClientPlayer.hpp" #include "Config.hpp" +#include "GameKey.hpp" #include "Hotbar.hpp" #include "Registry.hpp" @@ -77,15 +79,13 @@ void BlockCursor::onEvent(const SDL_Event &event, const Hotbar &hotbar) { const Block &block = Registry::getInstance().getBlock(blockId); const Item &item = Registry::getInstance().getItem(hotbar.currentItem()); - if (block.id()) { + bool blockActivationSent = false; + if (block.id() && block.canBeActivated() && !gk::GamePad::isKeyPressed(GameKey::Sneak)) { m_client.sendBlockActivated(m_selectedBlock); + blockActivationSent = true; } - // FIXME: Check if this block has a callback - // ServerBlock should contain onBlockActivated - // Block should contain hasBlockActivatedCallback - if (block.id()// && !block.onBlockActivated({m_selectedBlock.x, m_selectedBlock.y, m_selectedBlock.z}, m_player, m_world) - && hotbar.currentItem() && item.isBlock()) { + if (block.id() && !blockActivationSent && hotbar.currentItem() && item.isBlock()) { s8 face = m_selectedBlock.w; s32 x = m_selectedBlock.x; diff --git a/common/include/world/Block.hpp b/common/include/world/Block.hpp index a5cef5f4c..155cd2b8b 100644 --- a/common/include/world/Block.hpp +++ b/common/include/world/Block.hpp @@ -82,6 +82,7 @@ class Block : public ISerializable { void setDrawType(BlockDrawType drawType) { m_drawType = drawType; } bool canUpdate() const { return m_canUpdate; } + bool canBeActivated() const { return m_canBeActivated; } bool isLightSource() const { return m_isLightSource; } void setLightSource(bool isLightSource) { m_isLightSource = isLightSource; } @@ -90,6 +91,7 @@ class Block : public ISerializable { glm::vec4 getTexCoordsFromID(int textureID) const; bool m_canUpdate = false; + bool m_canBeActivated = false; private: u32 m_id = 0; diff --git a/common/source/world/Block.cpp b/common/source/world/Block.cpp index dd395ae91..374ad8483 100644 --- a/common/source/world/Block.cpp +++ b/common/source/world/Block.cpp @@ -35,7 +35,7 @@ void Block::serialize(sf::Packet &packet) const { << m_hardness << m_harvestRequirements << m_itemDrop << m_itemDropAmount << m_tiles << m_boundingBox.x << m_boundingBox.y << m_boundingBox.z << m_boundingBox.width << m_boundingBox.height << m_boundingBox.depth - << m_isLightSource; + << m_isLightSource << m_canUpdate << m_canBeActivated; } void Block::deserialize(sf::Packet &packet) { @@ -46,7 +46,7 @@ void Block::deserialize(sf::Packet &packet) { >> m_harvestRequirements >> m_itemDrop >> m_itemDropAmount >> m_tiles >> m_boundingBox.x >> m_boundingBox.y >> m_boundingBox.z >> m_boundingBox.width >> m_boundingBox.height >> m_boundingBox.depth - >> m_isLightSource; + >> m_isLightSource >> m_canUpdate >> m_canBeActivated; m_id = id; m_drawType = BlockDrawType(drawType); diff --git a/server/include/world/ServerBlock.hpp b/server/include/world/ServerBlock.hpp index 945b266fa..0468dcabf 100644 --- a/server/include/world/ServerBlock.hpp +++ b/server/include/world/ServerBlock.hpp @@ -31,7 +31,7 @@ class ServerBlock : public Block { bool canUpdate() const { return m_onTick.valid(); } - void setOnBlockActivated(const sol::function &function) { m_onBlockActivated = function; } + void setOnBlockActivated(const sol::function &function) { m_onBlockActivated = function; m_canBeActivated = m_onBlockActivated.valid(); } void setOnTick(const sol::function &function) { m_onTick = function; m_canUpdate = m_onTick.valid(); } void setOnBlockPlaced(const sol::function &function) { m_onBlockPlaced = function; }