diff --git a/common/src/main/java/dev/mrsnowy/teleport_commands/TeleportCommands.java b/common/src/main/java/dev/mrsnowy/teleport_commands/TeleportCommands.java index 1cfab04..789ca88 100644 --- a/common/src/main/java/dev/mrsnowy/teleport_commands/TeleportCommands.java +++ b/common/src/main/java/dev/mrsnowy/teleport_commands/TeleportCommands.java @@ -4,7 +4,8 @@ import com.mojang.brigadier.CommandDispatcher; import dev.mrsnowy.teleport_commands.storage.StorageManager; import dev.mrsnowy.teleport_commands.commands.*; import dev.mrsnowy.teleport_commands.storage.DeathLocationStorage; -import dev.mrsnowy.teleport_commands.storage.ConfigManager; +import dev.mrsnowy.teleport_commands.storage.configManager; +import dev.mrsnowy.teleport_commands.utils.teleporter; import dev.mrsnowy.teleport_commands.utils.tools; import net.minecraft.commands.CommandSourceStack; import net.minecraft.server.MinecraftServer; @@ -21,9 +22,9 @@ public class TeleportCommands { public Path configDir; public MinecraftServer server; public StorageManager storageManager; - public ConfigManager config; + public configManager config; public DeathLocationStorage deathLocationStorage; - public tools tools; + public teleporter teleporter; // Gets ran when the server starts, initializes the mod :3 public void initializeMod(MinecraftServer server) { @@ -32,11 +33,11 @@ public class TeleportCommands { saveDir = Path.of(String.valueOf(server.getWorldPath(LevelResource.ROOT))); configDir = Paths.get(System.getProperty("user.dir")).resolve("config"); this.server = server; - this.tools = new tools(); - this.storageManager = new StorageManager(); - this.config = new ConfigManager(); + storageManager = new StorageManager(this); + config = new configManager(this); deathLocationStorage = new DeathLocationStorage(); + teleporter = new teleporter(this); } // initialize commands, also allows me to easily disable any when there is a config diff --git a/common/src/main/java/dev/mrsnowy/teleport_commands/commands/main.java b/common/src/main/java/dev/mrsnowy/teleport_commands/commands/main.java index 1abad90..43ff68d 100644 --- a/common/src/main/java/dev/mrsnowy/teleport_commands/commands/main.java +++ b/common/src/main/java/dev/mrsnowy/teleport_commands/commands/main.java @@ -6,7 +6,7 @@ import com.mojang.brigadier.exceptions.SimpleCommandExceptionType; import com.mojang.brigadier.suggestion.SuggestionProvider; import dev.mrsnowy.teleport_commands.Constants; import dev.mrsnowy.teleport_commands.TeleportCommands; -import dev.mrsnowy.teleport_commands.storage.ConfigManager; +import dev.mrsnowy.teleport_commands.storage.configManager; import net.minecraft.ChatFormatting; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.Commands; @@ -17,8 +17,6 @@ import net.minecraft.server.level.ServerPlayer; import java.util.Arrays; -import static dev.mrsnowy.teleport_commands.utils.tools.*; - public class main { // TODO! Make this automatically generate based on the commands we have @@ -45,7 +43,7 @@ public class main { .then(Commands.literal("reloadConfig") .executes(context -> { try { - ConfigManager.ConfigLoader(); + configManager.configLoader(); } catch (Exception e) { Constants.LOGGER.error("Failed to reload config!", e); throw new SimpleCommandExceptionType(Component.literal(e.toString())).create(); 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 22f70a7..914dd6a 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 @@ -29,7 +29,7 @@ public class DeathLocationStorage { } } - public void clearDeathLocations() { - deathLocations.clear(); - } +// public void clearDeathLocations() { +// deathLocations.clear(); +// } } \ No newline at end of file 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 e77bf88..f0d6b62 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 @@ -21,12 +21,15 @@ public class StorageManager { public Path STORAGE_FOLDER; public Path STORAGE_FILE; public StorageClass STORAGE; + private final Gson GSON = new GsonBuilder().create(); private final int defaultVersion = new StorageClass().getVersion(); + private final TeleportCommands teleportCommands; /// Initializes the StorageManager class and loads the storage from the filesystem. - public StorageManager() { - STORAGE_FOLDER = TeleportCommands.TeleportCommands.saveDir.resolve("TeleportCommands/"); + public StorageManager(TeleportCommands teleportCommands) { + this.teleportCommands = teleportCommands; + STORAGE_FOLDER = teleportCommands.saveDir.resolve("TeleportCommands/"); STORAGE_FILE = STORAGE_FOLDER.resolve("storage.json"); try { @@ -144,7 +147,7 @@ public class StorageManager { List homes = player.getHomes(); // Delete any homes with an invalid world_id (if enabled in config) - if (TeleportCommands.TeleportCommands.config.CONFIG.home.isDeleteInvalid()) { + if (teleportCommands.config.CONFIG.home.isDeleteInvalid()) { homes.removeIf(home -> home.getWorld().isEmpty()); } @@ -155,7 +158,7 @@ public class StorageManager { } // Delete any warps with an invalid world_id (if enabled in config) - if (TeleportCommands.TeleportCommands.config.CONFIG.warp.isDeleteInvalid()) { + if (teleportCommands.config.CONFIG.warp.isDeleteInvalid()) { Warps.removeIf(warp -> warp.getWorld().isEmpty()); } diff --git a/common/src/main/java/dev/mrsnowy/teleport_commands/storage/ConfigManager.java b/common/src/main/java/dev/mrsnowy/teleport_commands/storage/configManager.java similarity index 87% rename from common/src/main/java/dev/mrsnowy/teleport_commands/storage/ConfigManager.java rename to common/src/main/java/dev/mrsnowy/teleport_commands/storage/configManager.java index 718a1dd..4db9716 100644 --- a/common/src/main/java/dev/mrsnowy/teleport_commands/storage/ConfigManager.java +++ b/common/src/main/java/dev/mrsnowy/teleport_commands/storage/configManager.java @@ -9,17 +9,20 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.StandardOpenOption; -public class ConfigManager { +public class configManager { public Path CONFIG_FILE; public ConfigClass CONFIG; + private final Gson GSON = new GsonBuilder().setPrettyPrinting().create(); private final int defaultVersion = new ConfigClass().getVersion(); + private final TeleportCommands teleportCommands; - public ConfigManager() { - CONFIG_FILE = TeleportCommands.TeleportCommands.configDir.resolve("teleport_commands.json"); + public configManager(TeleportCommands teleportCommands) { + this.teleportCommands = teleportCommands; + CONFIG_FILE = teleportCommands.configDir.resolve("teleport_commands.json"); try { - ConfigLoader(); + configLoader(); } catch (Exception e) { // crashing is probably better here, otherwise the whole mod will be broken @@ -28,32 +31,33 @@ public class ConfigManager { } } - public void ConfigLoader() throws Exception { + /// This function loads the config from disk + public void configLoader() throws Exception { if (!CONFIG_FILE.toFile().exists() || CONFIG_FILE.toFile().length() == 0) { - Files.createDirectories(TeleportCommands.configDir); + Files.createDirectories(teleportCommands.configDir); Constants.LOGGER.warn("Config file was not found or was empty! Initializing config"); CONFIG = new ConfigClass(); - ConfigSaver(); + configSaver(); Constants.LOGGER.info("Config created successfully!"); } - ConfigMigrator(); + configMigrator(); FileReader reader = new FileReader(CONFIG_FILE.toFile()); CONFIG = GSON.fromJson(reader, ConfigClass.class); if (CONFIG == null) { Constants.LOGGER.warn("Config file was empty! Loading defaults..."); CONFIG = new ConfigClass(); - ConfigSaver(); + configSaver(); } - ConfigSaver(); // Save it so any missing values get added to the file. + configSaver(); // Save it so any missing values get added to the file. Constants.LOGGER.info("Config loaded successfully!"); } /// This function checks what version the config file is and migrates it to the current version of the mod. - public void ConfigMigrator() throws Exception { + public void configMigrator() throws Exception { FileReader reader = new FileReader(CONFIG_FILE.toFile()); JsonObject jsonObject = GSON.fromJson(reader, JsonObject.class); @@ -76,14 +80,15 @@ public class ConfigManager { } } - public void ConfigSaver() throws Exception { + /// Saves the config to disk + public void configSaver() throws Exception { // todo! maybe throttle saves? - byte[] json = GSON.toJson( ConfigManager.CONFIG ).getBytes(); + byte[] json = GSON.toJson(CONFIG).getBytes(); Files.write(CONFIG_FILE, json, StandardOpenOption.WRITE, StandardOpenOption.TRUNCATE_EXISTING, StandardOpenOption.CREATE); } - public class ConfigClass { + public static class ConfigClass { private final int version = 0; public Teleporting teleporting = new Teleporting(); public Back back = new Back(); @@ -96,7 +101,7 @@ public class ConfigManager { return version; } - public final class Teleporting { + public static final class Teleporting { private int delay = 5; private boolean whileMoving = true; private boolean whileFighting = false; @@ -135,7 +140,7 @@ public class ConfigManager { } } - public final class Back { + public static final class Back { private boolean enabled = true; private boolean deleteAfterTeleport = false; @@ -156,7 +161,7 @@ public class ConfigManager { } } - public final class Home { + public static final class Home { private boolean enabled = true; private int playerMaximum = 20; private boolean deleteInvalid = false; @@ -186,7 +191,7 @@ public class ConfigManager { } } - public final class Tpa { + public static final class Tpa { private boolean enabled = true; public boolean isEnabled() { @@ -198,7 +203,7 @@ public class ConfigManager { } } - public final class Warp { + public static final class Warp { private boolean enabled = true; private boolean deleteInvalid = false; @@ -219,7 +224,7 @@ public class ConfigManager { } } - public final class WorldSpawn { + public static final class WorldSpawn { private boolean enabled = true; private String world_id = "minecraft:overworld"; 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 77fc17a..06a3c50 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,19 +9,25 @@ import dev.mrsnowy.teleport_commands.Constants; import java.util.Optional; import java.util.concurrent.CompletableFuture; +import dev.mrsnowy.teleport_commands.TeleportCommands; 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; -import static dev.mrsnowy.teleport_commands.storage.StorageManager.STORAGE; public class HomeSuggestionProvider implements SuggestionProvider { + private final TeleportCommands teleportCommands; + + public HomeSuggestionProvider(TeleportCommands teleportCommands) { + this.teleportCommands = teleportCommands; + } + @Override public CompletableFuture getSuggestions(CommandContext context, SuggestionsBuilder builder) { try { ServerPlayer player = context.getSource().getPlayerOrException(); - Optional optionalPlayerStorage = STORAGE.getPlayer(player.getStringUUID()); + Optional optionalPlayerStorage = teleportCommands.storageManager.STORAGE.getPlayer(player.getStringUUID()); if (optionalPlayerStorage.isPresent()) { Player playerStorage = optionalPlayerStorage.get(); 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 040fb20..846f55b 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 @@ -6,6 +6,7 @@ import com.mojang.brigadier.suggestion.Suggestions; import com.mojang.brigadier.suggestion.SuggestionsBuilder; import dev.mrsnowy.teleport_commands.Constants; +import dev.mrsnowy.teleport_commands.TeleportCommands; import dev.mrsnowy.teleport_commands.storage.StorageManager; import dev.mrsnowy.teleport_commands.common.NamedLocation; @@ -16,10 +17,16 @@ import java.util.concurrent.CompletableFuture; public class WarpSuggestionProvider implements SuggestionProvider { + private final TeleportCommands teleportCommands; + + public WarpSuggestionProvider(TeleportCommands teleportCommands) { + this.teleportCommands = teleportCommands; + } + @Override public CompletableFuture getSuggestions(CommandContext context, SuggestionsBuilder builder) { try { - List WarpStorage = StorageManager.STORAGE.getWarps(); + List WarpStorage = teleportCommands.storageManager.STORAGE.getWarps(); for (NamedLocation currentWarp : WarpStorage) { builder.suggest(currentWarp.getName()); diff --git a/common/src/main/java/dev/mrsnowy/teleport_commands/utils/teleporter.java b/common/src/main/java/dev/mrsnowy/teleport_commands/utils/teleporter.java new file mode 100644 index 0000000..76aa468 --- /dev/null +++ b/common/src/main/java/dev/mrsnowy/teleport_commands/utils/teleporter.java @@ -0,0 +1,80 @@ +package dev.mrsnowy.teleport_commands.utils; + +import dev.mrsnowy.teleport_commands.TeleportCommands; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.phys.Vec3; + +import java.util.*; + +import static net.minecraft.sounds.SoundEvents.ENDERMAN_TELEPORT; + +public class teleporter { + private final TeleportCommands teleportCommands; + private final Map playerData = new HashMap<>(); + + private static class PlayerData { + long lastTeleportTime = 0; + long lastHitTime = 0; + Vec3 lastPosition = Vec3.ZERO; + } + + public teleporter(TeleportCommands teleportCommands) { + this.teleportCommands = teleportCommands; + } + + /// Teleport the player :P + public void teleport(ServerPlayer player, ServerLevel world, Vec3 coords) { + // Check if user is allowed to teleport by config settings + + int delay = teleportCommands.config.CONFIG.teleporting.getDelay(); + UUID playerUUID = player.getUUID(); + // save when they last teleported and check delay + if (playerData.containsKey(playerUUID)) { + PlayerData playerdata = playerData.get(playerUUID); + } + + // save pos and check if they have moved. + + // check if they got hit? whileFighting + + // save when they last got hit and if it exceeds fightCooldown + + + // teleportation effects & sounds before teleporting + world.sendParticles(ParticleTypes.SNOWFLAKE, player.getX(), player.getY() + 1, player.getZ(), 20, 0.0D, 0.0D, 0.0D, 0.01); + world.sendParticles(ParticleTypes.WHITE_SMOKE, player.getX(), player.getY(), player.getZ(), 15, 0.0D, 1.0D, 0.0D, 0.03); + world.playSound(null, player.blockPosition(), SoundEvent.createVariableRangeEvent(ENDERMAN_TELEPORT.location()), SoundSource.PLAYERS, 0.4f, 1.0f); + + // check if the player is currently flying + boolean flying = player.getAbilities().flying; + + // teleport! + player.teleportTo(world, coords.x, coords.y, coords.z, Set.of(), player.getYRot(), player.getXRot(), false); + + // Restore flying when teleporting trough dimensions + if (flying) { + player.getAbilities().flying = true; + player.onUpdateAbilities(); + } + + // teleportation sound after teleport + world.playSound(null, player.blockPosition(), SoundEvent.createVariableRangeEvent(ENDERMAN_TELEPORT.location()), SoundSource.PLAYERS, 0.4f, 1.0f); + + // delay visual effects so the player can see it when switching dimensions + Timer timer = new Timer(); + timer.schedule( + new TimerTask() { + @Override + public void run() { + world.sendParticles(ParticleTypes.SNOWFLAKE, player.getX(), player.getY() , player.getZ(), 20, 0.0D, 1.0D, 0.0D, 0.01); + world.sendParticles(ParticleTypes.WHITE_SMOKE, player.getX(), player.getY(), player.getZ(), 15, 0.0D, 0.0D, 0.0D, 0.03); + } + }, 100 // hopefully a good delay, ~ 2 ticks + ); + } + +} 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 380f0fb..ddc7170 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 @@ -11,89 +11,22 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.StreamSupport; -import dev.mrsnowy.teleport_commands.storage.ConfigManager; import net.minecraft.core.BlockPos; -import net.minecraft.core.particles.ParticleTypes; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; -import net.minecraft.sounds.SoundEvent; -import net.minecraft.sounds.SoundSource; -import net.minecraft.world.phys.Vec3; import static dev.mrsnowy.teleport_commands.Constants.MOD_ID; -import static net.minecraft.sounds.SoundEvents.ENDERMAN_TELEPORT; public class tools { - private final TeleportCommands teleportCommands; - private final Set unsafeCollisionFreeBlocks = Set.of("block.minecraft.lava", "block.minecraft.flowing_lava", "block.minecraft.end_portal", "block.minecraft.end_gateway","block.minecraft.fire", "block.minecraft.soul_fire", "block.minecraft.powder_snow", "block.minecraft.nether_portal"); - - private final Map playerData = new HashMap<>(); - - private class PlayerData { - long lastTeleportTime = 0; - long lastHitTime = 0; - Vec3 lastPosition = Vec3.ZERO; - } - - public tools(TeleportCommands teleportCommands) { - this.teleportCommands = teleportCommands; - } - - /// Teleport the player :P - public void Teleporter(ServerPlayer player, ServerLevel world, Vec3 coords) { - // Check if user is allowed to teleport by config settings - - int delay = teleportCommands.config.CONFIG.teleporting.getDelay(); - - // save when they last teleported and check delay - - // save pos and check if they have moved. - - // check if they got hit? whileFighting - - // save when they last got hit and if it exceeds fightCooldown - - - // teleportation effects & sounds before teleporting - world.sendParticles(ParticleTypes.SNOWFLAKE, player.getX(), player.getY() + 1, player.getZ(), 20, 0.0D, 0.0D, 0.0D, 0.01); - world.sendParticles(ParticleTypes.WHITE_SMOKE, player.getX(), player.getY(), player.getZ(), 15, 0.0D, 1.0D, 0.0D, 0.03); - world.playSound(null, player.blockPosition(), SoundEvent.createVariableRangeEvent(ENDERMAN_TELEPORT.location()), SoundSource.PLAYERS, 0.4f, 1.0f); - - // check if the player is currently flying - boolean flying = player.getAbilities().flying; - - // teleport! - player.teleportTo(world, coords.x, coords.y, coords.z, Set.of(), player.getYRot(), player.getXRot(), false); - - // Restore flying when teleporting trough dimensions - if (flying) { - player.getAbilities().flying = true; - player.onUpdateAbilities(); - } - - // teleportation sound after teleport - world.playSound(null, player.blockPosition(), SoundEvent.createVariableRangeEvent(ENDERMAN_TELEPORT.location()), SoundSource.PLAYERS, 0.4f, 1.0f); - - // delay visual effects so the player can see it when switching dimensions - Timer timer = new Timer(); - timer.schedule( - new TimerTask() { - @Override - public void run() { - world.sendParticles(ParticleTypes.SNOWFLAKE, player.getX(), player.getY() , player.getZ(), 20, 0.0D, 1.0D, 0.0D, 0.01); - world.sendParticles(ParticleTypes.WHITE_SMOKE, player.getX(), player.getY(), player.getZ(), 15, 0.0D, 0.0D, 0.0D, 0.03); - } - }, 100 // hopefully a good delay, ~ 2 ticks - ); - } + private static final Set unsafeCollisionFreeBlocks = Set.of("block.minecraft.lava", "block.minecraft.flowing_lava", "block.minecraft.end_portal", "block.minecraft.end_gateway","block.minecraft.fire", "block.minecraft.soul_fire", "block.minecraft.powder_snow", "block.minecraft.nether_portal"); // checks a 7x7x7 location around the player in order to find a safe place to teleport them to. - public Optional getSafeBlockPos(BlockPos blockPos, ServerLevel world) { + public static Optional getSafeBlockPos(BlockPos blockPos, ServerLevel world) { int row = 1; int rows = 3; @@ -137,7 +70,7 @@ public class tools { // Gets the translated text for each player based on their language, this is fully server side and actually works (UNLIKE MOJANG'S TRANSLATED KEY'S WHICH ARE CLIENT SIDE) (I'm not mad, I swear!) - public MutableComponent getTranslatedText(String key, ServerPlayer player, MutableComponent... args) { + public static MutableComponent getTranslatedText(String key, ServerPlayer player, MutableComponent... args) { //todo! maybe make this also loaded in memory? String language = player.clientInformation().language().toLowerCase(); String regex = "%(\\d+)%"; @@ -222,7 +155,7 @@ public class tools { // Gets the ids of all the worlds - public List getWorldIds() { + public static List getWorldIds() { return StreamSupport.stream(teleportCommands.server.getAllLevels().spliterator(), false) .map(level -> level.dimension().location().toString()) .toList(); @@ -230,7 +163,7 @@ public class tools { // checks if a BlockPos is safe, used by the teleportSafetyChecker. - private boolean isBlockPosSafe(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