From e514095e8a175e22d4e45c28957ddc372bd31edb Mon Sep 17 00:00:00 2001 From: KingRainbow44 Date: Wed, 25 Jan 2023 14:00:00 +0100 Subject: [PATCH] Fix region removal checking --- .../grasscutter/game/entity/EntityRegion.java | 3 ++- .../scripts/SceneScriptManager.java | 26 +++++++++--------- .../grasscutter/scripts/data/SceneRegion.java | 27 ++++++++++++++++++- 3 files changed, 42 insertions(+), 14 deletions(-) diff --git a/src/main/java/emu/grasscutter/game/entity/EntityRegion.java b/src/main/java/emu/grasscutter/game/entity/EntityRegion.java index 6a52297b2..f65a28fdc 100644 --- a/src/main/java/emu/grasscutter/game/entity/EntityRegion.java +++ b/src/main/java/emu/grasscutter/game/entity/EntityRegion.java @@ -6,9 +6,10 @@ import emu.grasscutter.net.proto.SceneEntityInfoOuterClass; import emu.grasscutter.scripts.data.SceneRegion; import emu.grasscutter.utils.Position; import it.unimi.dsi.fastutil.ints.Int2FloatMap; +import lombok.Getter; + import java.util.Set; import java.util.concurrent.ConcurrentHashMap; -import lombok.Getter; @Getter public class EntityRegion extends GameEntity { diff --git a/src/main/java/emu/grasscutter/scripts/SceneScriptManager.java b/src/main/java/emu/grasscutter/scripts/SceneScriptManager.java index 4bbd45ff8..9e9ac3fce 100644 --- a/src/main/java/emu/grasscutter/scripts/SceneScriptManager.java +++ b/src/main/java/emu/grasscutter/scripts/SceneScriptManager.java @@ -1,7 +1,5 @@ package emu.grasscutter.scripts; -import static emu.grasscutter.scripts.constants.EventType.*; - import com.github.davidmoten.rtreemulti.RTree; import com.github.davidmoten.rtreemulti.geometry.Geometry; import emu.grasscutter.Grasscutter; @@ -28,6 +26,14 @@ import emu.grasscutter.utils.Position; import io.netty.util.concurrent.FastThreadLocalThread; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; +import kotlin.Pair; +import lombok.val; +import org.luaj.vm2.LuaError; +import org.luaj.vm2.LuaValue; +import org.luaj.vm2.lib.jse.CoerceJavaToLua; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; import java.io.FileWriter; import java.io.IOException; import java.nio.file.Files; @@ -35,13 +41,8 @@ import java.util.*; import java.util.concurrent.*; import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; -import kotlin.Pair; -import lombok.val; -import org.luaj.vm2.LuaError; -import org.luaj.vm2.LuaValue; -import org.luaj.vm2.lib.jse.CoerceJavaToLua; + +import static emu.grasscutter.scripts.constants.EventType.EVENT_TIMER_EVENT; public class SceneScriptManager { private final Scene scene; @@ -351,9 +352,10 @@ public class SceneScriptManager { } public synchronized void deregisterRegion(SceneRegion region) { - var instance = - regions.values().stream().filter(r -> r.getConfigId() == region.config_id).findFirst(); - instance.ifPresent(entityRegion -> regions.remove(entityRegion.getId())); + this.regions.values().stream() + .filter(r -> r.getMetaRegion().equals(region)) + .findFirst() + .ifPresent(entityRegion -> this.regions.remove(entityRegion.getId())); } public Map> getLoadedGroupSetPerBlock() { diff --git a/src/main/java/emu/grasscutter/scripts/data/SceneRegion.java b/src/main/java/emu/grasscutter/scripts/data/SceneRegion.java index 3c43037ed..1c02c25d3 100644 --- a/src/main/java/emu/grasscutter/scripts/data/SceneRegion.java +++ b/src/main/java/emu/grasscutter/scripts/data/SceneRegion.java @@ -2,9 +2,10 @@ package emu.grasscutter.scripts.data; import emu.grasscutter.scripts.constants.ScriptRegionShape; import emu.grasscutter.utils.Position; -import java.util.List; import lombok.Setter; +import java.util.List; + @Setter public class SceneRegion { public int config_id; @@ -20,6 +21,13 @@ public class SceneRegion { public transient SceneGroup group; + /** + * @return The group ID for this region. + */ + public int getGroupId() { + return this.group == null ? -1 : this.group.id; + } + public boolean contains(Position position) { switch (shape) { case ScriptRegionShape.CUBIC: @@ -35,4 +43,21 @@ public class SceneRegion { } return false; } + + /** + * Checks if two regions are the same. + * + * @param region The region to compare to. + * @return True if the regions are the same, false otherwise. + */ + public boolean equals(SceneRegion region) { + return this.config_id == region.config_id + && this.shape == region.shape + && this.pos.equals(region.pos) + && this.size.equals(region.size) + && this.radius == region.radius + && this.area_id == region.area_id + && this.height == region.height + && this.point_array.equals(region.point_array); + } }