Mirror von
https://github.com/PaperMC/Paper.git
synchronisiert 2024-12-15 11:00:06 +01:00
8175ec916f
Should fix #1280 Citizens hijacks entity map, and im guessing under the right conditions the result might actually be null during entity creation Pre the cache patch, the id is looked up on save, so it was fine. Now, if its null and the save ID is requested, we will try to look it up again and cache it if found.
67 Zeilen
3.6 KiB
Diff
67 Zeilen
3.6 KiB
Diff
From 8ed8aaa564e0285d9c0ff6dd5308c66186db4c41 Mon Sep 17 00:00:00 2001
|
|
From: Aikar <aikar@aikar.co>
|
|
Date: Tue, 1 Mar 2016 23:52:34 -0600
|
|
Subject: [PATCH] Prevent tile entity and entity crashes
|
|
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/TileEntity.java b/src/main/java/net/minecraft/server/TileEntity.java
|
|
index 081e56f481..f191225c62 100644
|
|
--- a/src/main/java/net/minecraft/server/TileEntity.java
|
|
+++ b/src/main/java/net/minecraft/server/TileEntity.java
|
|
@@ -201,7 +201,12 @@ public abstract class TileEntity implements KeyedObject {
|
|
}
|
|
});
|
|
if (this.world != null) {
|
|
- CrashReportSystemDetails.a(crashreportsystemdetails, this.position, this.getBlock(), this.v());
|
|
+ // Paper start - Prevent TileEntity and Entity crashes
|
|
+ Block block = this.getBlock();
|
|
+ if (block != null) {
|
|
+ CrashReportSystemDetails.a(crashreportsystemdetails, this.position, this.getBlock(), this.v());
|
|
+ }
|
|
+ // Paper end
|
|
crashreportsystemdetails.a("Actual block type", new CrashReportCallable() {
|
|
public String a() throws Exception {
|
|
int i = Block.getId(TileEntity.this.world.getType(TileEntity.this.position).getBlock());
|
|
diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java
|
|
index 31b765deaf..fd5f8102af 100644
|
|
--- a/src/main/java/net/minecraft/server/World.java
|
|
+++ b/src/main/java/net/minecraft/server/World.java
|
|
@@ -1449,10 +1449,12 @@ public abstract class World implements IBlockAccess {
|
|
entity.tickTimer.stopTiming(); // Paper
|
|
} catch (Throwable throwable1) {
|
|
entity.tickTimer.stopTiming();
|
|
- crashreport1 = CrashReport.a(throwable1, "Ticking entity");
|
|
- crashreportsystemdetails1 = crashreport1.a("Entity being ticked");
|
|
- entity.appendEntityCrashDetails(crashreportsystemdetails1);
|
|
- throw new ReportedException(crashreport1);
|
|
+ // Paper start - Prevent tile entity and entity crashes
|
|
+ System.err.println("Entity threw exception at " + entity.world.getWorld().getName() + ":" + entity.locX + "," + entity.locY + "," + entity.locZ);
|
|
+ throwable1.printStackTrace();
|
|
+ entity.dead = true;
|
|
+ continue;
|
|
+ // Paper end
|
|
}
|
|
}
|
|
|
|
@@ -1515,10 +1517,13 @@ public abstract class World implements IBlockAccess {
|
|
((ITickable) tileentity).e();
|
|
this.methodProfiler.b();
|
|
} catch (Throwable throwable2) {
|
|
- crashreport1 = CrashReport.a(throwable2, "Ticking block entity");
|
|
- crashreportsystemdetails1 = crashreport1.a("Block entity being ticked");
|
|
- tileentity.a(crashreportsystemdetails1);
|
|
- throw new ReportedException(crashreport1);
|
|
+ // Paper start - Prevent tile entity and entity crashes
|
|
+ System.err.println("TileEntity threw exception at " + tileentity.world.getWorld().getName() + ":" + tileentity.position.getX() + "," + tileentity.position.getY() + "," + tileentity.position.getZ());
|
|
+ throwable2.printStackTrace();
|
|
+ tilesThisCycle--;
|
|
+ this.tileEntityListTick.remove(tileTickPosition--);
|
|
+ continue;
|
|
+ // Paper end
|
|
}
|
|
// Spigot start
|
|
finally {
|
|
--
|
|
2.18.0
|
|
|