diff --git a/src/main/java/lab/game/Background.java b/src/main/java/lab/game/Background.java index 0f718ac5bd312ebc19e607a7bf30b4afe8a04112..606964f7b81e571963761f36f38f3b99daacc449 100644 --- a/src/main/java/lab/game/Background.java +++ b/src/main/java/lab/game/Background.java @@ -1,11 +1,16 @@ package lab.game; +import java.io.Serial; + import javafx.scene.canvas.GraphicsContext; import javafx.scene.image.Image; import javafx.scene.paint.Color; public class Background extends WorldEntity { + @Serial + private static final long serialVersionUID = 2566936061563448971L; + private MyPoint[] imagePosition; private static Image[] image; private MyPoint speed; diff --git a/src/main/java/lab/game/Boat.java b/src/main/java/lab/game/Boat.java index bf84c337565ff7395059cd41bcf3c53c5631880c..34cd894fe348aa2c4c1f20613320e0fc2e2a681a 100644 --- a/src/main/java/lab/game/Boat.java +++ b/src/main/java/lab/game/Boat.java @@ -1,5 +1,6 @@ package lab.game; +import java.io.Serial; import java.util.Random; import javafx.geometry.Rectangle2D; @@ -9,6 +10,9 @@ import lab.Setup; public class Boat extends WorldEntity implements Collisionable { + @Serial + private static final long serialVersionUID = -8233882073179438194L; + private static final Random RANDOM = new Random(); private MyPoint speed; private static Image image; diff --git a/src/main/java/lab/game/LochNess.java b/src/main/java/lab/game/LochNess.java index b1a50e7ef17514a171722c41a8a418833ca10e4e..da4aceb9ab7f4141850b0f6baed8d415c13108ca 100644 --- a/src/main/java/lab/game/LochNess.java +++ b/src/main/java/lab/game/LochNess.java @@ -1,5 +1,6 @@ package lab.game; +import java.io.Serial; import java.util.ArrayList; import java.util.List; import java.util.Random; @@ -7,6 +8,7 @@ import java.util.Random; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; + import javafx.geometry.Rectangle2D; import javafx.scene.canvas.GraphicsContext; import javafx.scene.image.Image; @@ -14,13 +16,16 @@ import lab.Setup; public class LochNess extends WorldEntity implements Collisionable { + @Serial + private static final long serialVersionUID = 5976652721811221254L; + private static Logger log = LogManager.getLogger(LochNess.class); private static final Random RANDOM = new Random(); private MyPoint speed; private static Image image; - private List<DeadListener> deadListeners = new ArrayList<>(); + private transient List<DeadListener> deadListeners = new ArrayList<>(); public LochNess(Scene scene) { super(scene, new MyPoint(0, 0), 90); diff --git a/src/main/java/lab/game/MyDimension.java b/src/main/java/lab/game/MyDimension.java index d5838b2ff907dd613a078058ee02a7495500b105..20cb459c8816555b7a83e5edc0765f62c651948a 100644 --- a/src/main/java/lab/game/MyDimension.java +++ b/src/main/java/lab/game/MyDimension.java @@ -1,11 +1,17 @@ package lab.game; +import java.io.Serial; +import java.io.Serializable; + import lombok.AllArgsConstructor; import lombok.Getter; @AllArgsConstructor @Getter -public class MyDimension { +public class MyDimension implements Serializable { + + @Serial + private static final long serialVersionUID = -4053578370437363200L; private double width; diff --git a/src/main/java/lab/game/MyPoint.java b/src/main/java/lab/game/MyPoint.java index 721a676cc1f3c5d7a2fbd4612c011591480b9965..265ed63439f69a47bc520d87dfcc70b9784bff2e 100644 --- a/src/main/java/lab/game/MyPoint.java +++ b/src/main/java/lab/game/MyPoint.java @@ -1,6 +1,12 @@ package lab.game; -public class MyPoint { +import java.io.Serial; +import java.io.Serializable; + +public class MyPoint implements Serializable { + + @Serial + private static final long serialVersionUID = 5131948780897974323L; public double x; public double y; diff --git a/src/main/java/lab/game/Rock.java b/src/main/java/lab/game/Rock.java index 0337ce60538cf6b2c9e6ec9b6a084601ca742ff9..a3a2f4afd38b3c7d281fb7c8a1baa2623c685bb4 100644 --- a/src/main/java/lab/game/Rock.java +++ b/src/main/java/lab/game/Rock.java @@ -1,5 +1,6 @@ package lab.game; +import java.io.Serial; import java.util.Random; import javafx.scene.canvas.GraphicsContext; @@ -10,6 +11,9 @@ import javafx.scene.transform.Transform; public class Rock extends WorldEntity { + @Serial + private static final long serialVersionUID = -7708255870460093800L; + private static final Random RANDOM = new Random(); private MyDimension size; private double angle = 0; diff --git a/src/main/java/lab/game/Scene.java b/src/main/java/lab/game/Scene.java index e45ae1d39e4a5783bf13dc7c68e220d3d40653c9..c2bcc8f273419750b3a06c7edd90b13a9edd8a60 100644 --- a/src/main/java/lab/game/Scene.java +++ b/src/main/java/lab/game/Scene.java @@ -1,5 +1,12 @@ package lab.game; +import java.io.IOException; +import java.io.InputStream; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.io.OutputStream; +import java.net.ServerSocket; +import java.net.Socket; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.Comparator; @@ -55,11 +62,67 @@ public class Scene { } public void startServer() { - //TODO: + new Thread(() -> { + try (ServerSocket listenSocket = new ServerSocket(4600)) { + while (!Thread.currentThread().isInterrupted()) { + try { + Socket client = listenSocket.accept(); + new Thread(() -> handleViewer(client), "Viewer handler").start(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } catch (IOException e) { + e.printStackTrace(); + } + + }).start(); + } + + public void handleViewer(Socket client) { + try (OutputStream outputStream = client.getOutputStream(); + ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream)) { + while (!Thread.currentThread().isInterrupted()) { + synchronized (entitiesLock) { + objectOutputStream.reset(); + synchronized (entitiesLock) { + objectOutputStream.writeObject(sceneEntitites); + } + objectOutputStream.flush(); + } + sleepForWhile(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + + private void sleepForWhile() { + try { + Thread.sleep(20); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } } public void connectToServer() { - //TODO: + new Thread(() -> { + try (Socket socketToServer = new Socket("localhost", 4600); + InputStream inputStream = socketToServer.getInputStream(); + ObjectInputStream objectInputStream = new ObjectInputStream(inputStream)) { + while (!Thread.currentThread().isInterrupted()) { + Object o = objectInputStream.readObject(); + if (o instanceof List l) { + synchronized (entitiesLock) { + sceneEntitites = l; + } + } + } + } catch (IOException | ClassNotFoundException e) { + e.printStackTrace(); + } + + }).start(); } record LochNessDeadLog(LocalDateTime time, MyPoint position) { diff --git a/src/main/java/lab/game/WorldEntity.java b/src/main/java/lab/game/WorldEntity.java index 016fb5f3dbec0dc2ddc3e85ea0e257f69697f5d2..86225fce9ea06ca293cfa8bbe53d0ecd516d93de 100644 --- a/src/main/java/lab/game/WorldEntity.java +++ b/src/main/java/lab/game/WorldEntity.java @@ -1,10 +1,16 @@ package lab.game; +import java.io.Serial; +import java.io.Serializable; + import javafx.scene.canvas.GraphicsContext; -public abstract class WorldEntity implements DrawableSimulable { +public abstract class WorldEntity implements DrawableSimulable, Serializable { - protected Scene scene; + @Serial + private static final long serialVersionUID = 8500258821894708841L; + + protected transient Scene scene; protected MyPoint position; private int zIndex;