From 451891909a98818d636b7ac732b04dee6be23f86 Mon Sep 17 00:00:00 2001 From: piebot <164795032+piebotc@users.noreply.github.com> Date: Thu, 19 Mar 2026 06:57:24 +0300 Subject: [PATCH] Add Fish Types --- .../Common/UI/IUIScene_CreativeMenu.cpp | 6 + Minecraft.Client/PreStitchedTextureMap.cpp | 7 +- Minecraft.World/FishFoodItem.cpp | 110 ++++++++++++++++++ Minecraft.World/FishFoodItem.h | 44 +++++++ Minecraft.World/FurnaceRecipes.cpp | 2 + Minecraft.World/Item.cpp | 4 +- Minecraft.World/Minecraft.World.vcxproj | 2 + .../Minecraft.World.vcxproj.filters | 2 + Minecraft.World/net.minecraft.world.item.h | 4 +- 9 files changed, 175 insertions(+), 6 deletions(-) create mode 100644 Minecraft.World/FishFoodItem.cpp create mode 100644 Minecraft.World/FishFoodItem.h diff --git a/Minecraft.Client/Common/UI/IUIScene_CreativeMenu.cpp b/Minecraft.Client/Common/UI/IUIScene_CreativeMenu.cpp index 42f89698..e88a60c4 100644 --- a/Minecraft.Client/Common/UI/IUIScene_CreativeMenu.cpp +++ b/Minecraft.Client/Common/UI/IUIScene_CreativeMenu.cpp @@ -474,6 +474,12 @@ void IUIScene_CreativeMenu::staticCtor() ITEM(Item::cookie_Id) ITEM(Item::fish_cooked_Id) ITEM(Item::fish_raw_Id) + + ITEM_AUX(Item::fish_cooked_Id, 1) + ITEM_AUX(Item::fish_raw_Id, 1) + ITEM_AUX(Item::fish_raw_Id, 2) + ITEM_AUX(Item::fish_raw_Id, 3) + ITEM(Item::porkChop_cooked_Id) ITEM(Item::porkChop_raw_Id) ITEM(Item::beef_cooked_Id) diff --git a/Minecraft.Client/PreStitchedTextureMap.cpp b/Minecraft.Client/PreStitchedTextureMap.cpp index 81ce5c0d..8e68e206 100644 --- a/Minecraft.Client/PreStitchedTextureMap.cpp +++ b/Minecraft.Client/PreStitchedTextureMap.cpp @@ -510,7 +510,7 @@ void PreStitchedTextureMap::loadUVs() ADD_ICON(10, 3, L"name_tag") ADD_ICON(10, 4, L"lead") ADD_ICON(10, 5, L"netherbrick") - //ADD_ICON(10, 6, L"unused") + ADD_ICON(10, 6, L"clownfish") ADD_ICON(10, 7, L"minecart_furnace") ADD_ICON(10, 8, L"charcoal") ADD_ICON(10, 9, L"monsterPlacer_overlay") @@ -524,7 +524,7 @@ void PreStitchedTextureMap::loadUVs() ADD_ICON(11, 0, L"leggingsCloth_overlay") ADD_ICON(11, 4, L"muttonRaw") ADD_ICON(11, 5, L"rabbitRaw") - //ADD_ICON(11, 6, L"unused") + ADD_ICON(11, 6, L"pufferfish") ADD_ICON(11, 7, L"minecart_hopper") ADD_ICON(11, 8, L"hopper") ADD_ICON(11, 9, L"nether_star") @@ -541,7 +541,7 @@ void PreStitchedTextureMap::loadUVs() //ADD_ICON(12, 3, L"unused") ADD_ICON(12, 4, L"muttonCooked") ADD_ICON(12, 5, L"rabbitCooked") - //ADD_ICON(12, 6, L"unused") + ADD_ICON(12, 6, L"salmonRaw") ADD_ICON(12, 7, L"minecart_tnt") ADD_ICON(12, 8, L"armorStand") ADD_ICON(12, 9, L"fireworks") @@ -557,6 +557,7 @@ void PreStitchedTextureMap::loadUVs() ADD_ICON(13, 2, L"doorDark") ADD_ICON(13, 3, L"doorJungle") ADD_ICON(13, 4, L"doorSpruce") + ADD_ICON(13, 6, L"salmonCooked") ADD_ICON(14, 0, L"skull_skeleton") diff --git a/Minecraft.World/FishFoodItem.cpp b/Minecraft.World/FishFoodItem.cpp new file mode 100644 index 00000000..6e92117e --- /dev/null +++ b/Minecraft.World/FishFoodItem.cpp @@ -0,0 +1,110 @@ +#include "stdafx.h" +#include "net.minecraft.world.level.h" +#include "net.minecraft.world.entity.player.h" +#include "net.minecraft.world.level.tile.h" +#include "net.minecraft.world.level.tile.entity.h" +#include "net.minecraft.world.effect.h" +#include "net.minecraft.h" +#include "net.minecraft.world.h" +#include "FishFoodItem.h" + +const unsigned int FishFoodItem::NAMES[FISH_COUNT] = { IDS_ITEM_SKULL_SKELETON, IDS_ITEM_SKULL_SKELETON, IDS_ITEM_SKULL_SKELETON, IDS_ITEM_SKULL_SKELETON }; +const unsigned int FishFoodItem::COOKED_NAMES[FISH_COUNT] = { IDS_ITEM_SKULL_CHARACTER, IDS_ITEM_SKULL_CHARACTER, IDS_ITEM_SKULL_CHARACTER, IDS_ITEM_SKULL_CHARACTER }; +// making cod temporarily fish +const FishType FISH_TYPES[] = { + { 0, L"fish", 2, 0.1f, 5, 0.6f, true }, + { 1, L"salmon", 2, 0.1f, 6, 0.8f, true }, + { 2, L"clownfish", 1, 0.1f, 0, 0.0f, false }, + { 3, L"pufferfish", 1, 0.1f, 0, 0.0f, false }, +}; + +FishFoodItem::FishFoodItem(int id, bool cooked) : FoodItem(id, 0, 0, true) +{ + this->cooked = cooked; + auxValue = 0; +} + +void FishFoodItem::addEatEffect(shared_ptr instance, Level* level, shared_ptr player) +{ + if (!level->isClientSide) + { + if (FISH_TYPES[auxValue].name == L"pufferfish") { + player->addEffect(new MobEffectInstance(MobEffect::poison->id, 60 * SharedConstants::TICKS_PER_SECOND, 3)); + player->addEffect(new MobEffectInstance(MobEffect::hunger->id, 15 * SharedConstants::TICKS_PER_SECOND, 2)); + player->addEffect(new MobEffectInstance(MobEffect::confusion->id, 15 * SharedConstants::TICKS_PER_SECOND, 1)); + } + } + FoodItem::addEatEffect(instance, level, player); +} + +shared_ptr FishFoodItem::use(shared_ptr instance, Level* level, shared_ptr player) +{ + // really really REALLY janky way of doing this + auxValue = instance->getAuxValue(); + return FoodItem::use(instance, level, player); +} + +float FishFoodItem::getSaturationModifier() +{ + return this->cooked && FISH_TYPES[auxValue].cookable ? FISH_TYPES[auxValue].cookedSaturationModifier : FISH_TYPES[auxValue].uncookedSaturationModifier; +} + +int FishFoodItem::getNutrition() +{ + return this->cooked && FISH_TYPES[auxValue].cookable ? FISH_TYPES[auxValue].cookedHealAmount : FISH_TYPES[auxValue].uncookedHealAmount; +} + +Icon* FishFoodItem::getIcon(int itemAuxValue) +{ + if (itemAuxValue < 0 || itemAuxValue >= FISH_COUNT) + { + itemAuxValue = 0; + } + + if (cooked && FISH_TYPES[itemAuxValue].cookable) { + return icons_cooked[itemAuxValue]; + } + return icons_raw[itemAuxValue]; +} + +unsigned int FishFoodItem::getDescriptionId(int iData) +{ + if (iData < 0 || iData >= FISH_COUNT) + { + iData = 0; + } + + if (cooked) { + return COOKED_NAMES[iData]; + } + return NAMES[iData]; +} + +unsigned int FishFoodItem::getDescriptionId(shared_ptr instance) +{ + auxValue = instance->getAuxValue(); + if (auxValue < 0 || auxValue >= FISH_COUNT) + { + auxValue = 0; + } + + if (cooked) { + return COOKED_NAMES[auxValue]; + } + + return NAMES[auxValue]; +} + +void FishFoodItem::registerIcons(IconRegister* iconRegister) +{ + for (int i = 0; i < FISH_COUNT; i++) + { + if (FISH_TYPES[i].cookable) { + icons_raw[i] = iconRegister->registerIcon(FISH_TYPES[i].name + L"Raw"); + icons_cooked[i] = iconRegister->registerIcon(FISH_TYPES[i].name + L"Cooked"); + } + else { + icons_raw[i] = iconRegister->registerIcon(FISH_TYPES[i].name); + } + } +} \ No newline at end of file diff --git a/Minecraft.World/FishFoodItem.h b/Minecraft.World/FishFoodItem.h new file mode 100644 index 00000000..36587871 --- /dev/null +++ b/Minecraft.World/FishFoodItem.h @@ -0,0 +1,44 @@ +#pragma once +#pragma once + +#include "FoodItem.h" + +struct FishType { + int id; + std::wstring name; + int uncookedHealAmount; + float uncookedSaturationModifier; + int cookedHealAmount = 0; + float cookedSaturationModifier = 0.0f; + bool cookable = false; +}; + +static const int FISH_COUNT = 4; + +extern const FishType FISH_TYPES[FISH_COUNT]; + +class FishFoodItem : public FoodItem +{ +public: + static const unsigned int NAMES[FISH_COUNT]; + static const unsigned int COOKED_NAMES[FISH_COUNT]; + int auxValue; + bool cooked; +private: + Icon* icons_raw[FISH_COUNT]; + Icon* icons_cooked[FISH_COUNT]; +protected: + virtual void addEatEffect(shared_ptr instance, Level* level, shared_ptr player); +public: + FishFoodItem(int id, bool cooked); + + virtual shared_ptr use(shared_ptr instance, Level* level, shared_ptr player); + Icon* getIcon(int itemAuxValue); + + int getNutrition(); + float getSaturationModifier(); + + virtual unsigned int getDescriptionId(int iData = -1); + unsigned int getDescriptionId(shared_ptr instance); + void registerIcons(IconRegister* iconRegister); +}; \ No newline at end of file diff --git a/Minecraft.World/FurnaceRecipes.cpp b/Minecraft.World/FurnaceRecipes.cpp index 3eacf9f1..6db886d2 100644 --- a/Minecraft.World/FurnaceRecipes.cpp +++ b/Minecraft.World/FurnaceRecipes.cpp @@ -27,6 +27,8 @@ FurnaceRecipes::FurnaceRecipes() addFurnaceRecipy(Item::mutton_raw_Id, new ItemInstance(Item::mutton_cooked), .35f); addFurnaceRecipy(Item::chicken_raw_Id, new ItemInstance(Item::chicken_cooked), .35f); addFurnaceRecipy(Item::fish_raw_Id, new ItemInstance(Item::fish_cooked), .35f); + addFurnaceRecipy(new ItemInstance(Item::fish_raw, 1, 1), new ItemInstance(Item::fish_cooked, 1, 1), .35f); // salmon + addFurnaceRecipy(Tile::cobblestone_Id, new ItemInstance(Tile::stone), .1f); addFurnaceRecipy(Item::clay_Id, new ItemInstance(Item::brick), .3f); addFurnaceRecipy(Tile::clay_Id, new ItemInstance(Tile::clayHardened), .35f); diff --git a/Minecraft.World/Item.cpp b/Minecraft.World/Item.cpp index e792111c..7c7f8609 100644 --- a/Minecraft.World/Item.cpp +++ b/Minecraft.World/Item.cpp @@ -396,8 +396,8 @@ void Item::staticCtor() Item::egg = ( new EggItem(88) ) ->setIconName(L"egg")->setDescriptionId(IDS_ITEM_EGG)->setUseDescriptionId(IDS_DESC_EGG); Item::fishingRod = static_cast((new FishingRodItem(90))->setBaseItemTypeAndMaterial(eBaseItemType_rod, eMaterial_wood)->setIconName(L"fishingRod")->setDescriptionId(IDS_ITEM_FISHING_ROD)->setUseDescriptionId(IDS_DESC_FISHINGROD)); Item::yellowDust = ( new Item(92) ) ->setIconName(L"yellowDust")->setDescriptionId(IDS_ITEM_YELLOW_DUST)->setUseDescriptionId(IDS_DESC_YELLOW_DUST)->setPotionBrewingFormula(PotionBrewing::MOD_GLOWSTONE); - Item::fish_raw = ( new FoodItem(93, 2, FoodConstants::FOOD_SATURATION_LOW, false) ) ->setIconName(L"fishRaw")->setDescriptionId(IDS_ITEM_FISH_RAW)->setUseDescriptionId(IDS_DESC_FISH_RAW); - Item::fish_cooked = ( new FoodItem(94, 5, FoodConstants::FOOD_SATURATION_NORMAL, false) ) ->setIconName(L"fishCooked")->setDescriptionId(IDS_ITEM_FISH_COOKED)->setUseDescriptionId(IDS_DESC_FISH_COOKED); + Item::fish_raw = ( new FishFoodItem(93, false) ) ->setIconName(L"fishRaw")->setDescriptionId(IDS_ITEM_FISH_RAW)->setUseDescriptionId(IDS_DESC_FISH_RAW); + Item::fish_cooked = (new FishFoodItem(94, true)) ->setIconName(L"fishCooked")->setDescriptionId(IDS_ITEM_FISH_COOKED)->setUseDescriptionId(IDS_DESC_FISH_COOKED); Item::dye_powder = ( new DyePowderItem(95) ) ->setBaseItemTypeAndMaterial(eBaseItemType_dyepowder, eMaterial_dye)->setIconName(L"dyePowder")->setDescriptionId(IDS_ITEM_DYE_POWDER)->setUseDescriptionId(-1); diff --git a/Minecraft.World/Minecraft.World.vcxproj b/Minecraft.World/Minecraft.World.vcxproj index 364aedef..96231905 100644 --- a/Minecraft.World/Minecraft.World.vcxproj +++ b/Minecraft.World/Minecraft.World.vcxproj @@ -2479,6 +2479,7 @@ + @@ -3564,6 +3565,7 @@ + diff --git a/Minecraft.World/Minecraft.World.vcxproj.filters b/Minecraft.World/Minecraft.World.vcxproj.filters index 26265da3..61c4a3be 100644 --- a/Minecraft.World/Minecraft.World.vcxproj.filters +++ b/Minecraft.World/Minecraft.World.vcxproj.filters @@ -827,6 +827,7 @@ + @@ -1823,6 +1824,7 @@ + diff --git a/Minecraft.World/net.minecraft.world.item.h b/Minecraft.World/net.minecraft.world.item.h index 6cd9e9c1..3133b9c3 100644 --- a/Minecraft.World/net.minecraft.world.item.h +++ b/Minecraft.World/net.minecraft.world.item.h @@ -85,4 +85,6 @@ // 4J Added #include "ClockItem.h" #include "CompassItem.h" -#include "HtmlString.h" \ No newline at end of file +#include "HtmlString.h" + +#include "FishFoodItem.h" \ No newline at end of file