More codegen fixes, fixed (one) multiplayer connect crash
This commit is contained in:
@@ -15,9 +15,8 @@ public class Annotations {
|
||||
@Target(ElementType.METHOD)
|
||||
@Retention(RetentionPolicy.CLASS)
|
||||
public @interface Remote {
|
||||
/**Whether this method can be invoked from remote clients.*/
|
||||
boolean client() default false;
|
||||
/**Whether this method can be invoked from the remote server.*/
|
||||
/**If true, this method can only be invoked on clients from the server.
|
||||
* If false, this method can only be invoked on servers from a client.*/
|
||||
boolean server() default true;
|
||||
/**Whether a client-specific method is generated that accepts a connecton ID and sends to only one player. Default is false.
|
||||
* Only affects client methods.*/
|
||||
|
||||
@@ -9,7 +9,7 @@ public class MethodEntry {
|
||||
/**Fully qualified target method to call.*/
|
||||
public final String targetMethod;
|
||||
/**Whether this method can be called on a client/server.*/
|
||||
public final boolean client, server;
|
||||
public final boolean server;
|
||||
/**Whether an additional 'one' and 'all' method variant is generated. At least one of these must be true.
|
||||
* Only applicable to client (server-invoked) methods.*/
|
||||
public final boolean allVariant, oneVariant;
|
||||
@@ -22,11 +22,10 @@ public class MethodEntry {
|
||||
/**The element method associated with this entry.*/
|
||||
public final ExecutableElement element;
|
||||
|
||||
public MethodEntry(String className, String targetMethod, boolean client, boolean server,
|
||||
public MethodEntry(String className, String targetMethod, boolean server,
|
||||
boolean allVariant, boolean oneVariant, boolean local, boolean unreliable, int id, ExecutableElement element) {
|
||||
this.className = className;
|
||||
this.targetMethod = targetMethod;
|
||||
this.client = client;
|
||||
this.server = server;
|
||||
this.allVariant = allVariant;
|
||||
this.oneVariant = oneVariant;
|
||||
|
||||
@@ -96,13 +96,8 @@ public class RemoteMethodAnnotationProcessor extends AbstractProcessor {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (annotation.server() && annotation.client()) {
|
||||
Utils.messager.printMessage(Kind.ERROR, "A method cannot be client and server simulatenously!", element);
|
||||
return false;
|
||||
}
|
||||
|
||||
//create and add entry
|
||||
MethodEntry method = new MethodEntry(entry.name, Utils.getMethodName(element), annotation.client(), annotation.server(),
|
||||
MethodEntry method = new MethodEntry(entry.name, Utils.getMethodName(element), annotation.server(),
|
||||
annotation.all(), annotation.one(), annotation.local(), annotation.unreliable(), lastMethodID ++, (ExecutableElement)element);
|
||||
|
||||
entry.methods.add(method);
|
||||
@@ -114,7 +109,7 @@ public class RemoteMethodAnnotationProcessor extends AbstractProcessor {
|
||||
RemoteWriteGenerator writegen = new RemoteWriteGenerator(serializers);
|
||||
|
||||
//generate server readers
|
||||
readgen.generateFor(methods.stream().filter(method -> method.client).collect(Collectors.toList()), readServerName, packageName, true);
|
||||
readgen.generateFor(methods.stream().filter(method -> !method.server).collect(Collectors.toList()), readServerName, packageName, true);
|
||||
//generate client readers
|
||||
readgen.generateFor(methods.stream().filter(method -> method.server).collect(Collectors.toList()), readClientName, packageName, false);
|
||||
|
||||
|
||||
@@ -70,7 +70,7 @@ public class RemoteReadGenerator {
|
||||
for(int i = 0; i < entry.element.getParameters().size(); i ++){
|
||||
VariableElement var = entry.element.getParameters().get(i);
|
||||
|
||||
if(!(entry.client && i == 0)) { //if client, skip first parameter since it's always of type player and doesn't need to be read
|
||||
if(entry.server || i != 0) { //if client, skip first parameter since it's always of type player and doesn't need to be read
|
||||
//full type name of parameter
|
||||
//TODO check if the result is correct
|
||||
String typeName = var.asType().toString();
|
||||
|
||||
@@ -62,7 +62,7 @@ public class RemoteWriteGenerator {
|
||||
.returns(void.class);
|
||||
|
||||
//validate client methods to make sure
|
||||
if(methodEntry.client){
|
||||
if(!methodEntry.server){
|
||||
if(elem.getParameters().isEmpty()){
|
||||
Utils.messager.printMessage(Kind.ERROR, "Client invoke methods must have a first parameter of type Player.", elem);
|
||||
return;
|
||||
@@ -79,13 +79,8 @@ public class RemoteWriteGenerator {
|
||||
method.addParameter(int.class, "playerClientID");
|
||||
}
|
||||
|
||||
//add all other parameters to method
|
||||
for(VariableElement var : elem.getParameters()){
|
||||
method.addParameter(TypeName.get(var.asType()), var.getSimpleName().toString());
|
||||
}
|
||||
|
||||
//call local method if applicable
|
||||
if(methodEntry.local){
|
||||
if(methodEntry.local && methodEntry.server){
|
||||
//concatenate parameters
|
||||
int index = 0;
|
||||
StringBuilder results = new StringBuilder();
|
||||
@@ -101,7 +96,7 @@ public class RemoteWriteGenerator {
|
||||
}
|
||||
|
||||
//start control flow to check if it's actually client/server so no netcode is called
|
||||
method.beginControlFlow("if(io.anuke.mindustry.net.Net." + (methodEntry.client ? "client" : "server")+"())");
|
||||
method.beginControlFlow("if(io.anuke.mindustry.net.Net." + (!methodEntry.server ? "client" : "server")+"())");
|
||||
|
||||
//add statement to create packet from pool
|
||||
method.addStatement("$1N packet = $2N.obtain($1N.class)", "io.anuke.mindustry.net.Packets.InvokePacket", "com.badlogic.gdx.utils.Pools");
|
||||
@@ -110,7 +105,17 @@ public class RemoteWriteGenerator {
|
||||
//rewind buffer
|
||||
method.addStatement("TEMP_BUFFER.position(0)");
|
||||
|
||||
for(VariableElement var : elem.getParameters()){
|
||||
for(int i = 0; i < elem.getParameters().size(); i ++){
|
||||
//first argument is skipped as it is always the player caller
|
||||
if(!methodEntry.server && i == 0){
|
||||
continue;
|
||||
}
|
||||
|
||||
VariableElement var = elem.getParameters().get(i);
|
||||
|
||||
//add parameter to method
|
||||
method.addParameter(TypeName.get(var.asType()), var.getSimpleName().toString());
|
||||
|
||||
//name of parameter
|
||||
String varName = var.getSimpleName().toString();
|
||||
//name of parameter type
|
||||
|
||||
Reference in New Issue
Block a user