From cdd002ea20926bb444e1d47f9b5a4a0f9ccc3216 Mon Sep 17 00:00:00 2001 From: jzitnik-dev Date: Tue, 3 Feb 2026 21:40:13 +0100 Subject: [PATCH] feat: Synchronize game items kinda --- .../messages/items/ItemTookFromChest.java | 9 ++++ .../cz/jzitnik/client/game/GameState.java | 4 ++ .../jzitnik/client/game/items/GameItem.java | 3 ++ .../cz/jzitnik/client/game/objects/Chest.java | 26 ++++++++--- .../jzitnik/client/game/setup/GameSetup.java | 1 + .../events/ItemTookFromChestHandler.java | 43 +++++++++++++++++++ game/src/main/resources/setup/rooms.yaml | 24 +++++++---- .../handlers/ItemTookFromChestHandler.java | 23 ++++++++++ .../java/cz/jzitnik/server/game/Game.java | 3 ++ 9 files changed, 121 insertions(+), 15 deletions(-) create mode 100644 common/src/main/java/cz/jzitnik/common/socket/messages/items/ItemTookFromChest.java create mode 100644 game/src/main/java/cz/jzitnik/client/socket/events/ItemTookFromChestHandler.java create mode 100644 server/src/main/java/cz/jzitnik/server/events/handlers/ItemTookFromChestHandler.java 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/game/src/main/java/cz/jzitnik/client/game/GameState.java b/game/src/main/java/cz/jzitnik/client/game/GameState.java index 1cfcf03..67027ad 100644 --- a/game/src/main/java/cz/jzitnik/client/game/GameState.java +++ b/game/src/main/java/cz/jzitnik/client/game/GameState.java @@ -20,6 +20,10 @@ public class GameState { @Setter private GameRoom currentRoom; + @Getter + @Setter + private List allRooms; + @Getter @Setter private Player player; diff --git a/game/src/main/java/cz/jzitnik/client/game/items/GameItem.java b/game/src/main/java/cz/jzitnik/client/game/items/GameItem.java index 38f748f..6538c9f 100644 --- a/game/src/main/java/cz/jzitnik/client/game/items/GameItem.java +++ b/game/src/main/java/cz/jzitnik/client/game/items/GameItem.java @@ -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/game/src/main/java/cz/jzitnik/client/game/objects/Chest.java b/game/src/main/java/cz/jzitnik/client/game/objects/Chest.java index 3a08570..d6e3870 100644 --- a/game/src/main/java/cz/jzitnik/client/game/objects/Chest.java +++ b/game/src/main/java/cz/jzitnik/client/game/objects/Chest.java @@ -10,10 +10,7 @@ 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.InventoryRerender; -import cz.jzitnik.client.events.MouseAction; -import cz.jzitnik.client.events.RerenderPart; -import cz.jzitnik.client.events.RerenderScreen; +import cz.jzitnik.client.events.*; import cz.jzitnik.client.game.GameRoom; import cz.jzitnik.client.game.GameState; import cz.jzitnik.client.game.Player; @@ -30,9 +27,12 @@ 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; @@ -40,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; @@ -164,6 +167,7 @@ public final class Chest extends GameObject implements UIClickHandler { guiStart.getRow() - start.getY(), guiEnd.getRow() - start.getY() )); + rendered = true; } private void clearPreviousUI( @@ -257,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/game/src/main/java/cz/jzitnik/client/game/setup/GameSetup.java b/game/src/main/java/cz/jzitnik/client/game/setup/GameSetup.java index 9695955..6cc964a 100644 --- a/game/src/main/java/cz/jzitnik/client/game/setup/GameSetup.java +++ b/game/src/main/java/cz/jzitnik/client/game/setup/GameSetup.java @@ -47,5 +47,6 @@ public class GameSetup { ); gameState.setCurrentRoom(rooms.getFirst()); + gameState.setAllRooms(rooms); } } 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/resources/setup/rooms.yaml b/game/src/main/resources/setup/rooms.yaml index 723c351..b9ea51f 100644 --- a/game/src/main/resources/setup/rooms.yaml +++ b/game/src/main/resources/setup/rooms.yaml @@ -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 @@ -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/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/game/Game.java b/server/src/main/java/cz/jzitnik/server/game/Game.java index 27a421f..936b51e 100644 --- a/server/src/main/java/cz/jzitnik/server/game/Game.java +++ b/server/src/main/java/cz/jzitnik/server/game/Game.java @@ -1,8 +1,10 @@ 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 @@ -10,4 +12,5 @@ import java.util.List; public class Game { private String password; private List players; + private final List itemModifiers = new ArrayList<>(); }