the game where you go into mines and start crafting! but for consoles (forked directly from smartcmd's github)
at main 245 lines 5.3 kB view raw
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}