Skip to content

Commit

Permalink
Automatic flag cleaning
Browse files Browse the repository at this point in the history
  • Loading branch information
mcmonkey4eva committed Dec 21, 2020
1 parent 155fa34 commit 31ced8a
Show file tree
Hide file tree
Showing 7 changed files with 60 additions and 4 deletions.
13 changes: 10 additions & 3 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.DataPersistenceFlagTracker;
import com.denizenscript.denizen.utilities.flags.PlayerFlagHandler;
import com.denizenscript.denizen.utilities.implementation.DenizenCoreImplementation;
import com.denizenscript.denizen.utilities.maps.DenizenMapManager;
Expand All @@ -41,6 +42,7 @@
import com.denizenscript.denizen.npc.DenizenNPCHelper;
import com.denizenscript.denizencore.DenizenCore;
import com.denizenscript.denizencore.events.OldEventManager;
import com.denizenscript.denizencore.flags.MapTagBasedFlagTracker;
import com.denizenscript.denizencore.flags.SavableMapFlagTracker;
import com.denizenscript.denizencore.objects.ObjectFetcher;
import com.denizenscript.denizencore.scripts.ScriptHelper;
Expand All @@ -51,9 +53,7 @@
import com.denizenscript.denizencore.utilities.debugging.SlowWarning;
import com.denizenscript.denizencore.utilities.debugging.StrongWarning;
import com.denizenscript.denizencore.utilities.text.ConfigUpdater;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.OfflinePlayer;
import org.bukkit.*;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.file.FileConfiguration;
Expand Down Expand Up @@ -415,6 +415,13 @@ public void run() {
}
}, 1, 1);
InventoryTag.setupInventoryTracker();
if (!MapTagBasedFlagTracker.skipAllCleanings) {
for (World world : Bukkit.getWorlds()) {
for (Chunk chunk : world.getLoadedChunks()) {
new DataPersistenceFlagTracker(chunk).doTotalClean();
}
}
}
}
catch (Exception e) {
Debug.echoError(e);
Expand Down
Expand Up @@ -25,6 +25,7 @@ public SavableMapFlagTracker create(DataKey dataKey) {
for (DataKey key : dataKey.getSubKeys()) {
toRet.setRootMap(key.name(), MapTag.valueOf(key.getString(""), CoreUtilities.errorButNoDebugContext));
}
toRet.doTotalClean();
return toRet;
}

Expand Down
Expand Up @@ -13,6 +13,7 @@
import com.denizenscript.denizen.utilities.entity.FakeEntity;
import com.denizenscript.denizen.utilities.flags.DataPersistenceFlagTracker;
import com.denizenscript.denizen.utilities.nbt.CustomNBT;
import com.denizenscript.denizencore.DenizenCore;
import com.denizenscript.denizencore.flags.AbstractFlagTracker;
import com.denizenscript.denizencore.flags.FlaggableObject;
import com.denizenscript.denizencore.objects.*;
Expand Down Expand Up @@ -427,10 +428,14 @@ public AbstractFlagTracker getFlagTracker() {

@Override
public void reapplyTracker(AbstractFlagTracker tracker) {
// Nothing to do.
if (cleanRateProtect + 60000 > DenizenCore.serverTimeMillis) {
((DataPersistenceFlagTracker) tracker).doTotalClean();
cleanRateProtect = DenizenCore.serverTimeMillis;
}
}

public Entity entity = null;
public long cleanRateProtect = -60000;
public DenizenEntityType entity_type = null;
private String data1 = null;
private DespawnedEntity despawned_entity = null;
Expand Down
Expand Up @@ -7,6 +7,8 @@
import com.denizenscript.denizen.utilities.ScoreboardHelper;
import com.denizenscript.denizen.utilities.debugging.Debug;
import com.denizenscript.denizen.utilities.Settings;
import com.denizenscript.denizen.utilities.flags.DataPersistenceFlagTracker;
import com.denizenscript.denizencore.flags.MapTagBasedFlagTracker;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.World;
Expand All @@ -17,6 +19,7 @@
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerLoginEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.event.world.ChunkLoadEvent;
import org.bukkit.scoreboard.Scoreboard;

import java.util.HashMap;
Expand Down Expand Up @@ -109,4 +112,12 @@ public void playerLogin(PlayerLoginEvent event) {
public void playerQuit(PlayerQuitEvent event) {
NMSHandler.getPacketHelper().removeNoCollideTeam(event.getPlayer(), null);
}

@EventHandler
public void chunkLoadEvent(ChunkLoadEvent event) {
if (MapTagBasedFlagTracker.skipAllCleanings) {
return;
}
new DataPersistenceFlagTracker(event.getChunk()).doTotalClean();
}
}
Expand Up @@ -2,6 +2,7 @@

import com.denizenscript.denizen.Denizen;
import com.denizenscript.denizen.utilities.flags.PlayerFlagHandler;
import com.denizenscript.denizencore.flags.MapTagBasedFlagTracker;
import com.denizenscript.denizencore.utilities.debugging.Debug;
import com.denizenscript.denizencore.objects.core.DurationTag;
import com.denizenscript.denizencore.scripts.ScriptHelper;
Expand Down Expand Up @@ -87,6 +88,7 @@ public static void refillCache() {
cache_packetInterception = config.getBoolean("Packets.Interception", true);
PlayerFlagHandler.cacheTimeoutSeconds = config.getLong("Saves.Offline player cache timeout", 300);
PlayerFlagHandler.asyncPreload = config.getBoolean("Saves.Load async on login", true);
MapTagBasedFlagTracker.skipAllCleanings = config.getBoolean("Saves.Skip flag cleaning", false);
}

private static boolean cache_showDebug = true, cache_overrideHelp, cache_useDefaultScriptPath,
Expand Down
Expand Up @@ -2,8 +2,10 @@

import com.denizenscript.denizen.utilities.DataPersistenceHelper;
import com.denizenscript.denizencore.flags.MapTagBasedFlagTracker;
import com.denizenscript.denizencore.objects.ObjectTag;
import com.denizenscript.denizencore.objects.core.MapTag;
import com.denizenscript.denizencore.utilities.CoreUtilities;
import org.bukkit.NamespacedKey;
import org.bukkit.persistence.PersistentDataHolder;

import java.util.Collection;
Expand Down Expand Up @@ -44,4 +46,29 @@ public Collection<String> listAllFlags() {
.filter(k -> k.getNamespace().equals("denizen") && k.getKey().startsWith(keyPrefix))
.map(k -> k.getKey().substring(keyPrefix.length())).collect(Collectors.toList());
}

public void doTotalClean() {
if (MapTagBasedFlagTracker.skipAllCleanings) {
return;
}
for (NamespacedKey key : holder.getPersistentDataContainer().getKeys()) {
if (!key.getNamespace().equals("denizen") || !key.getKey().startsWith("flag_")) {
continue;
}
ObjectTag map = holder.getPersistentDataContainer().get(key, DataPersistenceHelper.PERSISTER_TYPE);
if (!(map instanceof MapTag)) {
continue;
}
if (isExpired(((MapTag) map).map.get(expirationString))) {
holder.getPersistentDataContainer().remove(key);
continue;
}
ObjectTag subValue = ((MapTag) map).map.get(valueString);
if (subValue instanceof MapTag) {
if (doClean((MapTag) subValue)) {
holder.getPersistentDataContainer().set(key, DataPersistenceHelper.PERSISTER_TYPE, map);
}
}
}
}
}
3 changes: 3 additions & 0 deletions plugin/src/main/resources/config.yml
Expand Up @@ -184,6 +184,9 @@ Saves:
Offline player cache timeout: 300
# When set to 'true', player data will be loaded offthread during the login sequence, to avoid adding load to the server while players join.
Load async on login: true
# When set to 'true', all automatic flag cleanups will be skipped.
# This might save some processing time on servers that rarely use flag expirations, but otherwise should be left as 'false'.
Skip flag cleaning: false

Packets:
# Whether to allow Denizen to intercept packets from and to player clients.
Expand Down

0 comments on commit 31ced8a

Please sign in to comment.