From bce01012785766f860bc6364cf0e8f518ea06901 Mon Sep 17 00:00:00 2001 From: Anuken Date: Tue, 10 Jul 2018 21:04:14 -0400 Subject: [PATCH] Fixed some multiplayer crashes --- core/src/io/anuke/mindustry/core/NetClient.java | 2 +- core/src/io/anuke/mindustry/core/NetServer.java | 4 ++-- core/src/io/anuke/mindustry/entities/Player.java | 4 +++- core/src/io/anuke/mindustry/entities/Unit.java | 1 - .../io/anuke/mindustry/entities/traits/CarryTrait.java | 1 + core/src/io/anuke/mindustry/entities/units/BaseUnit.java | 4 +++- core/src/io/anuke/mindustry/io/TypeIO.java | 3 ++- .../world/blocks/production/GenericCrafter.java | 9 +-------- 8 files changed, 13 insertions(+), 15 deletions(-) diff --git a/core/src/io/anuke/mindustry/core/NetClient.java b/core/src/io/anuke/mindustry/core/NetClient.java index cee76a9eae..3b2110156b 100644 --- a/core/src/io/anuke/mindustry/core/NetClient.java +++ b/core/src/io/anuke/mindustry/core/NetClient.java @@ -250,7 +250,7 @@ public class NetClient extends Module { } @Remote(variants = Variant.one, priority = PacketPriority.low, unreliable = true) - public static void onSnapshot(byte[] chunk, int snapshotID, short chunkID, short totalLength, int base){ + public static void onSnapshot(byte[] chunk, int snapshotID, short chunkID, int totalLength, int base){ if(NetServer.showSnapshotSize) Log.info("Recieved snapshot: len {0} ID {1} chunkID {2} totalLength {3} base {4} client-base {5}", chunk.length, snapshotID, chunkID, totalLength, base, netClient.lastSnapshotBaseID); //skip snapshot IDs that have already been recieved OR snapshots that are too far in front diff --git a/core/src/io/anuke/mindustry/core/NetServer.java b/core/src/io/anuke/mindustry/core/NetServer.java index 22198bc7ae..2abffd3abf 100644 --- a/core/src/io/anuke/mindustry/core/NetServer.java +++ b/core/src/io/anuke/mindustry/core/NetServer.java @@ -449,7 +449,7 @@ public class NetServer extends Module{ /**Sends a raw byte[] snapshot to a client, splitting up into chunks when needed.*/ private static void sendSplitSnapshot(int userid, byte[] bytes, int snapshotID, int base){ if(bytes.length < maxSnapshotSize){ - Call.onSnapshot(userid, bytes, snapshotID, (short)0, (short)bytes.length, base); + Call.onSnapshot(userid, bytes, snapshotID, (short)0, bytes.length, base); }else{ int remaining = bytes.length; int offset = 0; @@ -464,7 +464,7 @@ public class NetServer extends Module{ }else { toSend = Arrays.copyOfRange(bytes, offset, Math.min(offset + maxSnapshotSize, bytes.length)); } - Call.onSnapshot(userid, toSend, snapshotID, (short)chunkid, (short)bytes.length, base); + Call.onSnapshot(userid, toSend, snapshotID, (short)chunkid, bytes.length, base); remaining -= used; offset += used; diff --git a/core/src/io/anuke/mindustry/entities/Player.java b/core/src/io/anuke/mindustry/entities/Player.java index 89aecc1120..4cc3b3cf79 100644 --- a/core/src/io/anuke/mindustry/entities/Player.java +++ b/core/src/io/anuke/mindustry/entities/Player.java @@ -473,7 +473,9 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra updateMech(); } - avoidOthers(8f); + if(isLocal) { + avoidOthers(8f); + } if(!isShooting()) { updateBuilding(this); diff --git a/core/src/io/anuke/mindustry/entities/Unit.java b/core/src/io/anuke/mindustry/entities/Unit.java index 016925e73f..60beccd8e8 100644 --- a/core/src/io/anuke/mindustry/entities/Unit.java +++ b/core/src/io/anuke/mindustry/entities/Unit.java @@ -199,7 +199,6 @@ public abstract class Unit extends DestructibleEntity implements SaveTrait, Targ } public void avoidOthers(float avoidRange){ - if(Net.client()) return; EntityPhysics.getNearby(getGroup(), x, y, avoidRange*2f, t -> { if(t == this || (t instanceof Unit && (((Unit) t).isDead() || (((Unit) t).isFlying() != isFlying()) || ((Unit) t).getCarrier() == this) || getCarrier() == t)) return; diff --git a/core/src/io/anuke/mindustry/entities/traits/CarryTrait.java b/core/src/io/anuke/mindustry/entities/traits/CarryTrait.java index 7a3e161ff9..a9150df1bd 100644 --- a/core/src/io/anuke/mindustry/entities/traits/CarryTrait.java +++ b/core/src/io/anuke/mindustry/entities/traits/CarryTrait.java @@ -41,6 +41,7 @@ public interface CarryTrait extends TeamTrait, SolidTrait, TargetTrait{ @Remote(called = Loc.both, targets = Loc.both, forward = true, in = In.entities) static void setCarryOf(Player player, CarryTrait trait, CarriableTrait unit){ + if(trait == null) return; if(player != null){ //when a server recieves this called from a player, set the carrier to the player. trait = player; } diff --git a/core/src/io/anuke/mindustry/entities/units/BaseUnit.java b/core/src/io/anuke/mindustry/entities/units/BaseUnit.java index 85004700cb..c76d49cbeb 100644 --- a/core/src/io/anuke/mindustry/entities/units/BaseUnit.java +++ b/core/src/io/anuke/mindustry/entities/units/BaseUnit.java @@ -283,7 +283,9 @@ public abstract class BaseUnit extends Unit implements ShooterTrait{ return; } - avoidOthers(8f); + if(!Net.client()){ + avoidOthers(8f); + } if(squad != null){ squad.update(); diff --git a/core/src/io/anuke/mindustry/io/TypeIO.java b/core/src/io/anuke/mindustry/io/TypeIO.java index ec7bab7a8c..152a72bc20 100644 --- a/core/src/io/anuke/mindustry/io/TypeIO.java +++ b/core/src/io/anuke/mindustry/io/TypeIO.java @@ -106,6 +106,7 @@ public class TypeIO { public static void writeCarry(ByteBuffer buffer, CarryTrait unit){ if(unit == null){ buffer.put((byte)-1); + return; } buffer.put((byte)unit.getGroup().getID()); buffer.putInt(unit.getID()); @@ -123,7 +124,7 @@ public class TypeIO { @WriteClass(BaseUnit.class) public static void writeBaseUnit(ByteBuffer buffer, BaseUnit unit){ - buffer.put((byte)unit.getGroup().getID()); + buffer.put((byte)unitGroups[unit.getTeam().ordinal()].getID()); buffer.putInt(unit.getID()); } diff --git a/core/src/io/anuke/mindustry/world/blocks/production/GenericCrafter.java b/core/src/io/anuke/mindustry/world/blocks/production/GenericCrafter.java index 29393b4c8c..8a6a67c2fd 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/GenericCrafter.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/GenericCrafter.java @@ -27,16 +27,9 @@ import static io.anuke.mindustry.Vars.headless; public class GenericCrafter extends Block{ protected final int timerDump = timers++; - - /**Can be null. If you use this, make sure to set hasItems to true!*/ - //protected ItemStack inputItem; - /**Can be null. If you use this, make sure to set hasLiquids to true!*/ - //protected Liquid inputLiquid; - /**Required.*/ + protected Item output; protected float craftTime = 80; - //protected float powerUse; - //protected float liquidUse; protected Effect craftEffect = BlockFx.purify; protected Effect updateEffect = Fx.none; protected float updateEffectChance = 0.04f;