Preserve player-set side effects

This commit is contained in:
Madeline Miller 2023-07-22 14:45:58 +10:00
parent ff8e5054f5
commit 09d22c52a1
No known key found for this signature in database
GPG Key ID: B8EA2E5693115D81
3 changed files with 40 additions and 3 deletions

View File

@ -107,7 +107,6 @@ public class LocalSession {
private transient boolean useInventory;
private transient com.sk89q.worldedit.world.snapshot.Snapshot snapshot;
private transient Snapshot snapshotExperimental;
private transient SideEffectSet sideEffectSet = SideEffectSet.defaults();
private transient Mask mask;
private transient ZoneId timezone = ZoneId.systemDefault();
private transient BlockVector3 cuiTemporaryBlock;
@ -127,6 +126,7 @@ public class LocalSession {
private Boolean wandItemDefault;
private String navWandItem;
private Boolean navWandItemDefault;
private SideEffectSet sideEffectSet = SideEffectSet.defaults();
/**
* Construct the object.
@ -1159,6 +1159,7 @@ public SideEffectSet getSideEffectSet() {
*/
public void setSideEffectSet(SideEffectSet sideEffectSet) {
this.sideEffectSet = sideEffectSet;
setDirty();
}
/**
@ -1178,7 +1179,7 @@ public boolean hasFastMode() {
*/
@Deprecated
public void setFastMode(boolean fastMode) {
this.sideEffectSet = fastMode ? SideEffectSet.none() : SideEffectSet.defaults();
setSideEffectSet(fastMode ? SideEffectSet.none() : SideEffectSet.defaults());
}
/**

View File

@ -25,6 +25,7 @@
import com.google.gson.JsonParseException;
import com.sk89q.worldedit.LocalSession;
import com.sk89q.worldedit.internal.util.LogManagerCompat;
import com.sk89q.worldedit.util.SideEffectSet;
import com.sk89q.worldedit.util.gson.GsonUtil;
import org.apache.logging.log4j.Logger;
@ -77,7 +78,9 @@ public JsonFileSessionStore(Path dir) {
this.dir = dir;
GsonBuilder builder = GsonUtil.createBuilder();
gson = builder.create();
gson = builder
.registerTypeAdapter(SideEffectSet.class, new SideEffectSet.GsonSerializer())
.create();
}
/**

View File

@ -21,7 +21,16 @@
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Maps;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParseException;
import com.google.gson.JsonPrimitive;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;
import java.lang.reflect.Type;
import java.util.Arrays;
import java.util.EnumMap;
import java.util.Map;
@ -91,4 +100,28 @@ public static SideEffectSet defaults() {
public static SideEffectSet none() {
return NONE;
}
public static class GsonSerializer implements JsonSerializer<SideEffectSet>, JsonDeserializer<SideEffectSet> {
@Override
public SideEffectSet deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
Map<SideEffect, SideEffect.State> sideEffects = Maps.newEnumMap(SideEffect.class);
JsonObject obj = json.getAsJsonObject();
for (Map.Entry<String, JsonElement> stringJsonElementEntry : obj.entrySet()) {
SideEffect sideEffect = SideEffect.valueOf(stringJsonElementEntry.getKey());
SideEffect.State state = SideEffect.State.valueOf(stringJsonElementEntry.getValue().getAsString());
sideEffects.put(sideEffect, state);
}
return new SideEffectSet(sideEffects);
}
@Override
public JsonElement serialize(SideEffectSet src, Type typeOfSrc, JsonSerializationContext context) {
JsonObject obj = new JsonObject();
for (Map.Entry<SideEffect, SideEffect.State> entry : src.sideEffects.entrySet()) {
obj.add(entry.getKey().name(), new JsonPrimitive(entry.getValue().name()));
}
return obj;
}
}
}