(FINAL 1.16.2) Improve Entity Activation Range passenger behavior

Previously, Entity Activation Range only applied to the root entity of a vehicle chain.
If that vehicle is active, every entity as it's passenger would then tick.

This creates scenarios where EAR does not apply your desired ranges to passengers.
Additionally, any entity that was a passenger never had its inactiveTick method called
when the parent was inactive, creating behavioral desyncs.

This could of been a source of many villager issues when those villagers were in minecarts
as players commonly do.

Now we will process passengers checking their activation state independently of their vehicle
and if they are inactive, call their inactiveTick() method to ensure state remains consistent.

This also helps improve any desync issues with entity position of passengers too.

This also removes immunity for passenger/vehicles, so it should improve performance
of these minecart villagers too for EAR.
This commit is contained in:
Aikar 2020-09-10 18:09:10 -04:00
parent 09d97cf54e
commit 2b164910c8

View File

@ -56,6 +56,14 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
vec3d = this.a(vec3d, enummovetype);
Vec3D vec3d1 = this.g(vec3d);
@@ -0,0 +0,0 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke
}
}
+ public void syncPositionOf(Entity entity) { k(entity); } // Paper - OBFHELPER
public void k(Entity entity) {
this.a(entity, Entity::setPosition);
}
@@ -0,0 +0,0 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke
return this.ae;
}
@ -342,6 +350,96 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
public boolean populating;
public final org.spigotmc.SpigotWorldConfig spigotConfig; // Spigot
diff --git a/src/main/java/net/minecraft/server/WorldServer.java b/src/main/java/net/minecraft/server/WorldServer.java
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
--- a/src/main/java/net/minecraft/server/WorldServer.java
+++ b/src/main/java/net/minecraft/server/WorldServer.java
@@ -0,0 +0,0 @@ public class WorldServer extends World implements GeneratorAccessSeed {
++TimingHistory.entityTicks; // Paper - timings
// Spigot start
co.aikar.timings.Timing timer; // Paper
- if (!org.spigotmc.ActivationRange.checkIfActive(entity)) {
+ /*if (!org.spigotmc.ActivationRange.checkIfActive(entity)) { // Paper - comment out - EAR 2, reimplement below
entity.ticksLived++;
timer = entity.getEntityType().inactiveTickTimer.startTiming(); try { // Paper - timings
entity.inactiveTick();
} finally { timer.stopTiming(); } // Paper
return;
- }
+ }*/ // Paper - comment out EAR 2
// Spigot end
// Paper start- timings
- TimingHistory.activatedEntityTicks++;
- timer = entity.getVehicle() != null ? entity.getEntityType().passengerTickTimer.startTiming() : entity.getEntityType().tickTimer.startTiming();
+ final boolean isActive = org.spigotmc.ActivationRange.checkIfActive(entity);
+ timer = isActive ? entity.getEntityType().tickTimer.startTiming() : entity.getEntityType().inactiveTickTimer.startTiming(); // Paper
try {
// Paper end - timings
entity.g(entity.locX(), entity.locY(), entity.locZ());
@@ -0,0 +0,0 @@ public class WorldServer extends World implements GeneratorAccessSeed {
return IRegistry.ENTITY_TYPE.getKey(entity.getEntityType()).toString();
});
gameprofilerfiller.c("tickNonPassenger");
+ if (isActive) { // Paper - EAR 2
+ TimingHistory.activatedEntityTicks++; // Paper
entity.tick();
entity.postTick(); // CraftBukkit
+ } else { entity.inactiveTick(); } // Paper - EAR 2
gameprofilerfiller.exit();
}
this.chunkCheck(entity);
+ } finally { timer.stopTiming(); } // Paper - timings
if (entity.inChunk) {
Iterator iterator = entity.getPassengers().iterator();
@@ -0,0 +0,0 @@ public class WorldServer extends World implements GeneratorAccessSeed {
this.a(entity, entity1);
}
}
- } finally { timer.stopTiming(); } // Paper - timings
+ //} finally { timer.stopTiming(); } // Paper - timings - move up
}
}
@@ -0,0 +0,0 @@ public class WorldServer extends World implements GeneratorAccessSeed {
public void a(Entity entity, Entity entity1) {
if (!entity1.dead && entity1.getVehicle() == entity) {
if (entity1 instanceof EntityHuman || this.getChunkProvider().a(entity1)) {
+ // Paper - EAR 2
+ final boolean isActive = org.spigotmc.ActivationRange.checkIfActive(entity1);
+ co.aikar.timings.Timing timer = isActive ? entity1.getEntityType().passengerTickTimer.startTiming() : entity1.getEntityType().passengerInactiveTickTimer.startTiming(); // Paper
+ try {
+ // Paper end
entity1.g(entity1.locX(), entity1.locY(), entity1.locZ());
entity1.lastYaw = entity1.yaw;
entity1.lastPitch = entity1.pitch;
@@ -0,0 +0,0 @@ public class WorldServer extends World implements GeneratorAccessSeed {
return IRegistry.ENTITY_TYPE.getKey(entity1.getEntityType()).toString();
});
gameprofilerfiller.c("tickPassenger");
+ // Paper start - EAR 2
+ if (isActive) {
entity1.passengerTick();
+ } else {
+ entity1.setMot(Vec3D.a);
+ entity1.inactiveTick();
+ // copied from inside of if (isPassenger()) of passengerTick, but that ifPassenger is unnecessary
+ entity.syncPositionOf(entity1);
+ }
+ // Paper end - EAR 2
gameprofilerfiller.exit();
}
@@ -0,0 +0,0 @@ public class WorldServer extends World implements GeneratorAccessSeed {
this.a(entity1, entity2);
}
- }
+ } } finally { timer.stopTiming(); } // Paper - EAR2 timings
}
} else {
diff --git a/src/main/java/org/spigotmc/ActivationRange.java b/src/main/java/org/spigotmc/ActivationRange.java
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
--- a/src/main/java/org/spigotmc/ActivationRange.java
@ -589,7 +687,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
if ( !( entity instanceof EntityArrow ) )
{
- if ( !entity.isOnGround() || !entity.passengers.isEmpty() || entity.isPassenger() )
+ if ( (!entity.isOnGround() && !(entity instanceof EntityFlying)) || !entity.passengers.isEmpty() || entity.isPassenger() )
+ if ( (!entity.isOnGround() && !(entity instanceof EntityFlying)) ) // Paper - remove passengers logic
{
- return true;
+ return 10; // Paper