feat: Synchronize game items

kinda
This commit is contained in:
2026-02-03 21:40:13 +01:00
parent faadc92dbc
commit cdd002ea20
9 changed files with 121 additions and 15 deletions

View File

@@ -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 {
}

View File

@@ -20,6 +20,10 @@ public class GameState {
@Setter @Setter
private GameRoom currentRoom; private GameRoom currentRoom;
@Getter
@Setter
private List<GameRoom> allRooms;
@Getter @Getter
@Setter @Setter
private Player player; private Player player;

View File

@@ -14,14 +14,17 @@ public class GameItem implements Renderable {
@JsonIgnore @JsonIgnore
private final BufferedImage texture; private final BufferedImage texture;
private final String name; private final String name;
private final int id;
@JsonCreator @JsonCreator
public GameItem( public GameItem(
@JsonProperty("id") int id,
@JsonProperty("name") String name, @JsonProperty("name") String name,
@JsonProperty("type") ItemType<?> type, @JsonProperty("type") ItemType<?> type,
@JsonProperty("texture") ResourceManager.Resource resource, @JsonProperty("texture") ResourceManager.Resource resource,
@JacksonInject ResourceManager resourceManager @JacksonInject ResourceManager resourceManager
) { ) {
this.id = id;
this.name = name; this.name = name;
this.type = type; this.type = type;
this.texture = resourceManager.getResource(resource); this.texture = resourceManager.getResource(resource);

View File

@@ -10,10 +10,7 @@ import cz.jzitnik.client.annotations.injectors.InjectConfig;
import cz.jzitnik.client.annotations.injectors.InjectDependency; import cz.jzitnik.client.annotations.injectors.InjectDependency;
import cz.jzitnik.client.annotations.injectors.InjectState; import cz.jzitnik.client.annotations.injectors.InjectState;
import cz.jzitnik.client.config.Debugging; import cz.jzitnik.client.config.Debugging;
import cz.jzitnik.client.events.InventoryRerender; import cz.jzitnik.client.events.*;
import cz.jzitnik.client.events.MouseAction;
import cz.jzitnik.client.events.RerenderPart;
import cz.jzitnik.client.events.RerenderScreen;
import cz.jzitnik.client.game.GameRoom; import cz.jzitnik.client.game.GameRoom;
import cz.jzitnik.client.game.GameState; import cz.jzitnik.client.game.GameState;
import cz.jzitnik.client.game.Player; 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.RerenderUtils;
import cz.jzitnik.client.utils.UIRoomClickHandlerRepository; import cz.jzitnik.client.utils.UIRoomClickHandlerRepository;
import cz.jzitnik.client.utils.events.EventManager; import cz.jzitnik.client.utils.events.EventManager;
import cz.jzitnik.common.socket.messages.items.ItemTookFromChest;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import java.net.Socket;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
@@ -40,8 +40,11 @@ import java.util.List;
public final class Chest extends GameObject implements UIClickHandler { public final class Chest extends GameObject implements UIClickHandler {
private static final int RENDER_PADDING = 1; private static final int RENDER_PADDING = 1;
@Getter
private final List<GameItem> items; private final List<GameItem> items;
private boolean rendered;
private int listenerHashCode; private int listenerHashCode;
private int actualDisplayStartX; private int actualDisplayStartX;
@@ -164,6 +167,7 @@ public final class Chest extends GameObject implements UIClickHandler {
guiStart.getRow() - start.getY(), guiStart.getRow() - start.getY(),
guiEnd.getRow() - start.getY() guiEnd.getRow() - start.getY()
)); ));
rendered = true;
} }
private void clearPreviousUI( private void clearPreviousUI(
@@ -257,15 +261,23 @@ public final class Chest extends GameObject implements UIClickHandler {
if (!added) { if (!added) {
return true; 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); items.remove(item);
if (!rendered) {
return;
}
eventManager.emitEvent(new InventoryRerender());
if (items.isEmpty()) { if (items.isEmpty()) {
uiRoomClickHandlerRepository.removeHandlerForCurrentRoom(listenerHashCode); uiRoomClickHandlerRepository.removeHandlerForCurrentRoom(listenerHashCode);
} }
render(true); render(true);
return true;
} }
} }

View File

@@ -47,5 +47,6 @@ public class GameSetup {
); );
gameState.setCurrentRoom(rooms.getFirst()); gameState.setCurrentRoom(rooms.getFirst());
gameState.setAllRooms(rooms);
} }
} }

View File

@@ -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<ItemTookFromChest> {
@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;
}
}
}
}
}
}

View File

@@ -41,12 +41,14 @@
x: 100 x: 100
y: 45 y: 45
items: items:
- name: "Wooden sword" - id: 1
name: "Wooden sword"
type: type:
name: "weapon_sword" name: "weapon_sword"
dealDamage: 1 dealDamage: 1
texture: "WOODEN_SWORD" texture: "WOODEN_SWORD"
- name: "Apple" - id: 2
name: "Apple"
type: type:
name: "food" name: "food"
addHealth: 1 addHealth: 1
@@ -78,12 +80,14 @@
x: 100 x: 100
y: 45 y: 45
items: items:
- name: "Wooden sword" - id: 3
name: "Wooden sword"
type: type:
name: "weapon_sword" name: "weapon_sword"
dealDamage: 1 dealDamage: 1
texture: "WOODEN_SWORD" texture: "WOODEN_SWORD"
- name: "Apple" - id: 4
name: "Apple"
type: type:
name: "food" name: "food"
addHealth: 1 addHealth: 1
@@ -124,7 +128,8 @@
y: 78 y: 78
health: 10 health: 10
itemsDrops: itemsDrops:
- name: "Apple" - id: 5
name: "Apple"
type: type:
name: "food" name: "food"
addHealth: 1 addHealth: 1
@@ -159,7 +164,8 @@
y: 78 y: 78
health: 10 health: 10
itemsDrops: itemsDrops:
- name: "Apple" - id: 6
name: "Apple"
type: type:
name: "food" name: "food"
addHealth: 1 addHealth: 1
@@ -189,12 +195,14 @@
x: 100 x: 100
y: 45 y: 45
items: items:
- name: "Wooden sword" - id: 7
name: "Wooden sword"
type: type:
name: "weapon_sword" name: "weapon_sword"
dealDamage: 1 dealDamage: 1
texture: "WOODEN_SWORD" texture: "WOODEN_SWORD"
- name: "Apple" - id: 8
name: "Apple"
type: type:
name: "food" name: "food"
addHealth: 1 addHealth: 1

View File

@@ -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<ItemTookFromChest> {
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);
}
}
}

View File

@@ -1,8 +1,10 @@
package cz.jzitnik.server.game; package cz.jzitnik.server.game;
import cz.jzitnik.common.socket.messages.items.ItemTookFromChest;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Getter; import lombok.Getter;
import java.util.ArrayList;
import java.util.List; import java.util.List;
@Getter @Getter
@@ -10,4 +12,5 @@ import java.util.List;
public class Game { public class Game {
private String password; private String password;
private List<Client> players; private List<Client> players;
private final List<ItemTookFromChest> itemModifiers = new ArrayList<>();
} }