the game where you go into mines and start crafting! but for consoles (forked directly from smartcmd's github)
1#include "stdafx.h"
2#include "net.minecraft.world.item.enchantment.h"
3#include "net.minecraft.world.item.h"
4#include "WeighedTreasure.h"
5#include "EnchantedBookItem.h"
6
7const wstring EnchantedBookItem::TAG_STORED_ENCHANTMENTS = L"StoredEnchantments";
8
9EnchantedBookItem::EnchantedBookItem(int id) : Item(id)
10{
11}
12
13bool EnchantedBookItem::isFoil(shared_ptr<ItemInstance> itemInstance)
14{
15 return true;
16}
17
18bool EnchantedBookItem::isEnchantable(shared_ptr<ItemInstance> itemInstance)
19{
20 return false;
21}
22
23const Rarity *EnchantedBookItem::getRarity(shared_ptr<ItemInstance> itemInstance)
24{
25 ListTag<CompoundTag> *enchantments = getEnchantments(itemInstance);
26 if (enchantments && enchantments->size() > 0)
27 {
28 return Rarity::uncommon;
29 }
30 else
31 {
32 return Item::getRarity(itemInstance);
33 }
34}
35
36ListTag<CompoundTag> *EnchantedBookItem::getEnchantments(shared_ptr<ItemInstance> item)
37{
38 if (item->tag == NULL || !item->tag->contains((wchar_t *)TAG_STORED_ENCHANTMENTS.c_str()))
39 {
40 return new ListTag<CompoundTag>();
41 }
42
43 return (ListTag<CompoundTag> *) item->tag->get((wchar_t *)TAG_STORED_ENCHANTMENTS.c_str());
44}
45
46void EnchantedBookItem::appendHoverText(shared_ptr<ItemInstance> itemInstance, shared_ptr<Player> player, vector<HtmlString> *lines, bool advanced)
47{
48 Item::appendHoverText(itemInstance, player, lines, advanced);
49
50 ListTag<CompoundTag> *list = getEnchantments(itemInstance);
51
52 if (list != NULL)
53 {
54 wstring unformatted = L"";
55 for (int i = 0; i < list->size(); i++)
56 {
57 int type = list->get(i)->getShort((wchar_t *)ItemInstance::TAG_ENCH_ID);
58 int level = list->get(i)->getShort((wchar_t *)ItemInstance::TAG_ENCH_LEVEL);
59
60 if (Enchantment::enchantments[type] != NULL)
61 {
62 lines->push_back(Enchantment::enchantments[type]->getFullname(level));
63 }
64 }
65 }
66}
67
68void EnchantedBookItem::addEnchantment(shared_ptr<ItemInstance> item, EnchantmentInstance *enchantment)
69{
70 ListTag<CompoundTag> *enchantments = getEnchantments(item);
71 bool add = true;
72
73 for (int i = 0; i < enchantments->size(); i++)
74 {
75 CompoundTag *tag = enchantments->get(i);
76
77 if (tag->getShort((wchar_t *)ItemInstance::TAG_ENCH_ID) == enchantment->enchantment->id)
78 {
79 if (tag->getShort((wchar_t *)ItemInstance::TAG_ENCH_LEVEL) < enchantment->level)
80 {
81 tag->putShort((wchar_t *)ItemInstance::TAG_ENCH_LEVEL, (short) enchantment->level);
82 }
83
84 add = false;
85 break;
86 }
87 }
88
89 if (add)
90 {
91 CompoundTag *tag = new CompoundTag();
92
93 tag->putShort((wchar_t *)ItemInstance::TAG_ENCH_ID, (short) enchantment->enchantment->id);
94 tag->putShort((wchar_t *)ItemInstance::TAG_ENCH_LEVEL, (short) enchantment->level);
95
96 enchantments->add(tag);
97 }
98
99 if (!item->hasTag()) item->setTag(new CompoundTag());
100 item->getTag()->put((wchar_t *)TAG_STORED_ENCHANTMENTS.c_str(), enchantments);
101}
102
103shared_ptr<ItemInstance> EnchantedBookItem::createForEnchantment(EnchantmentInstance *enchant)
104{
105 shared_ptr<ItemInstance> item = shared_ptr<ItemInstance>(new ItemInstance(this));
106 addEnchantment(item, enchant);
107 return item;
108}
109
110void EnchantedBookItem::createForEnchantment(Enchantment *enchant, vector<shared_ptr<ItemInstance> > *items)
111{
112 for (int i = enchant->getMinLevel(); i <= enchant->getMaxLevel(); i++)
113 {
114 items->push_back(createForEnchantment(new EnchantmentInstance(enchant, i)));
115 }
116}
117
118shared_ptr<ItemInstance> EnchantedBookItem::createForRandomLoot(Random *random)
119{
120 Enchantment *enchantment = Enchantment::validEnchantments[random->nextInt(Enchantment::validEnchantments.size())];
121 shared_ptr<ItemInstance> book = shared_ptr<ItemInstance>(new ItemInstance(id, 1, 0));
122 int level = Mth::nextInt(random, enchantment->getMinLevel(), enchantment->getMaxLevel());
123
124 addEnchantment(book, new EnchantmentInstance(enchantment, level));
125
126 return book;
127}
128
129WeighedTreasure *EnchantedBookItem::createForRandomTreasure(Random *random)
130{
131 return createForRandomTreasure(random, 1, 1, 1);
132}
133
134WeighedTreasure *EnchantedBookItem::createForRandomTreasure(Random *random, int minCount, int maxCount, int weight)
135{
136 Enchantment *enchantment = Enchantment::validEnchantments[random->nextInt(Enchantment::validEnchantments.size())];
137 shared_ptr<ItemInstance> book = shared_ptr<ItemInstance>(new ItemInstance(id, 1, 0));
138 int level = Mth::nextInt(random, enchantment->getMinLevel(), enchantment->getMaxLevel());
139
140 addEnchantment(book, new EnchantmentInstance(enchantment, level));
141
142 return new WeighedTreasure(book, minCount, maxCount, weight);
143}