/
LegacySavesUpdater.java
127 lines (122 loc) · 6.92 KB
/
LegacySavesUpdater.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
package com.denizenscript.denizen.utilities;
import com.denizenscript.denizen.Denizen;
import com.denizenscript.denizen.objects.NPCTag;
import com.denizenscript.denizen.objects.PlayerTag;
import com.denizenscript.denizen.utilities.debugging.Debug;
import com.denizenscript.denizencore.flags.AbstractFlagTracker;
import com.denizenscript.denizencore.objects.ObjectTag;
import com.denizenscript.denizencore.objects.core.ElementTag;
import com.denizenscript.denizencore.objects.core.TimeTag;
import com.denizenscript.denizencore.utilities.CoreUtilities;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.scheduler.BukkitRunnable;
import java.io.File;
import java.util.UUID;
public class LegacySavesUpdater {
public static void updateLegacySaves() {
Debug.log("==== UPDATING LEGACY SAVES TO NEW FLAG ENGINE ====");
File savesFile = new File(Denizen.getInstance().getDataFolder(), "saves.yml");
FileConfiguration saveSection = YamlConfiguration.loadConfiguration(savesFile);
savesFile.renameTo(new File(Denizen.getInstance().getDataFolder(), "saves.yml.bak"));
if (saveSection.contains("Global")) {
Debug.log("==== Update global data ====");
ConfigurationSection globalSection = saveSection.getConfigurationSection("Global");
if (globalSection.contains("Flags")) {
applyFlags(Denizen.getInstance().serverFlagMap, globalSection.getConfigurationSection("Flags"));
}
if (globalSection.contains("Scripts")) {
ConfigurationSection scriptsSection = globalSection.getConfigurationSection("Scripts");
for (String script : scriptsSection.getKeys(false)) {
ConfigurationSection scriptSection = scriptsSection.getConfigurationSection(script);
if (scriptSection.contains("Cooldown Time")) {
long time = scriptSection.getLong("Cooldown Time");
TimeTag cooldown = new TimeTag(time);
Denizen.getInstance().serverFlagMap.setFlag("__interact_cooldown." + script, cooldown, cooldown);
}
}
}
}
if (saveSection.contains("Players")) {
Debug.log("==== Update player data ====");
ConfigurationSection playerSection = saveSection.getConfigurationSection("Players");
for (String plPrefix : playerSection.getKeys(false)) {
ConfigurationSection subSection = playerSection.getConfigurationSection(plPrefix);
for (String uuidString : subSection.getKeys(false)) {
UUID id = UUID.fromString(uuidString.substring(0, 8) + "-" + uuidString.substring(8, 12) + "-" + uuidString.substring(12, 16) + "-" + uuidString.substring(16, 20) + "-" + uuidString.substring(20, 32));
PlayerTag player = PlayerTag.valueOf(id.toString(), CoreUtilities.errorButNoDebugContext);
if (player == null) {
Debug.echoError("Cannot update data for player with id: " + uuidString);
continue;
}
ConfigurationSection actual = subSection.getConfigurationSection(uuidString);
AbstractFlagTracker tracker = player.getFlagTracker();
if (actual.contains("Flags")) {
applyFlags(tracker, actual.getConfigurationSection("Flags"));
}
if (actual.contains("Scripts")) {
ConfigurationSection scriptsSection = actual.getConfigurationSection("Scripts");
for (String script : scriptsSection.getKeys(false)) {
ConfigurationSection scriptSection = scriptsSection.getConfigurationSection(script);
if (scriptSection.contains("Current Step")) {
tracker.setFlag("__interact_step." + script, new ElementTag(scriptSection.getString("Current Step")), null);
}
if (scriptSection.contains("Cooldown Time")) {
long time = scriptSection.getLong("Cooldown Time");
TimeTag cooldown = new TimeTag(time);
tracker.setFlag("__interact_cooldown." + script, cooldown, cooldown);
}
}
}
player.reapplyTracker(tracker);
}
}
}
if (saveSection.contains("NPCs")) {
final ConfigurationSection npcsSection = saveSection.getConfigurationSection("NPCs");
new BukkitRunnable() {
@Override
public void run() {
Debug.log("==== Late update NPC data ====");
for (String npcId : npcsSection.getKeys(false)) {
ConfigurationSection actual = npcsSection.getConfigurationSection(npcId);
NPCTag npc = NPCTag.valueOf(npcId, CoreUtilities.errorButNoDebugContext);
if (npc == null) {
Debug.echoError("Cannot update data for NPC with id: " + npcId);
continue;
}
AbstractFlagTracker tracker = npc.getFlagTracker();
if (actual.contains("Flags")) {
applyFlags(tracker, actual.getConfigurationSection("Flags"));
}
npc.reapplyTracker(tracker);
Debug.log("==== Done late-updating NPC data ====");
}
}
}.runTaskLater(Denizen.getInstance(), 3);
}
Denizen.getInstance().saveSaves();
Debug.log("==== Done updating legacy saves (except NPCs) ====");
}
public static void applyFlags(AbstractFlagTracker tracker, ConfigurationSection section) {
try {
for (String flagName : section.getKeys(false)) {
if (flagName.endsWith("-expiration")) {
continue;
}
TimeTag expireAt = null;
if (section.contains(flagName + "-expiration")) {
long expireTime = section.getLong(flagName + "-expiration");
expireAt = new TimeTag(expireTime);
}
Object value = section.get(flagName);
ObjectTag setAs = CoreUtilities.objectToTagForm(value, CoreUtilities.errorButNoDebugContext);
tracker.setFlag(flagName, setAs, expireAt);
}
}
catch (Throwable ex) {
Debug.echoError(ex);
}
}
}