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 ba3d5af9..3e5b837e 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 @@ -238,9 +238,6 @@ 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")); - //TODO: Server JSON Check - - ownMap().clear(); dto.getShips().forEach(ownMap()::add); harbor().clear(); diff --git a/Projekte/battleship/model/src/main/java/pp/battleship/game/client/WaitState.java b/Projekte/battleship/model/src/main/java/pp/battleship/game/client/WaitState.java index 90cb8176..c4a5d0cb 100644 --- a/Projekte/battleship/model/src/main/java/pp/battleship/game/client/WaitState.java +++ b/Projekte/battleship/model/src/main/java/pp/battleship/game/client/WaitState.java @@ -7,6 +7,7 @@ package pp.battleship.game.client; +import pp.battleship.message.server.GameDetails; import pp.battleship.message.server.StartBattleMessage; import java.lang.System.Logger.Level; @@ -38,4 +39,11 @@ public void receivedStartBattle(StartBattleMessage msg) { logic.setInfoText(msg.getInfoTextKey()); logic.setState(new BattleState(logic, msg.isMyTurn())); } + + @Override + public void receivedGameDetails(GameDetails details) { + ClientGameLogic.LOGGER.log(Level.WARNING, "Invalid Map"); //NON-NLS + logic.setInfoText("invalid.map"); + logic.setState(new EditorState(logic)); + } } 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..06e6f724 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,8 +142,38 @@ 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 - playerReady(getPlayerById(from), msg.getShips()); + else{ + if(checkMap(msg.getShips())){ + playerReady(getPlayerById(from), msg.getShips()); + } + else{ + LOGGER.log(Level.WARNING, "Invalid Map sent from player {0}", from); //NON-NLS + send(players.get(from), new GameDetails(config)); + } + } + } + + private boolean checkMap(List ships){ + //Anzahl + int numShips = config.getShipNums().values().stream().mapToInt(Integer::intValue).sum(); + if (numShips != ships.size()) return false; + + List occupied = new ArrayList<>(); + //Every Ship Position Is in Map Height/Width + //Überlappen + for (Battleship battleship: ships){ + int x = battleship.getX(); + int y = battleship.getY(); + for(int i = 0; i < battleship.getLength(); i++){ + if(x >= 0 && x < config.getMapWidth() && y >= 0 && y < config.getMapHeight() && !occupied.contains(new IntPoint(x,y))){ + occupied.add(new IntPoint(x,y)); + x += battleship.getRot().dx(); + y += battleship.getRot().dy(); + } + else return false; + } + } + return true; } /** diff --git a/Projekte/battleship/model/src/main/resources/battleship.properties b/Projekte/battleship/model/src/main/resources/battleship.properties index 47f1f6cf..b9fb7d8c 100644 --- a/Projekte/battleship/model/src/main/resources/battleship.properties +++ b/Projekte/battleship/model/src/main/resources/battleship.properties @@ -37,3 +37,4 @@ dialog.error=Error dialog.question=Question port.must.be.integer=Port must be an integer number map.doesnt.fit=The map doesn't fit to this game +invalid.map=Invalid Map! diff --git a/Projekte/battleship/model/src/main/resources/battleship_de.properties b/Projekte/battleship/model/src/main/resources/battleship_de.properties index 40394202..5647d6cf 100644 --- a/Projekte/battleship/model/src/main/resources/battleship_de.properties +++ b/Projekte/battleship/model/src/main/resources/battleship_de.properties @@ -27,7 +27,7 @@ host.name=Host port.number=Port wait.its.not.your.turn=Warte, Du bist nicht dran!! menu.quit=Spiel beenden -menu.return-to-game=Zurück zum Spiel +menu.return-to-game=Zurück zum Spiel menu.sound-enabled=Sound eingeschaltet menu.map.load=Karte von Datei laden... menu.map.save=Karte in Datei speichern... @@ -37,3 +37,4 @@ dialog.error=Fehler dialog.question=Frage port.must.be.integer=Der Port muss eine ganze Zahl sein map.doesnt.fit=Diese Karte passt nicht zu diesem Spiel +invalid.map=Ungültige Karte!