A Minecraft server-side mod that adds various teleportation related commands
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

working beta

+856 -75
-1
build.gradle
··· 24 24 mods { 25 25 "teleport_commands" { 26 26 sourceSet sourceSets.main 27 - sourceSet sourceSets.client 28 27 } 29 28 } 30 29
-10
src/client/java/dev/mrsnowy/teleport_commands/TeleportCommandsClient.java
··· 1 - package dev.mrsnowy.teleport_commands; 2 - 3 - import net.fabricmc.api.ClientModInitializer; 4 - 5 - public class TeleportCommandsClient implements ClientModInitializer { 6 - @Override 7 - public void onInitializeClient() { 8 - // This entrypoint is suitable for setting up client-specific logic, such as rendering. 9 - } 10 - }
-15
src/client/java/dev/mrsnowy/teleport_commands/mixin/client/ExampleClientMixin.java
··· 1 - package dev.mrsnowy.teleport_commands.mixin.client; 2 - 3 - import net.minecraft.client.MinecraftClient; 4 - import org.spongepowered.asm.mixin.Mixin; 5 - import org.spongepowered.asm.mixin.injection.At; 6 - import org.spongepowered.asm.mixin.injection.Inject; 7 - import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 8 - 9 - @Mixin(MinecraftClient.class) 10 - public class ExampleClientMixin { 11 - @Inject(at = @At("HEAD"), method = "run") 12 - private void run(CallbackInfo info) { 13 - // This code is injected into the start of MinecraftClient.run()V 14 - } 15 - }
-11
src/client/resources/teleport_commands.client.mixins.json
··· 1 - { 2 - "required": true, 3 - "package": "dev.mrsnowy.teleport_commands.mixin.client", 4 - "compatibilityLevel": "JAVA_17", 5 - "client": [ 6 - "ExampleClientMixin" 7 - ], 8 - "injectors": { 9 - "defaultRequire": 1 10 - } 11 - }
+60 -1
src/main/java/dev/mrsnowy/teleport_commands/TeleportCommands.java
··· 1 1 package dev.mrsnowy.teleport_commands; 2 2 3 + import dev.mrsnowy.teleport_commands.storage.StorageManager; 4 + import dev.mrsnowy.teleport_commands.utils.commands; 3 5 import net.fabricmc.api.ModInitializer; 4 6 7 + import net.fabricmc.fabric.api.event.lifecycle.v1.ServerEntityEvents; 8 + import net.fabricmc.fabric.api.event.lifecycle.v1.ServerWorldEvents; 9 + import net.fabricmc.loader.api.FabricLoader; 10 + import net.minecraft.entity.Entity; 11 + import net.minecraft.server.MinecraftServer; 12 + import net.minecraft.server.network.ServerPlayerEntity; 13 + import net.minecraft.server.world.ServerWorld; 14 + import net.minecraft.util.WorldSavePath; 15 + import net.minecraft.world.World; 5 16 import org.slf4j.Logger; 6 17 import org.slf4j.LoggerFactory; 18 + 19 + import java.nio.file.Path; 20 + import java.util.Objects; 21 + 22 + import static dev.mrsnowy.teleport_commands.utils.tools.DeathLocationUpdater; 7 23 8 24 public class TeleportCommands implements ModInitializer { 9 25 // This logger is used to write text to the console and the log file. 10 26 // It is considered best practice to use your mod id as the logger's name. 11 27 // That way, it's clear which mod wrote info, warnings, and errors. 28 + public static final String MOD_ID = "teleport_commands"; 12 29 public static final Logger LOGGER = LoggerFactory.getLogger("teleport_commands"); 13 30 31 + public static Path SAVE_DIR; 32 + public static Path CONFIG_DIR; 33 + public static StorageManager Storage; 34 + public static MinecraftServer Server; 35 + 14 36 @Override 15 37 public void onInitialize() { 16 38 // This code runs as soon as Minecraft is in a mod-load-ready state. 17 39 // However, some things (like resources) may still be uninitialized. 18 40 // Proceed with mild caution. 41 + ServerWorldEvents.LOAD.register(this::onWorldLoad); 42 + 43 + ServerEntityEvents.ENTITY_UNLOAD.register(this::onPlayerUnload); 44 + 45 + // todo: /back /tpa /tpahere /home /homes /sethome /delhome /renamehome /defaulthome /spawn /worldspawn 46 + commands.registerCommands(); 47 + 48 + } 49 + 19 50 20 - LOGGER.info("Hello Fabric world!"); 51 + 52 + private void onPlayerUnload(Entity entity, ServerWorld world) { 53 + if (entity instanceof ServerPlayerEntity player) { 54 + // LOGGER.info(String.valueOf(entity.getRemovalReason())); 55 + if (player.getRemovalReason() != null && Objects.equals(player.getRemovalReason().toString(), "KILLED") || Objects.equals(player.getRemovalReason().toString(), "DISCARDED")) { 56 + try { 57 + // /back command position 58 + LOGGER.info(player.getPos().toString()); 59 + DeathLocationUpdater(player.getPos(), player.getServerWorld(), player.getUuidAsString()); 60 + } catch (Exception e) { 61 + throw new RuntimeException(e); 62 + } 63 + } 64 + } 65 + } 66 + 67 + private void onWorldLoad(MinecraftServer minecraftServer, ServerWorld serverWorld) { 68 + // make it run only once 69 + if (serverWorld.getRegistryKey() == World.OVERWORLD) { 70 + // initialize da variables 71 + SAVE_DIR = Path.of(String.valueOf(minecraftServer.getSavePath(WorldSavePath.ROOT))); 72 + CONFIG_DIR = FabricLoader.getInstance().getConfigDir(); 73 + 74 + LOGGER.error(String.valueOf(SAVE_DIR)); 75 + LOGGER.error(String.valueOf(CONFIG_DIR)); 76 + 77 + Server = minecraftServer; 78 + StorageManager.StorageInit(); 79 + } 21 80 } 22 81 }
-15
src/main/java/dev/mrsnowy/teleport_commands/mixin/ExampleMixin.java
··· 1 - package dev.mrsnowy.teleport_commands.mixin; 2 - 3 - import net.minecraft.server.MinecraftServer; 4 - import org.spongepowered.asm.mixin.Mixin; 5 - import org.spongepowered.asm.mixin.injection.At; 6 - import org.spongepowered.asm.mixin.injection.Inject; 7 - import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 8 - 9 - @Mixin(MinecraftServer.class) 10 - public class ExampleMixin { 11 - @Inject(at = @At("HEAD"), method = "loadWorld") 12 - private void init(CallbackInfo info) { 13 - // This code is injected into the start of MinecraftServer.loadWorld()V 14 - } 15 - }
+158
src/main/java/dev/mrsnowy/teleport_commands/storage/StorageManager.java
··· 1 + package dev.mrsnowy.teleport_commands.storage; 2 + 3 + import com.google.gson.Gson; 4 + import com.google.gson.GsonBuilder; 5 + import dev.mrsnowy.teleport_commands.TeleportCommands; 6 + 7 + import java.io.File; 8 + import java.nio.file.Files; 9 + import java.nio.file.Path; 10 + import java.nio.file.StandardOpenOption; 11 + import java.util.ArrayList; 12 + import java.util.List; 13 + import java.util.Objects; 14 + import java.util.Optional; 15 + 16 + public class StorageManager { 17 + 18 + public static Path STORAGE_FOLDER; 19 + public static Path STORAGE_FILE; 20 + 21 + public static void StorageInit() { 22 + STORAGE_FOLDER = TeleportCommands.SAVE_DIR.resolve("TeleportCommands/"); 23 + STORAGE_FILE = STORAGE_FOLDER.resolve("storage.json"); 24 + 25 + try { 26 + if (!Files.exists(STORAGE_FOLDER)) { 27 + Files.createDirectories(STORAGE_FOLDER); 28 + } 29 + 30 + if (!Files.exists(STORAGE_FILE)) { 31 + Files.createFile(STORAGE_FILE); 32 + } 33 + 34 + // create the storage 35 + if (new File(String.valueOf(STORAGE_FILE)).length() == 0) { 36 + StorageClass root = new StorageClass(); 37 + root.Players = new ArrayList<>(); 38 + StorageSaver(root); 39 + } 40 + 41 + } catch (Exception e) { 42 + TeleportCommands.LOGGER.error(e.getMessage()); 43 + // crashing is probably better here, otherwise the whole mod will be broken 44 + System.exit(1); 45 + } 46 + } 47 + 48 + public static void StorageAdd(String UUID) throws Exception { 49 + StorageClass storage = StorageRetriever(); 50 + // Optional<StorageClass.Player> playerStorage = GetPlayerStorage(UUID, storage); 51 + Optional<StorageClass.Player> playerStorage = storage.Players.stream() 52 + .filter(player -> Objects.equals(UUID, player.Player_UUID)) 53 + .findFirst(); 54 + 55 + if (playerStorage.isEmpty()) { 56 + StorageClass.Player newPlayer = new StorageClass.Player(); 57 + 58 + newPlayer.Player_UUID = UUID; 59 + newPlayer.DefaultHome = "home"; 60 + newPlayer.deathLocation = new StorageClass.Player.Location(); 61 + newPlayer.deathLocation.x = new StorageClass.Player.Location().x; 62 + newPlayer.deathLocation.y = new StorageClass.Player.Location().y; 63 + newPlayer.deathLocation.z = new StorageClass.Player.Location().z; 64 + newPlayer.deathLocation.world = ""; 65 + 66 + newPlayer.Homes = new ArrayList<>(); 67 + 68 + List<StorageClass.Player> playerList = storage.Players; 69 + playerList.add(newPlayer); 70 + 71 + StorageSaver(storage); 72 + TeleportCommands.LOGGER.info("Player '" + UUID + "' added successfully in storage!"); 73 + } else { 74 + TeleportCommands.LOGGER.info("Player '" + UUID + "' already exists!"); 75 + } 76 + } 77 + 78 + public static void StorageSaver(StorageClass storage) throws Exception { 79 + Gson gson = new GsonBuilder().setPrettyPrinting().create(); 80 + byte[] json = gson.toJson(storage).getBytes(); 81 + Files.write(STORAGE_FILE, json, StandardOpenOption.WRITE, StandardOpenOption.TRUNCATE_EXISTING); 82 + } 83 + 84 + private static StorageClass StorageRetriever() throws Exception { 85 + // double check that the storage file is intact 86 + if (new File(String.valueOf(STORAGE_FILE)).length() == 0) { 87 + StorageInit(); 88 + } 89 + String jsonContent = Files.readString(STORAGE_FILE); 90 + Gson gson = new GsonBuilder().setPrettyPrinting().create(); 91 + return gson.fromJson(jsonContent, StorageClass.class); 92 + } 93 + 94 + public static PlayerStorageResult GetPlayerStorage(String UUID) { 95 + try { 96 + StorageClass storage = StorageRetriever(); 97 + 98 + Optional<StorageClass.Player> playerStorage = storage.Players.stream() 99 + .filter(player -> Objects.equals(UUID, player.Player_UUID)) 100 + .findFirst(); 101 + 102 + if (playerStorage.isEmpty()) { 103 + StorageAdd(UUID); 104 + 105 + storage = StorageRetriever(); 106 + 107 + playerStorage = storage.Players.stream() 108 + .filter(player -> Objects.equals(UUID, player.Player_UUID)) 109 + .findFirst(); 110 + 111 + if (playerStorage.isEmpty()) { 112 + throw new Exception("No Player found?!"); 113 + } 114 + } 115 + 116 + return new PlayerStorageResult(storage, playerStorage.get()); 117 + 118 + } catch (Exception e) { 119 + throw new RuntimeException(e); 120 + } 121 + } 122 + 123 + public static class PlayerStorageResult { 124 + public StorageClass storage; 125 + public StorageClass.Player playerStorage; 126 + 127 + public PlayerStorageResult(StorageClass storage, StorageClass.Player playerStorage) { 128 + this.storage = storage; 129 + this.playerStorage = playerStorage; 130 + } 131 + } 132 + 133 + public static class StorageClass { 134 + public List<Player> Players; 135 + 136 + public static class Player { 137 + public String Player_UUID; 138 + public String DefaultHome; 139 + public Location deathLocation; 140 + public List<Home> Homes; 141 + 142 + public static class Location { 143 + public double x; 144 + public double y; 145 + public double z; 146 + public String world; 147 + } 148 + 149 + public static class Home { 150 + public String name; 151 + public double x; 152 + public double y; 153 + public double z; 154 + public String world; 155 + } 156 + } 157 + } 158 + }
+8
src/main/java/dev/mrsnowy/teleport_commands/storage/configManager.java
··· 1 + package dev.mrsnowy.teleport_commands.storage; 2 + 3 + //import java.nio.file.Path; 4 + //import net.fabricmc.loader.api.FabricLoader; 5 + 6 + public class configManager { 7 + 8 + }
+32
src/main/java/dev/mrsnowy/teleport_commands/suggestions/HomesuggestionProvider.java
··· 1 + package dev.mrsnowy.teleport_commands.suggestions; 2 + 3 + import com.mojang.brigadier.context.CommandContext; 4 + import com.mojang.brigadier.suggestion.SuggestionProvider; 5 + import com.mojang.brigadier.suggestion.Suggestions; 6 + import com.mojang.brigadier.suggestion.SuggestionsBuilder; 7 + import dev.mrsnowy.teleport_commands.storage.StorageManager; 8 + import net.minecraft.server.command.ServerCommandSource; 9 + import net.minecraft.server.network.ServerPlayerEntity; 10 + import net.minecraft.server.world.ServerWorld; 11 + import net.minecraft.util.math.Vec3d; 12 + 13 + import java.util.Objects; 14 + import java.util.concurrent.CompletableFuture; 15 + 16 + import static dev.mrsnowy.teleport_commands.storage.StorageManager.GetPlayerStorage; 17 + 18 + public class HomesuggestionProvider implements SuggestionProvider<ServerCommandSource> { 19 + @Override 20 + public CompletableFuture<Suggestions> getSuggestions(CommandContext<ServerCommandSource> context, SuggestionsBuilder builder) { 21 + 22 + ServerPlayerEntity player = Objects.requireNonNull(context.getSource().getPlayer()); 23 + StorageManager.StorageClass.Player playerStorage = GetPlayerStorage(player.getUuidAsString()).playerStorage; 24 + 25 + for (StorageManager.StorageClass.Player.Home currenthome : playerStorage.Homes) { 26 + builder.suggest(currenthome.name); 27 + } 28 + 29 + // Build and return the suggestions 30 + return builder.buildFuture(); 31 + } 32 + }
+182
src/main/java/dev/mrsnowy/teleport_commands/utils/commands.java
··· 1 + package dev.mrsnowy.teleport_commands.utils; 2 + 3 + import com.mojang.brigadier.arguments.StringArgumentType; 4 + import dev.mrsnowy.teleport_commands.TeleportCommands; 5 + import dev.mrsnowy.teleport_commands.suggestions.HomesuggestionProvider; 6 + import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback; 7 + import net.minecraft.command.argument.EntityArgumentType; 8 + import net.minecraft.server.command.CommandManager; 9 + import net.minecraft.server.network.ServerPlayerEntity; 10 + import net.minecraft.text.Text; 11 + 12 + import javax.swing.text.html.parser.Entity; 13 + import java.util.Objects; 14 + 15 + import static net.minecraft.server.command.CommandManager.argument; 16 + import static net.minecraft.server.command.CommandManager.literal; 17 + 18 + public class commands { 19 + public static void registerCommands() { 20 + CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> dispatcher.register(literal("back") 21 + // .requires(source -> source.hasPermissionLevel(2)) 22 + .executes(context -> { 23 + ServerPlayerEntity player = Objects.requireNonNull(context.getSource().getPlayer()); 24 + 25 + player.sendMessage(Text.literal("Teleporting"), true); 26 + tools.ToDeathLocation(player); 27 + return 0; 28 + }))); 29 + 30 + 31 + CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> dispatcher.register(literal("sethome") 32 + .then(argument("name", StringArgumentType.string()) 33 + .executes(context -> { 34 + final String name = StringArgumentType.getString(context, "name"); 35 + ServerPlayerEntity player = Objects.requireNonNull(context.getSource().getPlayer()); 36 + 37 + try { 38 + player.sendMessage(Text.literal("Home Set"), true); 39 + tools.SetHome(player, name); 40 + 41 + } catch (Exception e) { 42 + TeleportCommands.LOGGER.error(String.valueOf(e)); 43 + player.sendMessage(Text.literal("Error Setting Home"), true); 44 + return 1; 45 + } 46 + return 0; 47 + })))); 48 + 49 + CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> dispatcher.register(literal("home") 50 + .executes(context -> { 51 + ServerPlayerEntity player = Objects.requireNonNull(context.getSource().getPlayer()); 52 + 53 + try { 54 + player.sendMessage(Text.literal("Going Home"), true); 55 + tools.GoHome(player, ""); 56 + 57 + } catch (Exception e) { 58 + TeleportCommands.LOGGER.error(String.valueOf(e)); 59 + player.sendMessage(Text.literal("Error Going Home"), true); 60 + return 1; 61 + } 62 + return 0; 63 + }) 64 + .then(argument("name", StringArgumentType.string()).suggests(new HomesuggestionProvider()) 65 + .executes(context -> { 66 + final String name = StringArgumentType.getString(context, "name"); 67 + ServerPlayerEntity player = Objects.requireNonNull(context.getSource().getPlayer()); 68 + 69 + try { 70 + player.sendMessage(Text.literal("Going Home"), true); 71 + tools.GoHome(player, name); 72 + 73 + } catch (Exception e) { 74 + player.sendMessage(Text.literal("Error Going Home"), true); 75 + TeleportCommands.LOGGER.error(String.valueOf(e)); 76 + return 1; 77 + } 78 + return 0; 79 + })))); 80 + 81 + CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> dispatcher.register(literal("delhome") 82 + .then(argument("name", StringArgumentType.string()).suggests(new HomesuggestionProvider()) 83 + .executes(context -> { 84 + final String name = StringArgumentType.getString(context, "name"); 85 + ServerPlayerEntity player = Objects.requireNonNull(context.getSource().getPlayer()); 86 + 87 + try { 88 + player.sendMessage(Text.literal("Home Deleted"), true); 89 + tools.DeleteHome(player, name); 90 + 91 + } catch (Exception e) { 92 + TeleportCommands.LOGGER.error(String.valueOf(e)); 93 + player.sendMessage(Text.literal("Error Deleting Home"), true); 94 + return 1; 95 + } 96 + return 0; 97 + })))); 98 + 99 + CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> dispatcher.register(literal("renamehome") 100 + .then(argument("name", StringArgumentType.string()).suggests(new HomesuggestionProvider()) 101 + .then(argument("newName", StringArgumentType.string()) 102 + .executes(context -> { 103 + final String name = StringArgumentType.getString(context, "name"); 104 + final String newName = StringArgumentType.getString(context, "newName"); 105 + ServerPlayerEntity player = Objects.requireNonNull(context.getSource().getPlayer()); 106 + 107 + try { 108 + player.sendMessage(Text.literal("Home Renamed"), true); 109 + tools.RenameHome(player, name, newName); 110 + } catch (Exception e) { 111 + TeleportCommands.LOGGER.error(String.valueOf(e)); 112 + player.sendMessage(Text.literal("Error Renaming Home"), true); 113 + return 1; 114 + } 115 + return 0; 116 + }))))); 117 + 118 + 119 + CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> dispatcher.register(literal("homes") 120 + .executes(context -> { 121 + ServerPlayerEntity player = Objects.requireNonNull(context.getSource().getPlayer()); 122 + 123 + tools.PrintHomes(player); 124 + return 0; 125 + }))); 126 + 127 + CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> dispatcher.register(literal("defaulthome") 128 + .then(argument("name", StringArgumentType.string()).suggests(new HomesuggestionProvider()) 129 + .executes(context -> { 130 + final String name = StringArgumentType.getString(context, "name"); 131 + ServerPlayerEntity player = Objects.requireNonNull(context.getSource().getPlayer()); 132 + try { 133 + tools.SetDefaultHome(player, name); 134 + } catch (Exception e) { 135 + TeleportCommands.LOGGER.error(String.valueOf(e)); 136 + player.sendMessage(Text.literal("Error Changing Default Home"), true); 137 + return 1; 138 + } 139 + return 0; 140 + })))); 141 + 142 + CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> dispatcher.register(literal("tpa") 143 + .then(CommandManager.argument("player", EntityArgumentType.player()) 144 + .executes(context -> { 145 + final ServerPlayerEntity TargetPlayer = EntityArgumentType.getPlayer(context, "player"); 146 + ServerPlayerEntity player = Objects.requireNonNull(context.getSource().getPlayer()); 147 + 148 + tools.tpaCommandHandler(player, TargetPlayer, false); 149 + return 0; 150 + })))); 151 + 152 + CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> dispatcher.register(literal("tpahere") 153 + .then(CommandManager.argument("player", EntityArgumentType.player()) 154 + .executes(context -> { 155 + final ServerPlayerEntity TargetPlayer = EntityArgumentType.getPlayer(context, "player"); 156 + ServerPlayerEntity player = Objects.requireNonNull(context.getSource().getPlayer()); 157 + 158 + tools.tpaCommandHandler(player, TargetPlayer, true); 159 + return 0; 160 + })))); 161 + 162 + CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> dispatcher.register(literal("tpaaccept") 163 + .then(CommandManager.argument("player", EntityArgumentType.player()) 164 + .executes(context -> { 165 + final ServerPlayerEntity TargetPlayer = EntityArgumentType.getPlayer(context, "player"); 166 + ServerPlayerEntity player = Objects.requireNonNull(context.getSource().getPlayer()); 167 + 168 + tools.tpaAccept(player, TargetPlayer); 169 + return 0; 170 + })))); 171 + 172 + CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> dispatcher.register(literal("tpadeny") 173 + .then(CommandManager.argument("player", EntityArgumentType.player()) 174 + .executes(context -> { 175 + final ServerPlayerEntity TargetPlayer = EntityArgumentType.getPlayer(context, "player"); 176 + ServerPlayerEntity player = Objects.requireNonNull(context.getSource().getPlayer()); 177 + 178 + tools.tpaDeny(player, TargetPlayer); 179 + return 0; 180 + })))); 181 + } 182 + }
+415
src/main/java/dev/mrsnowy/teleport_commands/utils/tools.java
··· 1 + package dev.mrsnowy.teleport_commands.utils; 2 + 3 + import net.fabricmc.fabric.api.dimension.v1.FabricDimensions; 4 + import net.minecraft.particle.ParticleTypes; 5 + import net.minecraft.server.network.ServerPlayerEntity; 6 + import net.minecraft.server.world.ServerWorld; 7 + import net.minecraft.sound.SoundCategory; 8 + import net.minecraft.sound.SoundEvent; 9 + import net.minecraft.text.ClickEvent; 10 + import net.minecraft.text.Text; 11 + import net.minecraft.util.Formatting; 12 + import net.minecraft.util.math.Vec3d; 13 + import net.minecraft.world.TeleportTarget; 14 + 15 + import java.util.*; 16 + 17 + import static dev.mrsnowy.teleport_commands.storage.StorageManager.*; 18 + import static net.minecraft.sound.SoundEvents.ENTITY_ENDERMAN_TELEPORT; 19 + 20 + public class tools { 21 + private static ArrayList<tpaArrayClass> tpaList = new ArrayList<>(); 22 + 23 + private static class tpaArrayClass { 24 + private ServerPlayerEntity InitPlayer; 25 + private ServerPlayerEntity RecPlayer; 26 + private boolean here; 27 + } 28 + 29 + private static void Teleporter(ServerPlayerEntity player, ServerWorld world, Vec3d coords) { 30 + world.spawnParticles(ParticleTypes.SNOWFLAKE, player.getX(), player.getY() + 1, player.getZ(), 15, 0.0D, 0.0D, 0.0D, 0.01); 31 + world.spawnParticles(ParticleTypes.WHITE_SMOKE, player.getX(), player.getY(), player.getZ(), 10, 0.0D, 1.0D, 0.0D, 0.03); 32 + world.playSound(null, player.getBlockPos(), SoundEvent.of(ENTITY_ENDERMAN_TELEPORT.getId()), SoundCategory.PLAYERS, 0.4f, 1.0f); 33 + 34 + FabricDimensions.teleport(player, world, new TeleportTarget(coords, Vec3d.ZERO, player.getYaw(), player.getPitch())); 35 + 36 + new Timer().schedule( 37 + new TimerTask() { 38 + @Override 39 + public void run() { 40 + world.playSound(null, player.getBlockPos(), SoundEvent.of(ENTITY_ENDERMAN_TELEPORT.getId()), SoundCategory.PLAYERS, 0.4f, 1.0f); 41 + world.spawnParticles(ParticleTypes.SNOWFLAKE, player.getX(), player.getY() , player.getZ(), 15, 0.0D, 1.0D, 0.0D, 0.01); 42 + world.spawnParticles(ParticleTypes.WHITE_SMOKE, player.getX(), player.getY(), player.getZ(), 10, 0.0D, 0.0D, 0.0D, 0.03); 43 + } 44 + }, 50 // 1 tick, i think? 45 + ); 46 + } 47 + 48 + 49 + public static void SetHome(ServerPlayerEntity player, String homeName) throws Exception { 50 + homeName = homeName.toLowerCase(); 51 + Vec3d pos = player.getPos(); 52 + ServerWorld world = player.getServerWorld(); 53 + 54 + PlayerStorageResult storages = GetPlayerStorage(player.getUuidAsString()); 55 + StorageClass storage = storages.storage; 56 + StorageClass.Player playerStorage = storages.playerStorage; 57 + 58 + boolean homeNotFound = true; 59 + 60 + // check for duplicates 61 + for (StorageClass.Player.Home currentHome : playerStorage.Homes) { 62 + if (Objects.equals(currentHome.name, homeName)) { 63 + homeNotFound = false; 64 + break; 65 + } 66 + } 67 + 68 + if (homeNotFound) { 69 + // Create a new Home 70 + StorageClass.Player.Home homeLocation = new StorageClass.Player.Home(); 71 + 72 + homeLocation.name = homeName; 73 + homeLocation.x = Double.parseDouble(String.format("%.1f", pos.getX())); 74 + homeLocation.y = Double.parseDouble(String.format("%.1f", pos.getY()));; 75 + homeLocation.z = Double.parseDouble(String.format("%.1f", pos.getZ()));; 76 + homeLocation.world = world.getRegistryKey().getValue().toString(); 77 + 78 + playerStorage.Homes.add(homeLocation); 79 + 80 + if (playerStorage.Homes.size() == 1) { 81 + playerStorage.DefaultHome = homeName; 82 + } 83 + 84 + StorageSaver(storage); 85 + } else { 86 + player.sendMessage(Text.literal("Home Already Exists!"), true); 87 + } 88 + } 89 + 90 + public static void GoHome(ServerPlayerEntity player, String homeName) { 91 + homeName = homeName.toLowerCase(); 92 + StorageClass.Player playerStorage = GetPlayerStorage(player.getUuidAsString()).playerStorage; 93 + 94 + if (homeName.isEmpty()) { 95 + homeName = playerStorage.DefaultHome; 96 + // todo : can cause error if home doesnt exist 97 + } 98 + 99 + boolean foundHome = false; 100 + boolean foundWorld = false; 101 + 102 + // find correct home 103 + for (StorageClass.Player.Home currentHome : playerStorage.Homes) { 104 + if (Objects.equals(currentHome.name, homeName)){ 105 + foundHome = true; 106 + 107 + // find correct world 108 + for (ServerWorld currentWorld : Objects.requireNonNull(player.getServer()).getWorlds()) { 109 + if (Objects.equals(currentWorld.getRegistryKey().getValue().toString(), currentHome.world)) { 110 + Teleporter(player, currentWorld, new Vec3d(currentHome.x, currentHome.y, currentHome.z)); 111 + foundWorld = true; 112 + break; 113 + } 114 + } 115 + } 116 + } 117 + 118 + if (!foundHome) { 119 + player.sendMessage(Text.literal("Home Not Found!"), true); 120 + } else if (!foundWorld) { 121 + player.sendMessage(Text.literal("World Not Found!"), true); 122 + } 123 + 124 + } 125 + 126 + public static void DeleteHome(ServerPlayerEntity player, String homeName) throws Exception { 127 + homeName = homeName.toLowerCase(); 128 + PlayerStorageResult storages = GetPlayerStorage(player.getUuidAsString()); 129 + StorageClass storage = storages.storage; 130 + StorageClass.Player playerStorage = storages.playerStorage; 131 + 132 + StorageClass.Player.Home homeToDelete = null; 133 + 134 + // get correct home 135 + for (StorageClass.Player.Home currentHome : playerStorage.Homes) { 136 + if (Objects.equals(currentHome.name, homeName)){ 137 + homeToDelete = currentHome; 138 + break; 139 + } 140 + } 141 + 142 + if (Objects.nonNull(homeToDelete)) { 143 + playerStorage.Homes.remove(homeToDelete); 144 + StorageSaver(storage); 145 + } else { 146 + player.sendMessage(Text.literal("Home Not Found!"), true); 147 + } 148 + } 149 + 150 + public static void RenameHome(ServerPlayerEntity player, String homeName, String newHomeName) throws Exception { 151 + homeName = homeName.toLowerCase(); 152 + newHomeName = newHomeName.toLowerCase(); 153 + 154 + PlayerStorageResult storages = GetPlayerStorage(player.getUuidAsString()); 155 + StorageClass storage = storages.storage; 156 + StorageClass.Player playerStorage = storages.playerStorage; 157 + 158 + StorageClass.Player.Home homeToRename = null; 159 + boolean newNameNotFound = true; 160 + 161 + // check for duplicates 162 + for (StorageClass.Player.Home currentHome : playerStorage.Homes) { 163 + if (Objects.equals(currentHome.name, newHomeName)) { 164 + newNameNotFound = false; 165 + break; 166 + } 167 + } 168 + 169 + if (newNameNotFound) { 170 + // get correct home 171 + for (StorageClass.Player.Home currentHome : playerStorage.Homes) { 172 + if (Objects.equals(currentHome.name, homeName)){ 173 + homeToRename = currentHome; 174 + break; 175 + } 176 + } 177 + 178 + if (Objects.nonNull(homeToRename)) { 179 + if (Objects.equals(playerStorage.DefaultHome, homeToRename.name)) { 180 + playerStorage.DefaultHome = newHomeName; 181 + } 182 + 183 + homeToRename.name = newHomeName; 184 + StorageSaver(storage); 185 + } else { 186 + player.sendMessage(Text.literal("Home Not Found!"), true); 187 + } 188 + } else { 189 + player.sendMessage(Text.literal("Home Already Exists!"), true); 190 + } 191 + 192 + } 193 + 194 + public static void PrintHomes(ServerPlayerEntity player) { 195 + StorageClass.Player playerStorage = GetPlayerStorage(player.getUuidAsString()).playerStorage; 196 + boolean anyHomes = false; 197 + 198 + for (StorageClass.Player.Home currenthome : playerStorage.Homes) { 199 + if (!anyHomes) { 200 + player.sendMessage(Text.literal("Homes: \n").formatted(Formatting.YELLOW, Formatting.BOLD), false); 201 + anyHomes = true; 202 + } 203 + 204 + String name = String.format(" - %s", currenthome.name); 205 + String nameDefault = " (Default)"; 206 + 207 + 208 + String coords = String.format(" [X%.1f Y%.1f Z%.1f]", currenthome.x, currenthome.y, currenthome.z); 209 + String dimension = String.format(" [%s]", currenthome.world); 210 + 211 + if (Objects.equals(currenthome.name, playerStorage.DefaultHome)) { 212 + player.sendMessage(Text.literal(name).formatted(Formatting.AQUA) 213 + .append(Text.literal(nameDefault).formatted(Formatting.AQUA, Formatting.BOLD)), 214 + false 215 + ); 216 + } else { 217 + player.sendMessage(Text.literal(name).formatted(Formatting.AQUA), false); 218 + } 219 + 220 + 221 + player.sendMessage(Text.literal(" |").formatted(Formatting.AQUA) 222 + .append(Text.literal(coords).formatted(Formatting.LIGHT_PURPLE).styled(style -> style.withClickEvent(new ClickEvent(ClickEvent.Action.COPY_TO_CLIPBOARD, String.format("X%.2f Y%.2f Z%.2f", currenthome.x, currenthome.y, currenthome.z))))) 223 + .append(Text.literal(dimension).formatted(Formatting.DARK_PURPLE).styled(style -> style.withClickEvent(new ClickEvent(ClickEvent.Action.COPY_TO_CLIPBOARD, currenthome.world)))), 224 + false 225 + ); 226 + 227 + player.sendMessage(Text.literal(" |").formatted(Formatting.AQUA) 228 + .append(Text.literal(" [Tp]").formatted(Formatting.GREEN).styled(style -> style.withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, String.format("/home %s", currenthome.name))))) 229 + .append(Text.literal(" [Rename]").formatted(Formatting.BLUE).styled(style -> style.withClickEvent(new ClickEvent(ClickEvent.Action.SUGGEST_COMMAND, String.format("/renamehome %s ", currenthome.name))))) 230 + .append(Text.literal(" [Delete]\n").formatted(Formatting.RED).styled(style -> style.withClickEvent(new ClickEvent(ClickEvent.Action.SUGGEST_COMMAND, String.format("/delhome %s", currenthome.name))))), 231 + false 232 + ); 233 + } 234 + 235 + if (!anyHomes) { 236 + player.sendMessage(Text.literal("No homes set"), true); 237 + } 238 + } 239 + 240 + public static void SetDefaultHome(ServerPlayerEntity player, String homeName) throws Exception { 241 + homeName = homeName.toLowerCase(); 242 + PlayerStorageResult storages = GetPlayerStorage(player.getUuidAsString()); 243 + StorageClass storage = storages.storage; 244 + StorageClass.Player playerStorage = storages.playerStorage; 245 + 246 + boolean homeExists = false; 247 + 248 + // check if home exists 249 + for (StorageClass.Player.Home currentHome : playerStorage.Homes) { 250 + if (Objects.equals(currentHome.name, homeName)){ 251 + homeExists = true; 252 + break; 253 + } 254 + } 255 + 256 + if (homeExists) { 257 + if (Objects.equals(playerStorage.DefaultHome, homeName)) { 258 + player.sendMessage(Text.literal("Home is already set as default!"), true); 259 + 260 + } else { 261 + playerStorage.DefaultHome = homeName; 262 + StorageSaver(storage); 263 + } 264 + } else { 265 + player.sendMessage(Text.literal("Home not found!"), true); 266 + } 267 + } 268 + 269 + 270 + public static void ToDeathLocation(ServerPlayerEntity player) { 271 + StorageClass.Player playerStorage = GetPlayerStorage(player.getUuidAsString()).playerStorage; 272 + 273 + Vec3d pos = new Vec3d(playerStorage.deathLocation.x, playerStorage.deathLocation.y, playerStorage.deathLocation.z); 274 + 275 + boolean found = false; 276 + for (ServerWorld currentWorld : Objects.requireNonNull(player.getServer()).getWorlds()) { 277 + if (Objects.equals(currentWorld.getRegistryKey().getValue().toString(), playerStorage.deathLocation.world)) { 278 + Teleporter(player, currentWorld, pos); 279 + found = true; 280 + break; 281 + } 282 + } 283 + 284 + if (!found) { 285 + player.sendMessage(Text.literal("No Location Found!"), true); 286 + } 287 + } 288 + 289 + public static void tpaCommandHandler(ServerPlayerEntity FromPlayer, ServerPlayerEntity ToPlayer, boolean here) { 290 + 291 + if (FromPlayer == ToPlayer) { 292 + FromPlayer.sendMessage(Text.literal("Well, that was easy").formatted(Formatting.AQUA),true); 293 + 294 + } else { 295 + String ToMessage; 296 + String FromMessage; 297 + 298 + // Store da request 299 + tpaArrayClass tpaRequest = new tpaArrayClass(); 300 + tpaRequest.InitPlayer = FromPlayer; 301 + tpaRequest.RecPlayer = ToPlayer; 302 + tpaRequest.here = here; 303 + tpaList.add(tpaRequest); 304 + 305 + if (here) { 306 + ToMessage = "TpaHere Request Received From "; 307 + FromMessage = "TpaHere Request Send to "; 308 + 309 + } else { 310 + ToMessage = "Tpa Request Received From "; 311 + FromMessage = "Tpa Request Send to "; 312 + } 313 + 314 + String ToPlayerString = Objects.requireNonNull(ToPlayer.getName().getLiteralString()); 315 + String FromPlayerString = Objects.requireNonNull(FromPlayer.getName().getLiteralString()); 316 + 317 + FromPlayer.sendMessage(Text.literal(FromMessage).formatted(Formatting.AQUA) 318 + .append(Text.literal(ToPlayerString).formatted(Formatting.AQUA, Formatting.BOLD)) 319 + // .append(Text.literal("\n[Cancel]").formatted(Formatting.BLUE, Formatting.BOLD)) 320 + ,true 321 + ); 322 + 323 + ToPlayer.sendMessage(Text.literal(ToMessage).formatted(Formatting.AQUA) 324 + .append(Text.literal(FromPlayerString).formatted(Formatting.AQUA, Formatting.BOLD)) 325 + .append(Text.literal("\n[Accept]").formatted(Formatting.GREEN, Formatting.BOLD).styled(style -> style.withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, String.format("/tpaaccept %s", FromPlayerString))))) 326 + .append(Text.literal(" [Deny]").formatted(Formatting.RED, Formatting.BOLD).styled(style -> style.withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, String.format("/tpadeny %s", FromPlayerString))))), 327 + false 328 + ); 329 + 330 + Timer timer = new Timer(); 331 + timer.schedule( 332 + new TimerTask() { 333 + @Override 334 + public void run() { 335 + boolean successful = tpaList.remove(tpaRequest); 336 + if (successful) { 337 + if (here) { 338 + FromPlayer.sendMessage(Text.literal("TpaHere Request Expired").formatted(Formatting.AQUA),true); 339 + } else { 340 + FromPlayer.sendMessage(Text.literal("Tpa Request Expired").formatted(Formatting.AQUA),true); 341 + } 342 + } 343 + } 344 + }, 30 * 1000 345 + ); 346 + } 347 + } 348 + 349 + public static void tpaAccept(ServerPlayerEntity FromPlayer, ServerPlayerEntity ToPlayer) { 350 + if (FromPlayer == ToPlayer) { 351 + FromPlayer.sendMessage(Text.literal("No").formatted(Formatting.AQUA),true); 352 + } else { 353 + Optional<tpaArrayClass> tpaStorage = tpaList.stream() 354 + .filter(tpa -> Objects.equals(ToPlayer, tpa.InitPlayer)) 355 + .filter(tpa -> Objects.equals(FromPlayer, tpa.RecPlayer)) 356 + .findFirst(); 357 + 358 + if (tpaStorage.isPresent()) { 359 + if (tpaStorage.get().here) { 360 + FromPlayer.sendMessage(Text.literal("Teleporting"),true); 361 + ToPlayer.sendMessage(Text.literal("Request Accepted"),true); 362 + 363 + Teleporter(FromPlayer, ToPlayer.getServerWorld(), ToPlayer.getPos()); 364 + } else { 365 + ToPlayer.sendMessage(Text.literal("Teleporting"),true); 366 + FromPlayer.sendMessage(Text.literal("Request Accepted"),true); 367 + 368 + Teleporter(ToPlayer, FromPlayer.getServerWorld(), FromPlayer.getPos()); 369 + } 370 + 371 + tpaList.remove(tpaStorage.get()); 372 + } else { 373 + FromPlayer.sendMessage(Text.literal("No Requests found!").formatted(Formatting.AQUA),true); 374 + } 375 + } 376 + } 377 + 378 + public static void tpaDeny(ServerPlayerEntity FromPlayer, ServerPlayerEntity ToPlayer) { 379 + if (FromPlayer == ToPlayer) { 380 + FromPlayer.sendMessage(Text.literal("No").formatted(Formatting.AQUA),true); 381 + } else { 382 + Optional<tpaArrayClass> tpaStorage = tpaList.stream() 383 + .filter(tpa -> Objects.equals(ToPlayer, tpa.InitPlayer)) 384 + .filter(tpa -> Objects.equals(FromPlayer, tpa.RecPlayer)) 385 + .findFirst(); 386 + 387 + if (tpaStorage.isPresent()) { 388 + tpaList.remove(tpaStorage.get()); 389 + 390 + if (tpaStorage.get().here) { 391 + ToPlayer.sendMessage(Text.literal("Request Denied").formatted(Formatting.AQUA),true); 392 + } else { 393 + FromPlayer.sendMessage(Text.literal("Request Denied").formatted(Formatting.AQUA),true); 394 + } 395 + } else { 396 + FromPlayer.sendMessage(Text.literal("No Requests found!").formatted(Formatting.AQUA),true); 397 + } 398 + } 399 + } 400 + 401 + 402 + public static void DeathLocationUpdater(Vec3d pos, ServerWorld world, String UUID) throws Exception { 403 + PlayerStorageResult storages = GetPlayerStorage(UUID); 404 + 405 + StorageClass storage = storages.storage; 406 + StorageClass.Player playerStorage = storages.playerStorage; 407 + 408 + playerStorage.deathLocation.x = Double.parseDouble(String.format("%.1f", pos.getX()));; 409 + playerStorage.deathLocation.y = Double.parseDouble(String.format("%.1f", pos.getY()));; 410 + playerStorage.deathLocation.z = Double.parseDouble(String.format("%.1f", pos.getZ()));; 411 + playerStorage.deathLocation.world = world.getRegistryKey().getValue().toString(); 412 + 413 + StorageSaver(storage); 414 + } 415 + }
+1 -11
src/main/resources/fabric.mod.json
··· 17 17 "entrypoints": { 18 18 "main": [ 19 19 "dev.mrsnowy.teleport_commands.TeleportCommands" 20 - ], 21 - "client": [ 22 - "dev.mrsnowy.teleport_commands.TeleportCommandsClient" 23 20 ] 24 21 }, 25 - "mixins": [ 26 - "teleport_commands.mixins.json", 27 - { 28 - "config": "teleport_commands.client.mixins.json", 29 - "environment": "client" 30 - } 31 - ], 32 22 "depends": { 33 23 "fabricloader": ">=0.15.9", 34 24 "minecraft": "~1.20.4", 35 25 "java": ">=17", 36 - "fabric-api": "*" 26 + "fabric-api": ">=0.97.0" 37 27 }, 38 28 "suggests": { 39 29 "another-mod": "*"
-11
src/main/resources/teleport_commands.mixins.json
··· 1 - { 2 - "required": true, 3 - "package": "dev.mrsnowy.teleport_commands.mixin", 4 - "compatibilityLevel": "JAVA_17", 5 - "mixins": [ 6 - "ExampleMixin" 7 - ], 8 - "injectors": { 9 - "defaultRequire": 1 10 - } 11 - }