feat: Server selector

This commit is contained in:
2026-02-01 15:16:44 +01:00
parent fc14e4081d
commit ac5a96eb19
46 changed files with 792 additions and 86 deletions

View File

@@ -12,6 +12,27 @@
<artifactId>common</artifactId>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.11.0</version>
<configuration>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.42</version>
</path>
</annotationProcessorPaths>
<source>25</source>
<target>25</target>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>tools.jackson.core</groupId>
@@ -31,5 +52,12 @@
<version>1.18.42</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>2.0.17</version>
</dependency>
</dependencies>
</project>

View File

@@ -0,0 +1,65 @@
package cz.jzitnik.common.models.coordinates;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Getter;
import lombok.ToString;
import lombok.extern.slf4j.Slf4j;
import java.io.Serializable;
import java.util.List;
@Slf4j
@ToString
@Getter
public class RoomCords implements Cloneable, Serializable {
private int x;
private int y;
@JsonCreator
public RoomCords(
@JsonProperty("x") int x,
@JsonProperty("y") int y
) {
updateCords(x, y);
}
public void updateCords(int x, int y) {
this.x = x;
this.y = y;
}
public void updateCordsWithColliders(List<RoomPart> colliders, int x, int y, RoomPart playerCollider) {
var normalizedPlayerCollider = new RoomPart(
new RoomCords(playerCollider.getStart().getX() + x, playerCollider.getStart().getY() + y),
new RoomCords(playerCollider.getEnd().getX() + x, playerCollider.getEnd().getY() + y)
);
if (colliders.stream().anyMatch(collider -> collider.isOverlapping(normalizedPlayerCollider))) {
return;
}
updateCords(x, y);
}
@Override
public RoomCords clone() {
try {
return (RoomCords) super.clone();
} catch (CloneNotSupportedException e) {
throw new AssertionError();
}
}
/**
* Calculates the Euclidean distance between this coordinate and another.
*
* @param other The other RoomCords instance
* @return The distance as a double
*/
public double calculateDistance(RoomCords other) {
if (other == null) {
throw new IllegalArgumentException("Cannot calculate distance to null");
}
return Math.hypot(this.x - other.x, this.y - other.y);
}
}

View File

@@ -0,0 +1,41 @@
package cz.jzitnik.common.models.coordinates;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.ToString;
import java.io.Serializable;
@Data
@ToString
public class RoomPart implements Serializable {
private RoomCords start;
private RoomCords end;
@JsonCreator
public RoomPart(
@JsonProperty("start") RoomCords start,
@JsonProperty("end") RoomCords end
) {
this.start = start;
this.end = end;
}
public boolean isWithin(RoomCords cords) {
return cords.getX() >= start.getX() &&
cords.getX() <= end.getX() &&
cords.getY() >= start.getY() &&
cords.getY() <= end.getY();
}
/**
* Checks if this GameRoomPart overlaps with another.
*/
public boolean isOverlapping(RoomPart other) {
return start.getX() <= other.getEnd().getX() &&
end.getX() >= other.getStart().getX() &&
start.getY() <= other.getEnd().getY() &&
end.getY() >= other.getStart().getY();
}
}

View File

@@ -0,0 +1,24 @@
package cz.jzitnik.common.models.player;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import cz.jzitnik.common.models.coordinates.RoomCords;
import cz.jzitnik.common.models.coordinates.RoomPart;
import lombok.Getter;
import java.io.Serializable;
@Getter
public final class PlayerCreation implements Serializable {
private final RoomCords playerCords;
private final RoomPart collider;
@JsonCreator
public PlayerCreation(
@JsonProperty("playerCords") RoomCords playerCords,
@JsonProperty("collider") RoomPart collider
) {
this.playerCords = playerCords;
this.collider = collider;
}
}

View File

@@ -1,6 +1,13 @@
package cz.jzitnik.common.socket.messages.game.creation;
import cz.jzitnik.common.models.player.PlayerCreation;
import cz.jzitnik.common.socket.SocketMessage;
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
@AllArgsConstructor
public class CreateGameResponse implements SocketMessage {
private final String gamePassword;
private final PlayerCreation ownerPlayer;
}