diff options
Diffstat (limited to '')
-rw-r--r-- | src/Items/CMakeLists.txt | 1 | ||||
-rw-r--r-- | src/Items/ItemBottle.h | 95 | ||||
-rw-r--r-- | src/Items/ItemHandler.cpp | 2 |
3 files changed, 98 insertions, 0 deletions
diff --git a/src/Items/CMakeLists.txt b/src/Items/CMakeLists.txt index a0910ea8a..2e719d1a6 100644 --- a/src/Items/CMakeLists.txt +++ b/src/Items/CMakeLists.txt @@ -13,6 +13,7 @@ SET (HDRS ItemBed.h ItemBigFlower.h ItemBoat.h + ItemBottle.h ItemBow.h ItemBrewingStand.h ItemBucket.h 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; + } +} ; + + + + diff --git a/src/Items/ItemHandler.cpp b/src/Items/ItemHandler.cpp index 5ff3c84bf..5d088dfcd 100644 --- a/src/Items/ItemHandler.cpp +++ b/src/Items/ItemHandler.cpp @@ -13,6 +13,7 @@ #include "ItemBed.h" #include "ItemBigFlower.h" #include "ItemBoat.h" +#include "ItemBottle.h" #include "ItemBow.h" #include "ItemBrewingStand.h" #include "ItemBucket.h" @@ -134,6 +135,7 @@ cItemHandler * cItemHandler::CreateItemHandler(int a_ItemType) case E_ITEM_FISHING_ROD: return new cItemFishingRodHandler(a_ItemType); case E_ITEM_FLINT_AND_STEEL: return new cItemLighterHandler(a_ItemType); case E_ITEM_FLOWER_POT: return new cItemFlowerPotHandler(a_ItemType); + case E_ITEM_GLASS_BOTTLE: return new cItemBottleHandler(); case E_ITEM_GOLDEN_APPLE: return new cItemGoldenAppleHandler(); case E_ITEM_MAP: return new cItemMapHandler(); case E_ITEM_MILK: return new cItemMilkHandler(); |