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);
}
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);
}

View File

@ -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<Boolean> 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<Boolean> removeAsync(Player player, ItemStack item) {
return CompletableFuture.supplyAsync(() -> apiManager.remove(player, item));
}
// will open inventory GiftAPI
public void openGUI(Player player) {
public void openGUIAsync(Player player)
{
Bukkit.getScheduler().runTaskAsynchronously(this, () -> {
apiManager.openInventory(player);
});
}
}

View File

@ -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<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)
{
this.max_stack = max_stack;
cacheUtil = new CacheUtil(max_stack);
}
public PageManager load(Player player)
{
String worldPlayer = player.getWorld().getName();
Map<Player, PageManager> hashMap = getWorlMap(worldPlayer);
public synchronized PageManager load(Player player) {
String playerWorld = player.getWorld().getName();
Map<Player, PageManager> worldMap = cacheUtil.getWorlMap(playerWorld);
EntityPlayer entityPlayer = BasicNBT.getPlayer(player);
// Return cached PageManager if already loaded
if (worldMap.containsKey(player)) {
return worldMap.get(player);
}
// if player was loaded early
if (hashMap.containsKey(player))
// Attempt to load from current world
if (WorldNBTSynchronizer.hasAll(entityPlayer, playerWorld)) {
return this.cacheUtil.loadAndCachePageManager(player, playerWorld, entityPlayer, worldMap);
}
// Attempt to load from another world if present
String alternateWorld = WorldNBTSynchronizer.getWorldWhatHasPlayer(entityPlayer);
if (alternateWorld != null) {
return this.cacheUtil.loadAndCachePageManager(player, alternateWorld, entityPlayer, worldMap);
}
// Fallback to new empty PageManager
PageManager defaultPages = new PageManager(this.cacheUtil.max_stack);
worldMap.put(player, defaultPages);
return defaultPages;
}
public synchronized void disable()
{
return hashMap.get(player);
cacheUtil.saveAllHard();
}
// if world in what is player has giftapi
if (WorldNBTSynchronizer.hasAll(entityPlayer, worldPlayer))
public synchronized void playerQuit(Player player)
{
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);
// 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;
}
// 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;
}
public void disable()
{
}
public void playerQuit(String playerName)
{
}
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;
this.cacheUtil.saveHard(player);
}
}

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;
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;
}

View File

@ -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);