diff --git a/build.gradle b/build.gradle
index f27f7358c2..40f8ad9f87 100644
--- a/build.gradle
+++ b/build.gradle
@@ -26,7 +26,7 @@ allprojects {
appName = 'Mindustry'
gdxVersion = '1.9.8'
roboVMVersion = '2.3.0'
- uCoreVersion = '4d8019c8f37fdc2a7a64cbd55ef6ee30fb9f1ba5'
+ uCoreVersion = '65a4a39a4529881463ea2d7f126583b59cdeba26'
getVersionString = {
String buildVersion = getBuildVersion()
diff --git a/core/src/Mindustry.gwt.xml b/core/src/Mindustry.gwt.xml
index 24698d564c..8fbf313c24 100644
--- a/core/src/Mindustry.gwt.xml
+++ b/core/src/Mindustry.gwt.xml
@@ -8,7 +8,6 @@
-
diff --git a/core/src/io/anuke/mindustry/ai/BlockIndexer.java b/core/src/io/anuke/mindustry/ai/BlockIndexer.java
index 124e069a73..db70de360e 100644
--- a/core/src/io/anuke/mindustry/ai/BlockIndexer.java
+++ b/core/src/io/anuke/mindustry/ai/BlockIndexer.java
@@ -50,18 +50,18 @@ public class BlockIndexer{
private Array returnArray = new ThreadArray<>();
public BlockIndexer(){
- Events.on(TileChangeEvent.class, tile -> {
- if(typeMap.get(tile.packedPosition()) != null){
- TileIndex index = typeMap.get(tile.packedPosition());
+ Events.on(TileChangeEvent.class, event -> {
+ if(typeMap.get(event.tile.packedPosition()) != null){
+ TileIndex index = typeMap.get(event.tile.packedPosition());
for(BlockFlag flag : index.flags){
- getFlagged(index.team)[flag.ordinal()].remove(tile);
+ getFlagged(index.team)[flag.ordinal()].remove(event.tile);
}
}
- process(tile);
- updateQuadrant(tile);
+ process(event.tile);
+ updateQuadrant(event.tile);
});
- Events.on(WorldLoadEvent.class, () -> {
+ Events.on(WorldLoadEvent.class, event -> {
flagMap = new ObjectSet[Team.all.length][BlockFlag.all.length];
for(int i = 0; i < flagMap.length; i++){
for(int j = 0; j < BlockFlag.all.length; j++){
diff --git a/core/src/io/anuke/mindustry/ai/Pathfinder.java b/core/src/io/anuke/mindustry/ai/Pathfinder.java
index 681ab83dd1..1edf0defc4 100644
--- a/core/src/io/anuke/mindustry/ai/Pathfinder.java
+++ b/core/src/io/anuke/mindustry/ai/Pathfinder.java
@@ -25,18 +25,18 @@ public class Pathfinder{
private IntArray blocked = new IntArray();
public Pathfinder(){
- Events.on(WorldLoadEvent.class, this::clear);
- Events.on(TileChangeEvent.class, tile -> {
+ Events.on(WorldLoadEvent.class, event -> clear());
+ Events.on(TileChangeEvent.class, event -> {
if(Net.client()) return;
for(Team team : Team.all){
TeamData data = state.teams.get(team);
- if(state.teams.isActive(team) && data.team != tile.getTeam() && paths[data.team.ordinal()].weights[tile.x][tile.y] >= Float.MAX_VALUE){
- update(tile, data.team);
+ if(state.teams.isActive(team) && data.team != event.tile.getTeam() && paths[data.team.ordinal()].weights[event.tile.x][event.tile.y] >= Float.MAX_VALUE){
+ update(event.tile, data.team);
}
}
- update(tile, tile.getTeam());
+ update(event.tile, event.tile.getTeam());
});
}
diff --git a/core/src/io/anuke/mindustry/ai/WaveSpawner.java b/core/src/io/anuke/mindustry/ai/WaveSpawner.java
index a5e6e3bcf4..573edec198 100644
--- a/core/src/io/anuke/mindustry/ai/WaveSpawner.java
+++ b/core/src/io/anuke/mindustry/ai/WaveSpawner.java
@@ -163,7 +163,7 @@ public class WaveSpawner{
}
}
- private void reset(){
+ private void reset(WorldLoadEvent event){
flySpawns.clear();
groundSpawns.clear();
quadrants = new GridBits(quadWidth(), quadHeight());
diff --git a/core/src/io/anuke/mindustry/core/Control.java b/core/src/io/anuke/mindustry/core/Control.java
index 2f122dfbae..0a67dcfab9 100644
--- a/core/src/io/anuke/mindustry/core/Control.java
+++ b/core/src/io/anuke/mindustry/core/Control.java
@@ -51,7 +51,6 @@ public class Control extends Module{
private Throwable error;
public Control(){
-
saves = new Saves();
db = new ContentDatabase();
@@ -97,13 +96,13 @@ public class Control extends Module{
saves.load();
- Events.on(StateChangeEvent.class, (from, to) -> {
- if((from == State.playing && to == State.menu) || (from == State.menu && to != State.menu)){
+ Events.on(StateChangeEvent.class, event -> {
+ if((event.from == State.playing && event.to == State.menu) || (event.from == State.menu && event.to != State.menu)){
Timers.runTask(5f, Platform.instance::updateRPC);
}
});
- Events.on(PlayEvent.class, () -> {
+ Events.on(PlayEvent.class, event -> {
for(Player player : players){
player.add();
}
@@ -117,13 +116,13 @@ public class Control extends Module{
}
});
- Events.on(WorldLoadGraphicsEvent.class, () -> {
+ Events.on(WorldLoadGraphicsEvent.class, event -> {
if(mobile){
Core.camera.position.set(players[0].x, players[0].y, 0);
}
});
- Events.on(ResetEvent.class, () -> {
+ Events.on(ResetEvent.class, event -> {
for(Player player : players){
player.reset();
}
@@ -133,7 +132,7 @@ public class Control extends Module{
saves.resetSave();
});
- Events.on(WaveEvent.class, () -> {
+ Events.on(WaveEvent.class, event -> {
int last = Settings.getInt("hiscore" + world.getMap().name, 0);
@@ -146,7 +145,7 @@ public class Control extends Module{
Platform.instance.updateRPC();
});
- Events.on(GameOverEvent.class, () -> {
+ Events.on(GameOverEvent.class, event -> {
//delete saves for game-over sectors
if(world.getSector() != null && world.getSector().hasSave()){
world.getSector().getSave().delete();
@@ -159,7 +158,7 @@ public class Control extends Module{
});
});
- Events.on(WorldLoadEvent.class, () -> threads.runGraphics(() -> Events.fire(WorldLoadGraphicsEvent.class)));
+ Events.on(WorldLoadEvent.class, event -> threads.runGraphics(() -> Events.fire(new WorldLoadGraphicsEvent())));
}
public void addPlayer(int index){
diff --git a/core/src/io/anuke/mindustry/core/GameState.java b/core/src/io/anuke/mindustry/core/GameState.java
index a38a46e01f..4e20c5ba75 100644
--- a/core/src/io/anuke/mindustry/core/GameState.java
+++ b/core/src/io/anuke/mindustry/core/GameState.java
@@ -19,7 +19,7 @@ public class GameState{
private State state = State.menu;
public void set(State astate){
- Events.fire(StateChangeEvent.class, state, astate);
+ Events.fire(new StateChangeEvent(state, astate));
state = astate;
}
diff --git a/core/src/io/anuke/mindustry/core/Logic.java b/core/src/io/anuke/mindustry/core/Logic.java
index 658b2ff74a..dea47a7e3d 100644
--- a/core/src/io/anuke/mindustry/core/Logic.java
+++ b/core/src/io/anuke/mindustry/core/Logic.java
@@ -65,7 +65,7 @@ public class Logic extends Module{
}
}
- Events.fire(PlayEvent.class);
+ Events.fire(new PlayEvent());
}
public void reset(){
@@ -78,7 +78,7 @@ public class Logic extends Module{
Entities.clear();
TileEntity.sleepingEntities = 0;
- Events.fire(ResetEvent.class);
+ Events.fire(new ResetEvent());
}
public void runWave(){
@@ -86,14 +86,14 @@ public class Logic extends Module{
state.wave++;
state.wavetime = wavespace * state.difficulty.timeScaling;
- Events.fire(WaveEvent.class);
+ Events.fire(new WaveEvent());
}
//this never triggers in PvP; only for checking sector game-overs
private void checkGameOver(){
if(state.teams.get(defaultTeam).cores.size == 0 && !state.gameOver){
state.gameOver = true;
- Events.fire(GameOverEvent.class);
+ Events.fire(new GameOverEvent());
}
}
diff --git a/core/src/io/anuke/mindustry/core/UI.java b/core/src/io/anuke/mindustry/core/UI.java
index 5adbbdd937..b8f43db7e3 100644
--- a/core/src/io/anuke/mindustry/core/UI.java
+++ b/core/src/io/anuke/mindustry/core/UI.java
@@ -193,7 +193,7 @@ public class UI extends SceneModule{
public void resize(int width, int height){
super.resize(width, height);
- Events.fire(ResizeEvent.class);
+ Events.fire(new ResizeEvent());
}
public Locale getLocale(){
diff --git a/core/src/io/anuke/mindustry/core/World.java b/core/src/io/anuke/mindustry/core/World.java
index 94ad6f9dcd..6f0a3dd43d 100644
--- a/core/src/io/anuke/mindustry/core/World.java
+++ b/core/src/io/anuke/mindustry/core/World.java
@@ -213,7 +213,7 @@ public class World extends Module{
EntityPhysics.resizeTree(0, 0, tiles.length * tilesize, tiles[0].length * tilesize);
generating = false;
- Events.fire(WorldLoadEvent.class);
+ Events.fire(new WorldLoadEvent());
}
/**Loads up a sector map. This does not call play(), but calls reset().*/
@@ -279,7 +279,7 @@ public class World extends Module{
public void notifyChanged(Tile tile){
if(!generating){
- threads.runDelay(() -> Events.fire(TileChangeEvent.class, tile));
+ threads.runDelay(() -> Events.fire(new TileChangeEvent(tile)));
}
}
diff --git a/core/src/io/anuke/mindustry/entities/units/types/Drone.java b/core/src/io/anuke/mindustry/entities/units/types/Drone.java
index ca2a4d7ac3..b161693312 100644
--- a/core/src/io/anuke/mindustry/entities/units/types/Drone.java
+++ b/core/src/io/anuke/mindustry/entities/units/types/Drone.java
@@ -268,11 +268,11 @@ public class Drone extends FlyingUnit implements BuilderTrait{
private static void initEvents(){
if(initialized) return;
- Events.on(BlockBuildEvent.class, (team, tile) -> {
- EntityGroup group = unitGroups[team.ordinal()];
+ Events.on(BlockBuildEvent.class, event -> {
+ EntityGroup group = unitGroups[event.team.ordinal()];
- if(!(tile.entity instanceof BuildEntity)) return;
- BuildEntity entity = tile.entity();
+ if(!(event.tile.entity instanceof BuildEntity)) return;
+ BuildEntity entity = event.tile.entity();
for(BaseUnit unit : group.all()){
if(unit instanceof Drone){
diff --git a/core/src/io/anuke/mindustry/game/ContentDatabase.java b/core/src/io/anuke/mindustry/game/ContentDatabase.java
index a325786546..a5b1e82056 100644
--- a/core/src/io/anuke/mindustry/game/ContentDatabase.java
+++ b/core/src/io/anuke/mindustry/game/ContentDatabase.java
@@ -48,7 +48,7 @@ public class ContentDatabase{
//fire unlock event so other classes can use it
if(ret){
content.onUnlock();
- Events.fire(UnlockEvent.class, content);
+ Events.fire(new UnlockEvent(content));
dirty = true;
}
diff --git a/core/src/io/anuke/mindustry/game/EventType.java b/core/src/io/anuke/mindustry/game/EventType.java
index ec880f3be9..6b781a01e2 100644
--- a/core/src/io/anuke/mindustry/game/EventType.java
+++ b/core/src/io/anuke/mindustry/game/EventType.java
@@ -6,64 +6,78 @@ import io.anuke.ucore.function.Event;
public class EventType{
- public interface PlayEvent extends Event{
- void handle();
+ public static class PlayEvent implements Event{
+
}
- public interface ResetEvent extends Event{
- void handle();
+ public static class ResetEvent implements Event{
+
}
- public interface WaveEvent extends Event{
- void handle();
+ public static class WaveEvent implements Event{
+
}
- public interface GameOverEvent extends Event{
- void handle();
+ public static class GameOverEvent implements Event{
+
}
/**
* This event is called from the logic thread.
* DO NOT INITIALIZE GRAPHICS HERE.
*/
- public interface WorldLoadEvent extends Event{
- void handle();
+ public static class WorldLoadEvent implements Event{
+
}
/**
* Called after the WorldLoadEvent is, and all logic has been loaded.
* It is safe to intialize graphics here.
*/
- public interface WorldLoadGraphicsEvent extends Event{
- void handle();
+ public static class WorldLoadGraphicsEvent implements Event{
+
}
/**
* Called from the logic thread. Do not access graphics here!
*/
- public interface TileChangeEvent extends Event{
- void handle(Tile tile);
+ public static class TileChangeEvent implements Event{
+ public final Tile tile;
+
+ public TileChangeEvent(Tile tile){
+ this.tile = tile;
+ }
}
- //TODO unimplemented; remove?
- public interface TileRemoveEvent extends Event{
- void handle(Tile tile, Team oldTeam);
+ public static class StateChangeEvent implements Event{
+ public final State from, to;
+
+ public StateChangeEvent(State from, State to){
+ this.from = from;
+ this.to = to;
+ }
}
- public interface StateChangeEvent extends Event{
- void handle(State from, State to);
+ public static class UnlockEvent implements Event{
+ public final Content content;
+
+ public UnlockEvent(Content content){
+ this.content = content;
+ }
}
- public interface UnlockEvent extends Event{
- void handle(Content content);
+ public static class BlockBuildEvent implements Event{
+ public final Tile tile;
+ public final Team team;
+
+ public BlockBuildEvent(Tile tile, Team team){
+ this.tile = tile;
+ this.team = team;
+ }
}
- public interface BlockBuildEvent extends Event{
- void handle(Team team, Tile tile);
- }
+ public static class ResizeEvent implements Event{
- public interface ResizeEvent extends Event{
- void handle();
}
}
diff --git a/core/src/io/anuke/mindustry/game/Saves.java b/core/src/io/anuke/mindustry/game/Saves.java
index e764b79a77..ec2475c7ba 100644
--- a/core/src/io/anuke/mindustry/game/Saves.java
+++ b/core/src/io/anuke/mindustry/game/Saves.java
@@ -31,8 +31,8 @@ public class Saves{
private long lastTimestamp;
public Saves(){
- Events.on(StateChangeEvent.class, (prev, state) -> {
- if(state == State.menu){
+ Events.on(StateChangeEvent.class, event -> {
+ if(event.to == State.menu){
threads.run(() -> {
totalPlaytime = 0;
lastTimestamp = 0;
diff --git a/core/src/io/anuke/mindustry/graphics/BlockRenderer.java b/core/src/io/anuke/mindustry/graphics/BlockRenderer.java
index d21d2feb06..7779aa3958 100644
--- a/core/src/io/anuke/mindustry/graphics/BlockRenderer.java
+++ b/core/src/io/anuke/mindustry/graphics/BlockRenderer.java
@@ -40,18 +40,18 @@ public class BlockRenderer{
requests.set(i, new BlockRequest());
}
- Events.on(WorldLoadGraphicsEvent.class, () -> {
+ Events.on(WorldLoadGraphicsEvent.class, event -> {
lastCamY = lastCamX = -99; //invalidate camera position so blocks get updated
});
- Events.on(TileChangeEvent.class, tile -> {
+ Events.on(TileChangeEvent.class, event -> {
threads.runGraphics(() -> {
int avgx = Mathf.scl(camera.position.x, tilesize);
int avgy = Mathf.scl(camera.position.y, tilesize);
int rangex = (int) (camera.viewportWidth * camera.zoom / tilesize / 2) + 2;
int rangey = (int) (camera.viewportHeight * camera.zoom / tilesize / 2) + 2;
- if(Math.abs(avgx - tile.x) <= rangex && Math.abs(avgy - tile.y) <= rangey){
+ if(Math.abs(avgx - event.tile.x) <= rangex && Math.abs(avgy - event.tile.y) <= rangey){
lastCamY = lastCamX = -99; //invalidate camera position so blocks get updated
}
});
diff --git a/core/src/io/anuke/mindustry/graphics/FloorRenderer.java b/core/src/io/anuke/mindustry/graphics/FloorRenderer.java
index b075de6bac..1081ca6075 100644
--- a/core/src/io/anuke/mindustry/graphics/FloorRenderer.java
+++ b/core/src/io/anuke/mindustry/graphics/FloorRenderer.java
@@ -42,7 +42,7 @@ public class FloorRenderer{
private IntArray drawnLayers = new IntArray();
public FloorRenderer(){
- Events.on(WorldLoadGraphicsEvent.class, this::clearTiles);
+ Events.on(WorldLoadGraphicsEvent.class, event -> clearTiles());
gutterTile = new Tile(0, 0){
@Override
diff --git a/core/src/io/anuke/mindustry/graphics/FogRenderer.java b/core/src/io/anuke/mindustry/graphics/FogRenderer.java
index 42e819b63f..b3854361db 100644
--- a/core/src/io/anuke/mindustry/graphics/FogRenderer.java
+++ b/core/src/io/anuke/mindustry/graphics/FogRenderer.java
@@ -40,7 +40,7 @@ public class FogRenderer implements Disposable{
private boolean dirty;
public FogRenderer(){
- Events.on(WorldLoadGraphicsEvent.class, () -> {
+ Events.on(WorldLoadGraphicsEvent.class, event -> {
dispose();
padding = world.getSector() != null ? mapPadding + extraPadding : 0;
@@ -66,9 +66,9 @@ public class FogRenderer implements Disposable{
dirty = true;
});
- Events.on(TileChangeEvent.class, tile -> threads.runGraphics(() -> {
- if(tile.getTeam() == players[0].getTeam() && tile.block().synthetic() && tile.block().viewRange > 0){
- changeQueue.add(tile);
+ Events.on(TileChangeEvent.class, event -> threads.runGraphics(() -> {
+ if(event.tile.getTeam() == players[0].getTeam() && event.tile.block().synthetic() && event.tile.block().viewRange > 0){
+ changeQueue.add(event.tile);
}
}));
}
diff --git a/core/src/io/anuke/mindustry/graphics/MinimapRenderer.java b/core/src/io/anuke/mindustry/graphics/MinimapRenderer.java
index 89bb5ede2f..1e002fb5c7 100644
--- a/core/src/io/anuke/mindustry/graphics/MinimapRenderer.java
+++ b/core/src/io/anuke/mindustry/graphics/MinimapRenderer.java
@@ -39,13 +39,13 @@ public class MinimapRenderer implements Disposable{
private int zoom = 4;
public MinimapRenderer(){
- Events.on(WorldLoadGraphicsEvent.class, () -> {
+ Events.on(WorldLoadGraphicsEvent.class, event -> {
reset();
updateAll();
});
//make sure to call on the graphics thread
- Events.on(TileChangeEvent.class, tile -> Gdx.app.postRunnable(() -> update(tile)));
+ Events.on(TileChangeEvent.class, event -> Gdx.app.postRunnable(() -> update(event.tile)));
}
public Texture getTexture(){
diff --git a/core/src/io/anuke/mindustry/ui/dialogs/FloatingDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/FloatingDialog.java
index 16ba45bcff..31ffae453a 100644
--- a/core/src/io/anuke/mindustry/ui/dialogs/FloatingDialog.java
+++ b/core/src/io/anuke/mindustry/ui/dialogs/FloatingDialog.java
@@ -34,7 +34,7 @@ public class FloatingDialog extends Dialog{
}
protected void onResize(Runnable run){
- Events.on(ResizeEvent.class, () -> {
+ Events.on(ResizeEvent.class, event -> {
if(isShown()){
run.run();
}
diff --git a/core/src/io/anuke/mindustry/ui/fragments/BlocksFragment.java b/core/src/io/anuke/mindustry/ui/fragments/BlocksFragment.java
index c3407ec336..d61e9619d5 100644
--- a/core/src/io/anuke/mindustry/ui/fragments/BlocksFragment.java
+++ b/core/src/io/anuke/mindustry/ui/fragments/BlocksFragment.java
@@ -89,14 +89,12 @@ public class BlocksFragment extends Fragment{
}).bottom().right().get();
});
- Events.on(WorldLoadEvent.class, this::rebuild);
+ Events.on(WorldLoadEvent.class, event -> rebuild());
rebuild();
}
- /**
- * Rebuilds the whole placement menu, attempting to preserve previous state.
- */
+ /**Rebuilds the whole placement menu, attempting to preserve previous state.*/
void rebuild(){
selectTable.clear();
diff --git a/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java b/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java
index f606b7b9ea..1605c2755b 100644
--- a/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java
+++ b/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java
@@ -138,8 +138,8 @@ public class HudFragment extends Fragment{
parent.fill(t -> {
float notifDuration = 240f;
- Events.on(StateChangeEvent.class, (from, to) -> {
- if(to == State.menu || from == State.menu){
+ Events.on(StateChangeEvent.class, event -> {
+ if(event.to == State.menu || event.from == State.menu){
coreAttackTime = 0f;
lastCoreHP = Float.NaN;
}
diff --git a/core/src/io/anuke/mindustry/ui/fragments/MenuFragment.java b/core/src/io/anuke/mindustry/ui/fragments/MenuFragment.java
index 0fb7ea9d2e..4a88709e8b 100644
--- a/core/src/io/anuke/mindustry/ui/fragments/MenuFragment.java
+++ b/core/src/io/anuke/mindustry/ui/fragments/MenuFragment.java
@@ -27,7 +27,7 @@ public class MenuFragment extends Fragment{
buildDesktop();
}else{
buildMobile();
- Events.on(ResizeEvent.class, this::buildMobile);
+ Events.on(ResizeEvent.class, event -> buildMobile());
}
});
diff --git a/core/src/io/anuke/mindustry/world/Build.java b/core/src/io/anuke/mindustry/world/Build.java
index 727682165d..549719cdea 100644
--- a/core/src/io/anuke/mindustry/world/Build.java
+++ b/core/src/io/anuke/mindustry/world/Build.java
@@ -99,7 +99,7 @@ public class Build{
}
- threads.runDelay(() -> Events.fire(BlockBuildEvent.class, team, tile));
+ threads.runDelay(() -> Events.fire(new BlockBuildEvent(tile, team)));
}
/**Returns whether a tile can be placed at this location by this team.*/
diff --git a/server/src/io/anuke/mindustry/server/ServerControl.java b/server/src/io/anuke/mindustry/server/ServerControl.java
index aaf2adf2a5..d7e8bc829a 100644
--- a/server/src/io/anuke/mindustry/server/ServerControl.java
+++ b/server/src/io/anuke/mindustry/server/ServerControl.java
@@ -94,7 +94,7 @@ public class ServerControl extends Module{
"&lrWARNING: &lyIt is highly advised to specify which version you're using by building with gradle args &lc-Pbuildversion=&lm&ly so that clients know which version you are using.");
}
- Events.on(GameOverEvent.class, () -> {
+ Events.on(GameOverEvent.class, event -> {
if(inExtraRound) return;
info("Game over!");