diff --git a/build.gradle b/build.gradle index f327146..31b3ed4 100644 --- a/build.gradle +++ b/build.gradle @@ -80,7 +80,7 @@ dependencies { } group = 'gq.unurled' -version = '0.5.2' +version = '0.5.3' description = 'Raxen' java.sourceCompatibility = JavaVersion.VERSION_17 diff --git a/src/main/java/gq/unurled/raxen/Raxen.java b/src/main/java/gq/unurled/raxen/Raxen.java index e6bd816..90b3c20 100644 --- a/src/main/java/gq/unurled/raxen/Raxen.java +++ b/src/main/java/gq/unurled/raxen/Raxen.java @@ -18,7 +18,7 @@ import static gq.unurled.raxen.utils.Utils.colorComp; public final class Raxen extends JavaPlugin { private static final String prefix = "Rx> "; - @Getter private static String version = "0.5.2"; + @Getter private static String version = "0.5.3"; private final PluginManager pm = getServer().getPluginManager(); private static Raxen plugin; diff --git a/src/main/java/gq/unurled/raxen/commands/admin/CustomModelDataCommand.java b/src/main/java/gq/unurled/raxen/commands/admin/CustomModelDataCommand.java index 824dfe0..47ba425 100644 --- a/src/main/java/gq/unurled/raxen/commands/admin/CustomModelDataCommand.java +++ b/src/main/java/gq/unurled/raxen/commands/admin/CustomModelDataCommand.java @@ -6,7 +6,6 @@ import org.bukkit.command.CommandSender; import org.bukkit.command.TabExecutor; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.util.StringUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/gq/unurled/raxen/commands/player/MainGuiCommand.java b/src/main/java/gq/unurled/raxen/commands/player/MainGuiCommand.java new file mode 100644 index 0000000..96f05e7 --- /dev/null +++ b/src/main/java/gq/unurled/raxen/commands/player/MainGuiCommand.java @@ -0,0 +1,63 @@ +package gq.unurled.raxen.commands.player; + +import gq.unurled.raxen.Raxen; +import gq.unurled.raxen.components.gui.MainGui; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.command.TabExecutor; +import org.bukkit.entity.Player; +import org.bukkit.inventory.Inventory; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +import static gq.unurled.raxen.utils.Utils.errorConsoleSender; +import static gq.unurled.raxen.utils.Utils.noPerms; + +public class MainGuiCommand implements TabExecutor { + + private Raxen main; + + public MainGuiCommand(Raxen main) { + this.main = main; + } + + /** + * @param sender Source of the command + * @param command Command which was executed + * @param label Alias of the command which was used + * @param args Passed command arguments + * @return + */ + @Override + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { + if (!(sender instanceof Player)) { + errorConsoleSender(sender); + return true; + } + Player p = (Player) sender; + if (!(p.hasPermission("raxen.maingui.cmd"))) { + sender.sendMessage(noPerms()); + return true; + } + Inventory inv = MainGui.build(p); + p.openInventory(inv); + return true; + } + + /** + * @param sender Source of the command. For players tab-completing a + * command inside of a command block, this will be the player, not + * the command block. + * @param command Command which was executed + * @param label Alias of the command which was used + * @param args The arguments passed to the command, including final + * partial argument to be completed + * @return + */ + @Override + public @Nullable List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { + return null; + } +} diff --git a/src/main/java/gq/unurled/raxen/components/entity/player/RaxenPlayer.java b/src/main/java/gq/unurled/raxen/components/entity/player/RaxenPlayer.java index c03f31e..f026758 100644 --- a/src/main/java/gq/unurled/raxen/components/entity/player/RaxenPlayer.java +++ b/src/main/java/gq/unurled/raxen/components/entity/player/RaxenPlayer.java @@ -13,6 +13,7 @@ import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.event.inventory.InventoryType; import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.PlayerInventory; import org.bukkit.persistence.PersistentDataContainer; import org.bukkit.persistence.PersistentDataType; @@ -57,7 +58,7 @@ public class RaxenPlayer { PersistentDataContainer data = player.getPersistentDataContainer(); String store = data.get(namespacedKey.storage, PersistentDataType.STRING); org.bukkit.inventory.Inventory ec = Bukkit.createInventory(null, 54, Component.text("Ender Chest")); - ec = setItemsToInventory(Items.listItemStackDeserialize(store), ec); + ec = setItemsToInventory(Items.mapItemStackDeserialize(store), ec); EnderChest ecc = new EnderChest(ec); Storage storage = new Storage(ecc); return storage; @@ -67,7 +68,8 @@ public class RaxenPlayer { PersistentDataContainer data = player.getPersistentDataContainer(); String inv = data.get(namespacedKey.inventory, PersistentDataType.STRING); org.bukkit.inventory.Inventory invv = Bukkit.createInventory(player, InventoryType.PLAYER); - invv = setItemsToInventory(Items.listItemStackDeserialize(inv), invv); + PlayerInventory invvvvv = (PlayerInventory) Bukkit.createInventory(null, InventoryType.PLAYER); + invv = setItemsToInventory(Items.listItemStackDeserialize(inv), invvvvv); Inventory invvv = new Inventory(invv); Inventories invvvv = new Inventories(invvv); return invvvv; diff --git a/src/main/java/gq/unurled/raxen/components/gui/MainGui.java b/src/main/java/gq/unurled/raxen/components/gui/MainGui.java new file mode 100644 index 0000000..b5a3dce --- /dev/null +++ b/src/main/java/gq/unurled/raxen/components/gui/MainGui.java @@ -0,0 +1,71 @@ +package gq.unurled.raxen.components.gui; + +import gq.unurled.raxen.utils.Items; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.SkullMeta; + +import java.util.HashMap; + +import static gq.unurled.raxen.utils.Utils.colorComp; +import static gq.unurled.raxen.utils.Utils.fillGreyPane; + +public class MainGui { + + public static Inventory build(Player p) { + Inventory inv = Bukkit.createInventory(null, 54, colorComp("Raxen")); + String gui = "0,7,0,0,0,8,9,0,10," + + "0,0,0,0,0,0,0,0,0," + + "0,0,0,0,0,0,0,0,0," + + "0,2,3,0,0,0,0,4,0," + + "0,0,0,0,1,0,0,0,0," + + "0,0,0,0,0,0,0,0,0"; + // 1 player Head + ItemStack head = new ItemStack(Material.PLAYER_HEAD); + SkullMeta headm = (SkullMeta) head.getItemMeta(); + headm.setOwningPlayer(p.getPlayer()); + headm.displayName(colorComp("")); + // 2 bank + ItemStack bank = new ItemStack(Material.GOLD_INGOT); + // 3 ah + ItemStack ah = new ItemStack(Material.GOLD_INGOT); + // 4 skill tree + ItemStack sk_tree = new ItemStack(Material.OAK_SAPLING); + // 7 teleport + ItemStack tp = new ItemStack(Material.ENDER_PEARL); + // 8 select character + ItemStack sel_char = new ItemStack(Material.SNOWBALL); + // 9 Settings + ItemStack sett = new ItemStack(Material.MAGMA_CREAM); + // 10 barrier block close + + HashMap list = new HashMap<>(); + list.put("1", head); + list.put("2", bank); + list.put("3",ah); + list.put("4", sk_tree); + list.put("7", tp); + list.put("8", sel_char); + list.put("9", sett); + list.put("10", Items.closeItem()); + Inventory inventory = stringToGui(inv, gui,list); + inventory = fillGreyPane(inventory); + return inventory; + } + + public static Inventory stringToGui(Inventory inv, String stt, HashMap it) { + String[] s = stt.split(","); + if (s.length != inv.getContents().length) { + return inv; + } + Integer i = 0; + for (String st : s) { + inv.setItem(i, it.get(st)); + i++; + } + return inv; + } +} diff --git a/src/main/java/gq/unurled/raxen/components/items/custom/Item.java b/src/main/java/gq/unurled/raxen/components/items/custom/Item.java new file mode 100644 index 0000000..ae53585 --- /dev/null +++ b/src/main/java/gq/unurled/raxen/components/items/custom/Item.java @@ -0,0 +1,11 @@ +package gq.unurled.raxen.components.items.custom; + +import gq.unurled.raxen.Raxen; + +public interface Item { + + public void buildItem(); + + public void registerItem(Raxen main); + +} diff --git a/src/main/java/gq/unurled/raxen/components/items/custom/List.java b/src/main/java/gq/unurled/raxen/components/items/custom/List.java new file mode 100644 index 0000000..17f55a5 --- /dev/null +++ b/src/main/java/gq/unurled/raxen/components/items/custom/List.java @@ -0,0 +1,26 @@ +package gq.unurled.raxen.components.items.custom; + +import gq.unurled.raxen.Raxen; +import gq.unurled.raxen.components.items.custom.weapon.Dager; +import lombok.Getter; + +import java.util.ArrayList; + +public class List { + + private static Raxen main; + + @Getter + private java.util.List items; + + public List(Raxen main) { + this.main = main; + this.items = new ArrayList<>(); + + } + + public void build() { + // weapons + items.add(new Dager()); + } +} diff --git a/src/main/java/gq/unurled/raxen/components/items/custom/weapon/Dager.java b/src/main/java/gq/unurled/raxen/components/items/custom/weapon/Dager.java index d67b344..39e7e51 100644 --- a/src/main/java/gq/unurled/raxen/components/items/custom/weapon/Dager.java +++ b/src/main/java/gq/unurled/raxen/components/items/custom/weapon/Dager.java @@ -2,6 +2,7 @@ package gq.unurled.raxen.components.items.custom.weapon; import de.tr7zw.nbtapi.NBTItem; import gq.unurled.raxen.Raxen; +import gq.unurled.raxen.components.items.custom.Item; import lombok.Getter; import net.kyori.adventure.text.Component; import org.bukkit.Material; @@ -16,10 +17,7 @@ import java.util.List; import static gq.unurled.raxen.components.items.NBT.*; import static gq.unurled.raxen.utils.Utils.colorTextComp; -public class Dager { - - private Raxen main; - +public class Dager implements Item { @Getter ItemStack dager; @@ -46,8 +44,8 @@ public class Dager { /** * need Raxen main to be set before calling this method. */ - public void register() { + @Override + public void registerItem(Raxen main) { main.getManager().getItemManager().registerItem(dager); } - } diff --git a/src/main/java/gq/unurled/raxen/config/PlayerConfig.java b/src/main/java/gq/unurled/raxen/config/PlayerConfig.java index 8360a73..40f1d5d 100644 --- a/src/main/java/gq/unurled/raxen/config/PlayerConfig.java +++ b/src/main/java/gq/unurled/raxen/config/PlayerConfig.java @@ -31,8 +31,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; -import static gq.unurled.raxen.utils.Items.listItemStackDeserialize; -import static gq.unurled.raxen.utils.Items.setItemsToInventory; +import static gq.unurled.raxen.utils.Items.*; import static gq.unurled.raxen.utils.Utils.debug; public class PlayerConfig { @@ -167,7 +166,7 @@ public class PlayerConfig { Inventory ec = Bukkit.createInventory(null, 54, Component.text("Ender Chest")); if(playerDoc.getString("ec") != null) { debug(main, "Loading " + player.getName() + "'s storage."); - ec = setItemsToInventory(listItemStackDeserialize(playerDoc.getString("ec")), ec); + ec = setItemsToInventory(mapItemStackDeserialize(playerDoc.getString("ec")), ec); } playerManager.getRaxenPlayer(player).setStorage(ec); PlayerInventory inv = player.getInventory(); @@ -195,12 +194,12 @@ public class PlayerConfig { config.getInt("luck"), config.getInt("itemLuck")); Inventory ec = Bukkit.createInventory(null, 54, Component.text("Ender Chest")); if((String) config.get("ec") != null) { - ec = setItemsToInventory(listItemStackDeserialize((String) config.get("ec")), ec); + ec = setItemsToInventory(mapItemStackDeserialize((String) config.get("ec")), ec); } EnderChest ecc = new EnderChest(ec); Storage storage = new Storage(ecc); playerManager.getRaxenPlayer(player).setStorage(ec); - Inventory inv = Bukkit.createInventory(player, InventoryType.PLAYER); + PlayerInventory inv = (PlayerInventory) Bukkit.createInventory(player, InventoryType.PLAYER); inv = setItemsToInventory(listItemStackDeserialize((String) config.getString("inv")), inv); player.getInventory().setContents(inv.getContents()); player.updateInventory(); @@ -215,7 +214,8 @@ public class PlayerConfig { */ public void savePlayerConfig(@NotNull Player player) { Attributes attributes = new Attributes(main); - Inventory inv = player.getInventory(); + PlayerInventory inv = player.getInventory(); + List listInv = new ArrayList(); Integer reverse = 0; for(ItemStack it : inv) { @@ -225,10 +225,7 @@ public class PlayerConfig { listInv.add(s); } } - String invstr= ""; - if (listInv.size() > 0) { - invstr = Items.listItemStackSerialize(listInv); - } + String invstr= Items.itemStackSer(inv); debug(main, "saving..."); String storage = sto.getConfig().getString("storage"); Integer finalReverse = reverse; diff --git a/src/main/java/gq/unurled/raxen/manager/entity/ItemManager.java b/src/main/java/gq/unurled/raxen/manager/entity/ItemManager.java index 156c94e..e74632e 100644 --- a/src/main/java/gq/unurled/raxen/manager/entity/ItemManager.java +++ b/src/main/java/gq/unurled/raxen/manager/entity/ItemManager.java @@ -3,6 +3,7 @@ package gq.unurled.raxen.manager.entity; import de.tr7zw.nbtapi.NBTItem; import gq.unurled.raxen.Raxen; import gq.unurled.raxen.components.items.NBT; +import gq.unurled.raxen.components.items.custom.Item; import gq.unurled.raxen.utils.Utils; import lombok.Getter; import net.kyori.adventure.text.Component; @@ -34,6 +35,17 @@ public class ItemManager { public ItemManager(Raxen main) { this.main = main; // register(); + registerItem(); + } + + /** + * register manually all item in Raxen + */ + private void registerItem() { + gq.unurled.raxen.components.items.custom.List lisst = new gq.unurled.raxen.components.items.custom.List(main); + for (Item items : lisst.getItems()) { + items.registerItem(main); + } } /** diff --git a/src/main/java/gq/unurled/raxen/manager/server/CommandManager.java b/src/main/java/gq/unurled/raxen/manager/server/CommandManager.java index 61e0d24..42b0754 100644 --- a/src/main/java/gq/unurled/raxen/manager/server/CommandManager.java +++ b/src/main/java/gq/unurled/raxen/manager/server/CommandManager.java @@ -4,6 +4,7 @@ import gq.unurled.raxen.Raxen; import gq.unurled.raxen.commands.RaxenCommand; import gq.unurled.raxen.commands.admin.*; import gq.unurled.raxen.commands.player.ClassCommand; +import gq.unurled.raxen.commands.player.MainGuiCommand; import gq.unurled.raxen.commands.player.SkillsCommand; import gq.unurled.raxen.commands.player.StorageCommand; import lombok.Getter; @@ -23,6 +24,7 @@ public class CommandManager { private SpawnEntity entityspawn; private ClassCommand classCommand; private CustomModelDataCommand customModelDataCommand; + private MainGuiCommand mainGuiCommand; public CommandManager(Raxen main) { this.main = main; @@ -33,6 +35,7 @@ public class CommandManager { this.skillsCommand = new SkillsCommand(main); this.raxenCommand = new RaxenCommand(main); this.customModelDataCommand = new CustomModelDataCommand(); + this.mainGuiCommand = new MainGuiCommand(main); } /** @@ -70,7 +73,8 @@ public class CommandManager { main.getCommand("custommodeldata").setTabCompleter(customModelDataCommand); main.getCommand("custommodeldata").setExecutor(customModelDataCommand); - + main.getCommand("main_gui").setTabCompleter(mainGuiCommand); + main.getCommand("main_gui").setExecutor(mainGuiCommand); } } diff --git a/src/main/java/gq/unurled/raxen/utils/Items.java b/src/main/java/gq/unurled/raxen/utils/Items.java index 0db358b..08fa1c9 100644 --- a/src/main/java/gq/unurled/raxen/utils/Items.java +++ b/src/main/java/gq/unurled/raxen/utils/Items.java @@ -88,7 +88,11 @@ public class Items { * @return a barrier block itemstack named close */ public static @NotNull ItemStack closeItem () { - return createItem(Material.BARRIER, 1, false, false, colorString("CLOSE")); + ItemStack close = createItem(Material.BARRIER, 1, false, false, colorString("CLOSE")); + ItemMeta clo = close.getItemMeta(); + clo.setCustomModelData(1); + close.setItemMeta(clo); + return close; } /** @@ -112,12 +116,71 @@ public class Items { return str; } + /** + * Serelize the PlayerInventory + * @param inv a player inventory + * @return return a serelized string + */ + public static @NotNull String itemStackSer(PlayerInventory inv) { + List list = new ArrayList<>(); + Integer i = 0; + for (ItemStack it : inv.getContents()) { + String str = ""; + str = itemTo64(it); + if (it != null) { + if (isContained(it, inv.getArmorContents())) { + str = str + "@#SLOT#" + getWhichArmor(it.getType()); + } else { + i++; + str = str + "@#SLOT#" + (i - 1); + } + } + list.add(str); + } + return listItemStackSerialize(list); + } + + /** + * if item is in its + * @param item an Itemstack + * @param its an Itemstack[] + * @return return if item is in its + */ + public static boolean isContained(ItemStack item, ItemStack[] its) { + for (ItemStack it : its) { + if (it == item) { + return true; + } + } + return false; + } + + /** + * Get which armor the type is + * @param type a material type + * @return the armor type or null + */ + public static String getWhichArmor(Material type) { + String name = type.name(); + if (name.contains("HELMET") || name.contains("helmet")) { + return "HELMET"; + } else if (name.contains("CHESTPLATE") || name.contains("chestplate")) { + return "CHESTPLATE"; + } else if (name.contains("LEGGINGS") || name.contains("leggins")) { + return "LEGGINGS"; + } else if (name.contains("BOOTS") || name.contains("boots")) { + return "BOOTS"; + } + return null; + } + /** * a class that represent the itemstack deserialized. */ public static class itemStackDeserializeResult { int slot; ItemStack it; + String armor; /** * custructor @@ -128,6 +191,12 @@ public class Items { this.slot = slot; this.it = it; } + + public itemStackDeserializeResult(Integer slot, ItemStack it, String armor) { + this.slot = slot; + this.it = it; + this.armor = armor; + } } /** @@ -155,6 +224,7 @@ public class Items { Gson gson = new Gson(); ItemStack it = new ItemStack(Material.AIR); Integer slot = 0; + String armor = null; debug("full item " + str); for (String s : mapp) { if(s != null) { @@ -163,13 +233,22 @@ public class Items { } catch (Exception e) { if (!s.equals("")) { debug("slot " + s); - slot = Integer.valueOf(s); + try { + slot = Integer.parseInt(s); + } catch (NumberFormatException nfe) { + armor = s; + } } } } } - itemStackDeserializeResult itt = new itemStackDeserializeResult(slot, it); + itemStackDeserializeResult itt; + if (armor != null) { + itt = new itemStackDeserializeResult(slot, it, armor); + } else { + itt = new itemStackDeserializeResult(slot, it); + } return itt; } @@ -192,7 +271,7 @@ public class Items { * @param str a list of all serialized item * @return a list of itemstack with their slot */ - public static @NotNull HashMap listItemStackDeserialize(@NotNull String str) { + public static @NotNull HashMap mapItemStackDeserialize(@NotNull String str) { Gson gson = new Gson(); List map = Arrays.asList(str.split("@#NEW_ITEM#")); HashMap inv = new HashMap<>(); @@ -214,6 +293,30 @@ public class Items { return inv; } + /** + * deserialize item + * @param str a list of all serialized item + * @return a list of itemstack with their slot + */ + public static @NotNull List listItemStackDeserialize(@NotNull String str) { + Gson gson = new Gson(); + List map = Arrays.asList(str.split("@#NEW_ITEM#")); + List inv = new ArrayList<>(); + ArrayList items = new ArrayList(); + for(String s : map) { + ItemStack itt; + Integer slot; + if(s != null) { + itemStackDeserializeResult itm = itemStackDeserilize(s); + itt = itm.it; + if (itt != null && itt.getType() != Material.AIR) { + items.add(itt); + } + } + } + return inv; + } + /** * set all item in the list to their slot in inv * @param list a list of item with their slot @@ -227,6 +330,37 @@ public class Items { return inv; } + /** + * set all item in the list to their slot in inv + * @param list a list of item with their slot + * @param inv the destined inventory + * @return the inv + */ + public static PlayerInventory setItemsToInventory(@NotNull List list, PlayerInventory inv) { + Inventory invv = Bukkit.createInventory(null, 54); + for (itemStackDeserializeResult itm : list) { + if (itm.armor != null) { + setArmorItem(inv, itm.it); + } else { + inv.setItem(itm.slot, itm.it); + } + } + return inv; + } + + public static void setArmorItem(PlayerInventory inv, ItemStack item) { + String name = item.getType().name(); + if (name.contains("HELMET")) { + inv.setHelmet(item); + } else if (name.contains("CHESTPLATE")) { + inv.setChestplate(item); + } else if (name.contains("LEGGINGS")) { + inv.setLeggings(item); + } else if (name.contains("BOOTS")) { + inv.setBoots(item); + } + } + /** * set all item in the list to their slot in inv * @param list a list of item with their slot diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 7f1952f..114001b 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -36,6 +36,8 @@ commands: - cmdata - cmd description: set custom model data to item + main_gui: + description: not very much used, more with right click on device permissions: raxen.reload.cmd: @@ -53,4 +55,6 @@ permissions: raxen.class.cmd: description: class command permission raxen.custommodeldata.cmd: - description: custom model data command permission \ No newline at end of file + description: custom model data command permission + raxen.maingui.cmd: + description: main gui command permission \ No newline at end of file