From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Allink Date: Mon, 18 Apr 2022 03:56:09 +0100 Subject: [PATCH] Reset large tags diff --git a/src/main/java/net/minecraft/world/ContainerHelper.java b/src/main/java/net/minecraft/world/ContainerHelper.java index 4092c7a8c2b0d9d26e6f4d97386735236300d132..04c47cf1a920ae6c356449df801227ee14f6dfb7 100644 --- a/src/main/java/net/minecraft/world/ContainerHelper.java +++ b/src/main/java/net/minecraft/world/ContainerHelper.java @@ -2,6 +2,7 @@ package net.minecraft.world; import java.util.List; import java.util.function.Predicate; +import me.totalfreedom.scissors.NbtUtility; // Scissors import net.minecraft.core.NonNullList; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; @@ -22,10 +23,12 @@ public class ContainerHelper { public static CompoundTag saveAllItems(CompoundTag nbt, NonNullList stacks, boolean setIfEmpty) { ListTag listTag = new ListTag(); + long total = 0; // Scissors for(int i = 0; i < stacks.size(); ++i) { ItemStack itemStack = stacks.get(i); if (!itemStack.isEmpty()) { + total += NbtUtility.getTagSize(itemStack.getTag()); // Scissors CompoundTag compoundTag = new CompoundTag(); compoundTag.putByte("Slot", (byte)i); itemStack.save(compoundTag); @@ -33,7 +36,7 @@ public class ContainerHelper { } } - if (!listTag.isEmpty() || setIfEmpty) { + if ((!listTag.isEmpty() || setIfEmpty) && !(total > NbtUtility.MAXIMUM_SIZE)) { // Scissors nbt.put("Items", listTag); } @@ -42,11 +45,19 @@ public class ContainerHelper { public static void loadAllItems(CompoundTag nbt, NonNullList stacks) { ListTag listTag = nbt.getList("Items", 10); + long total = 0; // Scissors - Account for items inside containers for(int i = 0; i < listTag.size(); ++i) { CompoundTag compoundTag = listTag.getCompound(i); int j = compoundTag.getByte("Slot") & 255; if (j >= 0 && j < stacks.size()) { + // Scissors start + total += NbtUtility.getTagSize(compoundTag); + if (total >= NbtUtility.MAXIMUM_SIZE) { + stacks.clear(); + break; + } + // Scissors end stacks.set(j, ItemStack.of(compoundTag)); } } diff --git a/src/main/java/net/minecraft/world/item/ItemStack.java b/src/main/java/net/minecraft/world/item/ItemStack.java index d0f7baa80cb7d0883304abe2ed990c258a0d92b6..bedd53797391005d70dcdd61c5ed6d56a32fee5c 100644 --- a/src/main/java/net/minecraft/world/item/ItemStack.java +++ b/src/main/java/net/minecraft/world/item/ItemStack.java @@ -21,6 +21,7 @@ import java.util.function.Predicate; import java.util.stream.Collectors; import java.util.stream.Stream; import javax.annotation.Nullable; +import me.totalfreedom.scissors.NbtUtility; // Scissors import net.minecraft.ChatFormatting; import net.minecraft.Util; import net.minecraft.advancements.CriteriaTriggers; @@ -254,6 +255,12 @@ public final class ItemStack { // CraftBukkit - break into own method private void load(CompoundTag nbttagcompound) { + // Scissors start - Reset large tags + if (NbtUtility.isTooLarge(nbttagcompound)) { + // Reset tag without destroying item + nbttagcompound = NbtUtility.Item.removeItemData(nbttagcompound); + } + // Scissors end this.item = (Item) BuiltInRegistries.ITEM.get(new ResourceLocation(nbttagcompound.getString("id"))); this.count = nbttagcompound.getByte("Count"); if (nbttagcompound.contains("tag", 10)) { @@ -563,7 +570,11 @@ public final class ItemStack { nbt.putString("id", minecraftkey == null ? "minecraft:air" : minecraftkey.toString()); nbt.putByte("Count", (byte) this.count); if (this.tag != null) { - nbt.put("tag", this.tag.copy()); + // Scissors start - Don't save large tags + if (!NbtUtility.isTooLarge(this.tag)) { + nbt.put("tag", this.tag.copy()); + } + // Scissors end } return nbt; @@ -893,6 +904,7 @@ public final class ItemStack { // Paper end public void setTag(@Nullable CompoundTag nbt) { + if (NbtUtility.isTooLarge(nbt)) return; // Scissors - Ignore large tags this.tag = nbt; this.processEnchantOrder(this.tag); // Paper if (this.getItem().canBeDepleted()) { diff --git a/src/main/java/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java index f5ad7ddf13cbb6452c2927aef9b54eae3335b4c6..041e3c8fb7c9ca69a7c7c1c952ed9915a75d7752 100644 --- a/src/main/java/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java +++ b/src/main/java/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java @@ -9,6 +9,7 @@ import java.util.Iterator; import java.util.List; import java.util.Map; import javax.annotation.Nullable; +import me.totalfreedom.scissors.NbtUtility; // Scissors import net.minecraft.SharedConstants; import net.minecraft.Util; import net.minecraft.core.BlockPos; @@ -212,6 +213,17 @@ public abstract class AbstractFurnaceBlockEntity extends BaseContainerBlockEntit public List transaction = new java.util.ArrayList(); public List getContents() { + // Scissors start - Account for items inside containers + long total = 0; + + for (ItemStack item : this.items) { + total += NbtUtility.getTagSize(item.getOrCreateTag()); + } + + if (total > NbtUtility.MAXIMUM_SIZE) { + this.items.clear(); + } + // Scissors end return this.items; } diff --git a/src/main/java/net/minecraft/world/level/block/entity/BarrelBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/BarrelBlockEntity.java index 416aa989ebb18a8741cc9d605a1180ab830f6643..a9a8c9e68e5b767dec2c26495685da88e0caa627 100644 --- a/src/main/java/net/minecraft/world/level/block/entity/BarrelBlockEntity.java +++ b/src/main/java/net/minecraft/world/level/block/entity/BarrelBlockEntity.java @@ -1,5 +1,6 @@ package net.minecraft.world.level.block.entity; +import me.totalfreedom.scissors.NbtUtility; // Scissors import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.NonNullList; @@ -34,6 +35,17 @@ public class BarrelBlockEntity extends RandomizableContainerBlockEntity { @Override public List getContents() { + // Scissors start - Account for items inside containers + long total = 0; + + for (ItemStack item : this.items) { + total += NbtUtility.getTagSize(item.getOrCreateTag()); + } + + if (total > NbtUtility.MAXIMUM_SIZE) { + this.items.clear(); + } + // Scissors end return this.items; } diff --git a/src/main/java/net/minecraft/world/level/block/entity/BrewingStandBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/BrewingStandBlockEntity.java index c57efcb9a79337ec791e4e8f6671612f0a82b441..2cbb8170953cb555411db8c171a3d1d91eb799bb 100644 --- a/src/main/java/net/minecraft/world/level/block/entity/BrewingStandBlockEntity.java +++ b/src/main/java/net/minecraft/world/level/block/entity/BrewingStandBlockEntity.java @@ -3,6 +3,7 @@ package net.minecraft.world.level.block.entity; import java.util.Arrays; import java.util.Iterator; import javax.annotation.Nullable; +import me.totalfreedom.scissors.NbtUtility; // Scissors import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.NonNullList; @@ -73,6 +74,17 @@ public class BrewingStandBlockEntity extends BaseContainerBlockEntity implements } public List getContents() { + // Scissors start - Account for items inside containers + long total = 0; + + for (ItemStack item : this.items) { + total += NbtUtility.getTagSize(item.getOrCreateTag()); + } + + if (total > NbtUtility.MAXIMUM_SIZE) { + this.items.clear(); + } + // Scissors end return this.items; } diff --git a/src/main/java/net/minecraft/world/level/block/entity/ChestBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/ChestBlockEntity.java index a71414397bd45ee7bcacfeef0041d80dfa25f114..f51abf1722e98d7ce9e616d84472d847e597eafb 100644 --- a/src/main/java/net/minecraft/world/level/block/entity/ChestBlockEntity.java +++ b/src/main/java/net/minecraft/world/level/block/entity/ChestBlockEntity.java @@ -1,5 +1,6 @@ package net.minecraft.world.level.block.entity; +import me.totalfreedom.scissors.NbtUtility; // Scissors import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.NonNullList; @@ -40,6 +41,17 @@ public class ChestBlockEntity extends RandomizableContainerBlockEntity implement private int maxStack = MAX_STACK; public List getContents() { + // Scissors start - Account for items inside containers + long total = 0; + + for (ItemStack item : this.items) { + total += NbtUtility.getTagSize(item.getOrCreateTag()); + } + + if (total > NbtUtility.MAXIMUM_SIZE) { + this.items.clear(); + } + // Scissors end return this.items; } diff --git a/src/main/java/net/minecraft/world/level/block/entity/DispenserBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/DispenserBlockEntity.java index 881379681c39230a00b3a1f11cd87498984396c7..d0513b72cdaec3b67b9341d251367b193bafa40c 100644 --- a/src/main/java/net/minecraft/world/level/block/entity/DispenserBlockEntity.java +++ b/src/main/java/net/minecraft/world/level/block/entity/DispenserBlockEntity.java @@ -1,5 +1,6 @@ package net.minecraft.world.level.block.entity; +import me.totalfreedom.scissors.NbtUtility; // Scissors import net.minecraft.core.BlockPos; import net.minecraft.core.NonNullList; import net.minecraft.nbt.CompoundTag; @@ -28,6 +29,17 @@ public class DispenserBlockEntity extends RandomizableContainerBlockEntity { private int maxStack = MAX_STACK; public List getContents() { + // Scissors start - Account for items inside containers + long total = 0; + + for (ItemStack item : this.items) { + total += NbtUtility.getTagSize(item.getOrCreateTag()); + } + + if (total > NbtUtility.MAXIMUM_SIZE) { + this.items.clear(); + } + // Scissors end return this.items; } diff --git a/src/main/java/net/minecraft/world/level/block/entity/HopperBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/HopperBlockEntity.java index d4dcf7fe26474ae07374e7761d823bc5c8b54f97..7352183f7eaa1ddcd028e53f4b66a1c34e32b988 100644 --- a/src/main/java/net/minecraft/world/level/block/entity/HopperBlockEntity.java +++ b/src/main/java/net/minecraft/world/level/block/entity/HopperBlockEntity.java @@ -6,6 +6,7 @@ import java.util.function.BooleanSupplier; import java.util.stream.Collectors; import java.util.stream.IntStream; import javax.annotation.Nullable; +import me.totalfreedom.scissors.NbtUtility; // Scissors import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.NonNullList; @@ -56,6 +57,17 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen private int maxStack = MAX_STACK; public List getContents() { + // Scissors start - Account for items inside containers + long total = 0; + + for (ItemStack item : this.items) { + total += NbtUtility.getTagSize(item.getOrCreateTag()); + } + + if (total > NbtUtility.MAXIMUM_SIZE) { + this.items.clear(); + } + // Scissors end return this.items; } diff --git a/src/main/java/net/minecraft/world/level/block/entity/ShulkerBoxBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/ShulkerBoxBlockEntity.java index 1fa22445a4ecc8c08dbcf0cc6bd39dc5003604c4..9f12fbcd8d0c75de1d8c06bed2c64a0acdc877c9 100644 --- a/src/main/java/net/minecraft/world/level/block/entity/ShulkerBoxBlockEntity.java +++ b/src/main/java/net/minecraft/world/level/block/entity/ShulkerBoxBlockEntity.java @@ -4,6 +4,7 @@ import java.util.Iterator; import java.util.List; import java.util.stream.IntStream; import javax.annotation.Nullable; +import me.totalfreedom.scissors.NbtUtility; // Scissors import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.NonNullList; @@ -61,6 +62,17 @@ public class ShulkerBoxBlockEntity extends RandomizableContainerBlockEntity impl public boolean opened; public List getContents() { + // Scissors start - Account for items inside containers + long total = 0; + + for (ItemStack item : this.itemStacks) { + total += NbtUtility.getTagSize(item.getOrCreateTag()); + } + + if (total > NbtUtility.MAXIMUM_SIZE) { + this.itemStacks.clear(); + } + // Scissors end return this.itemStacks; }