mirror of
https://github.com/Xiao-MoMi/craft-engine.git
synced 2025-12-19 15:09:15 +00:00
添加wg区域条件
This commit is contained in:
@@ -70,6 +70,8 @@ dependencies {
|
|||||||
compileOnly("com.github.Archy-X:AureliumSkills:Beta1.3.21")
|
compileOnly("com.github.Archy-X:AureliumSkills:Beta1.3.21")
|
||||||
// Zaphkiel
|
// Zaphkiel
|
||||||
compileOnly("ink.ptms:ZaphkielAPI:2.1.0")
|
compileOnly("ink.ptms:ZaphkielAPI:2.1.0")
|
||||||
|
// WorldGuard
|
||||||
|
compileOnly(files("${rootProject.rootDir}/libs/worldguard-bukkit-7.0.14-dist.jar"))
|
||||||
}
|
}
|
||||||
|
|
||||||
java {
|
java {
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ import net.momirealms.craftengine.bukkit.compatibility.mythicmobs.MythicItemDrop
|
|||||||
import net.momirealms.craftengine.bukkit.compatibility.mythicmobs.MythicSkillHelper;
|
import net.momirealms.craftengine.bukkit.compatibility.mythicmobs.MythicSkillHelper;
|
||||||
import net.momirealms.craftengine.bukkit.compatibility.papi.PlaceholderAPIUtils;
|
import net.momirealms.craftengine.bukkit.compatibility.papi.PlaceholderAPIUtils;
|
||||||
import net.momirealms.craftengine.bukkit.compatibility.permission.LuckPermsEventListeners;
|
import net.momirealms.craftengine.bukkit.compatibility.permission.LuckPermsEventListeners;
|
||||||
|
import net.momirealms.craftengine.bukkit.compatibility.region.WorldGuardRegionCondition;
|
||||||
import net.momirealms.craftengine.bukkit.compatibility.skript.SkriptHook;
|
import net.momirealms.craftengine.bukkit.compatibility.skript.SkriptHook;
|
||||||
import net.momirealms.craftengine.bukkit.compatibility.slimeworld.SlimeFormatStorageAdaptor;
|
import net.momirealms.craftengine.bukkit.compatibility.slimeworld.SlimeFormatStorageAdaptor;
|
||||||
import net.momirealms.craftengine.bukkit.compatibility.viaversion.ViaVersionUtils;
|
import net.momirealms.craftengine.bukkit.compatibility.viaversion.ViaVersionUtils;
|
||||||
@@ -20,9 +21,13 @@ import net.momirealms.craftengine.bukkit.item.BukkitItemManager;
|
|||||||
import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine;
|
import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine;
|
||||||
import net.momirealms.craftengine.core.entity.furniture.ExternalModel;
|
import net.momirealms.craftengine.core.entity.furniture.ExternalModel;
|
||||||
import net.momirealms.craftengine.core.entity.player.Player;
|
import net.momirealms.craftengine.core.entity.player.Player;
|
||||||
|
import net.momirealms.craftengine.core.loot.LootConditions;
|
||||||
import net.momirealms.craftengine.core.plugin.compatibility.CompatibilityManager;
|
import net.momirealms.craftengine.core.plugin.compatibility.CompatibilityManager;
|
||||||
import net.momirealms.craftengine.core.plugin.compatibility.LevelerProvider;
|
import net.momirealms.craftengine.core.plugin.compatibility.LevelerProvider;
|
||||||
import net.momirealms.craftengine.core.plugin.compatibility.ModelProvider;
|
import net.momirealms.craftengine.core.plugin.compatibility.ModelProvider;
|
||||||
|
import net.momirealms.craftengine.core.plugin.context.condition.AlwaysFalseCondition;
|
||||||
|
import net.momirealms.craftengine.core.plugin.context.condition.AlwaysTrueCondition;
|
||||||
|
import net.momirealms.craftengine.core.plugin.context.event.EventConditions;
|
||||||
import net.momirealms.craftengine.core.util.Key;
|
import net.momirealms.craftengine.core.util.Key;
|
||||||
import net.momirealms.craftengine.core.util.VersionHelper;
|
import net.momirealms.craftengine.core.util.VersionHelper;
|
||||||
import net.momirealms.craftengine.core.world.WorldManager;
|
import net.momirealms.craftengine.core.world.WorldManager;
|
||||||
@@ -117,6 +122,15 @@ public class BukkitCompatibilityManager implements CompatibilityManager {
|
|||||||
new MythicItemDropListener(this.plugin);
|
new MythicItemDropListener(this.plugin);
|
||||||
logHook("MythicMobs");
|
logHook("MythicMobs");
|
||||||
}
|
}
|
||||||
|
Key worldGuardRegion = Key.of("worldguard:region");
|
||||||
|
if (this.isPluginEnabled("WorldGuard")) {
|
||||||
|
EventConditions.register(worldGuardRegion, new WorldGuardRegionCondition.FactoryImpl<>());
|
||||||
|
LootConditions.register(worldGuardRegion, new WorldGuardRegionCondition.FactoryImpl<>());
|
||||||
|
logHook("WorldGuard");
|
||||||
|
} else {
|
||||||
|
EventConditions.register(worldGuardRegion, new AlwaysFalseCondition.FactoryImpl<>());
|
||||||
|
LootConditions.register(worldGuardRegion, new AlwaysFalseCondition.FactoryImpl<>());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -0,0 +1,95 @@
|
|||||||
|
package net.momirealms.craftengine.bukkit.compatibility.region;
|
||||||
|
|
||||||
|
import com.sk89q.worldedit.bukkit.BukkitAdapter;
|
||||||
|
import com.sk89q.worldedit.math.BlockVector3;
|
||||||
|
import com.sk89q.worldguard.WorldGuard;
|
||||||
|
import com.sk89q.worldguard.protection.ApplicableRegionSet;
|
||||||
|
import com.sk89q.worldguard.protection.managers.RegionManager;
|
||||||
|
import com.sk89q.worldguard.protection.regions.ProtectedRegion;
|
||||||
|
import net.momirealms.craftengine.core.plugin.context.Condition;
|
||||||
|
import net.momirealms.craftengine.core.plugin.context.Context;
|
||||||
|
import net.momirealms.craftengine.core.plugin.context.condition.ConditionFactory;
|
||||||
|
import net.momirealms.craftengine.core.plugin.context.parameter.DirectContextParameters;
|
||||||
|
import net.momirealms.craftengine.core.util.Key;
|
||||||
|
import net.momirealms.craftengine.core.util.MiscUtils;
|
||||||
|
import net.momirealms.craftengine.core.util.ResourceConfigUtils;
|
||||||
|
import net.momirealms.craftengine.core.world.WorldPosition;
|
||||||
|
import org.bukkit.World;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
import java.util.function.BiFunction;
|
||||||
|
import java.util.function.Predicate;
|
||||||
|
|
||||||
|
public class WorldGuardRegionCondition<CTX extends Context> implements Condition<CTX> {
|
||||||
|
private static final Key TYPE = Key.of("worldguard:region");
|
||||||
|
private final MatchMode mode;
|
||||||
|
private final List<String> regions;
|
||||||
|
|
||||||
|
public WorldGuardRegionCondition(MatchMode mode, List<String> regions) {
|
||||||
|
this.mode = mode;
|
||||||
|
this.regions = regions;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean test(CTX ctx) {
|
||||||
|
if (this.regions.isEmpty()) return false;
|
||||||
|
Optional<WorldPosition> optionalPos = ctx.getOptionalParameter(DirectContextParameters.POSITION);
|
||||||
|
if (optionalPos.isEmpty()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
WorldPosition position = optionalPos.get();
|
||||||
|
RegionManager regionManager = WorldGuard.getInstance().getPlatform().getRegionContainer().get(BukkitAdapter.adapt((World) position.world().platformWorld()));
|
||||||
|
if (regionManager != null) {
|
||||||
|
ApplicableRegionSet set = regionManager.getApplicableRegions(BlockVector3.at(position.x(), position.y(), position.z()));
|
||||||
|
List<String> regionsAtThisPos = new ArrayList<>(set.size());
|
||||||
|
for (ProtectedRegion region : set) {
|
||||||
|
String id = region.getId();
|
||||||
|
regionsAtThisPos.add(id);
|
||||||
|
}
|
||||||
|
Predicate<String> predicate = regionsAtThisPos::contains;
|
||||||
|
return this.mode.matcher.apply(predicate, this.regions);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Key type() {
|
||||||
|
return TYPE;
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum MatchMode {
|
||||||
|
ANY((p, regions) -> {
|
||||||
|
for (String region : regions) {
|
||||||
|
if (p.test(region)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}),
|
||||||
|
ALL((p, regions) -> {
|
||||||
|
for (String region : regions) {
|
||||||
|
if (!p.test(region)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
|
||||||
|
private final BiFunction<Predicate<String>, List<String>, Boolean> matcher;
|
||||||
|
|
||||||
|
MatchMode(BiFunction<Predicate<String>, List<String>, Boolean> matcher) {
|
||||||
|
this.matcher = matcher;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class FactoryImpl<CTX extends Context> implements ConditionFactory<CTX> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Condition<CTX> create(Map<String, Object> arguments) {
|
||||||
|
int mode = ResourceConfigUtils.getAsInt(arguments.getOrDefault("mode", 1), "mode") - 1;
|
||||||
|
MatchMode matchMode = MatchMode.values()[mode];
|
||||||
|
List<String> regions = MiscUtils.getAsStringList(arguments.get("regions"));
|
||||||
|
return new WorldGuardRegionCondition<>(matchMode, regions);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
package net.momirealms.craftengine.core.plugin.context.condition;
|
||||||
|
|
||||||
|
import net.momirealms.craftengine.core.plugin.context.Condition;
|
||||||
|
import net.momirealms.craftengine.core.plugin.context.Context;
|
||||||
|
import net.momirealms.craftengine.core.util.Key;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public class AlwaysFalseCondition<CTX extends Context> implements Condition<CTX> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Key type() {
|
||||||
|
return CommonConditions.ALWAYS_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class FactoryImpl<CTX extends Context> implements ConditionFactory<CTX> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Condition<CTX> create(Map<String, Object> arguments) {
|
||||||
|
return new AlwaysFalseCondition<>();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -6,11 +6,11 @@ import net.momirealms.craftengine.core.util.Key;
|
|||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
public class EmptyCondition<CTX extends Context> implements Condition<CTX> {
|
public class AlwaysTrueCondition<CTX extends Context> implements Condition<CTX> {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Key type() {
|
public Key type() {
|
||||||
return CommonConditions.EMPTY;
|
return CommonConditions.ALWAYS_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -22,7 +22,7 @@ public class EmptyCondition<CTX extends Context> implements Condition<CTX> {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Condition<CTX> create(Map<String, Object> arguments) {
|
public Condition<CTX> create(Map<String, Object> arguments) {
|
||||||
return new EmptyCondition<>();
|
return new AlwaysTrueCondition<>();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -5,7 +5,8 @@ import net.momirealms.craftengine.core.util.Key;
|
|||||||
public final class CommonConditions {
|
public final class CommonConditions {
|
||||||
private CommonConditions() {}
|
private CommonConditions() {}
|
||||||
|
|
||||||
public static final Key EMPTY = Key.of("craftengine:empty");
|
public static final Key ALWAYS_TRUE = Key.of("craftengine:always_true");
|
||||||
|
public static final Key ALWAYS_FALSE = Key.of("craftengine:always_false");
|
||||||
public static final Key ALL_OF = Key.of("craftengine:all_of");
|
public static final Key ALL_OF = Key.of("craftengine:all_of");
|
||||||
public static final Key ANY_OF = Key.of("craftengine:any_of");
|
public static final Key ANY_OF = Key.of("craftengine:any_of");
|
||||||
public static final Key INVERTED = Key.of("craftengine:inverted");
|
public static final Key INVERTED = Key.of("craftengine:inverted");
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ public class ExpressionCondition<CTX extends Context> implements Condition<CTX>
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean test(CTX ctx) {
|
public boolean test(CTX ctx) {
|
||||||
String exp = expression.get(ctx);
|
String exp = this.expression.get(ctx);
|
||||||
Expression expr = new Expression(exp);
|
Expression expr = new Expression(exp);
|
||||||
try {
|
try {
|
||||||
return expr.evaluate().getBooleanValue();
|
return expr.evaluate().getBooleanValue();
|
||||||
|
|||||||
@@ -60,7 +60,10 @@ public class CEChunk {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void removeBlockEntity(BlockPos blockPos) {
|
public void removeBlockEntity(BlockPos blockPos) {
|
||||||
|
BlockEntity removedBlockEntity = this.blockEntities.remove(blockPos);
|
||||||
|
if (removedBlockEntity != null) {
|
||||||
|
removedBlockEntity.setValid(false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setBlockEntity(BlockEntity blockEntity) {
|
public void setBlockEntity(BlockEntity blockEntity) {
|
||||||
@@ -84,11 +87,27 @@ public class CEChunk {
|
|||||||
public BlockEntity getBlockEntity(BlockPos pos) {
|
public BlockEntity getBlockEntity(BlockPos pos) {
|
||||||
BlockEntity blockEntity = this.blockEntities.get(pos);
|
BlockEntity blockEntity = this.blockEntities.get(pos);
|
||||||
if (blockEntity == null) {
|
if (blockEntity == null) {
|
||||||
|
blockEntity = createBlockEntity(pos);
|
||||||
|
if (blockEntity != null) {
|
||||||
|
this.addBlockEntity(blockEntity);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (!blockEntity.isValid()) {
|
||||||
|
this.blockEntities.remove(pos);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return blockEntity;
|
return blockEntity;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private BlockEntity createBlockEntity(BlockPos pos) {
|
||||||
|
ImmutableBlockState blockState = this.getBlockState(pos);
|
||||||
|
if (!blockState.hasBlockEntity()) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return blockState.blockEntityType().factory().create(pos, blockState);
|
||||||
|
}
|
||||||
|
|
||||||
public Map<BlockPos, BlockEntity> blockEntities() {
|
public Map<BlockPos, BlockEntity> blockEntities() {
|
||||||
return Collections.unmodifiableMap(this.blockEntities);
|
return Collections.unmodifiableMap(this.blockEntities);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,7 +16,10 @@ public final class DefaultBlockEntitySerializer {
|
|||||||
public static ListTag serialize(Map<BlockPos, BlockEntity> tiles) {
|
public static ListTag serialize(Map<BlockPos, BlockEntity> tiles) {
|
||||||
ListTag result = new ListTag();
|
ListTag result = new ListTag();
|
||||||
for (Map.Entry<BlockPos, BlockEntity> entry : tiles.entrySet()) {
|
for (Map.Entry<BlockPos, BlockEntity> entry : tiles.entrySet()) {
|
||||||
result.add(entry.getValue().saveAsTag());
|
BlockEntity entity = entry.getValue();
|
||||||
|
if (entity.isValid()) {
|
||||||
|
result.add(entity.saveAsTag());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ org.gradle.jvmargs=-Xmx1G
|
|||||||
|
|
||||||
# Project settings
|
# Project settings
|
||||||
# Rule: [major update].[feature update].[bug fix]
|
# Rule: [major update].[feature update].[bug fix]
|
||||||
project_version=0.0.62.6
|
project_version=0.0.62.8
|
||||||
config_version=45
|
config_version=45
|
||||||
lang_version=25
|
lang_version=25
|
||||||
project_group=net.momirealms
|
project_group=net.momirealms
|
||||||
|
|||||||
BIN
libs/worldguard-bukkit-7.0.14-dist.jar
Normal file
BIN
libs/worldguard-bukkit-7.0.14-dist.jar
Normal file
Binary file not shown.
Reference in New Issue
Block a user