diff --git a/BetterRTPAddons/src/main/java/me/SuperRonanCraft/BetterRTPAddons/AddonsHandler.java b/BetterRTPAddons/src/main/java/me/SuperRonanCraft/BetterRTPAddons/AddonsHandler.java index 412f5f3..afea8ba 100644 --- a/BetterRTPAddons/src/main/java/me/SuperRonanCraft/BetterRTPAddons/AddonsHandler.java +++ b/BetterRTPAddons/src/main/java/me/SuperRonanCraft/BetterRTPAddons/AddonsHandler.java @@ -10,6 +10,7 @@ import me.SuperRonanCraft.BetterRTPAddons.addons.logger.AddonLogger; import me.SuperRonanCraft.BetterRTPAddons.addons.magicStick.AddonMagicStick; import me.SuperRonanCraft.BetterRTPAddons.addons.partyrtp.AddonParty; import me.SuperRonanCraft.BetterRTPAddons.addons.portals.AddonPortals; +import me.SuperRonanCraft.BetterRTPAddons.addons.rtpmenu.AddonRTPMenu; import java.util.ArrayList; import java.util.List; @@ -48,6 +49,7 @@ public class AddonsHandler { EXTRAEFFECTS(new AddonExtraEffects()), //New cosmetica! COMMANDS(new AddonCommands()), //Commands on rtp events PARTY_RTP(new AddonParty()), //Adds parties! + RTP_MENU(new AddonRTPMenu()), //Adds /rtp menu ; final Addon addon; diff --git a/BetterRTPAddons/src/main/java/me/SuperRonanCraft/BetterRTPAddons/addons/rtpmenu/AddonRTPMenu.java b/BetterRTPAddons/src/main/java/me/SuperRonanCraft/BetterRTPAddons/addons/rtpmenu/AddonRTPMenu.java index 0cab2dc..366a1d8 100644 --- a/BetterRTPAddons/src/main/java/me/SuperRonanCraft/BetterRTPAddons/addons/rtpmenu/AddonRTPMenu.java +++ b/BetterRTPAddons/src/main/java/me/SuperRonanCraft/BetterRTPAddons/addons/rtpmenu/AddonRTPMenu.java @@ -1,5 +1,6 @@ package me.SuperRonanCraft.BetterRTPAddons.addons.rtpmenu; +import lombok.Getter; import me.SuperRonanCraft.BetterRTP.player.commands.RTPCommand; import me.SuperRonanCraft.BetterRTP.player.commands.types.CmdTeleport; import me.SuperRonanCraft.BetterRTP.references.customEvents.RTP_CommandEvent; @@ -15,16 +16,19 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.HandlerList; import org.bukkit.event.Listener; import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.inventory.Inventory; import java.util.HashMap; import java.util.Objects; public class AddonRTPMenu implements Addon, Listener { - private static String name = "RTPMenu"; + public static String name = "RTPMenu"; private final HashMap playerData = new HashMap<>(); public MenuData getData(Player p) { + if (!playerData.containsKey(p)) + playerData.put(p, new MenuData()); return playerData.getOrDefault(p, null); } @@ -55,15 +59,16 @@ public class AddonRTPMenu implements Addon, Listener { @EventHandler private void onClick(InventoryClickEvent e) { if (validClick(e)) { + e.setCancelled(true); e.getWhoClicked().sendMessage("Menu Inventory!"); } } @EventHandler - private void onClick(RTP_CommandEvent e) { - if (e.getCmd() instanceof CmdTeleport && e.getCmd() instanceof Player) { + private void onTeleport(RTP_CommandEvent e) { + if (e.getCmd() instanceof CmdTeleport && e.getSendi() instanceof Player) { e.setCancelled(true); - RTPMenu_CreateInventory.createInv((Player) e.getSendi()); + RTPMenu_CreateInventory.createInv(this, (Player) e.getSendi()); } } diff --git a/BetterRTPAddons/src/main/java/me/SuperRonanCraft/BetterRTPAddons/addons/rtpmenu/RTPMenu_CreateInventory.java b/BetterRTPAddons/src/main/java/me/SuperRonanCraft/BetterRTPAddons/addons/rtpmenu/RTPMenu_CreateInventory.java index 75b4a8b..704d5eb 100644 --- a/BetterRTPAddons/src/main/java/me/SuperRonanCraft/BetterRTPAddons/addons/rtpmenu/RTPMenu_CreateInventory.java +++ b/BetterRTPAddons/src/main/java/me/SuperRonanCraft/BetterRTPAddons/addons/rtpmenu/RTPMenu_CreateInventory.java @@ -1,11 +1,107 @@ package me.SuperRonanCraft.BetterRTPAddons.addons.rtpmenu; +import me.SuperRonanCraft.BetterRTP.BetterRTP; +import me.SuperRonanCraft.BetterRTPAddons.util.Files; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.World; import org.bukkit.entity.Player; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; public class RTPMenu_CreateInventory { - public static void createInv(Player p) { + public static void createInv(AddonRTPMenu pl, Player p) { + List bukkit_worlds = Bukkit.getWorlds(); + List display_worlds = Files.FILETYPE.CONFIG.getStringList(AddonRTPMenu.name + ".Worlds"); + List actual_worlds = new ArrayList<>(); + for (int i = 0; i < 10; i++) //add x Junk worlds for testing + for (World world : bukkit_worlds) { + if (display_worlds.contains(world.getName())) + actual_worlds.add(world); + } + Inventory inv = createInventory(Files.FILETYPE.CONFIG.getString(AddonRTPMenu.name + ".Menu.Title"), Math.floorDiv(actual_worlds.size(), 9) * 9 + 9); + HashMap world_slots = centerWorlds(new ArrayList<>(actual_worlds)); + + for (Map.Entry world : world_slots.entrySet()) { + int slot = world.getValue(); + ItemStack item = new ItemStack(Material.MAP, 1); + ItemMeta meta = item.getItemMeta(); + assert meta != null; + meta.setDisplayName(world.getKey().getName() + ": " + actual_worlds.size() + " " + world_slots.size()); + item.setItemMeta(meta); + inv.setItem(slot, item); + } + + pl.getData(p).setMenuInv(inv); + p.openInventory(inv); + } + + private static HashMap centerWorlds(List actual_worlds) { + HashMap map = new HashMap<>(); + while(actual_worlds.size() >= 9) { + map.put(actual_worlds.get(0), map.size()); + actual_worlds.remove(0); + } + int slot = map.size(); + for (int i = 0; i < actual_worlds.size(); i++) { + map.put(actual_worlds.get(i), slot + getSlotOffset(actual_worlds.size(), i) + i); + } + + return map; + } + + private static int getSlotOffset(int gear_to_show, int index) { + if (gear_to_show % 2 == 0) { //Is Even + switch (gear_to_show) { + case 2: + switch (index) { + case 0: return 3; + case 1: return 4; + } + break; + case 4: + switch (index) { + case 0: + case 1: return 2; + case 2: + case 3: return 3; + } + break; + case 6: + switch (index) { + case 0: + case 1: + case 2: return 1; + case 3: + case 4: + case 5: return 2; + } + break; + case 8: + if (index > 4) return 1; + } + } else { + switch (gear_to_show) { + case 1: return 4; + case 3: return 3; + case 5: return 2; + case 7: return 1; + } + } + return 0; + } + + private static Inventory createInventory(String title, int size) { + title = BetterRTP.getInstance().getText().color(title); + return Bukkit.createInventory(null, Math.min(size, 54), title); } } diff --git a/BetterRTPAddons/src/main/resources/config.yml b/BetterRTPAddons/src/main/resources/config.yml index 15c8127..170f0d0 100644 --- a/BetterRTPAddons/src/main/resources/config.yml +++ b/BetterRTPAddons/src/main/resources/config.yml @@ -64,6 +64,10 @@ Parties: #Addon RTPMenu (Enable `/rtp` world select menu) RTPMenu: Enabled: false + Menu: + Title: "Choose World" + Items: + Worlds: - world - world_nether \ No newline at end of file diff --git a/src/main/java/me/SuperRonanCraft/BetterRTP/player/commands/Commands.java b/src/main/java/me/SuperRonanCraft/BetterRTP/player/commands/Commands.java index 9b3b0d8..74995ef 100644 --- a/src/main/java/me/SuperRonanCraft/BetterRTP/player/commands/Commands.java +++ b/src/main/java/me/SuperRonanCraft/BetterRTP/player/commands/Commands.java @@ -59,7 +59,8 @@ public class Commands { } else { RTP_CommandEvent event = new RTP_CommandEvent(sendi, new CmdTeleport()); Bukkit.getServer().getPluginManager().callEvent(event); - event.getCmd().execute(sendi, label, args); + if (!event.isCancelled()) + event.getCmd().execute(sendi, label, args); } } else pl.getText().getNoPermission(sendi);