Skip to content

Commit

Permalink
restructure flag handling a bit, add cache config option
Browse files Browse the repository at this point in the history
  • Loading branch information
mcmonkey4eva committed Dec 7, 2020
1 parent 21eaf36 commit fe73b7a
Show file tree
Hide file tree
Showing 11 changed files with 272 additions and 116 deletions.
20 changes: 13 additions & 7 deletions plugin/src/main/java/com/denizenscript/denizen/Denizen.java
Expand Up @@ -29,6 +29,7 @@
import com.denizenscript.denizen.utilities.debugging.Debug;
import com.denizenscript.denizen.utilities.depends.Depends;
import com.denizenscript.denizen.utilities.entity.DenizenEntityType;
import com.denizenscript.denizen.utilities.flags.PlayerFlagHandler;
import com.denizenscript.denizen.utilities.implementation.DenizenCoreImplementation;
import com.denizenscript.denizen.utilities.maps.DenizenMapManager;
import com.denizenscript.denizen.utilities.packets.DenizenPacketHandler;
Expand All @@ -40,7 +41,7 @@
import com.denizenscript.denizen.npc.DenizenNPCHelper;
import com.denizenscript.denizencore.DenizenCore;
import com.denizenscript.denizencore.events.OldEventManager;
import com.denizenscript.denizencore.flags.MapTagFlagTracker;
import com.denizenscript.denizencore.flags.SavableMapFlagTracker;
import com.denizenscript.denizencore.objects.ObjectFetcher;
import com.denizenscript.denizencore.scripts.ScriptHelper;
import com.denizenscript.denizencore.scripts.ScriptRegistry;
Expand Down Expand Up @@ -122,7 +123,7 @@ public NotableManager notableManager() {

public DenizenCoreImplementation coreImplementation = new DenizenCoreImplementation();

public MapTagFlagTracker serverFlagMap;
public SavableMapFlagTracker serverFlagMap;

/*
* Sets up Denizen on start of the CraftBukkit server.
Expand Down Expand Up @@ -424,12 +425,16 @@ public void run() {
}
}
}.runTaskTimer(this, 100, 20 * 60 * 60);
PlayerFlagHandler.dataFolder = new File(getDataFolder(), "player_flags");
if (!PlayerFlagHandler.dataFolder.exists()) {
PlayerFlagHandler.dataFolder.mkdir();
}
new BukkitRunnable() {
@Override
public void run() {
PlayerTag.cleanCache();
PlayerFlagHandler.cleanCache();
}
}.runTaskTimer(this, 100, 20 * 60 * 2);
}.runTaskTimer(this, 100, 20 * 60);
new BukkitRunnable() {
@Override
public void run() {
Expand Down Expand Up @@ -522,15 +527,15 @@ public void reloadSaves() {
FileInputStream fis = new FileInputStream(serverFlagsFile);
String str = ScriptHelper.convertStreamToString(fis);
fis.close();
serverFlagMap = new MapTagFlagTracker(str, CoreUtilities.noDebugContext);
serverFlagMap = new SavableMapFlagTracker(str);
}
catch (Throwable ex) {
Debug.echoError(ex);
serverFlagMap = new MapTagFlagTracker();
serverFlagMap = new SavableMapFlagTracker();
}
}
else {
serverFlagMap = new MapTagFlagTracker();
serverFlagMap = new SavableMapFlagTracker();
}
if (new File(getDataFolder(), "saves.yml").exists()) {
LegacySavesUpdater.updateLegacySaves();
Expand Down Expand Up @@ -577,6 +582,7 @@ public void saveSaves() {
catch (IOException ex) {
Logger.getLogger(JavaPlugin.class.getName()).log(Level.SEVERE, "Could not save to " + scoreboardsConfigFile, ex);
}
PlayerFlagHandler.saveAllNow();
}

@Override
Expand Down
@@ -1,33 +1,43 @@
package com.denizenscript.denizen.npc.traits;

import com.denizenscript.denizencore.flags.MapTagFlagTracker;
import com.denizenscript.denizencore.flags.SavableMapFlagTracker;
import com.denizenscript.denizencore.objects.core.MapTag;
import com.denizenscript.denizencore.utilities.CoreUtilities;
import com.denizenscript.denizencore.utilities.text.StringHolder;
import net.citizensnpcs.api.persistence.Persist;
import net.citizensnpcs.api.persistence.PersistenceLoader;
import net.citizensnpcs.api.persistence.Persister;
import net.citizensnpcs.api.trait.Trait;
import net.citizensnpcs.api.util.DataKey;

import java.util.Map;

public class DenizenFlagsTrait extends Trait {

@Persist("full_flag_data")
public MapTagFlagTracker fullFlagData = new MapTagFlagTracker();
public SavableMapFlagTracker fullFlagData = new SavableMapFlagTracker();


public static class MapTagFlagTrackerPersister implements Persister<MapTagFlagTracker> {
public static class MapTagFlagTrackerPersister implements Persister<SavableMapFlagTracker> {
@Override
public MapTagFlagTracker create(DataKey dataKey) {
return new MapTagFlagTracker(dataKey.getString(""), CoreUtilities.noDebugContext);
public SavableMapFlagTracker create(DataKey dataKey) {
SavableMapFlagTracker toRet = new SavableMapFlagTracker();
for (DataKey key : dataKey.getSubKeys()) {
toRet.setRootMap(key.name(), MapTag.valueOf(key.getString(""), CoreUtilities.errorButNoDebugContext));
}
return toRet;
}

@Override
public void save(MapTagFlagTracker o, DataKey dataKey) {
dataKey.setString("", o.toString());
public void save(SavableMapFlagTracker o, DataKey dataKey) {
for (Map.Entry<StringHolder, SavableMapFlagTracker.SaveOptimizedFlag> flag : o.map.entrySet()) {
dataKey.setString(flag.getKey().str, flag.getValue().getString());
}
}
}

static {
PersistenceLoader.registerPersistDelegate(MapTagFlagTracker.class, MapTagFlagTrackerPersister.class);
PersistenceLoader.registerPersistDelegate(SavableMapFlagTracker.class, MapTagFlagTrackerPersister.class);
}

public DenizenFlagsTrait() {
Expand Down
Expand Up @@ -8,7 +8,6 @@
import com.denizenscript.denizen.scripts.triggers.AbstractTrigger;
import com.denizenscript.denizencore.flags.AbstractFlagTracker;
import com.denizenscript.denizencore.flags.FlaggableObject;
import com.denizenscript.denizencore.flags.MapTagFlagTracker;
import com.denizenscript.denizencore.tags.ObjectTagProcessor;
import com.denizenscript.denizencore.tags.TagRunnable;
import com.denizenscript.denizencore.utilities.Deprecations;
Expand Down Expand Up @@ -152,7 +151,7 @@ public boolean hasFlag(String flag) {

@Override
public void reapplyTracker(AbstractFlagTracker tracker) {
npc.getOrAddTrait(DenizenFlagsTrait.class).fullFlagData = (MapTagFlagTracker) tracker;
// Nothing to do.
}

public NPC npc;
Expand Down
Expand Up @@ -11,12 +11,11 @@
import com.denizenscript.denizen.utilities.depends.Depends;
import com.denizenscript.denizen.utilities.entity.BossBarHelper;
import com.denizenscript.denizen.utilities.entity.FakeEntity;
import com.denizenscript.denizen.utilities.flags.DataPersistenceFlagTracker;
import com.denizenscript.denizen.utilities.flags.PlayerFlagHandler;
import com.denizenscript.denizen.utilities.packets.DenizenPacketHandler;
import com.denizenscript.denizen.utilities.packets.ItemChangeMessage;
import com.denizenscript.denizencore.flags.AbstractFlagTracker;
import com.denizenscript.denizencore.flags.FlaggableObject;
import com.denizenscript.denizencore.flags.MapTagFlagTracker;
import com.denizenscript.denizencore.objects.*;
import com.denizenscript.denizen.nms.NMSHandler;
import com.denizenscript.denizen.nms.abstracts.ImprovedOfflinePlayer;
Expand Down Expand Up @@ -224,68 +223,14 @@ public PlayerTag(Player player) {
// INSTANCE FIELDS/METHODS
/////////////////

public static class CachedPlayerFlag {

public long lastAccessed;

public AbstractFlagTracker tracker;
}

public static HashMap<UUID, CachedPlayerFlag> playerFlagTrackerCache = new HashMap<>();

private static ArrayList<UUID> toCleanFromCache = new ArrayList<>();

public static void cleanCache() {
long timeNow = System.currentTimeMillis();
for (Map.Entry<UUID, CachedPlayerFlag> entry : playerFlagTrackerCache.entrySet()) {
if (entry.getValue().lastAccessed + (5 * 60 * 1000) < timeNow) {
continue;
}
if (Bukkit.getPlayer(entry.getKey()) == null) {
entry.getValue().lastAccessed = timeNow;
continue;
}
toCleanFromCache.add(entry.getKey());
}
for (UUID id : toCleanFromCache) {
playerFlagTrackerCache.remove(id);
}
toCleanFromCache.clear();
}

@Override
public AbstractFlagTracker getFlagTracker() {
CachedPlayerFlag cached = playerFlagTrackerCache.get(getOfflinePlayer().getUniqueId());
if (cached == null) {
Player online = getPlayerEntity();
cached = new CachedPlayerFlag();
if (online != null) {
cached.tracker = new DataPersistenceFlagTracker(online);
}
else {
ImprovedOfflinePlayer helper = NMSHandler.getPlayerHelper().getOfflineData(getOfflinePlayer());
cached.tracker = new MapTagFlagTracker(helper.getRawFlagMap(), CoreUtilities.noDebugContext);
}
playerFlagTrackerCache.put(getOfflinePlayer().getUniqueId(), cached);
}
cached.lastAccessed = System.currentTimeMillis();
return cached.tracker;
return PlayerFlagHandler.getTrackerFor(getOfflinePlayer().getUniqueId());
}

@Override
public void reapplyTracker(AbstractFlagTracker tracker) {
CachedPlayerFlag cache = new CachedPlayerFlag();
cache.lastAccessed = System.currentTimeMillis();
cache.tracker = tracker;
playerFlagTrackerCache.put(getOfflinePlayer().getUniqueId(), cache);
Player online = getPlayerEntity();
if (online != null) {
// Nothing to do.
}
else {
ImprovedOfflinePlayer helper = NMSHandler.getPlayerHelper().getOfflineData(getOfflinePlayer());
helper.setRawFlagMap(tracker.toString());
}
// Nothing to do.
}

OfflinePlayer offlinePlayer;
Expand Down
Expand Up @@ -67,6 +67,7 @@ public void adjust(Mechanism mechanism) {
// @object ItemTag
// @name flag_map
// @input MapTag
// @Deprecated Internal-usage only.
// @description
// Internal-usage direct re-setter for the item's full raw flag data.
// -->
Expand Down
@@ -1,6 +1,7 @@
package com.denizenscript.denizen.utilities;

import com.denizenscript.denizen.Denizen;
import com.denizenscript.denizen.utilities.flags.PlayerFlagHandler;
import com.denizenscript.denizencore.utilities.debugging.Debug;
import com.denizenscript.denizencore.objects.core.DurationTag;
import com.denizenscript.denizencore.scripts.ScriptHelper;
Expand Down Expand Up @@ -84,6 +85,7 @@ public static void refillCache() {
cache_tagTimeoutUnsafe = config.getBoolean("Tags.Timeout when unsafe", false);
cache_warningRate = config.getLong("Tags.Warning rate", 10000);
cache_packetInterception = config.getBoolean("Packets.Interception", true);
PlayerFlagHandler.cacheTimeoutSeconds = config.getLong("Saves.Offline player cache timeout", 300);
}

private static boolean cache_showDebug = true, cache_overrideHelp, cache_useDefaultScriptPath,
Expand Down
Expand Up @@ -265,10 +265,8 @@ public void version(CommandContext args, CommandSender sender) throws CommandExc
desc = "Saves the current state of Denizen/saves.yml.", modifiers = {"save"},
min = 1, max = 3, permission = "denizen.basic", flags = "s")
public void save(CommandContext args, CommandSender sender) throws CommandException {

Denizen.getInstance().saveSaves();

Messaging.send(sender, "Denizen/saves.yml saved to disk from memory.");
Messaging.send(sender, "Denizen save data saved to disk from memory.");
}

/*
Expand Down

This file was deleted.

0 comments on commit fe73b7a

Please sign in to comment.