diff --git a/annotations/src/main/java/io/anuke/annotations/CallSuperAnnotationProcessor.java b/annotations/src/main/java/io/anuke/annotations/CallSuperAnnotationProcessor.java index 1bdc75c786..1a0102a793 100644 --- a/annotations/src/main/java/io/anuke/annotations/CallSuperAnnotationProcessor.java +++ b/annotations/src/main/java/io/anuke/annotations/CallSuperAnnotationProcessor.java @@ -1,32 +1,29 @@ package io.anuke.annotations; -import com.sun.source.util.TreePath; -import com.sun.source.util.Trees; -import com.sun.tools.javac.tree.JCTree; -import com.sun.tools.javac.tree.JCTree.JCExpressionStatement; -import io.anuke.annotations.Annotations.OverrideCallSuper; +import com.sun.source.util.*; +import com.sun.tools.javac.tree.*; +import com.sun.tools.javac.tree.JCTree.*; +import io.anuke.annotations.Annotations.*; import javax.annotation.processing.*; -import javax.lang.model.SourceVersion; -import javax.lang.model.element.Element; -import javax.lang.model.element.TypeElement; -import javax.tools.Diagnostic.Kind; -import java.util.List; -import java.util.Set; +import javax.lang.model.*; +import javax.lang.model.element.*; +import javax.tools.Diagnostic.*; +import java.util.*; -@SupportedAnnotationTypes("java.lang.Override") +@SupportedAnnotationTypes({"java.lang.Override"}) public class CallSuperAnnotationProcessor extends AbstractProcessor{ private Trees trees; @Override - public void init (ProcessingEnvironment pe) { + public void init(ProcessingEnvironment pe){ super.init(pe); trees = Trees.instance(pe); } - public boolean process (Set annotations, RoundEnvironment roundEnv) { - for (Element e : roundEnv.getElementsAnnotatedWith(Override.class)) { - if (e.getAnnotation(OverrideCallSuper.class) != null) return false; + public boolean process(Set annotations, RoundEnvironment roundEnv){ + for(Element e : roundEnv.getElementsAnnotatedWith(Override.class)){ + if(e.getAnnotation(OverrideCallSuper.class) != null) return false; CodeAnalyzerTreeScanner codeScanner = new CodeAnalyzerTreeScanner(); codeScanner.setMethodName(e.getSimpleName().toString()); @@ -34,10 +31,10 @@ public class CallSuperAnnotationProcessor extends AbstractProcessor{ TreePath tp = trees.getPath(e.getEnclosingElement()); codeScanner.scan(tp, trees); - if (codeScanner.isCallSuperUsed()) { + if(codeScanner.isCallSuperUsed()){ List list = codeScanner.getMethod().getBody().getStatements(); - if (!doesCallSuper(list, codeScanner.getMethodName())) { + if(!doesCallSuper(list, codeScanner.getMethodName())){ processingEnv.getMessager().printMessage(Kind.ERROR, "Overriding method '" + codeScanner.getMethodName() + "' must explicitly call super method from its parent class.", e); } } @@ -46,12 +43,12 @@ public class CallSuperAnnotationProcessor extends AbstractProcessor{ return false; } - private boolean doesCallSuper (List list, String methodName) { - for (Object object : list) { - if (object instanceof JCTree.JCExpressionStatement) { - JCTree.JCExpressionStatement expr = (JCExpressionStatement) object; + private boolean doesCallSuper(List list, String methodName){ + for(Object object : list){ + if(object instanceof JCTree.JCExpressionStatement){ + JCTree.JCExpressionStatement expr = (JCExpressionStatement)object; String exprString = expr.toString(); - if (exprString.startsWith("super." + methodName) && exprString.endsWith(");")) return true; + if(exprString.startsWith("super." + methodName) && exprString.endsWith(");")) return true; } } @@ -59,7 +56,7 @@ public class CallSuperAnnotationProcessor extends AbstractProcessor{ } @Override - public SourceVersion getSupportedSourceVersion () { + public SourceVersion getSupportedSourceVersion(){ return SourceVersion.RELEASE_8; } } diff --git a/core/src/io/anuke/mindustry/Vars.java b/core/src/io/anuke/mindustry/Vars.java index b4d01d579a..c723907b1f 100644 --- a/core/src/io/anuke/mindustry/Vars.java +++ b/core/src/io/anuke/mindustry/Vars.java @@ -258,7 +258,7 @@ public class Vars implements Loadable{ public static void loadSettings(){ Core.settings.setAppName(appName); - if(steam){ + if(steam || Version.modifier.equals("steam")){ Core.settings.setDataDirectory(Core.files.local("saves/")); } diff --git a/core/src/io/anuke/mindustry/core/Control.java b/core/src/io/anuke/mindustry/core/Control.java index 6a426be530..771dbba8d4 100644 --- a/core/src/io/anuke/mindustry/core/Control.java +++ b/core/src/io/anuke/mindustry/core/Control.java @@ -92,9 +92,6 @@ public class Control implements ApplicationListener, Loadable{ world.getMap().setHighScore(state.wave); } - if(world.isZone()){ - world.getZone().updateWave(state.wave); - } Sounds.wave.play(); }); diff --git a/core/src/io/anuke/mindustry/core/Logic.java b/core/src/io/anuke/mindustry/core/Logic.java index b7120626a9..c0544f70bf 100644 --- a/core/src/io/anuke/mindustry/core/Logic.java +++ b/core/src/io/anuke/mindustry/core/Logic.java @@ -35,6 +35,10 @@ public class Logic implements ApplicationListener{ for(Player p : playerGroup.all()){ p.respawns = state.rules.respawns; } + + if(world.isZone()){ + world.getZone().updateWave(state.wave); + } }); Events.on(BlockDestroyEvent.class, event -> { diff --git a/core/src/io/anuke/mindustry/game/UnlockableContent.java b/core/src/io/anuke/mindustry/game/UnlockableContent.java index b6caa40111..3a298ecb69 100644 --- a/core/src/io/anuke/mindustry/game/UnlockableContent.java +++ b/core/src/io/anuke/mindustry/game/UnlockableContent.java @@ -22,7 +22,7 @@ public abstract class UnlockableContent extends MappableContent{ } public void createIcons(){ - //TODO implement. + //TODO implement; generate special icons, like mech icons or ores w/ pixmaps } /** Returns a specific content icon, or the region {contentType}-{name} if not found.*/ diff --git a/core/src/io/anuke/mindustry/mod/ContentParser.java b/core/src/io/anuke/mindustry/mod/ContentParser.java index 269f0f0258..f668135f93 100644 --- a/core/src/io/anuke/mindustry/mod/ContentParser.java +++ b/core/src/io/anuke/mindustry/mod/ContentParser.java @@ -2,6 +2,7 @@ package io.anuke.mindustry.mod; import io.anuke.arc.collection.*; import io.anuke.arc.function.*; +import io.anuke.arc.graphics.*; import io.anuke.arc.util.ArcAnnotate.*; import io.anuke.arc.util.*; import io.anuke.arc.util.reflect.*; @@ -24,6 +25,8 @@ public class ContentParser{ private ObjectMap, FieldParser> classParsers = new ObjectMap, FieldParser>(){{ put(BulletType.class, (type, data) -> field(Bullets.class, data)); put(Effect.class, (type, data) -> field(Fx.class, data)); + put(StatusEffect.class, (type, data) -> field(StatusEffects.class, data)); + put(Color.class, (type, data) -> Color.valueOf(data.asString())); }}; /** Stores things that need to be parsed fully, e.g. reading fields of content. * This is done to accomodate binding of content names first.*/ @@ -69,6 +72,31 @@ public class ContentParser{ Block block = type.getDeclaredConstructor(String.class).newInstance(mod + "-" + name); read(() -> { + if(value.has("consumes")){ + for(JsonValue child : value.get("consumes")){ + if(child.name.equals("item")){ + if(child.isString()){ + block.consumes.item(Vars.content.getByName(ContentType.item, child.asString())); + }else{ + ItemStack stack = parser.readValue(ItemStack.class, child); + block.consumes.item(stack.item, stack.amount); + } + }else if(child.name.equals("items")){ + block.consumes.items(parser.readValue(ItemStack[].class, child)); + }else if(child.name.equals("liquid")){ + LiquidStack stack = parser.readValue(LiquidStack.class, child); + block.consumes.liquid(stack.liquid, stack.amount); + }else if(child.name.equals("power")){ + block.consumes.power(child.asFloat()); + }else if(child.name.equals("powerBuffered")){ + block.consumes.powerBuffered(child.asFloat()); + }else{ + throw new IllegalArgumentException("Unknown consumption type: '" + child.name + "' for block '" + block.name + "'."); + } + } + value.remove("consumes"); + } + readFields(block, value, true); //add research tech node diff --git a/core/src/io/anuke/mindustry/mod/Mods.java b/core/src/io/anuke/mindustry/mod/Mods.java index 8292b23108..0d728b63de 100644 --- a/core/src/io/anuke/mindustry/mod/Mods.java +++ b/core/src/io/anuke/mindustry/mod/Mods.java @@ -276,8 +276,8 @@ public class Mods implements Loadable{ //make sure the main class exists before loading it; if it doesn't just don't put it there if(mainFile.exists()){ //other platforms don't have standard java class loaders - if(mobile){ - throw new IllegalArgumentException("This mod is not compatible with " + (ios ? "iOS" : "Android") + "."); + if(!headless && Version.build != -1){ + throw new IllegalArgumentException("Java class mods are currently unsupported outside of custom builds."); } URLClassLoader classLoader = new URLClassLoader(new URL[]{sourceFile.file().toURI().toURL()}, ClassLoader.getSystemClassLoader()); diff --git a/core/src/io/anuke/mindustry/type/ItemStack.java b/core/src/io/anuke/mindustry/type/ItemStack.java index 027a30ae36..9e428716dc 100644 --- a/core/src/io/anuke/mindustry/type/ItemStack.java +++ b/core/src/io/anuke/mindustry/type/ItemStack.java @@ -5,7 +5,7 @@ import io.anuke.mindustry.content.Items; public class ItemStack implements Comparable{ public Item item; - public int amount; + public int amount = 1; public ItemStack(Item item, int amount){ if(item == null) item = Items.copper; diff --git a/core/src/io/anuke/mindustry/type/LiquidStack.java b/core/src/io/anuke/mindustry/type/LiquidStack.java index c4dcda7568..a861525778 100644 --- a/core/src/io/anuke/mindustry/type/LiquidStack.java +++ b/core/src/io/anuke/mindustry/type/LiquidStack.java @@ -9,6 +9,11 @@ public class LiquidStack{ this.amount = amount; } + /** serialization only*/ + protected LiquidStack(){ + + } + @Override public String toString(){ return "LiquidStack{" + diff --git a/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java b/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java index af4a54a6ae..2aceda244f 100644 --- a/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java +++ b/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java @@ -139,7 +139,7 @@ public class DesktopLauncher extends ClientLauncher{ }catch(Throwable e){ steam = false; Log.err("Failed to load Steam native libraries."); - e.printStackTrace(); + Log.err(e); } } } diff --git a/tests/src/test/java/power/PowerTestFixture.java b/tests/src/test/java/power/PowerTestFixture.java index 8afe8115e2..e7b26c3447 100644 --- a/tests/src/test/java/power/PowerTestFixture.java +++ b/tests/src/test/java/power/PowerTestFixture.java @@ -5,6 +5,7 @@ import io.anuke.arc.util.*; import io.anuke.mindustry.*; import io.anuke.mindustry.content.*; import io.anuke.mindustry.core.*; +import io.anuke.mindustry.game.*; import io.anuke.mindustry.world.*; import io.anuke.mindustry.world.blocks.*; import io.anuke.mindustry.world.blocks.power.*; @@ -26,7 +27,12 @@ public class PowerTestFixture{ @BeforeAll static void initializeDependencies(){ Core.graphics = new FakeGraphics(); - Vars.content = new ContentLoader(); + Vars.content = new ContentLoader(){ + @Override + public void handleMappableContent(MappableContent content){ + + } + }; content.createContent(); Log.setUseColors(false); Time.setDeltaProvider(() -> 0.5f); diff --git a/tests/src/test/java/power/PowerTests.java b/tests/src/test/java/power/PowerTests.java index e9da0784ba..3c6e20e288 100644 --- a/tests/src/test/java/power/PowerTests.java +++ b/tests/src/test/java/power/PowerTests.java @@ -1,16 +1,14 @@ package power; -import io.anuke.arc.Core; -import io.anuke.arc.math.Mathf; +import io.anuke.arc.*; +import io.anuke.arc.math.*; import io.anuke.arc.util.*; -import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.blocks.power.PowerGenerator; -import io.anuke.mindustry.world.blocks.power.PowerGraph; -import io.anuke.mindustry.world.consumers.ConsumePower; +import io.anuke.mindustry.world.*; +import io.anuke.mindustry.world.blocks.power.*; +import io.anuke.mindustry.world.consumers.*; import org.junit.jupiter.api.*; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.*; import static org.junit.jupiter.api.DynamicTest.dynamicTest; /**