aboutsummaryrefslogtreecommitdiff
path: root/Minecraft.World/FireworksChargeItem.cpp
diff options
context:
space:
mode:
authorLoki Rautio <lokirautio@gmail.com>2026-03-04 03:56:03 -0600
committerLoki Rautio <lokirautio@gmail.com>2026-03-04 03:56:03 -0600
commit42aec6dac53dffa6afe072560a7e1d4986112538 (patch)
tree0836426857391df1b6a83f6368a183f83ec9b104 /Minecraft.World/FireworksChargeItem.cpp
parentc9d58eeac7c72f0b3038e084667b4d89a6249fce (diff)
parentef9b6fd500dfabd9463267b0dd9e29577eea8a2b (diff)
Merge branch 'main' into pr/win64-world-saves
# Conflicts: # Minecraft.Client/MinecraftServer.cpp # README.md
Diffstat (limited to 'Minecraft.World/FireworksChargeItem.cpp')
-rw-r--r--Minecraft.World/FireworksChargeItem.cpp211
1 files changed, 211 insertions, 0 deletions
diff --git a/Minecraft.World/FireworksChargeItem.cpp b/Minecraft.World/FireworksChargeItem.cpp
new file mode 100644
index 00000000..2de2be04
--- /dev/null
+++ b/Minecraft.World/FireworksChargeItem.cpp
@@ -0,0 +1,211 @@
+#include "stdafx.h"
+#include "net.minecraft.world.item.h"
+#include "net.minecraft.world.h"
+#include "FireworksChargeItem.h"
+
+FireworksChargeItem::FireworksChargeItem(int id) : Item(id)
+{
+}
+
+Icon *FireworksChargeItem::getLayerIcon(int auxValue, int spriteLayer)
+{
+ if (spriteLayer > 0)
+ {
+ return overlay;
+ }
+ return Item::getLayerIcon(auxValue, spriteLayer);
+}
+
+int FireworksChargeItem::getColor(shared_ptr<ItemInstance> item, int spriteLayer)
+{
+ if (spriteLayer == 1)
+ {
+ Tag *colorTag = getExplosionTagField(item, FireworksItem::TAG_E_COLORS);
+ if (colorTag != NULL)
+ {
+ IntArrayTag *colors = (IntArrayTag *) colorTag;
+ if (colors->data.length == 1)
+ {
+ return colors->data[0];
+ }
+ int totalRed = 0;
+ int totalGreen = 0;
+ int totalBlue = 0;
+ for (unsigned int i = 0; i < colors->data.length; ++i)
+ {
+ int c = colors->data[i];
+ totalRed += (c & 0xff0000) >> 16;
+ totalGreen += (c & 0x00ff00) >> 8;
+ totalBlue += (c & 0x0000ff) >> 0;
+ }
+ totalRed /= colors->data.length;
+ totalGreen /= colors->data.length;
+ totalBlue /= colors->data.length;
+ return (totalRed << 16) | (totalGreen << 8) | totalBlue;
+ }
+ return 0x8a8a8a;
+ }
+ return Item::getColor(item, spriteLayer);
+}
+
+bool FireworksChargeItem::hasMultipleSpriteLayers()
+{
+ return true;
+}
+
+Tag *FireworksChargeItem::getExplosionTagField(shared_ptr<ItemInstance> instance, const wstring &field)
+{
+ if (instance->hasTag())
+ {
+ CompoundTag *explosion = instance->getTag()->getCompound(FireworksItem::TAG_EXPLOSION);
+ if (explosion != NULL)
+ {
+ return explosion->get(field);
+ }
+ }
+ return NULL;
+}
+
+void FireworksChargeItem::appendHoverText(shared_ptr<ItemInstance> itemInstance, shared_ptr<Player> player, vector<HtmlString> *lines, bool advanced)
+{
+ if (itemInstance->hasTag())
+ {
+ CompoundTag *explosion = itemInstance->getTag()->getCompound(FireworksItem::TAG_EXPLOSION);
+ if (explosion != NULL)
+ {
+ appendHoverText(explosion, lines);
+ }
+ }
+}
+
+const unsigned int FIREWORKS_CHARGE_TYPE_NAME[] =
+{
+ IDS_FIREWORKS_CHARGE_TYPE_0,
+ IDS_FIREWORKS_CHARGE_TYPE_1,
+ IDS_FIREWORKS_CHARGE_TYPE_2,
+ IDS_FIREWORKS_CHARGE_TYPE_3,
+ IDS_FIREWORKS_CHARGE_TYPE_4
+};
+
+const unsigned int FIREWORKS_CHARGE_COLOUR_NAME[] =
+{
+ IDS_FIREWORKS_CHARGE_BLACK,
+ IDS_FIREWORKS_CHARGE_RED,
+ IDS_FIREWORKS_CHARGE_GREEN,
+ IDS_FIREWORKS_CHARGE_BROWN,
+ IDS_FIREWORKS_CHARGE_BLUE,
+ IDS_FIREWORKS_CHARGE_PURPLE,
+ IDS_FIREWORKS_CHARGE_CYAN,
+ IDS_FIREWORKS_CHARGE_SILVER,
+ IDS_FIREWORKS_CHARGE_GRAY,
+ IDS_FIREWORKS_CHARGE_PINK,
+ IDS_FIREWORKS_CHARGE_LIME,
+ IDS_FIREWORKS_CHARGE_YELLOW,
+ IDS_FIREWORKS_CHARGE_LIGHT_BLUE,
+ IDS_FIREWORKS_CHARGE_MAGENTA,
+ IDS_FIREWORKS_CHARGE_ORANGE,
+ IDS_FIREWORKS_CHARGE_WHITE
+};
+
+void FireworksChargeItem::appendHoverText(CompoundTag *expTag, vector<HtmlString> *lines)
+{
+ // shape
+ byte type = expTag->getByte(FireworksItem::TAG_E_TYPE);
+ if (type >= FireworksItem::TYPE_MIN && type <= FireworksItem::TYPE_MAX)
+ {
+ lines->push_back(HtmlString(app.GetString(FIREWORKS_CHARGE_TYPE_NAME[type])));
+ }
+ else
+ {
+ lines->push_back(HtmlString(app.GetString(IDS_FIREWORKS_CHARGE_TYPE)));
+ }
+
+ // colors
+ intArray colorList = expTag->getIntArray(FireworksItem::TAG_E_COLORS);
+ if (colorList.length > 0)
+ {
+
+ bool first = true;
+ wstring output = L"";
+ for (unsigned int i = 0; i < colorList.length; ++i)
+ {
+ int c = colorList[i];
+ if (!first)
+ {
+ output += L",\n"; // 4J-PB - without the newline, they tend to go offscreen in split-screen or localised languages
+ }
+ first = false;
+
+ // find color name by lookup
+ bool found = false;
+ for (int dc = 0; dc < 16; dc++)
+ {
+ if (c == DyePowderItem::COLOR_RGB[dc])
+ {
+ found = true;
+ output += app.GetString(FIREWORKS_CHARGE_COLOUR_NAME[dc]);
+ break;
+ }
+ }
+ if (!found)
+ {
+ output += app.GetString(IDS_FIREWORKS_CHARGE_CUSTOM);
+ }
+ }
+ lines->push_back(output);
+ }
+
+ // has fade?
+ intArray fadeList = expTag->getIntArray(FireworksItem::TAG_E_FADECOLORS);
+ if (fadeList.length > 0)
+ {
+ bool first = true;
+ wstring output = wstring(app.GetString(IDS_FIREWORKS_CHARGE_FADE_TO)) + L" ";
+ for (unsigned int i = 0; i < fadeList.length; ++i)
+ {
+ int c = fadeList[i];
+ if (!first)
+ {
+ output += L",\n";// 4J-PB - without the newline, they tend to go offscreen in split-screen or localised languages
+ }
+ first = false;
+
+ // find color name by lookup
+ bool found = false;
+ for (int dc = 0; dc < 16; dc++)
+ {
+ if (c == DyePowderItem::COLOR_RGB[dc])
+ {
+ found = true;
+ output += app.GetString(FIREWORKS_CHARGE_COLOUR_NAME[dc]);
+ break;
+ }
+ }
+ if (!found)
+ {
+ output += app.GetString(IDS_FIREWORKS_CHARGE_CUSTOM);
+ }
+ }
+ lines->push_back(output);
+ }
+
+ // has trail
+ bool trail = expTag->getBoolean(FireworksItem::TAG_E_TRAIL);
+ if (trail)
+ {
+ lines->push_back(HtmlString(app.GetString(IDS_FIREWORKS_CHARGE_TRAIL)));
+ }
+
+ // has flicker
+ bool flicker = expTag->getBoolean(FireworksItem::TAG_E_FLICKER);
+ if (flicker)
+ {
+ lines->push_back(HtmlString(app.GetString(IDS_FIREWORKS_CHARGE_FLICKER)));
+ }
+}
+
+void FireworksChargeItem::registerIcons(IconRegister *iconRegister)
+{
+ Item::registerIcons(iconRegister);
+ overlay = iconRegister->registerIcon(getIconName() + L"_overlay");
+} \ No newline at end of file