mirror of
https://github.com/PaperMC/Paper.git
synced 2024-11-08 03:39:48 +01:00
0ddd20c6f7
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 CraftBukkit Changes: ead719a65 SPIGOT-7136: Cancelling PlayerInteractEntityEvent with the Allay desyncs 8468e167e SPIGOT-7137: StructureGrowEvent isFromBonemeal and getPlayer have incorrect values d45057c59 SPIGOT-7089: Crash when command blocks attempt to load worlds Spigot Changes: 450dcaa8 Rebuild patches
108 lines
6.5 KiB
Diff
108 lines
6.5 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/net/minecraft/server/level/ServerEntity.java b/src/main/java/net/minecraft/server/level/ServerEntity.java
|
|
index 319dfa82dff1fe188a52bed5aa2d39575853b793..919758363c7b703cb200582768e68c97ce5c807a 100644
|
|
--- a/src/main/java/net/minecraft/server/level/ServerEntity.java
|
|
+++ b/src/main/java/net/minecraft/server/level/ServerEntity.java
|
|
@@ -311,7 +311,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/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
|
index aecf10bddc2607924f716791315333d93e78bddf..52a5df31e7e0420c0cebeca4f9bfc1c981b8e128 100644
|
|
--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
|
+++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
|
@@ -2824,8 +2824,8 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic
|
|
}
|
|
// Paper end
|
|
// SPIGOT-7136 - Allays
|
|
- if (entity instanceof Allay) {
|
|
- ServerGamePacketListenerImpl.this.send(new ClientboundSetEquipmentPacket(entity.getId(), Arrays.stream(net.minecraft.world.entity.EquipmentSlot.values()).map((slot) -> Pair.of(slot, ((LivingEntity) entity).getItemBySlot(slot).copy())).collect(Collectors.toList())));
|
|
+ if (entity instanceof Allay allay) { // Paper
|
|
+ ServerGamePacketListenerImpl.this.send(new ClientboundSetEquipmentPacket(entity.getId(), Arrays.stream(net.minecraft.world.entity.EquipmentSlot.values()).map((slot) -> Pair.of(slot, allay.stripMeta(allay.getItemBySlot(slot), true))).collect(Collectors.toList()))); // Paper - remove unnecessary item meta
|
|
player.containerMenu.sendAllDataToRemote();
|
|
}
|
|
}
|
|
diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java
|
|
index d8522072adb93d47fdd7cfa947132c23c2386952..8dc54061802f0253193bda79bded1d5265591519 100644
|
|
--- a/src/main/java/net/minecraft/world/entity/LivingEntity.java
|
|
+++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java
|
|
@@ -3114,7 +3114,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:
|
|
@@ -3128,6 +3128,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().anticheat.obfuscation.items.hideDurability) {
|
|
+ // 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().anticheat.obfuscation.items.hideItemmeta) {
|
|
+ // 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()) {
|