diff options
| author | ilotterytea <iltsu@alright.party> | 2025-01-22 04:11:41 +0500 |
|---|---|---|
| committer | ilotterytea <iltsu@alright.party> | 2025-01-22 04:11:41 +0500 |
| commit | 449c70cbf900a80042f70dd8929f302f0f0016d7 (patch) | |
| tree | cd958299e1a421165c370cb31500315f0635560c /server/src/main/java/kz/ilotterytea/frogartha/server/ServerHandlers.java | |
| parent | b96a6d7005fcb90a21aeb21ddebe8bb7b82a7ef5 (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.java | 75 |
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); } } |
