From 6521cb5749fee75105de0bc4d18be57308275ef6 Mon Sep 17 00:00:00 2001 From: opfromthestart Date: Wed, 4 Aug 2021 12:52:37 -0400 Subject: [PATCH] Better Listeners -Specific listeners for the start and stop of loading -Better(?) layer deletion after exiting a world -Actual server thread shutdown --- .../progressia/client/ClientState.java | 23 ++++++------- .../progressia/server/ChunkManager.java | 33 ++++++++++++++++++- .../progressia/server/ServerThread.java | 1 + .../progressia/test/LayerButtonTest.java | 13 +++++--- 4 files changed, 52 insertions(+), 18 deletions(-) diff --git a/src/main/java/ru/windcorp/progressia/client/ClientState.java b/src/main/java/ru/windcorp/progressia/client/ClientState.java index 1525045..f8a1dfa 100644 --- a/src/main/java/ru/windcorp/progressia/client/ClientState.java +++ b/src/main/java/ru/windcorp/progressia/client/ClientState.java @@ -28,6 +28,8 @@ import ru.windcorp.progressia.client.graphics.world.LayerWorld; import ru.windcorp.progressia.client.localization.MutableString; import ru.windcorp.progressia.client.localization.MutableStringLocalized; import ru.windcorp.progressia.common.world.WorldData; +import ru.windcorp.progressia.server.ChunkManager.ChunksLoadFinishListener; +import ru.windcorp.progressia.server.ChunkManager.ChunksLoadStartListener; import ru.windcorp.progressia.server.ServerState; import ru.windcorp.progressia.test.LayerAbout; import ru.windcorp.progressia.test.LayerTestText; @@ -38,8 +40,6 @@ public class ClientState { private static Client instance; - private static Collection layers; - private static boolean firstLoad; private static LayerTestText layer; @@ -67,14 +67,16 @@ public class ClientState { setInstance(client); - ServerState.getInstance().getChunkManager().register(bl -> { - if (!bl && firstLoad) + ServerState.getInstance().getChunkManager().register((ChunksLoadStartListener)() -> { + if (firstLoad) { MutableString t = new MutableStringLocalized("LayerText.Load"); layer = new LayerTestText("Text",() -> {t.update(); return t.get();}); GUI.addTopLayer(layer); - } - else if (bl && firstLoad) + }}); + + ServerState.getInstance().getChunkManager().register((ChunksLoadFinishListener)() -> { + if (firstLoad) { GUI.removeLayer(layer); @@ -84,11 +86,6 @@ public class ClientState { GUI.addBottomLayer(layerWorld); GUI.addTopLayer(layerUI); GUI.addTopLayer(layerAbout); - - layers = new HashSet(); - layers.add(layerWorld); - layers.add(layerUI); - layers.add(layerAbout); firstLoad = false; } @@ -98,12 +95,12 @@ public class ClientState { public static void disconnectFromLocalServer() { - for (Layer layer : layers) + for (Layer layer : GUI.getLayers()) { GUI.removeLayer(layer); } - ServerState.getInstance().getClientManager(); + //ServerState.getInstance().getClientManager(); } private ClientState() { diff --git a/src/main/java/ru/windcorp/progressia/server/ChunkManager.java b/src/main/java/ru/windcorp/progressia/server/ChunkManager.java index 5042954..badb061 100644 --- a/src/main/java/ru/windcorp/progressia/server/ChunkManager.java +++ b/src/main/java/ru/windcorp/progressia/server/ChunkManager.java @@ -85,6 +85,22 @@ public class ChunkManager { { void handle(boolean starting); } + + @FunctionalInterface + private interface ChunksLoadEventListener + { + void handle(); + } + + public interface ChunksLoadStartListener extends ChunksLoadEventListener + { + + } + + public interface ChunksLoadFinishListener extends ChunksLoadEventListener + { + + } private final Server server; @@ -94,6 +110,8 @@ public class ChunkManager { private final ChunkSet toUnload = ChunkSets.newHashSet(); private Collection listeners = Collections.synchronizedCollection( new ArrayList<>()); + private Collection startListeners = Collections.synchronizedCollection( new ArrayList<>()); + private Collection finishListeners = Collections.synchronizedCollection( new ArrayList<>()); // TODO replace with a normal Map managed by some sort of PlayerListener, // weak maps are weak @@ -119,6 +137,16 @@ public class ChunkManager { listeners.add(cll); } + public void register(ChunksLoadStartListener clsl) + { + startListeners.add(clsl); + } + + public void register(ChunksLoadFinishListener clfl) + { + finishListeners.add(clfl); + } + public void unregisterAll() { listeners.clear(); @@ -153,8 +181,10 @@ public class ChunkManager { if (toUnload.size()!=0 || toLoad.size()!=0) { LogManager.getLogger().info(String.valueOf(toUnload.size())+" "+String.valueOf( toLoad.size())); - listeners.forEach(l -> l.handle(false)); } + listeners.forEach(l -> l.handle(false)); + startListeners.forEach(sl -> sl.handle()); + toUnload.forEach(this::unloadChunk); toUnload.clear(); toLoad.forEach(this::loadChunk); @@ -164,6 +194,7 @@ public class ChunkManager { v.processQueues(p); }); listeners.forEach(l -> l.handle(true)); + finishListeners.forEach(fl -> fl.handle()); } diff --git a/src/main/java/ru/windcorp/progressia/server/ServerThread.java b/src/main/java/ru/windcorp/progressia/server/ServerThread.java index 90f3ce9..5a1333a 100644 --- a/src/main/java/ru/windcorp/progressia/server/ServerThread.java +++ b/src/main/java/ru/windcorp/progressia/server/ServerThread.java @@ -79,6 +79,7 @@ public class ServerThread implements Runnable { public void stop() { try { + executor.shutdown(); executor.awaitTermination(10, TimeUnit.MINUTES); } catch (InterruptedException e) { LogManager.getLogger().warn("Received interrupt in ServerThread.stop(), aborting wait"); diff --git a/src/main/java/ru/windcorp/progressia/test/LayerButtonTest.java b/src/main/java/ru/windcorp/progressia/test/LayerButtonTest.java index bae1d67..2b36bbd 100644 --- a/src/main/java/ru/windcorp/progressia/test/LayerButtonTest.java +++ b/src/main/java/ru/windcorp/progressia/test/LayerButtonTest.java @@ -33,6 +33,8 @@ import ru.windcorp.progressia.client.graphics.gui.menu.MenuLayer; import ru.windcorp.progressia.client.localization.MutableString; import ru.windcorp.progressia.client.localization.MutableStringLocalized; import ru.windcorp.progressia.server.ChunkManager; +import ru.windcorp.progressia.server.ChunkManager.ChunksLoadFinishListener; +import ru.windcorp.progressia.server.ChunkManager.ChunksLoadListener; import ru.windcorp.progressia.server.Player; import ru.windcorp.progressia.server.ServerState; @@ -94,22 +96,25 @@ public class LayerButtonTest extends MenuLayer { ChunkManager cm = ServerState.getInstance().getChunkManager(); alive = true; - cm.register(bl -> { - if (bl && alive) + cm.register((ChunksLoadFinishListener)() -> { + if (alive) { GUI.removeLayer(layer); GUI.addTopLayer(new LayerTitle("Title")); //cm.unregisterAll(); alive = false; + + ServerState.getInstance().shutdown("Safe Exit"); + + ServerState.setInstance(null); } }); //ClientState.getInstance(); ClientState.setInstance(null); - ServerState.setInstance(null); //ServerState.getInstance().getChunkManager().unloadAll(); - //ServerState.getInstance().shutdown("Safe Exit"); + })); getContent().takeFocus();