Refactored User room to be optional

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

View File

@ -19,7 +19,7 @@ public class SetRoomOwnerCommand extends PrivilegedCommand {
setDefaultExecutor((sender, context) -> { setDefaultExecutor((sender, context) -> {
if(sender instanceof Player p) { if(sender instanceof Player p) {
Room.getRoom(p).setOwner(p); Room.getRoom(p).orElseThrow().setOwner(p);
new ChatMessage(Icon.SUCCESS).appendStatic("You are now the owner of this room!").send(sender); new ChatMessage(Icon.SUCCESS).appendStatic("You are now the owner of this room!").send(sender);
} }
}); });
@ -28,7 +28,7 @@ public class SetRoomOwnerCommand extends PrivilegedCommand {
System.out.println("Test"); System.out.println("Test");
if(sender instanceof Player p) { if(sender instanceof Player p) {
Player newOwner = MinecraftServer.getConnectionManager().getPlayer(context.getRaw("player")); Player newOwner = MinecraftServer.getConnectionManager().getPlayer(context.getRaw("player"));
Room.getRoom(p).setOwner(Objects.requireNonNull(newOwner)); Room.getRoom(p).orElseThrow().setOwner(Objects.requireNonNull(newOwner));
new ChatMessage(Icon.SUCCESS).appendStatic("The new owner has been set!").send(sender); new ChatMessage(Icon.SUCCESS).appendStatic("The new owner has been set!").send(sender);
} }
}, ArgumentType.Entity("player").onlyPlayers(true)); }, ArgumentType.Entity("player").onlyPlayers(true));
@ -36,6 +36,6 @@ public class SetRoomOwnerCommand extends PrivilegedCommand {
@Override @Override
protected CommandCondition isPrivileged() { protected CommandCondition isPrivileged() {
return (sender, commandString) -> super.isPrivileged().canUse(sender, commandString) || Room.getRoom(((Player) sender)).getOwner() == sender; return (sender, commandString) -> super.isPrivileged().canUse(sender, commandString) || Room.getRoom(((Player) sender)).orElseThrow().getOwner() == sender;
} }
} }

View File

