diff --git a/core/src/mindustry/core/Logic.java b/core/src/mindustry/core/Logic.java index 77741767a9..125e3c3ee9 100644 --- a/core/src/mindustry/core/Logic.java +++ b/core/src/mindustry/core/Logic.java @@ -302,6 +302,11 @@ public class Logic implements ApplicationListener{ }); } + @Remote(called = Loc.both) + public static void updateGameOver(Team winner){ + state.gameOver = true; + } + @Remote(called = Loc.both) public static void gameOver(Team winner){ state.stats.wavesLasted = state.wave; diff --git a/core/src/mindustry/core/NetClient.java b/core/src/mindustry/core/NetClient.java index 2262e2248b..db938323da 100644 --- a/core/src/mindustry/core/NetClient.java +++ b/core/src/mindustry/core/NetClient.java @@ -437,13 +437,14 @@ public class NetClient implements ApplicationListener{ } @Remote(variants = Variant.one, priority = PacketPriority.low, unreliable = true) - public static void stateSnapshot(float waveTime, int wave, int enemies, boolean paused, short coreDataLen, byte[] coreData){ + public static void stateSnapshot(float waveTime, int wave, int enemies, boolean paused, boolean gameOver, short coreDataLen, byte[] coreData){ try{ if(wave > state.wave){ state.wave = wave; Events.fire(new WaveEvent()); } + state.gameOver = gameOver; state.wavetime = waveTime; state.wave = wave; state.enemies = enemies; diff --git a/core/src/mindustry/core/NetServer.java b/core/src/mindustry/core/NetServer.java index a433e55a1d..4483ecd06d 100644 --- a/core/src/mindustry/core/NetServer.java +++ b/core/src/mindustry/core/NetServer.java @@ -735,7 +735,7 @@ public class NetServer implements ApplicationListener{ } public boolean isWaitingForPlayers(){ - if(state.rules.pvp){ + if(state.rules.pvp && !state.gameOver){ int used = 0; for(TeamData t : state.teams.getActive()){ if(Groups.player.count(p -> p.team() == t.team) > 0){ @@ -794,7 +794,7 @@ public class NetServer implements ApplicationListener{ if(!entity.block().sync) continue; sent ++; - dataStream.writeInt(entity.tile().pos()); + dataStream.writeInt(entity.pos()); entity.writeAll(Writes.get(dataStream)); if(syncStream.size() > maxSnapshotSize){ @@ -828,7 +828,7 @@ public class NetServer implements ApplicationListener{ byte[] stateBytes = syncStream.toByteArray(); //write basic state data. - Call.stateSnapshot(player.con, state.wavetime, state.wave, state.enemies, state.serverPaused, (short)stateBytes.length, net.compressSnapshot(stateBytes)); + Call.stateSnapshot(player.con, state.wavetime, state.wave, state.enemies, state.serverPaused, state.gameOver, (short)stateBytes.length, net.compressSnapshot(stateBytes)); viewport.setSize(player.con.viewWidth, player.con.viewHeight).setCenter(player.con.viewX, player.con.viewY); diff --git a/core/src/mindustry/world/blocks/distribution/MassDriver.java b/core/src/mindustry/world/blocks/distribution/MassDriver.java index 303c7811e0..23c1671e73 100644 --- a/core/src/mindustry/world/blocks/distribution/MassDriver.java +++ b/core/src/mindustry/world/blocks/distribution/MassDriver.java @@ -41,6 +41,8 @@ public class MassDriver extends Block{ hasItems = true; hasPower = true; outlineIcon = true; + sync = true; + //point2 is relative config(Point2.class, (MassDriverBuild tile, Point2 point) -> tile.link = Point2.pack(point.x + tile.tileX(), point.y + tile.tileY())); config(Integer.class, (MassDriverBuild tile, Integer point) -> tile.link = point); @@ -318,7 +320,7 @@ public class MassDriver extends Block{ super.read(read, revision); link = read.i(); rotation = read.f(); - state = DriverState.values()[read.b()]; + state = DriverState.all[read.b()]; } } @@ -326,6 +328,8 @@ public class MassDriver extends Block{ idle, //nothing is shooting at this mass driver and it does not have any target accepting, //currently getting shot at, unload items shooting, - unloading + unloading; + + public static final DriverState[] all = values(); } } diff --git a/core/src/mindustry/world/blocks/production/PayloadAcceptor.java b/core/src/mindustry/world/blocks/production/PayloadAcceptor.java index e11d604c7a..3e365b5fcd 100644 --- a/core/src/mindustry/world/blocks/production/PayloadAcceptor.java +++ b/core/src/mindustry/world/blocks/production/PayloadAcceptor.java @@ -24,6 +24,7 @@ public class PayloadAcceptor extends Block{ super(name); update = true; + sync = true; } public static boolean blends(Building tile, int direction){ diff --git a/server/src/mindustry/server/ServerControl.java b/server/src/mindustry/server/ServerControl.java index 463ef9ad20..2f21c35eeb 100644 --- a/server/src/mindustry/server/ServerControl.java +++ b/server/src/mindustry/server/ServerControl.java @@ -159,6 +159,9 @@ public class ServerControl implements ApplicationListener{ + (map.tags.containsKey("author") && !map.tags.get("author").trim().isEmpty() ? " by[accent] " + map.author() + "[white]" : "") + "." + "\nNew game begins in " + roundExtraTime + " seconds."); + state.gameOver = true; + Call.updateGameOver(event.winner); + info("Selected next map to be @.", map.name()); play(true, () -> world.loadMap(map, map.applyRules(lastMode)));