summaryrefslogtreecommitdiff
path: root/server/src/main/java/kz/ilotterytea/frogartha/server/ServerHandlers.java
diff options
context:
space:
mode:
authorilotterytea <iltsu@alright.party>2025-01-22 04:11:41 +0500
committerilotterytea <iltsu@alright.party>2025-01-22 04:11:41 +0500
commit449c70cbf900a80042f70dd8929f302f0f0016d7 (patch)
treecd958299e1a421165c370cb31500315f0635560c /server/src/main/java/kz/ilotterytea/frogartha/server/ServerHandlers.java
parentb96a6d7005fcb90a21aeb21ddebe8bb7b82a7ef5 (diff)
feat: MULTIPLAYER!!!!!!!!!!!!!!! LETS FUCKING GOOOOOOOO!!!!!
Diffstat (limited to 'server/src/main/java/kz/ilotterytea/frogartha/server/ServerHandlers.java')
-rw-r--r--server/src/main/java/kz/ilotterytea/frogartha/server/ServerHandlers.java75
1 files changed, 70 insertions, 5 deletions
diff --git a/server/src/main/java/kz/ilotterytea/frogartha/server/ServerHandlers.java b/server/src/main/java/kz/ilotterytea/frogartha/server/ServerHandlers.java
index 1cc0e57..c1bdbbe 100644
--- a/server/src/main/java/kz/ilotterytea/frogartha/server/ServerHandlers.java
+++ b/server/src/main/java/kz/ilotterytea/frogartha/server/ServerHandlers.java
@@ -5,13 +5,17 @@ import kz.ilotterytea.frogartha.FrogarthaConstants;
import kz.ilotterytea.frogartha.domain.Identity;
import kz.ilotterytea.frogartha.domain.PlayerState;
import kz.ilotterytea.frogartha.domain.actions.ChangedDirectionAction;
+import kz.ilotterytea.frogartha.domain.actions.JoinRoomAction;
+import kz.ilotterytea.frogartha.domain.actions.LeaveRoomAction;
import kz.ilotterytea.frogartha.domain.actions.PlayerJumpAction;
import kz.ilotterytea.frogartha.domain.events.ChangedDirectionEvent;
+import kz.ilotterytea.frogartha.domain.events.IdentifiedEvent;
import kz.ilotterytea.frogartha.domain.events.PlayerJumpEvent;
-import kz.ilotterytea.frogartha.domain.server.Acknowledge;
import kz.ilotterytea.frogartha.exceptions.PlayerKickException;
import kz.ilotterytea.frogartha.utils.Logger;
+import java.util.Optional;
+
public class ServerHandlers {
private static final Logger log = new Logger(ServerHandlers.class);
private static final FrogarthaServer server = FrogarthaServer.getInstance();
@@ -26,11 +30,15 @@ public class ServerHandlers {
}
player.setIdentity(identity);
- player.send(new Acknowledge(Acknowledge.AcknowledgeCode.IDENTIFIED));
+ player.send(new IdentifiedEvent(player.getId()));
log.log("Successfully identified {} for {}", identity, player);
}
public static void handlePlayerJumpAction(PlayerConnection player, PlayerJumpAction action) {
+ if (player.getRoom() == null) {
+ throw PlayerKickException.notInRoom();
+ }
+
PlayerState state = player.getState();
float nowTimestamp = System.currentTimeMillis() / 1000f;
@@ -56,18 +64,75 @@ public class ServerHandlers {
state.setPosition(endPosition.x, endPosition.y, endPosition.z);
- player.send(new PlayerJumpEvent(
+ PlayerJumpEvent event = new PlayerJumpEvent(
player.getId(), startPosition, endPosition, action.getJumpStrength()
- ));
+ );
+ player.send(event);
log.log("{} jumped from {} to {} with strength {}", player, startPosition, endPosition, action.getJumpStrength());
+
+ // broadcasting
+ Room room = player.getRoom();
+ room.getPlayers().forEach((x) -> {
+ if (x.getId() == player.getId()) return;
+ x.send(event);
+ });
}
public static void handleChangedDirectionAction(PlayerConnection player, ChangedDirectionAction action) {
+ if (player.getRoom() == null) {
+ throw PlayerKickException.notInRoom();
+ }
+
PlayerState state = player.getState();
Vector3 direction = action.getDirection();
state.setDirection(direction.x, state.getPosition().y, direction.z);
- player.send(new ChangedDirectionEvent(player.getId(), state.getDirection()));
+ ChangedDirectionEvent event = new ChangedDirectionEvent(player.getId(), state.getDirection());
+ player.send(event);
+
+ // broadcasting
+ Room room = player.getRoom();
+ room.getPlayers().forEach((x) -> {
+ if (x.getId() == player.getId()) return;
+ x.send(event);
+ });
+ }
+
+ public static void handleJoinRoomAction(PlayerConnection player, JoinRoomAction action) {
+ Optional<Room> optionalRoom = server.getRooms().stream()
+ .filter((x) ->
+ x.getPlayers().size() < FrogarthaConstants.Room.MAX_PLAYERS &&
+ x.getTopic().equals(action.getTopic())
+ )
+ .findFirst();
+
+ Room room = optionalRoom.orElse(new Room(action.getTopic()));
+ room.addPlayer(player);
+
+ if (optionalRoom.isEmpty()) {
+ server.getRooms().add(room);
+ }
+
+ log.log("{} joined {}", player, room);
+ }
+
+ public static void handleLeaveRoomAction(PlayerConnection player, LeaveRoomAction action) {
+ Optional<Room> optionalRoom = server.getRooms().stream()
+ .filter((x) -> x.getPlayers().contains(player))
+ .findFirst();
+
+ if (optionalRoom.isEmpty()) {
+ throw PlayerKickException.illegalOperation();
+ }
+
+ Room room = optionalRoom.get();
+ room.removePlayer(player);
+
+ if (room.getPlayers().isEmpty()) {
+ server.getRooms().remove(room);
+ }
+
+ log.log("{} left {}", player, room);
}
}