broken-arrow

Untitled

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