1
0
mirror of https://github.com/Anuken/Mindustry.git synced 2024-10-26 09:13:28 +03:00

Fixed crash with modded unit classes

This commit is contained in:
Anuken 2023-01-12 09:35:48 -05:00
parent 3287479ee3
commit 0dc2dc9b08

View File

@ -42,6 +42,7 @@ public class EntityProcess extends BaseProcessor{
Seq<Selement> allDefs = new Seq<>();
Seq<Stype> allInterfaces = new Seq<>();
Seq<TypeSpec.Builder> baseClasses = new Seq<>();
ObjectSet<TypeSpec.Builder> baseClassIndexers = new ObjectSet<>();
ClassSerializer serializer;
{
@ -266,6 +267,8 @@ public class EntityProcess extends BaseProcessor{
//get base class type name for extension
Stype baseClassType = baseClasses.any() ? baseClasses.first() : null;
@Nullable TypeName baseClass = baseClasses.any() ? tname(packageName + "." + baseName(baseClassType)) : null;
@Nullable TypeSpec.Builder baseClassBuilder = baseClassType == null ? null : this.baseClasses.find(b -> Reflect.<String>get(b, "name").equals(baseName(baseClassType)));
boolean addIndexToBase = baseClassBuilder != null && baseClassIndexers.add(baseClassBuilder);
//whether the main class is the base itself
boolean typeIsBase = baseClassType != null && type.has(Component.class) && type.annotation(Component.class).base();
@ -400,11 +403,15 @@ public class EntityProcess extends BaseProcessor{
//entities with no sync comp and no serialization gen no code
boolean hasIO = ann.genio() && (components.contains(s -> s.name().contains("Sync")) || ann.serialize());
//implement indexable interfaces.
for(GroupDefinition def : groups){
builder.addSuperinterface(tname(packageName + ".IndexableEntity__" + def.name));
builder.addMethod(MethodSpec.methodBuilder("setIndex__" + def.name).addParameter(int.class, "index").addModifiers(Modifier.PUBLIC).addAnnotation(Override.class)
.addCode("index__$L = index;", def.name).build());
TypeSpec.Builder indexBuilder = baseClassBuilder == null ? builder : baseClassBuilder;
if(baseClassBuilder == null || addIndexToBase){
//implement indexable interfaces.
for(GroupDefinition def : groups){
indexBuilder.addSuperinterface(tname(packageName + ".IndexableEntity__" + def.name));
indexBuilder.addMethod(MethodSpec.methodBuilder("setIndex__" + def.name).addParameter(int.class, "index").addModifiers(Modifier.PUBLIC).addAnnotation(Override.class)
.addCode("index__$L = index;", def.name).build());
}
}
//add all methods from components
@ -598,9 +605,12 @@ public class EntityProcess extends BaseProcessor{
skipDeprecated(builder);
if(!legacy){
//add group index int variables
for(GroupDefinition def : groups){
builder.addField(FieldSpec.builder(int.class, "index__" + def.name, Modifier.PROTECTED).initializer("-1").build());
TypeSpec.Builder fieldBuilder = baseClassBuilder != null ? baseClassBuilder : builder;
if(addIndexToBase || baseClassBuilder == null){
//add group index int variables
for(GroupDefinition def : groups){
fieldBuilder.addField(FieldSpec.builder(int.class, "index__" + def.name, Modifier.PROTECTED, Modifier.TRANSIENT).initializer("-1").build());
}
}
}