diff --git a/src/main/java/de/towerdefence/server/match/GameSession.java b/src/main/java/de/towerdefence/server/match/GameSession.java index 050ed31..9bea44c 100644 --- a/src/main/java/de/towerdefence/server/match/GameSession.java +++ b/src/main/java/de/towerdefence/server/match/GameSession.java @@ -1,5 +1,6 @@ package de.towerdefence.server.match; +import de.towerdefence.server.match.callbacks.PlayerHitpointsCallback; import de.towerdefence.server.match.callbacks.PlayerMoneyCallback; import de.towerdefence.server.match.exeptions.InvalidPlacementException; import de.towerdefence.server.match.exeptions.InvalidPlacementReason; @@ -7,6 +8,7 @@ import de.towerdefence.server.player.Player; import lombok.Getter; public class GameSession { + final static int START_HITPOINTS = 100; final static int START_MONEY = 50; final static int MAP_SIZE_X = 10; final static int MAP_SIZE_Y = 20; @@ -16,12 +18,18 @@ public class GameSession { private final Player player; @Getter private int money; + @Getter + private int playerHitpoints; private final PlayerMoneyCallback moneyCallback; + //private final PlayerHitpointsCallback hitpointsCallback; public GameSession(Player player, PlayerMoneyCallback moneyCallback) { this.player = player; this.moneyCallback = moneyCallback; + //this.hitpointsCallback = hitpointsCallback; this.money = START_MONEY; + this.playerHitpoints = START_HITPOINTS; + } public void placeTower(Tower tower, int x, int y) throws InvalidPlacementException { @@ -41,5 +49,6 @@ public class GameSession { public void addMoney(int amount) { money += amount; + moneyCallback.call(player, money); } } diff --git a/src/main/java/de/towerdefence/server/match/Match.java b/src/main/java/de/towerdefence/server/match/Match.java index fb4ff50..959592a 100644 --- a/src/main/java/de/towerdefence/server/match/Match.java +++ b/src/main/java/de/towerdefence/server/match/Match.java @@ -1,5 +1,6 @@ package de.towerdefence.server.match; +import de.towerdefence.server.match.callbacks.PlayerHitpointsCallback; import de.towerdefence.server.match.callbacks.PlayerMoneyCallback; import de.towerdefence.server.player.Player; import lombok.Getter; @@ -47,7 +48,11 @@ public class Match { } - public void connectPlayer(Player player, PlayerMoneyCallback moneyCallback) { + public void connectPlayer( + Player player, + PlayerMoneyCallback moneyCallback, + PlayerHitpointsCallback hitpointsCallback + ) { boolean isPlayer1 = player1.equals(player); boolean isPlayer2 = player2.equals(player); if (!isPlayer1 && !isPlayer2) { diff --git a/src/main/java/de/towerdefence/server/match/MatchService.java b/src/main/java/de/towerdefence/server/match/MatchService.java index dacb7d9..a337e29 100644 --- a/src/main/java/de/towerdefence/server/match/MatchService.java +++ b/src/main/java/de/towerdefence/server/match/MatchService.java @@ -1,5 +1,6 @@ package de.towerdefence.server.match; +import de.towerdefence.server.match.callbacks.PlayerHitpointsCallback; import de.towerdefence.server.match.callbacks.PlayerMoneyCallback; import de.towerdefence.server.match.exeptions.InvalidPlacementException; import de.towerdefence.server.match.exeptions.InvalidPlacementReason; @@ -48,15 +49,20 @@ public class MatchService { return opponent.get(); } - public void playerConnected(Player player, PlayerMoneyCallback moneyCallback) { + public void playerConnected( + Player player, + PlayerMoneyCallback moneyCallback, + PlayerHitpointsCallback hitpointsCallback + ) { Match match = playerMatches.get(player); - match.connectPlayer(player, moneyCallback); + match.connectPlayer(player, moneyCallback, hitpointsCallback); Optional optionalPlayerSession = match.getPlayerGameSession(player); if (optionalPlayerSession.isEmpty()) { return; } GameSession playerSession = optionalPlayerSession.get(); moneyCallback.call(player, playerSession.getMoney()); + hitpointsCallback.call(player, playerSession.getPlayerHitpoints() ); if (!match.hasMatchStarted()) { return; } diff --git a/src/main/java/de/towerdefence/server/match/callbacks/PlayerHitpointsCallback.java b/src/main/java/de/towerdefence/server/match/callbacks/PlayerHitpointsCallback.java new file mode 100644 index 0000000..ed1e959 --- /dev/null +++ b/src/main/java/de/towerdefence/server/match/callbacks/PlayerHitpointsCallback.java @@ -0,0 +1,8 @@ +package de.towerdefence.server.match.callbacks; + +import de.towerdefence.server.player.Player; + +@FunctionalInterface +public interface PlayerHitpointsCallback { + void call(Player player, int playerHitpoints); +} diff --git a/src/main/java/de/towerdefence/server/server/channels/match/MatchWebsocketHandler.java b/src/main/java/de/towerdefence/server/server/channels/match/MatchWebsocketHandler.java index f9e48a0..bc64f77 100644 --- a/src/main/java/de/towerdefence/server/server/channels/match/MatchWebsocketHandler.java +++ b/src/main/java/de/towerdefence/server/server/channels/match/MatchWebsocketHandler.java @@ -6,6 +6,7 @@ import de.towerdefence.server.match.exeptions.InvalidPlacementException; import de.towerdefence.server.match.exeptions.NotInMatchException; import de.towerdefence.server.player.Player; import de.towerdefence.server.server.JsonWebsocketHandler; +import de.towerdefence.server.server.channels.match.hitpoints.PlayerHitpointsMessage; import de.towerdefence.server.server.channels.match.money.PlayerMoneyMessage; import de.towerdefence.server.server.channels.match.placing.GamePlayerMap; import de.towerdefence.server.server.channels.match.placing.InvalidPlacementMessage; @@ -37,7 +38,11 @@ public class MatchWebsocketHandler extends JsonWebsocketHandler { public void afterConnectionEstablished(WebSocketSession session) { super.afterConnectionEstablished(session); playerSessions.put(sessionPlayers.get(session), session); - matchService.playerConnected(sessionPlayers.get(session), this::onPlayerMoneyChanged); + matchService.playerConnected( + sessionPlayers.get(session), + this::onPlayerMoneyChanged, + this::onPlayerHitpointsChanged + ); } private void onPlayerMoneyChanged(Player player, int playerMoney) { @@ -48,6 +53,14 @@ public class MatchWebsocketHandler extends JsonWebsocketHandler { } } + private void onPlayerHitpointsChanged(Player player, int playerHitpoints) { + WebSocketSession session = playerSessions.get(player); + try { + new PlayerHitpointsMessage(playerHitpoints).send(session); + } catch (IOException ignored) { + } + } + @Override protected void closeSession(WebSocketSession session, CloseStatus reason) { Player player = sessionPlayers.get(session); diff --git a/src/main/java/de/towerdefence/server/server/channels/match/PlayerMoneyMessage.java b/src/main/java/de/towerdefence/server/server/channels/match/hitpoints/PlayerHitpointsMessage.java similarity index 61% rename from src/main/java/de/towerdefence/server/server/channels/match/PlayerMoneyMessage.java rename to src/main/java/de/towerdefence/server/server/channels/match/hitpoints/PlayerHitpointsMessage.java index cc7428f..a5921c9 100644 --- a/src/main/java/de/towerdefence/server/server/channels/match/PlayerMoneyMessage.java +++ b/src/main/java/de/towerdefence/server/server/channels/match/hitpoints/PlayerHitpointsMessage.java @@ -1,4 +1,4 @@ -package de.towerdefence.server.server.channels.match; +package de.towerdefence.server.server.channels.match.hitpoints; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.JsonNodeFactory; @@ -8,19 +8,18 @@ import lombok.AllArgsConstructor; import java.util.Map; @AllArgsConstructor -public class PlayerMoneyMessage extends JsonMessage { - - private final int playerMoney; +public class PlayerHitpointsMessage extends JsonMessage { + private final int playerHitpoints; @Override protected String getMessageId() { - return "PlayerMoney"; + return "PlayerHitpoints"; } @Override protected Map getData(JsonNodeFactory factory) { return Map.of( - "playerMoney", factory.numberNode(this.playerMoney) + "playerHitpoints", factory.numberNode(this.playerHitpoints) ); } } diff --git a/ws/ws.yml b/ws/ws.yml index 138364a..2ac309b 100644 --- a/ws/ws.yml +++ b/ws/ws.yml @@ -239,6 +239,21 @@ channels: required: - $id - playerMoney + PlayerHitpoints: + description: Hitpoints a player currently has + payload: + type: object + additionalProperties: false + properties: + $id: + type: string + format: messageId + playerHitpoints: + type: integer + required: + - $id + - playerHitpoints + operations: @@ -321,6 +336,13 @@ operations: $ref: "#/channels/match" messages: - $ref: "#/channels/match/messages/PlayerMoney" + playerHitpoints: + title: PlayerHitpoints + action: receive + channel: + $ref: "#/channels/match" + messages: + - $ref: "#/channels/match/messages/PlayerHitpoints"