diff --git a/src/main/java/de/towerdefence/server/game/GameSession.java b/src/main/java/de/towerdefence/server/game/GameSession.java index a31e6ad..ec5f976 100644 --- a/src/main/java/de/towerdefence/server/game/GameSession.java +++ b/src/main/java/de/towerdefence/server/game/GameSession.java @@ -41,10 +41,11 @@ public class GameSession { private long lastSpawn = Instant.now().toEpochMilli(); public GameSession( - Player player, - PlayerMoneyCallback moneyCallback, - PlayerHitpointsCallback hitpointsCallback, - EnemiesChangedCallback enemyCallback) { + Player player, + PlayerMoneyCallback moneyCallback, + PlayerHitpointsCallback hitpointsCallback, + EnemiesChangedCallback enemyCallback + ) { this.player = player; this.moneyCallback = moneyCallback; this.hitpointsCallback = hitpointsCallback; @@ -73,15 +74,16 @@ public class GameSession { if (newEnemies.size() > 0 || changedEnemies.size() > 0) { enemyCallback.call( - player, - newEnemies.toArray(new Enemy[newEnemies.size()]), - changedEnemies.toArray(new Enemy[changedEnemies.size()])); + player, + newEnemies.toArray(new Enemy[newEnemies.size()]), + changedEnemies.toArray(new Enemy[changedEnemies.size()]) + ); } } private boolean shouldSpawn() { return lastSpawn + WAVE_SPAWN_DELAY < Instant.now().toEpochMilli() - && enemies[WAVE_SPAWN.x][WAVE_SPAWN.y] == null; + && enemies[WAVE_SPAWN.x][WAVE_SPAWN.y] == null; } private List moveEnemies() { @@ -96,11 +98,11 @@ public class GameSession { } AStar a = new AStar((Vector2i pos) -> { return pos.x >= 0 - && pos.x < MAP_SIZE.x - && pos.y >= 0 - && pos.y < MAP_SIZE.y - && (towers[pos.x] == null || towers[pos.x][pos.y] == null) - && (enemies[pos.x] == null || enemies[pos.x][pos.y] != null); + && pos.x < MAP_SIZE.x + && pos.y >= 0 + && pos.y < MAP_SIZE.y + && (towers[pos.x] == null || towers[pos.x][pos.y] == null) + && (enemies[pos.x] == null || enemies[pos.x][pos.y] != null); }); Vector2i next; try { @@ -118,11 +120,11 @@ public class GameSession { return changedEnemies; } - public void placeTower(Tower tower, int x, int y) throws InvalidPlacementException { - if (x < 0 || y < 0 || x + 1 > MAP_SIZE.x || y + 1 > MAP_SIZE.y) { + public void placeTower(Tower tower, Vector2i pos) throws InvalidPlacementException { + if (pos.x < 0 || pos.y < 0 || pos.x + 1 > MAP_SIZE.x || pos.y + 1 > MAP_SIZE.y) { throw new InvalidPlacementException(InvalidPlacementReason.OUT_OF_BOUNDS); } - if (towers[x][y] != null) { + if (towers[pos.x][pos.y] != null) { throw new InvalidPlacementException(InvalidPlacementReason.LOCATION_USED); } if (money < Tower.COST) { @@ -133,9 +135,8 @@ public class GameSession { money -= Tower.COST; moneyCallback.call(player, money); - tower.x = x; - tower.y = y; - towers[x][y] = tower; + tower.pos = pos; + towers[pos.x][pos.y] = tower; } public void addMoney(int amount) { diff --git a/src/main/java/de/towerdefence/server/game/Tower.java b/src/main/java/de/towerdefence/server/game/Tower.java index a4a9f64..4c30055 100644 --- a/src/main/java/de/towerdefence/server/game/Tower.java +++ b/src/main/java/de/towerdefence/server/game/Tower.java @@ -1,12 +1,13 @@ package de.towerdefence.server.game; +import org.joml.Vector2i; + import lombok.Getter; @Getter public class Tower { public static final int COST = 20; - protected int x; - protected int y; + protected Vector2i pos; public Tower() { } diff --git a/src/main/java/de/towerdefence/server/game/pathfinding/AStar.java b/src/main/java/de/towerdefence/server/game/pathfinding/AStar.java index 28c37b5..00cbbdd 100644 --- a/src/main/java/de/towerdefence/server/game/pathfinding/AStar.java +++ b/src/main/java/de/towerdefence/server/game/pathfinding/AStar.java @@ -92,9 +92,12 @@ public class AStar { if (!walkable.call(pos)) { return; } - accumulator.add(new PathNode( + accumulator.add( + new PathNode( right, nextCost, - right.gridDistance(target) + nextCost)); + right.gridDistance(target) + nextCost + ) + ); } } diff --git a/src/main/java/de/towerdefence/server/game/pathfinding/PathNode.java b/src/main/java/de/towerdefence/server/game/pathfinding/PathNode.java index 76893c0..f7e951d 100644 --- a/src/main/java/de/towerdefence/server/game/pathfinding/PathNode.java +++ b/src/main/java/de/towerdefence/server/game/pathfinding/PathNode.java @@ -6,7 +6,7 @@ import lombok.AllArgsConstructor; @AllArgsConstructor final class PathNode { - protected final Vector2i pos; - protected final long cost; // This is the cost to this Node - protected final long estimate; // This is the estimated remaining cost to the Target + final Vector2i pos; + final long cost; // This is the cost to this Node + final long estimate; // This is the estimated remaining cost to the Target } diff --git a/src/main/java/de/towerdefence/server/match/Match.java b/src/main/java/de/towerdefence/server/match/Match.java index b9cd016..43655ed 100644 --- a/src/main/java/de/towerdefence/server/match/Match.java +++ b/src/main/java/de/towerdefence/server/match/Match.java @@ -52,10 +52,11 @@ public class Match { } public void connectPlayer( - Player player, - PlayerMoneyCallback moneyCallback, - PlayerHitpointsCallback hitpointsCallback, - EnemiesChangedCallback enemyCallback) { + Player player, + PlayerMoneyCallback moneyCallback, + PlayerHitpointsCallback hitpointsCallback, + EnemiesChangedCallback enemyCallback + ) { 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 63729e7..306eaae 100644 --- a/src/main/java/de/towerdefence/server/match/MatchService.java +++ b/src/main/java/de/towerdefence/server/match/MatchService.java @@ -5,6 +5,8 @@ import de.towerdefence.server.game.callbacks.PlayerMoneyCallback; import de.towerdefence.server.game.exeptions.InvalidPlacementException; import de.towerdefence.server.game.exeptions.InvalidPlacementReason; import de.towerdefence.server.player.Player; + +import org.joml.Vector2i; import org.springframework.stereotype.Service; import java.util.HashMap; @@ -51,15 +53,16 @@ public class MatchService { if (opponent.isEmpty()) { throw new NotInMatchException(); } - playerSession.get().placeTower(new Tower(), x, y); + playerSession.get().placeTower(new Tower(), new Vector2i(x, y)); return opponent.get(); } public void playerConnected( - Player player, - PlayerMoneyCallback moneyCallback, - PlayerHitpointsCallback hitpointsCallback, - EnemiesChangedCallback enemyCallback) { + Player player, + PlayerMoneyCallback moneyCallback, + PlayerHitpointsCallback hitpointsCallback, + EnemiesChangedCallback enemyCallback + ) { Match match = playerMatches.get(player); match.connectPlayer(player, moneyCallback, hitpointsCallback, enemyCallback); Optional optionalPlayerSession = match.getPlayerGameSession(player); @@ -83,13 +86,13 @@ public class MatchService { } GameSession opponentSession = optionalOpponentSession.get(); ScheduledFuture moneyTask = scheduler.scheduleAtFixedRate( - () -> { - playerSession.addMoney(3); - opponentSession.addMoney(3); - }, - 5, - 5, - TimeUnit.SECONDS); + () -> { + playerSession.addMoney(3); + opponentSession.addMoney(3); + }, + 5, + 5, + TimeUnit.SECONDS); moneyTasks.put(match, moneyTask); } } 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 866b332..a155f33 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 @@ -1,22 +1,13 @@ package de.towerdefence.server.server.channels.match; -import java.io.IOException; -import java.util.Map; -import java.util.Objects; -import java.util.concurrent.ConcurrentHashMap; - -import org.springframework.web.socket.CloseStatus; -import org.springframework.web.socket.TextMessage; -import org.springframework.web.socket.WebSocketSession; - import com.fasterxml.jackson.databind.ObjectMapper; - import de.towerdefence.server.game.Enemy; import de.towerdefence.server.game.exeptions.InvalidPlacementException; import de.towerdefence.server.match.MatchService; import de.towerdefence.server.match.NotInMatchException; import de.towerdefence.server.player.Player; import de.towerdefence.server.server.JsonWebsocketHandler; +import de.towerdefence.server.server.channels.match.enemy.EnemyUpdateMessage; 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; @@ -25,6 +16,13 @@ import de.towerdefence.server.server.channels.match.placing.RequestTowerPlacingM import de.towerdefence.server.server.channels.match.placing.TowerPlacedMessage; import de.towerdefence.server.session.Channel; import de.towerdefence.server.session.SessionsService; +import java.io.IOException; +import java.util.Map; +import java.util.Objects; +import java.util.concurrent.ConcurrentHashMap; +import org.springframework.web.socket.CloseStatus; +import org.springframework.web.socket.TextMessage; +import org.springframework.web.socket.WebSocketSession; public class MatchWebsocketHandler extends JsonWebsocketHandler { @@ -42,10 +40,10 @@ public class MatchWebsocketHandler extends JsonWebsocketHandler { super.afterConnectionEstablished(session); playerSessions.put(sessionPlayers.get(session), session); matchService.playerConnected( - sessionPlayers.get(session), - this::onPlayerMoneyChanged, - this::onPlayerHitpointsChanged, - this::onEnemiesChanged + sessionPlayers.get(session), + this::onPlayerMoneyChanged, + this::onPlayerHitpointsChanged, + this::onEnemiesChanged ); } @@ -73,7 +71,11 @@ public class MatchWebsocketHandler extends JsonWebsocketHandler { } private void onEnemiesChanged(Player player, Enemy[] newEnemies, Enemy[] changedEnemies) { - + WebSocketSession session = playerSessions.get(player); + try { + new EnemyUpdateMessage(newEnemies, changedEnemies).send(session); + } catch (IOException ignored) { + } } @Override @@ -81,8 +83,9 @@ public class MatchWebsocketHandler extends JsonWebsocketHandler { try { String payload = message.getPayload(); if (!Objects.equals( - objectMapper.readTree(payload).get("$id").asText(), - RequestTowerPlacingMessage.MESSAGE_ID)) { + objectMapper.readTree(payload).get("$id").asText(), + RequestTowerPlacingMessage.MESSAGE_ID + )) { this.closeSession(session, CloseStatus.BAD_DATA); return; } @@ -90,19 +93,18 @@ public class MatchWebsocketHandler extends JsonWebsocketHandler { } catch (IOException ignored) { this.closeSession(session, CloseStatus.BAD_DATA); } - } - private void handleRequestTowerPlacingMessage( - WebSocketSession session, - String payload) throws IOException { - RequestTowerPlacingMessage msg = objectMapper.readValue(payload, RequestTowerPlacingMessage.class); + private void handleRequestTowerPlacingMessage(WebSocketSession session, String payload) + throws IOException { + RequestTowerPlacingMessage msg = + objectMapper.readValue(payload, RequestTowerPlacingMessage.class); Player opponent; try { - opponent = this.matchService.placeTower( - this.sessionPlayers.get(session), - msg.getX(), - msg.getY() + opponent =this.matchService.placeTower( + this.sessionPlayers.get(session), + msg.getX(), + msg.getY() ); } catch (InvalidPlacementException exception) { new InvalidPlacementMessage(msg.getX(), msg.getY(), exception.getReason()).send(session); diff --git a/src/main/java/de/towerdefence/server/server/channels/match/enemy/EnemyUpdateMessage.java b/src/main/java/de/towerdefence/server/server/channels/match/enemy/EnemyUpdateMessage.java index c83c359..909e4f7 100644 --- a/src/main/java/de/towerdefence/server/server/channels/match/enemy/EnemyUpdateMessage.java +++ b/src/main/java/de/towerdefence/server/server/channels/match/enemy/EnemyUpdateMessage.java @@ -12,8 +12,6 @@ import lombok.AllArgsConstructor; import java.util.Arrays; import java.util.List; import java.util.Map; -import java.util.stream.Collector; -import java.util.stream.Collectors; @AllArgsConstructor public class EnemyUpdateMessage extends JsonMessage { @@ -34,8 +32,8 @@ public class EnemyUpdateMessage extends JsonMessage { .map((Enemy enemy) -> { ObjectNode o = factory.objectNode(); o.set("id", factory.numberNode(enemy.getId())); - o.set("x", factory.numberNode(enemy.getX())); - o.set("y", factory.numberNode(enemy.getY())); + o.set("x", factory.numberNode(enemy.getPos().x)); + o.set("y", factory.numberNode(enemy.getPos().y)); return o; }) .map(JsonNode.class::cast) @@ -46,8 +44,8 @@ public class EnemyUpdateMessage extends JsonMessage { .map((Enemy enemy) -> { ObjectNode o = factory.objectNode(); o.set("id", factory.numberNode(enemy.getId())); - o.set("x", factory.numberNode(enemy.getX())); - o.set("y", factory.numberNode(enemy.getY())); + o.set("x", factory.numberNode(enemy.getPos().x)); + o.set("y", factory.numberNode(enemy.getPos().y)); return o; }) .map(JsonNode.class::cast) diff --git a/src/main/java/de/towerdefence/server/server/channels/match/placing/InvalidPlacementMessage.java b/src/main/java/de/towerdefence/server/server/channels/match/placing/InvalidPlacementMessage.java index a8b1e95..0597fa8 100644 --- a/src/main/java/de/towerdefence/server/server/channels/match/placing/InvalidPlacementMessage.java +++ b/src/main/java/de/towerdefence/server/server/channels/match/placing/InvalidPlacementMessage.java @@ -24,8 +24,9 @@ public class InvalidPlacementMessage extends JsonMessage { @Override protected Map getData(JsonNodeFactory factory) { return Map.of( - "x", factory.numberNode(this.x), - "y", factory.numberNode(this.y), - "reason", factory.textNode(this.reason.getJsonName())); + "x", factory.numberNode(this.x), + "y", factory.numberNode(this.y), + "reason", factory.textNode(this.reason.getJsonName()) + ); } } diff --git a/src/main/java/de/towerdefence/server/server/channels/match/placing/TowerPlacedMessage.java b/src/main/java/de/towerdefence/server/server/channels/match/placing/TowerPlacedMessage.java index fcf3a31..ed5be87 100644 --- a/src/main/java/de/towerdefence/server/server/channels/match/placing/TowerPlacedMessage.java +++ b/src/main/java/de/towerdefence/server/server/channels/match/placing/TowerPlacedMessage.java @@ -22,9 +22,9 @@ public class TowerPlacedMessage extends JsonMessage { @Override protected Map getData(JsonNodeFactory factory) { return Map.of( - "x", factory.numberNode(this.x), - "y", factory.numberNode(this.y), - "map", factory.textNode(this.map.getJsonName()) - ); + "x", factory.numberNode(this.x), + "y", factory.numberNode(this.y), + "map", factory.textNode(this.map.getJsonName()) + ); } } diff --git a/src/main/resources/spotbugs-exclude.xml b/src/main/resources/spotbugs-exclude.xml index d737fbf..d3a00dc 100644 --- a/src/main/resources/spotbugs-exclude.xml +++ b/src/main/resources/spotbugs-exclude.xml @@ -25,4 +25,10 @@ + + + + + +