Parsing fixes / Moved annotations to Arc

This commit is contained in:
Anuken
2019-09-29 16:09:43 -04:00
parent f17e46015a
commit 33416aadef
37 changed files with 148 additions and 85 deletions

View File

@@ -22,20 +22,6 @@ public class Annotations{
public @interface OverrideCallSuper { 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. */ /** Marks a class as serializable. */
@Target(ElementType.TYPE) @Target(ElementType.TYPE)
@Retention(RetentionPolicy.SOURCE) @Retention(RetentionPolicy.SOURCE)

View File

@@ -6,6 +6,7 @@ import io.anuke.arc.collection.*;
import io.anuke.arc.function.*; import io.anuke.arc.function.*;
import io.anuke.arc.math.geom.*; import io.anuke.arc.math.geom.*;
import io.anuke.arc.util.*; import io.anuke.arc.util.*;
import io.anuke.arc.util.ArcAnnotate.*;
import io.anuke.arc.util.async.*; import io.anuke.arc.util.async.*;
import io.anuke.mindustry.game.EventType.*; import io.anuke.mindustry.game.EventType.*;
import io.anuke.mindustry.game.*; import io.anuke.mindustry.game.*;
@@ -32,7 +33,8 @@ public class Pathfinder implements Runnable{
/** handles task scheduling on the update thread. */ /** handles task scheduling on the update thread. */
private TaskQueue queue = new TaskQueue(); private TaskQueue queue = new TaskQueue();
/** current pathfinding thread */ /** current pathfinding thread */
private @Nullable Thread thread; private @Nullable
Thread thread;
public Pathfinder(){ public Pathfinder(){
Events.on(WorldLoadEvent.class, event -> { Events.on(WorldLoadEvent.class, event -> {

View File

@@ -48,7 +48,7 @@ public class WaveSpawner{
for(SpawnGroup group : state.rules.spawns){ for(SpawnGroup group : state.rules.spawns){
int spawned = group.getUnitsSpawned(state.wave - 1); int spawned = group.getUnitsSpawned(state.wave - 1);
if(group.type.isFlying){ if(group.type.flying){
float spread = margin / 1.5f; float spread = margin / 1.5f;
eachFlyerSpawn((spawnX, spawnY) -> { eachFlyerSpawn((spawnX, spawnY) -> {

View File

@@ -18,7 +18,7 @@ public class UnitTypes implements ContentList{
@Override @Override
public void load(){ public void load(){
draug = new UnitType("draug", Draug.class, Draug::new){{ draug = new UnitType("draug", Draug.class, Draug::new){{
isFlying = true; flying = true;
drag = 0.01f; drag = 0.01f;
speed = 0.3f; speed = 0.3f;
maxVelocity = 1.2f; maxVelocity = 1.2f;
@@ -33,7 +33,7 @@ public class UnitTypes implements ContentList{
}}; }};
spirit = new UnitType("spirit", Spirit.class, Spirit::new){{ spirit = new UnitType("spirit", Spirit.class, Spirit::new){{
isFlying = true; flying = true;
drag = 0.01f; drag = 0.01f;
speed = 0.4f; speed = 0.4f;
maxVelocity = 1.6f; maxVelocity = 1.6f;
@@ -54,7 +54,7 @@ public class UnitTypes implements ContentList{
}}; }};
phantom = new UnitType("phantom", Phantom.class, Phantom::new){{ phantom = new UnitType("phantom", Phantom.class, Phantom::new){{
isFlying = true; flying = true;
drag = 0.01f; drag = 0.01f;
mass = 2f; mass = 2f;
speed = 0.45f; speed = 0.45f;
@@ -244,7 +244,7 @@ public class UnitTypes implements ContentList{
maxVelocity = 1.9f; maxVelocity = 1.9f;
drag = 0.01f; drag = 0.01f;
mass = 1.5f; mass = 1.5f;
isFlying = true; flying = true;
health = 75; health = 75;
engineOffset = 5.5f; engineOffset = 5.5f;
range = 140f; range = 140f;
@@ -264,7 +264,7 @@ public class UnitTypes implements ContentList{
maxVelocity = 1.4f; maxVelocity = 1.4f;
mass = 3f; mass = 3f;
drag = 0.01f; drag = 0.01f;
isFlying = true; flying = true;
targetAir = false; targetAir = false;
engineOffset = 7.8f; engineOffset = 7.8f;
range = 140f; range = 140f;
@@ -291,7 +291,7 @@ public class UnitTypes implements ContentList{
drag = 0.01f; drag = 0.01f;
range = 80f; range = 80f;
shootCone = 40f; shootCone = 40f;
isFlying = true; flying = true;
rotateWeapon = true; rotateWeapon = true;
engineOffset = 12f; engineOffset = 12f;
engineSize = 3f; engineSize = 3f;
@@ -322,7 +322,7 @@ public class UnitTypes implements ContentList{
drag = 0.02f; drag = 0.02f;
range = 80f; range = 80f;
shootCone = 20f; shootCone = 20f;
isFlying = true; flying = true;
rotateWeapon = true; rotateWeapon = true;
engineOffset = 21; engineOffset = 21;
engineSize = 5.3f; engineSize = 5.3f;
@@ -355,7 +355,7 @@ public class UnitTypes implements ContentList{
drag = 0.02f; drag = 0.02f;
range = 80f; range = 80f;
shootCone = 30f; shootCone = 30f;
isFlying = true; flying = true;
rotateWeapon = true; rotateWeapon = true;
engineOffset = 40; engineOffset = 40;
engineSize = 7.3f; engineSize = 7.3f;

View File

@@ -60,7 +60,9 @@ public class ContentLoader{
setupMapping(); setupMapping();
mods.loadContent(); if(mods != null){
mods.loadContent();
}
setupMapping(); setupMapping();

View File

@@ -1,11 +1,11 @@
package io.anuke.mindustry.core; package io.anuke.mindustry.core;
import io.anuke.annotations.Annotations.*;
import io.anuke.arc.*; import io.anuke.arc.*;
import io.anuke.arc.collection.*; import io.anuke.arc.collection.*;
import io.anuke.arc.math.*; import io.anuke.arc.math.*;
import io.anuke.arc.math.geom.*; import io.anuke.arc.math.geom.*;
import io.anuke.arc.util.*; import io.anuke.arc.util.*;
import io.anuke.arc.util.ArcAnnotate.*;
import io.anuke.mindustry.content.*; import io.anuke.mindustry.content.*;
import io.anuke.mindustry.core.GameState.*; import io.anuke.mindustry.core.GameState.*;
import io.anuke.mindustry.game.EventType.*; import io.anuke.mindustry.game.EventType.*;
@@ -82,7 +82,8 @@ public class World{
return height()*tilesize; 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)); return tiles == null ? null : tile(Pos.x(pos), Pos.y(pos));
} }

View File

@@ -1,6 +1,5 @@
package io.anuke.mindustry.entities.traits; package io.anuke.mindustry.entities.traits;
import io.anuke.annotations.Annotations.*;
import io.anuke.arc.*; import io.anuke.arc.*;
import io.anuke.arc.collection.Queue; import io.anuke.arc.collection.Queue;
import io.anuke.arc.collection.*; 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.*;
import io.anuke.arc.math.geom.*; import io.anuke.arc.math.geom.*;
import io.anuke.arc.util.*; import io.anuke.arc.util.*;
import io.anuke.arc.util.ArcAnnotate.*;
import io.anuke.mindustry.*; import io.anuke.mindustry.*;
import io.anuke.mindustry.content.*; import io.anuke.mindustry.content.*;
import io.anuke.mindustry.entities.type.*; 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. * Return the build requests currently active, or the one at the top of the queue.
* May return null. * May return null.
*/ */
default @Nullable BuildRequest buildRequest(){ default @Nullable
BuildRequest buildRequest(){
return buildQueue().size == 0 ? null : buildQueue().first(); return buildQueue().size == 0 ? null : buildQueue().first();
} }

View File

@@ -6,6 +6,7 @@ import io.anuke.arc.graphics.g2d.*;
import io.anuke.arc.math.*; import io.anuke.arc.math.*;
import io.anuke.arc.math.geom.*; import io.anuke.arc.math.geom.*;
import io.anuke.arc.util.*; import io.anuke.arc.util.*;
import io.anuke.arc.util.ArcAnnotate.*;
import io.anuke.mindustry.*; import io.anuke.mindustry.*;
import io.anuke.mindustry.content.*; import io.anuke.mindustry.content.*;
import io.anuke.mindustry.entities.*; 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); return world.tile(spawner);
} }
@@ -263,7 +265,7 @@ public abstract class BaseUnit extends Unit implements ShooterTrait{
@Override @Override
public boolean isFlying(){ public boolean isFlying(){
return type.isFlying; return type.flying;
} }
@Override @Override

View File

@@ -10,6 +10,7 @@ import io.anuke.arc.math.geom.*;
import io.anuke.arc.scene.ui.*; import io.anuke.arc.scene.ui.*;
import io.anuke.arc.scene.ui.layout.*; import io.anuke.arc.scene.ui.layout.*;
import io.anuke.arc.util.*; import io.anuke.arc.util.*;
import io.anuke.arc.util.ArcAnnotate.*;
import io.anuke.arc.util.pooling.*; import io.anuke.arc.util.pooling.*;
import io.anuke.mindustry.*; import io.anuke.mindustry.*;
import io.anuke.mindustry.content.*; import io.anuke.mindustry.content.*;
@@ -48,7 +49,8 @@ public class Player extends Unit implements BuilderMinerTrait, ShooterTrait{
public float baseRotation; public float baseRotation;
public float pointerX, pointerY; public float pointerX, pointerY;
public String name = "noname"; public String name = "noname";
public @Nullable String uuid, usid; public @Nullable
String uuid, usid;
public boolean isAdmin, isTransferring, isShooting, isBoosting, isMobile, isTyping; public boolean isAdmin, isTransferring, isShooting, isBoosting, isMobile, isTyping;
public float boostHeat, shootHeat, destructTime; public float boostHeat, shootHeat, destructTime;
public boolean achievedFlight; public boolean achievedFlight;

View File

@@ -7,6 +7,7 @@ import io.anuke.arc.collection.ObjectSet;
import io.anuke.arc.math.geom.Point2; import io.anuke.arc.math.geom.Point2;
import io.anuke.arc.math.geom.Vector2; import io.anuke.arc.math.geom.Vector2;
import io.anuke.arc.util.*; import io.anuke.arc.util.*;
import io.anuke.arc.util.ArcAnnotate.*;
import io.anuke.mindustry.entities.EntityGroup; import io.anuke.mindustry.entities.EntityGroup;
import io.anuke.mindustry.entities.traits.HealthTrait; import io.anuke.mindustry.entities.traits.HealthTrait;
import io.anuke.mindustry.entities.traits.TargetTrait; 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 dead = false;
private boolean sleeping; private boolean sleeping;
private float sleepTime; private float sleepTime;
private @Nullable SoundLoop sound; private @Nullable
SoundLoop sound;
@Remote(called = Loc.server, unreliable = true) @Remote(called = Loc.server, unreliable = true)
public static void onTileDamage(Tile tile, float health){ public static void onTileDamage(Tile tile, float health){

View File

@@ -1,6 +1,5 @@
package io.anuke.mindustry.entities.type; package io.anuke.mindustry.entities.type;
import io.anuke.annotations.Annotations.*;
import io.anuke.arc.*; import io.anuke.arc.*;
import io.anuke.arc.collection.*; import io.anuke.arc.collection.*;
import io.anuke.arc.graphics.*; import io.anuke.arc.graphics.*;
@@ -9,6 +8,7 @@ import io.anuke.arc.math.*;
import io.anuke.arc.math.geom.*; import io.anuke.arc.math.geom.*;
import io.anuke.arc.scene.ui.layout.*; import io.anuke.arc.scene.ui.layout.*;
import io.anuke.arc.util.*; import io.anuke.arc.util.*;
import io.anuke.arc.util.ArcAnnotate.*;
import io.anuke.mindustry.content.*; import io.anuke.mindustry.content.*;
import io.anuke.mindustry.entities.*; import io.anuke.mindustry.entities.*;
import io.anuke.mindustry.entities.effect.*; 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); TeamData data = state.teams.get(team);
Tile tile = Geometry.findClosest(x, y, data.cores); Tile tile = Geometry.findClosest(x, y, data.cores);

View File

@@ -2,7 +2,6 @@ package io.anuke.mindustry.entities.type.base;
import io.anuke.arc.math.Mathf; import io.anuke.arc.math.Mathf;
import io.anuke.arc.math.geom.Geometry; import io.anuke.arc.math.geom.Geometry;
import io.anuke.mindustry.entities.type.FlyingUnit;
import io.anuke.mindustry.entities.units.*; import io.anuke.mindustry.entities.units.*;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.meta.BlockFlag; import io.anuke.mindustry.world.meta.BlockFlag;

View File

@@ -1,6 +1,4 @@
package io.anuke.mindustry.entities.type.base; package io.anuke.mindustry.entities.type.base;
import io.anuke.mindustry.entities.type.GroundUnit;
public class Crawler extends GroundUnit{ public class Crawler extends GroundUnit{
} }

View File

@@ -1,7 +1,5 @@
package io.anuke.mindustry.entities.type.base; package io.anuke.mindustry.entities.type.base;
import io.anuke.mindustry.entities.type.GroundUnit;
public class Dagger extends GroundUnit{ public class Dagger extends GroundUnit{
} }

View File

@@ -1,6 +1,4 @@
package io.anuke.mindustry.entities.type.base; package io.anuke.mindustry.entities.type.base;
import io.anuke.mindustry.entities.type.GroundUnit;
public class Eruptor extends GroundUnit{ public class Eruptor extends GroundUnit{
} }

View File

@@ -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.*;
import io.anuke.arc.graphics.g2d.*; import io.anuke.arc.graphics.g2d.*;
@@ -8,6 +8,7 @@ import io.anuke.arc.util.*;
import io.anuke.mindustry.*; import io.anuke.mindustry.*;
import io.anuke.mindustry.entities.*; import io.anuke.mindustry.entities.*;
import io.anuke.mindustry.entities.bullet.*; import io.anuke.mindustry.entities.bullet.*;
import io.anuke.mindustry.entities.type.*;
import io.anuke.mindustry.entities.units.*; import io.anuke.mindustry.entities.units.*;
import io.anuke.mindustry.graphics.*; import io.anuke.mindustry.graphics.*;
import io.anuke.mindustry.world.*; import io.anuke.mindustry.world.*;
@@ -15,7 +16,7 @@ import io.anuke.mindustry.world.meta.*;
import static io.anuke.mindustry.Vars.*; import static io.anuke.mindustry.Vars.*;
public abstract class FlyingUnit extends BaseUnit{ public class FlyingUnit extends BaseUnit{
protected float[] weaponAngles = {0,0}; protected float[] weaponAngles = {0,0};
protected final UnitState protected final UnitState

View File

@@ -1,6 +1,4 @@
package io.anuke.mindustry.entities.type.base; package io.anuke.mindustry.entities.type.base;
import io.anuke.mindustry.entities.type.GroundUnit;
public class Fortress extends GroundUnit{ public class Fortress extends GroundUnit{
} }

View File

@@ -1,7 +1,5 @@
package io.anuke.mindustry.entities.type.base; package io.anuke.mindustry.entities.type.base;
import io.anuke.mindustry.entities.type.FlyingUnit;
public class Ghoul extends FlyingUnit{ public class Ghoul extends FlyingUnit{
} }

View File

@@ -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.*;
import io.anuke.arc.graphics.g2d.*; import io.anuke.arc.graphics.g2d.*;
@@ -9,6 +9,7 @@ import io.anuke.mindustry.*;
import io.anuke.mindustry.ai.Pathfinder.*; import io.anuke.mindustry.ai.Pathfinder.*;
import io.anuke.mindustry.entities.*; import io.anuke.mindustry.entities.*;
import io.anuke.mindustry.entities.bullet.*; import io.anuke.mindustry.entities.bullet.*;
import io.anuke.mindustry.entities.type.*;
import io.anuke.mindustry.entities.units.*; import io.anuke.mindustry.entities.units.*;
import io.anuke.mindustry.game.*; import io.anuke.mindustry.game.*;
import io.anuke.mindustry.type.*; import io.anuke.mindustry.type.*;
@@ -18,7 +19,7 @@ import io.anuke.mindustry.world.meta.*;
import static io.anuke.mindustry.Vars.*; import static io.anuke.mindustry.Vars.*;
public abstract class GroundUnit extends BaseUnit{ public class GroundUnit extends BaseUnit{
protected static Vector2 vec = new Vector2(); protected static Vector2 vec = new Vector2();
protected float walkTime; protected float walkTime;

View File

@@ -4,7 +4,6 @@ import io.anuke.arc.graphics.g2d.Draw;
import io.anuke.arc.math.Angles; import io.anuke.arc.math.Angles;
import io.anuke.arc.math.Mathf; import io.anuke.arc.math.Mathf;
import io.anuke.mindustry.entities.Units; import io.anuke.mindustry.entities.Units;
import io.anuke.mindustry.entities.type.FlyingUnit;
public class Revenant extends FlyingUnit{ public class Revenant extends FlyingUnit{

View File

@@ -1,7 +1,5 @@
package io.anuke.mindustry.entities.type.base; package io.anuke.mindustry.entities.type.base;
import io.anuke.mindustry.entities.type.GroundUnit;
public class Titan extends GroundUnit{ public class Titan extends GroundUnit{
} }

View File

@@ -1,7 +1,5 @@
package io.anuke.mindustry.entities.type.base; package io.anuke.mindustry.entities.type.base;
import io.anuke.mindustry.entities.type.FlyingUnit;
public class Wraith extends FlyingUnit{ public class Wraith extends FlyingUnit{
} }

View File

@@ -1,6 +1,6 @@
package io.anuke.mindustry.game; 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.core.GameState.State;
import io.anuke.mindustry.entities.traits.BuilderTrait; import io.anuke.mindustry.entities.traits.BuilderTrait;
import io.anuke.mindustry.entities.type.*; import io.anuke.mindustry.entities.type.*;
@@ -195,7 +195,8 @@ public class EventType{
public static class BlockBuildEndEvent{ public static class BlockBuildEndEvent{
public final Tile tile; public final Tile tile;
public final Team team; public final Team team;
public final @Nullable Player player; public final @Nullable
Player player;
public final boolean breaking; public final boolean breaking;
public BlockBuildEndEvent(Tile tile, @Nullable Player player, Team team, boolean breaking){ public BlockBuildEndEvent(Tile tile, @Nullable Player player, Team team, boolean breaking){

View File

@@ -1,11 +1,11 @@
package io.anuke.mindustry.game; package io.anuke.mindustry.game;
import io.anuke.annotations.Annotations.*;
import io.anuke.arc.*; import io.anuke.arc.*;
import io.anuke.arc.audio.*; import io.anuke.arc.audio.*;
import io.anuke.arc.collection.*; import io.anuke.arc.collection.*;
import io.anuke.arc.math.*; import io.anuke.arc.math.*;
import io.anuke.arc.util.*; import io.anuke.arc.util.*;
import io.anuke.arc.util.ArcAnnotate.*;
import io.anuke.mindustry.core.GameState.*; import io.anuke.mindustry.core.GameState.*;
import io.anuke.mindustry.game.EventType.*; import io.anuke.mindustry.game.EventType.*;
import io.anuke.mindustry.gen.*; import io.anuke.mindustry.gen.*;
@@ -22,7 +22,8 @@ public class MusicControl{
public Array<Music> darkMusic = Array.with(); public Array<Music> darkMusic = Array.with();
private Music lastRandomPlayed; private Music lastRandomPlayed;
private Interval timer = new Interval(); private Interval timer = new Interval();
private @Nullable Music current; private @Nullable
Music current;
private float fade; private float fade;
private boolean silenced; private boolean silenced;

View File

@@ -1,17 +1,18 @@
package io.anuke.mindustry.graphics; package io.anuke.mindustry.graphics;
import io.anuke.annotations.Annotations.*;
import io.anuke.arc.Core; import io.anuke.arc.Core;
import io.anuke.arc.graphics.Color; import io.anuke.arc.graphics.Color;
import io.anuke.arc.graphics.g2d.TextureRegion; import io.anuke.arc.graphics.g2d.TextureRegion;
import io.anuke.arc.graphics.glutils.Shader; import io.anuke.arc.graphics.glutils.Shader;
import io.anuke.arc.scene.ui.layout.Scl; import io.anuke.arc.scene.ui.layout.Scl;
import io.anuke.arc.util.ArcAnnotate.*;
import io.anuke.arc.util.Time; import io.anuke.arc.util.Time;
public class Shaders{ public class Shaders{
public static Shadow shadow; public static Shadow shadow;
public static BlockBuild blockbuild; public static BlockBuild blockbuild;
public static @Nullable Shield shield; public static @Nullable
Shield shield;
public static UnitBuild build; public static UnitBuild build;
public static FogShader fog; public static FogShader fog;
public static MenuShader menu; public static MenuShader menu;

View File

@@ -1,11 +1,16 @@
package io.anuke.mindustry.mod; package io.anuke.mindustry.mod;
import io.anuke.arc.collection.*; import io.anuke.arc.collection.*;
import io.anuke.arc.graphics.*;
import io.anuke.arc.util.*; import io.anuke.arc.util.*;
import io.anuke.arc.util.ArcAnnotate.*;
import io.anuke.arc.util.reflect.*; import io.anuke.arc.util.reflect.*;
import io.anuke.arc.util.serialization.*; import io.anuke.arc.util.serialization.*;
import io.anuke.arc.util.serialization.Json.*; import io.anuke.arc.util.serialization.Json.*;
import io.anuke.mindustry.*; 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.game.*;
import io.anuke.mindustry.type.*; import io.anuke.mindustry.type.*;
import io.anuke.mindustry.world.*; import io.anuke.mindustry.world.*;
@@ -17,10 +22,21 @@ public class ContentParser{
private Json parser = new Json(){ private Json parser = new Json(){
public <T> T readValue(Class<T> type, Class elementType, JsonValue jsonData){ public <T> T readValue(Class<T> type, Class elementType, JsonValue jsonData){
if(type != null && Content.class.isAssignableFrom(type)){ try{
return (T)Vars.content.getByName(contentTypes.getThrow(type, () -> new IllegalArgumentException("No content type for class: " + type.getSimpleName())), jsonData.asString()); 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; return block;
},
ContentType.item, (TypeParser<Item>)(mod, name, value) -> {
Item item = new Item(mod + "-" + name, new Color(Color.black));
readFields(item, value);
return item;
},
ContentType.unit, (TypeParser<UnitType>)(mod, name, value) -> {
String clas = value.getString("type");
Class<BaseUnit> type = resolve("io.anuke.mindustry.entities.type.base." + clas);
java.lang.reflect.Constructor<BaseUnit> 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 + "'"); 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<Object> 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){ private void readFields(Object object, JsonValue jsonMap){

View File

@@ -1,6 +1,5 @@
package io.anuke.mindustry.mod; package io.anuke.mindustry.mod;
import io.anuke.annotations.Annotations.*;
import io.anuke.arc.*; import io.anuke.arc.*;
import io.anuke.arc.assets.*; import io.anuke.arc.assets.*;
import io.anuke.arc.collection.*; 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.Texture.*;
import io.anuke.arc.graphics.g2d.*; import io.anuke.arc.graphics.g2d.*;
import io.anuke.arc.util.*; import io.anuke.arc.util.*;
import io.anuke.arc.util.ArcAnnotate.*;
import io.anuke.arc.util.io.*; import io.anuke.arc.util.io.*;
import io.anuke.arc.util.serialization.*; import io.anuke.arc.util.serialization.*;
import io.anuke.mindustry.game.*; 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. */ /** @return the loaded mod found by class, or null if not found. */
public @Nullable LoadedMod getMod(Class<? extends Mod> type){ public @Nullable
LoadedMod getMod(Class<? extends Mod> type){
return loaded.find(l -> l.mod.getClass() == type); return loaded.find(l -> l.mod.getClass() == type);
} }
@@ -186,7 +187,7 @@ public class Mods implements Loadable{
if(mod.root.child("content").exists()){ if(mod.root.child("content").exists()){
FileHandle contentRoot = mod.root.child("content"); FileHandle contentRoot = mod.root.child("content");
for(ContentType type : ContentType.all){ for(ContentType type : ContentType.all){
FileHandle folder = contentRoot.child(type.name() + "s"); FileHandle folder = contentRoot.child(type.name().toLowerCase() + "s");
if(folder.exists()){ if(folder.exists()){
for(FileHandle file : folder.list()){ for(FileHandle file : folder.list()){
if(file.extension().equals("json")){ if(file.extension().equals("json")){

View File

@@ -26,7 +26,7 @@ public class CrashSender{
exception.printStackTrace(); exception.printStackTrace();
//don't create crash logs for custom builds, as it's expected //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 //attempt to load version regardless
if(Version.number == 0){ if(Version.number == 0){

View File

@@ -1,10 +1,10 @@
package io.anuke.mindustry.net; package io.anuke.mindustry.net;
import io.anuke.annotations.Annotations.*;
import io.anuke.arc.*; import io.anuke.arc.*;
import io.anuke.arc.collection.*; import io.anuke.arc.collection.*;
import io.anuke.arc.function.*; import io.anuke.arc.function.*;
import io.anuke.arc.util.*; import io.anuke.arc.util.*;
import io.anuke.arc.util.ArcAnnotate.*;
import io.anuke.arc.util.pooling.*; import io.anuke.arc.util.pooling.*;
import io.anuke.mindustry.gen.*; import io.anuke.mindustry.gen.*;
import io.anuke.mindustry.net.Packets.*; import io.anuke.mindustry.net.Packets.*;
@@ -21,7 +21,8 @@ public class Net{
private boolean server; private boolean server;
private boolean active; private boolean active;
private boolean clientLoaded; private boolean clientLoaded;
private @Nullable StreamBuilder currentStream; private @Nullable
StreamBuilder currentStream;
private final Array<Object> packetQueue = new Array<>(); private final Array<Object> packetQueue = new Array<>();
private final ObjectMap<Class<?>, Consumer> clientListeners = new ObjectMap<>(); private final ObjectMap<Class<?>, Consumer> clientListeners = new ObjectMap<>();

View File

@@ -1,7 +1,7 @@
package io.anuke.mindustry.net; package io.anuke.mindustry.net;
import io.anuke.annotations.Annotations.*;
import io.anuke.arc.util.*; import io.anuke.arc.util.*;
import io.anuke.arc.util.ArcAnnotate.*;
import io.anuke.mindustry.entities.type.*; import io.anuke.mindustry.entities.type.*;
import io.anuke.mindustry.gen.*; import io.anuke.mindustry.gen.*;
import io.anuke.mindustry.net.Administration.*; import io.anuke.mindustry.net.Administration.*;
@@ -15,7 +15,8 @@ import static io.anuke.mindustry.Vars.netServer;
public abstract class NetConnection{ public abstract class NetConnection{
public final String address; public final String address;
public boolean mobile, modclient; public boolean mobile, modclient;
public @Nullable Player player; public @Nullable
Player player;
/** ID of last recieved client snapshot. */ /** ID of last recieved client snapshot. */
public int lastRecievedClientSnapshot = -1; public int lastRecievedClientSnapshot = -1;

View File

@@ -6,6 +6,7 @@ import io.anuke.arc.collection.*;
import io.anuke.arc.function.*; import io.anuke.arc.function.*;
import io.anuke.arc.graphics.g2d.*; import io.anuke.arc.graphics.g2d.*;
import io.anuke.arc.scene.ui.layout.*; import io.anuke.arc.scene.ui.layout.*;
import io.anuke.arc.util.ArcAnnotate.*;
import io.anuke.mindustry.content.*; import io.anuke.mindustry.content.*;
import io.anuke.mindustry.entities.type.*; import io.anuke.mindustry.entities.type.*;
import io.anuke.mindustry.game.*; import io.anuke.mindustry.game.*;
@@ -13,8 +14,9 @@ import io.anuke.mindustry.gen.*;
import io.anuke.mindustry.ui.*; import io.anuke.mindustry.ui.*;
public class UnitType extends UnlockableContent{ public class UnitType extends UnlockableContent{
public final TypeID typeID; public final @NonNull
public final Supplier<? extends BaseUnit> constructor; TypeID typeID;
public final @NonNull Supplier<? extends BaseUnit> constructor;
public float health = 60; public float health = 60;
public float hitsize = 7f; public float hitsize = 7f;
@@ -25,7 +27,7 @@ public class UnitType extends UnlockableContent{
public float baseRotateSpeed = 0.1f; public float baseRotateSpeed = 0.1f;
public float shootCone = 15f; public float shootCone = 15f;
public float mass = 1f; public float mass = 1f;
public boolean isFlying; public boolean flying;
public boolean targetAir = true; public boolean targetAir = true;
public boolean rotateWeapon = false; public boolean rotateWeapon = false;
public float drag = 0.1f; public float drag = 0.1f;
@@ -34,7 +36,7 @@ public class UnitType extends UnlockableContent{
public int itemCapacity = 30; public int itemCapacity = 30;
public ObjectSet<Item> toMine = ObjectSet.with(Items.lead, Items.copper); public ObjectSet<Item> toMine = ObjectSet.with(Items.lead, Items.copper);
public float buildPower = 0.3f, minePower = 0.7f; public float buildPower = 0.3f, minePower = 0.7f;
public Weapon weapon; public @NonNull Weapon weapon;
public float weaponOffsetY, engineOffset = 6f, engineSize = 2f; public float weaponOffsetY, engineOffset = 6f, engineSize = 2f;
public ObjectSet<StatusEffect> immunities = new ObjectSet<>(); public ObjectSet<StatusEffect> immunities = new ObjectSet<>();
public Sound deathSound = Sounds.bang; public Sound deathSound = Sounds.bang;

View File

@@ -6,6 +6,7 @@ import io.anuke.arc.audio.*;
import io.anuke.arc.graphics.g2d.*; import io.anuke.arc.graphics.g2d.*;
import io.anuke.arc.math.*; import io.anuke.arc.math.*;
import io.anuke.arc.util.*; import io.anuke.arc.util.*;
import io.anuke.arc.util.ArcAnnotate.*;
import io.anuke.mindustry.*; import io.anuke.mindustry.*;
import io.anuke.mindustry.content.*; import io.anuke.mindustry.content.*;
import io.anuke.mindustry.entities.*; import io.anuke.mindustry.entities.*;
@@ -25,7 +26,7 @@ public class Weapon{
protected static float minPlayerDist = 20f; protected static float minPlayerDist = 20f;
protected static int sequenceNum = 0; protected static int sequenceNum = 0;
/** bullet shot */ /** bullet shot */
public BulletType bullet; public @NonNull BulletType bullet;
/** shell ejection effect */ /** shell ejection effect */
public Effect ejectEffect = Fx.none; public Effect ejectEffect = Fx.none;
/** weapon reload in frames */ /** weapon reload in frames */

View File

@@ -1,10 +1,10 @@
package io.anuke.mindustry.ui.dialogs; package io.anuke.mindustry.ui.dialogs;
import io.anuke.annotations.Annotations.*;
import io.anuke.arc.*; import io.anuke.arc.*;
import io.anuke.arc.scene.ui.*; import io.anuke.arc.scene.ui.*;
import io.anuke.arc.scene.ui.layout.*; import io.anuke.arc.scene.ui.layout.*;
import io.anuke.arc.util.*; import io.anuke.arc.util.*;
import io.anuke.arc.util.ArcAnnotate.*;
import io.anuke.mindustry.game.*; import io.anuke.mindustry.game.*;
import io.anuke.mindustry.gen.*; import io.anuke.mindustry.gen.*;
import io.anuke.mindustry.maps.*; import io.anuke.mindustry.maps.*;
@@ -15,7 +15,8 @@ import static io.anuke.mindustry.Vars.*;
public class MapPlayDialog extends FloatingDialog{ public class MapPlayDialog extends FloatingDialog{
CustomRulesDialog dialog = new CustomRulesDialog(); CustomRulesDialog dialog = new CustomRulesDialog();
Rules rules; Rules rules;
@NonNull Gamemode selectedGamemode = Gamemode.survival; @NonNull
Gamemode selectedGamemode = Gamemode.survival;
Map lastMap; Map lastMap;
public MapPlayDialog(){ public MapPlayDialog(){

View File

@@ -8,6 +8,7 @@ import io.anuke.arc.Graphics.Cursor.SystemCursor;
import io.anuke.arc.graphics.g2d.Draw; import io.anuke.arc.graphics.g2d.Draw;
import io.anuke.arc.graphics.g2d.TextureRegion; import io.anuke.arc.graphics.g2d.TextureRegion;
import io.anuke.arc.math.Mathf; import io.anuke.arc.math.Mathf;
import io.anuke.arc.util.ArcAnnotate.*;
import io.anuke.mindustry.content.Fx; import io.anuke.mindustry.content.Fx;
import io.anuke.mindustry.entities.Effects; import io.anuke.mindustry.entities.Effects;
import io.anuke.mindustry.entities.effect.RubbleDecal; 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. * 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. * 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 progress = 0;
public float buildCost; public float buildCost;

View File

@@ -1,6 +1,6 @@
package io.anuke.mindustry.world.blocks.storage; 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.entities.type.TileEntity;
import io.anuke.mindustry.type.Item; import io.anuke.mindustry.type.Item;
import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Block;
@@ -75,6 +75,7 @@ public abstract class StorageBlock extends Block{
} }
public class StorageBlockEntity extends TileEntity{ public class StorageBlockEntity extends TileEntity{
protected @Nullable Tile linkedCore; protected @Nullable
Tile linkedCore;
} }
} }

View File

@@ -1,3 +1,3 @@
org.gradle.daemon=true org.gradle.daemon=true
org.gradle.jvmargs=-Xms256m -Xmx1024m org.gradle.jvmargs=-Xms256m -Xmx1024m
archash=d4519a9721927165850bfe3135ef6b095c990474 archash=029f47c10a8e269cd8e20d13b0d06fddb572c484

View File

@@ -218,7 +218,7 @@ public class Generators{
}); });
ImagePacker.generate("unit-icons", () -> { ImagePacker.generate("unit-icons", () -> {
content.<UnitType>getBy(ContentType.unit).each(type -> !type.isFlying, type -> { content.<UnitType>getBy(ContentType.unit).each(type -> !type.flying, type -> {
type.load(); type.load();
type.weapon.load(); type.weapon.load();