Refactored User room to be optional
This commit is contained in:
parent
4b82b81d63
commit
16cf29a590
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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");
|
||||||
|
|
||||||
|
@ -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) {
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user