From c6e0292d030fc57596f55ae3eddfbcf91dfdc331 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sat, 26 Jun 2021 09:52:03 -0400 Subject: [PATCH] Fixed clientside physics jitter --- core/src/mindustry/async/PhysicsProcess.java | 16 +++++++++++++--- gradle.properties | 2 +- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/core/src/mindustry/async/PhysicsProcess.java b/core/src/mindustry/async/PhysicsProcess.java index a7b17a5ffc..c8594a3ee2 100644 --- a/core/src/mindustry/async/PhysicsProcess.java +++ b/core/src/mindustry/async/PhysicsProcess.java @@ -24,6 +24,7 @@ public class PhysicsProcess implements AsyncProcess{ @Override public void begin(){ if(physics == null) return; + boolean local = !Vars.net.client(); //remove stale entities refs.removeAll(ref -> { @@ -62,6 +63,7 @@ public class PhysicsProcess implements AsyncProcess{ entity.isGrounded() ? layerGround : layerFlying; ref.x = entity.x; ref.y = entity.y; + ref.body.local = local || entity.isLocal(); } } @@ -156,6 +158,10 @@ public class PhysicsProcess implements AsyncProcess{ for(int i = 0; i < bodies.size; i++){ PhysicsBody body = bodies.items[i]; + + //for clients, the only body that collides is the local one; all other physics simulations are handled by the server. + if(!body.local) continue; + body.hitbox(rect); seq.size = 0; @@ -174,10 +180,14 @@ public class PhysicsProcess implements AsyncProcess{ float ms = body.mass + other.mass; float m1 = other.mass / ms, m2 = body.mass / ms; + //first body is always local due to guard check above body.x += vec.x * m1 / scl; body.y += vec.y * m1 / scl; - other.x -= vec.x * m2 / scl; - other.y -= vec.y * m2 / scl; + + if(other.local){ + other.x -= vec.x * m2 / scl; + other.y -= vec.y * m2 / scl; + } } } body.collided = true; @@ -187,7 +197,7 @@ public class PhysicsProcess implements AsyncProcess{ public static class PhysicsBody implements QuadTreeObject{ public float x, y, radius, mass; public int layer = 0; - public boolean collided = false; + public boolean collided = false, local = true; @Override public void hitbox(Rect out){ diff --git a/gradle.properties b/gradle.properties index 381b7069d4..9c7d434b68 100644 --- a/gradle.properties +++ b/gradle.properties @@ -10,4 +10,4 @@ kapt.include.compile.classpath=false kotlin.stdlib.default.dependency=false #needed for android compilation android.useAndroidX=true -archash=45d17a1ade5b67b1e663785592d25f833feeecaf +archash=1dd6c22dad3981525760254900e91634e7513714