From 4128629f63272e106d0f84eead983d37d3ed813e Mon Sep 17 00:00:00 2001 From: MrSnowy Date: Sun, 16 Feb 2025 23:58:34 +0100 Subject: [PATCH] Still rewriting, I'm getting there! --- CHANGELOG.md | 1 + .../teleport_commands/commands/back.java | 84 +++++----- .../teleport_commands/commands/home.java | 158 ++++++++++-------- .../teleport_commands/commands/tpa.java | 39 ++--- .../teleport_commands/commands/warp.java | 7 +- .../commands/worldspawn.java | 56 +++---- .../common/DeathLocation.java | 54 ++++++ .../common/NamedLocation.java | 67 ++++++++ .../teleport_commands/common/Player.java | 76 +++++++++ .../storage/DeathLocationStorage.java | 2 +- .../storage/StorageManager.java | 17 +- .../suggestions/HomeSuggestionProvider.java | 8 +- .../suggestions/WarpSuggestionProvider.java | 2 +- .../teleport_commands/utils/tools.java | 51 +++--- 14 files changed, 405 insertions(+), 217 deletions(-) create mode 100644 common/src/main/java/dev/mrsnowy/teleport_commands/common/DeathLocation.java create mode 100644 common/src/main/java/dev/mrsnowy/teleport_commands/common/NamedLocation.java create mode 100644 common/src/main/java/dev/mrsnowy/teleport_commands/common/Player.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 15ee365..b0008cc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Improved the Storage classes and functions (I'm doing proper java, yipie) - Better error handling for command suggestions - Added hover effects for warp and homes text (W.I.P) +- Throw an exception when the world isn't found (when doing back or home), instead of giving an incorrect notFound error. ### [v1.2.2] - Handled a case where the client (geyser) will return the language as uppercase instead of lowercase. diff --git a/common/src/main/java/dev/mrsnowy/teleport_commands/commands/back.java b/common/src/main/java/dev/mrsnowy/teleport_commands/commands/back.java index da06b09..849fc20 100644 --- a/common/src/main/java/dev/mrsnowy/teleport_commands/commands/back.java +++ b/common/src/main/java/dev/mrsnowy/teleport_commands/commands/back.java @@ -1,13 +1,12 @@ package dev.mrsnowy.teleport_commands.commands; import com.mojang.brigadier.arguments.BoolArgumentType; -import com.mojang.datafixers.util.Pair; import dev.mrsnowy.teleport_commands.TeleportCommands; import java.util.*; import dev.mrsnowy.teleport_commands.storage.DeathLocationStorage; -import dev.mrsnowy.teleport_commands.utils.tools; +import dev.mrsnowy.teleport_commands.common.DeathLocation; import net.minecraft.ChatFormatting; import net.minecraft.commands.Commands; import net.minecraft.core.BlockPos; @@ -58,69 +57,66 @@ public class back { } - private static void ToDeathLocation(ServerPlayer player, boolean safetyDisabled) { + // ----- - DeathLocationStorage.backList backList = DeathLocationStorage.backList; - // get the deathLocation - Optional optionalDeathLocation = backList.getDeathLocation( player.getStringUUID() ); + // Gets the DeathLocation of the player and teleports the player to it + private static void ToDeathLocation(ServerPlayer player, boolean safetyDisabled) throws Exception { + + Optional optionalDeathLocation = DeathLocationStorage.getDeathLocation(player.getStringUUID()); + if (optionalDeathLocation.isEmpty()) { player.displayClientMessage(getTranslatedText("commands.teleport_commands.common.noLocation", player) .withStyle(ChatFormatting.RED), true); return; } - DeathLocationStorage.deathLocationClass deathLocation = optionalDeathLocation.get(); + DeathLocation deathLocation = optionalDeathLocation.get(); - // get the world - Optional OptionalWorld = tools.getWorld( deathLocation.world ); - if (OptionalWorld.isEmpty()) { - player.displayClientMessage(getTranslatedText("commands.teleport_commands.common.noLocation", player) - .withStyle(ChatFormatting.RED), true); - return; + // get the world, otherwise throw an exception + Optional optionalWorld = deathLocation.getWorld(); + if (optionalWorld.isEmpty()) { + // todo! test this exception + + throw new Exception( String.format("Couldn't find a world with the id: %s \nAvailable worlds: %s", + deathLocation.getWorldString(), TeleportCommands.SERVER.getAllLevels())); } - ServerLevel world = OptionalWorld.get(); + ServerLevel deathLocationWorld = optionalWorld.get(); + BlockPos teleportBlockPos; - // if safety is enabled, check if the death location is safe. + // Sets the teleportBlockPos based on if it should do safety checking if (!safetyDisabled) { + Optional safeBlockPos = getSafeBlockPos(deathLocation.getBlockPos(), deathLocationWorld); - Pair> teleportData = teleportSafetyChecker(deathLocation.pos, world, player); + // Check if there is a safe BlockPos + if (safeBlockPos.isPresent()) { + teleportBlockPos = safeBlockPos.get(); - switch (teleportData.getFirst()) { - case 0: // safe location found! - if (teleportData.getSecond().isPresent()) { - player.displayClientMessage(getTranslatedText("commands.teleport_commands.back.go", player), true); - Teleporter(player, world, teleportData.getSecond().get()); - } else { - player.displayClientMessage(getTranslatedText("commands.teleport_commands.common.error", player).withStyle(ChatFormatting.RED, ChatFormatting.BOLD), true); - } - - break; - case 1: // same - player.displayClientMessage(getTranslatedText("commands.teleport_commands.back.same", player).withStyle(ChatFormatting.AQUA), true); - break; - case 2: // no safe location - - player.displayClientMessage(getTranslatedText("commands.teleport_commands.common.noSafeLocation", player).withStyle(ChatFormatting.RED, ChatFormatting.BOLD), false); - player.displayClientMessage(getTranslatedText("commands.teleport_commands.common.safetyIsForLosers", player).withStyle(ChatFormatting.AQUA), false); - player.displayClientMessage(getTranslatedText("commands.teleport_commands.common.forceTeleport", player).withStyle(ChatFormatting.AQUA, ChatFormatting.BOLD) - .withStyle(style -> style.withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/back true"))),false); - break; + } else { + // asks the player if they want to teleport anyway + player.displayClientMessage(getTranslatedText("commands.teleport_commands.common.noSafeLocation", player).withStyle(ChatFormatting.RED, ChatFormatting.BOLD), false); + player.displayClientMessage(getTranslatedText("commands.teleport_commands.common.safetyIsForLosers", player).withStyle(ChatFormatting.AQUA), false); + player.displayClientMessage(getTranslatedText("commands.teleport_commands.common.forceTeleport", player).withStyle(ChatFormatting.AQUA, ChatFormatting.BOLD) + .withStyle(style -> style.withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/back true"))),false); + return; } } else { - BlockPos playerBlockPos = new BlockPos(player.getBlockX(), player.getBlockY(), player.getBlockZ()); + // no checking needed, just set it. + teleportBlockPos = deathLocation.getBlockPos(); + } - if (!playerBlockPos.equals(deathLocation.pos) || player.level() != world) { + // check if the player is already at this location (in the same world) + if (player.blockPosition().equals(teleportBlockPos) && player.level() == deathLocationWorld) { + player.displayClientMessage(getTranslatedText("commands.teleport_commands.back.same", player).withStyle(ChatFormatting.AQUA), true); - player.displayClientMessage(getTranslatedText("commands.teleport_commands.back.go", player), true); - Teleporter(player, world, new Vec3(deathLocation.pos.getX() + 0.5, deathLocation.pos.getY(), deathLocation.pos.getZ() + 0.5)); + } else { + // teleport the player! + Vec3 teleportPos = new Vec3(teleportBlockPos.getX() + 0.5, teleportBlockPos.getY(), teleportBlockPos.getZ() + 0.5); - } else { - player.displayClientMessage(getTranslatedText("commands.teleport_commands.back.same", player).withStyle(ChatFormatting.AQUA), true); - } + player.displayClientMessage(getTranslatedText("commands.teleport_commands.back.go", player), true); + Teleporter(player, deathLocationWorld, teleportPos); } - } } diff --git a/common/src/main/java/dev/mrsnowy/teleport_commands/commands/home.java b/common/src/main/java/dev/mrsnowy/teleport_commands/commands/home.java index 2f395d4..f9c51a7 100644 --- a/common/src/main/java/dev/mrsnowy/teleport_commands/commands/home.java +++ b/common/src/main/java/dev/mrsnowy/teleport_commands/commands/home.java @@ -4,8 +4,14 @@ import com.mojang.brigadier.arguments.StringArgumentType; import com.mojang.datafixers.util.Pair; import dev.mrsnowy.teleport_commands.TeleportCommands; import dev.mrsnowy.teleport_commands.storage.StorageManager; +import dev.mrsnowy.teleport_commands.common.NamedLocation; +import dev.mrsnowy.teleport_commands.common.Player; import dev.mrsnowy.teleport_commands.suggestions.HomeSuggestionProvider; + +import java.util.Locale; import java.util.Objects; +import java.util.Optional; + import net.minecraft.ChatFormatting; import net.minecraft.commands.Commands; import net.minecraft.core.BlockPos; @@ -15,9 +21,9 @@ import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.phys.Vec3; +import static dev.mrsnowy.teleport_commands.storage.StorageManager.STORAGE; import static dev.mrsnowy.teleport_commands.utils.tools.getTranslatedText; import static net.minecraft.commands.Commands.argument; -import static dev.mrsnowy.teleport_commands.storage.StorageManager.GetPlayerStorage; import static dev.mrsnowy.teleport_commands.storage.StorageManager.StorageSaver; import static dev.mrsnowy.teleport_commands.utils.tools.Teleporter; @@ -150,112 +156,124 @@ public class home { } + // ----- + // Adds a new home to the homeList of a player private static void SetHome(ServerPlayer player, String homeName) throws Exception { homeName = homeName.toLowerCase(); - BlockPos blockPos = new BlockPos(player.getBlockX(), player.getBlockY(), player.getBlockZ()); + BlockPos blockPos = player.blockPosition(); ServerLevel world = player.serverLevel(); - Pair storages = GetPlayerStorage(player.getStringUUID()); - StorageManager.StorageClass storage = storages.getFirst(); - StorageManager.StorageClass.Player playerStorage = storages.getSecond(); - - boolean homeNotFound = true; + // Gets player storage and makes it if it doesn't exist + Player playerStorage = StorageManager.STORAGE.addPlayer(player.getStringUUID()); // check for duplicates - for (StorageManager.StorageClass.NamedLocation currentHome : playerStorage.Homes) { - if (Objects.equals(currentHome.name, homeName)) { - homeNotFound = false; - break; - } + if (playerStorage.getHome(homeName).isPresent()) { + player.displayClientMessage(getTranslatedText("commands.teleport_commands.home.exists", player).withStyle(ChatFormatting.RED), true); + return; } - if (homeNotFound) { - // Create a new NamedLocation - StorageManager.StorageClass.NamedLocation homeLocation = new StorageManager.StorageClass.NamedLocation(homeName, blockPos, world.dimension().location().toString()); - - playerStorage.Homes.add(homeLocation); - - if (playerStorage.Homes.size() == 1) { - playerStorage.DefaultHome = homeName; - } + // Create a new NamedLocation + playerStorage.setHome(homeName, blockPos, world.dimension().location().toString()); - StorageSaver(); - player.displayClientMessage(getTranslatedText("commands.teleport_commands.home.set", player), true); - } else { - player.displayClientMessage(getTranslatedText("commands.teleport_commands.home.exists", player).withStyle(ChatFormatting.RED), true); + // Set it as the default if there are no other homes + if (playerStorage.getHomes().size() == 1) { + playerStorage.setDefaultHome(homeName); } + + // Display message that the home as been set + player.displayClientMessage(getTranslatedText("commands.teleport_commands.home.set", player), true); } + // Teleports the player to the home. It will go to the defaultHome if homeName is empty private static void GoHome(ServerPlayer player, String homeName) throws Exception { homeName = homeName.toLowerCase(); - StorageManager.StorageClass.Player playerStorage = GetPlayerStorage(player.getStringUUID()).getSecond(); - // check if there is a default exists + // Gets player storage + Optional optionalPlayerStorage = STORAGE.getPlayer(player.getStringUUID()); + if (optionalPlayerStorage.isEmpty()) { + player.displayClientMessage(getTranslatedText("commands.teleport_commands.home.homeless", player).withStyle(ChatFormatting.AQUA), true); + return; + } + + Player playerStorage = optionalPlayerStorage.get(); + + // if homeName is empty, get the default home if (homeName.isEmpty()) { - if (playerStorage.DefaultHome.isEmpty()) { + // todo! if there is no default home set, maybe give an message saying: no default home set! + String defaultHome = playerStorage.getDefaultHome(); + + if (defaultHome.isEmpty()) { player.displayClientMessage(getTranslatedText("commands.teleport_commands.home.homeless", player).withStyle(ChatFormatting.AQUA), true); return; } else { - homeName = playerStorage.DefaultHome; + homeName = defaultHome; } } - boolean foundWorld = false; + // get the home (if it exists) + Optional optionalHome = playerStorage.getHome(homeName); + if (optionalHome.isEmpty()) { + player.displayClientMessage(getTranslatedText("commands.teleport_commands.home.notFound", player).withStyle(ChatFormatting.AQUA), true); + return; + } - // find correct home - for (StorageManager.StorageClass.NamedLocation currentHome : playerStorage.Homes) { - if (Objects.equals(currentHome.name, homeName)) { - - // find correct world - for (ServerLevel currentWorld : TeleportCommands.SERVER.getAllLevels()) { - if (Objects.equals(currentWorld.dimension().location().toString(), currentHome.world)) { - foundWorld = true; - - BlockPos blockPos = new BlockPos(currentHome.x, currentHome.y, currentHome.z); - BlockPos playerBlockPos = new BlockPos(player.getBlockX(), player.getBlockY(), player.getBlockZ()); - - if (!playerBlockPos.equals(blockPos) || player.level() != currentWorld) { - player.displayClientMessage(getTranslatedText("commands.teleport_commands.home.go", player), true); - Teleporter(player, currentWorld, new Vec3(currentHome.x + 0.5, currentHome.y, currentHome.z + 0.5)); - } else { - player.displayClientMessage(getTranslatedText("commands.teleport_commands.home.goSame", player).withStyle(ChatFormatting.AQUA), true); - } - break; - } - } - } + NamedLocation home = optionalHome.get(); + + // get the world, otherwise throw an exception + Optional optionalHomeWorld = home.getWorld(); + if (optionalHomeWorld.isEmpty()) { + // todo! test this exception + + throw new Exception( String.format("Couldn't find a world with the id: %s \nAvailable worlds: %s", + home.getWorldString(), TeleportCommands.SERVER.getAllLevels())); } - if (!foundWorld) { - player.displayClientMessage(getTranslatedText("commands.teleport_commands.home.notFound", player).withStyle(ChatFormatting.RED), true); + ServerLevel homeWorld = optionalHomeWorld.get(); + BlockPos teleportBlockPos = home.getBlockPos(); + + // check if the player is already at this location (in the same world) + if (player.blockPosition().equals(teleportBlockPos) && player.level() == homeWorld) { + player.displayClientMessage(getTranslatedText("commands.teleport_commands.home.goSame", player).withStyle(ChatFormatting.AQUA), true); + + } else { + // teleport the player! + Vec3 teleportPos = new Vec3(teleportBlockPos.getX() + 0.5, teleportBlockPos.getY(), teleportBlockPos.getZ() + 0.5); + + player.displayClientMessage(getTranslatedText("commands.teleport_commands.home.go", player), true); + Teleporter(player, homeWorld, teleportPos); } } private static void DeleteHome(ServerPlayer player, String homeName) throws Exception { homeName = homeName.toLowerCase(); - Pair storages = GetPlayerStorage(player.getStringUUID()); - StorageManager.StorageClass storage = storages.getFirst(); - StorageManager.StorageClass.Player playerStorage = storages.getSecond(); - boolean deletedHome = false; + // Gets player storage + Optional optionalPlayerStorage = STORAGE.getPlayer(player.getStringUUID()); + if (optionalPlayerStorage.isEmpty()) { + player.displayClientMessage(getTranslatedText("commands.teleport_commands.home.homeless", player).withStyle(ChatFormatting.AQUA), true); + return; + } - // get correct home - for (StorageManager.StorageClass.NamedLocation currentHome : playerStorage.Homes) { - if (Objects.equals(currentHome.name, homeName)) { - // delete the home - playerStorage.Homes.remove(currentHome); - StorageSaver(); + Player playerStorage = optionalPlayerStorage.get(); - deletedHome = true; - player.displayClientMessage(getTranslatedText("commands.teleport_commands.home.delete", player), true); - break; - } + // Get the home from the player + Optional optionalHome = playerStorage.getHome(homeName); + if (optionalHome.isEmpty()) { + player.displayClientMessage(getTranslatedText("commands.teleport_commands.home.notFound", player).withStyle(ChatFormatting.AQUA), true); + return; } - if (!deletedHome) { - player.displayClientMessage(getTranslatedText("commands.teleport_commands.home.notFound", player).withStyle(ChatFormatting.RED), true); + NamedLocation home = optionalHome.get(); + + // check if it's the default home, if it is set it to the default value + if (playerStorage.getDefaultHome().equals(homeName)) { + playerStorage.setDefaultHome(""); } + + // delete the home + playerStorage.deleteHome(home); + player.displayClientMessage(getTranslatedText("commands.teleport_commands.home.delete", player), true); } private static void RenameHome(ServerPlayer player, String homeName, String newHomeName) throws Exception { diff --git a/common/src/main/java/dev/mrsnowy/teleport_commands/commands/tpa.java b/common/src/main/java/dev/mrsnowy/teleport_commands/commands/tpa.java index 91fc814..d588b8b 100644 --- a/common/src/main/java/dev/mrsnowy/teleport_commands/commands/tpa.java +++ b/common/src/main/java/dev/mrsnowy/teleport_commands/commands/tpa.java @@ -2,13 +2,13 @@ package dev.mrsnowy.teleport_commands.commands; import java.util.*; -import com.mojang.datafixers.util.Pair; import dev.mrsnowy.teleport_commands.TeleportCommands; import dev.mrsnowy.teleport_commands.suggestions.tpaSuggestionProvider; import net.minecraft.ChatFormatting; import net.minecraft.commands.Commands; import net.minecraft.commands.arguments.EntityArgument; +import net.minecraft.core.BlockPos; import net.minecraft.network.chat.ClickEvent; import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerPlayer; @@ -31,6 +31,8 @@ public class tpa { this.here = here; tpaList.add(this); } + + } public static void register(Commands commandManager) { @@ -116,7 +118,6 @@ public class tpa { .filter(tpa -> Objects.equals(ToPlayer.getStringUUID(), tpa.RecPlayer)) .count(); - if (FromPlayer == ToPlayer) { FromPlayer.displayClientMessage(getTranslatedText("commands.teleport_commands.tpa.self", FromPlayer).withStyle(ChatFormatting.AQUA), true); @@ -165,37 +166,31 @@ public class tpa { private static void tpaAccept(ServerPlayer FromPlayer, ServerPlayer ToPlayer) { if (FromPlayer == ToPlayer) { - FromPlayer.displayClientMessage(getTranslatedText("commands.teleport_commands.tpa.self", FromPlayer).withStyle(ChatFormatting.AQUA),true); + FromPlayer.displayClientMessage(getTranslatedText("commands.teleport_commands.tpa.self", FromPlayer).withStyle(ChatFormatting.AQUA), true); return; } + // Check if there is a request Optional tpaStorage = tpaList.stream() .filter(tpa -> Objects.equals(ToPlayer.getStringUUID(), tpa.InitPlayer)) .filter(tpa -> Objects.equals(FromPlayer.getStringUUID(), tpa.RecPlayer)) .findFirst(); - // Check if there is a request if (tpaStorage.isPresent()) { - + // Request found ServerPlayer destinationPlayer = tpaStorage.get().here ? ToPlayer : FromPlayer; ServerPlayer toSentPlayer = tpaStorage.get().here ? FromPlayer : ToPlayer; - Pair> teleportData = teleportSafetyChecker(destinationPlayer.blockPosition(), destinationPlayer.serverLevel(), toSentPlayer); // todo! make sure .blockPosition is correct - - switch (teleportData.getFirst()) { - case 1: // same (let it fall through) - case 0: // safe! - if (teleportData.getSecond().isPresent() ) { - - Teleporter(toSentPlayer, destinationPlayer.serverLevel(), teleportData.getSecond().get()); - break; - } else { - toSentPlayer.displayClientMessage(getTranslatedText("commands.teleport_commands.common.error", toSentPlayer).withStyle(ChatFormatting.RED, ChatFormatting.BOLD), true); - return; // exit - } - case 2: // if no safe location then just teleport to the player - Teleporter(toSentPlayer, destinationPlayer.serverLevel(), destinationPlayer.position()); - break; + Optional teleportData = getSafeBlockPos(destinationPlayer.blockPosition(), destinationPlayer.serverLevel()); + + if (teleportData.isPresent()) { + BlockPos safeBlockPos = teleportData.get(); + Vec3 teleportPos = new Vec3(safeBlockPos.getX() + 0.5, safeBlockPos.getY(), safeBlockPos.getZ() + 0.5); + + Teleporter(toSentPlayer, destinationPlayer.serverLevel(), teleportPos); + } else { + // if no safe location then just teleport to the player + Teleporter(toSentPlayer, destinationPlayer.serverLevel(), destinationPlayer.position()); } // if the player teleported then these messages get sent && the request gets removed @@ -203,8 +198,8 @@ public class tpa { ToPlayer.displayClientMessage(getTranslatedText("commands.teleport_commands.tpa.accepted", ToPlayer).withStyle(ChatFormatting.GREEN),true); tpaList.remove(tpaStorage.get()); - // No request found } else { + // No request found FromPlayer.displayClientMessage(getTranslatedText("commands.teleport_commands.tpa.notFound", FromPlayer).withStyle(ChatFormatting.RED),true); } } diff --git a/common/src/main/java/dev/mrsnowy/teleport_commands/commands/warp.java b/common/src/main/java/dev/mrsnowy/teleport_commands/commands/warp.java index 4ae0863..a49d986 100644 --- a/common/src/main/java/dev/mrsnowy/teleport_commands/commands/warp.java +++ b/common/src/main/java/dev/mrsnowy/teleport_commands/commands/warp.java @@ -3,8 +3,7 @@ package dev.mrsnowy.teleport_commands.commands; import com.mojang.brigadier.arguments.StringArgumentType; import com.mojang.datafixers.util.Pair; import dev.mrsnowy.teleport_commands.TeleportCommands; -import dev.mrsnowy.teleport_commands.storage.StorageManager; -import dev.mrsnowy.teleport_commands.storage.classes.NamedLocation; +import dev.mrsnowy.teleport_commands.common.NamedLocation; import dev.mrsnowy.teleport_commands.suggestions.WarpSuggestionProvider; import net.minecraft.ChatFormatting; import net.minecraft.commands.Commands; @@ -15,9 +14,7 @@ import net.minecraft.network.chat.HoverEvent; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.phys.Vec3; -import org.apache.logging.log4j.core.config.builder.api.ComponentBuilder; -import javax.swing.text.html.Option; import java.util.ArrayList; import java.util.List; import java.util.Objects; @@ -206,7 +203,7 @@ public class warp { Optional optionalWarp = STORAGE.getWarp(warpName); if (optionalWarp.isPresent()) { - STORAGE.removeWarp(warpName); //todo! maybe improve double getting of warp? + STORAGE.rmWarp(optionalWarp.get()); } else { // the warp is not found diff --git a/common/src/main/java/dev/mrsnowy/teleport_commands/commands/worldspawn.java b/common/src/main/java/dev/mrsnowy/teleport_commands/commands/worldspawn.java index 7a213f7..013b0f0 100644 --- a/common/src/main/java/dev/mrsnowy/teleport_commands/commands/worldspawn.java +++ b/common/src/main/java/dev/mrsnowy/teleport_commands/commands/worldspawn.java @@ -1,7 +1,6 @@ package dev.mrsnowy.teleport_commands.commands; import com.mojang.brigadier.arguments.BoolArgumentType; -import com.mojang.datafixers.util.Pair; import dev.mrsnowy.teleport_commands.TeleportCommands; import net.minecraft.ChatFormatting; import net.minecraft.commands.Commands; @@ -31,7 +30,7 @@ public class worldspawn { toWorldSpawn(player, false); } catch (Exception error) { - TeleportCommands.LOGGER.error("Error while going back! => ", error); + TeleportCommands.LOGGER.error("Error while going to the worldspawn! => ", error); player.displayClientMessage(getTranslatedText("commands.teleport_commands.common.error", player).withStyle(ChatFormatting.RED, ChatFormatting.BOLD), true); return 1; } @@ -47,7 +46,7 @@ public class worldspawn { toWorldSpawn(player, safety); } catch (Exception error) { - TeleportCommands.LOGGER.error("Error while going back! => ", error); + TeleportCommands.LOGGER.error("Error while going to the worldspawn! => ", error); player.displayClientMessage(getTranslatedText("commands.teleport_commands.common.error", player).withStyle(ChatFormatting.RED, ChatFormatting.BOLD), true); return 1; } @@ -60,42 +59,41 @@ public class worldspawn { private static void toWorldSpawn(ServerPlayer player, boolean safetyDisabled) throws NullPointerException { // todo! maybe make this more fool proof? ServerLevel world = TeleportCommands.SERVER.getLevel(OVERWORLD); - BlockPos worldSpawn = Objects.requireNonNull(world,"Overworld cannot be null").getSharedSpawnPos(); + BlockPos worldSpawn = Objects.requireNonNull(world,"Overworld cannot be null!").getSharedSpawnPos(); if (!safetyDisabled) { - Pair> teleportData = teleportSafetyChecker(worldSpawn, world, player); - - switch (teleportData.getFirst()) { - case 0: // safe location found! - if (teleportData.getSecond().isPresent()) { - player.displayClientMessage(getTranslatedText("commands.teleport_commands.worldspawn.go", player), true); - Teleporter(player, world, teleportData.getSecond().get()); - } else { - player.displayClientMessage(getTranslatedText("commands.teleport_commands.common.error", player).withStyle(ChatFormatting.RED, ChatFormatting.BOLD), true); - } + Optional teleportData = getSafeBlockPos(worldSpawn, world); + + if (teleportData.isPresent()) { + BlockPos safeBlockPos = teleportData.get(); + + // check if the player is already at this location + if (player.blockPosition().equals(safeBlockPos) && player.level() == world) { - break; - case 1: // the location is already safe! player.displayClientMessage(getTranslatedText("commands.teleport_commands.worldspawn.same", player).withStyle(ChatFormatting.AQUA), true); - break; - case 2: // no safe location found! - - player.displayClientMessage(getTranslatedText("commands.teleport_commands.common.noSafeLocation", player).withStyle(ChatFormatting.RED, ChatFormatting.BOLD), false); - player.displayClientMessage(getTranslatedText("commands.teleport_commands.common.safetyIsForLosers", player).withStyle(ChatFormatting.AQUA), false); - player.displayClientMessage(getTranslatedText("commands.teleport_commands.common.forceTeleport", player).withStyle(ChatFormatting.AQUA, ChatFormatting.BOLD) - .withStyle(style -> style.withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/worldspawn true"))),false); - break; + } else { + Vec3 teleportPos = new Vec3(safeBlockPos.getX() + 0.5, safeBlockPos.getY(), safeBlockPos.getZ() + 0.5); + + player.displayClientMessage(getTranslatedText("commands.teleport_commands.worldspawn.go", player), true); + Teleporter(player, world, teleportPos); + } + + } else { + player.displayClientMessage(getTranslatedText("commands.teleport_commands.common.noSafeLocation", player).withStyle(ChatFormatting.RED, ChatFormatting.BOLD), false); + player.displayClientMessage(getTranslatedText("commands.teleport_commands.common.safetyIsForLosers", player).withStyle(ChatFormatting.AQUA), false); + player.displayClientMessage(getTranslatedText("commands.teleport_commands.common.forceTeleport", player).withStyle(ChatFormatting.AQUA, ChatFormatting.BOLD) + .withStyle(style -> style.withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/worldspawn true"))),false); } + } else { - BlockPos playerBlockPos = new BlockPos(player.getBlockX(), player.getBlockY(), player.getBlockZ()); - if (!playerBlockPos.equals(worldSpawn) || player.level() != world) { + if (player.blockPosition().equals(worldSpawn) && player.level() == world) { + + player.displayClientMessage(getTranslatedText("commands.teleport_commands.worldspawn.same", player).withStyle(ChatFormatting.AQUA), true); + } else { player.displayClientMessage(getTranslatedText("commands.teleport_commands.worldspawn.go", player), true); Teleporter(player, world, new Vec3(worldSpawn.getX() + 0.5, worldSpawn.getY(), worldSpawn.getZ() + 0.5)); - - } else { - player.displayClientMessage(getTranslatedText("commands.teleport_commands.worldspawn.same", player).withStyle(ChatFormatting.AQUA), true); } } } diff --git a/common/src/main/java/dev/mrsnowy/teleport_commands/common/DeathLocation.java b/common/src/main/java/dev/mrsnowy/teleport_commands/common/DeathLocation.java new file mode 100644 index 0000000..be7f083 --- /dev/null +++ b/common/src/main/java/dev/mrsnowy/teleport_commands/common/DeathLocation.java @@ -0,0 +1,54 @@ +package dev.mrsnowy.teleport_commands.common; + +import dev.mrsnowy.teleport_commands.TeleportCommands; +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; + +import java.util.Objects; +import java.util.Optional; +import java.util.stream.StreamSupport; + +public class DeathLocation { + private final String UUID; + private BlockPos pos; + private String world; + + public DeathLocation(String uuid, BlockPos pos, String world) { + this.UUID = uuid; + this.pos = pos; + this.world = world; + } + + // ----- + + public String getUUID() { + return UUID; + } + + public BlockPos getBlockPos() { + return pos; + } + + // maybe add getX getY and getZ? todo! + + public String getWorldString() { + return world; + } + + // function to quickly filter the worlds and get the ServerLevel for the string + public Optional getWorld() { + return StreamSupport.stream( TeleportCommands.SERVER.getAllLevels().spliterator(), false ) // woa, this looks silly + .filter(level -> Objects.equals( level.dimension().location().toString(), this.world )) + .findFirst(); + } + + // ----- note to self: these don't need to be saved since this class isn't a part of the storage :3 + + public void setBlockPos(BlockPos pos) { + this.pos = pos; + } + + public void setWorld(String world) { + this.world = world; + } +} diff --git a/common/src/main/java/dev/mrsnowy/teleport_commands/common/NamedLocation.java b/common/src/main/java/dev/mrsnowy/teleport_commands/common/NamedLocation.java new file mode 100644 index 0000000..d90bf8e --- /dev/null +++ b/common/src/main/java/dev/mrsnowy/teleport_commands/common/NamedLocation.java @@ -0,0 +1,67 @@ +package dev.mrsnowy.teleport_commands.common; + +import dev.mrsnowy.teleport_commands.TeleportCommands; +import dev.mrsnowy.teleport_commands.storage.StorageManager; +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; + +import java.util.Objects; +import java.util.Optional; +import java.util.stream.StreamSupport; + +public class NamedLocation { + private String name; + private final int x; + private final int y; + private final int z; + private final String world; + + public NamedLocation(String name, BlockPos pos, String world) { + this.name = name; + this.x = pos.getX(); + this.y = pos.getY(); + this.z = pos.getZ(); + this.world = world; + } + + // ----- + + public String getName() { + return this.name; + } + + public BlockPos getBlockPos() { + return new BlockPos(this.x, this.y, this.z); + } + + public int getX() { + return this.x; + } + + public int getY() { + return this.y; + } + + public int getZ() { + return this.z; + } + + public String getWorldString() { + return this.world; + } + + // function to quickly filter the worlds and get the ServerLevel for the string + public Optional getWorld() { + return StreamSupport.stream( TeleportCommands.SERVER.getAllLevels().spliterator(), false ) // woa, this looks silly + .filter(level -> Objects.equals( level.dimension().location().toString(), this.world )) + .findFirst(); + + } + + // ----- + + public void setName(String name) throws Exception { + this.name = name; + StorageManager.StorageSaver(); + } +} \ No newline at end of file diff --git a/common/src/main/java/dev/mrsnowy/teleport_commands/common/Player.java b/common/src/main/java/dev/mrsnowy/teleport_commands/common/Player.java new file mode 100644 index 0000000..5ac38b4 --- /dev/null +++ b/common/src/main/java/dev/mrsnowy/teleport_commands/common/Player.java @@ -0,0 +1,76 @@ +package dev.mrsnowy.teleport_commands.common; + +import dev.mrsnowy.teleport_commands.storage.StorageManager; +import net.minecraft.core.BlockPos; + +import java.util.ArrayList; +import java.util.Objects; +import java.util.Optional; + +import static java.util.Collections.unmodifiableList; + +public class Player { + private final String UUID; + private String DefaultHome = ""; + private final ArrayList Homes = new ArrayList<>(); + + public Player(String uuid) { + this.UUID = uuid; + } + + // ----- + + public String getUUID() { + return UUID; + } + + public String getDefaultHome() { + return DefaultHome; + } + + // returns all homes + public ArrayList getHomes() { + return (ArrayList) unmodifiableList(Homes); + } + + // returns a specific home based on the name (if there is one) + public Optional getHome(String name) { + return Homes.stream() + .filter( home -> Objects.equals( home.getName(), name )) + .findFirst(); + } + + // ----- + + public void setDefaultHome(String defaultHome) throws Exception { + this.DefaultHome = defaultHome; + StorageManager.StorageSaver(); + } + + // todo! modify this so it uses a NamedLocation as an input + // creates a new home, if there already is a home it will update the existing one + public void setHome(String name, BlockPos pos, String world) throws Exception { + Optional optionalHome = getHome(name); + NamedLocation home; + + if (optionalHome.isEmpty()) { + home = new NamedLocation(name, pos, world); + + Homes.add(home); + } else { + home = optionalHome.get(); + + home.setName(name); + } + + StorageManager.StorageSaver(); + } + + // ----- + + public void deleteHome(NamedLocation home) throws Exception { + Homes.remove(home); + + StorageManager.StorageSaver(); + } +} diff --git a/common/src/main/java/dev/mrsnowy/teleport_commands/storage/DeathLocationStorage.java b/common/src/main/java/dev/mrsnowy/teleport_commands/storage/DeathLocationStorage.java index 82d24bb..5c79631 100644 --- a/common/src/main/java/dev/mrsnowy/teleport_commands/storage/DeathLocationStorage.java +++ b/common/src/main/java/dev/mrsnowy/teleport_commands/storage/DeathLocationStorage.java @@ -1,6 +1,6 @@ package dev.mrsnowy.teleport_commands.storage; -import dev.mrsnowy.teleport_commands.storage.classes.DeathLocation; +import dev.mrsnowy.teleport_commands.common.DeathLocation; import net.minecraft.core.BlockPos; import java.util.ArrayList; diff --git a/common/src/main/java/dev/mrsnowy/teleport_commands/storage/StorageManager.java b/common/src/main/java/dev/mrsnowy/teleport_commands/storage/StorageManager.java index 9f67df1..77d2a1a 100644 --- a/common/src/main/java/dev/mrsnowy/teleport_commands/storage/StorageManager.java +++ b/common/src/main/java/dev/mrsnowy/teleport_commands/storage/StorageManager.java @@ -3,8 +3,8 @@ package dev.mrsnowy.teleport_commands.storage; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import dev.mrsnowy.teleport_commands.TeleportCommands; -import dev.mrsnowy.teleport_commands.storage.classes.NamedLocation; -import dev.mrsnowy.teleport_commands.storage.classes.Player; +import dev.mrsnowy.teleport_commands.common.NamedLocation; +import dev.mrsnowy.teleport_commands.common.Player; import net.minecraft.core.BlockPos; import java.io.File; @@ -101,6 +101,7 @@ public class StorageManager { } // creates a new player, if there already is a player it will return the existing one. The player won't be saved unless they actually do something lol + // todo! check if this works fully public Player addPlayer(String uuid) { final Optional OptionalPlayer = getPlayer(uuid); @@ -120,15 +121,9 @@ public class StorageManager { // ----- - public void removeWarp(String name) throws Exception { - Optional OptionalWarp = getWarp(name); - - if (OptionalWarp.isPresent()) { - Warps.remove(OptionalWarp.get()); - StorageSaver(); - } else { - //todo! ??? - } + public void rmWarp(NamedLocation warp) throws Exception { + Warps.remove(warp); + StorageSaver(); } } } diff --git a/common/src/main/java/dev/mrsnowy/teleport_commands/suggestions/HomeSuggestionProvider.java b/common/src/main/java/dev/mrsnowy/teleport_commands/suggestions/HomeSuggestionProvider.java index 2d82d0f..630d798 100644 --- a/common/src/main/java/dev/mrsnowy/teleport_commands/suggestions/HomeSuggestionProvider.java +++ b/common/src/main/java/dev/mrsnowy/teleport_commands/suggestions/HomeSuggestionProvider.java @@ -9,8 +9,8 @@ import dev.mrsnowy.teleport_commands.TeleportCommands; import java.util.Optional; import java.util.concurrent.CompletableFuture; -import dev.mrsnowy.teleport_commands.storage.classes.NamedLocation; -import dev.mrsnowy.teleport_commands.storage.classes.Player; +import dev.mrsnowy.teleport_commands.common.NamedLocation; +import dev.mrsnowy.teleport_commands.common.Player; import net.minecraft.commands.CommandSourceStack; import net.minecraft.server.level.ServerPlayer; @@ -24,9 +24,9 @@ public class HomeSuggestionProvider implements SuggestionProvider optionalPlayerStorage = STORAGE.getPlayer(player.getStringUUID()); if (optionalPlayerStorage.isPresent()) { - Player PlayerStorage = optionalPlayerStorage.get(); + Player playerStorage = optionalPlayerStorage.get(); - for (NamedLocation currentHome : PlayerStorage.getHomes()) { + for (NamedLocation currentHome : playerStorage.getHomes()) { builder.suggest(currentHome.getName()); } } diff --git a/common/src/main/java/dev/mrsnowy/teleport_commands/suggestions/WarpSuggestionProvider.java b/common/src/main/java/dev/mrsnowy/teleport_commands/suggestions/WarpSuggestionProvider.java index 417c954..045a9c0 100644 --- a/common/src/main/java/dev/mrsnowy/teleport_commands/suggestions/WarpSuggestionProvider.java +++ b/common/src/main/java/dev/mrsnowy/teleport_commands/suggestions/WarpSuggestionProvider.java @@ -7,7 +7,7 @@ import com.mojang.brigadier.suggestion.SuggestionsBuilder; import dev.mrsnowy.teleport_commands.TeleportCommands; import dev.mrsnowy.teleport_commands.storage.StorageManager; -import dev.mrsnowy.teleport_commands.storage.classes.NamedLocation; +import dev.mrsnowy.teleport_commands.common.NamedLocation; import net.minecraft.commands.CommandSourceStack; diff --git a/common/src/main/java/dev/mrsnowy/teleport_commands/utils/tools.java b/common/src/main/java/dev/mrsnowy/teleport_commands/utils/tools.java index f1e6f4c..7428812 100644 --- a/common/src/main/java/dev/mrsnowy/teleport_commands/utils/tools.java +++ b/common/src/main/java/dev/mrsnowy/teleport_commands/utils/tools.java @@ -1,7 +1,6 @@ package dev.mrsnowy.teleport_commands.utils; import com.google.gson.*; -import com.mojang.datafixers.util.Pair; import dev.mrsnowy.teleport_commands.TeleportCommands; import java.io.*; @@ -39,7 +38,7 @@ public class tools { // teleport! player.teleportTo(world, coords.x, coords.y, coords.z, Set.of(), player.getYRot(), player.getXRot(), false); - // Restore flying when teleporting dimensions + // Restore flying when teleporting trough dimensions if (flying) { player.getAbilities().flying = true; player.onUpdateAbilities(); @@ -61,22 +60,23 @@ public class tools { ); } + // checks a 7x7x7 location around the player in order to find a safe place to teleport them to. - public static Pair> teleportSafetyChecker(BlockPos blockPos, ServerLevel world, ServerPlayer player) { + public static Optional getSafeBlockPos(BlockPos blockPos, ServerLevel world) { int row = 1; int rows = 3; - BlockPos playerBlockPos = new BlockPos(player.getBlockX(), player.getBlockY(), player.getBlockZ()); - int playerX = blockPos.getX(); - int playerY = blockPos.getY(); - int playerZ = blockPos.getZ(); + int blockPosX = blockPos.getX(); + int blockPosY = blockPos.getY(); + int blockPosZ = blockPos.getZ(); - // find a safe location in an x row radius - if (isBlockPosUnsafe(blockPos, world)) { + if (isBlockPosSafe(blockPos, world)) { + return Optional.of(blockPos); // safe location found! + } else { + // find a safe location in an x row radius while (row <= rows) { // TeleportCommands.LOGGER.info("currently doing row " + row + " of " + rows); //debug - for (int z = -row; z <= row; z++) { for (int x = -row; x <= row; x++) { for (int y = -row; y <= row; y++) { @@ -84,16 +84,12 @@ public class tools { // checks if we are on the outer layer of the row, not on the inside if ((x == -row || x == row) || (z == -row || z == row) || (y == -row || y == row)) { - BlockPos newSafePos = new BlockPos(playerX + x, playerY + y, playerZ + z); - - if (!isBlockPosUnsafe(newSafePos, world)) { - - if (!playerBlockPos.equals(newSafePos) || player.level() != world) { - return new Pair<>(0, Optional.of(new Vec3(newSafePos.getX() + 0.5, newSafePos.getY(), newSafePos.getZ() + 0.5))); // safe location found! + // calculate a new blockPos based on the offset we generated + BlockPos newPos = new BlockPos(blockPosX + x, blockPosY + y, blockPosZ + z); - } else { - return new Pair<>(1, Optional.of(new Vec3(newSafePos.getX() + 0.5, newSafePos.getY(), newSafePos.getZ() + 0.5))); // the location is already safe! - } + if (isBlockPosSafe(newPos, world)) { +// return Optional.of(new Vec3(newPos.getX() + 0.5, newPos.getY(), newPos.getZ() + 0.5)); // safe location found! + return Optional.of(newPos); } } } @@ -102,15 +98,9 @@ public class tools { row++; } - // no safe location - return new Pair<>(2, Optional.empty()); // no safe location found! - - // check if the location is the same - } else if (!playerBlockPos.equals(blockPos) || player.level() != world) { - return new Pair<>(0, Optional.of(new Vec3(playerX + 0.5, playerY, playerZ + 0.5))); // safe location found! - } else { - return new Pair<>(1, Optional.of(new Vec3(playerX + 0.5, playerY, playerZ + 0.5))); // the location is already safe! + // no safe location + return Optional.empty(); // no safe location found! } } @@ -186,8 +176,9 @@ public class tools { } } + // todo! test // checks if a bock position is unsafe, used by the teleportSafetyChecker. - private static boolean isBlockPosUnsafe(BlockPos bottomPlayer, ServerLevel world) { + private static boolean isBlockPosSafe(BlockPos bottomPlayer, ServerLevel world) { // get the block below the player BlockPos belowPlayer = new BlockPos(bottomPlayer.getX(), bottomPlayer.getY() -1, bottomPlayer.getZ()); // below the player @@ -206,8 +197,8 @@ public class tools { && (world.getBlockState(bottomPlayer).getCollisionShape(world, bottomPlayer).isEmpty() && !unsafeCollisionFreeBlocks.contains(BottomPlayerId)) // check if it is a collision free block that isn't dangerous && (!unsafeCollisionFreeBlocks.contains(TopPlayerId))) // check if it is a dangerous collision free block, if it is solid then the player crawls { - return false; // it's safe + return true; // it's safe } - return true; // it's not safe! + return false; // it's not safe! } } -- 2.51.2