diff --git a/annotations/src/main/java/io/anuke/annotations/Annotations.java b/annotations/src/main/java/io/anuke/annotations/Annotations.java index e7afef4f9a..6ee59964e9 100644 --- a/annotations/src/main/java/io/anuke/annotations/Annotations.java +++ b/annotations/src/main/java/io/anuke/annotations/Annotations.java @@ -22,20 +22,6 @@ public class Annotations{ public @interface OverrideCallSuper { } - /** Indicates that a method return or field can be null.*/ - @Target({ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.LOCAL_VARIABLE}) - @Retention(RetentionPolicy.SOURCE) - public @interface Nullable{ - - } - - /** Indicates that a method return or field cannot be null.*/ - @Target({ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.LOCAL_VARIABLE}) - @Retention(RetentionPolicy.SOURCE) - public @interface NonNull{ - - } - /** Marks a class as serializable. */ @Target(ElementType.TYPE) @Retention(RetentionPolicy.SOURCE) diff --git a/core/src/io/anuke/mindustry/ai/Pathfinder.java b/core/src/io/anuke/mindustry/ai/Pathfinder.java index d34ddee1a0..03ca073a08 100644 --- a/core/src/io/anuke/mindustry/ai/Pathfinder.java +++ b/core/src/io/anuke/mindustry/ai/Pathfinder.java @@ -6,6 +6,7 @@ import io.anuke.arc.collection.*; import io.anuke.arc.function.*; import io.anuke.arc.math.geom.*; import io.anuke.arc.util.*; +import io.anuke.arc.util.ArcAnnotate.*; import io.anuke.arc.util.async.*; import io.anuke.mindustry.game.EventType.*; import io.anuke.mindustry.game.*; @@ -32,7 +33,8 @@ public class Pathfinder implements Runnable{ /** handles task scheduling on the update thread. */ private TaskQueue queue = new TaskQueue(); /** current pathfinding thread */ - private @Nullable Thread thread; + private @Nullable + Thread thread; public Pathfinder(){ Events.on(WorldLoadEvent.class, event -> { diff --git a/core/src/io/anuke/mindustry/ai/WaveSpawner.java b/core/src/io/anuke/mindustry/ai/WaveSpawner.java index daf4e7b00a..b4dadcd59a 100644 --- a/core/src/io/anuke/mindustry/ai/WaveSpawner.java +++ b/core/src/io/anuke/mindustry/ai/WaveSpawner.java @@ -48,7 +48,7 @@ public class WaveSpawner{ for(SpawnGroup group : state.rules.spawns){ int spawned = group.getUnitsSpawned(state.wave - 1); - if(group.type.isFlying){ + if(group.type.flying){ float spread = margin / 1.5f; eachFlyerSpawn((spawnX, spawnY) -> { diff --git a/core/src/io/anuke/mindustry/content/UnitTypes.java b/core/src/io/anuke/mindustry/content/UnitTypes.java index 6c4e54398f..8d005ca4c3 100644 --- a/core/src/io/anuke/mindustry/content/UnitTypes.java +++ b/core/src/io/anuke/mindustry/content/UnitTypes.java @@ -18,7 +18,7 @@ public class UnitTypes implements ContentList{ @Override public void load(){ draug = new UnitType("draug", Draug.class, Draug::new){{ - isFlying = true; + flying = true; drag = 0.01f; speed = 0.3f; maxVelocity = 1.2f; @@ -33,7 +33,7 @@ public class UnitTypes implements ContentList{ }}; spirit = new UnitType("spirit", Spirit.class, Spirit::new){{ - isFlying = true; + flying = true; drag = 0.01f; speed = 0.4f; maxVelocity = 1.6f; @@ -54,7 +54,7 @@ public class UnitTypes implements ContentList{ }}; phantom = new UnitType("phantom", Phantom.class, Phantom::new){{ - isFlying = true; + flying = true; drag = 0.01f; mass = 2f; speed = 0.45f; @@ -244,7 +244,7 @@ public class UnitTypes implements ContentList{ maxVelocity = 1.9f; drag = 0.01f; mass = 1.5f; - isFlying = true; + flying = true; health = 75; engineOffset = 5.5f; range = 140f; @@ -264,7 +264,7 @@ public class UnitTypes implements ContentList{ maxVelocity = 1.4f; mass = 3f; drag = 0.01f; - isFlying = true; + flying = true; targetAir = false; engineOffset = 7.8f; range = 140f; @@ -291,7 +291,7 @@ public class UnitTypes implements ContentList{ drag = 0.01f; range = 80f; shootCone = 40f; - isFlying = true; + flying = true; rotateWeapon = true; engineOffset = 12f; engineSize = 3f; @@ -322,7 +322,7 @@ public class UnitTypes implements ContentList{ drag = 0.02f; range = 80f; shootCone = 20f; - isFlying = true; + flying = true; rotateWeapon = true; engineOffset = 21; engineSize = 5.3f; @@ -355,7 +355,7 @@ public class UnitTypes implements ContentList{ drag = 0.02f; range = 80f; shootCone = 30f; - isFlying = true; + flying = true; rotateWeapon = true; engineOffset = 40; engineSize = 7.3f; diff --git a/core/src/io/anuke/mindustry/core/ContentLoader.java b/core/src/io/anuke/mindustry/core/ContentLoader.java index f05e043050..cda4c8bda3 100644 --- a/core/src/io/anuke/mindustry/core/ContentLoader.java +++ b/core/src/io/anuke/mindustry/core/ContentLoader.java @@ -60,7 +60,9 @@ public class ContentLoader{ setupMapping(); - mods.loadContent(); + if(mods != null){ + mods.loadContent(); + } setupMapping(); diff --git a/core/src/io/anuke/mindustry/core/World.java b/core/src/io/anuke/mindustry/core/World.java index 26e0441e8a..4e2806e62d 100644 --- a/core/src/io/anuke/mindustry/core/World.java +++ b/core/src/io/anuke/mindustry/core/World.java @@ -1,11 +1,11 @@ package io.anuke.mindustry.core; -import io.anuke.annotations.Annotations.*; import io.anuke.arc.*; import io.anuke.arc.collection.*; import io.anuke.arc.math.*; import io.anuke.arc.math.geom.*; import io.anuke.arc.util.*; +import io.anuke.arc.util.ArcAnnotate.*; import io.anuke.mindustry.content.*; import io.anuke.mindustry.core.GameState.*; import io.anuke.mindustry.game.EventType.*; @@ -82,7 +82,8 @@ public class World{ return height()*tilesize; } - public @Nullable Tile tile(int pos){ + public @Nullable + Tile tile(int pos){ return tiles == null ? null : tile(Pos.x(pos), Pos.y(pos)); } diff --git a/core/src/io/anuke/mindustry/entities/traits/BuilderTrait.java b/core/src/io/anuke/mindustry/entities/traits/BuilderTrait.java index e9536abbf8..6975a3bf2a 100644 --- a/core/src/io/anuke/mindustry/entities/traits/BuilderTrait.java +++ b/core/src/io/anuke/mindustry/entities/traits/BuilderTrait.java @@ -1,6 +1,5 @@ package io.anuke.mindustry.entities.traits; -import io.anuke.annotations.Annotations.*; import io.anuke.arc.*; import io.anuke.arc.collection.Queue; import io.anuke.arc.collection.*; @@ -8,6 +7,7 @@ import io.anuke.arc.graphics.g2d.*; import io.anuke.arc.math.*; import io.anuke.arc.math.geom.*; import io.anuke.arc.util.*; +import io.anuke.arc.util.ArcAnnotate.*; import io.anuke.mindustry.*; import io.anuke.mindustry.content.*; import io.anuke.mindustry.entities.type.*; @@ -200,7 +200,8 @@ public interface BuilderTrait extends Entity, TeamTrait{ * Return the build requests currently active, or the one at the top of the queue. * May return null. */ - default @Nullable BuildRequest buildRequest(){ + default @Nullable + BuildRequest buildRequest(){ return buildQueue().size == 0 ? null : buildQueue().first(); } diff --git a/core/src/io/anuke/mindustry/entities/type/BaseUnit.java b/core/src/io/anuke/mindustry/entities/type/BaseUnit.java index 006a679daa..e0678e391d 100644 --- a/core/src/io/anuke/mindustry/entities/type/BaseUnit.java +++ b/core/src/io/anuke/mindustry/entities/type/BaseUnit.java @@ -6,6 +6,7 @@ import io.anuke.arc.graphics.g2d.*; import io.anuke.arc.math.*; import io.anuke.arc.math.geom.*; import io.anuke.arc.util.*; +import io.anuke.arc.util.ArcAnnotate.*; import io.anuke.mindustry.*; import io.anuke.mindustry.content.*; import io.anuke.mindustry.entities.*; @@ -93,7 +94,8 @@ public abstract class BaseUnit extends Unit implements ShooterTrait{ } } - public @Nullable Tile getSpawner(){ + public @Nullable + Tile getSpawner(){ return world.tile(spawner); } @@ -263,7 +265,7 @@ public abstract class BaseUnit extends Unit implements ShooterTrait{ @Override public boolean isFlying(){ - return type.isFlying; + return type.flying; } @Override diff --git a/core/src/io/anuke/mindustry/entities/type/Player.java b/core/src/io/anuke/mindustry/entities/type/Player.java index 9f35158043..06de1941d0 100644 --- a/core/src/io/anuke/mindustry/entities/type/Player.java +++ b/core/src/io/anuke/mindustry/entities/type/Player.java @@ -10,6 +10,7 @@ import io.anuke.arc.math.geom.*; import io.anuke.arc.scene.ui.*; import io.anuke.arc.scene.ui.layout.*; import io.anuke.arc.util.*; +import io.anuke.arc.util.ArcAnnotate.*; import io.anuke.arc.util.pooling.*; import io.anuke.mindustry.*; import io.anuke.mindustry.content.*; @@ -48,7 +49,8 @@ public class Player extends Unit implements BuilderMinerTrait, ShooterTrait{ public float baseRotation; public float pointerX, pointerY; public String name = "noname"; - public @Nullable String uuid, usid; + public @Nullable + String uuid, usid; public boolean isAdmin, isTransferring, isShooting, isBoosting, isMobile, isTyping; public float boostHeat, shootHeat, destructTime; public boolean achievedFlight; diff --git a/core/src/io/anuke/mindustry/entities/type/TileEntity.java b/core/src/io/anuke/mindustry/entities/type/TileEntity.java index 30aa8b9cb7..87511f2d08 100644 --- a/core/src/io/anuke/mindustry/entities/type/TileEntity.java +++ b/core/src/io/anuke/mindustry/entities/type/TileEntity.java @@ -7,6 +7,7 @@ import io.anuke.arc.collection.ObjectSet; import io.anuke.arc.math.geom.Point2; import io.anuke.arc.math.geom.Vector2; import io.anuke.arc.util.*; +import io.anuke.arc.util.ArcAnnotate.*; import io.anuke.mindustry.entities.EntityGroup; import io.anuke.mindustry.entities.traits.HealthTrait; import io.anuke.mindustry.entities.traits.TargetTrait; @@ -42,7 +43,8 @@ public class TileEntity extends BaseEntity implements TargetTrait, HealthTrait{ private boolean dead = false; private boolean sleeping; private float sleepTime; - private @Nullable SoundLoop sound; + private @Nullable + SoundLoop sound; @Remote(called = Loc.server, unreliable = true) public static void onTileDamage(Tile tile, float health){ diff --git a/core/src/io/anuke/mindustry/entities/type/Unit.java b/core/src/io/anuke/mindustry/entities/type/Unit.java index 63289f53e1..28cedcd4a5 100644 --- a/core/src/io/anuke/mindustry/entities/type/Unit.java +++ b/core/src/io/anuke/mindustry/entities/type/Unit.java @@ -1,6 +1,5 @@ package io.anuke.mindustry.entities.type; -import io.anuke.annotations.Annotations.*; import io.anuke.arc.*; import io.anuke.arc.collection.*; import io.anuke.arc.graphics.*; @@ -9,6 +8,7 @@ import io.anuke.arc.math.*; import io.anuke.arc.math.geom.*; import io.anuke.arc.scene.ui.layout.*; import io.anuke.arc.util.*; +import io.anuke.arc.util.ArcAnnotate.*; import io.anuke.mindustry.content.*; import io.anuke.mindustry.entities.*; import io.anuke.mindustry.entities.effect.*; @@ -234,7 +234,8 @@ public abstract class Unit extends DestructibleEntity implements SaveTrait, Targ } } - public @Nullable TileEntity getClosestCore(){ + public @Nullable + TileEntity getClosestCore(){ TeamData data = state.teams.get(team); Tile tile = Geometry.findClosest(x, y, data.cores); diff --git a/core/src/io/anuke/mindustry/entities/type/base/BaseDrone.java b/core/src/io/anuke/mindustry/entities/type/base/BaseDrone.java index 2821a00832..a6a4d0dbfa 100644 --- a/core/src/io/anuke/mindustry/entities/type/base/BaseDrone.java +++ b/core/src/io/anuke/mindustry/entities/type/base/BaseDrone.java @@ -2,7 +2,6 @@ package io.anuke.mindustry.entities.type.base; import io.anuke.arc.math.Mathf; import io.anuke.arc.math.geom.Geometry; -import io.anuke.mindustry.entities.type.FlyingUnit; import io.anuke.mindustry.entities.units.*; import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.meta.BlockFlag; diff --git a/core/src/io/anuke/mindustry/entities/type/base/Crawler.java b/core/src/io/anuke/mindustry/entities/type/base/Crawler.java index f3c12c9604..44da8bea5f 100644 --- a/core/src/io/anuke/mindustry/entities/type/base/Crawler.java +++ b/core/src/io/anuke/mindustry/entities/type/base/Crawler.java @@ -1,6 +1,4 @@ package io.anuke.mindustry.entities.type.base; -import io.anuke.mindustry.entities.type.GroundUnit; - public class Crawler extends GroundUnit{ } diff --git a/core/src/io/anuke/mindustry/entities/type/base/Dagger.java b/core/src/io/anuke/mindustry/entities/type/base/Dagger.java index 13bf6021c9..09a39daaa7 100644 --- a/core/src/io/anuke/mindustry/entities/type/base/Dagger.java +++ b/core/src/io/anuke/mindustry/entities/type/base/Dagger.java @@ -1,7 +1,5 @@ package io.anuke.mindustry.entities.type.base; -import io.anuke.mindustry.entities.type.GroundUnit; - public class Dagger extends GroundUnit{ } diff --git a/core/src/io/anuke/mindustry/entities/type/base/Eruptor.java b/core/src/io/anuke/mindustry/entities/type/base/Eruptor.java index dfbfe9db39..4c86371811 100644 --- a/core/src/io/anuke/mindustry/entities/type/base/Eruptor.java +++ b/core/src/io/anuke/mindustry/entities/type/base/Eruptor.java @@ -1,6 +1,4 @@ package io.anuke.mindustry.entities.type.base; -import io.anuke.mindustry.entities.type.GroundUnit; - public class Eruptor extends GroundUnit{ } diff --git a/core/src/io/anuke/mindustry/entities/type/FlyingUnit.java b/core/src/io/anuke/mindustry/entities/type/base/FlyingUnit.java similarity index 98% rename from core/src/io/anuke/mindustry/entities/type/FlyingUnit.java rename to core/src/io/anuke/mindustry/entities/type/base/FlyingUnit.java index 4b67274cb4..7c004628b2 100644 --- a/core/src/io/anuke/mindustry/entities/type/FlyingUnit.java +++ b/core/src/io/anuke/mindustry/entities/type/base/FlyingUnit.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.entities.type; +package io.anuke.mindustry.entities.type.base; import io.anuke.arc.graphics.*; import io.anuke.arc.graphics.g2d.*; @@ -8,6 +8,7 @@ import io.anuke.arc.util.*; import io.anuke.mindustry.*; import io.anuke.mindustry.entities.*; import io.anuke.mindustry.entities.bullet.*; +import io.anuke.mindustry.entities.type.*; import io.anuke.mindustry.entities.units.*; import io.anuke.mindustry.graphics.*; import io.anuke.mindustry.world.*; @@ -15,7 +16,7 @@ import io.anuke.mindustry.world.meta.*; import static io.anuke.mindustry.Vars.*; -public abstract class FlyingUnit extends BaseUnit{ +public class FlyingUnit extends BaseUnit{ protected float[] weaponAngles = {0,0}; protected final UnitState diff --git a/core/src/io/anuke/mindustry/entities/type/base/Fortress.java b/core/src/io/anuke/mindustry/entities/type/base/Fortress.java index 992948fa79..c4f36dba69 100644 --- a/core/src/io/anuke/mindustry/entities/type/base/Fortress.java +++ b/core/src/io/anuke/mindustry/entities/type/base/Fortress.java @@ -1,6 +1,4 @@ package io.anuke.mindustry.entities.type.base; -import io.anuke.mindustry.entities.type.GroundUnit; - public class Fortress extends GroundUnit{ } diff --git a/core/src/io/anuke/mindustry/entities/type/base/Ghoul.java b/core/src/io/anuke/mindustry/entities/type/base/Ghoul.java index bc1f6a5317..0c4294645a 100644 --- a/core/src/io/anuke/mindustry/entities/type/base/Ghoul.java +++ b/core/src/io/anuke/mindustry/entities/type/base/Ghoul.java @@ -1,7 +1,5 @@ package io.anuke.mindustry.entities.type.base; -import io.anuke.mindustry.entities.type.FlyingUnit; - public class Ghoul extends FlyingUnit{ } diff --git a/core/src/io/anuke/mindustry/entities/type/GroundUnit.java b/core/src/io/anuke/mindustry/entities/type/base/GroundUnit.java similarity index 98% rename from core/src/io/anuke/mindustry/entities/type/GroundUnit.java rename to core/src/io/anuke/mindustry/entities/type/base/GroundUnit.java index ddb33a2662..c35c6c1528 100644 --- a/core/src/io/anuke/mindustry/entities/type/GroundUnit.java +++ b/core/src/io/anuke/mindustry/entities/type/base/GroundUnit.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.entities.type; +package io.anuke.mindustry.entities.type.base; import io.anuke.arc.graphics.*; import io.anuke.arc.graphics.g2d.*; @@ -9,6 +9,7 @@ import io.anuke.mindustry.*; import io.anuke.mindustry.ai.Pathfinder.*; import io.anuke.mindustry.entities.*; import io.anuke.mindustry.entities.bullet.*; +import io.anuke.mindustry.entities.type.*; import io.anuke.mindustry.entities.units.*; import io.anuke.mindustry.game.*; import io.anuke.mindustry.type.*; @@ -18,7 +19,7 @@ import io.anuke.mindustry.world.meta.*; import static io.anuke.mindustry.Vars.*; -public abstract class GroundUnit extends BaseUnit{ +public class GroundUnit extends BaseUnit{ protected static Vector2 vec = new Vector2(); protected float walkTime; diff --git a/core/src/io/anuke/mindustry/entities/type/base/Revenant.java b/core/src/io/anuke/mindustry/entities/type/base/Revenant.java index 03233dbb5d..393c134891 100644 --- a/core/src/io/anuke/mindustry/entities/type/base/Revenant.java +++ b/core/src/io/anuke/mindustry/entities/type/base/Revenant.java @@ -4,7 +4,6 @@ import io.anuke.arc.graphics.g2d.Draw; import io.anuke.arc.math.Angles; import io.anuke.arc.math.Mathf; import io.anuke.mindustry.entities.Units; -import io.anuke.mindustry.entities.type.FlyingUnit; public class Revenant extends FlyingUnit{ diff --git a/core/src/io/anuke/mindustry/entities/type/base/Titan.java b/core/src/io/anuke/mindustry/entities/type/base/Titan.java index 1ac30593ac..9324d4d215 100644 --- a/core/src/io/anuke/mindustry/entities/type/base/Titan.java +++ b/core/src/io/anuke/mindustry/entities/type/base/Titan.java @@ -1,7 +1,5 @@ package io.anuke.mindustry.entities.type.base; -import io.anuke.mindustry.entities.type.GroundUnit; - public class Titan extends GroundUnit{ } diff --git a/core/src/io/anuke/mindustry/entities/type/base/Wraith.java b/core/src/io/anuke/mindustry/entities/type/base/Wraith.java index 9123ffcb8d..c8923e309f 100644 --- a/core/src/io/anuke/mindustry/entities/type/base/Wraith.java +++ b/core/src/io/anuke/mindustry/entities/type/base/Wraith.java @@ -1,7 +1,5 @@ package io.anuke.mindustry.entities.type.base; -import io.anuke.mindustry.entities.type.FlyingUnit; - public class Wraith extends FlyingUnit{ } diff --git a/core/src/io/anuke/mindustry/game/EventType.java b/core/src/io/anuke/mindustry/game/EventType.java index 5be7008c1a..30817303a0 100644 --- a/core/src/io/anuke/mindustry/game/EventType.java +++ b/core/src/io/anuke/mindustry/game/EventType.java @@ -1,6 +1,6 @@ package io.anuke.mindustry.game; -import io.anuke.annotations.Annotations.*; +import io.anuke.arc.util.ArcAnnotate.*; import io.anuke.mindustry.core.GameState.State; import io.anuke.mindustry.entities.traits.BuilderTrait; import io.anuke.mindustry.entities.type.*; @@ -195,7 +195,8 @@ public class EventType{ public static class BlockBuildEndEvent{ public final Tile tile; public final Team team; - public final @Nullable Player player; + public final @Nullable + Player player; public final boolean breaking; public BlockBuildEndEvent(Tile tile, @Nullable Player player, Team team, boolean breaking){ diff --git a/core/src/io/anuke/mindustry/game/MusicControl.java b/core/src/io/anuke/mindustry/game/MusicControl.java index a582babaca..7b5c314a95 100644 --- a/core/src/io/anuke/mindustry/game/MusicControl.java +++ b/core/src/io/anuke/mindustry/game/MusicControl.java @@ -1,11 +1,11 @@ package io.anuke.mindustry.game; -import io.anuke.annotations.Annotations.*; import io.anuke.arc.*; import io.anuke.arc.audio.*; import io.anuke.arc.collection.*; import io.anuke.arc.math.*; import io.anuke.arc.util.*; +import io.anuke.arc.util.ArcAnnotate.*; import io.anuke.mindustry.core.GameState.*; import io.anuke.mindustry.game.EventType.*; import io.anuke.mindustry.gen.*; @@ -22,7 +22,8 @@ public class MusicControl{ public Array darkMusic = Array.with(); private Music lastRandomPlayed; private Interval timer = new Interval(); - private @Nullable Music current; + private @Nullable + Music current; private float fade; private boolean silenced; diff --git a/core/src/io/anuke/mindustry/graphics/Shaders.java b/core/src/io/anuke/mindustry/graphics/Shaders.java index 2c2316c07d..04c887caa9 100644 --- a/core/src/io/anuke/mindustry/graphics/Shaders.java +++ b/core/src/io/anuke/mindustry/graphics/Shaders.java @@ -1,17 +1,18 @@ package io.anuke.mindustry.graphics; -import io.anuke.annotations.Annotations.*; import io.anuke.arc.Core; import io.anuke.arc.graphics.Color; import io.anuke.arc.graphics.g2d.TextureRegion; import io.anuke.arc.graphics.glutils.Shader; import io.anuke.arc.scene.ui.layout.Scl; +import io.anuke.arc.util.ArcAnnotate.*; import io.anuke.arc.util.Time; public class Shaders{ public static Shadow shadow; public static BlockBuild blockbuild; - public static @Nullable Shield shield; + public static @Nullable + Shield shield; public static UnitBuild build; public static FogShader fog; public static MenuShader menu; diff --git a/core/src/io/anuke/mindustry/mod/ContentParser.java b/core/src/io/anuke/mindustry/mod/ContentParser.java index 0a6fd238bc..c61364eff6 100644 --- a/core/src/io/anuke/mindustry/mod/ContentParser.java +++ b/core/src/io/anuke/mindustry/mod/ContentParser.java @@ -1,11 +1,16 @@ package io.anuke.mindustry.mod; import io.anuke.arc.collection.*; +import io.anuke.arc.graphics.*; import io.anuke.arc.util.*; +import io.anuke.arc.util.ArcAnnotate.*; import io.anuke.arc.util.reflect.*; import io.anuke.arc.util.serialization.*; import io.anuke.arc.util.serialization.Json.*; import io.anuke.mindustry.*; +import io.anuke.mindustry.content.*; +import io.anuke.mindustry.entities.bullet.*; +import io.anuke.mindustry.entities.type.*; import io.anuke.mindustry.game.*; import io.anuke.mindustry.type.*; import io.anuke.mindustry.world.*; @@ -17,10 +22,21 @@ public class ContentParser{ private Json parser = new Json(){ public T readValue(Class type, Class elementType, JsonValue jsonData){ - if(type != null && Content.class.isAssignableFrom(type)){ - return (T)Vars.content.getByName(contentTypes.getThrow(type, () -> new IllegalArgumentException("No content type for class: " + type.getSimpleName())), jsonData.asString()); + try{ + if(type == BulletType.class){ + BulletType b = (BulletType)Bullets.class.getField(jsonData.asString()).get(null); + if(b == null) throw new IllegalArgumentException("Bullet type not found: " + jsonData.asString()); + return (T)b; + } + + if(type != null && Content.class.isAssignableFrom(type)){ + return (T)Vars.content.getByName(contentTypes.getThrow(type, () -> new IllegalArgumentException("No content type for class: " + type.getSimpleName())), jsonData.asString()); + } + + return super.readValue(type, elementType, jsonData); + }catch(Exception e){ + throw new RuntimeException(e); } - return super.readValue(type, elementType, jsonData); } }; @@ -38,6 +54,27 @@ public class ContentParser{ } return block; + }, + ContentType.item, (TypeParser)(mod, name, value) -> { + Item item = new Item(mod + "-" + name, new Color(Color.black)); + readFields(item, value); + return item; + }, + ContentType.unit, (TypeParser)(mod, name, value) -> { + String clas = value.getString("type"); + Class type = resolve("io.anuke.mindustry.entities.type.base." + clas); + java.lang.reflect.Constructor cons = type.getDeclaredConstructor(); + UnitType unit = new UnitType(mod + "-" + name, type, () -> { + try{ + return cons.newInstance(); + }catch(Exception e){ + throw new RuntimeException(e); + } + }); + value.remove("type"); + readFields(unit, value); + + return unit; } ); @@ -73,7 +110,35 @@ public class ContentParser{ throw new SerializationException("No parsers for content type '" + type + "'"); } - return parsers.get(type).parse(mod, name, value); + Content c = parsers.get(type).parse(mod, name, value); + checkNulls(c); + return c; + } + + private void checkNulls(Object object){ + checkNulls(object, new ObjectSet<>()); + } + + private void checkNulls(Object object, ObjectSet checked){ + checked.add(object); + + parser.getFields(object.getClass()).each((name, field) -> { + try{ + if(field.field.getType().isPrimitive()) return; + + Object obj = field.field.get(object); + if(field.field.isAnnotationPresent(NonNull.class) && field.field.get(object) == null){ + throw new RuntimeException("Field '" + name + "' in " + object.getClass().getSimpleName() + " is missing!"); + } + + if(obj != null && !checked.contains(obj)){ + checkNulls(obj, checked); + checked.add(obj); + } + }catch(Exception e){ + throw new RuntimeException(e); + } + }); } private void readFields(Object object, JsonValue jsonMap){ diff --git a/core/src/io/anuke/mindustry/mod/Mods.java b/core/src/io/anuke/mindustry/mod/Mods.java index aaa22f92ea..c19f64716c 100644 --- a/core/src/io/anuke/mindustry/mod/Mods.java +++ b/core/src/io/anuke/mindustry/mod/Mods.java @@ -1,6 +1,5 @@ package io.anuke.mindustry.mod; -import io.anuke.annotations.Annotations.*; import io.anuke.arc.*; import io.anuke.arc.assets.*; import io.anuke.arc.collection.*; @@ -11,6 +10,7 @@ import io.anuke.arc.graphics.Pixmap.*; import io.anuke.arc.graphics.Texture.*; import io.anuke.arc.graphics.g2d.*; import io.anuke.arc.util.*; +import io.anuke.arc.util.ArcAnnotate.*; import io.anuke.arc.util.io.*; import io.anuke.arc.util.serialization.*; import io.anuke.mindustry.game.*; @@ -43,7 +43,8 @@ public class Mods implements Loadable{ } /** @return the loaded mod found by class, or null if not found. */ - public @Nullable LoadedMod getMod(Class type){ + public @Nullable + LoadedMod getMod(Class type){ return loaded.find(l -> l.mod.getClass() == type); } @@ -186,7 +187,7 @@ public class Mods implements Loadable{ if(mod.root.child("content").exists()){ FileHandle contentRoot = mod.root.child("content"); for(ContentType type : ContentType.all){ - FileHandle folder = contentRoot.child(type.name() + "s"); + FileHandle folder = contentRoot.child(type.name().toLowerCase() + "s"); if(folder.exists()){ for(FileHandle file : folder.list()){ if(file.extension().equals("json")){ diff --git a/core/src/io/anuke/mindustry/net/CrashSender.java b/core/src/io/anuke/mindustry/net/CrashSender.java index 8280557136..2fbd6d29ac 100644 --- a/core/src/io/anuke/mindustry/net/CrashSender.java +++ b/core/src/io/anuke/mindustry/net/CrashSender.java @@ -26,7 +26,7 @@ public class CrashSender{ exception.printStackTrace(); //don't create crash logs for custom builds, as it's expected - if(Version.build == -1) return; + if(Version.build == -1 || (System.getProperty("user.name").equals("anuke") && "release".equals(Version.modifier))) return; //attempt to load version regardless if(Version.number == 0){ diff --git a/core/src/io/anuke/mindustry/net/Net.java b/core/src/io/anuke/mindustry/net/Net.java index eddd19c1e6..6cb22a7794 100644 --- a/core/src/io/anuke/mindustry/net/Net.java +++ b/core/src/io/anuke/mindustry/net/Net.java @@ -1,10 +1,10 @@ package io.anuke.mindustry.net; -import io.anuke.annotations.Annotations.*; import io.anuke.arc.*; import io.anuke.arc.collection.*; import io.anuke.arc.function.*; import io.anuke.arc.util.*; +import io.anuke.arc.util.ArcAnnotate.*; import io.anuke.arc.util.pooling.*; import io.anuke.mindustry.gen.*; import io.anuke.mindustry.net.Packets.*; @@ -21,7 +21,8 @@ public class Net{ private boolean server; private boolean active; private boolean clientLoaded; - private @Nullable StreamBuilder currentStream; + private @Nullable + StreamBuilder currentStream; private final Array packetQueue = new Array<>(); private final ObjectMap, Consumer> clientListeners = new ObjectMap<>(); diff --git a/core/src/io/anuke/mindustry/net/NetConnection.java b/core/src/io/anuke/mindustry/net/NetConnection.java index a6bea925ba..bdfca50886 100644 --- a/core/src/io/anuke/mindustry/net/NetConnection.java +++ b/core/src/io/anuke/mindustry/net/NetConnection.java @@ -1,7 +1,7 @@ package io.anuke.mindustry.net; -import io.anuke.annotations.Annotations.*; import io.anuke.arc.util.*; +import io.anuke.arc.util.ArcAnnotate.*; import io.anuke.mindustry.entities.type.*; import io.anuke.mindustry.gen.*; import io.anuke.mindustry.net.Administration.*; @@ -15,7 +15,8 @@ import static io.anuke.mindustry.Vars.netServer; public abstract class NetConnection{ public final String address; public boolean mobile, modclient; - public @Nullable Player player; + public @Nullable + Player player; /** ID of last recieved client snapshot. */ public int lastRecievedClientSnapshot = -1; diff --git a/core/src/io/anuke/mindustry/type/UnitType.java b/core/src/io/anuke/mindustry/type/UnitType.java index a32590c1fd..74c51c5547 100644 --- a/core/src/io/anuke/mindustry/type/UnitType.java +++ b/core/src/io/anuke/mindustry/type/UnitType.java @@ -6,6 +6,7 @@ import io.anuke.arc.collection.*; import io.anuke.arc.function.*; import io.anuke.arc.graphics.g2d.*; import io.anuke.arc.scene.ui.layout.*; +import io.anuke.arc.util.ArcAnnotate.*; import io.anuke.mindustry.content.*; import io.anuke.mindustry.entities.type.*; import io.anuke.mindustry.game.*; @@ -13,8 +14,9 @@ import io.anuke.mindustry.gen.*; import io.anuke.mindustry.ui.*; public class UnitType extends UnlockableContent{ - public final TypeID typeID; - public final Supplier constructor; + public final @NonNull + TypeID typeID; + public final @NonNull Supplier constructor; public float health = 60; public float hitsize = 7f; @@ -25,7 +27,7 @@ public class UnitType extends UnlockableContent{ public float baseRotateSpeed = 0.1f; public float shootCone = 15f; public float mass = 1f; - public boolean isFlying; + public boolean flying; public boolean targetAir = true; public boolean rotateWeapon = false; public float drag = 0.1f; @@ -34,7 +36,7 @@ public class UnitType extends UnlockableContent{ public int itemCapacity = 30; public ObjectSet toMine = ObjectSet.with(Items.lead, Items.copper); public float buildPower = 0.3f, minePower = 0.7f; - public Weapon weapon; + public @NonNull Weapon weapon; public float weaponOffsetY, engineOffset = 6f, engineSize = 2f; public ObjectSet immunities = new ObjectSet<>(); public Sound deathSound = Sounds.bang; diff --git a/core/src/io/anuke/mindustry/type/Weapon.java b/core/src/io/anuke/mindustry/type/Weapon.java index 980859c01d..de70c5f3d3 100644 --- a/core/src/io/anuke/mindustry/type/Weapon.java +++ b/core/src/io/anuke/mindustry/type/Weapon.java @@ -6,6 +6,7 @@ import io.anuke.arc.audio.*; import io.anuke.arc.graphics.g2d.*; import io.anuke.arc.math.*; import io.anuke.arc.util.*; +import io.anuke.arc.util.ArcAnnotate.*; import io.anuke.mindustry.*; import io.anuke.mindustry.content.*; import io.anuke.mindustry.entities.*; @@ -25,7 +26,7 @@ public class Weapon{ protected static float minPlayerDist = 20f; protected static int sequenceNum = 0; /** bullet shot */ - public BulletType bullet; + public @NonNull BulletType bullet; /** shell ejection effect */ public Effect ejectEffect = Fx.none; /** weapon reload in frames */ diff --git a/core/src/io/anuke/mindustry/ui/dialogs/MapPlayDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/MapPlayDialog.java index b3da2b2f3f..de6dccaefe 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/MapPlayDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/MapPlayDialog.java @@ -1,10 +1,10 @@ package io.anuke.mindustry.ui.dialogs; -import io.anuke.annotations.Annotations.*; import io.anuke.arc.*; import io.anuke.arc.scene.ui.*; import io.anuke.arc.scene.ui.layout.*; import io.anuke.arc.util.*; +import io.anuke.arc.util.ArcAnnotate.*; import io.anuke.mindustry.game.*; import io.anuke.mindustry.gen.*; import io.anuke.mindustry.maps.*; @@ -15,7 +15,8 @@ import static io.anuke.mindustry.Vars.*; public class MapPlayDialog extends FloatingDialog{ CustomRulesDialog dialog = new CustomRulesDialog(); Rules rules; - @NonNull Gamemode selectedGamemode = Gamemode.survival; + @NonNull + Gamemode selectedGamemode = Gamemode.survival; Map lastMap; public MapPlayDialog(){ diff --git a/core/src/io/anuke/mindustry/world/blocks/BuildBlock.java b/core/src/io/anuke/mindustry/world/blocks/BuildBlock.java index a78445b81e..f0891b72c3 100644 --- a/core/src/io/anuke/mindustry/world/blocks/BuildBlock.java +++ b/core/src/io/anuke/mindustry/world/blocks/BuildBlock.java @@ -8,6 +8,7 @@ import io.anuke.arc.Graphics.Cursor.SystemCursor; import io.anuke.arc.graphics.g2d.Draw; import io.anuke.arc.graphics.g2d.TextureRegion; import io.anuke.arc.math.Mathf; +import io.anuke.arc.util.ArcAnnotate.*; import io.anuke.mindustry.content.Fx; import io.anuke.mindustry.entities.Effects; import io.anuke.mindustry.entities.effect.RubbleDecal; @@ -172,7 +173,8 @@ public class BuildBlock extends Block{ * The recipe of the block that is being constructed. * If there is no recipe for this block, as is the case with rocks, 'previous' is used. */ - public @Nullable Block cblock; + public @Nullable + Block cblock; public float progress = 0; public float buildCost; diff --git a/core/src/io/anuke/mindustry/world/blocks/storage/StorageBlock.java b/core/src/io/anuke/mindustry/world/blocks/storage/StorageBlock.java index 28566f1ca7..aa177b1caf 100644 --- a/core/src/io/anuke/mindustry/world/blocks/storage/StorageBlock.java +++ b/core/src/io/anuke/mindustry/world/blocks/storage/StorageBlock.java @@ -1,6 +1,6 @@ package io.anuke.mindustry.world.blocks.storage; -import io.anuke.annotations.Annotations.*; +import io.anuke.arc.util.ArcAnnotate.*; import io.anuke.mindustry.entities.type.TileEntity; import io.anuke.mindustry.type.Item; import io.anuke.mindustry.world.Block; @@ -75,6 +75,7 @@ public abstract class StorageBlock extends Block{ } public class StorageBlockEntity extends TileEntity{ - protected @Nullable Tile linkedCore; + protected @Nullable + Tile linkedCore; } } diff --git a/gradle.properties b/gradle.properties index 678dbb3d37..8951c94955 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=true org.gradle.jvmargs=-Xms256m -Xmx1024m -archash=d4519a9721927165850bfe3135ef6b095c990474 +archash=029f47c10a8e269cd8e20d13b0d06fddb572c484 diff --git a/tools/src/io/anuke/mindustry/Generators.java b/tools/src/io/anuke/mindustry/Generators.java index e604f4ca3a..f4d595e94d 100644 --- a/tools/src/io/anuke/mindustry/Generators.java +++ b/tools/src/io/anuke/mindustry/Generators.java @@ -218,7 +218,7 @@ public class Generators{ }); ImagePacker.generate("unit-icons", () -> { - content.getBy(ContentType.unit).each(type -> !type.isFlying, type -> { + content.getBy(ContentType.unit).each(type -> !type.flying, type -> { type.load(); type.weapon.load();