#pragma once #include "../Containers/Container.h" #include "../Util/UseAnim.h" #include "../Util/Rarity.h" class MapItem; class Mob; class Player; class Random; class Level; class ShearsItem; class PotionItem; class HitResult; class IconRegister; class Icon; class ArmorItem; class BowItem; class FishingRodItem; class EnchantedBookItem; class EmptyMapItem; #define ITEM_ICON_COLUMNS 16 class Item : public std::enable_shared_from_this { protected: // static const UUID BASE_ATTACK_DAMAGE_UUID; public: static const int ITEM_NUM_COUNT = 32000; static void staticCtor(); static void staticInit(); // 4J-PB - added for new crafting menu enum { eMaterial_undefined = 0, eMaterial_wood, eMaterial_stone, eMaterial_iron, eMaterial_gold, eMaterial_diamond, eMaterial_cloth, eMaterial_chain, // 4J Stu - It's available in creative in 1.8 eMaterial_detector, eMaterial_lapis, eMaterial_music, eMaterial_dye, eMaterial_sand, eMaterial_brick, eMaterial_clay, eMaterial_snow, eMaterial_bow, eMaterial_arrow, eMaterial_compass, eMaterial_clock, eMaterial_map, eMaterial_pumpkin, eMaterial_glowstone, eMaterial_water, eMaterial_trap, eMaterial_flintandsteel, eMaterial_shears, eMaterial_piston, eMaterial_stickypiston, eMaterial_gate, eMaterial_stoneSmooth, eMaterial_netherbrick, eMaterial_ender, eMaterial_glass, eMaterial_blaze, eMaterial_magic, eMaterial_melon, eMaterial_setfire, eMaterial_sprucewood, eMaterial_birchwood, eMaterial_junglewood, eMaterial_emerald, eMaterial_quartz, eMaterial_apple, eMaterial_carrot, eMaterial_redstone, eMaterial_coal, eMaterial_paper, eMaterial_book, eMaterial_bookshelf, eMaterial_wheat, } eMaterial; enum { eBaseItemType_undefined = 0, eBaseItemType_sword, eBaseItemType_shovel, eBaseItemType_pickaxe, eBaseItemType_hatchet, eBaseItemType_hoe, eBaseItemType_door, eBaseItemType_helmet, eBaseItemType_chestplate, eBaseItemType_leggings, eBaseItemType_boots, eBaseItemType_ingot, eBaseItemType_rail, eBaseItemType_block, eBaseItemType_pressureplate, eBaseItemType_stairs, eBaseItemType_cloth, eBaseItemType_dyepowder, eBaseItemType_structwoodstuff, eBaseItemType_structblock, eBaseItemType_slab, eBaseItemType_halfslab, eBaseItemType_torch, eBaseItemType_bow, eBaseItemType_pockettool, eBaseItemType_utensil, eBaseItemType_piston, eBaseItemType_devicetool, eBaseItemType_fence, eBaseItemType_device, eBaseItemType_treasure, eBaseItemType_seed, eBaseItemType_HangingItem, eBaseItemType_button, eBaseItemType_chest, eBaseItemType_rod, eBaseItemType_giltFruit, eBaseItemType_carpet, eBaseItemType_clay, eBaseItemType_glass, eBaseItemType_redstoneContainer, eBaseItemType_fireworks, eBaseItemType_lever, eBaseItemType_paper, eBaseItemType_MAXTYPES, } eBaseItemType; protected: static const int ICON_COLUMNS = ITEM_ICON_COLUMNS; static std::wstring ICON_DESCRIPTION_PREFIX; // 4J Stu - Was const but we have to static // initialise it outside of this class public: class Tier { public: static const Tier* WOOD; // static const Tier* STONE; // static const Tier* IRON; // static const Tier* DIAMOND; // static const Tier* GOLD; private: const int level; const int uses; const float speed; const float damage; const int enchantmentValue; // 4J Stu - Had to make this public but was protected // We shouldn't be creating these except the static initialisation public: Tier(int level, int uses, float speed, float damage, int enchantmentValue); public: int getUses() const; float getSpeed() const; float getAttackDamageBonus() const; int getLevel() const; int getEnchantmentValue() const; int getTierItemId() const; }; protected: static Random* random; private: static const int MAX_STACK_SIZE = Container::LARGE_MAX_STACK_SIZE; public: static ItemArray items; static Item* shovel_iron; static Item* pickAxe_iron; static Item* hatchet_iron; static Item* flintAndSteel; static Item* apple; static BowItem* bow; static Item* arrow; static Item* coal; static Item* diamond; static Item* ironIngot; static Item* goldIngot; static Item* sword_iron; static Item* sword_wood; static Item* shovel_wood; static Item* pickAxe_wood; static Item* hatchet_wood; static Item* sword_stone; static Item* shovel_stone; static Item* pickAxe_stone; static Item* hatchet_stone; static Item* sword_diamond; static Item* shovel_diamond; static Item* pickAxe_diamond; static Item* hatchet_diamond; static Item* stick; static Item* bowl; static Item* mushroomStew; static Item* sword_gold; static Item* shovel_gold; static Item* pickAxe_gold; static Item* hatchet_gold; static Item* string; static Item* feather; static Item* gunpowder; static Item* hoe_wood; static Item* hoe_stone; static Item* hoe_iron; static Item* hoe_diamond; static Item* hoe_gold; static Item* seeds_wheat; static Item* wheat; static Item* bread; static ArmorItem* helmet_leather; static ArmorItem* chestplate_leather; static ArmorItem* leggings_leather; static ArmorItem* boots_leather; static ArmorItem* helmet_chain; static ArmorItem* chestplate_chain; static ArmorItem* leggings_chain; static ArmorItem* boots_chain; static ArmorItem* helmet_iron; static ArmorItem* chestplate_iron; static ArmorItem* leggings_iron; static ArmorItem* boots_iron; static ArmorItem* helmet_diamond; static ArmorItem* chestplate_diamond; static ArmorItem* leggings_diamond; static ArmorItem* boots_diamond; static ArmorItem* helmet_gold; static ArmorItem* chestplate_gold; static ArmorItem* leggings_gold; static ArmorItem* boots_gold; static Item* flint; static Item* porkChop_raw; static Item* porkChop_cooked; static Item* painting; static Item* apple_gold; static Item* sign; static Item* door_wood; static Item* bucket_empty; static Item* bucket_water; static Item* bucket_lava; static Item* minecart; static Item* saddle; static Item* door_iron; static Item* redStone; static Item* snowBall; static Item* boat; static Item* leather; static Item* bucket_milk; static Item* brick; static Item* clay; static Item* reeds; static Item* paper; static Item* book; static Item* slimeBall; static Item* minecart_chest; static Item* minecart_furnace; static Item* egg; static Item* compass; static FishingRodItem* fishingRod; static Item* clock; static Item* yellowDust; static Item* fish_raw; static Item* fish_cooked; static Item* dye_powder; static Item* bone; static Item* sugar; static Item* cake; static Item* bed; static Item* repeater; static Item* cookie; static MapItem* map; static ShearsItem* shears; static Item* melon; static Item* seeds_pumpkin; static Item* seeds_melon; static Item* beef_raw; static Item* beef_cooked; static Item* chicken_raw; static Item* chicken_cooked; static Item* rotten_flesh; static Item* enderPearl; static Item* blazeRod; static Item* ghastTear; static Item* goldNugget; static Item* netherwart_seeds; static PotionItem* potion; static Item* glassBottle; static Item* spiderEye; static Item* fermentedSpiderEye; static Item* blazePowder; static Item* magmaCream; static Item* brewingStand; static Item* cauldron; static Item* eyeOfEnder; static Item* speckledMelon; static Item* spawnEgg; static Item* expBottle; static Item* skull; static Item* record_01; static Item* record_02; static Item* record_03; static Item* record_04; static Item* record_05; static Item* record_06; static Item* record_07; static Item* record_08; static Item* record_09; static Item* record_10; static Item* record_11; static Item* record_12; // TU9 static Item* fireball; static Item* frame; // TU14 // static Item writingBook; // static Item writtenBook; static Item* emerald; static Item* flowerPot; static Item* carrots; static Item* potato; static Item* potatoBaked; static Item* potatoPoisonous; static EmptyMapItem* emptyMap; static Item* carrotGolden; static Item* carrotOnAStick; static Item* netherStar; static Item* pumpkinPie; static Item* fireworks; static Item* fireworksCharge; static Item* netherQuartz; static Item* comparator; static Item* netherbrick; static EnchantedBookItem* enchantedBook; static Item* minecart_tnt; static Item* minecart_hopper; static Item* horseArmorMetal; static Item* horseArmorGold; static Item* horseArmorDiamond; static Item* lead; static Item* nameTag; static const int shovel_iron_Id = 256; static const int pickAxe_iron_Id = 257; static const int hatchet_iron_Id = 258; static const int flintAndSteel_Id = 259; static const int apple_Id = 260; static const int bow_Id = 261; static const int arrow_Id = 262; static const int coal_Id = 263; static const int diamond_Id = 264; static const int ironIngot_Id = 265; static const int goldIngot_Id = 266; static const int sword_iron_Id = 267; static const int sword_wood_Id = 268; static const int shovel_wood_Id = 269; static const int pickAxe_wood_Id = 270; static const int hatchet_wood_Id = 271; static const int sword_stone_Id = 272; static const int shovel_stone_Id = 273; static const int pickAxe_stone_Id = 274; static const int hatchet_stone_Id = 275; static const int sword_diamond_Id = 276; static const int shovel_diamond_Id = 277; static const int pickAxe_diamond_Id = 278; static const int hatchet_diamond_Id = 279; static const int stick_Id = 280; static const int bowl_Id = 281; static const int mushroomStew_Id = 282; static const int sword_gold_Id = 283; static const int shovel_gold_Id = 284; static const int pickAxe_gold_Id = 285; static const int hatchet_gold_Id = 286; static const int string_Id = 287; static const int feather_Id = 288; static const int gunpowder_Id = 289; static const int hoe_wood_Id = 290; static const int hoe_stone_Id = 291; static const int hoe_iron_Id = 292; static const int hoe_diamond_Id = 293; static const int hoe_gold_Id = 294; static const int seeds_wheat_Id = 295; static const int wheat_Id = 296; static const int bread_Id = 297; static const int helmet_leather_Id = 298; static const int chestplate_leather_Id = 299; static const int leggings_leather_Id = 300; static const int boots_leather_Id = 301; static const int helmet_chain_Id = 302; static const int chestplate_chain_Id = 303; static const int leggings_chain_Id = 304; static const int boots_chain_Id = 305; static const int helmet_iron_Id = 306; static const int chestplate_iron_Id = 307; static const int leggings_iron_Id = 308; static const int boots_iron_Id = 309; static const int helmet_diamond_Id = 310; static const int chestplate_diamond_Id = 311; static const int leggings_diamond_Id = 312; static const int boots_diamond_Id = 313; static const int helmet_gold_Id = 314; static const int chestplate_gold_Id = 315; static const int leggings_gold_Id = 316; static const int boots_gold_Id = 317; static const int flint_Id = 318; static const int porkChop_raw_Id = 319; static const int porkChop_cooked_Id = 320; static const int painting_Id = 321; static const int apple_gold_Id = 322; static const int sign_Id = 323; static const int door_wood_Id = 324; static const int bucket_empty_Id = 325; static const int bucket_water_Id = 326; static const int bucket_lava_Id = 327; static const int minecart_Id = 328; static const int saddle_Id = 329; static const int door_iron_Id = 330; static const int redStone_Id = 331; static const int snowBall_Id = 332; static const int boat_Id = 333; static const int leather_Id = 334; static const int bucket_milk_Id = 335; static const int brick_Id = 336; static const int clay_Id = 337; static const int reeds_Id = 338; static const int paper_Id = 339; static const int book_Id = 340; static const int slimeBall_Id = 341; static const int minecart_chest_Id = 342; static const int minecart_furnace_Id = 343; static const int egg_Id = 344; static const int compass_Id = 345; static const int fishingRod_Id = 346; static const int clock_Id = 347; static const int yellowDust_Id = 348; static const int fish_raw_Id = 349; static const int fish_cooked_Id = 350; static const int dye_powder_Id = 351; static const int bone_Id = 352; static const int sugar_Id = 353; static const int cake_Id = 354; static const int bed_Id = 355; static const int repeater_Id = 356; static const int cookie_Id = 357; static const int map_Id = 358; // 1.7.3 static const int shears_Id = 359; // 1.8.2 static const int melon_Id = 360; static const int seeds_pumpkin_Id = 361; static const int seeds_melon_Id = 362; static const int beef_raw_Id = 363; static const int beef_cooked_Id = 364; static const int chicken_raw_Id = 365; static const int chicken_cooked_Id = 366; static const int rotten_flesh_Id = 367; static const int enderPearl_Id = 368; // 1.0.1 static const int blazeRod_Id = 369; static const int ghastTear_Id = 370; static const int goldNugget_Id = 371; static const int netherwart_seeds_Id = 372; static const int potion_Id = 373; static const int glassBottle_Id = 374; static const int spiderEye_Id = 375; static const int fermentedSpiderEye_Id = 376; static const int blazePowder_Id = 377; static const int magmaCream_Id = 378; static const int brewingStand_Id = 379; static const int cauldron_Id = 380; static const int eyeOfEnder_Id = 381; static const int speckledMelon_Id = 382; // 1.1 static const int spawnEgg_Id = 383; static const int expBottle_Id = 384; // TU 12 static const int skull_Id = 397; static const int record_01_Id = 2256; static const int record_02_Id = 2257; static const int record_03_Id = 2258; static const int record_04_Id = 2259; static const int record_05_Id = 2260; static const int record_06_Id = 2261; static const int record_07_Id = 2262; static const int record_09_Id = 2263; static const int record_10_Id = 2264; static const int record_11_Id = 2265; static const int record_12_Id = 2266; // 4J-PB - this one isn't playable in the PC game, but is fine in ours static const int record_08_Id = 2267; // TU9 static const int fireball_Id = 385; static const int itemFrame_Id = 389; // TU14 // static const int writingBook_Id = 130; // static const int writtenBook_Id = 131; static const int emerald_Id = 388; static const int flowerPot_Id = 390; static const int carrots_Id = 391; static const int potato_Id = 392; static const int potatoBaked_Id = 393; static const int potatoPoisonous_Id = 394; static const int emptyMap_Id = 395; static const int carrotGolden_Id = 396; static const int carrotOnAStick_Id = 398; static const int netherStar_Id = 399; static const int pumpkinPie_Id = 400; static const int fireworks_Id = 401; static const int fireworksCharge_Id = 402; static const int enchantedBook_Id = 403; static const int comparator_Id = 404; static const int netherbrick_Id = 405; static const int netherQuartz_Id = 406; static const int minecart_tnt_Id = 407; static const int minecart_hopper_Id = 408; static const int horseArmorMetal_Id = 417; static const int horseArmorGold_Id = 418; static const int horseArmorDiamond_Id = 419; static const int lead_Id = 420; static const int nameTag_Id = 421; public: const int id; protected: int maxStackSize; private: int maxDamage; protected: Icon* icon; // 4J-PB - added for new crafting menu int m_iBaseItemType; int m_iMaterial; bool m_handEquipped; bool m_isStackedByData; private: Item* craftingRemainingItem; std::wstring potionBrewingFormula; // 4J Stu - A value from strings.h, that is the name of the item unsigned int descriptionId; // 4J Stu - A value from strings.h that says what this does unsigned int useDescriptionId; std::wstring m_textureName; protected: Item(int id); public: // 4J Using per-item textures now Item* setIconName(const std::wstring& name); std::wstring getIconName(); Item* setMaxStackSize(int max); Item* setBaseItemTypeAndMaterial(int iType, int iMaterial); int getBaseItemType(); int getMaterial(); virtual int getIconType(); virtual Icon* getIcon(int auxValue); Icon* getIcon(std::shared_ptr itemInstance); virtual bool useOn(std::shared_ptr itemInstance, std::shared_ptr player, Level* level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly = false); virtual float getDestroySpeed(std::shared_ptr itemInstance, Tile* tile); virtual bool TestUse(std::shared_ptr itemInstance, Level* level, std::shared_ptr player); virtual std::shared_ptr use( std::shared_ptr itemInstance, Level* level, std::shared_ptr player); virtual std::shared_ptr useTimeDepleted( std::shared_ptr itemInstance, Level* level, std::shared_ptr player); virtual int getMaxStackSize(); virtual int getLevelDataForAuxValue(int auxValue); bool isStackedByData(); protected: Item* setStackedByData(bool isStackedByData); public: int getMaxDamage(); protected: Item* setMaxDamage(int maxDamage); public: bool canBeDepleted(); /** * Returns true when the item was used to deal more than default damage * * @param itemInstance * @param mob * @param attacker * @return */ virtual bool hurtEnemy(std::shared_ptr itemInstance, std::shared_ptr mob, std::shared_ptr attacker); /** * Returns true when the item was used to mine more efficiently * * @param itemInstance * @param tile * @param x * @param yf * @param z * @param owner * @return */ virtual bool mineBlock(std::shared_ptr itemInstance, Level* level, int tile, int x, int y, int z, std::shared_ptr owner); virtual int getAttackDamage(std::shared_ptr entity); virtual bool canDestroySpecial(Tile* tile); virtual bool interactEnemy(std::shared_ptr itemInstance, std::shared_ptr player, std::shared_ptr mob); Item* handEquipped(); virtual bool isHandEquipped(); virtual bool isMirroredArt(); Item* setDescriptionId(unsigned int id); const wchar_t* getDescription(); const wchar_t* getDescription(std::shared_ptr instance); virtual unsigned int getDescriptionId(int iData = -1); virtual unsigned int getDescriptionId( std::shared_ptr instance); Item* setUseDescriptionId(unsigned int id); virtual unsigned int getUseDescriptionId(); virtual unsigned int getUseDescriptionId( std::shared_ptr instance); Item* setCraftingRemainingItem(Item* craftingRemainingItem); virtual bool shouldMoveCraftingResultToInventory( std::shared_ptr instance); virtual bool shouldOverrideMultiplayerNBT(); Item* getCraftingRemainingItem(); bool hasCraftingRemainingItem(); std::wstring getName(); virtual int getColor(std::shared_ptr item, int spriteLayer); virtual void inventoryTick(std::shared_ptr itemInstance, Level* level, std::shared_ptr owner, int slot, bool selected); virtual void onCraftedBy(std::shared_ptr itemInstance, Level* level, std::shared_ptr player); virtual bool isComplex(); virtual UseAnim getUseAnimation(std::shared_ptr itemInstance); virtual int getUseDuration(std::shared_ptr itemInstance); virtual void releaseUsing(std::shared_ptr itemInstance, Level* level, std::shared_ptr player, int durationLeft); protected: virtual Item* setPotionBrewingFormula( const std::wstring& potionBrewingFormula); public: virtual std::wstring getPotionBrewingFormula(); virtual bool hasPotionBrewingFormula(); // 4jcraft: re-added old TU18 overload for java gui virtual void appendHoverText( std::shared_ptr itemInstance, std::shared_ptr player, std::vector* lines, bool advanced, std::vector& unformattedStrings); // 4J Added unformattedStrings virtual void appendHoverText(std::shared_ptr itemInstance, std::shared_ptr player, std::vector* lines, bool advanced); virtual std::wstring getHoverName( std::shared_ptr itemInstance); virtual bool isFoil(std::shared_ptr itemInstance); virtual const Rarity* getRarity(std::shared_ptr itemInstance); virtual bool isEnchantable(std::shared_ptr itemInstance); protected: HitResult* getPlayerPOVHitResult(Level* level, std::shared_ptr player, bool alsoPickLiquid); public: virtual int getEnchantmentValue(); virtual bool hasMultipleSpriteLayers(); virtual Icon* getLayerIcon(int auxValue, int spriteLayer); virtual bool mayBePlacedInAdventureMode(); virtual bool isValidRepairItem(std::shared_ptr source, std::shared_ptr repairItem); virtual void registerIcons(IconRegister* iconRegister); virtual attrAttrModMap* getDefaultAttributeModifiers(); };