#include "minecraft/IGameServices.h" #include "FireworksItem.h" #include #include #include "app/linux/LinuxGame.h" #include "util/StringHelpers.h" #include "minecraft/util/HtmlString.h" #include "minecraft/world/entity/player/Abilities.h" #include "minecraft/world/entity/player/Player.h" #include "minecraft/world/entity/projectile/FireworksRocketEntity.h" #include "minecraft/world/item/FireworksChargeItem.h" #include "minecraft/world/item/Item.h" #include "minecraft/world/item/ItemInstance.h" #include "minecraft/world/level/Level.h" #include "nbt/CompoundTag.h" #include "nbt/ListTag.h" #include "strings.h" const std::string FireworksItem::TAG_FIREWORKS = "Fireworks"; const std::string FireworksItem::TAG_EXPLOSION = "Explosion"; const std::string FireworksItem::TAG_EXPLOSIONS = "Explosions"; const std::string FireworksItem::TAG_FLIGHT = "Flight"; const std::string FireworksItem::TAG_E_TYPE = "Type"; const std::string FireworksItem::TAG_E_TRAIL = "Trail"; const std::string FireworksItem::TAG_E_FLICKER = "Flicker"; const std::string FireworksItem::TAG_E_COLORS = "Colors"; const std::string FireworksItem::TAG_E_FADECOLORS = "FadeColors"; FireworksItem::FireworksItem(int id) : Item(id) {} bool FireworksItem::useOn(std::shared_ptr instance, std::shared_ptr player, Level* level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly) { // 4J-JEV: Fix for xb1 #173493 - CU7: Content: UI: Missing tooltip for // Firework Rocket. if (bTestUseOnOnly) return true; if (!level->isClientSide) { std::shared_ptr f = std::make_shared( level, x + clickX, y + clickY, z + clickZ, instance); level->addEntity(f); if (!player->abilities.instabuild) { instance->count--; } return true; } return false; } void FireworksItem::appendHoverText(std::shared_ptr itemInstance, std::shared_ptr player, std::vector* lines, bool advanced) { if (!itemInstance->hasTag()) { return; } CompoundTag* fireTag = itemInstance->getTag()->getCompound(TAG_FIREWORKS); if (fireTag == nullptr) { return; } if (fireTag->contains(TAG_FLIGHT)) { lines->push_back( std::string(gameServices().getString(IDS_ITEM_FIREWORKS_FLIGHT)) + " " + toWString((fireTag->getByte(TAG_FLIGHT)))); } ListTag* explosions = (ListTag*)fireTag->getList(TAG_EXPLOSIONS); if (explosions != nullptr && explosions->size() > 0) { for (int i = 0; i < explosions->size(); i++) { CompoundTag* expTag = explosions->get(i); std::vector eLines; FireworksChargeItem::appendHoverText(expTag, &eLines); if (eLines.size() > 0) { // Indent lines after first line for (int i = 1; i < eLines.size(); i++) { eLines[i].indent = true; } lines->insert(lines->end(), eLines.begin(), eLines.end()); } } } }