diff options
| author | ilotterytea <iltsu@alright.party> | 2025-01-23 00:55:33 +0500 |
|---|---|---|
| committer | ilotterytea <iltsu@alright.party> | 2025-01-23 00:55:33 +0500 |
| commit | 6bf7ee0b5f0c15fefa2a6cde4a17d8f6ade3f39b (patch) | |
| tree | d085466f3d453a73322adc881296e6c8b30ba26e /core/src | |
| parent | 7757de487c909fe15e0ac0b5cbaa27f12109c66d (diff) | |
feat: chat !!!
Diffstat (limited to 'core/src')
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()); + } } |
