diff --git a/src/main/java/com/fibermc/essentialcommands/Config.java b/src/main/java/com/fibermc/essentialcommands/Config.java index 50e022f8..104b06a7 100644 --- a/src/main/java/com/fibermc/essentialcommands/Config.java +++ b/src/main/java/com/fibermc/essentialcommands/Config.java @@ -21,6 +21,7 @@ public class Config { public static boolean ENABLE_HOME; public static boolean ENABLE_TPA; public static boolean ENABLE_BACK; + public static boolean ENABLE_WARP; public static int HOME_LIMIT; public static double TELEPORT_COOLDOWN; public static double TELEPORT_DELAY; @@ -53,6 +54,7 @@ public static void initProperties() { props.putIfAbsent("enable_home", "true"); props.putIfAbsent("enable_tpa", "true"); props.putIfAbsent("enable_back", "true"); + props.putIfAbsent("enable_warp", "true"); props.putIfAbsent("home_limit", "-1"); props.putIfAbsent("teleport_cooldown", "1D"); props.putIfAbsent("teleport_delay", "0D"); @@ -66,6 +68,7 @@ public static void initProperties() { ENABLE_HOME = Boolean.parseBoolean((String) props.getOrDefault("enable_home", "true")); ENABLE_TPA = Boolean.parseBoolean((String) props.getOrDefault("enable_tpa", "true")); ENABLE_BACK = Boolean.parseBoolean((String) props.getOrDefault("enable_back", "true")); + ENABLE_WARP = Boolean.parseBoolean((String) props.getOrDefault("enable_warp", "true")); HOME_LIMIT = Integer.parseInt((String) props.getOrDefault("home_limit", "-1")); TELEPORT_COOLDOWN = Double.parseDouble((String) props.getOrDefault("teleport_cooldown", "1D")); TELEPORT_DELAY = Double.parseDouble((String) props.getOrDefault("teleport_delay", "0D")); @@ -75,7 +78,7 @@ public static void initProperties() { public static void storeProperties() { try{ - File outFile = new File("./config/EssentialCommands.json"); + File outFile = new File("./config/EssentialCommands.properties"); FileWriter writer = new FileWriter(outFile); props.store(writer, ""); diff --git a/src/main/java/com/fibermc/essentialcommands/EssentialCommandRegistry.java b/src/main/java/com/fibermc/essentialcommands/EssentialCommandRegistry.java index da59246c..d24036f0 100644 --- a/src/main/java/com/fibermc/essentialcommands/EssentialCommandRegistry.java +++ b/src/main/java/com/fibermc/essentialcommands/EssentialCommandRegistry.java @@ -24,9 +24,9 @@ public class EssentialCommandRegistry { public static void register(ManagerLocator managers) { - PlayerDataManager dataManager = managers.getDataManager(); + PlayerDataManager dataManager = managers.getPlayerDataManager(); TeleportRequestManager tpManager = managers.getTpManager(); - + WorldDataManager worldDataManager = managers.getWorldDataManager(); CommandRegistrationCallback.EVENT.register( (CommandDispatcher dispatcher, boolean dedicated) -> { final String disabledString = "[EssentialCommands] This command is not enabled."; @@ -45,24 +45,24 @@ public static void register(ManagerLocator managers) { if (Config.ENABLE_TPA) { tpAskBuilder - .then( - argument("target", EntityArgumentType.player()) - .executes(new TeleportAskCommand(tpManager))) - .build(); + .then( + argument("target", EntityArgumentType.player()) + .executes(new TeleportAskCommand(tpManager))) + .build(); tpAcceptBuilder - .then( - argument("target", EntityArgumentType.player()) - .suggests(TeleportResponseSuggestion.suggestedStrings(dataManager)) - .executes(new TeleportAcceptCommand(dataManager))) + .then( + argument("target", EntityArgumentType.player()) + .suggests(TeleportResponseSuggestion.suggestedStrings(dataManager)) + .executes(new TeleportAcceptCommand(dataManager))) .build(); tpDenyBuilder - .then( - argument("target", EntityArgumentType.player()) - .suggests(TeleportResponseSuggestion.suggestedStrings(dataManager)) - .executes(new TeleportDenyCommand(dataManager))) - .build(); + .then( + argument("target", EntityArgumentType.player()) + .suggests(TeleportResponseSuggestion.suggestedStrings(dataManager)) + .executes(new TeleportDenyCommand(dataManager))) + .build(); } else { tpAskBuilder.executes(disabledCommandCommand); tpAcceptBuilder.executes(disabledCommandCommand); @@ -79,18 +79,18 @@ public static void register(ManagerLocator managers) { //homeBuilder; homeSetBuilder.then( - argument("home_name", StringArgumentType.word()) - .executes(new HomeSetCommand(dataManager))); + argument("home_name", StringArgumentType.word()) + .executes(new HomeSetCommand(dataManager))); homeTpBuilder - .then(argument("home_name", StringArgumentType.word()) - .suggests(HomeSuggestion.suggestedStrings(dataManager)) - .executes(new HomeCommand(dataManager))); + .then(argument("home_name", StringArgumentType.word()) + .suggests(HomeSuggestion.suggestedStrings(dataManager)) + .executes(new HomeCommand(dataManager))); homeDeleteBuilder - .then(argument("home_name", StringArgumentType.word()) - .suggests(HomeSuggestion.suggestedStrings(dataManager)) - .executes(new HomeDeleteCommand(dataManager))); + .then(argument("home_name", StringArgumentType.word()) + .suggests(HomeSuggestion.suggestedStrings(dataManager)) + .executes(new HomeDeleteCommand(dataManager))); } else { homeBuilder.executes(disabledCommandCommand); @@ -108,7 +108,37 @@ public static void register(ManagerLocator managers) { backBuilder.executes(disabledCommandCommand); } - //-=-=-=-=-=-=-=- + //Warp + LiteralArgumentBuilder warpBuilder = CommandManager.literal("warp"); + LiteralArgumentBuilder warpSetBuilder = CommandManager.literal("set"); + LiteralArgumentBuilder warpTpBuilder = CommandManager.literal("tp"); + LiteralArgumentBuilder warpDeleteBuilder = CommandManager.literal("delete"); + if (Config.ENABLE_WARP) { + warpSetBuilder.then( + argument("warp_name", StringArgumentType.word()) + .requires(serverCommandSource -> serverCommandSource.hasPermissionLevel(4)) + .executes(new WarpSetCommand(worldDataManager))); + + warpTpBuilder + .then(argument("warp_name", StringArgumentType.word()) + .suggests(worldDataManager.getWarpSuggestions()) + .executes(new WarpTpCommand(dataManager, worldDataManager))); + + warpDeleteBuilder + .then(argument("warp_name", StringArgumentType.word()) + .requires(serverCommandSource -> serverCommandSource.hasPermissionLevel(4)) + .suggests(worldDataManager.getWarpSuggestions()) + .executes(new WarpDeleteCommand(worldDataManager))); + + } else { + warpBuilder.executes(disabledCommandCommand); + warpSetBuilder.executes(disabledCommandCommand); + warpTpBuilder.executes(disabledCommandCommand); + warpDeleteBuilder.executes(disabledCommandCommand); + } + + + //-=-=-=-=-=-=-=- dispatcher.getRoot().addChild(tpAskBuilder.build()); dispatcher.getRoot().addChild(tpAcceptBuilder.build()); dispatcher.getRoot().addChild(tpDenyBuilder.build()); @@ -120,6 +150,12 @@ public static void register(ManagerLocator managers) { homeNode.addChild(homeDeleteBuilder.build()); dispatcher.getRoot().addChild(backBuilder.build()); + + LiteralCommandNode warpNode = warpBuilder.build(); + dispatcher.getRoot().addChild(warpNode); + warpNode.addChild(warpTpBuilder.build()); + warpNode.addChild(warpSetBuilder.build()); + warpNode.addChild(warpDeleteBuilder.build()); } ); } diff --git a/src/main/java/com/fibermc/essentialcommands/EssentialCommands.java b/src/main/java/com/fibermc/essentialcommands/EssentialCommands.java index 0d54fa2c..ea3b9f3e 100644 --- a/src/main/java/com/fibermc/essentialcommands/EssentialCommands.java +++ b/src/main/java/com/fibermc/essentialcommands/EssentialCommands.java @@ -1,16 +1,16 @@ package com.fibermc.essentialcommands; //import net.fabricmc.api.DedicatedServerModInitializer; +import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents; import net.fabricmc.api.ModInitializer; +import net.minecraft.server.MinecraftServer; import org.apache.logging.log4j.Level; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -public final class EssentialCommands implements /*DedicatedServer*/ModInitializer { +public final class EssentialCommands implements ModInitializer { public static Logger LOGGER = LogManager.getLogger("EssentialCommands"); -// private static PlayerDataManager _dataManager; -// private static TeleportRequestManager _tpManager; public static void log(Level level, String message) { final String logPrefix = "[EssentialCommands]: "; @@ -21,16 +21,18 @@ public static void log(Level level, String message) { @Override public void onInitialize/*Server*/() { log(Level.INFO, "Mod Load Initiated."); + //Load Preferences Config.loadOrCreateProperties(); - //init mod stuff - PlayerDataManager dataManager = new PlayerDataManager(); - TeleportRequestManager tpManager = new TeleportRequestManager(dataManager); - ManagerLocator managers = new ManagerLocator(dataManager, tpManager); - PlayerDataFactory.init(managers); + ManagerLocator managers = new ManagerLocator(); + + ServerLifecycleEvents.SERVER_STARTED.register((MinecraftServer server) -> { + managers.init(server); + }); + //TODO Currently known bug: warps will persist between worlds in a single session in singleplayer. //Register Mod EssentialCommandRegistry.register(managers); diff --git a/src/main/java/com/fibermc/essentialcommands/ManagerLocator.java b/src/main/java/com/fibermc/essentialcommands/ManagerLocator.java index cc89c93a..e7d46197 100644 --- a/src/main/java/com/fibermc/essentialcommands/ManagerLocator.java +++ b/src/main/java/com/fibermc/essentialcommands/ManagerLocator.java @@ -1,20 +1,32 @@ package com.fibermc.essentialcommands; +import net.minecraft.server.MinecraftServer; + public class ManagerLocator { - private PlayerDataManager dataManager; - private TeleportRequestManager tpManager; + private final PlayerDataManager playerDataManager; + private final TeleportRequestManager tpManager; + private final WorldDataManager worldDataManager; + + public ManagerLocator() { + this.playerDataManager = new PlayerDataManager(); + this.tpManager = new TeleportRequestManager(this.playerDataManager); + this.worldDataManager = new WorldDataManager(); + } - public ManagerLocator(PlayerDataManager dataManager, TeleportRequestManager tpManager) { - this.dataManager = dataManager; - this.tpManager = tpManager; + public void init(MinecraftServer server) { + this.worldDataManager.init(server); } - public PlayerDataManager getDataManager() { - return dataManager; + public PlayerDataManager getPlayerDataManager() { + return playerDataManager; } public TeleportRequestManager getTpManager() { return tpManager; } + + public WorldDataManager getWorldDataManager() { + return worldDataManager; + } } diff --git a/src/main/java/com/fibermc/essentialcommands/PlayerData.java b/src/main/java/com/fibermc/essentialcommands/PlayerData.java index 149ce626..a808c1dc 100644 --- a/src/main/java/com/fibermc/essentialcommands/PlayerData.java +++ b/src/main/java/com/fibermc/essentialcommands/PlayerData.java @@ -16,9 +16,6 @@ public class PlayerData extends PersistentState { - // Managers - private TeleportRequestManager tpManager; - // ServerPlayerEntity private ServerPlayerEntity player; private UUID pUuid; @@ -39,15 +36,13 @@ public class PlayerData extends PersistentState { private int tpCooldown; private int tpDelay; - public PlayerData(ServerPlayerEntity player, ManagerLocator managers) { + public PlayerData(ServerPlayerEntity player) { this.player = player; this.pUuid = player.getUuid(); tpTimer = -1; tpTarget = null; tpAskers = new LinkedList(); homes = new HashMap(); - - this.tpManager = managers.getTpManager(); } public int getTpTimer() { @@ -131,7 +126,7 @@ public NbtCompound writeNbt(NbtCompound tag) { tag.putUuid("playerUuid", pUuid); NbtList homesNbtList = new NbtList(); for (Entry entry : homes.entrySet()) { - NbtCompound homeTag = entry.getValue().toTag(new NbtCompound()); + NbtCompound homeTag = entry.getValue().writeNbt(new NbtCompound()); homeTag.putString("homeName", entry.getKey()); homesNbtList.add(homeTag); } @@ -143,6 +138,7 @@ public NbtCompound writeNbt(NbtCompound tag) { public void setPreviousLocation(MinecraftLocation location) { this.previousLocation = location; } + public MinecraftLocation getPreviousLocation() { return this.previousLocation; } @@ -185,46 +181,4 @@ public void setTpCooldown(int cooldown) { public void setTpDelay(int delay) { this.tpDelay = delay; } - - //Just used default method -// @Override -// public void save(File file) { -// if (this.isDirty()) { -// NbtCompound compoundTag = new NbtCompound(); -// compoundTag.put("data", this.toTag(new NbtCompound())); -// compoundTag.putInt("DataVersion", SharedConstants.getGameVersion().getWorldVersion()); - -// try { -// FileOutputStream fileOutputStream =new FileOutputStream(file); -// DataOutputStream dataOutputStream = new DataOutputStream(fileOutputStream); -// Throwable var4 = null; - -// try { -// NbtIo.write(compoundTag, dataOutputStream); -// } catch (Throwable var14) { -// var4 = var14; -// throw var14; -// } finally { -// if (dataOutputStream != null) { -// if (var4 != null) { -// try { -// dataOutputStream.close(); -// } catch (Throwable var13) { -// var4.addSuppressed(var13); -// } -// } else { -// dataOutputStream.close(); -// fileOutputStream.close(); -// } -// } - -// } -// } catch (IOException var16) { -// //todo handle exception - -// } - -// this.setDirty(false); -// } -// } } diff --git a/src/main/java/com/fibermc/essentialcommands/PlayerDataFactory.java b/src/main/java/com/fibermc/essentialcommands/PlayerDataFactory.java index e38617f0..7a98ce6a 100644 --- a/src/main/java/com/fibermc/essentialcommands/PlayerDataFactory.java +++ b/src/main/java/com/fibermc/essentialcommands/PlayerDataFactory.java @@ -4,9 +4,7 @@ public class PlayerDataFactory { - private static ManagerLocator _managers; - public static void init(ManagerLocator managers) { _managers = managers; } public static PlayerData create(ServerPlayerEntity player) { - return new PlayerData(player, _managers); + return new PlayerData(player); } } diff --git a/src/main/java/com/fibermc/essentialcommands/PlayerDataManager.java b/src/main/java/com/fibermc/essentialcommands/PlayerDataManager.java index 9f73e078..d025a86a 100644 --- a/src/main/java/com/fibermc/essentialcommands/PlayerDataManager.java +++ b/src/main/java/com/fibermc/essentialcommands/PlayerDataManager.java @@ -65,33 +65,30 @@ private void onPlayerDeath(UUID playerID, DamageSource damageSource) { } // SET / ADD - public void addPlayerData(ServerPlayerEntity player) { - + public PlayerData addPlayerData(ServerPlayerEntity player) { + PlayerData playerData = PlayerDataFactory.create(player); dataMap.put(player.getUuid(), PlayerDataFactory.create(player)); + return playerData; } public void addPlayerData(PlayerData pData) { dataMap.put(pData.getPlayer().getUuid(), pData); } - // GET - // ConcurrentHashMap getDataMap() { - // return this.dataMap; - // } public PlayerData getOrCreate(ServerPlayerEntity player) { UUID uuid = player.getUuid(); - if (!dataMap.containsKey(uuid)) { - addPlayerData(player); + PlayerData playerData = dataMap.get(uuid); + + if (playerData == null) { + playerData = addPlayerData(player); } - return dataMap.get(uuid); + return playerData; } PlayerData getPlayerFromUUID(UUID playerID) { return dataMap.get(playerID); } - - // SAVE / LOAD private void unloadPlayerData(ServerPlayerEntity player) { this.dataMap.remove(player.getUuid()); @@ -135,34 +132,6 @@ PlayerData loadPlayerData(ServerPlayerEntity player) throws IOException { PlayerData pData = PlayerDataFactory.create(player); -// PushbackInputStream pushbackInputStream = new PushbackInputStream(new FileInputStream(playerDataFile), 2); -// DataInputStream dataInputStream = new DataInputStream(pushbackInputStream); - -// NbtCompound NbtCompound3 = new NbtCompound(); -// Throwable var8 = null; -// if (this.inputIsCompressed(pushbackInputStream)) { -// NbtCompound3 = NbtIo.readCompressed(pushbackInputStream); -// } else { -// try { -// NbtCompound3 = NbtIo.read(dataInputStream); -// } catch (Throwable var31) { -// var8 = var31; -// throw var31; -// } finally { -// if (dataInputStream != null) { -// if (var8 != null) { -// try { -// dataInputStream.close(); -// } catch (Throwable var30) { -// var8.addSuppressed(var30); -// } -// } else { -// dataInputStream.close(); -// } -// } -// -// } -// } NbtCompound NbtCompound3 = NbtIo.readCompressed(new FileInputStream(playerDataFile)); //EssentialCommands.log(Level.INFO, "TagData:\n-=-=-=-=-=-\n"+NbtCompound3.asString()+"\n-=-=-=-=-=-=-=-"); @@ -173,45 +142,6 @@ PlayerData loadPlayerData(ServerPlayerEntity player) throws IOException { return pData; } -// @Nullable -// public NbtCompound loadPlayerDataMojang(PlayerEntity playerEntity) { -// NbtCompound NbtCompound = null; -// -// try { -// File file = new File(this.playerDataDir, playerEntity.getUuidAsString() + ".dat"); -// if (file.exists() && file.isFile()) { -// NbtCompound = NbtIo.readCompressed(new FileInputStream(file)); -// } -// } catch (Exception var4) { -// LOGGER.warn("Failed to load essential_commands player data for {}", playerEntity.getName().getString()); -// } -// -// if (NbtCompound != null) { -// int i = NbtCompound.contains("DataVersion", 3) ? NbtCompound.getInt("DataVersion") : -1; -// playerEntity.fromTag(NbtHelper.update(this.dataFixer, DataFixTypes.PLAYER, NbtCompound, i)); -// } -// -// return NbtCompound; -// } - - private boolean inputIsCompressed(PushbackInputStream pushbackInputStream) throws IOException { - byte[] bs = new byte[2]; - boolean bl = false; - int i = pushbackInputStream.read(bs, 0, 2); - if (i == 2) { - int j = (bs[1] & 255) << 8 | bs[0] & 255; - if (j == 35615) { - bl = true; - } - } - - if (i != 0) { - pushbackInputStream.unread(bs, 0, i); - } - - return bl; - } - public void savePlayerData(ServerPlayerEntity player) { this.getOrCreate(player).save(this.getPlayerDataFile(player)); } diff --git a/src/main/java/com/fibermc/essentialcommands/WorldDataManager.java b/src/main/java/com/fibermc/essentialcommands/WorldDataManager.java new file mode 100644 index 00000000..cc77a049 --- /dev/null +++ b/src/main/java/com/fibermc/essentialcommands/WorldDataManager.java @@ -0,0 +1,119 @@ +package com.fibermc.essentialcommands; + +import com.fibermc.essentialcommands.commands.suggestions.ListSuggestion; +import com.fibermc.essentialcommands.types.MinecraftLocation; + +import com.mojang.brigadier.suggestion.SuggestionProvider; +import net.minecraft.nbt.NbtCompound; +import net.minecraft.nbt.NbtElement; +import net.minecraft.nbt.NbtIo; +import net.minecraft.nbt.NbtNull; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.command.ServerCommandSource; +import net.minecraft.util.WorldSavePath; +import net.minecraft.world.PersistentState; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.HashMap; + +public class WorldDataManager extends PersistentState { + private HashMap warps; + private MinecraftLocation spawnLocation; + private Path saveDir; + private File worldDataFile; + public WorldDataManager() { + warps = new HashMap(); + spawnLocation = null; + } + + public void init(MinecraftServer server) { + this.saveDir = server.getSavePath(WorldSavePath.ROOT).resolve("essentialcommands"); + try { + Files.createDirectories(saveDir); + } catch (IOException e) { + e.printStackTrace(); + } + + this.worldDataFile = saveDir.resolve("world_data.dat").toFile(); + + try { + if (worldDataFile.createNewFile() || worldDataFile.length()==0) {//creates file and returns true only if file did not exist, otherwise returns false + //Initialize file if just created + this.save(); + } else { + this.fromNbt(NbtIo.readCompressed(worldDataFile).getCompound("data")); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + + private File getDataFile() { + return worldDataFile; + } + + public void fromNbt(NbtCompound tag) { + this.spawnLocation = new MinecraftLocation(tag.getCompound("spawnLocation")); + NbtCompound warpsNbt = tag.getCompound("warps"); + warpsNbt.getKeys().forEach((key) -> { + warps.put(key, new MinecraftLocation(warpsNbt.getCompound(key))); + }); + } + + public void save() { + super.save(this.worldDataFile); + } + + @Override + public NbtCompound writeNbt(NbtCompound tag) { + + // Spawn to NBT + NbtElement spawnNbt; + try { + spawnNbt = spawnLocation.asNbt(); + } catch (NullPointerException e) { + spawnNbt = NbtNull.INSTANCE; + } + tag.put("spawnLocation", spawnNbt); + + // Warps to NBT + NbtCompound warpsNbt = new NbtCompound(); + warps.forEach((key, value) -> { + warpsNbt.put(key, value.asNbt()); + }); + tag.put("warps", warpsNbt); + + return tag; + } + + // Command Actions + public void setWarp(String warpName, MinecraftLocation location) { + warps.put(warpName, location); + this.markDirty(); + this.save(); + } + public void delWarp(String warpName) { + warps.remove(warpName); + this.markDirty(); + this.save(); + } + public MinecraftLocation getWarp(String warpName) { + return warps.get(warpName); + } + public SuggestionProvider getWarpSuggestions() { + return (context, builder) -> ListSuggestion.getSuggestionsBuilder(builder, + this.warps.keySet().stream().toList() + ); + } + + public void setSpawn(MinecraftLocation location) { + spawnLocation = location; + } + public MinecraftLocation getSpawn() { + return spawnLocation; + } + +} diff --git a/src/main/java/com/fibermc/essentialcommands/commands/WarpDeleteCommand.java b/src/main/java/com/fibermc/essentialcommands/commands/WarpDeleteCommand.java new file mode 100644 index 00000000..ecaa83f1 --- /dev/null +++ b/src/main/java/com/fibermc/essentialcommands/commands/WarpDeleteCommand.java @@ -0,0 +1,42 @@ +package com.fibermc.essentialcommands.commands; + +import com.fibermc.essentialcommands.Config; +import com.fibermc.essentialcommands.WorldDataManager; +import com.mojang.brigadier.Command; +import com.mojang.brigadier.arguments.StringArgumentType; +import com.mojang.brigadier.context.CommandContext; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import net.minecraft.server.command.ServerCommandSource; +import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.text.LiteralText; + +import java.util.UUID; + +public class WarpDeleteCommand implements Command { + + private final WorldDataManager worldDataManager; + public WarpDeleteCommand(WorldDataManager worldDataManager) { + this.worldDataManager = worldDataManager; + } + + @Override + public int run(CommandContext context) throws CommandSyntaxException { + int out = 0; + //Store command sender + ServerPlayerEntity senderPlayer = context.getSource().getPlayer(); + //Store home name + String warpName = StringArgumentType.getString(context, "warp_name"); + + worldDataManager.delWarp(warpName); + + //inform command sender that the home has been removed + senderPlayer.sendSystemMessage( + new LiteralText("Warp ").formatted(Config.FORMATTING_DEFAULT) + .append(new LiteralText(warpName).formatted(Config.FORMATTING_ACCENT)) + .append(new LiteralText(" has been deleted.").formatted(Config.FORMATTING_DEFAULT)) + , UUID.randomUUID()); + + out = 1; + return out; + } +} diff --git a/src/main/java/com/fibermc/essentialcommands/commands/WarpSetCommand.java b/src/main/java/com/fibermc/essentialcommands/commands/WarpSetCommand.java new file mode 100644 index 00000000..f51f335b --- /dev/null +++ b/src/main/java/com/fibermc/essentialcommands/commands/WarpSetCommand.java @@ -0,0 +1,46 @@ +package com.fibermc.essentialcommands.commands; + +import com.fibermc.essentialcommands.Config; +import com.fibermc.essentialcommands.PlayerData; +import com.fibermc.essentialcommands.PlayerDataManager; +import com.fibermc.essentialcommands.WorldDataManager; +import com.fibermc.essentialcommands.types.MinecraftLocation; +import com.mojang.brigadier.Command; +import com.mojang.brigadier.arguments.StringArgumentType; +import com.mojang.brigadier.context.CommandContext; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import net.minecraft.server.command.ServerCommandSource; +import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.text.LiteralText; + +import java.util.UUID; + +public class WarpSetCommand implements Command { + + private final WorldDataManager worldDataManager; + public WarpSetCommand(WorldDataManager worldDataManager) { + this.worldDataManager = worldDataManager; + } + @Override + public int run(CommandContext context) throws CommandSyntaxException { + + //Store command sender + ServerPlayerEntity senderPlayer = context.getSource().getPlayer(); + //Store home name + String warpName = StringArgumentType.getString(context, "warp_name"); + + int successCode = 1; + + //Add warp + worldDataManager.setWarp(warpName, new MinecraftLocation(senderPlayer)); + + //inform command sender that the home has been set + senderPlayer.sendSystemMessage( + new LiteralText("Warp '").formatted(Config.FORMATTING_DEFAULT) + .append(new LiteralText(warpName).formatted(Config.FORMATTING_ACCENT)) + .append(new LiteralText("' set.").formatted(Config.FORMATTING_DEFAULT)) + , UUID.randomUUID()); + + return successCode; + } +} diff --git a/src/main/java/com/fibermc/essentialcommands/commands/WarpTpCommand.java b/src/main/java/com/fibermc/essentialcommands/commands/WarpTpCommand.java new file mode 100644 index 00000000..aa6253de --- /dev/null +++ b/src/main/java/com/fibermc/essentialcommands/commands/WarpTpCommand.java @@ -0,0 +1,57 @@ +package com.fibermc.essentialcommands.commands; + +import com.fibermc.essentialcommands.*; +import com.fibermc.essentialcommands.types.MinecraftLocation; +import com.mojang.brigadier.Command; +import com.mojang.brigadier.LiteralMessage; +import com.mojang.brigadier.Message; +import com.mojang.brigadier.arguments.StringArgumentType; +import com.mojang.brigadier.context.CommandContext; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import com.mojang.brigadier.exceptions.SimpleCommandExceptionType; +import net.minecraft.server.command.ServerCommandSource; +import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.text.LiteralText; + +import java.util.UUID; + +public class WarpTpCommand implements Command { + + private final PlayerDataManager playerDataManager; + private final WorldDataManager worldDataManager; + public WarpTpCommand(PlayerDataManager playerDataManager, WorldDataManager worldDataManager) { + this.playerDataManager = playerDataManager; + this.worldDataManager = worldDataManager; + } + + @Override + public int run(CommandContext context) throws CommandSyntaxException { + int out; + //Store command sender + ServerPlayerEntity senderPlayer = context.getSource().getPlayer(); + PlayerData senderPlayerData = playerDataManager.getOrCreate(senderPlayer); + //Store home name + String warpName = StringArgumentType.getString(context, "warp_name"); + + //Get home location + MinecraftLocation loc = worldDataManager.getWarp(warpName); + + // Teleport & chat message + if (loc != null) { + senderPlayer.sendSystemMessage( + new LiteralText("Teleporting to ").formatted(Config.FORMATTING_DEFAULT) + .append(new LiteralText(warpName).formatted(Config.FORMATTING_ACCENT)) + .append(new LiteralText("...").formatted(Config.FORMATTING_DEFAULT)) + , UUID.randomUUID()); + //Teleport player to home location + PlayerTeleporter.teleport(senderPlayerData, loc); + out = 1; + } else { + Message msg = new LiteralMessage("No warp with the name '" + warpName + "' could be found."); + throw new CommandSyntaxException(new SimpleCommandExceptionType(msg), msg); + } + + return out; + } + +} diff --git a/src/main/java/com/fibermc/essentialcommands/commands/suggestions/TeleportResponseSuggestion.java b/src/main/java/com/fibermc/essentialcommands/commands/suggestions/TeleportResponseSuggestion.java index 77ed3c44..a50e0655 100644 --- a/src/main/java/com/fibermc/essentialcommands/commands/suggestions/TeleportResponseSuggestion.java +++ b/src/main/java/com/fibermc/essentialcommands/commands/suggestions/TeleportResponseSuggestion.java @@ -11,9 +11,9 @@ public class TeleportResponseSuggestion { //Brigader Suggestions public static SuggestionProvider suggestedStrings(PlayerDataManager dataManager) { return (context, builder) -> ListSuggestion.getSuggestionsBuilder(builder, - dataManager.getOrCreate( - context.getSource().getPlayer()).getTpAskers() - .stream().map((entry) -> entry.getPlayer().getGameProfile().getName()) - .collect(Collectors.toList())); + dataManager.getOrCreate(context.getSource().getPlayer()).getTpAskers() + .stream().map((entry) -> entry.getPlayer().getGameProfile().getName()) + .collect(Collectors.toList()) + ); } } diff --git a/src/main/java/com/fibermc/essentialcommands/types/MinecraftLocation.java b/src/main/java/com/fibermc/essentialcommands/types/MinecraftLocation.java index dede22c2..b5af3a23 100644 --- a/src/main/java/com/fibermc/essentialcommands/types/MinecraftLocation.java +++ b/src/main/java/com/fibermc/essentialcommands/types/MinecraftLocation.java @@ -43,16 +43,20 @@ public MinecraftLocation(ServerPlayerEntity player) { } public MinecraftLocation(NbtCompound tag) { - //TODO make this actually work per dimension - this.dim = RegistryKey.of(Registry.WORLD_KEY, Identifier.tryParse(tag.getString("WorldRegistryKey")));//World.OVERWORLD;//(RegistryKey) Registry.get(Registry.DIMENSION).get(Identifier.tryParse(tag.getString("WorldRegistryKey")); + this.dim = RegistryKey.of( + Registry.WORLD_KEY, + Identifier.tryParse(tag.getString("WorldRegistryKey")) + ); this.x = tag.getDouble("x"); this.y = tag.getDouble("y"); this.z = tag.getDouble("z"); this.headYaw = tag.getFloat("headYaw"); this.pitch = tag.getFloat("pitch"); } - - public NbtCompound toTag(NbtCompound tag) { + public NbtCompound asNbt() { + return this.writeNbt(new NbtCompound()); + } + public NbtCompound writeNbt(NbtCompound tag) { tag.putString("WorldRegistryKey", dim.getValue().toString()); tag.putDouble("x", x); tag.putDouble("y", y);