Skip to content

Commit

Permalink
feat: save region selector to session store (#2621)
Browse files Browse the repository at this point in the history
* feat: save region selector to session store
 - closes #2397

* Move new gson adapters to FAWE packages
  • Loading branch information
dordsor21 committed Mar 17, 2024
1 parent b93f01c commit b512182
Show file tree
Hide file tree
Showing 6 changed files with 79 additions and 11 deletions.
@@ -1,4 +1,4 @@
package com.sk89q.worldedit.util.gson;
package com.fastasyncworldedit.core.util.gson;

import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
Expand Down
@@ -0,0 +1,33 @@
package com.fastasyncworldedit.core.util.gson;

import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonParseException;
import com.google.gson.JsonPrimitive;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;
import com.sk89q.worldedit.regions.RegionSelector;
import com.sk89q.worldedit.regions.selector.RegionSelectorType;

import java.lang.reflect.Type;

public class RegionSelectorAdapter implements JsonDeserializer<RegionSelector>, JsonSerializer<RegionSelector> {

@Override
public RegionSelector deserialize(JsonElement json, Type type, JsonDeserializationContext context) throws JsonParseException {
RegionSelectorType regionType = RegionSelectorType.valueOf(json.getAsString());
return regionType.createSelector();
}

@Override
public JsonElement serialize(RegionSelector selector, Type type, JsonSerializationContext context) {
RegionSelectorType regionType = RegionSelectorType.getForSelector(selector);
// Cannot nicely deserialize Fuzzy region type
if (regionType == null || regionType == RegionSelectorType.FUZZY) {
return null;
}
return new JsonPrimitive(regionType.toString());
}

}
Expand Up @@ -125,7 +125,9 @@ public class LocalSession implements TextureHolder {
private transient int cuiVersion = CUI_VERSION_UNINITIALIZED;

// Session related
private transient RegionSelector selector = new CuboidRegionSelector();
//FAWE start - allow saving to session store
private RegionSelector selector = new CuboidRegionSelector();
//FAWE end
private transient boolean placeAtPos1 = false;
//FAWE start
private final transient List<Object> history = Collections.synchronizedList(new LinkedList<>() {
Expand Down Expand Up @@ -771,6 +773,7 @@ public void setRegionSelector(World world, RegionSelector selector) {
checkNotNull(selector);
selector.setWorld(world);
this.selector = selector;
setDirty();
if (hasWorldOverride() && !world.equals(getWorldOverride())) {
setWorldOverride(null);
}
Expand Down
Expand Up @@ -755,13 +755,7 @@ public void select(
}

if (setDefaultSelector) {
RegionSelectorType found = null;
for (RegionSelectorType type : RegionSelectorType.values()) {
if (type.getSelectorClass() == newSelector.getClass()) {
found = type;
break;
}
}
RegionSelectorType found = RegionSelectorType.getForSelector(newSelector);

if (found != null) {
session.setDefaultRegionSelector(found);
Expand Down
Expand Up @@ -19,8 +19,14 @@

package com.sk89q.worldedit.regions.selector;

import com.fastasyncworldedit.core.regions.selector.FuzzyRegionSelector;
import com.fastasyncworldedit.core.regions.selector.PolyhedralRegionSelector;
import com.sk89q.worldedit.regions.RegionSelector;

import javax.annotation.Nullable;
import java.util.HashMap;
import java.util.Map;

/**
* An enum of default region selector types.
*/
Expand All @@ -32,14 +38,41 @@ public enum RegionSelectorType {
SPHERE(SphereRegionSelector.class),
ELLIPSOID(EllipsoidRegionSelector.class),
POLYGON(Polygonal2DRegionSelector.class),
CONVEX_POLYHEDRON(ConvexPolyhedralRegionSelector.class);
CONVEX_POLYHEDRON(ConvexPolyhedralRegionSelector.class),
//FAWE start
POLYHEDRAL(PolyhedralRegionSelector.class),
FUZZY(FuzzyRegionSelector.class);
//FAWE end

//FAWE start
private static final Map<Class<? extends RegionSelector>, RegionSelectorType> VALUE_MAP = new HashMap<>();

static {
for (RegionSelectorType type : values()) {
VALUE_MAP.put(type.getSelectorClass(), type);
}
}
//FAWE end

private final Class<? extends RegionSelector> selectorClass;

RegionSelectorType(Class<? extends RegionSelector> selectorClass) {
this.selectorClass = selectorClass;
}

//FAWE start
/**
* Get a {@link RegionSelectorType} for the given {@link RegionSelector}
*
* @param selector Region selector to get type enum for
* @since TODO
*/
@Nullable
public static RegionSelectorType getForSelector(RegionSelector selector) {
return VALUE_MAP.get(selector.getClass());
}
//FAWE end

/**
* Get the selector class.
*
Expand Down
Expand Up @@ -19,12 +19,14 @@

package com.sk89q.worldedit.util.gson;

import com.fastasyncworldedit.core.util.gson.ItemTypeAdapter;
import com.fastasyncworldedit.core.util.gson.RegionSelectorAdapter;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.math.Vector3;
import com.sk89q.worldedit.regions.RegionSelector;
import com.sk89q.worldedit.world.item.ItemType;
import com.sk89q.worldedit.world.item.ItemTypes;

/**
* Utility methods for Google's GSON library.
Expand All @@ -43,7 +45,10 @@ public static GsonBuilder createBuilder() {
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(Vector3.class, new VectorAdapter());
gsonBuilder.registerTypeAdapter(BlockVector3.class, new BlockVectorAdapter());
//FAWE start
gsonBuilder.registerTypeAdapter(RegionSelector.class, new RegionSelectorAdapter());
gsonBuilder.registerTypeAdapter(ItemType.class, new ItemTypeAdapter());
//FAWE end
return gsonBuilder;
}

Expand Down

0 comments on commit b512182

Please sign in to comment.