feat: Multiplayer #3
@@ -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 {
|
||||
}
|
||||
@@ -20,6 +20,10 @@ public class GameState {
|
||||
@Setter
|
||||
private GameRoom currentRoom;
|
||||
|
||||
@Getter
|
||||
@Setter
|
||||
private List<GameRoom> allRooms;
|
||||
|
||||
@Getter
|
||||
@Setter
|
||||
private Player player;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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<GameItem> 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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -47,5 +47,6 @@ public class GameSetup {
|
||||
);
|
||||
|
||||
gameState.setCurrentRoom(rooms.getFirst());
|
||||
gameState.setAllRooms(rooms);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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<Client> players;
|
||||
private final List<ItemTookFromChest> itemModifiers = new ArrayList<>();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user