WorldCommand.java 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. package me.lethunderhawk.world.command;
  2. import me.lethunderhawk.fluxapi.FluxService;
  3. import me.lethunderhawk.fluxapi.util.command.CommandNode;
  4. import me.lethunderhawk.fluxapi.util.command.CustomCommand;
  5. import me.lethunderhawk.fluxapi.util.interfaces.BazaarFluxModule;
  6. import me.lethunderhawk.main.BazaarFlux;
  7. import me.lethunderhawk.world.manager.NestedWorldStorageManager;
  8. import net.kyori.adventure.text.Component;
  9. import net.kyori.adventure.text.format.NamedTextColor;
  10. import org.bukkit.Bukkit;
  11. import org.bukkit.Location;
  12. import org.bukkit.World;
  13. import org.bukkit.command.CommandSender;
  14. import org.bukkit.entity.Player;
  15. import java.util.HashMap;
  16. import java.util.Map;
  17. import java.util.function.BiConsumer;
  18. public class WorldCommand extends CustomCommand {
  19. private Map<String, Location> locations = new HashMap<>();
  20. public WorldCommand(BazaarFluxModule module) {
  21. super(new CommandNode("world", "Hop between worlds!", null), module);
  22. populateLocationMap();
  23. }
  24. private void populateLocationMap() {
  25. locations.clear();
  26. initMatchingWorldLocationFromSpawn("hub", "world");
  27. }
  28. private void initMatchingWorldLocationFromSpawn(String... worldNames){
  29. for(String worldName : worldNames){
  30. initMatchingWorldLocationFromSpawn(worldName);
  31. }
  32. }
  33. private void initMatchingWorldLocationFromSpawn(String worldName) {
  34. World world = Bukkit.getWorld(worldName);
  35. if(world == null){
  36. FluxService.get(BazaarFlux.class).getLogger().warning("World not found: " + worldName);
  37. return;
  38. }
  39. Location worldLoc = world.getBlockAt(0,100,0).getLocation();
  40. locations.put(worldName, worldLoc);
  41. }
  42. @Override
  43. public void createCommands() {
  44. registerCommand("island", "Warp to your island", this::warpToIsland);
  45. registerCommand("overworld", "Warp to the overworld", this::warpOverworld);
  46. registerCommand("reload", "Reload this module", this::reload);
  47. registerCommand("deleteIslands", "delete all worlds in island folder", this::deleteAllIslands);
  48. registerAllDefaultWorldCommands();
  49. }
  50. private void deleteAllIslands(CommandSender sender, String[] strings) {
  51. NestedWorldStorageManager manager = FluxService.get(NestedWorldStorageManager.class);
  52. for(String worldFolder : manager.listWorlds("islands")){
  53. manager.deleteWorld("islands", worldFolder);
  54. }
  55. }
  56. private void reload(CommandSender sender, String[] strings) {
  57. module.reload(sender, strings);
  58. }
  59. private void registerAllDefaultWorldCommands() {
  60. if(locations == null || locations.isEmpty()) return;
  61. for(Map.Entry<String, Location> entry : locations.entrySet()){
  62. String locationName = entry.getKey();
  63. registerCommand(locationName, "Warp to " + locationName, warpToLocation(entry.getValue()));
  64. }
  65. }
  66. private BiConsumer<CommandSender, String[]> warpToLocation(Location value) {
  67. return (sender, args) -> {
  68. warptoLocation(sender, args, value);
  69. };
  70. }
  71. private void warptoLocation(CommandSender sender, String[] strings, Location location) {
  72. if(!(sender instanceof Player p)) return;
  73. p.teleport(location);
  74. }
  75. private void warpOverworld(CommandSender sender, String[] strings) {
  76. if(!(sender instanceof Player player)) return;
  77. FluxService.get(NestedWorldStorageManager.class).warpToWorld(player,"world");
  78. }
  79. private void warpToIsland(CommandSender sender, String[] args) {
  80. if (!(sender instanceof Player player)) return;
  81. NestedWorldStorageManager manager = FluxService.get(NestedWorldStorageManager.class);
  82. String worldName = "island_" + player.getName();
  83. World world = manager.loadIfExists("islands", worldName);
  84. if (world == null) {
  85. module.sendText(player, Component.text("You are new here! Let us create an island first...", NamedTextColor.GREEN));
  86. world = manager.createIslandWorld(worldName);
  87. }
  88. module.sendText(player, Component.text("Warping to island...", NamedTextColor.GREEN));
  89. player.teleportAsync(world.getSpawnLocation());
  90. }
  91. }