From 0f70f4691db18228f6a02c21e5a32c00710c0469 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timo=20Brennf=C3=B6rder?= Date: Wed, 2 Oct 2024 19:38:42 +0200 Subject: [PATCH] added logic for server- and clientside verification of JSON-files --- .../battleship/game/client/EditorState.java | 41 +++++++++++++++++-- .../game/server/ServerGameLogic.java | 40 +++++++++++++++++- .../pp/battleship/model/dto/ShipMapDTO.java | 14 +++++++ 3 files changed, 90 insertions(+), 5 deletions(-) diff --git a/Projekte/battleship/model/src/main/java/pp/battleship/game/client/EditorState.java b/Projekte/battleship/model/src/main/java/pp/battleship/game/client/EditorState.java index 3e5b837e..d49d8c17 100644 --- a/Projekte/battleship/model/src/main/java/pp/battleship/game/client/EditorState.java +++ b/Projekte/battleship/model/src/main/java/pp/battleship/game/client/EditorState.java @@ -16,8 +16,11 @@ import java.io.File; import java.io.IOException; import java.lang.System.Logger.Level; +import java.util.Arrays; +import java.util.List; import static pp.battleship.Resources.lookup; +import static pp.battleship.game.client.ClientGameLogic.LOGGER; import static pp.battleship.model.Battleship.Status.INVALID_PREVIEW; import static pp.battleship.model.Battleship.Status.NORMAL; import static pp.battleship.model.Battleship.Status.VALID_PREVIEW; @@ -56,7 +59,7 @@ public boolean showEditor() { */ @Override public void movePreview(IntPoint pos) { - ClientGameLogic.LOGGER.log(Level.DEBUG, "move preview to {0}", pos); //NON-NLS + LOGGER.log(Level.DEBUG, "move preview to {0}", pos); //NON-NLS if (preview == null || !ownMap().isValid(pos)) return; preview.moveTo(pos); setPreviewStatus(preview); @@ -71,7 +74,7 @@ public void movePreview(IntPoint pos) { */ @Override public void clickOwnMap(IntPoint pos) { - ClientGameLogic.LOGGER.log(Level.DEBUG, "click at {0} in own map", pos); //NON-NLS + LOGGER.log(Level.DEBUG, "click at {0} in own map", pos); //NON-NLS if (!ownMap().isValid(pos)) return; if (preview == null) modifyShip(pos); @@ -125,7 +128,7 @@ private void placeShip(IntPoint cursor) { */ @Override public void clickHarbor(IntPoint pos) { - ClientGameLogic.LOGGER.log(Level.DEBUG, "click at {0} in harbor", pos); //NON-NLS + LOGGER.log(Level.DEBUG, "click at {0} in harbor", pos); //NON-NLS if (!harbor().isValid(pos)) return; final Battleship shipAtCursor = harbor().findShipAt(pos); if (preview != null) { @@ -152,7 +155,7 @@ else if (shipAtCursor != null) { */ @Override public void rotateShip() { - ClientGameLogic.LOGGER.log(Level.DEBUG, "pushed rotate"); //NON-NLS + LOGGER.log(Level.DEBUG, "pushed rotate"); //NON-NLS if (preview == null) return; preview.rotated(); ownMap().remove(preview); @@ -238,6 +241,9 @@ public void loadMap(File file) throws IOException { final ShipMapDTO dto = ShipMapDTO.loadFrom(file); if (!dto.fits(logic.getDetails())) throw new IOException(lookup("map.doesnt.fit")); + else if (!checkMapToLoad(dto)) { + throw new IOException(lookup("ships.dont.fit.the.map")); + } ownMap().clear(); dto.getShips().forEach(ownMap()::add); harbor().clear(); @@ -245,6 +251,33 @@ public void loadMap(File file) throws IOException { selectedInHarbor = null; } + private boolean checkMapToLoad(ShipMapDTO dto) { + int mapWidth = dto.getWidth(); + int mapHeight = dto.getHeight(); + + // check if ship is out of bounds + for (int i = 0; i < dto.getShips().size(); i++) { + Battleship battleship = dto.getShips().get(i); + if (battleship.getMaxX() >= mapWidth || battleship.getMinX() < 0 || battleship.getMaxY() >= mapHeight || battleship.getMinY() < 0) { + LOGGER.log(Level.ERROR, "Ship is out of bounds ({0})", battleship.toString()); + return false; + } + } + + // check if ships overlap + List ships = dto.getShips(); + for(Battleship ship:ships) { + for (Battleship compareShip : ships) { + if (!(ship == compareShip)) { + if (ship.collidesWith(compareShip)) { + return false; + } + } + } + } + return true; + } + /** * Checks if the player's own map may be loaded from a file. * diff --git a/Projekte/battleship/model/src/main/java/pp/battleship/game/server/ServerGameLogic.java b/Projekte/battleship/model/src/main/java/pp/battleship/game/server/ServerGameLogic.java index a5987fa1..5f90c7c6 100644 --- a/Projekte/battleship/model/src/main/java/pp/battleship/game/server/ServerGameLogic.java +++ b/Projekte/battleship/model/src/main/java/pp/battleship/game/server/ServerGameLogic.java @@ -142,9 +142,47 @@ public Player addPlayer(int id) { public void received(MapMessage msg, int from) { if (state != ServerState.SET_UP) LOGGER.log(Level.ERROR, "playerReady not allowed in {0}", state); //NON-NLS + else if(!checkMap(msg, from)) + LOGGER.log(Level.ERROR, "The submitted map is not allowed"); else playerReady(getPlayerById(from), msg.getShips()); } + /** + * Returns true if the map contains correct ship placement and is of the correct size + * + * @param msg the received MapMessage of the player + * @param from the ID of the Player + * @return a boolean based on if the transmitted map ist correct + */ + + private boolean checkMap(MapMessage msg, int from) { + int mapWidth = getPlayerById(from).getMap().getWidth(); + int mapHeight = getPlayerById(from).getMap().getHeight(); + + if (mapHeight != 10 || mapWidth != 10) + return false; + + // check if ship is out of bounds + for (Battleship ship : msg.getShips()){ + if (ship.getMaxX() >= mapWidth || ship.getMinX() < 0 || ship.getMaxY() >= mapHeight || ship.getMinY() < 0) { + LOGGER.log(Level.ERROR, "Ship is out of bounds ({0})", ship.toString()); + return false; + } + } + + // check if ships overlap + List ships = msg.getShips(); + for(Battleship ship:ships){ + for(Battleship compareShip:ships){ + if(!(ship==compareShip)){ + if(ship.collidesWith(compareShip)){ + return false; + } + } + } + } + return true; + } /** * Handles the reception of a ShootMessage. @@ -160,7 +198,7 @@ public void received(ShootMessage msg, int from) { shoot(getPlayerById(from), msg.getPosition()); } - /** + /** * Marks the player as ready and sets their ships. * Transitions the state to PLAY if both players are ready. * diff --git a/Projekte/battleship/model/src/main/java/pp/battleship/model/dto/ShipMapDTO.java b/Projekte/battleship/model/src/main/java/pp/battleship/model/dto/ShipMapDTO.java index 9d53146c..294b6e94 100644 --- a/Projekte/battleship/model/src/main/java/pp/battleship/model/dto/ShipMapDTO.java +++ b/Projekte/battleship/model/src/main/java/pp/battleship/model/dto/ShipMapDTO.java @@ -114,4 +114,18 @@ public static ShipMapDTO loadFrom(File file) throws IOException { throw new IOException(e.getLocalizedMessage()); } } + + /** + * This method returns the width of the DTO + * @return with of DTO + */ + + public int getWidth() {return width;} + + /** + * This method returns the height of the DTO + * @return height of DTO + */ + + public int getHeight(){return height;} }