coming to render items in menu

This commit is contained in:
ScriptCat 2025-07-28 18:27:58 +03:00
parent 5f7a4767b9
commit 02d73bb7c5
11 changed files with 163 additions and 67 deletions

View File

@ -3,13 +3,14 @@ package tokarotik.giftapi;
import org.bukkit.Bukkit;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.inventory.ItemStack;
import tokarotik.giftapi.NBT.cache.CacheManager;
import tokarotik.giftapi.NBT.pages.PagesManager;
import tokarotik.giftapi.inventory.InventoryManager;
public class APIManager {
public class APIManager implements Listener {
public final Main plugin;
private final InventoryManager inventoryManager;
@ -17,7 +18,6 @@ public class APIManager {
public APIManager(Main plugin, FileConfiguration config)
{
this.plugin = plugin;
this.inventoryManager = new InventoryManager(
plugin.getCacheManager(),
ConfigPaths.getWithColor(config, ConfigPaths.GUINAME, "GiftAPI Menu"),
@ -29,25 +29,15 @@ public class APIManager {
Bukkit.getPluginManager().registerEvents(this.inventoryManager, this.plugin);
}
public synchronized boolean add(Player player, ItemStack item)
{
CacheManager cache = plugin.getCacheManager();
PagesManager pages = cache.load(player);
public synchronized void add(Player player, ItemStack item) { this.inventoryManager.add(player, item); }
pages.add(item);
cache.save(player, pages);
return false;
}
public synchronized boolean remove(Player player, ItemStack item)
{
return false;
}
public synchronized void remove(Player player, ItemStack item) { this.inventoryManager.remove(player, item); }
public synchronized void openInventory(Player player)
{
this.inventoryManager.openCustomInventory(player);
}
@EventHandler
public void onInventoryClick(InventoryClickEvent event) { this.inventoryManager.onInventoryClick(event); }
}

View File

@ -9,10 +9,9 @@ import org.bukkit.inventory.ItemStack;
import org.bukkit.plugin.java.JavaPlugin;
import tokarotik.giftapi.NBT.cache.CacheManager;
import tokarotik.giftapi.dev.AddCommand;
import tokarotik.giftapi.dev.GiftCommand;
import java.util.concurrent.CompletableFuture;
public class Main extends JavaPlugin implements Listener
{
private CacheManager cacheManager;
@ -27,6 +26,7 @@ public class Main extends JavaPlugin implements Listener
apiManager = new APIManager(this, getConfig());
this.getCommand("gift").setExecutor(new GiftCommand(apiManager, this)); // DELETE FOR RELEASE
this.getCommand("add").setExecutor(new AddCommand(apiManager, this)); // DELETE FOR RELEASE
getServer().getPluginManager().registerEvents(this, this); // bullshit
@ -38,7 +38,6 @@ public class Main extends JavaPlugin implements Listener
{
getLogger().info("Saving GiftApi...");
cacheManager.disable();
//Bukkit.getScheduler().runTaskAsynchronously(this, () -> cacheManager.disable());
getLogger().info("GiftAPI disabled!");
}
@ -51,17 +50,22 @@ public class Main extends JavaPlugin implements Listener
// if failed to add, return false
// if successfully added, return true
public CompletableFuture<Boolean> addAsync(Player player, ItemStack item) {
return CompletableFuture.supplyAsync(() -> apiManager.add(player, item));
public void add(Player player, ItemStack item) {
Bukkit.getScheduler().runTaskAsynchronously(this, () -> {
apiManager.add(player, item);
});
}
// if failed to remove item, return false
// if successfully removed item, return true
public CompletableFuture<Boolean> removeAsync(Player player, ItemStack item) {
return CompletableFuture.supplyAsync(() -> apiManager.remove(player, item));
public void remove(Player player, ItemStack item)
{
Bukkit.getScheduler().runTaskAsynchronously(this, () -> {
apiManager.remove(player, item);
});
}
// will open inventory GiftAPI
public void openGUIAsync(Player player)
public void openGUI(Player player)
{
Bukkit.getScheduler().runTaskAsynchronously(this, () -> {
apiManager.openInventory(player);

View File

@ -31,8 +31,6 @@ public class CacheUtil
String nameWorld = world.getName();
Map<Player, PagesManager> map = this.getWorlMap(nameWorld);
System.out.println("Map " + map.toString() + ". World: " + nameWorld);
if (map == null) { continue; }
PagesManager pages = map.get(player);

View File

@ -6,12 +6,13 @@ import org.bukkit.inventory.ItemStack;
public class PagesManager
{
private NBTTagList tag;
private int current_page = 0;
private int count_pages = 0;
public PagesManager(NBTTagList tag)
{
this.tag = tag;
setCountPages();
}
public PagesManager()
@ -22,11 +23,13 @@ public class PagesManager
public void add(ItemStack item)
{
PagesUtil.add(item, this.tag);
setCountPages();
}
public void remove(ItemStack item)
{
PagesUtil.remove(item, this.tag);
this.tag = PagesUtil.remove(item, this.tag);
setCountPages();
}
public NBTTagList getTag() { return this.tag; }
@ -34,10 +37,21 @@ public class PagesManager
public void setTag(NBTTagList tag)
{
this.tag = tag;
setCountPages();
}
public int getIntCurrentPage() { return this.current_page; }
public void setIntCurrentPage(int current_page) { this.current_page = current_page; }
public int getCountPages() { return this.count_pages; }
private void setCountPages() {
int tag_size = this.tag.size();
if (tag_size == 0) { this.count_pages = 0; }
int access_slots = 45;
this.count_pages = Math.floorDiv(tag_size, access_slots);
}
}

View File

@ -7,6 +7,10 @@ import tokarotik.giftapi.NBT.item.ItemLoad;
import tokarotik.giftapi.NBT.item.ItemNBT;
import tokarotik.giftapi.NBT.pages.page.Page;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public class PagesUtil
{
public static void add(ItemStack item, NBTTagList tag)
@ -19,9 +23,7 @@ public class PagesUtil
public static NBTTagList remove(ItemStack item, NBTTagList tag)
{
ItemStack[] new_list = addAllExtraOne(tag, item);
NBTTagList list = itemStackListToNBTList(new_list);
return list;
return itemStackListToNBTList(new_list);
}
public static ItemStack[] addAllExtraOne(NBTTagList tag, ItemStack item)
@ -69,6 +71,14 @@ public class PagesUtil
return list;
}
public static ItemStack[] reverse(ItemStack[] list)
{
List<ItemStack> array = Arrays.asList(list);
Collections.reverse(array);
return (ItemStack[]) array.toArray();
}
public static boolean isUpdatedTag(NBTTagList tag, NBTTagList new_tag)
{
if (!new_tag.equals(tag)) { return false; }

View File

@ -0,0 +1,44 @@
package tokarotik.giftapi.dev;
import org.bukkit.Bukkit;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import tokarotik.giftapi.APIManager;
import tokarotik.giftapi.Main;
import java.util.Random;
public class AddCommand implements CommandExecutor {
private final APIManager apiManager;
private final Main plugin;
public AddCommand(APIManager APIManager, Main plugin) {
this.apiManager = APIManager;
this.plugin = plugin;
}
@Override
public boolean onCommand(CommandSender sender, Command command, String s, String[] strings) {
Player player;
if (!(sender instanceof Player)) {
sender.sendMessage("This command can use only player!");
player = Bukkit.getOnlinePlayers()[0];
return true;
} else {
player = (Player) sender;
}
Random rand = new Random();
ItemStack item = new ItemStack(rand.nextInt(420) + 1);
this.plugin.add(player, item);
return true;
}
}

View File

@ -1,13 +1,11 @@
package tokarotik.giftapi.dev;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import tokarotik.giftapi.APIManager;
import tokarotik.giftapi.Main;
@ -25,20 +23,25 @@ public class GiftCommand implements CommandExecutor {
@Override
public boolean onCommand(CommandSender sender, Command command, String s, String[] strings) {
Player player;
if (!(sender instanceof Player))
{
sender.sendMessage("This command can use only player!");
player = Bukkit.getOnlinePlayers()[0];
return true;
}
ItemStack item = new ItemStack(Material.BRICK, 1);
else
{
player = (Player) sender;
}
Bukkit.getScheduler().runTaskAsynchronously(this.plugin, () -> {
plugin.getCacheManager().load((Player) sender);
apiManager.add((Player) sender, item);
System.out.println( plugin.getCacheManager().load(player).getTag() );
this.plugin.openGUI(player);
apiManager.openInventory((Player) sender);
});
return true;
}

View File

@ -0,0 +1,10 @@
package tokarotik.giftapi.inventory;
public class InventoryItems
{
//private
public InventoryItems()
{
}
}

View File

@ -1,20 +1,18 @@
package tokarotik.giftapi.inventory;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.EventHandler;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import tokarotik.giftapi.NBT.cache.CacheManager;
import tokarotik.giftapi.NBT.pages.PagesManager;
public class InventoryManager implements Listener {
private final int countSlots = 54;
private final String nameGUI;
private final CacheManager cacheManager;
private final InventoryUtil inventoryUtil;
@ -24,32 +22,35 @@ public class InventoryManager implements Listener {
{
this.nameGUI = nameGUI;
this.cacheManager = cacheManager;
inventoryUtil = new InventoryUtil(nameGUI, nameArrowRight, nameArrowLeft, nameExit);
inventoryUtil = new InventoryUtil(cacheManager, nameGUI, nameArrowRight, nameArrowLeft, nameExit);
}
@EventHandler
public void onInventoryClick(InventoryClickEvent event)
public synchronized void onInventoryClick(InventoryClickEvent event)
{
this.inventoryUtil.onInventoryClick(event);
}
public synchronized boolean add(Player player, ItemStack item)
public synchronized void add(Player player, ItemStack item)
{
return false;
PagesManager pages = this.cacheManager.load(player);
pages.add(item);
}
public synchronized boolean remove(Player player, ItemStack item)
public synchronized void remove(Player player, ItemStack item)
{
return false;
PagesManager pages = this.cacheManager.load(player);
pages.remove(item);
}
public synchronized void openCustomInventory(Player player)
{
Inventory inventory = Bukkit.createInventory(null, this.countSlots, this.nameGUI);
int countSlots = 54;
Inventory inventory = Bukkit.createInventory(null, countSlots, this.nameGUI);
this.inventoryUtil.updateInventory(inventory);
this.inventoryUtil.updateInventory(inventory, player);
player.openInventory(inventory);
}

View File

@ -6,17 +6,20 @@ import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import tokarotik.giftapi.NBT.cache.CacheManager;
import tokarotik.giftapi.NBT.pages.PagesManager;
public class InventoryUtil
{
private final CacheManager cacheManager;
private final String nameGUI;
private final String nameArrowRight;
private final String nameArrowLeft;
private final String nameExit;
public InventoryUtil(String nameGUI, String nameArrowRight, String nameArrowLeft, String nameExit)
public InventoryUtil(CacheManager cacheManager, String nameGUI, String nameArrowRight, String nameArrowLeft, String nameExit)
{
this.cacheManager = cacheManager;
this.nameGUI = nameGUI;
this.nameArrowRight = nameArrowRight;
this.nameArrowLeft = nameArrowLeft;
@ -51,24 +54,40 @@ public class InventoryUtil
}
}
public void updateInventory(Inventory inventory)
public synchronized void updateInventory(Inventory inventory, Player player)
{
setUI(inventory);
PagesManager pagesManager = this.cacheManager.load(player);
setUI(inventory, pagesManager);
}
private void setUI(Inventory inventory)
public synchronized void renderItem(Inventory inventory, ItemStack item)
{
inventory.addItem(item);
}
private synchronized void setUI(Inventory inventory, PagesManager pagesManager)
{
// arrow right
setArrow(inventory, this.nameArrowRight, 8, 6);
// arrow left
setArrow(inventory, this.nameArrowLeft, 0, 6);
// exit
setItem(inventory, Material.REDSTONE, this.nameExit, 4, 6);
if (pagesManager.getCountPages() == 0) { return; }
if (pagesManager.getIntCurrentPage() != pagesManager.getCountPages())
{
// arrow right
setArrow(inventory, this.nameArrowRight, 8, 6);
}
if (pagesManager.getIntCurrentPage() != 0)
{
// arrow left
setArrow(inventory, this.nameArrowLeft, 0, 6);
}
}
private void setItem(Inventory inventory, Material material, String name, int x, int y)
private synchronized void setItem(Inventory inventory, Material material, String name, int x, int y)
{
ItemStack item = new ItemStack(material, 1);
ItemMeta meta_item = item.getItemMeta();
@ -82,12 +101,12 @@ public class InventoryUtil
);
}
private void setArrow(Inventory inventory, String name, int x, int y)
private synchronized void setArrow(Inventory inventory, String name, int x, int y)
{
setItem(inventory, Material.ARROW, name, x, y);
}
public int getCordinates(int x, int y)
public synchronized int getCordinates(int x, int y)
{
if (y == 0) {y++;}
return ((y - 1) * 9 + x) % 64;

View File

@ -4,5 +4,8 @@ main: tokarotik.giftapi.Main
commands:
gift:
description: for test
usage: /<command>
add:
description: for test
usage: /<command>