From ea6f375076b66ff1b9303f7d36e3cfb89257e666 Mon Sep 17 00:00:00 2001 From: jchung01 Date: Mon, 5 Feb 2024 02:21:24 -0800 Subject: [PATCH] Blacklist irregular entities from desync fix Ignore entities that do not update prevPos. Assume these are entities that don't call Entity#onUpdate(). Related: #262 --- .../bugfixes/entities/desync/IPrevMotion.java | 6 ++++++ .../bugfixes/entities/desync/UTEntityDesync.java | 2 +- .../bugfixes/entities/desync/mixin/UTEntityMixin.java | 9 +++++++++ 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/main/java/mod/acgaming/universaltweaks/bugfixes/entities/desync/IPrevMotion.java b/src/main/java/mod/acgaming/universaltweaks/bugfixes/entities/desync/IPrevMotion.java index cb2ef067..e895eb1e 100644 --- a/src/main/java/mod/acgaming/universaltweaks/bugfixes/entities/desync/IPrevMotion.java +++ b/src/main/java/mod/acgaming/universaltweaks/bugfixes/entities/desync/IPrevMotion.java @@ -14,4 +14,10 @@ public interface IPrevMotion double getPrevMotionZ(); void setPrevMotionZ(double prevMotionZ); + + /** + * Checks if this entity has ever called super.onUpdate(). This should adequately determine if it should be ignored by the desync fix. + * @return true if the implementing class calls super.onUpdate() + */ + boolean hasSuperUpdate(); } \ No newline at end of file diff --git a/src/main/java/mod/acgaming/universaltweaks/bugfixes/entities/desync/UTEntityDesync.java b/src/main/java/mod/acgaming/universaltweaks/bugfixes/entities/desync/UTEntityDesync.java index cb1244de..dc4e34ad 100644 --- a/src/main/java/mod/acgaming/universaltweaks/bugfixes/entities/desync/UTEntityDesync.java +++ b/src/main/java/mod/acgaming/universaltweaks/bugfixes/entities/desync/UTEntityDesync.java @@ -36,6 +36,6 @@ public static void initBlacklistedEntityEntries() public static boolean isBlacklisted(Entity entity) { - return blacklistedEntityEntries.contains(EntityRegistry.getEntry(entity.getClass())); + return blacklistedEntityEntries.contains(EntityRegistry.getEntry(entity.getClass())) || !(((IPrevMotion) entity).hasSuperUpdate()); } } \ No newline at end of file diff --git a/src/main/java/mod/acgaming/universaltweaks/bugfixes/entities/desync/mixin/UTEntityMixin.java b/src/main/java/mod/acgaming/universaltweaks/bugfixes/entities/desync/mixin/UTEntityMixin.java index d738066c..0e0b38a6 100644 --- a/src/main/java/mod/acgaming/universaltweaks/bugfixes/entities/desync/mixin/UTEntityMixin.java +++ b/src/main/java/mod/acgaming/universaltweaks/bugfixes/entities/desync/mixin/UTEntityMixin.java @@ -27,11 +27,14 @@ public class UTEntityMixin implements IPrevMotion private double prevMotionY; @Unique private double prevMotionZ; + @Unique + private boolean universalTweaks$superUpdate = false; @Inject(method = "onUpdate", at = @At("HEAD")) public void utOnUpdate(CallbackInfo info) { if (UTEntityDesync.isBlacklisted(((Entity) (Object) this))) return; + if (!universalTweaks$superUpdate) universalTweaks$superUpdate = true; prevMotionX = motionX; prevMotionY = motionY; prevMotionZ = motionZ; @@ -72,4 +75,10 @@ public void setPrevMotionZ(double prevMotionZ) { this.prevMotionZ = prevMotionZ; } + + @Override + public boolean hasSuperUpdate() + { + return universalTweaks$superUpdate; + } } \ No newline at end of file