diff options
Diffstat (limited to '')
-rw-r--r-- | src/Items/CMakeLists.txt | 1 | ||||
-rw-r--r-- | src/Items/ItemChorusFruit.h | 44 | ||||
-rw-r--r-- | src/Items/ItemHandler.cpp | 3 |
3 files changed, 47 insertions, 1 deletions
diff --git a/src/Items/CMakeLists.txt b/src/Items/CMakeLists.txt index 3f182dd76..0dc7f8365 100644 --- a/src/Items/CMakeLists.txt +++ b/src/Items/CMakeLists.txt @@ -15,6 +15,7 @@ target_sources( ItemBucket.h ItemButton.h ItemChest.h + ItemChorusFruit.h ItemCloth.h ItemComparator.h ItemCookedFish.h diff --git a/src/Items/ItemChorusFruit.h b/src/Items/ItemChorusFruit.h new file mode 100644 index 000000000..261088411 --- /dev/null +++ b/src/Items/ItemChorusFruit.h @@ -0,0 +1,44 @@ + +#pragma once + +#include "ItemFood.h" +#include "../Entities/Pawn.h" + + + + + +class cItemChorusFruitHandler: + public cItemFoodHandler +{ + using Super = cItemFoodHandler; + +public: + + cItemChorusFruitHandler(): + Super(E_ITEM_CHORUS_FRUIT, FoodInfo(4, 2.4)) + { + } + + virtual bool EatItem(cPlayer * a_Player, cItem * a_Item) override + { + cItemHandler::EatItem(a_Player, a_Item); + + if (!a_Player->IsGameModeCreative()) + { + a_Player->GetInventory().RemoveOneEquippedItem(); + } + + // Attempt to find a teleport destination + Vector3d Destination; + cWorld * World = a_Player->GetWorld(); + if (cPawn::FindTeleportDestination(*World, 2, 16, Destination, a_Player->GetPosition(), 8)) + { + // Broadcast sound effect to _pre-teleport_ location, then teleport player. + World->BroadcastSoundEffect("item.chorus_fruit.teleport", a_Player->GetPosition(), 1, 1); + a_Player->TeleportToCoords(Destination.x, Destination.y, Destination.z); + } + return true; + } + +}; diff --git a/src/Items/ItemHandler.cpp b/src/Items/ItemHandler.cpp index 1c6300353..63f950e26 100644 --- a/src/Items/ItemHandler.cpp +++ b/src/Items/ItemHandler.cpp @@ -20,6 +20,7 @@ #include "ItemBucket.h" #include "ItemButton.h" #include "ItemChest.h" +#include "ItemChorusFruit.h" #include "ItemCloth.h" #include "ItemComparator.h" #include "ItemCookedFish.h" @@ -354,7 +355,6 @@ cItemHandler * cItemHandler::CreateItemHandler(int a_ItemType) case E_ITEM_BAKED_POTATO: return new cItemFoodHandler(a_ItemType, FoodInfo(5, 6)); case E_ITEM_BEETROOT: return new cItemFoodHandler(a_ItemType, FoodInfo(1, 1.2)); case E_ITEM_BREAD: return new cItemFoodHandler(a_ItemType, FoodInfo(5, 6)); - case E_ITEM_CHORUS_FRUIT: return new cItemFoodHandler(a_ItemType, FoodInfo(4, 2.4)); case E_ITEM_COOKED_CHICKEN: return new cItemFoodHandler(a_ItemType, FoodInfo(6, 7.2)); case E_ITEM_COOKED_MUTTON: return new cItemFoodHandler(a_ItemType, FoodInfo(6, 9.6)); case E_ITEM_COOKED_PORKCHOP: return new cItemFoodHandler(a_ItemType, FoodInfo(8, 12.8)); @@ -371,6 +371,7 @@ cItemHandler * cItemHandler::CreateItemHandler(int a_ItemType) case E_ITEM_STEAK: return new cItemFoodHandler(a_ItemType, FoodInfo(8, 12.8)); // Special-case food with their own handler + case E_ITEM_CHORUS_FRUIT: return new cItemChorusFruitHandler(); case E_ITEM_COOKED_FISH: return new cItemCookedFishHandler(); case E_ITEM_GOLDEN_APPLE: return new cItemGoldenAppleHandler(); case E_ITEM_POISONOUS_POTATO: return new cItemPoisonousPotatoHandler(); |