From aec0e8e978cf407eb6136b5312d016d8fb5b5617 Mon Sep 17 00:00:00 2001 From: jzitnik-dev Date: Wed, 4 Feb 2026 10:33:24 +0000 Subject: [PATCH] feat: Multiplayer (#2) Make this game multiplayer. Setup: - `common` for common classes used both by the server and the client - `game` the actual client - `server` the server Reviewed-on: https://gitea.local.jzitnik.dev/jzitnik/game/pulls/2 Co-authored-by: jzitnik-dev Co-committed-by: jzitnik-dev --- .gitignore | 41 -- .idea/FuzzierSettings.xml | 14 + .idea/compiler.xml | 40 ++ .idea/encodings.xml | 6 + .idea/jarRepositories.xml | 25 + .idea/misc.xml | 16 +- common/.gitignore | 39 ++ common/.idea/.gitignore | 3 + common/.idea/encodings.xml | 7 + common/.idea/misc.xml | 14 + common/.idea/vcs.xml | 6 + common/pom.xml | 63 +++ .../main/java/cz/jzitnik/common/Config.java | 5 + .../common/models/coordinates}/RoomCords.java | 14 +- .../common/models/coordinates/RoomPart.java | 12 +- .../common/models/player/PlayerCreation.java | 27 + .../jzitnik/common/socket/SocketMessage.java | 6 + .../jzitnik/common/socket/messages/Test.java | 6 + .../game/connection/ConnectToAGame.java | 6 + .../connection/ConnectToAGameResponse.java | 25 + .../messages/game/creation/CreateGame.java | 6 + .../game/creation/CreateGameResponse.java | 13 + .../messages/items/ItemTookFromChest.java | 9 + .../messages/player/PlayerArrivalChange.java | 8 + .../messages/player/PlayerDisconnected.java | 6 + .../socket/messages/player/PlayerJoined.java | 7 + .../socket/messages/player/PlayerMove.java | 7 + .../messages/player/PlayerMovedInUrRoom.java | 14 + .../messages/player/PlayerRotation.java | 5 + .../socket/messages/room/MovePlayerRoom.java | 8 + .../messages/room/MovePlayerRoomResponse.java | 22 + game/.gitignore | 42 ++ game/.idea/.gitignore | 3 + game/.idea/encodings.xml | 13 + game/.idea/misc.xml | 12 + game/.idea/vcs.xml | 6 + game/pom.xml | 190 +++++++ .../src/main/java/cz/jzitnik/client}/Cli.java | 23 +- .../src/main/java/cz/jzitnik/client/Game.java | 49 ++ .../main/java/cz/jzitnik/client}/Main.java | 2 +- .../jzitnik/client}/annotations/Config.java | 2 +- .../client}/annotations/Dependency.java | 2 +- .../client}/annotations/EventHandler.java | 4 +- .../jzitnik/client}/annotations/PostInit.java | 2 +- .../client}/annotations/ScheduledTask.java | 2 +- .../annotations/SocketEventHandler.java | 14 + .../cz/jzitnik/client}/annotations/State.java | 2 +- .../client}/annotations/ThreadRegistry.java | 2 +- .../annotations/injectors/InjectConfig.java | 2 +- .../injectors/InjectDependency.java | 2 +- .../annotations/injectors/InjectState.java | 2 +- .../annotations/ui/KeyboardPressHandler.java | 2 +- .../annotations/ui/KeyboardPressHandlers.java | 2 +- .../client}/annotations/ui/MouseHandler.java | 2 +- .../annotations/ui/MouseHandlerType.java | 2 +- .../client}/annotations/ui/Render.java | 2 +- .../cz/jzitnik/client}/annotations/ui/UI.java | 2 +- .../cz/jzitnik/client}/config/CoreLogic.java | 5 +- .../cz/jzitnik/client}/config/Debugging.java | 4 +- .../client}/config/MicrophoneConfig.java | 4 +- .../jzitnik/client}/config/PlayerConfig.java | 6 +- .../client}/config/ThreadPoolConfig.java | 5 +- .../client/events/DroppedItemRerender.java | 7 + .../cz/jzitnik/client}/events/ExitEvent.java | 4 +- .../client/events/FullRedrawEvent.java | 6 + .../jzitnik/client}/events/FullRoomDraw.java | 5 +- .../client/events/InventoryRerender.java | 6 + .../client}/events/KeyboardPressEvent.java | 4 +- .../jzitnik/client}/events/MouseAction.java | 4 +- .../client}/events/MouseMoveEvent.java | 4 +- .../client}/events/PlayerMoveEvent.java | 4 +- .../cz/jzitnik/client/events/RenderStats.java | 6 + .../jzitnik/client}/events/RerenderPart.java | 4 +- .../client}/events/RerenderScreen.java | 6 +- .../client/events/RoomChangeEvent.java | 7 + .../client/events/SendSocketMessageEvent.java | 7 + .../client}/events/TerminalResizeEvent.java | 4 +- .../client/events/TerminalTooSmallEvent.java | 6 + .../client}/events/handlers/CliHandler.java | 26 +- .../events/handlers/DialogEventHandler.java | 36 +- .../handlers/DroppedItemRerenderHandler.java | 16 +- .../events/handlers/ExitEventHandler.java | 20 +- .../handlers/FullRedrawEventHandler.java | 18 +- .../events/handlers/FullRoomDrawHandler.java | 44 +- .../handlers/InventoryRerenderHandler.java | 16 +- .../handlers/KeyboardPressEventHandler.java | 16 +- .../handlers/MouseActionEventHandler.java | 30 +- .../handlers/MouseMoveEventHandler.java | 46 +- .../handlers/PlayerMoveEventHandler.java | 65 ++- .../events/handlers/RenderStatsHandler.java | 16 +- .../events/handlers/RerenderPartHandler.java | 38 +- .../handlers/RoomChangeEventHandler.java | 33 +- .../SendSocketMessageEventHandler.java | 24 + .../handlers/TerminalResizeEventHandler.java | 26 +- .../TerminalTooSmallEventHandler.java | 12 +- .../cz/jzitnik/client}/game/Constants.java | 2 +- .../cz/jzitnik/client/game/GamePlayer.java | 10 + .../cz/jzitnik/client}/game/GameRoom.java | 17 +- .../cz/jzitnik/client/game/GameState.java | 54 ++ .../cz/jzitnik/client/game/OtherPlayer.java | 41 ++ .../java/cz/jzitnik/client}/game/Player.java | 44 +- .../jzitnik/client}/game/ResourceManager.java | 6 +- .../jzitnik/client}/game/dialog/Dialog.java | 4 +- .../cz/jzitnik/client}/game/dialog/OnEnd.java | 2 +- .../InvalidCoordinatesException.java | 2 +- .../jzitnik/client}/game/items/GameItem.java | 11 +- .../game/items/types/InteractableItem.java | 6 +- .../client}/game/items/types/ItemType.java | 6 +- .../client}/game/items/types/food/Food.java | 16 +- .../types/interfaces/WeaponInterface.java | 2 +- .../game/items/types/weapons/Sword.java | 2 +- .../game/items/types/weapons/Weapon.java | 6 +- .../jzitnik/client}/game/mobs/DialogMob.java | 20 +- .../client}/game/mobs/HittableMob.java | 24 +- .../client}/game/mobs/HittableMobDrops.java | 27 +- .../client}/game/mobs/HittableMobNoDrops.java | 12 +- .../cz/jzitnik/client}/game/mobs/Mob.java | 20 +- .../tasks/BlindMobFollowingPlayerTask.java | 28 +- .../mobs/tasks/EnemyPlayerAttackingTask.java | 18 +- .../mobs/tasks/MobFollowingPlayerTask.java | 42 +- .../client}/game/mobs/tasks/MobRoomTask.java | 6 +- .../game/mobs/tasks/utils/AStarAlg.java | 14 +- .../jzitnik/client}/game/objects/Chest.java | 80 +-- .../client}/game/objects/DroppedItem.java | 24 +- .../client}/game/objects/GameObject.java | 8 +- .../client}/game/objects/Interactable.java | 2 +- .../client}/game/objects/UIClickHandler.java | 4 +- .../jzitnik/client}/game/setup/GameSetup.java | 29 +- .../game/setup/scenes/GameMenuScene.java | 26 +- .../client}/game/setup/scenes/IntroScene.java | 10 +- .../setup/scenes/connect/ServerChoose.java | 483 ++++++++++++++++++ .../client}/game/utils/Renderable.java | 2 +- .../client}/game/utils/Selectable.java | 5 +- .../cz/jzitnik/client}/screens/Screen.java | 6 +- .../client}/screens/VideoPlayScreen.java | 10 +- .../screens/scenes/BasicImageScene.java | 16 +- .../screens/scenes/BasicVideoScene.java | 8 +- .../jzitnik/client}/screens/scenes/Scene.java | 20 +- .../screens/scenes/VideoSceneWithAudio.java | 10 +- .../socket/AbstractSocketEventHandler.java | 7 + .../java/cz/jzitnik/client/socket/Client.java | 50 ++ .../client/socket/SocketEventManager.java | 94 ++++ .../socket/events/ConnectGameHandler.java | 38 ++ .../socket/events/CreateGameHandler.java | 32 ++ .../events/ItemTookFromChestHandler.java | 43 ++ .../events/MovePlayerRoomResponseHandler.java | 38 ++ .../events/PlayerArrivalChangeHandler.java | 87 ++++ .../events/PlayerDisconnectedHandler.java | 18 + .../socket/events/PlayerJoinedHandler.java | 22 + .../events/PlayerMovedInUrRoomHandler.java | 94 ++++ .../client/socket/events/TestHandler.java | 15 + .../cz/jzitnik/client}/sound/SoundPlayer.java | 2 +- .../jzitnik/client}/states/DialogState.java | 6 +- .../client}/states/MicrophoneState.java | 4 +- .../jzitnik/client/states/PlayerConfig.java | 8 + .../client}/states/PlayerMovementState.java | 4 +- .../jzitnik/client}/states/RenderState.java | 4 +- .../jzitnik/client}/states/RunningState.java | 4 +- .../jzitnik/client}/states/ScreenBuffer.java | 8 +- .../jzitnik/client}/states/TerminalState.java | 4 +- .../client}/tasks/StaminaIncreaseTask.java | 26 +- .../client}/threads/MicrophoneThread.java | 10 +- .../java/cz/jzitnik/client}/ui/DialogUI.java | 38 +- .../jzitnik/client}/ui/GlobalShortcuts.java | 25 +- .../java/cz/jzitnik/client}/ui/Inventory.java | 67 +-- .../java/cz/jzitnik/client}/ui/Stats.java | 28 +- .../jzitnik/client}/ui/pixels/AlphaPixel.java | 6 +- .../client}/ui/pixels/ColoredPixel.java | 2 +- .../cz/jzitnik/client}/ui/pixels/Empty.java | 2 +- .../cz/jzitnik/client}/ui/pixels/Pixel.java | 2 +- .../cz/jzitnik/client/ui/utils/Button.java | 50 ++ .../cz/jzitnik/client}/ui/utils/Grid.java | 6 +- .../cz/jzitnik/client/ui/utils/Input.java | 55 ++ .../client}/utils/DependencyManager.java | 14 +- .../utils/GlobalIOHandlerRepository.java | 18 +- .../jzitnik/client}/utils/RerenderUtils.java | 65 ++- .../utils/ScheduledSerializedTaskManager.java | 6 +- .../client}/utils/ScheduledTaskManager.java | 10 +- .../client}/utils/ShutdownableThread.java | 2 +- .../jzitnik/client}/utils/StateManager.java | 6 +- .../jzitnik/client}/utils/TextRenderer.java | 57 ++- .../jzitnik/client}/utils/ThreadManager.java | 6 +- .../utils/UIRoomClickHandlerRepository.java | 18 +- .../utils/events/AbstractEventHandler.java | 5 + .../cz/jzitnik/client/utils/events/Event.java | 4 + .../client}/utils/events/EventManager.java | 20 +- .../client}/utils/roomtasks/RoomTask.java | 2 +- .../utils/roomtasks/RoomTaskScheduler.java | 18 +- {src => game/src}/main/resources/audio.ogg | Bin .../src}/main/resources/audio/menu.ogg | Bin .../main/resources/config/core_logic.yaml | 0 .../src}/main/resources/config/debugging.yaml | 0 .../main/resources/config/microphone.yaml | 0 .../src}/main/resources/config/player.yaml | 0 .../src}/main/resources/config/threads.yaml | 0 .../src}/main/resources/fonts/default.ttf | Bin {src => game/src}/main/resources/logback.xml | 0 {src => game/src}/main/resources/menu.png | Bin .../src}/main/resources/setup/rooms.yaml | 82 +-- .../src}/main/resources/textures/chest.png | Bin .../main/resources/textures/food/apple.png | Bin .../main/resources/textures/player/back.png | Bin .../main/resources/textures/player/front.png | Bin .../main/resources/textures/player/left.png | Bin .../main/resources/textures/player/right.png | Bin .../src}/main/resources/textures/rooms/1.png | Bin .../src}/main/resources/textures/rooms/2.png | Bin .../src}/main/resources/textures/rooms/3.png | Bin .../src}/main/resources/textures/rooms/4.png | Bin .../main/resources/textures/rooms/doors.png | Bin .../main/resources/textures/rooms/frozen.png | Bin .../resources/textures/tools/wooden_sword.png | Bin .../src}/main/resources/textures/ui/heart.png | Bin .../main/resources/textures/ui/stamina.png | Bin {src => game/src}/main/resources/video.mp4 | Bin pom.xml | 180 +------ server/.gitignore | 39 ++ server/.idea/.gitignore | 3 + server/.idea/encodings.xml | 7 + server/.idea/misc.xml | 14 + server/.idea/vcs.xml | 6 + server/pom.xml | 110 ++++ .../src/main/java/cz/jzitnik/server/Main.java | 28 + .../server/annotations/EventHandler.java | 14 + .../cz/jzitnik/server/context/AppContext.java | 13 + .../jzitnik/server/context/GameManager.java | 4 + .../jzitnik/server/context/GlobalContext.java | 54 ++ .../server/events/AbstractEventHandler.java | 12 + .../jzitnik/server/events/EventManager.java | 77 +++ .../handlers/ConnectToAGameHandler.java | 57 +++ .../events/handlers/CreateGameHandler.java | 51 ++ .../handlers/ItemTookFromChestHandler.java | 23 + .../handlers/MovePlayerRoomHandler.java | 50 ++ .../events/handlers/PlayerMoveHandler.java | 27 + .../java/cz/jzitnik/server/game/Client.java | 25 + .../java/cz/jzitnik/server/game/Game.java | 16 + .../java/cz/jzitnik/server/game/Player.java | 27 + .../socket/GlobalContextConfigurator.java | 14 + .../jzitnik/server/socket/SocketSession.java | 28 + .../cz/jzitnik/server/socket/WebSocket.java | 66 +++ .../server/utils/PasswordGenerator.java | 23 + server/src/main/resources/config.properties | 1 + .../src}/main/resources/setup/player.yaml | 0 src/main/java/cz/jzitnik/Game.java | 37 -- .../jzitnik/events/DroppedItemRerender.java | 7 - .../cz/jzitnik/events/FullRedrawEvent.java | 6 - .../cz/jzitnik/events/InventoryRerender.java | 6 - .../java/cz/jzitnik/events/RenderStats.java | 6 - .../cz/jzitnik/events/RoomChangeEvent.java | 7 - .../jzitnik/events/TerminalTooSmallEvent.java | 6 - src/main/java/cz/jzitnik/game/GameState.java | 37 -- .../java/cz/jzitnik/states/PlayerConfig.java | 8 - .../utils/events/AbstractEventHandler.java | 5 - .../java/cz/jzitnik/utils/events/Event.java | 4 - 254 files changed, 3776 insertions(+), 1197 deletions(-) create mode 100644 .idea/FuzzierSettings.xml create mode 100644 .idea/compiler.xml create mode 100644 .idea/jarRepositories.xml create mode 100644 common/.gitignore create mode 100644 common/.idea/.gitignore create mode 100644 common/.idea/encodings.xml create mode 100644 common/.idea/misc.xml create mode 100644 common/.idea/vcs.xml create mode 100644 common/pom.xml create mode 100644 common/src/main/java/cz/jzitnik/common/Config.java rename {src/main/java/cz/jzitnik/game/utils => common/src/main/java/cz/jzitnik/common/models/coordinates}/RoomCords.java (79%) rename src/main/java/cz/jzitnik/game/GameRoomPart.java => common/src/main/java/cz/jzitnik/common/models/coordinates/RoomPart.java (82%) create mode 100644 common/src/main/java/cz/jzitnik/common/models/player/PlayerCreation.java create mode 100644 common/src/main/java/cz/jzitnik/common/socket/SocketMessage.java create mode 100644 common/src/main/java/cz/jzitnik/common/socket/messages/Test.java create mode 100644 common/src/main/java/cz/jzitnik/common/socket/messages/game/connection/ConnectToAGame.java create mode 100644 common/src/main/java/cz/jzitnik/common/socket/messages/game/connection/ConnectToAGameResponse.java create mode 100644 common/src/main/java/cz/jzitnik/common/socket/messages/game/creation/CreateGame.java create mode 100644 common/src/main/java/cz/jzitnik/common/socket/messages/game/creation/CreateGameResponse.java create mode 100644 common/src/main/java/cz/jzitnik/common/socket/messages/items/ItemTookFromChest.java create mode 100644 common/src/main/java/cz/jzitnik/common/socket/messages/player/PlayerArrivalChange.java create mode 100644 common/src/main/java/cz/jzitnik/common/socket/messages/player/PlayerDisconnected.java create mode 100644 common/src/main/java/cz/jzitnik/common/socket/messages/player/PlayerJoined.java create mode 100644 common/src/main/java/cz/jzitnik/common/socket/messages/player/PlayerMove.java create mode 100644 common/src/main/java/cz/jzitnik/common/socket/messages/player/PlayerMovedInUrRoom.java create mode 100644 common/src/main/java/cz/jzitnik/common/socket/messages/player/PlayerRotation.java create mode 100644 common/src/main/java/cz/jzitnik/common/socket/messages/room/MovePlayerRoom.java create mode 100644 common/src/main/java/cz/jzitnik/common/socket/messages/room/MovePlayerRoomResponse.java create mode 100644 game/.gitignore create mode 100644 game/.idea/.gitignore create mode 100644 game/.idea/encodings.xml create mode 100644 game/.idea/misc.xml create mode 100644 game/.idea/vcs.xml create mode 100644 game/pom.xml rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/Cli.java (78%) create mode 100644 game/src/main/java/cz/jzitnik/client/Game.java rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/Main.java (87%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/annotations/Config.java (87%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/annotations/Dependency.java (89%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/annotations/EventHandler.java (77%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/annotations/PostInit.java (86%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/annotations/ScheduledTask.java (89%) create mode 100644 game/src/main/java/cz/jzitnik/client/annotations/SocketEventHandler.java rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/annotations/State.java (86%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/annotations/ThreadRegistry.java (87%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/annotations/injectors/InjectConfig.java (84%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/annotations/injectors/InjectDependency.java (84%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/annotations/injectors/InjectState.java (84%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/annotations/ui/KeyboardPressHandler.java (88%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/annotations/ui/KeyboardPressHandlers.java (87%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/annotations/ui/MouseHandler.java (87%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/annotations/ui/MouseHandlerType.java (60%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/annotations/ui/Render.java (85%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/annotations/ui/UI.java (85%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/config/CoreLogic.java (81%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/config/Debugging.java (89%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/config/MicrophoneConfig.java (82%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/config/PlayerConfig.java (90%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/config/ThreadPoolConfig.java (85%) create mode 100644 game/src/main/java/cz/jzitnik/client/events/DroppedItemRerender.java rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/events/ExitEvent.java (52%) create mode 100644 game/src/main/java/cz/jzitnik/client/events/FullRedrawEvent.java rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/events/FullRoomDraw.java (73%) create mode 100644 game/src/main/java/cz/jzitnik/client/events/InventoryRerender.java rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/events/KeyboardPressEvent.java (73%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/events/MouseAction.java (86%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/events/MouseMoveEvent.java (68%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/events/PlayerMoveEvent.java (73%) create mode 100644 game/src/main/java/cz/jzitnik/client/events/RenderStats.java rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/events/RerenderPart.java (75%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/events/RerenderScreen.java (93%) create mode 100644 game/src/main/java/cz/jzitnik/client/events/RoomChangeEvent.java create mode 100644 game/src/main/java/cz/jzitnik/client/events/SendSocketMessageEvent.java rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/events/TerminalResizeEvent.java (73%) create mode 100644 game/src/main/java/cz/jzitnik/client/events/TerminalTooSmallEvent.java rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/events/handlers/CliHandler.java (85%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/events/handlers/DialogEventHandler.java (90%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/events/handlers/DroppedItemRerenderHandler.java (63%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/events/handlers/ExitEventHandler.java (55%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/events/handlers/FullRedrawEventHandler.java (57%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/events/handlers/FullRoomDrawHandler.java (74%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/events/handlers/InventoryRerenderHandler.java (64%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/events/handlers/KeyboardPressEventHandler.java (55%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/events/handlers/MouseActionEventHandler.java (73%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/events/handlers/MouseMoveEventHandler.java (85%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/events/handlers/PlayerMoveEventHandler.java (76%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/events/handlers/RenderStatsHandler.java (60%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/events/handlers/RerenderPartHandler.java (64%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/events/handlers/RoomChangeEventHandler.java (60%) create mode 100644 game/src/main/java/cz/jzitnik/client/events/handlers/SendSocketMessageEventHandler.java rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/events/handlers/TerminalResizeEventHandler.java (69%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/events/handlers/TerminalTooSmallEventHandler.java (85%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/game/Constants.java (82%) create mode 100644 game/src/main/java/cz/jzitnik/client/game/GamePlayer.java rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/game/GameRoom.java (82%) create mode 100644 game/src/main/java/cz/jzitnik/client/game/GameState.java create mode 100644 game/src/main/java/cz/jzitnik/client/game/OtherPlayer.java rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/game/Player.java (81%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/game/ResourceManager.java (93%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/game/dialog/Dialog.java (79%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/game/dialog/OnEnd.java (88%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/game/exceptions/InvalidCoordinatesException.java (83%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/game/items/GameItem.java (71%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/game/items/types/InteractableItem.java (59%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/game/items/types/ItemType.java (72%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/game/items/types/food/Food.java (69%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/game/items/types/interfaces/WeaponInterface.java (53%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/game/items/types/weapons/Sword.java (84%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/game/items/types/weapons/Weapon.java (66%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/game/mobs/DialogMob.java (54%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/game/mobs/HittableMob.java (84%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/game/mobs/HittableMobDrops.java (79%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/game/mobs/HittableMobNoDrops.java (69%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/game/mobs/Mob.java (75%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/game/mobs/tasks/BlindMobFollowingPlayerTask.java (73%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/game/mobs/tasks/EnemyPlayerAttackingTask.java (79%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/game/mobs/tasks/MobFollowingPlayerTask.java (77%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/game/mobs/tasks/MobRoomTask.java (84%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/game/mobs/tasks/utils/AStarAlg.java (89%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/game/objects/Chest.java (82%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/game/objects/DroppedItem.java (62%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/game/objects/GameObject.java (80%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/game/objects/Interactable.java (58%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/game/objects/UIClickHandler.java (76%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/game/setup/GameSetup.java (54%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/game/setup/scenes/GameMenuScene.java (75%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/game/setup/scenes/IntroScene.java (61%) create mode 100644 game/src/main/java/cz/jzitnik/client/game/setup/scenes/connect/ServerChoose.java rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/game/utils/Renderable.java (73%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/game/utils/Selectable.java (66%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/screens/Screen.java (61%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/screens/VideoPlayScreen.java (95%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/screens/scenes/BasicImageScene.java (87%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/screens/scenes/BasicVideoScene.java (61%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/screens/scenes/Scene.java (84%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/screens/scenes/VideoSceneWithAudio.java (78%) create mode 100644 game/src/main/java/cz/jzitnik/client/socket/AbstractSocketEventHandler.java create mode 100644 game/src/main/java/cz/jzitnik/client/socket/Client.java create mode 100644 game/src/main/java/cz/jzitnik/client/socket/SocketEventManager.java create mode 100644 game/src/main/java/cz/jzitnik/client/socket/events/ConnectGameHandler.java create mode 100644 game/src/main/java/cz/jzitnik/client/socket/events/CreateGameHandler.java create mode 100644 game/src/main/java/cz/jzitnik/client/socket/events/ItemTookFromChestHandler.java create mode 100644 game/src/main/java/cz/jzitnik/client/socket/events/MovePlayerRoomResponseHandler.java create mode 100644 game/src/main/java/cz/jzitnik/client/socket/events/PlayerArrivalChangeHandler.java create mode 100644 game/src/main/java/cz/jzitnik/client/socket/events/PlayerDisconnectedHandler.java create mode 100644 game/src/main/java/cz/jzitnik/client/socket/events/PlayerJoinedHandler.java create mode 100644 game/src/main/java/cz/jzitnik/client/socket/events/PlayerMovedInUrRoomHandler.java create mode 100644 game/src/main/java/cz/jzitnik/client/socket/events/TestHandler.java rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/sound/SoundPlayer.java (99%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/states/DialogState.java (60%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/states/MicrophoneState.java (65%) create mode 100644 game/src/main/java/cz/jzitnik/client/states/PlayerConfig.java rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/states/PlayerMovementState.java (70%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/states/RenderState.java (70%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/states/RunningState.java (56%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/states/ScreenBuffer.java (53%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/states/TerminalState.java (76%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/tasks/StaminaIncreaseTask.java (76%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/threads/MicrophoneThread.java (88%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/ui/DialogUI.java (86%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/ui/GlobalShortcuts.java (59%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/ui/Inventory.java (89%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/ui/Stats.java (84%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/ui/pixels/AlphaPixel.java (73%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/ui/pixels/ColoredPixel.java (87%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/ui/pixels/Empty.java (73%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/ui/pixels/Pixel.java (85%) create mode 100644 game/src/main/java/cz/jzitnik/client/ui/utils/Button.java rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/ui/utils/Grid.java (98%) create mode 100644 game/src/main/java/cz/jzitnik/client/ui/utils/Input.java rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/utils/DependencyManager.java (95%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/utils/GlobalIOHandlerRepository.java (92%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/utils/RerenderUtils.java (78%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/utils/ScheduledSerializedTaskManager.java (96%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/utils/ScheduledTaskManager.java (91%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/utils/ShutdownableThread.java (79%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/utils/StateManager.java (93%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/utils/TextRenderer.java (79%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/utils/ThreadManager.java (90%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/utils/UIRoomClickHandlerRepository.java (90%) create mode 100644 game/src/main/java/cz/jzitnik/client/utils/events/AbstractEventHandler.java create mode 100644 game/src/main/java/cz/jzitnik/client/utils/events/Event.java rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/utils/events/EventManager.java (86%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/utils/roomtasks/RoomTask.java (89%) rename {src/main/java/cz/jzitnik => game/src/main/java/cz/jzitnik/client}/utils/roomtasks/RoomTaskScheduler.java (84%) rename {src => game/src}/main/resources/audio.ogg (100%) rename {src => game/src}/main/resources/audio/menu.ogg (100%) rename {src => game/src}/main/resources/config/core_logic.yaml (100%) rename {src => game/src}/main/resources/config/debugging.yaml (100%) rename {src => game/src}/main/resources/config/microphone.yaml (100%) rename {src => game/src}/main/resources/config/player.yaml (100%) rename {src => game/src}/main/resources/config/threads.yaml (100%) rename {src => game/src}/main/resources/fonts/default.ttf (100%) rename {src => game/src}/main/resources/logback.xml (100%) rename {src => game/src}/main/resources/menu.png (100%) rename {src => game/src}/main/resources/setup/rooms.yaml (76%) rename {src => game/src}/main/resources/textures/chest.png (100%) rename {src => game/src}/main/resources/textures/food/apple.png (100%) rename {src => game/src}/main/resources/textures/player/back.png (100%) rename {src => game/src}/main/resources/textures/player/front.png (100%) rename {src => game/src}/main/resources/textures/player/left.png (100%) rename {src => game/src}/main/resources/textures/player/right.png (100%) rename {src => game/src}/main/resources/textures/rooms/1.png (100%) rename {src => game/src}/main/resources/textures/rooms/2.png (100%) rename {src => game/src}/main/resources/textures/rooms/3.png (100%) rename {src => game/src}/main/resources/textures/rooms/4.png (100%) rename {src => game/src}/main/resources/textures/rooms/doors.png (100%) rename {src => game/src}/main/resources/textures/rooms/frozen.png (100%) rename {src => game/src}/main/resources/textures/tools/wooden_sword.png (100%) rename {src => game/src}/main/resources/textures/ui/heart.png (100%) rename {src => game/src}/main/resources/textures/ui/stamina.png (100%) rename {src => game/src}/main/resources/video.mp4 (100%) create mode 100644 server/.gitignore create mode 100644 server/.idea/.gitignore create mode 100644 server/.idea/encodings.xml create mode 100644 server/.idea/misc.xml create mode 100644 server/.idea/vcs.xml create mode 100644 server/pom.xml create mode 100644 server/src/main/java/cz/jzitnik/server/Main.java create mode 100644 server/src/main/java/cz/jzitnik/server/annotations/EventHandler.java create mode 100644 server/src/main/java/cz/jzitnik/server/context/AppContext.java create mode 100644 server/src/main/java/cz/jzitnik/server/context/GameManager.java create mode 100644 server/src/main/java/cz/jzitnik/server/context/GlobalContext.java create mode 100644 server/src/main/java/cz/jzitnik/server/events/AbstractEventHandler.java create mode 100644 server/src/main/java/cz/jzitnik/server/events/EventManager.java create mode 100644 server/src/main/java/cz/jzitnik/server/events/handlers/ConnectToAGameHandler.java create mode 100644 server/src/main/java/cz/jzitnik/server/events/handlers/CreateGameHandler.java create mode 100644 server/src/main/java/cz/jzitnik/server/events/handlers/ItemTookFromChestHandler.java create mode 100644 server/src/main/java/cz/jzitnik/server/events/handlers/MovePlayerRoomHandler.java create mode 100644 server/src/main/java/cz/jzitnik/server/events/handlers/PlayerMoveHandler.java create mode 100644 server/src/main/java/cz/jzitnik/server/game/Client.java create mode 100644 server/src/main/java/cz/jzitnik/server/game/Game.java create mode 100644 server/src/main/java/cz/jzitnik/server/game/Player.java create mode 100644 server/src/main/java/cz/jzitnik/server/socket/GlobalContextConfigurator.java create mode 100644 server/src/main/java/cz/jzitnik/server/socket/SocketSession.java create mode 100644 server/src/main/java/cz/jzitnik/server/socket/WebSocket.java create mode 100644 server/src/main/java/cz/jzitnik/server/utils/PasswordGenerator.java create mode 100644 server/src/main/resources/config.properties rename {src => server/src}/main/resources/setup/player.yaml (100%) delete mode 100644 src/main/java/cz/jzitnik/Game.java delete mode 100644 src/main/java/cz/jzitnik/events/DroppedItemRerender.java delete mode 100644 src/main/java/cz/jzitnik/events/FullRedrawEvent.java delete mode 100644 src/main/java/cz/jzitnik/events/InventoryRerender.java delete mode 100644 src/main/java/cz/jzitnik/events/RenderStats.java delete mode 100644 src/main/java/cz/jzitnik/events/RoomChangeEvent.java delete mode 100644 src/main/java/cz/jzitnik/events/TerminalTooSmallEvent.java delete mode 100644 src/main/java/cz/jzitnik/game/GameState.java delete mode 100644 src/main/java/cz/jzitnik/states/PlayerConfig.java delete mode 100644 src/main/java/cz/jzitnik/utils/events/AbstractEventHandler.java delete mode 100644 src/main/java/cz/jzitnik/utils/events/Event.java diff --git a/.gitignore b/.gitignore index 5211a0b..98d8a5a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,42 +1 @@ -target/ -!.mvn/wrapper/maven-wrapper.jar -!**/src/main/**/target/ -!**/src/test/**/target/ -.kotlin - -### IntelliJ IDEA ### -.idea/modules.xml -.idea/jarRepositories.xml -.idea/compiler.xml -.idea/libraries/ -.idea/FuzzierSettings.xml -*.iws -*.iml -*.ipr - -### Eclipse ### -.apt_generated -.classpath -.factorypath -.project -.settings -.springBeans -.sts4-cache - -### NetBeans ### -/nbproject/private/ -/nbbuild/ -/dist/ -/nbdist/ -/.nb-gradle/ -build/ -!**/src/main/**/build/ -!**/src/test/**/build/ - -### VS Code ### -.vscode/ - -### Mac OS ### -.DS_Store - logs diff --git a/.idea/FuzzierSettings.xml b/.idea/FuzzierSettings.xml new file mode 100644 index 0000000..ff7c62c --- /dev/null +++ b/.idea/FuzzierSettings.xml @@ -0,0 +1,14 @@ + + + + + + \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..9abc593 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml index aa00ffa..fd66ed6 100644 --- a/.idea/encodings.xml +++ b/.idea/encodings.xml @@ -1,6 +1,12 @@ + + + + + + diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000..09fe16c --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index 3202223..86993b2 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,17 +1,5 @@ - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/common/.gitignore b/common/.gitignore new file mode 100644 index 0000000..480bdf5 --- /dev/null +++ b/common/.gitignore @@ -0,0 +1,39 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ +.kotlin + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/common/.idea/.gitignore b/common/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/common/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/common/.idea/encodings.xml b/common/.idea/encodings.xml new file mode 100644 index 0000000..aa00ffa --- /dev/null +++ b/common/.idea/encodings.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/common/.idea/misc.xml b/common/.idea/misc.xml new file mode 100644 index 0000000..4878ef2 --- /dev/null +++ b/common/.idea/misc.xml @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git a/common/.idea/vcs.xml b/common/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/common/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/common/pom.xml b/common/pom.xml new file mode 100644 index 0000000..66edc42 --- /dev/null +++ b/common/pom.xml @@ -0,0 +1,63 @@ + + + 4.0.0 + + + cz.jzitnik + game-parent + 1.0-SNAPSHOT + + + common + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.11.0 + + + + org.projectlombok + lombok + 1.18.42 + + + 25 + 25 + + + + + + + + tools.jackson.core + jackson-databind + 3.0.4 + + + + tools.jackson.dataformat + jackson-dataformat-yaml + 3.0.4 + + + + org.projectlombok + lombok + 1.18.42 + provided + + + + org.slf4j + slf4j-api + 2.0.17 + + + + diff --git a/common/src/main/java/cz/jzitnik/common/Config.java b/common/src/main/java/cz/jzitnik/common/Config.java new file mode 100644 index 0000000..de224e3 --- /dev/null +++ b/common/src/main/java/cz/jzitnik/common/Config.java @@ -0,0 +1,5 @@ +package cz.jzitnik.common; + +public class Config { + public static final int WORLD_PASSWORD_LENGTH = 5; +} diff --git a/src/main/java/cz/jzitnik/game/utils/RoomCords.java b/common/src/main/java/cz/jzitnik/common/models/coordinates/RoomCords.java similarity index 79% rename from src/main/java/cz/jzitnik/game/utils/RoomCords.java rename to common/src/main/java/cz/jzitnik/common/models/coordinates/RoomCords.java index 4d42f2a..4534fb4 100644 --- a/src/main/java/cz/jzitnik/game/utils/RoomCords.java +++ b/common/src/main/java/cz/jzitnik/common/models/coordinates/RoomCords.java @@ -1,18 +1,18 @@ -package cz.jzitnik.game.utils; +package cz.jzitnik.common.models.coordinates; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; -import cz.jzitnik.game.GameRoomPart; import lombok.Getter; import lombok.ToString; import lombok.extern.slf4j.Slf4j; +import java.io.Serializable; import java.util.List; @Slf4j @ToString @Getter -public class RoomCords implements Cloneable { +public class RoomCords implements Cloneable, Serializable { private int x; private int y; @@ -29,8 +29,12 @@ public class RoomCords implements Cloneable { this.y = y; } - public void updateCordsWithColliders(List colliders, int x, int y, GameRoomPart playerCollider) { - var normalizedPlayerCollider = new GameRoomPart( + public void updateCords(RoomCords roomCords) { + updateCords(roomCords.getX(), roomCords.getY()); + } + + public void updateCordsWithColliders(List colliders, int x, int y, RoomPart playerCollider) { + var normalizedPlayerCollider = new RoomPart( new RoomCords(playerCollider.getStart().getX() + x, playerCollider.getStart().getY() + y), new RoomCords(playerCollider.getEnd().getX() + x, playerCollider.getEnd().getY() + y) ); diff --git a/src/main/java/cz/jzitnik/game/GameRoomPart.java b/common/src/main/java/cz/jzitnik/common/models/coordinates/RoomPart.java similarity index 82% rename from src/main/java/cz/jzitnik/game/GameRoomPart.java rename to common/src/main/java/cz/jzitnik/common/models/coordinates/RoomPart.java index aba0ac8..3de05c6 100644 --- a/src/main/java/cz/jzitnik/game/GameRoomPart.java +++ b/common/src/main/java/cz/jzitnik/common/models/coordinates/RoomPart.java @@ -1,20 +1,20 @@ -package cz.jzitnik.game; +package cz.jzitnik.common.models.coordinates; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; -import cz.jzitnik.game.utils.RoomCords; -import lombok.AllArgsConstructor; import lombok.Data; import lombok.ToString; +import java.io.Serializable; + @Data @ToString -public class GameRoomPart { +public class RoomPart implements Serializable { private RoomCords start; private RoomCords end; @JsonCreator - public GameRoomPart( + public RoomPart( @JsonProperty("start") RoomCords start, @JsonProperty("end") RoomCords end ) { @@ -32,7 +32,7 @@ public class GameRoomPart { /** * Checks if this GameRoomPart overlaps with another. */ - public boolean isOverlapping(GameRoomPart other) { + public boolean isOverlapping(RoomPart other) { return start.getX() <= other.getEnd().getX() && end.getX() >= other.getStart().getX() && start.getY() <= other.getEnd().getY() && diff --git a/common/src/main/java/cz/jzitnik/common/models/player/PlayerCreation.java b/common/src/main/java/cz/jzitnik/common/models/player/PlayerCreation.java new file mode 100644 index 0000000..a8587ac --- /dev/null +++ b/common/src/main/java/cz/jzitnik/common/models/player/PlayerCreation.java @@ -0,0 +1,27 @@ +package cz.jzitnik.common.models.player; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; +import cz.jzitnik.common.models.coordinates.RoomCords; +import cz.jzitnik.common.models.coordinates.RoomPart; +import lombok.Getter; +import lombok.Setter; + +import java.io.Serializable; + +@Getter +public final class PlayerCreation implements Serializable { + @Setter + private int id; + private final RoomCords playerCords; + private final RoomPart collider; + + @JsonCreator + public PlayerCreation( + @JsonProperty("playerCords") RoomCords playerCords, + @JsonProperty("collider") RoomPart collider + ) { + this.playerCords = playerCords; + this.collider = collider; + } +} diff --git a/common/src/main/java/cz/jzitnik/common/socket/SocketMessage.java b/common/src/main/java/cz/jzitnik/common/socket/SocketMessage.java new file mode 100644 index 0000000..3134c92 --- /dev/null +++ b/common/src/main/java/cz/jzitnik/common/socket/SocketMessage.java @@ -0,0 +1,6 @@ +package cz.jzitnik.common.socket; + +import java.io.Serializable; + +public interface SocketMessage extends Serializable { +} diff --git a/common/src/main/java/cz/jzitnik/common/socket/messages/Test.java b/common/src/main/java/cz/jzitnik/common/socket/messages/Test.java new file mode 100644 index 0000000..00d3703 --- /dev/null +++ b/common/src/main/java/cz/jzitnik/common/socket/messages/Test.java @@ -0,0 +1,6 @@ +package cz.jzitnik.common.socket.messages; + +import cz.jzitnik.common.socket.SocketMessage; + +public class Test implements SocketMessage { +} diff --git a/common/src/main/java/cz/jzitnik/common/socket/messages/game/connection/ConnectToAGame.java b/common/src/main/java/cz/jzitnik/common/socket/messages/game/connection/ConnectToAGame.java new file mode 100644 index 0000000..72fc1a2 --- /dev/null +++ b/common/src/main/java/cz/jzitnik/common/socket/messages/game/connection/ConnectToAGame.java @@ -0,0 +1,6 @@ +package cz.jzitnik.common.socket.messages.game.connection; + +import cz.jzitnik.common.socket.SocketMessage; + +public record ConnectToAGame(String gamePass) implements SocketMessage { +} diff --git a/common/src/main/java/cz/jzitnik/common/socket/messages/game/connection/ConnectToAGameResponse.java b/common/src/main/java/cz/jzitnik/common/socket/messages/game/connection/ConnectToAGameResponse.java new file mode 100644 index 0000000..da7d74a --- /dev/null +++ b/common/src/main/java/cz/jzitnik/common/socket/messages/game/connection/ConnectToAGameResponse.java @@ -0,0 +1,25 @@ +package cz.jzitnik.common.socket.messages.game.connection; + +import cz.jzitnik.common.models.player.PlayerCreation; +import cz.jzitnik.common.socket.SocketMessage; + +import java.util.List; + +public record ConnectToAGameResponse(ResponseType responseType, PlayerCreation playerCreation, List existingPlayers) implements SocketMessage { + private enum ResponseType { + GAME_DOES_NOT_EXIST, + SUCCESS + } + + public ConnectToAGameResponse() { + this(ResponseType.GAME_DOES_NOT_EXIST, null, null); + } + + public ConnectToAGameResponse(PlayerCreation playerCreation, List existingPlayers) { + this(ResponseType.SUCCESS, playerCreation, existingPlayers); + } + + public boolean success() { + return responseType == ResponseType.SUCCESS; + } +} diff --git a/common/src/main/java/cz/jzitnik/common/socket/messages/game/creation/CreateGame.java b/common/src/main/java/cz/jzitnik/common/socket/messages/game/creation/CreateGame.java new file mode 100644 index 0000000..ad4a593 --- /dev/null +++ b/common/src/main/java/cz/jzitnik/common/socket/messages/game/creation/CreateGame.java @@ -0,0 +1,6 @@ +package cz.jzitnik.common.socket.messages.game.creation; + +import cz.jzitnik.common.socket.SocketMessage; + +public class CreateGame implements SocketMessage { +} diff --git a/common/src/main/java/cz/jzitnik/common/socket/messages/game/creation/CreateGameResponse.java b/common/src/main/java/cz/jzitnik/common/socket/messages/game/creation/CreateGameResponse.java new file mode 100644 index 0000000..732c852 --- /dev/null +++ b/common/src/main/java/cz/jzitnik/common/socket/messages/game/creation/CreateGameResponse.java @@ -0,0 +1,13 @@ +package cz.jzitnik.common.socket.messages.game.creation; + +import cz.jzitnik.common.models.player.PlayerCreation; +import cz.jzitnik.common.socket.SocketMessage; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public class CreateGameResponse implements SocketMessage { + private final String gamePassword; + private final PlayerCreation ownerPlayer; +} diff --git a/common/src/main/java/cz/jzitnik/common/socket/messages/items/ItemTookFromChest.java b/common/src/main/java/cz/jzitnik/common/socket/messages/items/ItemTookFromChest.java new file mode 100644 index 0000000..f1b3897 --- /dev/null +++ b/common/src/main/java/cz/jzitnik/common/socket/messages/items/ItemTookFromChest.java @@ -0,0 +1,9 @@ +package cz.jzitnik.common.socket.messages.items; + +import cz.jzitnik.common.socket.SocketMessage; + +public record ItemTookFromChest( + String roomId, // For faster lookup i guess + int id +) implements SocketMessage { +} diff --git a/common/src/main/java/cz/jzitnik/common/socket/messages/player/PlayerArrivalChange.java b/common/src/main/java/cz/jzitnik/common/socket/messages/player/PlayerArrivalChange.java new file mode 100644 index 0000000..d661795 --- /dev/null +++ b/common/src/main/java/cz/jzitnik/common/socket/messages/player/PlayerArrivalChange.java @@ -0,0 +1,8 @@ +package cz.jzitnik.common.socket.messages.player; + +import cz.jzitnik.common.models.coordinates.RoomCords; +import cz.jzitnik.common.socket.SocketMessage; + +public record PlayerArrivalChange(int id, RoomCords playerCords, PlayerRotation playerRotation, + boolean arrived, boolean rerender) implements SocketMessage { +} diff --git a/common/src/main/java/cz/jzitnik/common/socket/messages/player/PlayerDisconnected.java b/common/src/main/java/cz/jzitnik/common/socket/messages/player/PlayerDisconnected.java new file mode 100644 index 0000000..85fad63 --- /dev/null +++ b/common/src/main/java/cz/jzitnik/common/socket/messages/player/PlayerDisconnected.java @@ -0,0 +1,6 @@ +package cz.jzitnik.common.socket.messages.player; + +import cz.jzitnik.common.socket.SocketMessage; + +public record PlayerDisconnected(int playerId) implements SocketMessage { +} diff --git a/common/src/main/java/cz/jzitnik/common/socket/messages/player/PlayerJoined.java b/common/src/main/java/cz/jzitnik/common/socket/messages/player/PlayerJoined.java new file mode 100644 index 0000000..c60aa5b --- /dev/null +++ b/common/src/main/java/cz/jzitnik/common/socket/messages/player/PlayerJoined.java @@ -0,0 +1,7 @@ +package cz.jzitnik.common.socket.messages.player; + +import cz.jzitnik.common.models.player.PlayerCreation; +import cz.jzitnik.common.socket.SocketMessage; + +public record PlayerJoined(PlayerCreation playerCreation) implements SocketMessage { +} diff --git a/common/src/main/java/cz/jzitnik/common/socket/messages/player/PlayerMove.java b/common/src/main/java/cz/jzitnik/common/socket/messages/player/PlayerMove.java new file mode 100644 index 0000000..fdd52d9 --- /dev/null +++ b/common/src/main/java/cz/jzitnik/common/socket/messages/player/PlayerMove.java @@ -0,0 +1,7 @@ +package cz.jzitnik.common.socket.messages.player; + +import cz.jzitnik.common.models.coordinates.RoomCords; +import cz.jzitnik.common.socket.SocketMessage; + +public record PlayerMove(RoomCords newCords, PlayerRotation playerRotation) implements SocketMessage { +} diff --git a/common/src/main/java/cz/jzitnik/common/socket/messages/player/PlayerMovedInUrRoom.java b/common/src/main/java/cz/jzitnik/common/socket/messages/player/PlayerMovedInUrRoom.java new file mode 100644 index 0000000..0870792 --- /dev/null +++ b/common/src/main/java/cz/jzitnik/common/socket/messages/player/PlayerMovedInUrRoom.java @@ -0,0 +1,14 @@ +package cz.jzitnik.common.socket.messages.player; + +import cz.jzitnik.common.models.coordinates.RoomCords; +import cz.jzitnik.common.socket.SocketMessage; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public class PlayerMovedInUrRoom implements SocketMessage { + private int playerId; + private RoomCords cords; + private PlayerRotation playerRotation; +} diff --git a/common/src/main/java/cz/jzitnik/common/socket/messages/player/PlayerRotation.java b/common/src/main/java/cz/jzitnik/common/socket/messages/player/PlayerRotation.java new file mode 100644 index 0000000..968721b --- /dev/null +++ b/common/src/main/java/cz/jzitnik/common/socket/messages/player/PlayerRotation.java @@ -0,0 +1,5 @@ +package cz.jzitnik.common.socket.messages.player; + +public enum PlayerRotation { + FRONT, BACK, LEFT, RIGHT +} diff --git a/common/src/main/java/cz/jzitnik/common/socket/messages/room/MovePlayerRoom.java b/common/src/main/java/cz/jzitnik/common/socket/messages/room/MovePlayerRoom.java new file mode 100644 index 0000000..631fd6c --- /dev/null +++ b/common/src/main/java/cz/jzitnik/common/socket/messages/room/MovePlayerRoom.java @@ -0,0 +1,8 @@ +package cz.jzitnik.common.socket.messages.room; + +import cz.jzitnik.common.models.coordinates.RoomCords; +import cz.jzitnik.common.socket.SocketMessage; + +public record MovePlayerRoom(String newRoomId, RoomCords oldCords, RoomCords newCords) implements SocketMessage { + +} diff --git a/common/src/main/java/cz/jzitnik/common/socket/messages/room/MovePlayerRoomResponse.java b/common/src/main/java/cz/jzitnik/common/socket/messages/room/MovePlayerRoomResponse.java new file mode 100644 index 0000000..1d283d2 --- /dev/null +++ b/common/src/main/java/cz/jzitnik/common/socket/messages/room/MovePlayerRoomResponse.java @@ -0,0 +1,22 @@ +package cz.jzitnik.common.socket.messages.room; + +import cz.jzitnik.common.models.coordinates.RoomCords; +import cz.jzitnik.common.socket.SocketMessage; +import cz.jzitnik.common.socket.messages.player.PlayerRotation; + +import java.io.Serializable; +import java.util.Optional; +import java.util.Set; +import java.util.stream.Collectors; + +public record MovePlayerRoomResponse(Set players) implements SocketMessage { + public record Registry(int id, RoomCords cords, PlayerRotation playerRotation) implements Serializable {} + + public Optional getById(int id) { + return players.stream().filter(registry -> registry.id == id).findFirst(); + } + + public Set getIds() { + return players.stream().map(Registry::id).collect(Collectors.toSet()); + } +} diff --git a/game/.gitignore b/game/.gitignore new file mode 100644 index 0000000..5211a0b --- /dev/null +++ b/game/.gitignore @@ -0,0 +1,42 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ +.kotlin + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +.idea/FuzzierSettings.xml +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store + +logs diff --git a/game/.idea/.gitignore b/game/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/game/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/game/.idea/encodings.xml b/game/.idea/encodings.xml new file mode 100644 index 0000000..fd66ed6 --- /dev/null +++ b/game/.idea/encodings.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/game/.idea/misc.xml b/game/.idea/misc.xml new file mode 100644 index 0000000..1044c37 --- /dev/null +++ b/game/.idea/misc.xml @@ -0,0 +1,12 @@ + + + + + + + + \ No newline at end of file diff --git a/game/.idea/vcs.xml b/game/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/game/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/game/pom.xml b/game/pom.xml new file mode 100644 index 0000000..3a308de --- /dev/null +++ b/game/pom.xml @@ -0,0 +1,190 @@ + + + 4.0.0 + + + cz.jzitnik + game-parent + 1.0-SNAPSHOT + + + game + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.11.0 + + + + org.projectlombok + lombok + 1.18.38 + + + 25 + 25 + + + + + org.apache.maven.plugins + maven-shade-plugin + 3.2.1 + + + package + + shade + + + + + + + cz.jzitnik.client.Main + + + false + false + + + + + org.codehaus.mojo + exec-maven-plugin + 3.1.0 + + + + java + + + + + cz.jzitnik.client.Main + compile + false + + + + + + + + + be.0110.repo-releases + 0110.be repository + https://mvn.0110.be/releases + + + + + + cz.jzitnik + common + 1.0-SNAPSHOT + + + org.projectlombok + lombok + 1.18.42 + provided + + + + org.reflections + reflections + 0.10.2 + + + + com.google.guava + guava + 33.5.0-jre + + + + tools.jackson.core + jackson-databind + 3.0.4 + + + + tools.jackson.dataformat + jackson-dataformat-yaml + 3.0.4 + + + + org.junit.jupiter + junit-jupiter + 6.0.2 + + + + org.junit.jupiter + junit-jupiter-api + 6.0.2 + test + + + + org.slf4j + slf4j-api + 2.0.17 + + + + ch.qos.logback + logback-classic + 1.5.25 + + + + com.github.trilarion + java-vorbis-support + 1.2.1 + + + + com.googlecode.lanterna + lanterna + 3.1.3 + + + + org.bytedeco + javacv-platform + 1.5.12 + + + + org.bytedeco + ffmpeg-platform + 7.1.1-1.5.12 + + + + be.tarsos.dsp + core + 2.5 + + + + be.tarsos.dsp + jvm + 2.5 + + + + org.glassfish.tyrus.bundles + tyrus-standalone-client + 2.2.2 + + + diff --git a/src/main/java/cz/jzitnik/Cli.java b/game/src/main/java/cz/jzitnik/client/Cli.java similarity index 78% rename from src/main/java/cz/jzitnik/Cli.java rename to game/src/main/java/cz/jzitnik/client/Cli.java index 8b4aa52..5f32d35 100644 --- a/src/main/java/cz/jzitnik/Cli.java +++ b/game/src/main/java/cz/jzitnik/client/Cli.java @@ -1,18 +1,18 @@ -package cz.jzitnik; +package cz.jzitnik.client; import com.googlecode.lanterna.input.KeyStroke; import com.googlecode.lanterna.screen.TerminalScreen; import com.googlecode.lanterna.terminal.DefaultTerminalFactory; import com.googlecode.lanterna.terminal.MouseCaptureMode; -import cz.jzitnik.annotations.Dependency; -import cz.jzitnik.annotations.injectors.InjectDependency; -import cz.jzitnik.annotations.injectors.InjectState; -import cz.jzitnik.events.KeyboardPressEvent; -import cz.jzitnik.events.MouseAction; -import cz.jzitnik.events.TerminalResizeEvent; -import cz.jzitnik.states.RunningState; -import cz.jzitnik.states.TerminalState; -import cz.jzitnik.utils.events.EventManager; +import cz.jzitnik.client.annotations.Dependency; +import cz.jzitnik.client.annotations.injectors.InjectDependency; +import cz.jzitnik.client.annotations.injectors.InjectState; +import cz.jzitnik.client.events.KeyboardPressEvent; +import cz.jzitnik.client.events.MouseAction; +import cz.jzitnik.client.events.TerminalResizeEvent; +import cz.jzitnik.client.states.RunningState; +import cz.jzitnik.client.states.TerminalState; +import cz.jzitnik.client.utils.events.EventManager; import lombok.extern.slf4j.Slf4j; import java.io.IOException; @@ -31,8 +31,7 @@ public class Cli implements Runnable { @Override public void run() { - eventManager.start(); // Start event manager thread - + // Start event manager thread try (TerminalScreen terminal = new DefaultTerminalFactory() .setMouseCaptureMode(MouseCaptureMode.CLICK_RELEASE_DRAG_MOVE) .createScreen()) { diff --git a/game/src/main/java/cz/jzitnik/client/Game.java b/game/src/main/java/cz/jzitnik/client/Game.java new file mode 100644 index 0000000..71f774e --- /dev/null +++ b/game/src/main/java/cz/jzitnik/client/Game.java @@ -0,0 +1,49 @@ +package cz.jzitnik.client; + +import cz.jzitnik.client.annotations.injectors.InjectDependency; +import cz.jzitnik.client.game.setup.GameSetup; +import cz.jzitnik.client.socket.Client; +import cz.jzitnik.client.socket.SocketEventManager; +import cz.jzitnik.client.utils.DependencyManager; +import cz.jzitnik.client.utils.GlobalIOHandlerRepository; +import cz.jzitnik.client.utils.ScheduledTaskManager; +import cz.jzitnik.client.utils.ThreadManager; +import cz.jzitnik.client.utils.events.EventManager; +import jakarta.websocket.DeploymentException; +import org.reflections.Reflections; + +import java.io.IOException; + +public class Game { + private final DependencyManager dependencyManager = new DependencyManager(new Reflections("cz.jzitnik.client")); + + @InjectDependency + private GameSetup gameSetup; + @InjectDependency + private EventManager eventManager; + @InjectDependency + private SocketEventManager socketEventManager; + @InjectDependency + private Cli cli; + @InjectDependency + private ThreadManager threadManager; + @InjectDependency + private ScheduledTaskManager scheduledTaskManager; + @InjectDependency + private GlobalIOHandlerRepository globalIOHandlerRepository; + + public void start() throws IOException { + dependencyManager.inject(this); + + eventManager.start(); + socketEventManager.start(); + + threadManager.startAll(); + scheduledTaskManager.startAll(); + globalIOHandlerRepository.setup(); + + gameSetup.setup(); + + cli.run(); + } +} diff --git a/src/main/java/cz/jzitnik/Main.java b/game/src/main/java/cz/jzitnik/client/Main.java similarity index 87% rename from src/main/java/cz/jzitnik/Main.java rename to game/src/main/java/cz/jzitnik/client/Main.java index a649b6d..41515de 100644 --- a/src/main/java/cz/jzitnik/Main.java +++ b/game/src/main/java/cz/jzitnik/client/Main.java @@ -1,4 +1,4 @@ -package cz.jzitnik; +package cz.jzitnik.client; // events/handlers/MouseMoveEventHandler.java diff --git a/src/main/java/cz/jzitnik/annotations/Config.java b/game/src/main/java/cz/jzitnik/client/annotations/Config.java similarity index 87% rename from src/main/java/cz/jzitnik/annotations/Config.java rename to game/src/main/java/cz/jzitnik/client/annotations/Config.java index 163c563..882f382 100644 --- a/src/main/java/cz/jzitnik/annotations/Config.java +++ b/game/src/main/java/cz/jzitnik/client/annotations/Config.java @@ -1,4 +1,4 @@ -package cz.jzitnik.annotations; +package cz.jzitnik.client.annotations; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; diff --git a/src/main/java/cz/jzitnik/annotations/Dependency.java b/game/src/main/java/cz/jzitnik/client/annotations/Dependency.java similarity index 89% rename from src/main/java/cz/jzitnik/annotations/Dependency.java rename to game/src/main/java/cz/jzitnik/client/annotations/Dependency.java index 87ed5a5..288c601 100644 --- a/src/main/java/cz/jzitnik/annotations/Dependency.java +++ b/game/src/main/java/cz/jzitnik/client/annotations/Dependency.java @@ -1,4 +1,4 @@ -package cz.jzitnik.annotations; +package cz.jzitnik.client.annotations; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; diff --git a/src/main/java/cz/jzitnik/annotations/EventHandler.java b/game/src/main/java/cz/jzitnik/client/annotations/EventHandler.java similarity index 77% rename from src/main/java/cz/jzitnik/annotations/EventHandler.java rename to game/src/main/java/cz/jzitnik/client/annotations/EventHandler.java index e9c7d2c..79bdc30 100644 --- a/src/main/java/cz/jzitnik/annotations/EventHandler.java +++ b/game/src/main/java/cz/jzitnik/client/annotations/EventHandler.java @@ -1,6 +1,6 @@ -package cz.jzitnik.annotations; +package cz.jzitnik.client.annotations; -import cz.jzitnik.utils.events.Event; +import cz.jzitnik.client.utils.events.Event; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; diff --git a/src/main/java/cz/jzitnik/annotations/PostInit.java b/game/src/main/java/cz/jzitnik/client/annotations/PostInit.java similarity index 86% rename from src/main/java/cz/jzitnik/annotations/PostInit.java rename to game/src/main/java/cz/jzitnik/client/annotations/PostInit.java index 7861229..2998554 100644 --- a/src/main/java/cz/jzitnik/annotations/PostInit.java +++ b/game/src/main/java/cz/jzitnik/client/annotations/PostInit.java @@ -1,4 +1,4 @@ -package cz.jzitnik.annotations; +package cz.jzitnik.client.annotations; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; diff --git a/src/main/java/cz/jzitnik/annotations/ScheduledTask.java b/game/src/main/java/cz/jzitnik/client/annotations/ScheduledTask.java similarity index 89% rename from src/main/java/cz/jzitnik/annotations/ScheduledTask.java rename to game/src/main/java/cz/jzitnik/client/annotations/ScheduledTask.java index f60c113..9856180 100644 --- a/src/main/java/cz/jzitnik/annotations/ScheduledTask.java +++ b/game/src/main/java/cz/jzitnik/client/annotations/ScheduledTask.java @@ -1,4 +1,4 @@ -package cz.jzitnik.annotations; +package cz.jzitnik.client.annotations; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; diff --git a/game/src/main/java/cz/jzitnik/client/annotations/SocketEventHandler.java b/game/src/main/java/cz/jzitnik/client/annotations/SocketEventHandler.java new file mode 100644 index 0000000..bf6fdd9 --- /dev/null +++ b/game/src/main/java/cz/jzitnik/client/annotations/SocketEventHandler.java @@ -0,0 +1,14 @@ +package cz.jzitnik.client.annotations; + +import cz.jzitnik.common.socket.SocketMessage; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.TYPE) +public @interface SocketEventHandler { + Class value(); +} diff --git a/src/main/java/cz/jzitnik/annotations/State.java b/game/src/main/java/cz/jzitnik/client/annotations/State.java similarity index 86% rename from src/main/java/cz/jzitnik/annotations/State.java rename to game/src/main/java/cz/jzitnik/client/annotations/State.java index bf23ec3..0d9646b 100644 --- a/src/main/java/cz/jzitnik/annotations/State.java +++ b/game/src/main/java/cz/jzitnik/client/annotations/State.java @@ -1,4 +1,4 @@ -package cz.jzitnik.annotations; +package cz.jzitnik.client.annotations; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; diff --git a/src/main/java/cz/jzitnik/annotations/ThreadRegistry.java b/game/src/main/java/cz/jzitnik/client/annotations/ThreadRegistry.java similarity index 87% rename from src/main/java/cz/jzitnik/annotations/ThreadRegistry.java rename to game/src/main/java/cz/jzitnik/client/annotations/ThreadRegistry.java index ea4dfdd..ff3ec98 100644 --- a/src/main/java/cz/jzitnik/annotations/ThreadRegistry.java +++ b/game/src/main/java/cz/jzitnik/client/annotations/ThreadRegistry.java @@ -1,4 +1,4 @@ -package cz.jzitnik.annotations; +package cz.jzitnik.client.annotations; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; diff --git a/src/main/java/cz/jzitnik/annotations/injectors/InjectConfig.java b/game/src/main/java/cz/jzitnik/client/annotations/injectors/InjectConfig.java similarity index 84% rename from src/main/java/cz/jzitnik/annotations/injectors/InjectConfig.java rename to game/src/main/java/cz/jzitnik/client/annotations/injectors/InjectConfig.java index b95916e..3371552 100644 --- a/src/main/java/cz/jzitnik/annotations/injectors/InjectConfig.java +++ b/game/src/main/java/cz/jzitnik/client/annotations/injectors/InjectConfig.java @@ -1,4 +1,4 @@ -package cz.jzitnik.annotations.injectors; +package cz.jzitnik.client.annotations.injectors; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/src/main/java/cz/jzitnik/annotations/injectors/InjectDependency.java b/game/src/main/java/cz/jzitnik/client/annotations/injectors/InjectDependency.java similarity index 84% rename from src/main/java/cz/jzitnik/annotations/injectors/InjectDependency.java rename to game/src/main/java/cz/jzitnik/client/annotations/injectors/InjectDependency.java index 5c6fd13..2b8d0d6 100644 --- a/src/main/java/cz/jzitnik/annotations/injectors/InjectDependency.java +++ b/game/src/main/java/cz/jzitnik/client/annotations/injectors/InjectDependency.java @@ -1,4 +1,4 @@ -package cz.jzitnik.annotations.injectors; +package cz.jzitnik.client.annotations.injectors; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/src/main/java/cz/jzitnik/annotations/injectors/InjectState.java b/game/src/main/java/cz/jzitnik/client/annotations/injectors/InjectState.java similarity index 84% rename from src/main/java/cz/jzitnik/annotations/injectors/InjectState.java rename to game/src/main/java/cz/jzitnik/client/annotations/injectors/InjectState.java index d01eaa7..0c6ae48 100644 --- a/src/main/java/cz/jzitnik/annotations/injectors/InjectState.java +++ b/game/src/main/java/cz/jzitnik/client/annotations/injectors/InjectState.java @@ -1,4 +1,4 @@ -package cz.jzitnik.annotations.injectors; +package cz.jzitnik.client.annotations.injectors; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/src/main/java/cz/jzitnik/annotations/ui/KeyboardPressHandler.java b/game/src/main/java/cz/jzitnik/client/annotations/ui/KeyboardPressHandler.java similarity index 88% rename from src/main/java/cz/jzitnik/annotations/ui/KeyboardPressHandler.java rename to game/src/main/java/cz/jzitnik/client/annotations/ui/KeyboardPressHandler.java index d5e6eaa..b8c172a 100644 --- a/src/main/java/cz/jzitnik/annotations/ui/KeyboardPressHandler.java +++ b/game/src/main/java/cz/jzitnik/client/annotations/ui/KeyboardPressHandler.java @@ -1,4 +1,4 @@ -package cz.jzitnik.annotations.ui; +package cz.jzitnik.client.annotations.ui; import com.googlecode.lanterna.input.KeyType; diff --git a/src/main/java/cz/jzitnik/annotations/ui/KeyboardPressHandlers.java b/game/src/main/java/cz/jzitnik/client/annotations/ui/KeyboardPressHandlers.java similarity index 87% rename from src/main/java/cz/jzitnik/annotations/ui/KeyboardPressHandlers.java rename to game/src/main/java/cz/jzitnik/client/annotations/ui/KeyboardPressHandlers.java index b8892ae..32d1abf 100644 --- a/src/main/java/cz/jzitnik/annotations/ui/KeyboardPressHandlers.java +++ b/game/src/main/java/cz/jzitnik/client/annotations/ui/KeyboardPressHandlers.java @@ -1,4 +1,4 @@ -package cz.jzitnik.annotations.ui; +package cz.jzitnik.client.annotations.ui; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/src/main/java/cz/jzitnik/annotations/ui/MouseHandler.java b/game/src/main/java/cz/jzitnik/client/annotations/ui/MouseHandler.java similarity index 87% rename from src/main/java/cz/jzitnik/annotations/ui/MouseHandler.java rename to game/src/main/java/cz/jzitnik/client/annotations/ui/MouseHandler.java index e18ed7c..5ea0f70 100644 --- a/src/main/java/cz/jzitnik/annotations/ui/MouseHandler.java +++ b/game/src/main/java/cz/jzitnik/client/annotations/ui/MouseHandler.java @@ -1,4 +1,4 @@ -package cz.jzitnik.annotations.ui; +package cz.jzitnik.client.annotations.ui; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; diff --git a/src/main/java/cz/jzitnik/annotations/ui/MouseHandlerType.java b/game/src/main/java/cz/jzitnik/client/annotations/ui/MouseHandlerType.java similarity index 60% rename from src/main/java/cz/jzitnik/annotations/ui/MouseHandlerType.java rename to game/src/main/java/cz/jzitnik/client/annotations/ui/MouseHandlerType.java index 26e46d7..158904b 100644 --- a/src/main/java/cz/jzitnik/annotations/ui/MouseHandlerType.java +++ b/game/src/main/java/cz/jzitnik/client/annotations/ui/MouseHandlerType.java @@ -1,4 +1,4 @@ -package cz.jzitnik.annotations.ui; +package cz.jzitnik.client.annotations.ui; public enum MouseHandlerType { CLICK, diff --git a/src/main/java/cz/jzitnik/annotations/ui/Render.java b/game/src/main/java/cz/jzitnik/client/annotations/ui/Render.java similarity index 85% rename from src/main/java/cz/jzitnik/annotations/ui/Render.java rename to game/src/main/java/cz/jzitnik/client/annotations/ui/Render.java index 6a2a79c..0f60582 100644 --- a/src/main/java/cz/jzitnik/annotations/ui/Render.java +++ b/game/src/main/java/cz/jzitnik/client/annotations/ui/Render.java @@ -1,4 +1,4 @@ -package cz.jzitnik.annotations.ui; +package cz.jzitnik.client.annotations.ui; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; diff --git a/src/main/java/cz/jzitnik/annotations/ui/UI.java b/game/src/main/java/cz/jzitnik/client/annotations/ui/UI.java similarity index 85% rename from src/main/java/cz/jzitnik/annotations/ui/UI.java rename to game/src/main/java/cz/jzitnik/client/annotations/ui/UI.java index 9980fcf..c74f7e2 100644 --- a/src/main/java/cz/jzitnik/annotations/ui/UI.java +++ b/game/src/main/java/cz/jzitnik/client/annotations/ui/UI.java @@ -1,4 +1,4 @@ -package cz.jzitnik.annotations.ui; +package cz.jzitnik.client.annotations.ui; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; diff --git a/src/main/java/cz/jzitnik/config/CoreLogic.java b/game/src/main/java/cz/jzitnik/client/config/CoreLogic.java similarity index 81% rename from src/main/java/cz/jzitnik/config/CoreLogic.java rename to game/src/main/java/cz/jzitnik/client/config/CoreLogic.java index 31a1484..545b613 100644 --- a/src/main/java/cz/jzitnik/config/CoreLogic.java +++ b/game/src/main/java/cz/jzitnik/client/config/CoreLogic.java @@ -1,9 +1,8 @@ -package cz.jzitnik.config; +package cz.jzitnik.client.config; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; -import cz.jzitnik.annotations.Config; -import lombok.Getter; +import cz.jzitnik.client.annotations.Config; @Config("core_logic.yaml") public record CoreLogic(int itemDropDisappearMinutes) { diff --git a/src/main/java/cz/jzitnik/config/Debugging.java b/game/src/main/java/cz/jzitnik/client/config/Debugging.java similarity index 89% rename from src/main/java/cz/jzitnik/config/Debugging.java rename to game/src/main/java/cz/jzitnik/client/config/Debugging.java index b5ac702..287cdff 100644 --- a/src/main/java/cz/jzitnik/config/Debugging.java +++ b/game/src/main/java/cz/jzitnik/client/config/Debugging.java @@ -1,8 +1,8 @@ -package cz.jzitnik.config; +package cz.jzitnik.client.config; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; -import cz.jzitnik.annotations.Config; +import cz.jzitnik.client.annotations.Config; @Config("debugging.yaml") public record Debugging(boolean renderColliders, boolean renderPlayerCollider, boolean showPlayerCordsLogs) { diff --git a/src/main/java/cz/jzitnik/config/MicrophoneConfig.java b/game/src/main/java/cz/jzitnik/client/config/MicrophoneConfig.java similarity index 82% rename from src/main/java/cz/jzitnik/config/MicrophoneConfig.java rename to game/src/main/java/cz/jzitnik/client/config/MicrophoneConfig.java index a55bda2..b07ba83 100644 --- a/src/main/java/cz/jzitnik/config/MicrophoneConfig.java +++ b/game/src/main/java/cz/jzitnik/client/config/MicrophoneConfig.java @@ -1,8 +1,8 @@ -package cz.jzitnik.config; +package cz.jzitnik.client.config; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; -import cz.jzitnik.annotations.Config; +import cz.jzitnik.client.annotations.Config; @Config("microphone.yaml") public record MicrophoneConfig(float volumeThreshold) { diff --git a/src/main/java/cz/jzitnik/config/PlayerConfig.java b/game/src/main/java/cz/jzitnik/client/config/PlayerConfig.java similarity index 90% rename from src/main/java/cz/jzitnik/config/PlayerConfig.java rename to game/src/main/java/cz/jzitnik/client/config/PlayerConfig.java index 1e355a6..78079ce 100644 --- a/src/main/java/cz/jzitnik/config/PlayerConfig.java +++ b/game/src/main/java/cz/jzitnik/client/config/PlayerConfig.java @@ -1,9 +1,9 @@ -package cz.jzitnik.config; +package cz.jzitnik.client.config; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; -import cz.jzitnik.annotations.Config; -import cz.jzitnik.events.handlers.PlayerMoveEventHandler; +import cz.jzitnik.client.annotations.Config; +import cz.jzitnik.client.events.handlers.PlayerMoveEventHandler; @Config("player.yaml") public record PlayerConfig( diff --git a/src/main/java/cz/jzitnik/config/ThreadPoolConfig.java b/game/src/main/java/cz/jzitnik/client/config/ThreadPoolConfig.java similarity index 85% rename from src/main/java/cz/jzitnik/config/ThreadPoolConfig.java rename to game/src/main/java/cz/jzitnik/client/config/ThreadPoolConfig.java index 2dc4110..b1c2dfc 100644 --- a/src/main/java/cz/jzitnik/config/ThreadPoolConfig.java +++ b/game/src/main/java/cz/jzitnik/client/config/ThreadPoolConfig.java @@ -1,9 +1,8 @@ -package cz.jzitnik.config; +package cz.jzitnik.client.config; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; -import cz.jzitnik.annotations.Config; -import lombok.Getter; +import cz.jzitnik.client.annotations.Config; @Config("threads.yaml") public record ThreadPoolConfig(int eventThreadCount, int taskThreadCount) { diff --git a/game/src/main/java/cz/jzitnik/client/events/DroppedItemRerender.java b/game/src/main/java/cz/jzitnik/client/events/DroppedItemRerender.java new file mode 100644 index 0000000..1f421de --- /dev/null +++ b/game/src/main/java/cz/jzitnik/client/events/DroppedItemRerender.java @@ -0,0 +1,7 @@ +package cz.jzitnik.client.events; + +import cz.jzitnik.client.game.objects.DroppedItem; +import cz.jzitnik.client.utils.events.Event; + +public record DroppedItemRerender(DroppedItem droppedItem) implements Event { +} diff --git a/src/main/java/cz/jzitnik/events/ExitEvent.java b/game/src/main/java/cz/jzitnik/client/events/ExitEvent.java similarity index 52% rename from src/main/java/cz/jzitnik/events/ExitEvent.java rename to game/src/main/java/cz/jzitnik/client/events/ExitEvent.java index 1649807..0a5761d 100644 --- a/src/main/java/cz/jzitnik/events/ExitEvent.java +++ b/game/src/main/java/cz/jzitnik/client/events/ExitEvent.java @@ -1,6 +1,6 @@ -package cz.jzitnik.events; +package cz.jzitnik.client.events; -import cz.jzitnik.utils.events.Event; +import cz.jzitnik.client.utils.events.Event; /** Custom event without any handler **/ public class ExitEvent implements Event { diff --git a/game/src/main/java/cz/jzitnik/client/events/FullRedrawEvent.java b/game/src/main/java/cz/jzitnik/client/events/FullRedrawEvent.java new file mode 100644 index 0000000..cc88a6e --- /dev/null +++ b/game/src/main/java/cz/jzitnik/client/events/FullRedrawEvent.java @@ -0,0 +1,6 @@ +package cz.jzitnik.client.events; + +import cz.jzitnik.client.utils.events.Event; + +public class FullRedrawEvent implements Event { +} diff --git a/src/main/java/cz/jzitnik/events/FullRoomDraw.java b/game/src/main/java/cz/jzitnik/client/events/FullRoomDraw.java similarity index 73% rename from src/main/java/cz/jzitnik/events/FullRoomDraw.java rename to game/src/main/java/cz/jzitnik/client/events/FullRoomDraw.java index 1268625..7097833 100644 --- a/src/main/java/cz/jzitnik/events/FullRoomDraw.java +++ b/game/src/main/java/cz/jzitnik/client/events/FullRoomDraw.java @@ -1,7 +1,6 @@ -package cz.jzitnik.events; +package cz.jzitnik.client.events; -import cz.jzitnik.utils.events.Event; -import lombok.AllArgsConstructor; +import cz.jzitnik.client.utils.events.Event; import lombok.Getter; import lombok.NoArgsConstructor; diff --git a/game/src/main/java/cz/jzitnik/client/events/InventoryRerender.java b/game/src/main/java/cz/jzitnik/client/events/InventoryRerender.java new file mode 100644 index 0000000..998db13 --- /dev/null +++ b/game/src/main/java/cz/jzitnik/client/events/InventoryRerender.java @@ -0,0 +1,6 @@ +package cz.jzitnik.client.events; + +import cz.jzitnik.client.utils.events.Event; + +public class InventoryRerender implements Event { +} diff --git a/src/main/java/cz/jzitnik/events/KeyboardPressEvent.java b/game/src/main/java/cz/jzitnik/client/events/KeyboardPressEvent.java similarity index 73% rename from src/main/java/cz/jzitnik/events/KeyboardPressEvent.java rename to game/src/main/java/cz/jzitnik/client/events/KeyboardPressEvent.java index 52ec8ae..19b2e2b 100644 --- a/src/main/java/cz/jzitnik/events/KeyboardPressEvent.java +++ b/game/src/main/java/cz/jzitnik/client/events/KeyboardPressEvent.java @@ -1,7 +1,7 @@ -package cz.jzitnik.events; +package cz.jzitnik.client.events; import com.googlecode.lanterna.input.KeyStroke; -import cz.jzitnik.utils.events.Event; +import cz.jzitnik.client.utils.events.Event; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/src/main/java/cz/jzitnik/events/MouseAction.java b/game/src/main/java/cz/jzitnik/client/events/MouseAction.java similarity index 86% rename from src/main/java/cz/jzitnik/events/MouseAction.java rename to game/src/main/java/cz/jzitnik/client/events/MouseAction.java index 6959efc..605e5db 100644 --- a/src/main/java/cz/jzitnik/events/MouseAction.java +++ b/game/src/main/java/cz/jzitnik/client/events/MouseAction.java @@ -1,8 +1,8 @@ -package cz.jzitnik.events; +package cz.jzitnik.client.events; import com.googlecode.lanterna.TerminalPosition; import com.googlecode.lanterna.input.MouseActionType; -import cz.jzitnik.utils.events.Event; +import cz.jzitnik.client.utils.events.Event; public class MouseAction extends com.googlecode.lanterna.input.MouseAction implements Event { public MouseAction(MouseActionType actionType, int button, TerminalPosition position) { diff --git a/src/main/java/cz/jzitnik/events/MouseMoveEvent.java b/game/src/main/java/cz/jzitnik/client/events/MouseMoveEvent.java similarity index 68% rename from src/main/java/cz/jzitnik/events/MouseMoveEvent.java rename to game/src/main/java/cz/jzitnik/client/events/MouseMoveEvent.java index 9bb769b..e4c4e82 100644 --- a/src/main/java/cz/jzitnik/events/MouseMoveEvent.java +++ b/game/src/main/java/cz/jzitnik/client/events/MouseMoveEvent.java @@ -1,6 +1,6 @@ -package cz.jzitnik.events; +package cz.jzitnik.client.events; -import cz.jzitnik.utils.events.Event; +import cz.jzitnik.client.utils.events.Event; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/src/main/java/cz/jzitnik/events/PlayerMoveEvent.java b/game/src/main/java/cz/jzitnik/client/events/PlayerMoveEvent.java similarity index 73% rename from src/main/java/cz/jzitnik/events/PlayerMoveEvent.java rename to game/src/main/java/cz/jzitnik/client/events/PlayerMoveEvent.java index 41169ce..34ed568 100644 --- a/src/main/java/cz/jzitnik/events/PlayerMoveEvent.java +++ b/game/src/main/java/cz/jzitnik/client/events/PlayerMoveEvent.java @@ -1,7 +1,7 @@ -package cz.jzitnik.events; +package cz.jzitnik.client.events; import com.googlecode.lanterna.input.KeyStroke; -import cz.jzitnik.utils.events.Event; +import cz.jzitnik.client.utils.events.Event; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/game/src/main/java/cz/jzitnik/client/events/RenderStats.java b/game/src/main/java/cz/jzitnik/client/events/RenderStats.java new file mode 100644 index 0000000..2df5177 --- /dev/null +++ b/game/src/main/java/cz/jzitnik/client/events/RenderStats.java @@ -0,0 +1,6 @@ +package cz.jzitnik.client.events; + +import cz.jzitnik.client.utils.events.Event; + +public class RenderStats implements Event { +} diff --git a/src/main/java/cz/jzitnik/events/RerenderPart.java b/game/src/main/java/cz/jzitnik/client/events/RerenderPart.java similarity index 75% rename from src/main/java/cz/jzitnik/events/RerenderPart.java rename to game/src/main/java/cz/jzitnik/client/events/RerenderPart.java index 77de5b9..bd79e2d 100644 --- a/src/main/java/cz/jzitnik/events/RerenderPart.java +++ b/game/src/main/java/cz/jzitnik/client/events/RerenderPart.java @@ -1,6 +1,6 @@ -package cz.jzitnik.events; +package cz.jzitnik.client.events; -import cz.jzitnik.utils.events.Event; +import cz.jzitnik.client.utils.events.Event; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/src/main/java/cz/jzitnik/events/RerenderScreen.java b/game/src/main/java/cz/jzitnik/client/events/RerenderScreen.java similarity index 93% rename from src/main/java/cz/jzitnik/events/RerenderScreen.java rename to game/src/main/java/cz/jzitnik/client/events/RerenderScreen.java index 5ef8e58..404d48c 100644 --- a/src/main/java/cz/jzitnik/events/RerenderScreen.java +++ b/game/src/main/java/cz/jzitnik/client/events/RerenderScreen.java @@ -1,13 +1,11 @@ -package cz.jzitnik.events; +package cz.jzitnik.client.events; import com.googlecode.lanterna.TerminalPosition; import com.googlecode.lanterna.TerminalSize; -import cz.jzitnik.utils.events.Event; +import cz.jzitnik.client.utils.events.Event; import lombok.AllArgsConstructor; import lombok.Data; -import java.awt.*; - public record RerenderScreen(ScreenPart[] parts) implements Event { public RerenderScreen(ScreenPart part) { this(new ScreenPart[]{part}); diff --git a/game/src/main/java/cz/jzitnik/client/events/RoomChangeEvent.java b/game/src/main/java/cz/jzitnik/client/events/RoomChangeEvent.java new file mode 100644 index 0000000..7573d09 --- /dev/null +++ b/game/src/main/java/cz/jzitnik/client/events/RoomChangeEvent.java @@ -0,0 +1,7 @@ +package cz.jzitnik.client.events; + +import cz.jzitnik.client.events.handlers.FullRoomDrawHandler; +import cz.jzitnik.client.utils.events.Event; + +public record RoomChangeEvent(FullRoomDrawHandler.DoorPosition door) implements Event { +} diff --git a/game/src/main/java/cz/jzitnik/client/events/SendSocketMessageEvent.java b/game/src/main/java/cz/jzitnik/client/events/SendSocketMessageEvent.java new file mode 100644 index 0000000..291299a --- /dev/null +++ b/game/src/main/java/cz/jzitnik/client/events/SendSocketMessageEvent.java @@ -0,0 +1,7 @@ +package cz.jzitnik.client.events; + +import cz.jzitnik.client.utils.events.Event; +import cz.jzitnik.common.socket.SocketMessage; + +public record SendSocketMessageEvent(SocketMessage message) implements Event { +} diff --git a/src/main/java/cz/jzitnik/events/TerminalResizeEvent.java b/game/src/main/java/cz/jzitnik/client/events/TerminalResizeEvent.java similarity index 73% rename from src/main/java/cz/jzitnik/events/TerminalResizeEvent.java rename to game/src/main/java/cz/jzitnik/client/events/TerminalResizeEvent.java index f5749d1..7f3af38 100644 --- a/src/main/java/cz/jzitnik/events/TerminalResizeEvent.java +++ b/game/src/main/java/cz/jzitnik/client/events/TerminalResizeEvent.java @@ -1,7 +1,7 @@ -package cz.jzitnik.events; +package cz.jzitnik.client.events; import com.googlecode.lanterna.TerminalSize; -import cz.jzitnik.utils.events.Event; +import cz.jzitnik.client.utils.events.Event; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/game/src/main/java/cz/jzitnik/client/events/TerminalTooSmallEvent.java b/game/src/main/java/cz/jzitnik/client/events/TerminalTooSmallEvent.java new file mode 100644 index 0000000..a2795b5 --- /dev/null +++ b/game/src/main/java/cz/jzitnik/client/events/TerminalTooSmallEvent.java @@ -0,0 +1,6 @@ +package cz.jzitnik.client.events; + +import cz.jzitnik.client.utils.events.Event; + +public class TerminalTooSmallEvent implements Event { +} diff --git a/src/main/java/cz/jzitnik/events/handlers/CliHandler.java b/game/src/main/java/cz/jzitnik/client/events/handlers/CliHandler.java similarity index 85% rename from src/main/java/cz/jzitnik/events/handlers/CliHandler.java rename to game/src/main/java/cz/jzitnik/client/events/handlers/CliHandler.java index 3385631..989838a 100644 --- a/src/main/java/cz/jzitnik/events/handlers/CliHandler.java +++ b/game/src/main/java/cz/jzitnik/client/events/handlers/CliHandler.java @@ -1,19 +1,19 @@ -package cz.jzitnik.events.handlers; +package cz.jzitnik.client.events.handlers; import com.googlecode.lanterna.TextColor; import com.googlecode.lanterna.graphics.TextGraphics; -import cz.jzitnik.annotations.EventHandler; -import cz.jzitnik.annotations.injectors.InjectState; -import cz.jzitnik.events.RerenderScreen; -import cz.jzitnik.game.Constants; -import cz.jzitnik.states.RenderState; -import cz.jzitnik.states.ScreenBuffer; -import cz.jzitnik.states.TerminalState; -import cz.jzitnik.ui.pixels.AlphaPixel; -import cz.jzitnik.ui.pixels.ColoredPixel; -import cz.jzitnik.ui.pixels.Empty; -import cz.jzitnik.ui.pixels.Pixel; -import cz.jzitnik.utils.events.AbstractEventHandler; +import cz.jzitnik.client.annotations.EventHandler; +import cz.jzitnik.client.annotations.injectors.InjectState; +import cz.jzitnik.client.events.RerenderScreen; +import cz.jzitnik.client.game.Constants; +import cz.jzitnik.client.states.RenderState; +import cz.jzitnik.client.states.ScreenBuffer; +import cz.jzitnik.client.states.TerminalState; +import cz.jzitnik.client.ui.pixels.AlphaPixel; +import cz.jzitnik.client.ui.pixels.ColoredPixel; +import cz.jzitnik.client.ui.pixels.Empty; +import cz.jzitnik.client.ui.pixels.Pixel; +import cz.jzitnik.client.utils.events.AbstractEventHandler; import lombok.extern.slf4j.Slf4j; import java.io.IOException; diff --git a/src/main/java/cz/jzitnik/events/handlers/DialogEventHandler.java b/game/src/main/java/cz/jzitnik/client/events/handlers/DialogEventHandler.java similarity index 90% rename from src/main/java/cz/jzitnik/events/handlers/DialogEventHandler.java rename to game/src/main/java/cz/jzitnik/client/events/handlers/DialogEventHandler.java index 6d30233..9ed1700 100644 --- a/src/main/java/cz/jzitnik/events/handlers/DialogEventHandler.java +++ b/game/src/main/java/cz/jzitnik/client/events/handlers/DialogEventHandler.java @@ -1,24 +1,24 @@ -package cz.jzitnik.events.handlers; +package cz.jzitnik.client.events.handlers; import com.googlecode.lanterna.TerminalPosition; import com.googlecode.lanterna.TerminalSize; import com.googlecode.lanterna.TextColor; -import cz.jzitnik.annotations.EventHandler; -import cz.jzitnik.annotations.injectors.InjectDependency; -import cz.jzitnik.annotations.injectors.InjectState; -import cz.jzitnik.events.RerenderScreen; -import cz.jzitnik.game.dialog.Dialog; -import cz.jzitnik.game.dialog.OnEnd; -import cz.jzitnik.states.DialogState; -import cz.jzitnik.states.ScreenBuffer; -import cz.jzitnik.states.TerminalState; -import cz.jzitnik.ui.pixels.AlphaPixel; -import cz.jzitnik.ui.pixels.ColoredPixel; -import cz.jzitnik.ui.pixels.Empty; -import cz.jzitnik.utils.DependencyManager; -import cz.jzitnik.utils.TextRenderer; -import cz.jzitnik.utils.events.AbstractEventHandler; -import cz.jzitnik.utils.events.EventManager; +import cz.jzitnik.client.annotations.EventHandler; +import cz.jzitnik.client.annotations.injectors.InjectDependency; +import cz.jzitnik.client.annotations.injectors.InjectState; +import cz.jzitnik.client.events.RerenderScreen; +import cz.jzitnik.client.game.dialog.Dialog; +import cz.jzitnik.client.game.dialog.OnEnd; +import cz.jzitnik.client.states.DialogState; +import cz.jzitnik.client.states.ScreenBuffer; +import cz.jzitnik.client.states.TerminalState; +import cz.jzitnik.client.ui.pixels.AlphaPixel; +import cz.jzitnik.client.ui.pixels.ColoredPixel; +import cz.jzitnik.client.ui.pixels.Empty; +import cz.jzitnik.client.utils.DependencyManager; +import cz.jzitnik.client.utils.TextRenderer; +import cz.jzitnik.client.utils.events.AbstractEventHandler; +import cz.jzitnik.client.utils.events.EventManager; import lombok.extern.slf4j.Slf4j; import java.awt.*; @@ -105,7 +105,7 @@ public class DialogEventHandler extends AbstractEventHandler { OnEnd.AskQuestion.Answer[] answers )) { for (OnEnd.AskQuestion.Answer answer : answers) { - answersBuf.add(textRenderer.renderText(answer.answer(), size.getColumns() - PADDING * 2, BUTTON_HEIGHT, Color.BLACK, FONT_SIZE)); + answersBuf.add(textRenderer.renderText(answer.answer(), size.getColumns() - PADDING * 2, BUTTON_HEIGHT, Color.BLACK, FONT_SIZE, false)); } } diff --git a/src/main/java/cz/jzitnik/events/handlers/DroppedItemRerenderHandler.java b/game/src/main/java/cz/jzitnik/client/events/handlers/DroppedItemRerenderHandler.java similarity index 63% rename from src/main/java/cz/jzitnik/events/handlers/DroppedItemRerenderHandler.java rename to game/src/main/java/cz/jzitnik/client/events/handlers/DroppedItemRerenderHandler.java index ebd8bcd..7898f51 100644 --- a/src/main/java/cz/jzitnik/events/handlers/DroppedItemRerenderHandler.java +++ b/game/src/main/java/cz/jzitnik/client/events/handlers/DroppedItemRerenderHandler.java @@ -1,12 +1,12 @@ -package cz.jzitnik.events.handlers; +package cz.jzitnik.client.events.handlers; -import cz.jzitnik.annotations.EventHandler; -import cz.jzitnik.annotations.injectors.InjectDependency; -import cz.jzitnik.events.DroppedItemRerender; -import cz.jzitnik.events.RerenderPart; -import cz.jzitnik.game.utils.RoomCords; -import cz.jzitnik.utils.events.AbstractEventHandler; -import cz.jzitnik.utils.events.EventManager; +import cz.jzitnik.client.annotations.EventHandler; +import cz.jzitnik.client.annotations.injectors.InjectDependency; +import cz.jzitnik.client.events.DroppedItemRerender; +import cz.jzitnik.client.events.RerenderPart; +import cz.jzitnik.common.models.coordinates.RoomCords; +import cz.jzitnik.client.utils.events.AbstractEventHandler; +import cz.jzitnik.client.utils.events.EventManager; import java.awt.image.BufferedImage; diff --git a/src/main/java/cz/jzitnik/events/handlers/ExitEventHandler.java b/game/src/main/java/cz/jzitnik/client/events/handlers/ExitEventHandler.java similarity index 55% rename from src/main/java/cz/jzitnik/events/handlers/ExitEventHandler.java rename to game/src/main/java/cz/jzitnik/client/events/handlers/ExitEventHandler.java index 3759879..1c9cec5 100644 --- a/src/main/java/cz/jzitnik/events/handlers/ExitEventHandler.java +++ b/game/src/main/java/cz/jzitnik/client/events/handlers/ExitEventHandler.java @@ -1,14 +1,14 @@ -package cz.jzitnik.events.handlers; +package cz.jzitnik.client.events.handlers; -import cz.jzitnik.annotations.EventHandler; -import cz.jzitnik.annotations.injectors.InjectDependency; -import cz.jzitnik.annotations.injectors.InjectState; -import cz.jzitnik.events.ExitEvent; -import cz.jzitnik.states.RunningState; -import cz.jzitnik.utils.ScheduledTaskManager; -import cz.jzitnik.utils.ThreadManager; -import cz.jzitnik.utils.events.AbstractEventHandler; -import cz.jzitnik.utils.roomtasks.RoomTaskScheduler; +import cz.jzitnik.client.annotations.EventHandler; +import cz.jzitnik.client.annotations.injectors.InjectDependency; +import cz.jzitnik.client.annotations.injectors.InjectState; +import cz.jzitnik.client.events.ExitEvent; +import cz.jzitnik.client.states.RunningState; +import cz.jzitnik.client.utils.ScheduledTaskManager; +import cz.jzitnik.client.utils.ThreadManager; +import cz.jzitnik.client.utils.events.AbstractEventHandler; +import cz.jzitnik.client.utils.roomtasks.RoomTaskScheduler; @EventHandler(ExitEvent.class) public class ExitEventHandler extends AbstractEventHandler { diff --git a/src/main/java/cz/jzitnik/events/handlers/FullRedrawEventHandler.java b/game/src/main/java/cz/jzitnik/client/events/handlers/FullRedrawEventHandler.java similarity index 57% rename from src/main/java/cz/jzitnik/events/handlers/FullRedrawEventHandler.java rename to game/src/main/java/cz/jzitnik/client/events/handlers/FullRedrawEventHandler.java index f27fe7f..dfa6e95 100644 --- a/src/main/java/cz/jzitnik/events/handlers/FullRedrawEventHandler.java +++ b/game/src/main/java/cz/jzitnik/client/events/handlers/FullRedrawEventHandler.java @@ -1,14 +1,14 @@ -package cz.jzitnik.events.handlers; +package cz.jzitnik.client.events.handlers; import com.googlecode.lanterna.screen.Screen; -import cz.jzitnik.annotations.EventHandler; -import cz.jzitnik.annotations.injectors.InjectDependency; -import cz.jzitnik.annotations.injectors.InjectState; -import cz.jzitnik.events.FullRedrawEvent; -import cz.jzitnik.events.FullRoomDraw; -import cz.jzitnik.states.TerminalState; -import cz.jzitnik.utils.events.AbstractEventHandler; -import cz.jzitnik.utils.events.EventManager; +import cz.jzitnik.client.annotations.EventHandler; +import cz.jzitnik.client.annotations.injectors.InjectDependency; +import cz.jzitnik.client.annotations.injectors.InjectState; +import cz.jzitnik.client.events.FullRedrawEvent; +import cz.jzitnik.client.events.FullRoomDraw; +import cz.jzitnik.client.states.TerminalState; +import cz.jzitnik.client.utils.events.AbstractEventHandler; +import cz.jzitnik.client.utils.events.EventManager; import java.io.IOException; diff --git a/src/main/java/cz/jzitnik/events/handlers/FullRoomDrawHandler.java b/game/src/main/java/cz/jzitnik/client/events/handlers/FullRoomDrawHandler.java similarity index 74% rename from src/main/java/cz/jzitnik/events/handlers/FullRoomDrawHandler.java rename to game/src/main/java/cz/jzitnik/client/events/handlers/FullRoomDrawHandler.java index d766cf0..ca14c0e 100644 --- a/src/main/java/cz/jzitnik/events/handlers/FullRoomDrawHandler.java +++ b/game/src/main/java/cz/jzitnik/client/events/handlers/FullRoomDrawHandler.java @@ -1,28 +1,28 @@ -package cz.jzitnik.events.handlers; +package cz.jzitnik.client.events.handlers; import com.googlecode.lanterna.TerminalPosition; import com.googlecode.lanterna.TerminalSize; import com.googlecode.lanterna.screen.TerminalScreen; -import cz.jzitnik.annotations.EventHandler; -import cz.jzitnik.annotations.injectors.InjectConfig; -import cz.jzitnik.annotations.injectors.InjectDependency; -import cz.jzitnik.annotations.injectors.InjectState; -import cz.jzitnik.config.Debugging; -import cz.jzitnik.events.FullRoomDraw; -import cz.jzitnik.events.RerenderScreen; -import cz.jzitnik.events.TerminalTooSmallEvent; -import cz.jzitnik.game.GameRoom; -import cz.jzitnik.game.GameState; -import cz.jzitnik.game.Player; -import cz.jzitnik.game.ResourceManager; -import cz.jzitnik.states.RenderState; -import cz.jzitnik.states.ScreenBuffer; -import cz.jzitnik.states.TerminalState; -import cz.jzitnik.utils.GlobalIOHandlerRepository; -import cz.jzitnik.utils.RerenderUtils; -import cz.jzitnik.utils.events.AbstractEventHandler; -import cz.jzitnik.utils.events.EventManager; -import cz.jzitnik.utils.roomtasks.RoomTaskScheduler; +import cz.jzitnik.client.annotations.EventHandler; +import cz.jzitnik.client.annotations.injectors.InjectConfig; +import cz.jzitnik.client.annotations.injectors.InjectDependency; +import cz.jzitnik.client.annotations.injectors.InjectState; +import cz.jzitnik.client.config.Debugging; +import cz.jzitnik.client.events.FullRoomDraw; +import cz.jzitnik.client.events.RerenderScreen; +import cz.jzitnik.client.events.TerminalTooSmallEvent; +import cz.jzitnik.client.game.GameRoom; +import cz.jzitnik.client.game.GameState; +import cz.jzitnik.client.game.Player; +import cz.jzitnik.client.game.ResourceManager; +import cz.jzitnik.client.states.RenderState; +import cz.jzitnik.client.states.ScreenBuffer; +import cz.jzitnik.client.states.TerminalState; +import cz.jzitnik.client.utils.GlobalIOHandlerRepository; +import cz.jzitnik.client.utils.RerenderUtils; +import cz.jzitnik.client.utils.events.AbstractEventHandler; +import cz.jzitnik.client.utils.events.EventManager; +import cz.jzitnik.client.utils.roomtasks.RoomTaskScheduler; import lombok.extern.slf4j.Slf4j; import java.awt.image.BufferedImage; @@ -75,7 +75,7 @@ public class FullRoomDrawHandler extends AbstractEventHandler { int startX = start.getX(); int startY = start.getY(); - RerenderUtils.rerenderPart(0, width - 1, 0, height - 1, startX, startY, currentRoom, room, player, playerTexture, screenBuffer, resourceManager, debugging); + RerenderUtils.rerenderPart(0, width - 1, 0, height - 1, startX, startY, currentRoom, room, player, screenBuffer, resourceManager, debugging, gameState.getOtherPlayers()); if (event.isFullRerender()) { globalIOHandlerRepository.renderAll(); } diff --git a/src/main/java/cz/jzitnik/events/handlers/InventoryRerenderHandler.java b/game/src/main/java/cz/jzitnik/client/events/handlers/InventoryRerenderHandler.java similarity index 64% rename from src/main/java/cz/jzitnik/events/handlers/InventoryRerenderHandler.java rename to game/src/main/java/cz/jzitnik/client/events/handlers/InventoryRerenderHandler.java index 57efc34..2511276 100644 --- a/src/main/java/cz/jzitnik/events/handlers/InventoryRerenderHandler.java +++ b/game/src/main/java/cz/jzitnik/client/events/handlers/InventoryRerenderHandler.java @@ -1,13 +1,13 @@ -package cz.jzitnik.events.handlers; +package cz.jzitnik.client.events.handlers; import com.googlecode.lanterna.TerminalPosition; -import cz.jzitnik.annotations.EventHandler; -import cz.jzitnik.annotations.injectors.InjectDependency; -import cz.jzitnik.events.InventoryRerender; -import cz.jzitnik.events.RerenderScreen; -import cz.jzitnik.ui.Inventory; -import cz.jzitnik.utils.events.AbstractEventHandler; -import cz.jzitnik.utils.events.EventManager; +import cz.jzitnik.client.annotations.EventHandler; +import cz.jzitnik.client.annotations.injectors.InjectDependency; +import cz.jzitnik.client.events.InventoryRerender; +import cz.jzitnik.client.events.RerenderScreen; +import cz.jzitnik.client.ui.Inventory; +import cz.jzitnik.client.utils.events.AbstractEventHandler; +import cz.jzitnik.client.utils.events.EventManager; @EventHandler(InventoryRerender.class) public class InventoryRerenderHandler extends AbstractEventHandler { diff --git a/src/main/java/cz/jzitnik/events/handlers/KeyboardPressEventHandler.java b/game/src/main/java/cz/jzitnik/client/events/handlers/KeyboardPressEventHandler.java similarity index 55% rename from src/main/java/cz/jzitnik/events/handlers/KeyboardPressEventHandler.java rename to game/src/main/java/cz/jzitnik/client/events/handlers/KeyboardPressEventHandler.java index 0b4379d..980f0f3 100644 --- a/src/main/java/cz/jzitnik/events/handlers/KeyboardPressEventHandler.java +++ b/game/src/main/java/cz/jzitnik/client/events/handlers/KeyboardPressEventHandler.java @@ -1,12 +1,12 @@ -package cz.jzitnik.events.handlers; +package cz.jzitnik.client.events.handlers; -import cz.jzitnik.annotations.EventHandler; -import cz.jzitnik.annotations.injectors.InjectDependency; -import cz.jzitnik.annotations.injectors.InjectState; -import cz.jzitnik.events.*; -import cz.jzitnik.game.GameState; -import cz.jzitnik.utils.GlobalIOHandlerRepository; -import cz.jzitnik.utils.events.AbstractEventHandler; +import cz.jzitnik.client.annotations.EventHandler; +import cz.jzitnik.client.annotations.injectors.InjectDependency; +import cz.jzitnik.client.annotations.injectors.InjectState; +import cz.jzitnik.client.events.KeyboardPressEvent; +import cz.jzitnik.client.game.GameState; +import cz.jzitnik.client.utils.GlobalIOHandlerRepository; +import cz.jzitnik.client.utils.events.AbstractEventHandler; @EventHandler(KeyboardPressEvent.class) public class KeyboardPressEventHandler extends AbstractEventHandler { diff --git a/src/main/java/cz/jzitnik/events/handlers/MouseActionEventHandler.java b/game/src/main/java/cz/jzitnik/client/events/handlers/MouseActionEventHandler.java similarity index 73% rename from src/main/java/cz/jzitnik/events/handlers/MouseActionEventHandler.java rename to game/src/main/java/cz/jzitnik/client/events/handlers/MouseActionEventHandler.java index 1a5fd2c..1ee0b41 100644 --- a/src/main/java/cz/jzitnik/events/handlers/MouseActionEventHandler.java +++ b/game/src/main/java/cz/jzitnik/client/events/handlers/MouseActionEventHandler.java @@ -1,19 +1,19 @@ -package cz.jzitnik.events.handlers; +package cz.jzitnik.client.events.handlers; -import cz.jzitnik.annotations.EventHandler; -import cz.jzitnik.annotations.injectors.InjectConfig; -import cz.jzitnik.annotations.injectors.InjectDependency; -import cz.jzitnik.annotations.injectors.InjectState; -import cz.jzitnik.config.PlayerConfig; -import cz.jzitnik.events.MouseAction; -import cz.jzitnik.events.MouseMoveEvent; -import cz.jzitnik.game.GameState; -import cz.jzitnik.game.utils.Selectable; -import cz.jzitnik.states.RenderState; -import cz.jzitnik.utils.DependencyManager; -import cz.jzitnik.utils.UIRoomClickHandlerRepository; -import cz.jzitnik.utils.events.AbstractEventHandler; -import cz.jzitnik.utils.events.EventManager; +import cz.jzitnik.client.annotations.EventHandler; +import cz.jzitnik.client.annotations.injectors.InjectConfig; +import cz.jzitnik.client.annotations.injectors.InjectDependency; +import cz.jzitnik.client.annotations.injectors.InjectState; +import cz.jzitnik.client.config.PlayerConfig; +import cz.jzitnik.client.events.MouseAction; +import cz.jzitnik.client.events.MouseMoveEvent; +import cz.jzitnik.client.game.GameState; +import cz.jzitnik.client.game.utils.Selectable; +import cz.jzitnik.client.states.RenderState; +import cz.jzitnik.client.utils.DependencyManager; +import cz.jzitnik.client.utils.UIRoomClickHandlerRepository; +import cz.jzitnik.client.utils.events.AbstractEventHandler; +import cz.jzitnik.client.utils.events.EventManager; import java.util.Optional; import java.util.stream.Stream; diff --git a/src/main/java/cz/jzitnik/events/handlers/MouseMoveEventHandler.java b/game/src/main/java/cz/jzitnik/client/events/handlers/MouseMoveEventHandler.java similarity index 85% rename from src/main/java/cz/jzitnik/events/handlers/MouseMoveEventHandler.java rename to game/src/main/java/cz/jzitnik/client/events/handlers/MouseMoveEventHandler.java index f0b8976..dd4b13f 100644 --- a/src/main/java/cz/jzitnik/events/handlers/MouseMoveEventHandler.java +++ b/game/src/main/java/cz/jzitnik/client/events/handlers/MouseMoveEventHandler.java @@ -1,27 +1,27 @@ -package cz.jzitnik.events.handlers; +package cz.jzitnik.client.events.handlers; import com.googlecode.lanterna.TerminalPosition; import com.googlecode.lanterna.input.MouseActionType; -import cz.jzitnik.annotations.EventHandler; -import cz.jzitnik.annotations.injectors.InjectConfig; -import cz.jzitnik.annotations.injectors.InjectDependency; -import cz.jzitnik.annotations.injectors.InjectState; -import cz.jzitnik.config.Debugging; -import cz.jzitnik.config.PlayerConfig; -import cz.jzitnik.events.MouseAction; -import cz.jzitnik.events.MouseMoveEvent; -import cz.jzitnik.events.RerenderScreen; -import cz.jzitnik.game.GameRoom; -import cz.jzitnik.game.GameState; -import cz.jzitnik.game.Player; -import cz.jzitnik.game.ResourceManager; -import cz.jzitnik.game.utils.RoomCords; -import cz.jzitnik.game.utils.Selectable; -import cz.jzitnik.states.ScreenBuffer; -import cz.jzitnik.states.TerminalState; -import cz.jzitnik.utils.RerenderUtils; -import cz.jzitnik.utils.events.AbstractEventHandler; -import cz.jzitnik.utils.events.EventManager; +import cz.jzitnik.client.annotations.EventHandler; +import cz.jzitnik.client.annotations.injectors.InjectConfig; +import cz.jzitnik.client.annotations.injectors.InjectDependency; +import cz.jzitnik.client.annotations.injectors.InjectState; +import cz.jzitnik.client.config.Debugging; +import cz.jzitnik.client.config.PlayerConfig; +import cz.jzitnik.client.events.MouseAction; +import cz.jzitnik.client.events.MouseMoveEvent; +import cz.jzitnik.client.events.RerenderScreen; +import cz.jzitnik.client.game.GameRoom; +import cz.jzitnik.client.game.GameState; +import cz.jzitnik.client.game.Player; +import cz.jzitnik.client.game.ResourceManager; +import cz.jzitnik.common.models.coordinates.RoomCords; +import cz.jzitnik.client.game.utils.Selectable; +import cz.jzitnik.client.states.ScreenBuffer; +import cz.jzitnik.client.states.TerminalState; +import cz.jzitnik.client.utils.RerenderUtils; +import cz.jzitnik.client.utils.events.AbstractEventHandler; +import cz.jzitnik.client.utils.events.EventManager; import lombok.extern.slf4j.Slf4j; import java.awt.image.BufferedImage; @@ -177,10 +177,10 @@ public class MouseMoveEventHandler extends AbstractEventHandler currentRoom, room, player, - playerTexture, screenBuffer, resourceManager, - debugging + debugging, + gameState.getOtherPlayers() ); parts.add(new RerenderScreen.ScreenPart( diff --git a/src/main/java/cz/jzitnik/events/handlers/PlayerMoveEventHandler.java b/game/src/main/java/cz/jzitnik/client/events/handlers/PlayerMoveEventHandler.java similarity index 76% rename from src/main/java/cz/jzitnik/events/handlers/PlayerMoveEventHandler.java rename to game/src/main/java/cz/jzitnik/client/events/handlers/PlayerMoveEventHandler.java index bba05f7..7127b86 100644 --- a/src/main/java/cz/jzitnik/events/handlers/PlayerMoveEventHandler.java +++ b/game/src/main/java/cz/jzitnik/client/events/handlers/PlayerMoveEventHandler.java @@ -1,31 +1,27 @@ -package cz.jzitnik.events.handlers; +package cz.jzitnik.client.events.handlers; import com.googlecode.lanterna.TerminalPosition; import com.googlecode.lanterna.input.KeyStroke; -import cz.jzitnik.annotations.EventHandler; -import cz.jzitnik.annotations.injectors.InjectConfig; -import cz.jzitnik.annotations.injectors.InjectDependency; -import cz.jzitnik.annotations.injectors.InjectState; -import cz.jzitnik.config.Debugging; -import cz.jzitnik.config.PlayerConfig; -import cz.jzitnik.events.MouseMoveEvent; -import cz.jzitnik.events.PlayerMoveEvent; -import cz.jzitnik.events.RerenderScreen; -import cz.jzitnik.events.RoomChangeEvent; -import cz.jzitnik.game.GameRoom; -import cz.jzitnik.game.GameState; -import cz.jzitnik.game.Player; -import cz.jzitnik.game.ResourceManager; -import cz.jzitnik.game.utils.RoomCords; -import cz.jzitnik.states.RenderState; -import cz.jzitnik.states.ScreenBuffer; -import cz.jzitnik.states.PlayerMovementState; -import cz.jzitnik.states.TerminalState; -import cz.jzitnik.ui.Stats; -import cz.jzitnik.utils.RerenderUtils; -import cz.jzitnik.utils.events.AbstractEventHandler; -import cz.jzitnik.utils.events.Event; -import cz.jzitnik.utils.events.EventManager; +import cz.jzitnik.client.annotations.EventHandler; +import cz.jzitnik.client.annotations.injectors.InjectConfig; +import cz.jzitnik.client.annotations.injectors.InjectDependency; +import cz.jzitnik.client.annotations.injectors.InjectState; +import cz.jzitnik.client.config.Debugging; +import cz.jzitnik.client.config.PlayerConfig; +import cz.jzitnik.client.events.*; +import cz.jzitnik.client.game.*; +import cz.jzitnik.common.models.coordinates.RoomCords; +import cz.jzitnik.client.states.RenderState; +import cz.jzitnik.client.states.ScreenBuffer; +import cz.jzitnik.client.states.PlayerMovementState; +import cz.jzitnik.client.states.TerminalState; +import cz.jzitnik.client.ui.Stats; +import cz.jzitnik.client.utils.RerenderUtils; +import cz.jzitnik.client.utils.events.AbstractEventHandler; +import cz.jzitnik.client.utils.events.Event; +import cz.jzitnik.client.utils.events.EventManager; +import cz.jzitnik.common.socket.messages.player.PlayerMove; +import cz.jzitnik.common.socket.messages.player.PlayerRotation; import lombok.extern.slf4j.Slf4j; import java.awt.image.BufferedImage; @@ -79,46 +75,46 @@ public class PlayerMoveEventHandler extends AbstractEventHandler { if (originalPlayerY <= 10) { if (originalPlayerX >= 80 && originalPlayerX <= 105) { - player.setPlayerRotation(Player.PlayerRotation.BACK); + player.setPlayerRotation(PlayerRotation.BACK); eventManager.emitEvent(new RoomChangeEvent(FullRoomDrawHandler.DoorPosition.TOP)); } return; } playerCords.updateCordsWithColliders(currentRoom.getColliders(), player.getPlayerCords().getX(), playerCords.getY() - moveStep, player.getCollider()); - player.setPlayerRotation(Player.PlayerRotation.BACK); + player.setPlayerRotation(PlayerRotation.BACK); } case 'a' -> { if (originalPlayerX <= 30) { if (originalPlayerY >= 35 && originalPlayerY <= 65) { - player.setPlayerRotation(Player.PlayerRotation.LEFT); + player.setPlayerRotation(PlayerRotation.LEFT); eventManager.emitEvent(new RoomChangeEvent(FullRoomDrawHandler.DoorPosition.LEFT)); } return; } playerCords.updateCordsWithColliders(currentRoom.getColliders(), player.getPlayerCords().getX() - moveStep, playerCords.getY(), player.getCollider()); - player.setPlayerRotation(Player.PlayerRotation.LEFT); + player.setPlayerRotation(PlayerRotation.LEFT); } case 's' -> { if (originalPlayerY >= 110) { if (originalPlayerX >= 75 && originalPlayerX <= 105) { - player.setPlayerRotation(Player.PlayerRotation.FRONT); + player.setPlayerRotation(PlayerRotation.FRONT); eventManager.emitEvent(new RoomChangeEvent(FullRoomDrawHandler.DoorPosition.BOTTOM)); } return; } playerCords.updateCordsWithColliders(currentRoom.getColliders(), player.getPlayerCords().getX(), playerCords.getY() + moveStep, player.getCollider()); - player.setPlayerRotation(Player.PlayerRotation.FRONT); + player.setPlayerRotation(PlayerRotation.FRONT); } case 'd' -> { if (originalPlayerX >= 155) { if (originalPlayerY >= 40 && originalPlayerY <= 60) { - player.setPlayerRotation(Player.PlayerRotation.RIGHT); + player.setPlayerRotation(PlayerRotation.RIGHT); eventManager.emitEvent(new RoomChangeEvent(FullRoomDrawHandler.DoorPosition.RIGHT)); } return; } playerCords.updateCordsWithColliders(currentRoom.getColliders(), player.getPlayerCords().getX() + moveStep, playerCords.getY(), player.getCollider()); - player.setPlayerRotation(Player.PlayerRotation.RIGHT); + player.setPlayerRotation(PlayerRotation.RIGHT); } } playerMovementState.setLastMovement(System.currentTimeMillis()); @@ -143,9 +139,10 @@ public class PlayerMoveEventHandler extends AbstractEventHandler { diff --git a/src/main/java/cz/jzitnik/events/handlers/RerenderPartHandler.java b/game/src/main/java/cz/jzitnik/client/events/handlers/RerenderPartHandler.java similarity index 64% rename from src/main/java/cz/jzitnik/events/handlers/RerenderPartHandler.java rename to game/src/main/java/cz/jzitnik/client/events/handlers/RerenderPartHandler.java index b2bc6ee..9bf1d76 100644 --- a/src/main/java/cz/jzitnik/events/handlers/RerenderPartHandler.java +++ b/game/src/main/java/cz/jzitnik/client/events/handlers/RerenderPartHandler.java @@ -1,22 +1,22 @@ -package cz.jzitnik.events.handlers; +package cz.jzitnik.client.events.handlers; import com.googlecode.lanterna.TerminalPosition; -import cz.jzitnik.annotations.EventHandler; -import cz.jzitnik.annotations.injectors.InjectConfig; -import cz.jzitnik.annotations.injectors.InjectDependency; -import cz.jzitnik.annotations.injectors.InjectState; -import cz.jzitnik.config.Debugging; -import cz.jzitnik.events.RerenderPart; -import cz.jzitnik.events.RerenderScreen; -import cz.jzitnik.game.GameRoom; -import cz.jzitnik.game.GameState; -import cz.jzitnik.game.ResourceManager; -import cz.jzitnik.game.utils.RoomCords; -import cz.jzitnik.states.ScreenBuffer; -import cz.jzitnik.states.TerminalState; -import cz.jzitnik.utils.RerenderUtils; -import cz.jzitnik.utils.events.AbstractEventHandler; -import cz.jzitnik.utils.events.EventManager; +import cz.jzitnik.client.annotations.EventHandler; +import cz.jzitnik.client.annotations.injectors.InjectConfig; +import cz.jzitnik.client.annotations.injectors.InjectDependency; +import cz.jzitnik.client.annotations.injectors.InjectState; +import cz.jzitnik.client.config.Debugging; +import cz.jzitnik.client.events.RerenderPart; +import cz.jzitnik.client.events.RerenderScreen; +import cz.jzitnik.client.game.GameRoom; +import cz.jzitnik.client.game.GameState; +import cz.jzitnik.client.game.ResourceManager; +import cz.jzitnik.common.models.coordinates.RoomCords; +import cz.jzitnik.client.states.ScreenBuffer; +import cz.jzitnik.client.states.TerminalState; +import cz.jzitnik.client.utils.RerenderUtils; +import cz.jzitnik.client.utils.events.AbstractEventHandler; +import cz.jzitnik.client.utils.events.EventManager; import java.awt.image.BufferedImage; @@ -62,10 +62,10 @@ public class RerenderPartHandler extends AbstractEventHandler { currentRoom, room, gameState.getPlayer(), - gameState.getPlayer().getTexture(resourceManager), screenBuffer, resourceManager, - debugging + debugging, + gameState.getOtherPlayers() ); eventManager.emitEvent( diff --git a/src/main/java/cz/jzitnik/events/handlers/RoomChangeEventHandler.java b/game/src/main/java/cz/jzitnik/client/events/handlers/RoomChangeEventHandler.java similarity index 60% rename from src/main/java/cz/jzitnik/events/handlers/RoomChangeEventHandler.java rename to game/src/main/java/cz/jzitnik/client/events/handlers/RoomChangeEventHandler.java index dfdd339..34a762b 100644 --- a/src/main/java/cz/jzitnik/events/handlers/RoomChangeEventHandler.java +++ b/game/src/main/java/cz/jzitnik/client/events/handlers/RoomChangeEventHandler.java @@ -1,16 +1,17 @@ -package cz.jzitnik.events.handlers; +package cz.jzitnik.client.events.handlers; -import cz.jzitnik.annotations.EventHandler; -import cz.jzitnik.annotations.injectors.InjectDependency; -import cz.jzitnik.annotations.injectors.InjectState; -import cz.jzitnik.events.FullRoomDraw; -import cz.jzitnik.events.RoomChangeEvent; -import cz.jzitnik.game.GameRoom; -import cz.jzitnik.game.GameState; -import cz.jzitnik.game.utils.RoomCords; -import cz.jzitnik.utils.events.AbstractEventHandler; -import cz.jzitnik.utils.events.EventManager; -import cz.jzitnik.utils.roomtasks.RoomTaskScheduler; +import cz.jzitnik.client.annotations.EventHandler; +import cz.jzitnik.client.annotations.injectors.InjectDependency; +import cz.jzitnik.client.annotations.injectors.InjectState; +import cz.jzitnik.client.events.RoomChangeEvent; +import cz.jzitnik.client.events.SendSocketMessageEvent; +import cz.jzitnik.client.game.GameRoom; +import cz.jzitnik.client.game.GameState; +import cz.jzitnik.common.models.coordinates.RoomCords; +import cz.jzitnik.client.utils.events.AbstractEventHandler; +import cz.jzitnik.client.utils.events.EventManager; +import cz.jzitnik.client.utils.roomtasks.RoomTaskScheduler; +import cz.jzitnik.common.socket.messages.room.MovePlayerRoom; import lombok.extern.slf4j.Slf4j; import java.util.concurrent.Executors; @@ -31,6 +32,7 @@ public class RoomChangeEventHandler extends AbstractEventHandler currentRoom.getLeft(); @@ -50,10 +52,9 @@ public class RoomChangeEventHandler extends AbstractEventHandler playerCords.updateCords(playerCords.getX(), 10); } + eventManager.emitEvent(new SendSocketMessageEvent(new MovePlayerRoom(newRoom.getId(), oldCords, playerCords))); + gameState.setCurrentRoom(newRoom); - scheduler.schedule(() -> { - roomTaskScheduler.setupNewSchedulers(newRoom); - }, 200, TimeUnit.MILLISECONDS); - eventManager.emitEvent(new FullRoomDraw()); + scheduler.schedule(() -> roomTaskScheduler.setupNewSchedulers(newRoom), 200, TimeUnit.MILLISECONDS); } } diff --git a/game/src/main/java/cz/jzitnik/client/events/handlers/SendSocketMessageEventHandler.java b/game/src/main/java/cz/jzitnik/client/events/handlers/SendSocketMessageEventHandler.java new file mode 100644 index 0000000..d5be9c4 --- /dev/null +++ b/game/src/main/java/cz/jzitnik/client/events/handlers/SendSocketMessageEventHandler.java @@ -0,0 +1,24 @@ +package cz.jzitnik.client.events.handlers; + +import cz.jzitnik.client.annotations.EventHandler; +import cz.jzitnik.client.annotations.injectors.InjectDependency; +import cz.jzitnik.client.events.SendSocketMessageEvent; +import cz.jzitnik.client.socket.Client; +import cz.jzitnik.client.utils.events.AbstractEventHandler; + +import java.io.IOException; + +@EventHandler(SendSocketMessageEvent.class) +public class SendSocketMessageEventHandler extends AbstractEventHandler { + @InjectDependency + private Client client; + + @Override + public void handle(SendSocketMessageEvent event) { + try { + client.send(event.message()); + } catch (IOException e) { + throw new RuntimeException(e); + } + } +} diff --git a/src/main/java/cz/jzitnik/events/handlers/TerminalResizeEventHandler.java b/game/src/main/java/cz/jzitnik/client/events/handlers/TerminalResizeEventHandler.java similarity index 69% rename from src/main/java/cz/jzitnik/events/handlers/TerminalResizeEventHandler.java rename to game/src/main/java/cz/jzitnik/client/events/handlers/TerminalResizeEventHandler.java index 208e4c9..c9ca2e2 100644 --- a/src/main/java/cz/jzitnik/events/handlers/TerminalResizeEventHandler.java +++ b/game/src/main/java/cz/jzitnik/client/events/handlers/TerminalResizeEventHandler.java @@ -1,18 +1,18 @@ -package cz.jzitnik.events.handlers; +package cz.jzitnik.client.events.handlers; import com.googlecode.lanterna.TerminalSize; -import cz.jzitnik.annotations.EventHandler; -import cz.jzitnik.annotations.injectors.InjectDependency; -import cz.jzitnik.annotations.injectors.InjectState; -import cz.jzitnik.events.FullRoomDraw; -import cz.jzitnik.events.TerminalResizeEvent; -import cz.jzitnik.game.GameState; -import cz.jzitnik.states.ScreenBuffer; -import cz.jzitnik.ui.pixels.AlphaPixel; -import cz.jzitnik.ui.pixels.Empty; -import cz.jzitnik.ui.pixels.Pixel; -import cz.jzitnik.utils.events.AbstractEventHandler; -import cz.jzitnik.utils.events.EventManager; +import cz.jzitnik.client.annotations.EventHandler; +import cz.jzitnik.client.annotations.injectors.InjectDependency; +import cz.jzitnik.client.annotations.injectors.InjectState; +import cz.jzitnik.client.events.FullRoomDraw; +import cz.jzitnik.client.events.TerminalResizeEvent; +import cz.jzitnik.client.game.GameState; +import cz.jzitnik.client.states.ScreenBuffer; +import cz.jzitnik.client.ui.pixels.AlphaPixel; +import cz.jzitnik.client.ui.pixels.Empty; +import cz.jzitnik.client.ui.pixels.Pixel; +import cz.jzitnik.client.utils.events.AbstractEventHandler; +import cz.jzitnik.client.utils.events.EventManager; import lombok.extern.slf4j.Slf4j; @Slf4j diff --git a/src/main/java/cz/jzitnik/events/handlers/TerminalTooSmallEventHandler.java b/game/src/main/java/cz/jzitnik/client/events/handlers/TerminalTooSmallEventHandler.java similarity index 85% rename from src/main/java/cz/jzitnik/events/handlers/TerminalTooSmallEventHandler.java rename to game/src/main/java/cz/jzitnik/client/events/handlers/TerminalTooSmallEventHandler.java index a4b4f6b..2a2ac6a 100644 --- a/src/main/java/cz/jzitnik/events/handlers/TerminalTooSmallEventHandler.java +++ b/game/src/main/java/cz/jzitnik/client/events/handlers/TerminalTooSmallEventHandler.java @@ -1,15 +1,15 @@ -package cz.jzitnik.events.handlers; +package cz.jzitnik.client.events.handlers; import com.googlecode.lanterna.SGR; import com.googlecode.lanterna.TerminalSize; import com.googlecode.lanterna.TextColor; import com.googlecode.lanterna.screen.Screen; import com.googlecode.lanterna.screen.TerminalScreen; -import cz.jzitnik.annotations.EventHandler; -import cz.jzitnik.annotations.injectors.InjectState; -import cz.jzitnik.events.TerminalTooSmallEvent; -import cz.jzitnik.states.TerminalState; -import cz.jzitnik.utils.events.AbstractEventHandler; +import cz.jzitnik.client.annotations.EventHandler; +import cz.jzitnik.client.annotations.injectors.InjectState; +import cz.jzitnik.client.events.TerminalTooSmallEvent; +import cz.jzitnik.client.states.TerminalState; +import cz.jzitnik.client.utils.events.AbstractEventHandler; import java.io.IOException; import java.util.EnumSet; diff --git a/src/main/java/cz/jzitnik/game/Constants.java b/game/src/main/java/cz/jzitnik/client/game/Constants.java similarity index 82% rename from src/main/java/cz/jzitnik/game/Constants.java rename to game/src/main/java/cz/jzitnik/client/game/Constants.java index 55e0f8c..607479c 100644 --- a/src/main/java/cz/jzitnik/game/Constants.java +++ b/game/src/main/java/cz/jzitnik/client/game/Constants.java @@ -1,4 +1,4 @@ -package cz.jzitnik.game; +package cz.jzitnik.client.game; import com.googlecode.lanterna.TextColor; diff --git a/game/src/main/java/cz/jzitnik/client/game/GamePlayer.java b/game/src/main/java/cz/jzitnik/client/game/GamePlayer.java new file mode 100644 index 0000000..4e27c0a --- /dev/null +++ b/game/src/main/java/cz/jzitnik/client/game/GamePlayer.java @@ -0,0 +1,10 @@ +package cz.jzitnik.client.game; + +import cz.jzitnik.common.models.coordinates.RoomCords; + +import java.awt.image.BufferedImage; + +public interface GamePlayer { + RoomCords getPlayerCords(); + BufferedImage getTexture(ResourceManager resourceManager); +} diff --git a/src/main/java/cz/jzitnik/game/GameRoom.java b/game/src/main/java/cz/jzitnik/client/game/GameRoom.java similarity index 82% rename from src/main/java/cz/jzitnik/game/GameRoom.java rename to game/src/main/java/cz/jzitnik/client/game/GameRoom.java index 40642b8..d73205a 100644 --- a/src/main/java/cz/jzitnik/game/GameRoom.java +++ b/game/src/main/java/cz/jzitnik/client/game/GameRoom.java @@ -1,11 +1,12 @@ -package cz.jzitnik.game; +package cz.jzitnik.client.game; import com.fasterxml.jackson.annotation.*; -import cz.jzitnik.game.mobs.Mob; -import cz.jzitnik.game.objects.DroppedItem; -import cz.jzitnik.game.objects.GameObject; -import cz.jzitnik.ui.pixels.Empty; -import cz.jzitnik.ui.pixels.Pixel; +import cz.jzitnik.client.game.mobs.Mob; +import cz.jzitnik.client.game.objects.DroppedItem; +import cz.jzitnik.client.game.objects.GameObject; +import cz.jzitnik.client.ui.pixels.Empty; +import cz.jzitnik.client.ui.pixels.Pixel; +import cz.jzitnik.common.models.coordinates.RoomPart; import lombok.Getter; import java.util.ArrayList; @@ -31,7 +32,7 @@ public class GameRoom { @JsonIgnore private final Set droppedItems = new HashSet<>(); @JsonIgnore - private final List colliders = new ArrayList<>(); + private final List colliders = new ArrayList<>(); private GameRoom left; private GameRoom right; @@ -42,7 +43,7 @@ public class GameRoom { public GameRoom( @JsonProperty("id") String id, @JsonProperty("objects") List objects, - @JsonProperty("colliders") List colliders, + @JsonProperty("colliders") List colliders, @JsonProperty("mobs") List mobs, @JsonProperty("texture") ResourceManager.Resource texture ) { diff --git a/game/src/main/java/cz/jzitnik/client/game/GameState.java b/game/src/main/java/cz/jzitnik/client/game/GameState.java new file mode 100644 index 0000000..67027ad --- /dev/null +++ b/game/src/main/java/cz/jzitnik/client/game/GameState.java @@ -0,0 +1,54 @@ +package cz.jzitnik.client.game; + +import cz.jzitnik.client.annotations.State; +import cz.jzitnik.client.game.objects.Interactable; +import cz.jzitnik.client.screens.Screen; +import cz.jzitnik.client.utils.DependencyManager; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import lombok.Setter; + +import java.util.ArrayList; +import java.util.List; + +@RequiredArgsConstructor +@State +public class GameState { + private final DependencyManager dependencyManager; // Maybe transient in the future + + @Getter + @Setter + private GameRoom currentRoom; + + @Getter + @Setter + private List allRooms; + + @Getter + @Setter + private Player player; + + private final List otherPlayers = new ArrayList<>(); + + public List getOtherPlayers() { + return otherPlayers.stream().filter(OtherPlayer::isVisible).toList(); + } + + public List getAllOtherPlayers() { + return otherPlayers; + } + + @Getter + @Setter + private Interactable interacting; + + @Getter + private Screen screen; + + public void setScreen(Screen screen) { + if (screen != null) { + dependencyManager.inject(screen); + } + this.screen = screen; + } +} diff --git a/game/src/main/java/cz/jzitnik/client/game/OtherPlayer.java b/game/src/main/java/cz/jzitnik/client/game/OtherPlayer.java new file mode 100644 index 0000000..d90b855 --- /dev/null +++ b/game/src/main/java/cz/jzitnik/client/game/OtherPlayer.java @@ -0,0 +1,41 @@ +package cz.jzitnik.client.game; + +import cz.jzitnik.client.game.mobs.HittableMob; +import cz.jzitnik.common.models.coordinates.RoomCords; +import cz.jzitnik.common.models.player.PlayerCreation; +import cz.jzitnik.common.socket.messages.player.PlayerRotation; +import lombok.Getter; +import lombok.Setter; + +import java.awt.image.BufferedImage; + +@Getter +public class OtherPlayer implements GamePlayer { + private final int id; + private boolean hitAnimationOn = false; + private final RoomCords playerCords; + @Setter + private PlayerRotation playerRotation = PlayerRotation.FRONT; + @Setter + private boolean visible; + + public OtherPlayer(PlayerCreation playerCreation) { + this.id = playerCreation.getId(); + this.playerCords = playerCreation.getPlayerCords(); + } + + public BufferedImage getTexture(ResourceManager resourceManager) { + BufferedImage resource = resourceManager.getResource(switch (playerRotation) { + case FRONT -> ResourceManager.Resource.PLAYER_FRONT; + case BACK -> ResourceManager.Resource.PLAYER_BACK; + case LEFT -> ResourceManager.Resource.PLAYER_LEFT; + case RIGHT -> ResourceManager.Resource.PLAYER_RIGHT; + }); + + if (hitAnimationOn) { + return HittableMob.applyRedFactor(resource); + } + + return resource; + } +} diff --git a/src/main/java/cz/jzitnik/game/Player.java b/game/src/main/java/cz/jzitnik/client/game/Player.java similarity index 81% rename from src/main/java/cz/jzitnik/game/Player.java rename to game/src/main/java/cz/jzitnik/client/game/Player.java index 5ae9172..5f01c25 100644 --- a/src/main/java/cz/jzitnik/game/Player.java +++ b/game/src/main/java/cz/jzitnik/client/game/Player.java @@ -1,16 +1,17 @@ -package cz.jzitnik.game; +package cz.jzitnik.client.game; -import com.fasterxml.jackson.annotation.JsonCreator; -import com.fasterxml.jackson.annotation.JsonProperty; -import cz.jzitnik.events.RerenderPart; -import cz.jzitnik.game.items.GameItem; -import cz.jzitnik.game.items.types.interfaces.WeaponInterface; -import cz.jzitnik.game.mobs.HittableMob; -import cz.jzitnik.game.utils.RoomCords; -import cz.jzitnik.ui.Inventory; -import cz.jzitnik.utils.DependencyManager; -import cz.jzitnik.utils.events.Event; -import cz.jzitnik.utils.events.EventManager; +import cz.jzitnik.client.events.RerenderPart; +import cz.jzitnik.client.game.items.GameItem; +import cz.jzitnik.client.game.items.types.interfaces.WeaponInterface; +import cz.jzitnik.client.game.mobs.HittableMob; +import cz.jzitnik.common.models.coordinates.RoomPart; +import cz.jzitnik.common.models.coordinates.RoomCords; +import cz.jzitnik.client.ui.Inventory; +import cz.jzitnik.client.utils.DependencyManager; +import cz.jzitnik.client.utils.events.Event; +import cz.jzitnik.client.utils.events.EventManager; +import cz.jzitnik.common.models.player.PlayerCreation; +import cz.jzitnik.common.socket.messages.player.PlayerRotation; import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; @@ -23,13 +24,14 @@ import java.util.concurrent.TimeUnit; @Getter @Slf4j -public class Player { +public class Player implements GamePlayer { + private final int id; public static final int MAX_STAMINA = 20; public static final int MAX_HEALTH = 30; private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); private final RoomCords playerCords; - private final GameRoomPart collider; + private final RoomPart collider; private final GameItem[] inventory = new GameItem[Inventory.ITEMS_X * Inventory.ITEMS_Y]; @Setter private PlayerRotation playerRotation = PlayerRotation.FRONT; @@ -41,13 +43,10 @@ public class Player { private boolean hitAnimationOn = false; private ScheduledFuture currentTimeoutHitAnimation = null; - @JsonCreator - public Player( - @JsonProperty("playerCords") RoomCords playerCords, - @JsonProperty("collider") GameRoomPart collider - ) { - this.playerCords = playerCords; - this.collider = collider; + public Player(PlayerCreation playerCreation) { + this.playerCords = playerCreation.getPlayerCords(); + this.collider = playerCreation.getCollider(); + this.id = playerCreation.getId(); } public void increaseStamina() { @@ -157,7 +156,4 @@ public class Player { }, delayMs, TimeUnit.MILLISECONDS); } - public enum PlayerRotation { - FRONT, BACK, LEFT, RIGHT - } } diff --git a/src/main/java/cz/jzitnik/game/ResourceManager.java b/game/src/main/java/cz/jzitnik/client/game/ResourceManager.java similarity index 93% rename from src/main/java/cz/jzitnik/game/ResourceManager.java rename to game/src/main/java/cz/jzitnik/client/game/ResourceManager.java index 25e2b87..abf3a37 100644 --- a/src/main/java/cz/jzitnik/game/ResourceManager.java +++ b/game/src/main/java/cz/jzitnik/client/game/ResourceManager.java @@ -1,7 +1,7 @@ -package cz.jzitnik.game; +package cz.jzitnik.client.game; -import cz.jzitnik.annotations.Dependency; -import cz.jzitnik.annotations.injectors.InjectDependency; +import cz.jzitnik.client.annotations.Dependency; +import cz.jzitnik.client.annotations.injectors.InjectDependency; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/src/main/java/cz/jzitnik/game/dialog/Dialog.java b/game/src/main/java/cz/jzitnik/client/game/dialog/Dialog.java similarity index 79% rename from src/main/java/cz/jzitnik/game/dialog/Dialog.java rename to game/src/main/java/cz/jzitnik/client/game/dialog/Dialog.java index 8956269..b2da3b0 100644 --- a/src/main/java/cz/jzitnik/game/dialog/Dialog.java +++ b/game/src/main/java/cz/jzitnik/client/game/dialog/Dialog.java @@ -1,6 +1,6 @@ -package cz.jzitnik.game.dialog; +package cz.jzitnik.client.game.dialog; -import cz.jzitnik.utils.events.Event; +import cz.jzitnik.client.utils.events.Event; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.RequiredArgsConstructor; diff --git a/src/main/java/cz/jzitnik/game/dialog/OnEnd.java b/game/src/main/java/cz/jzitnik/client/game/dialog/OnEnd.java similarity index 88% rename from src/main/java/cz/jzitnik/game/dialog/OnEnd.java rename to game/src/main/java/cz/jzitnik/client/game/dialog/OnEnd.java index 0bfd4e6..efa2a77 100644 --- a/src/main/java/cz/jzitnik/game/dialog/OnEnd.java +++ b/game/src/main/java/cz/jzitnik/client/game/dialog/OnEnd.java @@ -1,4 +1,4 @@ -package cz.jzitnik.game.dialog; +package cz.jzitnik.client.game.dialog; public interface OnEnd { record RunCode(Runnable runnable, OnEnd onEnd) implements OnEnd {} diff --git a/src/main/java/cz/jzitnik/game/exceptions/InvalidCoordinatesException.java b/game/src/main/java/cz/jzitnik/client/game/exceptions/InvalidCoordinatesException.java similarity index 83% rename from src/main/java/cz/jzitnik/game/exceptions/InvalidCoordinatesException.java rename to game/src/main/java/cz/jzitnik/client/game/exceptions/InvalidCoordinatesException.java index 3383b2f..5b53a54 100644 --- a/src/main/java/cz/jzitnik/game/exceptions/InvalidCoordinatesException.java +++ b/game/src/main/java/cz/jzitnik/client/game/exceptions/InvalidCoordinatesException.java @@ -1,4 +1,4 @@ -package cz.jzitnik.game.exceptions; +package cz.jzitnik.client.game.exceptions; public class InvalidCoordinatesException extends RuntimeException { public InvalidCoordinatesException(String message) { diff --git a/src/main/java/cz/jzitnik/game/items/GameItem.java b/game/src/main/java/cz/jzitnik/client/game/items/GameItem.java similarity index 71% rename from src/main/java/cz/jzitnik/game/items/GameItem.java rename to game/src/main/java/cz/jzitnik/client/game/items/GameItem.java index 1730d05..6538c9f 100644 --- a/src/main/java/cz/jzitnik/game/items/GameItem.java +++ b/game/src/main/java/cz/jzitnik/client/game/items/GameItem.java @@ -1,9 +1,9 @@ -package cz.jzitnik.game.items; +package cz.jzitnik.client.game.items; import com.fasterxml.jackson.annotation.*; -import cz.jzitnik.game.ResourceManager; -import cz.jzitnik.game.items.types.ItemType; -import cz.jzitnik.game.utils.Renderable; +import cz.jzitnik.client.game.ResourceManager; +import cz.jzitnik.client.game.items.types.ItemType; +import cz.jzitnik.client.game.utils.Renderable; import lombok.Getter; import java.awt.image.BufferedImage; @@ -14,14 +14,17 @@ public class GameItem implements Renderable { @JsonIgnore private final BufferedImage texture; private final String name; + private final int id; @JsonCreator public GameItem( + @JsonProperty("id") int id, @JsonProperty("name") String name, @JsonProperty("type") ItemType type, @JsonProperty("texture") ResourceManager.Resource resource, @JacksonInject ResourceManager resourceManager ) { + this.id = id; this.name = name; this.type = type; this.texture = resourceManager.getResource(resource); diff --git a/src/main/java/cz/jzitnik/game/items/types/InteractableItem.java b/game/src/main/java/cz/jzitnik/client/game/items/types/InteractableItem.java similarity index 59% rename from src/main/java/cz/jzitnik/game/items/types/InteractableItem.java rename to game/src/main/java/cz/jzitnik/client/game/items/types/InteractableItem.java index a7e4402..f3c28cd 100644 --- a/src/main/java/cz/jzitnik/game/items/types/InteractableItem.java +++ b/game/src/main/java/cz/jzitnik/client/game/items/types/InteractableItem.java @@ -1,7 +1,7 @@ -package cz.jzitnik.game.items.types; +package cz.jzitnik.client.game.items.types; -import cz.jzitnik.utils.DependencyManager; -import cz.jzitnik.utils.StateManager; +import cz.jzitnik.client.utils.DependencyManager; +import cz.jzitnik.client.utils.StateManager; public interface InteractableItem { InteractableItemResponse interact(DependencyManager dependencyManager, StateManager stateManager); diff --git a/src/main/java/cz/jzitnik/game/items/types/ItemType.java b/game/src/main/java/cz/jzitnik/client/game/items/types/ItemType.java similarity index 72% rename from src/main/java/cz/jzitnik/game/items/types/ItemType.java rename to game/src/main/java/cz/jzitnik/client/game/items/types/ItemType.java index d84751d..0a5610e 100644 --- a/src/main/java/cz/jzitnik/game/items/types/ItemType.java +++ b/game/src/main/java/cz/jzitnik/client/game/items/types/ItemType.java @@ -1,9 +1,9 @@ -package cz.jzitnik.game.items.types; +package cz.jzitnik.client.game.items.types; import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.annotation.JsonTypeInfo; -import cz.jzitnik.game.items.types.food.Food; -import cz.jzitnik.game.items.types.weapons.Sword; +import cz.jzitnik.client.game.items.types.food.Food; +import cz.jzitnik.client.game.items.types.weapons.Sword; @JsonTypeInfo( use = JsonTypeInfo.Id.NAME, diff --git a/src/main/java/cz/jzitnik/game/items/types/food/Food.java b/game/src/main/java/cz/jzitnik/client/game/items/types/food/Food.java similarity index 69% rename from src/main/java/cz/jzitnik/game/items/types/food/Food.java rename to game/src/main/java/cz/jzitnik/client/game/items/types/food/Food.java index 18a1e95..45902d2 100644 --- a/src/main/java/cz/jzitnik/game/items/types/food/Food.java +++ b/game/src/main/java/cz/jzitnik/client/game/items/types/food/Food.java @@ -1,14 +1,14 @@ -package cz.jzitnik.game.items.types.food; +package cz.jzitnik.client.game.items.types.food; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; -import cz.jzitnik.events.RenderStats; -import cz.jzitnik.game.GameState; -import cz.jzitnik.game.items.types.InteractableItem; -import cz.jzitnik.game.items.types.ItemType; -import cz.jzitnik.utils.DependencyManager; -import cz.jzitnik.utils.StateManager; -import cz.jzitnik.utils.events.EventManager; +import cz.jzitnik.client.events.RenderStats; +import cz.jzitnik.client.game.GameState; +import cz.jzitnik.client.game.items.types.InteractableItem; +import cz.jzitnik.client.game.items.types.ItemType; +import cz.jzitnik.client.utils.DependencyManager; +import cz.jzitnik.client.utils.StateManager; +import cz.jzitnik.client.utils.events.EventManager; public class Food implements InteractableItem, ItemType { private final int addHealth; diff --git a/src/main/java/cz/jzitnik/game/items/types/interfaces/WeaponInterface.java b/game/src/main/java/cz/jzitnik/client/game/items/types/interfaces/WeaponInterface.java similarity index 53% rename from src/main/java/cz/jzitnik/game/items/types/interfaces/WeaponInterface.java rename to game/src/main/java/cz/jzitnik/client/game/items/types/interfaces/WeaponInterface.java index 3e7d70c..e55352b 100644 --- a/src/main/java/cz/jzitnik/game/items/types/interfaces/WeaponInterface.java +++ b/game/src/main/java/cz/jzitnik/client/game/items/types/interfaces/WeaponInterface.java @@ -1,4 +1,4 @@ -package cz.jzitnik.game.items.types.interfaces; +package cz.jzitnik.client.game.items.types.interfaces; public interface WeaponInterface { int getDamageDeal(); diff --git a/src/main/java/cz/jzitnik/game/items/types/weapons/Sword.java b/game/src/main/java/cz/jzitnik/client/game/items/types/weapons/Sword.java similarity index 84% rename from src/main/java/cz/jzitnik/game/items/types/weapons/Sword.java rename to game/src/main/java/cz/jzitnik/client/game/items/types/weapons/Sword.java index bf7026a..0b66d23 100644 --- a/src/main/java/cz/jzitnik/game/items/types/weapons/Sword.java +++ b/game/src/main/java/cz/jzitnik/client/game/items/types/weapons/Sword.java @@ -1,4 +1,4 @@ -package cz.jzitnik.game.items.types.weapons; +package cz.jzitnik.client.game.items.types.weapons; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; diff --git a/src/main/java/cz/jzitnik/game/items/types/weapons/Weapon.java b/game/src/main/java/cz/jzitnik/client/game/items/types/weapons/Weapon.java similarity index 66% rename from src/main/java/cz/jzitnik/game/items/types/weapons/Weapon.java rename to game/src/main/java/cz/jzitnik/client/game/items/types/weapons/Weapon.java index 594e163..9ff2e59 100644 --- a/src/main/java/cz/jzitnik/game/items/types/weapons/Weapon.java +++ b/game/src/main/java/cz/jzitnik/client/game/items/types/weapons/Weapon.java @@ -1,7 +1,7 @@ -package cz.jzitnik.game.items.types.weapons; +package cz.jzitnik.client.game.items.types.weapons; -import cz.jzitnik.game.items.types.ItemType; -import cz.jzitnik.game.items.types.interfaces.WeaponInterface; +import cz.jzitnik.client.game.items.types.ItemType; +import cz.jzitnik.client.game.items.types.interfaces.WeaponInterface; import lombok.AllArgsConstructor; @AllArgsConstructor diff --git a/src/main/java/cz/jzitnik/game/mobs/DialogMob.java b/game/src/main/java/cz/jzitnik/client/game/mobs/DialogMob.java similarity index 54% rename from src/main/java/cz/jzitnik/game/mobs/DialogMob.java rename to game/src/main/java/cz/jzitnik/client/game/mobs/DialogMob.java index 63c03ff..308904f 100644 --- a/src/main/java/cz/jzitnik/game/mobs/DialogMob.java +++ b/game/src/main/java/cz/jzitnik/client/game/mobs/DialogMob.java @@ -1,13 +1,13 @@ -package cz.jzitnik.game.mobs; +package cz.jzitnik.client.game.mobs; -import cz.jzitnik.annotations.injectors.InjectDependency; -import cz.jzitnik.annotations.injectors.InjectState; -import cz.jzitnik.game.GameRoomPart; -import cz.jzitnik.game.dialog.Dialog; -import cz.jzitnik.game.mobs.tasks.MobRoomTask; -import cz.jzitnik.game.utils.RoomCords; -import cz.jzitnik.states.DialogState; -import cz.jzitnik.utils.events.EventManager; +import cz.jzitnik.client.annotations.injectors.InjectDependency; +import cz.jzitnik.client.annotations.injectors.InjectState; +import cz.jzitnik.common.models.coordinates.RoomPart; +import cz.jzitnik.client.game.dialog.Dialog; +import cz.jzitnik.client.game.mobs.tasks.MobRoomTask; +import cz.jzitnik.common.models.coordinates.RoomCords; +import cz.jzitnik.client.states.DialogState; +import cz.jzitnik.client.utils.events.EventManager; import lombok.extern.slf4j.Slf4j; import java.awt.image.BufferedImage; @@ -16,7 +16,7 @@ import java.awt.image.BufferedImage; public abstract class DialogMob extends Mob { protected Dialog dialog; - public DialogMob(BufferedImage texture, MobRoomTask[] tasks, RoomCords cords, GameRoomPart collider, Dialog dialog) { + public DialogMob(BufferedImage texture, MobRoomTask[] tasks, RoomCords cords, RoomPart collider, Dialog dialog) { super(texture, tasks, cords, collider); this.dialog = dialog; } diff --git a/src/main/java/cz/jzitnik/game/mobs/HittableMob.java b/game/src/main/java/cz/jzitnik/client/game/mobs/HittableMob.java similarity index 84% rename from src/main/java/cz/jzitnik/game/mobs/HittableMob.java rename to game/src/main/java/cz/jzitnik/client/game/mobs/HittableMob.java index 85b2799..9bfe88f 100644 --- a/src/main/java/cz/jzitnik/game/mobs/HittableMob.java +++ b/game/src/main/java/cz/jzitnik/client/game/mobs/HittableMob.java @@ -1,15 +1,15 @@ -package cz.jzitnik.game.mobs; +package cz.jzitnik.client.game.mobs; -import cz.jzitnik.annotations.injectors.InjectDependency; -import cz.jzitnik.annotations.injectors.InjectState; -import cz.jzitnik.events.RerenderPart; -import cz.jzitnik.game.GameRoomPart; -import cz.jzitnik.game.GameState; -import cz.jzitnik.game.mobs.tasks.MobRoomTask; -import cz.jzitnik.game.utils.RoomCords; -import cz.jzitnik.utils.events.EventManager; -import cz.jzitnik.utils.roomtasks.RoomTask; -import cz.jzitnik.utils.roomtasks.RoomTaskScheduler; +import cz.jzitnik.client.annotations.injectors.InjectDependency; +import cz.jzitnik.client.annotations.injectors.InjectState; +import cz.jzitnik.client.events.RerenderPart; +import cz.jzitnik.common.models.coordinates.RoomPart; +import cz.jzitnik.client.game.GameState; +import cz.jzitnik.client.game.mobs.tasks.MobRoomTask; +import cz.jzitnik.common.models.coordinates.RoomCords; +import cz.jzitnik.client.utils.events.EventManager; +import cz.jzitnik.client.utils.roomtasks.RoomTask; +import cz.jzitnik.client.utils.roomtasks.RoomTaskScheduler; import lombok.Getter; import lombok.extern.slf4j.Slf4j; @@ -68,7 +68,7 @@ public abstract class HittableMob extends Mob { @InjectDependency private RoomTaskScheduler roomTaskScheduler; - public HittableMob(BufferedImage texture, MobRoomTask[] tasks, RoomCords cords, GameRoomPart collider, int health) { + public HittableMob(BufferedImage texture, MobRoomTask[] tasks, RoomCords cords, RoomPart collider, int health) { super(texture, tasks, cords, collider); this.health = health; } diff --git a/src/main/java/cz/jzitnik/game/mobs/HittableMobDrops.java b/game/src/main/java/cz/jzitnik/client/game/mobs/HittableMobDrops.java similarity index 79% rename from src/main/java/cz/jzitnik/game/mobs/HittableMobDrops.java rename to game/src/main/java/cz/jzitnik/client/game/mobs/HittableMobDrops.java index 48679dd..06cbece 100644 --- a/src/main/java/cz/jzitnik/game/mobs/HittableMobDrops.java +++ b/game/src/main/java/cz/jzitnik/client/game/mobs/HittableMobDrops.java @@ -1,19 +1,20 @@ -package cz.jzitnik.game.mobs; +package cz.jzitnik.client.game.mobs; import com.fasterxml.jackson.annotation.JacksonInject; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; -import cz.jzitnik.annotations.injectors.InjectDependency; -import cz.jzitnik.annotations.injectors.InjectState; -import cz.jzitnik.events.DroppedItemRerender; -import cz.jzitnik.events.InventoryRerender; -import cz.jzitnik.game.*; -import cz.jzitnik.game.items.GameItem; -import cz.jzitnik.game.mobs.tasks.MobRoomTask; -import cz.jzitnik.game.objects.DroppedItem; -import cz.jzitnik.game.utils.RoomCords; -import cz.jzitnik.utils.events.Event; -import cz.jzitnik.utils.events.EventManager; +import cz.jzitnik.client.annotations.injectors.InjectDependency; +import cz.jzitnik.client.annotations.injectors.InjectState; +import cz.jzitnik.client.events.DroppedItemRerender; +import cz.jzitnik.client.events.InventoryRerender; +import cz.jzitnik.client.game.*; +import cz.jzitnik.client.game.items.GameItem; +import cz.jzitnik.client.game.mobs.tasks.MobRoomTask; +import cz.jzitnik.client.game.objects.DroppedItem; +import cz.jzitnik.common.models.coordinates.RoomPart; +import cz.jzitnik.common.models.coordinates.RoomCords; +import cz.jzitnik.client.utils.events.Event; +import cz.jzitnik.client.utils.events.EventManager; import java.awt.image.BufferedImage; import java.util.ArrayList; @@ -33,7 +34,7 @@ public class HittableMobDrops extends HittableMob { @JsonProperty("texture") ResourceManager.Resource texture, @JsonProperty("tasks") MobRoomTask[] tasks, @JsonProperty("cords") RoomCords cords, - @JsonProperty("collider") GameRoomPart collider, + @JsonProperty("collider") RoomPart collider, @JsonProperty("health") int health, @JsonProperty("itemsDrops") GameItem[] itemsDrops, @JacksonInject ResourceManager resourceManager diff --git a/src/main/java/cz/jzitnik/game/mobs/HittableMobNoDrops.java b/game/src/main/java/cz/jzitnik/client/game/mobs/HittableMobNoDrops.java similarity index 69% rename from src/main/java/cz/jzitnik/game/mobs/HittableMobNoDrops.java rename to game/src/main/java/cz/jzitnik/client/game/mobs/HittableMobNoDrops.java index b944bce..511afe4 100644 --- a/src/main/java/cz/jzitnik/game/mobs/HittableMobNoDrops.java +++ b/game/src/main/java/cz/jzitnik/client/game/mobs/HittableMobNoDrops.java @@ -1,12 +1,12 @@ -package cz.jzitnik.game.mobs; +package cz.jzitnik.client.game.mobs; import com.fasterxml.jackson.annotation.JacksonInject; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; -import cz.jzitnik.game.GameRoomPart; -import cz.jzitnik.game.ResourceManager; -import cz.jzitnik.game.mobs.tasks.MobRoomTask; -import cz.jzitnik.game.utils.RoomCords; +import cz.jzitnik.common.models.coordinates.RoomPart; +import cz.jzitnik.client.game.ResourceManager; +import cz.jzitnik.client.game.mobs.tasks.MobRoomTask; +import cz.jzitnik.common.models.coordinates.RoomCords; public class HittableMobNoDrops extends HittableMob { @JsonCreator @@ -14,7 +14,7 @@ public class HittableMobNoDrops extends HittableMob { @JsonProperty("texture") ResourceManager.Resource texture, @JsonProperty("tasks") MobRoomTask[] tasks, @JsonProperty("cords") RoomCords cords, - @JsonProperty("collider") GameRoomPart collider, + @JsonProperty("collider") RoomPart collider, @JsonProperty("health") int health, @JacksonInject ResourceManager resourceManager ) { diff --git a/src/main/java/cz/jzitnik/game/mobs/Mob.java b/game/src/main/java/cz/jzitnik/client/game/mobs/Mob.java similarity index 75% rename from src/main/java/cz/jzitnik/game/mobs/Mob.java rename to game/src/main/java/cz/jzitnik/client/game/mobs/Mob.java index 2751838..141ce03 100644 --- a/src/main/java/cz/jzitnik/game/mobs/Mob.java +++ b/game/src/main/java/cz/jzitnik/client/game/mobs/Mob.java @@ -1,15 +1,15 @@ -package cz.jzitnik.game.mobs; +package cz.jzitnik.client.game.mobs; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.annotation.JsonTypeInfo; -import cz.jzitnik.annotations.injectors.InjectDependency; -import cz.jzitnik.game.GameRoomPart; -import cz.jzitnik.game.mobs.tasks.MobRoomTask; -import cz.jzitnik.game.utils.Renderable; -import cz.jzitnik.game.utils.RoomCords; -import cz.jzitnik.game.utils.Selectable; -import cz.jzitnik.utils.roomtasks.RoomTaskScheduler; +import cz.jzitnik.client.annotations.injectors.InjectDependency; +import cz.jzitnik.common.models.coordinates.RoomPart; +import cz.jzitnik.client.game.mobs.tasks.MobRoomTask; +import cz.jzitnik.client.game.utils.Renderable; +import cz.jzitnik.common.models.coordinates.RoomCords; +import cz.jzitnik.client.game.utils.Selectable; +import cz.jzitnik.client.utils.roomtasks.RoomTaskScheduler; import lombok.Getter; import lombok.Setter; @@ -34,7 +34,7 @@ public abstract class Mob implements Renderable, Selectable { @JsonIgnore protected final RoomCords cords; @JsonIgnore - protected final GameRoomPart collider; + protected final RoomPart collider; @InjectDependency private RoomTaskScheduler roomTaskScheduler; @@ -46,7 +46,7 @@ public abstract class Mob implements Renderable, Selectable { roomTaskScheduler.registerNewMob(this, oldTasks); } - public Mob(BufferedImage texture, MobRoomTask[] tasks, RoomCords cords, GameRoomPart collider) { + public Mob(BufferedImage texture, MobRoomTask[] tasks, RoomCords cords, RoomPart collider) { this.texture = texture; this.tasks = tasks == null ? new MobRoomTask[] {} : tasks; this.cords = cords; diff --git a/src/main/java/cz/jzitnik/game/mobs/tasks/BlindMobFollowingPlayerTask.java b/game/src/main/java/cz/jzitnik/client/game/mobs/tasks/BlindMobFollowingPlayerTask.java similarity index 73% rename from src/main/java/cz/jzitnik/game/mobs/tasks/BlindMobFollowingPlayerTask.java rename to game/src/main/java/cz/jzitnik/client/game/mobs/tasks/BlindMobFollowingPlayerTask.java index d1649c9..3780ca3 100644 --- a/src/main/java/cz/jzitnik/game/mobs/tasks/BlindMobFollowingPlayerTask.java +++ b/game/src/main/java/cz/jzitnik/client/game/mobs/tasks/BlindMobFollowingPlayerTask.java @@ -1,20 +1,20 @@ -package cz.jzitnik.game.mobs.tasks; +package cz.jzitnik.client.game.mobs.tasks; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; -import cz.jzitnik.annotations.injectors.InjectConfig; -import cz.jzitnik.annotations.injectors.InjectDependency; -import cz.jzitnik.annotations.injectors.InjectState; -import cz.jzitnik.config.Debugging; -import cz.jzitnik.config.MicrophoneConfig; -import cz.jzitnik.game.GameState; -import cz.jzitnik.game.ResourceManager; -import cz.jzitnik.game.mobs.Mob; -import cz.jzitnik.game.utils.RoomCords; -import cz.jzitnik.states.MicrophoneState; -import cz.jzitnik.states.ScreenBuffer; -import cz.jzitnik.states.TerminalState; -import cz.jzitnik.utils.events.EventManager; +import cz.jzitnik.client.annotations.injectors.InjectConfig; +import cz.jzitnik.client.annotations.injectors.InjectDependency; +import cz.jzitnik.client.annotations.injectors.InjectState; +import cz.jzitnik.client.config.Debugging; +import cz.jzitnik.client.config.MicrophoneConfig; +import cz.jzitnik.client.game.GameState; +import cz.jzitnik.client.game.ResourceManager; +import cz.jzitnik.client.game.mobs.Mob; +import cz.jzitnik.common.models.coordinates.RoomCords; +import cz.jzitnik.client.states.MicrophoneState; +import cz.jzitnik.client.states.ScreenBuffer; +import cz.jzitnik.client.states.TerminalState; +import cz.jzitnik.client.utils.events.EventManager; import lombok.RequiredArgsConstructor; import lombok.Setter; diff --git a/src/main/java/cz/jzitnik/game/mobs/tasks/EnemyPlayerAttackingTask.java b/game/src/main/java/cz/jzitnik/client/game/mobs/tasks/EnemyPlayerAttackingTask.java similarity index 79% rename from src/main/java/cz/jzitnik/game/mobs/tasks/EnemyPlayerAttackingTask.java rename to game/src/main/java/cz/jzitnik/client/game/mobs/tasks/EnemyPlayerAttackingTask.java index 7ad2ee0..0eb8976 100644 --- a/src/main/java/cz/jzitnik/game/mobs/tasks/EnemyPlayerAttackingTask.java +++ b/game/src/main/java/cz/jzitnik/client/game/mobs/tasks/EnemyPlayerAttackingTask.java @@ -1,15 +1,15 @@ -package cz.jzitnik.game.mobs.tasks; +package cz.jzitnik.client.game.mobs.tasks; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; -import cz.jzitnik.annotations.injectors.InjectDependency; -import cz.jzitnik.annotations.injectors.InjectState; -import cz.jzitnik.events.RenderStats; -import cz.jzitnik.game.GameState; -import cz.jzitnik.game.mobs.Mob; -import cz.jzitnik.game.utils.RoomCords; -import cz.jzitnik.utils.DependencyManager; -import cz.jzitnik.utils.events.EventManager; +import cz.jzitnik.client.annotations.injectors.InjectDependency; +import cz.jzitnik.client.annotations.injectors.InjectState; +import cz.jzitnik.client.events.RenderStats; +import cz.jzitnik.client.game.GameState; +import cz.jzitnik.client.game.mobs.Mob; +import cz.jzitnik.common.models.coordinates.RoomCords; +import cz.jzitnik.client.utils.DependencyManager; +import cz.jzitnik.client.utils.events.EventManager; import lombok.RequiredArgsConstructor; import lombok.Setter; import lombok.extern.slf4j.Slf4j; diff --git a/src/main/java/cz/jzitnik/game/mobs/tasks/MobFollowingPlayerTask.java b/game/src/main/java/cz/jzitnik/client/game/mobs/tasks/MobFollowingPlayerTask.java similarity index 77% rename from src/main/java/cz/jzitnik/game/mobs/tasks/MobFollowingPlayerTask.java rename to game/src/main/java/cz/jzitnik/client/game/mobs/tasks/MobFollowingPlayerTask.java index 3263213..0a0b43d 100644 --- a/src/main/java/cz/jzitnik/game/mobs/tasks/MobFollowingPlayerTask.java +++ b/game/src/main/java/cz/jzitnik/client/game/mobs/tasks/MobFollowingPlayerTask.java @@ -1,26 +1,26 @@ -package cz.jzitnik.game.mobs.tasks; +package cz.jzitnik.client.game.mobs.tasks; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; import com.googlecode.lanterna.TerminalPosition; -import cz.jzitnik.annotations.injectors.InjectConfig; -import cz.jzitnik.annotations.injectors.InjectDependency; -import cz.jzitnik.annotations.injectors.InjectState; -import cz.jzitnik.config.Debugging; -import cz.jzitnik.events.MouseMoveEvent; -import cz.jzitnik.events.RerenderScreen; -import cz.jzitnik.game.GameRoomPart; -import cz.jzitnik.game.GameState; -import cz.jzitnik.game.Player; -import cz.jzitnik.game.ResourceManager; -import cz.jzitnik.game.mobs.Mob; -import cz.jzitnik.game.mobs.tasks.utils.AStarAlg; -import cz.jzitnik.game.utils.RoomCords; -import cz.jzitnik.states.ScreenBuffer; -import cz.jzitnik.states.TerminalState; -import cz.jzitnik.utils.RerenderUtils; -import cz.jzitnik.utils.events.Event; -import cz.jzitnik.utils.events.EventManager; +import cz.jzitnik.client.annotations.injectors.InjectConfig; +import cz.jzitnik.client.annotations.injectors.InjectDependency; +import cz.jzitnik.client.annotations.injectors.InjectState; +import cz.jzitnik.client.config.Debugging; +import cz.jzitnik.client.events.MouseMoveEvent; +import cz.jzitnik.client.events.RerenderScreen; +import cz.jzitnik.common.models.coordinates.RoomPart; +import cz.jzitnik.client.game.GameState; +import cz.jzitnik.client.game.Player; +import cz.jzitnik.client.game.ResourceManager; +import cz.jzitnik.client.game.mobs.Mob; +import cz.jzitnik.client.game.mobs.tasks.utils.AStarAlg; +import cz.jzitnik.common.models.coordinates.RoomCords; +import cz.jzitnik.client.states.ScreenBuffer; +import cz.jzitnik.client.states.TerminalState; +import cz.jzitnik.client.utils.RerenderUtils; +import cz.jzitnik.client.utils.events.Event; +import cz.jzitnik.client.utils.events.EventManager; import lombok.RequiredArgsConstructor; import lombok.Setter; import lombok.extern.slf4j.Slf4j; @@ -73,7 +73,7 @@ public class MobFollowingPlayerTask extends MobRoomTask { protected static void moveMob(RoomCords playerCords, Mob mob, GameState gameState, int speed, ResourceManager resourceManager, TerminalState terminalState, ScreenBuffer screenBuffer, Debugging debugging, EventManager eventManager) { RoomCords mobCords = mob.getCords(); - List solidParts = gameState.getCurrentRoom().getColliders(); + List solidParts = gameState.getCurrentRoom().getColliders(); List path = AStarAlg.findPath(mobCords, playerCords, solidParts, mob.getCollider()); if (path.size() > 1) { @@ -96,7 +96,7 @@ public class MobFollowingPlayerTask extends MobRoomTask { Player player = gameState.getPlayer(); BufferedImage playerTexture = player.getTexture(resourceManager); - RerenderUtils.rerenderPart(forStartX, forEndX, forStartY, forEndY, startX, startY, gameState.getCurrentRoom(), room, player, playerTexture, screenBuffer, resourceManager, debugging); + RerenderUtils.rerenderPart(forStartX, forEndX, forStartY, forEndY, startX, startY, gameState.getCurrentRoom(), room, player, screenBuffer, resourceManager, debugging, gameState.getOtherPlayers()); eventManager.emitEvent(new Event[]{ new MouseMoveEvent(null), diff --git a/src/main/java/cz/jzitnik/game/mobs/tasks/MobRoomTask.java b/game/src/main/java/cz/jzitnik/client/game/mobs/tasks/MobRoomTask.java similarity index 84% rename from src/main/java/cz/jzitnik/game/mobs/tasks/MobRoomTask.java rename to game/src/main/java/cz/jzitnik/client/game/mobs/tasks/MobRoomTask.java index 5305133..99373ab 100644 --- a/src/main/java/cz/jzitnik/game/mobs/tasks/MobRoomTask.java +++ b/game/src/main/java/cz/jzitnik/client/game/mobs/tasks/MobRoomTask.java @@ -1,9 +1,9 @@ -package cz.jzitnik.game.mobs.tasks; +package cz.jzitnik.client.game.mobs.tasks; import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.annotation.JsonTypeInfo; -import cz.jzitnik.game.mobs.Mob; -import cz.jzitnik.utils.roomtasks.RoomTask; +import cz.jzitnik.client.game.mobs.Mob; +import cz.jzitnik.client.utils.roomtasks.RoomTask; import java.util.concurrent.TimeUnit; diff --git a/src/main/java/cz/jzitnik/game/mobs/tasks/utils/AStarAlg.java b/game/src/main/java/cz/jzitnik/client/game/mobs/tasks/utils/AStarAlg.java similarity index 89% rename from src/main/java/cz/jzitnik/game/mobs/tasks/utils/AStarAlg.java rename to game/src/main/java/cz/jzitnik/client/game/mobs/tasks/utils/AStarAlg.java index d1181e4..be59836 100644 --- a/src/main/java/cz/jzitnik/game/mobs/tasks/utils/AStarAlg.java +++ b/game/src/main/java/cz/jzitnik/client/game/mobs/tasks/utils/AStarAlg.java @@ -1,7 +1,7 @@ -package cz.jzitnik.game.mobs.tasks.utils; +package cz.jzitnik.client.game.mobs.tasks.utils; -import cz.jzitnik.game.GameRoomPart; -import cz.jzitnik.game.utils.RoomCords; +import cz.jzitnik.common.models.coordinates.RoomPart; +import cz.jzitnik.common.models.coordinates.RoomCords; import java.util.*; @@ -12,7 +12,7 @@ public class AStarAlg { private static final int MIN_Y = 10; private static final int MAX_Y = 113; - public static List findPath(RoomCords start, RoomCords target, List colliders, GameRoomPart mobCollider) { + public static List findPath(RoomCords start, RoomCords target, List colliders, RoomPart mobCollider) { PriorityQueue openSet = new PriorityQueue<>(Comparator.comparingInt(n -> n.f)); Set closedSet = new HashSet<>(); @@ -68,16 +68,16 @@ public class AStarAlg { return neighbors; } - private static boolean isValidPosition(int x, int y, List colliders, GameRoomPart mobCollider) { + private static boolean isValidPosition(int x, int y, List colliders, RoomPart mobCollider) { if (x < MIN_X || x > MAX_X) return false; if (y < MIN_Y || y > MAX_Y) return false; - var temp = new GameRoomPart( + var temp = new RoomPart( new RoomCords(mobCollider.getStart().getX() + x, mobCollider.getStart().getY() + y), new RoomCords(mobCollider.getEnd().getX() + x, mobCollider.getEnd().getY() + y) ); - for (GameRoomPart part : colliders) { + for (RoomPart part : colliders) { if (part.isOverlapping(temp)) { return false; } diff --git a/src/main/java/cz/jzitnik/game/objects/Chest.java b/game/src/main/java/cz/jzitnik/client/game/objects/Chest.java similarity index 82% rename from src/main/java/cz/jzitnik/game/objects/Chest.java rename to game/src/main/java/cz/jzitnik/client/game/objects/Chest.java index 5110e09..d6e3870 100644 --- a/src/main/java/cz/jzitnik/game/objects/Chest.java +++ b/game/src/main/java/cz/jzitnik/client/game/objects/Chest.java @@ -1,4 +1,4 @@ -package cz.jzitnik.game.objects; +package cz.jzitnik.client.game.objects; import com.fasterxml.jackson.annotation.JacksonInject; import com.fasterxml.jackson.annotation.JsonCreator; @@ -6,35 +6,33 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.google.common.collect.Lists; import com.googlecode.lanterna.TerminalPosition; import com.googlecode.lanterna.TextColor; -import cz.jzitnik.annotations.injectors.InjectConfig; -import cz.jzitnik.annotations.injectors.InjectDependency; -import cz.jzitnik.annotations.injectors.InjectState; -import cz.jzitnik.config.Debugging; -import cz.jzitnik.events.InventoryRerender; -import cz.jzitnik.events.MouseAction; -import cz.jzitnik.events.RerenderPart; -import cz.jzitnik.events.RerenderScreen; -import cz.jzitnik.game.GameRoom; -import cz.jzitnik.game.GameState; -import cz.jzitnik.game.Player; -import cz.jzitnik.game.ResourceManager; -import cz.jzitnik.game.items.GameItem; -import cz.jzitnik.game.utils.RoomCords; -import cz.jzitnik.states.ScreenBuffer; -import cz.jzitnik.states.TerminalState; -import cz.jzitnik.ui.Inventory; -import cz.jzitnik.ui.utils.Grid; -import cz.jzitnik.ui.pixels.ColoredPixel; -import cz.jzitnik.ui.pixels.Empty; -import cz.jzitnik.ui.pixels.Pixel; -import cz.jzitnik.utils.DependencyManager; -import cz.jzitnik.utils.RerenderUtils; -import cz.jzitnik.utils.StateManager; -import cz.jzitnik.utils.UIRoomClickHandlerRepository; -import cz.jzitnik.utils.events.EventManager; +import cz.jzitnik.client.annotations.injectors.InjectConfig; +import cz.jzitnik.client.annotations.injectors.InjectDependency; +import cz.jzitnik.client.annotations.injectors.InjectState; +import cz.jzitnik.client.config.Debugging; +import cz.jzitnik.client.events.*; +import cz.jzitnik.client.game.GameRoom; +import cz.jzitnik.client.game.GameState; +import cz.jzitnik.client.game.Player; +import cz.jzitnik.client.game.ResourceManager; +import cz.jzitnik.client.game.items.GameItem; +import cz.jzitnik.common.models.coordinates.RoomCords; +import cz.jzitnik.client.states.ScreenBuffer; +import cz.jzitnik.client.states.TerminalState; +import cz.jzitnik.client.ui.Inventory; +import cz.jzitnik.client.ui.utils.Grid; +import cz.jzitnik.client.ui.pixels.ColoredPixel; +import cz.jzitnik.client.ui.pixels.Empty; +import cz.jzitnik.client.ui.pixels.Pixel; +import cz.jzitnik.client.utils.RerenderUtils; +import cz.jzitnik.client.utils.UIRoomClickHandlerRepository; +import cz.jzitnik.client.utils.events.EventManager; +import cz.jzitnik.common.socket.messages.items.ItemTookFromChest; +import lombok.Getter; import lombok.extern.slf4j.Slf4j; import java.awt.image.BufferedImage; +import java.net.Socket; import java.util.HashSet; import java.util.List; @@ -42,8 +40,11 @@ import java.util.List; public final class Chest extends GameObject implements UIClickHandler { private static final int RENDER_PADDING = 1; + @Getter private final List items; + private boolean rendered; + private int listenerHashCode; private int actualDisplayStartX; @@ -103,7 +104,6 @@ public final class Chest extends GameObject implements UIClickHandler { Player player = gameState.getPlayer(); BufferedImage roomTexture = resourceManager.getResource(currentRoom.getTexture()); - BufferedImage playerTexture = player.getTexture(resourceManager); BufferedImage chestTexture = getTexture(); var buffer = screenBuffer.getRenderedBuffer(); @@ -143,7 +143,7 @@ public final class Chest extends GameObject implements UIClickHandler { renderMaxX = Math.max(renderMaxX, prevDisplayStartX + prevWidth); clearPreviousUI( - currentRoom, roomTexture, player, playerTexture, + currentRoom, roomTexture, player, resourceManager, buffer, overrideBuffer, start, guiStartY, prevGuiStartX, @@ -167,13 +167,14 @@ public final class Chest extends GameObject implements UIClickHandler { guiStart.getRow() - start.getY(), guiEnd.getRow() - start.getY() )); + rendered = true; } private void clearPreviousUI( GameRoom room, BufferedImage roomTexture, Player player, - BufferedImage playerTexture, + ResourceManager resourceManager, Pixel[][] buffer, Pixel[][] overrideBuffer, RoomCords start, @@ -190,10 +191,11 @@ public final class Chest extends GameObject implements UIClickHandler { null, new HashSet<>(), player, - playerTexture, + resourceManager, x, y, - debugging + debugging, + gameState.getOtherPlayers() ).pixel(); buffer[y + start.getY()][x + start.getX()] = pixelToColored(pixel); @@ -259,15 +261,23 @@ public final class Chest extends GameObject implements UIClickHandler { if (!added) { return true; } - eventManager.emitEvent(new InventoryRerender()); + eventManager.emitEvent(new SendSocketMessageEvent(new ItemTookFromChest(gameState.getCurrentRoom().getId(), item.getId()))); + + return true; + } + + public void handleItemRemoval(GameItem item) { items.remove(item); + if (!rendered) { + return; + } + + eventManager.emitEvent(new InventoryRerender()); if (items.isEmpty()) { uiRoomClickHandlerRepository.removeHandlerForCurrentRoom(listenerHashCode); } render(true); - - return true; } } diff --git a/src/main/java/cz/jzitnik/game/objects/DroppedItem.java b/game/src/main/java/cz/jzitnik/client/game/objects/DroppedItem.java similarity index 62% rename from src/main/java/cz/jzitnik/game/objects/DroppedItem.java rename to game/src/main/java/cz/jzitnik/client/game/objects/DroppedItem.java index ad74bb9..bd77d6a 100644 --- a/src/main/java/cz/jzitnik/game/objects/DroppedItem.java +++ b/game/src/main/java/cz/jzitnik/client/game/objects/DroppedItem.java @@ -1,17 +1,15 @@ -package cz.jzitnik.game.objects; +package cz.jzitnik.client.game.objects; -import cz.jzitnik.annotations.injectors.InjectDependency; -import cz.jzitnik.annotations.injectors.InjectState; -import cz.jzitnik.events.DroppedItemRerender; -import cz.jzitnik.events.InventoryRerender; -import cz.jzitnik.game.GameRoom; -import cz.jzitnik.game.GameState; -import cz.jzitnik.game.items.GameItem; -import cz.jzitnik.game.utils.RoomCords; -import cz.jzitnik.game.utils.Selectable; -import cz.jzitnik.utils.DependencyManager; -import cz.jzitnik.utils.StateManager; -import cz.jzitnik.utils.events.EventManager; +import cz.jzitnik.client.annotations.injectors.InjectDependency; +import cz.jzitnik.client.annotations.injectors.InjectState; +import cz.jzitnik.client.events.DroppedItemRerender; +import cz.jzitnik.client.events.InventoryRerender; +import cz.jzitnik.client.game.GameRoom; +import cz.jzitnik.client.game.GameState; +import cz.jzitnik.client.game.items.GameItem; +import cz.jzitnik.common.models.coordinates.RoomCords; +import cz.jzitnik.client.game.utils.Selectable; +import cz.jzitnik.client.utils.events.EventManager; import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.Setter; diff --git a/src/main/java/cz/jzitnik/game/objects/GameObject.java b/game/src/main/java/cz/jzitnik/client/game/objects/GameObject.java similarity index 80% rename from src/main/java/cz/jzitnik/game/objects/GameObject.java rename to game/src/main/java/cz/jzitnik/client/game/objects/GameObject.java index b4bda1a..2f6ff9e 100644 --- a/src/main/java/cz/jzitnik/game/objects/GameObject.java +++ b/game/src/main/java/cz/jzitnik/client/game/objects/GameObject.java @@ -1,11 +1,11 @@ -package cz.jzitnik.game.objects; +package cz.jzitnik.client.game.objects; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.annotation.JsonTypeInfo; -import cz.jzitnik.game.utils.Renderable; -import cz.jzitnik.game.utils.RoomCords; -import cz.jzitnik.game.utils.Selectable; +import cz.jzitnik.client.game.utils.Renderable; +import cz.jzitnik.common.models.coordinates.RoomCords; +import cz.jzitnik.client.game.utils.Selectable; import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.Setter; diff --git a/src/main/java/cz/jzitnik/game/objects/Interactable.java b/game/src/main/java/cz/jzitnik/client/game/objects/Interactable.java similarity index 58% rename from src/main/java/cz/jzitnik/game/objects/Interactable.java rename to game/src/main/java/cz/jzitnik/client/game/objects/Interactable.java index 1f4f09a..c050911 100644 --- a/src/main/java/cz/jzitnik/game/objects/Interactable.java +++ b/game/src/main/java/cz/jzitnik/client/game/objects/Interactable.java @@ -1,4 +1,4 @@ -package cz.jzitnik.game.objects; +package cz.jzitnik.client.game.objects; public interface Interactable { void interact(); diff --git a/src/main/java/cz/jzitnik/game/objects/UIClickHandler.java b/game/src/main/java/cz/jzitnik/client/game/objects/UIClickHandler.java similarity index 76% rename from src/main/java/cz/jzitnik/game/objects/UIClickHandler.java rename to game/src/main/java/cz/jzitnik/client/game/objects/UIClickHandler.java index f3775af..ecc365e 100644 --- a/src/main/java/cz/jzitnik/game/objects/UIClickHandler.java +++ b/game/src/main/java/cz/jzitnik/client/game/objects/UIClickHandler.java @@ -1,6 +1,6 @@ -package cz.jzitnik.game.objects; +package cz.jzitnik.client.game.objects; -import cz.jzitnik.events.MouseAction; +import cz.jzitnik.client.events.MouseAction; public interface UIClickHandler { boolean handleClick(MouseAction mouseAction); diff --git a/src/main/java/cz/jzitnik/game/setup/GameSetup.java b/game/src/main/java/cz/jzitnik/client/game/setup/GameSetup.java similarity index 54% rename from src/main/java/cz/jzitnik/game/setup/GameSetup.java rename to game/src/main/java/cz/jzitnik/client/game/setup/GameSetup.java index b6cff1a..6cc964a 100644 --- a/src/main/java/cz/jzitnik/game/setup/GameSetup.java +++ b/game/src/main/java/cz/jzitnik/client/game/setup/GameSetup.java @@ -1,13 +1,17 @@ -package cz.jzitnik.game.setup; +package cz.jzitnik.client.game.setup; -import cz.jzitnik.annotations.Dependency; -import cz.jzitnik.annotations.injectors.InjectDependency; -import cz.jzitnik.annotations.injectors.InjectState; -import cz.jzitnik.game.GameRoom; -import cz.jzitnik.game.GameState; -import cz.jzitnik.game.Player; -import cz.jzitnik.game.ResourceManager; -import cz.jzitnik.utils.DependencyManager; +import cz.jzitnik.client.annotations.Dependency; +import cz.jzitnik.client.annotations.injectors.InjectDependency; +import cz.jzitnik.client.annotations.injectors.InjectState; +import cz.jzitnik.client.events.SendSocketMessageEvent; +import cz.jzitnik.client.game.GameRoom; +import cz.jzitnik.client.game.GameState; +import cz.jzitnik.client.game.Player; +import cz.jzitnik.client.game.ResourceManager; +import cz.jzitnik.client.game.setup.scenes.connect.ServerChoose; +import cz.jzitnik.client.utils.DependencyManager; +import cz.jzitnik.client.utils.events.EventManager; +import cz.jzitnik.common.socket.messages.game.creation.CreateGame; import lombok.extern.slf4j.Slf4j; import tools.jackson.core.type.TypeReference; import tools.jackson.databind.ObjectMapper; @@ -32,7 +36,7 @@ public class GameSetup { private DependencyManager dependencyManager; public void setup() throws IOException { - //gameState.setScreen(new IntroScene(dependencyManager)); + gameState.setScreen(new ServerChoose(dependencyManager)); ObjectReader roomsReader = objectMapper.readerFor( new TypeReference>() { @@ -42,10 +46,7 @@ public class GameSetup { resourceManager.getResourceAsStream("setup/rooms.yaml") ); - ObjectReader playerReader = objectMapper.readerFor(Player.class).with(dependencyManager); - Player player = playerReader.readValue(resourceManager.getResourceAsStream("setup/player.yaml")); - gameState.setCurrentRoom(rooms.getFirst()); - gameState.setPlayer(player); + gameState.setAllRooms(rooms); } } diff --git a/src/main/java/cz/jzitnik/game/setup/scenes/GameMenuScene.java b/game/src/main/java/cz/jzitnik/client/game/setup/scenes/GameMenuScene.java similarity index 75% rename from src/main/java/cz/jzitnik/game/setup/scenes/GameMenuScene.java rename to game/src/main/java/cz/jzitnik/client/game/setup/scenes/GameMenuScene.java index 89c5c26..990472b 100644 --- a/src/main/java/cz/jzitnik/game/setup/scenes/GameMenuScene.java +++ b/game/src/main/java/cz/jzitnik/client/game/setup/scenes/GameMenuScene.java @@ -1,18 +1,18 @@ -package cz.jzitnik.game.setup.scenes; +package cz.jzitnik.client.game.setup.scenes; import com.googlecode.lanterna.input.KeyType; -import cz.jzitnik.annotations.injectors.InjectDependency; -import cz.jzitnik.annotations.injectors.InjectState; -import cz.jzitnik.events.FullRoomDraw; -import cz.jzitnik.events.KeyboardPressEvent; -import cz.jzitnik.events.MouseAction; -import cz.jzitnik.game.GameState; -import cz.jzitnik.screens.Screen; -import cz.jzitnik.screens.scenes.BasicImageScene; -import cz.jzitnik.screens.scenes.Scene; -import cz.jzitnik.sound.SoundPlayer; -import cz.jzitnik.utils.DependencyManager; -import cz.jzitnik.utils.events.EventManager; +import cz.jzitnik.client.annotations.injectors.InjectDependency; +import cz.jzitnik.client.annotations.injectors.InjectState; +import cz.jzitnik.client.events.FullRoomDraw; +import cz.jzitnik.client.events.KeyboardPressEvent; +import cz.jzitnik.client.events.MouseAction; +import cz.jzitnik.client.game.GameState; +import cz.jzitnik.client.screens.Screen; +import cz.jzitnik.client.screens.scenes.BasicImageScene; +import cz.jzitnik.client.screens.scenes.Scene; +import cz.jzitnik.client.sound.SoundPlayer; +import cz.jzitnik.client.utils.DependencyManager; +import cz.jzitnik.client.utils.events.EventManager; public class GameMenuScene extends Scene { private static class GameMenuAudioScreen extends Screen { diff --git a/src/main/java/cz/jzitnik/game/setup/scenes/IntroScene.java b/game/src/main/java/cz/jzitnik/client/game/setup/scenes/IntroScene.java similarity index 61% rename from src/main/java/cz/jzitnik/game/setup/scenes/IntroScene.java rename to game/src/main/java/cz/jzitnik/client/game/setup/scenes/IntroScene.java index f499105..2c26a85 100644 --- a/src/main/java/cz/jzitnik/game/setup/scenes/IntroScene.java +++ b/game/src/main/java/cz/jzitnik/client/game/setup/scenes/IntroScene.java @@ -1,9 +1,9 @@ -package cz.jzitnik.game.setup.scenes; +package cz.jzitnik.client.game.setup.scenes; -import cz.jzitnik.screens.Screen; -import cz.jzitnik.screens.scenes.Scene; -import cz.jzitnik.screens.scenes.VideoSceneWithAudio; -import cz.jzitnik.utils.DependencyManager; +import cz.jzitnik.client.screens.Screen; +import cz.jzitnik.client.screens.scenes.Scene; +import cz.jzitnik.client.screens.scenes.VideoSceneWithAudio; +import cz.jzitnik.client.utils.DependencyManager; public class IntroScene extends Scene { public IntroScene(DependencyManager dependencyManager) { diff --git a/game/src/main/java/cz/jzitnik/client/game/setup/scenes/connect/ServerChoose.java b/game/src/main/java/cz/jzitnik/client/game/setup/scenes/connect/ServerChoose.java new file mode 100644 index 0000000..c1a3d53 --- /dev/null +++ b/game/src/main/java/cz/jzitnik/client/game/setup/scenes/connect/ServerChoose.java @@ -0,0 +1,483 @@ +package cz.jzitnik.client.game.setup.scenes.connect; + +import com.googlecode.lanterna.TerminalSize; +import com.googlecode.lanterna.TextColor; +import com.googlecode.lanterna.graphics.TextGraphics; +import com.googlecode.lanterna.input.KeyType; +import com.googlecode.lanterna.screen.TerminalScreen; +import cz.jzitnik.client.annotations.injectors.InjectDependency; +import cz.jzitnik.client.annotations.injectors.InjectState; +import cz.jzitnik.client.events.KeyboardPressEvent; +import cz.jzitnik.client.events.MouseAction; +import cz.jzitnik.client.events.SendSocketMessageEvent; +import cz.jzitnik.client.game.GameState; +import cz.jzitnik.client.screens.Screen; +import cz.jzitnik.client.screens.scenes.Scene; +import cz.jzitnik.client.socket.Client; +import cz.jzitnik.client.sound.SoundPlayer; +import cz.jzitnik.client.states.TerminalState; +import cz.jzitnik.client.ui.Inventory; +import cz.jzitnik.client.ui.pixels.AlphaPixel; +import cz.jzitnik.client.ui.pixels.Empty; +import cz.jzitnik.client.ui.utils.Input; +import cz.jzitnik.client.utils.DependencyManager; +import cz.jzitnik.client.utils.TextRenderer; +import cz.jzitnik.client.utils.events.EventManager; +import cz.jzitnik.common.socket.messages.game.connection.ConnectToAGame; +import cz.jzitnik.common.socket.messages.game.creation.CreateGame; +import jakarta.websocket.DeploymentException; +import cz.jzitnik.client.ui.utils.Button; +import lombok.extern.slf4j.Slf4j; + +import java.awt.*; +import java.io.IOException; + +@Slf4j +public class ServerChoose extends Scene { + public ServerChoose(DependencyManager dependencyManager) { + GameMenuAudioScreen gameMenuScreen = new GameMenuAudioScreen(); + ServerSelector serverSelector = new ServerSelector(); + + super(new Screen[]{gameMenuScreen, serverSelector}, new OnEndAction.Repeat()); + + dependencyManager.inject(this); + dependencyManager.inject(serverSelector); + } + + private static class GameMenuAudioScreen extends Screen { + protected final SoundPlayer soundPlayer = new SoundPlayer(); + protected boolean play = true; + + @Override + public void fullRender() { + // No render here just basic audio playback + new Thread(() -> { + while (play) { + soundPlayer.playSound("audio/menu.ogg", 30, 100); + } + }).start(); + } + + @Override + public void handleMouseAction(MouseAction event) { + + } + + @Override + public void handleKeyboardAction(KeyboardPressEvent event) { + + } + } + + private static final class ServerSelector extends Screen { + private final StringBuilder ipBuffer = new StringBuilder(); + private boolean connecting = false; + + @InjectDependency + private EventManager eventManager; + + @InjectDependency + private Client client; + + @InjectState + private TerminalState terminalState; + + @InjectDependency + private TextRenderer textRenderer; + + @InjectState + private GameState gameState; + + @InjectDependency + private DependencyManager dependencyManager; + + private void renderInput(boolean refresh) { + var tg = terminalState.getTextGraphics(); + TerminalScreen screen = terminalState.getTerminalScreen(); + Input input = new Input(ipBuffer.toString(), 18, 100); + var inputBuffer = input.render(textRenderer); + TerminalSize termSize = screen.getTerminalSize(); + int renderPixelWidth = inputBuffer[0].length; + int renderPixelHeight = inputBuffer.length; + int renderCharWidth = renderPixelWidth; + int renderCharHeight = (renderPixelHeight + 1) / 2; + int startX = (termSize.getColumns() - renderCharWidth) / 2; + int startY = (termSize.getRows() - renderCharHeight) / 2; + + for (int y = 0; y < inputBuffer.length; y += 2) { + for (int x = 0; x < inputBuffer[y].length; x++) { + AlphaPixel bottomPixel; + AlphaPixel topPixel = inputBuffer[y][x]; + if (y + 1 < inputBuffer.length) { + bottomPixel = inputBuffer[y + 1][x]; + } else { + bottomPixel = new Empty(); + } + + int termX = startX + x; + int termY = startY + (y / 2); + + tg.setBackgroundColor(topPixel instanceof Empty ? TextColor.ANSI.BLACK : topPixel.getColor()); + tg.setForegroundColor(bottomPixel instanceof Empty ? TextColor.ANSI.BLACK : bottomPixel.getColor()); + tg.setCharacter(termX, termY, 'â–„'); + } + } + + if (refresh) { + try { + screen.refresh(com.googlecode.lanterna.screen.Screen.RefreshType.DELTA); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + } + + @Override + public void fullRender() { + TerminalScreen screen = terminalState.getTerminalScreen(); + var tg = terminalState.getTextGraphics(); + screen.clear(); + TerminalSize terminalSize = screen.getTerminalSize(); + + for (int y = 0; y < terminalSize.getRows(); y += 1) { + for (int x = 0; x < terminalSize.getColumns(); x++) { + tg.setBackgroundColor(TextColor.ANSI.BLACK); + tg.setForegroundColor(TextColor.ANSI.BLACK); + tg.setCharacter(x, y, 'â–„'); + } + } + + AlphaPixel[][] selectServer = textRenderer.renderText("Enter server IP", terminalSize.getColumns(), 20, Color.WHITE, 15f, true); + + render(selectServer, 0, 10, tg); + + renderInput(false); + + try { + screen.refresh(com.googlecode.lanterna.screen.Screen.RefreshType.COMPLETE); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + @Override + public void handleKeyboardAction(KeyboardPressEvent event) { + if (connecting) { + return; + } + + if (event.getKeyStroke().getKeyType() == KeyType.Enter) { + try { + connecting = true; + client.connect(ipBuffer.toString()); + + Screen screen = new ActionSelector(); + dependencyManager.inject(screen); + gameState.setScreen(screen); + screen.fullRender(); + } catch (DeploymentException | IOException e) { + connecting = false; + } + return; + } + + if (event.getKeyStroke().getKeyType() == KeyType.Backspace) { + if (ipBuffer.isEmpty()) { + return; + } + + ipBuffer.deleteCharAt(ipBuffer.length() - 1); + renderInput(true); + return; + } + + if (event.getKeyStroke().getKeyType() == KeyType.Character && !event.getKeyStroke().isCtrlDown()) { + ipBuffer.append(event.getKeyStroke().getCharacter()); + renderInput(true); + } + } + + @Override + public void handleMouseAction(MouseAction event) { + } + } + + private static final class ActionSelector extends Screen { + @InjectDependency + private TextRenderer textRenderer; + + @InjectState + private TerminalState terminalState; + + @InjectDependency + private EventManager eventManager; + + @InjectState + private GameState gameState; + + private int selectedIndex = -1; + + @Override + public void fullRender() { + TerminalScreen screen = terminalState.getTerminalScreen(); + var tg = terminalState.getTextGraphics(); + screen.clear(); + TerminalSize terminalSize = screen.getTerminalSize(); + + for (int y = 0; y < terminalSize.getRows(); y += 1) { + for (int x = 0; x < terminalSize.getColumns(); x++) { + tg.setBackgroundColor(TextColor.ANSI.BLACK); + tg.setForegroundColor(TextColor.ANSI.BLACK); + tg.setCharacter(x, y, 'â–„'); + } + } + + AlphaPixel[][] selectAction = textRenderer.renderText("Select action", terminalSize.getColumns(), 20, Color.WHITE, 15f, true); + + render(selectAction, 0, 10, tg); + renderButtons(); + + try { + screen.refresh(com.googlecode.lanterna.screen.Screen.RefreshType.COMPLETE); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private static final int BUTTON_HEIGHT = 20; + private static final int BUTTON_WIDTH = 200; + private static final int BUTTON_GAP = 10; + private static final int BUTTON_COUNT = 2; + private static final int BUTTONS_HEIGHT = BUTTON_HEIGHT * BUTTON_COUNT + (BUTTON_COUNT - 1) * BUTTON_GAP; + + private void renderButtons() { + var tg = terminalState.getTextGraphics(); + TerminalSize terminalSize = terminalState.getTerminalScreen().getTerminalSize(); + + final int BUTTON_PAD_X = terminalSize.getColumns() / 2 - BUTTON_WIDTH / 2; + final int BUTTON_PAD_Y = terminalSize.getRows() - BUTTONS_HEIGHT / 2; + + Button button = new Button( + Inventory.BORDER_COLOR, + Inventory.BACKGROUND_COLOR, + Inventory.BACKGROUND_COLOR_HOVERED, + Color.WHITE, + BUTTON_HEIGHT, + BUTTON_WIDTH, + 1, + 15f, + textRenderer + ); + + render(button.render("Create a world", selectedIndex == 0), BUTTON_PAD_X, BUTTON_PAD_Y, tg); + render(button.render("Connect to an existing world", selectedIndex == 1), BUTTON_PAD_X, BUTTON_PAD_Y + (BUTTON_HEIGHT + BUTTON_GAP), tg); + } + + @Override + public void handleMouseAction(MouseAction event) { + TerminalSize terminalSize = terminalState.getTerminalScreen().getTerminalSize(); + + final int BUTTON_START_X = terminalSize.getColumns() / 2 - BUTTON_WIDTH / 2; + final int BUTTON_START_Y = terminalSize.getRows() - BUTTONS_HEIGHT / 2; + final int BUTTON_END_X = BUTTON_START_X + BUTTON_WIDTH; + final int BUTTON_END_Y = BUTTON_START_Y + BUTTONS_HEIGHT; + + final int TERMINAL_X = event.getPosition().getColumn(); + final int TERMINAL_Y = event.getPosition().getRow() * 2; + + final int SINGLE_BUTTON_HEIGHT = BUTTON_HEIGHT + BUTTON_GAP; + + int index = (TERMINAL_Y - BUTTON_START_Y) / SINGLE_BUTTON_HEIGHT; + int rest = (TERMINAL_Y - BUTTON_START_Y) % SINGLE_BUTTON_HEIGHT; + + if (!(TERMINAL_X >= BUTTON_START_X && TERMINAL_Y >= BUTTON_START_Y && TERMINAL_X < BUTTON_END_X && TERMINAL_Y < BUTTON_END_Y) || rest > BUTTON_HEIGHT) { + if (selectedIndex != -1) { + selectedIndex = -1; + renderButtons(); + refresh(); + } + return; + } + + switch (event.getActionType()) { + case MOVE -> { + selectedIndex = index; + renderButtons(); + refresh(); + } + case CLICK_RELEASE -> { + switch (index) { + case 0 -> eventManager.emitEvent(new SendSocketMessageEvent(new CreateGame())); + case 1 -> { + Screen screen = new ConnectWorld(); + gameState.setScreen(screen); + screen.fullRender(); + } + } + } + } + } + + private void refresh() { + try { + terminalState.getTerminalScreen().refresh(com.googlecode.lanterna.screen.Screen.RefreshType.DELTA); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + @Override + public void handleKeyboardAction(KeyboardPressEvent event) { + + } + } + + + private static final class ConnectWorld extends Screen { + private final StringBuilder passBuffer = new StringBuilder(); + private boolean connecting = false; + + @InjectDependency + private EventManager eventManager; + + @InjectDependency + private Client client; + + @InjectState + private TerminalState terminalState; + + @InjectDependency + private TextRenderer textRenderer; + + @InjectState + private GameState gameState; + + @InjectDependency + private DependencyManager dependencyManager; + + private void renderInput(boolean refresh) { + var tg = terminalState.getTextGraphics(); + TerminalScreen screen = terminalState.getTerminalScreen(); + Input input = new Input(passBuffer.toString(), 18, 100); + var inputBuffer = input.render(textRenderer); + TerminalSize termSize = screen.getTerminalSize(); + int renderPixelWidth = inputBuffer[0].length; + int renderPixelHeight = inputBuffer.length; + int renderCharWidth = renderPixelWidth; + int renderCharHeight = (renderPixelHeight + 1) / 2; + int startX = (termSize.getColumns() - renderCharWidth) / 2; + int startY = (termSize.getRows() - renderCharHeight) / 2; + + for (int y = 0; y < inputBuffer.length; y += 2) { + for (int x = 0; x < inputBuffer[y].length; x++) { + AlphaPixel bottomPixel; + AlphaPixel topPixel = inputBuffer[y][x]; + if (y + 1 < inputBuffer.length) { + bottomPixel = inputBuffer[y + 1][x]; + } else { + bottomPixel = new Empty(); + } + + int termX = startX + x; + int termY = startY + (y / 2); + + tg.setBackgroundColor(topPixel instanceof Empty ? TextColor.ANSI.BLACK : topPixel.getColor()); + tg.setForegroundColor(bottomPixel instanceof Empty ? TextColor.ANSI.BLACK : bottomPixel.getColor()); + tg.setCharacter(termX, termY, 'â–„'); + } + } + + if (refresh) { + try { + screen.refresh(com.googlecode.lanterna.screen.Screen.RefreshType.DELTA); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + } + + @Override + public void fullRender() { + TerminalScreen screen = terminalState.getTerminalScreen(); + var tg = terminalState.getTextGraphics(); + screen.clear(); + TerminalSize terminalSize = screen.getTerminalSize(); + + for (int y = 0; y < terminalSize.getRows(); y += 1) { + for (int x = 0; x < terminalSize.getColumns(); x++) { + tg.setBackgroundColor(TextColor.ANSI.BLACK); + tg.setForegroundColor(TextColor.ANSI.BLACK); + tg.setCharacter(x, y, 'â–„'); + } + } + + AlphaPixel[][] selectServer = textRenderer.renderText("Enter world password", terminalSize.getColumns(), 20, Color.WHITE, 15f, true); + + render(selectServer, 0, 10, tg); + + renderInput(false); + + try { + screen.refresh(com.googlecode.lanterna.screen.Screen.RefreshType.COMPLETE); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + @Override + public void handleKeyboardAction(KeyboardPressEvent event) { + if (connecting) { + return; + } + + if (event.getKeyStroke().getKeyType() == KeyType.Enter) { + connecting = true; + String pass = passBuffer.toString(); + eventManager.emitEvent(new SendSocketMessageEvent(new ConnectToAGame(pass))); + + return; + } + + if (event.getKeyStroke().getKeyType() == KeyType.Backspace) { + if (passBuffer.isEmpty()) { + return; + } + + passBuffer.deleteCharAt(passBuffer.length() - 1); + renderInput(true); + return; + } + + if (event.getKeyStroke().getKeyType() == KeyType.Character && !event.getKeyStroke().isCtrlDown()) { + passBuffer.append(event.getKeyStroke().getCharacter()); + renderInput(true); + } + } + + @Override + public void handleMouseAction(MouseAction event) { + } + } + + private static void render(AlphaPixel[][] buffer, int padX, int padY, TextGraphics tg) { + for (int y = 0; y < buffer.length; y += 2) { + for (int x = 0; x < buffer[y].length; x++) { + AlphaPixel topPixel = buffer[y][x]; + + AlphaPixel bottomPixel; + if (y + 1 < buffer.length) { + bottomPixel = buffer[y + 1][x]; + } else { + bottomPixel = new Empty(); + } + + int termX = padX + x; + int termY = padY / 2 + y / 2; + + tg.setBackgroundColor(topPixel instanceof Empty ? TextColor.ANSI.BLACK : topPixel.getColor()); + tg.setForegroundColor(bottomPixel instanceof Empty ? TextColor.ANSI.BLACK : bottomPixel.getColor()); + tg.setCharacter(termX, termY, 'â–„'); + } + } + } +} diff --git a/src/main/java/cz/jzitnik/game/utils/Renderable.java b/game/src/main/java/cz/jzitnik/client/game/utils/Renderable.java similarity index 73% rename from src/main/java/cz/jzitnik/game/utils/Renderable.java rename to game/src/main/java/cz/jzitnik/client/game/utils/Renderable.java index c39e169..b1f4d87 100644 --- a/src/main/java/cz/jzitnik/game/utils/Renderable.java +++ b/game/src/main/java/cz/jzitnik/client/game/utils/Renderable.java @@ -1,4 +1,4 @@ -package cz.jzitnik.game.utils; +package cz.jzitnik.client.game.utils; import java.awt.image.BufferedImage; diff --git a/src/main/java/cz/jzitnik/game/utils/Selectable.java b/game/src/main/java/cz/jzitnik/client/game/utils/Selectable.java similarity index 66% rename from src/main/java/cz/jzitnik/game/utils/Selectable.java rename to game/src/main/java/cz/jzitnik/client/game/utils/Selectable.java index 1052413..a64f636 100644 --- a/src/main/java/cz/jzitnik/game/utils/Selectable.java +++ b/game/src/main/java/cz/jzitnik/client/game/utils/Selectable.java @@ -1,6 +1,7 @@ -package cz.jzitnik.game.utils; +package cz.jzitnik.client.game.utils; -import cz.jzitnik.game.objects.Interactable; +import cz.jzitnik.client.game.objects.Interactable; +import cz.jzitnik.common.models.coordinates.RoomCords; import java.awt.image.BufferedImage; diff --git a/src/main/java/cz/jzitnik/screens/Screen.java b/game/src/main/java/cz/jzitnik/client/screens/Screen.java similarity index 61% rename from src/main/java/cz/jzitnik/screens/Screen.java rename to game/src/main/java/cz/jzitnik/client/screens/Screen.java index c821afe..68eae0e 100644 --- a/src/main/java/cz/jzitnik/screens/Screen.java +++ b/game/src/main/java/cz/jzitnik/client/screens/Screen.java @@ -1,7 +1,7 @@ -package cz.jzitnik.screens; +package cz.jzitnik.client.screens; -import cz.jzitnik.events.KeyboardPressEvent; -import cz.jzitnik.events.MouseAction; +import cz.jzitnik.client.events.KeyboardPressEvent; +import cz.jzitnik.client.events.MouseAction; public abstract class Screen { public abstract void fullRender(); diff --git a/src/main/java/cz/jzitnik/screens/VideoPlayScreen.java b/game/src/main/java/cz/jzitnik/client/screens/VideoPlayScreen.java similarity index 95% rename from src/main/java/cz/jzitnik/screens/VideoPlayScreen.java rename to game/src/main/java/cz/jzitnik/client/screens/VideoPlayScreen.java index 9532bc3..b330ad1 100644 --- a/src/main/java/cz/jzitnik/screens/VideoPlayScreen.java +++ b/game/src/main/java/cz/jzitnik/client/screens/VideoPlayScreen.java @@ -1,11 +1,11 @@ -package cz.jzitnik.screens; +package cz.jzitnik.client.screens; import com.googlecode.lanterna.TextColor; import com.googlecode.lanterna.screen.TerminalScreen; -import cz.jzitnik.annotations.injectors.InjectDependency; -import cz.jzitnik.annotations.injectors.InjectState; -import cz.jzitnik.game.ResourceManager; -import cz.jzitnik.states.TerminalState; +import cz.jzitnik.client.annotations.injectors.InjectDependency; +import cz.jzitnik.client.annotations.injectors.InjectState; +import cz.jzitnik.client.game.ResourceManager; +import cz.jzitnik.client.states.TerminalState; import lombok.extern.slf4j.Slf4j; import org.bytedeco.javacv.FFmpegFrameGrabber; import org.bytedeco.javacv.Frame; diff --git a/src/main/java/cz/jzitnik/screens/scenes/BasicImageScene.java b/game/src/main/java/cz/jzitnik/client/screens/scenes/BasicImageScene.java similarity index 87% rename from src/main/java/cz/jzitnik/screens/scenes/BasicImageScene.java rename to game/src/main/java/cz/jzitnik/client/screens/scenes/BasicImageScene.java index dda30e9..386c876 100644 --- a/src/main/java/cz/jzitnik/screens/scenes/BasicImageScene.java +++ b/game/src/main/java/cz/jzitnik/client/screens/scenes/BasicImageScene.java @@ -1,14 +1,14 @@ -package cz.jzitnik.screens.scenes; +package cz.jzitnik.client.screens.scenes; import com.googlecode.lanterna.TextColor; import com.googlecode.lanterna.screen.TerminalScreen; -import cz.jzitnik.annotations.injectors.InjectDependency; -import cz.jzitnik.annotations.injectors.InjectState; -import cz.jzitnik.events.KeyboardPressEvent; -import cz.jzitnik.events.MouseAction; -import cz.jzitnik.game.ResourceManager; -import cz.jzitnik.screens.Screen; -import cz.jzitnik.states.TerminalState; +import cz.jzitnik.client.annotations.injectors.InjectDependency; +import cz.jzitnik.client.annotations.injectors.InjectState; +import cz.jzitnik.client.events.KeyboardPressEvent; +import cz.jzitnik.client.events.MouseAction; +import cz.jzitnik.client.game.ResourceManager; +import cz.jzitnik.client.screens.Screen; +import cz.jzitnik.client.states.TerminalState; import java.awt.image.BufferedImage; import java.io.IOException; diff --git a/src/main/java/cz/jzitnik/screens/scenes/BasicVideoScene.java b/game/src/main/java/cz/jzitnik/client/screens/scenes/BasicVideoScene.java similarity index 61% rename from src/main/java/cz/jzitnik/screens/scenes/BasicVideoScene.java rename to game/src/main/java/cz/jzitnik/client/screens/scenes/BasicVideoScene.java index 2895646..3f6c68c 100644 --- a/src/main/java/cz/jzitnik/screens/scenes/BasicVideoScene.java +++ b/game/src/main/java/cz/jzitnik/client/screens/scenes/BasicVideoScene.java @@ -1,8 +1,8 @@ -package cz.jzitnik.screens.scenes; +package cz.jzitnik.client.screens.scenes; -import cz.jzitnik.events.KeyboardPressEvent; -import cz.jzitnik.events.MouseAction; -import cz.jzitnik.screens.VideoPlayScreen; +import cz.jzitnik.client.events.KeyboardPressEvent; +import cz.jzitnik.client.events.MouseAction; +import cz.jzitnik.client.screens.VideoPlayScreen; public final class BasicVideoScene extends VideoPlayScreen { public BasicVideoScene(String videoPath) { diff --git a/src/main/java/cz/jzitnik/screens/scenes/Scene.java b/game/src/main/java/cz/jzitnik/client/screens/scenes/Scene.java similarity index 84% rename from src/main/java/cz/jzitnik/screens/scenes/Scene.java rename to game/src/main/java/cz/jzitnik/client/screens/scenes/Scene.java index 6c390a0..24affa0 100644 --- a/src/main/java/cz/jzitnik/screens/scenes/Scene.java +++ b/game/src/main/java/cz/jzitnik/client/screens/scenes/Scene.java @@ -1,14 +1,14 @@ -package cz.jzitnik.screens.scenes; +package cz.jzitnik.client.screens.scenes; -import cz.jzitnik.annotations.injectors.InjectDependency; -import cz.jzitnik.annotations.injectors.InjectState; -import cz.jzitnik.events.FullRoomDraw; -import cz.jzitnik.events.KeyboardPressEvent; -import cz.jzitnik.events.MouseAction; -import cz.jzitnik.game.GameState; -import cz.jzitnik.screens.Screen; -import cz.jzitnik.utils.DependencyManager; -import cz.jzitnik.utils.events.EventManager; +import cz.jzitnik.client.annotations.injectors.InjectDependency; +import cz.jzitnik.client.annotations.injectors.InjectState; +import cz.jzitnik.client.events.FullRoomDraw; +import cz.jzitnik.client.events.KeyboardPressEvent; +import cz.jzitnik.client.events.MouseAction; +import cz.jzitnik.client.game.GameState; +import cz.jzitnik.client.screens.Screen; +import cz.jzitnik.client.utils.DependencyManager; +import cz.jzitnik.client.utils.events.EventManager; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/src/main/java/cz/jzitnik/screens/scenes/VideoSceneWithAudio.java b/game/src/main/java/cz/jzitnik/client/screens/scenes/VideoSceneWithAudio.java similarity index 78% rename from src/main/java/cz/jzitnik/screens/scenes/VideoSceneWithAudio.java rename to game/src/main/java/cz/jzitnik/client/screens/scenes/VideoSceneWithAudio.java index 5aa73fd..94b1996 100644 --- a/src/main/java/cz/jzitnik/screens/scenes/VideoSceneWithAudio.java +++ b/game/src/main/java/cz/jzitnik/client/screens/scenes/VideoSceneWithAudio.java @@ -1,9 +1,9 @@ -package cz.jzitnik.screens.scenes; +package cz.jzitnik.client.screens.scenes; -import cz.jzitnik.events.KeyboardPressEvent; -import cz.jzitnik.events.MouseAction; -import cz.jzitnik.screens.VideoPlayScreen; -import cz.jzitnik.sound.SoundPlayer; +import cz.jzitnik.client.events.KeyboardPressEvent; +import cz.jzitnik.client.events.MouseAction; +import cz.jzitnik.client.screens.VideoPlayScreen; +import cz.jzitnik.client.sound.SoundPlayer; import lombok.extern.slf4j.Slf4j; @Slf4j diff --git a/game/src/main/java/cz/jzitnik/client/socket/AbstractSocketEventHandler.java b/game/src/main/java/cz/jzitnik/client/socket/AbstractSocketEventHandler.java new file mode 100644 index 0000000..223136f --- /dev/null +++ b/game/src/main/java/cz/jzitnik/client/socket/AbstractSocketEventHandler.java @@ -0,0 +1,7 @@ +package cz.jzitnik.client.socket; + +import cz.jzitnik.common.socket.SocketMessage; + +public abstract class AbstractSocketEventHandler { + public abstract void handle(T event); +} diff --git a/game/src/main/java/cz/jzitnik/client/socket/Client.java b/game/src/main/java/cz/jzitnik/client/socket/Client.java new file mode 100644 index 0000000..5ea3731 --- /dev/null +++ b/game/src/main/java/cz/jzitnik/client/socket/Client.java @@ -0,0 +1,50 @@ +package cz.jzitnik.client.socket; + +import cz.jzitnik.client.annotations.Dependency; +import cz.jzitnik.client.annotations.injectors.InjectDependency; +import cz.jzitnik.common.socket.SocketMessage; +import jakarta.websocket.*; +import lombok.extern.slf4j.Slf4j; + +import java.io.*; +import java.net.URI; +import java.nio.ByteBuffer; + +@Slf4j +@Dependency +@ClientEndpoint +public class Client { + private Session session; + + @InjectDependency + private SocketEventManager socketEventManager; + + @OnOpen + public void onOpen(Session session) { + this.session = session; + } + + @OnMessage + public void onMessage(ByteBuffer buffer) { + try (ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(buffer.array()))) { + SocketMessage message = (SocketMessage) ois.readObject(); + socketEventManager.emitEvent(message); + } catch (IOException | ClassNotFoundException e) { + e.printStackTrace(); + } + } + + public void send(SocketMessage message) throws IOException { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + ObjectOutputStream oos = new ObjectOutputStream(baos); + oos.writeObject(message); + oos.flush(); + + session.getBasicRemote().sendBinary(ByteBuffer.wrap(baos.toByteArray())); + } + + public void connect(String ip) throws DeploymentException, IOException { + WebSocketContainer container = ContainerProvider.getWebSocketContainer(); + container.connectToServer(this, URI.create(String.format("ws://%s:8025/ws", ip))); + } +} diff --git a/game/src/main/java/cz/jzitnik/client/socket/SocketEventManager.java b/game/src/main/java/cz/jzitnik/client/socket/SocketEventManager.java new file mode 100644 index 0000000..154802f --- /dev/null +++ b/game/src/main/java/cz/jzitnik/client/socket/SocketEventManager.java @@ -0,0 +1,94 @@ +package cz.jzitnik.client.socket; + +import cz.jzitnik.client.annotations.Dependency; +import cz.jzitnik.client.annotations.SocketEventHandler; +import cz.jzitnik.client.annotations.injectors.InjectConfig; +import cz.jzitnik.client.annotations.injectors.InjectState; +import cz.jzitnik.client.config.ThreadPoolConfig; +import cz.jzitnik.client.states.RunningState; +import cz.jzitnik.client.utils.DependencyManager; +import cz.jzitnik.common.socket.SocketMessage; +import lombok.extern.slf4j.Slf4j; +import org.reflections.Reflections; + +import java.lang.reflect.InvocationTargetException; +import java.util.HashMap; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.LinkedBlockingQueue; + +@Slf4j +@Dependency +public class SocketEventManager extends Thread { + private final DependencyManager dependencyManager; + + private ExecutorService eventExecutor; + private final HashMap, AbstractSocketEventHandler> handlers = new HashMap<>(); + private final BlockingQueue eventQueue = new LinkedBlockingQueue<>(); + + @InjectConfig + private ThreadPoolConfig threadPoolConfig; + + @InjectState + private RunningState runningState; + + public void emitEvent(SocketMessage event) { + eventQueue.add(event); + } + + public SocketEventManager(Reflections reflections, DependencyManager dependencyManager) { + this.dependencyManager = dependencyManager; + setDaemon(true); + + var classes = reflections.getTypesAnnotatedWith(SocketEventHandler.class); + + for (var clazz : classes) { + SocketEventHandler eventHandler = clazz.getAnnotation(SocketEventHandler.class); + try { + var instance = (AbstractSocketEventHandler) clazz.getDeclaredConstructor().newInstance(); + handlers.put(eventHandler.value(), instance); + } catch (InstantiationException | IllegalAccessException | InvocationTargetException | + NoSuchMethodException e) { + log.error("Failed to instantiate socket event handler: {}", clazz.getName(), e); + } + } + } + + @Override + public void run() { + for (Object instance : handlers.values()) { + dependencyManager.inject(instance); + } + + eventExecutor = Executors.newFixedThreadPool(threadPoolConfig.eventThreadCount()); + while (runningState.isRunning()) { + try { + SocketMessage event = eventQueue.take(); + handleEvent(event); + } catch (InterruptedException e) { + // The game is shutting down. + eventExecutor.shutdownNow(); + Thread.currentThread().interrupt(); + } + } + eventExecutor.shutdown(); + } + + @SuppressWarnings("unchecked") + private AbstractSocketEventHandler getHandler(Class type) { + return (AbstractSocketEventHandler) handlers.get(type); + } + + @SuppressWarnings("unchecked") + private void handleEvent(SocketMessage event) { + eventExecutor.submit(() -> { + try { + AbstractSocketEventHandler handler = getHandler((Class) event.getClass()); + handler.handle(event); + } catch (Exception e) { + log.error("Error", e); + } + }); + } +} diff --git a/game/src/main/java/cz/jzitnik/client/socket/events/ConnectGameHandler.java b/game/src/main/java/cz/jzitnik/client/socket/events/ConnectGameHandler.java new file mode 100644 index 0000000..37a1343 --- /dev/null +++ b/game/src/main/java/cz/jzitnik/client/socket/events/ConnectGameHandler.java @@ -0,0 +1,38 @@ +package cz.jzitnik.client.socket.events; + +import cz.jzitnik.client.annotations.SocketEventHandler; +import cz.jzitnik.client.annotations.injectors.InjectDependency; +import cz.jzitnik.client.annotations.injectors.InjectState; +import cz.jzitnik.client.events.TerminalResizeEvent; +import cz.jzitnik.client.game.GameState; +import cz.jzitnik.client.game.OtherPlayer; +import cz.jzitnik.client.game.Player; +import cz.jzitnik.client.socket.AbstractSocketEventHandler; +import cz.jzitnik.client.states.TerminalState; +import cz.jzitnik.client.utils.events.EventManager; +import cz.jzitnik.common.socket.messages.game.connection.ConnectToAGameResponse; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@SocketEventHandler(ConnectToAGameResponse.class) +public class ConnectGameHandler extends AbstractSocketEventHandler { + @InjectState + private GameState gameState; + @InjectDependency + private EventManager eventManager; + @InjectState + private TerminalState terminalState; + + @Override + public void handle(ConnectToAGameResponse event) { + if (!event.success()) { + log.debug("Error"); + return; + } + + gameState.setPlayer(new Player(event.playerCreation())); + gameState.getAllOtherPlayers().addAll(event.existingPlayers().stream().map(OtherPlayer::new).toList()); + gameState.setScreen(null); + eventManager.emitEvent(new TerminalResizeEvent(terminalState.getTerminalScreen().getTerminalSize())); + } +} diff --git a/game/src/main/java/cz/jzitnik/client/socket/events/CreateGameHandler.java b/game/src/main/java/cz/jzitnik/client/socket/events/CreateGameHandler.java new file mode 100644 index 0000000..e36cd2b --- /dev/null +++ b/game/src/main/java/cz/jzitnik/client/socket/events/CreateGameHandler.java @@ -0,0 +1,32 @@ +package cz.jzitnik.client.socket.events; + +import cz.jzitnik.client.annotations.SocketEventHandler; +import cz.jzitnik.client.annotations.injectors.InjectDependency; +import cz.jzitnik.client.annotations.injectors.InjectState; +import cz.jzitnik.client.events.TerminalResizeEvent; +import cz.jzitnik.client.game.GameState; +import cz.jzitnik.client.game.Player; +import cz.jzitnik.client.socket.AbstractSocketEventHandler; +import cz.jzitnik.client.states.TerminalState; +import cz.jzitnik.client.utils.events.EventManager; +import cz.jzitnik.common.socket.messages.game.creation.CreateGameResponse; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@SocketEventHandler(CreateGameResponse.class) +public class CreateGameHandler extends AbstractSocketEventHandler { + @InjectState + private GameState gameState; + @InjectState + private TerminalState terminalState; + @InjectDependency + private EventManager eventManager; + + @Override + public void handle(CreateGameResponse event) { + log.debug("Game code: {}", event.getGamePassword()); + gameState.setPlayer(new Player(event.getOwnerPlayer())); + gameState.setScreen(null); + eventManager.emitEvent(new TerminalResizeEvent(terminalState.getTerminalScreen().getTerminalSize())); + } +} diff --git a/game/src/main/java/cz/jzitnik/client/socket/events/ItemTookFromChestHandler.java b/game/src/main/java/cz/jzitnik/client/socket/events/ItemTookFromChestHandler.java new file mode 100644 index 0000000..9925d22 --- /dev/null +++ b/game/src/main/java/cz/jzitnik/client/socket/events/ItemTookFromChestHandler.java @@ -0,0 +1,43 @@ +package cz.jzitnik.client.socket.events; + +import cz.jzitnik.client.annotations.SocketEventHandler; +import cz.jzitnik.client.annotations.injectors.InjectState; +import cz.jzitnik.client.game.GameRoom; +import cz.jzitnik.client.game.GameState; +import cz.jzitnik.client.game.items.GameItem; +import cz.jzitnik.client.game.objects.Chest; +import cz.jzitnik.client.game.objects.GameObject; +import cz.jzitnik.client.socket.AbstractSocketEventHandler; +import cz.jzitnik.common.socket.messages.items.ItemTookFromChest; + +@SocketEventHandler(ItemTookFromChest.class) +public class ItemTookFromChestHandler extends AbstractSocketEventHandler { + @InjectState + private GameState gameState; + + @Override + public void handle(ItemTookFromChest event) { + for (GameRoom room : gameState.getAllRooms()) { + if (!room.getId().equals(event.roomId())) { + continue; + } + + for (GameObject object : room.getObjects()) { + if (object instanceof Chest chest) { + var items = chest.getItems(); + + for (GameItem item : items) { + if (item.getId() != event.id()) { + continue; + } + + items.remove(item); + chest.handleItemRemoval(item); + + return; + } + } + } + } + } +} diff --git a/game/src/main/java/cz/jzitnik/client/socket/events/MovePlayerRoomResponseHandler.java b/game/src/main/java/cz/jzitnik/client/socket/events/MovePlayerRoomResponseHandler.java new file mode 100644 index 0000000..2b9f166 --- /dev/null +++ b/game/src/main/java/cz/jzitnik/client/socket/events/MovePlayerRoomResponseHandler.java @@ -0,0 +1,38 @@ +package cz.jzitnik.client.socket.events; + +import cz.jzitnik.client.annotations.SocketEventHandler; +import cz.jzitnik.client.annotations.injectors.InjectDependency; +import cz.jzitnik.client.annotations.injectors.InjectState; +import cz.jzitnik.client.events.FullRoomDraw; +import cz.jzitnik.client.game.GameState; +import cz.jzitnik.client.game.OtherPlayer; +import cz.jzitnik.client.socket.AbstractSocketEventHandler; +import cz.jzitnik.client.utils.events.EventManager; +import cz.jzitnik.common.socket.messages.room.MovePlayerRoomResponse; + +import java.util.Set; + +@SocketEventHandler(MovePlayerRoomResponse.class) +public class MovePlayerRoomResponseHandler extends AbstractSocketEventHandler { + @InjectDependency + private EventManager eventManager; + + @InjectState + private GameState gameState; + + @Override + public void handle(MovePlayerRoomResponse event) { + Set ids = event.getIds(); + + for (OtherPlayer player : gameState.getAllOtherPlayers()) { + player.setVisible(ids.contains(player.getId())); + var playerRegistryOptional = event.getById(player.getId()); + if (player.isVisible() && playerRegistryOptional.isPresent()) { + player.getPlayerCords().updateCords(playerRegistryOptional.get().cords()); + player.setPlayerRotation(playerRegistryOptional.get().playerRotation()); + } + } + + eventManager.emitEvent(new FullRoomDraw()); + } +} diff --git a/game/src/main/java/cz/jzitnik/client/socket/events/PlayerArrivalChangeHandler.java b/game/src/main/java/cz/jzitnik/client/socket/events/PlayerArrivalChangeHandler.java new file mode 100644 index 0000000..ac5bca6 --- /dev/null +++ b/game/src/main/java/cz/jzitnik/client/socket/events/PlayerArrivalChangeHandler.java @@ -0,0 +1,87 @@ +package cz.jzitnik.client.socket.events; + +import com.googlecode.lanterna.TerminalPosition; +import cz.jzitnik.client.annotations.SocketEventHandler; +import cz.jzitnik.client.annotations.injectors.InjectConfig; +import cz.jzitnik.client.annotations.injectors.InjectDependency; +import cz.jzitnik.client.annotations.injectors.InjectState; +import cz.jzitnik.client.config.Debugging; +import cz.jzitnik.client.events.MouseMoveEvent; +import cz.jzitnik.client.events.RerenderScreen; +import cz.jzitnik.client.game.GameRoom; +import cz.jzitnik.client.game.GameState; +import cz.jzitnik.client.game.OtherPlayer; +import cz.jzitnik.client.game.ResourceManager; +import cz.jzitnik.client.socket.AbstractSocketEventHandler; +import cz.jzitnik.client.states.ScreenBuffer; +import cz.jzitnik.client.states.TerminalState; +import cz.jzitnik.client.ui.Stats; +import cz.jzitnik.client.utils.RerenderUtils; +import cz.jzitnik.client.utils.events.Event; +import cz.jzitnik.client.utils.events.EventManager; +import cz.jzitnik.common.socket.messages.player.PlayerArrivalChange; +import lombok.extern.slf4j.Slf4j; + +import java.awt.image.BufferedImage; + +@Slf4j +@SocketEventHandler(PlayerArrivalChange.class) +public class PlayerArrivalChangeHandler extends AbstractSocketEventHandler { + @InjectState + private GameState gameState; + + @InjectDependency + private ResourceManager resourceManager; + + @InjectDependency + private EventManager eventManager; + + @InjectState + private TerminalState terminalState; + + @InjectState + private ScreenBuffer screenBuffer; + + @InjectConfig + private Debugging debugging; + + @Override + public void handle(PlayerArrivalChange event) { + log.debug("Player appear change: {}", event.id()); + OtherPlayer otherPlayer = gameState.getAllOtherPlayers().stream().filter(otherPlayer1 -> otherPlayer1.getId() == event.id()).findFirst().get(); + otherPlayer.setVisible(event.arrived()); + otherPlayer.getPlayerCords().updateCords(event.playerCords()); + otherPlayer.setPlayerRotation(event.playerRotation()); + + GameRoom currentRoom = gameState.getCurrentRoom(); + BufferedImage playerTexture = otherPlayer.getTexture(resourceManager); + BufferedImage room = resourceManager.getResource(currentRoom.getTexture()); + + int forStartX = event.playerCords().getX(); + int forStartY = event.playerCords().getY(); + int forEndX = forStartX + playerTexture.getWidth(); + int forEndY = forStartY + playerTexture.getHeight(); + + var start = RerenderUtils.getStart(room, terminalState.getTerminalScreen().getTerminalSize()); + int startX = start.getX(); + int startY = start.getY(); + + RerenderUtils.rerenderPart(forStartX, forEndX, forStartY, forEndY, startX, startY, currentRoom, room, gameState.getPlayer(), screenBuffer, resourceManager, debugging, gameState.getOtherPlayers()); + + eventManager.emitEvent(new Event[]{ + new MouseMoveEvent(null), + new RerenderScreen( + new RerenderScreen.ScreenPart[]{ + new RerenderScreen.ScreenPart( + new TerminalPosition(forStartX + startX, forStartY + startY), + new TerminalPosition(forEndX + 1 + startX, forEndY + startY) + ), + new RerenderScreen.ScreenPart( + new TerminalPosition(Stats.OFFSET_X, Stats.OFFSET_X), + new TerminalPosition(Stats.OFFSET_X + Stats.WIDTH, Stats.OFFSET_Y + Stats.HEIGHT) + ) + } + ) + }); + } +} diff --git a/game/src/main/java/cz/jzitnik/client/socket/events/PlayerDisconnectedHandler.java b/game/src/main/java/cz/jzitnik/client/socket/events/PlayerDisconnectedHandler.java new file mode 100644 index 0000000..bed6d39 --- /dev/null +++ b/game/src/main/java/cz/jzitnik/client/socket/events/PlayerDisconnectedHandler.java @@ -0,0 +1,18 @@ +package cz.jzitnik.client.socket.events; + +import cz.jzitnik.client.annotations.SocketEventHandler; +import cz.jzitnik.client.annotations.injectors.InjectState; +import cz.jzitnik.client.game.GameState; +import cz.jzitnik.client.socket.AbstractSocketEventHandler; +import cz.jzitnik.common.socket.messages.player.PlayerDisconnected; + +@SocketEventHandler(PlayerDisconnected.class) +public class PlayerDisconnectedHandler extends AbstractSocketEventHandler { + @InjectState + private GameState gameState; + + @Override + public void handle(PlayerDisconnected event) { + gameState.getAllOtherPlayers().removeIf(player -> player.getId() == event.playerId()); + } +} diff --git a/game/src/main/java/cz/jzitnik/client/socket/events/PlayerJoinedHandler.java b/game/src/main/java/cz/jzitnik/client/socket/events/PlayerJoinedHandler.java new file mode 100644 index 0000000..f01d126 --- /dev/null +++ b/game/src/main/java/cz/jzitnik/client/socket/events/PlayerJoinedHandler.java @@ -0,0 +1,22 @@ +package cz.jzitnik.client.socket.events; + +import cz.jzitnik.client.annotations.SocketEventHandler; +import cz.jzitnik.client.annotations.injectors.InjectState; +import cz.jzitnik.client.game.GameState; +import cz.jzitnik.client.game.OtherPlayer; +import cz.jzitnik.client.socket.AbstractSocketEventHandler; +import cz.jzitnik.common.socket.messages.player.PlayerJoined; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@SocketEventHandler(PlayerJoined.class) +public class PlayerJoinedHandler extends AbstractSocketEventHandler { + @InjectState + private GameState gameState; + + @Override + public void handle(PlayerJoined event) { + log.debug("Player joined: {}", event.playerCreation().getId()); + gameState.getAllOtherPlayers().add(new OtherPlayer(event.playerCreation())); + } +} diff --git a/game/src/main/java/cz/jzitnik/client/socket/events/PlayerMovedInUrRoomHandler.java b/game/src/main/java/cz/jzitnik/client/socket/events/PlayerMovedInUrRoomHandler.java new file mode 100644 index 0000000..84a15a6 --- /dev/null +++ b/game/src/main/java/cz/jzitnik/client/socket/events/PlayerMovedInUrRoomHandler.java @@ -0,0 +1,94 @@ +package cz.jzitnik.client.socket.events; + +import com.googlecode.lanterna.TerminalPosition; +import cz.jzitnik.client.annotations.SocketEventHandler; +import cz.jzitnik.client.annotations.injectors.InjectConfig; +import cz.jzitnik.client.annotations.injectors.InjectDependency; +import cz.jzitnik.client.annotations.injectors.InjectState; +import cz.jzitnik.client.config.Debugging; +import cz.jzitnik.client.events.MouseMoveEvent; +import cz.jzitnik.client.events.RerenderScreen; +import cz.jzitnik.client.game.GameRoom; +import cz.jzitnik.client.game.GameState; +import cz.jzitnik.client.game.OtherPlayer; +import cz.jzitnik.client.game.ResourceManager; +import cz.jzitnik.client.socket.AbstractSocketEventHandler; +import cz.jzitnik.client.states.ScreenBuffer; +import cz.jzitnik.client.states.TerminalState; +import cz.jzitnik.client.ui.Stats; +import cz.jzitnik.client.utils.RerenderUtils; +import cz.jzitnik.client.utils.events.Event; +import cz.jzitnik.client.utils.events.EventManager; +import cz.jzitnik.common.socket.messages.player.PlayerMovedInUrRoom; +import lombok.extern.slf4j.Slf4j; + +import java.awt.image.BufferedImage; + +@Slf4j +@SocketEventHandler(PlayerMovedInUrRoom.class) +public class PlayerMovedInUrRoomHandler extends AbstractSocketEventHandler { + @InjectState + private GameState gameState; + + @InjectDependency + private EventManager eventManager; + + @InjectDependency + private ResourceManager resourceManager; + + @InjectState + private ScreenBuffer screenBuffer; + + @InjectConfig + private Debugging debugging; + + @InjectState + private TerminalState terminalState; + + @Override + public void handle(PlayerMovedInUrRoom event) { + log.debug("Player moved: {}", event.getPlayerId()); + OtherPlayer otherPlayer = gameState.getAllOtherPlayers().stream().filter(otherPlayer1 -> otherPlayer1.getId() == event.getPlayerId()).findFirst().get(); + otherPlayer.setPlayerRotation(event.getPlayerRotation()); + + var oldCords = otherPlayer.getPlayerCords(); + var newCords = event.getCords(); + + GameRoom currentRoom = gameState.getCurrentRoom(); + BufferedImage playerTexture = otherPlayer.getTexture(resourceManager); + BufferedImage room = resourceManager.getResource(currentRoom.getTexture()); + int originalPlayerX = oldCords.getX(); + int originalPlayerY = oldCords.getY(); + int newPlayerX = newCords.getX(); + int newPlayerY = newCords.getY(); + + int forStartX = Math.min(originalPlayerX, newPlayerX); + int forStartY = Math.min(originalPlayerY, newPlayerY); + int forEndX = Math.max(originalPlayerX, newPlayerX) + playerTexture.getWidth(); + int forEndY = Math.max(originalPlayerY, newPlayerY) + playerTexture.getHeight(); + + var start = RerenderUtils.getStart(room, terminalState.getTerminalScreen().getTerminalSize()); + int startX = start.getX(); + int startY = start.getY(); + + otherPlayer.getPlayerCords().updateCords(newCords); + + RerenderUtils.rerenderPart(forStartX, forEndX, forStartY, forEndY, startX, startY, currentRoom, room, gameState.getPlayer(), screenBuffer, resourceManager, debugging, gameState.getOtherPlayers()); + + eventManager.emitEvent(new Event[]{ + new MouseMoveEvent(null), + new RerenderScreen( + new RerenderScreen.ScreenPart[]{ + new RerenderScreen.ScreenPart( + new TerminalPosition(forStartX + startX, forStartY + startY), + new TerminalPosition(forEndX + 1 + startX, forEndY + startY) + ), + new RerenderScreen.ScreenPart( + new TerminalPosition(Stats.OFFSET_X, Stats.OFFSET_X), + new TerminalPosition(Stats.OFFSET_X + Stats.WIDTH, Stats.OFFSET_Y + Stats.HEIGHT) + ) + } + ) + }); + } +} diff --git a/game/src/main/java/cz/jzitnik/client/socket/events/TestHandler.java b/game/src/main/java/cz/jzitnik/client/socket/events/TestHandler.java new file mode 100644 index 0000000..14e181d --- /dev/null +++ b/game/src/main/java/cz/jzitnik/client/socket/events/TestHandler.java @@ -0,0 +1,15 @@ +package cz.jzitnik.client.socket.events; + +import cz.jzitnik.client.annotations.SocketEventHandler; +import cz.jzitnik.client.socket.AbstractSocketEventHandler; +import cz.jzitnik.common.socket.messages.Test; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@SocketEventHandler(Test.class) +public class TestHandler extends AbstractSocketEventHandler { + @Override + public void handle(Test event) { + log.debug("Got test: {}", event); + } +} diff --git a/src/main/java/cz/jzitnik/sound/SoundPlayer.java b/game/src/main/java/cz/jzitnik/client/sound/SoundPlayer.java similarity index 99% rename from src/main/java/cz/jzitnik/sound/SoundPlayer.java rename to game/src/main/java/cz/jzitnik/client/sound/SoundPlayer.java index ea18f7a..293a38f 100644 --- a/src/main/java/cz/jzitnik/sound/SoundPlayer.java +++ b/game/src/main/java/cz/jzitnik/client/sound/SoundPlayer.java @@ -1,4 +1,4 @@ -package cz.jzitnik.sound; +package cz.jzitnik.client.sound; import javax.sound.sampled.*; diff --git a/src/main/java/cz/jzitnik/states/DialogState.java b/game/src/main/java/cz/jzitnik/client/states/DialogState.java similarity index 60% rename from src/main/java/cz/jzitnik/states/DialogState.java rename to game/src/main/java/cz/jzitnik/client/states/DialogState.java index 60f15e0..4e36f41 100644 --- a/src/main/java/cz/jzitnik/states/DialogState.java +++ b/game/src/main/java/cz/jzitnik/client/states/DialogState.java @@ -1,7 +1,7 @@ -package cz.jzitnik.states; +package cz.jzitnik.client.states; -import cz.jzitnik.annotations.State; -import cz.jzitnik.game.dialog.Dialog; +import cz.jzitnik.client.annotations.State; +import cz.jzitnik.client.game.dialog.Dialog; import lombok.Data; @State diff --git a/src/main/java/cz/jzitnik/states/MicrophoneState.java b/game/src/main/java/cz/jzitnik/client/states/MicrophoneState.java similarity index 65% rename from src/main/java/cz/jzitnik/states/MicrophoneState.java rename to game/src/main/java/cz/jzitnik/client/states/MicrophoneState.java index 1095ddd..1c540e0 100644 --- a/src/main/java/cz/jzitnik/states/MicrophoneState.java +++ b/game/src/main/java/cz/jzitnik/client/states/MicrophoneState.java @@ -1,6 +1,6 @@ -package cz.jzitnik.states; +package cz.jzitnik.client.states; -import cz.jzitnik.annotations.State; +import cz.jzitnik.client.annotations.State; import lombok.Data; @Data diff --git a/game/src/main/java/cz/jzitnik/client/states/PlayerConfig.java b/game/src/main/java/cz/jzitnik/client/states/PlayerConfig.java new file mode 100644 index 0000000..38d1595 --- /dev/null +++ b/game/src/main/java/cz/jzitnik/client/states/PlayerConfig.java @@ -0,0 +1,8 @@ +package cz.jzitnik.client.states; + +import cz.jzitnik.client.annotations.State; + +@State +public class PlayerConfig { + private int masterVolume = 100; +} diff --git a/src/main/java/cz/jzitnik/states/PlayerMovementState.java b/game/src/main/java/cz/jzitnik/client/states/PlayerMovementState.java similarity index 70% rename from src/main/java/cz/jzitnik/states/PlayerMovementState.java rename to game/src/main/java/cz/jzitnik/client/states/PlayerMovementState.java index eaa4e1d..6f5b966 100644 --- a/src/main/java/cz/jzitnik/states/PlayerMovementState.java +++ b/game/src/main/java/cz/jzitnik/client/states/PlayerMovementState.java @@ -1,6 +1,6 @@ -package cz.jzitnik.states; +package cz.jzitnik.client.states; -import cz.jzitnik.annotations.State; +import cz.jzitnik.client.annotations.State; import lombok.Data; import java.util.concurrent.ScheduledFuture; diff --git a/src/main/java/cz/jzitnik/states/RenderState.java b/game/src/main/java/cz/jzitnik/client/states/RenderState.java similarity index 70% rename from src/main/java/cz/jzitnik/states/RenderState.java rename to game/src/main/java/cz/jzitnik/client/states/RenderState.java index faf2ea5..85e5a12 100644 --- a/src/main/java/cz/jzitnik/states/RenderState.java +++ b/game/src/main/java/cz/jzitnik/client/states/RenderState.java @@ -1,6 +1,6 @@ -package cz.jzitnik.states; +package cz.jzitnik.client.states; -import cz.jzitnik.annotations.State; +import cz.jzitnik.client.annotations.State; import lombok.Getter; import lombok.Setter; diff --git a/src/main/java/cz/jzitnik/states/RunningState.java b/game/src/main/java/cz/jzitnik/client/states/RunningState.java similarity index 56% rename from src/main/java/cz/jzitnik/states/RunningState.java rename to game/src/main/java/cz/jzitnik/client/states/RunningState.java index 0333c74..f52a53f 100644 --- a/src/main/java/cz/jzitnik/states/RunningState.java +++ b/game/src/main/java/cz/jzitnik/client/states/RunningState.java @@ -1,6 +1,6 @@ -package cz.jzitnik.states; +package cz.jzitnik.client.states; -import cz.jzitnik.annotations.State; +import cz.jzitnik.client.annotations.State; import lombok.Data; @Data diff --git a/src/main/java/cz/jzitnik/states/ScreenBuffer.java b/game/src/main/java/cz/jzitnik/client/states/ScreenBuffer.java similarity index 53% rename from src/main/java/cz/jzitnik/states/ScreenBuffer.java rename to game/src/main/java/cz/jzitnik/client/states/ScreenBuffer.java index 2465b17..17de964 100644 --- a/src/main/java/cz/jzitnik/states/ScreenBuffer.java +++ b/game/src/main/java/cz/jzitnik/client/states/ScreenBuffer.java @@ -1,8 +1,8 @@ -package cz.jzitnik.states; +package cz.jzitnik.client.states; -import cz.jzitnik.annotations.State; -import cz.jzitnik.ui.pixels.AlphaPixel; -import cz.jzitnik.ui.pixels.Pixel; +import cz.jzitnik.client.annotations.State; +import cz.jzitnik.client.ui.pixels.AlphaPixel; +import cz.jzitnik.client.ui.pixels.Pixel; import lombok.Data; @Data diff --git a/src/main/java/cz/jzitnik/states/TerminalState.java b/game/src/main/java/cz/jzitnik/client/states/TerminalState.java similarity index 76% rename from src/main/java/cz/jzitnik/states/TerminalState.java rename to game/src/main/java/cz/jzitnik/client/states/TerminalState.java index c21f555..4cfdc41 100644 --- a/src/main/java/cz/jzitnik/states/TerminalState.java +++ b/game/src/main/java/cz/jzitnik/client/states/TerminalState.java @@ -1,8 +1,8 @@ -package cz.jzitnik.states; +package cz.jzitnik.client.states; import com.googlecode.lanterna.graphics.TextGraphics; import com.googlecode.lanterna.screen.TerminalScreen; -import cz.jzitnik.annotations.State; +import cz.jzitnik.client.annotations.State; import lombok.Data; @State diff --git a/src/main/java/cz/jzitnik/tasks/StaminaIncreaseTask.java b/game/src/main/java/cz/jzitnik/client/tasks/StaminaIncreaseTask.java similarity index 76% rename from src/main/java/cz/jzitnik/tasks/StaminaIncreaseTask.java rename to game/src/main/java/cz/jzitnik/client/tasks/StaminaIncreaseTask.java index 3866b02..f1b49fb 100644 --- a/src/main/java/cz/jzitnik/tasks/StaminaIncreaseTask.java +++ b/game/src/main/java/cz/jzitnik/client/tasks/StaminaIncreaseTask.java @@ -1,17 +1,17 @@ -package cz.jzitnik.tasks; +package cz.jzitnik.client.tasks; -import cz.jzitnik.annotations.ScheduledTask; -import cz.jzitnik.annotations.injectors.InjectConfig; -import cz.jzitnik.annotations.injectors.InjectDependency; -import cz.jzitnik.annotations.injectors.InjectState; -import cz.jzitnik.config.PlayerConfig; -import cz.jzitnik.events.RenderStats; -import cz.jzitnik.game.GameState; -import cz.jzitnik.game.Player; -import cz.jzitnik.states.PlayerMovementState; -import cz.jzitnik.utils.DependencyManager; -import cz.jzitnik.utils.ScheduledTaskManager; -import cz.jzitnik.utils.events.EventManager; +import cz.jzitnik.client.annotations.ScheduledTask; +import cz.jzitnik.client.annotations.injectors.InjectConfig; +import cz.jzitnik.client.annotations.injectors.InjectDependency; +import cz.jzitnik.client.annotations.injectors.InjectState; +import cz.jzitnik.client.config.PlayerConfig; +import cz.jzitnik.client.events.RenderStats; +import cz.jzitnik.client.game.GameState; +import cz.jzitnik.client.game.Player; +import cz.jzitnik.client.states.PlayerMovementState; +import cz.jzitnik.client.utils.DependencyManager; +import cz.jzitnik.client.utils.ScheduledTaskManager; +import cz.jzitnik.client.utils.events.EventManager; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; diff --git a/src/main/java/cz/jzitnik/threads/MicrophoneThread.java b/game/src/main/java/cz/jzitnik/client/threads/MicrophoneThread.java similarity index 88% rename from src/main/java/cz/jzitnik/threads/MicrophoneThread.java rename to game/src/main/java/cz/jzitnik/client/threads/MicrophoneThread.java index 16f5041..54b8393 100644 --- a/src/main/java/cz/jzitnik/threads/MicrophoneThread.java +++ b/game/src/main/java/cz/jzitnik/client/threads/MicrophoneThread.java @@ -1,14 +1,14 @@ -package cz.jzitnik.threads; +package cz.jzitnik.client.threads; import be.tarsos.dsp.AudioDispatcher; import be.tarsos.dsp.AudioEvent; import be.tarsos.dsp.AudioProcessor; import be.tarsos.dsp.filters.HighPass; import be.tarsos.dsp.io.jvm.AudioDispatcherFactory; -import cz.jzitnik.annotations.ThreadRegistry; -import cz.jzitnik.annotations.injectors.InjectState; -import cz.jzitnik.states.MicrophoneState; -import cz.jzitnik.utils.ShutdownableThread; +import cz.jzitnik.client.annotations.ThreadRegistry; +import cz.jzitnik.client.annotations.injectors.InjectState; +import cz.jzitnik.client.states.MicrophoneState; +import cz.jzitnik.client.utils.ShutdownableThread; import lombok.extern.slf4j.Slf4j; import javax.sound.sampled.LineUnavailableException; diff --git a/src/main/java/cz/jzitnik/ui/DialogUI.java b/game/src/main/java/cz/jzitnik/client/ui/DialogUI.java similarity index 86% rename from src/main/java/cz/jzitnik/ui/DialogUI.java rename to game/src/main/java/cz/jzitnik/client/ui/DialogUI.java index af1ea7f..6de27b5 100644 --- a/src/main/java/cz/jzitnik/ui/DialogUI.java +++ b/game/src/main/java/cz/jzitnik/client/ui/DialogUI.java @@ -1,27 +1,27 @@ -package cz.jzitnik.ui; +package cz.jzitnik.client.ui; import com.googlecode.lanterna.TerminalPosition; import com.googlecode.lanterna.TerminalSize; -import cz.jzitnik.annotations.Dependency; -import cz.jzitnik.annotations.injectors.InjectDependency; -import cz.jzitnik.annotations.injectors.InjectState; -import cz.jzitnik.annotations.ui.MouseHandler; -import cz.jzitnik.annotations.ui.MouseHandlerType; -import cz.jzitnik.annotations.ui.UI; -import cz.jzitnik.events.MouseAction; -import cz.jzitnik.events.RerenderScreen; -import cz.jzitnik.events.handlers.DialogEventHandler; -import cz.jzitnik.game.dialog.OnEnd; -import cz.jzitnik.states.DialogState; -import cz.jzitnik.states.ScreenBuffer; -import cz.jzitnik.states.TerminalState; -import cz.jzitnik.ui.pixels.Empty; -import cz.jzitnik.utils.TextRenderer; -import cz.jzitnik.utils.events.Event; -import cz.jzitnik.utils.events.EventManager; +import cz.jzitnik.client.annotations.Dependency; +import cz.jzitnik.client.annotations.injectors.InjectDependency; +import cz.jzitnik.client.annotations.injectors.InjectState; +import cz.jzitnik.client.annotations.ui.MouseHandler; +import cz.jzitnik.client.annotations.ui.MouseHandlerType; +import cz.jzitnik.client.annotations.ui.UI; +import cz.jzitnik.client.events.MouseAction; +import cz.jzitnik.client.events.RerenderScreen; +import cz.jzitnik.client.events.handlers.DialogEventHandler; +import cz.jzitnik.client.game.dialog.OnEnd; +import cz.jzitnik.client.states.DialogState; +import cz.jzitnik.client.states.ScreenBuffer; +import cz.jzitnik.client.states.TerminalState; +import cz.jzitnik.client.ui.pixels.Empty; +import cz.jzitnik.client.utils.TextRenderer; +import cz.jzitnik.client.utils.events.Event; +import cz.jzitnik.client.utils.events.EventManager; import lombok.extern.slf4j.Slf4j; -import static cz.jzitnik.events.handlers.DialogEventHandler.*; +import static cz.jzitnik.client.events.handlers.DialogEventHandler.*; @Slf4j @UI diff --git a/src/main/java/cz/jzitnik/ui/GlobalShortcuts.java b/game/src/main/java/cz/jzitnik/client/ui/GlobalShortcuts.java similarity index 59% rename from src/main/java/cz/jzitnik/ui/GlobalShortcuts.java rename to game/src/main/java/cz/jzitnik/client/ui/GlobalShortcuts.java index 4434020..02b0ac4 100644 --- a/src/main/java/cz/jzitnik/ui/GlobalShortcuts.java +++ b/game/src/main/java/cz/jzitnik/client/ui/GlobalShortcuts.java @@ -1,15 +1,13 @@ -package cz.jzitnik.ui; +package cz.jzitnik.client.ui; import com.googlecode.lanterna.input.KeyType; -import cz.jzitnik.annotations.Dependency; -import cz.jzitnik.annotations.injectors.InjectDependency; -import cz.jzitnik.annotations.ui.KeyboardPressHandler; -import cz.jzitnik.annotations.ui.UI; -import cz.jzitnik.events.ExitEvent; -import cz.jzitnik.events.FullRedrawEvent; -import cz.jzitnik.events.KeyboardPressEvent; -import cz.jzitnik.events.PlayerMoveEvent; -import cz.jzitnik.utils.events.EventManager; +import cz.jzitnik.client.annotations.Dependency; +import cz.jzitnik.client.annotations.injectors.InjectDependency; +import cz.jzitnik.client.annotations.ui.KeyboardPressHandler; +import cz.jzitnik.client.annotations.ui.UI; +import cz.jzitnik.client.events.*; +import cz.jzitnik.client.utils.events.EventManager; +import cz.jzitnik.common.socket.messages.Test; @UI @Dependency @@ -37,4 +35,11 @@ public class GlobalShortcuts { eventManager.emitEvent(new PlayerMoveEvent(event.getKeyStroke())); return true; } + + @KeyboardPressHandler(character = 'p') + public boolean debugSocket(KeyboardPressEvent event) { + eventManager.emitEvent(new SendSocketMessageEvent(new Test())); + + return true; + } } diff --git a/src/main/java/cz/jzitnik/ui/Inventory.java b/game/src/main/java/cz/jzitnik/client/ui/Inventory.java similarity index 89% rename from src/main/java/cz/jzitnik/ui/Inventory.java rename to game/src/main/java/cz/jzitnik/client/ui/Inventory.java index 794a74b..8390187 100644 --- a/src/main/java/cz/jzitnik/ui/Inventory.java +++ b/game/src/main/java/cz/jzitnik/client/ui/Inventory.java @@ -1,34 +1,35 @@ -package cz.jzitnik.ui; +package cz.jzitnik.client.ui; import com.googlecode.lanterna.TerminalPosition; import com.googlecode.lanterna.TerminalSize; import com.googlecode.lanterna.TextColor; -import cz.jzitnik.annotations.Dependency; -import cz.jzitnik.annotations.injectors.InjectConfig; -import cz.jzitnik.annotations.injectors.InjectDependency; -import cz.jzitnik.annotations.injectors.InjectState; -import cz.jzitnik.annotations.ui.*; -import cz.jzitnik.config.CoreLogic; -import cz.jzitnik.events.DroppedItemRerender; -import cz.jzitnik.events.InventoryRerender; -import cz.jzitnik.events.KeyboardPressEvent; -import cz.jzitnik.events.MouseAction; -import cz.jzitnik.game.GameState; -import cz.jzitnik.game.ResourceManager; -import cz.jzitnik.game.items.GameItem; -import cz.jzitnik.game.items.types.InteractableItem; -import cz.jzitnik.game.objects.DroppedItem; -import cz.jzitnik.game.utils.RoomCords; -import cz.jzitnik.states.ScreenBuffer; -import cz.jzitnik.states.TerminalState; -import cz.jzitnik.ui.pixels.ColoredPixel; -import cz.jzitnik.ui.pixels.Pixel; -import cz.jzitnik.ui.utils.Grid; -import cz.jzitnik.utils.DependencyManager; -import cz.jzitnik.utils.RerenderUtils; -import cz.jzitnik.utils.ScheduledSerializedTaskManager; -import cz.jzitnik.utils.StateManager; -import cz.jzitnik.utils.events.EventManager; +import cz.jzitnik.client.annotations.Dependency; +import cz.jzitnik.client.annotations.injectors.InjectConfig; +import cz.jzitnik.client.annotations.injectors.InjectDependency; +import cz.jzitnik.client.annotations.injectors.InjectState; +import cz.jzitnik.client.annotations.ui.*; +import cz.jzitnik.client.config.CoreLogic; +import cz.jzitnik.client.events.DroppedItemRerender; +import cz.jzitnik.client.events.InventoryRerender; +import cz.jzitnik.client.events.KeyboardPressEvent; +import cz.jzitnik.client.events.MouseAction; +import cz.jzitnik.client.game.GameState; +import cz.jzitnik.client.game.ResourceManager; +import cz.jzitnik.client.game.items.GameItem; +import cz.jzitnik.client.game.items.types.InteractableItem; +import cz.jzitnik.client.game.objects.DroppedItem; +import cz.jzitnik.client.ui.pixels.AlphaPixel; +import cz.jzitnik.common.models.coordinates.RoomCords; +import cz.jzitnik.client.states.ScreenBuffer; +import cz.jzitnik.client.states.TerminalState; +import cz.jzitnik.client.ui.pixels.ColoredPixel; +import cz.jzitnik.client.ui.pixels.Pixel; +import cz.jzitnik.client.ui.utils.Grid; +import cz.jzitnik.client.utils.DependencyManager; +import cz.jzitnik.client.utils.RerenderUtils; +import cz.jzitnik.client.utils.ScheduledSerializedTaskManager; +import cz.jzitnik.client.utils.StateManager; +import cz.jzitnik.client.utils.events.EventManager; import lombok.Getter; import lombok.extern.slf4j.Slf4j; @@ -50,17 +51,17 @@ public class Inventory { private static final int INNER_BORDER_WIDTH = 1; private static final int ITEM_SIZE = 16; // Characters private static final int ITEM_PADDING = 2; // padding on each side - public static final Pixel BORDER_COLOR = + public static final AlphaPixel BORDER_COLOR = new ColoredPixel(new TextColor.RGB(41, 29, 19)); - public static final Pixel BACKGROUND_COLOR = + public static final AlphaPixel BACKGROUND_COLOR = new ColoredPixel(new TextColor.RGB(61, 45, 29)); - private static final Pixel BACKGROUND_COLOR_HOVERED = + public static final AlphaPixel BACKGROUND_COLOR_HOVERED = new ColoredPixel(new TextColor.RGB(77, 56, 36)); - private static final Pixel BACKGROUND_COLOR_SELECTED = + private static final AlphaPixel BACKGROUND_COLOR_SELECTED = new ColoredPixel(new TextColor.RGB(95, 62, 32)); - private static final Pixel BACKGROUND_COLOR_EQUIPPED = + private static final AlphaPixel BACKGROUND_COLOR_EQUIPPED = new ColoredPixel(new TextColor.RGB(50, 145, 150)); - private static final Pixel BACKGROUND_COLOR_EQUIPPED_SELECTED = + private static final AlphaPixel BACKGROUND_COLOR_EQUIPPED_SELECTED = new ColoredPixel(new TextColor.RGB(58, 170, 176)); private static final int ITEM_SLOT_SIZE = ITEM_SIZE + ITEM_PADDING * 2; public static final int INVENTORY_WIDTH = diff --git a/src/main/java/cz/jzitnik/ui/Stats.java b/game/src/main/java/cz/jzitnik/client/ui/Stats.java similarity index 84% rename from src/main/java/cz/jzitnik/ui/Stats.java rename to game/src/main/java/cz/jzitnik/client/ui/Stats.java index 74a7ddd..f729ed1 100644 --- a/src/main/java/cz/jzitnik/ui/Stats.java +++ b/game/src/main/java/cz/jzitnik/client/ui/Stats.java @@ -1,19 +1,19 @@ -package cz.jzitnik.ui; +package cz.jzitnik.client.ui; import com.googlecode.lanterna.TextColor; -import cz.jzitnik.annotations.Dependency; -import cz.jzitnik.annotations.injectors.InjectDependency; -import cz.jzitnik.annotations.injectors.InjectState; -import cz.jzitnik.annotations.ui.Render; -import cz.jzitnik.annotations.ui.UI; -import cz.jzitnik.game.GameState; -import cz.jzitnik.game.Player; -import cz.jzitnik.game.ResourceManager; -import cz.jzitnik.states.ScreenBuffer; -import cz.jzitnik.ui.pixels.ColoredPixel; -import cz.jzitnik.ui.pixels.Empty; -import cz.jzitnik.ui.pixels.Pixel; -import cz.jzitnik.utils.RerenderUtils; +import cz.jzitnik.client.annotations.Dependency; +import cz.jzitnik.client.annotations.injectors.InjectDependency; +import cz.jzitnik.client.annotations.injectors.InjectState; +import cz.jzitnik.client.annotations.ui.Render; +import cz.jzitnik.client.annotations.ui.UI; +import cz.jzitnik.client.game.GameState; +import cz.jzitnik.client.game.Player; +import cz.jzitnik.client.game.ResourceManager; +import cz.jzitnik.client.states.ScreenBuffer; +import cz.jzitnik.client.ui.pixels.ColoredPixel; +import cz.jzitnik.client.ui.pixels.Empty; +import cz.jzitnik.client.ui.pixels.Pixel; +import cz.jzitnik.client.utils.RerenderUtils; import lombok.Getter; import java.awt.image.BufferedImage; diff --git a/src/main/java/cz/jzitnik/ui/pixels/AlphaPixel.java b/game/src/main/java/cz/jzitnik/client/ui/pixels/AlphaPixel.java similarity index 73% rename from src/main/java/cz/jzitnik/ui/pixels/AlphaPixel.java rename to game/src/main/java/cz/jzitnik/client/ui/pixels/AlphaPixel.java index fdc1ff9..a7e13f8 100644 --- a/src/main/java/cz/jzitnik/ui/pixels/AlphaPixel.java +++ b/game/src/main/java/cz/jzitnik/client/ui/pixels/AlphaPixel.java @@ -1,4 +1,4 @@ -package cz.jzitnik.ui.pixels; +package cz.jzitnik.client.ui.pixels; import com.googlecode.lanterna.TextColor; import lombok.Getter; @@ -10,4 +10,8 @@ public sealed abstract class AlphaPixel extends Pixel permits Empty, ColoredPixe super(color); this.alpha = alpha; } + + public boolean isTransparent() { + return alpha == 0f; + } } diff --git a/src/main/java/cz/jzitnik/ui/pixels/ColoredPixel.java b/game/src/main/java/cz/jzitnik/client/ui/pixels/ColoredPixel.java similarity index 87% rename from src/main/java/cz/jzitnik/ui/pixels/ColoredPixel.java rename to game/src/main/java/cz/jzitnik/client/ui/pixels/ColoredPixel.java index 0c844ab..767da0a 100644 --- a/src/main/java/cz/jzitnik/ui/pixels/ColoredPixel.java +++ b/game/src/main/java/cz/jzitnik/client/ui/pixels/ColoredPixel.java @@ -1,4 +1,4 @@ -package cz.jzitnik.ui.pixels; +package cz.jzitnik.client.ui.pixels; import com.googlecode.lanterna.TextColor; diff --git a/src/main/java/cz/jzitnik/ui/pixels/Empty.java b/game/src/main/java/cz/jzitnik/client/ui/pixels/Empty.java similarity index 73% rename from src/main/java/cz/jzitnik/ui/pixels/Empty.java rename to game/src/main/java/cz/jzitnik/client/ui/pixels/Empty.java index 761bc06..219cc2d 100644 --- a/src/main/java/cz/jzitnik/ui/pixels/Empty.java +++ b/game/src/main/java/cz/jzitnik/client/ui/pixels/Empty.java @@ -1,4 +1,4 @@ -package cz.jzitnik.ui.pixels; +package cz.jzitnik.client.ui.pixels; public final class Empty extends AlphaPixel { public Empty() { diff --git a/src/main/java/cz/jzitnik/ui/pixels/Pixel.java b/game/src/main/java/cz/jzitnik/client/ui/pixels/Pixel.java similarity index 85% rename from src/main/java/cz/jzitnik/ui/pixels/Pixel.java rename to game/src/main/java/cz/jzitnik/client/ui/pixels/Pixel.java index 462f242..1d7a1b9 100644 --- a/src/main/java/cz/jzitnik/ui/pixels/Pixel.java +++ b/game/src/main/java/cz/jzitnik/client/ui/pixels/Pixel.java @@ -1,4 +1,4 @@ -package cz.jzitnik.ui.pixels; +package cz.jzitnik.client.ui.pixels; import com.googlecode.lanterna.TextColor; import lombok.AllArgsConstructor; diff --git a/game/src/main/java/cz/jzitnik/client/ui/utils/Button.java b/game/src/main/java/cz/jzitnik/client/ui/utils/Button.java new file mode 100644 index 0000000..c2876fb --- /dev/null +++ b/game/src/main/java/cz/jzitnik/client/ui/utils/Button.java @@ -0,0 +1,50 @@ +package cz.jzitnik.client.ui.utils; + +import cz.jzitnik.client.ui.pixels.AlphaPixel; +import cz.jzitnik.client.utils.TextRenderer; + +import java.awt.*; + +public record Button( + AlphaPixel borderColor, + AlphaPixel backgroundColor, + AlphaPixel backgroundSelectedColor, + Color textColor, + int height, + int width, + int borderWidth, + float fontSize, + TextRenderer textRenderer +) { + public AlphaPixel[][] render(String text, boolean selected) { + AlphaPixel[][] buf = new AlphaPixel[height][width]; + AlphaPixel[][] textBuf = textRenderer.renderTextSingleLine(text, width - borderWidth * 2, height - borderWidth * 2, textColor, fontSize, true, true); + + for (int y = 0; y < height; y++) { + for (int x = 0; x < width; x++) { + if (x < borderWidth || y < borderWidth || x >= width - borderWidth || y >= height - borderWidth) { + buf[y][x] = borderColor; + continue; + } + + if (x == borderWidth || y == borderWidth || x - 1 == width - borderWidth || y == height - borderWidth) { + buf[y][x] = selected ? backgroundSelectedColor : backgroundColor; + continue; + } + + int textActualX = x - borderWidth - 1; + int textActualY = y - borderWidth - 1; + AlphaPixel textPixel = textBuf[textActualY][textActualX]; + + if (!textPixel.isTransparent()) { + buf[y][x] = textPixel; + continue; + } + + buf[y][x] = selected ? backgroundSelectedColor : backgroundColor; + } + } + + return buf; + } +} diff --git a/src/main/java/cz/jzitnik/ui/utils/Grid.java b/game/src/main/java/cz/jzitnik/client/ui/utils/Grid.java similarity index 98% rename from src/main/java/cz/jzitnik/ui/utils/Grid.java rename to game/src/main/java/cz/jzitnik/client/ui/utils/Grid.java index 5d5c3ae..d97ba3a 100644 --- a/src/main/java/cz/jzitnik/ui/utils/Grid.java +++ b/game/src/main/java/cz/jzitnik/client/ui/utils/Grid.java @@ -1,7 +1,7 @@ -package cz.jzitnik.ui.utils; +package cz.jzitnik.client.ui.utils; -import cz.jzitnik.ui.pixels.ColoredPixel; -import cz.jzitnik.ui.pixels.Pixel; +import cz.jzitnik.client.ui.pixels.ColoredPixel; +import cz.jzitnik.client.ui.pixels.Pixel; import java.awt.image.BufferedImage; diff --git a/game/src/main/java/cz/jzitnik/client/ui/utils/Input.java b/game/src/main/java/cz/jzitnik/client/ui/utils/Input.java new file mode 100644 index 0000000..1cb9e8d --- /dev/null +++ b/game/src/main/java/cz/jzitnik/client/ui/utils/Input.java @@ -0,0 +1,55 @@ +package cz.jzitnik.client.ui.utils; + +import com.googlecode.lanterna.TextColor; +import cz.jzitnik.client.ui.pixels.AlphaPixel; +import cz.jzitnik.client.ui.pixels.ColoredPixel; +import cz.jzitnik.client.ui.pixels.Empty; +import cz.jzitnik.client.utils.TextRenderer; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +import java.awt.*; + +@AllArgsConstructor +@RequiredArgsConstructor +public class Input { + @Getter + private String contentBuffer; + private final int height; + private final int width; + + public AlphaPixel[][] render(TextRenderer textRenderer) { + AlphaPixel[][] buffer = new AlphaPixel[height][width]; + AlphaPixel[][] textBuf = new AlphaPixel[0][0]; + + if (!contentBuffer.isEmpty()) { + textBuf = textRenderer.renderTextSingleLine(contentBuffer, width - 4, height - 4, Color.WHITE, 15f, false, true); + } + + for (int y = 0; y < height; y++) { + for (int x = 0; x < width; x++) { + if (x == 0 || y == 0 || x == width - 1 || y == height - 1) { + buffer[y][x] = new ColoredPixel(new TextColor.RGB(255, 255, 255)); + continue; + } + + if (x == 1 || y == 1 || x == width - 2 || y == height - 2) { + buffer[y][x] = new Empty(); + continue; + } + + int realX = x - 2; + int realY = y - 2; + + if (contentBuffer.isEmpty()) { + buffer[y][x] = new Empty(); + } else { + buffer[y][x] = textBuf[realY][realX]; + } + } + } + + return buffer; + } +} diff --git a/src/main/java/cz/jzitnik/utils/DependencyManager.java b/game/src/main/java/cz/jzitnik/client/utils/DependencyManager.java similarity index 95% rename from src/main/java/cz/jzitnik/utils/DependencyManager.java rename to game/src/main/java/cz/jzitnik/client/utils/DependencyManager.java index df403be..3e67869 100644 --- a/src/main/java/cz/jzitnik/utils/DependencyManager.java +++ b/game/src/main/java/cz/jzitnik/client/utils/DependencyManager.java @@ -1,16 +1,16 @@ -package cz.jzitnik.utils; +package cz.jzitnik.client.utils; // Don't blame me that I'm using field injection instead of construction injection. I just like it more, leave me alone. // Yes, I know I'll suffer in the unit tests. (who said there will be any? hmmm) import com.google.common.collect.ClassToInstanceMap; import com.google.common.collect.MutableClassToInstanceMap; -import cz.jzitnik.annotations.Config; -import cz.jzitnik.annotations.Dependency; -import cz.jzitnik.annotations.PostInit; -import cz.jzitnik.annotations.injectors.InjectConfig; -import cz.jzitnik.annotations.injectors.InjectDependency; -import cz.jzitnik.annotations.injectors.InjectState; +import cz.jzitnik.client.annotations.Config; +import cz.jzitnik.client.annotations.Dependency; +import cz.jzitnik.client.annotations.PostInit; +import cz.jzitnik.client.annotations.injectors.InjectConfig; +import cz.jzitnik.client.annotations.injectors.InjectDependency; +import cz.jzitnik.client.annotations.injectors.InjectState; import lombok.extern.slf4j.Slf4j; import org.reflections.Reflections; import tools.jackson.core.JacksonException; diff --git a/src/main/java/cz/jzitnik/utils/GlobalIOHandlerRepository.java b/game/src/main/java/cz/jzitnik/client/utils/GlobalIOHandlerRepository.java similarity index 92% rename from src/main/java/cz/jzitnik/utils/GlobalIOHandlerRepository.java rename to game/src/main/java/cz/jzitnik/client/utils/GlobalIOHandlerRepository.java index 062283b..61aa022 100644 --- a/src/main/java/cz/jzitnik/utils/GlobalIOHandlerRepository.java +++ b/game/src/main/java/cz/jzitnik/client/utils/GlobalIOHandlerRepository.java @@ -1,14 +1,14 @@ -package cz.jzitnik.utils; +package cz.jzitnik.client.utils; import com.googlecode.lanterna.input.KeyType; -import cz.jzitnik.annotations.Dependency; -import cz.jzitnik.annotations.injectors.InjectDependency; -import cz.jzitnik.annotations.ui.KeyboardPressHandler; -import cz.jzitnik.annotations.ui.MouseHandler; -import cz.jzitnik.annotations.ui.Render; -import cz.jzitnik.annotations.ui.UI; -import cz.jzitnik.events.KeyboardPressEvent; -import cz.jzitnik.events.MouseAction; +import cz.jzitnik.client.annotations.Dependency; +import cz.jzitnik.client.annotations.injectors.InjectDependency; +import cz.jzitnik.client.annotations.ui.KeyboardPressHandler; +import cz.jzitnik.client.annotations.ui.MouseHandler; +import cz.jzitnik.client.annotations.ui.Render; +import cz.jzitnik.client.annotations.ui.UI; +import cz.jzitnik.client.events.KeyboardPressEvent; +import cz.jzitnik.client.events.MouseAction; import lombok.extern.slf4j.Slf4j; import org.reflections.Reflections; diff --git a/src/main/java/cz/jzitnik/utils/RerenderUtils.java b/game/src/main/java/cz/jzitnik/client/utils/RerenderUtils.java similarity index 78% rename from src/main/java/cz/jzitnik/utils/RerenderUtils.java rename to game/src/main/java/cz/jzitnik/client/utils/RerenderUtils.java index 1f691c5..752d533 100644 --- a/src/main/java/cz/jzitnik/utils/RerenderUtils.java +++ b/game/src/main/java/cz/jzitnik/client/utils/RerenderUtils.java @@ -1,26 +1,27 @@ -package cz.jzitnik.utils; +package cz.jzitnik.client.utils; import com.googlecode.lanterna.TerminalSize; import com.googlecode.lanterna.TextColor; -import cz.jzitnik.config.Debugging; -import cz.jzitnik.events.handlers.FullRoomDrawHandler; -import cz.jzitnik.game.GameRoom; -import cz.jzitnik.game.Player; -import cz.jzitnik.game.ResourceManager; -import cz.jzitnik.game.mobs.Mob; -import cz.jzitnik.game.objects.DroppedItem; -import cz.jzitnik.game.objects.GameObject; -import cz.jzitnik.game.utils.RoomCords; -import cz.jzitnik.states.ScreenBuffer; -import cz.jzitnik.ui.pixels.ColoredPixel; -import cz.jzitnik.ui.pixels.Empty; -import cz.jzitnik.ui.pixels.Pixel; +import cz.jzitnik.client.config.Debugging; +import cz.jzitnik.client.events.handlers.FullRoomDrawHandler; +import cz.jzitnik.client.game.*; +import cz.jzitnik.client.game.mobs.Mob; +import cz.jzitnik.client.game.objects.DroppedItem; +import cz.jzitnik.client.game.objects.GameObject; +import cz.jzitnik.common.models.coordinates.RoomCords; +import cz.jzitnik.client.states.ScreenBuffer; +import cz.jzitnik.client.ui.pixels.ColoredPixel; +import cz.jzitnik.client.ui.pixels.Empty; +import cz.jzitnik.client.ui.pixels.Pixel; import lombok.extern.slf4j.Slf4j; import java.awt.image.BufferedImage; import java.util.HashSet; +import java.util.List; import java.util.Map; import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; @Slf4j public class RerenderUtils { @@ -36,14 +37,14 @@ public class RerenderUtils { return new RoomCords(x, y); } - public static void rerenderPart(int startX, int endX, int startY, int endY, int screenStartX, int screenStartY, GameRoom currentRoom, BufferedImage room, Player player, BufferedImage playerTexture, ScreenBuffer screenBuffer, ResourceManager resourceManager, Debugging debugging) { + public static void rerenderPart(int startX, int endX, int startY, int endY, int screenStartX, int screenStartY, GameRoom currentRoom, BufferedImage room, Player player, ScreenBuffer screenBuffer, ResourceManager resourceManager, Debugging debugging, List otherPlayers) { var buffer = screenBuffer.getRenderedBuffer(); var overrideBuffer = currentRoom.getOverrideBuffer(); BufferedImage doors = resourceManager.getResource(ResourceManager.Resource.DOORS); Set doorPositions = RerenderUtils.getDoorPositions(currentRoom); for (int x = startX; x <= endX; x++) { for (int y = startY; y <= endY; y++) { - PixelResult pixelResult = getPixel(currentRoom, room, doors, doorPositions, player, playerTexture, x, y, debugging); + PixelResult pixelResult = getPixel(currentRoom, room, doors, doorPositions, player, resourceManager, x, y, debugging, otherPlayers); int pixel = pixelResult.pixel(); int red = (pixel >> 16) & 0xff; @@ -63,26 +64,34 @@ public class RerenderUtils { public record PixelResult(int pixel, boolean isPlayer) { } - public static PixelResult getPixel(GameRoom currentRoom, BufferedImage room, BufferedImage doors, Set doorPositions, Player player, BufferedImage playerTexture, int x, int y, Debugging debugging) { + public static PixelResult getPixel(GameRoom currentRoom, BufferedImage room, BufferedImage doors, Set doorPositions, Player player, ResourceManager resourceManager, int x, int y, Debugging debugging, List visiblePlayer) { float factor = 1.5f; // brightness multiplier if (debugging.renderColliders() && currentRoom.getColliders().stream().anyMatch(collider -> collider.isWithin(new RoomCords(x, y)))) { return new PixelResult(0xFFFF0000, false); } - if (x >= player.getPlayerCords().getX() && x < player.getPlayerCords().getX() + playerTexture.getWidth() - 1 && y >= player.getPlayerCords().getY() && y <= player.getPlayerCords().getY() + playerTexture.getHeight() - 1) { - int relativeX = x - player.getPlayerCords().getX(); - int relativeY = y - player.getPlayerCords().getY(); - var playerCollider = player.getCollider(); + List players = Stream.concat( + Stream.of(player), + visiblePlayer.stream() + ).toList(); - if (debugging.renderPlayerCollider() && playerCollider.isWithin(new RoomCords(relativeX, relativeY))) { - return new PixelResult(0xFFFF0000, false); - } + var playerCollider = player.getCollider(); + for (GamePlayer player1 : players) { + var playerTexture = player1.getTexture(resourceManager); + if (x >= player1.getPlayerCords().getX() && x < player1.getPlayerCords().getX() + playerTexture.getWidth() - 1 && y >= player1.getPlayerCords().getY() && y <= player1.getPlayerCords().getY() + playerTexture.getHeight() - 1) { + int relativeX = x - player1.getPlayerCords().getX(); + int relativeY = y - player1.getPlayerCords().getY(); - int pixel = playerTexture.getRGB(relativeX, relativeY); - int alpha = (pixel >> 24) & 0xff; + if (debugging.renderPlayerCollider() && playerCollider.isWithin(new RoomCords(relativeX, relativeY))) { + return new PixelResult(0xFFFF0000, false); + } - if (alpha != 0) { - return new PixelResult(pixel, true); + int pixel = playerTexture.getRGB(relativeX, relativeY); + int alpha = (pixel >> 24) & 0xff; + + if (alpha != 0) { + return new PixelResult(pixel, true); + } } } diff --git a/src/main/java/cz/jzitnik/utils/ScheduledSerializedTaskManager.java b/game/src/main/java/cz/jzitnik/client/utils/ScheduledSerializedTaskManager.java similarity index 96% rename from src/main/java/cz/jzitnik/utils/ScheduledSerializedTaskManager.java rename to game/src/main/java/cz/jzitnik/client/utils/ScheduledSerializedTaskManager.java index 600e3df..1a51b5f 100644 --- a/src/main/java/cz/jzitnik/utils/ScheduledSerializedTaskManager.java +++ b/game/src/main/java/cz/jzitnik/client/utils/ScheduledSerializedTaskManager.java @@ -1,7 +1,7 @@ -package cz.jzitnik.utils; +package cz.jzitnik.client.utils; -import cz.jzitnik.annotations.Dependency; -import cz.jzitnik.annotations.injectors.InjectDependency; +import cz.jzitnik.client.annotations.Dependency; +import cz.jzitnik.client.annotations.injectors.InjectDependency; import lombok.Getter; import lombok.extern.slf4j.Slf4j; diff --git a/src/main/java/cz/jzitnik/utils/ScheduledTaskManager.java b/game/src/main/java/cz/jzitnik/client/utils/ScheduledTaskManager.java similarity index 91% rename from src/main/java/cz/jzitnik/utils/ScheduledTaskManager.java rename to game/src/main/java/cz/jzitnik/client/utils/ScheduledTaskManager.java index 18f6649..e7782f8 100644 --- a/src/main/java/cz/jzitnik/utils/ScheduledTaskManager.java +++ b/game/src/main/java/cz/jzitnik/client/utils/ScheduledTaskManager.java @@ -1,9 +1,9 @@ -package cz.jzitnik.utils; +package cz.jzitnik.client.utils; -import cz.jzitnik.annotations.Dependency; -import cz.jzitnik.annotations.ScheduledTask; -import cz.jzitnik.annotations.injectors.InjectConfig; -import cz.jzitnik.config.ThreadPoolConfig; +import cz.jzitnik.client.annotations.Dependency; +import cz.jzitnik.client.annotations.ScheduledTask; +import cz.jzitnik.client.annotations.injectors.InjectConfig; +import cz.jzitnik.client.config.ThreadPoolConfig; import lombok.extern.slf4j.Slf4j; import org.reflections.Reflections; diff --git a/src/main/java/cz/jzitnik/utils/ShutdownableThread.java b/game/src/main/java/cz/jzitnik/client/utils/ShutdownableThread.java similarity index 79% rename from src/main/java/cz/jzitnik/utils/ShutdownableThread.java rename to game/src/main/java/cz/jzitnik/client/utils/ShutdownableThread.java index 20d7c13..8400862 100644 --- a/src/main/java/cz/jzitnik/utils/ShutdownableThread.java +++ b/game/src/main/java/cz/jzitnik/client/utils/ShutdownableThread.java @@ -1,4 +1,4 @@ -package cz.jzitnik.utils; +package cz.jzitnik.client.utils; public abstract class ShutdownableThread extends Thread { public abstract void run(); diff --git a/src/main/java/cz/jzitnik/utils/StateManager.java b/game/src/main/java/cz/jzitnik/client/utils/StateManager.java similarity index 93% rename from src/main/java/cz/jzitnik/utils/StateManager.java rename to game/src/main/java/cz/jzitnik/client/utils/StateManager.java index 51837a9..d57298b 100644 --- a/src/main/java/cz/jzitnik/utils/StateManager.java +++ b/game/src/main/java/cz/jzitnik/client/utils/StateManager.java @@ -1,8 +1,8 @@ // NOTE: [StateManager] cannot use injectors like @InjectDependency or @InjectState -package cz.jzitnik.utils; +package cz.jzitnik.client.utils; -import cz.jzitnik.annotations.Dependency; -import cz.jzitnik.annotations.State; +import cz.jzitnik.client.annotations.Dependency; +import cz.jzitnik.client.annotations.State; import lombok.extern.slf4j.Slf4j; import org.reflections.Reflections; diff --git a/src/main/java/cz/jzitnik/utils/TextRenderer.java b/game/src/main/java/cz/jzitnik/client/utils/TextRenderer.java similarity index 79% rename from src/main/java/cz/jzitnik/utils/TextRenderer.java rename to game/src/main/java/cz/jzitnik/client/utils/TextRenderer.java index 1431115..580039b 100644 --- a/src/main/java/cz/jzitnik/utils/TextRenderer.java +++ b/game/src/main/java/cz/jzitnik/client/utils/TextRenderer.java @@ -1,12 +1,12 @@ -package cz.jzitnik.utils; +package cz.jzitnik.client.utils; import com.googlecode.lanterna.TextColor; -import cz.jzitnik.annotations.Dependency; -import cz.jzitnik.annotations.injectors.InjectDependency; -import cz.jzitnik.game.ResourceManager; -import cz.jzitnik.ui.pixels.AlphaPixel; -import cz.jzitnik.ui.pixels.ColoredPixel; -import cz.jzitnik.ui.pixels.Empty; +import cz.jzitnik.client.annotations.Dependency; +import cz.jzitnik.client.annotations.injectors.InjectDependency; +import cz.jzitnik.client.game.ResourceManager; +import cz.jzitnik.client.ui.pixels.AlphaPixel; +import cz.jzitnik.client.ui.pixels.ColoredPixel; +import cz.jzitnik.client.ui.pixels.Empty; import java.awt.*; import java.awt.font.FontRenderContext; @@ -23,7 +23,39 @@ public class TextRenderer { @InjectDependency private ResourceManager resourceManager; - public AlphaPixel[][] renderText(String text, int width, int height, Color textColor, float size) { + public AlphaPixel[][] renderTextSingleLine(String text, int width, int height, Color textColor, float size, boolean centeredHorizontally, boolean centeredVertically) { + Font font = loadFont(size); + BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); + Graphics2D g2d = createGraphics(img, font, textColor); + FontMetrics fm = g2d.getFontMetrics(); + + int x; + int textWidth = fm.stringWidth(text); + if (centeredHorizontally) { + x = (width - textWidth) / 2; + } else { + if (textWidth > width) { + x = width - textWidth; + } else { + x = 0; + } + } + + int y; + if (centeredVertically) { + y = ((height - fm.getHeight()) / 2) + fm.getAscent(); + } else { + int verticalOffset = calculateVerticalOffset(text, font, fm.getFontRenderContext(), List.of(text)); + y = fm.getAscent() - verticalOffset; + } + + g2d.drawString(text, x, y); + g2d.dispose(); + + return convertToPixels(img, width, height); + } + + public AlphaPixel[][] renderText(String text, int width, int height, Color textColor, float size, boolean centered) { Font font = loadFont(size); BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); Graphics2D g2d = createGraphics(img, font, textColor); @@ -37,7 +69,14 @@ public class TextRenderer { int y = fm.getAscent() - verticalOffset; for (String line : lines) { - g2d.drawString(line, 0, y); + int x = 0; + + if (centered) { + int lineWidth = fm.stringWidth(line); + x = (width - lineWidth) / 2; + } + + g2d.drawString(line, x, y); y += lineHeight; } g2d.dispose(); diff --git a/src/main/java/cz/jzitnik/utils/ThreadManager.java b/game/src/main/java/cz/jzitnik/client/utils/ThreadManager.java similarity index 90% rename from src/main/java/cz/jzitnik/utils/ThreadManager.java rename to game/src/main/java/cz/jzitnik/client/utils/ThreadManager.java index 789e881..63569fa 100644 --- a/src/main/java/cz/jzitnik/utils/ThreadManager.java +++ b/game/src/main/java/cz/jzitnik/client/utils/ThreadManager.java @@ -1,7 +1,7 @@ -package cz.jzitnik.utils; +package cz.jzitnik.client.utils; -import cz.jzitnik.annotations.Dependency; -import cz.jzitnik.annotations.ThreadRegistry; +import cz.jzitnik.client.annotations.Dependency; +import cz.jzitnik.client.annotations.ThreadRegistry; import org.reflections.Reflections; import java.lang.reflect.InvocationTargetException; diff --git a/src/main/java/cz/jzitnik/utils/UIRoomClickHandlerRepository.java b/game/src/main/java/cz/jzitnik/client/utils/UIRoomClickHandlerRepository.java similarity index 90% rename from src/main/java/cz/jzitnik/utils/UIRoomClickHandlerRepository.java rename to game/src/main/java/cz/jzitnik/client/utils/UIRoomClickHandlerRepository.java index 70d9e88..d1707a3 100644 --- a/src/main/java/cz/jzitnik/utils/UIRoomClickHandlerRepository.java +++ b/game/src/main/java/cz/jzitnik/client/utils/UIRoomClickHandlerRepository.java @@ -1,14 +1,14 @@ -package cz.jzitnik.utils; +package cz.jzitnik.client.utils; import com.googlecode.lanterna.TerminalPosition; -import cz.jzitnik.annotations.Dependency; -import cz.jzitnik.annotations.injectors.InjectDependency; -import cz.jzitnik.annotations.injectors.InjectState; -import cz.jzitnik.events.MouseAction; -import cz.jzitnik.events.RerenderScreen; -import cz.jzitnik.game.GameRoom; -import cz.jzitnik.game.GameState; -import cz.jzitnik.game.objects.UIClickHandler; +import cz.jzitnik.client.annotations.Dependency; +import cz.jzitnik.client.annotations.injectors.InjectDependency; +import cz.jzitnik.client.annotations.injectors.InjectState; +import cz.jzitnik.client.events.MouseAction; +import cz.jzitnik.client.events.RerenderScreen; +import cz.jzitnik.client.game.GameRoom; +import cz.jzitnik.client.game.GameState; +import cz.jzitnik.client.game.objects.UIClickHandler; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; diff --git a/game/src/main/java/cz/jzitnik/client/utils/events/AbstractEventHandler.java b/game/src/main/java/cz/jzitnik/client/utils/events/AbstractEventHandler.java new file mode 100644 index 0000000..e5924d3 --- /dev/null +++ b/game/src/main/java/cz/jzitnik/client/utils/events/AbstractEventHandler.java @@ -0,0 +1,5 @@ +package cz.jzitnik.client.utils.events; + +public abstract class AbstractEventHandler { + public abstract void handle(T event); +} diff --git a/game/src/main/java/cz/jzitnik/client/utils/events/Event.java b/game/src/main/java/cz/jzitnik/client/utils/events/Event.java new file mode 100644 index 0000000..5e5fac4 --- /dev/null +++ b/game/src/main/java/cz/jzitnik/client/utils/events/Event.java @@ -0,0 +1,4 @@ +package cz.jzitnik.client.utils.events; + +public interface Event { +} diff --git a/src/main/java/cz/jzitnik/utils/events/EventManager.java b/game/src/main/java/cz/jzitnik/client/utils/events/EventManager.java similarity index 86% rename from src/main/java/cz/jzitnik/utils/events/EventManager.java rename to game/src/main/java/cz/jzitnik/client/utils/events/EventManager.java index 7437dfa..ddcf8d9 100644 --- a/src/main/java/cz/jzitnik/utils/events/EventManager.java +++ b/game/src/main/java/cz/jzitnik/client/utils/events/EventManager.java @@ -1,12 +1,12 @@ -package cz.jzitnik.utils.events; +package cz.jzitnik.client.utils.events; -import cz.jzitnik.annotations.Dependency; -import cz.jzitnik.annotations.EventHandler; -import cz.jzitnik.annotations.injectors.InjectConfig; -import cz.jzitnik.annotations.injectors.InjectState; -import cz.jzitnik.config.ThreadPoolConfig; -import cz.jzitnik.states.RunningState; -import cz.jzitnik.utils.DependencyManager; +import cz.jzitnik.client.annotations.Dependency; +import cz.jzitnik.client.annotations.EventHandler; +import cz.jzitnik.client.annotations.injectors.InjectConfig; +import cz.jzitnik.client.annotations.injectors.InjectState; +import cz.jzitnik.client.config.ThreadPoolConfig; +import cz.jzitnik.client.states.RunningState; +import cz.jzitnik.client.utils.DependencyManager; import lombok.extern.slf4j.Slf4j; import org.reflections.Reflections; @@ -24,7 +24,7 @@ public class EventManager extends Thread { private ThreadPoolConfig threadPoolConfig; private ExecutorService eventExecutor; - private final HashMap, AbstractEventHandler> handlers = new HashMap<>(); + private final HashMap, AbstractEventHandler> handlers = new HashMap<>(); private final BlockingQueue eventQueue = new LinkedBlockingQueue<>(); private final DependencyManager dependencyManager; @@ -74,7 +74,7 @@ public class EventManager extends Thread { for (var clazz : classes) { EventHandler eventHandler = clazz.getAnnotation(EventHandler.class); try { - var instance = (AbstractEventHandler) clazz.getDeclaredConstructor().newInstance(); + var instance = (AbstractEventHandler) clazz.getDeclaredConstructor().newInstance(); handlers.put(eventHandler.value(), instance); } catch (InstantiationException | IllegalAccessException | InvocationTargetException | NoSuchMethodException e) { diff --git a/src/main/java/cz/jzitnik/utils/roomtasks/RoomTask.java b/game/src/main/java/cz/jzitnik/client/utils/roomtasks/RoomTask.java similarity index 89% rename from src/main/java/cz/jzitnik/utils/roomtasks/RoomTask.java rename to game/src/main/java/cz/jzitnik/client/utils/roomtasks/RoomTask.java index 837c202..5d7b05e 100644 --- a/src/main/java/cz/jzitnik/utils/roomtasks/RoomTask.java +++ b/game/src/main/java/cz/jzitnik/client/utils/roomtasks/RoomTask.java @@ -1,4 +1,4 @@ -package cz.jzitnik.utils.roomtasks; +package cz.jzitnik.client.utils.roomtasks; import com.fasterxml.jackson.annotation.JsonIgnore; import lombok.Getter; diff --git a/src/main/java/cz/jzitnik/utils/roomtasks/RoomTaskScheduler.java b/game/src/main/java/cz/jzitnik/client/utils/roomtasks/RoomTaskScheduler.java similarity index 84% rename from src/main/java/cz/jzitnik/utils/roomtasks/RoomTaskScheduler.java rename to game/src/main/java/cz/jzitnik/client/utils/roomtasks/RoomTaskScheduler.java index 74ef556..9252634 100644 --- a/src/main/java/cz/jzitnik/utils/roomtasks/RoomTaskScheduler.java +++ b/game/src/main/java/cz/jzitnik/client/utils/roomtasks/RoomTaskScheduler.java @@ -1,13 +1,13 @@ -package cz.jzitnik.utils.roomtasks; +package cz.jzitnik.client.utils.roomtasks; -import cz.jzitnik.annotations.Dependency; -import cz.jzitnik.annotations.PostInit; -import cz.jzitnik.annotations.injectors.InjectConfig; -import cz.jzitnik.annotations.injectors.InjectDependency; -import cz.jzitnik.config.ThreadPoolConfig; -import cz.jzitnik.game.GameRoom; -import cz.jzitnik.game.mobs.Mob; -import cz.jzitnik.utils.DependencyManager; +import cz.jzitnik.client.annotations.Dependency; +import cz.jzitnik.client.annotations.PostInit; +import cz.jzitnik.client.annotations.injectors.InjectConfig; +import cz.jzitnik.client.annotations.injectors.InjectDependency; +import cz.jzitnik.client.config.ThreadPoolConfig; +import cz.jzitnik.client.game.GameRoom; +import cz.jzitnik.client.game.mobs.Mob; +import cz.jzitnik.client.utils.DependencyManager; import lombok.extern.slf4j.Slf4j; import java.util.HashMap; diff --git a/src/main/resources/audio.ogg b/game/src/main/resources/audio.ogg similarity index 100% rename from src/main/resources/audio.ogg rename to game/src/main/resources/audio.ogg diff --git a/src/main/resources/audio/menu.ogg b/game/src/main/resources/audio/menu.ogg similarity index 100% rename from src/main/resources/audio/menu.ogg rename to game/src/main/resources/audio/menu.ogg diff --git a/src/main/resources/config/core_logic.yaml b/game/src/main/resources/config/core_logic.yaml similarity index 100% rename from src/main/resources/config/core_logic.yaml rename to game/src/main/resources/config/core_logic.yaml diff --git a/src/main/resources/config/debugging.yaml b/game/src/main/resources/config/debugging.yaml similarity index 100% rename from src/main/resources/config/debugging.yaml rename to game/src/main/resources/config/debugging.yaml diff --git a/src/main/resources/config/microphone.yaml b/game/src/main/resources/config/microphone.yaml similarity index 100% rename from src/main/resources/config/microphone.yaml rename to game/src/main/resources/config/microphone.yaml diff --git a/src/main/resources/config/player.yaml b/game/src/main/resources/config/player.yaml similarity index 100% rename from src/main/resources/config/player.yaml rename to game/src/main/resources/config/player.yaml diff --git a/src/main/resources/config/threads.yaml b/game/src/main/resources/config/threads.yaml similarity index 100% rename from src/main/resources/config/threads.yaml rename to game/src/main/resources/config/threads.yaml diff --git a/src/main/resources/fonts/default.ttf b/game/src/main/resources/fonts/default.ttf similarity index 100% rename from src/main/resources/fonts/default.ttf rename to game/src/main/resources/fonts/default.ttf diff --git a/src/main/resources/logback.xml b/game/src/main/resources/logback.xml similarity index 100% rename from src/main/resources/logback.xml rename to game/src/main/resources/logback.xml diff --git a/src/main/resources/menu.png b/game/src/main/resources/menu.png similarity index 100% rename from src/main/resources/menu.png rename to game/src/main/resources/menu.png diff --git a/src/main/resources/setup/rooms.yaml b/game/src/main/resources/setup/rooms.yaml similarity index 76% rename from src/main/resources/setup/rooms.yaml rename to game/src/main/resources/setup/rooms.yaml index af1a388..b9ea51f 100644 --- a/src/main/resources/setup/rooms.yaml +++ b/game/src/main/resources/setup/rooms.yaml @@ -1,33 +1,33 @@ - id: "spawn" texture: "ROOM1" - mobs: - - type: "hittable_drops" - texture: "PLAYER_FRONT" - cords: - x: 100 - y: 100 - collider: - start: - x: 0 - y: 52 - end: - x: 44 - y: 78 - health: 10 - itemsDrops: - - name: "Apple" - type: - name: "food" - addHealth: 1 - texture: "APPLE" - tasks: - - type: "blind_following_player" - speed: 1 - updateRateMs: 100 - - type: "attacking_player" - damage: 5 - reach: 15 - updateRateMs: 500 + #mobs: + # - type: "hittable_drops" + # texture: "PLAYER_FRONT" + # cords: + # x: 100 + # y: 100 + # collider: + # start: + # x: 0 + # y: 52 + # end: + # x: 44 + # y: 78 + # health: 10 + # itemsDrops: + # - name: "Apple" + # type: + # name: "food" + # addHealth: 1 + # texture: "APPLE" + # tasks: + # - type: "blind_following_player" + # speed: 1 + # updateRateMs: 100 + # - type: "attacking_player" + # damage: 5 + # reach: 15 + # updateRateMs: 500 west: "empty" east: "truhlaright" north: null @@ -41,12 +41,14 @@ x: 100 y: 45 items: - - name: "Wooden sword" + - id: 1 + name: "Wooden sword" type: name: "weapon_sword" dealDamage: 1 texture: "WOODEN_SWORD" - - name: "Apple" + - id: 2 + name: "Apple" type: name: "food" addHealth: 1 @@ -58,7 +60,7 @@ end: x: 140 y: 67 - west: "mainroom" + west: "spawn" east: null north: "klicnik" south: null @@ -78,12 +80,14 @@ x: 100 y: 45 items: - - name: "Wooden sword" + - id: 3 + name: "Wooden sword" type: name: "weapon_sword" dealDamage: 1 texture: "WOODEN_SWORD" - - name: "Apple" + - id: 4 + name: "Apple" type: name: "food" addHealth: 1 @@ -124,7 +128,8 @@ y: 78 health: 10 itemsDrops: - - name: "Apple" + - id: 5 + name: "Apple" type: name: "food" addHealth: 1 @@ -159,7 +164,8 @@ y: 78 health: 10 itemsDrops: - - name: "Apple" + - id: 6 + name: "Apple" type: name: "food" addHealth: 1 @@ -189,12 +195,14 @@ x: 100 y: 45 items: - - name: "Wooden sword" + - id: 7 + name: "Wooden sword" type: name: "weapon_sword" dealDamage: 1 texture: "WOODEN_SWORD" - - name: "Apple" + - id: 8 + name: "Apple" type: name: "food" addHealth: 1 diff --git a/src/main/resources/textures/chest.png b/game/src/main/resources/textures/chest.png similarity index 100% rename from src/main/resources/textures/chest.png rename to game/src/main/resources/textures/chest.png diff --git a/src/main/resources/textures/food/apple.png b/game/src/main/resources/textures/food/apple.png similarity index 100% rename from src/main/resources/textures/food/apple.png rename to game/src/main/resources/textures/food/apple.png diff --git a/src/main/resources/textures/player/back.png b/game/src/main/resources/textures/player/back.png similarity index 100% rename from src/main/resources/textures/player/back.png rename to game/src/main/resources/textures/player/back.png diff --git a/src/main/resources/textures/player/front.png b/game/src/main/resources/textures/player/front.png similarity index 100% rename from src/main/resources/textures/player/front.png rename to game/src/main/resources/textures/player/front.png diff --git a/src/main/resources/textures/player/left.png b/game/src/main/resources/textures/player/left.png similarity index 100% rename from src/main/resources/textures/player/left.png rename to game/src/main/resources/textures/player/left.png diff --git a/src/main/resources/textures/player/right.png b/game/src/main/resources/textures/player/right.png similarity index 100% rename from src/main/resources/textures/player/right.png rename to game/src/main/resources/textures/player/right.png diff --git a/src/main/resources/textures/rooms/1.png b/game/src/main/resources/textures/rooms/1.png similarity index 100% rename from src/main/resources/textures/rooms/1.png rename to game/src/main/resources/textures/rooms/1.png diff --git a/src/main/resources/textures/rooms/2.png b/game/src/main/resources/textures/rooms/2.png similarity index 100% rename from src/main/resources/textures/rooms/2.png rename to game/src/main/resources/textures/rooms/2.png diff --git a/src/main/resources/textures/rooms/3.png b/game/src/main/resources/textures/rooms/3.png similarity index 100% rename from src/main/resources/textures/rooms/3.png rename to game/src/main/resources/textures/rooms/3.png diff --git a/src/main/resources/textures/rooms/4.png b/game/src/main/resources/textures/rooms/4.png similarity index 100% rename from src/main/resources/textures/rooms/4.png rename to game/src/main/resources/textures/rooms/4.png diff --git a/src/main/resources/textures/rooms/doors.png b/game/src/main/resources/textures/rooms/doors.png similarity index 100% rename from src/main/resources/textures/rooms/doors.png rename to game/src/main/resources/textures/rooms/doors.png diff --git a/src/main/resources/textures/rooms/frozen.png b/game/src/main/resources/textures/rooms/frozen.png similarity index 100% rename from src/main/resources/textures/rooms/frozen.png rename to game/src/main/resources/textures/rooms/frozen.png diff --git a/src/main/resources/textures/tools/wooden_sword.png b/game/src/main/resources/textures/tools/wooden_sword.png similarity index 100% rename from src/main/resources/textures/tools/wooden_sword.png rename to game/src/main/resources/textures/tools/wooden_sword.png diff --git a/src/main/resources/textures/ui/heart.png b/game/src/main/resources/textures/ui/heart.png similarity index 100% rename from src/main/resources/textures/ui/heart.png rename to game/src/main/resources/textures/ui/heart.png diff --git a/src/main/resources/textures/ui/stamina.png b/game/src/main/resources/textures/ui/stamina.png similarity index 100% rename from src/main/resources/textures/ui/stamina.png rename to game/src/main/resources/textures/ui/stamina.png diff --git a/src/main/resources/video.mp4 b/game/src/main/resources/video.mp4 similarity index 100% rename from src/main/resources/video.mp4 rename to game/src/main/resources/video.mp4 diff --git a/pom.xml b/pom.xml index cedfc49..b779b1f 100644 --- a/pom.xml +++ b/pom.xml @@ -1,180 +1,38 @@ - + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 + http://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 cz.jzitnik - game + game-parent 1.0-SNAPSHOT + pom + + + common + server + game + + + + 25 + 25 + UTF-8 + - - org.apache.maven.plugins - maven-compiler-plugin - 3.11.0 - - - - org.projectlombok - lombok - 1.18.38 - - - 25 - 25 - - - - - org.apache.maven.plugins - maven-shade-plugin - 3.2.1 - - - package - - shade - - - - - - - cz.jzitnik.Main - - - false - false - - - org.codehaus.mojo exec-maven-plugin 3.1.0 - - - - java - - - - cz.jzitnik.Main - compile + true + none - - - - 22 - 22 - UTF-8 - - - - - be.0110.repo-releases - 0110.be repository - https://mvn.0110.be/releases - - - - - - org.projectlombok - lombok - 1.18.42 - provided - - - - org.reflections - reflections - 0.10.2 - - - - com.google.guava - guava - 33.5.0-jre - - - - tools.jackson.core - jackson-databind - 3.0.4 - - - - tools.jackson.dataformat - jackson-dataformat-yaml - 3.0.4 - - - - org.junit.jupiter - junit-jupiter - 6.0.2 - - - - org.junit.jupiter - junit-jupiter-api - 6.0.2 - test - - - - org.slf4j - slf4j-api - 2.0.17 - - - - ch.qos.logback - logback-classic - 1.5.25 - - - - com.github.trilarion - java-vorbis-support - 1.2.1 - - - - com.googlecode.lanterna - lanterna - 3.1.3 - - - - org.bytedeco - javacv-platform - 1.5.12 - - - - org.bytedeco - ffmpeg-platform - 7.1.1-1.5.12 - - - - be.tarsos.dsp - core - 2.5 - - - - be.tarsos.dsp - jvm - 2.5 - - diff --git a/server/.gitignore b/server/.gitignore new file mode 100644 index 0000000..480bdf5 --- /dev/null +++ b/server/.gitignore @@ -0,0 +1,39 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ +.kotlin + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/server/.idea/.gitignore b/server/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/server/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/server/.idea/encodings.xml b/server/.idea/encodings.xml new file mode 100644 index 0000000..aa00ffa --- /dev/null +++ b/server/.idea/encodings.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/server/.idea/misc.xml b/server/.idea/misc.xml new file mode 100644 index 0000000..4878ef2 --- /dev/null +++ b/server/.idea/misc.xml @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git a/server/.idea/vcs.xml b/server/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/server/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/server/pom.xml b/server/pom.xml new file mode 100644 index 0000000..3a9cb56 --- /dev/null +++ b/server/pom.xml @@ -0,0 +1,110 @@ + + + 4.0.0 + + + cz.jzitnik + game-parent + 1.0-SNAPSHOT + + + server + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.11.0 + + + + org.projectlombok + lombok + 1.18.42 + + + 25 + 25 + + + + org.codehaus.mojo + exec-maven-plugin + 3.1.0 + + + + java + + + + + cz.jzitnik.server.Main + compile + false + + + + + + + + cz.jzitnik + common + 1.0-SNAPSHOT + + + + org.projectlombok + lombok + 1.18.42 + provided + + + + jakarta.websocket + jakarta.websocket-api + 2.3.0-M2 + + + + org.glassfish.tyrus + tyrus-server + 2.2.2 + compile + + + + org.glassfish.tyrus + tyrus-container-grizzly-server + 2.2.2 + + + + org.glassfish.tyrus + tyrus-client + 2.2.2 + + + + org.slf4j + slf4j-api + 2.0.17 + + + + ch.qos.logback + logback-classic + 1.5.25 + + + + org.reflections + reflections + 0.10.2 + + + diff --git a/server/src/main/java/cz/jzitnik/server/Main.java b/server/src/main/java/cz/jzitnik/server/Main.java new file mode 100644 index 0000000..1eda49c --- /dev/null +++ b/server/src/main/java/cz/jzitnik/server/Main.java @@ -0,0 +1,28 @@ +package cz.jzitnik.server; + +import cz.jzitnik.server.context.AppContext; +import cz.jzitnik.server.context.GlobalContext; +import cz.jzitnik.server.events.EventManager; +import cz.jzitnik.server.socket.WebSocket; +import jakarta.websocket.DeploymentException; +import org.glassfish.tyrus.server.Server; +import org.reflections.Reflections; + +import java.util.*; + +public class Main { + public static void main(String[] args) throws DeploymentException { + GlobalContext globalContext = new GlobalContext(); + AppContext.set(globalContext); + + EventManager eventManager = new EventManager(new Reflections("cz.jzitnik.server"), globalContext); + globalContext.setEventManager(eventManager); + eventManager.start(); + + Map properties = new HashMap<>(); + Server server = new Server("localhost", 8025, "/", properties, WebSocket.class); + + server.start(); + new Scanner(System.in).nextLine(); + } +} diff --git a/server/src/main/java/cz/jzitnik/server/annotations/EventHandler.java b/server/src/main/java/cz/jzitnik/server/annotations/EventHandler.java new file mode 100644 index 0000000..efc0d51 --- /dev/null +++ b/server/src/main/java/cz/jzitnik/server/annotations/EventHandler.java @@ -0,0 +1,14 @@ +package cz.jzitnik.server.annotations; + +import cz.jzitnik.common.socket.SocketMessage; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.TYPE) +public @interface EventHandler { + Class value(); +} diff --git a/server/src/main/java/cz/jzitnik/server/context/AppContext.java b/server/src/main/java/cz/jzitnik/server/context/AppContext.java new file mode 100644 index 0000000..73f719f --- /dev/null +++ b/server/src/main/java/cz/jzitnik/server/context/AppContext.java @@ -0,0 +1,13 @@ +package cz.jzitnik.server.context; + +public class AppContext { + private static GlobalContext globalContext; + + public static void set(GlobalContext context) { + globalContext = context; + } + + public static GlobalContext get() { + return globalContext; + } +} diff --git a/server/src/main/java/cz/jzitnik/server/context/GameManager.java b/server/src/main/java/cz/jzitnik/server/context/GameManager.java new file mode 100644 index 0000000..6ff385e --- /dev/null +++ b/server/src/main/java/cz/jzitnik/server/context/GameManager.java @@ -0,0 +1,4 @@ +package cz.jzitnik.server.context; + +public class GameManager { +} diff --git a/server/src/main/java/cz/jzitnik/server/context/GlobalContext.java b/server/src/main/java/cz/jzitnik/server/context/GlobalContext.java new file mode 100644 index 0000000..6ce06a7 --- /dev/null +++ b/server/src/main/java/cz/jzitnik/server/context/GlobalContext.java @@ -0,0 +1,54 @@ +package cz.jzitnik.server.context; + +import cz.jzitnik.server.game.Client; +import cz.jzitnik.server.events.EventManager; +import cz.jzitnik.server.game.Game; +import jakarta.websocket.Session; +import lombok.Getter; +import lombok.Setter; + +import java.io.IOException; +import java.io.InputStream; +import java.util.*; + +public class GlobalContext { + @Getter + private final HashMap sessions = new HashMap<>(); + + @Getter + private final Set games = new HashSet<>(); + + @Getter + @Setter + private EventManager eventManager; + + @Getter + private final Properties properties; + + public void registerClient(Client client) { + sessions.put(client.getSession().getSession(), client); + } + + public Optional getGame(String pass) { + return games.stream().filter(game -> game.getPassword().equals(pass)).findFirst(); + } + + public GlobalContext() { + Properties props = new Properties(); + + try (InputStream input = GlobalContext.class + .getClassLoader() + .getResourceAsStream("config.properties")) { + + if (input == null) { + throw new RuntimeException("config.properties not found"); + } + + props.load(input); + + this.properties = props; + } catch (IOException e) { + throw new RuntimeException(e); + } + } +} diff --git a/server/src/main/java/cz/jzitnik/server/events/AbstractEventHandler.java b/server/src/main/java/cz/jzitnik/server/events/AbstractEventHandler.java new file mode 100644 index 0000000..28e7f28 --- /dev/null +++ b/server/src/main/java/cz/jzitnik/server/events/AbstractEventHandler.java @@ -0,0 +1,12 @@ +package cz.jzitnik.server.events; + +import cz.jzitnik.common.socket.SocketMessage; +import cz.jzitnik.server.context.GlobalContext; +import cz.jzitnik.server.game.Client; +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +public abstract class AbstractEventHandler { + protected final GlobalContext globalContext; + public abstract void handle(T event, Client client); +} diff --git a/server/src/main/java/cz/jzitnik/server/events/EventManager.java b/server/src/main/java/cz/jzitnik/server/events/EventManager.java new file mode 100644 index 0000000..55b1e1d --- /dev/null +++ b/server/src/main/java/cz/jzitnik/server/events/EventManager.java @@ -0,0 +1,77 @@ +package cz.jzitnik.server.events; + +import cz.jzitnik.common.socket.SocketMessage; +import cz.jzitnik.server.game.Client; +import cz.jzitnik.server.annotations.EventHandler; +import cz.jzitnik.server.context.GlobalContext; +import lombok.extern.slf4j.Slf4j; +import org.reflections.Reflections; + +import java.lang.reflect.InvocationTargetException; +import java.util.HashMap; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.LinkedBlockingQueue; + +@Slf4j +public class EventManager extends Thread { + private ExecutorService eventExecutor; + private final HashMap, AbstractEventHandler> handlers = new HashMap<>(); + private final BlockingQueue eventQueue = new LinkedBlockingQueue<>(); + + private record Registry(SocketMessage event, Client client) {} + + public void emitEvent(SocketMessage event, Client client) { + eventQueue.add(new Registry(event, client)); + } + + public EventManager(Reflections reflections, GlobalContext globalContext) { + setDaemon(true); + + var classes = reflections.getTypesAnnotatedWith(EventHandler.class); + + for (var clazz : classes) { + EventHandler eventHandler = clazz.getAnnotation(EventHandler.class); + try { + var instance = (AbstractEventHandler) clazz.getDeclaredConstructor(GlobalContext.class).newInstance(globalContext); + handlers.put(eventHandler.value(), instance); + } catch (InstantiationException | IllegalAccessException | InvocationTargetException | + NoSuchMethodException e) { + log.error("Failed to instantiate socket event handler: {}", clazz.getName(), e); + } + } + } + + @Override + public void run() { + eventExecutor = Executors.newFixedThreadPool(6); + while (true) { + try { + Registry registry = eventQueue.take(); + handleEvent(registry.event, registry.client); + } catch (InterruptedException e) { + eventExecutor.shutdownNow(); + Thread.currentThread().interrupt(); + } + } + //eventExecutor.shutdown(); + } + + @SuppressWarnings("unchecked") + private AbstractEventHandler getHandler(Class type) { + return (AbstractEventHandler) handlers.get(type); + } + + @SuppressWarnings("unchecked") + private void handleEvent(SocketMessage event, Client client) { + eventExecutor.submit(() -> { + try { + AbstractEventHandler handler = getHandler((Class) event.getClass()); + handler.handle(event, client); + } catch (Exception e) { + log.error("Error", e); + } + }); + } +} diff --git a/server/src/main/java/cz/jzitnik/server/events/handlers/ConnectToAGameHandler.java b/server/src/main/java/cz/jzitnik/server/events/handlers/ConnectToAGameHandler.java new file mode 100644 index 0000000..4884773 --- /dev/null +++ b/server/src/main/java/cz/jzitnik/server/events/handlers/ConnectToAGameHandler.java @@ -0,0 +1,57 @@ +package cz.jzitnik.server.events.handlers; + +import cz.jzitnik.common.models.player.PlayerCreation; +import cz.jzitnik.common.socket.messages.game.connection.ConnectToAGame; +import cz.jzitnik.common.socket.messages.game.connection.ConnectToAGameResponse; +import cz.jzitnik.common.socket.messages.player.PlayerArrivalChange; +import cz.jzitnik.common.socket.messages.player.PlayerJoined; +import cz.jzitnik.common.socket.messages.player.PlayerRotation; +import cz.jzitnik.server.annotations.EventHandler; +import cz.jzitnik.server.context.GlobalContext; +import cz.jzitnik.server.events.AbstractEventHandler; +import cz.jzitnik.server.game.Client; +import cz.jzitnik.server.game.Player; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.ObjectReader; +import tools.jackson.dataformat.yaml.YAMLFactory; + +@EventHandler(ConnectToAGame.class) +public class ConnectToAGameHandler extends AbstractEventHandler { + public ConnectToAGameHandler(GlobalContext globalContext) { + super(globalContext); + } + + @Override + public void handle(ConnectToAGame event, Client client) { + var gameOptional = globalContext.getGame(event.gamePass().toUpperCase()); + + if (gameOptional.isEmpty()) { + client.getSession().sendMessage(new ConnectToAGameResponse()); + return; + } + + var game = gameOptional.get(); + + ObjectMapper objectMapper = new ObjectMapper(new YAMLFactory()); + ObjectReader playerReader = objectMapper.readerFor(PlayerCreation.class); + PlayerCreation player = playerReader.readValue(getClass().getClassLoader().getResourceAsStream("setup/player.yaml")); + player.setId(game.getPlayers().size()); + client.setPlayer(new Player(player)); + client.setGame(game); + String defaultRoomId = globalContext.getProperties().getProperty("rooms.default"); + client.getPlayer().setCurrentRoom(defaultRoomId); + + client.getSession().sendMessage(new ConnectToAGameResponse(player, game.getPlayers().stream().map(client1 -> client1.getPlayer().toPlayerCreation()).toList())); + + for (Client cl : game.getPlayers()) { + cl.getSession().sendMessage(new PlayerJoined(player)); + + if (cl.getPlayer().getCurrentRoom().equals(defaultRoomId)) { + cl.getSession().sendMessage(new PlayerArrivalChange(client.getPlayer().getId(), player.getPlayerCords(), PlayerRotation.FRONT, true, true)); + client.getSession().sendMessage(new PlayerArrivalChange(cl.getPlayer().getId(), cl.getPlayer().getCords(), PlayerRotation.FRONT, true, false)); + } + } + + game.getPlayers().add(client); + } +} diff --git a/server/src/main/java/cz/jzitnik/server/events/handlers/CreateGameHandler.java b/server/src/main/java/cz/jzitnik/server/events/handlers/CreateGameHandler.java new file mode 100644 index 0000000..43b4d60 --- /dev/null +++ b/server/src/main/java/cz/jzitnik/server/events/handlers/CreateGameHandler.java @@ -0,0 +1,51 @@ +package cz.jzitnik.server.events.handlers; + +import cz.jzitnik.common.Config; +import cz.jzitnik.common.models.player.PlayerCreation; +import cz.jzitnik.common.socket.messages.game.creation.CreateGame; +import cz.jzitnik.common.socket.messages.game.creation.CreateGameResponse; +import cz.jzitnik.server.annotations.EventHandler; +import cz.jzitnik.server.context.GlobalContext; +import cz.jzitnik.server.events.AbstractEventHandler; +import cz.jzitnik.server.game.Client; +import cz.jzitnik.server.game.Game; +import cz.jzitnik.server.game.Player; +import cz.jzitnik.server.utils.PasswordGenerator; +import lombok.RequiredArgsConstructor; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.ObjectReader; +import tools.jackson.dataformat.yaml.YAMLFactory; + +import java.util.ArrayList; +import java.util.List; + +@EventHandler(CreateGame.class) +public class CreateGameHandler extends AbstractEventHandler { + public CreateGameHandler(GlobalContext globalContext) { + super(globalContext); + } + + @Override + public void handle(CreateGame event, Client client) { + ObjectMapper objectMapper = new ObjectMapper(new YAMLFactory()); + String pass = PasswordGenerator.generatePassword(Config.WORLD_PASSWORD_LENGTH); + int id = 0; // Owners id is always 0 + + ObjectReader playerReader = objectMapper.readerFor(PlayerCreation.class); + PlayerCreation player = playerReader.readValue(getClass().getClassLoader().getResourceAsStream("setup/player.yaml")); + player.setId(id); + + client.setPlayer(new Player(player)); + + CreateGameResponse gameResponse = new CreateGameResponse(pass, player); + Game game = new Game( + pass, + new ArrayList<>(List.of(client)) + ); + client.setGame(game); + client.getPlayer().setCurrentRoom(globalContext.getProperties().getProperty("rooms.default")); + globalContext.getGames().add(game); + + client.getSession().sendMessage(gameResponse); + } +} diff --git a/server/src/main/java/cz/jzitnik/server/events/handlers/ItemTookFromChestHandler.java b/server/src/main/java/cz/jzitnik/server/events/handlers/ItemTookFromChestHandler.java new file mode 100644 index 0000000..e4c0d31 --- /dev/null +++ b/server/src/main/java/cz/jzitnik/server/events/handlers/ItemTookFromChestHandler.java @@ -0,0 +1,23 @@ +package cz.jzitnik.server.events.handlers; + +import cz.jzitnik.common.socket.messages.items.ItemTookFromChest; +import cz.jzitnik.server.annotations.EventHandler; +import cz.jzitnik.server.context.GlobalContext; +import cz.jzitnik.server.events.AbstractEventHandler; +import cz.jzitnik.server.game.Client; + +@EventHandler(ItemTookFromChest.class) +public class ItemTookFromChestHandler extends AbstractEventHandler { + public ItemTookFromChestHandler(GlobalContext globalContext) { + super(globalContext); + } + + @Override + public void handle(ItemTookFromChest event, Client client) { + client.getGame().getItemModifiers().add(event); + + for (Client client1 : client.getGame().getPlayers()) { + client1.getSession().sendMessage(event); + } + } +} diff --git a/server/src/main/java/cz/jzitnik/server/events/handlers/MovePlayerRoomHandler.java b/server/src/main/java/cz/jzitnik/server/events/handlers/MovePlayerRoomHandler.java new file mode 100644 index 0000000..7de43db --- /dev/null +++ b/server/src/main/java/cz/jzitnik/server/events/handlers/MovePlayerRoomHandler.java @@ -0,0 +1,50 @@ +package cz.jzitnik.server.events.handlers; + +import cz.jzitnik.common.socket.messages.player.PlayerArrivalChange; +import cz.jzitnik.common.socket.messages.room.MovePlayerRoom; +import cz.jzitnik.common.socket.messages.room.MovePlayerRoomResponse; +import cz.jzitnik.server.annotations.EventHandler; +import cz.jzitnik.server.context.GlobalContext; +import cz.jzitnik.server.events.AbstractEventHandler; +import cz.jzitnik.server.game.Client; +import lombok.extern.slf4j.Slf4j; + +import java.util.stream.Collectors; + +@Slf4j +@EventHandler(MovePlayerRoom.class) +public class MovePlayerRoomHandler extends AbstractEventHandler { + public MovePlayerRoomHandler(GlobalContext globalContext) { + super(globalContext); + } + + @Override + public void handle(MovePlayerRoom event, Client client) { + String oldRoomId = client.getPlayer().getCurrentRoom(); + + client.getSession().sendMessage(new MovePlayerRoomResponse( + client.getGame().getPlayers().stream().filter(player -> + player.getPlayer().getCurrentRoom().equals(event.newRoomId()) + ).map(client1 -> + new MovePlayerRoomResponse.Registry( + client1.getPlayer().getId(), + client1.getPlayer().getCords(), + client1.getPlayer().getPlayerRotation() + ) + ).collect(Collectors.toSet()) + )); + + client.getPlayer().setCurrentRoom(event.newRoomId()); + + for (Client player : client.getGame().getPlayers()) { + if (player.getPlayer().getId() != client.getPlayer().getId()) { + if (player.getPlayer().getCurrentRoom().equals(oldRoomId)) { + log.debug("{}", event.oldCords()); + player.getSession().sendMessage(new PlayerArrivalChange(client.getPlayer().getId(), event.oldCords(), client.getPlayer().getPlayerRotation(), false, true)); + } else if (player.getPlayer().getCurrentRoom().equals(event.newRoomId())) { + player.getSession().sendMessage(new PlayerArrivalChange(client.getPlayer().getId(), event.newCords(), client.getPlayer().getPlayerRotation(), true, true)); + } + } + } + } +} diff --git a/server/src/main/java/cz/jzitnik/server/events/handlers/PlayerMoveHandler.java b/server/src/main/java/cz/jzitnik/server/events/handlers/PlayerMoveHandler.java new file mode 100644 index 0000000..91ad4fc --- /dev/null +++ b/server/src/main/java/cz/jzitnik/server/events/handlers/PlayerMoveHandler.java @@ -0,0 +1,27 @@ +package cz.jzitnik.server.events.handlers; + +import cz.jzitnik.common.socket.messages.player.PlayerMove; +import cz.jzitnik.common.socket.messages.player.PlayerMovedInUrRoom; +import cz.jzitnik.server.annotations.EventHandler; +import cz.jzitnik.server.context.GlobalContext; +import cz.jzitnik.server.events.AbstractEventHandler; +import cz.jzitnik.server.game.Client; + +@EventHandler(PlayerMove.class) +public class PlayerMoveHandler extends AbstractEventHandler { + public PlayerMoveHandler(GlobalContext globalContext) { + super(globalContext); + } + + @Override + public void handle(PlayerMove event, Client client) { + client.getPlayer().getCords().updateCords(event.newCords()); + client.getPlayer().setPlayerRotation(event.playerRotation()); + + for (Client player : client.getGame().getPlayers()) { + if (player.getPlayer().getCurrentRoom().equals(client.getPlayer().getCurrentRoom()) && player.getPlayer().getId() != client.getPlayer().getId()) { + player.getSession().sendMessage(new PlayerMovedInUrRoom(client.getPlayer().getId(), event.newCords(), event.playerRotation())); + } + } + } +} diff --git a/server/src/main/java/cz/jzitnik/server/game/Client.java b/server/src/main/java/cz/jzitnik/server/game/Client.java new file mode 100644 index 0000000..32394d4 --- /dev/null +++ b/server/src/main/java/cz/jzitnik/server/game/Client.java @@ -0,0 +1,25 @@ +package cz.jzitnik.server.game; + +import cz.jzitnik.server.socket.SocketSession; +import lombok.Getter; +import lombok.Setter; + +@Getter +public final class Client { + private final SocketSession session; + @Setter + private Player player; + @Setter + private Game game; + + public Client(SocketSession session, Player player, Game game) { + this.session = session; + this.player = player; + this.game = game; + } + + public Client(SocketSession session, Player player) { + this(session, player, null); + } + +} \ No newline at end of file diff --git a/server/src/main/java/cz/jzitnik/server/game/Game.java b/server/src/main/java/cz/jzitnik/server/game/Game.java new file mode 100644 index 0000000..936b51e --- /dev/null +++ b/server/src/main/java/cz/jzitnik/server/game/Game.java @@ -0,0 +1,16 @@ +package cz.jzitnik.server.game; + +import cz.jzitnik.common.socket.messages.items.ItemTookFromChest; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.ArrayList; +import java.util.List; + +@Getter +@AllArgsConstructor +public class Game { + private String password; + private List players; + private final List itemModifiers = new ArrayList<>(); +} diff --git a/server/src/main/java/cz/jzitnik/server/game/Player.java b/server/src/main/java/cz/jzitnik/server/game/Player.java new file mode 100644 index 0000000..33dff31 --- /dev/null +++ b/server/src/main/java/cz/jzitnik/server/game/Player.java @@ -0,0 +1,27 @@ +package cz.jzitnik.server.game; + +import cz.jzitnik.common.models.coordinates.RoomCords; +import cz.jzitnik.common.models.player.PlayerCreation; +import cz.jzitnik.common.socket.messages.player.PlayerRotation; +import lombok.Getter; +import lombok.Setter; + +@Getter +public class Player { + private final int id; + private final RoomCords cords; + @Setter + private PlayerRotation playerRotation; + @Setter + private String currentRoom; + + public Player(PlayerCreation creation) { + id = creation.getId(); + cords = creation.getPlayerCords(); + playerRotation = PlayerRotation.FRONT; + } + + public PlayerCreation toPlayerCreation() { + return new PlayerCreation(cords, null); + } +} diff --git a/server/src/main/java/cz/jzitnik/server/socket/GlobalContextConfigurator.java b/server/src/main/java/cz/jzitnik/server/socket/GlobalContextConfigurator.java new file mode 100644 index 0000000..2454e4d --- /dev/null +++ b/server/src/main/java/cz/jzitnik/server/socket/GlobalContextConfigurator.java @@ -0,0 +1,14 @@ +package cz.jzitnik.server.socket; + +import cz.jzitnik.server.context.AppContext; +import jakarta.websocket.HandshakeResponse; +import jakarta.websocket.server.HandshakeRequest; +import jakarta.websocket.server.ServerEndpointConfig; + +public class GlobalContextConfigurator extends ServerEndpointConfig.Configurator { + + @Override + public void modifyHandshake(ServerEndpointConfig sec, HandshakeRequest request, HandshakeResponse response) { + sec.getUserProperties().put("globalContext", AppContext.get()); + } +} diff --git a/server/src/main/java/cz/jzitnik/server/socket/SocketSession.java b/server/src/main/java/cz/jzitnik/server/socket/SocketSession.java new file mode 100644 index 0000000..20c9396 --- /dev/null +++ b/server/src/main/java/cz/jzitnik/server/socket/SocketSession.java @@ -0,0 +1,28 @@ +package cz.jzitnik.server.socket; + +import cz.jzitnik.common.socket.SocketMessage; +import jakarta.websocket.Session; +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.ObjectOutputStream; + +@RequiredArgsConstructor +@Getter +public class SocketSession { + private final Session session; + + public void sendMessage(SocketMessage message) { + try { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + ObjectOutputStream oos = new ObjectOutputStream(baos); + oos.writeObject(message); + oos.flush(); + session.getBasicRemote().sendBinary(java.nio.ByteBuffer.wrap(baos.toByteArray())); + } catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/server/src/main/java/cz/jzitnik/server/socket/WebSocket.java b/server/src/main/java/cz/jzitnik/server/socket/WebSocket.java new file mode 100644 index 0000000..a0aa476 --- /dev/null +++ b/server/src/main/java/cz/jzitnik/server/socket/WebSocket.java @@ -0,0 +1,66 @@ +package cz.jzitnik.server.socket; + +import cz.jzitnik.common.socket.SocketMessage; +import cz.jzitnik.common.socket.messages.player.PlayerArrivalChange; +import cz.jzitnik.common.socket.messages.player.PlayerDisconnected; +import cz.jzitnik.server.game.Client; +import cz.jzitnik.server.context.GlobalContext; +import jakarta.websocket.*; +import jakarta.websocket.server.ServerEndpoint; +import lombok.extern.slf4j.Slf4j; + +import java.io.*; + +@Slf4j +@ServerEndpoint(value = "/ws", configurator = GlobalContextConfigurator.class) +public class WebSocket { + + private GlobalContext globalContext; + + @OnOpen + public void onOpen(Session session, EndpointConfig config) { + this.globalContext = (GlobalContext) config.getUserProperties().get("globalContext"); + + globalContext.registerClient(new Client(new SocketSession(session), null)); + log.debug("Client connected: {}", session.getId()); + } + + @OnMessage + public void onMessage(byte[] bytes, Session session) { + try (ByteArrayInputStream bais = new ByteArrayInputStream(bytes); + ObjectInputStream ois = new ObjectInputStream(bais)) { + SocketMessage socketMessage = (SocketMessage) ois.readObject(); + Client client = globalContext.getSessions().get(session); + globalContext.getEventManager().emitEvent(socketMessage, client); + } catch (IOException | ClassNotFoundException e) { + e.printStackTrace(); + } + } + + @OnClose + public void onClose(Session session, CloseReason reason) { + Client client = globalContext.getSessions().get(session); + client.getGame().getPlayers().remove(client); + + for (Client otherClient : client.getGame().getPlayers()) { + if (otherClient.getPlayer().getCurrentRoom().equals(client.getPlayer().getCurrentRoom())) { + otherClient.getSession().sendMessage(new PlayerArrivalChange( + client.getPlayer().getId(), + client.getPlayer().getCords(), + client.getPlayer().getPlayerRotation(), + false, + true + )); + } + + otherClient.getSession().sendMessage(new PlayerDisconnected(client.getPlayer().getId())); + } + + log.debug("Connection closed: {}", reason); + } + + @OnError + public void onError(Session session, Throwable throwable) { + throwable.printStackTrace(); + } +} diff --git a/server/src/main/java/cz/jzitnik/server/utils/PasswordGenerator.java b/server/src/main/java/cz/jzitnik/server/utils/PasswordGenerator.java new file mode 100644 index 0000000..17a2f55 --- /dev/null +++ b/server/src/main/java/cz/jzitnik/server/utils/PasswordGenerator.java @@ -0,0 +1,23 @@ +package cz.jzitnik.server.utils; + +import java.security.SecureRandom; + +public class PasswordGenerator { + private static final String CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; + private static final SecureRandom RANDOM = new SecureRandom(); + + public static String generatePassword(int length) { + if (length <= 0) { + throw new IllegalArgumentException("Password length must be greater than 0"); + } + + StringBuilder password = new StringBuilder(length); + + for (int i = 0; i < length; i++) { + int index = RANDOM.nextInt(CHARACTERS.length()); + password.append(CHARACTERS.charAt(index)); + } + + return password.toString(); + } +} diff --git a/server/src/main/resources/config.properties b/server/src/main/resources/config.properties new file mode 100644 index 0000000..503483b --- /dev/null +++ b/server/src/main/resources/config.properties @@ -0,0 +1 @@ +rooms.default=spawn \ No newline at end of file diff --git a/src/main/resources/setup/player.yaml b/server/src/main/resources/setup/player.yaml similarity index 100% rename from src/main/resources/setup/player.yaml rename to server/src/main/resources/setup/player.yaml diff --git a/src/main/java/cz/jzitnik/Game.java b/src/main/java/cz/jzitnik/Game.java deleted file mode 100644 index 1e26c6d..0000000 --- a/src/main/java/cz/jzitnik/Game.java +++ /dev/null @@ -1,37 +0,0 @@ -package cz.jzitnik; - -import cz.jzitnik.annotations.injectors.InjectDependency; -import cz.jzitnik.game.setup.GameSetup; -import cz.jzitnik.utils.DependencyManager; -import cz.jzitnik.utils.GlobalIOHandlerRepository; -import cz.jzitnik.utils.ScheduledTaskManager; -import cz.jzitnik.utils.ThreadManager; -import org.reflections.Reflections; - -import java.io.IOException; - -public class Game { - private final DependencyManager dependencyManager = new DependencyManager(new Reflections("cz.jzitnik")); - - @InjectDependency - private Cli cli; - @InjectDependency - private GameSetup gameSetup; - @InjectDependency - private ThreadManager threadManager; - @InjectDependency - private ScheduledTaskManager scheduledTaskManager; - @InjectDependency - private GlobalIOHandlerRepository globalIOHandlerRepository; - - public void start() throws IOException { - dependencyManager.inject(this); - - gameSetup.setup(); - threadManager.startAll(); - scheduledTaskManager.startAll(); - globalIOHandlerRepository.setup(); - - cli.run(); - } -} diff --git a/src/main/java/cz/jzitnik/events/DroppedItemRerender.java b/src/main/java/cz/jzitnik/events/DroppedItemRerender.java deleted file mode 100644 index df80a81..0000000 --- a/src/main/java/cz/jzitnik/events/DroppedItemRerender.java +++ /dev/null @@ -1,7 +0,0 @@ -package cz.jzitnik.events; - -import cz.jzitnik.game.objects.DroppedItem; -import cz.jzitnik.utils.events.Event; - -public record DroppedItemRerender(DroppedItem droppedItem) implements Event { -} diff --git a/src/main/java/cz/jzitnik/events/FullRedrawEvent.java b/src/main/java/cz/jzitnik/events/FullRedrawEvent.java deleted file mode 100644 index 745f928..0000000 --- a/src/main/java/cz/jzitnik/events/FullRedrawEvent.java +++ /dev/null @@ -1,6 +0,0 @@ -package cz.jzitnik.events; - -import cz.jzitnik.utils.events.Event; - -public class FullRedrawEvent implements Event { -} diff --git a/src/main/java/cz/jzitnik/events/InventoryRerender.java b/src/main/java/cz/jzitnik/events/InventoryRerender.java deleted file mode 100644 index f51cb6e..0000000 --- a/src/main/java/cz/jzitnik/events/InventoryRerender.java +++ /dev/null @@ -1,6 +0,0 @@ -package cz.jzitnik.events; - -import cz.jzitnik.utils.events.Event; - -public class InventoryRerender implements Event { -} diff --git a/src/main/java/cz/jzitnik/events/RenderStats.java b/src/main/java/cz/jzitnik/events/RenderStats.java deleted file mode 100644 index b44b62b..0000000 --- a/src/main/java/cz/jzitnik/events/RenderStats.java +++ /dev/null @@ -1,6 +0,0 @@ -package cz.jzitnik.events; - -import cz.jzitnik.utils.events.Event; - -public class RenderStats implements Event { -} diff --git a/src/main/java/cz/jzitnik/events/RoomChangeEvent.java b/src/main/java/cz/jzitnik/events/RoomChangeEvent.java deleted file mode 100644 index 4ca1766..0000000 --- a/src/main/java/cz/jzitnik/events/RoomChangeEvent.java +++ /dev/null @@ -1,7 +0,0 @@ -package cz.jzitnik.events; - -import cz.jzitnik.events.handlers.FullRoomDrawHandler; -import cz.jzitnik.utils.events.Event; - -public record RoomChangeEvent(FullRoomDrawHandler.DoorPosition door) implements Event { -} diff --git a/src/main/java/cz/jzitnik/events/TerminalTooSmallEvent.java b/src/main/java/cz/jzitnik/events/TerminalTooSmallEvent.java deleted file mode 100644 index 79af32f..0000000 --- a/src/main/java/cz/jzitnik/events/TerminalTooSmallEvent.java +++ /dev/null @@ -1,6 +0,0 @@ -package cz.jzitnik.events; - -import cz.jzitnik.utils.events.Event; - -public class TerminalTooSmallEvent implements Event { -} diff --git a/src/main/java/cz/jzitnik/game/GameState.java b/src/main/java/cz/jzitnik/game/GameState.java deleted file mode 100644 index efe580e..0000000 --- a/src/main/java/cz/jzitnik/game/GameState.java +++ /dev/null @@ -1,37 +0,0 @@ -package cz.jzitnik.game; - -import cz.jzitnik.annotations.State; -import cz.jzitnik.game.objects.Interactable; -import cz.jzitnik.screens.Screen; -import cz.jzitnik.utils.DependencyManager; -import lombok.Getter; -import lombok.RequiredArgsConstructor; -import lombok.Setter; - -@RequiredArgsConstructor -@State -public class GameState { - private final DependencyManager dependencyManager; // Maybe transient in the future - - @Getter - @Setter - private GameRoom currentRoom; - - @Getter - @Setter - private Player player; - - @Getter - @Setter - private Interactable interacting; - - @Getter - private Screen screen; - - public void setScreen(Screen screen) { - if (screen != null) { - dependencyManager.inject(screen); - } - this.screen = screen; - } -} diff --git a/src/main/java/cz/jzitnik/states/PlayerConfig.java b/src/main/java/cz/jzitnik/states/PlayerConfig.java deleted file mode 100644 index b44ceb1..0000000 --- a/src/main/java/cz/jzitnik/states/PlayerConfig.java +++ /dev/null @@ -1,8 +0,0 @@ -package cz.jzitnik.states; - -import cz.jzitnik.annotations.State; - -@State -public class PlayerConfig { - private int masterVolume = 100; -} diff --git a/src/main/java/cz/jzitnik/utils/events/AbstractEventHandler.java b/src/main/java/cz/jzitnik/utils/events/AbstractEventHandler.java deleted file mode 100644 index 229e13a..0000000 --- a/src/main/java/cz/jzitnik/utils/events/AbstractEventHandler.java +++ /dev/null @@ -1,5 +0,0 @@ -package cz.jzitnik.utils.events; - -public abstract class AbstractEventHandler { - public abstract void handle(T event); -} diff --git a/src/main/java/cz/jzitnik/utils/events/Event.java b/src/main/java/cz/jzitnik/utils/events/Event.java deleted file mode 100644 index f184fa6..0000000 --- a/src/main/java/cz/jzitnik/utils/events/Event.java +++ /dev/null @@ -1,4 +0,0 @@ -package cz.jzitnik.utils.events; - -public interface Event { -}