From fbadb9f4aac30edb303d237decd4708ba840485d Mon Sep 17 00:00:00 2001 From: Anuken Date: Mon, 10 Feb 2020 09:22:19 -0500 Subject: [PATCH] Group collisions --- .../mindustry/annotations/Annotations.java | 2 +- .../annotations/impl/EntityProcess.java | 23 +++++++++++++------ core/src/mindustry/entities/AllDefs.java | 15 ++++++++---- core/src/mindustry/entities/EntityGroup.java | 4 ++++ 4 files changed, 31 insertions(+), 13 deletions(-) diff --git a/annotations/src/main/java/mindustry/annotations/Annotations.java b/annotations/src/main/java/mindustry/annotations/Annotations.java index 0c9ddc7c4e..7bfbf25b9f 100644 --- a/annotations/src/main/java/mindustry/annotations/Annotations.java +++ b/annotations/src/main/java/mindustry/annotations/Annotations.java @@ -56,10 +56,10 @@ public class Annotations{ } /** Creates a group that only examines entities that have all the components listed. */ - @Target(ElementType.METHOD) @Retention(RetentionPolicy.SOURCE) public @interface GroupDef{ Class[] value(); + Class[] collide() default {}; boolean spatial() default false; boolean mapping() default false; } diff --git a/annotations/src/main/java/mindustry/annotations/impl/EntityProcess.java b/annotations/src/main/java/mindustry/annotations/impl/EntityProcess.java index 4b6a5cabc3..04d6759386 100644 --- a/annotations/src/main/java/mindustry/annotations/impl/EntityProcess.java +++ b/annotations/src/main/java/mindustry/annotations/impl/EntityProcess.java @@ -35,7 +35,7 @@ public class EntityProcess extends BaseProcessor{ ObjectMap varInitializers = new ObjectMap<>(); ObjectMap methodBlocks = new ObjectMap<>(); ObjectSet imports = new ObjectSet<>(); - Array allGroups = new Array<>(); + Array allGroups = new Array<>(); Array allDefs = new Array<>(); Array allInterfaces = new Array<>(); @@ -45,7 +45,7 @@ public class EntityProcess extends BaseProcessor{ @Override public void process(RoundEnvironment env) throws Exception{ - allGroups.addAll(methods(GroupDef.class)); + allGroups.addAll(elements(GroupDef.class)); allDefs.addAll(elements(EntityDef.class)); allInterfaces.addAll(types(EntityInterface.class)); @@ -169,17 +169,18 @@ public class EntityProcess extends BaseProcessor{ }else if(round == 2){ //round 2: get component classes and generate interfaces for them //parse groups - for(Smethod group : allGroups){ + for(Selement group : allGroups){ GroupDef an = group.annotation(GroupDef.class); - Array types = types(an, GroupDef::value).map(this::interfaceToComp);; - groupDefs.add(new GroupDefinition(group.name(), ClassName.bestGuess(packageName + "." + interfaceName(types.first())), types, an.spatial(), an.mapping())); + Array types = types(an, GroupDef::value).map(this::interfaceToComp); + Array collides = types(an, GroupDef::collide); + groupDefs.add(new GroupDefinition(group.name(), ClassName.bestGuess(packageName + "." + interfaceName(types.first())), types, an.spatial(), an.mapping(), collides)); } //add special generated groups for(DrawLayer layer : DrawLayer.values()){ String name = "DrawLayer" + Strings.capitalize(layer.name()) + "c"; //create group definition with no components directly - GroupDefinition def = new GroupDefinition(layer.name(), ClassName.bestGuess(packageName + "." + name), Array.with(), false, false); + GroupDefinition def = new GroupDefinition(layer.name(), ClassName.bestGuess(packageName + "." + name), Array.with(), false, false, new Array<>(0)); //add manual inclusions of entities to be added to this group def.manualInclusions.addAll(allDefs.select(s -> allComponents(s).contains(comp -> comp.interfaces().contains(in -> in.name().equals(name))))); groupDefs.add(def); @@ -420,6 +421,12 @@ public class EntityProcess extends BaseProcessor{ groupUpdate.addStatement("all.update()"); + for(GroupDefinition group : groupDefs){ + for(Stype collide : group.collides){ + groupUpdate.addStatement("$L.collide($L)", group.name, collide.name()); + } + } + for(DrawLayer layer : DrawLayer.values()){ MethodSpec.Builder groupDraw = MethodSpec.methodBuilder("draw" + Strings.capitalize(layer.name())) .addModifiers(Modifier.PUBLIC, Modifier.STATIC); @@ -673,15 +680,17 @@ public class EntityProcess extends BaseProcessor{ final String name; final ClassName baseType; final Array components; + final Array collides; final boolean spatial, mapping; final ObjectSet manualInclusions = new ObjectSet<>(); - public GroupDefinition(String name, ClassName bestType, Array components, boolean spatial, boolean mapping){ + public GroupDefinition(String name, ClassName bestType, Array components, boolean spatial, boolean mapping, Array collides){ this.baseType = bestType; this.components = components; this.name = name; this.spatial = spatial; this.mapping = mapping; + this.collides = collides; } @Override diff --git a/core/src/mindustry/entities/AllDefs.java b/core/src/mindustry/entities/AllDefs.java index 67f41bfd5d..ff75914aa7 100644 --- a/core/src/mindustry/entities/AllDefs.java +++ b/core/src/mindustry/entities/AllDefs.java @@ -6,27 +6,32 @@ import mindustry.gen.*; class AllDefs{ @GroupDef(Entityc.class) - void all(){ + class all{ } @GroupDef(Playerc.class) - void player(){ + class player{ + + } + + @GroupDef(value = Bulletc.class, spatial = true, collide = {unit.class}) + class bullet{ } @GroupDef(value = Unitc.class, spatial = true) - void unit(){ + class unit{ } @GroupDef(Tilec.class) - void tile(){ + class tile{ } @GroupDef(Syncc.class) - void sync(){ + class sync{ } } diff --git a/core/src/mindustry/entities/EntityGroup.java b/core/src/mindustry/entities/EntityGroup.java index 40953d1847..660d2b9e20 100644 --- a/core/src/mindustry/entities/EntityGroup.java +++ b/core/src/mindustry/entities/EntityGroup.java @@ -45,6 +45,10 @@ public class EntityGroup implements Iterable{ array.sort(comp); } + public void collide(EntityGroup other){ + collisions.collideGroups((EntityGroup)this, other); + } + public void updatePhysics(){ collisions.updatePhysics((EntityGroup)this); }