From 1d1fa914012125126d1a3656edc428859696f54f Mon Sep 17 00:00:00 2001 From: KingCol13 <48412633+KingCol13@users.noreply.github.com> Date: Sat, 10 Jul 2021 21:05:00 +0100 Subject: Chorus fruit teleport (#5259) * Outline function for teleporting. * Created new handler for chorus fruit. * Fixed AttemptTeleport failing. * Better names, working sound effect. * Corrected naming. * Remove stray LOGD. * Offset teleport to middle of block. * Style Fixes Co-authored-by: x12xx12x <44411062+12xx12@users.noreply.github.com> * Style Fixes 2 Co-authored-by: x12xx12x <44411062+12xx12@users.noreply.github.com> * Move FindTeleportDestination to static cPawn method. * cBoundingBox interface. * Cleanup includes. * Maybe exported to API? * Change a_World to reference, add to APIDesc. Co-authored-by: x12xx12x <44411062+12xx12@users.noreply.github.com> --- src/Items/CMakeLists.txt | 1 + src/Items/ItemChorusFruit.h | 44 ++++++++++++++++++++++++++++++++++++++++++++ src/Items/ItemHandler.cpp | 3 ++- 3 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 src/Items/ItemChorusFruit.h (limited to 'src/Items') 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(); -- cgit v1.2.3