broken-arrow

Untitled

Nov 25th, 2021
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 9.51 KB | None | 0 0
  1.  
  2. import com.google.common.base.Enums;
  3. import org.brokenarrow.storage.NMS.UpdateTittleContainers;
  4. import org.bukkit.Bukkit;
  5. import org.bukkit.Location;
  6. import org.bukkit.Material;
  7. import org.bukkit.Sound;
  8. import org.bukkit.entity.Player;
  9. import org.bukkit.event.inventory.InventoryCloseEvent;
  10. import org.bukkit.event.inventory.InventoryType;
  11. import org.bukkit.inventory.Inventory;
  12. import org.bukkit.inventory.ItemStack;
  13. import org.bukkit.metadata.FixedMetadataValue;
  14. import org.bukkit.plugin.Plugin;
  15.  
  16. import java.lang.reflect.Field;
  17. import java.util.ArrayList;
  18. import java.util.HashMap;
  19. import java.util.List;
  20. import java.util.Map;
  21. import java.util.logging.Level;
  22.  
  23. public abstract class MenuHolderTest {
  24.  
  25.  
  26.     /**
  27.      * Create menu instance.
  28.      *
  29.      * @param clazz         from with class you crated your menu.
  30.      * @param plugin        your main class.
  31.      * @param inventorySize size if menu.
  32.      */
  33.  
  34.     public MenuHolderTest(Class<?> clazz, Plugin plugin, int inventorySize) {
  35.         this.clazz = clazz;
  36.         this.inventorySize = inventorySize;
  37.         this.plugin = plugin;
  38.     }
  39.  
  40.     /**
  41.      * Create menu instance.
  42.      *
  43.      * @param clazz           from with class you crated your menu.
  44.      * @param plugin          your main class.
  45.      * @param inventorySize   size if menu.
  46.      * @param shallCacheItems if it shall cache items and slots in this class, other case use {@link #getMenuButtonsOwnCache()} ot cache it own class.
  47.      */
  48.     public MenuHolderTest(Class<?> clazz, Plugin plugin, int inventorySize, boolean shallCacheItems) {
  49.         this.clazz = clazz;
  50.         getFieldButton();
  51.         this.inventorySize = inventorySize;
  52.         this.itemsPerPage = inventorySize;
  53.         this.plugin = plugin;
  54.         this.shallCacheItems = shallCacheItems;
  55.         if (shallCacheItems)
  56.             generateInventories();
  57.  
  58.     }
  59.  
  60.     private final MenuCache menuCache = MenuCache.getInstance();
  61.     private List<MenuButton> buttons = new ArrayList<>();
  62.     private final Map<Integer, ItemStack> addedButtons = new HashMap<>();
  63.     private final Plugin plugin;
  64.     private final Class<?> clazz;
  65.     private Inventory[] inventories;
  66.     private int pageNumber;
  67.     private boolean shallCacheItems;
  68.     private boolean slotsYouCanAddItems;
  69.     private int requiredPages;
  70.     private List<Integer> fillSpace;
  71.     private List<?> listOfFillItems;
  72.     private int itemsPerPage = this.inventorySize;
  73.     private Player player;
  74.     private Sound menuOpenSound = Sound.BLOCK_NOTE_BLOCK_BASEDRUM;
  75.     private int inventorySize;
  76.     private String title;
  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 void setTitle(String title) {
  87.         this.title = title;
  88.     }
  89.  
  90.     public void setItemsPerPage(int itemsPerPage) {
  91.         if (itemsPerPage <= 0)
  92.             this.itemsPerPage = this.inventorySize;
  93.         this.itemsPerPage = itemsPerPage;
  94.     }
  95.  
  96.     public void setFillSpace(List<Integer> fillSpace) {
  97.         this.fillSpace = fillSpace;
  98.     }
  99.  
  100.     public void setMenuOpenSound(Sound sound) {
  101.         this.menuOpenSound = sound;
  102.     }
  103.  
  104.     public <T> void setListOfFillItems(List<T> listOfFillItems) {
  105.         if (listOfFillItems instanceof ItemStack)
  106.             this.listOfFillItems = listOfFillItems;
  107.     }
  108.  
  109.     /**
  110.      * set this to true if you whant players has option to add or remove items
  111.      *
  112.      * @param slotsYouCanAddItems true and it will give option to add and remove items on fill slots.
  113.      */
  114.  
  115.     public void setSlotsYouCanAddItems(boolean slotsYouCanAddItems) {
  116.         this.slotsYouCanAddItems = slotsYouCanAddItems;
  117.     }
  118.  
  119.     /**
  120.      * get if it this option will give you option add or remove items.
  121.      *
  122.      * @return true will you have option add items.
  123.      */
  124.  
  125.     public boolean isSlotsYouCanAddItems() {
  126.         return slotsYouCanAddItems;
  127.     }
  128.  
  129.     public Map<Integer, ItemStack> getAddedButtons() {
  130.         return addedButtons;
  131.     }
  132.  
  133.     public List<MenuButton> getButtons() {
  134.         return buttons;
  135.     }
  136.  
  137.     public Player getViewer() {
  138.         return this.player;
  139.     }
  140.  
  141.     public Inventory getMenu() {
  142.         if (this.inventories != null)
  143.             return this.inventories[this.pageNumber];
  144.         return null;
  145.     }
  146.  
  147.     public int getPageNumber() {
  148.         return pageNumber;
  149.     }
  150.  
  151.     public int getRequiredPages() {
  152.         return requiredPages;
  153.     }
  154.  
  155.     public Map<Integer, ItemStack> getMenuButtonsOwnCache() {
  156.         return generateInventories();
  157.     }
  158.  
  159.     public List<Integer> getFillSpace() {
  160.         return fillSpace;
  161.     }
  162.  
  163.     public void onMenuClose(InventoryCloseEvent event, Class<?> metadata) {
  164.         if (metadata != null)
  165.             this.player.removeMetadata(metadata.toString(), plugin);
  166.     }
  167.  
  168.  
  169.     public void onMenuOpen(Player player, Location location, String setPlayerMetadata) {
  170.         onMenuOpen(player, location, setPlayerMetadata, null);
  171.     }
  172.  
  173.     public void onMenuOpen(Player player, String setPlayerMetadata, String setPlayerMetadataValue) {
  174.         onMenuOpen(player, null, setPlayerMetadata, setPlayerMetadataValue);
  175.     }
  176.  
  177.     public void onMenuOpen(Player player) {
  178.         onMenuOpen(player, null, null, null);
  179.     }
  180.  
  181.     private void onMenuOpen(Player player, Location location, String setPlayerMetadata, String setPlayerMetadataValue) {
  182.         getFieldButton();
  183.         generateInventories();
  184.         this.player = player;
  185.         System.out.println("menuCache.getMenuInCache(player) " + menuCache.getMenuInCache(player + "*__*" + this.clazz));
  186.         player.openInventory((menuCache.getMenuInCache(player + "*__*" + this.clazz) != null ? menuCache.getMenuInCache(player + "*__*" + this.clazz).getMenu() : getMenu()));
  187.         if (this.title != null && !this.title.equals(""))
  188.             UpdateTittleContainers.update(player, this.title, Material.CHEST, getMenu().getSize());
  189.         //PlayerUtil.updateInventoryTitle(player, GuiTempletsYaml.getGuiTitle("Settings_Menu"));
  190.         onMenuOpenPlaySound();
  191.         menuCache.setMenusChached(toMenuCache(player, location, setPlayerMetadataValue), this);
  192.         if (location != null)
  193.             setPlayermetadata(player, location, setPlayerMetadata);
  194.         else
  195.             setPlayermetadata(player, setPlayerMetadata, setPlayerMetadataValue);
  196.     }
  197.  
  198.     private Object toMenuCache(Player player, Location location, String setPlayerMetadataValue) {
  199.         String obj = null;
  200.  
  201.         if (location != null) {
  202.             obj = String.valueOf(location);
  203.             if (this.clazz != null)
  204.                 obj = location + "*__*" + this.clazz;
  205.         }
  206.         if (player != null) {
  207.             obj = String.valueOf(player);
  208.             if (this.clazz != null)
  209.                 obj = player + "*__*" + this.clazz;
  210.         }
  211.         if (player != null && setPlayerMetadataValue != null) {
  212.             obj = player + "*__*" + setPlayerMetadataValue;
  213.         }
  214.         return obj;
  215.     }
  216.  
  217.     private void setPlayermetadata(Player player, Location location, String setPlayerMetadata) {
  218.         player.setMetadata(setPlayerMetadata, new FixedMetadataValue(plugin, location));
  219.  
  220.     }
  221.  
  222.     private void setPlayermetadata(Player player, String setPlayerMetadata, String setPlayerMetadataValue) {
  223.         player.setMetadata(setPlayerMetadata, new FixedMetadataValue(plugin, setPlayerMetadataValue));
  224.     }
  225.  
  226.     private void onMenuOpenPlaySound() {
  227.         if (Enums.getIfPresent(Sound.class, menuOpenSound.name()).orNull() != null)
  228.             this.player.playSound(player.getLocation(), menuOpenSound, 1, 1);
  229.     }
  230.  
  231.     private void getFieldButton() {
  232.         for (Field field : this.clazz.getDeclaredFields()) {
  233.             field.setAccessible(true);
  234.             if (MenuButton.class.isAssignableFrom(field.getType())) {
  235.                 try {
  236.                     MenuButton fielddata = (MenuButton) field.get(this);
  237.                     System.out.println("test " + this);
  238.                     buttons.add(fielddata);
  239.                 } catch (IllegalAccessException e) {
  240.                     e.printStackTrace();
  241.                 }
  242.             }
  243.         }
  244.     }
  245.  
  246.     private int amountpages() {
  247.  
  248.         if (this.itemsPerPage > 0) {
  249.             if (this.itemsPerPage >= this.inventorySize)
  250.                 plugin.getLogger().log(Level.SEVERE, "Items per page are biger an Inventory size", new Throwable().fillInStackTrace());
  251.             return buttons.size() / this.itemsPerPage;
  252.         } else {
  253.             return buttons.size() / this.inventorySize;
  254.         }
  255.     }
  256.  
  257.     private Map<Integer, ItemStack> generateInventories() {
  258.         Map<Integer, ItemStack> addedButtons = new HashMap<>();
  259.         this.requiredPages = Math.max((int) Math.ceil(amountpages()), 1);
  260.         //We need more pages if statically positioned players you add are placed at a higher page index an one page can hold.
  261.  
  262.         this.inventories = new Inventory[this.requiredPages];
  263.  
  264.         int slotIndex = 0;
  265.         for (int i = 0; i < this.requiredPages; i++) {
  266.             this.inventories[i] = createInventory();
  267.             for (int slot = 0; slot < this.inventories[i].getSize(); slot++) {
  268.                 //for (int itemPos : this.fillSpace) {
  269.                 ItemStack result;
  270.                 if (fillSpace != null && fillSpace.contains(slot)) {
  271.                     if (!this.listOfFillItems.isEmpty() && this.listOfFillItems.size() > slotIndex) {
  272.                         result = (ItemStack) this.listOfFillItems.get(slotIndex);
  273.                     } else
  274.                         result = getFillItemsAt(slotIndex);
  275.                     slotIndex++;
  276.                 } else {
  277.                     result = getItemAt(slot);
  278.                     System.out.println("result slottis" + getItemAt(slot));
  279.                 }
  280.  
  281.                 if (result == null) continue;
  282.                 System.out.println("result " + result);
  283.                 this.inventories[i].setItem(slot, result);
  284.                 if (!this.shallCacheItems)
  285.                     this.addedButtons.put(i * inventories[i].getSize() + slot, result);
  286.                 else
  287.                     addedButtons.put(i * inventories[i].getSize() + slot, result);
  288.             }
  289.         }
  290.         if (pageNumber >= this.inventories.length) {
  291.             pageNumber = this.inventories.length - 1;
  292.         }
  293.         return addedButtons;
  294.     }
  295.  
  296.     private Inventory createInventory() {
  297.         if (!(this.inventorySize == 5 || this.inventorySize % 9 == 0))
  298.             System.out.println("wrong inverntory size , you has put in " + this.inventorySize + "it need to be valid number.");
  299.         if (this.inventorySize == 5)
  300.             return Bukkit.createInventory(null, InventoryType.HOPPER, this.title);
  301.  
  302.         return Bukkit.createInventory(null, this.inventorySize, this.title != null ? this.title : "");
  303.     }
  304.  
  305.  
  306. }
  307.  
Add Comment
Please, Sign In to add comment