Added caching

This commit is contained in:
ScriptCat 2025-07-26 16:53:12 +03:00
parent aceee4a8bc
commit 904313d269
6 changed files with 133 additions and 77 deletions

View File

@ -26,17 +26,17 @@ public class APIManager {
Bukkit.getPluginManager().registerEvents(this.inventoryManager, this.plugin); Bukkit.getPluginManager().registerEvents(this.inventoryManager, this.plugin);
} }
public boolean add(Player player, ItemStack item) public synchronized boolean add(Player player, ItemStack item)
{ {
return false; return false;
} }
public boolean remove(Player player, ItemStack item) public synchronized boolean remove(Player player, ItemStack item)
{ {
return false; return false;
} }
public void openInventory(Player player) public synchronized void openInventory(Player player)
{ {
this.inventoryManager.openCustomInventory(player); this.inventoryManager.openCustomInventory(player);
} }

View File

@ -1,5 +1,6 @@
package tokarotik.giftapi; package tokarotik.giftapi;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
@ -10,6 +11,8 @@ import org.bukkit.plugin.java.JavaPlugin;
import tokarotik.giftapi.NBT.cache.CacheManager; import tokarotik.giftapi.NBT.cache.CacheManager;
import tokarotik.giftapi.dev.GiftCommand; import tokarotik.giftapi.dev.GiftCommand;
import java.util.concurrent.CompletableFuture;
public class Main extends JavaPlugin implements Listener public class Main extends JavaPlugin implements Listener
{ {
private CacheManager cacheManager; private CacheManager cacheManager;
@ -23,7 +26,7 @@ public class Main extends JavaPlugin implements Listener
cacheManager = new CacheManager(54); cacheManager = new CacheManager(54);
apiManager = new APIManager(this, getConfig()); 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 getServer().getPluginManager().registerEvents(this, this); // bullshit
@ -33,7 +36,8 @@ public class Main extends JavaPlugin implements Listener
@Override @Override
public void onDisable() public void onDisable()
{ {
cacheManager.disable(); getLogger().info("Saving GiftApi...");
Bukkit.getScheduler().runTaskAsynchronously(this, () -> cacheManager.disable());
getLogger().info("GiftAPI disabled!"); getLogger().info("GiftAPI disabled!");
} }
@ -41,25 +45,25 @@ public class Main extends JavaPlugin implements Listener
@EventHandler @EventHandler
public void onPlayerQuit(PlayerQuitEvent event) 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 failed to add, return false
// if successfully added, return true // if successfully added, return true
public boolean add(Player player, ItemStack item) public CompletableFuture<Boolean> addAsync(Player player, ItemStack item) {
{ return CompletableFuture.supplyAsync(() -> apiManager.add(player, item));
return apiManager.add(player, item);
} }
// if failed to remove item, return false // if failed to remove item, return false
// if successfully removed item, return true // if successfully removed item, return true
public boolean remove(Player player, ItemStack item) public CompletableFuture<Boolean> removeAsync(Player player, ItemStack item) {
{ return CompletableFuture.supplyAsync(() -> apiManager.remove(player, item));
return apiManager.remove(player, item);
} }
// will open inventory GiftAPI // will open inventory GiftAPI
public void openGUI(Player player) { public void openGUIAsync(Player player)
{
Bukkit.getScheduler().runTaskAsynchronously(this, () -> {
apiManager.openInventory(player); apiManager.openInventory(player);
});
} }
} }

View File

