#include "../Platform/stdafx.h" #include "../Headers/net.minecraft.world.item.enchantment.h" #include "../Headers/net.minecraft.world.item.h" #include "Enchantment.h" // Enchantment *Enchantment::enchantments[256]; EnchantmentArray Enchantment::enchantments = EnchantmentArray(256); std::vector Enchantment::validEnchantments; Enchantment* Enchantment::allDamageProtection = NULL; Enchantment* Enchantment::fireProtection = NULL; Enchantment* Enchantment::fallProtection = NULL; Enchantment* Enchantment::explosionProtection = NULL; Enchantment* Enchantment::projectileProtection = NULL; Enchantment* Enchantment::drownProtection = NULL; Enchantment* Enchantment::waterWorker = NULL; Enchantment* Enchantment::thorns = NULL; // weapon Enchantment* Enchantment::damageBonus = NULL; Enchantment* Enchantment::damageBonusUndead = NULL; Enchantment* Enchantment::damageBonusArthropods = NULL; Enchantment* Enchantment::knockback = NULL; Enchantment* Enchantment::fireAspect = NULL; Enchantment* Enchantment::lootBonus = NULL; // digger Enchantment* Enchantment::diggingBonus = NULL; Enchantment* Enchantment::untouching = NULL; Enchantment* Enchantment::digDurability = NULL; Enchantment* Enchantment::resourceBonus = NULL; // bows Enchantment* Enchantment::arrowBonus = NULL; Enchantment* Enchantment::arrowKnockback = NULL; Enchantment* Enchantment::arrowFire = NULL; Enchantment* Enchantment::arrowInfinite = NULL; void Enchantment::staticCtor() { allDamageProtection = new ProtectionEnchantment(0, FREQ_COMMON, ProtectionEnchantment::ALL); fireProtection = new ProtectionEnchantment(1, FREQ_UNCOMMON, ProtectionEnchantment::FIRE); fallProtection = new ProtectionEnchantment(2, FREQ_UNCOMMON, ProtectionEnchantment::FALL); explosionProtection = new ProtectionEnchantment( 3, FREQ_RARE, ProtectionEnchantment::EXPLOSION); projectileProtection = new ProtectionEnchantment( 4, FREQ_UNCOMMON, ProtectionEnchantment::PROJECTILE); drownProtection = new OxygenEnchantment(5, FREQ_RARE); waterWorker = new WaterWorkerEnchantment(6, FREQ_RARE); thorns = new ThornsEnchantment(7, FREQ_VERY_RARE); // weapon damageBonus = new DamageEnchantment(16, FREQ_COMMON, DamageEnchantment::ALL); damageBonusUndead = new DamageEnchantment(17, FREQ_UNCOMMON, DamageEnchantment::UNDEAD); damageBonusArthropods = new DamageEnchantment(18, FREQ_UNCOMMON, DamageEnchantment::ARTHROPODS); knockback = new KnockbackEnchantment(19, FREQ_UNCOMMON); fireAspect = new FireAspectEnchantment(20, FREQ_RARE); lootBonus = new LootBonusEnchantment(21, FREQ_RARE, EnchantmentCategory::weapon); // digger diggingBonus = new DiggingEnchantment(32, FREQ_COMMON); untouching = new UntouchingEnchantment(33, FREQ_VERY_RARE); digDurability = new DigDurabilityEnchantment(34, FREQ_UNCOMMON); resourceBonus = new LootBonusEnchantment(35, FREQ_RARE, EnchantmentCategory::digger); // bows arrowBonus = new ArrowDamageEnchantment(48, FREQ_COMMON); arrowKnockback = new ArrowKnockbackEnchantment(49, FREQ_RARE); arrowFire = new ArrowFireEnchantment(50, FREQ_RARE); arrowInfinite = new ArrowInfiniteEnchantment(51, FREQ_VERY_RARE); for (unsigned int i = 0; i < 256; ++i) { Enchantment* enchantment = enchantments[i]; if (enchantment != NULL) { validEnchantments.push_back(enchantment); } } } void Enchantment::_init(int id) { if (enchantments[id] != NULL) { app.DebugPrintf("Duplicate enchantment id!"); #ifndef _CONTENT_PACKAGE __debugbreak(); #endif // throw new IllegalArgumentException("Duplicate enchantment id!"); } enchantments[id] = this; } Enchantment::Enchantment(int id, int frequency, const EnchantmentCategory* category) : id(id), frequency(frequency), category(category) { _init(id); } Enchantment::Enchantment(int id) : id(id), frequency(FREQ_COMMON), category(EnchantmentCategory::all) { _init(id); } int Enchantment::getFrequency() { return frequency; } int Enchantment::getMinLevel() { return 1; } int Enchantment::getMaxLevel() { return 1; } int Enchantment::getMinCost(int level) { return 1 + level * 10; } int Enchantment::getMaxCost(int level) { return getMinCost(level) + 5; } int Enchantment::getDamageProtection(int level, DamageSource* source) { return 0; } float Enchantment::getDamageBonus(int level, std::shared_ptr target) { return 0.0f; } bool Enchantment::isCompatibleWith(Enchantment* other) const { return this != other; } Enchantment* Enchantment::setDescriptionId(int id) { descriptionId = id; return this; } int Enchantment::getDescriptionId() { return descriptionId; } // 4jcraft: re-added old TU18 overload for java gui std::wstring Enchantment::getFullname(int level, std::wstring& unformatted) { wchar_t formatted[256]; swprintf(formatted, 256, L"%ls %ls", app.GetString(getDescriptionId()), getLevelString(level).c_str()); unformatted = formatted; swprintf(formatted, 256, L"%ls", app.GetHTMLColour(eHTMLColor_f), unformatted.c_str()); return formatted; } HtmlString Enchantment::getFullname(int level) { wchar_t formatted[256]; swprintf(formatted, 256, L"%ls %ls", app.GetString(getDescriptionId()), getLevelString(level).c_str()); return HtmlString(formatted, eHTMLColor_f); } bool Enchantment::canEnchant(std::shared_ptr item) { return category->canEnchant(item->getItem()); } // 4J Added std::wstring Enchantment::getLevelString(int level) { int stringId = IDS_ENCHANTMENT_LEVEL_1; switch (level) { case 2: stringId = IDS_ENCHANTMENT_LEVEL_2; break; case 3: stringId = IDS_ENCHANTMENT_LEVEL_3; break; case 4: stringId = IDS_ENCHANTMENT_LEVEL_4; break; case 5: stringId = IDS_ENCHANTMENT_LEVEL_5; break; case 6: stringId = IDS_ENCHANTMENT_LEVEL_6; break; case 7: stringId = IDS_ENCHANTMENT_LEVEL_7; break; case 8: stringId = IDS_ENCHANTMENT_LEVEL_8; break; case 9: stringId = IDS_ENCHANTMENT_LEVEL_9; break; case 10: stringId = IDS_ENCHANTMENT_LEVEL_10; break; }; return app.GetString(stringId); // I18n.get("enchantment.level." + level); }