geforkt von Mirrors/Paper
8ce5219e07
Vanilla now loads the proper number of chunks for sending to players. So, we can finally match their behavior after all these years.
48 Zeilen
2.9 KiB
Diff
48 Zeilen
2.9 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 5cc0a39622a265e42e6b7d20e81144d1acce59b7..f1a6827a8a23795f810279597b8eefb948d4fcff 100644
|
|
--- a/src/main/java/net/minecraft/server/level/ChunkMap.java
|
|
+++ b/src/main/java/net/minecraft/server/level/ChunkMap.java
|
|
@@ -1031,6 +1031,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
|
|
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 e61781d7ac9ec8828b4968e6e3824f5212bf6dea..faba22ba5b45fbd9463ed2172f5aa9096ed84ba0 100644
|
|
--- a/src/main/java/net/minecraft/server/level/ServerLevel.java
|
|
+++ b/src/main/java/net/minecraft/server/level/ServerLevel.java
|
|
@@ -2473,7 +2473,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
|
|
|
|
public void onTrackingStart(Entity entity) {
|
|
org.spigotmc.AsyncCatcher.catchOp("entity register"); // Spigot
|
|
- ServerLevel.this.getChunkSource().addEntity(entity);
|
|
+ // ServerLevel.this.getChunkSource().addEntity(entity); // Paper - moved down below valid=true
|
|
if (entity instanceof ServerPlayer) {
|
|
ServerPlayer entityplayer = (ServerPlayer) entity;
|
|
|
|
@@ -2507,6 +2507,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
|
|
|
|
entity.updateDynamicGameEventListener(DynamicGameEventListener::add);
|
|
entity.valid = true; // CraftBukkit
|
|
+ ServerLevel.this.getChunkSource().addEntity(entity);
|
|
// Paper start - Set origin location when the entity is being added to the world
|
|
if (entity.getOriginVector() == null) {
|
|
entity.setOrigin(entity.getBukkitEntity().getLocation());
|