18f0f8d1ca
Upstream has released updates that appear to apply and compile correctly. This update has not been tested by PaperMC and as with ANY update, please do your own testing Bukkit Changes: 312281ea PR-742: Make World implement Keyed CraftBukkit Changes: 2ac7fa7a SPIGOT-7014: getLootTable API should not persistently update loot table 7fdd7941 PR-1046: Make World implement Keyed 7bc728a6 PR-1045: Revert changes to persistence required checks Spigot Changes: b6d12d17 Rebuild patches
111 Zeilen
6.1 KiB
Diff
111 Zeilen
6.1 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Noah van der Aa <ndvdaa@gmail.com>
|
|
Date: Tue, 3 Aug 2021 17:28:27 +0200
|
|
Subject: [PATCH] Hide unnecessary itemmeta from clients
|
|
|
|
|
|
diff --git a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
|
|
index 01f25f5b87b986075f3100ff930cf492bc28ccd9..0bae3add15f81c31e0f42dc4eb9a2c4164dcde44 100644
|
|
--- a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
|
|
+++ b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
|
|
@@ -964,6 +964,13 @@ public class PaperWorldConfig {
|
|
behaviorTickRates = loadTickRates("behavior");
|
|
}
|
|
|
|
+ public boolean hideItemmetaFromClients = false;
|
|
+ public boolean hideDurabilityFromClients = false;
|
|
+ private void getHideItemmetaFromClients() {
|
|
+ hideItemmetaFromClients = getBoolean("anticheat.obfuscation.items.hide-itemmeta", hideItemmetaFromClients);
|
|
+ hideDurabilityFromClients = getBoolean("anticheat.obfuscation.items.hide-durability", hideDurabilityFromClients);
|
|
+ }
|
|
+
|
|
private com.google.common.collect.Table<String, String, Integer> loadTickRates(String type) {
|
|
log(" " + type + ":");
|
|
com.google.common.collect.Table<String, String, Integer> table = com.google.common.collect.HashBasedTable.create();
|
|
diff --git a/src/main/java/net/minecraft/server/level/ServerEntity.java b/src/main/java/net/minecraft/server/level/ServerEntity.java
|
|
index 7464336f0c7ee59e59552afbad7bed0afcecef87..fe29bf349b987d633b185b9d44d221053fa2cc83 100644
|
|
--- a/src/main/java/net/minecraft/server/level/ServerEntity.java
|
|
+++ b/src/main/java/net/minecraft/server/level/ServerEntity.java
|
|
@@ -321,7 +321,7 @@ public class ServerEntity {
|
|
if (!itemstack.isEmpty()) {
|
|
// Paper start - prevent oversized data
|
|
final ItemStack sanitized = LivingEntity.sanitizeItemStack(itemstack.copy(), false);
|
|
- list.add(Pair.of(enumitemslot, sanitized));
|
|
+ list.add(Pair.of(enumitemslot, ((LivingEntity) this.entity).stripMeta(sanitized, false))); // Paper - remove unnecessary item meta
|
|
// Paper end
|
|
}
|
|
}
|
|
diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java
|
|
index 626e53564d4130b98440982e174fd7c23b7df863..f21f69977ff92ac967aac2e72b679f17e2c42501 100644
|
|
--- a/src/main/java/net/minecraft/world/entity/LivingEntity.java
|
|
+++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java
|
|
@@ -3079,7 +3079,7 @@ public abstract class LivingEntity extends Entity {
|
|
|
|
// Paper start - prevent oversized data
|
|
ItemStack toSend = sanitizeItemStack(itemstack1, true);
|
|
- list.add(Pair.of(enumitemslot, toSend));
|
|
+ list.add(Pair.of(enumitemslot, stripMeta(toSend, toSend == itemstack1))); // Paper - hide unnecessary item meta
|
|
// Paper end
|
|
switch (enumitemslot.getType()) {
|
|
case HAND:
|
|
@@ -3093,6 +3093,59 @@ public abstract class LivingEntity extends Entity {
|
|
((ServerLevel) this.level).getChunkSource().broadcast(this, new ClientboundSetEquipmentPacket(this.getId(), list));
|
|
}
|
|
|
|
+ // Paper start - hide unnecessary item meta
|
|
+ public ItemStack stripMeta(final ItemStack itemStack, final boolean copyItemStack) {
|
|
+ if (itemStack.isEmpty() || (!itemStack.hasTag() && itemStack.getCount() < 2)) {
|
|
+ return itemStack;
|
|
+ }
|
|
+
|
|
+ final ItemStack copy = copyItemStack ? itemStack.copy() : itemStack;
|
|
+ if (level.paperConfig.hideDurabilityFromClients) {
|
|
+ // Only show damage values for elytra's, since they show a different texture when broken.
|
|
+ if (!copy.is(Items.ELYTRA) || copy.getDamageValue() < copy.getMaxDamage() - 1) {
|
|
+ copy.setDamageValue(0);
|
|
+ }
|
|
+ }
|
|
+
|
|
+ if (level.paperConfig.hideItemmetaFromClients) {
|
|
+ // Some resource packs show different textures when there is more than one item. Since this shouldn't provide a big advantage,
|
|
+ // we'll tell the client if there's one or (more than) two items.
|
|
+ copy.setCount(copy.getCount() > 1 ? 2 : 1);
|
|
+ // We can't just strip out display, leather helmets still use the display.color tag.
|
|
+ final CompoundTag tag = copy.getTag();
|
|
+ if (tag != null) {
|
|
+ if (tag.get("display") instanceof CompoundTag displayTag) {
|
|
+ displayTag.remove("Lore");
|
|
+ displayTag.remove("Name");
|
|
+ }
|
|
+
|
|
+ if (tag.get("Enchantments") instanceof ListTag enchantmentsTag && !enchantmentsTag.isEmpty()) {
|
|
+ // The client still renders items with the enchantment glow if the enchantments tag contains at least one (empty) child.
|
|
+ ListTag enchantments = new ListTag();
|
|
+ CompoundTag fakeEnchantment = new CompoundTag();
|
|
+ // Soul speed boots generate client side particles.
|
|
+ if (EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SOUL_SPEED, itemStack) > 0) {
|
|
+ fakeEnchantment.putString("id", org.bukkit.enchantments.Enchantment.SOUL_SPEED.getKey().asString());
|
|
+ fakeEnchantment.putInt("lvl", 1);
|
|
+ }
|
|
+ enchantments.add(fakeEnchantment);
|
|
+ tag.put("Enchantments", enchantments);
|
|
+ }
|
|
+ tag.remove("AttributeModifiers");
|
|
+
|
|
+ // Books
|
|
+ tag.remove("author");
|
|
+ tag.remove("filtered_title");
|
|
+ tag.remove("pages");
|
|
+ tag.remove("filtered_pages");
|
|
+ tag.remove("title");
|
|
+ tag.remove("generation");
|
|
+ }
|
|
+ }
|
|
+ return copy;
|
|
+ }
|
|
+ // Paper end
|
|
+
|
|
// Paper start - prevent oversized data
|
|
public static ItemStack sanitizeItemStack(final ItemStack itemStack, final boolean copyItemStack) {
|
|
if (itemStack.isEmpty() || !itemStack.hasTag()) {
|