From 94db44e44376e4fe259a2380f38af9cc5931ed91 Mon Sep 17 00:00:00 2001 From: opfromthestart Date: Tue, 3 Aug 2021 22:42:46 -0400 Subject: [PATCH] Im tired i need sleep -Added listeners for saving and loading chunks -Made loading screens for between title and game(they dont work yet) -Added localized text(some) -Safeish deletion and saving of chunks -It still keeps them in memory I think so this needs work too --- .../progressia/ProgressiaLauncher.java | 8 --- .../progressia/client/ClientState.java | 53 +++++++++++++++++-- .../client/comms/localhost/LocalClient.java | 3 +- .../localhost/LocalServerCommsChannel.java | 2 +- .../progressia/server/ChunkManager.java | 50 +++++++++++++++++ .../progressia/server/PlayerManager.java | 5 ++ .../progressia/test/LayerButtonTest.java | 48 ++++++++++++++--- .../progressia/test/LayerTestText.java | 24 +++++++++ .../windcorp/progressia/test/LayerTitle.java | 1 + .../resources/assets/languages/en-US.lang | 6 ++- .../resources/assets/languages/ru-RU.lang | 6 ++- 11 files changed, 185 insertions(+), 21 deletions(-) create mode 100644 src/main/java/ru/windcorp/progressia/test/LayerTestText.java diff --git a/src/main/java/ru/windcorp/progressia/ProgressiaLauncher.java b/src/main/java/ru/windcorp/progressia/ProgressiaLauncher.java index 2567d9d..f32936f 100644 --- a/src/main/java/ru/windcorp/progressia/ProgressiaLauncher.java +++ b/src/main/java/ru/windcorp/progressia/ProgressiaLauncher.java @@ -20,14 +20,6 @@ package ru.windcorp.progressia; import ru.windcorp.progressia.client.ClientProxy; import ru.windcorp.progressia.client.graphics.GUI; -import ru.windcorp.progressia.client.graphics.backend.GraphicsBackend; -import ru.windcorp.progressia.client.graphics.backend.RenderTaskQueue; -import ru.windcorp.progressia.client.graphics.flat.FlatRenderProgram; -import ru.windcorp.progressia.client.graphics.font.GNUUnifontLoader; -import ru.windcorp.progressia.client.graphics.font.Typefaces; -import ru.windcorp.progressia.client.graphics.world.WorldRenderProgram; -import ru.windcorp.progressia.client.localization.Localizer; -import ru.windcorp.progressia.common.resource.ResourceManager; import ru.windcorp.progressia.common.util.crash.CrashReports; import ru.windcorp.progressia.common.util.crash.analyzers.OutOfMemoryAnalyzer; import ru.windcorp.progressia.common.util.crash.providers.*; diff --git a/src/main/java/ru/windcorp/progressia/client/ClientState.java b/src/main/java/ru/windcorp/progressia/client/ClientState.java index 75f0f07..1525045 100644 --- a/src/main/java/ru/windcorp/progressia/client/ClientState.java +++ b/src/main/java/ru/windcorp/progressia/client/ClientState.java @@ -18,18 +18,30 @@ package ru.windcorp.progressia.client; +import java.util.Collection; +import java.util.HashSet; + import ru.windcorp.progressia.client.comms.localhost.LocalServerCommsChannel; import ru.windcorp.progressia.client.graphics.GUI; +import ru.windcorp.progressia.client.graphics.Layer; 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.ServerState; import ru.windcorp.progressia.test.LayerAbout; +import ru.windcorp.progressia.test.LayerTestText; import ru.windcorp.progressia.test.LayerTestUI; import ru.windcorp.progressia.test.TestContent; public class ClientState { private static Client instance; + + private static Collection layers; + + private static boolean firstLoad; + private static LayerTestText layer; public static Client getInstance() { return instance; @@ -46,6 +58,8 @@ public class ClientState { LocalServerCommsChannel channel = new LocalServerCommsChannel( ServerState.getInstance() ); + + firstLoad = true; Client client = new Client(world, channel); @@ -53,10 +67,43 @@ public class ClientState { setInstance(client); - GUI.addBottomLayer(new LayerWorld(client)); - GUI.addTopLayer(new LayerTestUI()); - GUI.addTopLayer(new LayerAbout()); + ServerState.getInstance().getChunkManager().register(bl -> { + if (!bl && firstLoad) + { + MutableString t = new MutableStringLocalized("LayerText.Load"); + layer = new LayerTestText("Text",() -> {t.update(); return t.get();}); + GUI.addTopLayer(layer); + } + else if (bl && firstLoad) + { + GUI.removeLayer(layer); + + LayerWorld layerWorld = new LayerWorld(client); + LayerTestUI layerUI = new LayerTestUI(); + LayerAbout layerAbout = new LayerAbout(); + GUI.addBottomLayer(layerWorld); + GUI.addTopLayer(layerUI); + GUI.addTopLayer(layerAbout); + layers = new HashSet(); + layers.add(layerWorld); + layers.add(layerUI); + layers.add(layerAbout); + + firstLoad = false; + } + }); + + } + + public static void disconnectFromLocalServer() + { + for (Layer layer : layers) + { + GUI.removeLayer(layer); + } + + ServerState.getInstance().getClientManager(); } private ClientState() { diff --git a/src/main/java/ru/windcorp/progressia/client/comms/localhost/LocalClient.java b/src/main/java/ru/windcorp/progressia/client/comms/localhost/LocalClient.java index 816fba8..f1fdf96 100644 --- a/src/main/java/ru/windcorp/progressia/client/comms/localhost/LocalClient.java +++ b/src/main/java/ru/windcorp/progressia/client/comms/localhost/LocalClient.java @@ -53,7 +53,8 @@ public class LocalClient extends ClientPlayer { @Override public void disconnect() { - // Do nothing + setState(State.DISCONNECTING); + serverComms.disconnect(); } } diff --git a/src/main/java/ru/windcorp/progressia/client/comms/localhost/LocalServerCommsChannel.java b/src/main/java/ru/windcorp/progressia/client/comms/localhost/LocalServerCommsChannel.java index 194a2a1..b631a3c 100644 --- a/src/main/java/ru/windcorp/progressia/client/comms/localhost/LocalServerCommsChannel.java +++ b/src/main/java/ru/windcorp/progressia/client/comms/localhost/LocalServerCommsChannel.java @@ -54,7 +54,7 @@ public class LocalServerCommsChannel extends ServerCommsChannel { @Override public void disconnect() { - // Do nothing + setState(State.DISCONNECTING); } } diff --git a/src/main/java/ru/windcorp/progressia/server/ChunkManager.java b/src/main/java/ru/windcorp/progressia/server/ChunkManager.java index b0b0777..5042954 100644 --- a/src/main/java/ru/windcorp/progressia/server/ChunkManager.java +++ b/src/main/java/ru/windcorp/progressia/server/ChunkManager.java @@ -18,10 +18,15 @@ package ru.windcorp.progressia.server; +import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; +import java.util.HashSet; import java.util.Map; import java.util.WeakHashMap; +import org.apache.logging.log4j.LogManager; + import glm.vec._3.i.Vec3i; import ru.windcorp.progressia.common.world.ChunkData; import ru.windcorp.progressia.common.world.PacketRevokeChunk; @@ -74,6 +79,12 @@ public class ChunkManager { } } + + @FunctionalInterface + public interface ChunksLoadListener + { + void handle(boolean starting); + } private final Server server; @@ -82,6 +93,8 @@ public class ChunkManager { private final ChunkSet toLoad = ChunkSets.newHashSet(); private final ChunkSet toUnload = ChunkSets.newHashSet(); + private Collection listeners = Collections.synchronizedCollection( new ArrayList<>()); + // TODO replace with a normal Map managed by some sort of PlayerListener, // weak maps are weak private final Map visions = Collections.synchronizedMap(new WeakHashMap<>()); @@ -101,6 +114,16 @@ public class ChunkManager { } } + public void register(ChunksLoadListener cll) + { + listeners.add(cll); + } + + public void unregisterAll() + { + listeners.clear(); + } + private void gatherRequests() { requested.clear(); @@ -126,6 +149,12 @@ public class ChunkManager { } private void processQueues() { + + if (toUnload.size()!=0 || toLoad.size()!=0) + { + LogManager.getLogger().info(String.valueOf(toUnload.size())+" "+String.valueOf( toLoad.size())); + listeners.forEach(l -> l.handle(false)); + } toUnload.forEach(this::unloadChunk); toUnload.clear(); toLoad.forEach(this::loadChunk); @@ -134,6 +163,8 @@ public class ChunkManager { visions.forEach((p, v) -> { v.processQueues(p); }); + listeners.forEach(l -> l.handle(true)); + } private PlayerVision getVision(Player player, boolean createIfMissing) { @@ -174,6 +205,25 @@ public class ChunkManager { TestWorldDiskIO.saveChunk(chunk, getServer()); } + + public void unloadAll() // dont use probably + { + WorldData world = getServer().getWorld().getData(); + + //Collection chunks = world.getChunks(); + Collection chunkPoss = new HashSet(); + + world.forEachChunk(c -> { + chunkPoss.add(c.getPosition()); + }); + + chunkPoss.forEach(v -> { + ChunkData c = world.getChunk(v); + world.removeChunk(c); + + TestWorldDiskIO.saveChunk(c, getServer()); + }); + } public void sendChunk(Player player, Vec3i chunkPos) { ChunkData chunk = server.getWorld().getData().getChunk(chunkPos); diff --git a/src/main/java/ru/windcorp/progressia/server/PlayerManager.java b/src/main/java/ru/windcorp/progressia/server/PlayerManager.java index 38d0f32..b1447bf 100644 --- a/src/main/java/ru/windcorp/progressia/server/PlayerManager.java +++ b/src/main/java/ru/windcorp/progressia/server/PlayerManager.java @@ -72,6 +72,11 @@ public class PlayerManager { return player; } + + public void removePlayer(Player player) + { + players.remove(player); + } public Server getServer() { return server; diff --git a/src/main/java/ru/windcorp/progressia/test/LayerButtonTest.java b/src/main/java/ru/windcorp/progressia/test/LayerButtonTest.java index 65b1a07..bae1d67 100644 --- a/src/main/java/ru/windcorp/progressia/test/LayerButtonTest.java +++ b/src/main/java/ru/windcorp/progressia/test/LayerButtonTest.java @@ -17,6 +17,8 @@ */ package ru.windcorp.progressia.test; +import java.util.Collection; + import ru.windcorp.progressia.client.ClientState; import ru.windcorp.progressia.client.graphics.Colors; import ru.windcorp.progressia.client.graphics.GUI; @@ -28,9 +30,15 @@ import ru.windcorp.progressia.client.graphics.gui.Label; import ru.windcorp.progressia.client.graphics.gui.RadioButton; import ru.windcorp.progressia.client.graphics.gui.RadioButtonGroup; 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.Player; import ru.windcorp.progressia.server.ServerState; public class LayerButtonTest extends MenuLayer { + + boolean alive = true; public LayerButtonTest() { super("ButtonTest"); @@ -64,15 +72,43 @@ public class LayerButtonTest extends MenuLayer { getCloseAction().run(); })); - getContent().addChild(new Button("Menu", "Menu").addAction(b -> { + getContent().addChild(new Button("Menu", "Back To Menu").addAction(b -> { //System.exit(0); - for (Layer layer : GUI.getLayers()) - { - GUI.removeLayer(layer); - } - GUI.addTopLayer(new LayerTitle("Title")); + //for (Layer layer : GUI.getLayers()) + //{ + // GUI.removeLayer(layer); + //} + getCloseAction().run(); + //ClientState.getInstance().; + Collection players = ServerState.getInstance().getPlayerManager().getPlayers(); + players.clear(); + + ClientState.disconnectFromLocalServer(); + + MutableString t = new MutableStringLocalized("LayerText.Save"); + LayerTestText layer = new LayerTestText("Text",() -> {t.update(); return t.get();}); + + GUI.addTopLayer(layer); + + ChunkManager cm = ServerState.getInstance().getChunkManager(); + alive = true; + cm.register(bl -> { + if (bl && alive) + { + GUI.removeLayer(layer); + GUI.addTopLayer(new LayerTitle("Title")); + //cm.unregisterAll(); + alive = false; + } + }); + + //ClientState.getInstance(); + ClientState.setInstance(null); + ServerState.setInstance(null); + //ServerState.getInstance().getChunkManager().unloadAll(); + //ServerState.getInstance().shutdown("Safe Exit"); })); diff --git a/src/main/java/ru/windcorp/progressia/test/LayerTestText.java b/src/main/java/ru/windcorp/progressia/test/LayerTestText.java new file mode 100644 index 0000000..3cfef00 --- /dev/null +++ b/src/main/java/ru/windcorp/progressia/test/LayerTestText.java @@ -0,0 +1,24 @@ +package ru.windcorp.progressia.test; + +import java.util.function.Supplier; + +import ru.windcorp.progressia.client.graphics.Colors; +import ru.windcorp.progressia.client.graphics.font.Font; +import ru.windcorp.progressia.client.graphics.gui.GUILayer; +import ru.windcorp.progressia.client.graphics.gui.Label; +import ru.windcorp.progressia.client.graphics.gui.layout.LayoutVertical; + +public class LayerTestText extends GUILayer { + public LayerTestText(String name, Supplier value) { + super(name, new LayoutVertical(20,10)); + + //MutableString title = new MutableStringLocalized("Layer"+name+".Title"); + Font titleFont = new Font().deriveBold().withColor(Colors.BLACK).withAlign(0.5f); + getRoot().addChild(new Label(name+".Text", titleFont, value)); + } + + public LayerTestText(String name, String value) + { + this(name,() -> value); + } +} diff --git a/src/main/java/ru/windcorp/progressia/test/LayerTitle.java b/src/main/java/ru/windcorp/progressia/test/LayerTitle.java index 8ef01fd..c739651 100644 --- a/src/main/java/ru/windcorp/progressia/test/LayerTitle.java +++ b/src/main/java/ru/windcorp/progressia/test/LayerTitle.java @@ -24,6 +24,7 @@ public class LayerTitle extends GUILayer { MutableString playText = new MutableStringLocalized("Layer"+name+".Play"); getRoot().addChild(new Button(name+".Play", new Label(name+".Play", buttonFont, playText)).addAction(b -> { GUI.removeLayer(this); + ProgressiaLauncher.play();})); MutableString quitText = new MutableStringLocalized("Layer"+name+".Quit"); diff --git a/src/main/resources/assets/languages/en-US.lang b/src/main/resources/assets/languages/en-US.lang index 6bea171..f1bb85c 100644 --- a/src/main/resources/assets/languages/en-US.lang +++ b/src/main/resources/assets/languages/en-US.lang @@ -23,8 +23,12 @@ LayerTestGUI.IsFullscreen = Fullscreen: %5s (F11) LayerTestGUI.IsVSync = VSync: %5s (F12) LayerButtonTest.Title = Button Test +LayerButtonTest.Return = Back To Menu LayerTitle.Title = Progressia LayerTitle.Play = Play World LayerTitle.Options = Options -LayerTitle.Quit = Quit \ No newline at end of file +LayerTitle.Quit = Quit + +LayerText.Load = Loading... +LayerText.Save = Saving... \ No newline at end of file diff --git a/src/main/resources/assets/languages/ru-RU.lang b/src/main/resources/assets/languages/ru-RU.lang index efb1757..92cc41b 100644 --- a/src/main/resources/assets/languages/ru-RU.lang +++ b/src/main/resources/assets/languages/ru-RU.lang @@ -23,8 +23,12 @@ LayerTestGUI.IsFullscreen = Полный экран: %5s (F11) LayerTestGUI.IsVSync = Верт. синхр.: %5s (F12) LayerButtonTest.Title = Тест Кнопок +LayerButtonTest.Return = Back To Menu [[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[ LayerTitle.Title = Прогрессия LayerTitle.Play = ??????? LayerTitle.Options = ???????? -LayerTitle.Quit = ???????? \ No newline at end of file +LayerTitle.Quit = ???????? + +LayerText.Load = Loading... (Change) +LayerText.Save = Saving...(Cahnsf) \ No newline at end of file