broken-arrow

Untitled

Nov 27th, 2021
155
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 12.81 KB | None | 0 0
  1. package org.brokenarrow.storage.menus.redone;
  2.  
  3. import com.google.common.base.Enums;
  4. import org.brokenarrow.storage.NMS.UpdateTittleContainers;
  5. import org.bukkit.Bukkit;
  6. import org.bukkit.Location;
  7. import org.bukkit.Material;
  8. import org.bukkit.Sound;
  9. import org.bukkit.entity.Player;
  10. import org.bukkit.event.inventory.ClickType;
  11. import org.bukkit.event.inventory.InventoryCloseEvent;
  12. import org.bukkit.event.inventory.InventoryType;
  13. import org.bukkit.inventory.Inventory;
  14. import org.bukkit.inventory.ItemStack;
  15. import org.bukkit.metadata.FixedMetadataValue;
  16. import org.bukkit.plugin.Plugin;
  17.  
  18. import java.lang.reflect.Field;
  19. import java.util.*;
  20. import java.util.logging.Level;
  21.  
  22. public abstract class MenuHolderTest {
  23.  
  24.  
  25.     /**
  26.      * Create menu instance.
  27.      *
  28.      * @param clazz         from with class you crated your menu.
  29.      * @param plugin        your main class.
  30.      * @param inventorySize size if menu.
  31.      */
  32.  
  33.     public MenuHolderTest(Class<?> clazz, Plugin plugin, int inventorySize) {
  34.         this.clazz = clazz;
  35.         this.inventorySize = inventorySize;
  36.         this.plugin = plugin;
  37.     }
  38.  
  39.     /**
  40.      * Create menu instance.
  41.      *
  42.      * @param clazz           from with class you crated your menu.
  43.      * @param plugin          your main class.
  44.      * @param inventorySize   size if menu.
  45.      * @param shallCacheItems if it shall cache items and slots in this class, other case use {@link #getMenuButtonsOwnCache()} ot cache it own class.
  46.      */
  47.     public MenuHolderTest(Class<?> clazz, Plugin plugin, int inventorySize, boolean shallCacheItems) {
  48.         this.clazz = clazz;
  49.         this.inventorySize = inventorySize;
  50.         this.itemsPerPage = inventorySize;
  51.         this.plugin = plugin;
  52.         this.shallCacheItems = shallCacheItems;
  53.     }
  54.  
  55.     private final MenuCache menuCache = MenuCache.getInstance();
  56.     private final List<MenuButton> buttons = new ArrayList<>();
  57.     private final Map<Integer, ItemStack> addedButtons = new HashMap<>();
  58.     private final Plugin plugin;
  59.     private final Class<?> clazz;
  60.     private Inventory[] inventories;
  61.     private boolean shallCacheItems;
  62.     private boolean slotsYouCanAddItems;
  63.     private boolean startLoadMenuButtons;
  64.     private boolean hasLoadMenuButtons;
  65.     private int slotIndex = 0;
  66.     private int requiredPages;
  67.     private int itemsPerPage = this.inventorySize;
  68.     private int inventorySize;
  69.     private int pageNumber;
  70.     private List<Integer> fillSpace;
  71.     private List<?> listOfFillItems;
  72.     private Player player;
  73.     private Sound menuOpenSound = Sound.BLOCK_NOTE_BLOCK_BASEDRUM;
  74.     private String title;
  75.     private String playermetadata;
  76.     private Object object;
  77.  
  78.     public ItemStack getItemAt(int slot) {
  79.         return null;
  80.     }
  81.  
  82.     public ItemStack getFillItemsAt(int slot) {
  83.         return null;
  84.     }
  85.  
  86.     public ItemStack getFillItemsAt() {
  87.         return null;
  88.     }
  89.  
  90.     public void setTitle(String title) {
  91.         this.title = title;
  92.     }
  93.  
  94.     public void setPageNumber(int pageNumber) {
  95.         this.pageNumber = pageNumber;
  96.     }
  97.  
  98.     public void setItemsPerPage(int itemsPerPage) {
  99.         if (itemsPerPage <= 0)
  100.             this.itemsPerPage = this.inventorySize;
  101.         this.itemsPerPage = itemsPerPage;
  102.     }
  103.  
  104.     public void setFillSpace(List<Integer> fillSpace) {
  105.         this.fillSpace = fillSpace;
  106.     }
  107.  
  108.     public void setMenuOpenSound(Sound sound) {
  109.         this.menuOpenSound = sound;
  110.     }
  111.  
  112.     public <T> void setListOfFillItems(List<T> listOfFillItems) {
  113.         this.listOfFillItems = listOfFillItems;
  114.     }
  115.  
  116.     /**
  117.      * set this to true if you whant players has option to add or remove items
  118.      *
  119.      * @param slotsYouCanAddItems true and it will give option to add and remove items on fill slots.
  120.      */
  121.  
  122.     public void setSlotsYouCanAddItems(boolean slotsYouCanAddItems) {
  123.         this.slotsYouCanAddItems = slotsYouCanAddItems;
  124.     }
  125.  
  126.     /**
  127.      * Set own data it shall check or it will use
  128.      * the clicked item. It are both use in
  129.      * {@link MenuButton#getItem(Object)} and {@link MenuButton#onClickInsideMenu(Player, Inventory, ClickType, ItemStack, Object)}
  130.      *
  131.      * @param object you want to compare against.
  132.      */
  133.  
  134.     public void setObject(Object object) {
  135.         this.object = object;
  136.     }
  137.  
  138.     /**
  139.      * get if it this option will give you option add or remove items.
  140.      *
  141.      * @return true will you have option add items.
  142.      */
  143.  
  144.     public boolean isSlotsYouCanAddItems() {
  145.         return slotsYouCanAddItems;
  146.     }
  147.  
  148.     public Map<Integer, ItemStack> getAddedButtons() {
  149.         return addedButtons;
  150.     }
  151.  
  152.     public List<MenuButton> getButtons() {
  153.         return buttons;
  154.     }
  155.  
  156.     public Player getViewer() {
  157.         return this.player;
  158.     }
  159.  
  160.     public Inventory getMenu() {
  161.         if (this.inventories != null)
  162.             return this.inventories[this.pageNumber];
  163.         return null;
  164.     }
  165.  
  166.     public int getPageNumber() {
  167.         return pageNumber;
  168.     }
  169.  
  170.     public int getRequiredPages() {
  171.         return requiredPages;
  172.     }
  173.  
  174.     public Map<Integer, ItemStack> getMenuButtonsOwnCache() {
  175.         return generateInventories();
  176.     }
  177.  
  178.     /**
  179.      * Get metadataKey you has set on player.
  180.      *
  181.      * @return key you has used.
  182.      */
  183.  
  184.     public String getPlayermetadata() {
  185.         return playermetadata;
  186.     }
  187.  
  188.     /**
  189.      * Get the objekt you have set.
  190.      *
  191.      * @return objekt or null if no are set.
  192.      */
  193.  
  194.     public Object getObject() {
  195.         return object;
  196.     }
  197.  
  198.     public List<Integer> getFillSpace() {
  199.         return fillSpace;
  200.     }
  201.  
  202.     public Inventory[] getInventories() {
  203.         return inventories;
  204.     }
  205.  
  206.     public List<?> getListOfFillItems() {
  207.         return listOfFillItems;
  208.     }
  209.  
  210.     public void onMenuClose(InventoryCloseEvent event, Class<?> metadata) {
  211.         if (metadata != null)
  212.             this.player.removeMetadata(metadata.toString(), plugin);
  213.     }
  214.  
  215.     public void onMenuOpen(Player player, Location location) {
  216.         onMenuOpen(player, location, null, null);
  217.     }
  218.  
  219.     public void onMenuOpen(Player player, Location location, String setPlayerMetadata) {
  220.         onMenuOpen(player, location, setPlayerMetadata, null);
  221.     }
  222.  
  223.     public void onMenuOpen(Player player, String setPlayerMetadata, String setPlayerMetadataValue) {
  224.         onMenuOpen(player, null, setPlayerMetadata, setPlayerMetadataValue);
  225.     }
  226.  
  227.     public void onMenuOpen(Player player) {
  228.         onMenuOpen(player, null, null, null);
  229.     }
  230.  
  231.     private void onMenuOpen(Player player, Location location, String setPlayerMetadata, String setPlayerMetadataValue) {
  232.         System.out.println("has loded " + hasLoadMenuButtons);
  233.         Inventory menu;
  234.         this.player = player;
  235.         if (!hasLoadMenuButtons) {
  236.             registerMenuButtons();
  237.             if (!shallCacheItems) {
  238.                 generateInventories();
  239.             }
  240.             hasLoadMenuButtons = true;
  241.         }
  242.  
  243.         if (menuCache.getMenuInCache(player + "*__*" + this.clazz) != null && menuCache.getMenuInCache(player + "*__*" + this.clazz).getMenu() != null) {
  244.             menu = menuCache.getMenuInCache(player + "*__*" + this.clazz).getMenu();
  245.         } else {
  246.             menu = getMenu();
  247.         }
  248.         if (menu == null) return;
  249.  
  250.         System.out.println(" menu result in cache " + menu);
  251.         System.out.println("test all menus " + Arrays.toString(inventories));
  252.         player.openInventory(menu);
  253.  
  254.         System.out.println("this clazz " + menu.equals(getMenu()));
  255.         if (this.title != null && !this.title.equals(""))
  256.             UpdateTittleContainers.update(player, this.title, Material.CHEST, menu.getSize());
  257.         //PlayerUtil.updateInventoryTitle(player, GuiTempletsYaml.getGuiTitle("Settings_Menu"));
  258.         onMenuOpenPlaySound();
  259.         if (location != null)
  260.             setPlayermetadata(player, location, setPlayerMetadata);
  261.         else
  262.             setPlayermetadata(player, setPlayerMetadata, setPlayerMetadataValue);
  263.  
  264.         setMetadataKey(setPlayerMetadata);
  265.         if (menuCache.getMenuInCache(player + "*__*" + this.clazz) == null || menuCache.getMenuInCache(player + "*__*" + this.clazz).getMenu() == null)
  266.             menuCache.setMenusChached(toMenuCache(player, location, setPlayerMetadataValue), this);
  267.         System.out.println("has loded after " + hasLoadMenuButtons);
  268.     }
  269.  
  270.     public boolean isStartLoadMenuButtons() {
  271.         return startLoadMenuButtons;
  272.     }
  273.  
  274.     public int getSlotIndex() {
  275.         return slotIndex;
  276.     }
  277.  
  278.     /**
  279.      * get previous page if this menu has several pages
  280.      */
  281.     public void previousPage() {
  282.         int pageNumber = this.pageNumber;
  283.  
  284.         pageNumber -= 1;
  285.         if (pageNumber < 0) {
  286.             pageNumber = inventories.length - 1;
  287.         } else if (pageNumber >= inventories.length) {
  288.             pageNumber = 0;
  289.         }
  290.         if (pageNumber == -1) {
  291.             pageNumber = 0;
  292.         }
  293.         this.pageNumber = pageNumber;
  294.     }
  295.  
  296.     /**
  297.      * get next page if this menu has several pages
  298.      */
  299.     public void nextPage() {
  300.         int pageNumber = this.pageNumber;
  301.  
  302.         pageNumber += 1;
  303.         if (pageNumber < 0) {
  304.             pageNumber = inventories.length - 1;
  305.         } else if (pageNumber >= inventories.length) {
  306.             pageNumber = 0;
  307.         }
  308.         if (pageNumber == -1) {
  309.             pageNumber = 0;
  310.         }
  311.         this.pageNumber = pageNumber;
  312.     }
  313.  
  314.     private Object toMenuCache(Player player, Location location, String setPlayerMetadataValue) {
  315.         String obj = null;
  316.  
  317.         if (location != null) {
  318.             obj = String.valueOf(location);
  319.             if (this.clazz != null)
  320.                 obj = location + "*__*" + this.clazz;
  321.         }
  322.         if (player != null) {
  323.             obj = String.valueOf(player);
  324.             if (this.clazz != null)
  325.                 obj = player + "*__*" + this.clazz;
  326.         }
  327.         if (player != null && setPlayerMetadataValue != null) {
  328.             obj = player + "*__*" + setPlayerMetadataValue;
  329.         }
  330.         return obj;
  331.     }
  332.  
  333.     private void setPlayermetadata(Player player, Location location, String setPlayerMetadataKey) {
  334.         player.setMetadata(setPlayerMetadataKey, new FixedMetadataValue(plugin, location));
  335.     }
  336.  
  337.     private void setPlayermetadata(Player player, String setPlayerMetadataKey, String setPlayerMetadataValue) {
  338.         player.setMetadata(setPlayerMetadataKey, new FixedMetadataValue(plugin, setPlayerMetadataValue));
  339.     }
  340.  
  341.     private void setMetadataKey(String setPlayerMetadataKey) {
  342.         this.playermetadata = setPlayerMetadataKey;
  343.     }
  344.  
  345.     private void onMenuOpenPlaySound() {
  346.         if (Enums.getIfPresent(Sound.class, menuOpenSound.name()).orNull() != null)
  347.             this.player.playSound(player.getLocation(), menuOpenSound, 1, 1);
  348.     }
  349.  
  350.     public void updateButtons() {
  351.         registerMenuButtons();
  352.         generateInventories();
  353.     }
  354.  
  355.     private void registerMenuButtons() {
  356.         this.buttons.clear();
  357.         startLoadMenuButtons = true;
  358.         try {
  359.             for (Field field : this.clazz.getDeclaredFields()) {
  360.                 field.setAccessible(true);
  361.                 if (MenuButton.class.isAssignableFrom(field.getType())) {
  362.                     try {
  363.                         MenuButton fielddata = (MenuButton) field.get(this);
  364.                         this.buttons.add(fielddata);
  365.                     } catch (IllegalAccessException e) {
  366.                         e.printStackTrace();
  367.                     }
  368.                 }
  369.             }
  370.         } finally {
  371.             startLoadMenuButtons = false;
  372.         }
  373.     }
  374.  
  375.     private double amountpages() {
  376.  
  377.         if (this.itemsPerPage > 0) {
  378.             if (this.itemsPerPage >= this.inventorySize)
  379.                 this.plugin.getLogger().log(Level.SEVERE, "Items per page are biger an Inventory size", new Throwable().fillInStackTrace());
  380.             if (this.fillSpace != null && !this.fillSpace.isEmpty()) {
  381.                 return (double) this.fillSpace.size() / this.itemsPerPage;
  382.             } else if (this.listOfFillItems != null && !this.listOfFillItems.isEmpty())
  383.                 return (double) this.listOfFillItems.size() / this.itemsPerPage;
  384.  
  385.         }
  386.         if (this.listOfFillItems != null && !this.listOfFillItems.isEmpty()) {
  387.             System.out.println("test ");
  388.             return (double) this.listOfFillItems.size() / this.fillSpace.size();
  389.         } else {
  390.             return (double) this.buttons.size() / this.inventorySize;
  391.         }
  392.     }
  393.  
  394.     private Map<Integer, ItemStack> generateInventories() {
  395.         Map<Integer, ItemStack> addedButtons = new HashMap<>();
  396.         this.requiredPages = Math.max((int) Math.ceil(amountpages()), 1);
  397.         //We need more pages if statically positioned object you add are placed at a higher page index an one page can hold.
  398.         if (this.inventories == null || (this.inventories.length < this.requiredPages)) {
  399.             this.inventories = new Inventory[this.requiredPages];
  400.         }
  401.         System.out.println("pges " + this.requiredPages);
  402.         for (int i = 0; i < this.requiredPages; i++) {
  403.             if (this.inventories[i] == null) {
  404.                 this.inventories[i] = createInventory();
  405.             }
  406.             for (int slot = 0; slot < this.inventories[i].getSize(); slot++) {
  407.                 //for (int itemPos : this.fillSpace) {
  408.                 ItemStack result;
  409.                 if (fillSpace != null && fillSpace.contains(slot)) {
  410.                     result = getFillItemsAt(this.slotIndex);
  411.                     this.slotIndex++;
  412.                 } else {
  413.                     result = getItemAt(slot);
  414.                 }
  415.  
  416.                 if (result == null) continue;
  417.                 this.inventories[i].setItem(slot, result);
  418.                 if (!this.shallCacheItems)
  419.                     this.addedButtons.put(i * inventories[i].getSize() + slot, result);
  420.                 else
  421.                     addedButtons.put(i * inventories[i].getSize() + slot, result);
  422.             }
  423.         }
  424.         this.slotIndex = 0;
  425.         if (pageNumber >= this.inventories.length) {
  426.             pageNumber = this.inventories.length - 1;
  427.         }
  428.         return addedButtons;
  429.     }
  430.  
  431.     private Inventory createInventory() {
  432.         if (!(this.inventorySize == 5 || this.inventorySize % 9 == 0))
  433.             System.out.println("wrong inverntory size , you has put in " + this.inventorySize + "it need to be valid number.");
  434.         if (this.inventorySize == 5)
  435.             return Bukkit.createInventory(null, InventoryType.HOPPER, this.title);
  436.  
  437.         return Bukkit.createInventory(null, this.inventorySize, this.title != null ? this.title : "");
  438.     }
  439.  
  440.  
  441. }
  442.  
Add Comment
Please, Sign In to add comment