diff options
| author | ilotterytea <iltsu@alright.party> | 2025-01-22 22:25:41 +0500 |
|---|---|---|
| committer | ilotterytea <iltsu@alright.party> | 2025-01-22 22:31:11 +0500 |
| commit | 03915c3bde4f938c59a05c573ea8aab56a37048e (patch) | |
| tree | 1196c62ff0e8aa092950f8c9a7a0d16c62bc3fb0 /core | |
| parent | 9136ee6347c86b6b64ff044656b17f180d84f115 (diff) | |
feat: kick screen
Diffstat (limited to 'core')
4 files changed, 139 insertions, 1 deletions
diff --git a/core/src/main/java/kz/ilotterytea/frogartha/screens/GameScreen.java b/core/src/main/java/kz/ilotterytea/frogartha/screens/GameScreen.java index 2586f3a..b6444bd 100644 --- a/core/src/main/java/kz/ilotterytea/frogartha/screens/GameScreen.java +++ b/core/src/main/java/kz/ilotterytea/frogartha/screens/GameScreen.java @@ -70,6 +70,10 @@ public class GameScreen implements Screen { } decalBatch.flush(); + + if (game.getSessionClient().hasThrown()) { + game.setScreen(new KickScreen()); + } } @Override diff --git a/core/src/main/java/kz/ilotterytea/frogartha/screens/KickScreen.java b/core/src/main/java/kz/ilotterytea/frogartha/screens/KickScreen.java new file mode 100644 index 0000000..dd98361 --- /dev/null +++ b/core/src/main/java/kz/ilotterytea/frogartha/screens/KickScreen.java @@ -0,0 +1,109 @@ +package kz.ilotterytea.frogartha.screens; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.Screen; +import com.badlogic.gdx.graphics.GL20; +import com.badlogic.gdx.scenes.scene2d.InputEvent; +import com.badlogic.gdx.scenes.scene2d.Stage; +import com.badlogic.gdx.scenes.scene2d.ui.Label; +import com.badlogic.gdx.scenes.scene2d.ui.Skin; +import com.badlogic.gdx.scenes.scene2d.ui.Table; +import com.badlogic.gdx.scenes.scene2d.ui.TextButton; +import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; +import com.badlogic.gdx.utils.Align; +import com.badlogic.gdx.utils.viewport.ScreenViewport; +import kz.ilotterytea.frogartha.FrogarthaGame; +import kz.ilotterytea.frogartha.assets.Assets; +import kz.ilotterytea.frogartha.exceptions.PlayerKickException; + +public class KickScreen implements Screen { + private FrogarthaGame game; + private Stage stage; + private Throwable lastThrow; + + @Override + public void show() { + game = FrogarthaGame.getInstance(); + lastThrow = game.getSessionClient().getLastThrow(); + + createStage(); + + Gdx.input.setInputProcessor(stage); + } + + @Override + public void render(float delta) { + if (lastThrow == null) { + game.setScreen(new MenuScreen()); + return; + } + + Gdx.gl.glClearColor(0f, 0f, 0f, 1f); + Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT); + + stage.act(delta); + stage.draw(); + } + + @Override + public void resize(int width, int height) { + stage.getViewport().update(width, height, true); + } + + @Override + public void pause() { + hide(); + } + + @Override + public void resume() { + show(); + } + + @Override + public void hide() { + dispose(); + } + + @Override + public void dispose() { + stage.dispose(); + } + + private void createStage() { + stage = new Stage(new ScreenViewport()); + Skin skin = game.getAssetManager().get(Assets.Skins.SKIN_UI); + + Table mainTable = new Table(); + mainTable.setFillParent(true); + mainTable.align(Align.center); + stage.addActor(mainTable); + + String title; + + if (lastThrow instanceof PlayerKickException) { + title = "Disconnected by Server"; + } else { + title = "Connection Lost"; + } + + Label titleLabel = new Label(title, skin, "kick-title"); + mainTable.add(titleLabel).minWidth(256f).padBottom(64f).row(); + + Label bodyLabel = new Label(lastThrow.getMessage(), skin); + bodyLabel.setWrap(true); + bodyLabel.setAlignment(Align.center); + mainTable.add(bodyLabel).width(512f).padBottom(64f).row(); + + TextButton menuButton = new TextButton("Back to menu screen", skin); + mainTable.add(menuButton).minWidth(512f).row(); + + menuButton.addListener(new ClickListener() { + @Override + public void clicked(InputEvent event, float x, float y) { + super.clicked(event, x, y); + game.setScreen(new MenuScreen()); + } + }); + } +} diff --git a/core/src/main/java/kz/ilotterytea/frogartha/screens/MenuScreen.java b/core/src/main/java/kz/ilotterytea/frogartha/screens/MenuScreen.java index 9f716f6..60eb5c6 100644 --- a/core/src/main/java/kz/ilotterytea/frogartha/screens/MenuScreen.java +++ b/core/src/main/java/kz/ilotterytea/frogartha/screens/MenuScreen.java @@ -37,7 +37,9 @@ public class MenuScreen implements Screen { stage.act(delta); stage.draw(); - if (game.getIdentityClient().isInRoom()) { + if (game.getSessionClient().hasThrown()) { + game.setScreen(new KickScreen()); + } else if (game.getIdentityClient().isInRoom()) { game.setScreen(new GameScreen()); } } diff --git a/core/src/main/java/kz/ilotterytea/frogartha/sessions/SessionClient.java b/core/src/main/java/kz/ilotterytea/frogartha/sessions/SessionClient.java index e8b32e3..6132a8a 100644 --- a/core/src/main/java/kz/ilotterytea/frogartha/sessions/SessionClient.java +++ b/core/src/main/java/kz/ilotterytea/frogartha/sessions/SessionClient.java @@ -24,6 +24,7 @@ public class SessionClient implements WebSocketListener { private final HashMap<Integer, PlayerData> playerDataMap; private int connectionId; + private Throwable lastThrow; public SessionClient() { this.connection = WebSockets.newSocket(FrogarthaConstants.URLS.SESSION_WSS); @@ -85,8 +86,10 @@ public class SessionClient implements WebSocketListener { } } catch (PlayerKickException e) { log.log("Kicked out: {}", e.getMessage()); + setLastThrow(e); } catch (Exception e) { log.error("An exception was thrown while processing message", e); + setLastThrow(e); } return true; } @@ -94,6 +97,7 @@ public class SessionClient implements WebSocketListener { @Override public boolean onError(WebSocket webSocket, Throwable error) { log.error("An exception was thrown on session connection", error); + setLastThrow(error); return true; } @@ -125,6 +129,25 @@ public class SessionClient implements WebSocketListener { this.connectionId = connectionId; } + public Throwable getLastThrow() { + Throwable cpy = lastThrow; + this.lastThrow = null; + return cpy; + } + + public boolean hasThrown() { + return this.lastThrow != null; + } + + private void setLastThrow(Throwable throwable) { + this.lastThrow = throwable; + game.getIdentityClient().setInRoom(false); + playerDataMap.clear(); + if (connection.isOpen()) { + connection.close(); + } + } + public HashMap<Integer, PlayerData> getPlayerDataMap() { return playerDataMap; } |
