Added caching
This commit is contained in:
parent
aceee4a8bc
commit
904313d269
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -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;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
79
src/main/java/tokarotik/giftapi/NBT/cache/CacheUtil.java
vendored
Normal file
79
src/main/java/tokarotik/giftapi/NBT/cache/CacheUtil.java
vendored
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user