mirror of
https://github.com/PaperMC/Paper.git
synced 2025-08-04 06:02:12 -07:00
Add back more patches
This commit is contained in:
@@ -5056,6 +5056,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
|||||||
+import java.util.Iterator;
|
+import java.util.Iterator;
|
||||||
+import java.util.List;
|
+import java.util.List;
|
||||||
+import java.util.function.Predicate;
|
+import java.util.function.Predicate;
|
||||||
|
+import org.bukkit.event.entity.EntityRemoveEvent;
|
||||||
+
|
+
|
||||||
+public final class ChunkEntitySlices {
|
+public final class ChunkEntitySlices {
|
||||||
+
|
+
|
||||||
@@ -5176,12 +5177,12 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
|||||||
+ continue;
|
+ continue;
|
||||||
+ }
|
+ }
|
||||||
+ if (entity.shouldBeSaved()) {
|
+ if (entity.shouldBeSaved()) {
|
||||||
+ entity.setRemoved(Entity.RemovalReason.UNLOADED_TO_CHUNK);
|
+ entity.setRemoved(Entity.RemovalReason.UNLOADED_TO_CHUNK, EntityRemoveEvent.Cause.UNLOAD);
|
||||||
+ if (entity.isVehicle()) {
|
+ if (entity.isVehicle()) {
|
||||||
+ // we cannot assume that these entities are contained within this chunk, because entities can
|
+ // we cannot assume that these entities are contained within this chunk, because entities can
|
||||||
+ // desync - so we need to remove them all
|
+ // desync - so we need to remove them all
|
||||||
+ for (final Entity passenger : entity.getIndirectPassengers()) {
|
+ for (final Entity passenger : entity.getIndirectPassengers()) {
|
||||||
+ passenger.setRemoved(Entity.RemovalReason.UNLOADED_TO_CHUNK);
|
+ passenger.setRemoved(Entity.RemovalReason.UNLOADED_TO_CHUNK, EntityRemoveEvent.Cause.UNLOAD);
|
||||||
+ }
|
+ }
|
||||||
+ }
|
+ }
|
||||||
+ }
|
+ }
|
||||||
|
@@ -8,6 +8,29 @@ to a chunk. The default values of -1 disable the limit. Although
|
|||||||
defaults are only included for certain entites, this allows setting
|
defaults are only included for certain entites, this allows setting
|
||||||
limits for any entity type.
|
limits for any entity type.
|
||||||
|
|
||||||
|
diff --git a/src/main/java/ca/spottedleaf/moonrise/patches/chunk_system/level/entity/ChunkEntitySlices.java b/src/main/java/ca/spottedleaf/moonrise/patches/chunk_system/level/entity/ChunkEntitySlices.java
|
||||||
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
||||||
|
--- a/src/main/java/ca/spottedleaf/moonrise/patches/chunk_system/level/entity/ChunkEntitySlices.java
|
||||||
|
+++ b/src/main/java/ca/spottedleaf/moonrise/patches/chunk_system/level/entity/ChunkEntitySlices.java
|
||||||
|
@@ -0,0 +0,0 @@ public final class ChunkEntitySlices {
|
||||||
|
}
|
||||||
|
|
||||||
|
final ListTag entitiesTag = new ListTag();
|
||||||
|
+ final java.util.Map<net.minecraft.world.entity.EntityType<?>, Integer> savedEntityCounts = new java.util.HashMap<>(); // Paper - Entity load/save limit per chunk
|
||||||
|
for (final Entity entity : entities) {
|
||||||
|
+ // 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 (savedEntityCounts.getOrDefault(entityType, 0) >= saveLimit) {
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+ savedEntityCounts.merge(entityType, 1, Integer::sum);
|
||||||
|
+ }
|
||||||
|
+ // Paper end - Entity load/save limit per chunk
|
||||||
|
CompoundTag compoundTag = new CompoundTag();
|
||||||
|
if (entity.save(compoundTag)) {
|
||||||
|
entitiesTag.add(compoundTag);
|
||||||
diff --git a/src/main/java/net/minecraft/world/entity/EntityType.java b/src/main/java/net/minecraft/world/entity/EntityType.java
|
diff --git a/src/main/java/net/minecraft/world/entity/EntityType.java b/src/main/java/net/minecraft/world/entity/EntityType.java
|
||||||
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
||||||
--- a/src/main/java/net/minecraft/world/entity/EntityType.java
|
--- a/src/main/java/net/minecraft/world/entity/EntityType.java
|
||||||
@@ -38,21 +61,21 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
|||||||
--- a/src/main/java/net/minecraft/world/level/chunk/storage/EntityStorage.java
|
--- a/src/main/java/net/minecraft/world/level/chunk/storage/EntityStorage.java
|
||||||
+++ b/src/main/java/net/minecraft/world/level/chunk/storage/EntityStorage.java
|
+++ b/src/main/java/net/minecraft/world/level/chunk/storage/EntityStorage.java
|
||||||
@@ -0,0 +0,0 @@ public class EntityStorage implements EntityPersistentStorage<Entity> {
|
@@ -0,0 +0,0 @@ public class EntityStorage implements EntityPersistentStorage<Entity> {
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
ListTag listTag = new ListTag();
|
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
|
+ 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
|
dataList.getEntities().forEach(entity -> {
|
||||||
+ // Paper start - Entity load/save limit per chunk
|
+ // Paper start - Entity load/save limit per chunk
|
||||||
+ final EntityType<?> entityType = entity.getType();
|
+ final EntityType<?> entityType = entity.getType();
|
||||||
+ final int saveLimit = level.paperConfig().chunks.entityPerChunkSaveLimit.getOrDefault(entityType, -1);
|
+ final int saveLimit = this.level.paperConfig().chunks.entityPerChunkSaveLimit.getOrDefault(entityType, -1);
|
||||||
+ if (saveLimit > -1) {
|
+ if (saveLimit > -1) {
|
||||||
+ if (savedEntityCounts.getOrDefault(entityType, 0) >= saveLimit) {
|
+ if (savedEntityCounts.getOrDefault(entityType, 0) >= saveLimit) {
|
||||||
+ return;
|
+ return;
|
||||||
|
+ }
|
||||||
|
+ savedEntityCounts.merge(entityType, 1, Integer::sum);
|
||||||
+ }
|
+ }
|
||||||
+ savedEntityCounts.merge(entityType, 1, Integer::sum);
|
+ // Paper end - Entity load/save limit per chunk
|
||||||
+ }
|
CompoundTag compoundTagx = new CompoundTag();
|
||||||
+ // Paper end - Entity load/save limit per chunk
|
if (entity.save(compoundTagx)) {
|
||||||
CompoundTag compoundTag = new CompoundTag();
|
listTag.add(compoundTagx);
|
||||||
if (entity.save(compoundTag)) {
|
|
||||||
listTag.add(compoundTag);
|
|
@@ -96,8 +96,8 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
|||||||
|
|
||||||
// Entity in bucket - SPIGOT-4048 and SPIGOT-6859a
|
// 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)) {
|
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.getBukkitEntity().update(ServerGamePacketListenerImpl.this.player);
|
||||||
+ entity.resendPossiblyDesyncedEntityData(ServerGamePacketListenerImpl.this.player); // Paper - The entire mob gets deleted, so resend it.
|
+ entity.resendPossiblyDesyncedEntityData(ServerGamePacketListenerImpl.this.player); // Paper - The entire mob gets deleted, so resend it
|
||||||
ServerGamePacketListenerImpl.this.player.containerMenu.sendAllDataToRemote();
|
ServerGamePacketListenerImpl.this.player.containerMenu.sendAllDataToRemote();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -189,7 +189,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
|||||||
itemstack1 = CraftItemStack.asNMSCopy(playerBucketFishEvent.getEntityBucket());
|
itemstack1 = CraftItemStack.asNMSCopy(playerBucketFishEvent.getEntityBucket());
|
||||||
if (playerBucketFishEvent.isCancelled()) {
|
if (playerBucketFishEvent.isCancelled()) {
|
||||||
((ServerPlayer) player).containerMenu.sendAllDataToRemote(); // We need to update inventory to resync client's bucket
|
((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.getBukkitEntity().update((ServerPlayer) player); // 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.refreshEntityData((ServerPlayer) player); // Need to send data such as the display name to client
|
||||||
+ entity.resendPossiblyDesyncedEntityData((ServerPlayer) player); // Paper
|
+ entity.resendPossiblyDesyncedEntityData((ServerPlayer) player); // Paper
|
||||||
return Optional.of(InteractionResult.FAIL);
|
return Optional.of(InteractionResult.FAIL);
|
||||||
@@ -203,15 +203,15 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
- entityTracker.broadcast(this.getHandle().getAddEntityPacket());
|
- entityTracker.broadcast(this.getHandle().getAddEntityPacket(entityTracker.serverEntity));
|
||||||
+ // Paper start, resend possibly desynced entity instead of add entity packet
|
+ // Paper start - resend possibly desynced entity instead of add entity packet
|
||||||
+ for (ServerPlayerConnection playerConnection : entityTracker.seenBy) {
|
+ for (final ServerPlayerConnection connection : entityTracker.seenBy) {
|
||||||
+ this.getHandle().resendPossiblyDesyncedEntityData(playerConnection.getPlayer());
|
+ this.getHandle().resendPossiblyDesyncedEntityData(connection.getPlayer());
|
||||||
+ }
|
+ }
|
||||||
+ // Paper end
|
+ // Paper end - resend possibly desynced entity instead of add entity packet
|
||||||
}
|
}
|
||||||
|
|
||||||
private static PermissibleBase getPermissibleBase() {
|
public void update(ServerPlayer player) {
|
||||||
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftItemFrame.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftItemFrame.java
|
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftItemFrame.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftItemFrame.java
|
||||||
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
||||||
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftItemFrame.java
|
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftItemFrame.java
|
Reference in New Issue
Block a user