#include "stdafx.h" #include "net.minecraft.world.item.enchantment.h" #include "net.minecraft.world.item.h" #include "WeighedTreasure.h" #include "EnchantedBookItem.h" const wstring EnchantedBookItem::TAG_STORED_ENCHANTMENTS = L"StoredEnchantments"; EnchantedBookItem::EnchantedBookItem(int id) : Item(id) { } bool EnchantedBookItem::isFoil(shared_ptr itemInstance) { return true; } bool EnchantedBookItem::isEnchantable(shared_ptr itemInstance) { return false; } const Rarity *EnchantedBookItem::getRarity(shared_ptr itemInstance) { ListTag *enchantments = getEnchantments(itemInstance); if (enchantments && enchantments->size() > 0) { return Rarity::uncommon; } else { return Item::getRarity(itemInstance); } } ListTag *EnchantedBookItem::getEnchantments(shared_ptr item) { if (item->tag == NULL || !item->tag->contains((wchar_t *)TAG_STORED_ENCHANTMENTS.c_str())) { return new ListTag(); } return (ListTag *) item->tag->get((wchar_t *)TAG_STORED_ENCHANTMENTS.c_str()); } void EnchantedBookItem::appendHoverText(shared_ptr itemInstance, shared_ptr player, vector *lines, bool advanced, vector &unformattedStrings) { Item::appendHoverText(itemInstance, player, lines, advanced, unformattedStrings); ListTag *list = getEnchantments(itemInstance); if (list != NULL) { wstring unformatted = L""; for (int i = 0; i < list->size(); i++) { int type = list->get(i)->getShort((wchar_t *)ItemInstance::TAG_ENCH_ID); int level = list->get(i)->getShort((wchar_t *)ItemInstance::TAG_ENCH_LEVEL); if (Enchantment::enchantments[type] != NULL) { lines->push_back(Enchantment::enchantments[type]->getFullname(level, unformatted)); unformattedStrings.push_back(unformatted); } } } } void EnchantedBookItem::addEnchantment(shared_ptr item, EnchantmentInstance *enchantment) { ListTag *enchantments = getEnchantments(item); bool add = true; for (int i = 0; i < enchantments->size(); i++) { CompoundTag *tag = enchantments->get(i); if (tag->getShort((wchar_t *)ItemInstance::TAG_ENCH_ID) == enchantment->enchantment->id) { if (tag->getShort((wchar_t *)ItemInstance::TAG_ENCH_LEVEL) < enchantment->level) { tag->putShort((wchar_t *)ItemInstance::TAG_ENCH_LEVEL, (short) enchantment->level); } add = false; break; } } if (add) { CompoundTag *tag = new CompoundTag(); tag->putShort((wchar_t *)ItemInstance::TAG_ENCH_ID, (short) enchantment->enchantment->id); tag->putShort((wchar_t *)ItemInstance::TAG_ENCH_LEVEL, (short) enchantment->level); enchantments->add(tag); } if (!item->hasTag()) item->setTag(new CompoundTag()); item->getTag()->put((wchar_t *)TAG_STORED_ENCHANTMENTS.c_str(), enchantments); } shared_ptr EnchantedBookItem::createForEnchantment(EnchantmentInstance *enchant) { shared_ptr item = shared_ptr(new ItemInstance(this)); addEnchantment(item, enchant); return item; } void EnchantedBookItem::createForEnchantment(Enchantment *enchant, vector > *items) { for (int i = enchant->getMinLevel(); i <= enchant->getMaxLevel(); i++) { items->push_back(createForEnchantment(new EnchantmentInstance(enchant, i))); } } shared_ptr EnchantedBookItem::createForRandomLoot(Random *random) { Enchantment *enchantment = Enchantment::validEnchantments[random->nextInt(Enchantment::validEnchantments.size())]; shared_ptr book = shared_ptr(new ItemInstance(id, 1, 0)); int level = Mth::nextInt(random, enchantment->getMinLevel(), enchantment->getMaxLevel()); addEnchantment(book, new EnchantmentInstance(enchantment, level)); return book; } WeighedTreasure *EnchantedBookItem::createForRandomTreasure(Random *random) { return createForRandomTreasure(random, 1, 1, 1); } WeighedTreasure *EnchantedBookItem::createForRandomTreasure(Random *random, int minCount, int maxCount, int weight) { Enchantment *enchantment = Enchantment::validEnchantments[random->nextInt(Enchantment::validEnchantments.size())]; shared_ptr book = shared_ptr(new ItemInstance(id, 1, 0)); int level = Mth::nextInt(random, enchantment->getMinLevel(), enchantment->getMaxLevel()); addEnchantment(book, new EnchantmentInstance(enchantment, level)); return new WeighedTreasure(book, minCount, maxCount, weight); }