Advertisement
JackOUT

Untitled

Oct 12th, 2021
1,203
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 8.85 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.List;
  20.  
  21. /**
  22.  * A sample command to open a menu we create in the course.
  23.  */
  24. public final class InvEditCommand extends CoreCommand {
  25.  
  26.     public InvEditCommand() {
  27.         super("invedit");
  28.  
  29.         setMinArguments(2);
  30.     }
  31.  
  32.     /**
  33.      * @see org.mineacademy.fo.command.SimpleCommand#onCommand()
  34.      */
  35.     @Override
  36.     protected void onCommand() {
  37.         checkConsole();
  38.  
  39.         final String param = args[0];
  40.         final String name = args[1];
  41.  
  42.         final OfflinePlayer targetOfflinePlayer = Bukkit.getOfflinePlayer(name);
  43.         final boolean isOnline = targetOfflinePlayer.isOnline();
  44.         final Player targetPlayer = targetOfflinePlayer.getPlayer();
  45.  
  46.         checkBoolean(targetOfflinePlayer.hasPlayedBefore(), "{1} has never played before nor is online.");
  47.  
  48.         if ("inv".equals(param)) {
  49.             if (isOnline)
  50.                 getPlayer().openInventory(targetPlayer.getInventory());
  51.             else
  52.                 openOfflineInventoryMenu(getPlayer(), targetOfflinePlayer);
  53.  
  54.         } else if ("enderchest".equals(param)) {
  55.             if (isOnline)
  56.                 getPlayer().openInventory(targetPlayer.getEnderChest());
  57.             else
  58.                 openOfflineEnderChestMenu(getPlayer(), targetOfflinePlayer);
  59.  
  60.         } else if ("armour".equals(param)) {
  61.             if (isOnline)
  62.                 ArmorMenu.showTo(getPlayer(), targetPlayer);
  63.             else
  64.                 openOfflineArmourMenu(getPlayer(), targetOfflinePlayer);
  65.         }
  66.  
  67.         // level 1 > beginners...
  68.         // level 2 >
  69.     }
  70.  
  71.     private static class OfflineInvMenu extends Menu {
  72.  
  73.         /**
  74.          * The way we open this menu. It can be opened to select kits or edit them
  75.          */
  76.         private final ViewMode viewMode;
  77.  
  78.         private final NBTFile nbtFile;
  79.  
  80.         private NBTCompoundList nbtInventory;
  81.         private NBTCompoundList nbtEnderItems;
  82.         private NBTCompoundList nbtArmour;
  83.  
  84.         private final ItemStack[] content;
  85.  
  86.         @SneakyThrows
  87.         private OfflineInvMenu(final OfflinePlayer target, final ViewMode viewMode) {
  88.             this.viewMode = viewMode;
  89.  
  90.             setSize(PlayerUtil.USABLE_PLAYER_INV_SIZE);
  91.  
  92.             this.nbtFile = new NBTFile(new File(Bukkit.getWorldContainer(), "world/playerdata/" + target.getUniqueId() + ".dat"));
  93.  
  94.             if (viewMode == ViewMode.INVENTORY) {
  95.                 setTitle("&4" + target.getName() + "'s offline inventory");
  96.  
  97.                 this.nbtInventory = this.nbtFile.getCompoundList("Inventory");
  98.             }
  99.  
  100.             if (viewMode == ViewMode.ENDER_CHEST) {
  101.                 setTitle("&5" + target.getName() + "'s offline ender chest");
  102.  
  103.                 this.nbtEnderItems = this.nbtFile.getCompoundList("EnderItems");
  104.             }
  105.  
  106.             if (viewMode == ViewMode.ARMOUR) {
  107.                 setTitle("&9" + target.getName() + "'s offline armour contents");
  108.  
  109.                 this.nbtArmour = this.nbtFile.getCompoundList("Inventory");
  110.             }
  111.  
  112.             // this.nbtFile = new NBTFile(new File(Bukkit.getWorldContainer(), "world/playerdata/" + target.getUniqueId() + ".dat"));
  113.  
  114.             System.out.println(nbtFile);
  115.  
  116.             //this.nbtInventory = this.nbtFile.getCompoundList("Inventory");
  117.             this.content = this.readData(target);
  118.         }
  119.  
  120.         private ItemStack[] readData(final OfflinePlayer player) {
  121.             final ItemStack[] content = new ItemStack[PlayerUtil.USABLE_PLAYER_INV_SIZE];
  122.             final ItemStack[] armorContent = new ItemStack[104];
  123.  
  124.             if (viewMode == ViewMode.INVENTORY) {
  125.                 for (final NBTListCompound item : this.nbtInventory) {
  126.                     final int slot = item.getByte("Slot");
  127.  
  128.                     if (slot >= 0 && slot <= PlayerUtil.USABLE_PLAYER_INV_SIZE)
  129.                         content[slot] = NBTItem.convertNBTtoItem(item);
  130.                 }
  131.             }
  132.  
  133.             if (viewMode == ViewMode.ENDER_CHEST) {
  134.                 for (final NBTListCompound item : this.nbtEnderItems) {
  135.                     final int slot = item.getByte("Slot");
  136.  
  137.                     if (slot >= 0 && slot <= PlayerUtil.USABLE_PLAYER_INV_SIZE)
  138.                         content[slot] = NBTItem.convertNBTtoItem(item);
  139.                 }
  140.             }
  141.  
  142.             if (viewMode == ViewMode.ARMOUR) {
  143.                 for (final NBTListCompound item : this.nbtArmour) {
  144.                     final int slot = item.getByte("Slot");
  145.  
  146.                     if (slot >= 100 && slot <= 103) {
  147.                         armorContent[slot] = NBTItem.convertNBTtoItem(item);
  148.                     }
  149.                 }
  150.             }
  151.  
  152.             if (viewMode != ViewMode.ARMOUR)
  153.                 return content;
  154.             else
  155.                 return armorContent;
  156.         }
  157.  
  158.         @Override
  159.         public ItemStack getItemAt(final int slot) {
  160.             return this.content[slot];
  161.         }
  162.  
  163.         @Override
  164.         protected boolean isActionAllowed(final MenuClickLocation location, final int slot, final ItemStack clicked, final ItemStack cursor) {
  165.             return true;
  166.         }
  167.  
  168.         @Override
  169.         @SneakyThrows
  170.         protected void onMenuClose(final Player player, final Inventory inventory) {
  171.             final ItemStack[] editedContent = inventory.getContents();
  172.  
  173.             if (viewMode == ViewMode.INVENTORY)
  174.                 this.nbtInventory.clear();
  175.             if (viewMode == ViewMode.ENDER_CHEST)
  176.                 this.nbtEnderItems.clear();
  177.             if (viewMode == ViewMode.ARMOUR)
  178.                 this.nbtArmour.clear();
  179.  
  180.             for (int slot = 0; slot < editedContent.length; slot++) {
  181.                 final ItemStack item = editedContent[slot];
  182.  
  183.                 if (item != null) {
  184.                     final NBTContainer container = NBTItem.convertItemtoNBT(item);
  185.                     container.setByte("Slot", (byte) slot);
  186.  
  187.                     if (viewMode == ViewMode.INVENTORY)
  188.                         this.nbtInventory.addCompound(container); // arraylist#add
  189.  
  190.                     if (viewMode == ViewMode.ENDER_CHEST)
  191.                         this.nbtEnderItems.addCompound(container); // arraylist#add
  192.  
  193.                     if (viewMode == ViewMode.ARMOUR)
  194.                         this.nbtArmour.addCompound(container); // arraylist#add
  195.                 }
  196.             }
  197.  
  198.             this.nbtFile.save();
  199.         }
  200.     }
  201.  
  202.     /**
  203.      * The menu view mode
  204.      */
  205.     @RequiredArgsConstructor
  206.     public enum ViewMode {
  207.  
  208.         INVENTORY,
  209.  
  210.         ENDER_CHEST,
  211.  
  212.         ARMOUR
  213.     }
  214.  
  215.     /**
  216.      * Open the menu that allows you to edit the target player's inventory
  217.      */
  218.     public static void openOfflineInventoryMenu(final Player viewer, final OfflinePlayer target) {
  219.         new OfflineInvMenu(target, ViewMode.INVENTORY).displayTo(viewer);
  220.     }
  221.  
  222.     /**
  223.      * Open the menu that allows you to edit the target player's ender chest
  224.      */
  225.     public static void openOfflineEnderChestMenu(final Player viewer, final OfflinePlayer target) {
  226.         new OfflineInvMenu(target, ViewMode.ENDER_CHEST).displayTo(viewer);
  227.     }
  228.  
  229.     /**
  230.      * Open the menu that allows you to edit the target player's armour contents
  231.      */
  232.     public static void openOfflineArmourMenu(final Player viewer, final OfflinePlayer target) {
  233.         new OfflineInvMenu(target, ViewMode.ARMOUR).displayTo(viewer);
  234.     }
  235.  
  236.     private static class ArmorMenu extends Menu {
  237.  
  238.         // ONE ROW - 9 slot
  239.         // HELMET 0, CHESTPLATE 1, LEGGINGS 2, BOOTS 3, EMPTY SLOT 4, EMPTY SLOT 5, EMPTY 6, EMPTY 7, OFFHAND 8
  240.  
  241.         private final Player targetPlayer;
  242.  
  243.         private final static ItemStack EMPTY_SLOT_FILLER = ItemCreator
  244.                 .of(CompMaterial.GRAY_STAINED_GLASS_PANE, "")
  245.                 .build().make();
  246.  
  247.         private ArmorMenu(final Player targetPlayer) {
  248.             setTitle(targetPlayer.getName() + "'s armor");
  249.             setSize(9);
  250.             //setSlotNumbersVisible();
  251.  
  252.             this.targetPlayer = targetPlayer;
  253.         }
  254.  
  255.         @Override
  256.         public ItemStack getItemAt(final int slot) {
  257.             final PlayerInventory inv = this.targetPlayer.getInventory();
  258.  
  259.             if (slot == 0)
  260.                 return inv.getHelmet();
  261.  
  262.             else if (slot == 1)
  263.                 return inv.getChestplate();
  264.  
  265.             else if (slot == 2)
  266.                 return inv.getLeggings();
  267.  
  268.             else if (slot == 3)
  269.                 return inv.getBoots();
  270.  
  271.             else if (slot == this.getSize() - 1)
  272.                 return inv.getItemInOffHand();
  273.  
  274.             return NO_ITEM;
  275.         }
  276.  
  277.         @Override
  278.         protected boolean isActionAllowed(final MenuClickLocation location, final int slot, final ItemStack clicked, final ItemStack cursor) {
  279.  
  280.             if (location == MenuClickLocation.MENU && (slot == 4 || slot == 5 || slot == 6 || slot == 7))
  281.                 return false;
  282.  
  283.             return true;
  284.         }
  285.  
  286.         @Override
  287.         protected void onMenuClose(final Player player, final Inventory inventory) {
  288.             final PlayerInventory targetPlayerInv = this.targetPlayer.getInventory();
  289.  
  290.             targetPlayerInv.setItemInOffHand(inventory.getItem(this.getSize() - 1));
  291.  
  292.             targetPlayerInv.setHelmet(inventory.getItem(0));
  293.             targetPlayerInv.setChestplate(inventory.getItem(1));
  294.             targetPlayerInv.setLeggings(inventory.getItem(2));
  295.             targetPlayerInv.setBoots(inventory.getItem(3));
  296.         }
  297.  
  298.         private static void showTo(final Player viewer, final Player targetPlayer) {
  299.             new ArmorMenu(targetPlayer).displayTo(viewer);
  300.         }
  301.  
  302.     }
  303.  
  304.     @Override
  305.     protected List<String> tabComplete() {
  306.  
  307.         if (args.length == 1)
  308.             return this.completeLastWord("inv", "enderchest", "armour");
  309.  
  310.         else if (args.length == 2)
  311.             return this.completeLastWordPlayerNames();
  312.  
  313.         return NO_COMPLETE;
  314.     }
  315. }
  316.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement