diff options
author | Gargaj <gargaj@conspiracy.hu> | 2015-12-21 20:13:57 +0100 |
---|---|---|
committer | Gargaj <gargaj@conspiracy.hu> | 2015-12-22 20:25:59 +0100 |
commit | 8968a7174e44b78f79693fc16f57547769888692 (patch) | |
tree | 44811979429461de49a7653970735821e316b303 /src/Items/ItemBottle.h | |
parent | Merge pull request #2796 from cuberite/MojangCert (diff) | |
download | cuberite-8968a7174e44b78f79693fc16f57547769888692.tar cuberite-8968a7174e44b78f79693fc16f57547769888692.tar.gz cuberite-8968a7174e44b78f79693fc16f57547769888692.tar.bz2 cuberite-8968a7174e44b78f79693fc16f57547769888692.tar.lz cuberite-8968a7174e44b78f79693fc16f57547769888692.tar.xz cuberite-8968a7174e44b78f79693fc16f57547769888692.tar.zst cuberite-8968a7174e44b78f79693fc16f57547769888692.zip |
Diffstat (limited to '')
-rw-r--r-- | src/Items/ItemBottle.h | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/src/Items/ItemBottle.h b/src/Items/ItemBottle.h new file mode 100644 index 000000000..d2ca30def --- /dev/null +++ b/src/Items/ItemBottle.h @@ -0,0 +1,95 @@ + +#pragma once + +#include "ItemHandler.h" +#include "../World.h" + + + + + +class cItemBottleHandler : + public cItemHandler +{ +public: + cItemBottleHandler() : + cItemHandler(E_ITEM_GLASS_BOTTLE) + { + } + + + bool GetBlockFromTrace(cWorld * a_World, cPlayer * a_Player, Vector3i & a_BlockPos) + { + class cCallbacks : + public cBlockTracer::cCallbacks + { + public: + Vector3i m_Pos; + bool m_HasHitFluid; + + + cCallbacks(void) : + m_HasHitFluid(false) + { + } + + virtual bool OnNextBlock(int a_BlockX, int a_BlockY, int a_BlockZ, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, char a_EntryFace) override + { + if (IsBlockWater(a_BlockType)) + { + if (a_BlockMeta != 0) // we're only looking for source blocks + { + return false; + } + m_HasHitFluid = true; + m_Pos.Set(a_BlockX, a_BlockY, a_BlockZ); + return true; + } + return false; + } + } Callbacks; + + cLineBlockTracer Tracer(*a_World, Callbacks); + Vector3d Start(a_Player->GetEyePosition() + a_Player->GetLookVector()); + Vector3d End(a_Player->GetEyePosition() + a_Player->GetLookVector() * 5); + + Tracer.Trace(Start.x, Start.y, Start.z, End.x, End.y, End.z); + + if (!Callbacks.m_HasHitFluid) + { + return false; + } + + + a_BlockPos = Callbacks.m_Pos; + return true; + } + + + + virtual bool OnItemUse( + cWorld * a_World, cPlayer * a_Player, cBlockPluginInterface & a_PluginInterface, const cItem & a_Item, + int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace + ) override + { + if (a_BlockFace != BLOCK_FACE_NONE) + { + return false; + } + + Vector3i BlockPos; + if (!GetBlockFromTrace(a_World, a_Player, BlockPos)) + { + return false; // Nothing in range. + } + + a_Player->GetInventory().RemoveOneEquippedItem(); + cItem NewItem(E_ITEM_POTION, 1, 0); + a_Player->GetInventory().AddItem(NewItem); + return true; + } +} ; + + + + |