#pragma once class ItemInstance; class Inventory; class DamageSource; class Enchantment; class EnchantmentInstance; class EnchantmentHelper { private: static Random random; public: static int getEnchantmentLevel(int enchantmentId, std::shared_ptr piece); static unordered_map *getEnchantments(std::shared_ptr item); static void setEnchantments(unordered_map *enchantments, std::shared_ptr item); static int getEnchantmentLevel(int enchantmentId, ItemInstanceArray inventory); private: class EnchantmentIterationMethod { public: virtual void doEnchantment(Enchantment *enchantment, int level) = 0; }; static void runIterationOnItem(EnchantmentIterationMethod &method, std::shared_ptr piece); static void runIterationOnInventory(EnchantmentIterationMethod &method, ItemInstanceArray inventory); class GetDamageProtectionIteration : public EnchantmentIterationMethod { public: int sum; DamageSource *source; virtual void doEnchantment(Enchantment *enchantment, int level); }; static GetDamageProtectionIteration getDamageProtectionIteration; /** * Fetches the protection value for enchanted items. * * @param inventory * @param source * @return */ public: static int getDamageProtection(std::shared_ptr inventory, DamageSource *source); private: class GetDamageBonusIteration : public EnchantmentIterationMethod { public: int sum; std::shared_ptr target; virtual void doEnchantment(Enchantment *enchantment, int level); }; static GetDamageBonusIteration getDamageBonusIteration; /** * * @param inventory * @param target * @return */ public: static int getDamageBonus(std::shared_ptr inventory, std::shared_ptr target); static int getKnockbackBonus(std::shared_ptr inventory, std::shared_ptr target); static int getFireAspect(std::shared_ptr source); static int getOxygenBonus(std::shared_ptr inventory); static int getDiggingBonus(std::shared_ptr inventory); static int getDigDurability(std::shared_ptr inventory); static bool hasSilkTouch(std::shared_ptr inventory); static int getDiggingLootBonus(std::shared_ptr inventory); static int getKillingLootBonus(std::shared_ptr inventory); static bool hasWaterWorkerBonus(std::shared_ptr inventory); static int getArmorThorns(std::shared_ptr source); static std::shared_ptr getRandomItemWith(Enchantment *enchantment, std::shared_ptr source); /** * * @param random * @param slot * The table slot, 0-2 * @param bookcases * How many book cases that are found around the table. * @param itemInstance * Which item that is being enchanted. * @return The enchantment cost, 0 means unchantable, 50 is max. */ static int getEnchantmentCost(Random *random, int slot, int bookcases, std::shared_ptr itemInstance); static std::shared_ptr enchantItem(Random *random, std::shared_ptr itemInstance, int enchantmentCost); /** * * @param random * @param itemInstance * @param enchantmentCost * @return */ static vector *selectEnchantment(Random *random, std::shared_ptr itemInstance, int enchantmentCost); static unordered_map *getAvailableEnchantmentResults(int value, std::shared_ptr itemInstance); };