Add Fish Types

This commit is contained in:
piebot 2026-03-19 06:57:24 +03:00
parent 7953241731
commit 451891909a
9 changed files with 175 additions and 6 deletions

View file

@ -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)

View file

@ -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")

View file

@ -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<ItemInstance> instance, Level* level, shared_ptr<Player> 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<ItemInstance> FishFoodItem::use(shared_ptr<ItemInstance> instance, Level* level, shared_ptr<Player> 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<ItemInstance> 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);
}
}
}

View file

@ -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<ItemInstance> instance, Level* level, shared_ptr<Player> player);
public:
FishFoodItem(int id, bool cooked);
virtual shared_ptr<ItemInstance> use(shared_ptr<ItemInstance> instance, Level* level, shared_ptr<Player> player);
Icon* getIcon(int itemAuxValue);
int getNutrition();
float getSaturationModifier();
virtual unsigned int getDescriptionId(int iData = -1);
unsigned int getDescriptionId(shared_ptr<ItemInstance> instance);
void registerIcons(IconRegister* iconRegister);
};

View file

@ -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);

View file

@ -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<FishingRodItem *>((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);

View file

@ -2479,6 +2479,7 @@
<ClInclude Include="FireworksMenu.h" />
<ClInclude Include="FireworksRecipe.h" />
<ClInclude Include="FireworksRocketEntity.h" />
<ClInclude Include="FishFoodItem.h" />
<ClInclude Include="FlatGeneratorInfo.h" />
<ClInclude Include="FlatLayerInfo.h" />
<ClInclude Include="GameRules.h" />
@ -3564,6 +3565,7 @@
<ClCompile Include="FireworksMenu.cpp" />
<ClCompile Include="FireworksRecipe.cpp" />
<ClCompile Include="FireworksRocketEntity.cpp" />
<ClCompile Include="FishFoodItem.cpp" />
<ClCompile Include="FlatGeneratorInfo.cpp" />
<ClCompile Include="FlatLayerInfo.cpp" />
<ClCompile Include="GameRules.cpp" />

View file

@ -827,6 +827,7 @@
<ClCompile Include="SavannaBiome.cpp" />
<ClCompile Include="RoofedForestBiome.cpp" />
<ClCompile Include="PrismarineTile.cpp" />
<ClCompile Include="FishFoodItem.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="AABB.h" />
@ -1823,6 +1824,7 @@
<ClInclude Include="SavannaBiome.h" />
<ClInclude Include="RoofedForestBiome.h" />
<ClInclude Include="PrismarineTile.h" />
<ClInclude Include="FishFoodItem.h" />
</ItemGroup>
<ItemGroup>
<None Include="..\Minecraft.Client\Xbox\res\audio\Minecraft.xgs" />

View file

@ -85,4 +85,6 @@
// 4J Added
#include "ClockItem.h"
#include "CompassItem.h"
#include "HtmlString.h"
#include "HtmlString.h"
#include "FishFoodItem.h"