@ -1,6 +1,8 @@
package eu.mhsl.minenet.minigames.handler.global; package eu.mhsl.minenet.minigames.handler.global;
import eu.mhsl.minenet.minigames.instance.room.Room;
import eu.mhsl.minenet.minigames.skin.SkinCache; import eu.mhsl.minenet.minigames.skin.SkinCache;
import net.minestom.server.MinecraftServer;
import net.minestom.server.entity.Player; import net.minestom.server.entity.Player;
import net.minestom.server.event.EventListener; import net.minestom.server.event.EventListener;
import net.minestom.server.event.player.PlayerLoginEvent; import net.minestom.server.event.player.PlayerLoginEvent;
@ -25,8 +27,10 @@ public class PlayerLoginHandler implements EventListener<PlayerLoginEvent> {
SkinCache.applySkin(p); SkinCache.applySkin(p);
if(p.getUsername().equalsIgnoreCase("minetec")) if(p.getUsername().equalsIgnoreCase("minetec")) {
p.addPermission(new Permission("admin")); p.addPermission(new Permission("admin"));
MinecraftServer.getSchedulerManager().scheduleNextTick(() -> Room.createRoom(p));
}
Logger.getLogger("user").info(p.getUsername() + " joined"); Logger.getLogger("user").info(p.getUsername() + " joined");

View File

@ -52,7 +52,7 @@ public abstract class Game extends MineNetInstance implements Spawnable {
try { try {
Game game = factory.manufacture(options); Game game = factory.manufacture(options);
Room.getRoom(owner).moveMembersToGame(game); Room.getRoom(owner).orElseThrow().moveMembersToGame(game);
game.load(); game.load();
} catch (Exception e) { } catch (Exception e) {

View File

@ -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; import eu.mhsl.minenet.minigames.instance.game.stateless.types.trafficlightrace.TrafficLightRaceFactory;
public enum GameList { public enum GameList {
DEATHCUBE(new DeathcubeFactory(), GameType.OTHER), DEATHCUBE(new DeathcubeFactory(), GameType.JUMPNRUN),
STICKFIGHT(new StickFightFactory(), GameType.PVP), STICKFIGHT(new StickFightFactory(), GameType.PVP),
MINERUN(new MinerunFactory(), GameType.PVE), MINERUN(new MinerunFactory(), GameType.JUMPNRUN),
TRAFFICLIGHTRACE(new TrafficLightRaceFactory(), GameType.OTHER), TRAFFICLIGHTRACE(new TrafficLightRaceFactory(), GameType.OTHER),
TOWERDEFENSE(new TowerdefenseFactory(), GameType.PVE), TOWERDEFENSE(new TowerdefenseFactory(), GameType.PROTOTYPE),
BEDWARS(new BedwarsFactory(), GameType.PVP), BEDWARS(new BedwarsFactory(), GameType.PROTOTYPE),
BACKROOMS(new BackroomsFactory(), GameType.PVE), BACKROOMS(new BackroomsFactory(), GameType.PROTOTYPE),
SPLEEF(new SpleefFactory(), GameType.PVP); SPLEEF(new SpleefFactory(), GameType.PVP);
private final GameFactory factory; private final GameFactory factory;

View File

@ -6,7 +6,9 @@ import net.minestom.server.item.Material;
public enum GameType { public enum GameType {
OTHER(Material.GRASS_BLOCK, TranslatedComponent.byId("GameType#other"), TranslatedComponent.byId("GameType#other_description")), 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")), 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; final Material icon;

View File

@ -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.score.FirstWinsScore;
import eu.mhsl.minenet.minigames.util.BatchUtil; import eu.mhsl.minenet.minigames.util.BatchUtil;
import eu.mhsl.minenet.minigames.instance.Dimension; import eu.mhsl.minenet.minigames.instance.Dimension;
import net.minestom.server.coordinate.Pos;
import net.minestom.server.coordinate.Vec; import net.minestom.server.coordinate.Vec;
import net.minestom.server.event.player.PlayerMoveEvent; import net.minestom.server.event.player.PlayerMoveEvent;
import net.minestom.server.instance.batch.AbsoluteBlockBatch; import net.minestom.server.instance.batch.AbsoluteBlockBatch;
@ -26,7 +27,7 @@ class TrafficLightRace extends StatelessGame {
protected void onLoad(@NotNull CompletableFuture<Void> callback) { protected void onLoad(@NotNull CompletableFuture<Void> callback) {
AbsoluteBlockBatch batch = new AbsoluteBlockBatch(); AbsoluteBlockBatch batch = new AbsoluteBlockBatch();
for (int x = -10; x <= 10; x++) { 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); 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);
}
} }

View File

@ -15,24 +15,21 @@ import net.minestom.server.inventory.click.ClickType;
import net.minestom.server.inventory.condition.InventoryConditionResult; import net.minestom.server.inventory.condition.InventoryConditionResult;
import net.minestom.server.item.ItemStack; import net.minestom.server.item.ItemStack;
import net.minestom.server.item.Material; import net.minestom.server.item.Material;
import net.minestom.server.item.metadata.PlayerHeadMeta;
import net.minestom.server.network.packet.client.play.ClientNameItemPacket; import net.minestom.server.network.packet.client.play.ClientNameItemPacket;
import java.util.Locale; import java.util.Locale;
import java.util.Optional;
public class JoinInventory extends InteractableInventory { public class JoinInventory extends InteractableInventory {
private String typedText = ""; private String typedText = "";
private final String prefix = "Name:"; private final String prefix = "Suche: ";
public JoinInventory(Player p) { public JoinInventory(Player p) {
super(InventoryType.ANVIL, TranslatedComponent.assemble("hub#join_title", p)); super(InventoryType.ANVIL, TranslatedComponent.assemble("hub#join_title", p));
setClickableItem( setClickableItem(
ItemStack.builder(Material.PLAYER_HEAD) ItemStack.builder(Material.GREEN_STAINED_GLASS_PANE)
.displayName(Component.text(prefix)) .displayName(Component.text(prefix))
.meta(PlayerHeadMeta.class, builder -> {
})
.build(), .build(),
0, 0,
itemClick -> {} itemClick -> {}
@ -54,9 +51,9 @@ public class JoinInventory extends InteractableInventory {
typedText = formatInput(typedText); typedText = formatInput(typedText);
Room target = Room.getRoom(MinecraftServer.getConnectionManager().findPlayer(typedText)); Optional<Room> target = Room.getRoom(MinecraftServer.getConnectionManager().findPlayer(typedText));
if(target != null) if(target.isPresent())
Room.setRoom(player, target); Room.setRoom(player, target.get());
else else
new ChatMessage(Icon.ERROR).appendTranslated("hub#join_notFound").appendStatic(" " + typedText).send(player); new ChatMessage(Icon.ERROR).appendTranslated("hub#join_notFound").appendStatic(" " + typedText).send(player);
} }

View File

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