diff --git a/core/src/mindustry/ai/Pathfinder.java b/core/src/mindustry/ai/Pathfinder.java index 83a145e243..bffb9031da 100644 --- a/core/src/mindustry/ai/Pathfinder.java +++ b/core/src/mindustry/ai/Pathfinder.java @@ -230,8 +230,7 @@ public class Pathfinder implements Runnable{ for(Flowfield path : mainList){ if(path != null){ synchronized(path.targets){ - path.targets.clear(); - path.getPositions(path.targets); + path.updateTargetPositions(); } } } @@ -312,8 +311,7 @@ public class Pathfinder implements Runnable{ synchronized(path.targets){ //make sure the position actually changed if(!(path.targets.size == 1 && tmpArray.size == 1 && path.targets.first() == tmpArray.first())){ - path.targets.clear(); - path.getPositions(path.targets); + path.updateTargetPositions(); //queue an update queue.post(() -> updateTargets(path)); @@ -367,8 +365,7 @@ public class Pathfinder implements Runnable{ } private void preloadPath(Flowfield path){ - path.targets.clear(); - path.getPositions(path.targets); + path.updateTargetPositions(); registerPath(path); updateFrontier(path, -1); } @@ -493,10 +490,10 @@ public class Pathfinder implements Runnable{ protected Team team = Team.derelict; /** Function for calculating path cost. Set before using. */ protected PathCost cost = costTypes.get(costGround); - /** If true, this flow field needs updating. This flag is only set to false once the flow field finishes and the weights are copied over. */ - protected boolean dirty = false; /** Whether there are valid weights in the complete array. */ protected volatile boolean hasComplete; + /** If true, this flow field needs updating. This flag is only set to false once the flow field finishes and the weights are copied over. */ + protected boolean dirty = false; /** costs of getting to a specific tile */ public int[] weights; @@ -524,6 +521,11 @@ public class Pathfinder implements Runnable{ this.initialized = true; } + public void updateTargetPositions(){ + targets.clear(); + getPositions(targets); + } + protected boolean passable(int pos){ return cost.getCost(team.id, pathfinder.tiles[pos]) != impassable; } diff --git a/core/src/mindustry/graphics/InverseKinematics.java b/core/src/mindustry/graphics/InverseKinematics.java index 133eae78ff..016c3a47ec 100644 --- a/core/src/mindustry/graphics/InverseKinematics.java +++ b/core/src/mindustry/graphics/InverseKinematics.java @@ -12,6 +12,19 @@ public class InverseKinematics{ return solve(lengthA, lengthB, end, at1, result); } + /** + inputs: + + @param lengthA first line segment length + @param lengthB second line segment length + @param end length of the endpoint you want to reach + @param attractor direction you want the result to be closer to (since there are usually 2 solutions) + + output: + + @param result a point in-between (0, 0) and (end) such that (0, 0).dst(result) == lengthA and result.dst(end) == lengthB - or in basic terms, the position of a joint between (0, 0) and end where the two lengths of segments are lengthA and lengthB + @return whether IK succeeded (this can fail if end is too far, for example) + */ public static boolean solve(float lengthA, float lengthB, Vec2 end, Vec2 attractor, Vec2 result){ Vec2 axis = mat2[0].set(end).nor(); mat2[1].set(attractor).sub(temp2.set(axis).scl(attractor.dot(axis))).nor(); diff --git a/core/src/mindustry/net/BeControl.java b/core/src/mindustry/net/BeControl.java index ce713b05e7..668e687d7c 100644 --- a/core/src/mindustry/net/BeControl.java +++ b/core/src/mindustry/net/BeControl.java @@ -151,7 +151,7 @@ public class BeControl{ Log.info("&lcAutosaved."); netServer.kickAll(KickReason.serverRestarting); - Threads.sleep(32); + Threads.sleep(500); Log.info("&lcVersion downloaded, exiting. Note that if you are not using a auto-restart script, the server will not restart automatically."); //replace old file with new diff --git a/core/src/mindustry/net/NetConnection.java b/core/src/mindustry/net/NetConnection.java index 21f0eb64c0..9825bc0de4 100644 --- a/core/src/mindustry/net/NetConnection.java +++ b/core/src/mindustry/net/NetConnection.java @@ -1,5 +1,6 @@ package mindustry.net; +import arc.*; import arc.struct.*; import arc.util.*; import mindustry.entities.units.*; @@ -76,7 +77,12 @@ public abstract class NetConnection{ Call.kick(this, reason); } - close(); + if(uuid.startsWith("steam:")){ + //run with a 2-frame delay so there is time to send the kick packet, steam handles this weirdly + Core.app.post(() -> Core.app.post(this::close)); + }else{ + close(); + } netServer.admins.save(); kicked = true;