mirror of
https://github.com/PaperMC/Paper.git
synced 2024-12-30 16:19:03 +01:00
ce991b96eb
The modified patch prevents entity loading off the main thread when entities are initially loaded. However, the initial loading of an entity is not the only time the Entity#readAdditionalSaveData method is called. Commands like /data also invoke the method (through Entity#load) to update an entities data without completely re-creating it. This however breaks with the current patch, as the patch moves parts of the entity lookup for persistent anger deserialisation into the first tick of an entity (which obviously is only called once and hence not re-run when an already ticking entity is modified as laid out above). This change actively runs the now split logic for deserialisation again if the entity has already ticked its first tick. This way, initial deserialisation is still split into one off thread and the first tick parts, but following main thread deserialisations can happen completely inside Entity#readAdditionalSaveData is called.
73 lines
3.1 KiB
Diff
73 lines
3.1 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Owen1212055 <23108066+Owen1212055@users.noreply.github.com>
|
|
Date: Sun, 6 Mar 2022 11:09:09 -0500
|
|
Subject: [PATCH] Prevent entity loading causing async lookups
|
|
|
|
|
|
diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
|
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
|
--- a/src/main/java/net/minecraft/world/entity/Entity.java
|
|
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
|
|
@@ -0,0 +0,0 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource {
|
|
|
|
public void baseTick() {
|
|
this.level.getProfiler().push("entityBaseTick");
|
|
+ if (firstTick && this instanceof net.minecraft.world.entity.NeutralMob neutralMob) neutralMob.tickInitialPersistentAnger(level); // Paper - Update last hurt when ticking
|
|
this.feetBlockState = null;
|
|
if (this.isPassenger() && this.getVehicle().isRemoved()) {
|
|
this.stopRiding();
|
|
diff --git a/src/main/java/net/minecraft/world/entity/NeutralMob.java b/src/main/java/net/minecraft/world/entity/NeutralMob.java
|
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
|
--- a/src/main/java/net/minecraft/world/entity/NeutralMob.java
|
|
+++ b/src/main/java/net/minecraft/world/entity/NeutralMob.java
|
|
@@ -0,0 +0,0 @@ public interface NeutralMob {
|
|
UUID uuid = nbt.getUUID("AngryAt");
|
|
|
|
this.setPersistentAngerTarget(uuid);
|
|
- Entity entity = ((ServerLevel) world).getEntity(uuid);
|
|
-
|
|
- if (entity != null) {
|
|
- if (entity instanceof Mob) {
|
|
- this.setLastHurtByMob((Mob) entity);
|
|
- }
|
|
-
|
|
- if (entity.getType() == EntityType.PLAYER) {
|
|
- this.setLastHurtByPlayer((Player) entity);
|
|
- }
|
|
-
|
|
- }
|
|
+ // Paper - Moved diff to separate method
|
|
+ // If this entity already survived its first tick, e.g. is loaded and ticked in sync, actively
|
|
+ // tick the initial persistent anger.
|
|
+ // If not, let the first tick on the baseTick call the method later down the line.
|
|
+ if (this instanceof Entity entity && !entity.firstTick) this.tickInitialPersistentAnger(world);
|
|
}
|
|
}
|
|
}
|
|
@@ -0,0 +0,0 @@ public interface NeutralMob {
|
|
|
|
@Nullable
|
|
LivingEntity getTarget();
|
|
+
|
|
+ // Paper start - Update last hurt when ticking
|
|
+ default void tickInitialPersistentAnger(Level level) {
|
|
+ UUID target = getPersistentAngerTarget();
|
|
+ if (target == null) {
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ Entity entity = ((ServerLevel) level).getEntity(target);
|
|
+
|
|
+ if (entity != null) {
|
|
+ if (entity instanceof Mob) {
|
|
+ this.setLastHurtByMob((Mob) entity);
|
|
+ }
|
|
+
|
|
+ if (entity.getType() == EntityType.PLAYER) {
|
|
+ this.setLastHurtByPlayer((Player) entity);
|
|
+ }
|
|
+
|
|
+ }
|
|
+ }
|
|
+ // Paper end
|
|
}
|