From 904313d2698cf688ef9f3b7558364be61b8466fe Mon Sep 17 00:00:00 2001 From: ScriptCat Date: Sat, 26 Jul 2025 16:53:12 +0300 Subject: [PATCH] Added caching --- .../java/tokarotik/giftapi/APIManager.java | 6 +- src/main/java/tokarotik/giftapi/Main.java | 28 ++++--- .../giftapi/NBT/cache/CacheManager.java | 84 ++++++------------- .../giftapi/NBT/cache/CacheUtil.java | 79 +++++++++++++++++ .../tokarotik/giftapi/dev/GiftCommand.java | 11 ++- .../giftapi/inventory/InventoryManager.java | 2 +- 6 files changed, 133 insertions(+), 77 deletions(-) create mode 100644 src/main/java/tokarotik/giftapi/NBT/cache/CacheUtil.java diff --git a/src/main/java/tokarotik/giftapi/APIManager.java b/src/main/java/tokarotik/giftapi/APIManager.java index 44019a0..14360da 100644 --- a/src/main/java/tokarotik/giftapi/APIManager.java +++ b/src/main/java/tokarotik/giftapi/APIManager.java @@ -26,17 +26,17 @@ public class APIManager { Bukkit.getPluginManager().registerEvents(this.inventoryManager, this.plugin); } - public boolean add(Player player, ItemStack item) + public synchronized boolean add(Player player, ItemStack item) { return false; } - public boolean remove(Player player, ItemStack item) + public synchronized boolean remove(Player player, ItemStack item) { return false; } - public void openInventory(Player player) + public synchronized void openInventory(Player player) { this.inventoryManager.openCustomInventory(player); } diff --git a/src/main/java/tokarotik/giftapi/Main.java b/src/main/java/tokarotik/giftapi/Main.java index 2280ef1..310d09d 100644 --- a/src/main/java/tokarotik/giftapi/Main.java +++ b/src/main/java/tokarotik/giftapi/Main.java @@ -1,5 +1,6 @@ package tokarotik.giftapi; +import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; @@ -10,6 +11,8 @@ import org.bukkit.plugin.java.JavaPlugin; import tokarotik.giftapi.NBT.cache.CacheManager; import tokarotik.giftapi.dev.GiftCommand; +import java.util.concurrent.CompletableFuture; + public class Main extends JavaPlugin implements Listener { private CacheManager cacheManager; @@ -23,7 +26,7 @@ public class Main extends JavaPlugin implements Listener cacheManager = new CacheManager(54); apiManager = new APIManager(this, getConfig()); - this.getCommand("gift").setExecutor(new GiftCommand(apiManager)); // DELETE FOR RELEASE + this.getCommand("gift").setExecutor(new GiftCommand(apiManager, this)); // DELETE FOR RELEASE getServer().getPluginManager().registerEvents(this, this); // bullshit @@ -33,7 +36,8 @@ public class Main extends JavaPlugin implements Listener @Override public void onDisable() { - cacheManager.disable(); + getLogger().info("Saving GiftApi..."); + Bukkit.getScheduler().runTaskAsynchronously(this, () -> cacheManager.disable()); getLogger().info("GiftAPI disabled!"); } @@ -41,25 +45,25 @@ public class Main extends JavaPlugin implements Listener @EventHandler public void onPlayerQuit(PlayerQuitEvent event) { - cacheManager.playerQuit(event.getPlayer().getName()); + Bukkit.getScheduler().runTaskAsynchronously(this, () -> cacheManager.playerQuit(event.getPlayer())); } // if failed to add, return false // if successfully added, return true - public boolean add(Player player, ItemStack item) - { - return apiManager.add(player, item); + public CompletableFuture addAsync(Player player, ItemStack item) { + return CompletableFuture.supplyAsync(() -> apiManager.add(player, item)); } - // if failed to remove item, return false // if successfully removed item, return true - public boolean remove(Player player, ItemStack item) - { - return apiManager.remove(player, item); + public CompletableFuture removeAsync(Player player, ItemStack item) { + return CompletableFuture.supplyAsync(() -> apiManager.remove(player, item)); } // will open inventory GiftAPI - public void openGUI(Player player) { - apiManager.openInventory(player); + public void openGUIAsync(Player player) + { + Bukkit.getScheduler().runTaskAsynchronously(this, () -> { + apiManager.openInventory(player); + }); } } \ No newline at end of file diff --git a/src/main/java/tokarotik/giftapi/NBT/cache/CacheManager.java b/src/main/java/tokarotik/giftapi/NBT/cache/CacheManager.java index 664dc01..2746a3c 100644 --- a/src/main/java/tokarotik/giftapi/NBT/cache/CacheManager.java +++ b/src/main/java/tokarotik/giftapi/NBT/cache/CacheManager.java @@ -1,8 +1,6 @@ package tokarotik.giftapi.NBT.cache; import net.minecraft.server.v1_6_R3.EntityPlayer; -import net.minecraft.server.v1_6_R3.NBTTagCompound; -import net.minecraft.server.v1_6_R3.NBTTagList; import org.bukkit.entity.Player; import tokarotik.giftapi.NBT.page.PageManager; @@ -11,82 +9,50 @@ import java.util.Map; public class CacheManager { - private final Map world_map = new HashMap<>(); - private final Map nether_map = new HashMap<>(); - private final Map end_map = new HashMap<>(); - private final int max_stack; + private final CacheUtil cacheUtil; public CacheManager(int max_stack) { - this.max_stack = max_stack; + cacheUtil = new CacheUtil(max_stack); } - public PageManager load(Player player) - { - String worldPlayer = player.getWorld().getName(); - Map hashMap = getWorlMap(worldPlayer); + public synchronized PageManager load(Player player) { + String playerWorld = player.getWorld().getName(); + Map worldMap = cacheUtil.getWorlMap(playerWorld); EntityPlayer entityPlayer = BasicNBT.getPlayer(player); - - // if player was loaded early - if (hashMap.containsKey(player)) - { - return hashMap.get(player); + // Return cached PageManager if already loaded + if (worldMap.containsKey(player)) { + return worldMap.get(player); } - // if world in what is player has giftapi - if (WorldNBTSynchronizer.hasAll(entityPlayer, worldPlayer)) - { - NBTTagCompound compound = new BasicNBT(worldPlayer).readPlayerNBT(entityPlayer); - NBTTagList list = compound.getList("giftapi"); - - PageManager new_pages = new PageManager(list, this.max_stack); - hashMap.put(player, new_pages); - - return new_pages; + // Attempt to load from current world + if (WorldNBTSynchronizer.hasAll(entityPlayer, playerWorld)) { + return this.cacheUtil.loadAndCachePageManager(player, playerWorld, entityPlayer, worldMap); } - String world = WorldNBTSynchronizer.getWorldWhatHasPlayer(entityPlayer); - - // if world in what is player hasn't giftapi, but in another has - if (world != null) - { - NBTTagCompound compound = new BasicNBT(world).readPlayerNBT(entityPlayer); - NBTTagList list = compound.getList("giftapi"); - - PageManager new_pages = new PageManager(list, this.max_stack); - hashMap.put(player, new_pages); - - return new_pages; + // Attempt to load from another world if present + String alternateWorld = WorldNBTSynchronizer.getWorldWhatHasPlayer(entityPlayer); + if (alternateWorld != null) { + return this.cacheUtil.loadAndCachePageManager(player, alternateWorld, entityPlayer, worldMap); } - // if player doesn't have any saved apiconfig NBT - PageManager new_pages = new PageManager(this.max_stack); - hashMap.put(player, new_pages); - - return new_pages; + // Fallback to new empty PageManager + PageManager defaultPages = new PageManager(this.cacheUtil.max_stack); + worldMap.put(player, defaultPages); + return defaultPages; } - public void disable() - { + + public synchronized void disable() + { + cacheUtil.saveAllHard(); } - public void playerQuit(String playerName) + public synchronized void playerQuit(Player player) { - - } - - private Map getWorlMap(String worldName) - { - switch(worldName) - { - case "world": { return this.world_map; } - case "world_nether": { return this.nether_map; } - case "world_the_end": { return this.end_map; } - } - - return null; + this.cacheUtil.saveHard(player); } } diff --git a/src/main/java/tokarotik/giftapi/NBT/cache/CacheUtil.java b/src/main/java/tokarotik/giftapi/NBT/cache/CacheUtil.java new file mode 100644 index 0000000..2a8db23 --- /dev/null +++ b/src/main/java/tokarotik/giftapi/NBT/cache/CacheUtil.java @@ -0,0 +1,79 @@ +package tokarotik.giftapi.NBT.cache; + +import net.minecraft.server.v1_6_R3.EntityPlayer; +import net.minecraft.server.v1_6_R3.NBTTagCompound; +import net.minecraft.server.v1_6_R3.NBTTagList; +import org.bukkit.Bukkit; +import org.bukkit.World; +import org.bukkit.entity.Player; +import tokarotik.giftapi.NBT.page.PageManager; + +import java.util.HashMap; +import java.util.Map; + +public class CacheUtil +{ + public final Map world_map = new HashMap<>(); + public final Map nether_map = new HashMap<>(); + public final Map end_map = new HashMap<>(); + + public final int max_stack; + + public CacheUtil(int max_stack) + { + this.max_stack = max_stack; + } + + public synchronized void saveHard(Player player) + { + for (World world : Bukkit.getWorlds()) + { + String nameWorld = world.getName(); + Map map = this.getWorlMap(nameWorld); + + if (map == null) { continue; } + + PageManager pages = map.get(player); + + if (pages == null) { continue; } + + NBTTagList tag = pages.getTag(); + EntityPlayer entityPlayer = BasicNBT.getPlayer(player); + + BasicNBT basicNBT = new BasicNBT(nameWorld); + + NBTTagCompound compound = basicNBT.readPlayerNBT(entityPlayer); + compound.set("giftapi", tag); + basicNBT.writePlayerNBT(compound, entityPlayer); + } + } + + public synchronized void saveAllHard() + { + for (Player player : Bukkit.getOnlinePlayers()) + { + saveHard(player); + } + } + + public Map getWorlMap(String worldName) + { + switch(worldName) + { + case "world": { return this.world_map; } + case "world_nether": { return this.nether_map; } + case "world_the_end": { return this.end_map; } + } + + return null; + } + + public synchronized PageManager loadAndCachePageManager(Player player, String world, EntityPlayer entityPlayer, Map worldMap) { + NBTTagCompound compound = new BasicNBT(world).readPlayerNBT(entityPlayer); + NBTTagList giftList = compound.getList("giftapi"); + + PageManager pageManager = new PageManager(giftList, this.max_stack); + worldMap.put(player, pageManager); + return pageManager; + } +} diff --git a/src/main/java/tokarotik/giftapi/dev/GiftCommand.java b/src/main/java/tokarotik/giftapi/dev/GiftCommand.java index b91b51f..6cf10ab 100644 --- a/src/main/java/tokarotik/giftapi/dev/GiftCommand.java +++ b/src/main/java/tokarotik/giftapi/dev/GiftCommand.java @@ -1,19 +1,24 @@ 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 tokarotik.giftapi.APIManager; +import tokarotik.giftapi.Main; public class GiftCommand implements CommandExecutor { private final APIManager apiManager; + private final Main plugin; - public GiftCommand(APIManager APIManager) + public GiftCommand(APIManager APIManager, Main plugin) { + this.apiManager = APIManager; + this.plugin = plugin; } @Override @@ -24,7 +29,9 @@ public class GiftCommand implements CommandExecutor { return true; } - this.apiManager.openInventory((Player) sender); + Bukkit.getScheduler().runTaskAsynchronously(this.plugin, () -> { + apiManager.openInventory((Player) sender); + }); return true; } diff --git a/src/main/java/tokarotik/giftapi/inventory/InventoryManager.java b/src/main/java/tokarotik/giftapi/inventory/InventoryManager.java index e5787b0..1edfb2f 100644 --- a/src/main/java/tokarotik/giftapi/inventory/InventoryManager.java +++ b/src/main/java/tokarotik/giftapi/inventory/InventoryManager.java @@ -27,7 +27,7 @@ public class InventoryManager implements Listener { this.nameArrowLeft = nameArrowLeft; this.nameExit = nameExit; } - public void openCustomInventory(Player player) + public synchronized void openCustomInventory(Player player) { Inventory inventory = Bukkit.createInventory(null, countSlots, this.nameGUI);