Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: save region selector to session store #2621

Merged
merged 3 commits into from Mar 17, 2024
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
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 @@ -23,6 +23,7 @@
import com.google.gson.GsonBuilder;
import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.math.Vector3;
import com.sk89q.worldedit.regions.RegionSelector;

/**
* Utility methods for Google's GSON library.
Expand All @@ -41,6 +42,9 @@ 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());
//FAWE end
return gsonBuilder;
}

Expand Down
@@ -0,0 +1,33 @@
package com.sk89q.worldedit.util.gson;
SirYwell marked this conversation as resolved.
Show resolved Hide resolved

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());
}

}