TU19: merge Minecraft.World/Blocks

This commit is contained in:
Tropical
2026-03-21 15:52:50 -05:00
parent f25cd66f4d
commit 9b6046cb83
242 changed files with 8083 additions and 4657 deletions

View File

@@ -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;