mirror of
https://github.com/PaperMC/Paper.git
synced 2024-12-29 12:27:59 +01:00
da9d110d5b
This patch does not appear to be doing anything useful, and may hide errors. Currently, the save logic does not run through this path either so it did not do anything. Additionally, properly implement support for handling RegionFileSizeException in Moonrise.
48 lines
3.3 KiB
Diff
48 lines
3.3 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Aikar <aikar@aikar.co>
|
|
Date: Thu, 2 Apr 2020 01:42:39 -0400
|
|
Subject: [PATCH] Prevent Double PlayerChunkMap adds crashing server
|
|
|
|
Suspected case would be around the technique used in .stopRiding
|
|
Stack will identify any causer of this and warn instead of crashing.
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/level/ChunkMap.java b/src/main/java/net/minecraft/server/level/ChunkMap.java
|
|
index bf9e2851bdc77339bde1fd15c1bad66b8f9e3193..48e848e407e4e78e05c35a5cb2393bccc6de3a4f 100644
|
|
--- a/src/main/java/net/minecraft/server/level/ChunkMap.java
|
|
+++ b/src/main/java/net/minecraft/server/level/ChunkMap.java
|
|
@@ -1292,6 +1292,13 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
|
|
|
|
public void addEntity(Entity entity) {
|
|
org.spigotmc.AsyncCatcher.catchOp("entity track"); // Spigot
|
|
+ // Paper start - ignore and warn about illegal addEntity calls instead of crashing server
|
|
+ if (!entity.valid || entity.level() != this.level || this.entityMap.containsKey(entity.getId())) {
|
|
+ LOGGER.error("Illegal ChunkMap::addEntity for world " + this.level.getWorld().getName()
|
|
+ + ": " + entity + (this.entityMap.containsKey(entity.getId()) ? " ALREADY CONTAINED (This would have crashed your server)" : ""), new Throwable());
|
|
+ return;
|
|
+ }
|
|
+ // Paper end - ignore and warn about illegal addEntity calls instead of crashing server
|
|
if (!(entity instanceof EnderDragonPart)) {
|
|
EntityType<?> entitytypes = entity.getType();
|
|
int i = entitytypes.clientTrackingRange() * 16;
|
|
diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java
|
|
index af3adf1bf771c2327b2972a4f9db9df4c4775f1a..161b556e5c5f3719b5623e71876a2250abc7f391 100644
|
|
--- a/src/main/java/net/minecraft/server/level/ServerLevel.java
|
|
+++ b/src/main/java/net/minecraft/server/level/ServerLevel.java
|
|
@@ -2207,7 +2207,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
|
|
|
|
public void onTrackingStart(Entity entity) {
|
|
org.spigotmc.AsyncCatcher.catchOp("entity register"); // Spigot
|
|
- ServerLevel.this.getChunkSource().addEntity(entity);
|
|
+ // ServerLevel.this.getChunkSource().addEntity(entity); // Paper - ignore and warn about illegal addEntity calls instead of crashing server; moved down below valid=true
|
|
if (entity instanceof ServerPlayer entityplayer) {
|
|
ServerLevel.this.players.add(entityplayer);
|
|
ServerLevel.this.updateSleepingPlayerList();
|
|
@@ -2237,6 +2237,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
|
|
entity.updateDynamicGameEventListener(DynamicGameEventListener::add);
|
|
entity.inWorld = true; // CraftBukkit - Mark entity as in world
|
|
entity.valid = true; // CraftBukkit
|
|
+ ServerLevel.this.getChunkSource().addEntity(entity); // Paper - ignore and warn about illegal addEntity calls instead of crashing server
|
|
// Paper start - Entity origin API
|
|
if (entity.getOriginVector() == null) {
|
|
entity.setOrigin(entity.getBukkitEntity().getLocation());
|