summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorilotterytea <iltsu@alright.party>2025-01-22 22:25:41 +0500
committerilotterytea <iltsu@alright.party>2025-01-22 22:31:11 +0500
commit03915c3bde4f938c59a05c573ea8aab56a37048e (patch)
tree1196c62ff0e8aa092950f8c9a7a0d16c62bc3fb0
parent9136ee6347c86b6b64ff044656b17f180d84f115 (diff)
feat: kick screen
-rw-r--r--assets/sprites/gui/ui.skin5
-rw-r--r--core/src/main/java/kz/ilotterytea/frogartha/screens/GameScreen.java4
-rw-r--r--core/src/main/java/kz/ilotterytea/frogartha/screens/KickScreen.java109
-rw-r--r--core/src/main/java/kz/ilotterytea/frogartha/screens/MenuScreen.java4
-rw-r--r--core/src/main/java/kz/ilotterytea/frogartha/sessions/SessionClient.java23
5 files changed, 144 insertions, 1 deletions
diff --git a/assets/sprites/gui/ui.skin b/assets/sprites/gui/ui.skin
index ff44768..7fe419f 100644
--- a/assets/sprites/gui/ui.skin
+++ b/assets/sprites/gui/ui.skin
@@ -9,6 +9,7 @@
store_item_amount: { hex: "#1b1412ff" },
orange: { hex: "#ffa300ff" },
yellow: { hex: "#ffec27ff" },
+ gray: { hex: "#808080ff" }
},
com.badlogic.gdx.scenes.scene2d.ui.Skin$TintedDrawable: {
button_pressed: {
@@ -235,6 +236,10 @@
parent: default
font: defaultMobile
},
+ kick-title: {
+ parent: default,
+ fontColor: gray
+ },
store_item: {
font: store_item_name,
fontColor: store_item
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;
}