aboutsummaryrefslogtreecommitdiff
path: root/Minecraft.World/DyePowderItem.cpp
diff options
context:
space:
mode:
authordaoge_cmd <3523206925@qq.com>2026-03-01 12:16:08 +0800
committerdaoge_cmd <3523206925@qq.com>2026-03-01 12:16:08 +0800
commitb691c43c44ff180d10e7d4a9afc83b98551ff586 (patch)
tree3e9849222cbc6ba49f2f1fc6e5fe7179632c7390 /Minecraft.World/DyePowderItem.cpp
parentdef8cb415354ac390b7e89052a50605285f1aca9 (diff)
Initial commit
Diffstat (limited to 'Minecraft.World/DyePowderItem.cpp')
-rw-r--r--Minecraft.World/DyePowderItem.cpp317
1 files changed, 317 insertions, 0 deletions
diff --git a/Minecraft.World/DyePowderItem.cpp b/Minecraft.World/DyePowderItem.cpp
new file mode 100644
index 00000000..a05b8354
--- /dev/null
+++ b/Minecraft.World/DyePowderItem.cpp
@@ -0,0 +1,317 @@
+using namespace std;
+
+#include "stdafx.h"
+#include "com.mojang.nbt.h"
+#include "net.minecraft.world.level.tile.h"
+#include "net.minecraft.world.phys.h"
+#include "net.minecraft.world.level.h"
+#include "net.minecraft.world.item.h"
+#include "net.minecraft.world.entity.item.h"
+#include "net.minecraft.world.entity.player.h"
+#include "net.minecraft.world.entity.global.h"
+#include "net.minecraft.world.entity.animal.h"
+#include "net.minecraft.world.h"
+#include "Material.h"
+#include "DyePowderItem.h"
+
+DyePowderItem::DyePowderItem(int id) : Item( id )
+{
+ setStackedByData(true);
+ setMaxDamage(0);
+ icons = NULL;
+}
+
+const unsigned int DyePowderItem::COLOR_DESCS[] =
+{
+ IDS_ITEM_DYE_POWDER_BLACK,
+ IDS_ITEM_DYE_POWDER_RED,
+ IDS_ITEM_DYE_POWDER_GREEN,
+ IDS_ITEM_DYE_POWDER_BROWN,
+ IDS_ITEM_DYE_POWDER_BLUE,
+ IDS_ITEM_DYE_POWDER_PURPLE,
+ IDS_ITEM_DYE_POWDER_CYAN,
+ IDS_ITEM_DYE_POWDER_SILVER,
+ IDS_ITEM_DYE_POWDER_GRAY,
+ IDS_ITEM_DYE_POWDER_PINK,
+ IDS_ITEM_DYE_POWDER_LIME,
+ IDS_ITEM_DYE_POWDER_YELLOW,
+ IDS_ITEM_DYE_POWDER_LIGHT_BLUE,
+ IDS_ITEM_DYE_POWDER_MAGENTA,
+ IDS_ITEM_DYE_POWDER_ORANGE,
+ IDS_ITEM_DYE_POWDER_WHITE
+};
+
+const unsigned int DyePowderItem::COLOR_USE_DESCS[] =
+{
+ IDS_DESC_DYE_BLACK,
+ IDS_DESC_DYE_RED,
+ IDS_DESC_DYE_GREEN,
+ IDS_DESC_DYE_BROWN,
+ IDS_DESC_DYE_BLUE,
+ IDS_DESC_DYE_PURPLE,
+ IDS_DESC_DYE_CYAN,
+ IDS_DESC_DYE_LIGHTGRAY,
+ IDS_DESC_DYE_GRAY,
+ IDS_DESC_DYE_PINK,
+ IDS_DESC_DYE_LIME,
+ IDS_DESC_DYE_YELLOW,
+ IDS_DESC_DYE_LIGHTBLUE,
+ IDS_DESC_DYE_MAGENTA,
+ IDS_DESC_DYE_ORANGE,
+ IDS_DESC_DYE_WHITE
+};
+
+const wstring DyePowderItem::COLOR_TEXTURES[] =
+{ L"dyePowder_black", L"dyePowder_red", L"dyePowder_green", L"dyePowder_brown", L"dyePowder_blue", L"dyePowder_purple", L"dyePowder_cyan", L"dyePowder_silver", L"dyePowder_gray", L"dyePowder_pink",
+L"dyePowder_lime", L"dyePowder_yellow", L"dyePowder_lightBlue", L"dyePowder_magenta", L"dyePowder_orange", L"dyePowder_white"};
+
+const int DyePowderItem::COLOR_RGB[] =
+{
+ 0x1e1b1b,
+ 0xb3312c,
+ 0x3b511a,
+ 0x51301a,
+ 0x253192,
+ 0x7b2fbe,
+ 0xababab,
+ 0x287697,
+ 0x434343,
+ 0xd88198,
+ 0x41cd34,
+ 0xdecf2a,
+ 0x6689d3,
+ 0xc354cd,
+ 0xeb8844,
+ 0xf0f0f0
+};
+
+const int DyePowderItem::BLACK = 0;
+const int DyePowderItem::RED = 1;
+const int DyePowderItem::GREEN = 2;
+const int DyePowderItem::BROWN = 3;
+const int DyePowderItem::BLUE = 4;
+const int DyePowderItem::PURPLE = 5;
+const int DyePowderItem::CYAN = 6;
+const int DyePowderItem::SILVER = 7;
+const int DyePowderItem::GRAY = 8;
+const int DyePowderItem::PINK = 9;
+const int DyePowderItem::LIME = 10;
+const int DyePowderItem::YELLOW = 11;
+const int DyePowderItem::LIGHT_BLUE = 12;
+const int DyePowderItem::MAGENTA = 13;
+const int DyePowderItem::ORANGE = 14;
+const int DyePowderItem::WHITE = 15;
+
+Icon *DyePowderItem::getIcon(int itemAuxValue)
+{
+ int colorValue = Mth::clamp(itemAuxValue, 0, 15);
+ return icons[colorValue];
+}
+
+unsigned int DyePowderItem::getDescriptionId(shared_ptr<ItemInstance> itemInstance)
+{
+ int colorValue = Mth::clamp(itemInstance->getAuxValue(), 0, 15);
+ return COLOR_DESCS[colorValue];
+}
+
+unsigned int DyePowderItem::getUseDescriptionId(shared_ptr<ItemInstance> itemInstance)
+{
+ return COLOR_USE_DESCS[itemInstance->getAuxValue()];
+}
+
+bool DyePowderItem::useOn(shared_ptr<ItemInstance> itemInstance, shared_ptr<Player> player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly)
+{
+ if (!player->mayBuild(x, y, z)) return false;
+
+ // 4J-PB - Adding a test only version to allow tooltips to be displayed
+ if (itemInstance->getAuxValue() == WHITE)
+ {
+ // bone meal is a fertilizer, so instantly grow trees and stuff
+
+ int tile = level->getTile(x, y, z);
+ if (tile == Tile::sapling_Id)
+ {
+ if(!bTestUseOnOnly)
+ {
+ if (!level->isClientSide)
+ {
+ ((Sapling *) Tile::sapling)->growTree(level, x, y, z, level->random);
+ itemInstance->count--;
+ }
+ }
+ return true;
+ }
+ else if (tile == Tile::mushroom1_Id || tile == Tile::mushroom2_Id)
+ {
+ if(!bTestUseOnOnly)
+ {
+ if (!level->isClientSide)
+ {
+ if (((Mushroom *) Tile::tiles[tile])->growTree(level, x, y, z, level->random))
+ {
+ itemInstance->count--;
+ }
+ }
+ }
+ return true;
+ }
+ else if (tile == Tile::melonStem_Id || tile == Tile::pumpkinStem_Id)
+ {
+ if (level->getData(x, y, z) == 7) return false;
+ if(!bTestUseOnOnly)
+ {
+ if (!level->isClientSide)
+ {
+ ((StemTile *) Tile::tiles[tile])->growCropsToMax(level, x, y, z);
+ itemInstance->count--;
+ }
+ }
+ return true;
+ }
+ else if (tile == Tile::carrots_Id || tile == Tile::potatoes_Id)
+ {
+ if (level->getData(x, y, z) == 7) return false;
+ if(!bTestUseOnOnly)
+ {
+ if (!level->isClientSide)
+ {
+ ((CropTile *) Tile::tiles[tile])->growCropsToMax(level, x, y, z);
+ itemInstance->count--;
+ }
+ }
+ return true;
+ }
+ else if (tile == Tile::crops_Id)
+ {
+ if (level->getData(x, y, z) == 7) return false;
+ if(!bTestUseOnOnly)
+ {
+ if (!level->isClientSide)
+ {
+ ((CropTile *) Tile::crops)->growCropsToMax(level, x, y, z);
+ itemInstance->count--;
+ }
+ }
+ return true;
+ }
+ else if (tile == Tile::cocoa_Id)
+ {
+ if(!bTestUseOnOnly)
+ {
+ if (!level->isClientSide)
+ {
+ level->setData(x, y, z, (2 << 2) | DirectionalTile::getDirection(level->getData(x, y, z)));
+ itemInstance->count--;
+ }
+ }
+ return true;
+ }
+ else if (tile == Tile::grass_Id)
+ {
+ if(!bTestUseOnOnly)
+ {
+ if (!level->isClientSide)
+ {
+ itemInstance->count--;
+
+ for (int j = 0; j < 128; j++)
+ {
+ int xx = x;
+ int yy = y + 1;
+ int zz = z;
+ for (int i = 0; i < j / 16; i++)
+ {
+ xx += random->nextInt(3) - 1;
+ yy += (random->nextInt(3) - 1) * random->nextInt(3) / 2;
+ zz += random->nextInt(3) - 1;
+ if (level->getTile(xx, yy - 1, zz) != Tile::grass_Id || level->isSolidBlockingTile(xx, yy, zz))
+ {
+ goto mainloop;
+ }
+ }
+
+ if (level->getTile(xx, yy, zz) == 0)
+ {
+ if (random->nextInt(10) != 0)
+ {
+ if (Tile::tallgrass->canSurvive(level, xx, yy, zz)) level->setTileAndData(xx, yy, zz, Tile::tallgrass_Id, TallGrass::TALL_GRASS);
+ }
+ else if (random->nextInt(3) != 0)
+ {
+ if (Tile::flower->canSurvive(level, xx, yy, zz)) level->setTile(xx, yy, zz, Tile::flower_Id);
+ }
+ else
+ {
+ if (Tile::rose->canSurvive(level, xx, yy, zz)) level->setTile(xx, yy, zz, Tile::rose_Id);
+ }
+ }
+
+ // 4J - Stops infinite loops.
+mainloop: continue;
+ }
+ }
+ }
+
+ return true;
+ }
+ }
+ else if (itemInstance->getAuxValue() == BROWN)
+ {
+ // plant cocoa
+
+ int tile = level->getTile(x, y, z);
+ int data = level->getData(x, y, z);
+
+ if (tile == Tile::treeTrunk_Id && TreeTile::getWoodType(data) == TreeTile::JUNGLE_TRUNK)
+ {
+ if (face == 0) return false;
+ if (face == 1) return false;
+ if (face == 2) z--;
+ if (face == 3) z++;
+ if (face == 4) x--;
+ if (face == 5) x++;
+
+ if(!bTestUseOnOnly)
+ {
+ if (level->isEmptyTile(x, y, z))
+ {
+ int cocoaData = Tile::tiles[Tile::cocoa_Id]->getPlacedOnFaceDataValue(level, x, y, z, face, clickX, clickY, clickZ, 0);
+ level->setTileAndData(x, y, z, Tile::cocoa_Id, cocoaData);
+ if (!player->abilities.instabuild)
+ {
+ itemInstance->count--;
+ }
+ }
+ }
+ return true;
+ }
+ }
+ return false;
+}
+
+bool DyePowderItem::interactEnemy(shared_ptr<ItemInstance> itemInstance, shared_ptr<Mob> mob)
+{
+ if (dynamic_pointer_cast<Sheep>( mob ) != NULL)
+ {
+ shared_ptr<Sheep> sheep = dynamic_pointer_cast<Sheep>(mob);
+ // convert to tile-based color value (0 is white instead of black)
+ int newColor = ClothTile::getTileDataForItemAuxValue(itemInstance->getAuxValue());
+ if (!sheep->isSheared() && sheep->getColor() != newColor)
+ {
+ sheep->setColor(newColor);
+ itemInstance->count--;
+ }
+ return true;
+ }
+ return false;
+}
+
+void DyePowderItem::registerIcons(IconRegister *iconRegister)
+{
+ icons = new Icon *[DYE_POWDER_ITEM_TEXTURE_COUNT];
+
+ for (int i = 0; i < DYE_POWDER_ITEM_TEXTURE_COUNT; i++)
+ {
+ icons[i] = iconRegister->registerIcon(COLOR_TEXTURES[i]);
+ }
+} \ No newline at end of file