#pragma once class ItemInstance; class Inventory; class DamageSource; class Enchantment; class EnchantmentInstance; class EnchantmentHelper { private: static Random random; public: static int getEnchantmentLevel(int enchantmentId, shared_ptr piece); static unordered_map *getEnchantments(shared_ptr item); static void setEnchantments(unordered_map *enchantments, 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, 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(shared_ptr inventory, DamageSource *source); private: class GetDamageBonusIteration : public EnchantmentIterationMethod { public: int sum; shared_ptr target; virtual void doEnchantment(Enchantment *enchantment, int level); }; static GetDamageBonusIteration getDamageBonusIteration; /** * * @param inventory * @param target * @return */ public: static int getDamageBonus(shared_ptr inventory, shared_ptr target); static int getKnockbackBonus(shared_ptr inventory, shared_ptr target); static int getFireAspect(shared_ptr source); static int getOxygenBonus(shared_ptr inventory); static int getDiggingBonus(shared_ptr inventory); static int getDigDurability(shared_ptr inventory); static bool hasSilkTouch(shared_ptr inventory); static int getDiggingLootBonus(shared_ptr inventory); static int getKillingLootBonus(shared_ptr inventory); static bool hasWaterWorkerBonus(shared_ptr inventory); static int getArmorThorns(shared_ptr source); static shared_ptr getRandomItemWith(Enchantment *enchantment, 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, shared_ptr itemInstance); static shared_ptr enchantItem(Random *random, shared_ptr itemInstance, int enchantmentCost); /** * * @param random * @param itemInstance * @param enchantmentCost * @return */ static vector *selectEnchantment(Random *random, shared_ptr itemInstance, int enchantmentCost); static unordered_map *getAvailableEnchantmentResults(int value, shared_ptr itemInstance); };