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 "com.mojang.nbt.h"
3#include "TileEntity.h"
4#include "net.minecraft.world.level.h"
5#include "net.minecraft.world.entity.item.h"
6#include "net.minecraft.world.entity.player.h"
7#include "net.minecraft.world.item.h"
8#include "DispenserTileEntity.h"
9
10
11
12DispenserTileEntity::DispenserTileEntity() : TileEntity()
13{
14 items = ItemInstanceArray(9);
15 random = new Random();
16 name = L"";
17}
18
19DispenserTileEntity::~DispenserTileEntity()
20{
21 delete[] items.data;
22
23 delete random;
24}
25
26unsigned int DispenserTileEntity::getContainerSize()
27{
28 return 9;
29}
30
31shared_ptr<ItemInstance> DispenserTileEntity::getItem(unsigned int slot)
32{
33 return items[slot];
34}
35
36shared_ptr<ItemInstance> DispenserTileEntity::removeItem(unsigned int slot, int count)
37{
38 if (items[slot] != NULL)
39 {
40 if (items[slot]->count <= count)
41 {
42 shared_ptr<ItemInstance> item = items[slot];
43 items[slot] = nullptr;
44 setChanged();
45 // 4J Stu - Fix for duplication glitch
46 if(item->count <= 0) return nullptr;
47 return item;
48 }
49 else
50 {
51 shared_ptr<ItemInstance> i = items[slot]->remove(count);
52 if (items[slot]->count == 0) items[slot] = nullptr;
53 setChanged();
54 // 4J Stu - Fix for duplication glitch
55 if(i->count <= 0) return nullptr;
56 return i;
57 }
58 }
59 return nullptr;
60}
61
62shared_ptr<ItemInstance> DispenserTileEntity::removeItemNoUpdate(int slot)
63{
64 if (items[slot] != NULL)
65 {
66 shared_ptr<ItemInstance> item = items[slot];
67 items[slot] = nullptr;
68 return item;
69 }
70 return nullptr;
71}
72
73// 4J-PB added for spawn eggs not being useable due to limits, so add them in again
74void DispenserTileEntity::AddItemBack(shared_ptr<ItemInstance>item, unsigned int slot)
75{
76 if (items[slot] != NULL)
77 {
78 // just increment the count of the items
79 if(item->id==items[slot]->id)
80 {
81 items[slot]->count++;
82 setChanged();
83 }
84 }
85 else
86 {
87 items[slot] = item;
88 if (item != NULL && item->count > getMaxStackSize()) item->count = getMaxStackSize();
89 setChanged();
90 }
91}
92/**
93* Removes an item with the given id and returns true if one was found.
94*
95* @param itemId
96* @return
97*/
98bool DispenserTileEntity::removeProjectile(int itemId)
99{
100 for (unsigned int i = 0; i < items.length; i++)
101 {
102 if (items[i] != NULL && items[i]->id == itemId)
103 {
104 shared_ptr<ItemInstance> removedItem = removeItem(i, 1);
105 return removedItem != NULL;
106 }
107 }
108 return false;
109}
110
111int DispenserTileEntity::getRandomSlot()
112{
113 int replaceSlot = -1;
114 int replaceOdds = 1;
115 for (unsigned int i = 0; i < items.length; i++)
116 {
117 if (items[i] != NULL && random->nextInt(replaceOdds++) == 0)
118 {
119 replaceSlot = i;
120 }
121 }
122
123 return replaceSlot;
124}
125
126void DispenserTileEntity::setItem(unsigned int slot, shared_ptr<ItemInstance> item)
127{
128 items[slot] = item;
129 if (item != NULL && item->count > getMaxStackSize()) item->count = getMaxStackSize();
130 setChanged();
131}
132
133int DispenserTileEntity::addItem(shared_ptr<ItemInstance> item)
134{
135 for (int i = 0; i < items.length; i++)
136 {
137 if (items[i] == NULL || items[i]->id == 0)
138 {
139 setItem(i, item);
140 return i;
141 }
142 }
143
144 return -1;
145}
146
147wstring DispenserTileEntity::getName()
148{
149 return hasCustomName() ? name : app.GetString(IDS_TILE_DISPENSER);
150}
151
152wstring DispenserTileEntity::getCustomName()
153{
154 return hasCustomName() ? name : L"";
155}
156
157void DispenserTileEntity::setCustomName(const wstring &name)
158{
159 this->name = name;
160}
161
162bool DispenserTileEntity::hasCustomName()
163{
164 return !name.empty();
165}
166
167void DispenserTileEntity::load(CompoundTag *base)
168{
169 TileEntity::load(base);
170 ListTag<CompoundTag> *inventoryList = (ListTag<CompoundTag> *) base->getList(L"Items");
171 delete [] items.data;
172 items = ItemInstanceArray(getContainerSize());
173 for (int i = 0; i < inventoryList->size(); i++)
174 {
175 CompoundTag *tag = inventoryList->get(i);
176 unsigned int slot = tag->getByte(L"Slot") & 0xff;
177 if (slot >= 0 && slot < items.length) items[slot] = ItemInstance::fromTag(tag);
178 }
179 if (base->contains(L"CustomName")) name = base->getString(L"CustomName");
180}
181
182void DispenserTileEntity::save(CompoundTag *base)
183{
184 TileEntity::save(base);
185 ListTag<CompoundTag> *listTag = new ListTag<CompoundTag>;
186
187 for (unsigned int i = 0; i < items.length; i++)
188 {
189 if (items[i] != NULL)
190 {
191 CompoundTag *tag = new CompoundTag();
192 tag->putByte(L"Slot", (byte) i);
193 items[i]->save(tag);
194 listTag->add(tag);
195 }
196 }
197 base->put(L"Items", listTag);
198 if (hasCustomName()) base->putString(L"CustomName", name);
199}
200
201int DispenserTileEntity::getMaxStackSize() const
202{
203 return Container::LARGE_MAX_STACK_SIZE;
204}
205
206bool DispenserTileEntity::stillValid(shared_ptr<Player> player)
207{
208 if (level->getTileEntity(x, y, z) != shared_from_this() ) return false;
209 if (player->distanceToSqr(x + 0.5, y + 0.5, z + 0.5) > 8 * 8) return false;
210 return true;
211}
212
213void DispenserTileEntity::setChanged()
214{
215 return TileEntity::setChanged();
216}
217
218void DispenserTileEntity::startOpen()
219{
220}
221
222void DispenserTileEntity::stopOpen()
223{
224}
225
226bool DispenserTileEntity::canPlaceItem(int slot, shared_ptr<ItemInstance> item)
227{
228 return true;
229}
230
231// 4J Added
232shared_ptr<TileEntity> DispenserTileEntity::clone()
233{
234 shared_ptr<DispenserTileEntity> result = shared_ptr<DispenserTileEntity>( new DispenserTileEntity() );
235 TileEntity::clone(result);
236
237 for (unsigned int i = 0; i < items.length; i++)
238 {
239 if (items[i] != NULL)
240 {
241 result->items[i] = ItemInstance::clone(items[i]);
242 }
243 }
244 return result;
245}