diff options
Diffstat (limited to 'core')
6 files changed, 162 insertions, 20 deletions
diff --git a/core/src/main/java/kz/ilotterytea/frogartha/entities/PlayerEntity.java b/core/src/main/java/kz/ilotterytea/frogartha/entities/PlayerEntity.java index 8cc70bc..8264c8f 100644 --- a/core/src/main/java/kz/ilotterytea/frogartha/entities/PlayerEntity.java +++ b/core/src/main/java/kz/ilotterytea/frogartha/entities/PlayerEntity.java @@ -1,10 +1,9 @@ package kz.ilotterytea.frogartha.entities; -import com.badlogic.gdx.Gdx; -import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.math.MathUtils; import com.badlogic.gdx.math.Vector3; import kz.ilotterytea.frogartha.FrogarthaConstants; +import kz.ilotterytea.frogartha.FrogarthaGame; public class PlayerEntity extends RenderableEntity { protected Vector3 startPosition, endPosition; @@ -13,7 +12,7 @@ public class PlayerEntity extends RenderableEntity { protected boolean isJumping; public PlayerEntity() { - super(new Texture(Gdx.files.internal("sprites/player/player.png"))); + super(FrogarthaGame.getInstance().getAssetManager().get("sprites/player/player.png")); this.endPosition = Vector3.Zero; this.startPosition = Vector3.Zero; } 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 3da9d55..421a458 100644 --- a/core/src/main/java/kz/ilotterytea/frogartha/screens/GameScreen.java +++ b/core/src/main/java/kz/ilotterytea/frogartha/screens/GameScreen.java @@ -11,7 +11,9 @@ 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 kz.ilotterytea.frogartha.FrogarthaGame; import kz.ilotterytea.frogartha.entities.LocalPlayerEntity; +import kz.ilotterytea.frogartha.entities.PlayerEntity; import net.mgsx.gltf.scene3d.attributes.PBRCubemapAttribute; import net.mgsx.gltf.scene3d.attributes.PBRTextureAttribute; import net.mgsx.gltf.scene3d.lights.DirectionalShadowLight; @@ -21,19 +23,34 @@ import net.mgsx.gltf.scene3d.scene.SceneManager; import net.mgsx.gltf.scene3d.scene.SceneSkybox; import net.mgsx.gltf.scene3d.utils.IBLBuilder; +import java.util.HashMap; +import java.util.Map; + public class GameScreen implements Screen { + private FrogarthaGame game; + private PerspectiveCamera camera; private SceneManager sceneManager; private DecalBatch decalBatch; private LocalPlayerEntity playerEntity; + private HashMap<Integer, PlayerEntity> playerEntityMap; + @Override public void show() { + game = FrogarthaGame.getInstance(); + create3D(); playerEntity = new LocalPlayerEntity(camera); playerEntity.setPosition(0f, 1f, 0f); + + playerEntityMap = new HashMap<>(); + + for (Integer id : game.getSessionClient().getPlayerDataMap().keySet()) { + playerEntityMap.put(id, new PlayerEntity()); + } } @Override @@ -45,6 +62,11 @@ public class GameScreen implements Screen { playerEntity.update(delta); playerEntity.render(decalBatch); + for (Map.Entry<Integer, PlayerEntity> player : playerEntityMap.entrySet()) { + player.getValue().update(delta); + player.getValue().render(decalBatch); + } + decalBatch.flush(); } @@ -130,4 +152,8 @@ public class GameScreen implements Screen { public LocalPlayerEntity getPlayerEntity() { return playerEntity; } + + public HashMap<Integer, PlayerEntity> getPlayerEntityMap() { + return playerEntityMap; + } } 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 761835e..9f716f6 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,7 @@ public class MenuScreen implements Screen { stage.act(delta); stage.draw(); - if (game.getIdentityClient().isAuthorized()) { + if (game.getIdentityClient().isInRoom()) { game.setScreen(new GameScreen()); } } diff --git a/core/src/main/java/kz/ilotterytea/frogartha/sessions/IdentityClient.java b/core/src/main/java/kz/ilotterytea/frogartha/sessions/IdentityClient.java index 1e09e8e..64e7270 100644 --- a/core/src/main/java/kz/ilotterytea/frogartha/sessions/IdentityClient.java +++ b/core/src/main/java/kz/ilotterytea/frogartha/sessions/IdentityClient.java @@ -8,7 +8,7 @@ public class IdentityClient { private final FrogarthaGame game; private String username; - private boolean isProcessing, isAuthorized; + private boolean isProcessing, isAuthorized, inRoom; public IdentityClient() { this.log = new Logger(IdentityClient.class); @@ -18,6 +18,7 @@ public class IdentityClient { this.isProcessing = false; this.isAuthorized = false; + this.inRoom = false; } @@ -38,6 +39,14 @@ public class IdentityClient { isAuthorized = authorized; } + public boolean isInRoom() { + return inRoom; + } + + public void setInRoom(boolean inRoom) { + this.inRoom = inRoom; + } + public boolean isProcessing() { return isProcessing; } 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 738ee3a..e8b32e3 100644 --- a/core/src/main/java/kz/ilotterytea/frogartha/sessions/SessionClient.java +++ b/core/src/main/java/kz/ilotterytea/frogartha/sessions/SessionClient.java @@ -8,18 +8,22 @@ import com.github.czyzby.websocket.serialization.impl.ManualSerializer; import kz.ilotterytea.frogartha.FrogarthaConstants; import kz.ilotterytea.frogartha.FrogarthaGame; import kz.ilotterytea.frogartha.domain.Identity; -import kz.ilotterytea.frogartha.domain.events.ChangedDirectionEvent; -import kz.ilotterytea.frogartha.domain.events.PlayerJumpEvent; -import kz.ilotterytea.frogartha.domain.server.Acknowledge; +import kz.ilotterytea.frogartha.domain.PlayerData; +import kz.ilotterytea.frogartha.domain.events.*; import kz.ilotterytea.frogartha.exceptions.PlayerKickException; import kz.ilotterytea.frogartha.utils.Logger; import kz.ilotterytea.frogartha.utils.SerializerUtils; +import java.util.HashMap; + public class SessionClient implements WebSocketListener { private final Logger log; private final FrogarthaGame game; private final WebSocket connection; private final ManualSerializer serializer; + private final HashMap<Integer, PlayerData> playerDataMap; + + private int connectionId; public SessionClient() { this.connection = WebSockets.newSocket(FrogarthaConstants.URLS.SESSION_WSS); @@ -31,6 +35,7 @@ public class SessionClient implements WebSocketListener { this.log = new Logger(SessionClient.class); this.game = FrogarthaGame.getInstance(); + this.playerDataMap = new HashMap<>(); } @Override @@ -61,12 +66,20 @@ public class SessionClient implements WebSocketListener { throw new RuntimeException("Deserialized packet is null"); } - if (obj instanceof Acknowledge) { - SessionHandlers.handleAcknowledge((Acknowledge) obj); + if (obj instanceof IdentifiedEvent) { + SessionHandlers.handleIdentifiedEvent((IdentifiedEvent) obj); } else if (obj instanceof PlayerJumpEvent) { SessionHandlers.handlePlayerJumpEvent((PlayerJumpEvent) obj); } else if (obj instanceof ChangedDirectionEvent) { SessionHandlers.handleChangedDirectionEvent((ChangedDirectionEvent) obj); + } else if (obj instanceof SenderJoinedRoomEvent) { + SessionHandlers.handleSenderJoinedRoomEvent((SenderJoinedRoomEvent) obj); + } else if (obj instanceof SenderLeftRoomEvent) { + SessionHandlers.handleSenderLeftRoomEvent((SenderLeftRoomEvent) obj); + } else if (obj instanceof PlayerJoinedRoomEvent) { + SessionHandlers.handlePlayerJoinedRoomEvent((PlayerJoinedRoomEvent) obj); + } else if (obj instanceof PlayerLeftRoomEvent) { + SessionHandlers.handlePlayerLeftRoomEvent((PlayerLeftRoomEvent) obj); } else if (obj instanceof PlayerKickException) { throw (PlayerKickException) obj; } @@ -103,4 +116,16 @@ public class SessionClient implements WebSocketListener { public void updateIdentity() { send(new Identity(game.getIdentityClient().getUsername())); } + + public int getConnectionId() { + return connectionId; + } + + public void setConnectionId(int connectionId) { + this.connectionId = connectionId; + } + + public HashMap<Integer, PlayerData> getPlayerDataMap() { + return playerDataMap; + } } 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 2fc50b8..c7abe3e 100644 --- a/core/src/main/java/kz/ilotterytea/frogartha/sessions/SessionHandlers.java +++ b/core/src/main/java/kz/ilotterytea/frogartha/sessions/SessionHandlers.java @@ -2,24 +2,29 @@ package kz.ilotterytea.frogartha.sessions; import com.badlogic.gdx.math.Vector3; import kz.ilotterytea.frogartha.FrogarthaGame; -import kz.ilotterytea.frogartha.domain.events.ChangedDirectionEvent; -import kz.ilotterytea.frogartha.domain.events.PlayerJumpEvent; -import kz.ilotterytea.frogartha.domain.server.Acknowledge; +import kz.ilotterytea.frogartha.domain.PlayerData; +import kz.ilotterytea.frogartha.domain.RoomTopic; +import kz.ilotterytea.frogartha.domain.actions.JoinRoomAction; +import kz.ilotterytea.frogartha.domain.events.*; import kz.ilotterytea.frogartha.entities.PlayerEntity; import kz.ilotterytea.frogartha.screens.GameScreen; +import kz.ilotterytea.frogartha.screens.MenuScreen; import kz.ilotterytea.frogartha.utils.Logger; +import java.util.HashMap; +import java.util.Map; + public class SessionHandlers { private static final Logger log = new Logger(SessionHandlers.class); private static final FrogarthaGame game = FrogarthaGame.getInstance(); private static final SessionClient client = game.getSessionClient(); - public static void handleAcknowledge(Acknowledge acknowledge) { - log.log("The server was acknowledged: {}", acknowledge); + public static void handleIdentifiedEvent(IdentifiedEvent event) { + log.log("The server identified me!"); - if (acknowledge.getCode() == Acknowledge.AcknowledgeCode.IDENTIFIED) { - game.getIdentityClient().setAuthorized(true); - } + client.setConnectionId(event.getPlayerId()); + game.getIdentityClient().setAuthorized(true); + client.send(new JoinRoomAction(RoomTopic.POND)); } public static void handlePlayerJumpEvent(PlayerJumpEvent event) { @@ -29,7 +34,22 @@ public class SessionHandlers { } GameScreen screen = (GameScreen) game.getScreen(); - PlayerEntity entity = screen.getPlayerEntity(); + PlayerEntity entity = null; + + if (event.getPlayerId() == client.getConnectionId()) { + entity = screen.getPlayerEntity(); + } else { + for (Map.Entry<Integer, PlayerEntity> entityEntry : screen.getPlayerEntityMap().entrySet()) { + if (entityEntry.getKey() != event.getPlayerId()) continue; + entity = entityEntry.getValue(); + break; + } + } + + if (entity == null) { + log.log("No player ID {}", event.getPlayerId()); + return; + } entity.setJumpStrength(event.getJumpStrength()); entity.setStartPosition(event.getStartPosition()); @@ -44,10 +64,73 @@ public class SessionHandlers { } GameScreen screen = (GameScreen) game.getScreen(); - PlayerEntity entity = screen.getPlayerEntity(); + PlayerEntity entity = null; + + if (event.getPlayerId() == client.getConnectionId()) { + entity = screen.getPlayerEntity(); + } else { + for (Map.Entry<Integer, PlayerEntity> entityEntry : screen.getPlayerEntityMap().entrySet()) { + if (entityEntry.getKey() != event.getPlayerId()) continue; + entity = entityEntry.getValue(); + break; + } + } + + if (entity == null) { + log.log("No player ID {}", event.getPlayerId()); + return; + } Vector3 direction = event.getDirection(); entity.setDirection(direction.x, entity.getPosition().y, direction.z); } + + public static void handleSenderJoinedRoomEvent(SenderJoinedRoomEvent event) { + if (game.getScreen().getClass().equals(GameScreen.class)) { + log.log("The screen is already GameScreen, but the session received SenderJoinedRoomEvent"); + return; + } + + HashMap<Integer, PlayerData> map = new HashMap<>(); + + for (int i = 0; i < event.getPlayers().size(); i++) { + Integer id = event.getIds().get(i); + PlayerData data = event.getPlayers().get(i); + map.put(id, data); + } + + client.getPlayerDataMap().putAll(map); + game.getIdentityClient().setInRoom(true); + } + + public static void handleSenderLeftRoomEvent(SenderLeftRoomEvent event) { + if (!game.getScreen().getClass().equals(GameScreen.class)) { + log.log("The screen is not GameScreen, but the session received SenderLeftRoomEvent"); + return; + } + + client.getPlayerDataMap().clear(); + game.setScreen(new MenuScreen()); + } + + public static void handlePlayerJoinedRoomEvent(PlayerJoinedRoomEvent event) { + if (!game.getScreen().getClass().equals(GameScreen.class)) { + log.log("The screen is not GameScreen, but the session received PlayerJoinedRoomEvent"); + return; + } + + GameScreen screen = (GameScreen) game.getScreen(); + screen.getPlayerEntityMap().put(event.getPlayerId(), new PlayerEntity()); + } + + public static void handlePlayerLeftRoomEvent(PlayerLeftRoomEvent event) { + if (!game.getScreen().getClass().equals(GameScreen.class)) { + log.log("The screen is not GameScreen, but the session received PlayerLeftRoomEvent"); + return; + } + + GameScreen screen = (GameScreen) game.getScreen(); + screen.getPlayerEntityMap().remove(event.getPlayerId()); + } } |
