From 423f5f16bb731c4d9fdb28c4acfb389899fd6a40 Mon Sep 17 00:00:00 2001 From: Anuken Date: Wed, 4 Jul 2018 12:31:09 -0400 Subject: [PATCH] Fixed extremely glitchy player pickup --- .../io/anuke/mindustry/core/NetServer.java | 2 +- .../src/io/anuke/mindustry/core/Renderer.java | 11 ++++++-- .../io/anuke/mindustry/entities/Player.java | 25 ++++++++++++------- .../src/io/anuke/mindustry/entities/Unit.java | 2 +- 4 files changed, 27 insertions(+), 13 deletions(-) diff --git a/core/src/io/anuke/mindustry/core/NetServer.java b/core/src/io/anuke/mindustry/core/NetServer.java index 7eeb697bc5..829c71ad59 100644 --- a/core/src/io/anuke/mindustry/core/NetServer.java +++ b/core/src/io/anuke/mindustry/core/NetServer.java @@ -175,7 +175,7 @@ public class NetServer extends Module{ NetConnection connection = Net.getConnection(id); if(player == null || connection == null || packet.snapid < connection.lastRecievedClientSnapshot) return; - boolean verifyPosition = !player.isDead() && !debug && headless && !player.mech.flying; + boolean verifyPosition = !player.isDead() && !debug && headless && !player.mech.flying && player.getCarrier() == null; if(connection.lastRecievedClientTime == 0) connection.lastRecievedClientTime = TimeUtils.millis() - 16; diff --git a/core/src/io/anuke/mindustry/core/Renderer.java b/core/src/io/anuke/mindustry/core/Renderer.java index 5010f0d959..f8d3daa906 100644 --- a/core/src/io/anuke/mindustry/core/Renderer.java +++ b/core/src/io/anuke/mindustry/core/Renderer.java @@ -306,11 +306,18 @@ public class Renderer extends RendererModule{ } } + //TODO extremely hacky + if(t instanceof Player && ((Player) t).getCarry() != null && ((Player) t).getCarry() instanceof Player && ((Player) ((Player) t).getCarry()).isLocal){ + ((Player) t).x = ((Player) t).getCarry().getX(); + ((Player) t).y = ((Player) t).getCarry().getY(); + } + drawer.accept(t); + t.setX(lastx); + t.setY(lasty); + if(threads.doInterpolate() && threads.isEnabled()) { - t.setX(lastx); - t.setY(lasty); if (t instanceof SolidTrait) { ((SolidTrait) t).setRotation(lastrot); diff --git a/core/src/io/anuke/mindustry/entities/Player.java b/core/src/io/anuke/mindustry/entities/Player.java index f4d0cc5161..5ff4375ee7 100644 --- a/core/src/io/anuke/mindustry/entities/Player.java +++ b/core/src/io/anuke/mindustry/entities/Player.java @@ -30,10 +30,7 @@ import io.anuke.ucore.entities.EntityGroup; import io.anuke.ucore.entities.trait.SolidTrait; import io.anuke.ucore.graphics.Draw; import io.anuke.ucore.graphics.Lines; -import io.anuke.ucore.util.Angles; -import io.anuke.ucore.util.Mathf; -import io.anuke.ucore.util.ThreadQueue; -import io.anuke.ucore.util.Timer; +import io.anuke.ucore.util.*; import java.io.DataInput; import java.io.DataOutput; @@ -451,6 +448,11 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra updateBuilding(this); //building happens even with non-locals status.update(this); //status effect updating also happens with non locals for effect purposes + if(getCarrier() != null){ + x = getCarrier().getX(); + y = getCarrier().getY(); + } + if(Net.server()){ updateShooting(); //server simulates player shooting } @@ -532,11 +534,16 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra movement.limit(speed); - velocity.add(movement); - - float prex = x, prey = y; - updateVelocityStatus(mech.drag, 10f); - moved = distanceTo(prex, prey) > 0.01f; + if(getCarrier() == null){ + velocity.add(movement); + float prex = x, prey = y; + updateVelocityStatus(mech.drag, 10f); + moved = distanceTo(prex, prey) > 0.01f; + }else{ + velocity.setZero(); + x = Mathf.lerpDelta(x, getCarrier().getX(), 0.1f); + y = Mathf.lerpDelta(y, getCarrier().getY(), 0.1f); + } if(!isShooting()){ if(!movement.isZero()) { diff --git a/core/src/io/anuke/mindustry/entities/Unit.java b/core/src/io/anuke/mindustry/entities/Unit.java index aef424e20b..e43860ee8b 100644 --- a/core/src/io/anuke/mindustry/entities/Unit.java +++ b/core/src/io/anuke/mindustry/entities/Unit.java @@ -196,7 +196,7 @@ public abstract class Unit extends DestructibleEntity implements SaveTrait, Targ public void avoidOthers(float avoidRange){ EntityPhysics.getNearby(getGroup(), x, y, avoidRange*2f, t -> { - if(t == this || (t instanceof Unit && (((Unit) t).isDead() || (((Unit) t).isFlying() != isFlying())))) return; + if(t == this || (t instanceof Unit && (((Unit) t).isDead() || (((Unit) t).isFlying() != isFlying()) || ((Unit) t).getCarrier() == this) || getCarrier() == t)) return; float dst = distanceTo(t); if(dst > avoidRange) return; velocity.add(moveVector.set(x, y).sub(t.getX(), t.getY()).setLength(1f * (1f - (dst / avoidRange))));