diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000000000000000000000000000000000000..206a4832ae92354aef8616735cb9491c04be0a41 --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,45 @@ +include: + - template: Jobs/SAST.gitlab-ci.yml + +cache: + paths: + - .m2/repository + +variables: + MAVEN_OPTS: "-Dmaven.repo.local=$CI_PROJECT_DIR/.m2/repository" + +stages: +- build +- test +- package + +build-battlearena: + stage: build + image: maven:3.9.4-eclipse-temurin-20 + script: + - "echo 'Starting Build Stage'" + - "mvn compile -X" +test-battlearena: + stage: test + image: maven:3.9.4-eclipse-temurin-20 + script: + - "echo 'Starting Test Stage'" + - "mvn test" + artifacts: + reports: + junit: + - target/surefire-reports/TEST-*.xml + - target/failsafe-reports/TEST-*.xml +package-battlearena: + stage: package + image: maven:3.9.4-eclipse-temurin-20 + script: + - "echo 'Starting Package Stage'" + - "mvn package" + only: + refs: + - main + artifacts: + paths: + - target/*.jar + expire_in: 2 days diff --git a/README.md b/README.md index eab1454caa44dab8605d96de620ae2ec8ebbe63c..c8ed180932d8034e6d7cf77be498959605726541 100644 --- a/README.md +++ b/README.md @@ -1,17 +1,23 @@ -## Hier könnte ihre Werbung stehn +# Hier könnte ihre Werbung stehn ### Known issues: - - JavaFX Mediaplayer is buggy under Windows 11. Videos can have weird behaviors and sometimes won't load at all - - SQL server is very slow (thanks Oracle) + - JavaFX Mediaplayer is buggy under Windows 11. Videos can have weird behaviors and sometimes won't load at all + - SQL server is very slow (thanks Oracle) -<br><br> -#### FAQ: -Why is the Game loading so long? <br> - cry about it +<br> + +## FAQ: +### Why is the Game loading so long? +cry about it -Why can't I connect to the Multiplayer? <br> - cry about it +### Why can't I connect to the Multiplayer? +cry about it -The character is moving too quickly <br> - cry about it +### Why is my character moving so quickly? +cry about it -The UI is too small <br> - cry about it +### Why is the UI so small? +cry about it -Why doesn't the intro load? <br> - cry about it \ No newline at end of file +### Why doesn't the intro load? +cry about it diff --git a/pom.xml b/pom.xml index 00cecae4b603bb2ef7a769e8effa5db5010b47d5..1aecd3dfda9b648f6512a200cc6b5651b8d55800 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ <groupId>de.hdm_stuttgart.battlearena</groupId> <artifactId>BattleArena</artifactId> - <version>v0.0.1</version> + <version>0.6.1</version> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Controller/GameSceneController.java b/src/main/java/de/hdm_stuttgart/battlearena/Controller/GameSceneController.java index ae0435c5235abbbecfe2cd193261f7bc5a05ca23..517317a498a261c22d283ec45fa2cb6c7b767330 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Controller/GameSceneController.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Controller/GameSceneController.java @@ -196,13 +196,17 @@ public class GameSceneController implements Initializable { updateExplosionspawns(); player.checkGameplayObjectInteraction(player, graphicsContext2D); enemy.checkGameplayObjectInteraction(enemy, graphicsContext2D); - player.placeBombAction(player, graphicsContext2D); enemy.placeBombAction(enemy, graphicsContext2D); + + healthBar(); + } + + private void healthBar() { double playerHP = (double) getPlayer().getHealth() / getPlayer().getMaxEntityHealth(); double enemyHP = (double) getEnemy().getHealth() / getEnemy().getMaxEntityHealth(); if (playerHP >= 0) { - playerHealth.setWidth(healthBarWidth * (playerHP)); + playerHealth.setWidth(healthBarWidth * playerHP); double playerPercentage = playerHP * 100; playerHp.setText((int) playerPercentage + "%"); } else { diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Controller/LocalCreateController.java b/src/main/java/de/hdm_stuttgart/battlearena/Controller/LocalCreateController.java index 9284a0f05631f669f065ee4e3b8235b06b713322..d25105570cda2e6ed7f5242707a64ec3d915f4f5 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Controller/LocalCreateController.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Controller/LocalCreateController.java @@ -4,6 +4,7 @@ import de.hdm_stuttgart.battlearena.Controller.Utilities.SceneLoader; import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.Persistence; import javafx.fxml.FXML; import javafx.fxml.Initializable; +import javafx.scene.control.Label; import javafx.scene.control.TitledPane; import javafx.scene.control.ToggleButton; import javafx.scene.control.ToggleGroup; @@ -21,6 +22,8 @@ public class LocalCreateController implements Initializable { private TitledPane roundsTitledPane; @FXML private ToggleGroup rounds; + @FXML + private Label errorMsg; private final SceneLoader sceneLoader = new SceneLoader(); private static final Logger log = LogManager.getLogger(Persistence.class); @@ -34,6 +37,7 @@ public class LocalCreateController implements Initializable { log.info("Match rounds: " + selected.getText()); } }); +// TODO: toggle for time and other items } @FXML @@ -44,7 +48,11 @@ public class LocalCreateController implements Initializable { @FXML private void skinSelectionScene() { - parent.getChildren().clear(); - parent.getChildren().add(sceneLoader.loadScene("SkinSelection")); + if (rounds.getSelectedToggle() == null) { + errorMsg.setText("Please select round"); + } else { + parent.getChildren().clear(); + parent.getChildren().add(sceneLoader.loadScene("SkinSelection")); + } } } diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Controller/MapSelectionController.java b/src/main/java/de/hdm_stuttgart/battlearena/Controller/MapSelectionController.java index bd769f0765bc5ad4b966062eef20363e93bbf090..3a58b3af1a6088dd21a180c746953275619ae6dc 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Controller/MapSelectionController.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Controller/MapSelectionController.java @@ -9,6 +9,7 @@ import de.hdm_stuttgart.battlearena.Model.Map.Biom; import javafx.fxml.FXML; import javafx.fxml.FXMLLoader; import javafx.fxml.Initializable; +import javafx.scene.control.Label; import javafx.scene.control.TitledPane; import javafx.scene.control.ToggleButton; import javafx.scene.control.ToggleGroup; @@ -29,7 +30,9 @@ public class MapSelectionController implements Initializable { @FXML private TitledPane maps, textures; @FXML - private ToggleGroup textureToggle; + private ToggleGroup textureToggle, mapToggle; + @FXML + private Label errorMsg; private String selectedTexture, selectedMap; @@ -72,17 +75,17 @@ public class MapSelectionController implements Initializable { } private void setMap() { - ToggleGroup group = new ToggleGroup(); + mapToggle = new ToggleGroup(); for (MapData coreMap : coreMaps) { ToggleButton toggleButton = new ToggleButton(coreMap.getMapName()); - toggleButton.setToggleGroup(group); + toggleButton.setToggleGroup(mapToggle); boxBox.getChildren().add(toggleButton); } - group.selectedToggleProperty().addListener((observableValue, oldToggle, newToggle) -> { - if (group.getSelectedToggle() != null) { - ToggleButton selected = (ToggleButton) group.getSelectedToggle(); + mapToggle.selectedToggleProperty().addListener((observableValue, oldToggle, newToggle) -> { + if (mapToggle.getSelectedToggle() != null) { + ToggleButton selected = (ToggleButton) mapToggle.getSelectedToggle(); mapIndex = boxBox.getChildren().indexOf(selected); selectedMap = selected.getText(); maps.setText(selectedMap); @@ -92,15 +95,21 @@ public class MapSelectionController implements Initializable { @FXML private void gameScene() { - try { - RuntimeInfo.getInstance().setGameMap(coreMaps.get(mapIndex)); - log.info("Selected map: " + selectedMap); - log.info("Selected texture: " + selectedTexture); - parent.getScene().setRoot(FXMLLoader.load(Objects.requireNonNull(getClass().getResource("/fxml/GameScene.fxml")))); - RuntimeInfo.getInstance().setGameState(GameState.PLAYING); - } catch (IOException e) { - log.error(e); - throw new RuntimeException(); + if (mapToggle.getSelectedToggle() == null) { + errorMsg.setText("Please select a map"); + } else if (textureToggle.getSelectedToggle() == null) { + errorMsg.setText("Please select a texture"); + } else { + try { + RuntimeInfo.getInstance().setGameMap(coreMaps.get(mapIndex)); + log.info("Selected map: " + selectedMap); + log.info("Selected texture: " + selectedTexture); + parent.getScene().setRoot(FXMLLoader.load(Objects.requireNonNull(getClass().getResource("/fxml/GameScene.fxml")))); + RuntimeInfo.getInstance().setGameState(GameState.PLAYING); + } catch (IOException e) { + log.error(e); + throw new RuntimeException(); + } } } diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Controller/MenuBorderPaneController.java b/src/main/java/de/hdm_stuttgart/battlearena/Controller/MenuBorderPaneController.java index 8b861d21b43392e78fa90bbac0297ed08817a49f..550fe92967678b0752a46bb94a39543c8859dd36 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Controller/MenuBorderPaneController.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Controller/MenuBorderPaneController.java @@ -3,18 +3,23 @@ package de.hdm_stuttgart.battlearena.Controller; import de.hdm_stuttgart.battlearena.Controller.Enum.GameState; import de.hdm_stuttgart.battlearena.Controller.Utilities.CreateMediaPlayer; import de.hdm_stuttgart.battlearena.Controller.Utilities.SceneLoader; +import de.hdm_stuttgart.battlearena.Main.Driver; import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.ENUMs.AccountType; import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.Persistence; import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.RuntimeInfo; import javafx.fxml.FXML; import javafx.fxml.Initializable; +import javafx.fxml.LoadException; import javafx.geometry.Rectangle2D; import javafx.scene.control.Button; import javafx.scene.image.ImageView; import javafx.scene.layout.StackPane; +import javafx.scene.media.MediaException; import javafx.scene.media.MediaPlayer; import javafx.scene.media.MediaView; import javafx.stage.Screen; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import java.io.File; import java.net.URL; @@ -34,11 +39,12 @@ public class MenuBorderPaneController implements Initializable { private final String[] videoFiles = {"depression", "cpr", "allMyFellas", "minecraftCat3", "steak", "wooOOoo", "myMind", "gender", "dogCheese", "gta", "cat", "bobama", "roomba", "firework", "cheezburger", "kangaroo", "lifeCouldBeMonke", "seal", "humping", "slap", "rolling", "spoderman", "imNotYou", "email", "parkingTickets", "russianKid", "rejectHumanity", "horse", "catSitting", "pablo", "holyCrap", "lessGoo", "sadCat", "basketball", "yoinkySploinky", "spinSlot", "justTheTwoOfUs", "denied", "msPuff", "=D", "banana", "chaCha", "async", "sadHorse", "minecraftCat", "muecke", "top10Cats", "dog", - "pot", "catRave", "mineCraftCat2", "defense", "singingCat", "tutel", "catEating", "catJump", "bear", "pancake", "frog", "gtfo", "carl", "dog2", "slippery", "wolf", "legCat", "sad", "waaahhh"}; + "pot", "catRave", "mineCraftCat2", "defense", "singingCat", "rainbow", "tutel", "catEating", "catJump", "bear", "pancake", "frog", "gtfo", "carl", "dog2", "slippery", "wolf", "legCat", "sad", "waaahhh"}; List<String> shuffledVideos = Arrays.asList(videoFiles); Rectangle2D screen = Screen.getPrimary().getVisualBounds(); RuntimeInfo runtimeInfo = RuntimeInfo.getInstance(); + private static final Logger log = LogManager.getLogger(MenuBorderPaneController.class); @Override public void initialize(URL url, ResourceBundle resourceBundle) { @@ -53,7 +59,6 @@ public class MenuBorderPaneController implements Initializable { imgRight.setPreserveRatio(true); imgLeft.setFitWidth(imageWidth); imgLeft.setPreserveRatio(true); - easterEgg(); // shuffle meme order @@ -68,7 +73,6 @@ public class MenuBorderPaneController implements Initializable { } }); - btnLeft.setOnMouseClicked(mouseEvent -> { // make background music continue play after there is no meme left if (videoCounter == shuffledVideos.size()) { @@ -82,13 +86,17 @@ public class MenuBorderPaneController implements Initializable { if (videoCounter < videoFiles.length) { String nextVideo = shuffledVideos.get(videoCounter); runtimeInfo.setGameState(GameState.NONE); - mediaPlayer = new CreateMediaPlayer().getMediaPlayer(mediaView, new File("src/main/resources/videos/" + nextVideo + ".mp4"), false); - mediaView = new MediaView(mediaPlayer); - center.getChildren().add(mediaView); - mediaPlayer.setOnEndOfMedia(() -> { - center.getChildren().remove(mediaView); - runtimeInfo.setGameState(GameState.MENU); - }); + try { + mediaPlayer = new CreateMediaPlayer().getMediaPlayer(mediaView, new File("src/main/resources/videos/" + nextVideo + ".mp4"), false); + mediaView = new MediaView(mediaPlayer); + center.getChildren().add(mediaView); + mediaPlayer.setOnEndOfMedia(() -> { + center.getChildren().remove(mediaView); + runtimeInfo.setGameState(GameState.MENU); + }); + } catch (MediaException e) { + log.error(e); + } } videoCounter++; }); diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Controller/SettingsController.java b/src/main/java/de/hdm_stuttgart/battlearena/Controller/SettingsController.java index 195aaaa6af32a6356b9e4ee94d1e704d96b45fae..36a85f3392ca65235a13d57c8a246b04ffc05c63 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Controller/SettingsController.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Controller/SettingsController.java @@ -2,6 +2,7 @@ package de.hdm_stuttgart.battlearena.Controller; import de.hdm_stuttgart.battlearena.Controller.Enum.GameState; import de.hdm_stuttgart.battlearena.Controller.Utilities.SceneLoader; +import de.hdm_stuttgart.battlearena.Main.Driver; import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.Persistence; import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.RuntimeInfo; import de.hdm_stuttgart.battlearena.Model.Sound.MusicPlayer; @@ -9,8 +10,12 @@ import de.hdm_stuttgart.battlearena.Model.Sound.SoundEffects; import javafx.fxml.FXML; import javafx.fxml.FXMLLoader; import javafx.fxml.Initializable; +import javafx.fxml.LoadException; import javafx.scene.control.Slider; import javafx.scene.layout.VBox; +import javafx.scene.media.MediaException; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import java.io.IOException; import java.net.URL; @@ -27,6 +32,7 @@ public class SettingsController implements Initializable { private final Persistence persistence = Persistence.getInstance(); private final MusicPlayer player = MusicPlayer.getInstance(); private final SoundEffects sfx = new SoundEffects(); + private static final Logger log = LogManager.getLogger(SettingsController.class); @Override public void initialize(URL url, ResourceBundle resourceBundle) { @@ -36,9 +42,12 @@ public class SettingsController implements Initializable { @FXML private void creditScene() throws IOException { - RuntimeInfo.getInstance().setGameState(GameState.NONE); - parent.getChildren().clear(); - parent.getScene().setRoot(FXMLLoader.load(Objects.requireNonNull(getClass().getResource("/fxml/credits.fxml")))); + try { + RuntimeInfo.getInstance().setGameState(GameState.NONE); + parent.getScene().setRoot(FXMLLoader.load(Objects.requireNonNull(getClass().getResource("/fxml/credits.fxml")))); + } catch (LoadException e) { + log.error(e); + } } @FXML diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Controller/SkinSelectionController.java b/src/main/java/de/hdm_stuttgart/battlearena/Controller/SkinSelectionController.java index 6c33ca6e90bf1e51034774959e53b53f7b2c1aa0..bd7dd2b91206e15e3ea8838388e3bc0262a0d35b 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Controller/SkinSelectionController.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Controller/SkinSelectionController.java @@ -6,6 +6,7 @@ import de.hdm_stuttgart.battlearena.Model.Entity.EntityClass; import javafx.fxml.FXML; import javafx.fxml.Initializable; import javafx.geometry.Rectangle2D; +import javafx.scene.control.Label; import javafx.scene.control.ToggleButton; import javafx.scene.control.ToggleGroup; import javafx.scene.image.ImageView; @@ -24,6 +25,8 @@ public class SkinSelectionController implements Initializable { private ToggleGroup playerOne, playerTwo; @FXML private ImageView playerOne1, playerOne2, playerOne3, playerTwo1, playerTwo2, playerTwo3; + @FXML + private Label errorMsg; private String playerOneSkin, playerTwoSkin; private final RuntimeInfo runtimeInfo = RuntimeInfo.getInstance(); private static final Logger log = LogManager.getLogger(MapSelectionController.class); @@ -86,9 +89,13 @@ public class SkinSelectionController implements Initializable { @FXML private void gameScene() { - log.info("Player 1 skin: " + playerOneSkin); - log.info("Player 2 skin: " + playerTwoSkin); - parent.getChildren().clear(); - parent.getChildren().add(new SceneLoader().loadScene("MapSelection")); + if (playerOne.getSelectedToggle() == null || playerTwo.getSelectedToggle() == null) { + errorMsg.setText("Please select a skin!"); + } else { + log.info("Player 1 skin: " + playerOneSkin); + log.info("Player 2 skin: " + playerTwoSkin); + parent.getChildren().clear(); + parent.getChildren().add(new SceneLoader().loadScene("MapSelection")); + } } } diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Controller/Utilities/CreateMediaPlayer.java b/src/main/java/de/hdm_stuttgart/battlearena/Controller/Utilities/CreateMediaPlayer.java index 4bf6c165db835d9908078118b40628cbfbc2350a..77b75f557afdfa53dcb6b66fe78603e873be2385 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Controller/Utilities/CreateMediaPlayer.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Controller/Utilities/CreateMediaPlayer.java @@ -2,13 +2,14 @@ package de.hdm_stuttgart.battlearena.Controller.Utilities; import javafx.scene.layout.BorderPane; import javafx.scene.media.Media; +import javafx.scene.media.MediaException; import javafx.scene.media.MediaPlayer; import javafx.scene.media.MediaView; import java.io.File; public class CreateMediaPlayer { - public MediaPlayer getMediaPlayer(MediaView mediaView, File file, boolean isFullscreen, BorderPane... parent) { + public MediaPlayer getMediaPlayer(MediaView mediaView, File file, boolean isFullscreen, BorderPane... parent) throws MediaException { Media media = new Media(file.toURI().toString()); MediaPlayer mediaPlayer = new MediaPlayer(media); diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Main/Driver.java b/src/main/java/de/hdm_stuttgart/battlearena/Main/Driver.java index 83297700dd3dff0d7550224eef882ca59a72d8e4..2a12b7cc499eb7f2caf792c736de439c1fe4201a 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Main/Driver.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Main/Driver.java @@ -9,6 +9,7 @@ import javafx.application.Application; import javafx.application.Platform; import javafx.event.EventHandler; import javafx.fxml.FXMLLoader; +import javafx.fxml.LoadException; import javafx.geometry.Rectangle2D; import javafx.scene.Parent; import javafx.scene.Scene; @@ -30,6 +31,7 @@ public class Driver extends Application { Rectangle2D screen = Screen.getPrimary().getVisualBounds(); InputHandler inputHandler = InputHandler.getInstance(); + Parent root; @@ -40,8 +42,11 @@ public class Driver extends Application { Font.loadFont(getClass().getResourceAsStream("/fonts/AmaticSC-Bold.ttf"), 50); Font.loadFont(getClass().getResourceAsStream("/fonts/Arthemis-mLA22.ttf"), 50); Font.loadFont(getClass().getResourceAsStream("/fonts/ShadowsIntoLight-Regular.ttf"), 50); - - Parent root = FXMLLoader.load(Objects.requireNonNull(getClass().getResource("/fxml/Intro.fxml"))); + try { + root = FXMLLoader.load(Objects.requireNonNull(getClass().getResource("/fxml/Intro.fxml"))); + } catch (LoadException e) { + root = FXMLLoader.load(Objects.requireNonNull(getClass().getResource("/fxml/LoadingScreen.fxml"))); + } Scene scene = new Scene(root); diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/Player.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/Player.java index b9ca0d85c98297bc29fb2bc01907268aeeb41e7e..ece752eefc537363b266a5074b5d83a6b90fd629 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/Player.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/Player.java @@ -538,6 +538,7 @@ class Player implements IEntity { blastradius = updateBlastradius(blastradius); if (isBigBombItemFrame && !isTeleportItemFrame) { + sfx.playSoundEffectOnce(SFX.BOMB); log.debug("We have Big_Bomb ItemFrames in the List"); bombPlacementRate = updateBombPlacementRate(bombPlacementRate); int xTile = (pixelpadding + mapPosX) / scaledTileSize; @@ -576,6 +577,7 @@ class Player implements IEntity { removeMarker(markerPlacedPlayerTwo); isTeleportItemFrame = false; } else if (!isTeleportItemFrame) { + sfx.playSoundEffectOnce(SFX.BOMB); log.debug("No BigBomb Itemframes in the List"); bombPlacementRate = bombReducedPlacementRate; int xTile = (pixelpadding + mapPosX) / scaledTileSize; diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/Multiplayer/ConnectionHandler.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/Multiplayer/ConnectionHandler.java index c1caafadcea8175884a736e19db31a4164e9bb08..48c31a576c546179217c67ec02df6f7041b555ea 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Model/Multiplayer/ConnectionHandler.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/Multiplayer/ConnectionHandler.java @@ -36,7 +36,6 @@ public class ConnectionHandler { ConnectionThread connectionthread = new ConnectionThread(client); connectionthread.start(); - } private static class ConnectionThread extends Thread { @@ -49,6 +48,7 @@ public class ConnectionHandler { public void run() { try { while (!Thread.interrupted()) { + System.out.println(Arrays.toString(coordinates)); int[] cords = client.sendcords(coordinates); enemyX = cords[0]; enemyY = cords[1]; diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/Multiplayer/Server.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/Multiplayer/Server.java index 32ee4320d12999d77fc19bb1b4deae32433d779e..946bf73ae679fd9072b5706157079a968a7c4dd8 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Model/Multiplayer/Server.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/Multiplayer/Server.java @@ -77,17 +77,13 @@ public class Server { this.clientSocket = socket; } - public void run() { - ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor(); - - executorService.scheduleAtFixedRate(() -> { + public synchronized void run() { try { BufferedReader localIn = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); PrintWriter localOut = new PrintWriter(clientSocket.getOutputStream(), true); - String inputLine = localIn.readLine(); - - if (inputLine != null) { + String inputLine; + while ((inputLine = localIn.readLine()) != null) { //only runs if there is a request from a server // Assuming that the input line is a comma-separated list of integers String[] coordinates = inputLine.split(","); cords = new int[coordinates.length]; @@ -157,27 +153,14 @@ public class Server { localOut.println(Arrays.toString(returncords)); localOut.flush(); - } - log.info("Player (X Y) : " + px + " " + py + " Attacking : " + playerAttacking + " direction : " + playerWalkDirection + " HP: " + playerHealth); - log.info("Enemy (X Y) : " + enemyx + " " + enemyy + " Attacking : " + enemyAttacking + " direction : " + enemyWalkDirection + " HP: " + enemyHealth); + log.info("Player (X Y) : " + px + " " + py + " Attacking : " + playerAttacking + " direction : " + playerWalkDirection + " HP: " + playerHealth); + log.info("Enemy (X Y) : " + enemyx + " " + enemyy + " Attacking : " + enemyAttacking + " direction : " + enemyWalkDirection + " HP: " + enemyHealth); - //check if server was shut down:W - if (!isServerRunning) { - executorService.shutdown(); - try { - if (!executorService.awaitTermination(5, TimeUnit.SECONDS)) { - executorService.shutdownNow(); - } - } catch (InterruptedException e) { - log.error("Error waiting for executor service termination: " + e.getMessage()); - } } - } catch (IOException e) { throw new RuntimeException(e); } - }, 0, 50, TimeUnit.MILLISECONDS); } } diff --git a/src/main/resources/fxml/LocalCreate.fxml b/src/main/resources/fxml/LocalCreate.fxml index 50ecdfe94ed078789b47d315fe133810e54bdc28..8096d5ab272e22ce25d356d93dbf6c6543f0f362 100644 --- a/src/main/resources/fxml/LocalCreate.fxml +++ b/src/main/resources/fxml/LocalCreate.fxml @@ -3,6 +3,7 @@ <?import javafx.geometry.Insets?> <?import javafx.scene.control.Accordion?> <?import javafx.scene.control.Button?> +<?import javafx.scene.control.Label?> <?import javafx.scene.control.RadioButton?> <?import javafx.scene.control.ScrollPane?> <?import javafx.scene.control.TitledPane?> @@ -116,6 +117,8 @@ </children> </HBox> <Pane VBox.vgrow="ALWAYS" /> + <Label fx:id="errorMsg" /> + <Pane VBox.vgrow="ALWAYS" /> <Button mnemonicParsing="false" onAction="#skinSelectionScene" text="Next" /> <Pane VBox.vgrow="ALWAYS" /> <Button mnemonicParsing="false" onAction="#backButton" text="Back"> diff --git a/src/main/resources/fxml/MapSelection.fxml b/src/main/resources/fxml/MapSelection.fxml index 0d975539ecdb7d9a755ef8584c8fddb424ab7459..dbd32a672e977a1d93ff0d4900d4cf32483a7b60 100644 --- a/src/main/resources/fxml/MapSelection.fxml +++ b/src/main/resources/fxml/MapSelection.fxml @@ -3,6 +3,7 @@ <?import javafx.geometry.Insets?> <?import javafx.scene.control.Accordion?> <?import javafx.scene.control.Button?> +<?import javafx.scene.control.Label?> <?import javafx.scene.control.ScrollPane?> <?import javafx.scene.control.TitledPane?> <?import javafx.scene.control.ToggleButton?> @@ -12,7 +13,6 @@ <?import javafx.scene.layout.VBox?> <?import javafx.scene.text.Text?> - <HBox xmlns="http://javafx.com/javafx/21" xmlns:fx="http://javafx.com/fxml/1" fx:controller="de.hdm_stuttgart.battlearena.Controller.MapSelectionController"> <children> <Pane HBox.hgrow="ALWAYS" /> @@ -74,6 +74,7 @@ <Text fx:id="selectedMapText" strokeType="OUTSIDE" strokeWidth="0.0" /> </children> </HBox> + <Label fx:id="errorMsg" /> <Button mnemonicParsing="false" onAction="#gameScene" text="Start" /> <Button mnemonicParsing="false" onAction="#backButton" text="Back"> <VBox.margin> diff --git a/src/main/resources/fxml/SkinSelection.fxml b/src/main/resources/fxml/SkinSelection.fxml index 8e074b509d60f361acb6c7a63073fd407d51dfcc..942da1904c4701291fce7f2b1ab9824ca7538f58 100644 --- a/src/main/resources/fxml/SkinSelection.fxml +++ b/src/main/resources/fxml/SkinSelection.fxml @@ -81,6 +81,7 @@ </ToggleButton> </children> </HBox> + <Label fx:id="errorMsg" /> <Button mnemonicParsing="false" onAction="#gameScene" text="Next" /> <Button mnemonicParsing="false" onAction="#backButton" text="Back" /> </children> diff --git a/src/main/resources/videos/rainbow.mp4 b/src/main/resources/videos/rainbow.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..9f084db5c1b430ab983f90036cc612a883cd93f1 Binary files /dev/null and b/src/main/resources/videos/rainbow.mp4 differ