diff --git a/.gitignore b/.gitignore index 48d950c0fa160766965bddfc4b73b5634369becb..e07b2b7780a254b48db55558d430c526b42bc545 100644 --- a/.gitignore +++ b/.gitignore @@ -12,6 +12,7 @@ target/ .idea/**/usage.statistics.xml .idea/**/dictionaries .idea/**/shelf +/src/main/resources/player # AWS User-specific .idea/**/aws.xml @@ -129,4 +130,4 @@ build/ # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml hs_err_pid* -replay_pid* \ No newline at end of file +replay_pid* diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 206a4832ae92354aef8616735cb9491c04be0a41..3e8fc97af92a71ba1950a931d66e9ec580b21a19 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -19,12 +19,20 @@ build-battlearena: script: - "echo 'Starting Build Stage'" - "mvn compile -X" + only: + refs: + - development + - main test-battlearena: stage: test image: maven:3.9.4-eclipse-temurin-20 script: - "echo 'Starting Test Stage'" - "mvn test" + only: + refs: + - development + - main artifacts: reports: junit: diff --git a/.idea/misc.xml b/.idea/misc.xml index fc45e5d1ccd129776fae9a28db0af25398ca6ad2..c6e9a72a96bffb6ce40ce23e0f9e0623a701311a 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,4 +1,3 @@ -<?xml version="1.0" encoding="UTF-8"?> <project version="4"> <component name="ExternalStorageConfigurationManager" enabled="true" /> <component name="MavenProjectsManager"> diff --git a/Documentation/BattleArenaClassDiagram.drawio b/Documentation/BattleArenaClassDiagram.drawio new file mode 100644 index 0000000000000000000000000000000000000000..4b1ca48d09f3a185063c5910374bb7cec1e51383 --- /dev/null +++ b/Documentation/BattleArenaClassDiagram.drawio @@ -0,0 +1,487 @@ +<mxGraphModel dx="0" dy="0" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="0" pageScale="1" background="none" math="0" shadow="0"> + <root> + <mxCell id="0" /> + <mxCell id="1" parent="0" /> + <mxCell id="node52" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><i>&lt;&lt;enumeration&gt;&gt;</i><br/><b>AccountType</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ AccountType(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ valueOf(String): AccountType<br/>+ values(): AccountType[]</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="2392" y="3395" width="230" height="131" as="geometry" /> + </mxCell> + <mxCell id="node62" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>AppSettings</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ AppSettings(int, int): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- musicVolume: int<br/>- sfxVolume: int</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> musicVolume: int<br/> sfxVolume: int</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="5532" y="2894" width="179" height="156" as="geometry" /> + </mxCell> + <mxCell id="node28" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>AzureDB</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ AzureDB(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ getStatistics(String): PlayerStatistics<br/>+ getCommunityMapByID(String): MapData<br/>+ resetPlayerStats(PlayerAccount): void<br/>+ checkCredentials(String): String<br/>+ uploadCommunityMap(MapData): void<br/>+ getLoginData(): void<br/>+ createPlayer(String, String): void<br/>+ updatePlayerStats(PlayerStatistics, PlayerAccount): void<br/>+ connect(): Connection</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> coreMaps: ArrayList&lt;MapData&gt;<br/> communityMapsList: ArrayList&lt;MapInfo&gt;</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="1855" y="1974" width="395" height="317" as="geometry" /> + </mxCell> + <mxCell id="node31" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>BackgroundTile</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ BackgroundTile(Image, boolean, boolean, SFXLoop): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- tileSprite: Image<br/>- soundEffect: SFXLoop</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> collision: boolean<br/> tileSprite: Image<br/> soundEffect: SFXLoop<br/> destruction: boolean</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="3437" y="1831" width="374" height="202" as="geometry" /> + </mxCell> + <mxCell id="node24" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>BigBomb</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ BigBomb(int, int, GraphicsContext, int): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- boxCollider: BoundingBox<br/>- OBJECT_STATUS: ObjectStatus<br/>- OBJECT_TYPE: ObjectType</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ healPlayer(int): void<br/>+ spawnExplosion(int, int, GraphicsContext): void<br/>+ checkGameplayObjectInteraction(IEntity, GraphicsContext): void<br/>+ renderEntity(GraphicsContext): void<br/>+ loadEntitySprites(): void<br/>+ updateEntity(GameSceneController, GraphicsContext): void<br/>+ spawnItems(int, int, GraphicsContext): void<br/>+ checkExplosionSpawn(GraphicsContext, int): void<br/>+ attack(IEntity, GraphicsContext): void<br/>+ updateEntityWalkAnimation(): void<br/>+ initializeEntity(): void<br/>+ gotHit(int): void<br/>+ checkTilePlacing(int, int): int<br/>+ placeBombAction(IEntity, GraphicsContext): void<br/>- updateAnimation(): void<br/>+ changeCheckedTileDestructable(GraphicsContext): void</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> objectStatus: ObjectStatus<br/> entityDirection: EntityDirection<br/> OBJECT_TYPE: ObjectType<br/> OBJECT_STATUS: ObjectStatus<br/> entitySpeed: int<br/> health: int<br/> mapPosX: int<br/> player: int<br/> mapPosY: int<br/> maxEntityHealth: int<br/> boxCollider: BoundingBox</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="1092" y="705" width="446" height="759" as="geometry" /> + </mxCell> + <mxCell id="node3" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>BigBombItemFrame</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ BigBombItemFrame(int, int, GraphicsContext): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- OBJECT_STATUS: ObjectStatus<br/>- boxCollider: BoundingBox<br/>- OBJECT_TYPE: ObjectType</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ checkGameplayObjectInteraction(IEntity, GraphicsContext): void<br/>+ updateEntity(GameSceneController, GraphicsContext): void<br/>+ initializeEntity(): void<br/>+ renderEntity(GraphicsContext): void<br/>+ gotHit(int): void<br/>+ healPlayer(int): void<br/>+ attack(IEntity, GraphicsContext): void<br/>+ loadEntitySprites(): void<br/>+ updateEntityWalkAnimation(): void<br/>+ placeBombAction(IEntity, GraphicsContext): void<br/>- updateAnimation(): void</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> objectStatus: ObjectStatus<br/> entityDirection: EntityDirection<br/> OBJECT_TYPE: ObjectType<br/> OBJECT_STATUS: ObjectStatus<br/> entitySpeed: int<br/> health: int<br/> mapPosX: int<br/> player: int<br/> mapPosY: int<br/> maxEntityHealth: int<br/> boxCollider: BoundingBox</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="160" y="762" width="446" height="644" as="geometry" /> + </mxCell> + <mxCell id="node16" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><i>&lt;&lt;enumeration&gt;&gt;</i><br/><b>Biom</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ Biom(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ values(): Biom[]<br/>+ valueOf(String): Biom</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="5004" y="3395" width="177" height="131" as="geometry" /> + </mxCell> + <mxCell id="node54" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>BlastDownItemFrame</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ BlastDownItemFrame(int, int, GraphicsContext): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- boxCollider: BoundingBox<br/>- OBJECT_TYPE: ObjectType<br/>- OBJECT_STATUS: ObjectStatus</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ attack(IEntity, GraphicsContext): void<br/>- updateAnimation(): void<br/>+ healPlayer(int): void<br/>+ placeBombAction(IEntity, GraphicsContext): void<br/>+ updateEntityWalkAnimation(): void<br/>+ loadEntitySprites(): void<br/>+ initializeEntity(): void<br/>+ updateEntity(GameSceneController, GraphicsContext): void<br/>+ gotHit(int): void<br/>+ checkGameplayObjectInteraction(IEntity, GraphicsContext): void<br/>+ renderEntity(GraphicsContext): void</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> objectStatus: ObjectStatus<br/> entityDirection: EntityDirection<br/> OBJECT_TYPE: ObjectType<br/> OBJECT_STATUS: ObjectStatus<br/> entitySpeed: int<br/> health: int<br/> mapPosX: int<br/> player: int<br/> mapPosY: int<br/> maxEntityHealth: int<br/> boxCollider: BoundingBox</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="3422" y="762" width="446" height="644" as="geometry" /> + </mxCell> + <mxCell id="node97" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>BlastUpItemFrame</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ BlastUpItemFrame(int, int, GraphicsContext): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- OBJECT_STATUS: ObjectStatus<br/>- OBJECT_TYPE: ObjectType<br/>- boxCollider: BoundingBox</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ healPlayer(int): void<br/>- updateAnimation(): void<br/>+ initializeEntity(): void<br/>+ placeBombAction(IEntity, GraphicsContext): void<br/>+ gotHit(int): void<br/>+ loadEntitySprites(): void<br/>+ checkGameplayObjectInteraction(IEntity, GraphicsContext): void<br/>+ updateEntityWalkAnimation(): void<br/>+ attack(IEntity, GraphicsContext): void<br/>+ updateEntity(GameSceneController, GraphicsContext): void<br/>+ renderEntity(GraphicsContext): void</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> objectStatus: ObjectStatus<br/> entityDirection: EntityDirection<br/> OBJECT_TYPE: ObjectType<br/> OBJECT_STATUS: ObjectStatus<br/> entitySpeed: int<br/> health: int<br/> mapPosX: int<br/> player: int<br/> mapPosY: int<br/> maxEntityHealth: int<br/> boxCollider: BoundingBox</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="3888" y="762" width="446" height="644" as="geometry" /> + </mxCell> + <mxCell id="node34" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>Bomb</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ Bomb(int, int, GraphicsContext, int): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- boxCollider: BoundingBox<br/>- OBJECT_TYPE: ObjectType<br/>- OBJECT_STATUS: ObjectStatus</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ gotHit(int): void<br/>+ checkGameplayObjectInteraction(IEntity, GraphicsContext): void<br/>+ renderEntity(GraphicsContext): void<br/>+ checkTilePlacing(int, int): int<br/>+ checkExplosionSpawn(GraphicsContext, int): void<br/>+ updateEntity(GameSceneController, GraphicsContext): void<br/>+ loadEntitySprites(): void<br/>+ updateEntityWalkAnimation(): void<br/>+ initializeEntity(): void<br/>+ healPlayer(int): void<br/>- updateAnimation(): void<br/>+ spawnExplosion(int, int, GraphicsContext): void<br/>+ placeBombAction(IEntity, GraphicsContext): void<br/>+ spawnItems(int, int, GraphicsContext): void<br/>+ changeCheckedTileDestructable(GraphicsContext): void<br/>+ attack(IEntity, GraphicsContext): void</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> objectStatus: ObjectStatus<br/> entityDirection: EntityDirection<br/> OBJECT_TYPE: ObjectType<br/> OBJECT_STATUS: ObjectStatus<br/> entitySpeed: int<br/> health: int<br/> mapPosX: int<br/> player: int<br/> mapPosY: int<br/> maxEntityHealth: int<br/> boxCollider: BoundingBox</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="2490" y="705" width="446" height="759" as="geometry" /> + </mxCell> + <mxCell id="node88" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>BombClockItemFrame</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ BombClockItemFrame(int, int, GraphicsContext): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- boxCollider: BoundingBox<br/>- OBJECT_TYPE: ObjectType<br/>- OBJECT_STATUS: ObjectStatus</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ initializeEntity(): void<br/>+ checkGameplayObjectInteraction(IEntity, GraphicsContext): void<br/>+ healPlayer(int): void<br/>+ updateEntityWalkAnimation(): void<br/>+ loadEntitySprites(): void<br/>+ renderEntity(GraphicsContext): void<br/>- updateAnimation(): void<br/>+ updateEntity(GameSceneController, GraphicsContext): void<br/>+ placeBombAction(IEntity, GraphicsContext): void<br/>+ attack(IEntity, GraphicsContext): void<br/>+ gotHit(int): void</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> objectStatus: ObjectStatus<br/> entityDirection: EntityDirection<br/> OBJECT_TYPE: ObjectType<br/> OBJECT_STATUS: ObjectStatus<br/> entitySpeed: int<br/> health: int<br/> mapPosX: int<br/> player: int<br/> mapPosY: int<br/> maxEntityHealth: int<br/> boxCollider: BoundingBox</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="2956" y="762" width="446" height="644" as="geometry" /> + </mxCell> + <mxCell id="node60" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>ButtonTransition</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ ButtonTransition(Button): </p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="821" y="3672" width="208" height="58" as="geometry" /> + </mxCell> + <mxCell id="node41" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>Client</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ Client(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ stopConnection(): void<br/>+ startConnection(String, int): void<br/>+ convertStringToArray(String): int[]<br/>+ sendCords(int[]): int[]</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="2011" y="3199" width="259" height="151" as="geometry" /> + </mxCell> + <mxCell id="node95" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>CollisionHandler</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ CollisionHandler(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ handleBoxCollision(BoundingBox, BoundingBox): boolean<br/>+ handleMapCollision(IEntity, int, GameSceneController): boolean</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="5235" y="3199" width="441" height="113" as="geometry" /> + </mxCell> + <mxCell id="node14" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>CommunityMapController</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ CommunityMapController(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ initialize(URL, ResourceBundle): void<br/>- backButton(): void<br/>- setTableView(): void</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="4428" y="1658" width="273" height="138" as="geometry" /> + </mxCell> + <mxCell id="node99" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>ConnectionHandler</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ ConnectionHandler(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- enemyX: int<br/>- playerWalkDirection: int<br/>- pX: int<br/>- playerAttacking: int<br/>- playerID: int<br/>- enemyClass: int<br/>- enemyWalkDirection: int<br/>- ipaddress: String<br/>- pY: int<br/>- playerClass: int<br/>- enemyHealth: int<br/>- playerHealth: int<br/>- enemyAttacking: int<br/>- enemyY: int</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ startHandler(): void</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> ipaddress: String<br/> enemyHealth: int<br/> playerHealth: int<br/> enemyAttacking: boolean<br/> enemyClass: EntityClass<br/> pY: int<br/> playerClass: EntityClass<br/> pX: int<br/> playerWalkDirection: EntityDirection<br/> enemyY: int<br/> enemyX: int<br/> playerAttacking: boolean<br/> playerID: int<br/> enemyWalkDirection: EntityDirection</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="1233" y="1658" width="271" height="736" as="geometry" /> + </mxCell> + <mxCell id="node109" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>ConnectionThread</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ ConnectionThread(Client): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ run(): void</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="-96" y="2917" width="214" height="89" as="geometry" /> + </mxCell> + <mxCell id="node9" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>CreateAccountController</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ CreateAccountController(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- getSelected(): void<br/>- create(): void<br/>- switchScene(String): void<br/>- back(): void<br/>+ initialize(URL, ResourceBundle): void</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="3679" y="2894" width="273" height="174" as="geometry" /> + </mxCell> + <mxCell id="node49" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>CreateMediaPlayer</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ CreateMediaPlayer(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ getMediaPlayer(MediaView, File, boolean, BorderPane[]): MediaPlayer</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="5226" y="3395" width="483" height="89" as="geometry" /> + </mxCell> + <mxCell id="node74" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>CreditsController</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ CreditsController(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- createMediaPlayer(): void<br/>- videoEnd(): void<br/>+ initialize(URL, ResourceBundle): void</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="3847" y="3199" width="273" height="138" as="geometry" /> + </mxCell> + <mxCell id="node64" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>CryptoException</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ CryptoException(String, Throwable): </p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="499" y="3672" width="277" height="58" as="geometry" /> + </mxCell> + <mxCell id="node100" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>CryptoUtils</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ CryptoUtils(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ decrypt(File): String[]<br/>+ check_if_file_already_encrypted(File): boolean<br/>+ encrypt(File, boolean): int<br/>- doCrypto(int, String, File): String[]</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="681" y="3199" width="331" height="151" as="geometry" /> + </mxCell> + <mxCell id="node111" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>DataItem</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ DataItem(String): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- name: SimpleStringProperty</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ nameProperty(): SimpleStringProperty</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> name: String</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="4423" y="1842" width="282" height="149" as="geometry" /> + </mxCell> + <mxCell id="node90" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>DatabaseException</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ DatabaseException(String): <br/>+ DatabaseException(): </p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="4695" y="3545" width="219" height="83" as="geometry" /> + </mxCell> + <mxCell id="node43" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>Driver</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ Driver(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ start(Stage): void</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="4188" y="3545" width="153" height="89" as="geometry" /> + </mxCell> + <mxCell id="node75" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><i>&lt;&lt;enumeration&gt;&gt;</i><br/><b>EntityClass</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ EntityClass(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ valueOf(String): EntityClass<br/>+ values(): EntityClass[]</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="3734" y="3395" width="216" height="131" as="geometry" /> + </mxCell> + <mxCell id="node21" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><i>&lt;&lt;enumeration&gt;&gt;</i><br/><b>EntityDirection</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ EntityDirection(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ values(): EntityDirection[]<br/>+ valueOf(String): EntityDirection</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="1832" y="3395" width="239" height="131" as="geometry" /> + </mxCell> + <mxCell id="node26" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>EntityFactory</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ EntityFactory(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ createEntity(EntityType, GraphicsContext, InputHandler, EntityClass, GameSceneController, PlayerMode): IEntity<br/>+ createBombs(ObjectType, int, int, GraphicsContext, int): IEntity<br/>+ createMarker(ObjectType, int, int, GraphicsContext, int): IEntity<br/>+ createGameplayObject(ObjectType, int, int, GraphicsContext): IEntity</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="160" y="3199" width="476" height="151" as="geometry" /> + </mxCell> + <mxCell id="node57" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><i>&lt;&lt;enumeration&gt;&gt;</i><br/><b>EntityType</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ EntityType(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ values(): EntityType[]<br/>+ valueOf(String): EntityType</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="3995" y="3395" width="214" height="131" as="geometry" /> + </mxCell> + <mxCell id="node40" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>Explosion</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ Explosion(int, int, GraphicsContext): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- OBJECT_TYPE: ObjectType<br/>- OBJECT_STATUS: ObjectStatus<br/>- boxCollider: BoundingBox</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ updateEntityWalkAnimation(): void<br/>+ initializeEntity(): void<br/>+ loadEntitySprites(): void<br/>+ updateEntity(GameSceneController, GraphicsContext): void<br/>- updateAnimation(): void<br/>+ gotHit(int): void<br/>+ checkGameplayObjectInteraction(IEntity, GraphicsContext): void<br/>+ placeBombAction(IEntity, GraphicsContext): void<br/>+ renderEntity(GraphicsContext): void<br/>+ healPlayer(int): void<br/>+ attack(IEntity, GraphicsContext): void</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> objectStatus: ObjectStatus<br/> entityDirection: EntityDirection<br/> OBJECT_TYPE: ObjectType<br/> OBJECT_STATUS: ObjectStatus<br/> entitySpeed: int<br/> health: int<br/> mapPosX: int<br/> player: int<br/> mapPosY: int<br/> maxEntityHealth: int<br/> boxCollider: BoundingBox</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="4820" y="762" width="446" height="644" as="geometry" /> + </mxCell> + <mxCell id="node44" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>GSONException</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ GSONException(): <br/>+ GSONException(String): </p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="5205" y="3545" width="199" height="83" as="geometry" /> + </mxCell> + <mxCell id="node87" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><i>&lt;&lt;enumeration&gt;&gt;</i><br/><b>GameMode</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ GameMode(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ values(): GameMode[]<br/>+ valueOf(String): GameMode</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="3470" y="3395" width="219" height="131" as="geometry" /> + </mxCell> + <mxCell id="node23" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>GameOverController</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ GameOverController(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- mainMenu(): void</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="1413" y="3545" width="209" height="89" as="geometry" /> + </mxCell> + <mxCell id="node7" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>GameSceneController</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ GameSceneController(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">~ tileManager: TileManager<br/>~ player: IEntity<br/>~ scaledTileSize: int<br/>~ enemy: IEntity</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- updateContent(): void<br/>- checkDeath(): void<br/>- renderGameplayObjects(GraphicsContext): void<br/>- resume(): void<br/>- renderContent(GraphicsContext): void<br/>- healthBar(): void<br/>+ initialize(URL, ResourceBundle): void<br/>- setScene(): void<br/>- pauseMenu(): void<br/>- removeBlur(): void<br/>- setBlur(): void<br/>- updateGameplayObjects(): void</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> scaledTileSize: int<br/> tileManager: TileManager<br/> enemy: IEntity<br/> player: IEntity</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="2710" y="1658" width="344" height="529" as="geometry" /> + </mxCell> + <mxCell id="node39" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><i>&lt;&lt;enumeration&gt;&gt;</i><br/><b>GameState</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- GameState(String): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- path: String</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ values(): GameState[]<br/>+ valueOf(String): GameState</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> path: String</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="4582" y="2894" width="216" height="161" as="geometry" /> + </mxCell> + <mxCell id="node98" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>GsonHandler</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ GsonHandler(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ saveSettings(AppSettings): void<br/>+ saveMaps(ArrayList&lt;MapData&gt;, MapType): void<br/>+ loadSettings(): AppSettings<br/>+ loadAccount(): PlayerAccount<br/>+ loadMaps(MapType): ArrayList&lt;MapData&gt;<br/>+ loadStats(): PlayerStatistics<br/>+ saveStats(PlayerStatistics): void<br/>+ saveAccount(PlayerAccount): void</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="578" y="2894" width="345" height="243" as="geometry" /> + </mxCell> + <mxCell id="node11" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>HashGenerator</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ HashGenerator(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ hashAndHex(String): String</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="894" y="3545" width="216" height="89" as="geometry" /> + </mxCell> + <mxCell id="node8" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>Heart</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ Heart(int, int, GraphicsContext): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- OBJECT_STATUS: ObjectStatus<br/>- OBJECT_TYPE: ObjectType<br/>- boxCollider: BoundingBox</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ updateEntityWalkAnimation(): void<br/>+ initializeEntity(): void<br/>+ checkGameplayObjectInteraction(IEntity, GraphicsContext): void<br/>+ placeBombAction(IEntity, GraphicsContext): void<br/>+ attack(IEntity, GraphicsContext): void<br/>+ renderEntity(GraphicsContext): void<br/>+ healPlayer(int): void<br/>+ loadEntitySprites(): void<br/>+ updateEntity(GameSceneController, GraphicsContext): void<br/>+ gotHit(int): void</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> objectStatus: ObjectStatus<br/> entityDirection: EntityDirection<br/> OBJECT_TYPE: ObjectType<br/> OBJECT_STATUS: ObjectStatus<br/> entitySpeed: int<br/> health: int<br/> mapPosX: int<br/> player: int<br/> mapPosY: int<br/> maxEntityHealth: int<br/> boxCollider: BoundingBox</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="4354" y="774" width="446" height="621" as="geometry" /> + </mxCell> + <mxCell id="node13" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><i>&lt;&lt;interface&gt;&gt;</i><br/><b>IEntity</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ placeBombAction(IEntity, GraphicsContext): void<br/>+ updateEntity(GameSceneController, GraphicsContext): void<br/>+ checkGameplayObjectInteraction(IEntity, GraphicsContext): void<br/>+ attack(IEntity, GraphicsContext): void<br/>+ gotHit(int): void<br/>+ healPlayer(int): void<br/>+ renderEntity(GraphicsContext): void<br/>+ updateEntityWalkAnimation(): void<br/>+ loadEntitySprites(): void<br/>+ initializeEntity(): void</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> objectStatus: ObjectStatus<br/> entityDirection: EntityDirection<br/> OBJECT_TYPE: ObjectType<br/> OBJECT_STATUS: ObjectStatus<br/> entitySpeed: int<br/> health: int<br/> mapPosX: int<br/> player: int<br/> mapPosY: int<br/> maxEntityHealth: int<br/> boxCollider: BoundingBox</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="2723" y="-14" width="446" height="519" as="geometry" /> + </mxCell> + <mxCell id="node5" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>IPAddressValidator</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ IPAddressValidator(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ validate(String): boolean</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="2163" y="3545" width="199" height="89" as="geometry" /> + </mxCell> + <mxCell id="node50" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><i>&lt;&lt;interface&gt;&gt;</i><br/><b>ISQLDataBase</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ uploadCommunityMap(MapData): void<br/>+ getStatistics(String): PlayerStatistics<br/>+ updatePlayerStats(PlayerStatistics, PlayerAccount): void<br/>+ connect(): Connection<br/>+ getCommunityMapByID(String): MapData<br/>+ checkCredentials(String): String<br/>+ createPlayer(String, String): void<br/>+ resetPlayerStats(PlayerAccount): void</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> coreMaps: ArrayList&lt;MapData&gt;<br/> communityMapsList: ArrayList&lt;MapInfo&gt;</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="2063" y="1658" width="395" height="266" as="geometry" /> + </mxCell> + <mxCell id="node20" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><i>&lt;&lt;interface&gt;&gt;</i><br/><b>ITile</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> collision: boolean<br/> tileSprite: Image<br/> soundEffect: SFXLoop<br/> destruction: boolean</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="3532" y="1658" width="184" height="154" as="geometry" /> + </mxCell> + <mxCell id="node1" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>Initializer</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ Initializer(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ launchConnectionHandler(String): void<br/>+ getPlayerMode(ConnectionHandler): void<br/>+ launchGameServer(): void</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="3498" y="3199" width="304" height="138" as="geometry" /> + </mxCell> + <mxCell id="node83" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>InputHandler</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- InputHandler(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- moveDown: boolean<br/>- sdMoveDown: boolean<br/>- moveRight: boolean<br/>- bomb: boolean<br/>- isPause: boolean<br/>- attack: boolean<br/>- sdAttack: boolean<br/>- moveLeft: boolean<br/>- sdMoveUp: boolean<br/>- sdBomb: boolean<br/>- moveUp: boolean<br/>- sdMoveLeft: boolean<br/>- sdMoveRight: boolean</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ handleKeyRelease(KeyEvent): void<br/>+ handleKeyPress(KeyEvent): void</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> attack: boolean<br/> sdMoveLeft: boolean<br/> sdAttack: boolean<br/> sdMoveRight: boolean<br/> moveRight: boolean<br/> sdMoveUp: boolean<br/> moveDown: boolean<br/> isPause: boolean<br/> moveLeft: boolean<br/> sdMoveDown: boolean<br/> instance: InputHandler<br/> bomb: boolean<br/> sdBomb: boolean<br/> moveUp: boolean</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="1549" y="1658" width="261" height="736" as="geometry" /> + </mxCell> + <mxCell id="node81" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>IntroController</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ IntroController(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- videoEnd(): void<br/>- nextVideo(): void<br/>+ initialize(URL, ResourceBundle): void<br/>- createMediaPlayer(): void</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="1693" y="3199" width="273" height="151" as="geometry" /> + </mxCell> + <mxCell id="node71" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>LoadingScreenController</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ LoadingScreenController(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- loadStatistics(): void<br/>- setLoadingTips(): void<br/>+ initialize(URL, ResourceBundle): void<br/>- setImages(): void</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="1057" y="3199" width="273" height="151" as="geometry" /> + </mxCell> + <mxCell id="node48" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>LoginController</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ LoginController(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- switchScene(String): void<br/>- login(): void<br/>- back(): void</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="4765" y="3199" width="205" height="138" as="geometry" /> + </mxCell> + <mxCell id="node78" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>Main</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ Main(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ main(String[]): void</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="3979" y="3545" width="164" height="89" as="geometry" /> + </mxCell> + <mxCell id="node72" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>MainMenuController</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ MainMenuController(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- statisticsScene(): void<br/>- playScene(): void<br/>- mapScene(): void<br/>- exit(): void<br/>- switchScene(String): void<br/>- settingsScene(): void</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="2428" y="2894" width="208" height="197" as="geometry" /> + </mxCell> + <mxCell id="node84" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>MapData</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"># MapData(String, String, int, int, String): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- mapData: String<br/>- mapName: String<br/>- mapWidth: int<br/>- mapHeight: int<br/>- mapID: String</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> mapData: String<br/> mapHeight: int<br/> mapName: String<br/> mapID: String<br/> mapWidth: int</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="4750" y="1658" width="292" height="294" as="geometry" /> + </mxCell> + <mxCell id="node37" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>MapForgeController</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ MapForgeController(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- updateMapScene(): void<br/>- backButton(): void<br/>- mapEditorScene(): void<br/>- switchScene(String): void<br/>- communityMapScene(): void</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="4315" y="2894" width="222" height="174" as="geometry" /> + </mxCell> + <mxCell id="node19" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>MapInfo</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"># MapInfo(String, String, int, int, int): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- mapID: String<br/>- mapDownloads: int<br/>- mapWidth: int<br/>- mapHeight: int<br/>- mapName: String</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> mapHeight: int<br/> mapDownloads: int<br/> mapName: String<br/> mapID: String<br/> mapWidth: int</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="5087" y="1658" width="267" height="294" as="geometry" /> + </mxCell> + <mxCell id="node38" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>MapSelectionController</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ MapSelectionController(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- backButton(): void<br/>+ initialize(URL, ResourceBundle): void<br/>- gameScene(): void<br/>- setTexture(): void<br/>- setMap(): void</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="3997" y="2894" width="273" height="174" as="geometry" /> + </mxCell> + <mxCell id="node66" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><i>&lt;&lt;enumeration&gt;&gt;</i><br/><b>MapType</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ MapType(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ valueOf(String): MapType<br/>+ values(): MapType[]</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="4509" y="3395" width="205" height="131" as="geometry" /> + </mxCell> + <mxCell id="node107" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>Marker</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ Marker(int, int, GraphicsContext, int): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- player: int<br/>- OBJECT_TYPE: ObjectType<br/>- boxCollider: BoundingBox<br/>- OBJECT_STATUS: ObjectStatus</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ gotHit(int): void<br/>+ initializeEntity(): void<br/>+ loadEntitySprites(): void<br/>+ updateEntity(GameSceneController, GraphicsContext): void<br/>+ placeBombAction(IEntity, GraphicsContext): void<br/>+ checkGameplayObjectInteraction(IEntity, GraphicsContext): void<br/>+ renderEntity(GraphicsContext): void<br/>+ attack(IEntity, GraphicsContext): void<br/>+ healPlayer(int): void<br/>+ updateEntityWalkAnimation(): void</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> objectStatus: ObjectStatus<br/> entityDirection: EntityDirection<br/> OBJECT_TYPE: ObjectType<br/> OBJECT_STATUS: ObjectStatus<br/> entitySpeed: int<br/> health: int<br/> mapPosX: int<br/> player: int<br/> mapPosY: int<br/> maxEntityHealth: int<br/> boxCollider: BoundingBox</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="2024" y="762" width="446" height="644" as="geometry" /> + </mxCell> + <mxCell id="node17" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>MenuBorderPaneController</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ MenuBorderPaneController(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- easterEgg(): void<br/>+ initialize(URL, ResourceBundle): void</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="1226" y="3395" width="273" height="113" as="geometry" /> + </mxCell> + <mxCell id="node18" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>MultiplayerController</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ MultiplayerController(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- multiplayerCreateScene(): void<br/>- multiplayerJoinScene(): void<br/>- switchScene(String): void<br/>- backButton(): void</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="2315" y="3199" width="237" height="151" as="geometry" /> + </mxCell> + <mxCell id="node106" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>MultiplayerCreateController</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ MultiplayerCreateController(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- switchScene(String): void<br/>- start(): void<br/>- backButton(): void</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="4165" y="3199" width="264" height="138" as="geometry" /> + </mxCell> + <mxCell id="node58" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>MultiplayerJoinController</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ MultiplayerJoinController(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- switchScene(String): void<br/>- backButton(): void<br/>- connect(): void</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="4474" y="3199" width="246" height="138" as="geometry" /> + </mxCell> + <mxCell id="node2" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>MusicPlayer</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- MusicPlayer(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- scheduler: ScheduledExecutorService<br/>- mediaPlayer: MediaPlayer</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- updateMusic(): void<br/>- playRandomMusic(): void<br/>- stopMusic(): void<br/>+ startGameStateMonitoring(): void</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> scheduler: ScheduledExecutorService<br/> mediaPlayer: MediaPlayer<br/> musicPlayerGameState: GameState<br/> volume: int<br/> instance: MusicPlayer</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="4096" y="1658" width="282" height="322" as="geometry" /> + </mxCell> + <mxCell id="node35" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>NetworkPlayerTwo</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ NetworkPlayerTwo(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- health: int<br/>- boxCollider: BoundingBox<br/>- entityDirection: EntityDirection</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- initializePlayerStats(): void<br/>- loadSentinelsSprites(): void<br/>+ updateEntityWalkAnimation(): void<br/>- loadLowBornSprites(): void<br/>- loadWeaponSprites(): void<br/>- loadHumanSprites(): void<br/>- hitEnemy(IEntity, BoundingBox): void<br/>+ checkGameplayObjectInteraction(IEntity, GraphicsContext): void<br/>+ attack(IEntity, GraphicsContext): void<br/>- loadHighBornSprites(): void<br/>+ placeBombAction(IEntity, GraphicsContext): void<br/>+ renderEntity(GraphicsContext): void<br/>+ gotHit(int): void<br/>+ healPlayer(int): void<br/>+ loadEntitySprites(): void<br/>- updateHealth(): void<br/>+ initializeEntity(): void<br/>+ updateEntity(GameSceneController, GraphicsContext): void</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> objectStatus: ObjectStatus<br/> entityDirection: EntityDirection<br/> OBJECT_TYPE: ObjectType<br/> OBJECT_STATUS: ObjectStatus<br/> entitySpeed: int<br/> health: int<br/> mapPosX: int<br/> player: int<br/> mapPosY: int<br/> maxEntityHealth: int<br/> boxCollider: BoundingBox</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="626" y="682" width="446" height="805" as="geometry" /> + </mxCell> + <mxCell id="node22" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>NotAnIpAddressException</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ NotAnIpAddressException(String): <br/>+ NotAnIpAddressException(): </p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="4386" y="3545" width="264" height="83" as="geometry" /> + </mxCell> + <mxCell id="node94" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><i>&lt;&lt;enumeration&gt;&gt;</i><br/><b>ObjectStatus</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ ObjectStatus(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ values(): ObjectStatus[]<br/>+ valueOf(String): ObjectStatus</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="2667" y="3395" width="228" height="131" as="geometry" /> + </mxCell> + <mxCell id="node77" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><i>&lt;&lt;enumeration&gt;&gt;</i><br/><b>ObjectType</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ ObjectType(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ valueOf(String): ObjectType<br/>+ values(): ObjectType[]</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="3206" y="3395" width="219" height="131" as="geometry" /> + </mxCell> + <mxCell id="node82" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>OracleDB</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ OracleDB(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ getCommunityMapByID(String): MapData<br/>+ uploadCommunityMap(MapData): void<br/>+ getStatistics(String): PlayerStatistics<br/>+ updatePlayerStats(PlayerStatistics, PlayerAccount): void<br/>+ connect(): Connection<br/>+ createPlayer(String, String): void<br/>+ checkCredentials(String): String<br/>+ getLoginData(): void<br/>+ resetPlayerStats(PlayerAccount): void</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> coreMaps: ArrayList&lt;MapData&gt;<br/> communityMapsList: ArrayList&lt;MapInfo&gt;</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="2270" y="1974" width="395" height="317" as="geometry" /> + </mxCell> + <mxCell id="node96" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>Parser</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ Parser(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ ipAddressValid(String): void<br/>+ volumeValid(int): void<br/>+ usernameValid(String): void<br/>+ mapNameValid(String): void<br/>+ sha1HexHashValid(String): void<br/>+ mapDataValid(String): void<br/>+ playerStatsValid(PlayerStatistics): void<br/>+ passwordValid(String): void</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="968" y="2894" width="283" height="243" as="geometry" /> + </mxCell> + <mxCell id="node46" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>ParserException</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ ParserException(): <br/>+ ParserException(String): </p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="4959" y="3545" width="201" height="83" as="geometry" /> + </mxCell> + <mxCell id="node36" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>PauseController</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ PauseController(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- settings(): void<br/>- resume(): void<br/>- mainMenu(): void</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="5015" y="3199" width="175" height="138" as="geometry" /> + </mxCell> + <mxCell id="node80" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>PauseSettingsController</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ PauseSettingsController(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- setSfxVolume(): void<br/>- backButton(): void<br/>- setMusicVolume(): void<br/>+ initialize(URL, ResourceBundle): void</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="1375" y="3199" width="273" height="151" as="geometry" /> + </mxCell> + <mxCell id="node53" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>Persistence</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- Persistence(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- statistics: PlayerStatistics<br/>- coreMaps: ArrayList&lt;MapData&gt;<br/>- account: PlayerAccount<br/>- communityMaps: ArrayList&lt;MapData&gt;<br/>- settings: AppSettings<br/>- communityMapsListRemote: ArrayList&lt;MapInfo&gt;</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ updateCoreMaps(): void<br/>+ getCommunityMap(String): void<br/>+ verifyAppSettings(): void<br/>+ resetPlayerStatistics(): void<br/>+ resetCoreMaps(): void<br/>+ loadPlayerStatistics(): void<br/>+ verifyCoreMaps(): void<br/>+ verifyCommunityMaps(): void<br/>+ loadCommunityMaps(): void<br/>+ loadPlayerAccount(): void<br/>+ login(String, String): void<br/>+ saveCreatedMap(MapData, boolean): void<br/>+ updatePlayerStatistics(int, int, int, int, boolean): void<br/>+ resetPlayerAccount(): void<br/>+ verifyPlayerAccount(): void<br/>+ resetSettings(): void<br/>+ saveSettings(): void<br/>+ createAccount(String, String, AccountType): void<br/>+ loadSettings(): void<br/>+ resetCommunityMaps(): void<br/>+ savePlayerStatistics(): void<br/>+ createRemoteCommunityMapsList(): void<br/>+ loadCoreMaps(): void</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> instance: Persistence<br/> coreMaps: ArrayList&lt;MapData&gt;<br/> statistics: PlayerStatistics<br/> communityMaps: ArrayList&lt;MapData&gt;<br/> settings: AppSettings<br/> communityMapsListRemote: ArrayList&lt;MapInfo&gt;<br/> account: PlayerAccount</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="815" y="1658" width="373" height="897" as="geometry" /> + </mxCell> + <mxCell id="node30" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>PlaceholderController</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ PlaceholderController(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ initialize(URL, ResourceBundle): void</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="576" y="3545" width="273" height="89" as="geometry" /> + </mxCell> + <mxCell id="node86" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>PlayController</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ PlayController(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- multiplayerScene(): void<br/>- localScene(): void<br/>- switchScene(String): void<br/>- backButton(): void</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="2869" y="3199" width="205" height="151" as="geometry" /> + </mxCell> + <mxCell id="node68" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>Player</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ Player(GraphicsContext, InputHandler, EntityClass, GameSceneController, PlayerMode): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- mapPosX: int<br/>- boxCollider: BoundingBox<br/>- mapPosY: int<br/>- health: int</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- initializePlayerStats(): void<br/>+ initializeEntity(): void<br/>- performEntityCollision(boolean): void<br/>+ checkGameplayObjectInteraction(IEntity, GraphicsContext): void<br/>- performEntityMovement(boolean, GraphicsContext): void<br/>- updateAttackRate(): void<br/>+ updateBlastradius(int): int<br/>+ gotHit(int): void<br/>- updateInvincibility(): void<br/>+ renderEntity(GraphicsContext): void<br/>- updateBombPlacementRate(): void<br/>- placeMarker(int, int, GraphicsContext): boolean<br/>- findNearestTpTile(int, int, GraphicsContext): boolean<br/>+ loadEntitySprites(): void<br/>- loadLowBornSprites(): void<br/>- removeMarker(boolean): boolean<br/>+ attack(IEntity, GraphicsContext): void<br/>- updateBombPlacementRate(int): int<br/>+ placeBombAction(IEntity, GraphicsContext): void<br/>- hitEnemy(IEntity, BoundingBox): void<br/>- loadSentinelsSprites(): void<br/>+ updateEntity(GameSceneController, GraphicsContext): void<br/>- loadWeaponSprites(): void<br/>+ healPlayer(int): void<br/>- loadHumanSprites(): void<br/>+ updateEntityWalkAnimation(): void<br/>- checkTilePlacing(int, int): boolean<br/>- loadHighBornSprites(): void</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> objectStatus: ObjectStatus<br/> entityDirection: EntityDirection<br/> OBJECT_TYPE: ObjectType<br/> OBJECT_STATUS: ObjectStatus<br/> entitySpeed: int<br/> health: int<br/> mapPosX: int<br/> player: int<br/> mapPosY: int<br/> maxEntityHealth: int<br/> boxCollider: BoundingBox</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="5286" y="555" width="446" height="1058" as="geometry" /> + </mxCell> + <mxCell id="node92" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>PlayerAccount</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ PlayerAccount(String, String, AccountType): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- accountPassword: String<br/>- accountType: AccountType<br/>- playerName: String</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> playerName: String<br/> accountType: AccountType<br/> accountPassword: String</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="2058" y="2894" width="325" height="202" as="geometry" /> + </mxCell> + <mxCell id="node10" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>PlayerCreateController</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ PlayerCreateController(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- createScene(): void<br/>- loginScene(): void<br/>- exit(): void<br/>- switchScene(String): void</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="2597" y="3199" width="227" height="151" as="geometry" /> + </mxCell> + <mxCell id="node89" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><i>&lt;&lt;enumeration&gt;&gt;</i><br/><b>PlayerMode</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ PlayerMode(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ valueOf(String): PlayerMode<br/>+ values(): PlayerMode[]</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="2940" y="3395" width="221" height="131" as="geometry" /> + </mxCell> + <mxCell id="node69" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>PlayerStatistics</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ PlayerStatistics(int, int, int, int, int, int): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- blocksDestroyed: int<br/>- gamesLost: int<br/>- kills: int<br/>- deaths: int<br/>- gameTime: int<br/>- gamesWon: int</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"># addGamesWon(): void<br/># addDeaths(int): void<br/># addBlocksDestroyed(int): void<br/># addGameTime(int): void<br/># addKills(int): void<br/># addGamesLost(): void</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> gameTimeInHours: int<br/> gamesWon: int<br/> gameTime: int<br/> kills: int<br/> gamesLost: int<br/> blocksDestroyed: int<br/> deaths: int</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="3099" y="1658" width="293" height="506" as="geometry" /> + </mxCell> + <mxCell id="node79" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>RuntimeInfo</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- RuntimeInfo(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- playerID: int<br/>- connectionHandler: ConnectionHandler<br/>- gameWon: boolean<br/>- server: Server<br/>- enemyPlayerMode: PlayerMode<br/>- mapDataGame: String<br/>- playerOneClass: EntityClass<br/>- mapBiom: Biom<br/>- blocksDestroyed: int<br/>- gameMode: GameMode<br/>- gameplayObjects: List&lt;IEntity&gt;<br/>- enemyPlayerClass: EntityClass<br/>- kills: int<br/>- gameState: GameState<br/>- deaths: int<br/>- playerMode: PlayerMode<br/>- gameTime: int<br/>- playerTwoClass: EntityClass</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ resetGameStats(): void<br/>+ addBlockDestroyed(): void<br/>+ generateMap(String, String): MapData<br/>+ addGameTime(): void<br/>+ addDeath(): void<br/>+ addKill(): void</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> gameTime: int<br/> playerOneClass: EntityClass<br/> gameMap: MapData<br/> gameplayObjects: List&lt;IEntity&gt;<br/> kills: int<br/> blocksDestroyed: int<br/> server: Server<br/> mapBiom: Biom<br/> deaths: int<br/> playerTwoClass: EntityClass<br/> mapDataGame: String<br/> instance: RuntimeInfo<br/> playerMode: PlayerMode<br/> gameMode: GameMode<br/> gameWon: boolean<br/> enemyPlayerMode: PlayerMode<br/> connectionHandler: ConnectionHandler<br/> gameState: GameState<br/> playerID: int<br/> enemyPlayerClass: EntityClass</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="478" y="1658" width="292" height="1081" as="geometry" /> + </mxCell> + <mxCell id="node102" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><i>&lt;&lt;enumeration&gt;&gt;</i><br/><b>SFX</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- SFX(String): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- path: String</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ values(): SFX[]<br/>+ valueOf(String): SFX</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> path: String</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="5316" y="2894" width="171" height="161" as="geometry" /> + </mxCell> + <mxCell id="node63" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><i>&lt;&lt;enumeration&gt;&gt;</i><br/><b>SFXLoop</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- SFXLoop(String): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- path: String</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ values(): SFXLoop[]<br/>+ valueOf(String): SFXLoop</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> path: String</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="4843" y="2894" width="202" height="161" as="geometry" /> + </mxCell> + <mxCell id="node59" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>SQLException</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ SQLException(): <br/>+ SQLException(String): </p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="5449" y="3545" width="186" height="83" as="geometry" /> + </mxCell> + <mxCell id="node12" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>SceneLoader</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ SceneLoader(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ loadScene(String): Pane</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="2407" y="3545" width="195" height="89" as="geometry" /> + </mxCell> + <mxCell id="node65" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>Server</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ Server(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- started: boolean<br/>- playerCount: int</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ startServer(): void<br/>+ stopServer(): void<br/>+ start(int): void</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> playerCount: int<br/> started: boolean</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="3875" y="1658" width="158" height="230" as="geometry" /> + </mxCell> + <mxCell id="node110" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>ServerHandler</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ ServerHandler(Socket): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ run(): void</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="3856" y="1985" width="195" height="89" as="geometry" /> + </mxCell> + <mxCell id="node103" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>SettingsController</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ SettingsController(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- backButton(): void<br/>- account(): void<br/>- setMusicVolume(): void<br/>- switchScene(String): void<br/>- creditScene(): void<br/>+ initialize(URL, ResourceBundle): void<br/>- setSfxVolume(): void</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="1740" y="2894" width="273" height="220" as="geometry" /> + </mxCell> + <mxCell id="node101" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>SfxOnce</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ SfxOnce(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- isNotPlaying: boolean</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ run(): void<br/>+ startSound(SFX): void</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> isNotPlaying: boolean</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="5090" y="2894" width="181" height="161" as="geometry" /> + </mxCell> + <mxCell id="node61" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>SkinSelectionController</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ SkinSelectionController(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- skinSelection(ToggleGroup): void<br/>- gameScene(): void<br/>- backButton(): void<br/>+ initialize(URL, ResourceBundle): void</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> imageWidth: ImageView[]</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="3043" y="2894" width="273" height="179" as="geometry" /> + </mxCell> + <mxCell id="node105" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>SkinSelectionMultiplayerController</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ SkinSelectionMultiplayerController(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- skinSelection(ToggleGroup): void<br/>- backButton(): void<br/>- gameScene(): void<br/>+ initialize(URL, ResourceBundle): void</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> imageWidth: ImageView[]</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="2681" y="2894" width="317" height="179" as="geometry" /> + </mxCell> + <mxCell id="node25" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>SoundEffectsVolume</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ SoundEffectsVolume(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> sfxVolume: int</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="1155" y="3545" width="213" height="89" as="geometry" /> + </mxCell> + <mxCell id="node76" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>SoundFileManager</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ SoundFileManager(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"># getFilePathsFromResources(Path): List&lt;Path&gt;<br/># getRandomFilePath(List&lt;Path&gt;): String<br/># convertPathToResourcePath(String): String</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="3119" y="3199" width="334" height="138" as="geometry" /> + </mxCell> + <mxCell id="node6" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>StatisticsController</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ StatisticsController(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ iniPieChartWL(): void<br/>- setLabels(): void<br/>+ initialize(URL, ResourceBundle): void<br/>+ mainMenuScene(): void<br/>+ iniPieChartKD(): void</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="3361" y="2894" width="273" height="174" as="geometry" /> + </mxCell> + <mxCell id="node51" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>TeleportationItemFrame</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ TeleportationItemFrame(int, int, GraphicsContext): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- OBJECT_STATUS: ObjectStatus<br/>- OBJECT_TYPE: ObjectType<br/>- boxCollider: BoundingBox</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ healPlayer(int): void<br/>+ loadEntitySprites(): void<br/>+ updateEntity(GameSceneController, GraphicsContext): void<br/>+ checkGameplayObjectInteraction(IEntity, GraphicsContext): void<br/>+ updateEntityWalkAnimation(): void<br/>+ placeBombAction(IEntity, GraphicsContext): void<br/>+ attack(IEntity, GraphicsContext): void<br/>+ initializeEntity(): void<br/>- updateAnimation(): void<br/>+ renderEntity(GraphicsContext): void<br/>+ gotHit(int): void</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> objectStatus: ObjectStatus<br/> entityDirection: EntityDirection<br/> OBJECT_TYPE: ObjectType<br/> OBJECT_STATUS: ObjectStatus<br/> entitySpeed: int<br/> health: int<br/> mapPosX: int<br/> player: int<br/> mapPosY: int<br/> maxEntityHealth: int<br/> boxCollider: BoundingBox</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="1558" y="762" width="446" height="644" as="geometry" /> + </mxCell> + <mxCell id="node108" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>TestMap</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ TestMap(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ main(String[]): void<br/>+ start(Stage): void<br/>- handleKeyPress(KeyCode, ConnectionHandler): void</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="160" y="2894" width="373" height="138" as="geometry" /> + </mxCell> + <mxCell id="node32" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>ThreadCreateAcc</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ ThreadCreateAcc(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ startThread(String, String, AccountType): void<br/>+ run(): void</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="160" y="3395" width="334" height="113" as="geometry" /> + </mxCell> + <mxCell id="node4" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>ThreadDLCommMap</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ ThreadDLCommMap(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ run(): void<br/>+ startThread(String): void</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="4254" y="3395" width="210" height="113" as="geometry" /> + </mxCell> + <mxCell id="node104" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>ThreadGetMapList</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ ThreadGetMapList(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ run(): void</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="2647" y="3545" width="194" height="89" as="geometry" /> + </mxCell> + <mxCell id="node70" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>ThreadLogin</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ ThreadLogin(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ startThread(String, String): void<br/>+ run(): void</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="1544" y="3395" width="243" height="113" as="geometry" /> + </mxCell> + <mxCell id="node15" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>ThreadRstStats</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ ThreadRstStats(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ run(): void</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="3548" y="3545" width="171" height="89" as="geometry" /> + </mxCell> + <mxCell id="node0" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>ThreadSaveCommMap</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ ThreadSaveCommMap(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ run(): void<br/>+ startThread(MapData, boolean): void</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="907" y="3395" width="274" height="113" as="geometry" /> + </mxCell> + <mxCell id="node91" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>ThreadSaveStats</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ ThreadSaveStats(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ run(): void</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="2886" y="3545" width="183" height="89" as="geometry" /> + </mxCell> + <mxCell id="node56" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>ThreadStartup1</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ ThreadStartup1(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ run(): void</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="3764" y="3545" width="170" height="89" as="geometry" /> + </mxCell> + <mxCell id="node93" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>ThreadStartup2</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ ThreadStartup2(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ run(): void</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="3331" y="3545" width="172" height="89" as="geometry" /> + </mxCell> + <mxCell id="node42" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>ThreadStartup3</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ ThreadStartup3(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ run(): void</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="3114" y="3545" width="172" height="89" as="geometry" /> + </mxCell> + <mxCell id="node27" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><i>&lt;&lt;enumeration&gt;&gt;</i><br/><b>ThreadStatus</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ ThreadStatus(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ values(): ThreadStatus[]<br/>+ valueOf(String): ThreadStatus</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="2116" y="3395" width="231" height="131" as="geometry" /> + </mxCell> + <mxCell id="node47" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>ThreadUpdateMaps</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ ThreadUpdateMaps(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ run(): void</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="1667" y="3545" width="204" height="89" as="geometry" /> + </mxCell> + <mxCell id="node85" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>ThreadUpdateStats</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ ThreadUpdateStats(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ run(): void</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="1916" y="3545" width="202" height="89" as="geometry" /> + </mxCell> + <mxCell id="node29" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>Threads</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- Threads(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- threadUpdateStatsMsg: String<br/>- threadDLCommMap: ThreadStatus<br/>- threadUpdateMapsMsg: String<br/>- threadSaveStatsMsg: String<br/>- threadLogin: ThreadStatus<br/>- threadRstStats: ThreadStatus<br/>- threadUpdateMaps: ThreadStatus<br/>- threadLoginMsg: String<br/>- threadStartup3Msg: String<br/>- threadCreateAccMsg: String<br/>- threadDLCommMapMsg: String<br/>- threadStartup1: ThreadStatus<br/>- threadSaveStats: ThreadStatus<br/>- threadStartup1Msg: String<br/>- threadSaveCommMapMsg: String<br/>- threadCommMapList: ThreadStatus<br/>- threadCommMapListMsg: String<br/>- threadStartup2Msg: String<br/>- threadUpdateStats: ThreadStatus<br/>- threadStartup2: ThreadStatus<br/>- threadStartup3: ThreadStatus<br/>- threadRstStatsMsg: String<br/>- threadCreateAcc: ThreadStatus<br/>- threadSaveCommMap: ThreadStatus</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> threadStartup1: ThreadStatus<br/> threadStartup3: ThreadStatus<br/> threadCommMapList: ThreadStatus<br/> threadSaveStats: ThreadStatus<br/> threadRstStats: ThreadStatus<br/> threadUpdateMapsMsg: String<br/> threadStartup2Msg: String<br/> threadSaveStatsMsg: String<br/> threadDLCommMapMsg: String<br/> threadLoginMsg: String<br/> threadDLCommMap: ThreadStatus<br/> threadUpdateMaps: ThreadStatus<br/> threadCommMapListMsg: String<br/> threadCreateAccMsg: String<br/> threadStartup3Msg: String<br/> instance: Threads<br/> threadStartup2: ThreadStatus<br/> threadSaveCommMap: ThreadStatus<br/> threadLogin: ThreadStatus<br/> threadUpdateStatsMsg: String<br/> threadCreateAcc: ThreadStatus<br/> threadSaveCommMapMsg: String<br/> threadRstStatsMsg: String<br/> threadStartup1Msg: String<br/> threadUpdateStats: ThreadStatus</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="160" y="1658" width="273" height="1191" as="geometry" /> + </mxCell> + <mxCell id="node33" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>TileFactory</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ TileFactory(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ createTile(TileType, TileType, Image, SFXLoop): ITile</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="160" y="3545" width="371" height="89" as="geometry" /> + </mxCell> + <mxCell id="node55" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>TileManager</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ TileManager(GraphicsContext, int, int, int, String, Biom): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ tileMap: int[][]<br/>- tileSet: ITile[]</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- generateMap(String, int, int): void<br/>+ renderMap(): void<br/>- createTiles(Biom): void</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> tileSet: ITile[]<br/> tileMap: int[][]</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="1296" y="2894" width="399" height="230" as="geometry" /> + </mxCell> + <mxCell id="node73" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><i>&lt;&lt;enumeration&gt;&gt;</i><br/><b>TileType</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ TileType(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ valueOf(String): TileType<br/>+ values(): TileType[]</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="4759" y="3395" width="200" height="131" as="geometry" /> + </mxCell> + <mxCell id="node45" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>ToggleButtonTransition</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ ToggleButtonTransition(ToggleButton): </p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="160" y="3672" width="294" height="58" as="geometry" /> + </mxCell> + <mxCell id="node112" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>UpdateThread</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- UpdateThread(ConnectionHandler): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ run(): void</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="-158" y="3211" width="273" height="89" as="geometry" /> + </mxCell> + <mxCell id="node67" parent="1" vertex="1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>WalkEffects</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ WalkEffects(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ run(): void<br/>+ startWalkSound(GameSceneController): void</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;"> + <mxGeometry x="539" y="3395" width="323" height="113" as="geometry" /> + </mxCell> + <mxCell id="edge0" edge="1" value="" parent="1" source="node28" target="node50" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=1;startArrow=none;endArrow=block;endSize=12;strokeColor=#008200;exitX=0.500;exitY=0.000;exitDx=0;exitDy=0;entryX=0.500;entryY=1.000;entryDx=0;entryDy=0;"> + <mxGeometry width="50" height="50" relative="1" as="geometry"> + <Array as="points"> + <mxPoint x="2053" y="1949" /> + <mxPoint x="2260" y="1949" /> + </Array> + </mxGeometry> + </mxCell> + <mxCell id="edge3" edge="1" value="" parent="1" source="node31" target="node20" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=1;startArrow=none;endArrow=block;endSize=12;strokeColor=#008200;exitX=0.500;exitY=0.000;exitDx=0;exitDy=0;entryX=0.500;entryY=1.000;entryDx=0;entryDy=0;"> + <mxGeometry width="50" height="50" relative="1" as="geometry"> + <Array as="points" /> + </mxGeometry> + </mxCell> + <mxCell id="edge2" edge="1" value="" parent="1" source="node24" target="node13" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=1;startArrow=none;endArrow=block;endSize=12;strokeColor=#008200;exitX=0.500;exitY=0.000;exitDx=0;exitDy=0;entryX=0.500;entryY=1.000;entryDx=0;entryDy=0;"> + <mxGeometry width="50" height="50" relative="1" as="geometry"> + <Array as="points"> + <mxPoint x="1315" y="530" /> + <mxPoint x="2946" y="530" /> + </Array> + </mxGeometry> + </mxCell> + <mxCell id="edge13" edge="1" value="" parent="1" source="node3" target="node13" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=1;startArrow=none;endArrow=block;endSize=12;strokeColor=#008200;exitX=0.500;exitY=0.000;exitDx=0;exitDy=0;entryX=0.500;entryY=1.000;entryDx=0;entryDy=0;"> + <mxGeometry width="50" height="50" relative="1" as="geometry"> + <Array as="points"> + <mxPoint x="383" y="530" /> + <mxPoint x="2946" y="530" /> + </Array> + </mxGeometry> + </mxCell> + <mxCell id="edge9" edge="1" value="" parent="1" source="node54" target="node13" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=1;startArrow=none;endArrow=block;endSize=12;strokeColor=#008200;exitX=0.500;exitY=0.000;exitDx=0;exitDy=0;entryX=0.500;entryY=1.000;entryDx=0;entryDy=0;"> + <mxGeometry width="50" height="50" relative="1" as="geometry"> + <Array as="points"> + <mxPoint x="3645" y="530" /> + <mxPoint x="2946" y="530" /> + </Array> + </mxGeometry> + </mxCell> + <mxCell id="edge10" edge="1" value="" parent="1" source="node97" target="node13" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=1;startArrow=none;endArrow=block;endSize=12;strokeColor=#008200;exitX=0.500;exitY=0.000;exitDx=0;exitDy=0;entryX=0.500;entryY=1.000;entryDx=0;entryDy=0;"> + <mxGeometry width="50" height="50" relative="1" as="geometry"> + <Array as="points"> + <mxPoint x="4111" y="530" /> + <mxPoint x="2946" y="530" /> + </Array> + </mxGeometry> + </mxCell> + <mxCell id="edge7" edge="1" value="" parent="1" source="node34" target="node13" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=1;startArrow=none;endArrow=block;endSize=12;strokeColor=#008200;exitX=0.500;exitY=0.000;exitDx=0;exitDy=0;entryX=0.500;entryY=1.000;entryDx=0;entryDy=0;"> + <mxGeometry width="50" height="50" relative="1" as="geometry"> + <Array as="points"> + <mxPoint x="2713" y="530" /> + <mxPoint x="2946" y="530" /> + </Array> + </mxGeometry> + </mxCell> + <mxCell id="edge8" edge="1" value="" parent="1" source="node88" target="node13" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=1;startArrow=none;endArrow=block;endSize=12;strokeColor=#008200;exitX=0.500;exitY=0.000;exitDx=0;exitDy=0;entryX=0.500;entryY=1.000;entryDx=0;entryDy=0;"> + <mxGeometry width="50" height="50" relative="1" as="geometry"> + <Array as="points"> + <mxPoint x="3179" y="530" /> + <mxPoint x="2946" y="530" /> + </Array> + </mxGeometry> + </mxCell> + <mxCell id="edge16" edge="1" value="" parent="1" source="node109" target="node99" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=0;startArrow=circlePlus;startFill=0;endArrow=none;strokeColor=#820000;exitX=0.500;exitY=0.000;exitDx=0;exitDy=0;entryX=0.500;entryY=0.000;entryDx=0;entryDy=0;"> + <mxGeometry width="50" height="50" relative="1" as="geometry"> + <Array as="points"> + <mxPoint x="11" y="1606" /> + <mxPoint x="1369" y="1606" /> + </Array> + </mxGeometry> + </mxCell> + <mxCell id="edge17" edge="1" value="" parent="1" source="node111" target="node14" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=0;startArrow=circlePlus;startFill=0;endArrow=none;strokeColor=#820000;exitX=0.500;exitY=0.000;exitDx=0;exitDy=0;entryX=0.500;entryY=1.000;entryDx=0;entryDy=0;"> + <mxGeometry width="50" height="50" relative="1" as="geometry"> + <Array as="points" /> + </mxGeometry> + </mxCell> + <mxCell id="edge12" edge="1" value="" parent="1" source="node40" target="node13" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=1;startArrow=none;endArrow=block;endSize=12;strokeColor=#008200;exitX=0.500;exitY=0.000;exitDx=0;exitDy=0;entryX=0.500;entryY=1.000;entryDx=0;entryDy=0;"> + <mxGeometry width="50" height="50" relative="1" as="geometry"> + <Array as="points"> + <mxPoint x="5043" y="530" /> + <mxPoint x="2946" y="530" /> + </Array> + </mxGeometry> + </mxCell> + <mxCell id="edge11" edge="1" value="" parent="1" source="node8" target="node13" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=1;startArrow=none;endArrow=block;endSize=12;strokeColor=#008200;exitX=0.500;exitY=0.000;exitDx=0;exitDy=0;entryX=0.500;entryY=1.000;entryDx=0;entryDy=0;"> + <mxGeometry width="50" height="50" relative="1" as="geometry"> + <Array as="points"> + <mxPoint x="4577" y="530" /> + <mxPoint x="2946" y="530" /> + </Array> + </mxGeometry> + </mxCell> + <mxCell id="edge6" edge="1" value="" parent="1" source="node107" target="node13" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=1;startArrow=none;endArrow=block;endSize=12;strokeColor=#008200;exitX=0.500;exitY=0.000;exitDx=0;exitDy=0;entryX=0.500;entryY=1.000;entryDx=0;entryDy=0;"> + <mxGeometry width="50" height="50" relative="1" as="geometry"> + <Array as="points"> + <mxPoint x="2247" y="530" /> + <mxPoint x="2946" y="530" /> + </Array> + </mxGeometry> + </mxCell> + <mxCell id="edge1" edge="1" value="" parent="1" source="node35" target="node13" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=1;startArrow=none;endArrow=block;endSize=12;strokeColor=#008200;exitX=0.500;exitY=0.000;exitDx=0;exitDy=0;entryX=0.500;entryY=1.000;entryDx=0;entryDy=0;"> + <mxGeometry width="50" height="50" relative="1" as="geometry"> + <Array as="points"> + <mxPoint x="849" y="530" /> + <mxPoint x="2946" y="530" /> + </Array> + </mxGeometry> + </mxCell> + <mxCell id="edge5" edge="1" value="" parent="1" source="node82" target="node50" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=1;startArrow=none;endArrow=block;endSize=12;strokeColor=#008200;exitX=0.500;exitY=0.000;exitDx=0;exitDy=0;entryX=0.500;entryY=1.000;entryDx=0;entryDy=0;"> + <mxGeometry width="50" height="50" relative="1" as="geometry"> + <Array as="points"> + <mxPoint x="2468" y="1949" /> + <mxPoint x="2260" y="1949" /> + </Array> + </mxGeometry> + </mxCell> + <mxCell id="edge14" edge="1" value="" parent="1" source="node68" target="node13" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=1;startArrow=none;endArrow=block;endSize=12;strokeColor=#008200;exitX=0.500;exitY=0.000;exitDx=0;exitDy=0;entryX=0.500;entryY=1.000;entryDx=0;entryDy=0;"> + <mxGeometry width="50" height="50" relative="1" as="geometry"> + <Array as="points"> + <mxPoint x="5509" y="530" /> + <mxPoint x="2946" y="530" /> + </Array> + </mxGeometry> + </mxCell> + <mxCell id="edge18" edge="1" value="" parent="1" source="node110" target="node65" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=0;startArrow=circlePlus;startFill=0;endArrow=none;strokeColor=#820000;exitX=0.500;exitY=0.001;exitDx=0;exitDy=0;entryX=0.500;entryY=1.000;entryDx=0;entryDy=0;"> + <mxGeometry width="50" height="50" relative="1" as="geometry"> + <Array as="points" /> + </mxGeometry> + </mxCell> + <mxCell id="edge4" edge="1" value="" parent="1" source="node51" target="node13" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=1;startArrow=none;endArrow=block;endSize=12;strokeColor=#008200;exitX=0.500;exitY=0.000;exitDx=0;exitDy=0;entryX=0.500;entryY=1.000;entryDx=0;entryDy=0;"> + <mxGeometry width="50" height="50" relative="1" as="geometry"> + <Array as="points"> + <mxPoint x="1781" y="530" /> + <mxPoint x="2946" y="530" /> + </Array> + </mxGeometry> + </mxCell> + <mxCell id="edge15" edge="1" value="" parent="1" source="node112" target="node108" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=0;startArrow=circlePlus;startFill=0;endArrow=none;strokeColor=#820000;exitX=0.500;exitY=0.001;exitDx=0;exitDy=0;entryX=0.000;entryY=0.957;entryDx=0;entryDy=0;"> + <mxGeometry width="50" height="50" relative="1" as="geometry"> + <Array as="points"> + <mxPoint x="-21" y="3017" /> + </Array> + </mxGeometry> + </mxCell> + </root> +</mxGraphModel> \ No newline at end of file diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Controller/CreateAccountController.java b/src/main/java/de/hdm_stuttgart/battlearena/Controller/CreateAccountController.java index 26fedf89d991531bea80c5d98b1b4022bf3d81ff..88f6abb7be99ae40d5a1f51f376e00577af530f8 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Controller/CreateAccountController.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Controller/CreateAccountController.java @@ -31,7 +31,7 @@ public class CreateAccountController implements Initializable { private String selectedButton; private final SceneLoader sceneLoader = new SceneLoader(); private final Persistence persistence = Persistence.getInstance(); - private static final Logger log = LogManager.getLogger(SceneLoader.class); + private static final Logger log = LogManager.getLogger(CreateAccountController.class); @Override public void initialize(URL url, ResourceBundle resourceBundle) { diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Controller/Enum/GameState.java b/src/main/java/de/hdm_stuttgart/battlearena/Controller/Enum/GameState.java index ae6aecc05a1481b74063a0a7978f0644a6d056a0..d17c0fcd373e70c274dd666e42bc7faa51d062ee 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Controller/Enum/GameState.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Controller/Enum/GameState.java @@ -11,7 +11,7 @@ public enum GameState { MEMES("src/main/resources/sound/music/memes"), TEST("src/main/resources/sound/music/wrongFile"); - private String path; + private final String path; GameState(String path){ this.path = path; } diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Controller/GameOverController.java b/src/main/java/de/hdm_stuttgart/battlearena/Controller/GameOverController.java index f36ed3cc4c9964c3ecd77c33c2ba74e09e9575b9..b66e62eb43cb6ca4bd54e86f8d201b5a71fb73dc 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Controller/GameOverController.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Controller/GameOverController.java @@ -1,5 +1,7 @@ package de.hdm_stuttgart.battlearena.Controller; +import de.hdm_stuttgart.battlearena.Controller.Enum.GameState; +import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.RuntimeInfo; import javafx.fxml.FXML; import javafx.fxml.FXMLLoader; import javafx.scene.layout.VBox; @@ -13,6 +15,7 @@ public class GameOverController { @FXML private void mainMenu() throws IOException { + RuntimeInfo.getInstance().setGameState(GameState.MENU); parent.getScene().setRoot(FXMLLoader.load(Objects.requireNonNull(getClass().getResource("/fxml/MenuBorderPane.fxml")))); } } 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 461b939f5a41131f81508444ddfc493c10b1f1a6..089bf0d34e638f0f18d6525d62fefe2502f51066 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Controller/GameSceneController.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Controller/GameSceneController.java @@ -1,7 +1,6 @@ package de.hdm_stuttgart.battlearena.Controller; import de.hdm_stuttgart.battlearena.Controller.Utilities.SceneLoader; -import de.hdm_stuttgart.battlearena.Controller.Utilities.ScreenDimensionCalculator; import de.hdm_stuttgart.battlearena.Controller.Enum.GameMode; import de.hdm_stuttgart.battlearena.Controller.Enum.GameState; import de.hdm_stuttgart.battlearena.Controller.Enum.PlayerMode; @@ -18,7 +17,6 @@ import de.hdm_stuttgart.battlearena.Model.Map.TileManager; import javafx.animation.AnimationTimer; import javafx.fxml.FXML; import javafx.fxml.Initializable; -import javafx.geometry.Rectangle2D; import javafx.scene.Node; import javafx.scene.canvas.Canvas; import javafx.scene.canvas.GraphicsContext; @@ -47,19 +45,15 @@ public class GameSceneController implements Initializable { @FXML private Pane playerPane, enemyPane; @FXML - private Label playerHp, enemyHp, time, round; + private Label playerHp, enemyHp; @FXML private StackPane stackPane; private final Pane pause = new SceneLoader().loadScene("Pause"), gameOver = new SceneLoader().loadScene("GameOver"); - private final long targetFrameTime = 1_000_000_000 / 80; // sets the target frame time to 12.5 ms (80fps) private long lastFrame = 0; private boolean wasPaused; private final Screen screen = Screen.getPrimary(); - private final Rectangle2D visualBounds = screen.getVisualBounds(); final private double healthBarWidth = screen.getBounds().getWidth() / 5; - ScreenDimensionCalculator screenCalculator = new ScreenDimensionCalculator(); - private GraphicsContext graphicsContext2D; InputHandler inputHandler = InputHandler.getInstance(); RuntimeInfo runtimeInfo = RuntimeInfo.getInstance(); @@ -67,7 +61,7 @@ public class GameSceneController implements Initializable { IEntity player; IEntity enemy; EntityClass playerOneClass = runtimeInfo.getPlayerOneClass(); - EntityClass playerTwoClass = runtimeInfo.getPlayerTwoClass(); + EntityClass playerTwoClass = runtimeInfo.getPlayerTwoClass(); // null TileManager tileManager; //map data @@ -85,20 +79,20 @@ public class GameSceneController implements Initializable { graphicsContext2D = canvas2D.getGraphicsContext2D(); graphicsContext2D.setImageSmoothing(false); - player = EntityFactory.createEntity(EntityType.PLAYER, graphicsContext2D, inputHandler, - playerOneClass, this, PlayerMode.PLAYER_ONE); if (gameMode == GameMode.NETWORK) { + player = EntityFactory.createEntity(EntityType.PLAYER, graphicsContext2D, inputHandler, + playerOneClass, this, runtimeInfo.getPlayerMode()); enemy = EntityFactory.createEntity(EntityType.NETWORK_PLAYER_TWO, graphicsContext2D, inputHandler, - playerTwoClass, this, PlayerMode.PLAYER_TWO); + playerTwoClass, this, runtimeInfo.getEnemyPlayerMode()); } else { + player = EntityFactory.createEntity(EntityType.PLAYER, graphicsContext2D, inputHandler, + playerOneClass, this, PlayerMode.PLAYER_ONE); enemy = EntityFactory.createEntity(EntityType.PLAYER, graphicsContext2D, inputHandler, playerTwoClass, this, PlayerMode.PLAYER_TWO); } - tileManager = new TileManager(graphicsContext2D, diffTileCount, horizontalTileCount, verticalTileCount, runtimeInfo.getMapDataGame(), biom); - runtimeInfo.setGameState(GameState.PLAYING); gameLoop = new AnimationTimer() { @@ -204,7 +198,6 @@ public class GameSceneController implements Initializable { player.attack(enemy, graphicsContext2D); enemy.attack(player, graphicsContext2D); updateGameplayObjects(); - updateExplosionspawns(); player.checkGameplayObjectInteraction(player, graphicsContext2D); enemy.checkGameplayObjectInteraction(enemy, graphicsContext2D); player.placeBombAction(player, graphicsContext2D); @@ -245,7 +238,8 @@ public class GameSceneController implements Initializable { for (IEntity gameplayObject : gameplayObjects) { gameplayObject.renderEntity(graphicsContext); } - } catch (ConcurrentModificationException ignore){} + } catch (ConcurrentModificationException ignore) { + } } private void updateGameplayObjects() { @@ -255,13 +249,6 @@ public class GameSceneController implements Initializable { runtimeInfo.setGameplayObjects(updateList); log.debug("Gameplay objects updated"); } - private void updateExplosionspawns() { - List<IEntity> explosionspawns = runtimeInfo.getExplosionspawns(); - List<IEntity> updateList = explosionspawns.stream().filter(obj -> obj.getOBJECT_STATUS() != ObjectStatus.USED) - .collect(Collectors.toList()); - runtimeInfo.setExplosionspawns(updateList); - log.debug("explosions objects updated"); - } public IEntity getEnemy() { return enemy; @@ -278,8 +265,4 @@ public class GameSceneController implements Initializable { public int getScaledTileSize() { return scaledTileSize; } - - public InputHandler getInputHandler() { - return inputHandler; - } } \ No newline at end of file diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Controller/IntroController.java b/src/main/java/de/hdm_stuttgart/battlearena/Controller/IntroController.java index f875d299f5c512438c5f1934ef0b51367fa5331b..0aa1b58bf445dbeb94742e27650e6fa735c7d802 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Controller/IntroController.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Controller/IntroController.java @@ -1,7 +1,6 @@ package de.hdm_stuttgart.battlearena.Controller; import de.hdm_stuttgart.battlearena.Controller.Utilities.CreateMediaPlayer; -import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.Persistence; import javafx.fxml.FXML; import javafx.fxml.FXMLLoader; import javafx.fxml.Initializable; @@ -9,8 +8,6 @@ import javafx.scene.Cursor; import javafx.scene.layout.BorderPane; import javafx.scene.media.MediaPlayer; import javafx.scene.media.MediaView; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; import java.io.File; import java.io.IOException; diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Controller/LoadingScreenController.java b/src/main/java/de/hdm_stuttgart/battlearena/Controller/LoadingScreenController.java index de2023cc0c55ea0b9e660b45e2cc4651fd8b4b69..9c3db0597ec76ba2dd675171be9e7e680a6a9897 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Controller/LoadingScreenController.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Controller/LoadingScreenController.java @@ -1,12 +1,11 @@ package de.hdm_stuttgart.battlearena.Controller; +import de.hdm_stuttgart.battlearena.Controller.Enum.GameMode; import de.hdm_stuttgart.battlearena.Controller.Enum.GameState; +import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.*; import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.ENUMs.AccountType; import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.Exceptions.DatabaseException; -import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.Persistence; -import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.RuntimeInfo; -import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.ThreadStartup1; -import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.ThreadStartup2; +import de.hdm_stuttgart.battlearena.Model.Multiplayer.Utilities.Initializer; import javafx.application.Platform; import javafx.fxml.FXML; import javafx.fxml.FXMLLoader; @@ -65,11 +64,13 @@ public class LoadingScreenController implements Initializable { }; private final List<String> shuffledTips = Arrays.asList(loadingTips); - private static final Logger log = LogManager.getLogger(Persistence.class); + private static final Logger log = LogManager.getLogger(LoadingScreenController.class); private final Rectangle2D screen = Screen.getPrimary().getVisualBounds(); private final ThreadStartup1 thread1 = new ThreadStartup1(); private final ThreadStartup2 thread2 = new ThreadStartup2(); private final Persistence persistence = Persistence.getInstance(); + private final RuntimeInfo runtimeInfo = RuntimeInfo.getInstance(); + private boolean isStarted = false; Thread tipsThread = new Thread(() -> { try { @@ -104,21 +105,38 @@ public class LoadingScreenController implements Initializable { thread2.start(); }); + Thread multiplayerLoadingScreenThread = new Thread(() -> { + while (!isStarted) { + System.out.println(runtimeInfo.getServer().getPlayerCount()); //Do not remove print statement. GameScene does not load without it LUL. + if (runtimeInfo.getServer().getPlayerCount() == 2) { + try { + tipsThread.interrupt(); + Initializer initializer = new Initializer(); + initializer.getPlayerMode(runtimeInfo.getConnectionHandler()); + RuntimeInfo.getInstance().setGameState(GameState.PLAYING); + parent.getScene().setRoot(FXMLLoader.load(Objects.requireNonNull(getClass().getResource("/fxml/GameScene.fxml")))); + isStarted = true; + } catch (Exception e) { + log.error(e); + throw new RuntimeException(e); + } + } + } + }); + @Override public void initialize(URL url, ResourceBundle resourceBundle) { Collections.shuffle(shuffledTips); setImages(); - tipsThread.start(); - thread1.start(); - waitingForThread1.start(); // basically thread1.join() but making it in separate thread otherwise it will block JavaFX thread - try { - log.debug("Executing waitingForThread2"); - thread2.join(); - } catch (InterruptedException e) { - throw new RuntimeException(e); + + if (runtimeInfo.getGameMode() != GameMode.NETWORK) { + thread1.start(); + waitingForThread1.start(); // basically thread1.join() but making it in separate thread otherwise it will block JavaFX thread + loadStatistics.start(); + } else { + multiplayerLoadingScreenThread.start(); } - loadStatistics.start(); } private void setImages() { @@ -145,6 +163,7 @@ public class LoadingScreenController implements Initializable { setLoadingTips(); } } + if (counter == loadingTips.length) { Collections.shuffle(shuffledTips); counter = 0; diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Controller/LoginController.java b/src/main/java/de/hdm_stuttgart/battlearena/Controller/LoginController.java index 1cf040890ea9f3498669680c7ddeefb72e69964d..0acc6fd59bd0ba1a9acde88fcfe974d1ae71cf1a 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Controller/LoginController.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Controller/LoginController.java @@ -22,7 +22,7 @@ public class LoginController { private Label errorMessage; private final SceneLoader sceneLoader = new SceneLoader(); private final Persistence persistence = Persistence.getInstance(); - private static final Logger log = LogManager.getLogger(Persistence.class); + private static final Logger log = LogManager.getLogger(LoginController.class); private void switchScene(String name) { parent.getChildren().clear(); diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Controller/MainMenuController.java b/src/main/java/de/hdm_stuttgart/battlearena/Controller/MainMenuController.java index fb877b68420a3898f7a8c6e700093816342d0bbe..4902b0cd1b9a0b1842e69d25b9d150280442aad1 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Controller/MainMenuController.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Controller/MainMenuController.java @@ -19,7 +19,7 @@ public class MainMenuController { private final SceneLoader sceneLoader = new SceneLoader(); private final Persistence persistence = Persistence.getInstance(); private final MusicPlayer player = MusicPlayer.getInstance(); - private static final Logger log = LogManager.getLogger(Persistence.class); + private static final Logger log = LogManager.getLogger(MainMenuController.class); private void switchScene(String name) { parent.getChildren().clear(); 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 550fe92967678b0752a46bb94a39543c8859dd36..41b0e3616f643fcb00c1e7d275b974ecfc3a7d37 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Controller/MenuBorderPaneController.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Controller/MenuBorderPaneController.java @@ -3,13 +3,11 @@ 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; diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Controller/MultiplayerCreateController.java b/src/main/java/de/hdm_stuttgart/battlearena/Controller/MultiplayerCreateController.java index 6db97dfe730df0204ee53741f896e596fce5ebfe..cfa73e3ee51fd0a84ee771de2511d06095057748 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Controller/MultiplayerCreateController.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Controller/MultiplayerCreateController.java @@ -1,17 +1,55 @@ package de.hdm_stuttgart.battlearena.Controller; import de.hdm_stuttgart.battlearena.Controller.Utilities.SceneLoader; +import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.RuntimeInfo; +import de.hdm_stuttgart.battlearena.Model.Multiplayer.Server; +import de.hdm_stuttgart.battlearena.Model.Multiplayer.Utilities.Initializer; +import de.hdm_stuttgart.battlearena.Model.Multiplayer.Utilities.NotAnIpAddressException; import javafx.fxml.FXML; +import javafx.scene.control.Label; +import javafx.scene.control.TextField; import javafx.scene.layout.VBox; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import java.io.IOException; public class MultiplayerCreateController { @FXML private VBox parent; + @FXML + private TextField ip; + @FXML + private Label errorMessage; private final SceneLoader sceneLoader = new SceneLoader(); + Initializer initializer = new Initializer(); + private static final Logger log = LogManager.getLogger(MultiplayerCreateController.class); + RuntimeInfo runtimeInfo = RuntimeInfo.getInstance(); + + Thread serverThread = new Thread(() -> { + try { + initializer.launchGameServer(); + initializer.launchConnectionHandler(ip.getText()); + } catch (InterruptedException | IOException e) { + log.error(e); + } catch (NotAnIpAddressException e) { + errorMessage.setText(e.getMessage()); + } + }); + + @FXML + private void start() { + serverThread.start(); + switchScene("SkinSelectionMultiplayer"); + } @FXML private void backButton() { + switchScene("Multiplayer"); + } + + private void switchScene(String name) { parent.getChildren().clear(); - parent.getChildren().add(sceneLoader.loadScene("Multiplayer")); + parent.getChildren().add(sceneLoader.loadScene(name)); } } diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Controller/MultiplayerJoinController.java b/src/main/java/de/hdm_stuttgart/battlearena/Controller/MultiplayerJoinController.java index 0aefd1003845e6971d2a025ba5d13c48cf257a33..62f6a9b1ed6a80e112be49a007f34eb143407b23 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Controller/MultiplayerJoinController.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Controller/MultiplayerJoinController.java @@ -1,17 +1,51 @@ package de.hdm_stuttgart.battlearena.Controller; +import de.hdm_stuttgart.battlearena.Controller.Enum.GameMode; import de.hdm_stuttgart.battlearena.Controller.Utilities.SceneLoader; +import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.RuntimeInfo; +import de.hdm_stuttgart.battlearena.Model.Multiplayer.Utilities.Initializer; +import de.hdm_stuttgart.battlearena.Model.Multiplayer.Utilities.NotAnIpAddressException; import javafx.fxml.FXML; +import javafx.scene.control.Label; +import javafx.scene.control.TextField; import javafx.scene.layout.VBox; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import java.io.IOException; public class MultiplayerJoinController { @FXML private VBox parent; + @FXML + private TextField ip; + @FXML + private Label errorMessage; private final SceneLoader sceneLoader = new SceneLoader(); + private static final Logger log = LogManager.getLogger(MultiplayerJoinController.class); + + @FXML + private void connect() { + try { + errorMessage.setText("Connecting..."); + new Initializer().launchConnectionHandler(ip.getText()); + RuntimeInfo.getInstance().setGameMode(GameMode.NETWORK); + switchScene("SkinSelectionMultiplayer"); + } catch (NotAnIpAddressException e) { + errorMessage.setText(e.getMessage()); + } catch (IOException | InterruptedException e) { + errorMessage.setText("Connection failed"); + log.error(e); + } + } @FXML private void backButton() { + switchScene("Multiplayer"); + } + + private void switchScene(String name) { parent.getChildren().clear(); - parent.getChildren().add(sceneLoader.loadScene("Multiplayer")); + parent.getChildren().add(sceneLoader.loadScene(name)); } } diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Controller/PlaceholderController.java b/src/main/java/de/hdm_stuttgart/battlearena/Controller/PlaceholderController.java index 139f1cd114edb2e156f3bcf9fdeeae75cfbf4eb3..e542322cc2e0da3b706482c378817eea4e70b4e2 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Controller/PlaceholderController.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Controller/PlaceholderController.java @@ -8,7 +8,6 @@ import javafx.fxml.FXMLLoader; import javafx.fxml.Initializable; import javafx.scene.control.Button; import javafx.scene.layout.BorderPane; -import javafx.scene.media.Media; import javafx.scene.media.MediaPlayer; import javafx.scene.media.MediaView; @@ -25,7 +24,7 @@ public class PlaceholderController implements Initializable { private MediaView mediaView; @FXML private Button button; - private MediaPlayer mediaPlayer, musicPlayer; + private MediaPlayer mediaPlayer; @Override public void initialize(URL url, ResourceBundle resourceBundle) { 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 2163a27e169bdaa55513f3c9cfc7512ab3681c48..ea1c8ba437d65722e5e0fed8d5484fdb053ad813 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Controller/SettingsController.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Controller/SettingsController.java @@ -2,7 +2,6 @@ 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; @@ -13,7 +12,6 @@ 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; 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 c2c46b708b48a44a2e79e39de12be7c08b49a7f2..271e1bf0790bb460bf3746adc9f9afcfd51d9b1e 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Controller/SkinSelectionController.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Controller/SkinSelectionController.java @@ -1,9 +1,11 @@ package de.hdm_stuttgart.battlearena.Controller; +import de.hdm_stuttgart.battlearena.Controller.Enum.GameMode; import de.hdm_stuttgart.battlearena.Controller.Utilities.SceneLoader; import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.RuntimeInfo; import de.hdm_stuttgart.battlearena.Model.Entity.EntityClass; import javafx.fxml.FXML; +import javafx.fxml.FXMLLoader; import javafx.fxml.Initializable; import javafx.geometry.Rectangle2D; import javafx.scene.control.Label; @@ -16,6 +18,7 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import java.net.URL; +import java.util.Objects; import java.util.ResourceBundle; public class SkinSelectionController implements Initializable { @@ -29,7 +32,7 @@ public class SkinSelectionController implements Initializable { private Label errorMsg; private String playerOneSkin, playerTwoSkin; private final RuntimeInfo runtimeInfo = RuntimeInfo.getInstance(); - private static final Logger log = LogManager.getLogger(MapSelectionController.class); + private static final Logger log = LogManager.getLogger(SkinSelectionController.class); @Override public void initialize(URL url, ResourceBundle resourceBundle) { diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Controller/SkinSelectionMultiplayerController.java b/src/main/java/de/hdm_stuttgart/battlearena/Controller/SkinSelectionMultiplayerController.java new file mode 100644 index 0000000000000000000000000000000000000000..3c6805699b015f38354bbc35a0a22d093ac5f996 --- /dev/null +++ b/src/main/java/de/hdm_stuttgart/battlearena/Controller/SkinSelectionMultiplayerController.java @@ -0,0 +1,94 @@ +package de.hdm_stuttgart.battlearena.Controller; + +import de.hdm_stuttgart.battlearena.Controller.Enum.GameMode; +import de.hdm_stuttgart.battlearena.Controller.Utilities.SceneLoader; +import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.MapData; +import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.Persistence; +import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.RuntimeInfo; +import de.hdm_stuttgart.battlearena.Model.Entity.EntityClass; +import de.hdm_stuttgart.battlearena.Model.Multiplayer.Utilities.Initializer; +import javafx.fxml.FXML; +import javafx.fxml.FXMLLoader; +import javafx.fxml.Initializable; +import javafx.geometry.Rectangle2D; +import javafx.scene.control.ToggleButton; +import javafx.scene.control.ToggleGroup; +import javafx.scene.image.ImageView; +import javafx.scene.layout.VBox; +import javafx.stage.Screen; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import java.io.IOException; +import java.net.URL; +import java.util.ArrayList; +import java.util.Objects; +import java.util.ResourceBundle; + +public class SkinSelectionMultiplayerController implements Initializable { + @FXML + private VBox parent; + @FXML + private ToggleGroup toggleGroup; + @FXML + private ImageView selection1, selection2, selection3; + private String playerSkin; + private final RuntimeInfo runtimeInfo = RuntimeInfo.getInstance(); + private final ArrayList<MapData> coreMaps = Persistence.getInstance().getCoreMaps(); + private static final Logger log = LogManager.getLogger(SkinSelectionMultiplayerController.class); + + @Override + public void initialize(URL url, ResourceBundle resourceBundle) { + skinSelection(toggleGroup); + setImageWidth(selection1, selection2, selection3); + } + + private void skinSelection(ToggleGroup player) { + player.selectedToggleProperty().addListener((observableValue, oldToggle, newToggle) -> { + if (player.getSelectedToggle() != null) { + ToggleButton selected = (ToggleButton) player.getSelectedToggle(); + playerSkin = selected.getText(); + switch (playerSkin) { + case "High Born": + runtimeInfo.setPlayerOneClass(EntityClass.HIGH_BORN); + break; + case "Human": + runtimeInfo.setPlayerOneClass(EntityClass.HUMAN); + break; + case "Sentinel": + runtimeInfo.setPlayerOneClass(EntityClass.SENTINELS); + } + } + }); + } + + private void setImageWidth(ImageView... imageViews) { // the ... allows for zero or more arguments seperated by a comma, will pass argument as an array + Rectangle2D screen = Screen.getPrimary().getVisualBounds(); + final double imageWidth = screen.getWidth() * 0.1; + for (ImageView image : imageViews) { + image.setFitWidth(imageWidth); + image.setPreserveRatio(true); + } + } + + @FXML + private void backButton() { + parent.getChildren().clear(); + parent.getChildren().add(new SceneLoader().loadScene("Multiplayer")); + runtimeInfo.setGameMode(GameMode.LOCAL); + } + + @FXML + private void gameScene() throws IOException { + log.info("Player skin: " + playerSkin); + runtimeInfo.setGameMap(coreMaps.get(0)); + if (runtimeInfo.getGameMode() == GameMode.NETWORK) { + Initializer initializer = new Initializer(); + initializer.getPlayerMode(runtimeInfo.getConnectionHandler()); + parent.getScene().setRoot(FXMLLoader.load(Objects.requireNonNull(getClass().getResource("/fxml/GameScene.fxml")))); + } else { + runtimeInfo.setGameMode(GameMode.NETWORK); + parent.getScene().setRoot(FXMLLoader.load(Objects.requireNonNull(getClass().getResource("/fxml/LoadingScreen.fxml")))); + } + } +} diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Controller/Utilities/ButtonTransition.java b/src/main/java/de/hdm_stuttgart/battlearena/Controller/Utilities/ButtonTransition.java index 8e59516428834ab48bf7a9b2cfebb1760ad63308..48c95a665a3e61823e47cf131198184847f85b85 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Controller/Utilities/ButtonTransition.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Controller/Utilities/ButtonTransition.java @@ -16,18 +16,14 @@ public class ButtonTransition extends ButtonSkin { fadeIn.setToY(1.1); // this ensures that any JavaFX related code is run on the JavaFX application thread - button.setOnMouseEntered(e -> { - Platform.runLater(fadeIn::playFromStart); - }); + button.setOnMouseEntered(e -> Platform.runLater(fadeIn::playFromStart)); // set transition for mouse exiting buttonButtonTransitionScale final ScaleTransition fadeOut = new ScaleTransition(Duration.millis(150)); fadeOut.setNode(button); fadeOut.setToX(1.0); fadeOut.setToY(1.0); - button.setOnMouseExited(e -> { - Platform.runLater(fadeOut::playFromStart); - }); + button.setOnMouseExited(e -> Platform.runLater(fadeOut::playFromStart)); button.setScaleX(1.0); button.setScaleY(1.0); diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Controller/Utilities/ScreenDimensionCalculator.java b/src/main/java/de/hdm_stuttgart/battlearena/Controller/Utilities/ScreenDimensionCalculator.java deleted file mode 100644 index 4dee18cfe414ec04cc2323954e0ae0d77a128902..0000000000000000000000000000000000000000 --- a/src/main/java/de/hdm_stuttgart/battlearena/Controller/Utilities/ScreenDimensionCalculator.java +++ /dev/null @@ -1,12 +0,0 @@ -package de.hdm_stuttgart.battlearena.Controller.Utilities; - -public class ScreenDimensionCalculator { - public double calculateDiagonalInches(double width, double height, double dpi) { - double diagonalPixels = Math.sqrt(Math.pow(width, 2) + Math.pow(height, 2)); - double diagonalInches = diagonalPixels / dpi; - System.out.println("diagonal pixels: " + diagonalPixels); - System.out.println("width: " + width); - System.out.println("height: " + height); - return diagonalInches; - } -} 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 2a12b7cc499eb7f2caf792c736de439c1fe4201a..4cc0b10fdd140e0d268494a47bd01293760d091a 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Main/Driver.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Main/Driver.java @@ -6,8 +6,6 @@ import de.hdm_stuttgart.battlearena.Model.Inputs.InputHandler; import de.hdm_stuttgart.battlearena.Model.Sound.MusicPlayer; import javafx.application.Application; -import javafx.application.Platform; -import javafx.event.EventHandler; import javafx.fxml.FXMLLoader; import javafx.fxml.LoadException; import javafx.geometry.Rectangle2D; @@ -19,7 +17,6 @@ import javafx.stage.Screen; import javafx.stage.Stage; import javafx.stage.StageStyle; -import javafx.stage.WindowEvent; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -70,13 +67,8 @@ public class Driver extends Application { stage.setOnCloseRequest(windowEvent -> MusicPlayer.getInstance().getScheduler().shutdown()); + stage.show(); log.debug("Project started successfully!"); - -// Exiting program if an exception occurs -// Thread.setDefaultUncaughtExceptionHandler((thread, throwable) -> { -// log.error(throwable.getMessage()); -// System.exit(1); -// }); } } \ No newline at end of file diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/AzureDB.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/AzureDB.java index 8e16f88034bbed8454aff16b5a2ca82406cb42b0..1d6efb78a6b90f1b6a27e222c82ceb6076f76513 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/AzureDB.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/AzureDB.java @@ -14,9 +14,9 @@ import java.util.ArrayList; public class AzureDB implements ISQLDataBase { - private static String user=""; - private static String password=""; - private static String[] parts= new String[2]; + private static String user = ""; + private static String password = ""; + private static String[] parts = new String[2]; static File encryptedFile = new File("src\\main\\resources\\database\\AzureDB_logindetails"); private static final Logger log = LogManager.getLogger(OracleDB.class); @@ -38,8 +38,7 @@ public class AzureDB implements ISQLDataBase { log.info("Connecting to SQL database ..."); return connection; - } - catch(Exception e){ + } catch (Exception e) { log.error(e); throw new SQLException("SQL connection error! " + e.getMessage()); } @@ -47,7 +46,7 @@ public class AzureDB implements ISQLDataBase { @Override public ArrayList<MapData> getCoreMaps() throws SQLException { - try(Connection connection = connect()) { + try (Connection connection = connect()) { ArrayList<MapData> newMaps = new ArrayList<MapData>(); String sql = "SELECT * FROM CoreMaps"; PreparedStatement stmt = connection.prepareStatement(sql); @@ -55,15 +54,14 @@ public class AzureDB implements ISQLDataBase { log.info("Sending SQL statement."); ResultSet rs = stmt.executeQuery(); - while(rs.next()){ + while (rs.next()) { newMaps.add(new MapData(rs.getString("map_id"), rs.getString("map_name"), rs.getInt("map_width"), rs.getInt("map_height"), rs.getString("map_data"))); } rs.close(); stmt.close(); log.info("Core-Maps retrieved successfully from SQL server!"); return newMaps; - } - catch(Exception e){ + } catch (Exception e) { log.error(e); throw new SQLException("Error retrieving Core-Maps from SQL server! " + e.getMessage()); } @@ -71,7 +69,7 @@ public class AzureDB implements ISQLDataBase { @Override public ArrayList<MapInfo> getCommunityMapsList() throws SQLException { - try(Connection connection = connect()) { + try (Connection connection = connect()) { ArrayList<MapInfo> tempList = new ArrayList<MapInfo>(); String sql = "SELECT map_id, map_name, map_width, map_height, map_downloads FROM communitymaps"; PreparedStatement stmt = connection.prepareStatement(sql); @@ -79,15 +77,14 @@ public class AzureDB implements ISQLDataBase { log.info("Sending SQL statement."); ResultSet rs = stmt.executeQuery(); - while(rs.next()){ + while (rs.next()) { tempList.add(new MapInfo(rs.getString("map_id"), rs.getString("map_name"), rs.getInt("map_width"), rs.getInt("map_height"), rs.getInt("map_downloads"))); } rs.close(); stmt.close(); log.info("Community-Map names retrieved successfully from SQL server!"); return tempList; - } - catch(Exception e){ + } catch (Exception e) { log.error(e); throw new SQLException("Error retrieving Community-Map names from SQL server! " + e.getMessage()); } @@ -95,26 +92,25 @@ public class AzureDB implements ISQLDataBase { @Override public PlayerStatistics getStatistics(String playerName) throws SQLException { - try(Connection connection = connect()) { + try (Connection connection = connect()) { String sql = "SELECT games_won, games_lost, kills, deaths, blocks_destroyed, ingame_time FROM players WHERE player_name = ?"; PreparedStatement stmt = connection.prepareStatement(sql); stmt.setString(1, playerName); log.info("Sending SQL statement."); ResultSet rs = stmt.executeQuery(); - if(!rs.isBeforeFirst()){ //if no data matches + if (!rs.isBeforeFirst()) { //if no data matches throw new SQLException("No match on SQL database!"); } PlayerStatistics stats = new PlayerStatistics(0, 0, 0, 0, 0, 0); - while(rs.next()) { + while (rs.next()) { stats = new PlayerStatistics(rs.getInt("games_won"), rs.getInt("games_lost"), rs.getInt("kills"), rs.getInt("deaths"), rs.getInt("blocks_destroyed"), rs.getInt("ingame_time")); } rs.close(); stmt.close(); log.info("Player statistics retrieved successfully from SQL server!"); return stats; - } - catch(Exception e){ + } catch (Exception e) { log.error(e); throw new SQLException("Error retrieving player statistics from SQL server! " + e.getMessage()); } @@ -122,7 +118,7 @@ public class AzureDB implements ISQLDataBase { @Override public MapData getCommunityMapByID(String mapID) throws SQLException { - try(Connection connection = connect()) { + try (Connection connection = connect()) { String sql = "SELECT * FROM communitymaps WHERE map_ID = ?"; PreparedStatement stmt = connection.prepareStatement(sql); stmt.setString(1, mapID); @@ -130,10 +126,10 @@ public class AzureDB implements ISQLDataBase { log.info("Sending SQL statement."); ResultSet rs = stmt.executeQuery(); MapData mapChosen = new MapData("", "",0,0, ""); - if(!rs.isBeforeFirst()){ //if no data matches + if (!rs.isBeforeFirst()) { //if no data matches throw new SQLException("No match on SQL database!"); } - while(rs.next()) { + while (rs.next()) { mapChosen = new MapData(rs.getString("map_id"), rs.getString("map_name"), rs.getInt("map_width"), rs.getInt("map_height"), rs.getString("map_data")); } rs.close(); @@ -148,8 +144,7 @@ public class AzureDB implements ISQLDataBase { stmt2.close(); return mapChosen; - } - catch(Exception e){ + } catch (Exception e) { log.error(e); throw new SQLException("Error retrieving Community-Map from SQL server! " + e.getMessage()); } @@ -157,7 +152,7 @@ public class AzureDB implements ISQLDataBase { @Override public String checkCredentials(String playerName) throws SQLException { - try(Connection connection = connect()) { + try (Connection connection = connect()) { String sql = "SELECT player_pw FROM players WHERE player_name = ?"; PreparedStatement stmt = connection.prepareStatement(sql); stmt.setString(1, playerName); @@ -166,15 +161,14 @@ public class AzureDB implements ISQLDataBase { ResultSet rs = stmt.executeQuery(); String password = ""; - while(rs.next()) { + while (rs.next()) { password = rs.getString("player_pw"); } rs.close(); stmt.close(); log.info("Player credentials retrieved successfully from SQL server!"); return password; - } - catch(Exception e){ + } catch (Exception e) { log.error(e); throw new SQLException("Error retrieving retrieving player credentials from SQL server! " + e.getMessage()); } @@ -182,7 +176,7 @@ public class AzureDB implements ISQLDataBase { @Override public void uploadCommunityMap(MapData map) throws SQLException { - try(Connection connection = connect()) { + try (Connection connection = connect()) { String sql = "INSERT INTO communitymaps (map_id, map_name, map_width, map_height, map_data, map_downloads) VALUES (?, ?, ?, ?, ?, 0)"; PreparedStatement stmt = connection.prepareStatement(sql); stmt.setString(1, map.getMapID()); @@ -196,8 +190,7 @@ public class AzureDB implements ISQLDataBase { stmt.close(); log.info("Community-Map uploaded successfully to SQL server!"); - } - catch(Exception e){ + } catch (Exception e) { log.error(e); throw new SQLException("Error uploading created Community-Map to SQL server! " + e.getMessage()); } @@ -205,7 +198,7 @@ public class AzureDB implements ISQLDataBase { @Override public void createPlayer(String playerName, String playerPW) throws SQLException { - try(Connection connection = connect()) { + try (Connection connection = connect()) { String sql = "INSERT INTO players (player_name, player_pw, games_won, games_lost, kills, deaths, blocks_destroyed, ingame_time) VALUES (?, ?, 0, 0, 0, 0, 0, 0)"; PreparedStatement stmt = connection.prepareStatement(sql); stmt.setString(1, playerName); @@ -216,8 +209,7 @@ public class AzureDB implements ISQLDataBase { stmt.close(); log.info("Online account created successfully on SQL server!"); - } - catch(Exception e){ + } catch (Exception e) { log.error(e); throw new SQLException("Error creating online account on SQL server! " + e.getMessage()); } @@ -225,7 +217,7 @@ public class AzureDB implements ISQLDataBase { @Override public void updatePlayerStats(PlayerStatistics stats, PlayerAccount account) throws SQLException { - try(Connection connection = connect()) { + try (Connection connection = connect()) { String sql = "UPDATE players SET games_won = ?, games_lost = ?, kills = ?, deaths = ?, blocks_destroyed = ?, ingame_time = ? WHERE player_name = ?"; PreparedStatement stmt = connection.prepareStatement(sql); stmt.setInt(1, stats.getGamesWon()); @@ -241,16 +233,15 @@ public class AzureDB implements ISQLDataBase { stmt.close(); log.info("Player statistics updated successfully on SQL server!"); - } - catch(Exception e){ + } catch (Exception e) { log.error(e); throw new SQLException("Error updating player statistics on SQL server! " + e.getMessage()); } } @Override - public void resetPlayerStats(PlayerAccount account) throws SQLException{ //verification of player credentials necessary beforehand (use methode "verifyAccountData" in "Persistence.java) - try(Connection connection = connect()) { + public void resetPlayerStats(PlayerAccount account) throws SQLException { //verification of player credentials necessary beforehand (use methode "verifyAccountData" in "Persistence.java) + try (Connection connection = connect()) { String sql = "UPDATE players SET games_won = 0, games_lost = 0, kills = 0, deaths = 0, blocks_destroyed = 0, ingame_time = 0 WHERE player_name = ?"; PreparedStatement stmt = connection.prepareStatement(sql); stmt.setString(1, account.getPlayerName()); @@ -260,8 +251,7 @@ public class AzureDB implements ISQLDataBase { stmt.close(); log.info("Player statistics reset successfully on SQL server!"); - } - catch(Exception e){ + } catch (Exception e) { log.error(e); throw new SQLException("Error resetting player statistics on SQL server! " + e.getMessage()); } diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ENUMs/AccountType.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ENUMs/AccountType.java index 4ddb26cd2de6356b40b45af16dad0b9dfeb7f4d8..ada0dc3e9e1fd99ce9a5bf7e5206e0e1841b60d2 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ENUMs/AccountType.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ENUMs/AccountType.java @@ -1,7 +1,6 @@ package de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.ENUMs; public enum AccountType { - NONE, LOCAL, ONLINE diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ENUMs/MapType.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ENUMs/MapType.java index 8403ea2c46b21e5b8349917316f7414eb1a74710..5fa5b0c2eb54a7948a422b171efb1dd408ac7408 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ENUMs/MapType.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ENUMs/MapType.java @@ -1,7 +1,6 @@ package de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.ENUMs; public enum MapType { - COREMAP, COMMUNITYMAP diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ENUMs/ThreadStatus.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ENUMs/ThreadStatus.java index 48ef20b9c36ce3e1758460adb489b643a7175c8e..7e9a02ed7a353a50cf23459ce8a6ccc0e7accd45 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ENUMs/ThreadStatus.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ENUMs/ThreadStatus.java @@ -1,7 +1,6 @@ package de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.ENUMs; public enum ThreadStatus { - RUNNING, FAILED, FINISHED, diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/Exceptions/DatabaseException.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/Exceptions/DatabaseException.java index 57a4b7f978103f55a4a83525db1353be7b1fe4fb..9d842c7919a299a53cde5e0dce14505bb98027d4 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/Exceptions/DatabaseException.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/Exceptions/DatabaseException.java @@ -1,7 +1,6 @@ package de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.Exceptions; public class DatabaseException extends Exception{ - public DatabaseException() {} public DatabaseException(String message2) diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/Exceptions/GSONException.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/Exceptions/GSONException.java index f16aa2d2831903fca6ccbd1555c798b53132f872..4b8cfb31dea5ad3e091acb433f61cf9faba0d4f3 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/Exceptions/GSONException.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/Exceptions/GSONException.java @@ -1,7 +1,6 @@ package de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.Exceptions; public class GSONException extends Exception{ - public GSONException() {} public GSONException(String message2) diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/Exceptions/ParserException.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/Exceptions/ParserException.java index 27bd887ed9a7b5cb604d63e2194c818c91cae56a..ff4458f2d1241fc1358a4ef3568942d6a38b786d 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/Exceptions/ParserException.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/Exceptions/ParserException.java @@ -1,7 +1,6 @@ package de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.Exceptions; public class ParserException extends Exception{ - public ParserException() {} public ParserException(String message2) diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/Exceptions/SQLException.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/Exceptions/SQLException.java index adbdfa7fac0321fd39687bd957c7f05f542aaaa9..461594c0b5ab8d4e85944d525d782886e6c965c6 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/Exceptions/SQLException.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/Exceptions/SQLException.java @@ -1,7 +1,6 @@ package de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.Exceptions; public class SQLException extends Exception{ - public SQLException() {} public SQLException(String message2) diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ISQLDataBase.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ISQLDataBase.java index 7a169c9b21d76b2a7eba64b8899dbb5e397b22cb..f53480c304df467419f286c2af3462151d76f48c 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ISQLDataBase.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ISQLDataBase.java @@ -12,13 +12,21 @@ public interface ISQLDataBase { //CRUD Operations in SQL ArrayList<MapData> getCoreMaps() throws SQLException; + ArrayList<MapInfo> getCommunityMapsList() throws SQLException; + MapData getCommunityMapByID(String mapID) throws SQLException; + void uploadCommunityMap(MapData map) throws SQLException; + void createPlayer(String playerName, String playerPW) throws SQLException; + String checkCredentials(String playerName) throws SQLException; + PlayerStatistics getStatistics(String playerName) throws SQLException; + void updatePlayerStats(PlayerStatistics stats, PlayerAccount account) throws SQLException; + void resetPlayerStats(PlayerAccount account) throws SQLException; } diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/OracleDB.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/OracleDB.java index e4d80741bd5d8bdf62937dab1c4cc04ea18df1ab..e0c0418ae46b126673e102c4d1c7fdf4106c1f30 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/OracleDB.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/OracleDB.java @@ -14,9 +14,9 @@ import oracle.jdbc.pool.OracleDataSource; public class OracleDB implements ISQLDataBase { - private static String user=""; - private static String password=""; - private static String[] parts= new String[2]; + private static String user = ""; + private static String password = ""; + private static String[] parts = new String[2]; static File encryptedFile = new File("src\\main\\resources\\database\\OracleDB_logindetails"); private static final Logger log = LogManager.getLogger(OracleDB.class); @@ -39,8 +39,7 @@ public class OracleDB implements ISQLDataBase { log.info("Connecting to SQL database ..."); return conn; - } - catch(Exception e){ + } catch (Exception e) { log.error(e); throw new SQLException("SQL connection error! " + e.getMessage()); } @@ -48,7 +47,7 @@ public class OracleDB implements ISQLDataBase { @Override public ArrayList<MapData> getCoreMaps() throws SQLException { - try(Connection connection = connect()) { + try (Connection connection = connect()) { ArrayList<MapData> newMaps = new ArrayList<MapData>(); String sql = "SELECT * FROM battlearenadata.coremaps"; PreparedStatement stmt = connection.prepareStatement(sql); @@ -56,15 +55,14 @@ public class OracleDB implements ISQLDataBase { log.info("Sending SQL statement."); ResultSet rs = stmt.executeQuery(); - while(rs.next()){ + while (rs.next()) { newMaps.add(new MapData(rs.getString("map_id"), rs.getString("map_name"), rs.getInt("map_width"), rs.getInt("map_height"), rs.getString("map_data"))); } rs.close(); stmt.close(); log.info("Core-Maps retrieved successfully from SQL server!"); return newMaps; - } - catch(Exception e){ + } catch (Exception e) { log.error(e); throw new SQLException("Error retrieving Core-Maps from SQL server! " + e.getMessage()); } @@ -72,7 +70,7 @@ public class OracleDB implements ISQLDataBase { @Override public ArrayList<MapInfo> getCommunityMapsList() throws SQLException { - try(Connection connection = connect()) { + try (Connection connection = connect()) { ArrayList<MapInfo> tempList = new ArrayList<MapInfo>(); String sql = "SELECT map_id, map_name, map_width, map_height, map_downloads FROM battlearenadata.communitymaps"; PreparedStatement stmt = connection.prepareStatement(sql); @@ -80,15 +78,14 @@ public class OracleDB implements ISQLDataBase { log.info("Sending SQL statement."); ResultSet rs = stmt.executeQuery(); - while(rs.next()){ + while (rs.next()) { tempList.add(new MapInfo(rs.getString("map_id"), rs.getString("map_name"), rs.getInt("map_width"), rs.getInt("map_height"), rs.getInt("map_downloads"))); } rs.close(); stmt.close(); log.info("Community-Map names retrieved successfully from SQL server!"); return tempList; - } - catch(Exception e){ + } catch (Exception e) { log.error(e); throw new SQLException("Error retrieving Community-Map names from SQL server! " + e.getMessage()); } @@ -96,26 +93,25 @@ public class OracleDB implements ISQLDataBase { @Override public PlayerStatistics getStatistics(String playerName) throws SQLException { - try(Connection connection = connect()) { + try (Connection connection = connect()) { String sql = "SELECT games_won, games_lost, kills, deaths, blocks_destroyed, ingame_time FROM battlearenadata.players WHERE player_name = ?"; PreparedStatement stmt = connection.prepareStatement(sql); stmt.setString(1, playerName); log.info("Sending SQL statement."); ResultSet rs = stmt.executeQuery(); - if(!rs.isBeforeFirst()){ //if no data matches + if (!rs.isBeforeFirst()) { //if no data matches throw new SQLException("No match on SQL database!"); } PlayerStatistics stats = new PlayerStatistics(0, 0, 0, 0, 0, 0); - while(rs.next()) { + while (rs.next()) { stats = new PlayerStatistics(rs.getInt("games_won"), rs.getInt("games_lost"), rs.getInt("kills"), rs.getInt("deaths"), rs.getInt("blocks_destroyed"), rs.getInt("ingame_time")); } rs.close(); stmt.close(); log.info("Player statistics retrieved successfully from SQL server!"); return stats; - } - catch(Exception e){ + } catch (Exception e) { log.error(e); throw new SQLException("Error retrieving player statistics from SQL server! " + e.getMessage()); } @@ -123,7 +119,7 @@ public class OracleDB implements ISQLDataBase { @Override public MapData getCommunityMapByID(String mapID) throws SQLException { - try(Connection connection = connect()) { + try (Connection connection = connect()) { String sql = "SELECT * FROM battlearenadata.communitymaps WHERE map_ID = ?"; PreparedStatement stmt = connection.prepareStatement(sql); stmt.setString(1, mapID); @@ -131,10 +127,10 @@ public class OracleDB implements ISQLDataBase { log.info("Sending SQL statement."); ResultSet rs = stmt.executeQuery(); MapData mapChosen = new MapData("", "",0,0, ""); - if(!rs.isBeforeFirst()){ //if no data matches + if (!rs.isBeforeFirst()) { //if no data matches throw new SQLException("No match on SQL database!"); } - while(rs.next()) { + while (rs.next()) { mapChosen = new MapData(rs.getString("map_id"), rs.getString("map_name"), rs.getInt("map_width"), rs.getInt("map_height"), rs.getString("map_data")); } rs.close(); @@ -149,8 +145,7 @@ public class OracleDB implements ISQLDataBase { stmt2.close(); return mapChosen; - } - catch(Exception e){ + } catch (Exception e) { log.error(e); throw new SQLException("Error retrieving Community-Map from SQL server! " + e.getMessage()); } @@ -158,7 +153,7 @@ public class OracleDB implements ISQLDataBase { @Override public String checkCredentials(String playerName) throws SQLException { - try(Connection connection = connect()) { + try (Connection connection = connect()) { String sql = "SELECT player_pw FROM battlearenadata.players WHERE player_name = ?"; PreparedStatement stmt = connection.prepareStatement(sql); stmt.setString(1, playerName); @@ -167,15 +162,14 @@ public class OracleDB implements ISQLDataBase { ResultSet rs = stmt.executeQuery(); String password = ""; - while(rs.next()) { + while (rs.next()) { password = rs.getString("player_pw"); } rs.close(); stmt.close(); log.info("Player credentials retrieved successfully from SQL server!"); return password; - } - catch(Exception e){ + } catch (Exception e) { log.error(e); throw new SQLException("Error retrieving retrieving player credentials from SQL server! " + e.getMessage()); } @@ -183,7 +177,7 @@ public class OracleDB implements ISQLDataBase { @Override public void uploadCommunityMap(MapData map) throws SQLException { - try(Connection connection = connect()) { + try (Connection connection = connect()) { String sql = "INSERT INTO battlearenadata.communitymaps (map_id, map_name, map_width, map_height, map_data, map_downloads) VALUES (?, ?, ?, ?, ?, 0)"; PreparedStatement stmt = connection.prepareStatement(sql); stmt.setString(1, map.getMapID()); @@ -197,8 +191,7 @@ public class OracleDB implements ISQLDataBase { stmt.close(); log.info("Community-Map uploaded successfully to SQL server!"); - } - catch(Exception e){ + } catch (Exception e) { log.error(e); throw new SQLException("Error uploading created Community-Map to SQL server! " + e.getMessage()); } @@ -206,7 +199,7 @@ public class OracleDB implements ISQLDataBase { @Override public void createPlayer(String playerName, String playerPW) throws SQLException { - try(Connection connection = connect()) { + try (Connection connection = connect()) { String sql = "INSERT INTO battlearenadata.players (player_name, player_pw, games_won, games_lost, kills, deaths, blocks_destroyed, ingame_time) VALUES (?, ?, 0, 0, 0, 0, 0, 0)"; PreparedStatement stmt = connection.prepareStatement(sql); stmt.setString(1, playerName); @@ -217,8 +210,7 @@ public class OracleDB implements ISQLDataBase { stmt.close(); log.info("Online account created successfully on SQL server!"); - } - catch(Exception e){ + } catch (Exception e) { log.error(e); throw new SQLException("Error creating online account on SQL server! " + e.getMessage()); } @@ -226,7 +218,7 @@ public class OracleDB implements ISQLDataBase { @Override public void updatePlayerStats(PlayerStatistics stats, PlayerAccount account) throws SQLException { - try(Connection connection = connect()) { + try (Connection connection = connect()) { String sql = "UPDATE battlearenadata.players SET games_won = ?, games_lost = ?, kills = ?, deaths = ?, blocks_destroyed = ?, ingame_time = ? WHERE player_name = ?"; PreparedStatement stmt = connection.prepareStatement(sql); stmt.setInt(1, stats.getGamesWon()); @@ -242,16 +234,15 @@ public class OracleDB implements ISQLDataBase { stmt.close(); log.info("Player statistics updated successfully on SQL server!"); - } - catch(Exception e){ + } catch (Exception e) { log.error(e); throw new SQLException("Error updating player statistics on SQL server! " + e.getMessage()); } } @Override - public void resetPlayerStats(PlayerAccount account) throws SQLException{ //verification of player credentials necessary beforehand (use methode "verifyAccountData" in "Persistence.java) - try(Connection connection = connect()) { + public void resetPlayerStats(PlayerAccount account) throws SQLException { //verification of player credentials necessary beforehand (use methode "verifyAccountData" in "Persistence.java) + try (Connection connection = connect()) { String sql = "UPDATE battlearenadata.players SET games_won = 0, games_lost = 0, kills = 0, deaths = 0, blocks_destroyed = 0, ingame_time = 0 WHERE player_name = ?"; PreparedStatement stmt = connection.prepareStatement(sql); stmt.setString(1, account.getPlayerName()); @@ -261,8 +252,7 @@ public class OracleDB implements ISQLDataBase { stmt.close(); log.info("Player statistics reset successfully on SQL server!"); - } - catch(Exception e){ + } catch (Exception e) { log.error(e); throw new SQLException("Error resetting player statistics on SQL server! " + e.getMessage()); } diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/Persistence.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/Persistence.java index 8573fd96e8bfca773e552ca7b50c3d612304ee55..d79787ae1bba5f047366fccea040ad3c1ddd0f8b 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/Persistence.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/Persistence.java @@ -28,10 +28,10 @@ public class Persistence { private ArrayList<MapInfo> communityMapsListRemote; //for community map browser + private Persistence() { + } - private Persistence (){} - - public static Persistence getInstance(){ + public static Persistence getInstance() { return persistenceSingleton; } @@ -63,8 +63,7 @@ public class Persistence { try { account = gsonHandler.loadAccount(); log.info("Player account successfully loaded!"); - } - catch(Exception e){ + } catch (Exception e) { log.error(e); throw new DatabaseException("Loading player account data from local storage failed!"); } @@ -80,21 +79,17 @@ public class Persistence { Parser.playerStatsValid(statistics); } log.info("Player statistics successfully loaded!"); - } - catch(SQLException e){ + } catch (SQLException e) { log.error(e); - if(e.getMessage().contains("ORA-17868") | e.getMessage().contains("ORA-01017")){ + if (e.getMessage().contains("ORA-17868") | e.getMessage().contains("ORA-01017")) { throw new DatabaseException("No connection to SQL server!"); - } - else{ + } else { throw new DatabaseException("Unknown Database Error. Retrieving statistics from SQL server failed!"); } - } - catch(GSONException e){ + } catch (GSONException e) { log.error(e); throw new DatabaseException(e.getMessage()); - } - catch (ParserException e) { + } catch (ParserException e) { throw new RuntimeException("Player statistics data corrupted!"); } } @@ -104,8 +99,7 @@ public class Persistence { coreMaps = gsonHandler.loadMaps(MapType.COREMAP); log.info("Core-Maps successfully loaded from file!"); //createCoreMapsList(); - } - catch(Exception e){ + } catch (Exception e) { log.error(e); throw new DatabaseException("Loading core maps from local storage failed!"); } @@ -116,8 +110,7 @@ public class Persistence { communityMaps = gsonHandler.loadMaps(MapType.COMMUNITYMAP); log.info("Community-Maps successfully loaded from file!"); //createLocalCommunityMapsList(); - } - catch(Exception e){ + } catch (Exception e) { log.error(e); throw new DatabaseException("Loading community maps from local storage failed!"); } @@ -127,8 +120,7 @@ public class Persistence { try { settings = gsonHandler.loadSettings(); log.info("Application settings successfully loaded from file!"); - } - catch(Exception e){ + } catch (Exception e) { log.error(e); throw new DatabaseException("Loading settings from local storage failed!"); } @@ -140,21 +132,19 @@ public class Persistence { gsonHandler.saveMaps(coreMaps, MapType.COREMAP); //createCoreMapsList(); log.info("Core-Maps successfully updated from SQL-Server!"); - } - catch(Exception e){ + } catch (Exception e) { log.error(e); - if(e.getMessage().contains("ORA-17868") | e.getMessage().contains("ORA-01017")){ + if (e.getMessage().contains("ORA-17868") | e.getMessage().contains("ORA-01017")) { throw new DatabaseException("No connection to SQL server!"); - } - else{ + } else { throw new DatabaseException("Unknown Database Error. Retrieving Core-Map update failed!"); } } } public synchronized void getCommunityMap(String mapID) throws DatabaseException { - for(int i = 0; communityMaps.size() > i; i++){ - if(communityMaps.get(i).getMapID().equals(mapID)){ + for (int i = 0; communityMaps.size() > i; i++) { + if (communityMaps.get(i).getMapID().equals(mapID)) { throw new DatabaseException("Identical map already saved locally. See map name: " + communityMaps.get(i).getMapID()); } } @@ -163,31 +153,27 @@ public class Persistence { gsonHandler.saveMaps(communityMaps, MapType.COMMUNITYMAP); //createLocalCommunityMapsList(); log.info("Community Map successfully retrieved from SQL-Server!"); - } - catch(Exception e){ + } catch (Exception e) { log.error(e); - if(e.getMessage().contains("ORA-17868") | e.getMessage().contains("ORA-01017")){ + if (e.getMessage().contains("ORA-17868") | e.getMessage().contains("ORA-01017")) { throw new DatabaseException("No connection to SQL server!"); - } - else if(e.getMessage().equals("No match on Database!")){ + } else if (e.getMessage().equals("No match on Database!")) { throw new DatabaseException("No map existing for mapID: " + mapID); - } - else{ + } else { throw new DatabaseException("Unknown Database Error. Retrieving Community-Map failed!"); } } } - public synchronized void saveSettings(){ - try{ - gsonHandler.saveSettings(settings); - } - catch(Exception e){ + public synchronized void saveSettings() { + try { + gsonHandler.saveSettings(settings); + } catch (Exception e) { log.error(e); } } - public synchronized void savePlayerStatistics() throws DatabaseException{ //on shutdown of game + public synchronized void savePlayerStatistics() { //on shutdown of game try { Parser.playerStatsValid(statistics); if (account.getAccountType() == AccountType.LOCAL) { @@ -196,8 +182,7 @@ public class Persistence { db.updatePlayerStats(statistics, account); } log.info("Statistics successfully saved!"); - } - catch(Exception e){ + } catch (Exception e) { log.error(e); } } @@ -205,27 +190,25 @@ public class Persistence { public synchronized void saveCreatedMap(MapData map, boolean doUpload) throws DatabaseException { String part1 = ""; try { - for(int i = 0; communityMaps.size() > i; i++){ - if(communityMaps.get(i).getMapID().equals(map.getMapID())){ + for (int i = 0; communityMaps.size() > i; i++) { + if (communityMaps.get(i).getMapID().equals(map.getMapID())) { throw new DatabaseException("Identical map already saved locally. See map name: " + communityMaps.get(i).getMapID()); } } communityMaps.add(map); gsonHandler.saveMaps(communityMaps, MapType.COMMUNITYMAP); log.info("Newly created map stored successfully in JSON!"); - } - catch(Exception e){ + } catch (Exception e) { log.error(e); - if(e.getMessage().contains("Identical map already saved")){ + if (e.getMessage().contains("Identical map already saved")) { part1 = e.getMessage(); } } - if(doUpload) { + if (doUpload) { try { db.uploadCommunityMap(map); log.info("Newly created Community-Map successfully published!"); - } - catch (Exception e) { + } catch (Exception e) { log.error(e); if (e.getMessage().contains("ORA-17868") | e.getMessage().contains("ORA-01017")) { throw new DatabaseException(part1 + "\nNo connection to SQL server! Saving to SQL communityMap server failed!"); @@ -238,23 +221,21 @@ public class Persistence { } } - public synchronized void updatePlayerStatistics(int kills, int deaths, int gameTime, int blocksDestroyed, boolean gameWon) throws DatabaseException{ //after game round; only update stats in RAM, not in persistence (run savePlayerStatistics() method at end of program to save stats to persistence) + public synchronized void updatePlayerStatistics(int kills, int deaths, int gameTime, int blocksDestroyed, boolean gameWon) throws DatabaseException { //after game round; only update stats in RAM, not in persistence (run savePlayerStatistics() method at end of program to save stats to persistence) try { Parser.playerStatsValid(new PlayerStatistics(0, 0, kills, deaths, blocksDestroyed, gameTime)); //temp instance of PLayerStatistics to validate new values statistics.addKills(kills); statistics.addDeaths(deaths); statistics.addGameTime(gameTime); statistics.addBlocksDestroyed(blocksDestroyed); - if(gameWon){ + if (gameWon) { statistics.addGamesWon(); - } - else{ + } else { statistics.addGamesLost(); } RuntimeInfo.getInstance().resetGameStats(); log.info("Statistics successfully updated!"); - } - catch(Exception e){ + } catch (Exception e) { log.error(e); } } @@ -262,50 +243,42 @@ public class Persistence { public synchronized void createAccount(String playerName, String password, AccountType type) throws DatabaseException { //for local account submit empty string try { Parser.usernameValid(playerName); - if(type == AccountType.LOCAL) { + if (type == AccountType.LOCAL) { account = new PlayerAccount(playerName, "", type); - } - else if(type == AccountType.ONLINE) { + } else if (type == AccountType.ONLINE) { Parser.passwordValid(password); String hashedPassword = HashGenerator.hashAndHex(password); db.createPlayer(playerName, hashedPassword); account = new PlayerAccount(playerName, hashedPassword, type); - } - else{ + } else { throw new DatabaseException("Corrupted Account-Type. Please restart game."); } gsonHandler.saveAccount(account); log.info("Player account successfully created!"); - } - catch(ParserException e){ + } catch (ParserException e) { log.error(e); throw new DatabaseException(e.getMessage()); - } - catch(SQLException e){ + } catch (SQLException e) { log.error(e); - if(e.getMessage().contains("ORA-17868") | e.getMessage().contains("ORA-01017")){ + if (e.getMessage().contains("ORA-17868") | e.getMessage().contains("ORA-01017")) { throw new DatabaseException("No connection to SQL server! Do you want to create a local account?"); - } - else if(e.getMessage().equals("ORA-00001")){ + } else if (e.getMessage().equals("ORA-00001")) { throw new DatabaseException("Player name already taken. Please change name, use local account or login with existing account!"); - } - else{ + } else { throw new DatabaseException("Connection to SQL server failed! Do you want to create a local account?"); } - } - catch(Exception e){ + } catch (Exception e) { log.error(e); throw new DatabaseException("Error creating account. Please restart game or download game files again."); } } - public synchronized void createRemoteCommunityMapsList(){ //for Map-Browser + public synchronized void createRemoteCommunityMapsList() { //for Map-Browser try { communityMapsListRemote = db.getCommunityMapsList(); log.info("MapList successfully retrieved from server!"); //log.info(communityMapsListRemote.get(0).getMapName()); //for testing purposes - } - catch(Exception e){ + } catch (Exception e) { log.error(e); } } @@ -319,97 +292,87 @@ public class Persistence { } else if (account.getAccountType() == AccountType.ONLINE) { Parser.usernameValid(account.getPlayerName()); Parser.sha1HexHashValid(account.getAccountPassword()); - if (!(account.getAccountPassword().equals(db.checkCredentials(account.getPlayerName())))){ + if (!(account.getAccountPassword().equals(db.checkCredentials(account.getPlayerName())))) { throw new DatabaseException("Locally stored password does not match online password. Please reenter credentials!"); } - } - else{ //probably obsolete, because GsonHandler would already throw Exception, if no AccountType could be loaded; anyway here, because own safety better than external safety + } else { //probably obsolete, because GsonHandler would already throw Exception, if no AccountType could be loaded; anyway here, because own safety better than external safety throw new DatabaseException("AccountType invalid - accountData corrupted! Please create new Account or login with existing!"); } log.info("Player account successfully verified!"); - } - catch(ParserException e){ + } catch (ParserException e) { log.error(e); throw new DatabaseException(e.getMessage()); - } - catch(SQLException e){ + } catch (SQLException e) { log.error(e); - if(e.getMessage().contains("ORA-17868") | e.getMessage().contains("ORA-01017")){ + if (e.getMessage().contains("ORA-17868") | e.getMessage().contains("ORA-01017")) { throw new DatabaseException("No connection to SQL server! Do you want to continue without tracking statistics?"); - } - else if(e.getMessage().contains("No match on SQL database!")){ + } else if (e.getMessage().contains("No match on SQL database!")) { throw new DatabaseException("No entry for player name " + account.getPlayerName() + " on SQL server. Please create account or login with different username!"); - } - else{ + } else { throw new DatabaseException("Connection to SQL server failed! Do you want to continue without tracking statistics"); } - } - catch(Exception e){ + } catch (Exception e) { log.error(e); throw new DatabaseException("Loading player account data from local storage failed! Please create new account!"); } } - public synchronized void verifyCoreMaps() throws DatabaseException{ + public synchronized void verifyCoreMaps() throws DatabaseException { try { for (int i = 0; coreMaps.size() > i; i++) { Parser.mapDataValid(coreMaps.get(i).getMapData()); Parser.mapNameValid(coreMaps.get(i).getMapName()); Parser.sha1HexHashValid(coreMaps.get(i).getMapID()); - if(!HashGenerator.hashAndHex(coreMaps.get(i).getMapData()).equals(coreMaps.get(i).getMapID())){ + if (!HashGenerator.hashAndHex(coreMaps.get(i).getMapData()).equals(coreMaps.get(i).getMapID())) { throw new DatabaseException("mapData Hash does not match mapID!"); } } log.info("Core-Maps data is valid!"); - } - catch(Exception e){ + } catch (Exception e) { log.error(e); throw new DatabaseException(e.getMessage()); } } - public synchronized void verifyCommunityMaps() throws DatabaseException{ + public synchronized void verifyCommunityMaps() throws DatabaseException { try { for (int i = 0; communityMaps.size() > i; i++) { Parser.mapDataValid(communityMaps.get(i).getMapData()); Parser.mapNameValid(communityMaps.get(i).getMapName()); Parser.sha1HexHashValid(communityMaps.get(i).getMapID()); - if(!HashGenerator.hashAndHex(communityMaps.get(i).getMapData()).equals(communityMaps.get(i).getMapID())){ + if (!HashGenerator.hashAndHex(communityMaps.get(i).getMapData()).equals(communityMaps.get(i).getMapID())) { throw new DatabaseException("mapData Hash does not match mapID!"); } } log.info("Community-Maps data is valid!"); - } - catch(Exception e){ + } catch (Exception e) { log.error(e); throw new DatabaseException(e.getMessage()); } } - public synchronized void verifyAppSettings() throws DatabaseException{ + public synchronized void verifyAppSettings() throws DatabaseException { try { Parser.volumeValid(settings.getSfxVolume()); Parser.volumeValid(settings.getMusicVolume()); log.info("Settings data is valid!"); - } - catch(Exception e){ + } catch (Exception e) { log.error(e); throw new DatabaseException(e.getMessage()); } } - public synchronized void resetPlayerAccount() throws DatabaseException{ - try{ + public synchronized void resetPlayerAccount() throws DatabaseException { + try { account = new PlayerAccount("", "", AccountType.NONE); gsonHandler.saveAccount(account); log.info("Player account successfully reset!"); - } - catch(Exception e){ + } catch (Exception e) { log.error(e); } } - public synchronized void resetPlayerStatistics() throws DatabaseException{ + public synchronized void resetPlayerStatistics() throws DatabaseException { try { if (account.getAccountType() == AccountType.LOCAL) { statistics = new PlayerStatistics(0, 0, 0, 0, 0, 0); @@ -420,23 +383,21 @@ public class Persistence { statistics = new PlayerStatistics(0, 0, 0, 0, 0, 0); } log.info("Player statistics successfully reset on local storage!"); - } - catch(Exception e){ + } catch (Exception e) { log.error(e); } } - public synchronized void resetSettings(){ + public synchronized void resetSettings() { try { settings = new AppSettings(50, 50); gsonHandler.saveSettings(settings); - } - catch(Exception e){ + } catch (Exception e) { log.error(e); } } - public synchronized void resetCoreMaps(){ + public synchronized void resetCoreMaps() { try { coreMaps = new ArrayList<MapData>(); coreMaps.add(new MapData("b3d1910a7c4f0c5f4987e9af701a8fdd841b9cb2", "SE3", 18, 18, "10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 0 0 0 16 0 0 0 16 0 16 16 16 0 0 0 0 10 10 0 0 0 16 0 0 0 16 0 16 0 0 0 0 0 0 10 10 0 0 0 16 0 0 0 16 0 16 16 16 0 0 0 0 10 10 0 0 0 16 0 16 0 16 0 16 0 0 0 0 0 0 10 10 0 0 0 0 16 0 16 0 0 16 16 16 0 0 0 0 10 10 0 1 1 0 1 1 0 0 0 0 1 1 0 1 1 0 10 10 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 10 10 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 10 10 0 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 10 10 0 0 1 0 1 0 0 0 0 0 0 1 0 1 0 0 10 10 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 10 10 0 0 11 10 10 0 11 10 10 0 0 11 10 10 0 0 10 10 0 0 11 0 0 0 11 0 0 0 0 0 0 11 0 0 10 10 0 0 11 10 10 0 11 10 10 0 0 11 10 10 0 0 10 10 0 0 0 0 11 0 11 0 0 0 0 0 0 11 0 0 10 10 0 0 11 10 10 0 11 10 10 0 0 11 10 10 0 0 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10")); @@ -450,21 +411,19 @@ public class Persistence { coreMaps.add(new MapData("09f4fbab8fd30c11a585ade60258aadebb424c23", "HelloWorld", 18, 18, "10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10 10 11 0 11 0 11 10 0 11 0 0 11 0 0 11 10 10 10 10 11 0 11 0 11 0 0 11 0 0 11 0 0 11 0 11 10 10 11 10 10 0 11 10 0 11 0 0 11 0 0 11 0 11 10 10 11 0 11 0 11 0 0 11 0 0 11 0 0 11 0 11 10 10 11 0 11 0 11 10 0 11 10 0 11 10 0 11 10 10 10 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10 10 0 0 0 0 0 0 16 16 16 16 0 0 0 0 0 0 10 10 0 0 0 0 0 16 16 16 16 16 16 0 0 0 0 0 10 10 0 0 0 0 16 16 16 16 16 16 16 16 0 0 0 0 10 10 0 0 0 0 16 16 16 16 16 16 16 16 0 0 0 0 10 10 0 0 0 0 16 16 16 16 16 16 16 16 0 0 0 0 10 10 0 0 0 0 16 16 16 16 16 16 16 16 0 0 0 0 10 10 0 0 0 0 0 16 16 16 16 16 16 0 0 0 0 0 10 10 0 0 0 0 0 0 16 16 16 16 0 0 0 0 0 0 10 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10")); gsonHandler.saveMaps(coreMaps, MapType.COREMAP); log.info("Core maps successfully reset on local storage!"); - } - catch(Exception e){ + } catch (Exception e) { log.error(e); } } - public synchronized void resetCommunityMaps(){ + public synchronized void resetCommunityMaps() { try { communityMaps = new ArrayList<MapData>(); communityMaps.add(new MapData("fbf44184867512faecc195ae75ca55d5ab7bad2d", "Arena3", 18, 18, "12 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 12 12 1 1 1 1 1 1 1 8 1 1 1 1 1 1 1 1 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 12")); communityMaps.add(new MapData("1c23b362fd666c5fb7ed60ca611b17246424e49f", "Arena4", 18, 18, "12 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 12 12 1 1 1 1 1 1 1 8 4 1 1 1 1 1 1 1 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 12")); gsonHandler.saveMaps(communityMaps, MapType.COMMUNITYMAP); log.info("Community maps successfully reset on local storage!"); - } - catch(Exception e){ + } catch (Exception e) { log.error(e); } } @@ -479,8 +438,7 @@ public class Persistence { } else { throw new DatabaseException("Wrong password!"); } - } - catch (GSONException | SQLException e) { + } catch (GSONException | SQLException e) { throw new RuntimeException(e); } } diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/PlayerStatistics.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/PlayerStatistics.java index 94ff1e2b259a517f7a3a91997c2ce0b29f214aee..fa2a0549c781b0ff67f2e65dc57846332657ef78 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/PlayerStatistics.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/PlayerStatistics.java @@ -4,7 +4,6 @@ import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.LogManager; public class PlayerStatistics { - private static final Logger log = LogManager.getLogger(PlayerStatistics.class); private int gamesWon = 0; private int gamesLost = 0; diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/RuntimeInfo.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/RuntimeInfo.java index 30d2ba1fcd4d47519db2a1a4c8fec007398ffcbb..f127303eda39038e0983eee63a4cf4b40fa1afac 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/RuntimeInfo.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/RuntimeInfo.java @@ -2,6 +2,7 @@ package de.hdm_stuttgart.battlearena.Model.DataStorage.Classes; import de.hdm_stuttgart.battlearena.Controller.Enum.GameMode; import de.hdm_stuttgart.battlearena.Controller.Enum.GameState; +import de.hdm_stuttgart.battlearena.Controller.Enum.PlayerMode; import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.Exceptions.ParserException; import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.Utilities.HashGenerator; import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.Utilities.Parser; @@ -9,6 +10,8 @@ import de.hdm_stuttgart.battlearena.Model.Entity.EntityClass; import de.hdm_stuttgart.battlearena.Model.Entity.IEntity; import de.hdm_stuttgart.battlearena.Model.Map.Biom; +import de.hdm_stuttgart.battlearena.Model.Multiplayer.ConnectionHandler; +import de.hdm_stuttgart.battlearena.Model.Multiplayer.Server; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -33,7 +36,7 @@ public class RuntimeInfo { private List<IEntity> gameplayObjects = new ArrayList<>(); - private List<IEntity> explosionspawns = new ArrayList<>(); + private List<IEntity> explosionSpawns = new ArrayList<>(); //Stats Tracking during Gameplay @@ -41,12 +44,19 @@ public class RuntimeInfo { private int deaths = 0; private int blocksDestroyed = 0; private int gameTime = 0; - private boolean gameWon = true; + //multiplayer + private Server server; + private ConnectionHandler connectionHandler; + private boolean gameWon = true; - private RuntimeInfo() { - } + //multiplayerID + private int playerID; + private PlayerMode playerMode; + private PlayerMode enemyPlayerMode; + private EntityClass enemyPlayerClass = EntityClass.HUMAN; + private RuntimeInfo() {} public static RuntimeInfo getInstance() { return runtimeInfoSingleton; @@ -128,14 +138,6 @@ public class RuntimeInfo { this.gameplayObjects = gameplayObjects; } - public List<IEntity> getExplosionspawns() { - return explosionspawns; - } - - public void setExplosionspawns(List<IEntity> explosionspawns) { - this.explosionspawns = explosionspawns; - } - public String getMapDataGame() { return mapDataGame; } @@ -196,4 +198,47 @@ public class RuntimeInfo { this.gameWon = gameWon; } -} + public Server getServer() { + return server; + } + + public void setServer(Server server) { + this.server = server; + } + + public ConnectionHandler getConnectionHandler() { + return connectionHandler; + } + + public void setConnectionHandler(ConnectionHandler connectionHandler) { + this.connectionHandler = connectionHandler; + } + + public PlayerMode getPlayerMode() { + return playerMode; + } + + public void setPlayerMode(PlayerMode playerMode) { + this.playerMode = playerMode; + } + + public PlayerMode getEnemyPlayerMode() { + return enemyPlayerMode; + } + + public void setEnemyPlayerMode(PlayerMode enemyPlayerMode) { + this.enemyPlayerMode = enemyPlayerMode; + } + + public EntityClass getEnemyPlayerClass() { + return enemyPlayerClass; + } + + public void setEnemyPlayerClass(EntityClass enemyPlayerClass) { + this.enemyPlayerClass = enemyPlayerClass; + } + + public void setPlayerID(int playerID) { + this.playerID = playerID; + } +} \ No newline at end of file diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadCreateAcc.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadCreateAcc.java index e7f37c6deec9db193b2f3ac8410cf28cbf44b202..10a021420c10b8eb82acea10f89901a3606d803c 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadCreateAcc.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadCreateAcc.java @@ -5,7 +5,7 @@ import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.ENUMs.ThreadStatus import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -public class ThreadCreateAcc extends Thread{ +public class ThreadCreateAcc extends Thread { private static final Logger log = LogManager.getLogger(ThreadCreateAcc.class); private String playerName; @@ -14,7 +14,6 @@ public class ThreadCreateAcc extends Thread{ @Override public void run() { - Persistence persistenceInst = Persistence.getInstance(); Threads threadsInstance = Threads.getInstance(); @@ -32,11 +31,10 @@ public class ThreadCreateAcc extends Thread{ } } - public void startThread(String playerName, String password, AccountType type){ + public void startThread(String playerName, String password, AccountType type) { this.playerName = playerName; this.password = password; this.type = type; start(); } - } diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadDLCommMap.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadDLCommMap.java index 76bf3c0ebcc16150b3e34d907faaf0b5c33794e7..ea558470b9a3714c6bda5f3d43fb7b34db936df0 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadDLCommMap.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadDLCommMap.java @@ -4,14 +4,13 @@ import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.ENUMs.ThreadStatus import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -public class ThreadDLCommMap extends Thread{ +public class ThreadDLCommMap extends Thread { private static final Logger log = LogManager.getLogger(ThreadDLCommMap.class); private String mapID; @Override public void run() { - Persistence persistenceInst = Persistence.getInstance(); Threads threadsInstance = Threads.getInstance(); @@ -29,9 +28,8 @@ public class ThreadDLCommMap extends Thread{ } } - public void startThread(String mapID){ + public void startThread(String mapID) { this.mapID = mapID; start(); } - } diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadGetMapList.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadGetMapList.java index 0062eaf71c227ed5aa6614307e6024357f691560..17843eda61f907a564069eab04fe86a4b70c4be8 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadGetMapList.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadGetMapList.java @@ -10,7 +10,6 @@ public class ThreadGetMapList extends Thread { @Override public void run() { - Persistence persistenceInst = Persistence.getInstance(); Threads threadsInstance = Threads.getInstance(); @@ -27,5 +26,4 @@ public class ThreadGetMapList extends Thread { threadsInstance.setThreadCommMapList(ThreadStatus.FAILED); } } - } diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadLogin.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadLogin.java index b6bb5e6c7c647dfe372702933672eead65c56b02..dc256d4e3652115582272ae402f3ea9c125c554e 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadLogin.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadLogin.java @@ -12,7 +12,6 @@ public class ThreadLogin extends Thread{ @Override public void run() { - Persistence persistenceInst = Persistence.getInstance(); Threads threadsInstance = Threads.getInstance(); @@ -35,5 +34,4 @@ public class ThreadLogin extends Thread{ this.password = password; start(); } - } diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadRstStats.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadRstStats.java index c815c70fc73043c305ddad9e575ac662207a50ac..28ceaa854c70c2911583b3971797e1793909bb2a 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadRstStats.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadRstStats.java @@ -10,7 +10,6 @@ public class ThreadRstStats extends Thread { @Override public void run() { - Persistence persistenceInst = Persistence.getInstance(); Threads threadsInstance = Threads.getInstance(); @@ -27,5 +26,4 @@ public class ThreadRstStats extends Thread { threadsInstance.setThreadRstStats(ThreadStatus.FAILED); } } - } diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadSaveCommMap.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadSaveCommMap.java index 47877f48acc768333279887fd1a899bdb046ac65..6d2db4d96ef3dd2826511bfdddac8f085f41fd5e 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadSaveCommMap.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadSaveCommMap.java @@ -4,15 +4,13 @@ import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.ENUMs.ThreadStatus import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -public class ThreadSaveCommMap extends Thread{ - +public class ThreadSaveCommMap extends Thread { private static final Logger log = LogManager.getLogger(ThreadSaveCommMap.class); private MapData map; private boolean doUpload; @Override public void run() { - Persistence persistenceInst = Persistence.getInstance(); Threads threadsInstance = Threads.getInstance(); @@ -30,10 +28,9 @@ public class ThreadSaveCommMap extends Thread{ } } - public void startThread(MapData map, boolean doUpload){ //user can check box to optionally publish map on SQL server + public void startThread(MapData map, boolean doUpload) { //user can check box to optionally publish map on SQL server this.map = map; this.doUpload = doUpload; start(); } - } diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadSaveStats.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadSaveStats.java index 3b6c425300db7c7790908c47e36e2282e788b33e..7c9822eed63a6f2cb58b98a460e3b83767add688 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadSaveStats.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadSaveStats.java @@ -10,7 +10,6 @@ public class ThreadSaveStats extends Thread{ @Override public void run() { - Persistence persistenceInst = Persistence.getInstance(); Threads threadsInstance = Threads.getInstance(); @@ -27,5 +26,4 @@ public class ThreadSaveStats extends Thread{ threadsInstance.setThreadSaveStats(ThreadStatus.FAILED); } } - } diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadStartup1.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadStartup1.java index 3b8016b8ed5629b16ef2d949f6fc9a0376f51ad1..f4c3818fccb1a7bcd694d7dad603d49177774166 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadStartup1.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadStartup1.java @@ -4,13 +4,12 @@ import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.ENUMs.ThreadStatus import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -public class ThreadStartup1 extends Thread{ +public class ThreadStartup1 extends Thread { private static final Logger log = LogManager.getLogger(ThreadStartup1.class); @Override public void run() { - Persistence persistenceInst = Persistence.getInstance(); Threads threadsInstance = Threads.getInstance(); @@ -32,5 +31,4 @@ public class ThreadStartup1 extends Thread{ threadsInstance.setThreadStartup1(ThreadStatus.FAILED); } } - } diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadStartup2.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadStartup2.java index 50ba60bf4edc9c10f56ed27e7833a65ae3e808d6..a48be9b921331a712ea10130ebbd60d9d9318eb2 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadStartup2.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadStartup2.java @@ -11,7 +11,6 @@ public class ThreadStartup2 extends Thread{ @Override public void run() { - Persistence persistenceInst = Persistence.getInstance(); Threads threadsInstance = Threads.getInstance(); @@ -31,5 +30,4 @@ public class ThreadStartup2 extends Thread{ threadsInstance.setThreadStartup2(ThreadStatus.FAILED); } } - } diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadStartup3.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadStartup3.java index 738c4add7276cc2706a23204b0b7daef94e51975..4ee8d1519d998fe2164fac16be14e7ad5d62ac4d 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadStartup3.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadStartup3.java @@ -11,7 +11,6 @@ public class ThreadStartup3 extends Thread{ @Override public void run() { - Persistence persistenceInst = Persistence.getInstance(); Threads threadsInstance = Threads.getInstance(); @@ -31,5 +30,4 @@ public class ThreadStartup3 extends Thread{ threadsInstance.setThreadStartup3(ThreadStatus.FAILED); } } - } diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadUpdateMaps.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadUpdateMaps.java index f0bc303975da0e08d54330a3331e9dca7bee1577..0fc9fc54a43891008353f38e2c2c53666a11d708 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadUpdateMaps.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadUpdateMaps.java @@ -10,7 +10,6 @@ public class ThreadUpdateMaps extends Thread{ @Override public void run() { - Persistence persistenceInst = Persistence.getInstance(); Threads threadsInstance = Threads.getInstance(); @@ -27,5 +26,4 @@ public class ThreadUpdateMaps extends Thread{ threadsInstance.setThreadUpdateMaps(ThreadStatus.FAILED); } } - } diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadUpdateStats.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadUpdateStats.java index 44ae6fe13e20f599800784e95dc6b0bd9a8ca9b7..a29f9d7d03b53ee32eaff9ca17463c2796fe3e07 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadUpdateStats.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadUpdateStats.java @@ -10,7 +10,6 @@ public class ThreadUpdateStats extends Thread{ @Override public void run() { - Persistence persistenceInst = Persistence.getInstance(); RuntimeInfo runtimeInfoInst = RuntimeInfo.getInstance(); Threads threadsInstance = Threads.getInstance(); @@ -33,5 +32,4 @@ public class ThreadUpdateStats extends Thread{ threadsInstance.setThreadUpdateStats(ThreadStatus.FAILED); } } - } diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/Threads.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/Threads.java index ebf4876b70d047545985366e5983fdd7438a97ec..0cbdadeb5c19b6e17ce5d0d2326c417d43b81f24 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/Threads.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/Threads.java @@ -5,8 +5,6 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; public class Threads { - - private static final Logger log = LogManager.getLogger(Threads.class); private static final Threads threadsSingleton = new Threads(); //Thread Status-Updates @@ -36,9 +34,12 @@ public class Threads { private String threadLoginMsg; + private Threads() { + } + + ; - private Threads(){}; - public static Threads getInstance(){ + public static Threads getInstance() { return threadsSingleton; } diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/Utilities/CryptoUtils.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/Utilities/CryptoUtils.java index 757543af9f7227b44495bed77f991b06ca34716a..91d58b53960c81ea1ee7234517614733d0da7956 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/Utilities/CryptoUtils.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/Utilities/CryptoUtils.java @@ -21,23 +21,23 @@ public class CryptoUtils{ private static String parts[] = new String[2]; private static final String ALGORITHM = "AES"; private static final String TRANSFORMATION = "AES/ECB/PKCS5Padding"; - private static String key = "Peters Olivenöl"; + private static final String key = "Peters Olivenöl"; private static String encrypted_as_word = "encrypted;"; - private static boolean alreadyencrypted = false; + private static boolean alreadyEncrypted = false; private static boolean multipleencryptions = false; private static int encryptionreturn; private static final Logger log = LogManager.getLogger(CryptoUtils.class); - public static int encrypt(File inputFile, boolean multipleencryptions) throws CryptoException { - alreadyencrypted = check_if_file_already_encrypted(inputFile); - if(multipleencryptions){ + public static int encrypt(File inputFile, boolean multipleEncryptions) throws CryptoException { + alreadyEncrypted = check_if_file_already_encrypted(inputFile); + if(multipleEncryptions){ doCrypto(Cipher.ENCRYPT_MODE, key, inputFile); log.info("This File can be encrypted multiple times"); return encryptionreturn = 0; } - else if(!alreadyencrypted && !multipleencryptions){ + else if(!alreadyEncrypted && !multipleEncryptions){ doCrypto(Cipher.ENCRYPT_MODE, key, inputFile); log.info("This File can only be encryptet once and this is now!"); return encryptionreturn = 1; @@ -87,73 +87,9 @@ public class CryptoUtils{ String filename = inputFile.getName(); //log.info("filename: " + filename); if(filename.contains(encrypted_as_word)){ - return alreadyencrypted =true; + return alreadyEncrypted =true; } inputFile.renameTo(new File("src\\main\\resources\\database\\" + encrypted_as_word + filename)); - return alreadyencrypted = false; + return alreadyEncrypted = false; } - - /*public static String[] doCrypto(int cipherMode, String key, File inputFile) throws CryptoException { - try { - - String filename = inputFile.getName(); - //String encrypted_as_word = "encrypted;"; - byte[] encryptet_as_word_as_bytes = encrypted_as_word.getBytes(); - - Key secretKey = new SecretKeySpec(key.getBytes(), ALGORITHM); - Cipher cipher = Cipher.getInstance(TRANSFORMATION); - cipher.init(cipherMode, secretKey); - - FileInputStream inputStream = new FileInputStream(inputFile); - byte[] inputBytes = new byte[(int) inputFile.length()]; - inputStream.read(inputBytes); //liest from inputstream into BufferArray - - String inputbytes = new String(inputBytes, StandardCharsets.UTF_8); - String[] wellencrypted = inputbytes.split(";"); - - log.info("encrypted_as_word.substring(0,encrypted_as_word.length()-1): " + encrypted_as_word.substring(0,encrypted_as_word.length()-1)); - - if(wellencrypted[0].equals(encrypted_as_word.substring(0,encrypted_as_word.length()-1))){ - wellencrypted = Arrays.copyOfRange(wellencrypted,1,wellencrypted.length); - inputBytes = wellencrypted[0].getBytes(); - log.info("Das Wort encrypted ist enthalten!"); - log.info("inputBytes: " + new String(inputBytes, StandardCharsets.UTF_8)); - - } - log.info("wellencrypted[0]: " +wellencrypted[0]); - log.info("wel[0]: " + wel[0]); - log.info("inputbytes: " + inputbytes); - log.info("inputBytes: " + new String(inputBytes, StandardCharsets.UTF_8)); - - byte[] outputBytes = cipher.doFinal(inputBytes); - - - String completeString = new String(outputBytes, StandardCharsets.UTF_8); - log.info("completeString/outputBytes: " + completeString); - parts = completeString.split(";"); - - if(cipherMode == Cipher.ENCRYPT_MODE){ - FileOutputStream outputStream = new FileOutputStream(inputFile); - ByteArrayOutputStream outputStream12 = new ByteArrayOutputStream( ); - outputStream12.write(encryptet_as_word_as_bytes); - outputStream12.write(outputBytes); - byte combined[] = outputStream12.toByteArray( ); - String combinedbytes = new String(combined, StandardCharsets.UTF_8); - log.info("combined: " + combinedbytes); - - - outputStream.write(combined);//outputBytes - - outputStream.close(); - } - - inputStream.close(); - - } catch (NoSuchPaddingException | NoSuchAlgorithmException - | InvalidKeyException | BadPaddingException - | IllegalBlockSizeException | IOException ex) { - throw new CryptoException("Error encrypting/decrypting file", ex); - } - return parts; - }*/ } diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/Utilities/HashGenerator.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/Utilities/HashGenerator.java index b6bead225f6a2d53dd83766c6af73a6204be0afc..78940e7633cccc7329b12ccc02ce22a00758d6aa 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/Utilities/HashGenerator.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/Utilities/HashGenerator.java @@ -1,26 +1,19 @@ package de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.Utilities; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public class HashGenerator { - - private static final Logger log = LogManager.getLogger(HashGenerator.class); - public static String hashAndHex(String input) throws NoSuchAlgorithmException { //Generates SHA1 Hash from input string and converts bytes from hash to hexadecimal resulting in hexadecimal String MessageDigest sha1 = MessageDigest.getInstance("SHA1"); byte[] sha1Hash = sha1.digest((input).getBytes()); String result = ""; - for (int i=0; i < sha1Hash.length; i++) { + for (byte hash : sha1Hash) { result += - Integer.toString( ( sha1Hash[i] & 0xff ) + 0x100, 16).substring( 1 ); + Integer.toString((hash & 0xff) + 0x100, 16).substring(1); } return result; } - - } diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/Utilities/Parser.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/Utilities/Parser.java index f3742c57e27bee0a60f44ffb66395754a57088a5..c207fa9533c4bc37f72f4a6307fd455d6a92dccf 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/Utilities/Parser.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/Utilities/Parser.java @@ -21,17 +21,17 @@ public class Parser { int minUsernameLength = 4; int maxUsernameLength = 40; - if(username.length() < minUsernameLength){ + if (username.length() < minUsernameLength) { throw new ParserException("Username too short! Min length is " + minUsernameLength + " characters."); } - if(username.length() > maxUsernameLength){ + if (username.length() > maxUsernameLength) { throw new ParserException("Username too long! Max length is " + maxUsernameLength + " characters."); } Pattern pat = Pattern.compile("[^a-z0-9_-]", Pattern.CASE_INSENSITIVE); Matcher mat = pat.matcher(username); boolean result = mat.find(); - if(result){ + if (result) { throw new ParserException("Forbidden characters used! Only user letters A-Z or numbers 0-9 or symbols '-' or '_' !"); } } @@ -40,17 +40,17 @@ public class Parser { int minPasswordLength = 4; int maxPasswordLength = 40; - if(password.length() < minPasswordLength){ + if (password.length() < minPasswordLength) { throw new ParserException("Password too short! Min length is " + minPasswordLength + " characters."); } - if(password.length() > maxPasswordLength){ + if (password.length() > maxPasswordLength) { throw new ParserException("Password too long! Max length is " + maxPasswordLength + " characters."); } Pattern pat = Pattern.compile("[^a-z0-9_-]", Pattern.CASE_INSENSITIVE); Matcher mat = pat.matcher(password); boolean result = mat.find(); - if(result){ + if (result) { throw new ParserException("Forbidden characters used! Only user letters A-Z or numbers 0-9 or symbols '-' or '_' !"); } } @@ -59,17 +59,17 @@ public class Parser { int minMapNameLength = 3; int maxMapNameLength = 30; - if(mapName.length() < minMapNameLength){ + if (mapName.length() < minMapNameLength) { throw new ParserException("Map-Name too short! Min length is " + minMapNameLength + " characters."); } - if(mapName.length() > maxMapNameLength){ + if (mapName.length() > maxMapNameLength) { throw new ParserException("Map-Name too long! Max length is " + maxMapNameLength + " characters."); } Pattern pat = Pattern.compile("[^a-z0-9_-]", Pattern.CASE_INSENSITIVE); Matcher mat = pat.matcher(mapName); boolean result = mat.find(); - if(result){ + if (result) { throw new ParserException("Forbidden characters used! Only user letters A-Z or numbers 0-9 or symbols '-' or '_' !"); } } @@ -77,14 +77,14 @@ public class Parser { public static void sha1HexHashValid(String mapID) throws ParserException { int hashLength = 40; - if(mapID.length() != hashLength){ + if (mapID.length() != hashLength) { throw new ParserException("SHA1 hash length not correct. Must have length of " + hashLength + " characters!"); } Pattern pat = Pattern.compile("[^a-f0-9]"); //maybe make case-insensitive -> letters can be uppercase and still be valid hex number Matcher mat = pat.matcher(mapID); boolean result = mat.find(); - if(result){ + if (result) { throw new ParserException("Forbidden characters used! SHA1 hash only consists out of letters a-f and/or numbers 0-9!"); } } @@ -97,43 +97,43 @@ public class Parser { int octetMinDecValue = 0; int octetMaxDecValue = 255; - if(address.equals("localhost")){ + if (address.equals("localhost")) { return; } - if(addressLength > addressMaxLength){ + if (addressLength > addressMaxLength) { throw new ParserException("IP-Address too long. Must have maximum length of " + addressMaxLength + " characters including octet dividers (.) !"); } - if(addressLength < addressMinLength){ + if (addressLength < addressMinLength) { throw new ParserException("IP-Address too short. Must have minimum length of " + addressMinLength + " characters including octet dividers (.) !"); } - if(address.charAt(0) == '.' | address.charAt(addressLength - 1) == '.'){ + if (address.charAt(0) == '.' | address.charAt(addressLength - 1) == '.') { throw new ParserException("IP-Address must not start nor end with octet dividers (.) !"); } int counter = 0; - for(int i = 0; addressLength > i ; i++){ - if(address.charAt(i) == '.'){ + for (int i = 0; addressLength > i; i++) { + if (address.charAt(i) == '.') { counter++; } } - if(counter != 3){ + if (counter != 3) { throw new ParserException("IP-Address must contain exactly 3 octet dividers (.) !"); } - for(int i = 0; addressLength > i ; i++){ - if(address.charAt(i) == '.' && address.charAt(i + 1) == '.'){ + for (int i = 0; addressLength > i; i++) { + if (address.charAt(i) == '.' && address.charAt(i + 1) == '.') { throw new ParserException("IP-Address must not contain two or more consecutive dividers (.) without number in between!"); } } Pattern pat = Pattern.compile("[^0-9.]"); - for(int i = 0; addressLength > i ; i++){ - Matcher mat = pat.matcher(address.substring(i, i+1)); + for (int i = 0; addressLength > i; i++) { + Matcher mat = pat.matcher(address.substring(i, i + 1)); boolean result = mat.find(); - if(result){ + if (result) { throw new ParserException("IP address must consist out of numbers 0-9 and separators (.) !"); } } @@ -141,19 +141,18 @@ public class Parser { counter = 0; int[] positions = new int[4]; positions[0] = 0; - for(int i = 0; addressLength > i ; i++){ - if(address.charAt(i) == '.'){ + for (int i = 0; addressLength > i; i++) { + if (address.charAt(i) == '.') { counter++; positions[counter] = i + 1; } } - for(int i = 0; positions.length > i; i++){ - if(positions.length - 1 > i) { + for (int i = 0; positions.length > i; i++) { + if (positions.length - 1 > i) { if (Integer.parseInt(address.substring(positions[i], positions[i + 1] - 1)) > octetMaxDecValue) { throw new ParserException("Octets of IP-address must not exceed 255!"); } - } - else{ + } else { if (Integer.parseInt(address.substring(positions[i], addressLength)) > octetMaxDecValue) { throw new ParserException("Octets of IP-address must not exceed 255!"); } @@ -185,39 +184,39 @@ public class Parser { int maxMapDataLength = spacesAmount + borderTilesAmount * Integer.toString(indestructibleTileMaxNumber).length() + spawnTilesAmount * Integer.toString(walkableTileMaxNumber).length() + fieldTilesAmount * Integer.toString(destructibleTileMaxNumber).length(); //"Integer.toString(destructibleTileMaxNumber).length()" results in number of digits of destructibleTileMaxNumber int minMapDataLength = spacesAmount + borderTilesAmount * Integer.toString(indestructibleTileMinNumber).length() + spawnTilesAmount * Integer.toString(walkableTileMinNumber).length() + fieldTilesAmount * Integer.toString(walkableTileMinNumber).length(); - if(actualMapDataLength > maxMapDataLength){ + if (actualMapDataLength > maxMapDataLength) { throw new ParserException("Map-Data corrupted - mapData String must not exceed length of " + maxMapDataLength + " chars including spaces for " + mapWidth + "x" + mapHeight + " Tiles map!"); } - if(actualMapDataLength < minMapDataLength){ + if (actualMapDataLength < minMapDataLength) { throw new ParserException("Map-Data corrupted - minimum length of mapData String must be " + minMapDataLength + " chars including spaces for " + mapWidth + "x" + mapHeight + " Tiles map!"); } - if(mapData.charAt(0) == ' ' | mapData.charAt(actualMapDataLength - 1) == ' '){ + if (mapData.charAt(0) == ' ' | mapData.charAt(actualMapDataLength - 1) == ' ') { throw new ParserException("Map-Data corrupted - must not start nor end with space!"); } - for(int i = 0; actualMapDataLength > i ; i++){ - if(mapData.charAt(i) == ' ' && mapData.charAt(i + 1) == ' '){ + for (int i = 0; actualMapDataLength > i; i++) { + if (mapData.charAt(i) == ' ' && mapData.charAt(i + 1) == ' ') { throw new ParserException("Map-Data corrupted - must not contain two or more consecutive spaces without number in between!"); } } int counter = 0; - for(int i = 0; i < actualMapDataLength; i++){ - if((mapData.charAt(i) == ' ')){ + for (int i = 0; i < actualMapDataLength; i++) { + if ((mapData.charAt(i) == ' ')) { counter++; } } - if(counter != spacesAmount){ + if (counter != spacesAmount) { throw new ParserException("Map-Data corrupted - number of spaces must be " + spacesAmount + "!"); } Pattern pat = Pattern.compile("[^0-9 ]"); - for(int i = 0; actualMapDataLength > i ; i++){ - Matcher mat = pat.matcher(mapData.substring(i, i+1)); + for (int i = 0; actualMapDataLength > i; i++) { + Matcher mat = pat.matcher(mapData.substring(i, i + 1)); boolean result = mat.find(); - if(result){ + if (result) { throw new ParserException("Map-Data corrupted - must consist out of numbers 0-9 and space as separator!"); } } @@ -225,19 +224,18 @@ public class Parser { counter = 0; int[] positions = new int[totalTilesAmount]; positions[0] = 0; - for(int i = 0; actualMapDataLength > i ; i++){ - if(mapData.charAt(i) == ' '){ + for (int i = 0; actualMapDataLength > i; i++) { + if (mapData.charAt(i) == ' ') { counter++; positions[counter] = i + 1; } } - for(int i = 0; positions.length > i; i++){ - if(positions.length - 1 > i) { + for (int i = 0; positions.length > i; i++) { + if (positions.length - 1 > i) { if (Integer.parseInt(mapData.substring(positions[i], positions[i + 1] - 1)) > maxTileNumber | Integer.parseInt(mapData.substring(positions[i], positions[i + 1] - 1)) < minTileNumber) { throw new ParserException("Map-Data corrupted - Tile number must be between " + minTileNumber + " and " + maxTileNumber + "!"); } - } - else{ + } else { if (Integer.parseInt(mapData.substring(positions[i], actualMapDataLength)) > maxTileNumber | Integer.parseInt(mapData.substring(positions[i], actualMapDataLength)) < minTileNumber) { throw new ParserException("Map-Data corrupted - Tile number must be between " + minTileNumber + " and " + maxTileNumber + "!"); } @@ -272,20 +270,19 @@ public class Parser { */ //corner Tiles included - for(int i = 0; i < mapWidth; i++){ - if(Integer.parseInt(mapData.substring(positions[i], positions[i+1] - 1)) > indestructibleTileMaxNumber | Integer.parseInt(mapData.substring(positions[i], positions[i+1] - 1)) < indestructibleTileMinNumber){ + for (int i = 0; i < mapWidth; i++) { + if (Integer.parseInt(mapData.substring(positions[i], positions[i + 1] - 1)) > indestructibleTileMaxNumber | Integer.parseInt(mapData.substring(positions[i], positions[i + 1] - 1)) < indestructibleTileMinNumber) { throw new ParserException("Map-Data corrupted - Top-Line must be border tiles!"); } } //corner Tiles included - for(int i = positions.length - mapWidth; i < positions.length; i++){ - if(positions.length - 1 > i) { + for (int i = positions.length - mapWidth; i < positions.length; i++) { + if (positions.length - 1 > i) { if (Integer.parseInt(mapData.substring(positions[i], positions[i + 1] - 1)) > indestructibleTileMaxNumber | Integer.parseInt(mapData.substring(positions[i], positions[i + 1] - 1)) < indestructibleTileMinNumber) { throw new ParserException("Map-Data corrupted - Bottom-Line must be border tiles!"); } - } - else{ + } else { if (Integer.parseInt(mapData.substring(positions[i], actualMapDataLength)) > indestructibleTileMaxNumber | Integer.parseInt(mapData.substring(positions[i], actualMapDataLength)) < indestructibleTileMinNumber) { throw new ParserException("Map-Data corrupted - Bottom-Line must be border tiles!"); } @@ -293,66 +290,66 @@ public class Parser { } //corner Tiles excluded - for(int i = mapWidth; i < positions.length - mapWidth; i = i + mapWidth){ - if(i % mapWidth == 0 && Integer.parseInt(mapData.substring(positions[i], positions[i + 1] - 1)) > indestructibleTileMaxNumber | Integer.parseInt(mapData.substring(positions[i], positions[i + 1] - 1)) < indestructibleTileMinNumber){ + for (int i = mapWidth; i < positions.length - mapWidth; i = i + mapWidth) { + if (i % mapWidth == 0 && Integer.parseInt(mapData.substring(positions[i], positions[i + 1] - 1)) > indestructibleTileMaxNumber | Integer.parseInt(mapData.substring(positions[i], positions[i + 1] - 1)) < indestructibleTileMinNumber) { throw new ParserException("Map-Data corrupted - Left Edge must be border tiles!"); } } //corner Tiles excluded - for(int i = mapWidth - 1; i < positions.length - mapWidth; i = i + mapWidth){ - if((i + 1) % mapWidth == 0 && Integer.parseInt(mapData.substring(positions[i], positions[i + 1] - 1)) > indestructibleTileMaxNumber | Integer.parseInt(mapData.substring(positions[i], positions[i + 1] - 1)) < indestructibleTileMinNumber){ + for (int i = mapWidth - 1; i < positions.length - mapWidth; i = i + mapWidth) { + if ((i + 1) % mapWidth == 0 && Integer.parseInt(mapData.substring(positions[i], positions[i + 1] - 1)) > indestructibleTileMaxNumber | Integer.parseInt(mapData.substring(positions[i], positions[i + 1] - 1)) < indestructibleTileMinNumber) { throw new ParserException("Map-Data corrupted - Right Edge must be border tiles!"); } } - if(Integer.parseInt(mapData.substring(positions[mapWidth + 1], positions[mapWidth + 2] - 1)) < walkableTileMinNumber | Integer.parseInt(mapData.substring(positions[mapWidth + 1], positions[mapWidth + 2] - 1)) > walkableTileMaxNumber){ + if (Integer.parseInt(mapData.substring(positions[mapWidth + 1], positions[mapWidth + 2] - 1)) < walkableTileMinNumber | Integer.parseInt(mapData.substring(positions[mapWidth + 1], positions[mapWidth + 2] - 1)) > walkableTileMaxNumber) { throw new ParserException("Map-Data corrupted - Player spawn top left must use walkable tile!"); } - if(Integer.parseInt(mapData.substring(positions[(mapWidth*2) - 2], positions[(mapWidth*2) - 1] - 1)) < walkableTileMinNumber | Integer.parseInt(mapData.substring(positions[(mapWidth*2) - 2], positions[(mapWidth*2) - 1] - 1)) > walkableTileMaxNumber){ + if (Integer.parseInt(mapData.substring(positions[(mapWidth * 2) - 2], positions[(mapWidth * 2) - 1] - 1)) < walkableTileMinNumber | Integer.parseInt(mapData.substring(positions[(mapWidth * 2) - 2], positions[(mapWidth * 2) - 1] - 1)) > walkableTileMaxNumber) { throw new ParserException("Map-Data corrupted - Player spawn top right must use walkable tile!"); } - if(Integer.parseInt(mapData.substring(positions[positions.length - (mapWidth*2) + 1], positions[positions.length - (mapWidth*2) + 2] - 1)) < walkableTileMinNumber | Integer.parseInt(mapData.substring(positions[positions.length - (mapWidth*2) + 1], positions[positions.length - (mapWidth*2) + 2] - 1)) > walkableTileMaxNumber) { + if (Integer.parseInt(mapData.substring(positions[positions.length - (mapWidth * 2) + 1], positions[positions.length - (mapWidth * 2) + 2] - 1)) < walkableTileMinNumber | Integer.parseInt(mapData.substring(positions[positions.length - (mapWidth * 2) + 1], positions[positions.length - (mapWidth * 2) + 2] - 1)) > walkableTileMaxNumber) { throw new ParserException("Map-Data corrupted - Player spawn bottom left must use walkable tile!"); } - if(Integer.parseInt(mapData.substring(positions[positions.length - mapWidth - 2], positions[positions.length - mapWidth - 1] - 1)) < walkableTileMinNumber | Integer.parseInt(mapData.substring(positions[positions.length - mapWidth - 2], positions[positions.length - mapWidth - 1] - 1)) > walkableTileMaxNumber){ + if (Integer.parseInt(mapData.substring(positions[positions.length - mapWidth - 2], positions[positions.length - mapWidth - 1] - 1)) < walkableTileMinNumber | Integer.parseInt(mapData.substring(positions[positions.length - mapWidth - 2], positions[positions.length - mapWidth - 1] - 1)) > walkableTileMaxNumber) { throw new ParserException("Map-Data corrupted - Player spawn bottom right must use walkable tile!"); } } - public static void playerStatsValid(PlayerStatistics stats) throws ParserException{ + public static void playerStatsValid(PlayerStatistics stats) throws ParserException { - if(stats.getGamesWon() < 0){ + if (stats.getGamesWon() < 0) { throw new ParserException("Player statistics data corrupted - Minimum value for won games is 0!"); } - if(stats.getGamesLost() < 0){ + if (stats.getGamesLost() < 0) { throw new ParserException("Player statistics data corrupted - Minimum value for lost games is 0!"); } - if(stats.getKills() < 0){ + if (stats.getKills() < 0) { throw new ParserException("Player statistics data corrupted - Minimum value for kills is 0!"); } - if(stats.getDeaths() < 0){ + if (stats.getDeaths() < 0) { throw new ParserException("Player statistics data corrupted - Minimum value for deaths is 0!"); } - if(stats.getBlocksDestroyed() < 0){ + if (stats.getBlocksDestroyed() < 0) { throw new ParserException("Player statistics data corrupted - Minimum value for destroyed blocks is 0!"); } - if(stats.getGameTime() < 0){ + if (stats.getGameTime() < 0) { throw new ParserException("Player statistics data corrupted - Minimum value for ingame time is 0 seconds!"); } } - public static void volumeValid(int volume) throws ParserException{ + public static void volumeValid(int volume) throws ParserException { - if(volume > 100 | volume < 0){ + if (volume > 100 | volume < 0) { throw new ParserException("Volume must be between 0 and 100!"); } diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/CollisionHandler.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/CollisionHandler.java index 675946aeef36f7e8453278393e233e854c76b04c..a89e0ded4bcd7abf0c4edf354f0e8b50af067dff 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/CollisionHandler.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/CollisionHandler.java @@ -9,7 +9,6 @@ import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.LogManager; public class CollisionHandler { - private static final Logger log = LogManager.getLogger(CollisionHandler.class); public CollisionHandler() { @@ -65,5 +64,4 @@ public class CollisionHandler { return true; } } - } \ No newline at end of file diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/EntityFactory.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/EntityFactory.java index e15dec5063e815dd25224490547277fc1838eb45..c16e0d357cc67e33a2f8c9610f909a743ee76162 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/EntityFactory.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/EntityFactory.java @@ -11,7 +11,6 @@ import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.LogManager; public class EntityFactory { - private static final Logger log = LogManager.getLogger(EntityFactory.class); public static IEntity createEntity(EntityType entityType, GraphicsContext gameScene, InputHandler inputHandler, @@ -23,8 +22,7 @@ public class EntityFactory { log.debug("Entity " + entityType + " created"); return new NetworkPlayerTwo(); } - - throw new IllegalArgumentException ("Entity type not supported " + entityType); + throw new IllegalArgumentException("Entity type not supported " + entityType); } public static IEntity createGameplayObject(ObjectType objectType, int cordX, int cordY, GraphicsContext graphicsContext) { @@ -45,7 +43,8 @@ public class EntityFactory { } throw new IllegalArgumentException(); } - public static IEntity createBombs(ObjectType objectType, int cordX, int cordY, GraphicsContext graphicsContext,int blastradius) { + + public static IEntity createBombs(ObjectType objectType, int cordX, int cordY, GraphicsContext graphicsContext, int blastradius) { if (objectType == ObjectType.BOMB) { return new Bomb(cordX, cordY, graphicsContext, blastradius); } else if (objectType == ObjectType.BIG_BOMB) { @@ -53,7 +52,8 @@ public class EntityFactory { } throw new IllegalArgumentException(); } - public static IEntity createMarker(ObjectType objectType, int cordX, int cordY, GraphicsContext graphicsContext,int player) { + + public static IEntity createMarker(ObjectType objectType, int cordX, int cordY, GraphicsContext graphicsContext, int player) { if (objectType == ObjectType.MARKER) { return new Marker(cordX, cordY, graphicsContext, player); } diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/EntityType.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/EntityType.java index 108c4c2037dbcb53d090dc19a59b9b79450d6b68..2095e4fd46941101e1db718aa9187df35114948b 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/EntityType.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/EntityType.java @@ -3,5 +3,5 @@ package de.hdm_stuttgart.battlearena.Model.Entity; public enum EntityType { PLAYER, NETWORK_PLAYER_TWO, - LOKAL_PLAYER_TWO + LOCAL_PLAYER_TWO } \ No newline at end of file diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/GameplayObjects/BigBomb.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/GameplayObjects/BigBomb.java index 3b1ba423cb2771dd0a4d0f076757980ecbb32388..72a8aef6ccddc8a433a9f26b144fc4a757cd0e71 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/GameplayObjects/BigBomb.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/GameplayObjects/BigBomb.java @@ -20,7 +20,6 @@ import java.util.List; import java.util.Objects; public class BigBomb implements IEntity { - private static final Logger log = LogManager.getLogger(BigBomb.class); RuntimeInfo runtimeInfo = RuntimeInfo.getInstance(); private final int posX; @@ -33,7 +32,7 @@ public class BigBomb implements IEntity { private final ObjectType OBJECT_TYPE = ObjectType.BOMB; private ObjectStatus OBJECT_STATUS = ObjectStatus.UNUSED; private final int scaledTileSize = 48; - private int blastradius = 18; + private int blastRadius = 18; public BigBomb(int posX, int posY, GraphicsContext graphicsContext, int blastradius) { this.posX = posX; @@ -107,11 +106,9 @@ public class BigBomb implements IEntity { } else if (frameIndex == 5) { frameIndex = 6; - checkExplosionSpawn(graphicsContext, blastradius); + checkExplosionSpawn(graphicsContext, blastRadius); //soundEffects.playSoundEffectOnce(SFX.BOMB); - - OBJECT_STATUS = ObjectStatus.USED; } frameCounter = 0; @@ -129,48 +126,50 @@ public class BigBomb implements IEntity { int yDown = yTile; int xLeft = xTile; - spawnExplosion(yTile, xTile,graphicsContext); + spawnExplosion(yTile, xTile, graphicsContext); isDestructible = checkTilePlacing(yTile, xTile); if (isDestructible != 0) { - spawnExplosion(yTile,xTile,graphicsContext); + spawnExplosion(yTile, xTile, graphicsContext); for (int i = 0; i < blastradius; i++) { yDown += 1; yUp -= 1; xRight += 1; xLeft -= 1; - if(yDown < 18 && yDown >= 0 && xTile < 18 && xTile >= 0) { + if (yDown < 18 && yDown >= 0 && xTile < 18 && xTile >= 0) { isDestructible = checkTilePlacing(yDown, xTile); if (isDestructible != 0 && !stopDown) { spawnExplosion(yDown, xTile, graphicsContext); - if(isDestructible == 2){ + if (isDestructible == 2) { stopDown = true; } } else { stopDown = true; } } - if(yUp < 18 && yUp >= 0 && xTile < 18 && xTile >= 0) { + if (yUp < 18 && yUp >= 0 && xTile < 18 && xTile >= 0) { isDestructible = checkTilePlacing(yUp, xTile); if (isDestructible != 0 && !stopUp) { spawnExplosion(yUp, xTile, graphicsContext); - if(isDestructible == 2){ + if (isDestructible == 2) { stopUp = true; } } else { stopUp = true; } - }if(yTile < 18 && yTile >= 0 && xRight < 18 && xRight >= 0) { + } + if (yTile < 18 && yTile >= 0 && xRight < 18 && xRight >= 0) { isDestructible = checkTilePlacing(yTile, xRight); if (isDestructible != 0 && !stopRight) { spawnExplosion(yTile, xRight, graphicsContext); - if(isDestructible == 2){ + if (isDestructible == 2) { stopRight = true; } } else { stopRight = true; } - }if(yTile < 18 && yTile >= 0 && xLeft < 18 && xLeft >= 0) { + } + if (yTile < 18 && yTile >= 0 && xLeft < 18 && xLeft >= 0) { isDestructible = checkTilePlacing(yTile, xLeft); if (isDestructible != 0 && !stopLeft) { spawnExplosion(yTile, xLeft, graphicsContext); @@ -186,16 +185,16 @@ public class BigBomb implements IEntity { } public int checkTilePlacing(int y, int x) { //Change it with a DestructionHandler like CollisionHandler //tileSet[xTile].getDestruction(); - if(TileManager.tileMap[y][x] >= 20){ + if (TileManager.tileMap[y][x] >= 20) { return 2; //Last spawn, in this direction - }else if(TileManager.tileMap[y][x] <= 9){ + } else if (TileManager.tileMap[y][x] <= 9) { return 1; //Keep Going - }else{ + } else { return 0; //dont continue } } - public void spawnExplosion(int spawnCordY, int spawnCordX, GraphicsContext graphicsContext){ + public void spawnExplosion(int spawnCordY, int spawnCordX, GraphicsContext graphicsContext) { List<IEntity> explosionspawns = runtimeInfo.getGameplayObjects(); IEntity explosion = EntityFactory.createGameplayObject(ObjectType.EXPLOSION, spawnCordX * scaledTileSize, spawnCordY * scaledTileSize, graphicsContext); explosionspawns.add(explosion); @@ -204,8 +203,8 @@ public class BigBomb implements IEntity { changeCheckedTileDestructable(graphicsContext); } - public void changeCheckedTileDestructable(GraphicsContext graphicsContext){ - int x,y; + public void changeCheckedTileDestructable(GraphicsContext graphicsContext) { + int x, y; List<IEntity> gameplayObjects = runtimeInfo.getGameplayObjects(); List<IEntity> explosionList = gameplayObjects.stream().filter(obj -> obj.getOBJECT_TYPE() == ObjectType.EXPLOSION) .toList(); @@ -221,13 +220,13 @@ public class BigBomb implements IEntity { } } - public void spawnItems(int x, int y,GraphicsContext graphicsContext){ - final double dropChanceBigBombItemFrame = 0.1; + public void spawnItems(int x, int y, GraphicsContext graphicsContext) { + final double dropChanceBigBombItemFrame = 0.11; final double dropChanceHeart = 0.15; - final double dropChanceBlastUpItemFrame = 0.15; - final double dropChanceBlastDownItemFrame = 0.15; - final double dropChanceBombClock = 0.1; - final double dropChanceTeleportItemFrame = 0.15; + final double dropChanceBlastUpItemFrame = 0.13; + final double dropChanceBlastDownItemFrame = 0.13; + final double dropChanceBombClock = 0.08; + final double dropChanceTeleportItemFrame = 0.13; double randomDropChance = Math.random() * 1; SfxOnce t = new SfxOnce(); @@ -239,36 +238,31 @@ public class BigBomb implements IEntity { gameplayObjects.add(heart); runtimeInfo.setGameplayObjects(gameplayObjects); log.info("BigBombItemFrame dropped"); - } - else if (randomDropChance < dropChanceHeart + dropChanceBigBombItemFrame) { + } else if (randomDropChance < dropChanceHeart + dropChanceBigBombItemFrame) { List<IEntity> gameplayObjects = runtimeInfo.getGameplayObjects(); IEntity bigBombItemFrame = EntityFactory.createGameplayObject(ObjectType.HEART, x, y, graphicsContext); gameplayObjects.add(bigBombItemFrame); runtimeInfo.setGameplayObjects(gameplayObjects); log.debug("heart dropped"); - } - else if (randomDropChance < dropChanceHeart + dropChanceBigBombItemFrame + dropChanceBlastUpItemFrame) { + } else if (randomDropChance < dropChanceHeart + dropChanceBigBombItemFrame + dropChanceBlastUpItemFrame) { List<IEntity> gameplayObjects = runtimeInfo.getGameplayObjects(); IEntity blastUpItemFrame = EntityFactory.createGameplayObject(ObjectType.BLASTUP_ITEMFRAME, x, y, graphicsContext); gameplayObjects.add(blastUpItemFrame); runtimeInfo.setGameplayObjects(gameplayObjects); log.info("BlastUpItemFrame dropped"); - } - else if (randomDropChance < dropChanceHeart + dropChanceBigBombItemFrame + dropChanceBlastUpItemFrame + dropChanceBlastDownItemFrame) { + } else if (randomDropChance < dropChanceHeart + dropChanceBigBombItemFrame + dropChanceBlastUpItemFrame + dropChanceBlastDownItemFrame) { List<IEntity> gameplayObjects = runtimeInfo.getGameplayObjects(); IEntity blastDownItemFrame = EntityFactory.createGameplayObject(ObjectType.BLASTDOWN_ITEMFRAME, x, y, graphicsContext); gameplayObjects.add(blastDownItemFrame); runtimeInfo.setGameplayObjects(gameplayObjects); log.info("BlastUpItemFrame dropped"); - } - else if (randomDropChance < dropChanceHeart + dropChanceBigBombItemFrame + dropChanceBlastUpItemFrame + dropChanceBlastDownItemFrame + dropChanceBombClock) { + } else if (randomDropChance < dropChanceHeart + dropChanceBigBombItemFrame + dropChanceBlastUpItemFrame + dropChanceBlastDownItemFrame + dropChanceBombClock) { List<IEntity> gameplayObjects = runtimeInfo.getGameplayObjects(); IEntity bombClockItemFrame = EntityFactory.createGameplayObject(ObjectType.BOMBCLOCK_ITEMFRAME, x, y, graphicsContext); gameplayObjects.add(bombClockItemFrame); runtimeInfo.setGameplayObjects(gameplayObjects); log.info("BombClockItemFrame dropped"); - } - else if (randomDropChance < dropChanceHeart + dropChanceBigBombItemFrame + dropChanceBlastUpItemFrame + dropChanceBombClock + dropChanceTeleportItemFrame) { + } else if (randomDropChance < dropChanceHeart + dropChanceBigBombItemFrame + dropChanceBlastUpItemFrame + dropChanceBombClock + dropChanceTeleportItemFrame) { List<IEntity> gameplayObjects = runtimeInfo.getGameplayObjects(); IEntity teleportItemFrame = EntityFactory.createGameplayObject(ObjectType.TELEPORT_ITEMFRAME, x, y, graphicsContext); gameplayObjects.add(teleportItemFrame); @@ -328,7 +322,7 @@ public class BigBomb implements IEntity { } @Override - public int getplayer() { + public int getPlayer() { return 0; } @@ -341,5 +335,4 @@ public class BigBomb implements IEntity { public int getMaxEntityHealth() { return 0; } - } diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/GameplayObjects/BigBombItemFrame.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/GameplayObjects/BigBombItemFrame.java index 442b1d287d94128f63fd6789af450137f51b6c7c..2c9c53758d65ce4a63da09b8a41ff2ef0283fb66 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/GameplayObjects/BigBombItemFrame.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/GameplayObjects/BigBombItemFrame.java @@ -149,7 +149,7 @@ public class BigBombItemFrame implements IEntity { } @Override - public int getplayer() { + public int getPlayer() { return 0; } diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/GameplayObjects/BlastDownItemFrame.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/GameplayObjects/BlastDownItemFrame.java index 0bca8c9f47862d873f9594f135e5d0825a793725..6ee6a5cfec3880090d275f1a4590faa01cddeb0c 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/GameplayObjects/BlastDownItemFrame.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/GameplayObjects/BlastDownItemFrame.java @@ -18,7 +18,6 @@ public class BlastDownItemFrame implements IEntity { private static final Logger log = LogManager.getLogger(BlastDownItemFrame.class); private final int posX; private final int posY; - private int frameIndex = 0; private int frameCounter = 0; private Image[] frames = new Image[4]; @@ -147,7 +146,7 @@ public class BlastDownItemFrame implements IEntity { } @Override - public int getplayer() { + public int getPlayer() { return 0; } diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/GameplayObjects/BlastUpItemFrame.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/GameplayObjects/BlastUpItemFrame.java index 7b242d0a590a7a1da232db5890fa9ea762b2a2b3..b04eb3faabea4ff9d7dc4fd2add7402882a85842 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/GameplayObjects/BlastUpItemFrame.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/GameplayObjects/BlastUpItemFrame.java @@ -18,7 +18,6 @@ public class BlastUpItemFrame implements IEntity { private static final Logger log = LogManager.getLogger(BlastUpItemFrame.class); private final int posX; private final int posY; - private int frameIndex = 0; private int frameCounter = 0; private Image[] frames = new Image[4]; @@ -52,33 +51,29 @@ public class BlastUpItemFrame implements IEntity { @Override public void updateEntity(GameSceneController gameScene, GraphicsContext graphicsContext) { - } @Override public void checkGameplayObjectInteraction(IEntity entity, GraphicsContext graphicsContext) { - } @Override public void placeBombAction(IEntity entity, GraphicsContext graphicsContext) { - } @Override public void attack(IEntity entity, GraphicsContext graphicsContext) { - } @Override public void updateEntityWalkAnimation() { - } public void renderEntity(GraphicsContext graphicsContext) { graphicsContext.drawImage(frames[frameIndex], posX, posY, 48, 48); updateAnimation(); } + private void updateAnimation() { frameCounter++; @@ -98,7 +93,6 @@ public class BlastUpItemFrame implements IEntity { @Override public void healPlayer(int heal) { - } @Override @@ -118,7 +112,6 @@ public class BlastUpItemFrame implements IEntity { @Override public void gotHit(int damageDone) { - } @Override @@ -147,8 +140,7 @@ public class BlastUpItemFrame implements IEntity { } @Override - - public int getplayer() { + public int getPlayer() { return 0; } diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/GameplayObjects/Bomb.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/GameplayObjects/Bomb.java index 2bc09d2104c33cef19efee6fe4bdd051a742b1f6..f46b8c5926227c9bdda7b52da365cbc0e57cdfb5 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/GameplayObjects/Bomb.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/GameplayObjects/Bomb.java @@ -29,18 +29,14 @@ public class Bomb implements IEntity { private BoundingBox boxCollider; private final ObjectType OBJECT_TYPE = ObjectType.BOMB; private ObjectStatus OBJECT_STATUS = ObjectStatus.UNUSED; - private final int scaledTileSize = 48; - private int blastradius; - - //private SoundEffects soundEffects; + private final int blastRadius; - - public Bomb(int posX, int posY, GraphicsContext graphicsContext, int blastradius) { + public Bomb(int posX, int posY, GraphicsContext graphicsContext, int blastRadius) { this.posX = posX; this.posY = posY; this.graphicsContext = graphicsContext; - this.blastradius = blastradius; + this.blastRadius = blastRadius; initializeEntity(); } @@ -62,38 +58,30 @@ public class Bomb implements IEntity { @Override public void updateEntity(GameSceneController gameScene, GraphicsContext graphicsContext) { - } @Override public void checkGameplayObjectInteraction(IEntity entity, GraphicsContext graphicsContext) { - } @Override public void placeBombAction(IEntity entity, GraphicsContext graphicsContext) { - } @Override public void attack(IEntity entity, GraphicsContext graphicsContext) { - } @Override public void updateEntityWalkAnimation() { - } public void renderEntity(GraphicsContext graphicsContext) { - graphicsContext.drawImage(frames[frameIndex], posX, posY, 48, 48); updateAnimation(); } private void updateAnimation() { //Easily add more frames - - frameCounter++; if (frameCounter > 18) { @@ -112,10 +100,7 @@ public class Bomb implements IEntity { } else if (frameIndex == 5) { frameIndex = 6; - checkExplosionSpawn(graphicsContext, blastradius); - - //soundEffects.playSoundEffectOnce(SFX.BOMB); - + checkExplosionSpawn(graphicsContext, blastRadius); OBJECT_STATUS = ObjectStatus.USED; } @@ -124,7 +109,6 @@ public class Bomb implements IEntity { } public void checkExplosionSpawn(GraphicsContext graphicsContext, int blastradius) { - int isDestructible; boolean stopDown = false, stopUp = false, stopRight = false, stopLeft = false; @@ -192,7 +176,7 @@ public class Bomb implements IEntity { } } - public void spawnExplosion(int spawnCordY, int spawnCordX, GraphicsContext graphicsContext){ + public void spawnExplosion(int spawnCordY, int spawnCordX, GraphicsContext graphicsContext) { List<IEntity> explosionspawns = runtimeInfo.getGameplayObjects(); IEntity explosion = EntityFactory.createGameplayObject(ObjectType.EXPLOSION, spawnCordX * scaledTileSize, spawnCordY * scaledTileSize, graphicsContext); explosionspawns.add(explosion); @@ -330,7 +314,7 @@ public class Bomb implements IEntity { } @Override - public int getplayer() { + public int getPlayer() { return 0; } diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/GameplayObjects/BombClockItemFrame.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/GameplayObjects/BombClockItemFrame.java index d1fbbb357926b7fb947ac987918e10c13e881953..d363c05afbe2d0979800d75bfd6f0c82f33e1d80 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/GameplayObjects/BombClockItemFrame.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/GameplayObjects/BombClockItemFrame.java @@ -20,7 +20,7 @@ public class BombClockItemFrame implements IEntity { private int frameIndex = 0; private int frameCounter = 0; - private Image[] frames = new Image[4]; + private final Image[] frames = new Image[4]; private final GraphicsContext graphicsContext; private BoundingBox boxCollider; private final ObjectType OBJECT_TYPE = ObjectType.BOMBCLOCK_ITEMFRAME; @@ -51,33 +51,29 @@ public class BombClockItemFrame implements IEntity { @Override public void updateEntity(GameSceneController gameScene, GraphicsContext graphicsContext) { - } @Override public void checkGameplayObjectInteraction(IEntity entity, GraphicsContext graphicsContext) { - } @Override public void placeBombAction(IEntity entity, GraphicsContext graphicsContext) { - } @Override public void attack(IEntity entity, GraphicsContext graphicsContext) { - } @Override public void updateEntityWalkAnimation() { - } public void renderEntity(GraphicsContext graphicsContext) { graphicsContext.drawImage(frames[frameIndex], posX, posY, 48, 48); updateAnimation(); } + private void updateAnimation() { frameCounter++; @@ -97,7 +93,6 @@ public class BombClockItemFrame implements IEntity { @Override public void healPlayer(int heal) { - } @Override @@ -117,7 +112,6 @@ public class BombClockItemFrame implements IEntity { @Override public void gotHit(int damageDone) { - } @Override @@ -146,7 +140,7 @@ public class BombClockItemFrame implements IEntity { } @Override - public int getplayer() { + public int getPlayer() { return 0; } diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/GameplayObjects/Explosion.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/GameplayObjects/Explosion.java index c0edb59df1d96100d297b5fe89343ad57e073d56..2cff5d06a24336159863a24261f69ed19200fff3 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/GameplayObjects/Explosion.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/GameplayObjects/Explosion.java @@ -6,22 +6,20 @@ import de.hdm_stuttgart.battlearena.Model.Entity.IEntity; import javafx.geometry.BoundingBox; import javafx.scene.canvas.GraphicsContext; import javafx.scene.image.Image; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; import java.util.Objects; public class Explosion implements IEntity { - private static final Logger log = LogManager.getLogger(Explosion.class); private final int posX; private final int posY; private int frameIndex = 0; private int frameCounter = 0; - private Image[] frames = new Image[6]; + private final Image[] frames = new Image[6]; private final GraphicsContext graphicsContext; private BoundingBox boxCollider; private final ObjectType OBJECT_TYPE = ObjectType.EXPLOSION; private ObjectStatus OBJECT_STATUS = ObjectStatus.UNUSED; + public Explosion(int posX, int posY, GraphicsContext graphicsContext) { this.posX = posX; this.posY = posY; @@ -29,11 +27,13 @@ public class Explosion implements IEntity { initializeEntity(); } + @Override public void initializeEntity() { loadEntitySprites(); - boxCollider = new BoundingBox(posX+12, posY+12, 24, 24); + boxCollider = new BoundingBox(posX + 12, posY + 12, 24, 24); } + @Override public void loadEntitySprites() { frames[0] = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/objects/vfx/bigexplosion.png"))); @@ -43,27 +43,22 @@ public class Explosion implements IEntity { @Override public void updateEntity(GameSceneController gameScene, GraphicsContext graphicsContext) { - } @Override public void checkGameplayObjectInteraction(IEntity entity, GraphicsContext graphicsContext) { - } @Override public void placeBombAction(IEntity entity, GraphicsContext graphicsContext) { - } @Override public void attack(IEntity entity, GraphicsContext graphicsContext) { - } @Override public void updateEntityWalkAnimation() { - } @Override @@ -71,6 +66,7 @@ public class Explosion implements IEntity { graphicsContext.drawImage(frames[frameIndex], posX, posY, 48, 48); updateAnimation(); } + private void updateAnimation() { //Easily add more frames frameCounter++; @@ -78,8 +74,7 @@ public class Explosion implements IEntity { if (frameIndex == 0) { frameIndex = 1; } else if (frameIndex == 1) { - frameIndex = 2; - } else if (frameIndex == 2) { + OBJECT_STATUS = ObjectStatus.USED; } frameCounter = 0; @@ -88,7 +83,6 @@ public class Explosion implements IEntity { @Override public void healPlayer(int heal) { - } @Override @@ -136,7 +130,9 @@ public class Explosion implements IEntity { } @Override - public int getplayer() { return 0;} + public int getPlayer() { + return 0; + } @Override public int getHealth() { @@ -145,8 +141,6 @@ public class Explosion implements IEntity { @Override public int getMaxEntityHealth() { - return 0; } - } diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/GameplayObjects/Heart.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/GameplayObjects/Heart.java index 0245be324c69a0f99fb53b5b3b51aba876ae421f..d308806d75da919877ac425eea7be4ee86435536 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/GameplayObjects/Heart.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/GameplayObjects/Heart.java @@ -8,15 +8,10 @@ import javafx.geometry.BoundingBox; import javafx.scene.canvas.GraphicsContext; import javafx.scene.image.Image; -import org.apache.logging.log4j.Logger; -import org.apache.logging.log4j.LogManager; import java.util.Objects; public class Heart implements IEntity { - - private static final Logger log = LogManager.getLogger(Heart.class); - private final int posX; private final int posY; private Image sprite; @@ -46,27 +41,22 @@ public class Heart implements IEntity { @Override public void updateEntity(GameSceneController gameScene, GraphicsContext graphicsContext) { - } @Override public void checkGameplayObjectInteraction(IEntity entity, GraphicsContext graphicsContext) { - } @Override public void placeBombAction(IEntity entity, GraphicsContext graphicsContext) { - } @Override public void attack(IEntity entity, GraphicsContext graphicsContext) { - } @Override public void updateEntityWalkAnimation() { - } @Override @@ -76,7 +66,6 @@ public class Heart implements IEntity { @Override public void healPlayer(int heal) { - } @Override @@ -96,7 +85,6 @@ public class Heart implements IEntity { @Override public void gotHit(int damageDone) { - } @Override @@ -125,7 +113,7 @@ public class Heart implements IEntity { } @Override - public int getplayer() { + public int getPlayer() { return 0; } @@ -138,5 +126,4 @@ public class Heart implements IEntity { public int getMaxEntityHealth() { return 0; } - } \ No newline at end of file diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/GameplayObjects/Marker.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/GameplayObjects/Marker.java index 428abb7a82ab72ff63718c8ee8e64865ca6db296..e4ae26b62ecb83635dccd6ea2ee87ee1110eb925 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/GameplayObjects/Marker.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/GameplayObjects/Marker.java @@ -1,30 +1,20 @@ package de.hdm_stuttgart.battlearena.Model.Entity.GameplayObjects; import de.hdm_stuttgart.battlearena.Controller.GameSceneController; -import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.RuntimeInfo; import de.hdm_stuttgart.battlearena.Model.Entity.EntityDirection; -import de.hdm_stuttgart.battlearena.Model.Entity.EntityFactory; import de.hdm_stuttgart.battlearena.Model.Entity.IEntity; -import de.hdm_stuttgart.battlearena.Model.Map.TileManager; import javafx.geometry.BoundingBox; import javafx.scene.canvas.GraphicsContext; import javafx.scene.image.Image; - -import org.apache.logging.log4j.Logger; -import org.apache.logging.log4j.LogManager; - -import java.util.List; import java.util.Objects; public class Marker implements IEntity { - private static final Logger log = LogManager.getLogger(Marker.class); - RuntimeInfo runtimeInfo = RuntimeInfo.getInstance(); private final int posX; private final int posY; private final int player; - private int frameIndex = 0; - private int frameCounter = 0; + private final int frameIndex = 0; + private final int frameCounter = 0; private Image sprite; private final GraphicsContext graphicsContext; private BoundingBox boxCollider; @@ -56,27 +46,22 @@ public class Marker implements IEntity { @Override public void updateEntity(GameSceneController gameScene, GraphicsContext graphicsContext) { - } @Override public void checkGameplayObjectInteraction(IEntity entity, GraphicsContext graphicsContext) { - } @Override public void placeBombAction(IEntity entity, GraphicsContext graphicsContext) { - } @Override public void attack(IEntity entity, GraphicsContext graphicsContext) { - } @Override public void updateEntityWalkAnimation() { - } public void renderEntity(GraphicsContext graphicsContext) { @@ -85,7 +70,6 @@ public class Marker implements IEntity { @Override public void healPlayer(int heal) { - } @Override @@ -133,7 +117,7 @@ public class Marker implements IEntity { OBJECT_STATUS = objectStatus; } @Override - public int getplayer(){ + public int getPlayer(){ return player; } @@ -146,6 +130,5 @@ public class Marker implements IEntity { public int getMaxEntityHealth() { return 0; } - } diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/GameplayObjects/TeleportationItemFrame.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/GameplayObjects/TeleportationItemFrame.java index 447266fa9b65a3e9c6e517f765e75ea949673861..b56406798920927182f9af8b6d61a9266076ec98 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/GameplayObjects/TeleportationItemFrame.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/GameplayObjects/TeleportationItemFrame.java @@ -6,19 +6,15 @@ import de.hdm_stuttgart.battlearena.Model.Entity.IEntity; import javafx.geometry.BoundingBox; import javafx.scene.canvas.GraphicsContext; import javafx.scene.image.Image; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; import java.util.Objects; - public class TeleportationItemFrame implements IEntity { - private static final Logger log = LogManager.getLogger(TeleportationItemFrame.class); private final int posX; private final int posY; private int frameIndex = 0; private int frameCounter = 0; - private Image[] frames = new Image[4]; + private final Image[] frames = new Image[4]; private final GraphicsContext graphicsContext; private BoundingBox boxCollider; private final ObjectType OBJECT_TYPE = ObjectType.TELEPORT_ITEMFRAME; @@ -49,33 +45,29 @@ public class TeleportationItemFrame implements IEntity { @Override public void updateEntity(GameSceneController gameScene, GraphicsContext graphicsContext) { - } @Override public void checkGameplayObjectInteraction(IEntity entity, GraphicsContext graphicsContext) { - } @Override public void placeBombAction(IEntity entity, GraphicsContext graphicsContext) { - } @Override public void attack(IEntity entity, GraphicsContext graphicsContext) { - } @Override public void updateEntityWalkAnimation() { - } public void renderEntity(GraphicsContext graphicsContext) { graphicsContext.drawImage(frames[frameIndex], posX, posY, 48, 48); updateAnimation(); } + private void updateAnimation() { frameCounter++; @@ -95,7 +87,6 @@ public class TeleportationItemFrame implements IEntity { @Override public void healPlayer(int heal) { - } @Override @@ -115,7 +106,6 @@ public class TeleportationItemFrame implements IEntity { @Override public void gotHit(int damageDone) { - } @Override @@ -144,7 +134,7 @@ public class TeleportationItemFrame implements IEntity { } @Override - public int getplayer() { + public int getPlayer() { return 0; } diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/IEntity.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/IEntity.java index 336332169b1e9c5e90438cc9672426bf53a84838..8e49f1cd21bbe8c56bc6270e6404bad32a8c65d8 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/IEntity.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/IEntity.java @@ -7,7 +7,6 @@ import javafx.geometry.BoundingBox; import javafx.scene.canvas.GraphicsContext; public interface IEntity { - void initializeEntity(); void loadEntitySprites(); @@ -45,7 +44,7 @@ public interface IEntity { void setObjectStatus(ObjectStatus objectStatus); - int getplayer(); + int getPlayer(); int getHealth(); int getMaxEntityHealth(); diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/NetworkPlayerTwo.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/NetworkPlayerTwo.java index cdd2277a1710c10a8ec54d9539123fda0e22161c..ce3b51d1e7067dc470f1928e234c12cf24ccbf44 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/NetworkPlayerTwo.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/NetworkPlayerTwo.java @@ -2,72 +2,277 @@ package de.hdm_stuttgart.battlearena.Model.Entity; import de.hdm_stuttgart.battlearena.Controller.GameSceneController; +import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.RuntimeInfo; import de.hdm_stuttgart.battlearena.Model.Entity.GameplayObjects.ObjectStatus; import de.hdm_stuttgart.battlearena.Model.Entity.GameplayObjects.ObjectType; +import de.hdm_stuttgart.battlearena.Model.Multiplayer.ConnectionHandler; +import de.hdm_stuttgart.battlearena.Model.Sound.SFX; import javafx.geometry.BoundingBox; import javafx.scene.canvas.GraphicsContext; +import javafx.scene.image.Image; import javafx.scene.paint.Color; import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.LogManager; -class NetworkPlayerTwo implements IEntity{ +import java.util.Objects; + +class NetworkPlayerTwo implements IEntity { private static final Logger log = LogManager.getLogger(NetworkPlayerTwo.class); + RuntimeInfo runtimeInfo = RuntimeInfo.getInstance(); + + ConnectionHandler connectionHandler = runtimeInfo.getConnectionHandler(); - private final BoundingBox boxCollider = new BoundingBox(300, 200, 48, 48); + private BoundingBox boxCollider; private EntityDirection entityDirection = EntityDirection.DOWN; - private int entitySpeed = 3; + private final EntityClass entityClass = connectionHandler.getEnemyClass(); + + private Image directionDownOne, + directionDownTwo, + directionUpOne, + directionUpTwo, + directionLeftOne, + directionLeftTwo, + directionRightOne, + directionRightTwo; + + private Image swordDown, + swordUp, + swordLeft, + swordRight; + private int spriteCounter = 0; + private int spriteNumber = 1; private int health = 10; + private int maxPlayerHealth; + private int damage; + + private int playerHeight = 20; + private int playerWidth = 19; + + private int playerX; + private int playerY; @Override public void initializeEntity() { + playerX = connectionHandler.getEnemyX(); + playerY = connectionHandler.getEnemyY(); + + runtimeInfo.setEnemyPlayerClass(entityClass); + loadEntitySprites(); + initializePlayerStats(); + boxCollider = new BoundingBox(playerX, playerY, 48, 48); } @Override public void loadEntitySprites() { + try { + if (entityClass == EntityClass.HUMAN) { + loadHumanSprites(); + loadWeaponSprites(); + } else if (entityClass == EntityClass.HIGH_BORN) { + loadHighBornSprites(); + loadWeaponSprites(); + } else if (entityClass == EntityClass.LOW_BORN) { + loadLowBornSprites(); + loadWeaponSprites(); + } else { + loadSentinelsSprites(); + loadWeaponSprites(); + } + } catch (Exception e) { + log.error(e); + } + } + private void initializePlayerStats() { + if (entityClass == EntityClass.HUMAN) { + maxPlayerHealth = 50; + health = 50; + damage = 5; + } else if (entityClass == EntityClass.HIGH_BORN) { + maxPlayerHealth = 100; + health = 75; + damage = 2; + } else if (entityClass == EntityClass.LOW_BORN) { + maxPlayerHealth = 10; + health = 10; + damage = 10; + } else { + maxPlayerHealth = 40; + health = 15; + damage = 7; + } } - @Override - public void updateEntity(GameSceneController gameScene, GraphicsContext graphicsContext) { + private void loadHumanSprites() { + directionDownOne = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/human/HumanDown00.png"))); + directionDownTwo = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/human/HumanDown01.png"))); + directionUpOne = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/human/HumanUp00.png"))); + directionUpTwo = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/human/HumanUp01.png"))); + directionLeftOne = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/human/HumanLeft00.png"))); + directionLeftTwo = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/human/HumanLeft01.png"))); + directionRightOne = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/human/HumanRight00.png"))); + directionRightTwo = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/human/HumanRight01.png"))); + } + private void loadHighBornSprites() { + directionDownOne = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/high_born/HighBornDown00.png"))); + directionDownTwo = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/high_born/HighBornDown01.png"))); + directionUpOne = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/upOne.png"))); + directionUpTwo = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/upTwo.png"))); + directionLeftOne = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/leftOne.png"))); + directionLeftTwo = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/leftTwo.png"))); + directionRightOne = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/rightOne.png"))); + directionRightTwo = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/rightTwo.png"))); } - @Override - public void checkGameplayObjectInteraction(IEntity entity, GraphicsContext graphicsContext) { + private void loadLowBornSprites() { + directionDownOne = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/HumanDown01.png"))); + directionDownTwo = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/HumanDown02.png"))); + directionUpOne = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/upOne.png"))); + directionUpTwo = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/upTwo.png"))); + directionLeftOne = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/leftOne.png"))); + directionLeftTwo = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/leftTwo.png"))); + directionRightOne = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/rightOne.png"))); + directionRightTwo = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/rightTwo.png"))); + } + private void loadSentinelsSprites() { + directionDownOne = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/sentinels/SentinelDown00.png"))); + directionDownTwo = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/sentinels/SentinelDown01.png"))); + directionUpOne = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/upOne.png"))); + directionUpTwo = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/upTwo.png"))); + directionLeftOne = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/leftOne.png"))); + directionLeftTwo = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/leftTwo.png"))); + directionRightOne = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/rightOne.png"))); + directionRightTwo = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/rightTwo.png"))); + } + + private void loadWeaponSprites() { + swordUp = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/weapons/SwordUp.png"))); + swordDown = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/weapons/SwordDown.png"))); + swordLeft = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/weapons/SwordLeft.png"))); + swordRight = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/weapons/SwordRight.png"))); } @Override - public void placeBombAction(IEntity entity, GraphicsContext graphicsContext) { + public void updateEntity(GameSceneController gameScene, GraphicsContext graphicsContext) { + playerX = connectionHandler.getEnemyX(); + playerY = connectionHandler.getEnemyY(); + updateHealth(); + entityDirection = connectionHandler.getEnemyWalkDirection(); + boxCollider = new BoundingBox(playerX, playerY, 48, 48); + } + private void updateHealth() { + health = connectionHandler.getEnemyHealth(); } + @Override + public void checkGameplayObjectInteraction(IEntity entity, GraphicsContext graphicsContext) {} + + @Override + public void placeBombAction(IEntity entity, GraphicsContext graphicsContext) {} + @Override public void attack(IEntity entity, GraphicsContext graphicsContext) { + BoundingBox hitBox; + int attackRange = 30; + int attackWidth = 10; + + if (connectionHandler.getEnemyAttacking()){ + if (entityDirection == EntityDirection.UP) { + hitBox = new BoundingBox(playerX + playerWidth, playerY - 10, attackWidth, attackRange); + graphicsContext.drawImage(swordUp, playerX + 8, playerY - 10, 32, 32); + hitEnemy(entity, hitBox); + } else if (entityDirection == EntityDirection.DOWN) { + hitBox = new BoundingBox(playerX + playerWidth, playerY + playerHeight, attackWidth, attackRange); + graphicsContext.drawImage(swordDown, playerX + 8, playerY + playerHeight, 32, 32); + hitEnemy(entity, hitBox); + } else if (entityDirection == EntityDirection.LEFT) { + hitBox = new BoundingBox(playerX - attackWidth, playerY + ((double) playerHeight / 2), + attackRange, attackWidth); + graphicsContext.drawImage(swordLeft, playerX - 8, playerY + 8, 32, 32); + hitEnemy(entity, hitBox); + } else { + hitBox = new BoundingBox(playerX + playerWidth + attackWidth, playerY + ((double) playerHeight / 2), + attackRange, attackWidth); + graphicsContext.drawImage(swordRight, playerX + playerWidth + 8, playerY + 8, 32, 32); + hitEnemy(entity, hitBox); + } + } + } + private void hitEnemy(IEntity entity, BoundingBox hitBox) { + if (hitBox.intersects(entity.getBoxCollider())) { + entity.gotHit(damage); + log.info("Hit enemy"); + } } @Override public void updateEntityWalkAnimation() { - + spriteCounter++; + + if (spriteCounter > 10) { + if (spriteNumber == 1) { + spriteNumber = 2; + } else if (spriteNumber == 2) { + spriteNumber = 1; + } + spriteCounter = 0; + } } @Override public void renderEntity(GraphicsContext graphicsContext) { - graphicsContext.setFill(Color.BLACK); - graphicsContext.fillRect(300, 200, 48, 48); + Image playerSprite = null; + + switch (entityDirection) { + case UP: + if (spriteNumber == 1) { + playerSprite = directionUpOne; + } + if (spriteNumber == 2) { + playerSprite = directionUpTwo; + } + break; + case DOWN: + if (spriteNumber == 1) { + playerSprite = directionDownOne; + } + if (spriteNumber == 2) { + playerSprite = directionDownTwo; + } + break; + case LEFT: + if (spriteNumber == 1) { + playerSprite = directionLeftOne; + } + if (spriteNumber == 2) { + playerSprite = directionLeftTwo; + } + break; + case RIGHT: + if (spriteNumber == 1) { + playerSprite = directionRightOne; + } + if (spriteNumber == 2) { + playerSprite = directionRightTwo; + } + break; + } + + graphicsContext.drawImage(playerSprite, playerX, playerY, 48, 48); } @Override public void healPlayer(int heal) { - log.info("Network player health: " + health); - health -= heal; } @Override @@ -89,16 +294,17 @@ class NetworkPlayerTwo implements IEntity{ public void gotHit(int damageDone) { log.debug("Network player health: " + health); health -= damageDone; + connectionHandler.setEnemyHealth(health -= damageDone); } @Override public int getMapPosX() { - return 0; + return playerX; } @Override public int getMapPosY() { - return 0; + return playerY; } @Override @@ -113,12 +319,10 @@ class NetworkPlayerTwo implements IEntity{ @Override public void setObjectStatus(ObjectStatus objectStatus) { - } @Override - - public int getplayer() { + public int getPlayer() { return 0; } 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 656ab67605d8efd00ed6a75b1bd06cfb96b77003..ab57c5f658d6fe1e58c861eeca0ceafdb8a382c1 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 @@ -1,16 +1,16 @@ package de.hdm_stuttgart.battlearena.Model.Entity; +import de.hdm_stuttgart.battlearena.Controller.Enum.GameMode; import de.hdm_stuttgart.battlearena.Controller.Enum.PlayerMode; import de.hdm_stuttgart.battlearena.Controller.GameSceneController; import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.RuntimeInfo; -import de.hdm_stuttgart.battlearena.Model.Entity.GameplayObjects.Heart; import de.hdm_stuttgart.battlearena.Model.Entity.GameplayObjects.ObjectStatus; import de.hdm_stuttgart.battlearena.Model.Entity.GameplayObjects.ObjectType; import de.hdm_stuttgart.battlearena.Model.Inputs.InputHandler; import de.hdm_stuttgart.battlearena.Model.Map.TileManager; +import de.hdm_stuttgart.battlearena.Model.Multiplayer.ConnectionHandler; import de.hdm_stuttgart.battlearena.Model.Sound.SFX; import de.hdm_stuttgart.battlearena.Model.Sound.SfxOnce; -import de.hdm_stuttgart.battlearena.Model.Sound.SoundEffectsVolume; import de.hdm_stuttgart.battlearena.Model.Sound.WalkEffects; import javafx.geometry.BoundingBox; import javafx.scene.canvas.GraphicsContext; @@ -23,26 +23,16 @@ import java.util.Objects; class Player implements IEntity { - private static final Logger log = LogManager.getLogger(Player.class); - private final PlayerMode PLAYER_MODE; - InputHandler inputHandler; - RuntimeInfo runtimeInfo = RuntimeInfo.getInstance(); - CollisionHandler collisionHandler = new CollisionHandler(); - GraphicsContext gameScene; - GameSceneController gameSceneController; - + ConnectionHandler connectionHandler; private BoundingBox boxCollider; - private SoundEffectsVolume sfx = new SoundEffectsVolume(); - - private Image directionDownOne, directionDownTwo, directionUpOne, @@ -58,21 +48,15 @@ class Player implements IEntity { swordRight; private final EntityClass entityClass; - private int spriteCounter = 0; private int spriteNumber = 1; - private final int playerWidth = 19; private final int playerHeight = 20; - private int scaledTileSize; - private int mapPosX; private int mapPosY; - private int lastMapPosX; private int lastMapPosY; - private int playerSpeed; private EntityDirection playerDirection; private int health; @@ -90,8 +74,8 @@ class Player implements IEntity { private boolean markerPlacedPlayerTwo = false; private boolean isTeleportItemFrame = false; private boolean isDead = false; - private int blastradius = 1; - private final int pixelpadding = 30; + private int blastRadius = 1; + private final int pixelPadding = 30; public Player(GraphicsContext gameScene, InputHandler inputHandler, EntityClass entityClass, GameSceneController gameSceneController, PlayerMode PLAYER_MODE) { @@ -108,12 +92,23 @@ class Player implements IEntity { @Override public void initializeEntity() { scaledTileSize = gameSceneController.getScaledTileSize(); - if (PLAYER_MODE == PlayerMode.PLAYER_ONE) { - mapPosX = 60; - mapPosY = 60; - } else if (PLAYER_MODE == PlayerMode.PLAYER_TWO) { - mapPosX = 760; - mapPosY = 735; + if (runtimeInfo.getGameMode() == GameMode.LOCAL) { + if (PLAYER_MODE == PlayerMode.PLAYER_ONE) { + mapPosX = 60; + mapPosY = 60; + } else if (PLAYER_MODE == PlayerMode.PLAYER_TWO) { + mapPosX = 760; + mapPosY = 735; + } + } else { + if (runtimeInfo.getEnemyPlayerMode() == PlayerMode.PLAYER_ONE) { + mapPosX = 60; + mapPosY = 60; + } else { + mapPosX = 760; + mapPosY = 735; + } + connectionHandler = runtimeInfo.getConnectionHandler(); } initializePlayerStats(); @@ -182,12 +177,12 @@ class Player implements IEntity { private void loadHighBornSprites() { directionDownOne = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/high_born/HighBornDown00.png"))); directionDownTwo = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/high_born/HighBornDown01.png"))); - directionUpOne = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/upOne.png"))); - directionUpTwo = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/upTwo.png"))); - directionLeftOne = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/leftOne.png"))); - directionLeftTwo = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/leftTwo.png"))); - directionRightOne = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/rightOne.png"))); - directionRightTwo = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/rightTwo.png"))); + directionUpOne = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/high_born/HighBornUp00.png"))); + directionUpTwo = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/high_born/HighBornUp01.png"))); + directionLeftOne = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/high_born/HighBornLeft00.png"))); + directionLeftTwo = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/high_born/HighBornLeft01.png"))); + directionRightOne = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/high_born/HighBornRight00.png"))); + directionRightTwo = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/high_born/HighBornRight01.png"))); } private void loadLowBornSprites() { @@ -204,12 +199,12 @@ class Player implements IEntity { private void loadSentinelsSprites() { directionDownOne = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/sentinels/SentinelDown00.png"))); directionDownTwo = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/sentinels/SentinelDown01.png"))); - directionUpOne = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/upOne.png"))); - directionUpTwo = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/upTwo.png"))); - directionLeftOne = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/leftOne.png"))); - directionLeftTwo = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/leftTwo.png"))); - directionRightOne = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/rightOne.png"))); - directionRightTwo = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/rightTwo.png"))); + directionUpOne = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/sentinels/SentinelUp00.png"))); + directionUpTwo = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/sentinels/SentinelUp01.png"))); + directionLeftOne = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/sentinels/SentinelLeft00.png"))); + directionLeftTwo = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/sentinels/SentinelLeft01.png"))); + directionRightOne = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/sentinels/SentinelRight00.png"))); + directionRightTwo = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/sentinels/SentinelRight01.png"))); } private void loadWeaponSprites() { @@ -221,7 +216,7 @@ class Player implements IEntity { @Override public void updateEntity(GameSceneController gameScene, GraphicsContext graphicsContext) { - if (PLAYER_MODE == PlayerMode.PLAYER_ONE) { + if (PLAYER_MODE == PlayerMode.PLAYER_ONE || runtimeInfo.getGameMode() == GameMode.NETWORK) { updateInvincibility(); updateAttackRate(); updateBombPlacementRate(); @@ -295,13 +290,12 @@ class Player implements IEntity { } private void performEntityMovement(boolean isWalkableTile, GraphicsContext graphicsContext) { - int xTile = (pixelpadding + mapPosX) / scaledTileSize; - int yTile = (pixelpadding + mapPosY) / scaledTileSize; + int xTile = (pixelPadding + mapPosX) / scaledTileSize; + int yTile = (pixelPadding + mapPosY) / scaledTileSize; int lastxTile = xTile; int lastyTile = yTile; - if (PLAYER_MODE == PlayerMode.PLAYER_ONE && !markerPlacedPlayerOne) { markerPlacedPlayerOne = findNearestTpTile(yTile, xTile, graphicsContext); } @@ -316,19 +310,31 @@ class Player implements IEntity { switch (playerDirection) { case UP: mapPosY -= playerSpeed; + if (runtimeInfo.getGameMode() == GameMode.NETWORK) { + connectionHandler.setpY(mapPosY); + } break; case DOWN: mapPosY += playerSpeed; + if (runtimeInfo.getGameMode() == GameMode.NETWORK) { + connectionHandler.setpY(mapPosY); + } break; case LEFT: mapPosX -= playerSpeed; + if (runtimeInfo.getGameMode() == GameMode.NETWORK) { + connectionHandler.setpX(mapPosX); + } break; case RIGHT: mapPosX += playerSpeed; + if (runtimeInfo.getGameMode() == GameMode.NETWORK) { + connectionHandler.setpX(mapPosX); + } } } - xTile = (pixelpadding + mapPosX) / scaledTileSize; - yTile = (pixelpadding + mapPosY) / scaledTileSize; + xTile = (pixelPadding + mapPosX) / scaledTileSize; + yTile = (pixelPadding + mapPosY) / scaledTileSize; if (PLAYER_MODE == PlayerMode.PLAYER_ONE && lastxTile != xTile || PLAYER_MODE == PlayerMode.PLAYER_ONE && lastyTile != yTile) { markerPlacedPlayerOne = removeMarker(markerPlacedPlayerOne); @@ -429,7 +435,7 @@ class Player implements IEntity { List<IEntity> gameplayObjects = runtimeInfo.getGameplayObjects(); if (markerPlacedPlayer == markerPlacedPlayerOne) { for (IEntity gameplayObject : gameplayObjects) { - if (gameplayObject.getOBJECT_TYPE() == ObjectType.MARKER && gameplayObject.getplayer() == 1) { + if (gameplayObject.getOBJECT_TYPE() == ObjectType.MARKER && gameplayObject.getPlayer() == 1) { log.debug("Removed Marker Player 1"); gameplayObject.setObjectStatus(ObjectStatus.USED); @@ -437,7 +443,7 @@ class Player implements IEntity { } } else if (markerPlacedPlayer == markerPlacedPlayerTwo) { for (IEntity gameplayObject : gameplayObjects) { - if (gameplayObject.getOBJECT_TYPE() == ObjectType.MARKER && gameplayObject.getplayer() == 2) { + if (gameplayObject.getOBJECT_TYPE() == ObjectType.MARKER && gameplayObject.getPlayer() == 2) { log.debug("Removed Marker Player 2"); gameplayObject.setObjectStatus(ObjectStatus.USED); @@ -492,7 +498,7 @@ class Player implements IEntity { isBlastUpItemFrame = true; SfxOnce t = new SfxOnce(); t.startSound(SFX.POWERUP); - blastradius = updateBlastradius(blastradius); + blastRadius = updateBlastradius(blastRadius); gameplayObject.setObjectStatus(ObjectStatus.USED); } } else if (gameplayObject.getOBJECT_TYPE() == ObjectType.BLASTDOWN_ITEMFRAME) { @@ -501,7 +507,7 @@ class Player implements IEntity { isBlastDownItemFrame = true; SfxOnce t = new SfxOnce(); t.startSound(SFX.POWERUP); - blastradius = updateBlastradius(blastradius); + blastRadius = updateBlastradius(blastRadius); gameplayObject.setObjectStatus(ObjectStatus.USED); } } else if (gameplayObject.getOBJECT_TYPE() == ObjectType.BOMBCLOCK_ITEMFRAME) { @@ -528,21 +534,20 @@ class Player implements IEntity { @Override public void placeBombAction(IEntity entity, GraphicsContext graphicsContext) { - List<IEntity> gameplayObjects = runtimeInfo.getGameplayObjects(); if (inputHandler.isBomb() && PLAYER_MODE == PlayerMode.PLAYER_ONE && bombPlacementRate == 0 || inputHandler.isSdBomb() && PLAYER_MODE == PlayerMode.PLAYER_TWO && bombPlacementRate == 0) { - blastradius = updateBlastradius(blastradius); + blastRadius = updateBlastradius(blastRadius); if (isBigBombItemFrame && !isTeleportItemFrame) { log.debug("We have Big_Bomb ItemFrames in the List"); bombPlacementRate = updateBombPlacementRate(bombPlacementRate); - int xTile = (pixelpadding + mapPosX) / scaledTileSize; - int yTile = (pixelpadding + mapPosY) / scaledTileSize; + int xTile = (pixelPadding + mapPosX) / scaledTileSize; + int yTile = (pixelPadding + mapPosY) / scaledTileSize; if (TileManager.tileMap[yTile][xTile] < 10) { SfxOnce t = new SfxOnce(); t.startSound(SFX.BOMB); - IEntity bigbomb = EntityFactory.createBombs(ObjectType.BIG_BOMB, xTile * scaledTileSize, yTile * scaledTileSize, graphicsContext, blastradius); + IEntity bigbomb = EntityFactory.createBombs(ObjectType.BIG_BOMB, xTile * scaledTileSize, yTile * scaledTileSize, graphicsContext, blastRadius); gameplayObjects.add(bigbomb); runtimeInfo.setGameplayObjects(gameplayObjects); log.debug("Bigbomb placed"); @@ -551,7 +556,7 @@ class Player implements IEntity { } else if (PLAYER_MODE == PlayerMode.PLAYER_ONE && isTeleportItemFrame) { bombPlacementRate = 25; for (IEntity gameplayObject : gameplayObjects) { - if (gameplayObject.getOBJECT_TYPE() == ObjectType.MARKER && gameplayObject.getplayer() == 1) { + if (gameplayObject.getOBJECT_TYPE() == ObjectType.MARKER && gameplayObject.getPlayer() == 1) { mapPosX = gameplayObject.getMapPosX(); mapPosY = gameplayObject.getMapPosY(); log.info("Teleport Player 1"); @@ -563,7 +568,7 @@ class Player implements IEntity { } else if (PLAYER_MODE == PlayerMode.PLAYER_TWO && isTeleportItemFrame) { bombPlacementRate = 25; for (IEntity gameplayObject : gameplayObjects) { - if (gameplayObject.getOBJECT_TYPE() == ObjectType.MARKER && gameplayObject.getplayer() == 2) { + if (gameplayObject.getOBJECT_TYPE() == ObjectType.MARKER && gameplayObject.getPlayer() == 2) { mapPosX = gameplayObject.getMapPosX(); mapPosY = gameplayObject.getMapPosY(); log.info("Teleport Player 2"); @@ -575,13 +580,13 @@ class Player implements IEntity { } else if (!isTeleportItemFrame) { log.debug("No BigBomb Itemframes in the List"); bombPlacementRate = bombReducedPlacementRate; - int xTile = (pixelpadding + mapPosX) / scaledTileSize; - int yTile = (pixelpadding + mapPosY) / scaledTileSize; + int xTile = (pixelPadding + mapPosX) / scaledTileSize; + int yTile = (pixelPadding + mapPosY) / scaledTileSize; if (TileManager.tileMap[yTile][xTile] < 10) { SfxOnce t = new SfxOnce(); t.startSound(SFX.BOMB); - IEntity bomb = EntityFactory.createBombs(ObjectType.BOMB, xTile * scaledTileSize, yTile * scaledTileSize, graphicsContext, blastradius); + IEntity bomb = EntityFactory.createBombs(ObjectType.BOMB, xTile * scaledTileSize, yTile * scaledTileSize, graphicsContext, blastRadius); gameplayObjects.add(bomb); runtimeInfo.setGameplayObjects(gameplayObjects); log.info("bomb placed"); @@ -611,9 +616,7 @@ class Player implements IEntity { } isBlastDownItemFrame = false; } - return blastradius; - } @Override @@ -628,33 +631,26 @@ class Player implements IEntity { if (inputHandler.isAttack() && PLAYER_MODE == PlayerMode.PLAYER_ONE && attackRate == 0 || inputHandler.isSdAttack() && PLAYER_MODE == PlayerMode.PLAYER_TWO && attackRate == 0) { - attackRate = 50; + attackRate = 25; SfxOnce sfx = new SfxOnce(); sfx.startSound(SFX.SWORD_SWING); - if (playerDirection == EntityDirection.UP) { hitBox = new BoundingBox(mapPosX + playerWidth, mapPosY - 10, attackWidth, attackRange); - graphicsContext.strokeRect(mapPosX + playerWidth, mapPosY - 10, attackWidth, attackRange); graphicsContext.drawImage(swordUp, mapPosX + 8, mapPosY - 10, 32, 32); hitEnemy(entity, hitBox); } else if (playerDirection == EntityDirection.DOWN) { hitBox = new BoundingBox(mapPosX + playerWidth, mapPosY + playerHeight, attackWidth, attackRange); - graphicsContext.strokeRect(mapPosX + playerWidth, mapPosY + playerHeight, attackWidth, attackRange); graphicsContext.drawImage(swordDown, mapPosX + 8, mapPosY + playerHeight, 32, 32); hitEnemy(entity, hitBox); } else if (playerDirection == EntityDirection.LEFT) { hitBox = new BoundingBox(mapPosX - attackWidth, mapPosY + ((double) playerHeight / 2), attackRange, attackWidth); - graphicsContext.strokeRect(mapPosX - attackWidth, mapPosY + ((double) playerHeight / 2), - attackRange, attackWidth); graphicsContext.drawImage(swordLeft, mapPosX - 8, mapPosY + 8, 32, 32); hitEnemy(entity, hitBox); } else { hitBox = new BoundingBox(mapPosX + playerWidth + attackWidth, mapPosY + ((double) playerHeight / 2), attackRange, attackWidth); - graphicsContext.strokeRect(mapPosX + playerWidth + attackWidth, mapPosY + ((double) playerHeight / 2), - attackRange, attackWidth); graphicsContext.drawImage(swordRight, mapPosX + playerWidth + 8, mapPosY + 8, 32, 32); hitEnemy(entity, hitBox); } @@ -672,7 +668,6 @@ class Player implements IEntity { @Override public void updateEntityWalkAnimation() { - spriteCounter++; if (spriteCounter > 10) { if (spriteNumber == 1) { @@ -692,9 +687,6 @@ class Player implements IEntity { public void renderEntity(GraphicsContext graphicsContext) { Image playerSprite = null; - //for debugging collision - graphicsContext.strokeRect(mapPosX + 15, mapPosY + 10, playerWidth, playerHeight); - switch (playerDirection) { case UP: if (spriteNumber == 1) { @@ -729,7 +721,6 @@ class Player implements IEntity { } break; } - graphicsContext.drawImage(playerSprite, mapPosX, mapPosY, 48, 48); } @@ -743,7 +734,7 @@ class Player implements IEntity { t.startSound(SFX.DAMAGETAKEN); iFrameCounter = 100; } else { - if(!isDead){ + if (!isDead) { SfxOnce t = new SfxOnce(); t.startSound(SFX.DEAD); log.info("Dead"); @@ -751,11 +742,12 @@ class Player implements IEntity { isDead = true; health = 0; iFrameCounter = 100; + runtimeInfo.setDeaths(runtimeInfo.getDeaths() + 1); + runtimeInfo.setKills(runtimeInfo.getKills() + 1); runtimeInfo.setGameWon(true); } log.info("DamageTaken, current Health: " + health); } - } @Override @@ -822,8 +814,7 @@ class Player implements IEntity { } @Override - public int getplayer() { + public int getPlayer() { return 0; } - } \ No newline at end of file diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/Inputs/InputHandler.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/Inputs/InputHandler.java index 27aed7d1928df8251c351e81c4b0c9cc27c63aec..c01a89dcfbcbfa51c90c6c74474047f4231b623f 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Model/Inputs/InputHandler.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/Inputs/InputHandler.java @@ -7,12 +7,11 @@ import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.LogManager; public class InputHandler { - private static final Logger log = LogManager.getLogger(InputHandler.class); - private static final InputHandler inputHandler = new InputHandler(); - private InputHandler(){} + private InputHandler() { + } public static InputHandler getInstance() { return inputHandler; @@ -172,11 +171,11 @@ public class InputHandler { return sdAttack; } - public boolean isBomb(){ + public boolean isBomb() { return bomb; } - public boolean isSdBomb(){ + public boolean isSdBomb() { return sdBomb; } } \ No newline at end of file diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/Map/BackgroundTile.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/Map/BackgroundTile.java index 75ec8fc3846abe20d4fc2d51966a192aa3f41b2b..64988e3e1fc377e4210c7b080f5b3f1b4fb10f2e 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Model/Map/BackgroundTile.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/Map/BackgroundTile.java @@ -12,13 +12,13 @@ class BackgroundTile implements ITile{ private final Image tileSprite; private final boolean isWalkable, isDestructible; - private SFXLoop soundeffect; + private final SFXLoop soundEffect; public BackgroundTile(Image tileSprite, boolean isWalkable, boolean isDestructible, SFXLoop sfx) { this.tileSprite = tileSprite; this.isWalkable = isWalkable; this.isDestructible = isDestructible; - this.soundeffect = sfx; + this.soundEffect = sfx; } @Override @@ -39,8 +39,8 @@ class BackgroundTile implements ITile{ } @Override - public SFXLoop getSoundeffect(){ + public SFXLoop getSoundEffect(){ log.debug("SFX returned"); - return soundeffect; + return soundEffect; } } \ No newline at end of file diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/Map/ITile.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/Map/ITile.java index f0290e1bceb21f6a78d5c07f873c11391dd822fa..ce45e9c8e7bc14de48aadb21c07fcae6b6ff421d 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Model/Map/ITile.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/Map/ITile.java @@ -7,5 +7,5 @@ public interface ITile { boolean getCollision(); boolean getDestruction(); Image getTileSprite(); - SFXLoop getSoundeffect(); + SFXLoop getSoundEffect(); } \ No newline at end of file diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/Map/TileFactory.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/Map/TileFactory.java index 7c10e8b13b9d11b5cda2f27af0be4a882118fa18..9086080570b14636b3161cda912f0a34d24f31f8 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Model/Map/TileFactory.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/Map/TileFactory.java @@ -7,10 +7,8 @@ import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.LogManager; public class TileFactory { - private static final Logger log = LogManager.getLogger(TileFactory.class); - public static ITile createTile(TileType tileType, TileType tileType2, Image tileSprite, SFXLoop sfx) { if (tileType == TileType.WALKABLE && tileType2 == TileType.DESTRUCTIBLE) { log.info("Tile with type: " + tileType + " " + tileType2 + " created."); @@ -25,9 +23,7 @@ public class TileFactory { log.info("Tile with type: " + tileType + " " + tileType2 +" created."); return new BackgroundTile(tileSprite, false, false, sfx); } - log.error("TileType: " + tileType + " not supported!"); throw new IllegalArgumentException("TileType: " + tileType + " not supported!"); } - } \ No newline at end of file diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/Map/TileManager.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/Map/TileManager.java index 7a16ccab61c682931409be6ca486023c52cd5f9c..21bbb90e5e3b444948d453595aa9dd432755f181 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Model/Map/TileManager.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/Map/TileManager.java @@ -11,16 +11,12 @@ import org.apache.logging.log4j.LogManager; import java.util.Objects; public class TileManager { - private static final Logger log = LogManager.getLogger(TileManager.class); - private final GraphicsContext graphicsContext2D; private final ITile[] tileSet; public static int[][] tileMap; - private final int horizontalTileCount; private final int verticalTileCount; - public TileManager(GraphicsContext graphicsContext2D, int diffTileCount, int horizontalTileCount, int verticalTileCount, String mapString, Biom biom) { this.graphicsContext2D = graphicsContext2D; @@ -326,7 +322,7 @@ public class TileManager { public void renderMap() { int currentTile; - int scaledTileSize = 48; //todo: later replace "48" with value from gameScene. + int scaledTileSize = 48; int tilePosX; int tilePosY; diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/Multiplayer/Client.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/Multiplayer/Client.java index 9817c0d2601718d4b0ce6d731097a6466eb2abe9..6ec67e8faa749b4da26922c7844f9de326d33619 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Model/Multiplayer/Client.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/Multiplayer/Client.java @@ -20,7 +20,7 @@ public class Client { in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); } - public int[] sendcords(int[] cords) throws IOException { + public int[] sendCords(int[] cords) throws IOException { String message = String.join(",", Arrays.stream(cords).mapToObj(String::valueOf).toArray(String[]::new)); out.println(message); // log.info("Sent coordinates: " + message); 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 48c31a576c546179217c67ec02df6f7041b555ea..9ae74030739ad5862ef80571e79bd9d6acc29ec3 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 @@ -2,22 +2,21 @@ package de.hdm_stuttgart.battlearena.Model.Multiplayer; import de.hdm_stuttgart.battlearena.Model.Entity.EntityClass; import de.hdm_stuttgart.battlearena.Model.Entity.EntityDirection; +import de.hdm_stuttgart.battlearena.Model.Multiplayer.Utilities.IPAddressValidator; +import de.hdm_stuttgart.battlearena.Model.Multiplayer.Utilities.NotAnIpAddressException; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import java.io.IOException; import java.util.Arrays; -import java.util.concurrent.TimeUnit; public class ConnectionHandler { - private static int pX = 0; private static int pY = 0; private static int enemyX = 0; private static int enemyY = 0; private static int playerID = 0; - - private static int playerAttacking = 1; + private static int playerAttacking = 0; private static int enemyAttacking = 0; private static int playerClass = 0; private static int enemyClass = 0; @@ -25,7 +24,7 @@ public class ConnectionHandler { private static int enemyWalkDirection = 0; private static int playerHealth = 10; private static int enemyHealth = 10; - private static int[] coordinates = {pX,pY,playerID,playerAttacking,playerClass,playerWalkDirection,playerHealth}; + private static int[] playerInformation = {pX, pY, playerID, playerAttacking, playerClass, playerWalkDirection, playerHealth}; private static String ipaddress = "localhost"; private static final Logger log = LogManager.getLogger(ConnectionHandler.class); @@ -48,8 +47,8 @@ public class ConnectionHandler { public void run() { try { while (!Thread.interrupted()) { - System.out.println(Arrays.toString(coordinates)); - int[] cords = client.sendcords(coordinates); + System.out.println(Arrays.toString(playerInformation)); + int[] cords = client.sendCords(playerInformation); enemyX = cords[0]; enemyY = cords[1]; playerID = cords[2]; @@ -58,13 +57,13 @@ public class ConnectionHandler { enemyWalkDirection = cords[5]; enemyHealth = cords[6]; // Assign the Values to the message to send: - coordinates[0] = pX; - coordinates[1] = pY; - coordinates[2] = playerID; - coordinates[3] = playerAttacking; - coordinates[4] = playerClass; - coordinates[5] = playerWalkDirection; - coordinates[6] = playerHealth; + playerInformation[0] = pX; + playerInformation[1] = pY; + playerInformation[2] = playerID; + playerInformation[3] = playerAttacking; + playerInformation[4] = playerClass; + playerInformation[5] = playerWalkDirection; + playerInformation[6] = playerHealth; Thread.sleep(60); } } catch (InterruptedException | IOException e) { @@ -97,14 +96,16 @@ public class ConnectionHandler { return enemyX; } + public int getEnemyY() { return enemyY; } + //Getters and Setter for all other information that are not coordinates: - public static boolean getPlayerAttacking() { + public boolean getPlayerAttacking() { if (playerAttacking == 1){ return true; } else { @@ -112,7 +113,7 @@ public class ConnectionHandler { } } - public static void setPlayerAttacking(boolean attack) { + public void setPlayerAttacking(boolean attack) { if (attack){ ConnectionHandler.playerAttacking = 1; } else { @@ -120,7 +121,7 @@ public class ConnectionHandler { } } - public static boolean getEnemyAttacking() { + public boolean getEnemyAttacking() { if (enemyAttacking == 1){ return true; } else { @@ -128,7 +129,7 @@ public class ConnectionHandler { } } - public static void setEnemyAttacking(boolean attack) { + public void setEnemyAttacking(boolean attack) { if (attack){ ConnectionHandler.enemyAttacking = 1; } else { @@ -136,7 +137,7 @@ public class ConnectionHandler { } } - public static EntityClass getPlayerClass() { + public EntityClass getPlayerClass() { if (playerClass == 1) { return EntityClass.HIGH_BORN; } else if (playerClass == 2) { @@ -148,19 +149,19 @@ public class ConnectionHandler { } } - public static void setPlayerClass(EntityClass player) { + public void setPlayerClass(EntityClass player) { if (player == EntityClass.HUMAN){ ConnectionHandler.playerClass = 0; } else if (player == EntityClass.HIGH_BORN) { ConnectionHandler.playerClass = 1; - } else if (player == EntityClass.LOW_BORN){ + } else if (player == EntityClass.LOW_BORN) { ConnectionHandler.playerClass = 2; } else { ConnectionHandler.playerClass = 3; } } - public static EntityClass getEnemyClass() { + public EntityClass getEnemyClass() { if (enemyClass == 1) { return EntityClass.HIGH_BORN; } else if (enemyClass == 2) { @@ -172,31 +173,31 @@ public class ConnectionHandler { } } - public static void setEnemyClass(EntityClass player) { + public void setEnemyClass(EntityClass player) { if (player == EntityClass.HUMAN){ ConnectionHandler.enemyClass = 0; } else if (player == EntityClass.HIGH_BORN) { ConnectionHandler.enemyClass = 1; - } else if (player == EntityClass.LOW_BORN){ + } else if (player == EntityClass.LOW_BORN) { ConnectionHandler.enemyClass = 2; } else { ConnectionHandler.enemyClass = 3; } } - public static EntityDirection getPlayerWalkDirection() { + public EntityDirection getPlayerWalkDirection() { if (playerWalkDirection == 1){ return EntityDirection.RIGHT; - } else if (playerWalkDirection == 2){ + } else if (playerWalkDirection == 2) { return EntityDirection.DOWN; - } else if (playerWalkDirection == 3){ + } else if (playerWalkDirection == 3) { return EntityDirection.LEFT; } else { return EntityDirection.UP; } } - public static void setPlayerWalkDirection(EntityDirection walk) { + public void setPlayerWalkDirection(EntityDirection walk) { if (walk == EntityDirection.RIGHT) { ConnectionHandler.playerWalkDirection = 1; } else if (walk == EntityDirection.DOWN) { @@ -208,19 +209,19 @@ public class ConnectionHandler { } } - public static EntityDirection getEnemyWalkDirection() { + public EntityDirection getEnemyWalkDirection() { if (enemyWalkDirection == 1){ return EntityDirection.RIGHT; - } else if (enemyWalkDirection == 2){ + } else if (enemyWalkDirection == 2) { return EntityDirection.DOWN; - } else if (enemyWalkDirection == 3){ + } else if (enemyWalkDirection == 3) { return EntityDirection.LEFT; } else { return EntityDirection.UP; } } - public static void setEnemyWalkDirection(EntityDirection walk) { + public void setEnemyWalkDirection(EntityDirection walk) { if (walk == EntityDirection.RIGHT) { ConnectionHandler.enemyWalkDirection = 1; } else if (walk == EntityDirection.DOWN) { @@ -232,24 +233,29 @@ public class ConnectionHandler { } } - public static int getPlayerHealth() { + public int getPlayerHealth() { return playerHealth; } - public static void setPlayerHealth(int playerHealth) { + public void setPlayerHealth(int playerHealth) { ConnectionHandler.playerHealth = playerHealth; } - public static int getEnemyHealth() { + public int getEnemyHealth() { return enemyHealth; } - public static void setEnemyHealth(int enemyHealth) { + public void setEnemyHealth(int enemyHealth) { ConnectionHandler.enemyHealth = enemyHealth; } - public static void setIpaddress(String ipaddress) { - ConnectionHandler.ipaddress = ipaddress; + public void setIpaddress(String ipaddress) throws NotAnIpAddressException { + if (!IPAddressValidator.validate(ipaddress)) { + throw new NotAnIpAddressException("Invalid IP Address!"); + } else { + ConnectionHandler.ipaddress = ipaddress; + } } + } 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 946bf73ae679fd9072b5706157079a968a7c4dd8..a4c9c442ff8bfba378c17f4721e55abe1dd6e775 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 @@ -6,9 +6,6 @@ import org.apache.logging.log4j.Logger; import java.net.*; import java.io.*; import java.util.Arrays; -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.TimeUnit; public class Server { @@ -29,14 +26,14 @@ public class Server { private static int enemyWalkDirection = 0; private static int playerHealth = 0; private static int enemyHealth = 0; - private static int playercount = 0; + private static int playerCount = 0; private static int[] cords; - private static int[] returncords = {enemyx,enemyy,playerID,enemyAttacking,enemyClass,enemyWalkDirection,enemyHealth}; + private static int[] returncords = {enemyx, enemyy, playerID, enemyAttacking, enemyClass, enemyWalkDirection, enemyHealth}; private boolean started = false; private static String ipaddress = "localhost"; //Uncomment these lines to test the server starting manually: - /* public static void main(String[] args) throws IOException { //main method for testing purposes + /* public static void main(String[] args) throws IOException { //main method for testing purposes Server server = new Server(); log.info("server starting..."); server.start(4444); @@ -59,6 +56,7 @@ public class Server { while (true) { try { new ServerHandler(serverSocket.accept()).start(); + } catch (IOException e) { e.printStackTrace(); } @@ -68,6 +66,24 @@ public class Server { log.info("requests accepting Thread started!"); } + public void stopServer() { + isServerRunning = false; + try { + serverSocket.close(); // Close the server socket to break out of accept() in the main thread + } catch (IOException e) { + log.error("Error closing server socket: " + e.getMessage()); + } + } + + public boolean isStarted() { + return started; + } + + public int getPlayerCount() { + return playerCount; + } + + //Inner class ServerHandler private static class ServerHandler extends Thread { private final Socket clientSocket; private PrintWriter out; @@ -78,104 +94,90 @@ public class Server { } public synchronized void run() { - try { - BufferedReader localIn = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); - PrintWriter localOut = new PrintWriter(clientSocket.getOutputStream(), true); - - 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]; - for (int i = 0; i < coordinates.length; i++) { - cords[i] = Integer.parseInt(coordinates[i]); + try { + + BufferedReader localIn = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); + PrintWriter localOut = new PrintWriter(clientSocket.getOutputStream(), true); + + 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]; + for (int i = 0; i < coordinates.length; i++) { + cords[i] = Integer.parseInt(coordinates[i]); + } + + //first connect of a client: + if (playerCount == 0) { + //first player to connect + playerCount++; + returncords[2] = 1; + + } else if (playerCount == 1) { + //second player to connect + if (cords[2] == 1) { + returncords[2] = 1; + } else { + playerCount++; + returncords[2] = 2; } - //first connect of a client: - if(playercount == 0){ - //first player to connect - playercount++; + } else if (playerCount == 2) { + + //check which client has connected + if (cords[2] == 1) { + //player + px = cords[0]; + py = cords[1]; + playerAttacking = cords[3]; + playerClass = cords[4]; + playerWalkDirection = cords[5]; + playerHealth = cords[6]; + + //set the cords to return: + returncords[0] = enemyx; + returncords[1] = enemyy; + returncords[3] = enemyAttacking; + returncords[4] = enemyClass; + returncords[5] = enemyWalkDirection; + returncords[6] = enemyHealth; + + //set playerID: returncords[2] = 1; - } else if(playercount == 1){ - //second player to connect - if(cords[2] == 1){ - returncords[2] = 1; - } else { - playercount++; - returncords[2] = 2; - } - - } else if(playercount == 2){ - - //check which client has connected - if (cords[2] == 1) { - //player - px = cords[0]; - py = cords[1]; - playerAttacking = cords[3]; - playerClass = cords[4]; - playerWalkDirection = cords[5]; - playerHealth = cords[6]; - - //set the cords to return: - returncords[0] = enemyx; - returncords[1] = enemyy; - returncords[3] = enemyAttacking; - returncords[4] = enemyClass; - returncords[5] = enemyWalkDirection; - returncords[6] = enemyHealth; - - //set playerID: - returncords[2] = 1; - - } else if(cords[2] == 2) { - //enemy - enemyx = cords[0]; - enemyy = cords[1]; - enemyAttacking = cords[3]; - enemyClass = cords[4]; - enemyWalkDirection = cords[5]; - enemyHealth = cords[6]; - - //set the cords to return: - returncords[0] = px; - returncords[1] = py; - returncords[3] = playerAttacking; - returncords[4] = playerClass; - returncords[5] = playerWalkDirection; - returncords[6] = playerHealth; - - //set playerID: - returncords[2] = 2; - } + } else if (cords[2] == 2) { + //enemy + enemyx = cords[0]; + enemyy = cords[1]; + enemyAttacking = cords[3]; + enemyClass = cords[4]; + enemyWalkDirection = cords[5]; + enemyHealth = cords[6]; + + //set the cords to return: + returncords[0] = px; + returncords[1] = py; + returncords[3] = playerAttacking; + returncords[4] = playerClass; + returncords[5] = playerWalkDirection; + returncords[6] = playerHealth; + + //set playerID: + returncords[2] = 2; } + } - localOut.println(Arrays.toString(returncords)); - localOut.flush(); + 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); - } - } catch (IOException e) { - throw new RuntimeException(e); } + } catch (IOException e) { + throw new RuntimeException(e); + } } } - - public void stopServer() { - isServerRunning = false; - try { - serverSocket.close(); // Close the server socket to break out of accept() in the main thread - } catch (IOException e) { - log.error("Error closing server socket: " + e.getMessage()); - } - } - - public boolean isStarted() { - return started; - } - - } diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/Multiplayer/TestMap.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/Multiplayer/TestMap.java index f6d7fdf0800d787b23fb6df532afdb898733d53c..2773462b4c8691b5df945ae5c32a9a62266efd71 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Model/Multiplayer/TestMap.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/Multiplayer/TestMap.java @@ -1,5 +1,6 @@ package de.hdm_stuttgart.battlearena.Model.Multiplayer; +import de.hdm_stuttgart.battlearena.Model.Multiplayer.Utilities.NotAnIpAddressException; import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.input.KeyCode; @@ -21,6 +22,12 @@ public class TestMap extends Application { public void start(Stage primaryStage) throws IOException, InterruptedException { ConnectionHandler handler = new ConnectionHandler(); + try { + handler.setIpaddress("localhost"); + } catch (NotAnIpAddressException e) { + e.printStackTrace(); + } + handler.startHandler(); TimeUnit.SECONDS.sleep(1); diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/Multiplayer/Utilities/IPAddressValidator.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/Multiplayer/Utilities/IPAddressValidator.java new file mode 100644 index 0000000000000000000000000000000000000000..a292a067c397cc204f39a399fc6f1945b808ee86 --- /dev/null +++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/Multiplayer/Utilities/IPAddressValidator.java @@ -0,0 +1,16 @@ +package de.hdm_stuttgart.battlearena.Model.Multiplayer.Utilities; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class IPAddressValidator { + + private static final String IPADDRESS_PATTERN = + "^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$"; + private static final Pattern pattern = Pattern.compile(IPADDRESS_PATTERN); + public static boolean validate(final String ip) { + Matcher matcher = pattern.matcher(ip); + return matcher.matches(); + } + +} diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/Multiplayer/Utilities/Initializer.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/Multiplayer/Utilities/Initializer.java new file mode 100644 index 0000000000000000000000000000000000000000..3622881d7ec09a2eb0af32f791de4656576a4d47 --- /dev/null +++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/Multiplayer/Utilities/Initializer.java @@ -0,0 +1,39 @@ +package de.hdm_stuttgart.battlearena.Model.Multiplayer.Utilities; + +import de.hdm_stuttgart.battlearena.Controller.Enum.PlayerMode; +import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.RuntimeInfo; +import de.hdm_stuttgart.battlearena.Model.Multiplayer.ConnectionHandler; +import de.hdm_stuttgart.battlearena.Model.Multiplayer.Server; + +import java.io.IOException; + +public class Initializer { + + RuntimeInfo runtimeInfo = RuntimeInfo.getInstance(); + + public void launchGameServer() throws IOException { + Server server = new Server(); + server.startServer(); + runtimeInfo.setServer(server); + } + + public void launchConnectionHandler(String ipAddress) throws IOException, InterruptedException, NotAnIpAddressException { + ConnectionHandler connectionHandler = new ConnectionHandler(); + connectionHandler.setIpaddress(ipAddress); + connectionHandler.startHandler(); + runtimeInfo.setConnectionHandler(connectionHandler); + RuntimeInfo.getInstance().setPlayerID(connectionHandler.getPlayerID()); + } + + //initialize playerMode in runtimeInfo must be executed bevor the game scene gets initialized + public void getPlayerMode(ConnectionHandler connectionHandler) { + int playerId = connectionHandler.getPlayerID(); + if (playerId == 1) { + runtimeInfo.setPlayerMode(PlayerMode.PLAYER_ONE); + runtimeInfo.setEnemyPlayerMode(PlayerMode.PLAYER_TWO); + } else { + runtimeInfo.setPlayerMode(PlayerMode.PLAYER_TWO); + runtimeInfo.setEnemyPlayerMode(PlayerMode.PLAYER_ONE); + } + } +} \ No newline at end of file diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/Multiplayer/Utilities/NotAnIpAddressException.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/Multiplayer/Utilities/NotAnIpAddressException.java new file mode 100644 index 0000000000000000000000000000000000000000..fc447ea0ac3d5e7546123467b1b1f330d7076d60 --- /dev/null +++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/Multiplayer/Utilities/NotAnIpAddressException.java @@ -0,0 +1,10 @@ +package de.hdm_stuttgart.battlearena.Model.Multiplayer.Utilities; + +public class NotAnIpAddressException extends Exception{ + public NotAnIpAddressException(){ + + } + public NotAnIpAddressException(String message){ + super(message); + } +} diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/Sound/MusicPlayer.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/Sound/MusicPlayer.java index 8adefbeed048c39ccdb4b251af3fc60dcde3a5b9..5e4fa7cfd6d7c38887d774210d8be8158c49860b 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Model/Sound/MusicPlayer.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/Sound/MusicPlayer.java @@ -14,45 +14,35 @@ import java.io.IOException; import java.nio.file.Path; import java.nio.file.Paths; import java.util.List; +import java.util.Objects; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; -public class MusicPlayer{ - - - +public class MusicPlayer { private static final Logger log = LogManager.getLogger(MusicPlayer.class); - - private static final MusicPlayer musicPlayerSingleton = new MusicPlayer(); - + private static final MusicPlayer musicPlayerSingleton = new MusicPlayer(); private final Persistence persistence = Persistence.getInstance(); - - private MediaPlayer mediaPlayer; private GameState currentGameState; - private SoundFileManager fileManager = new SoundFileManager(); - + private final SoundFileManager fileManager = new SoundFileManager(); private ScheduledExecutorService scheduler; - private MusicPlayer(){} - - - + private MusicPlayer() { + } - public void startGameStateMonitoring(){ + public void startGameStateMonitoring() { scheduler = Executors.newSingleThreadScheduledExecutor(); - scheduler.scheduleAtFixedRate(()->{ - GameState newGameState = RuntimeInfo.getInstance().getGameState(); - if(currentGameState != newGameState){ - currentGameState = newGameState; - updateMusic(); - } - },0,1, TimeUnit.MILLISECONDS); - + scheduler.scheduleAtFixedRate(() -> { + GameState newGameState = RuntimeInfo.getInstance().getGameState(); + if (currentGameState != newGameState) { + currentGameState = newGameState; + updateMusic(); + } + }, 0, 1, TimeUnit.MILLISECONDS); } - private void updateMusic(){ + private void updateMusic() { stopMusic(); playRandomMusic(); } @@ -60,7 +50,7 @@ public class MusicPlayer{ private void playRandomMusic() { String path = currentGameState.getPath(); log.info(path); - if(!path.isEmpty()) { + if (!path.isEmpty()) { Path pathTypeOfMusic = Paths.get(path); List<Path> musicPaths; @@ -70,51 +60,50 @@ public class MusicPlayer{ throw new RuntimeException(e); } - String randomPath = fileManager.getRandomFilePath(musicPaths); - String resource = fileManager.convertPathToResourcePath(randomPath); - musicPaths.clear(); - - Thread thread = new Thread(() -> { - try { - Media media = new Media(getClass().getResource(resource).toExternalForm()); - mediaPlayer = new MediaPlayer(media); - mediaPlayer.setOnEndOfMedia(() -> playRandomMusic()); - mediaPlayer.setVolume((double) persistence.getSettings().getMusicVolume() / 100); - mediaPlayer.play(); - log.info("Music is playing"); - }catch (MediaException mediaException){ - log.warn("unsupported media"); - } - }); - thread.setDaemon(true); - thread.start(); - + String randomPath = fileManager.getRandomFilePath(musicPaths); + String resource = fileManager.convertPathToResourcePath(randomPath); + musicPaths.clear(); + + Thread thread = new Thread(() -> { + try { + Media media = new Media(Objects.requireNonNull(getClass().getResource(resource)).toExternalForm()); + mediaPlayer = new MediaPlayer(media); + mediaPlayer.setOnEndOfMedia(this::playRandomMusic); + mediaPlayer.setVolume((double) persistence.getSettings().getMusicVolume() / 100); + mediaPlayer.play(); + log.info("Music is playing"); + } catch (MediaException mediaException) { + log.warn("unsupported media"); + } + }); + thread.setDaemon(true); + thread.start(); } } - - private void stopMusic(){ + private void stopMusic() { if (mediaPlayer != null) { mediaPlayer.dispose(); // Dispose of the MediaPlayer instance to ensure stoping } } - - public void setVolume(int volume){ + public void setVolume(int volume) { persistence.getSettings().setMusicVolume(volume); mediaPlayer.setVolume((double) volume / 100); } + public ScheduledExecutorService getScheduler() { + return scheduler; + } - public int getVolume(){ - return persistence.getSettings().getMusicVolume(); + public GameState getMusicPlayerGameState() { + return currentGameState; } - public ScheduledExecutorService getScheduler(){return scheduler;} - public GameState getMusicPlayerGameState(){return currentGameState;} public MediaPlayer getMediaPlayer() { return mediaPlayer; } - public static MusicPlayer getInstance(){return musicPlayerSingleton;} - + public static MusicPlayer getInstance() { + return musicPlayerSingleton; + } } diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/Sound/SFX.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/Sound/SFX.java index e9f147928e38ff48aad113e33f4b910f65e5a5ae..0a11caf368b8ffec0ec63806b1bb27af9d68d941 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Model/Sound/SFX.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/Sound/SFX.java @@ -21,7 +21,7 @@ public enum SFX { DAMAGETAKEN("src/main/resources/sound/sfx/otSFX/dieSounds/hurt.wav"); - private String path; + private final String path; SFX(String path) { this.path = path; diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/Sound/SFXLoop.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/Sound/SFXLoop.java index 4ba107d82289306dac34ec6d9ffe1824c61c7124..181eb64c921bc1ecdcfd3f24badf1ef7826dc3dd 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Model/Sound/SFXLoop.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/Sound/SFXLoop.java @@ -5,9 +5,7 @@ public enum SFXLoop { GRASS("src/main/resources/sound/sfx/steps/grass"), STONE("src/main/resources/sound/sfx/steps/stone"); - - - private String path; + private final String path; SFXLoop(String path){ this.path = path; } diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/Sound/SfxOnce.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/Sound/SfxOnce.java index 5ba46507ba8ff65d43731dda20d52cd721ac97ef..1a54dde4ef7f1c6349b83ce3ba217ec3556eb609 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Model/Sound/SfxOnce.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/Sound/SfxOnce.java @@ -5,23 +5,33 @@ import javafx.scene.media.AudioClip; import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.LogManager; +import java.util.Objects; + public class SfxOnce extends Thread { private static final Logger log = LogManager.getLogger(SfxOnce.class); private SFX sfx; - private Persistence persistence = Persistence.getInstance(); + private boolean isNotPlaying; + private final Persistence persistence = Persistence.getInstance(); @Override public void run() { String path = sfx.getPath(); log.info(path); String resource = path.substring(18); // Begins at Ressource Folder - AudioClip audioClip = new AudioClip(getClass().getResource(resource).toExternalForm()); + AudioClip audioClip = new AudioClip(Objects.requireNonNull(getClass().getResource(resource)).toExternalForm()); audioClip.setVolume((double) persistence.getSettings().getSfxVolume() / 100); + this.isNotPlaying = false; audioClip.play(); } public void startSound(SFX sfx) { - this.sfx = sfx; - start(); + this.sfx = sfx; + + start(); + + } + + public boolean isNotPlaying() { + return isNotPlaying; } } diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/Sound/SoundEffectsVolume.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/Sound/SoundEffectsVolume.java index dd0e5778676fe573fb34eafd04d58fcebb23fee3..edc7aa7111dee711f6e560cec00cad40889480c2 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Model/Sound/SoundEffectsVolume.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/Sound/SoundEffectsVolume.java @@ -1,15 +1,9 @@ package de.hdm_stuttgart.battlearena.Model.Sound; import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.Persistence; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - public class SoundEffectsVolume { - private static final Logger log = LogManager.getLogger(SoundEffectsVolume.class); - - private Persistence persistence = Persistence.getInstance(); - + private final Persistence persistence = Persistence.getInstance(); public void setSfxVolume(int volume){ persistence.getSettings().setSfxVolume(volume); diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/Sound/SoundFileManager.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/Sound/SoundFileManager.java index 374036a8ff834065a960166e5e82fa97b7bebb9e..9beacfbf10b361dbe9229e49dc65ed99c9045c14 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Model/Sound/SoundFileManager.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/Sound/SoundFileManager.java @@ -1,8 +1,5 @@ package de.hdm_stuttgart.battlearena.Model.Sound; -import org.apache.logging.log4j.Logger; -import org.apache.logging.log4j.LogManager; - import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; @@ -13,7 +10,6 @@ import java.util.stream.Collectors; import java.util.stream.Stream; class SoundFileManager { - private static final Logger log = LogManager.getLogger(SoundFileManager.class); protected List<Path> getFilePathsFromResources(Path folderPath) throws IOException { List<Path> result; try (Stream<Path> walk = Files.walk(folderPath)) { @@ -28,12 +24,10 @@ class SoundFileManager { int min = 0; int max = paths.size() - 1; int randomIndex = random.nextInt(max - min + 1 ) + min; - String randomPath = paths.get(randomIndex).toString(); - return randomPath; + return paths.get(randomIndex).toString(); } protected String convertPathToResourcePath(String randomPath){ String normalizedPath = Paths.get(randomPath).toString().replace('\\', '/'); - String resource = normalizedPath.substring(18); //18 = Begins at a at resourceFolder Level - return resource; + return normalizedPath.substring(18); } } diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/Sound/WalkEffects.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/Sound/WalkEffects.java index 8a7183ac456aaf490e6da256daf4118dcd88f488..4c5cdf1aa290ee25ea53e6296307861ffd4500c8 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Model/Sound/WalkEffects.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/Sound/WalkEffects.java @@ -13,12 +13,13 @@ import java.io.IOException; import java.nio.file.Path; import java.nio.file.Paths; import java.util.List; +import java.util.Objects; public class WalkEffects extends Thread{ private static final Logger log = LogManager.getLogger(WalkEffects.class); private GameSceneController gameSceneController; - private SoundFileManager fileManager = new SoundFileManager(); - private Persistence persistence = Persistence.getInstance(); + private final SoundFileManager fileManager = new SoundFileManager(); + private final Persistence persistence = Persistence.getInstance(); @Override public void run() { @@ -29,7 +30,7 @@ public class WalkEffects extends Thread{ int playerPosX = player.getMapPosX(); int playerPosY = player.getMapPosY(); int mapTile = map[playerPosY/48][playerPosX/48]; - SFXLoop sfx = tileSet[mapTile].getSoundeffect(); + SFXLoop sfx = tileSet[mapTile].getSoundEffect(); if(!(sfx == SFXLoop.NONE)) { Path path = Paths.get(sfx.getPath()); List<Path> sfxPaths = null; @@ -41,7 +42,7 @@ public class WalkEffects extends Thread{ String randomPath = fileManager.getRandomFilePath(sfxPaths); String resource = fileManager.convertPathToResourcePath(randomPath); - AudioClip effect = new AudioClip(getClass().getResource(resource).toString()); + AudioClip effect = new AudioClip(Objects.requireNonNull(getClass().getResource(resource)).toString()); effect.setVolume((double) persistence.getSettings().getSfxVolume() /100); effect.play(); diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java index 69c2210f37444080a8aa333616150fb0213c888e..cdcc19126a5093828ff6a7385daac63b5eed3fa2 100644 --- a/src/main/java/module-info.java +++ b/src/main/java/module-info.java @@ -19,6 +19,7 @@ module gui { opens de.hdm_stuttgart.battlearena.Controller.Utilities to javafx.fxml; opens de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.ENUMs to com.google.gson; + exports de.hdm_stuttgart.battlearena.Main; exports de.hdm_stuttgart.battlearena.Controller; exports de.hdm_stuttgart.battlearena.Model.Entity; @@ -27,7 +28,10 @@ module gui { exports de.hdm_stuttgart.battlearena.Controller.Utilities; exports de.hdm_stuttgart.battlearena.Model.Multiplayer; exports de.hdm_stuttgart.battlearena.Model.Entity.GameplayObjects to javafx.fxml; + exports de.hdm_stuttgart.battlearena.Model.Multiplayer.Utilities; exports de.hdm_stuttgart.battlearena.Model.Sound; exports de.hdm_stuttgart.battlearena.Model.DataStorage.Classes; exports de.hdm_stuttgart.battlearena.Controller.Enum; + exports de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.Exceptions; + exports de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.ENUMs; } \ No newline at end of file diff --git a/src/main/resources/fxml/GameScene.fxml b/src/main/resources/fxml/GameScene.fxml index fcac9451049054bb9d6bb1fd3f5234f2db55be84..69f148c14eb421bae8ee120b8063eb326cb8709d 100644 --- a/src/main/resources/fxml/GameScene.fxml +++ b/src/main/resources/fxml/GameScene.fxml @@ -64,10 +64,10 @@ <children> <Pane VBox.vgrow="ALWAYS" /> <Label text="Time:" /> - <Label fx:id="time" text="00:30" /> + <Label text="00:00" /> <Pane VBox.vgrow="ALWAYS" /> <Label text="Round:" /> - <Label fx:id="round" text="1/3" /> + <Label text="1/3" /> <Pane VBox.vgrow="ALWAYS" /> </children> </VBox> diff --git a/src/main/resources/fxml/MultiplayerCreate.fxml b/src/main/resources/fxml/MultiplayerCreate.fxml index d12125df3dd7a924880ef1b6ea27e85e567c9a40..9c714097d08c32d5e637f2325e0275e1770913f2 100644 --- a/src/main/resources/fxml/MultiplayerCreate.fxml +++ b/src/main/resources/fxml/MultiplayerCreate.fxml @@ -2,7 +2,7 @@ <?import javafx.geometry.Insets?> <?import javafx.scene.control.Button?> -<?import javafx.scene.control.RadioButton?> +<?import javafx.scene.control.Label?> <?import javafx.scene.control.TextField?> <?import javafx.scene.layout.AnchorPane?> <?import javafx.scene.layout.HBox?> @@ -13,33 +13,21 @@ <VBox fx:id="parent" alignment="CENTER" prefHeight="400.0" prefWidth="600.0" spacing="20.0" xmlns="http://javafx.com/javafx/21" xmlns:fx="http://javafx.com/fxml/1" fx:controller="de.hdm_stuttgart.battlearena.Controller.MultiplayerCreateController"> <children> <Pane VBox.vgrow="ALWAYS" /> + <Text strokeType="OUTSIDE" strokeWidth="0.0" text="Multiplayer demo test" /> <HBox alignment="TOP_CENTER" spacing="20.0"> <children> - <Text strokeType="OUTSIDE" strokeWidth="0.0" text="Text:" /> - <TextField alignment="CENTER" /> + <Text strokeType="OUTSIDE" strokeWidth="0.0" text="IP-Adresse:" /> + <TextField fx:id="ip" alignment="CENTER" /> </children> <VBox.margin> <Insets top="50.0" /> </VBox.margin> </HBox> - <HBox alignment="TOP_CENTER" maxWidth="-Infinity" spacing="20.0"> - <children> - <Text strokeType="OUTSIDE" strokeWidth="0.0" text="Text:" /> - <TextField alignment="CENTER" /> - </children> - </HBox> - <HBox alignment="TOP_CENTER" spacing="10.0"> - <children> - <Text strokeType="OUTSIDE" strokeWidth="0.0" text="Text:" /> - <RadioButton mnemonicParsing="false" text="Yes" /> - <RadioButton mnemonicParsing="false" text="No" /> - </children> - </HBox> <AnchorPane minHeight="-Infinity" prefHeight="39.0" prefWidth="600.0"> <children> <VBox alignment="TOP_CENTER" layoutX="250.0" prefHeight="200.0" prefWidth="100.0" AnchorPane.leftAnchor="250.0" AnchorPane.rightAnchor="250.0"> <children> - <Text strokeType="OUTSIDE" strokeWidth="0.0" text="Text" /> + <Label fx:id="errorMessage" /> </children> </VBox> </children> @@ -47,7 +35,7 @@ <Insets top="20.0" /> </VBox.margin> </AnchorPane> - <Button mnemonicParsing="false" text="Start" /> + <Button mnemonicParsing="false" onAction="#start" text="Start" /> <Button mnemonicParsing="false" onAction="#backButton" text="Back" /> <Pane VBox.vgrow="ALWAYS" /> <Pane VBox.vgrow="ALWAYS" /> diff --git a/src/main/resources/fxml/MultiplayerJoin.fxml b/src/main/resources/fxml/MultiplayerJoin.fxml index 50328301d12e960ca362bc1a19d067f58d41a4d9..df006bb5e12a3979e4744b1bef644c4de09d29e6 100644 --- a/src/main/resources/fxml/MultiplayerJoin.fxml +++ b/src/main/resources/fxml/MultiplayerJoin.fxml @@ -1,6 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <?import javafx.scene.control.Button?> +<?import javafx.scene.control.Label?> <?import javafx.scene.control.TextField?> <?import javafx.scene.layout.Pane?> <?import javafx.scene.layout.VBox?> @@ -10,9 +11,9 @@ <children> <Pane maxHeight="1.7976931348623157E308" prefHeight="200.0" prefWidth="200.0" /> <Text strokeType="OUTSIDE" strokeWidth="0.0" text="IP Adress:" /> - <TextField alignment="CENTER" maxWidth="-Infinity" /> - <Button mnemonicParsing="false" text="Connect" VBox.vgrow="ALWAYS" /> - <Text strokeType="OUTSIDE" strokeWidth="0.0" text="[Error Message]" /> + <TextField fx:id="ip" alignment="CENTER" maxWidth="-Infinity" /> + <Button mnemonicParsing="false" onAction="#connect" text="Connect" VBox.vgrow="ALWAYS" /> + <Label fx:id="errorMessage" alignment="CENTER" contentDisplay="CENTER" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" wrapText="true" VBox.vgrow="ALWAYS" /> <Pane maxHeight="1.7976931348623157E308" prefHeight="200.0" prefWidth="200.0" VBox.vgrow="ALWAYS" /> <Button alignment="CENTER" mnemonicParsing="false" onAction="#backButton" text="Back" /> <Pane maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" prefHeight="20.0" VBox.vgrow="ALWAYS" /> diff --git a/src/main/resources/fxml/SkinSelectionMultiplayer.fxml b/src/main/resources/fxml/SkinSelectionMultiplayer.fxml new file mode 100644 index 0000000000000000000000000000000000000000..6cbd1f4fa4eda9d1119884b20551244c8c286a71 --- /dev/null +++ b/src/main/resources/fxml/SkinSelectionMultiplayer.fxml @@ -0,0 +1,52 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<?import javafx.scene.control.Button?> +<?import javafx.scene.control.Label?> +<?import javafx.scene.control.ToggleButton?> +<?import javafx.scene.control.ToggleGroup?> +<?import javafx.scene.image.Image?> +<?import javafx.scene.image.ImageView?> +<?import javafx.scene.layout.HBox?> +<?import javafx.scene.layout.VBox?> + +<VBox fx:id="parent" alignment="CENTER" prefHeight="400.0" prefWidth="600.0" spacing="20.0" xmlns="http://javafx.com/javafx/21" xmlns:fx="http://javafx.com/fxml/1" fx:controller="de.hdm_stuttgart.battlearena.Controller.SkinSelectionMultiplayerController"> + <children> + <Label text="Select a character" /> + <HBox alignment="CENTER" prefHeight="100.0" prefWidth="200.0" spacing="40.0"> + <children> + <ToggleButton contentDisplay="TOP" mnemonicParsing="false" styleClass="skinSelection" text="High Born"> + <graphic> + <ImageView fx:id="selection1" fitHeight="700.0" fitWidth="700.0" pickOnBounds="true" preserveRatio="true"> + <image> + <Image url="@../textures/player/high_res/highBorn.png" /> + </image> + </ImageView> + </graphic> + <toggleGroup> + <ToggleGroup fx:id="toggleGroup" /> + </toggleGroup> + </ToggleButton> + <ToggleButton contentDisplay="TOP" mnemonicParsing="false" styleClass="skinSelection" text="Human" toggleGroup="$toggleGroup"> + <graphic> + <ImageView fx:id="selection2" fitHeight="700.0" fitWidth="700.0" pickOnBounds="true" preserveRatio="true"> + <image> + <Image url="@../textures/player/high_res/human.png" /> + </image> + </ImageView> + </graphic> + </ToggleButton> + <ToggleButton contentDisplay="TOP" mnemonicParsing="false" styleClass="skinSelection" text="Sentinel" toggleGroup="$toggleGroup"> + <graphic> + <ImageView fx:id="selection3" fitHeight="700.0" fitWidth="700.0" pickOnBounds="true" preserveRatio="true"> + <image> + <Image url="@../textures/player/high_res/sentinel.png" /> + </image> + </ImageView> + </graphic> + </ToggleButton> + </children> + </HBox> + <Button mnemonicParsing="false" onAction="#gameScene" text="Next" /> + <Button mnemonicParsing="false" onAction="#backButton" text="Back" /> + </children> +</VBox> diff --git a/src/main/resources/player/appSettings.json b/src/main/resources/player/appSettings.json index 921bbf90278d492de2b539de81a82125ac7e11d6..ac6b7e58fa58ee25e2070c5cdfb9b8324bdddc6b 100644 --- a/src/main/resources/player/appSettings.json +++ b/src/main/resources/player/appSettings.json @@ -1,4 +1,4 @@ { - "sfxVolume": 46, - "musicVolume": 46 + "sfxVolume": 50, + "musicVolume": 50 } \ No newline at end of file diff --git a/src/main/resources/player/playerAccount.json b/src/main/resources/player/playerAccount.json index 21486d136b1a3c3d8208708e1b4fbc47b86c115d..9a62cf578b5cf130a5df3b05ca58d9b120c9e6ae 100644 --- a/src/main/resources/player/playerAccount.json +++ b/src/main/resources/player/playerAccount.json @@ -1,5 +1,5 @@ { - "playerName": "Mikazu", - "accountPassword": "a78ee63a19597e48bce0b72d6079b8cfa5b6c976", - "accountType": "ONLINE" + "playerName": "", + "accountPassword": "", + "accountType": "NONE" } \ No newline at end of file diff --git a/src/main/resources/textures/player/high_born/HighBornLeft00.png b/src/main/resources/textures/player/high_born/HighBornLeft00.png new file mode 100644 index 0000000000000000000000000000000000000000..193e2793a8d393c40bd664f2c63fa94fec490871 Binary files /dev/null and b/src/main/resources/textures/player/high_born/HighBornLeft00.png differ diff --git a/src/main/resources/textures/player/high_born/HighBornLeft01.png b/src/main/resources/textures/player/high_born/HighBornLeft01.png new file mode 100644 index 0000000000000000000000000000000000000000..88351737d1c88425b50fab1f4adee8d58fe6f542 Binary files /dev/null and b/src/main/resources/textures/player/high_born/HighBornLeft01.png differ diff --git a/src/main/resources/textures/player/high_born/HighBornRight00.png b/src/main/resources/textures/player/high_born/HighBornRight00.png new file mode 100644 index 0000000000000000000000000000000000000000..4bdaedb2875887d116078749083287178d7f3ea4 Binary files /dev/null and b/src/main/resources/textures/player/high_born/HighBornRight00.png differ diff --git a/src/main/resources/textures/player/high_born/HighBornRight01.png b/src/main/resources/textures/player/high_born/HighBornRight01.png new file mode 100644 index 0000000000000000000000000000000000000000..ad61763d16ede5343988afd6b7d43e175eb816b2 Binary files /dev/null and b/src/main/resources/textures/player/high_born/HighBornRight01.png differ diff --git a/src/main/resources/textures/player/high_born/HighBornUp00.png b/src/main/resources/textures/player/high_born/HighBornUp00.png new file mode 100644 index 0000000000000000000000000000000000000000..472dbe8910d5fe29a33d12b8fc2e08e543dd1b39 Binary files /dev/null and b/src/main/resources/textures/player/high_born/HighBornUp00.png differ diff --git a/src/main/resources/textures/player/high_born/HighBornUp01.png b/src/main/resources/textures/player/high_born/HighBornUp01.png new file mode 100644 index 0000000000000000000000000000000000000000..6b75b7bb9c4782f08a9df99868d46e79a1c6c9b2 Binary files /dev/null and b/src/main/resources/textures/player/high_born/HighBornUp01.png differ diff --git a/src/main/resources/textures/player/sentinels/SentinelLeft00.png b/src/main/resources/textures/player/sentinels/SentinelLeft00.png new file mode 100644 index 0000000000000000000000000000000000000000..8eacc435ee4dace2b91edafabd1f899172ad6e4f Binary files /dev/null and b/src/main/resources/textures/player/sentinels/SentinelLeft00.png differ diff --git a/src/main/resources/textures/player/sentinels/SentinelLeft01.png b/src/main/resources/textures/player/sentinels/SentinelLeft01.png new file mode 100644 index 0000000000000000000000000000000000000000..4af0e22a9ab12a12f9a9be7341d788fa91eee276 Binary files /dev/null and b/src/main/resources/textures/player/sentinels/SentinelLeft01.png differ diff --git a/src/main/resources/textures/player/sentinels/SentinelRight00.png b/src/main/resources/textures/player/sentinels/SentinelRight00.png new file mode 100644 index 0000000000000000000000000000000000000000..fc0148e611b10c843834f512efb0ca2dc7686329 Binary files /dev/null and b/src/main/resources/textures/player/sentinels/SentinelRight00.png differ diff --git a/src/main/resources/textures/player/sentinels/SentinelRight01.png b/src/main/resources/textures/player/sentinels/SentinelRight01.png new file mode 100644 index 0000000000000000000000000000000000000000..b8ba03c3ee0247b87e1bc077bba179b554a22867 Binary files /dev/null and b/src/main/resources/textures/player/sentinels/SentinelRight01.png differ diff --git a/src/main/resources/textures/player/sentinels/SentinelUp00.png b/src/main/resources/textures/player/sentinels/SentinelUp00.png new file mode 100644 index 0000000000000000000000000000000000000000..f6d4c22d631e96f85f6f6e0914fae2c6e1556fbc Binary files /dev/null and b/src/main/resources/textures/player/sentinels/SentinelUp00.png differ diff --git a/src/main/resources/textures/player/sentinels/SentinelUp01.png b/src/main/resources/textures/player/sentinels/SentinelUp01.png new file mode 100644 index 0000000000000000000000000000000000000000..b9e36ac5ae3221b359417f50ba48835809d1bb2b Binary files /dev/null and b/src/main/resources/textures/player/sentinels/SentinelUp01.png differ diff --git a/src/test/java/SoundEffectsTest.java b/src/test/java/SoundEffectsTest.java deleted file mode 100644 index 890ff6f49ac91687c757a08f287fc34d7396bfcf..0000000000000000000000000000000000000000 --- a/src/test/java/SoundEffectsTest.java +++ /dev/null @@ -1,43 +0,0 @@ -import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.Exceptions.DatabaseException; -import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.Persistence; -import de.hdm_stuttgart.battlearena.Model.Sound.SoundEffectsVolume; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import org.junit.jupiter.api.BeforeEach; - -public class SoundEffectsTest { - private static final Logger log = LogManager.getLogger(SoundEffectsTest.class); - - private SoundEffectsVolume soundEffects; - private Persistence persistence; - - @BeforeEach - void SetUp(){ - soundEffects = new SoundEffectsVolume(); - persistence = Persistence.getInstance(); - try { - persistence.loadSettings(); - } catch (DatabaseException e) { - throw new RuntimeException(e); - } - } - - - /*void playSoundEffectOnceTest(){ - soundEffects.playSoundEffectOnce(SFX.BOMB); - Assertions.assertTrue(soundEffects.isSoundEffectPlayedTest()); - } - - @Test - void playSoundEffectOnceVolumeTest(){ - soundEffects.playSoundEffectOnce(SFX.SWORD_HIT); - soundEffects.setSfxVolume(50); - Assertions.assertAll(()->{ - Assertions.assertTrue(soundEffects.isSoundEffectPlayedTest()); - Assertions.assertEquals(50, persistence.getSettings().getSfxVolume()); - }); - }*/ - - - -} diff --git a/src/test/java/de/hdm_stuttgart/battlearena/Model/Multiplayer/ConnectionHandlerTest.java b/src/test/java/de/hdm_stuttgart/battlearena/Model/Multiplayer/ConnectionHandlerTest.java index fa4a0e2aee3c7a7338b65f7c61f830c171e7cb36..c4b558a00b8f92e604fe2a1a554788da42faaa8d 100644 --- a/src/test/java/de/hdm_stuttgart/battlearena/Model/Multiplayer/ConnectionHandlerTest.java +++ b/src/test/java/de/hdm_stuttgart/battlearena/Model/Multiplayer/ConnectionHandlerTest.java @@ -49,95 +49,95 @@ class ConnectionHandlerTest { @Test void getPlayerAttacking() { - assertEquals(true,ConnectionHandler.getPlayerAttacking()); + assertEquals(true,handler.getPlayerAttacking()); } @Test void setPlayerAttacking() { - ConnectionHandler.setPlayerAttacking(false); - assertEquals(false,ConnectionHandler.getPlayerAttacking()); - ConnectionHandler.setPlayerAttacking(true); + handler.setPlayerAttacking(false); + assertEquals(false,handler.getPlayerAttacking()); + handler.setPlayerAttacking(true); } @Test void getEnemyAttacking() { - assertEquals(false,ConnectionHandler.getEnemyAttacking()); + assertEquals(false,handler.getEnemyAttacking()); } @Test void setEnemyAttacking() { - ConnectionHandler.setEnemyAttacking(true); - assertEquals(true,ConnectionHandler.getEnemyAttacking()); - ConnectionHandler.setEnemyAttacking(false); + handler.setEnemyAttacking(true); + assertEquals(true,handler.getEnemyAttacking()); + handler.setEnemyAttacking(false); } @Test void getPlayerClass() { - assertEquals(EntityClass.HUMAN, ConnectionHandler.getPlayerClass()); + assertEquals(EntityClass.HUMAN, handler.getPlayerClass()); } @Test void setPlayerClass() { - ConnectionHandler.setPlayerClass(EntityClass.HIGH_BORN); - assertEquals(EntityClass.HIGH_BORN, ConnectionHandler.getPlayerClass()); - ConnectionHandler.setPlayerClass(EntityClass.HUMAN); + handler.setPlayerClass(EntityClass.HIGH_BORN); + assertEquals(EntityClass.HIGH_BORN, handler.getPlayerClass()); + handler.setPlayerClass(EntityClass.HUMAN); } @Test void getEnemyClass() { - assertEquals(EntityClass.HUMAN, ConnectionHandler.getEnemyClass()); + assertEquals(EntityClass.HUMAN, handler.getEnemyClass()); } @Test void setEnemyClass() { - ConnectionHandler.setEnemyClass(EntityClass.HIGH_BORN); - assertEquals(EntityClass.HIGH_BORN, ConnectionHandler.getEnemyClass()); - ConnectionHandler.setEnemyClass(EntityClass.HUMAN); + handler.setEnemyClass(EntityClass.HIGH_BORN); + assertEquals(EntityClass.HIGH_BORN, handler.getEnemyClass()); + handler.setEnemyClass(EntityClass.HUMAN); } @Test void getPlayerWalkDirection() { - assertEquals(EntityDirection.DOWN, ConnectionHandler.getPlayerWalkDirection()); + assertEquals(EntityDirection.DOWN, handler.getPlayerWalkDirection()); } @Test void setPlayerWalkDirection() { - ConnectionHandler.setPlayerWalkDirection(EntityDirection.UP); - assertEquals(EntityDirection.UP, ConnectionHandler.getPlayerWalkDirection()); - ConnectionHandler.setPlayerWalkDirection(EntityDirection.DOWN); + handler.setPlayerWalkDirection(EntityDirection.UP); + assertEquals(EntityDirection.UP, handler.getPlayerWalkDirection()); + handler.setPlayerWalkDirection(EntityDirection.DOWN); } @Test void getEnemyWalkDirection() { - assertEquals(EntityDirection.DOWN, ConnectionHandler.getPlayerWalkDirection()); + assertEquals(EntityDirection.DOWN, handler.getPlayerWalkDirection()); } @Test void setEnemyWalkDirection() { - ConnectionHandler.setEnemyWalkDirection(EntityDirection.UP); - assertEquals(EntityDirection.UP, ConnectionHandler.getEnemyWalkDirection()); + handler.setEnemyWalkDirection(EntityDirection.UP); + assertEquals(EntityDirection.UP, handler.getEnemyWalkDirection()); } @Test void getPlayerHealth() { - assertEquals(10, ConnectionHandler.getPlayerHealth()); + assertEquals(10, handler.getPlayerHealth()); } @Test void setPlayerHealth() { - ConnectionHandler.setPlayerHealth(5); - assertEquals(5, ConnectionHandler.getPlayerHealth()); + handler.setPlayerHealth(5); + assertEquals(5, handler.getPlayerHealth()); } @Test void getEnemyHealth() { - assertEquals(10, ConnectionHandler.getEnemyHealth()); + assertEquals(10, handler.getEnemyHealth()); } @Test void setEnemyHealth() { - ConnectionHandler.setEnemyHealth(5); - assertEquals(5, ConnectionHandler.getEnemyHealth()); + handler.setEnemyHealth(5); + assertEquals(5, handler.getEnemyHealth()); } } \ No newline at end of file diff --git a/src/test/java/de/hdm_stuttgart/battlearena/Model/Multiplayer/Utilities/IPAddressValidatorTest.java b/src/test/java/de/hdm_stuttgart/battlearena/Model/Multiplayer/Utilities/IPAddressValidatorTest.java new file mode 100644 index 0000000000000000000000000000000000000000..25760d673c71f7a0a9fe48b0c2836632748bcd18 --- /dev/null +++ b/src/test/java/de/hdm_stuttgart/battlearena/Model/Multiplayer/Utilities/IPAddressValidatorTest.java @@ -0,0 +1,14 @@ +package de.hdm_stuttgart.battlearena.Model.Multiplayer.Utilities; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class IPAddressValidatorTest { + + @Test + void validate() { + assertTrue(IPAddressValidator.validate("192.168.0.1")); + assertFalse(IPAddressValidator.validate("aaabbb")); + } +} \ No newline at end of file diff --git a/src/test/java/MusicPlayerTest.java b/src/test/java/de/hdm_stuttgart/battlearena/Model/Sound/MusicPlayerTest.java similarity index 78% rename from src/test/java/MusicPlayerTest.java rename to src/test/java/de/hdm_stuttgart/battlearena/Model/Sound/MusicPlayerTest.java index e1f7d5829785962f744ae4c0ab7dd6ef8f7c51ec..376ac88464fa7010d91c31a8f97069a5b316fd65 100644 --- a/src/test/java/MusicPlayerTest.java +++ b/src/test/java/de/hdm_stuttgart/battlearena/Model/Sound/MusicPlayerTest.java @@ -1,19 +1,15 @@ +package de.hdm_stuttgart.battlearena.Model.Sound; + import de.hdm_stuttgart.battlearena.Controller.Enum.GameState; import de.hdm_stuttgart.battlearena.Main.Driver; import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.Exceptions.DatabaseException; 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; -import javafx.application.Application; import javafx.application.Platform; import javafx.scene.media.MediaPlayer; -import javafx.stage.Stage; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.*; import org.testfx.api.FxToolkit; import java.util.concurrent.TimeUnit; @@ -21,19 +17,29 @@ import java.util.concurrent.TimeoutException; import static org.testfx.util.WaitForAsyncUtils.sleep; -public class MusicPlayerTest extends Application { +public class MusicPlayerTest { private static final Logger log = LogManager.getLogger(MusicPlayerTest.class); - Persistence persistence; - RuntimeInfo runtimeInfo; - MusicPlayer musicPlayer; - @BeforeEach - void setup(){ - persistence = Persistence.getInstance(); - musicPlayer = MusicPlayer.getInstance(); - runtimeInfo = RuntimeInfo.getInstance(); + private static Persistence persistence; + private static RuntimeInfo runtimeInfo; + private static MusicPlayer musicPlayer; + + @BeforeAll + static void setUpClass() { + try { + FxToolkit.registerPrimaryStage(); + } catch (TimeoutException e) { + throw new RuntimeException(e); + } + + } + + @BeforeAll + static void setUp() { + persistence = Persistence.getInstance(); + musicPlayer = MusicPlayer.getInstance(); + runtimeInfo = RuntimeInfo.getInstance(); - runtimeInfo.setGameState(GameState.NONE); try { persistence.loadSettings(); } catch (DatabaseException e) { @@ -41,16 +47,16 @@ public class MusicPlayerTest extends Application { } try { - FxToolkit.registerPrimaryStage(); + FxToolkit.setupApplication(() -> new Driver()); } catch (TimeoutException e) { throw new RuntimeException(e); } + } - @AfterEach - void tearDown(){ + @AfterAll + static void tearDownClass() { runtimeInfo.setGameState(GameState.NONE); - musicPlayer.getScheduler().shutdown(); try { FxToolkit.cleanupStages(); } catch (TimeoutException e) { @@ -58,23 +64,21 @@ public class MusicPlayerTest extends Application { } } - @Test - void startMusicTest(){ + public void startMusicTest() { Platform.runLater(()->{ musicPlayer.startGameStateMonitoring(); runtimeInfo.setGameState(GameState.MENU); }); sleep(200, TimeUnit.MILLISECONDS); - - MediaPlayer player = musicPlayer.getMediaPlayer(); + MediaPlayer mediaPlayer = musicPlayer.getMediaPlayer(); Assertions.assertAll(()->{ // Test: Gamestate wird geupdatet in der Runtimeinfo sowie in der MusicPlayer-Klasse Assertions.assertEquals(GameState.MENU, runtimeInfo.getGameState()); Assertions.assertEquals(GameState.MENU, musicPlayer.getMusicPlayerGameState()); - Assertions.assertNotNull(player); - Assertions.assertEquals(MediaPlayer.Status.PLAYING, player.getStatus()); + Assertions.assertNotNull(mediaPlayer); + Assertions.assertEquals(MediaPlayer.Status.PLAYING, mediaPlayer.getStatus()); }); } @@ -88,7 +92,7 @@ public class MusicPlayerTest extends Application { runtimeInfo.setGameState(GameState.TEST); }); }); - Assertions.assertTrue(musicPlayer.getMediaPlayer() == null); + }); } @@ -128,8 +132,4 @@ public class MusicPlayerTest extends Application { }); } - @Override - public void start(Stage stage) throws Exception { - new Driver().start(stage); - } } diff --git a/src/test/java/de/hdm_stuttgart/battlearena/Model/Sound/SfxOnceTest.java b/src/test/java/de/hdm_stuttgart/battlearena/Model/Sound/SfxOnceTest.java new file mode 100644 index 0000000000000000000000000000000000000000..637676bfe529fa41380ef3ddad67c04a04e6e85f --- /dev/null +++ b/src/test/java/de/hdm_stuttgart/battlearena/Model/Sound/SfxOnceTest.java @@ -0,0 +1,83 @@ +package de.hdm_stuttgart.battlearena.Model.Sound; + +import de.hdm_stuttgart.battlearena.Main.Driver; +import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.Exceptions.DatabaseException; +import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.Persistence; +import javafx.application.Platform; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.testfx.api.FxToolkit; + +import java.util.concurrent.TimeoutException; + +public class SfxOnceTest { + private static final Logger log = LogManager.getLogger(SfxOnceTest.class); + + private static SoundEffectsVolume soundEffectsVolume; + private static Persistence persistence; + SfxOnce sfx; + + @BeforeAll + public static void setUpClass() { + try { + FxToolkit.registerPrimaryStage(); + } catch (TimeoutException e) { + throw new RuntimeException(e); + } + } + + @BeforeAll + public static void setUp(){ + persistence = Persistence.getInstance(); + soundEffectsVolume = new SoundEffectsVolume(); + + try { + persistence.loadSettings(); + } catch (DatabaseException e) { + throw new RuntimeException(e); + } + + try { + FxToolkit.setupApplication(() -> new Driver()); + } catch (TimeoutException e) { + throw new RuntimeException(e); + } + } + + @AfterAll + public static void tearDownClass(){ + try { + FxToolkit.cleanupStages(); + } catch (TimeoutException e) { + throw new RuntimeException(e); + } + } + + @Test + public void startOTSFXTest(){ + sfx = new SfxOnce(); + Platform.runLater(() -> { + sfx.startSound(SFX.BOMB); + }); + + Assertions.assertFalse(sfx.isNotPlaying()); + } + + @Test + public void setSoundEffectsVolumeTest(){ + sfx = new SfxOnce(); + Platform.runLater(()->{ + sfx.startSound(SFX.COIN_COLLECTED); + }); + soundEffectsVolume.setSfxVolume(50); + + Assertions.assertAll(()->{ + Assertions.assertEquals(50, persistence.getSettings().getSfxVolume()); + Assertions.assertFalse(sfx.isNotPlaying()); + }); + } +}