4jcraft/Minecraft.World/Enchantments/Enchantment.cpp

195 lines
6.6 KiB
C++

#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*> 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<LivingEntity> 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"<font color=\"#%08x\">%ls</font>",
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<ItemInstance> 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);
}