JackOUT

Untitled

Jan 7th, 2022
1,397
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 12.44 KB | None | 0 0
  1. package games.coob.core.command;
  2.  
  3. import lombok.RequiredArgsConstructor;
  4. import lombok.SneakyThrows;
  5. import org.bukkit.Bukkit;
  6. import org.bukkit.OfflinePlayer;
  7. import org.bukkit.entity.Player;
  8. import org.bukkit.inventory.Inventory;
  9. import org.bukkit.inventory.ItemStack;
  10. import org.bukkit.inventory.PlayerInventory;
  11. import org.mineacademy.fo.PlayerUtil;
  12. import org.mineacademy.fo.menu.Menu;
  13. import org.mineacademy.fo.menu.model.ItemCreator;
  14. import org.mineacademy.fo.menu.model.MenuClickLocation;
  15. import org.mineacademy.fo.remain.CompMaterial;
  16. import org.mineacademy.fo.remain.nbt.*;
  17.  
  18. import java.io.File;
  19. import java.util.HashMap;
  20. import java.util.List;
  21. import java.util.Map;
  22.  
  23. /**
  24.  * A sample command to open a menu we create in the course.
  25.  */
  26. public final class InvEditCommand extends CoreCommand {
  27.  
  28.     public InvEditCommand() {
  29.         super("invedit");
  30.  
  31.         setMinArguments(2);
  32.     }
  33.  
  34.     /**
  35.      * @see org.mineacademy.fo.command.SimpleCommand#onCommand()
  36.      */
  37.     @Override
  38.     protected void onCommand() {
  39.         checkConsole();
  40.  
  41.         final String param = args[0];
  42.         final String name = args[1];
  43.  
  44.         final OfflinePlayer targetOfflinePlayer = Bukkit.getOfflinePlayer(name);
  45.         final boolean isOnline = targetOfflinePlayer.isOnline();
  46.         final Player targetPlayer = targetOfflinePlayer.getPlayer();
  47.  
  48.         checkBoolean(targetOfflinePlayer.hasPlayedBefore(), "{1} has never played before nor is online.");
  49.  
  50.         if ("inv".equals(param)) {
  51.             if (isOnline)
  52.                 getPlayer().openInventory(targetPlayer.getInventory());
  53.             else
  54.                 openOfflineInventoryMenu(getPlayer(), targetOfflinePlayer);
  55.  
  56.         } else if ("enderchest".equals(param)) {
  57.             if (isOnline)
  58.                 getPlayer().openInventory(targetPlayer.getEnderChest());
  59.             else
  60.                 openOfflineEnderChestMenu(getPlayer(), targetOfflinePlayer);
  61.  
  62.         } else if ("armour".equals(param)) {
  63.             if (isOnline)
  64.                 ArmorMenu.showTo(getPlayer(), targetPlayer);
  65.             else
  66.                 openOfflineArmourMenu(getPlayer(), targetOfflinePlayer);
  67.         }
  68.  
  69.         // level 1 > beginners...
  70.         // level 2 >
  71.     }
  72.  
  73.     private static class OfflineInvMenu extends Menu {
  74.  
  75.         /**
  76.          * The way we open this menu. It can be opened to select kits or edit them
  77.          */
  78.         private final ViewMode viewMode;
  79.  
  80.         private final NBTFile nbtFile;
  81.  
  82.         private NBTCompoundList nbtInventory;
  83.         private NBTCompoundList nbtEnderItems;
  84.         private NBTCompoundList nbtArmour;
  85.  
  86.         private ItemStack[] content;
  87.         private Map<String, ItemStack> armourContent;
  88.  
  89.         @SneakyThrows
  90.         private OfflineInvMenu(final OfflinePlayer target, final ViewMode viewMode) {
  91.             this.viewMode = viewMode;
  92.  
  93.             this.nbtFile = new NBTFile(new File(Bukkit.getWorldContainer(), "world/playerdata/" + target.getUniqueId() + ".dat"));
  94.  
  95.             if (viewMode == ViewMode.INVENTORY) {
  96.                 setSize(PlayerUtil.USABLE_PLAYER_INV_SIZE);
  97.                 setTitle("&4" + target.getName() + "'s offline inventory");
  98.  
  99.                 this.nbtInventory = this.nbtFile.getCompoundList("Inventory");
  100.             } else if (viewMode == ViewMode.ENDER_CHEST) {
  101.                 setSize(PlayerUtil.USABLE_PLAYER_INV_SIZE);
  102.                 setTitle("&5" + target.getName() + "'s offline ender chest");
  103.  
  104.                 this.nbtEnderItems = this.nbtFile.getCompoundList("EnderItems");
  105.             } else if (viewMode == ViewMode.ARMOUR) {
  106.                 setSize(9);
  107.                 setTitle("&9" + target.getName() + "'s offline armour");
  108.  
  109.                 this.nbtArmour = this.nbtFile.getCompoundList("Inventory");
  110.                 this.armourContent = this.readArmourData(target);
  111.             }
  112.  
  113.             // this.nbtFile = new NBTFile(new File(Bukkit.getWorldContainer(), "world/playerdata/" + target.getUniqueId() + ".dat"));
  114.  
  115.             System.out.println(nbtFile);
  116.  
  117.             //this.nbtInventory = this.nbtFile.getCompoundList("Inventory");
  118.             if (viewMode != ViewMode.ARMOUR)
  119.                 this.content = this.readData(target);
  120.         }
  121.  
  122.         private ItemStack[] readData(final OfflinePlayer player) {
  123.             final ItemStack[] content = new ItemStack[PlayerUtil.USABLE_PLAYER_INV_SIZE];
  124.  
  125.             if (viewMode == ViewMode.INVENTORY) {
  126.                 for (final NBTListCompound item : this.nbtInventory) {
  127.                     final int slot = item.getByte("Slot");
  128.  
  129.                     if (slot >= 0 && slot <= PlayerUtil.USABLE_PLAYER_INV_SIZE)
  130.                         content[slot] = NBTItem.convertNBTtoItem(item);
  131.                 }
  132.             }
  133.  
  134.             if (viewMode == ViewMode.ENDER_CHEST) {
  135.                 for (final NBTListCompound item : this.nbtEnderItems) {
  136.                     final int slot = item.getByte("Slot");
  137.  
  138.                     if (slot >= 0 && slot <= PlayerUtil.USABLE_PLAYER_INV_SIZE)
  139.                         content[slot] = NBTItem.convertNBTtoItem(item);
  140.                 }
  141.             }
  142.  
  143.             return content;
  144.         }
  145.  
  146.         private Map<String, ItemStack> readArmourData(final OfflinePlayer player) {
  147.             final Map<String, ItemStack> armourContent = new HashMap<>();
  148.  
  149.             for (final NBTListCompound item : this.nbtArmour) {
  150.                 final int slot = item.getByte("Slot");
  151.  
  152.                 if (slot == 103)
  153.                     armourContent.put("Helmet", NBTItem.convertNBTtoItem(item));
  154.                 if (slot == 102)
  155.                     armourContent.put("Chestplate", NBTItem.convertNBTtoItem(item));
  156.                 if (slot == 101)
  157.                     armourContent.put("Leggings", NBTItem.convertNBTtoItem(item));
  158.                 if (slot == 100)
  159.                     armourContent.put("Boots", NBTItem.convertNBTtoItem(item));
  160.             }
  161.  
  162.             return armourContent;
  163.         }
  164.  
  165.         @Override
  166.         public ItemStack getItemAt(final int slot) {
  167.             if (viewMode != ViewMode.ARMOUR)
  168.                 return this.content[slot];
  169.             else
  170.                 for (final Map.Entry<String, ItemStack> entry : armourContent.entrySet()) {
  171.                     if (slot == 0 && entry.getKey().equals("Helmet"))
  172.                         return entry.getValue();
  173.  
  174.                     if (slot == 1 && entry.getKey().equals("Chestplate"))
  175.                         return entry.getValue();
  176.  
  177.                     if (slot == 2 && entry.getKey().equals("Leggings"))
  178.                         return entry.getValue();
  179.  
  180.                     if (slot == 3 && entry.getKey().equals("Boots"))
  181.                         return entry.getValue();
  182.                 }
  183.  
  184.             return null;
  185.         }
  186.  
  187.         @Override
  188.         protected boolean isActionAllowed(final MenuClickLocation location, final int slot, final ItemStack clicked, final ItemStack cursor) {
  189.             return true;
  190.         }
  191.  
  192.         @Override
  193.         protected void onMenuClick(final Player player, final int slot, final ItemStack clicked) {
  194.             final Inventory inventory = getViewer().getOpenInventory().getBottomInventory();
  195.  
  196.             if (clicked != null) {
  197.                 if (clicked.getType().name().endsWith("HELMET")) {
  198.                     if (armourContent.containsKey("Helmet")) {
  199.                         getInventory().remove(clicked);
  200.                         inventory.addItem(clicked);
  201.                         armourContent.remove("Helmet");
  202.                     } else {
  203.                         getInventory().addItem(clicked);
  204.                         armourContent.put("Helmet", clicked);
  205.                     }
  206.  
  207.                 } else if (clicked.getType().name().endsWith("CHESTPLATE")) {
  208.                     if (armourContent.containsKey("Chestplate")) {
  209.                         getInventory().remove(clicked);
  210.                         inventory.addItem(clicked);
  211.                         armourContent.remove("Chestplate");
  212.                     } else {
  213.                         getInventory().addItem(clicked);
  214.                         armourContent.put("Chestplate", clicked);
  215.                     }
  216.  
  217.                 } else if (clicked.getType().name().endsWith("LEGGINGS")) {
  218.                     if (armourContent.containsKey("Leggings")) {
  219.                         getInventory().remove(clicked);
  220.                         inventory.addItem(clicked);
  221.                         armourContent.remove("Leggings");
  222.                     } else {
  223.                         getInventory().addItem(clicked);
  224.                         armourContent.put("Leggings", clicked);
  225.                     }
  226.  
  227.                 } else if (clicked.getType().name().endsWith("BOOTS")) {
  228.                     if (armourContent.containsKey("Boots")) {
  229.                         getInventory().remove(clicked);
  230.                         inventory.addItem(clicked);
  231.                         armourContent.remove("Boots");
  232.                     } else {
  233.                         getInventory().addItem(clicked);
  234.                         armourContent.put("Boots", clicked);
  235.                     }
  236.                 }
  237.             }
  238.         }
  239.  
  240.         @Override
  241.         @SneakyThrows
  242.         protected void onMenuClose(final Player player, final Inventory inventory) {
  243.             final ItemStack[] editedContent = inventory.getContents();
  244.  
  245.             if (viewMode == ViewMode.INVENTORY)
  246.                 this.nbtInventory.clear();
  247.             if (viewMode == ViewMode.ENDER_CHEST)
  248.                 this.nbtEnderItems.clear();
  249.  
  250.             if (viewMode != ViewMode.ARMOUR) {
  251.                 for (int slot = 0; slot < editedContent.length; slot++) {
  252.                     final ItemStack item = editedContent[slot];
  253.  
  254.                     if (item != null) {
  255.                         final NBTContainer container = NBTItem.convertItemtoNBT(item);
  256.                         container.setByte("Slot", (byte) slot);
  257.  
  258.                         if (viewMode == ViewMode.INVENTORY)
  259.                             this.nbtInventory.addCompound(container); // arraylist#add
  260.  
  261.                         if (viewMode == ViewMode.ENDER_CHEST)
  262.                             this.nbtEnderItems.addCompound(container);
  263.                     }
  264.                 }
  265.  
  266.             } else {
  267.                 this.nbtArmour.clear();
  268.  
  269.                 for (int slot = 0; slot <= 8; slot++) {
  270.                     final ItemStack item = editedContent[slot];
  271.  
  272.                     if (item != null) {
  273.                         if (item.getType().name().endsWith("HELMET"))
  274.                             armourContent.put("Helmet", item);
  275.  
  276.                         else if (item.getType().name().endsWith("CHESTPLATE"))
  277.                             armourContent.put("Chestplate", item);
  278.  
  279.                         else if (item.getType().name().endsWith("LEGGINGS"))
  280.                             armourContent.put("Leggings", item);
  281.  
  282.                         else if (item.getType().name().endsWith("BOOTS"))
  283.                             armourContent.put("Boots", item);
  284.                     }
  285.                 }
  286.  
  287.                 for (final Map.Entry<String, ItemStack> entry : armourContent.entrySet()) {
  288.                     final ItemStack itemArmor = entry.getValue();
  289.  
  290.                     if (itemArmor != null) {
  291.                         final NBTContainer containerArmor = NBTItem.convertItemtoNBT(itemArmor);
  292.  
  293.                         switch (entry.getKey()) {
  294.                             case "Helmet" -> containerArmor.setByte("Slot", (byte) 103);
  295.                             case "Chestplate" -> containerArmor.setByte("Slot", (byte) 102);
  296.                             case "Leggings" -> containerArmor.setByte("Slot", (byte) 101);
  297.                             case "Boots" -> containerArmor.setByte("Slot", (byte) 100);
  298.                         }
  299.  
  300.                         this.nbtArmour.addCompound(containerArmor);
  301.                     }
  302.                 }
  303.             }
  304.  
  305.             this.nbtFile.save();
  306.         }
  307.     }
  308.  
  309.     /**
  310.      * The menu view mode
  311.      */
  312.     @RequiredArgsConstructor
  313.     public enum ViewMode {
  314.  
  315.         INVENTORY,
  316.  
  317.         ENDER_CHEST,
  318.  
  319.         ARMOUR
  320.     }
  321.  
  322.     /**
  323.      * Open the menu that allows you to edit the target player's inventory
  324.      */
  325.     public static void openOfflineInventoryMenu(final Player viewer, final OfflinePlayer target) {
  326.         new OfflineInvMenu(target, ViewMode.INVENTORY).displayTo(viewer);
  327.     }
  328.  
  329.     /**
  330.      * Open the menu that allows you to edit the target player's ender chest
  331.      */
  332.     public static void openOfflineEnderChestMenu(final Player viewer, final OfflinePlayer target) {
  333.         new OfflineInvMenu(target, ViewMode.ENDER_CHEST).displayTo(viewer);
  334.     }
  335.  
  336.     /**
  337.      * Open the menu that allows you to edit the target player's armour contents
  338.      */
  339.     public static void openOfflineArmourMenu(final Player viewer, final OfflinePlayer target) {
  340.         new OfflineInvMenu(target, ViewMode.ARMOUR).displayTo(viewer);
  341.     }
  342.  
  343.     private static class ArmorMenu extends Menu {
  344.  
  345.         // ONE ROW - 9 slot
  346.         // HELMET 0, CHESTPLATE 1, LEGGINGS 2, BOOTS 3, EMPTY SLOT 4, EMPTY SLOT 5, EMPTY 6, EMPTY 7, OFFHAND 8
  347.  
  348.         private final Player targetPlayer;
  349.  
  350.         private final static ItemStack EMPTY_SLOT_FILLER = ItemCreator
  351.                 .of(CompMaterial.GRAY_STAINED_GLASS_PANE, "")
  352.                 .build().make();
  353.  
  354.         private ArmorMenu(final Player targetPlayer) {
  355.             setTitle(targetPlayer.getName() + "'s armor");
  356.             setSize(9);
  357.             //setSlotNumbersVisible();
  358.  
  359.             this.targetPlayer = targetPlayer;
  360.         }
  361.  
  362.         @Override
  363.         public ItemStack getItemAt(final int slot) {
  364.             final PlayerInventory inv = this.targetPlayer.getInventory();
  365.  
  366.             if (slot == 0)
  367.                 return inv.getHelmet();
  368.  
  369.             else if (slot == 1)
  370.                 return inv.getChestplate();
  371.  
  372.             else if (slot == 2)
  373.                 return inv.getLeggings();
  374.  
  375.             else if (slot == 3)
  376.                 return inv.getBoots();
  377.  
  378.             else if (slot == this.getSize() - 1)
  379.                 return inv.getItemInOffHand();
  380.  
  381.             return NO_ITEM;
  382.         }
  383.  
  384.         @Override
  385.         protected boolean isActionAllowed(final MenuClickLocation location, final int slot, final ItemStack clicked, final ItemStack cursor) {
  386.             return location != MenuClickLocation.MENU || (slot != 4 && slot != 5 && slot != 6 && slot != 7);
  387.         }
  388.  
  389.         @Override
  390.         protected void onMenuClose(final Player player, final Inventory inventory) {
  391.             final PlayerInventory targetPlayerInv = this.targetPlayer.getInventory();
  392.  
  393.             targetPlayerInv.setItemInOffHand(inventory.getItem(this.getSize() - 1));
  394.  
  395.             targetPlayerInv.setHelmet(inventory.getItem(0));
  396.             targetPlayerInv.setChestplate(inventory.getItem(1));
  397.             targetPlayerInv.setLeggings(inventory.getItem(2));
  398.             targetPlayerInv.setBoots(inventory.getItem(3));
  399.         }
  400.  
  401.         private static void showTo(final Player viewer, final Player targetPlayer) {
  402.             new ArmorMenu(targetPlayer).displayTo(viewer);
  403.         }
  404.  
  405.     }
  406.  
  407.     @Override
  408.     protected List<String> tabComplete() {
  409.  
  410.         if (args.length == 1)
  411.             return this.completeLastWord("inv", "enderchest", "armour");
  412.  
  413.         else if (args.length == 2)
  414.             return this.completeLastWordPlayerNames();
  415.  
  416.         return NO_COMPLETE;
  417.     }
  418. }
  419.  
Advertisement
Add Comment
Please, Sign In to add comment