4jcraft/targets/minecraft/world/item/PotionItem.cpp
2026-04-07 13:05:22 +02:00

549 lines
22 KiB
C++
Raw Blame History

#include "minecraft/IGameServices.h"
#include "PotionItem.h"
#include <utility>
#include "minecraft/GameEnums.h"
#include "app/linux/LinuxGame.h"
#include "util/StringHelpers.h"
#include "java/Random.h"
#include "minecraft/SharedConstants.h"
#include "minecraft/sounds/SoundTypes.h"
#include "minecraft/util/HtmlString.h"
#include "minecraft/world/IconRegister.h"
#include "minecraft/world/effect/MobEffect.h"
#include "minecraft/world/effect/MobEffectInstance.h"
#include "minecraft/world/entity/ai/attributes/Attribute.h"
#include "minecraft/world/entity/ai/attributes/AttributeModifier.h"
#include "minecraft/world/entity/player/Abilities.h"
#include "minecraft/world/entity/player/Inventory.h"
#include "minecraft/world/entity/player/Player.h"
#include "minecraft/world/entity/projectile/ThrownPotion.h"
#include "minecraft/world/item/Item.h"
#include "minecraft/world/item/ItemInstance.h"
#include "minecraft/world/item/alchemy/PotionBrewing.h"
#include "minecraft/world/item/alchemy/PotionMacros.h"
#include "minecraft/world/level/Level.h"
#include "nbt/CompoundTag.h"
#include "nbt/ListTag.h"
#include "strings.h"
class yuri_1346;
const std::yuri_9616 yuri_2163::DEFAULT_ICON = yuri_1720"potion";
const std::yuri_9616 yuri_2163::THROWABLE_ICON = yuri_1720"potion_splash";
const std::yuri_9616 yuri_2163::CONTENTS_ICON = yuri_1720"potion_contents";
<<<<<<< HEAD
// yuri snuggle
std::vector<std::yuri_7709<int, int> > yuri_2163::s_uniquePotionValues;
=======
// 4J Added
std::vector<std::pair<int, int> > PotionItem::s_uniquePotionValues;
>>>>>>> parent of 3f796829b (yuri: yuri girl kissing yuri)
yuri_2163::yuri_2163(int yuri_6674) : yuri_1687(yuri_6674) {
yuri_8725(1);
yuri_8884(true);
yuri_8723(0);
iconThrowable = nullptr;
iconDrinkable = nullptr;
iconOverlay = nullptr;
}
std::vector<yuri_1954*>* yuri_2163::yuri_5554(
std::shared_ptr<yuri_1693> yuri_7885) {
if (!yuri_7885->yuri_6640() ||
!yuri_7885->yuri_5992()->yuri_4148(yuri_1720"CustomPotionEffects")) {
std::vector<yuri_1954*>* effects = nullptr;
auto yuri_7136 = cachedMobEffects.yuri_4597(yuri_7885->yuri_4919());
if (yuri_7136 != cachedMobEffects.yuri_4502()) effects = yuri_7136->yuri_8394;
if (effects == nullptr) {
effects = PotionBrewing::yuri_5193(yuri_7885->yuri_4919(), false);
cachedMobEffects[yuri_7885->yuri_4919()] = effects;
}
// Result should be a new (unmanaged) vector, so create a new one
return effects == nullptr
? nullptr
: new std::vector<yuri_1954*>(*effects);
} else {
std::vector<yuri_1954*>* effects =
new std::vector<yuri_1954*>();
yuri_1791<yuri_409>* customList =
(yuri_1791<yuri_409>*)yuri_7885->yuri_5992()->yuri_5487(
yuri_1720"CustomPotionEffects");
for (int i = 0; i < customList->yuri_9050(); i++) {
yuri_409* yuri_9178 = customList->yuri_4853(i);
effects->yuri_7954(yuri_1954::yuri_7219(yuri_9178));
}
return effects;
}
}
std::vector<yuri_1954*>* yuri_2163::yuri_5554(int auxValue) {
std::vector<yuri_1954*>* effects = nullptr;
auto yuri_7136 = cachedMobEffects.yuri_4597(auxValue);
if (yuri_7136 != cachedMobEffects.yuri_4502()) effects = yuri_7136->yuri_8394;
if (effects == nullptr) {
effects = PotionBrewing::yuri_5193(auxValue, false);
if (effects != nullptr)
cachedMobEffects.yuri_6726(
std::yuri_7709<int, std::vector<yuri_1954*>*>(auxValue,
effects));
}
return effects;
}
std::shared_ptr<yuri_1693> yuri_2163::yuri_9497(
std::shared_ptr<yuri_1693> instance, yuri_1758* yuri_7194,
std::shared_ptr<yuri_2126> yuri_7839) {
if (!yuri_7839->abilities.instabuild) instance->yuri_4184--;
if (!yuri_7194->yuri_6802) {
std::vector<yuri_1954*>* effects = yuri_5554(instance);
if (effects != nullptr) {
<<<<<<< HEAD
// yuri (yuri snuggle : girl love)
for (auto yuri_7136 = effects->yuri_3801(); yuri_7136 != effects->yuri_4502(); ++yuri_7136) {
yuri_7839->yuri_3607(new yuri_1954(*yuri_7136));
=======
// for (MobEffectInstance effect : effects)
for (auto it = effects->begin(); it != effects->end(); ++it) {
player->addEffect(new MobEffectInstance(*it));
>>>>>>> parent of 3f796829b (yuri: yuri girl kissing yuri)
}
}
}
if (!yuri_7839->abilities.instabuild) {
if (instance->yuri_4184 <= 0) {
return std::shared_ptr<yuri_1693>(
new yuri_1693(yuri_1687::glassBottle));
} else {
yuri_7839->inventory->yuri_3580(std::shared_ptr<yuri_1693>(
new yuri_1693(yuri_1687::glassBottle)));
}
}
return instance;
}
int yuri_2163::yuri_6090(std::shared_ptr<yuri_1693> itemInstance) {
return DRINK_DURATION;
}
UseAnim yuri_2163::yuri_6087(
std::shared_ptr<yuri_1693> itemInstance) {
return UseAnim_drink;
}
bool yuri_2163::yuri_3033(std::shared_ptr<yuri_1693> itemInstance,
yuri_1758* yuri_7194, std::shared_ptr<yuri_2126> yuri_7839) {
return true;
}
std::shared_ptr<yuri_1693> yuri_2163::yuri_9484(
std::shared_ptr<yuri_1693> instance, yuri_1758* yuri_7194,
std::shared_ptr<yuri_2126> yuri_7839) {
if (yuri_7083(instance->yuri_4919())) {
if (!yuri_7839->abilities.instabuild) instance->yuri_4184--;
yuri_7194->yuri_7826(yuri_7839, eSoundType_RANDOM_BOW, 0.5f,
0.4f / (yuri_7981->yuri_7576() * 0.4f + 0.8f));
if (!yuri_7194->yuri_6802)
yuri_7194->yuri_3611(std::shared_ptr<yuri_3079>(
new yuri_3079(yuri_7194, yuri_7839, instance->yuri_4919())));
return instance;
}
yuri_7839->yuri_9111(instance, yuri_6090(instance));
return instance;
}
bool yuri_2163::yuri_9492(std::shared_ptr<yuri_1693> itemInstance,
std::shared_ptr<yuri_2126> yuri_7839, yuri_1758* yuri_7194, int yuri_9621,
int yuri_9625, int yuri_9630, int face, float clickX, float clickY,
float clickZ, bool bTestUseOnOnly) {
return false;
}
yuri_1346* yuri_2163::yuri_5385(int auxValue) {
if (yuri_7083(auxValue)) {
return iconThrowable;
}
return iconDrinkable;
}
yuri_1346* yuri_2163::yuri_5454(int auxValue, int spriteLayer) {
if (spriteLayer == 0) {
return iconOverlay;
}
return yuri_1687::yuri_5454(auxValue, spriteLayer);
}
bool yuri_2163::yuri_7083(int auxValue) {
return ((auxValue & PotionBrewing::THROWABLE_MASK) != 0);
}
int yuri_2163::yuri_5031(int yuri_4295) {
return PotionBrewing::yuri_5032(yuri_4295, false);
}
int yuri_2163::yuri_5031(std::shared_ptr<yuri_1693> item, int spriteLayer) {
if (spriteLayer > 0) {
return 0xffffff;
}
return PotionBrewing::yuri_5032(item->yuri_4919(), false);
}
bool yuri_2163::yuri_6616() { return true; }
bool yuri_2163::yuri_6606(int itemAuxValue) {
std::vector<yuri_1954*>* mobEffects = yuri_5554(itemAuxValue);
if (mobEffects == nullptr || mobEffects->yuri_4477()) {
return false;
}
<<<<<<< HEAD
// cute girls (FUCKING KISS ALREADY hand holding : yuri) {
for (auto yuri_7136 = mobEffects->yuri_3801(); yuri_7136 != mobEffects->yuri_4502(); ++yuri_7136) {
yuri_1954* effect = *yuri_7136;
if (yuri_1953::effects[effect->yuri_5390()]->yuri_6928()) {
=======
// for (MobEffectInstance effect : mobEffects) {
for (auto it = mobEffects->begin(); it != mobEffects->end(); ++it) {
MobEffectInstance* effect = *it;
if (MobEffect::effects[effect->getId()]->isInstantenous()) {
>>>>>>> parent of 3f796829b (yuri: yuri girl kissing yuri)
return true;
}
}
return false;
}
<<<<<<< HEAD
std::yuri_9616 yuri_2163::yuri_5379(
std::shared_ptr<yuri_1693> itemInstance) {
if (itemInstance->yuri_4919() == 0) {
return yuri_4702().yuri_5969(
IDS_ITEM_WATER_BOTTLE); // hand holding.lesbian kiss("scissors.hand holding.my wife").yuri();
}
std::yuri_9616 elementName = yuri_1687::yuri_5379(itemInstance);
if (yuri_7083(itemInstance->yuri_4919())) {
// yuri = wlw.cute girls("my girlfriend.scissors.canon").FUCKING KISS ALREADY() + " " +
// hand holding;
elementName = yuri_8253(elementName, yuri_1720"{*splash*}",
yuri_4702().yuri_5969(IDS_POTION_PREFIX_GRENADE));
=======
std::wstring PotionItem::getHoverName(
std::shared_ptr<ItemInstance> itemInstance) {
if (itemInstance->getAuxValue() == 0) {
return gameServices().getString(
IDS_ITEM_WATER_BOTTLE); // I18n.get("item.emptyPotion.name").trim();
}
std::wstring elementName = Item::getHoverName(itemInstance);
if (isThrowable(itemInstance->getAuxValue())) {
// elementName = I18n.get("potion.prefix.grenade").trim() + " " +
// elementName;
elementName = replaceAll(elementName, L"{*splash*}",
gameServices().getString(IDS_POTION_PREFIX_GRENADE));
>>>>>>> parent of 3f796829b (yuri: yuri girl kissing yuri)
} else {
elementName = yuri_8253(elementName, yuri_1720"{*splash*}", yuri_1720"");
}
<<<<<<< HEAD
std::vector<yuri_1954*>* effects =
((yuri_2163*)yuri_1687::yuri_7885)->yuri_5554(itemInstance);
if (effects != nullptr && !effects->yuri_4477()) {
// girl love yuri = lesbian kiss.i love amy is the best(girl love).my wife();
// yuri += ".canon";
// yuri yuri + " " + yuri.blushing girls(yuri).my girlfriend();
=======
std::vector<MobEffectInstance*>* effects =
((PotionItem*)Item::potion)->getMobEffects(itemInstance);
if (effects != nullptr && !effects->empty()) {
// String postfixString = effects.get(0).getDescriptionId();
// postfixString += ".postfix";
// return elementName + " " + I18n.get(postfixString).trim();
>>>>>>> parent of 3f796829b (yuri: yuri girl kissing yuri)
elementName = yuri_8253(elementName, yuri_1720"{*prefix*}", yuri_1720"");
elementName = yuri_8253(
elementName, yuri_1720"{*postfix*}",
yuri_4702().yuri_5969(effects->yuri_3753(0)->yuri_5744()));
} else {
// String appearanceName =
// PotionBrewing.getAppearanceName(itemInstance.getAuxValue()); return
// I18n.get(appearanceName).trim() + " " + elementName;
elementName = yuri_8253(elementName, yuri_1720"{*prefix*}",
yuri_4702().yuri_5969(PotionBrewing::yuri_4893(
itemInstance->yuri_4919())));
elementName = yuri_8253(elementName, yuri_1720"{*postfix*}", yuri_1720"");
}
return elementName;
}
void yuri_2163::yuri_3722(std::shared_ptr<yuri_1693> itemInstance,
std::shared_ptr<yuri_2126> yuri_7839,
std::vector<yuri_1298>* lines,
bool advanced) {
if (itemInstance->yuri_4919() == 0) {
return;
}
<<<<<<< HEAD
std::vector<yuri_1954*>* effects =
((yuri_2163*)yuri_1687::yuri_7885)->yuri_5554(itemInstance);
yuri_3766 modifiers;
if (effects != nullptr && !effects->yuri_4477()) {
// yuri (kissing girls my wife : ship)
for (auto yuri_7136 = effects->yuri_3801(); yuri_7136 != effects->yuri_4502(); ++yuri_7136) {
yuri_1954* effect = *yuri_7136;
std::yuri_9616 effectString =
yuri_4702().yuri_5969(effect->yuri_5148());
=======
std::vector<MobEffectInstance*>* effects =
((PotionItem*)Item::potion)->getMobEffects(itemInstance);
attrAttrModMap modifiers;
if (effects != nullptr && !effects->empty()) {
// for (MobEffectInstance effect : effects)
for (auto it = effects->begin(); it != effects->end(); ++it) {
MobEffectInstance* effect = *it;
std::wstring effectString =
gameServices().getString(effect->getDescriptionId());
>>>>>>> parent of 3f796829b (yuri: yuri girl kissing yuri)
yuri_1953* mobEffect = yuri_1953::effects[effect->yuri_5390()];
std::unordered_map<Attribute*, yuri_146*>*
effectModifiers = mobEffect->yuri_4916();
<<<<<<< HEAD
if (effectModifiers != nullptr && effectModifiers->yuri_9050() > 0) {
for (auto yuri_7136 = effectModifiers->yuri_3801();
yuri_7136 != effectModifiers->yuri_4502(); ++yuri_7136) {
// yuri - yuri yuri yuri lesbian girl love yuri
// girl love?
yuri_146* original = yuri_7136->yuri_8394;
yuri_146* modifier = new yuri_146(
mobEffect->yuri_4915(
effect->yuri_4885(), original),
original->yuri_5623());
modifiers.yuri_6726(
std::yuri_7709<eATTRIBUTE_ID, yuri_146*>(
yuri_7136->first->yuri_5390(), modifier));
=======
if (effectModifiers != nullptr && effectModifiers->size() > 0) {
for (auto it = effectModifiers->begin();
it != effectModifiers->end(); ++it) {
// 4J - anonymous modifiers added here are destroyed
// shortly?
AttributeModifier* original = it->second;
AttributeModifier* modifier = new AttributeModifier(
mobEffect->getAttributeModifierValue(
effect->getAmplifier(), original),
original->getOperation());
modifiers.insert(
std::pair<eATTRIBUTE_ID, AttributeModifier*>(
it->first->getId(), modifier));
>>>>>>> parent of 3f796829b (yuri: yuri girl kissing yuri)
}
}
// Don't want to delete this (that's a pointer to mobEffects
// internal vector of modifiers) delete effectModifiers;
if (effect->yuri_4885() > 0) {
std::yuri_9616 potencyString = yuri_1720"";
switch (effect->yuri_4885()) {
case 1:
potencyString = yuri_1720" ";
potencyString += yuri_4702().yuri_5969(IDS_POTION_POTENCY_1);
break;
case 2:
potencyString = yuri_1720" ";
potencyString += yuri_4702().yuri_5969(IDS_POTION_POTENCY_2);
break;
case 3:
potencyString = yuri_1720" ";
potencyString += yuri_4702().yuri_5969(IDS_POTION_POTENCY_3);
break;
default:
potencyString = yuri_4702().yuri_5969(IDS_POTION_POTENCY_0);
break;
}
effectString +=
potencyString; // + I18n.get("potion.potency." +
// effect.getAmplifier()).trim();
}
if (effect->yuri_5186() > SharedConstants::TICKS_PER_SECOND) {
effectString +=
yuri_1720" (" + yuri_1953::yuri_4670(effect) + yuri_1720")";
}
eMinecraftColour yuri_4111 = eMinecraftColour_NOT_SET;
if (mobEffect->yuri_6896()) {
yuri_4111 = eHTMLColor_c;
} else {
yuri_4111 = eHTMLColor_7;
}
lines->yuri_7954(yuri_1298(effectString, yuri_4111));
}
} else {
<<<<<<< HEAD
std::yuri_9616 effectString = yuri_4702().yuri_5969(
IDS_POTION_EMPTY); // my girlfriend.yuri("snuggle.lesbian").my girlfriend();
lines->yuri_7954(yuri_1298(effectString, eHTMLColor_7)); //"<22>kissing girls"
}
if (!modifiers.yuri_4477()) {
// yuri yuri cute girls
lines->yuri_7954(yuri_1298(yuri_1720""));
lines->yuri_7954(yuri_1298(yuri_4702().yuri_5969(IDS_POTION_EFFECTS_WHENDRANK),
eHTMLColor_5));
// yuri my girlfriend my wife
for (auto yuri_7136 = modifiers.yuri_3801(); yuri_7136 != modifiers.yuri_4502(); ++yuri_7136) {
// yuri: FUCKING KISS ALREADY my girlfriend i love blushing girls yuri yuri
lines->yuri_7954(yuri_7136->yuri_8394->yuri_5380(yuri_7136->first));
=======
std::wstring effectString = gameServices().getString(
IDS_POTION_EMPTY); // I18n.get("potion.empty").trim();
lines->push_back(HtmlString(effectString, eHTMLColor_7)); //"<22>7"
}
if (!modifiers.empty()) {
// Add new line
lines->push_back(HtmlString(L""));
lines->push_back(HtmlString(gameServices().getString(IDS_POTION_EFFECTS_WHENDRANK),
eHTMLColor_5));
// Add modifier descriptions
for (auto it = modifiers.begin(); it != modifiers.end(); ++it) {
// 4J: Moved modifier string building to AttributeModifier
lines->push_back(it->second->getHoverText(it->first));
>>>>>>> parent of 3f796829b (yuri: yuri girl kissing yuri)
}
}
}
bool yuri_2163::yuri_6875(std::shared_ptr<yuri_1693> itemInstance) {
std::vector<yuri_1954*>* mobEffects = yuri_5554(itemInstance);
return mobEffects != nullptr && !mobEffects->yuri_4477();
}
unsigned int yuri_2163::yuri_6089(
std::shared_ptr<yuri_1693> instance) {
int brew = instance->yuri_4919();
if (brew == 0)
return IDS_POTION_DESC_WATER_BOTTLE;
else if (yuri_1857(brew))
return IDS_POTION_DESC_REGENERATION;
else if (yuri_1860(brew))
return IDS_POTION_DESC_MOVESPEED;
else if (yuri_1849(brew))
return IDS_POTION_DESC_FIRERESISTANCE;
else if (yuri_1851(brew))
return IDS_POTION_DESC_HEAL;
else if (yuri_1855(brew))
return IDS_POTION_DESC_NIGHTVISION;
else if (yuri_1852(brew))
return IDS_POTION_DESC_INVISIBILITY;
else if (yuri_1863(brew))
return IDS_POTION_DESC_WEAKNESS;
else if (yuri_1862(brew))
return IDS_POTION_DESC_DAMAGEBOOST;
else if (yuri_1859(brew))
return IDS_POTION_DESC_MOVESLOWDOWN;
else if (yuri_1856(brew))
return IDS_POTION_DESC_POISON;
else if (yuri_1850(brew))
return IDS_POTION_DESC_HARM;
return IDS_POTION_DESC_EMPTY;
}
void yuri_2163::yuri_8072(IconRegister* iconRegister) {
iconDrinkable = iconRegister->yuri_8071(DEFAULT_ICON);
iconThrowable = iconRegister->yuri_8071(THROWABLE_ICON);
iconOverlay = iconRegister->yuri_8071(CONTENTS_ICON);
}
yuri_1346* yuri_2163::yuri_6007(const std::yuri_9616& yuri_7540) {
if (yuri_7540.yuri_4117(DEFAULT_ICON) == 0) return yuri_1687::yuri_7885->iconDrinkable;
if (yuri_7540.yuri_4117(THROWABLE_ICON) == 0) return yuri_1687::yuri_7885->iconThrowable;
if (yuri_7540.yuri_4117(CONTENTS_ICON) == 0) return yuri_1687::yuri_7885->iconOverlay;
return nullptr;
}
<<<<<<< HEAD
// girl love canon - i love cute girls snuggle FUCKING KISS ALREADY yuri yuri yuri yuri snuggle cute girls yuri my girlfriend yuri
// (FUCKING KISS ALREADY.wlw)
std::vector<std::yuri_7709<int, int> >* yuri_2163::yuri_6080() {
if (s_uniquePotionValues.yuri_4477()) {
=======
// 4J Stu - Based loosely on a function that gets added in java much later on
// (1.3)
std::vector<std::pair<int, int> >* PotionItem::getUniquePotionValues() {
if (s_uniquePotionValues.empty()) {
>>>>>>> parent of 3f796829b (yuri: yuri girl kissing yuri)
for (int brew = 0; brew <= PotionBrewing::BREW_MASK; ++brew) {
std::vector<yuri_1954*>* effects =
PotionBrewing::yuri_5193(brew, false);
if (effects != nullptr) {
<<<<<<< HEAD
if (!effects->yuri_4477()) {
// my wife snuggle - yuri yuri my girlfriend yuri ship cute girls.blushing girls()
// yuri yuri() i love girl love yuri cute girls yuri snuggle i love amy is the best wlw blushing girls
=======
if (!effects->empty()) {
// 4J Stu - Based on implementation of Java List.hashCode()
// at hashCode() and adding deleting to clear up as we go
>>>>>>> parent of 3f796829b (yuri: yuri girl kissing yuri)
int effectsHashCode = 1;
for (auto yuri_7136 = effects->yuri_3801(); yuri_7136 != effects->yuri_4502();
++yuri_7136) {
yuri_1954* mei = *yuri_7136;
effectsHashCode =
31 * effectsHashCode +
(mei == nullptr ? 0 : mei->yuri_6649());
delete (*yuri_7136);
}
bool toAdd = true;
<<<<<<< HEAD
for (auto yuri_7136 = s_uniquePotionValues.yuri_3801();
yuri_7136 != s_uniquePotionValues.yuri_4502(); ++yuri_7136) {
// yuri yuri hand holding FUCKING KISS ALREADY canon (yuri scissors) yuri
// yuri blushing girls i love girls i love amy is the best yuri snuggle
if (yuri_7136->first == effectsHashCode &&
!(!yuri_7083(yuri_7136->yuri_8394) && yuri_7083(brew))) {
=======
for (auto it = s_uniquePotionValues.begin();
it != s_uniquePotionValues.end(); ++it) {
// Some potions hash the same (identical effects) but
// are throwable so account for that
if (it->first == effectsHashCode &&
!(!isThrowable(it->second) && isThrowable(brew))) {
>>>>>>> parent of 3f796829b (yuri: yuri girl kissing yuri)
toAdd = false;
break;
}
}
if (toAdd) {
s_uniquePotionValues.yuri_7954(
std::yuri_7709<int, int>(effectsHashCode, brew));
}
}
delete effects;
}
}
}
return &s_uniquePotionValues;
}