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
|
@Setter
|
||||||
private GameRoom currentRoom;
|
private GameRoom currentRoom;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
private List<GameRoom> allRooms;
|
||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
@Setter
|
@Setter
|
||||||
private Player player;
|
private Player player;
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -47,5 +47,6 @@ public class GameSetup {
|
|||||||
);
|
);
|
||||||
|
|
||||||
gameState.setCurrentRoom(rooms.getFirst());
|
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
|
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
|
||||||
|
|||||||
@@ -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;
|
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<>();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user