@ -1,8 +1,6 @@
package tokarotik.giftapi.NBT.cache; package tokarotik.giftapi.NBT.cache;
import net.minecraft.server.v1_6_R3.EntityPlayer; 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 org.bukkit.entity.Player;
import tokarotik.giftapi.NBT.page.PageManager; import tokarotik.giftapi.NBT.page.PageManager;
@ -11,82 +9,50 @@ import java.util.Map;
public class CacheManager public class CacheManager
{ {
private final Map<Player, PageManager> world_map = new HashMap<>();
private final Map<Player, PageManager> nether_map = new HashMap<>();
private final Map<Player, PageManager> end_map = new HashMap<>();
private final int max_stack; private final CacheUtil cacheUtil;
public CacheManager(int max_stack) public CacheManager(int max_stack)
{ {
this.max_stack = max_stack; cacheUtil = new CacheUtil(max_stack);
} }
public PageManager load(Player player) public synchronized PageManager load(Player player) {
{ String playerWorld = player.getWorld().getName();
String worldPlayer = player.getWorld().getName(); Map<Player, PageManager> worldMap = cacheUtil.getWorlMap(playerWorld);
Map<Player, PageManager> hashMap = getWorlMap(worldPlayer);
EntityPlayer entityPlayer = BasicNBT.getPlayer(player); EntityPlayer entityPlayer = BasicNBT.getPlayer(player);
// Return cached PageManager if already loaded
// if player was loaded early if (worldMap.containsKey(player)) {
if (hashMap.containsKey(player)) return worldMap.get(player);
{
return hashMap.get(player);
} }
// if world in what is player has giftapi // Attempt to load from current world
if (WorldNBTSynchronizer.hasAll(entityPlayer, worldPlayer)) if (WorldNBTSynchronizer.hasAll(entityPlayer, playerWorld)) {
{ return this.cacheUtil.loadAndCachePageManager(player, playerWorld, entityPlayer, worldMap);
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;
} }
String world = WorldNBTSynchronizer.getWorldWhatHasPlayer(entityPlayer); // Attempt to load from another world if present
String alternateWorld = WorldNBTSynchronizer.getWorldWhatHasPlayer(entityPlayer);
// if world in what is player hasn't giftapi, but in another has if (alternateWorld != null) {
if (world != null) return this.cacheUtil.loadAndCachePageManager(player, alternateWorld, entityPlayer, worldMap);
{
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;
} }
// if player doesn't have any saved apiconfig NBT // Fallback to new empty PageManager
PageManager new_pages = new PageManager(this.max_stack); PageManager defaultPages = new PageManager(this.cacheUtil.max_stack);
hashMap.put(player, new_pages); worldMap.put(player, defaultPages);
return defaultPages;
return new_pages;
} }
public void disable()
{
public synchronized void disable()
{
cacheUtil.saveAllHard();
} }
public void playerQuit(String playerName) public synchronized void playerQuit(Player player)
{ {
this.cacheUtil.saveHard(player);
}
private Map<Player, PageManager> 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;
} }
} }

View File

@ -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<Player, PageManager> world_map = new HashMap<>();
public final Map<Player, PageManager> nether_map = new HashMap<>();
public final Map<Player, PageManager> 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<Player, PageManager> 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<Player, PageManager> 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<Player, PageManager> 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;
}
}

View File

@ -1,19 +1,24 @@
package tokarotik.giftapi.dev; package tokarotik.giftapi.dev;
import org.bukkit.Bukkit;
import org.bukkit.command.Command; import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import tokarotik.giftapi.APIManager; import tokarotik.giftapi.APIManager;
import tokarotik.giftapi.Main;
public class GiftCommand implements CommandExecutor { public class GiftCommand implements CommandExecutor {
private final APIManager apiManager; private final APIManager apiManager;
private final Main plugin;
public GiftCommand(APIManager APIManager) public GiftCommand(APIManager APIManager, Main plugin)
{ {
this.apiManager = APIManager; this.apiManager = APIManager;
this.plugin = plugin;
} }
@Override @Override
@ -24,7 +29,9 @@ public class GiftCommand implements CommandExecutor {
return true; return true;
} }
this.apiManager.openInventory((Player) sender); Bukkit.getScheduler().runTaskAsynchronously(this.plugin, () -> {
apiManager.openInventory((Player) sender);
});
return true; return true;
} }

View File

@ -27,7 +27,7 @@ public class InventoryManager implements Listener {
this.nameArrowLeft = nameArrowLeft; this.nameArrowLeft = nameArrowLeft;
this.nameExit = nameExit; this.nameExit = nameExit;
} }
public void openCustomInventory(Player player) public synchronized void openCustomInventory(Player player)
{ {
Inventory inventory = Bukkit.createInventory(null, countSlots, this.nameGUI); Inventory inventory = Bukkit.createInventory(null, countSlots, this.nameGUI);