summaryrefslogtreecommitdiff
path: root/core
diff options
context:
space:
mode:
authorilotterytea <iltsu@alright.party>2025-01-23 00:55:33 +0500
committerilotterytea <iltsu@alright.party>2025-01-23 00:55:33 +0500
commit6bf7ee0b5f0c15fefa2a6cde4a17d8f6ade3f39b (patch)
treed085466f3d453a73322adc881296e6c8b30ba26e /core
parent7757de487c909fe15e0ac0b5cbaa27f12109c66d (diff)
feat: chat !!!
Diffstat (limited to 'core')
-rw-r--r--core/src/main/java/kz/ilotterytea/frogartha/screens/GameScreen.java107
-rw-r--r--core/src/main/java/kz/ilotterytea/frogartha/sessions/SessionClient.java2
-rw-r--r--core/src/main/java/kz/ilotterytea/frogartha/sessions/SessionHandlers.java10
3 files changed, 119 insertions, 0 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 b6444bd..4f8b1c7 100644
--- a/core/src/main/java/kz/ilotterytea/frogartha/screens/GameScreen.java
+++ b/core/src/main/java/kz/ilotterytea/frogartha/screens/GameScreen.java
@@ -11,8 +11,17 @@ import com.badlogic.gdx.graphics.g3d.decals.CameraGroupStrategy;
import com.badlogic.gdx.graphics.g3d.decals.DecalBatch;
import com.badlogic.gdx.graphics.g3d.utils.ModelBuilder;
import com.badlogic.gdx.math.Vector3;
+import com.badlogic.gdx.scenes.scene2d.InputEvent;
+import com.badlogic.gdx.scenes.scene2d.Stage;
+import com.badlogic.gdx.scenes.scene2d.ui.*;
+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.FrogarthaConstants;
import kz.ilotterytea.frogartha.FrogarthaGame;
+import kz.ilotterytea.frogartha.assets.Assets;
import kz.ilotterytea.frogartha.domain.PlayerData;
+import kz.ilotterytea.frogartha.domain.actions.ChatMessageAction;
import kz.ilotterytea.frogartha.entities.LocalPlayerEntity;
import kz.ilotterytea.frogartha.entities.PlayerEntity;
import net.mgsx.gltf.scene3d.attributes.PBRCubemapAttribute;
@@ -30,6 +39,11 @@ import java.util.Map;
public class GameScreen implements Screen {
private FrogarthaGame game;
+ private Stage stage;
+ private Skin skin;
+ private Table chatMessageTable;
+ private ScrollPane chatPane;
+
private PerspectiveCamera camera;
private SceneManager sceneManager;
private DecalBatch decalBatch;
@@ -43,6 +57,7 @@ public class GameScreen implements Screen {
game = FrogarthaGame.getInstance();
create3D();
+ createStage();
playerEntity = new LocalPlayerEntity(camera);
playerEntity.setPosition(0f, 1f, 0f);
@@ -53,6 +68,8 @@ public class GameScreen implements Screen {
entity.setDirection(entry.getValue().getState().getDirection());
playerEntityMap.put(entry.getKey(), entity);
}
+
+ Gdx.input.setInputProcessor(stage);
}
@Override
@@ -71,6 +88,9 @@ public class GameScreen implements Screen {
decalBatch.flush();
+ stage.act(delta);
+ stage.draw();
+
if (game.getSessionClient().hasThrown()) {
game.setScreen(new KickScreen());
}
@@ -78,6 +98,7 @@ public class GameScreen implements Screen {
@Override
public void resize(int width, int height) {
+ stage.getViewport().update(width, height, true);
sceneManager.updateViewport(width, height);
}
@@ -98,6 +119,7 @@ public class GameScreen implements Screen {
@Override
public void dispose() {
+ stage.dispose();
sceneManager.dispose();
decalBatch.dispose();
}
@@ -155,6 +177,91 @@ public class GameScreen implements Screen {
decalBatch = new DecalBatch(new CameraGroupStrategy(camera));
}
+ private void createStage() {
+ stage = new Stage(new ScreenViewport());
+ skin = game.getAssetManager().get(Assets.Skins.SKIN_UI);
+
+ Table mainTable = new Table();
+ mainTable.setFillParent(true);
+ stage.addActor(mainTable);
+
+ // --- Chat ---
+ Table chatBase = new Table();
+ chatBase.pad(8f);
+ chatBase.align(Align.bottomLeft);
+ mainTable.add(chatBase).grow();
+
+ Table chatWrapper = new Table(skin);
+ chatWrapper.setBackground("halftransparentblack");
+ chatWrapper.pad(4f);
+ chatBase.add(chatWrapper).width(384f).align(Align.bottomLeft);
+
+ chatMessageTable = new Table();
+ chatMessageTable.setFillParent(true);
+ chatMessageTable.align(Align.bottom);
+ chatPane = new ScrollPane(chatMessageTable, skin);
+ chatPane.setScrollbarsVisible(true);
+ chatPane.setScrollingDisabled(true, false);
+
+ chatWrapper.add(chatPane).growX().height(300f).row();
+
+ // Chat sender table
+ Table chatSenderTable = new Table();
+ chatWrapper.add(chatSenderTable).grow();
+
+ TextField chatField = new TextField("", skin);
+ chatField.setMessageText("...");
+ chatField.setMaxLength(FrogarthaConstants.Chat.MAX_MESSAGE_LENGTH);
+ chatSenderTable.add(chatField).grow().padRight(16f);
+
+ TextButton chatSendButton = new TextButton("Send", skin);
+ chatSenderTable.add(chatSendButton).grow();
+
+ chatSendButton.addListener(new ClickListener() {
+ @Override
+ public void clicked(InputEvent event, float x, float y) {
+ super.clicked(event, x, y);
+
+ if (chatField.getText().isEmpty()) return;
+
+ game.getSessionClient().send(new ChatMessageAction(chatField.getText()));
+ chatField.setText("");
+ }
+ });
+ }
+
+ public void addMessage(int playerId, String message) {
+ String name = null;
+
+ if (playerId == game.getSessionClient().getConnectionId()) {
+ name = game.getIdentityClient().getUsername();
+ } else {
+ for (Map.Entry<Integer, PlayerData> entry : game.getSessionClient().getPlayerDataMap().entrySet()) {
+ if (entry.getKey() == playerId) {
+ name = entry.getValue().getIdentity().getUsername();
+ break;
+ }
+ }
+ }
+
+ if (name == null) return;
+
+ Table table = new Table(skin);
+ if (chatMessageTable.getCells().size % 2 == 0) {
+ table.setBackground("halftransparentblack");
+ }
+
+ Label nameLabel = new Label(name, skin);
+ table.add(nameLabel).padBottom(4f).growX().row();
+
+ Label messageLabel = new Label(message, skin);
+ messageLabel.setWrap(true);
+ table.add(messageLabel).padLeft(4f).width(296f).row();
+
+ chatMessageTable.add(table).growX().row();
+ chatPane.scrollTo(0f, 0f, 0f, 0f);
+ }
+
public LocalPlayerEntity getPlayerEntity() {
return playerEntity;
}
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 6132a8a..cde0b2e 100644
--- a/core/src/main/java/kz/ilotterytea/frogartha/sessions/SessionClient.java
+++ b/core/src/main/java/kz/ilotterytea/frogartha/sessions/SessionClient.java
@@ -81,6 +81,8 @@ public class SessionClient implements WebSocketListener {
SessionHandlers.handlePlayerJoinedRoomEvent((PlayerJoinedRoomEvent) obj);
} else if (obj instanceof PlayerLeftRoomEvent) {
SessionHandlers.handlePlayerLeftRoomEvent((PlayerLeftRoomEvent) obj);
+ } else if (obj instanceof ChatMessageEvent) {
+ SessionHandlers.handleChatMessageEvent((ChatMessageEvent) obj);
} else if (obj instanceof PlayerKickException) {
throw (PlayerKickException) obj;
}
diff --git a/core/src/main/java/kz/ilotterytea/frogartha/sessions/SessionHandlers.java b/core/src/main/java/kz/ilotterytea/frogartha/sessions/SessionHandlers.java
index 3b82305..06b7f8e 100644
--- a/core/src/main/java/kz/ilotterytea/frogartha/sessions/SessionHandlers.java
+++ b/core/src/main/java/kz/ilotterytea/frogartha/sessions/SessionHandlers.java
@@ -139,4 +139,14 @@ public class SessionHandlers {
GameScreen screen = (GameScreen) game.getScreen();
screen.getPlayerEntityMap().remove(event.getPlayerId());
}
+
+ public static void handleChatMessageEvent(ChatMessageEvent event) {
+ if (!game.getScreen().getClass().equals(GameScreen.class)) {
+ log.log("The screen is not GameScreen, but the session received ChatMessageEvent");
+ return;
+ }
+
+ GameScreen screen = (GameScreen) game.getScreen();
+ screen.addMessage(event.getPlayerId(), event.getMessage());
+ }
}