summaryrefslogtreecommitdiff
path: root/core
diff options
context:
space:
mode:
Diffstat (limited to 'core')
-rw-r--r--core/src/main/java/kz/ilotterytea/frogartha/entities/PlayerEntity.java5
-rw-r--r--core/src/main/java/kz/ilotterytea/frogartha/screens/GameScreen.java26
-rw-r--r--core/src/main/java/kz/ilotterytea/frogartha/screens/MenuScreen.java2
-rw-r--r--core/src/main/java/kz/ilotterytea/frogartha/sessions/IdentityClient.java11
-rw-r--r--core/src/main/java/kz/ilotterytea/frogartha/sessions/SessionClient.java35
-rw-r--r--core/src/main/java/kz/ilotterytea/frogartha/sessions/SessionHandlers.java103
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());
+ }
}