mirror of
https://git.huckle.dev/Huckles-Minecraft-Archive/4jcraft.git
synced 2026-07-08 06:19:03 +00:00
TU19: merge Minecraft.World/Blocks
This commit is contained in:
@@ -1,5 +1,3 @@
|
||||
|
||||
|
||||
#include "../../Platform/stdafx.h"
|
||||
#include "../../Headers/com.mojang.nbt.h"
|
||||
#include "TileEntity.h"
|
||||
@@ -10,13 +8,13 @@
|
||||
#include "DispenserTileEntity.h"
|
||||
|
||||
DispenserTileEntity::DispenserTileEntity() : TileEntity() {
|
||||
items = new ItemInstanceArray(9);
|
||||
items = ItemInstanceArray(9);
|
||||
random = new Random();
|
||||
name = L"";
|
||||
}
|
||||
|
||||
DispenserTileEntity::~DispenserTileEntity() {
|
||||
delete[] items->data;
|
||||
delete items;
|
||||
delete[] items.data;
|
||||
|
||||
delete random;
|
||||
}
|
||||
@@ -24,23 +22,23 @@ DispenserTileEntity::~DispenserTileEntity() {
|
||||
unsigned int DispenserTileEntity::getContainerSize() { return 9; }
|
||||
|
||||
std::shared_ptr<ItemInstance> DispenserTileEntity::getItem(unsigned int slot) {
|
||||
return items->data[slot];
|
||||
return items[slot];
|
||||
}
|
||||
|
||||
std::shared_ptr<ItemInstance> DispenserTileEntity::removeItem(unsigned int slot,
|
||||
int count) {
|
||||
if (items->data[slot] != NULL) {
|
||||
if (items->data[slot]->count <= count) {
|
||||
std::shared_ptr<ItemInstance> item = items->data[slot];
|
||||
items->data[slot] = nullptr;
|
||||
this->setChanged();
|
||||
if (items[slot] != NULL) {
|
||||
if (items[slot]->count <= count) {
|
||||
std::shared_ptr<ItemInstance> item = items[slot];
|
||||
items[slot] = nullptr;
|
||||
setChanged();
|
||||
// 4J Stu - Fix for duplication glitch
|
||||
if (item->count <= 0) return nullptr;
|
||||
return item;
|
||||
} else {
|
||||
std::shared_ptr<ItemInstance> i = items->data[slot]->remove(count);
|
||||
if (items->data[slot]->count == 0) items->data[slot] = nullptr;
|
||||
this->setChanged();
|
||||
std::shared_ptr<ItemInstance> i = items[slot]->remove(count);
|
||||
if (items[slot]->count == 0) items[slot] = nullptr;
|
||||
setChanged();
|
||||
// 4J Stu - Fix for duplication glitch
|
||||
if (i->count <= 0) return nullptr;
|
||||
return i;
|
||||
@@ -51,9 +49,9 @@ std::shared_ptr<ItemInstance> DispenserTileEntity::removeItem(unsigned int slot,
|
||||
|
||||
std::shared_ptr<ItemInstance> DispenserTileEntity::removeItemNoUpdate(
|
||||
int slot) {
|
||||
if (items->data[slot] != NULL) {
|
||||
std::shared_ptr<ItemInstance> item = items->data[slot];
|
||||
items->data[slot] = nullptr;
|
||||
if (items[slot] != NULL) {
|
||||
std::shared_ptr<ItemInstance> item = items[slot];
|
||||
items[slot] = nullptr;
|
||||
return item;
|
||||
}
|
||||
return nullptr;
|
||||
@@ -63,17 +61,17 @@ std::shared_ptr<ItemInstance> DispenserTileEntity::removeItemNoUpdate(
|
||||
// again
|
||||
void DispenserTileEntity::AddItemBack(std::shared_ptr<ItemInstance> item,
|
||||
unsigned int slot) {
|
||||
if (items->data[slot] != NULL) {
|
||||
if (items[slot] != NULL) {
|
||||
// just increment the count of the items
|
||||
if (item->id == items->data[slot]->id) {
|
||||
items->data[slot]->count++;
|
||||
this->setChanged();
|
||||
if (item->id == items[slot]->id) {
|
||||
items[slot]->count++;
|
||||
setChanged();
|
||||
}
|
||||
} else {
|
||||
items->data[slot] = item;
|
||||
items[slot] = item;
|
||||
if (item != NULL && item->count > getMaxStackSize())
|
||||
item->count = getMaxStackSize();
|
||||
this->setChanged();
|
||||
setChanged();
|
||||
}
|
||||
}
|
||||
/**
|
||||
@@ -83,8 +81,8 @@ void DispenserTileEntity::AddItemBack(std::shared_ptr<ItemInstance> item,
|
||||
* @return
|
||||
*/
|
||||
bool DispenserTileEntity::removeProjectile(int itemId) {
|
||||
for (unsigned int i = 0; i < items->length; i++) {
|
||||
if (items->data[i] != NULL && items->data[i]->id == itemId) {
|
||||
for (unsigned int i = 0; i < items.length; i++) {
|
||||
if (items[i] != NULL && items[i]->id == itemId) {
|
||||
std::shared_ptr<ItemInstance> removedItem = removeItem(i, 1);
|
||||
return removedItem != NULL;
|
||||
}
|
||||
@@ -95,8 +93,8 @@ bool DispenserTileEntity::removeProjectile(int itemId) {
|
||||
int DispenserTileEntity::getRandomSlot() {
|
||||
int replaceSlot = -1;
|
||||
int replaceOdds = 1;
|
||||
for (unsigned int i = 0; i < items->length; i++) {
|
||||
if (items->data[i] != NULL && random->nextInt(replaceOdds++) == 0) {
|
||||
for (unsigned int i = 0; i < items.length; i++) {
|
||||
if (items[i] != NULL && random->nextInt(replaceOdds++) == 0) {
|
||||
replaceSlot = i;
|
||||
}
|
||||
}
|
||||
@@ -106,16 +104,16 @@ int DispenserTileEntity::getRandomSlot() {
|
||||
|
||||
void DispenserTileEntity::setItem(unsigned int slot,
|
||||
std::shared_ptr<ItemInstance> item) {
|
||||
items->data[slot] = item;
|
||||
items[slot] = item;
|
||||
if (item != NULL && item->count > getMaxStackSize())
|
||||
item->count = getMaxStackSize();
|
||||
this->setChanged();
|
||||
setChanged();
|
||||
}
|
||||
|
||||
int DispenserTileEntity::addItem(std::shared_ptr<ItemInstance> item) {
|
||||
for (int i = 0; i < items->length; i++) {
|
||||
if ((*items)[i] == NULL || (*items)[i]->id == 0) {
|
||||
(*items)[i] = item;
|
||||
for (int i = 0; i < items.length; i++) {
|
||||
if (items[i] == NULL || items[i]->id == 0) {
|
||||
setItem(i, item);
|
||||
return i;
|
||||
}
|
||||
}
|
||||
@@ -123,34 +121,49 @@ int DispenserTileEntity::addItem(std::shared_ptr<ItemInstance> item) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
int DispenserTileEntity::getName() { return IDS_TILE_DISPENSER; }
|
||||
std::wstring DispenserTileEntity::getName() {
|
||||
return hasCustomName() ? name : app.GetString(IDS_TILE_DISPENSER);
|
||||
}
|
||||
|
||||
std::wstring DispenserTileEntity::getCustomName() {
|
||||
return hasCustomName() ? name : L"";
|
||||
}
|
||||
|
||||
void DispenserTileEntity::setCustomName(const std::wstring& name) {
|
||||
this->name = name;
|
||||
}
|
||||
|
||||
bool DispenserTileEntity::hasCustomName() { return !name.empty(); }
|
||||
|
||||
void DispenserTileEntity::load(CompoundTag* base) {
|
||||
TileEntity::load(base);
|
||||
ListTag<CompoundTag>* inventoryList =
|
||||
(ListTag<CompoundTag>*)base->getList(L"Items");
|
||||
items = new ItemInstanceArray(getContainerSize());
|
||||
delete[] items.data;
|
||||
items = ItemInstanceArray(getContainerSize());
|
||||
for (int i = 0; i < inventoryList->size(); i++) {
|
||||
CompoundTag* tag = inventoryList->get(i);
|
||||
unsigned int slot = tag->getByte(L"Slot") & 0xff;
|
||||
if (slot >= 0 && slot < items->length)
|
||||
(*items)[slot] = ItemInstance::fromTag(tag);
|
||||
if (slot >= 0 && slot < items.length)
|
||||
items[slot] = ItemInstance::fromTag(tag);
|
||||
}
|
||||
if (base->contains(L"CustomName")) name = base->getString(L"CustomName");
|
||||
}
|
||||
|
||||
void DispenserTileEntity::save(CompoundTag* base) {
|
||||
TileEntity::save(base);
|
||||
ListTag<CompoundTag>* listTag = new ListTag<CompoundTag>;
|
||||
|
||||
for (unsigned int i = 0; i < items->length; i++) {
|
||||
if (items->data[i] != NULL) {
|
||||
for (unsigned int i = 0; i < items.length; i++) {
|
||||
if (items[i] != NULL) {
|
||||
CompoundTag* tag = new CompoundTag();
|
||||
tag->putByte(L"Slot", (uint8_t)i);
|
||||
items->data[i]->save(tag);
|
||||
items[i]->save(tag);
|
||||
listTag->add(tag);
|
||||
}
|
||||
}
|
||||
base->put(L"Items", listTag);
|
||||
if (hasCustomName()) base->putString(L"CustomName", name);
|
||||
}
|
||||
|
||||
int DispenserTileEntity::getMaxStackSize() {
|
||||
@@ -169,15 +182,20 @@ void DispenserTileEntity::startOpen() {}
|
||||
|
||||
void DispenserTileEntity::stopOpen() {}
|
||||
|
||||
bool DispenserTileEntity::canPlaceItem(int slot,
|
||||
std::shared_ptr<ItemInstance> item) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// 4J Added
|
||||
std::shared_ptr<TileEntity> DispenserTileEntity::clone() {
|
||||
std::shared_ptr<DispenserTileEntity> result =
|
||||
std::shared_ptr<DispenserTileEntity>(new DispenserTileEntity());
|
||||
TileEntity::clone(result);
|
||||
|
||||
for (unsigned int i = 0; i < items->length; i++) {
|
||||
if (items->data[i] != NULL) {
|
||||
result->items->data[i] = ItemInstance::clone(items->data[i]);
|
||||
for (unsigned int i = 0; i < items.length; i++) {
|
||||
if (items[i] != NULL) {
|
||||
result->items[i] = ItemInstance::clone(items[i]);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
|
||||
Reference in New Issue
Block a user