diff --git a/annotations/src/main/java/mindustry/annotations/remote/CallGenerator.java b/annotations/src/main/java/mindustry/annotations/remote/CallGenerator.java index 00ac5fabac..48a17f2e86 100644 --- a/annotations/src/main/java/mindustry/annotations/remote/CallGenerator.java +++ b/annotations/src/main/java/mindustry/annotations/remote/CallGenerator.java @@ -30,6 +30,9 @@ public class CallGenerator{ TypeSpec.Builder packet = TypeSpec.classBuilder(ent.packetClassName) .addModifiers(Modifier.PUBLIC); + //temporary data to deserialize later + packet.addField(byte[].class, "DATA", Modifier.PRIVATE); + packet.superclass(tname("mindustry.net.Packet")); //return the correct priority @@ -41,8 +44,8 @@ public class CallGenerator{ } //implement read & write methods - packet.addMethod(makeWriter(ent, serializer)); - packet.addMethod(makeReader(ent, serializer)); + makeWriter(packet, ent, serializer); + makeReader(packet, ent, serializer); //generate handlers if(ent.where.isClient){ @@ -87,7 +90,7 @@ public class CallGenerator{ JavaFile.builder(packageName, spec).build().writeTo(BaseProcessor.filer); } - private static MethodSpec makeWriter(MethodEntry ent, ClassSerializer serializer){ + private static void makeWriter(TypeSpec.Builder typespec, MethodEntry ent, ClassSerializer serializer){ MethodSpec.Builder builder = MethodSpec.methodBuilder("write") .addParameter(Writes.class, "WRITE") .addModifiers(Modifier.PUBLIC).addAnnotation(Override.class); @@ -132,13 +135,27 @@ public class CallGenerator{ } } - return builder.build(); + typespec.addMethod(builder.build()); } - private static MethodSpec makeReader(MethodEntry ent, ClassSerializer serializer){ - MethodSpec.Builder builder = MethodSpec.methodBuilder("read") + private static void makeReader(TypeSpec.Builder typespec, MethodEntry ent, ClassSerializer serializer){ + MethodSpec.Builder readbuilder = MethodSpec.methodBuilder("read") .addParameter(Reads.class, "READ") + .addParameter(int.class, "LENGTH") .addModifiers(Modifier.PUBLIC).addAnnotation(Override.class); + + //read only into temporary data buffer + readbuilder.addStatement("DATA = READ.b(LENGTH)"); + + typespec.addMethod(readbuilder.build()); + + MethodSpec.Builder builder = MethodSpec.methodBuilder("check") + .addModifiers(Modifier.PRIVATE); + + //make sure data is present, begin reading it if so + builder.beginControlFlow("if(DATA != null)"); + builder.addStatement("BAIS.setBytes(DATA)"); + Seq params = ent.element.params(); //go through each parameter @@ -185,7 +202,9 @@ public class CallGenerator{ } } - return builder.build(); + builder.endControlFlow(); + + typespec.addMethod(builder.build()); } /** Creates a specific variant for a method entry. */ @@ -332,6 +351,8 @@ public class CallGenerator{ .addAnnotation(Override.class) .returns(void.class); + builder.addStatement("check()"); + Smethod elem = ent.element; Seq params = elem.params(); diff --git a/core/src/mindustry/net/ArcNetProvider.java b/core/src/mindustry/net/ArcNetProvider.java index a18c8d57de..a81376d189 100644 --- a/core/src/mindustry/net/ArcNetProvider.java +++ b/core/src/mindustry/net/ArcNetProvider.java @@ -385,7 +385,6 @@ public class ArcNetProvider implements NetProvider{ return readFramework(byteBuffer); }else{ //read length int, followed by compressed lz4 data - //TODO not thread safe!!! Packet packet = Net.newPacket(id); var buffer = decompressBuffer.get(); int length = byteBuffer.getShort() & 0xffff; @@ -396,7 +395,7 @@ public class ArcNetProvider implements NetProvider{ buffer.position(0).limit(length); buffer.put(byteBuffer.array(), byteBuffer.position(), length); buffer.position(0); - packet.read(reads.get()); + packet.read(reads.get(), length); //move read packets forward byteBuffer.position(byteBuffer.position() + buffer.position()); }else{ @@ -405,7 +404,7 @@ public class ArcNetProvider implements NetProvider{ buffer.position(0); buffer.limit(length); - packet.read(reads.get()); + packet.read(reads.get(), length); //move buffer forward based on bytes read by decompressor byteBuffer.position(byteBuffer.position() + read); } diff --git a/core/src/mindustry/net/Packet.java b/core/src/mindustry/net/Packet.java index a6200547cc..843c2e78eb 100644 --- a/core/src/mindustry/net/Packet.java +++ b/core/src/mindustry/net/Packet.java @@ -2,7 +2,17 @@ package mindustry.net; import arc.util.io.*; +import java.io.*; + public abstract class Packet{ + //internally used by generated code + //TODO intermediate buffers should ONLY be needed for: + //readObject + //readBuilding + //readUnit (possibly) + protected static final ReusableByteInStream BAIS = new ReusableByteInStream(); + protected static final Reads READ = new Reads(new DataInputStream(BAIS)); + //these are constants because I don't want to bother making an enum to mirror the annotation enum /** Does not get handled unless client is connected. */ @@ -15,6 +25,10 @@ public abstract class Packet{ public void read(Reads read){} public void write(Writes write){} + public void read(Reads read, int length){ + read(read); + } + public int getPriority(){ return priorityNormal; } diff --git a/core/src/mindustry/net/Packets.java b/core/src/mindustry/net/Packets.java index a1cd13670c..10e607ec50 100644 --- a/core/src/mindustry/net/Packets.java +++ b/core/src/mindustry/net/Packets.java @@ -2,7 +2,6 @@ package mindustry.net; import arc.*; import arc.struct.*; -import arc.util.*; import arc.util.io.*; import arc.util.serialization.*; import mindustry.core.*; @@ -131,8 +130,6 @@ public class Packets{ crc.update(Base64Coder.decode(uuid), 0, b.length); buffer.l(crc.getValue()); - Log.info("CRC value sent: @", Long.toHexString(crc.getValue())); - buffer.b(mobile ? (byte)1 : 0); buffer.i(color); buffer.b((byte)mods.size);