Refactored User room to be optional
This commit is contained in:
		| @@ -52,7 +52,7 @@ public abstract class Game extends MineNetInstance implements Spawnable { | ||||
|         try { | ||||
|  | ||||
|             Game game = factory.manufacture(options); | ||||
|             Room.getRoom(owner).moveMembersToGame(game); | ||||
|             Room.getRoom(owner).orElseThrow().moveMembersToGame(game); | ||||
|             game.load(); | ||||
|  | ||||
|         } catch (Exception e) { | ||||
|   | ||||
| @@ -11,13 +11,13 @@ import eu.mhsl.minenet.minigames.instance.game.stateless.types.towerdefense.Towe | ||||
| import eu.mhsl.minenet.minigames.instance.game.stateless.types.trafficlightrace.TrafficLightRaceFactory; | ||||
|  | ||||
| public enum GameList { | ||||
|     DEATHCUBE(new DeathcubeFactory(), GameType.OTHER), | ||||
|     DEATHCUBE(new DeathcubeFactory(), GameType.JUMPNRUN), | ||||
|     STICKFIGHT(new StickFightFactory(), GameType.PVP), | ||||
|     MINERUN(new MinerunFactory(), GameType.PVE), | ||||
|     MINERUN(new MinerunFactory(), GameType.JUMPNRUN), | ||||
|     TRAFFICLIGHTRACE(new TrafficLightRaceFactory(), GameType.OTHER), | ||||
|     TOWERDEFENSE(new TowerdefenseFactory(), GameType.PVE), | ||||
|     BEDWARS(new BedwarsFactory(), GameType.PVP), | ||||
|     BACKROOMS(new BackroomsFactory(), GameType.PVE), | ||||
|     TOWERDEFENSE(new TowerdefenseFactory(), GameType.PROTOTYPE), | ||||
|     BEDWARS(new BedwarsFactory(), GameType.PROTOTYPE), | ||||
|     BACKROOMS(new BackroomsFactory(), GameType.PROTOTYPE), | ||||
|     SPLEEF(new SpleefFactory(), GameType.PVP); | ||||
|  | ||||
|     private final GameFactory factory; | ||||
|   | ||||
| @@ -6,7 +6,9 @@ import net.minestom.server.item.Material; | ||||
| public enum GameType { | ||||
|     OTHER(Material.GRASS_BLOCK, TranslatedComponent.byId("GameType#other"), TranslatedComponent.byId("GameType#other_description")), | ||||
|     PVP(Material.DIAMOND_SWORD, TranslatedComponent.byId("GameType#pvp"), TranslatedComponent.byId("GameType#pvp_description")), | ||||
|     PVE(Material.DIAMOND_PICKAXE, TranslatedComponent.byId("GameType#pve"), TranslatedComponent.byId("GameType#pve_description")); | ||||
|     PVE(Material.DIAMOND_PICKAXE, TranslatedComponent.byId("GameType#pve"), TranslatedComponent.byId("GameType#pve_description")), | ||||
|     JUMPNRUN(Material.DIAMOND_BOOTS, TranslatedComponent.byId("GameType#jumpnrun"), TranslatedComponent.byId("GameType#jumpnrun_description")), | ||||
|     PROTOTYPE(Material.COMMAND_BLOCK, TranslatedComponent.byId("GameType#prototype"), TranslatedComponent.byId("GameType#prototype_description")); | ||||
|  | ||||
|  | ||||
|     final Material icon; | ||||
|   | ||||
| @@ -4,6 +4,7 @@ import eu.mhsl.minenet.minigames.instance.game.stateless.StatelessGame; | ||||
| import eu.mhsl.minenet.minigames.score.FirstWinsScore; | ||||
| import eu.mhsl.minenet.minigames.util.BatchUtil; | ||||
| import eu.mhsl.minenet.minigames.instance.Dimension; | ||||
| import net.minestom.server.coordinate.Pos; | ||||
| import net.minestom.server.coordinate.Vec; | ||||
| import net.minestom.server.event.player.PlayerMoveEvent; | ||||
| import net.minestom.server.instance.batch.AbsoluteBlockBatch; | ||||
| @@ -26,7 +27,7 @@ class TrafficLightRace extends StatelessGame { | ||||
|     protected void onLoad(@NotNull CompletableFuture<Void> callback) { | ||||
|         AbsoluteBlockBatch batch = new AbsoluteBlockBatch(); | ||||
|         for (int x = -10; x <= 10; x++) { | ||||
|             for (int z = 5; z <= 100; z++) { | ||||
|             for (int z = 0; z <= 100; z++) { | ||||
|                 batch.setBlock(x, 5, z, super.rnd.nextInt(0, 100) > 90 ? Block.SOUL_SAND : Block.BLACK_CONCRETE_POWDER); | ||||
|             } | ||||
|         } | ||||
| @@ -67,4 +68,8 @@ class TrafficLightRace extends StatelessGame { | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public Pos getSpawn() { | ||||
|         return new Pos(0, 6, 10); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -15,24 +15,21 @@ import net.minestom.server.inventory.click.ClickType; | ||||
| import net.minestom.server.inventory.condition.InventoryConditionResult; | ||||
| import net.minestom.server.item.ItemStack; | ||||
| import net.minestom.server.item.Material; | ||||
| import net.minestom.server.item.metadata.PlayerHeadMeta; | ||||
| import net.minestom.server.network.packet.client.play.ClientNameItemPacket; | ||||
|  | ||||
| import java.util.Locale; | ||||
| import java.util.Optional; | ||||
|  | ||||
| public class JoinInventory extends InteractableInventory { | ||||
|     private String typedText = ""; | ||||
|     private final String prefix = "Name:"; | ||||
|     private final String prefix = "Suche: "; | ||||
|  | ||||
|     public JoinInventory(Player p) { | ||||
|         super(InventoryType.ANVIL, TranslatedComponent.assemble("hub#join_title", p)); | ||||
|  | ||||
|         setClickableItem( | ||||
|                 ItemStack.builder(Material.PLAYER_HEAD) | ||||
|                 ItemStack.builder(Material.GREEN_STAINED_GLASS_PANE) | ||||
|                         .displayName(Component.text(prefix)) | ||||
|                         .meta(PlayerHeadMeta.class, builder -> { | ||||
|  | ||||
|                         }) | ||||
|                         .build(), | ||||
|                 0, | ||||
|                 itemClick -> {} | ||||
| @@ -54,9 +51,9 @@ public class JoinInventory extends InteractableInventory { | ||||
|  | ||||
|         typedText = formatInput(typedText); | ||||
|  | ||||
|         Room target = Room.getRoom(MinecraftServer.getConnectionManager().findPlayer(typedText)); | ||||
|         if(target != null) | ||||
|             Room.setRoom(player, target); | ||||
|         Optional<Room> target = Room.getRoom(MinecraftServer.getConnectionManager().findPlayer(typedText)); | ||||
|         if(target.isPresent()) | ||||
|             Room.setRoom(player, target.get()); | ||||
|         else | ||||
|             new ChatMessage(Icon.ERROR).appendTranslated("hub#join_notFound").appendStatic(" " + typedText).send(player); | ||||
|     } | ||||
|   | ||||
| @@ -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); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user