aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/unapplied
diff options
context:
space:
mode:
authorNassim Jahnke <[email protected]>2024-06-16 12:47:57 +0200
committerNassim Jahnke <[email protected]>2024-06-16 12:47:57 +0200
commit752f957e12e4ceb8b7d2043a4a7dbce786b7b98f (patch)
tree006ea0327b7f1ad952cdde2fb077b9e6f63e525c /patches/unapplied
parent60f3bd8d0c01e17f1947e706b5c3ab5fda4b694a (diff)
downloadPaper-752f957e12e4ceb8b7d2043a4a7dbce786b7b98f.tar.gz
Paper-752f957e12e4ceb8b7d2043a4a7dbce786b7b98f.zip
Add back more patches
Diffstat (limited to 'patches/unapplied')
-rw-r--r--patches/unapplied/server/1009-Entity-load-save-limit-per-chunk.patch58
-rw-r--r--patches/unapplied/server/1030-Properly-resend-entities.patch232
2 files changed, 0 insertions, 290 deletions
diff --git a/patches/unapplied/server/1009-Entity-load-save-limit-per-chunk.patch b/patches/unapplied/server/1009-Entity-load-save-limit-per-chunk.patch
deleted file mode 100644
index 1dbf729bda..0000000000
--- a/patches/unapplied/server/1009-Entity-load-save-limit-per-chunk.patch
+++ /dev/null
@@ -1,58 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Jason Penilla <[email protected]>
-Date: Wed, 18 Nov 2020 20:52:25 -0800
-Subject: [PATCH] Entity load/save limit per chunk
-
-Adds a config option to limit the number of entities saved and loaded
-to a chunk. The default values of -1 disable the limit. Although
-defaults are only included for certain entites, this allows setting
-limits for any entity type.
-
-diff --git a/src/main/java/net/minecraft/world/entity/EntityType.java b/src/main/java/net/minecraft/world/entity/EntityType.java
-index 56b51096ca4147363a843accf6ef2510f05e8f1a..a46bf73c608641bf1f00fd55242de71a0f2ee06e 100644
---- a/src/main/java/net/minecraft/world/entity/EntityType.java
-+++ b/src/main/java/net/minecraft/world/entity/EntityType.java
-@@ -649,9 +649,20 @@ public class EntityType<T extends Entity> implements FeatureElement, EntityTypeT
- final Spliterator<? extends Tag> spliterator = entityNbtList.spliterator();
-
- return StreamSupport.stream(new Spliterator<Entity>() {
-+ final java.util.Map<EntityType<?>, Integer> loadedEntityCounts = new java.util.HashMap<>(); // Paper - Entity load/save limit per chunk
- public boolean tryAdvance(Consumer<? super Entity> consumer) {
- return spliterator.tryAdvance((nbtbase) -> {
- EntityType.loadEntityRecursive((CompoundTag) nbtbase, world, (entity) -> {
-+ // Paper start - Entity load/save limit per chunk
-+ final EntityType<?> entityType = entity.getType();
-+ final int saveLimit = world.paperConfig().chunks.entityPerChunkSaveLimit.getOrDefault(entityType, -1);
-+ if (saveLimit > -1) {
-+ if (this.loadedEntityCounts.getOrDefault(entityType, 0) >= saveLimit) {
-+ return null;
-+ }
-+ this.loadedEntityCounts.merge(entityType, 1, Integer::sum);
-+ }
-+ // Paper end - Entity load/save limit per chunk
- consumer.accept(entity);
- return entity;
- });
-diff --git a/src/main/java/net/minecraft/world/level/chunk/storage/EntityStorage.java b/src/main/java/net/minecraft/world/level/chunk/storage/EntityStorage.java
-index 9fdf8f857a5f9b231c6d0633eaba498244214f74..bee39dee1b96023c907407877aedf3aafaf5e1b8 100644
---- a/src/main/java/net/minecraft/world/level/chunk/storage/EntityStorage.java
-+++ b/src/main/java/net/minecraft/world/level/chunk/storage/EntityStorage.java
-@@ -105,7 +105,18 @@ public class EntityStorage implements EntityPersistentStorage<Entity> {
- }
-
- ListTag listTag = new ListTag();
-+ final java.util.Map<net.minecraft.world.entity.EntityType<?>, Integer> savedEntityCounts = new java.util.HashMap<>(); // Paper - Entity load/save limit per chunk
- entities.forEach((entity) -> { // diff here: use entities parameter
-+ // Paper start - Entity load/save limit per chunk
-+ final EntityType<?> entityType = entity.getType();
-+ final int saveLimit = level.paperConfig().chunks.entityPerChunkSaveLimit.getOrDefault(entityType, -1);
-+ if (saveLimit > -1) {
-+ if (savedEntityCounts.getOrDefault(entityType, 0) >= saveLimit) {
-+ return;
-+ }
-+ savedEntityCounts.merge(entityType, 1, Integer::sum);
-+ }
-+ // Paper end - Entity load/save limit per chunk
- CompoundTag compoundTag = new CompoundTag();
- if (entity.save(compoundTag)) {
- listTag.add(compoundTag);
diff --git a/patches/unapplied/server/1030-Properly-resend-entities.patch b/patches/unapplied/server/1030-Properly-resend-entities.patch
deleted file mode 100644
index 8bba132319..0000000000
--- a/patches/unapplied/server/1030-Properly-resend-entities.patch
+++ /dev/null
@@ -1,232 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Owen1212055 <[email protected]>
-Date: Wed, 7 Dec 2022 17:25:19 -0500
-Subject: [PATCH] Properly resend entities
-
-This resolves some issues which caused entities to not be resent correctly.
-Entities that are interacted with need to be resent to the client, so we resend all the entity
-data to the player whilst making sure not to clear dirty entries from the tracker. This makes
-sure that values will be correctly updated to other players.
-
-This also adds utilities to aid in further preventing entity desyncs.
-
-This also also fixes the bug causing cancelling PlayerInteractEvent to cause items to continue
-to be used despite being cancelled on the server.
-
-For example, items being consumed but never finishing, shields being put up, etc.
-The underlying issue of this is that the client modifies their synced data values,
-and so we have to (forcibly) resend them in order for the client to reset their using item state.
-
-See: https://github.com/PaperMC/Paper/pull/1896
-
-== AT ==
-public net.minecraft.server.level.ChunkMap$TrackedEntity serverEntity
-
-diff --git a/src/main/java/net/minecraft/network/syncher/SynchedEntityData.java b/src/main/java/net/minecraft/network/syncher/SynchedEntityData.java
-index 02bf2705ca1c99023a83a22d92e1962181102297..0f99733660f91280e4c6262cf75b3c9cae86f65a 100644
---- a/src/main/java/net/minecraft/network/syncher/SynchedEntityData.java
-+++ b/src/main/java/net/minecraft/network/syncher/SynchedEntityData.java
-@@ -50,7 +50,7 @@ public class SynchedEntityData {
- }
- }
-
-- private <T> SynchedEntityData.DataItem<T> getItem(EntityDataAccessor<T> key) {
-+ public <T> SynchedEntityData.DataItem<T> getItem(EntityDataAccessor<T> key) { // Paper - public
- return (SynchedEntityData.DataItem<T>) this.itemsById[key.id()]; // CraftBukkit - decompile error
- }
-
-@@ -151,6 +151,20 @@ public class SynchedEntityData {
- }
- }
-
-+ // Paper start
-+ // We need to pack all as we cannot rely on "non default values" or "dirty" ones.
-+ // Because these values can possibly be desynced on the client.
-+ @Nullable
-+ public List<SynchedEntityData.DataValue<?>> packAll() {
-+ final List<SynchedEntityData.DataValue<?>> list = new ArrayList<>();
-+ for (final DataItem<?> dataItem : this.itemsById) {
-+ list.add(dataItem.value());
-+ }
-+
-+ return list;
-+ }
-+ // Paper end
-+
- public static class DataItem<T> {
-
- final EntityDataAccessor<T> accessor;
-diff --git a/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java b/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java
-index 56de0da254c8f027fa23afc261be3b5e5ffdde93..c7efde4e2b87b14e768429748b01c1bce659682b 100644
---- a/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java
-+++ b/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java
-@@ -556,6 +556,7 @@ public class ServerPlayerGameMode {
- }
- // Paper end - extend Player Interact cancellation
- player.getBukkitEntity().updateInventory(); // SPIGOT-2867
-+ this.player.resyncUsingItem(this.player); // Paper - Properly cancel usable items
- return (event.useItemInHand() != Event.Result.ALLOW) ? InteractionResult.SUCCESS : InteractionResult.PASS;
- } else if (this.gameModeForPlayer == GameType.SPECTATOR) {
- MenuProvider itileinventory = iblockdata.getMenuProvider(world, blockposition);
-@@ -607,6 +608,11 @@ public class ServerPlayerGameMode {
-
- return enuminteractionresult;
- } else {
-+ // Paper start - Properly cancel usable items; Cancel only if cancelled + if the interact result is different from default response
-+ if (this.interactResult && this.interactResult != cancelledItem) {
-+ this.player.resyncUsingItem(this.player);
-+ }
-+ // Paper end - Properly cancel usable items
- return InteractionResult.PASS;
- }
- }
-diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
-index 56d32a919cff2a9d4a5775665ed4d1d14b9c708b..3faf80fca51d66480265eaf3cc89149e53ceb215 100644
---- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
-+++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
-@@ -2004,6 +2004,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
- }
-
- if (cancelled) {
-+ this.player.resyncUsingItem(this.player); // Paper - Properly cancel usable items
- this.player.getBukkitEntity().updateInventory(); // SPIGOT-2524
- return;
- }
-@@ -2786,7 +2787,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
-
- // Entity in bucket - SPIGOT-4048 and SPIGOT-6859a
- if ((entity instanceof Bucketable && entity instanceof LivingEntity && origItem != null && origItem.asItem() == Items.WATER_BUCKET) && (event.isCancelled() || ServerGamePacketListenerImpl.this.player.getInventory().getSelected() == null || ServerGamePacketListenerImpl.this.player.getInventory().getSelected().getItem() != origItem)) {
-- ServerGamePacketListenerImpl.this.send(new ClientboundAddEntityPacket(entity));
-+ entity.resendPossiblyDesyncedEntityData(ServerGamePacketListenerImpl.this.player); // Paper - The entire mob gets deleted, so resend it.
- ServerGamePacketListenerImpl.this.player.containerMenu.sendAllDataToRemote();
- }
-
-diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java
-index 68446b7532dfbda303293aa9e756644c6fcdffca..a2142930b4d4b05987c90496fb9d733d99040aa0 100644
---- a/src/main/java/net/minecraft/server/players/PlayerList.java
-+++ b/src/main/java/net/minecraft/server/players/PlayerList.java
-@@ -393,7 +393,7 @@ public abstract class PlayerList {
- ((ServerLevel)player.level()).getChunkSource().chunkMap.addEntity(player); // Paper - Fire PlayerJoinEvent when Player is actually ready; track entity now
- // CraftBukkit end
-
-- player.refreshEntityData(player); // CraftBukkit - BungeeCord#2321, send complete data to self on spawn
-+ //player.refreshEntityData(player); // CraftBukkit - BungeeCord#2321, send complete data to self on spawn // Paper - THIS IS NOT NEEDED ANYMORE
-
- this.sendLevelInfo(player, worldserver1);
-
-diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
-index 9153c15cd2b8a3811d5f1c16ac2221aea7c3aacd..7ef9f67d27cc240191dd5d07e8dcf5fbdebe1049 100644
---- a/src/main/java/net/minecraft/world/entity/Entity.java
-+++ b/src/main/java/net/minecraft/world/entity/Entity.java
-@@ -703,13 +703,44 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess
-
- // CraftBukkit start
- public void refreshEntityData(ServerPlayer to) {
-- List<SynchedEntityData.DataValue<?>> list = this.getEntityData().getNonDefaultValues();
-+ List<SynchedEntityData.DataValue<?>> list = this.entityData.packAll(); // Paper - Update EVERYTHING not just not default
-
-- if (list != null) {
-+ if (list != null && to.getBukkitEntity().canSee(this.getBukkitEntity())) { // Paper
- to.connection.send(new ClientboundSetEntityDataPacket(this.getId(), list));
- }
- }
- // CraftBukkit end
-+ // Paper start
-+ // This method should only be used if the data of an entity could have become desynced
-+ // due to interactions on the client.
-+ public void resendPossiblyDesyncedEntityData(net.minecraft.server.level.ServerPlayer player) {
-+ if (this.tracker == null) {
-+ return;
-+ }
-+
-+ if (player.getBukkitEntity().canSee(this.getBukkitEntity())) {
-+ final net.minecraft.server.level.ServerEntity serverEntity = this.tracker.serverEntity;
-+ final List<net.minecraft.network.protocol.Packet<? super net.minecraft.network.protocol.game.ClientGamePacketListener>> list = new java.util.ArrayList<>();
-+ serverEntity.sendPairingData(player, list::add);
-+ player.connection.send(new net.minecraft.network.protocol.game.ClientboundBundlePacket(list));
-+ }
-+ }
-+
-+ // This method allows you to specifically resend certain data accessor keys to the client
-+ public void resendPossiblyDesyncedDataValues(List<EntityDataAccessor<?>> keys, ServerPlayer to) {
-+ if (!to.getBukkitEntity().canSee(this.getBukkitEntity())) {
-+ return;
-+ }
-+
-+ final List<SynchedEntityData.DataValue<?>> values = new java.util.ArrayList<>(keys.size());
-+ for (final EntityDataAccessor<?> key : keys) {
-+ final SynchedEntityData.DataItem<?> synchedValue = this.entityData.getItem(key);
-+ values.add(synchedValue.value());
-+ }
-+
-+ to.connection.send(new ClientboundSetEntityDataPacket(this.id, values));
-+ }
-+ // Paper end
-
- public boolean equals(Object object) {
- return object instanceof Entity ? ((Entity) object).id == this.id : false;
-diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java
-index 9601d3def5e4ac0650bae42a1da2a64ab1e5aef7..81a8296e25275639718e0839888ac6a900b54bf3 100644
---- a/src/main/java/net/minecraft/world/entity/LivingEntity.java
-+++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java
-@@ -3818,6 +3818,11 @@ public abstract class LivingEntity extends Entity implements Attackable {
- return ((Byte) this.entityData.get(LivingEntity.DATA_LIVING_ENTITY_FLAGS) & 2) > 0 ? InteractionHand.OFF_HAND : InteractionHand.MAIN_HAND;
- }
-
-+ // Paper start - Properly cancel usable items
-+ public void resyncUsingItem(ServerPlayer serverPlayer) {
-+ this.resendPossiblyDesyncedDataValues(java.util.List.of(DATA_LIVING_ENTITY_FLAGS), serverPlayer);
-+ }
-+ // Paper end - Properly cancel usable items
- private void updatingUsingItem() {
- if (this.isUsingItem()) {
- if (ItemStack.isSameItem(this.getItemInHand(this.getUsedItemHand()), this.useItem)) {
-diff --git a/src/main/java/net/minecraft/world/entity/animal/Bucketable.java b/src/main/java/net/minecraft/world/entity/animal/Bucketable.java
-index cb4a6439e9774bbec07e69b13df8dddd395b9ece..cfe37b4f5e33795ee717d824d86e3a0919129cf5 100644
---- a/src/main/java/net/minecraft/world/entity/animal/Bucketable.java
-+++ b/src/main/java/net/minecraft/world/entity/animal/Bucketable.java
-@@ -109,8 +109,7 @@ public interface Bucketable {
- itemstack1 = CraftItemStack.asNMSCopy(playerBucketFishEvent.getEntityBucket());
- if (playerBucketFishEvent.isCancelled()) {
- ((ServerPlayer) player).containerMenu.sendAllDataToRemote(); // We need to update inventory to resync client's bucket
-- ((ServerPlayer) player).connection.send(new ClientboundAddEntityPacket(entity)); // We need to play out these packets as the client assumes the fish is gone
-- entity.refreshEntityData((ServerPlayer) player); // Need to send data such as the display name to client
-+ entity.resendPossiblyDesyncedEntityData((ServerPlayer) player); // Paper
- return Optional.of(InteractionResult.FAIL);
- }
- entity.playSound(((Bucketable) entity).getPickupSound(), 1.0F, 1.0F);
-diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
-index 3ab04c4bdbe26ff7f6f54eb9cdd58376c592fa05..a2d336ceb52b63db5c03432ee7bc94dc6a742b82 100644
---- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
-+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
-@@ -1010,7 +1010,11 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity {
- return;
- }
-
-- entityTracker.broadcast(this.getHandle().getAddEntityPacket());
-+ // Paper start, resend possibly desynced entity instead of add entity packet
-+ for (ServerPlayerConnection playerConnection : entityTracker.seenBy) {
-+ this.getHandle().resendPossiblyDesyncedEntityData(playerConnection.getPlayer());
-+ }
-+ // Paper end
- }
-
- private static PermissibleBase getPermissibleBase() {
-diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftItemFrame.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftItemFrame.java
-index 0801bcdee8fcff0d388d302387e4f1d587e0a283..2fcd9b836d42e3549a3b6b921c57a4c103146dff 100644
---- a/src/main/java/org/bukkit/craftbukkit/entity/CraftItemFrame.java
-+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftItemFrame.java
-@@ -39,9 +39,11 @@ public class CraftItemFrame extends CraftHanging implements ItemFrame {
- protected void update() {
- super.update();
-
-+ // Paper start, don't mark as dirty as this is handled in super.update()
- // mark dirty, so that the client gets updated with item and rotation
-- this.getHandle().getEntityData().markDirty(net.minecraft.world.entity.decoration.ItemFrame.DATA_ITEM);
-- this.getHandle().getEntityData().markDirty(net.minecraft.world.entity.decoration.ItemFrame.DATA_ROTATION);
-+ //this.getHandle().getEntityData().markDirty(net.minecraft.world.entity.decoration.ItemFrame.DATA_ITEM);
-+ //this.getHandle().getEntityData().markDirty(net.minecraft.world.entity.decoration.ItemFrame.DATA_ROTATION);
-+ // Paper end
-
- // update redstone
- if (!this.getHandle().generation) {