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.

Still rewriting big parts of the code, wip and borked

Still improving the java classes and rewriting big parts of the code to make it use em.

+237 -310
+2
CHANGELOG.md
··· 10 10 - Adding comments to alot of code (W.I.P) 11 11 - Made it so the DeathLocation is only kept in memory 12 12 - Improved the Storage classes and functions (I'm doing proper java, yipie) 13 + - Better error handling for command suggestions 14 + - Added hover effects for warp and homes text (W.I.P) 13 15 14 16 ### [v1.2.2] 15 17 - Handled a case where the client (geyser) will return the language as uppercase instead of lowercase.
+2 -13
common/src/main/java/dev/mrsnowy/teleport_commands/TeleportCommands.java
··· 1 1 package dev.mrsnowy.teleport_commands; 2 2 3 3 import com.google.gson.*; 4 - import com.mojang.datafixers.util.Pair; 5 4 import dev.mrsnowy.teleport_commands.storage.StorageManager; 6 5 import dev.mrsnowy.teleport_commands.commands.*; 7 - import dev.mrsnowy.teleport_commands.storage.backListStorage; 6 + import dev.mrsnowy.teleport_commands.storage.DeathLocationStorage; 8 7 import net.minecraft.commands.Commands; 9 8 import net.minecraft.server.MinecraftServer; 10 9 import net.minecraft.server.level.ServerPlayer; ··· 63 62 String world = player.serverLevel().dimension().location().toString(); 64 63 String uuid = player.getStringUUID(); 65 64 66 - backListStorage.backList backList = backListStorage.backList; 67 - backList.setDeathLocation(uuid, pos, world); 65 + DeathLocationStorage.setDeathLocation(uuid, pos, world); 68 66 } 69 - 70 - // private static StorageManager.StorageClass loadStorage() throws Exception { 71 - // // double check that the storage file is intact 72 - // StorageInit(); 73 - // 74 - // String jsonContent = Files.readString(STORAGE_FILE); 75 - // Gson gson = new GsonBuilder().create(); 76 - // 77 - // } 78 67 79 68 // cleans and updates Storage to the newest "version". This is painful 80 69 private static StorageClass storageValidator() {
+4 -4
common/src/main/java/dev/mrsnowy/teleport_commands/commands/back.java
··· 6 6 7 7 import java.util.*; 8 8 9 - import dev.mrsnowy.teleport_commands.storage.backListStorage; 9 + import dev.mrsnowy.teleport_commands.storage.DeathLocationStorage; 10 10 import dev.mrsnowy.teleport_commands.utils.tools; 11 11 import net.minecraft.ChatFormatting; 12 12 import net.minecraft.commands.Commands; ··· 60 60 61 61 private static void ToDeathLocation(ServerPlayer player, boolean safetyDisabled) { 62 62 63 - backListStorage.backList backList = backListStorage.backList; 63 + DeathLocationStorage.backList backList = DeathLocationStorage.backList; 64 64 65 65 // get the deathLocation 66 - Optional<backListStorage.deathLocationClass> optionalDeathLocation = backList.getDeathLocation( player.getStringUUID() ); 66 + Optional<DeathLocationStorage.deathLocationClass> optionalDeathLocation = backList.getDeathLocation( player.getStringUUID() ); 67 67 if (optionalDeathLocation.isEmpty()) { 68 68 player.displayClientMessage(getTranslatedText("commands.teleport_commands.common.noLocation", player) 69 69 .withStyle(ChatFormatting.RED), true); 70 70 return; 71 71 } 72 72 73 - backListStorage.deathLocationClass deathLocation = optionalDeathLocation.get(); 73 + DeathLocationStorage.deathLocationClass deathLocation = optionalDeathLocation.get(); 74 74 75 75 // get the world 76 76 Optional<ServerLevel> OptionalWorld = tools.getWorld( deathLocation.world );
+103 -63
common/src/main/java/dev/mrsnowy/teleport_commands/commands/warp.java
··· 4 4 import com.mojang.datafixers.util.Pair; 5 5 import dev.mrsnowy.teleport_commands.TeleportCommands; 6 6 import dev.mrsnowy.teleport_commands.storage.StorageManager; 7 + import dev.mrsnowy.teleport_commands.storage.classes.NamedLocation; 7 8 import dev.mrsnowy.teleport_commands.suggestions.WarpSuggestionProvider; 8 9 import net.minecraft.ChatFormatting; 9 10 import net.minecraft.commands.Commands; 10 11 import net.minecraft.core.BlockPos; 11 12 import net.minecraft.network.chat.ClickEvent; 12 13 import net.minecraft.network.chat.Component; 14 + import net.minecraft.network.chat.HoverEvent; 13 15 import net.minecraft.server.level.ServerLevel; 14 16 import net.minecraft.server.level.ServerPlayer; 15 17 import net.minecraft.world.phys.Vec3; 18 + import org.apache.logging.log4j.core.config.builder.api.ComponentBuilder; 16 19 20 + import javax.swing.text.html.Option; 21 + import java.util.ArrayList; 17 22 import java.util.List; 18 23 import java.util.Objects; 24 + import java.util.Optional; 19 25 20 26 import static dev.mrsnowy.teleport_commands.storage.StorageManager.*; 21 27 import static dev.mrsnowy.teleport_commands.utils.tools.Teleporter; ··· 160 166 161 167 private static void GoToWarp(ServerPlayer player, String warpName) throws Exception { 162 168 warpName = warpName.toLowerCase(); 163 - List<StorageClass.NamedLocation> WarpStorage = getWarpStorage().getSecond(); 169 + List<NamedLocation> WarpStorage = getWarpStorage().getSecond(); 164 170 165 171 boolean foundWorld = false; 166 172 167 173 // find correct warp 168 - for (StorageClass.NamedLocation currentWarp : WarpStorage) { 174 + for (NamedLocation currentWarp : WarpStorage) { 169 175 if (Objects.equals(currentWarp.name, warpName)) { 170 176 171 177 // find correct world ··· 196 202 private static void DeleteWarp(ServerPlayer player, String warpName) throws Exception { 197 203 warpName = warpName.toLowerCase(); 198 204 199 - Pair<StorageClass, List<StorageClass.NamedLocation>> storages = getWarpStorage(); 200 - StorageClass storage = storages.getFirst(); 201 - List<StorageClass.NamedLocation> WarpStorage = storages.getSecond(); 205 + // get the existing warp 206 + Optional<NamedLocation> optionalWarp = STORAGE.getWarp(warpName); 202 207 203 - boolean deletedWarp = false; 208 + if (optionalWarp.isPresent()) { 209 + STORAGE.removeWarp(warpName); //todo! maybe improve double getting of warp? 204 210 205 - // get correct warp 206 - for (StorageManager.StorageClass.NamedLocation currentWarp : WarpStorage) { 207 - if (Objects.equals(currentWarp.name, warpName)){ 208 - // delete the warp 209 - WarpStorage.remove(currentWarp); 210 - StorageSaver(); 211 - 212 - deletedWarp = true; 213 - player.displayClientMessage(getTranslatedText("commands.teleport_commands.warp.delete", player), true); 214 - break; 215 - } 216 - } 217 - 218 - if (!deletedWarp) { 219 - player.displayClientMessage(getTranslatedText("commands.teleport_commands.warp.notFound", player).withStyle(ChatFormatting.RED), true); 211 + } else { 212 + // the warp is not found 213 + player.displayClientMessage(getTranslatedText("commands.teleport_commands.warp.notFound", player) 214 + .withStyle(ChatFormatting.RED), true); 220 215 } 221 216 } 222 217 ··· 224 219 warpName = warpName.toLowerCase(); 225 220 newWarpName = newWarpName.toLowerCase(); 226 221 227 - Pair<StorageClass, List<StorageClass.NamedLocation>> storages = getWarpStorage(); 228 - StorageClass storage = storages.getFirst(); 229 - List<StorageClass.NamedLocation> WarpStorage = storages.getSecond(); 222 + // get the existing warp 223 + Optional<NamedLocation> warp = STORAGE.getWarp(warpName); 230 224 231 - StorageManager.StorageClass.NamedLocation homeToRename = null; 225 + if (warp.isPresent()) { 226 + NamedLocation homeToRename = warp.get(); 232 227 233 - boolean newWarpNotFound = true; 234 - boolean WarpRenamed = false; 228 + // check if there is no existing warp with the new name 229 + if (STORAGE.getWarp(newWarpName).isEmpty()) { 235 230 236 - // check for duplicates 237 - for (StorageClass.NamedLocation currentWarp : WarpStorage) { 238 - if (Objects.equals(currentWarp.name, newWarpName)) { 239 - newWarpNotFound = false; 240 - break; 241 - } 242 - } 243 - 244 - if (newWarpNotFound) { 245 - // get correct warp and rename 246 - for (StorageManager.StorageClass.NamedLocation currentWarp : WarpStorage) { 247 - if (Objects.equals(currentWarp.name, warpName)){ 248 - 249 - currentWarp.name = newWarpName; 250 - StorageSaver(); 251 - WarpRenamed = true; 252 - player.displayClientMessage(getTranslatedText("commands.teleport_commands.warp.rename", player), true); 231 + // set the new name 232 + homeToRename.setName(newWarpName); 233 + player.displayClientMessage(getTranslatedText("commands.teleport_commands.warp.rename", player), true); 234 + } else { 253 235 254 - break; 255 - } 236 + // there is already a warp with the new name 237 + player.displayClientMessage(getTranslatedText("commands.teleport_commands.warp.renameExists", player).withStyle(ChatFormatting.RED), true); 256 238 } 257 239 258 - if (!WarpRenamed) { 259 - player.displayClientMessage(getTranslatedText("commands.teleport_commands.warp.notFound", player).withStyle(ChatFormatting.RED), true); 260 - } 261 240 } else { 262 - player.displayClientMessage(getTranslatedText("commands.teleport_commands.warp.renameExists", player).withStyle(ChatFormatting.RED), true); 241 + // the warp is not found 242 + player.displayClientMessage(getTranslatedText("commands.teleport_commands.warp.notFound", player).withStyle(ChatFormatting.RED), true); 263 243 } 264 244 265 245 } 266 246 267 247 private static void PrintWarps(ServerPlayer player) throws Exception { 268 - List<StorageClass.NamedLocation> WarpStorage = getWarpStorage().getSecond(); 248 + ArrayList<NamedLocation> warps = STORAGE.getWarps(); 269 249 270 - if (WarpStorage.isEmpty()) { 250 + if (warps.isEmpty()) { 271 251 player.displayClientMessage(getTranslatedText("commands.teleport_commands.warp.homeless", player).withStyle(ChatFormatting.AQUA), true); 272 252 273 253 } else { 274 254 player.displayClientMessage(getTranslatedText("commands.teleport_commands.warps.warps", player).withStyle(ChatFormatting.YELLOW, ChatFormatting.BOLD) 275 255 .append("\n"), false); 276 256 277 - for (StorageManager.StorageClass.NamedLocation currentWarp : WarpStorage) { 257 + for (NamedLocation currentWarp : warps) { 278 258 279 - String name = String.format(" - %s", currentWarp.name); 280 - String coords = String.format("[X%d Y%d Z%d]", currentWarp.x, currentWarp.y, currentWarp.z); 281 - String dimension = String.format(" [%s]", currentWarp.world); 259 + String name = String.format(" - %s", currentWarp.getName()); 260 + String coords = String.format("[X%d Y%d Z%d]", currentWarp.getX(), currentWarp.getY(), currentWarp.getZ()); 261 + String dimension = String.format(" [%s]", currentWarp.getWorldString()); 282 262 283 263 player.displayClientMessage(Component.literal(name).withStyle(ChatFormatting.AQUA), false); 284 264 285 265 player.displayClientMessage(Component.literal(" | ").withStyle(ChatFormatting.AQUA) 286 - .append(Component.literal(coords).withStyle(ChatFormatting.LIGHT_PURPLE).withStyle(style -> style.withClickEvent(new ClickEvent(ClickEvent.Action.COPY_TO_CLIPBOARD, String.format("X%d Y%d Z%d", currentWarp.x, currentWarp.y, currentWarp.z))))) 287 - .append(Component.literal(dimension).withStyle(ChatFormatting.DARK_PURPLE).withStyle(style -> style.withClickEvent(new ClickEvent(ClickEvent.Action.COPY_TO_CLIPBOARD, currentWarp.world)))), 266 + .append(Component.literal(coords) 267 + .withStyle(ChatFormatting.LIGHT_PURPLE) 268 + .withStyle(style -> style 269 + .withClickEvent(new ClickEvent( 270 + ClickEvent.Action.COPY_TO_CLIPBOARD, 271 + String.format("X%d Y%d Z%d", currentWarp.getX(), currentWarp.getY(), currentWarp.getZ()) 272 + )) 273 + ) 274 + //todo! test the hover 275 + .withStyle(style -> style 276 + .withHoverEvent(new HoverEvent( 277 + HoverEvent.Action.SHOW_TEXT, getTranslatedText("commands.teleport_commands.common.hoverCopy", player) 278 + )) 279 + ) 280 + ) 281 + .append(Component.literal(dimension) 282 + .withStyle(ChatFormatting.DARK_PURPLE) 283 + .withStyle(style -> style 284 + .withClickEvent(new ClickEvent( 285 + ClickEvent.Action.COPY_TO_CLIPBOARD, 286 + currentWarp.getWorldString() 287 + )) 288 + ) 289 + .withStyle(style -> style 290 + .withHoverEvent(new HoverEvent( 291 + HoverEvent.Action.SHOW_TEXT, getTranslatedText("commands.teleport_commands.common.hoverCopy", player) 292 + )) 293 + ) 294 + ), 288 295 false 289 296 ); 290 297 291 298 if (player.hasPermissions(4)) { 292 299 player.displayClientMessage(Component.literal(" | ").withStyle(ChatFormatting.AQUA) 293 - .append(getTranslatedText("commands.teleport_commands.common.tp", player).withStyle(ChatFormatting.GREEN).withStyle(style -> style.withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, String.format("/warp %s", currentWarp.name))))) 300 + .append(getTranslatedText("commands.teleport_commands.common.tp", player) 301 + .withStyle(ChatFormatting.GREEN) 302 + .withStyle(style -> style 303 + .withClickEvent(new ClickEvent( 304 + ClickEvent.Action.RUN_COMMAND, 305 + String.format("/warp %s", currentWarp.getName()) 306 + )) 307 + ) 308 + ) 294 309 .append(" ") 295 - .append(getTranslatedText("commands.teleport_commands.common.rename", player).withStyle(ChatFormatting.BLUE).withStyle(style -> style.withClickEvent(new ClickEvent(ClickEvent.Action.SUGGEST_COMMAND, String.format("/renamewarp %s ", currentWarp.name))))) 310 + .append(getTranslatedText("commands.teleport_commands.common.rename", player) 311 + .withStyle(ChatFormatting.BLUE) 312 + .withStyle(style -> style 313 + .withClickEvent(new ClickEvent( 314 + ClickEvent.Action.SUGGEST_COMMAND, 315 + String.format("/renamewarp %s ", currentWarp.getName())) 316 + ) 317 + ) 318 + ) 296 319 .append(" ") 297 - .append(getTranslatedText("commands.teleport_commands.common.delete", player).withStyle(ChatFormatting.RED).withStyle(style -> style.withClickEvent(new ClickEvent(ClickEvent.Action.SUGGEST_COMMAND, String.format("/delwarp %s", currentWarp.name))))) 320 + .append(getTranslatedText("commands.teleport_commands.common.delete", player) 321 + .withStyle(ChatFormatting.RED) 322 + .withStyle(style -> style 323 + .withClickEvent(new ClickEvent( 324 + ClickEvent.Action.SUGGEST_COMMAND, 325 + String.format("/delwarp %s", currentWarp.getName())) 326 + ) 327 + ) 328 + ) 298 329 .append("\n"), 299 330 false 300 331 ); 301 332 } else { 302 - player.displayClientMessage(Component.literal(" | ").withStyle(ChatFormatting.AQUA) 303 - .append(getTranslatedText("commands.teleport_commands.common.tp", player).withStyle(ChatFormatting.GREEN).withStyle(style -> style.withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, String.format("/warp %s", currentWarp.name))))) 333 + player.displayClientMessage(Component.literal(" | ") 334 + .withStyle(ChatFormatting.AQUA) 335 + .append(getTranslatedText("commands.teleport_commands.common.tp", player) 336 + .withStyle(ChatFormatting.GREEN) 337 + .withStyle(style -> style 338 + .withClickEvent(new ClickEvent( 339 + ClickEvent.Action.RUN_COMMAND, 340 + String.format("/warp %s", currentWarp.getName())) 341 + ) 342 + ) 343 + ) 304 344 .append("\n"), 305 345 false 306 346 );
+1
common/src/main/java/dev/mrsnowy/teleport_commands/commands/worldspawn.java
··· 58 58 } 59 59 60 60 private static void toWorldSpawn(ServerPlayer player, boolean safetyDisabled) throws NullPointerException { 61 + // todo! maybe make this more fool proof? 61 62 ServerLevel world = TeleportCommands.SERVER.getLevel(OVERWORLD); 62 63 BlockPos worldSpawn = Objects.requireNonNull(world,"Overworld cannot be null").getSharedSpawnPos(); 63 64
+36
common/src/main/java/dev/mrsnowy/teleport_commands/storage/DeathLocationStorage.java
··· 1 + package dev.mrsnowy.teleport_commands.storage; 2 + 3 + import dev.mrsnowy.teleport_commands.storage.classes.DeathLocation; 4 + import net.minecraft.core.BlockPos; 5 + 6 + import java.util.ArrayList; 7 + import java.util.Objects; 8 + import java.util.Optional; 9 + 10 + public class DeathLocationStorage { 11 + private static final ArrayList<DeathLocation> deathLocations = new ArrayList<>(); 12 + 13 + // filters the deathLocationList and finds the one with the matching player uuid (if there is one) 14 + public static Optional<DeathLocation> getDeathLocation(String uuid) { 15 + return deathLocations.stream() 16 + .filter( deathLocation -> Objects.equals( deathLocation.getUUID(), uuid )) 17 + .findFirst(); 18 + } 19 + 20 + // updates the deathLocation of a player, if there is no existing entry it will create a new deathLocation. 21 + public static void setDeathLocation(String uuid, BlockPos pos, String world) { 22 + Optional<DeathLocation> OptionalDeathLocation = getDeathLocation(uuid); 23 + 24 + if (OptionalDeathLocation.isEmpty()) { 25 + // create a new deathLocation 26 + DeathLocation deathLocation = new DeathLocation(uuid, pos, world); 27 + deathLocations.add(deathLocation); 28 + } else { 29 + // modify existing deathLocation 30 + DeathLocation deathLocation = OptionalDeathLocation.get(); 31 + 32 + deathLocation.setBlockPos(pos); 33 + deathLocation.setWorld(world); 34 + } 35 + } 36 + }
+55 -148
common/src/main/java/dev/mrsnowy/teleport_commands/storage/StorageManager.java
··· 3 3 import com.google.gson.Gson; 4 4 import com.google.gson.GsonBuilder; 5 5 import dev.mrsnowy.teleport_commands.TeleportCommands; 6 + import dev.mrsnowy.teleport_commands.storage.classes.NamedLocation; 7 + import dev.mrsnowy.teleport_commands.storage.classes.Player; 6 8 import net.minecraft.core.BlockPos; 7 9 8 10 import java.io.File; ··· 10 12 import java.nio.file.Path; 11 13 import java.nio.file.StandardOpenOption; 12 14 import java.util.ArrayList; 13 - import java.util.List; 14 15 import java.util.Objects; 15 16 import java.util.Optional; 16 17 ··· 47 48 } 48 49 } 49 50 50 - // public static StorageClass.Player PlayerAdd(String UUID) { 51 - // 52 - // // try to find an exising storage for this player 53 - // Optional<StorageClass.Player> playerStorage = STORAGE.Players.stream() 54 - // .filter(player -> Objects.equals(UUID, player.UUID)) 55 - // .findFirst(); 56 - // 57 - // if (playerStorage.isEmpty()) { 58 - // StorageClass.Player newPlayer = new StorageClass.Player(UUID); // TODO! verify that it creates the player proper 59 - // 60 - // List<StorageClass.Player> playerList = STORAGE.Players; 61 - // playerList.add(newPlayer); 62 - // 63 - //// StorageSaver(); // no need to save since no data is actually set yet! 64 - // TeleportCommands.LOGGER.info("Player '{}' added successfully in storage!", UUID); 65 - // return newPlayer; 66 - // } else { 67 - // TeleportCommands.LOGGER.info("Player '{}' already exists!", UUID); 68 - // return playerStorage.get(); 69 - // } 70 - // } 71 - 72 51 public static void StorageSaver() throws Exception { 73 52 Gson gson = new GsonBuilder().create(); 74 53 byte[] json = gson.toJson( STORAGE ).getBytes(); 75 54 76 - TeleportCommands.LOGGER.info(STORAGE.toString()); 77 - 78 55 Files.write(STORAGE_FILE, json, StandardOpenOption.WRITE, StandardOpenOption.TRUNCATE_EXISTING); 79 56 } 80 57 81 - // public static Pair<StorageClass, List<StorageClass.NamedLocation>> getWarpStorage() { 82 - // return new Pair<>(STORAGE, STORAGE.Warps); 83 - // } 84 58 85 - // public static Pair<StorageClass, StorageClass.Player> GetPlayerStorage(String UUID) { 86 - // 87 - // // try to find an exising storage for this player 88 - // Optional<StorageClass.Player> playerStorage = STORAGE.Players.stream() 89 - // .filter(player -> Objects.equals(UUID, player.UUID)) 90 - // .findFirst(); 91 - // 92 - // if (playerStorage.isEmpty()) { 93 - // StorageClass.Player player = PlayerAdd(UUID); // create a new player 94 - // 95 - // return new Pair<>(STORAGE, player); 96 - // } 97 - // 98 - // return new Pair<>(STORAGE, playerStorage.get()); 99 - // } 59 + public static class StorageClass { 60 + private static final ArrayList<NamedLocation> Warps = new ArrayList<>(); 61 + private static final ArrayList<Player> Players = new ArrayList<>(); 100 62 63 + // ----- 101 64 102 - public static class StorageClass { 103 - public static warpList Warps = new warpList(); 104 - public static playerList Players = new playerList(); 65 + // returns all warps 66 + public ArrayList<NamedLocation> getWarps() { 67 + return Warps; 68 + } 105 69 106 - public static class NamedLocation { 107 - public String name; 108 - public final int x; 109 - public final int y; 110 - public final int z; 111 - public final String world; 70 + // filters the warpList and finds the one with the name (if there is one) 71 + public Optional<NamedLocation> getWarp(String name) { 72 + return Warps.stream() 73 + .filter(warp -> Objects.equals(warp.getName(), name)) 74 + .findFirst(); 75 + } 112 76 113 - public NamedLocation(String name, BlockPos pos, String world) { 114 - this.name = name; 115 - this.x = pos.getX(); 116 - this.y = pos.getY(); 117 - this.z = pos.getZ(); 118 - this.world = world; 119 - } 77 + // filters the playerList and finds the one with the uuid (if there is one) 78 + public Optional<Player> getPlayer(String uuid) { 79 + return Players.stream() 80 + .filter( player -> Objects.equals( player.getUUID(), uuid )) 81 + .findFirst(); 120 82 } 121 83 122 - public static class warpList { 123 - private final ArrayList<NamedLocation> warpList = new ArrayList<>(); 84 + // ----- 124 85 125 - // filters the warpList and finds the one with the name (if there is one) 126 - public Optional<NamedLocation> getWarp(String name) { 127 - return warpList.stream() 128 - .filter( warp -> Objects.equals( warp.name, name )) 129 - .findFirst(); 130 - } 86 + // creates a new warp, if there already is a warp it will update the existing one 87 + public void setWarp(String name, BlockPos pos, String world) throws Exception { 88 + Optional<NamedLocation> OptionalWarp = getWarp(name); 131 89 132 - // returns all warps 133 - public ArrayList<NamedLocation> getWarps() { 134 - return warpList; 90 + if (OptionalWarp.isEmpty()) { 91 + // create a new warp 92 + NamedLocation warp = new NamedLocation(name, pos, world); 93 + Warps.add(warp); 94 + } else { 95 + // modify existing warp 96 + NamedLocation warp = OptionalWarp.get(); 97 + warp.setName(name); 135 98 } 136 99 137 - // creates a new warp, if there already is a warp it will update the existing one 138 - public void setWarp(String name, BlockPos pos, String world) throws Exception { 139 - Optional<NamedLocation> OptionalWarp = getWarp(name); 140 - 141 - if (OptionalWarp.isEmpty()) { 142 - // create a new warp 143 - NamedLocation warp = new NamedLocation(name, pos, world); 144 - warpList.add(warp); 145 - StorageSaver(); 146 - } else { 147 - // modify existing warp 148 - NamedLocation warp = OptionalWarp.get(); 149 - warp.name = name; 150 - } 151 - } 100 + StorageSaver(); 152 101 } 153 102 154 - public static class playerList { 155 - private final ArrayList<Player> playerList = new ArrayList<>(); 103 + // 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 104 + public Player addPlayer(String uuid) { 105 + final Optional<Player> OptionalPlayer = getPlayer(uuid); 156 106 157 - // filters the playerList and finds the one with the uuid (if there is one) 158 - public Optional<Player> getPlayer(String uuid) { 159 - return playerList.stream() 160 - .filter( player -> Objects.equals( player.UUID, uuid )) 161 - .findFirst(); 162 - } 107 + if (OptionalPlayer.isEmpty()) { 108 + // create new player 109 + Player player = new Player(uuid); 110 + Players.add(player); 111 + // TeleportCommands.LOGGER.info("Player '{}' added successfully in storage!", uuid); // todo! prob remove these loggers 163 112 164 - // creates a new player, if there already is a player it will return the existing one 165 - public Player addPlayer(String uuid, BlockPos pos, String world) { 166 - Optional<Player> OptionalPlayer = getPlayer(uuid); 167 - 168 - if (OptionalPlayer.isEmpty()) { 169 - // create new player 170 - Player player = new Player(uuid); 171 - playerList.add(player); 172 - TeleportCommands.LOGGER.info("Player '{}' added successfully in storage!", uuid); 173 - 174 - return player; 175 - } else { 176 - // return existing player 177 - TeleportCommands.LOGGER.info("Player '{}' already exists!", uuid); 178 - return OptionalPlayer.get(); 179 - } 113 + return player; 114 + } else { 115 + // return existing player 116 + // TeleportCommands.LOGGER.info("Player '{}' already exists!", uuid); 117 + return OptionalPlayer.get(); 180 118 } 181 119 } 182 120 183 - 184 - public static class Player { 185 - public final String UUID; 186 - public String DefaultHome = ""; 187 - public homeList Homes = new homeList(); 188 - 189 - public Player(String uuid) { 190 - this.UUID = uuid; 191 - } 192 - 193 - public static class homeList { 194 - private final List<NamedLocation> Homes = new ArrayList<>(); 195 - 196 - // filters the Homes and finds the one with the name (if there is one) 197 - public Optional<NamedLocation> getHome(String name) { 198 - return Homes.stream() 199 - .filter( home -> Objects.equals( home.name, name )) 200 - .findFirst(); 201 - } 202 - 203 - // returns all homes 204 - public List<NamedLocation> getHomes() { 205 - return Homes; 206 - } 121 + // ----- 207 122 208 - // creates a new home, if there already is a home it will update the existing one 209 - public void setHome(String name, BlockPos pos, String world) throws Exception { 210 - Optional<NamedLocation> OptionalHome = getHome(name); 123 + public void removeWarp(String name) throws Exception { 124 + Optional<NamedLocation> OptionalWarp = getWarp(name); 211 125 212 - if (OptionalHome.isEmpty()) { 213 - NamedLocation home = new NamedLocation(name, pos, world); 214 - 215 - Homes.add(home); 216 - StorageSaver(); 217 - } else { 218 - NamedLocation home = OptionalHome.get(); 219 - 220 - home.name = name; 221 - StorageSaver(); 222 - } 223 - } 126 + if (OptionalWarp.isPresent()) { 127 + Warps.remove(OptionalWarp.get()); 128 + StorageSaver(); 129 + } else { 130 + //todo! ??? 224 131 } 225 132 } 226 133 }
-51
common/src/main/java/dev/mrsnowy/teleport_commands/storage/backListStorage.java
··· 1 - package dev.mrsnowy.teleport_commands.storage; 2 - 3 - import net.minecraft.core.BlockPos; 4 - 5 - import java.util.ArrayList; 6 - import java.util.Objects; 7 - import java.util.Optional; 8 - 9 - public class backListStorage { 10 - public static final backList backList = new backList(); 11 - 12 - public static class backList { 13 - private final ArrayList<deathLocationClass> backList = new ArrayList<>(); 14 - 15 - // filters the deathLocationList and finds the one with the matching player uuid (if there is one) 16 - public Optional<deathLocationClass> getDeathLocation(String uuid) { 17 - return backList.stream() 18 - .filter( deathLocation -> Objects.equals( deathLocation.UUID, uuid )) 19 - .findFirst(); 20 - } 21 - 22 - // updates the deathLocation of a player, if there is no existing entry it will create a new deathLocation. 23 - public void setDeathLocation(String uuid, BlockPos pos, String world) { 24 - Optional<deathLocationClass> OptionalDeathLocation = getDeathLocation(uuid); 25 - 26 - if (OptionalDeathLocation.isEmpty()) { 27 - // create a new deathLocation 28 - deathLocationClass deathLocation = new deathLocationClass(uuid, pos, world); 29 - backList.add(deathLocation); 30 - } else { 31 - // modify existing deathLocation 32 - deathLocationClass deathLocation = OptionalDeathLocation.get(); 33 - 34 - deathLocation.pos = pos; 35 - deathLocation.world = world; 36 - } 37 - } 38 - } 39 - 40 - public static class deathLocationClass { 41 - public String UUID; 42 - public BlockPos pos; 43 - public String world; 44 - 45 - private deathLocationClass(String uuid, BlockPos pos, String world) { 46 - this.UUID = uuid; 47 - this.pos = pos; 48 - this.world = world; 49 - } 50 - } 51 - }
+14 -6
common/src/main/java/dev/mrsnowy/teleport_commands/suggestions/HomeSuggestionProvider.java
··· 5 5 import com.mojang.brigadier.suggestion.Suggestions; 6 6 import com.mojang.brigadier.suggestion.SuggestionsBuilder; 7 7 import dev.mrsnowy.teleport_commands.TeleportCommands; 8 - import dev.mrsnowy.teleport_commands.storage.StorageManager; 8 + 9 + import java.util.Optional; 9 10 import java.util.concurrent.CompletableFuture; 11 + 12 + import dev.mrsnowy.teleport_commands.storage.classes.NamedLocation; 13 + import dev.mrsnowy.teleport_commands.storage.classes.Player; 10 14 import net.minecraft.commands.CommandSourceStack; 11 15 import net.minecraft.server.level.ServerPlayer; 12 16 13 - import static dev.mrsnowy.teleport_commands.storage.StorageManager.GetPlayerStorage; 17 + import static dev.mrsnowy.teleport_commands.storage.StorageManager.STORAGE; 14 18 15 19 public class HomeSuggestionProvider implements SuggestionProvider<CommandSourceStack> { 16 20 @Override 17 21 public CompletableFuture<Suggestions> getSuggestions(CommandContext<CommandSourceStack> context, SuggestionsBuilder builder) { 18 22 try { 19 23 ServerPlayer player = context.getSource().getPlayerOrException(); 20 - StorageManager.StorageClass.Player playerStorage = GetPlayerStorage(player.getStringUUID()).getSecond(); 24 + Optional<Player> optionalPlayerStorage = STORAGE.getPlayer(player.getStringUUID()); 21 25 22 - for (StorageManager.StorageClass.NamedLocation currentHome : playerStorage.Homes) { 23 - builder.suggest(currentHome.name); 26 + if (optionalPlayerStorage.isPresent()) { 27 + Player PlayerStorage = optionalPlayerStorage.get(); 28 + 29 + for (NamedLocation currentHome : PlayerStorage.getHomes()) { 30 + builder.suggest(currentHome.getName()); 31 + } 24 32 } 25 33 26 34 // Build and return the suggestions 27 35 return builder.buildFuture(); 28 36 } catch (Exception e) { 29 - TeleportCommands.LOGGER.error("Error getting suggestions!"); 37 + TeleportCommands.LOGGER.error("Error getting home suggestions! ", e); 30 38 return null; 31 39 } 32 40 }
+7 -7
common/src/main/java/dev/mrsnowy/teleport_commands/suggestions/WarpSuggestionProvider.java
··· 4 4 import com.mojang.brigadier.suggestion.SuggestionProvider; 5 5 import com.mojang.brigadier.suggestion.Suggestions; 6 6 import com.mojang.brigadier.suggestion.SuggestionsBuilder; 7 + 7 8 import dev.mrsnowy.teleport_commands.TeleportCommands; 8 9 import dev.mrsnowy.teleport_commands.storage.StorageManager; 10 + import dev.mrsnowy.teleport_commands.storage.classes.NamedLocation; 11 + 9 12 import net.minecraft.commands.CommandSourceStack; 10 - import net.minecraft.server.level.ServerPlayer; 11 13 12 14 import java.util.List; 13 15 import java.util.concurrent.CompletableFuture; 14 16 15 - import static dev.mrsnowy.teleport_commands.storage.StorageManager.GetPlayerStorage; 16 - import static dev.mrsnowy.teleport_commands.storage.StorageManager.getWarpStorage; 17 17 18 18 public class WarpSuggestionProvider implements SuggestionProvider<CommandSourceStack> { 19 19 @Override 20 20 public CompletableFuture<Suggestions> getSuggestions(CommandContext<CommandSourceStack> context, SuggestionsBuilder builder) { 21 21 try { 22 - List<StorageManager.StorageClass.NamedLocation> WarpStorage = getWarpStorage().getSecond(); 22 + List<NamedLocation> WarpStorage = StorageManager.STORAGE.getWarps(); 23 23 24 - for (StorageManager.StorageClass.NamedLocation currentWarp : WarpStorage) { 25 - builder.suggest(currentWarp.name); 24 + for (NamedLocation currentWarp : WarpStorage) { 25 + builder.suggest(currentWarp.getName()); 26 26 } 27 27 28 28 // Build and return the suggestions 29 29 return builder.buildFuture(); 30 30 } catch (Exception e) { 31 - TeleportCommands.LOGGER.error("Error getting suggestions!"); 31 + TeleportCommands.LOGGER.error("Error getting warp suggestions! ", e); 32 32 return null; 33 33 } 34 34 }
+1 -1
common/src/main/java/dev/mrsnowy/teleport_commands/suggestions/tpaSuggestionProvider.java
··· 36 36 // Build and return the suggestions 37 37 return builder.buildFuture(); 38 38 } catch (Exception e) { 39 - TeleportCommands.LOGGER.error("Error getting suggestions!"); 39 + TeleportCommands.LOGGER.error("Error getting tpa suggestions! ", e); 40 40 return null; 41 41 } 42 42 }
-11
common/src/main/java/dev/mrsnowy/teleport_commands/utils/tools.java
··· 9 9 import java.util.*; 10 10 import java.util.regex.Matcher; 11 11 import java.util.regex.Pattern; 12 - import java.util.stream.StreamSupport; 13 12 14 13 import net.minecraft.core.BlockPos; 15 14 import net.minecraft.core.particles.ParticleTypes; ··· 113 112 } else { 114 113 return new Pair<>(1, Optional.of(new Vec3(playerX + 0.5, playerY, playerZ + 0.5))); // the location is already safe! 115 114 } 116 - } 117 - 118 - 119 - // function to quickly filter the worlds and compare them to a string 120 - public static Optional<ServerLevel> getWorld(String worldString) { 121 - 122 - return StreamSupport.stream( TeleportCommands.SERVER.getAllLevels().spliterator(), false ) // woa, this looks silly 123 - .filter(level -> Objects.equals( level.dimension().location().toString(), worldString )) 124 - .findFirst(); 125 - 126 115 } 127 116 128 117
+2 -1
common/src/main/resources/assets/teleport_commands/lang/en_us.json
··· 61 61 "commands.teleport_commands.common.delete": "[Delete]", 62 62 "commands.teleport_commands.common.default": "(Default)", 63 63 "commands.teleport_commands.common.renameExists": "That Name Already Exists!", 64 - "commands.teleport_commands.common.noLocation": "No Location Found!" 64 + "commands.teleport_commands.common.noLocation": "No Location Found!", 65 + "commands.teleport_commands.common.hoverCopy": "Click to copy!" 65 66 }
+2 -1
common/src/main/resources/assets/teleport_commands/lang/hu_hu.json
··· 61 61 "commands.teleport_commands.common.delete": "[Törlés]", 62 62 "commands.teleport_commands.common.default": "(Alap)", 63 63 "commands.teleport_commands.common.renameExists": "A név már létezik!", 64 - "commands.teleport_commands.common.noLocation": "Nem található a koordináta" 64 + "commands.teleport_commands.common.noLocation": "Nem található a koordináta", 65 + "commands.teleport_commands.common.hoverCopy": "Click to copy!" 65 66 }
+2 -1
common/src/main/resources/assets/teleport_commands/lang/it_it.json
··· 61 61 "commands.teleport_commands.common.delete": "[Elimina]", 62 62 "commands.teleport_commands.common.default": "(Predefinita)", 63 63 "commands.teleport_commands.common.renameExists": "Quel Nome Esiste Già!", 64 - "commands.teleport_commands.common.noLocation": "Nessuna Posizione Trovata!" 64 + "commands.teleport_commands.common.noLocation": "Nessuna Posizione Trovata!", 65 + "commands.teleport_commands.common.hoverCopy": "Click to copy!" 65 66 }
+2 -1
common/src/main/resources/assets/teleport_commands/lang/nl_nl.json
··· 61 61 "commands.teleport_commands.common.delete": "[Verwijderen]", 62 62 "commands.teleport_commands.common.default": "(Standaard)", 63 63 "commands.teleport_commands.common.renameExists": "Die Naam Bestaat Al!", 64 - "commands.teleport_commands.common.noLocation": "Geen Locatie Gevonden!" 64 + "commands.teleport_commands.common.noLocation": "Geen Locatie Gevonden!", 65 + "commands.teleport_commands.common.hoverCopy": "Klik om te kopiëren!" 65 66 }
+2 -1
common/src/main/resources/assets/teleport_commands/lang/ru_ru.json
··· 61 61 "commands.teleport_commands.common.delete": "[Удалить]", 62 62 "commands.teleport_commands.common.default": "(По умолчанию)", 63 63 "commands.teleport_commands.common.renameExists": "Это имя уже занято!", 64 - "commands.teleport_commands.common.noLocation": "Местоположение не найдено!" 64 + "commands.teleport_commands.common.noLocation": "Местоположение не найдено!", 65 + "commands.teleport_commands.common.hoverCopy": "Click to copy!" 65 66 }
+2 -1
common/src/main/resources/assets/teleport_commands/lang/zh_tw.json
··· 61 61 "commands.teleport_commands.common.delete": "[刪除]", 62 62 "commands.teleport_commands.common.default": "(預設)", 63 63 "commands.teleport_commands.common.renameExists": "這個名稱已經存在了!", 64 - "commands.teleport_commands.common.noLocation": "找不到位置!" 64 + "commands.teleport_commands.common.noLocation": "找不到位置!", 65 + "commands.teleport_commands.common.hoverCopy": "Click to copy!" 65 66 }