diff --git a/client/package.bat b/client/package.bat
new file mode 100644
index 0000000..83c5cc0
--- /dev/null
+++ b/client/package.bat
@@ -0,0 +1,9 @@
+cd target
+jpackage^
+ --type exe^
+ --name "Ace-of-Shades"^
+ --description "Top-down 2D shooter game inspired by Ace of Spades."^
+ --module-path "aos-client-3.1.jar;../../core/target/aos-core-3.1.jar"^
+ --module aos_client/nl.andrewlalis.aos_client.Client^
+ --win-shortcut^
+ --win-dir-chooser
\ No newline at end of file
diff --git a/client/src/main/java/nl/andrewlalis/aos_client/SoundManager.java b/client/src/main/java/nl/andrewlalis/aos_client/SoundManager.java
index 5d030b2..cff5895 100644
--- a/client/src/main/java/nl/andrewlalis/aos_client/SoundManager.java
+++ b/client/src/main/java/nl/andrewlalis/aos_client/SoundManager.java
@@ -21,7 +21,7 @@ public class SoundManager {
private Clip getClip(String sound) {
var soundBytes = this.soundData.get(sound);
if (soundBytes == null) {
- InputStream is = Client.class.getResourceAsStream("/sound/" + sound);
+ InputStream is = Client.class.getResourceAsStream("/nl/andrewlalis/aos_client/sound/" + sound);
if (is == null) {
System.err.println("Could not load sound: " + sound);
return null;
diff --git a/client/src/main/java/nl/andrewlalis/aos_client/view/GameFrame.java b/client/src/main/java/nl/andrewlalis/aos_client/view/GameFrame.java
index 5a1e76a..665a0f8 100644
--- a/client/src/main/java/nl/andrewlalis/aos_client/view/GameFrame.java
+++ b/client/src/main/java/nl/andrewlalis/aos_client/view/GameFrame.java
@@ -16,7 +16,7 @@ public class GameFrame extends JFrame {
public GameFrame(String title, Client client, GamePanel gamePanel) throws HeadlessException {
super(title);
this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
- InputStream iconInputStream = GameFrame.class.getClassLoader().getResourceAsStream("icon.png");
+ InputStream iconInputStream = GameFrame.class.getClassLoader().getResourceAsStream("/nl/andrewlalis/aos_client/icon.png");
if (iconInputStream != null) {
try {
this.setIconImage(ImageIO.read(iconInputStream));
diff --git a/client/src/main/resources/icon.png b/client/src/main/resources/nl/andrewlalis/aos_client/icon.png
similarity index 100%
rename from client/src/main/resources/icon.png
rename to client/src/main/resources/nl/andrewlalis/aos_client/icon.png
diff --git a/client/src/main/resources/sound/ak47shot1.wav b/client/src/main/resources/nl/andrewlalis/aos_client/sound/ak47shot1.wav
similarity index 100%
rename from client/src/main/resources/sound/ak47shot1.wav
rename to client/src/main/resources/nl/andrewlalis/aos_client/sound/ak47shot1.wav
diff --git a/client/src/main/resources/sound/bullet_impact_1.wav b/client/src/main/resources/nl/andrewlalis/aos_client/sound/bullet_impact_1.wav
similarity index 100%
rename from client/src/main/resources/sound/bullet_impact_1.wav
rename to client/src/main/resources/nl/andrewlalis/aos_client/sound/bullet_impact_1.wav
diff --git a/client/src/main/resources/sound/bullet_impact_2.wav b/client/src/main/resources/nl/andrewlalis/aos_client/sound/bullet_impact_2.wav
similarity index 100%
rename from client/src/main/resources/sound/bullet_impact_2.wav
rename to client/src/main/resources/nl/andrewlalis/aos_client/sound/bullet_impact_2.wav
diff --git a/client/src/main/resources/sound/bullet_impact_3.wav b/client/src/main/resources/nl/andrewlalis/aos_client/sound/bullet_impact_3.wav
similarity index 100%
rename from client/src/main/resources/sound/bullet_impact_3.wav
rename to client/src/main/resources/nl/andrewlalis/aos_client/sound/bullet_impact_3.wav
diff --git a/client/src/main/resources/sound/bullet_impact_4.wav b/client/src/main/resources/nl/andrewlalis/aos_client/sound/bullet_impact_4.wav
similarity index 100%
rename from client/src/main/resources/sound/bullet_impact_4.wav
rename to client/src/main/resources/nl/andrewlalis/aos_client/sound/bullet_impact_4.wav
diff --git a/client/src/main/resources/sound/bullet_impact_5.wav b/client/src/main/resources/nl/andrewlalis/aos_client/sound/bullet_impact_5.wav
similarity index 100%
rename from client/src/main/resources/sound/bullet_impact_5.wav
rename to client/src/main/resources/nl/andrewlalis/aos_client/sound/bullet_impact_5.wav
diff --git a/client/src/main/resources/sound/chat.wav b/client/src/main/resources/nl/andrewlalis/aos_client/sound/chat.wav
similarity index 100%
rename from client/src/main/resources/sound/chat.wav
rename to client/src/main/resources/nl/andrewlalis/aos_client/sound/chat.wav
diff --git a/client/src/main/resources/sound/death.wav b/client/src/main/resources/nl/andrewlalis/aos_client/sound/death.wav
similarity index 100%
rename from client/src/main/resources/sound/death.wav
rename to client/src/main/resources/nl/andrewlalis/aos_client/sound/death.wav
diff --git a/client/src/main/resources/sound/m1garand-shot1.wav b/client/src/main/resources/nl/andrewlalis/aos_client/sound/m1garand-shot1.wav
similarity index 100%
rename from client/src/main/resources/sound/m1garand-shot1.wav
rename to client/src/main/resources/nl/andrewlalis/aos_client/sound/m1garand-shot1.wav
diff --git a/client/src/main/resources/sound/reload.wav b/client/src/main/resources/nl/andrewlalis/aos_client/sound/reload.wav
similarity index 100%
rename from client/src/main/resources/sound/reload.wav
rename to client/src/main/resources/nl/andrewlalis/aos_client/sound/reload.wav
diff --git a/client/src/main/resources/sound/shotgun-shot1.wav b/client/src/main/resources/nl/andrewlalis/aos_client/sound/shotgun-shot1.wav
similarity index 100%
rename from client/src/main/resources/sound/shotgun-shot1.wav
rename to client/src/main/resources/nl/andrewlalis/aos_client/sound/shotgun-shot1.wav
diff --git a/pom.xml b/pom.xml
index aaa1af8..4cd0375 100644
--- a/pom.xml
+++ b/pom.xml
@@ -17,6 +17,9 @@
16
16
+ 16
+ 16
+ UTF-8
diff --git a/server/src/main/java/nl/andrewlalis/aos_server/ClientHandler.java b/server/src/main/java/nl/andrewlalis/aos_server/ClientHandler.java
index 21269ea..fb69e58 100644
--- a/server/src/main/java/nl/andrewlalis/aos_server/ClientHandler.java
+++ b/server/src/main/java/nl/andrewlalis/aos_server/ClientHandler.java
@@ -50,6 +50,7 @@ public class ClientHandler extends Thread {
}
public void send(Message message) {
+ if (this.socket.isClosed()) return;
this.sendingQueue.submit(() -> {
try {
this.out.reset();