Refactored User room to be optional

This commit is contained in:
2023-10-03 10:40:32 +02:00
parent 4b82b81d63
commit 16cf29a590
8 changed files with 46 additions and 29 deletions

View File

@@ -17,6 +17,7 @@ import net.minestom.server.entity.GameMode;
import net.minestom.server.entity.Player;
import net.minestom.server.event.player.PlayerBlockBreakEvent;
import net.minestom.server.event.player.PlayerDisconnectEvent;
import net.minestom.server.event.player.PlayerEntityInteractEvent;
import net.minestom.server.instance.AnvilLoader;
import java.util.*;
@@ -30,22 +31,22 @@ public class Room extends MineNetInstance implements Spawnable {
public static Room createRoom(Player owner) {
logger.info("Creating room with owner " + owner.getUsername());
setRoom(owner, new Room(owner));
return getRoom(owner);
return getRoom(owner).orElseThrow();
}
public static void deleteRoom(Room room) {
logger.info("Deleting room with owner " + room.owner.getUsername());
logger.info("Deleting room " + room.uniqueId);
rooms.values().removeAll(Collections.singleton(room)); // remove(room) would only remove the first one
room.getAllMembers().forEach(player -> MoveInstance.move(player, Hub.INSTANCE));
MoveInstance.forceCloseInstance(room);
}
public static Room getRoom(Player p) {
return rooms.get(p);
public static Optional<Room> getRoom(Player p) {
return Optional.ofNullable(rooms.get(p));
}
public static void setOwnRoom(Player p) {
setRoom(p, getRoom(p));
setRoom(p, getRoom(p).orElseThrow());
}
public static void setRoom(Player p, Room room) {
@@ -68,11 +69,13 @@ public class Room extends MineNetInstance implements Spawnable {
}
private Player owner;
private GameSelector gameSelector;
private Room(Player owner) {
super(Dimension.THE_END.DIMENSION);
construct();
setOwner(owner);
new GameSelector().setInstance(this, new Pos(0.5, 16, 9.5));
this.gameSelector = new GameSelector();
this.gameSelector.setInstance(this, new Pos(0.5, 16, 9.5));
}
protected Room() {
@@ -104,7 +107,7 @@ public class Room extends MineNetInstance implements Spawnable {
.findFirst() // find the first user meeting the requirement
.ifPresentOrElse(
this::setOwner, // set the new owner
() -> Room.deleteRoom(Room.getRoom(p)) // or else delete the room (no players in the room)
() -> Room.getRoom(p).ifPresent(Room::deleteRoom) // or else delete the room (no players in the room)
);
Room.unsetRoom(p); // remove the player itself from the room
@@ -122,10 +125,16 @@ public class Room extends MineNetInstance implements Spawnable {
public Set<Player> getAllMembers() {
return rooms.keySet().stream()
.filter(player -> getRoom(player) == this)
.filter(player -> getRoom(player).orElse(null) == this)
.collect(Collectors.toSet());
}
@Override
protected boolean onPlayerJoin(Player p) {
this.gameSelector.onInteract(new PlayerEntityInteractEvent(p, gameSelector, Player.Hand.MAIN, p.getPosition()));
return super.onPlayerJoin(p);
}
@Override
public Pos getSpawn() {
return new Pos(0.5, 16, 0.5);