From b522ce632ac5ad6b4b78c0ffc348562d7f9bf9e2 Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Thu, 1 May 2025 11:08:09 +0800 Subject: [PATCH 01/51] Update gradle.properties --- gradle.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle.properties b/gradle.properties index 97af92e9b..a91348e1c 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,7 +2,7 @@ org.gradle.jvmargs=-Xmx1G # Project settings # Rule: [major update].[feature update].[bug fix] -project_version=0.0.52 +project_version=0.0.53-beta.1 config_version=31 lang_version=9 project_group=net.momirealms @@ -20,7 +20,7 @@ gson_version=2.11.0 asm_version=9.8 asm_commons_version=9.8 jar_relocator_version=1.7 -adventure_bundle_version=4.20.0 +adventure_bundle_version=4.21.0 adventure_platform_version=4.3.4 cloud_core_version=2.0.0 cloud_services_version=2.0.0 From ec627ffc7935a1b5f4d5a722698111b13290a131 Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Thu, 1 May 2025 16:54:17 +0800 Subject: [PATCH 02/51] =?UTF-8?q?=E9=87=8D=E6=9E=84context?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/pack/AbstractPackManager.java | 8 +- .../core/pack/conflict/PathContext.java | 23 +++++ .../conflict/matcher/AllOfPathMatcher.java | 21 ++--- .../conflict/matcher/AnyOfPathMatcher.java | 21 ++--- .../conflict/matcher/ExactPathMatcher.java | 6 +- .../conflict/matcher/FilenameMatcher.java | 6 +- .../conflict/matcher/InvertedPathMatcher.java | 15 ++-- .../matcher/ParentPathPrefixMatcher.java | 5 +- .../matcher/ParentPathSuffixMatcher.java | 5 +- .../conflict/matcher/PathContainsMatcher.java | 6 +- .../pack/conflict/matcher/PathMatcher.java | 10 +-- .../conflict/matcher/PathMatcherFactory.java | 1 + .../conflict/matcher/PathPatternMatcher.java | 6 +- .../resolution/ConditionalResolution.java | 4 +- .../resolution/MergeAltasResolution.java | 10 +-- .../resolution/MergeJsonResolution.java | 10 +-- .../resolution/MergePackMcMetaResolution.java | 5 +- .../pack/conflict/resolution/Resolution.java | 5 +- .../resolution/ResolutionFactory.java | 1 + .../resolution/RetainMatchingResolution.java | 6 +- .../minimessage/MiniMessageTextContext.java | 5 +- .../core/util/condition/AllOfCondition.java | 23 +++++ .../core/util/condition/AnyOfCondition.java | 23 +++++ .../util/condition/InvertedCondition.java | 16 ++++ .../core/util/context/CommonContext.java | 14 ++++ .../core/util/context/CommonParameters.java | 4 + .../core/util/context/Condition.java | 15 ++++ .../core/util/context/Context.java | 6 ++ .../core/util/context/ContextHolder.java | 84 +++++++++++++++---- .../core/util/context/PlayerContext.java | 11 +-- 30 files changed, 262 insertions(+), 113 deletions(-) create mode 100644 core/src/main/java/net/momirealms/craftengine/core/pack/conflict/PathContext.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/util/condition/AllOfCondition.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/util/condition/AnyOfCondition.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/util/condition/InvertedCondition.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/util/context/CommonContext.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/util/context/CommonParameters.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/util/context/Condition.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/util/context/Context.java diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/AbstractPackManager.java b/core/src/main/java/net/momirealms/craftengine/core/pack/AbstractPackManager.java index 75cf89e13..bc4831cec 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/AbstractPackManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/AbstractPackManager.java @@ -6,6 +6,7 @@ import dev.dejvokep.boostedyaml.block.implementation.Section; import net.momirealms.craftengine.core.font.BitmapImage; import net.momirealms.craftengine.core.font.Font; import net.momirealms.craftengine.core.item.EquipmentData; +import net.momirealms.craftengine.core.pack.conflict.PathContext; import net.momirealms.craftengine.core.pack.conflict.resolution.ConditionalResolution; import net.momirealms.craftengine.core.pack.host.ResourcePackHost; import net.momirealms.craftengine.core.pack.host.ResourcePackHosts; @@ -1155,9 +1156,12 @@ public abstract class AbstractPackManager implements PackManager { Files.copy(file, targetPath, StandardCopyOption.REPLACE_EXISTING); conflicts.add(file); } else { + PathContext relativeCTX = PathContext.of(relative); + PathContext targetCTX = PathContext.of(targetPath); + PathContext fileCTX = PathContext.of(file); for (ConditionalResolution resolution : Config.resolutions()) { - if (resolution.matcher().test(relative)) { - resolution.resolution().run(targetPath, file); + if (resolution.matcher().test(relativeCTX)) { + resolution.resolution().run(targetCTX, fileCTX); return FileVisitResult.CONTINUE; } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/PathContext.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/PathContext.java new file mode 100644 index 000000000..3062b256b --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/PathContext.java @@ -0,0 +1,23 @@ +package net.momirealms.craftengine.core.pack.conflict; + +import net.momirealms.craftengine.core.util.context.CommonContext; +import net.momirealms.craftengine.core.util.context.ContextHolder; + +import java.nio.file.Path; + +public class PathContext extends CommonContext { + private final Path path; + + public PathContext(ContextHolder holder, Path path) { + super(holder); + this.path = path; + } + + public Path path() { + return path; + } + + public static PathContext of(Path path) { + return new PathContext(ContextHolder.EMPTY, path); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/AllOfPathMatcher.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/AllOfPathMatcher.java index a353f7591..325f7632b 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/AllOfPathMatcher.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/AllOfPathMatcher.java @@ -1,19 +1,20 @@ package net.momirealms.craftengine.core.pack.conflict.matcher; +import net.momirealms.craftengine.core.pack.conflict.PathContext; import net.momirealms.craftengine.core.plugin.locale.LocalizedException; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.MiscUtils; +import net.momirealms.craftengine.core.util.condition.AllOfCondition; +import net.momirealms.craftengine.core.util.context.Condition; -import java.nio.file.Path; import java.util.List; import java.util.Map; -public class AllOfPathMatcher implements PathMatcher { +public class AllOfPathMatcher extends AllOfCondition implements PathMatcher { public static final Factory FACTORY = new Factory(); - private final List matchers; - public AllOfPathMatcher(List matchers) { - this.matchers = matchers; + public AllOfPathMatcher(List> conditions) { + super(conditions); } @Override @@ -21,16 +22,6 @@ public class AllOfPathMatcher implements PathMatcher { return PathMatchers.ALL_OF; } - @Override - public boolean test(Path path) { - for (PathMatcher matcher : matchers) { - if (!matcher.test(path)) { - return false; - } - } - return true; - } - public static class Factory implements PathMatcherFactory { @SuppressWarnings("unchecked") diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/AnyOfPathMatcher.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/AnyOfPathMatcher.java index ad0632b19..4138629e2 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/AnyOfPathMatcher.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/AnyOfPathMatcher.java @@ -1,19 +1,20 @@ package net.momirealms.craftengine.core.pack.conflict.matcher; +import net.momirealms.craftengine.core.pack.conflict.PathContext; import net.momirealms.craftengine.core.plugin.locale.LocalizedException; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.MiscUtils; +import net.momirealms.craftengine.core.util.condition.AnyOfCondition; +import net.momirealms.craftengine.core.util.context.Condition; -import java.nio.file.Path; import java.util.List; import java.util.Map; -public class AnyOfPathMatcher implements PathMatcher { +public class AnyOfPathMatcher extends AnyOfCondition implements PathMatcher { public static final Factory FACTORY = new Factory(); - private final List matchers; - public AnyOfPathMatcher(List matchers) { - this.matchers = matchers; + public AnyOfPathMatcher(List> conditions) { + super(conditions); } @Override @@ -21,16 +22,6 @@ public class AnyOfPathMatcher implements PathMatcher { return PathMatchers.ANY_OF; } - @Override - public boolean test(Path path) { - for (PathMatcher matcher : matchers) { - if (matcher.test(path)) { - return true; - } - } - return false; - } - public static class Factory implements PathMatcherFactory { @SuppressWarnings("unchecked") diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/ExactPathMatcher.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/ExactPathMatcher.java index 0fbdedb4b..34b55bb4d 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/ExactPathMatcher.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/ExactPathMatcher.java @@ -1,10 +1,10 @@ package net.momirealms.craftengine.core.pack.conflict.matcher; +import net.momirealms.craftengine.core.pack.conflict.PathContext; import net.momirealms.craftengine.core.plugin.locale.LocalizedException; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.ResourceConfigUtils; -import java.nio.file.Path; import java.util.Map; public class ExactPathMatcher implements PathMatcher { @@ -16,8 +16,8 @@ public class ExactPathMatcher implements PathMatcher { } @Override - public boolean test(Path path) { - String pathStr = path.toString().replace("\\", "/"); + public boolean test(PathContext path) { + String pathStr = path.path().toString().replace("\\", "/"); return pathStr.equals(this.path); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/FilenameMatcher.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/FilenameMatcher.java index 9bfac4789..e221ebfd2 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/FilenameMatcher.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/FilenameMatcher.java @@ -1,10 +1,10 @@ package net.momirealms.craftengine.core.pack.conflict.matcher; +import net.momirealms.craftengine.core.pack.conflict.PathContext; import net.momirealms.craftengine.core.plugin.locale.LocalizedException; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.ResourceConfigUtils; -import java.nio.file.Path; import java.util.Map; public class FilenameMatcher implements PathMatcher { @@ -16,8 +16,8 @@ public class FilenameMatcher implements PathMatcher { } @Override - public boolean test(Path path) { - String fileName = String.valueOf(path.getFileName()); + public boolean test(PathContext path) { + String fileName = String.valueOf(path.path().getFileName()); return fileName.equals(name); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/InvertedPathMatcher.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/InvertedPathMatcher.java index f95c47da9..d200f979e 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/InvertedPathMatcher.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/InvertedPathMatcher.java @@ -1,19 +1,19 @@ package net.momirealms.craftengine.core.pack.conflict.matcher; +import net.momirealms.craftengine.core.pack.conflict.PathContext; import net.momirealms.craftengine.core.plugin.locale.LocalizedException; 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.util.condition.InvertedCondition; -import java.nio.file.Path; import java.util.Map; -public class InvertedPathMatcher implements PathMatcher { +public class InvertedPathMatcher extends InvertedCondition implements PathMatcher { public static final Factory FACTORY = new Factory(); - private final PathMatcher matcher; - public InvertedPathMatcher(PathMatcher matcher) { - this.matcher = matcher; + public InvertedPathMatcher(PathMatcher condition) { + super(condition); } @Override @@ -21,11 +21,6 @@ public class InvertedPathMatcher implements PathMatcher { return PathMatchers.INVERTED; } - @Override - public boolean test(Path path) { - return !matcher.test(path); - } - public static class Factory implements PathMatcherFactory { @Override diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/ParentPathPrefixMatcher.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/ParentPathPrefixMatcher.java index 706010712..9b753bebd 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/ParentPathPrefixMatcher.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/ParentPathPrefixMatcher.java @@ -1,5 +1,6 @@ package net.momirealms.craftengine.core.pack.conflict.matcher; +import net.momirealms.craftengine.core.pack.conflict.PathContext; import net.momirealms.craftengine.core.plugin.locale.LocalizedException; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.ResourceConfigUtils; @@ -16,8 +17,8 @@ public class ParentPathPrefixMatcher implements PathMatcher { } @Override - public boolean test(Path path) { - Path parent = path.getParent(); + public boolean test(PathContext path) { + Path parent = path.path().getParent(); if (parent == null) return false; String pathStr = parent.toString().replace("\\", "/"); return pathStr.startsWith(this.prefix); diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/ParentPathSuffixMatcher.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/ParentPathSuffixMatcher.java index f31a62c83..e91fc8e1a 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/ParentPathSuffixMatcher.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/ParentPathSuffixMatcher.java @@ -1,5 +1,6 @@ package net.momirealms.craftengine.core.pack.conflict.matcher; +import net.momirealms.craftengine.core.pack.conflict.PathContext; import net.momirealms.craftengine.core.plugin.locale.LocalizedException; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.ResourceConfigUtils; @@ -16,8 +17,8 @@ public class ParentPathSuffixMatcher implements PathMatcher { } @Override - public boolean test(Path path) { - Path parent = path.getParent(); + public boolean test(PathContext path) { + Path parent = path.path().getParent(); if (parent == null) return false; String pathStr = parent.toString().replace("\\", "/"); return pathStr.endsWith(suffix); diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathContainsMatcher.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathContainsMatcher.java index c8225f57e..b11b30f2a 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathContainsMatcher.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathContainsMatcher.java @@ -1,10 +1,10 @@ package net.momirealms.craftengine.core.pack.conflict.matcher; +import net.momirealms.craftengine.core.pack.conflict.PathContext; import net.momirealms.craftengine.core.plugin.locale.LocalizedException; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.ResourceConfigUtils; -import java.nio.file.Path; import java.util.Map; public class PathContainsMatcher implements PathMatcher { @@ -16,8 +16,8 @@ public class PathContainsMatcher implements PathMatcher { } @Override - public boolean test(Path path) { - String pathStr = path.toString().replace("\\", "/"); + public boolean test(PathContext path) { + String pathStr = path.path().toString().replace("\\", "/"); return pathStr.contains(this.path); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcher.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcher.java index a03126da9..1bb9a746e 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcher.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcher.java @@ -1,11 +1,7 @@ package net.momirealms.craftengine.core.pack.conflict.matcher; -import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.pack.conflict.PathContext; +import net.momirealms.craftengine.core.util.context.Condition; -import java.nio.file.Path; -import java.util.function.Predicate; - -public interface PathMatcher extends Predicate { - - Key type(); +public interface PathMatcher extends Condition { } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherFactory.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherFactory.java index 7b9b2d9a0..b4817c9ad 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherFactory.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherFactory.java @@ -2,6 +2,7 @@ package net.momirealms.craftengine.core.pack.conflict.matcher; import java.util.Map; +@FunctionalInterface public interface PathMatcherFactory { PathMatcher create(Map arguments); diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathPatternMatcher.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathPatternMatcher.java index e469c7a6e..8d0fed1c8 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathPatternMatcher.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathPatternMatcher.java @@ -1,10 +1,10 @@ package net.momirealms.craftengine.core.pack.conflict.matcher; +import net.momirealms.craftengine.core.pack.conflict.PathContext; import net.momirealms.craftengine.core.plugin.locale.LocalizedException; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.ResourceConfigUtils; -import java.nio.file.Path; import java.util.Map; import java.util.regex.Pattern; @@ -21,8 +21,8 @@ public class PathPatternMatcher implements PathMatcher { } @Override - public boolean test(Path path) { - String pathStr = path.toString().replace("\\", "/"); + public boolean test(PathContext path) { + String pathStr = path.path().toString().replace("\\", "/"); return this.pattern.matcher(pathStr).matches(); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/ConditionalResolution.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/ConditionalResolution.java index d0079cf50..f54c04c39 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/ConditionalResolution.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/ConditionalResolution.java @@ -1,18 +1,18 @@ package net.momirealms.craftengine.core.pack.conflict.resolution; +import net.momirealms.craftengine.core.pack.conflict.PathContext; import net.momirealms.craftengine.core.pack.conflict.matcher.PathMatcher; import net.momirealms.craftengine.core.pack.conflict.matcher.PathMatchers; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.MiscUtils; -import java.nio.file.Path; import java.util.Map; public record ConditionalResolution(PathMatcher matcher, Resolution resolution) implements Resolution { public static final Factory FACTORY = new Factory(); @Override - public void run(Path existing, Path conflict) { + public void run(PathContext existing, PathContext conflict) { if (this.matcher.test(existing)) { this.resolution.run(existing, conflict); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/MergeAltasResolution.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/MergeAltasResolution.java index 0445a763f..6cced38f0 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/MergeAltasResolution.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/MergeAltasResolution.java @@ -3,12 +3,12 @@ package net.momirealms.craftengine.core.pack.conflict.resolution; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.pack.conflict.PathContext; import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.util.GsonHelper; import net.momirealms.craftengine.core.util.Key; import java.io.IOException; -import java.nio.file.Path; import java.util.HashSet; import java.util.Map; @@ -17,10 +17,10 @@ public class MergeAltasResolution implements Resolution { public static final MergeAltasResolution INSTANCE = new MergeAltasResolution(); @Override - public void run(Path existing, Path conflict) { + public void run(PathContext existing, PathContext conflict) { try { - JsonObject j1 = GsonHelper.readJsonFile(existing).getAsJsonObject(); - JsonObject j2 = GsonHelper.readJsonFile(conflict).getAsJsonObject(); + JsonObject j1 = GsonHelper.readJsonFile(existing.path()).getAsJsonObject(); + JsonObject j2 = GsonHelper.readJsonFile(conflict.path()).getAsJsonObject(); JsonObject j3 = new JsonObject(); JsonArray ja1 = j1.getAsJsonArray("sources"); JsonArray ja2 = j2.getAsJsonArray("sources"); @@ -37,7 +37,7 @@ public class MergeAltasResolution implements Resolution { } } j3.add("sources", ja3); - GsonHelper.writeJsonFile(j3, existing); + GsonHelper.writeJsonFile(j3, existing.path()); } catch (IOException e) { CraftEngine.instance().logger().severe("Failed to merge json when resolving file conflicts", e); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/MergeJsonResolution.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/MergeJsonResolution.java index db9c77242..aca0b9425 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/MergeJsonResolution.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/MergeJsonResolution.java @@ -1,12 +1,12 @@ package net.momirealms.craftengine.core.pack.conflict.resolution; import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.pack.conflict.PathContext; import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.util.GsonHelper; import net.momirealms.craftengine.core.util.Key; import java.io.IOException; -import java.nio.file.Path; import java.util.Map; public class MergeJsonResolution implements Resolution { @@ -18,17 +18,17 @@ public class MergeJsonResolution implements Resolution { } @Override - public void run(Path existing, Path conflict) { + public void run(PathContext existing, PathContext conflict) { try { - JsonObject j1 = GsonHelper.readJsonFile(existing).getAsJsonObject(); - JsonObject j2 = GsonHelper.readJsonFile(conflict).getAsJsonObject(); + JsonObject j1 = GsonHelper.readJsonFile(existing.path()).getAsJsonObject(); + JsonObject j2 = GsonHelper.readJsonFile(conflict.path()).getAsJsonObject(); JsonObject j3; if (deeply) { j3 = GsonHelper.deepMerge(j1, j2); } else { j3 = GsonHelper.shallowMerge(j1, j2); } - GsonHelper.writeJsonFile(j3, existing); + GsonHelper.writeJsonFile(j3, existing.path()); } catch (IOException e) { CraftEngine.instance().logger().severe("Failed to merge json when resolving file conflicts", e); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/MergePackMcMetaResolution.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/MergePackMcMetaResolution.java index 799466cc3..1ebeadd67 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/MergePackMcMetaResolution.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/MergePackMcMetaResolution.java @@ -1,6 +1,7 @@ package net.momirealms.craftengine.core.pack.conflict.resolution; import com.google.gson.*; +import net.momirealms.craftengine.core.pack.conflict.PathContext; import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.util.AdventureHelper; import net.momirealms.craftengine.core.util.GsonHelper; @@ -191,9 +192,9 @@ public class MergePackMcMetaResolution implements Resolution { } @Override - public void run(Path existing, Path conflict) { + public void run(PathContext existing, PathContext conflict) { try { - mergeMcMeta(existing, conflict, AdventureHelper.componentToJsonElement(AdventureHelper.miniMessage().deserialize(this.description))); + mergeMcMeta(existing.path(), conflict.path(), AdventureHelper.componentToJsonElement(AdventureHelper.miniMessage().deserialize(this.description))); } catch (IOException e) { CraftEngine.instance().logger().severe("Failed to merge pack.mcmeta when resolving file conflicts", e); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/Resolution.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/Resolution.java index b33592e38..d1566f811 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/Resolution.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/Resolution.java @@ -1,12 +1,11 @@ package net.momirealms.craftengine.core.pack.conflict.resolution; +import net.momirealms.craftengine.core.pack.conflict.PathContext; import net.momirealms.craftengine.core.util.Key; -import java.nio.file.Path; - public interface Resolution { - void run(Path existing, Path conflict); + void run(PathContext existing, PathContext conflict); Key type(); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/ResolutionFactory.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/ResolutionFactory.java index b6533aa87..0e6235274 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/ResolutionFactory.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/ResolutionFactory.java @@ -2,6 +2,7 @@ package net.momirealms.craftengine.core.pack.conflict.resolution; import java.util.Map; +@FunctionalInterface public interface ResolutionFactory { Resolution create(Map arguments); diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/RetainMatchingResolution.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/RetainMatchingResolution.java index 874279027..3b20601d0 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/RetainMatchingResolution.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/RetainMatchingResolution.java @@ -1,5 +1,6 @@ package net.momirealms.craftengine.core.pack.conflict.resolution; +import net.momirealms.craftengine.core.pack.conflict.PathContext; import net.momirealms.craftengine.core.pack.conflict.matcher.PathMatcher; import net.momirealms.craftengine.core.pack.conflict.matcher.PathMatchers; import net.momirealms.craftengine.core.plugin.CraftEngine; @@ -8,7 +9,6 @@ import net.momirealms.craftengine.core.util.MiscUtils; import java.io.IOException; import java.nio.file.Files; -import java.nio.file.Path; import java.nio.file.StandardCopyOption; import java.util.Map; @@ -21,10 +21,10 @@ public class RetainMatchingResolution implements Resolution { } @Override - public void run(Path existing, Path conflict) { + public void run(PathContext existing, PathContext conflict) { if (this.matcher.test(conflict)) { try { - Files.copy(conflict, existing, StandardCopyOption.REPLACE_EXISTING); + Files.copy(conflict.path(), existing.path(), StandardCopyOption.REPLACE_EXISTING); } catch (IOException e) { CraftEngine.instance().logger().warn("Failed to copy conflict file " + conflict + " to " + existing, e); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/MiniMessageTextContext.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/MiniMessageTextContext.java index e9ea34494..5fe4279ec 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/MiniMessageTextContext.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/MiniMessageTextContext.java @@ -1,11 +1,10 @@ package net.momirealms.craftengine.core.plugin.text.minimessage; import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; +import net.momirealms.craftengine.core.util.context.Context; import net.momirealms.craftengine.core.util.context.ContextHolder; -public interface MiniMessageTextContext { - - ContextHolder contexts(); +public interface MiniMessageTextContext extends Context { TagResolver[] tagResolvers(); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/condition/AllOfCondition.java b/core/src/main/java/net/momirealms/craftengine/core/util/condition/AllOfCondition.java new file mode 100644 index 000000000..c50420e13 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/condition/AllOfCondition.java @@ -0,0 +1,23 @@ +package net.momirealms.craftengine.core.util.condition; + +import net.momirealms.craftengine.core.util.context.Condition; + +import java.util.List; + +public abstract class AllOfCondition implements Condition { + protected final List> conditions; + + public AllOfCondition(List> conditions) { + this.conditions = conditions; + } + + @Override + public boolean test(CTX ctx) { + for (Condition condition : conditions) { + if (!condition.test(ctx)) { + return false; + } + } + return true; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/condition/AnyOfCondition.java b/core/src/main/java/net/momirealms/craftengine/core/util/condition/AnyOfCondition.java new file mode 100644 index 000000000..bb2e08e4a --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/condition/AnyOfCondition.java @@ -0,0 +1,23 @@ +package net.momirealms.craftengine.core.util.condition; + +import net.momirealms.craftengine.core.util.context.Condition; + +import java.util.List; + +public abstract class AnyOfCondition implements Condition { + protected final List> conditions; + + public AnyOfCondition(List> conditions) { + this.conditions = conditions; + } + + @Override + public boolean test(CTX ctx) { + for (Condition condition : conditions) { + if (condition.test(ctx)) { + return true; + } + } + return false; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/condition/InvertedCondition.java b/core/src/main/java/net/momirealms/craftengine/core/util/condition/InvertedCondition.java new file mode 100644 index 000000000..6fa42c944 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/condition/InvertedCondition.java @@ -0,0 +1,16 @@ +package net.momirealms.craftengine.core.util.condition; + +import net.momirealms.craftengine.core.util.context.Condition; + +public abstract class InvertedCondition implements Condition { + protected final Condition condition; + + public InvertedCondition(Condition condition) { + this.condition = condition; + } + + @Override + public boolean test(CTX ctx) { + return !this.condition.test(ctx); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/context/CommonContext.java b/core/src/main/java/net/momirealms/craftengine/core/util/context/CommonContext.java new file mode 100644 index 000000000..7941d363a --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/context/CommonContext.java @@ -0,0 +1,14 @@ +package net.momirealms.craftengine.core.util.context; + +public abstract class CommonContext implements Context { + protected final ContextHolder holder; + + public CommonContext(ContextHolder holder) { + this.holder = holder; + } + + @Override + public ContextHolder contexts() { + return holder; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/context/CommonParameters.java b/core/src/main/java/net/momirealms/craftengine/core/util/context/CommonParameters.java new file mode 100644 index 000000000..5544449b7 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/context/CommonParameters.java @@ -0,0 +1,4 @@ +package net.momirealms.craftengine.core.util.context; + +public class CommonParameters { +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/context/Condition.java b/core/src/main/java/net/momirealms/craftengine/core/util/context/Condition.java new file mode 100644 index 000000000..373fe4897 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/context/Condition.java @@ -0,0 +1,15 @@ +package net.momirealms.craftengine.core.util.context; + +import net.momirealms.craftengine.core.util.Key; + +import java.util.function.Predicate; + +public interface Condition extends Predicate { + + @Override + default boolean test(CTX ctx) { + return false; + } + + Key type(); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/context/Context.java b/core/src/main/java/net/momirealms/craftengine/core/util/context/Context.java new file mode 100644 index 000000000..5901daaa4 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/context/Context.java @@ -0,0 +1,6 @@ +package net.momirealms.craftengine.core.util.context; + +public interface Context { + + ContextHolder contexts(); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/context/ContextHolder.java b/core/src/main/java/net/momirealms/craftengine/core/util/context/ContextHolder.java index 7939014e9..718dd54de 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/util/context/ContextHolder.java +++ b/core/src/main/java/net/momirealms/craftengine/core/util/context/ContextHolder.java @@ -1,43 +1,65 @@ package net.momirealms.craftengine.core.util.context; +import com.google.common.collect.ImmutableMap; + import javax.annotation.Nullable; import java.util.HashMap; import java.util.Map; import java.util.NoSuchElementException; import java.util.Optional; +import java.util.function.Supplier; public class ContextHolder { - public static final ContextHolder EMPTY = ContextHolder.builder().build(); + public static final ContextHolder EMPTY = ContextHolder.builder().immutable(true).build(); + protected final Map, Supplier> params; - private final Map, Object> params; - - public ContextHolder(Map, Object> params) { + protected ContextHolder(Map, Supplier> params) { this.params = params; } public boolean has(ContextKey key) { - return params.containsKey(key); + return this.params.containsKey(key); + } + + public ContextHolder withParameter(ContextKey parameter, T value) { + this.params.put(parameter, SimpleSupplier.of(value)); + return this; + } + + @SuppressWarnings("unchecked") + public ContextHolder withParameter(ContextKey parameter, Supplier value) { + this.params.put(parameter, (Supplier) value); + return this; + } + + public ContextHolder withOptionalParameter(ContextKey parameter, @Nullable T value) { + if (value == null) { + this.params.remove(parameter); + } else { + this.params.put(parameter, SimpleSupplier.of(value)); + } + return this; } @SuppressWarnings("unchecked") public T getOrThrow(ContextKey parameter) { - T object = (T) this.params.get(parameter); + Supplier object = (Supplier) this.params.get(parameter); if (object == null) { throw new NoSuchElementException(parameter.id().toString()); } else { - return object; + return object.get(); } } @SuppressWarnings("unchecked") public Optional getOptional(ContextKey parameter) { - return Optional.ofNullable((T) this.params.get(parameter)); + return (Optional) Optional.ofNullable(this.params.get(parameter)).map(Supplier::get); } @SuppressWarnings("unchecked") @Nullable public T getOrDefault(ContextKey parameter, @Nullable T defaultValue) { - return (T) this.params.getOrDefault(parameter, defaultValue); + return (T) Optional.ofNullable(this.params.get(parameter)).map(Supplier::get).orElse(defaultValue); } public static Builder builder() { @@ -45,13 +67,19 @@ public class ContextHolder { } public static class Builder { - - private final Map, Object> params = new HashMap<>(); + private final Map, Supplier> params = new HashMap<>(); + private boolean immutable = false; public Builder() {} public Builder withParameter(ContextKey parameter, T value) { - this.params.put(parameter, value); + this.params.put(parameter, SimpleSupplier.of(value)); + return this; + } + + @SuppressWarnings("unchecked") + public Builder withParameter(ContextKey parameter, Supplier value) { + this.params.put(parameter, (Supplier) value); return this; } @@ -59,28 +87,50 @@ public class ContextHolder { if (value == null) { this.params.remove(parameter); } else { - this.params.put(parameter, value); + this.params.put(parameter, SimpleSupplier.of(value)); } return this; } @SuppressWarnings("unchecked") public T getParameterOrThrow(ContextKey parameter) { - T object = (T) this.params.get(parameter); + Supplier object = (Supplier) this.params.get(parameter); if (object == null) { throw new NoSuchElementException(parameter.id().toString()); } else { - return object; + return object.get(); } } + public Builder immutable(boolean immutable) { + this.immutable = immutable; + return this; + } + @SuppressWarnings("unchecked") public Optional getOptionalParameter(ContextKey parameter) { - return Optional.ofNullable((T) this.params.get(parameter)); + return Optional.ofNullable((Supplier) this.params.get(parameter)).map(Supplier::get); } public ContextHolder build() { - return new ContextHolder(this.params); + return new ContextHolder(this.immutable ? ImmutableMap.copyOf(this.params) : this.params); + } + } + + public static class SimpleSupplier implements Supplier { + private final T object; + + public SimpleSupplier(T object) { + this.object = object; + } + + @Override + public T get() { + return this.object; + } + + public static SimpleSupplier of(T object) { + return new SimpleSupplier<>(object); } } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/context/PlayerContext.java b/core/src/main/java/net/momirealms/craftengine/core/util/context/PlayerContext.java index 1104abb65..ff44eb60a 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/util/context/PlayerContext.java +++ b/core/src/main/java/net/momirealms/craftengine/core/util/context/PlayerContext.java @@ -6,15 +6,14 @@ import net.momirealms.craftengine.core.plugin.text.minimessage.*; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -public class PlayerContext implements MiniMessageTextContext { +public class PlayerContext extends CommonContext implements MiniMessageTextContext { public static final PlayerContext EMPTY = new PlayerContext(null, ContextHolder.EMPTY); private final Player player; - private final ContextHolder contexts; private TagResolver[] tagResolvers; public PlayerContext(@Nullable Player player, @NotNull ContextHolder contexts) { + super(contexts); this.player = player; - this.contexts = contexts; } @NotNull @@ -27,11 +26,7 @@ public class PlayerContext implements MiniMessageTextContext { return this.player; } - @NotNull - public ContextHolder contexts() { - return this.contexts; - } - + @Override @NotNull public TagResolver[] tagResolvers() { if (this.tagResolvers == null) { From 358beab2317de92fb42623b17cdfc5598d418a4b Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Fri, 2 May 2025 00:12:06 +0800 Subject: [PATCH 03/51] =?UTF-8?q?feat(compatibility):=20=E5=85=BC=E5=AE=B9?= =?UTF-8?q?FAWE=E7=9A=84//set=E5=92=8C//replace?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bukkit/compatibility/build.gradle.kts | 7 +- .../worldedit/FastAsyncWorldEditDelegate.java | 87 +++++++++++++++++++ .../worldedit/WorldEditBlockRegister.java | 5 ++ 3 files changed, 96 insertions(+), 3 deletions(-) create mode 100644 bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java diff --git a/bukkit/compatibility/build.gradle.kts b/bukkit/compatibility/build.gradle.kts index b0cd5fa25..db481a7c5 100644 --- a/bukkit/compatibility/build.gradle.kts +++ b/bukkit/compatibility/build.gradle.kts @@ -26,9 +26,6 @@ dependencies { compileOnly("pers.neige.neigeitems:NeigeItems:1.21.42") // Placeholder compileOnly("me.clip:placeholderapi:${rootProject.properties["placeholder_api_version"]}") - // WorldEdit - compileOnly("com.sk89q.worldedit:worldedit-core:7.2.19") - compileOnly("com.sk89q.worldedit:worldedit-bukkit:7.2.19") // SlimeWorld compileOnly("com.infernalsuite.asp:api:4.0.0-SNAPSHOT") // ModelEngine @@ -44,6 +41,10 @@ dependencies { compileOnly("com.viaversion:viaversion-api:5.3.2") // Skript compileOnly("com.github.SkriptLang:Skript:2.11.0") + // FAWE + compileOnly(platform("com.intellectualsites.bom:bom-newest:1.52")) + compileOnly("com.fastasyncworldedit:FastAsyncWorldEdit-Core") + compileOnly("com.fastasyncworldedit:FastAsyncWorldEdit-Bukkit") { isTransitive = false } } java { diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java new file mode 100644 index 000000000..d5f7e2d6f --- /dev/null +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java @@ -0,0 +1,87 @@ +package net.momirealms.craftengine.bukkit.compatibility.worldedit; + +import com.fastasyncworldedit.core.configuration.Settings; +import com.sk89q.worldedit.EditSession; +import com.sk89q.worldedit.WorldEdit; +import com.sk89q.worldedit.event.extent.EditSessionEvent; +import com.sk89q.worldedit.extent.AbstractDelegateExtent; +import com.sk89q.worldedit.extent.Extent; +import com.sk89q.worldedit.function.mask.Mask; +import com.sk89q.worldedit.function.pattern.Pattern; +import com.sk89q.worldedit.math.BlockVector3; +import com.sk89q.worldedit.regions.Region; +import com.sk89q.worldedit.util.eventbus.Subscribe; +import com.sk89q.worldedit.world.block.BaseBlock; +import com.sk89q.worldedit.world.block.BlockState; +import net.momirealms.craftengine.bukkit.block.BukkitBlockManager; +import net.momirealms.craftengine.bukkit.util.BlockStateUtils; +import net.momirealms.craftengine.core.block.EmptyBlock; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import org.bukkit.Bukkit; + +public class FastAsyncWorldEditDelegate extends AbstractDelegateExtent { + protected FastAsyncWorldEditDelegate(Extent extent) { + super(extent); + } + + public static void init() { + Settings.settings().EXTENT.ALLOWED_PLUGINS.add(FastAsyncWorldEditDelegate.class.getCanonicalName()); + WorldEdit.getInstance().getEventBus().register(new Object() { + @Subscribe + @SuppressWarnings("unused") + public void onEditSessionEvent(EditSessionEvent event) { + if (event.getStage() != EditSession.Stage.BEFORE_HISTORY) return; + event.setExtent(new FastAsyncWorldEditDelegate(event.getExtent())); + } + }); + } + + @Override + public int setBlocks(final Region region, final Pattern pattern) { + this.processBlocks(region, pattern); + return super.setBlocks(region, pattern); + } + + @Override + public int replaceBlocks(Region region, Mask mask, Pattern pattern) { + this.processBlocks(region, pattern); + return super.replaceBlocks(region, mask, pattern); + } + + private void processBlocks(Region region, Pattern pattern) { + try { + for (BlockVector3 position : region) { + BaseBlock blockState = pattern.applyBlock(position); + BlockState oldBlockState = getBlock(position); + int blockX = position.x(); + int blockY = position.y(); + int blockZ = position.z(); + int chunkX = blockX >> 4; + int chunkZ = blockZ >> 4; + int stateId = BlockStateUtils.blockDataToId(Bukkit.createBlockData(blockState.getAsString())); + int oldStateId = BlockStateUtils.blockDataToId(Bukkit.createBlockData(oldBlockState.getAsString())); + if (BlockStateUtils.isVanillaBlock(stateId) && BlockStateUtils.isVanillaBlock(oldStateId)) continue; + var weWorld = region.getWorld(); + if (weWorld == null) continue; + var world = Bukkit.getWorld(weWorld.getName()); + if (world == null) continue; + var ceWorld = CraftEngine.instance().worldManager().getWorld(world.getUID()); + if (ceWorld == null) continue; + var ceChunk = ceWorld.getChunkAtIfLoaded(chunkX, chunkZ); + if (ceChunk == null) { + world.loadChunk(chunkX, chunkZ); + ceChunk = ceWorld.getChunkAtIfLoaded(chunkX, chunkZ); + if (ceChunk == null) continue; + } + var immutableBlockState = BukkitBlockManager.instance().getImmutableBlockState(stateId); + if (immutableBlockState == null) { + ceChunk.setBlockState(blockX, blockY, blockZ, EmptyBlock.STATE); + } else { + ceChunk.setBlockState(blockX, blockY, blockZ, immutableBlockState); + } + } + } catch (Exception e) { + CraftEngine.instance().logger().warn("Error when recording FastAsyncWorldEdit operation blocks", e); + } + } +} diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/WorldEditBlockRegister.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/WorldEditBlockRegister.java index 2066c2bc1..dd0951843 100644 --- a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/WorldEditBlockRegister.java +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/WorldEditBlockRegister.java @@ -30,8 +30,12 @@ public class WorldEditBlockRegister { this.isFAWE = isFAWE; CEBlockParser blockParser = new CEBlockParser(WorldEdit.getInstance()); WorldEdit.getInstance().getBlockFactory().register(blockParser); + if (isFAWE) { + FastAsyncWorldEditDelegate.init(); + } } + @SuppressWarnings("deprecation") public void register(Key id) throws ReflectiveOperationException { BlockType blockType = new BlockType(id.toString(), blockState -> blockState); this.field$BlockType$blockMaterial.set(blockType, LazyReference.from(() -> new BukkitBlockRegistry.BukkitBlockMaterial(null, Material.STONE))); @@ -45,6 +49,7 @@ public class WorldEditBlockRegister { } @Override + @SuppressWarnings("deprecation") public Stream getSuggestions(String input) { Set namespacesInUse = manager.namespacesInUse(); From 41a71716234bd584d20d9abdd0a8c25754f95543 Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Fri, 2 May 2025 00:20:30 +0800 Subject: [PATCH 04/51] =?UTF-8?q?perf(bukkit):=20=E4=BC=98=E5=8C=96=20chun?= =?UTF-8?q?ks=20=E5=8A=A0=E8=BD=BD=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../compatibility/worldedit/FastAsyncWorldEditDelegate.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java index d5f7e2d6f..5c1a6ca82 100644 --- a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java @@ -17,6 +17,7 @@ import net.momirealms.craftengine.bukkit.block.BukkitBlockManager; import net.momirealms.craftengine.bukkit.util.BlockStateUtils; import net.momirealms.craftengine.core.block.EmptyBlock; import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.world.ChunkPos; import org.bukkit.Bukkit; public class FastAsyncWorldEditDelegate extends AbstractDelegateExtent { @@ -69,9 +70,7 @@ public class FastAsyncWorldEditDelegate extends AbstractDelegateExtent { if (ceWorld == null) continue; var ceChunk = ceWorld.getChunkAtIfLoaded(chunkX, chunkZ); if (ceChunk == null) { - world.loadChunk(chunkX, chunkZ); - ceChunk = ceWorld.getChunkAtIfLoaded(chunkX, chunkZ); - if (ceChunk == null) continue; + ceChunk = ceWorld.worldDataStorage().readChunkAt(ceWorld, new ChunkPos(chunkX, chunkZ)); } var immutableBlockState = BukkitBlockManager.instance().getImmutableBlockState(stateId); if (immutableBlockState == null) { From bdaf9d759febd042a23a16d2e6e9f870c5229c19 Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Fri, 2 May 2025 00:29:40 +0800 Subject: [PATCH 05/51] =?UTF-8?q?perf(bukkit):=20=E4=BC=98=E5=8C=96=20chun?= =?UTF-8?q?ks=20=E5=8A=A0=E8=BD=BD=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../worldedit/FastAsyncWorldEditDelegate.java | 23 ++++++++++++++----- 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java index 5c1a6ca82..02f4c7611 100644 --- a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java @@ -18,8 +18,12 @@ import net.momirealms.craftengine.bukkit.util.BlockStateUtils; import net.momirealms.craftengine.core.block.EmptyBlock; import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.world.ChunkPos; +import net.momirealms.craftengine.core.world.chunk.CEChunk; import org.bukkit.Bukkit; +import java.util.HashSet; +import java.util.Set; + public class FastAsyncWorldEditDelegate extends AbstractDelegateExtent { protected FastAsyncWorldEditDelegate(Extent extent) { super(extent); @@ -51,6 +55,13 @@ public class FastAsyncWorldEditDelegate extends AbstractDelegateExtent { private void processBlocks(Region region, Pattern pattern) { try { + var weWorld = region.getWorld(); + if (weWorld == null) return; + var world = Bukkit.getWorld(weWorld.getName()); + if (world == null) return; + var ceWorld = CraftEngine.instance().worldManager().getWorld(world.getUID()); + if (ceWorld == null) return; + Set needSaveChunks = new HashSet<>(); for (BlockVector3 position : region) { BaseBlock blockState = pattern.applyBlock(position); BlockState oldBlockState = getBlock(position); @@ -62,15 +73,11 @@ public class FastAsyncWorldEditDelegate extends AbstractDelegateExtent { int stateId = BlockStateUtils.blockDataToId(Bukkit.createBlockData(blockState.getAsString())); int oldStateId = BlockStateUtils.blockDataToId(Bukkit.createBlockData(oldBlockState.getAsString())); if (BlockStateUtils.isVanillaBlock(stateId) && BlockStateUtils.isVanillaBlock(oldStateId)) continue; - var weWorld = region.getWorld(); - if (weWorld == null) continue; - var world = Bukkit.getWorld(weWorld.getName()); - if (world == null) continue; - var ceWorld = CraftEngine.instance().worldManager().getWorld(world.getUID()); - if (ceWorld == null) continue; var ceChunk = ceWorld.getChunkAtIfLoaded(chunkX, chunkZ); + boolean needSave = false; if (ceChunk == null) { ceChunk = ceWorld.worldDataStorage().readChunkAt(ceWorld, new ChunkPos(chunkX, chunkZ)); + needSave = true; } var immutableBlockState = BukkitBlockManager.instance().getImmutableBlockState(stateId); if (immutableBlockState == null) { @@ -78,6 +85,10 @@ public class FastAsyncWorldEditDelegate extends AbstractDelegateExtent { } else { ceChunk.setBlockState(blockX, blockY, blockZ, immutableBlockState); } + if (needSave) needSaveChunks.add(ceChunk); + } + for (CEChunk ceChunk : needSaveChunks) { + ceWorld.worldDataStorage().writeChunkAt(ceChunk.chunkPos(), ceChunk, true); } } catch (Exception e) { CraftEngine.instance().logger().warn("Error when recording FastAsyncWorldEdit operation blocks", e); From 7266a0eee2758cd76f1392e8976ab5dcde62ee0a Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Fri, 2 May 2025 00:57:00 +0800 Subject: [PATCH 06/51] =?UTF-8?q?perf(bukkit):=20=E4=BC=98=E5=8C=96=20chun?= =?UTF-8?q?ks=20=E5=8A=A0=E8=BD=BD=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../compatibility/worldedit/FastAsyncWorldEditDelegate.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java index 02f4c7611..d7371b9d1 100644 --- a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java @@ -74,10 +74,8 @@ public class FastAsyncWorldEditDelegate extends AbstractDelegateExtent { int oldStateId = BlockStateUtils.blockDataToId(Bukkit.createBlockData(oldBlockState.getAsString())); if (BlockStateUtils.isVanillaBlock(stateId) && BlockStateUtils.isVanillaBlock(oldStateId)) continue; var ceChunk = ceWorld.getChunkAtIfLoaded(chunkX, chunkZ); - boolean needSave = false; if (ceChunk == null) { ceChunk = ceWorld.worldDataStorage().readChunkAt(ceWorld, new ChunkPos(chunkX, chunkZ)); - needSave = true; } var immutableBlockState = BukkitBlockManager.instance().getImmutableBlockState(stateId); if (immutableBlockState == null) { @@ -85,7 +83,7 @@ public class FastAsyncWorldEditDelegate extends AbstractDelegateExtent { } else { ceChunk.setBlockState(blockX, blockY, blockZ, immutableBlockState); } - if (needSave) needSaveChunks.add(ceChunk); + needSaveChunks.add(ceChunk); } for (CEChunk ceChunk : needSaveChunks) { ceWorld.worldDataStorage().writeChunkAt(ceChunk.chunkPos(), ceChunk, true); From 350f7159d526465a4ef4a117ee3f5628756087ec Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Fri, 2 May 2025 14:44:37 +0800 Subject: [PATCH 07/51] =?UTF-8?q?perf(bukkit):=20=E4=BC=98=E5=8C=96=20chun?= =?UTF-8?q?ks=20=E5=8A=A0=E8=BD=BD=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../worldedit/FastAsyncWorldEditDelegate.java | 92 ++++++++++++------- 1 file changed, 60 insertions(+), 32 deletions(-) diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java index d7371b9d1..9ff17b4ba 100644 --- a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java @@ -5,28 +5,39 @@ import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.event.extent.EditSessionEvent; import com.sk89q.worldedit.extent.AbstractDelegateExtent; -import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.function.mask.Mask; +import com.sk89q.worldedit.function.operation.Operation; import com.sk89q.worldedit.function.pattern.Pattern; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.regions.Region; import com.sk89q.worldedit.util.eventbus.Subscribe; import com.sk89q.worldedit.world.block.BaseBlock; -import com.sk89q.worldedit.world.block.BlockState; +import com.sk89q.worldedit.world.block.BlockStateHolder; import net.momirealms.craftengine.bukkit.block.BukkitBlockManager; import net.momirealms.craftengine.bukkit.util.BlockStateUtils; import net.momirealms.craftengine.core.block.EmptyBlock; import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.world.CEWorld; import net.momirealms.craftengine.core.world.ChunkPos; import net.momirealms.craftengine.core.world.chunk.CEChunk; import org.bukkit.Bukkit; +import java.io.IOException; import java.util.HashSet; +import java.util.Objects; import java.util.Set; public class FastAsyncWorldEditDelegate extends AbstractDelegateExtent { - protected FastAsyncWorldEditDelegate(Extent extent) { - super(extent); + private final Set needSaveChunks; + private final CEWorld ceWorld; + + protected FastAsyncWorldEditDelegate(EditSessionEvent event) { + super(event.getExtent()); + this.needSaveChunks = new HashSet<>(); + var weWorld = event.getWorld(); + var world = Bukkit.getWorld(Objects.requireNonNull(weWorld).getName()); + var ceWorld = CraftEngine.instance().worldManager().getWorld(Objects.requireNonNull(world).getUID()); + this.ceWorld = Objects.requireNonNull(ceWorld); } public static void init() { @@ -36,7 +47,7 @@ public class FastAsyncWorldEditDelegate extends AbstractDelegateExtent { @SuppressWarnings("unused") public void onEditSessionEvent(EditSessionEvent event) { if (event.getStage() != EditSession.Stage.BEFORE_HISTORY) return; - event.setExtent(new FastAsyncWorldEditDelegate(event.getExtent())); + event.setExtent(new FastAsyncWorldEditDelegate(event)); } }); } @@ -53,43 +64,60 @@ public class FastAsyncWorldEditDelegate extends AbstractDelegateExtent { return super.replaceBlocks(region, mask, pattern); } + @Override + public > boolean setBlock(int x, int y, int z, T block) { + try { + BaseBlock oldBlockState = getBlock(x, y, z).toBaseBlock(); + this.processBlock(x, y, z, block.toBaseBlock(), oldBlockState); + } catch (Exception e) { + CraftEngine.instance().logger().warn("Error when recording FastAsyncWorldEdit operation blocks", e); + } + return super.setBlock(x, y, z, block); + } + + @Override + protected Operation commitBefore() { + try { + for (CEChunk ceChunk : this.needSaveChunks) { + this.ceWorld.worldDataStorage().writeChunkAt(ceChunk.chunkPos(), ceChunk, true); + } + } catch (Exception e) { + CraftEngine.instance().logger().warn("Error when recording FastAsyncWorldEdit operation chunks", e); + } + return super.commitBefore(); + } + private void processBlocks(Region region, Pattern pattern) { try { - var weWorld = region.getWorld(); - if (weWorld == null) return; - var world = Bukkit.getWorld(weWorld.getName()); - if (world == null) return; - var ceWorld = CraftEngine.instance().worldManager().getWorld(world.getUID()); - if (ceWorld == null) return; - Set needSaveChunks = new HashSet<>(); for (BlockVector3 position : region) { BaseBlock blockState = pattern.applyBlock(position); - BlockState oldBlockState = getBlock(position); + BaseBlock oldBlockState = getBlock(position).toBaseBlock(); int blockX = position.x(); int blockY = position.y(); int blockZ = position.z(); - int chunkX = blockX >> 4; - int chunkZ = blockZ >> 4; - int stateId = BlockStateUtils.blockDataToId(Bukkit.createBlockData(blockState.getAsString())); - int oldStateId = BlockStateUtils.blockDataToId(Bukkit.createBlockData(oldBlockState.getAsString())); - if (BlockStateUtils.isVanillaBlock(stateId) && BlockStateUtils.isVanillaBlock(oldStateId)) continue; - var ceChunk = ceWorld.getChunkAtIfLoaded(chunkX, chunkZ); - if (ceChunk == null) { - ceChunk = ceWorld.worldDataStorage().readChunkAt(ceWorld, new ChunkPos(chunkX, chunkZ)); - } - var immutableBlockState = BukkitBlockManager.instance().getImmutableBlockState(stateId); - if (immutableBlockState == null) { - ceChunk.setBlockState(blockX, blockY, blockZ, EmptyBlock.STATE); - } else { - ceChunk.setBlockState(blockX, blockY, blockZ, immutableBlockState); - } - needSaveChunks.add(ceChunk); - } - for (CEChunk ceChunk : needSaveChunks) { - ceWorld.worldDataStorage().writeChunkAt(ceChunk.chunkPos(), ceChunk, true); + this.processBlock(blockX, blockY, blockZ, blockState, oldBlockState); } } catch (Exception e) { CraftEngine.instance().logger().warn("Error when recording FastAsyncWorldEdit operation blocks", e); } } + + private void processBlock(int blockX, int blockY, int blockZ, BaseBlock blockState, BaseBlock oldBlockState) throws IOException { + int chunkX = blockX >> 4; + int chunkZ = blockZ >> 4; + int stateId = BlockStateUtils.blockDataToId(Bukkit.createBlockData(blockState.getAsString())); + int oldStateId = BlockStateUtils.blockDataToId(Bukkit.createBlockData(oldBlockState.getAsString())); + if (BlockStateUtils.isVanillaBlock(stateId) && BlockStateUtils.isVanillaBlock(oldStateId)) return; + var ceChunk = this.ceWorld.getChunkAtIfLoaded(chunkX, chunkZ); + if (ceChunk == null) { + ceChunk = this.ceWorld.worldDataStorage().readChunkAt(this.ceWorld, new ChunkPos(chunkX, chunkZ)); + } + var immutableBlockState = BukkitBlockManager.instance().getImmutableBlockState(stateId); + if (immutableBlockState == null) { + ceChunk.setBlockState(blockX, blockY, blockZ, EmptyBlock.STATE); + } else { + ceChunk.setBlockState(blockX, blockY, blockZ, immutableBlockState); + } + this.needSaveChunks.add(ceChunk); + } } From c1adcd1ac7f83dc4c92bbafdad5cf308778cd490 Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Fri, 2 May 2025 16:34:07 +0800 Subject: [PATCH 08/51] =?UTF-8?q?refactor(core):=20=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E6=8A=A5=E9=94=99=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bukkit/loader/src/main/resources/translations/en.yml | 1 + bukkit/loader/src/main/resources/translations/zh_cn.yml | 1 + .../momirealms/craftengine/core/font/AbstractFontManager.java | 2 +- 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/bukkit/loader/src/main/resources/translations/en.yml b/bukkit/loader/src/main/resources/translations/en.yml index 7b9afee86..06b1acd9f 100644 --- a/bukkit/loader/src/main/resources/translations/en.yml +++ b/bukkit/loader/src/main/resources/translations/en.yml @@ -80,6 +80,7 @@ warning.config.image.invalid_font_chars: "Issue found in file - warning.config.image.missing_char: "Issue found in file - The image '' is missing the required 'char' argument." warning.config.image.codepoint_conflict: "Issue found in file - The image '' is using a character '()' in font that has been used by another image ''." warning.config.image.invalid_codepoint_grid: "Issue found in file - Image '' has an invalid 'chars' codepoint grid." +warning.config.image.invalid_char: "Issue found in file - The image '' has a 'char' argument is invalid. Please do not write a character that contains two Unicode characters such as '⁉️'." warning.config.image.file_not_found: "Issue found in file - PNG file '' not found for image ''." warning.config.image.invalid_hex_value: "Issue found in file - The image '' is using a unicode character '' that is not a valid hexadecimal (radix 16) value." warning.config.recipe.duplicate: "Issue found in file - Duplicated recipe ''. Please check if there is the same configuration in other files." diff --git a/bukkit/loader/src/main/resources/translations/zh_cn.yml b/bukkit/loader/src/main/resources/translations/zh_cn.yml index 860a110af..c1d7f67a8 100644 --- a/bukkit/loader/src/main/resources/translations/zh_cn.yml +++ b/bukkit/loader/src/main/resources/translations/zh_cn.yml @@ -80,6 +80,7 @@ warning.config.image.invalid_font_chars: "在文件 发现问题 warning.config.image.missing_char: "在文件 发现问题 - 图片 '' 缺少必需的 'char' 参数" warning.config.image.codepoint_conflict: "在文件 发现问题 - 图片 '' 在字体 中使用的字符 '()' 已被其他图片 '' 占用" warning.config.image.invalid_codepoint_grid: "在文件 发现问题 - 图片 '' 的 'chars' 码位网格无效" +warning.config.image.invalid_char: "在文件 发现问题 - 图片 '' 的 'char' 参数无效 请不要写一个包含两个 Unicode 的字符例如 '⁉️'" warning.config.image.file_not_found: "在文件 发现问题 - 图片 '' 的 PNG 文件 '' 未找到" warning.config.image.invalid_hex_value: "在文件 发现问题 - 图片 '' 使用的 Unicode 字符 '' 不是有效的十六进制值" warning.config.recipe.duplicate: "在文件 发现问题 - 重复的配方 '' 请检查其他文件中是否存在相同配置" diff --git a/core/src/main/java/net/momirealms/craftengine/core/font/AbstractFontManager.java b/core/src/main/java/net/momirealms/craftengine/core/font/AbstractFontManager.java index 3277303cf..5dc6a1986 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/font/AbstractFontManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/font/AbstractFontManager.java @@ -482,7 +482,7 @@ public abstract class AbstractFontManager implements FontManager { } } if (codepoints.length == 0) { - throw new LocalizedResourceConfigException("warning.config.image.missing_char", path, id); + throw new LocalizedResourceConfigException("warning.config.image.invalid_char", path, id); } codepointGrid[i] = codepoints; if (size == -1) size = codepoints.length; From b1fba7627b3efcdf493189f468ff15c03928fe1b Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Fri, 2 May 2025 16:34:31 +0800 Subject: [PATCH 09/51] =?UTF-8?q?refactor(core):=20=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E6=8A=A5=E9=94=99=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index a91348e1c..30c9a5e26 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,7 +4,7 @@ org.gradle.jvmargs=-Xmx1G # Rule: [major update].[feature update].[bug fix] project_version=0.0.53-beta.1 config_version=31 -lang_version=9 +lang_version=10 project_group=net.momirealms latest_supported_version=1.21.5 From d4790659111bb485714914fa269066cca429394f Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Fri, 2 May 2025 17:34:42 +0800 Subject: [PATCH 10/51] =?UTF-8?q?refactor(bukkit):=20=E4=BC=98=E5=8C=96=20?= =?UTF-8?q?FastAsyncWorldEditDelegate=20=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../worldedit/FastAsyncWorldEditDelegate.java | 36 ++++++++++++++++--- 1 file changed, 31 insertions(+), 5 deletions(-) diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java index 9ff17b4ba..d7c11b7eb 100644 --- a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java @@ -1,6 +1,7 @@ package net.momirealms.craftengine.bukkit.compatibility.worldedit; import com.fastasyncworldedit.core.configuration.Settings; +import com.fastasyncworldedit.core.queue.implementation.ParallelQueueExtent; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.event.extent.EditSessionEvent; @@ -24,9 +25,10 @@ import org.bukkit.Bukkit; import java.io.IOException; import java.util.HashSet; -import java.util.Objects; import java.util.Set; +import static java.util.Objects.requireNonNull; + public class FastAsyncWorldEditDelegate extends AbstractDelegateExtent { private final Set needSaveChunks; private final CEWorld ceWorld; @@ -35,9 +37,9 @@ public class FastAsyncWorldEditDelegate extends AbstractDelegateExtent { super(event.getExtent()); this.needSaveChunks = new HashSet<>(); var weWorld = event.getWorld(); - var world = Bukkit.getWorld(Objects.requireNonNull(weWorld).getName()); - var ceWorld = CraftEngine.instance().worldManager().getWorld(Objects.requireNonNull(world).getUID()); - this.ceWorld = Objects.requireNonNull(ceWorld); + var world = Bukkit.getWorld(requireNonNull(weWorld).getName()); + var ceWorld = CraftEngine.instance().worldManager().getWorld(requireNonNull(world).getUID()); + this.ceWorld = requireNonNull(ceWorld); } public static void init() { @@ -52,17 +54,41 @@ public class FastAsyncWorldEditDelegate extends AbstractDelegateExtent { }); } + @Override + public int setBlocks(final Set vset, final Pattern pattern) { + this.processBlocks(vset, pattern); + return super.setBlocks(vset, pattern); + } + @Override public int setBlocks(final Region region, final Pattern pattern) { this.processBlocks(region, pattern); return super.setBlocks(region, pattern); } + + @Override + public > int setBlocks(final Region region, final B block) { + this.processBlocks(region, block); + return super.setBlocks(region, block); + } + @Override public int replaceBlocks(Region region, Mask mask, Pattern pattern) { this.processBlocks(region, pattern); return super.replaceBlocks(region, mask, pattern); } + @Override + public > int replaceBlocks(final Region region, final Set filter, final B replacement) { + this.processBlocks(region, replacement); + return super.replaceBlocks(region, filter, replacement); + } + + @Override + public int replaceBlocks(final Region region, final Set filter, final Pattern pattern) { + this.processBlocks(region, pattern); + return super.replaceBlocks(region, filter, pattern); + } @Override public > boolean setBlock(int x, int y, int z, T block) { @@ -87,7 +113,7 @@ public class FastAsyncWorldEditDelegate extends AbstractDelegateExtent { return super.commitBefore(); } - private void processBlocks(Region region, Pattern pattern) { + private void processBlocks(Iterable region, Pattern pattern) { try { for (BlockVector3 position : region) { BaseBlock blockState = pattern.applyBlock(position); From 24d859752778d67251f878ff17bc0235c26e8aca Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Fri, 2 May 2025 17:38:26 +0800 Subject: [PATCH 11/51] =?UTF-8?q?refactor(bukkit):=20=E4=BC=98=E5=8C=96=20?= =?UTF-8?q?FastAsyncWorldEditDelegate=20=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../worldedit/FastAsyncWorldEditDelegate.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java index d7c11b7eb..8bb866e5d 100644 --- a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java @@ -101,6 +101,17 @@ public class FastAsyncWorldEditDelegate extends AbstractDelegateExtent { return super.setBlock(x, y, z, block); } + @Override + public > boolean setBlock(BlockVector3 position, T block) { + try { + BaseBlock oldBlockState = getBlock(position).toBaseBlock(); + this.processBlock(position.x(), position.y(), position.z(), block.toBaseBlock(), oldBlockState); + } catch (Exception e) { + CraftEngine.instance().logger().warn("Error when recording FastAsyncWorldEdit operation blocks", e); + } + return super.setBlock(position, block); + } + @Override protected Operation commitBefore() { try { From abd3d04b6ee73460b4f40f66aaf63e4c4466ef85 Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Fri, 2 May 2025 17:39:56 +0800 Subject: [PATCH 12/51] =?UTF-8?q?refactor(bukkit):=20=E4=BC=98=E5=8C=96=20?= =?UTF-8?q?FastAsyncWorldEditDelegate=20=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../compatibility/worldedit/FastAsyncWorldEditDelegate.java | 1 - 1 file changed, 1 deletion(-) diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java index 8bb866e5d..b0f12698c 100644 --- a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java @@ -1,7 +1,6 @@ package net.momirealms.craftengine.bukkit.compatibility.worldedit; import com.fastasyncworldedit.core.configuration.Settings; -import com.fastasyncworldedit.core.queue.implementation.ParallelQueueExtent; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.event.extent.EditSessionEvent; From ef89cc8280fa8c95c132ef5bcfc02317157be365 Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Fri, 2 May 2025 17:57:42 +0800 Subject: [PATCH 13/51] =?UTF-8?q?refactor(bukkit):=20=E6=94=B9=E8=BF=9B?= =?UTF-8?q?=E4=BF=9D=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../worldedit/FastAsyncWorldEditDelegate.java | 21 ++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java index b0f12698c..a09562412 100644 --- a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java @@ -113,13 +113,7 @@ public class FastAsyncWorldEditDelegate extends AbstractDelegateExtent { @Override protected Operation commitBefore() { - try { - for (CEChunk ceChunk : this.needSaveChunks) { - this.ceWorld.worldDataStorage().writeChunkAt(ceChunk.chunkPos(), ceChunk, true); - } - } catch (Exception e) { - CraftEngine.instance().logger().warn("Error when recording FastAsyncWorldEdit operation chunks", e); - } + saveAllChunks(); return super.commitBefore(); } @@ -133,6 +127,7 @@ public class FastAsyncWorldEditDelegate extends AbstractDelegateExtent { int blockZ = position.z(); this.processBlock(blockX, blockY, blockZ, blockState, oldBlockState); } + saveAllChunks(); } catch (Exception e) { CraftEngine.instance().logger().warn("Error when recording FastAsyncWorldEdit operation blocks", e); } @@ -156,4 +151,16 @@ public class FastAsyncWorldEditDelegate extends AbstractDelegateExtent { } this.needSaveChunks.add(ceChunk); } + + private void saveAllChunks() { + try { + for (CEChunk ceChunk : this.needSaveChunks) { + System.out.println("saveAllChunks"); + this.ceWorld.worldDataStorage().writeChunkAt(ceChunk.chunkPos(), ceChunk, true); + } + this.needSaveChunks.clear(); + } catch (Exception e) { + CraftEngine.instance().logger().warn("Error when recording FastAsyncWorldEdit operation chunks", e); + } + } } From 74cc90c92ca2963eeba6eb7924053b4eeac63696 Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Fri, 2 May 2025 17:57:51 +0800 Subject: [PATCH 14/51] =?UTF-8?q?refactor(bukkit):=20=E6=94=B9=E8=BF=9B?= =?UTF-8?q?=E4=BF=9D=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../compatibility/worldedit/FastAsyncWorldEditDelegate.java | 1 - 1 file changed, 1 deletion(-) diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java index a09562412..53987af76 100644 --- a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java @@ -155,7 +155,6 @@ public class FastAsyncWorldEditDelegate extends AbstractDelegateExtent { private void saveAllChunks() { try { for (CEChunk ceChunk : this.needSaveChunks) { - System.out.println("saveAllChunks"); this.ceWorld.worldDataStorage().writeChunkAt(ceChunk.chunkPos(), ceChunk, true); } this.needSaveChunks.clear(); From 6bdd3dccde24ee85547824a0843c90647e3a134d Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Fri, 2 May 2025 18:24:32 +0800 Subject: [PATCH 15/51] =?UTF-8?q?=E5=B0=B1=E8=BF=99=E6=A0=B7=E5=90=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../block/behavior/CropBlockBehavior.java | 4 ++-- .../craftengine/core/loot/LootContext.java | 24 +++++-------------- .../craftengine/core/loot/LootTable.java | 2 +- .../core/loot/condition/AllOfCondition.java | 1 + .../core/pack/AbstractPackManager.java | 4 ++-- ...PathMatcher.java => PathMatcherAllOf.java} | 13 ++++------ ...PathMatcher.java => PathMatcherAnyOf.java} | 14 ++++------- ...sMatcher.java => PathMatcherContains.java} | 6 ++--- ...PathMatcher.java => PathMatcherExact.java} | 6 ++--- ...eMatcher.java => PathMatcherFilename.java} | 6 ++--- ...hMatcher.java => PathMatcherInverted.java} | 11 +++------ ...cher.java => PathMatcherParentPrefix.java} | 6 ++--- ...cher.java => PathMatcherParentSuffix.java} | 6 ++--- .../pack/conflict/matcher/PathMatchers.java | 17 ++++++------- ...lution.java => ResolutionConditional.java} | 6 ++--- ...olution.java => ResolutionMergeAltas.java} | 4 ++-- ...solution.java => ResolutionMergeJson.java} | 6 ++--- ...on.java => ResolutionMergePackMcMeta.java} | 6 ++--- .../pack/conflict/resolution/Resolutions.java | 8 +++---- .../core/plugin/config/Config.java | 8 +++---- .../minimessage/MiniMessageTextContext.java | 1 - .../core/util/condition/AllOfCondition.java | 6 +++++ .../core/util/condition/AnyOfCondition.java | 6 +++++ .../core/util/condition/CommonConditions.java | 11 +++++++++ .../util/condition/InvertedCondition.java | 6 +++++ .../core/util/context/CommonContext.java | 8 +++---- .../core/util/context/CommonParameters.java | 7 +++++- 27 files changed, 105 insertions(+), 98 deletions(-) rename core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/{AllOfPathMatcher.java => PathMatcherAllOf.java} (79%) rename core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/{AnyOfPathMatcher.java => PathMatcherAnyOf.java} (76%) rename core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/{PathContainsMatcher.java => PathMatcherContains.java} (87%) rename core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/{ExactPathMatcher.java => PathMatcherExact.java} (88%) rename core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/{FilenameMatcher.java => PathMatcherFilename.java} (87%) rename core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/{InvertedPathMatcher.java => PathMatcherInverted.java} (79%) rename core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/{ParentPathPrefixMatcher.java => PathMatcherParentPrefix.java} (87%) rename core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/{ParentPathSuffixMatcher.java => PathMatcherParentSuffix.java} (87%) rename core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/{ConditionalResolution.java => ResolutionConditional.java} (85%) rename core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/{MergeAltasResolution.java => ResolutionMergeAltas.java} (93%) rename core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/{MergeJsonResolution.java => ResolutionMergeJson.java} (90%) rename core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/{MergePackMcMetaResolution.java => ResolutionMergePackMcMeta.java} (97%) create mode 100644 core/src/main/java/net/momirealms/craftengine/core/util/condition/CommonConditions.java diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/CropBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/CropBlockBehavior.java index 6e18976af..9228904eb 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/CropBlockBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/CropBlockBehavior.java @@ -148,10 +148,10 @@ public class CropBlockBehavior extends BushBlockBehavior { int z = FastNMS.INSTANCE.field$Vec3i$z(pos); net.momirealms.craftengine.core.world.World wrappedWorld = new BukkitWorld(world); - int i = this.getAge(immutableBlockState) + this.boneMealBonus.getInt(new LootContext(wrappedWorld, ContextHolder.builder() + int i = this.getAge(immutableBlockState) + this.boneMealBonus.getInt(new LootContext(wrappedWorld, 1, ThreadLocalRandom.current(), ContextHolder.builder() .withParameter(LootParameters.WORLD, wrappedWorld) .withParameter(LootParameters.LOCATION, Vec3d.atCenterOf(new Vec3i(x, y, z))) - .build(), ThreadLocalRandom.current(), 1)); + .build())); int maxAge = this.ageProperty.max; if (i > maxAge) { i = maxAge; diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/LootContext.java b/core/src/main/java/net/momirealms/craftengine/core/loot/LootContext.java index 2ad3dc4f4..ae73df88a 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/LootContext.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/LootContext.java @@ -1,5 +1,6 @@ package net.momirealms.craftengine.core.loot; +import net.momirealms.craftengine.core.util.context.CommonContext; import net.momirealms.craftengine.core.util.context.ContextHolder; import net.momirealms.craftengine.core.util.context.ContextKey; import net.momirealms.craftengine.core.world.World; @@ -7,43 +8,30 @@ import net.momirealms.craftengine.core.world.World; import java.util.Optional; import java.util.Random; -public class LootContext { +public class LootContext extends CommonContext { private final World world; - private final ContextHolder contexts; private final Random randomSource; private final float luck; - public LootContext(World world, ContextHolder contexts, Random randomSource, float luck) { + public LootContext(World world, float luck, Random randomSource, ContextHolder contexts) { + super(contexts); this.randomSource = randomSource; - this.contexts = contexts; this.world = world; this.luck = luck; } public Random randomSource() { - return randomSource; + return this.randomSource; } public Optional getOptionalParameter(ContextKey parameter) { - return this.contexts.getOptional(parameter); - } - - public boolean hasParameter(ContextKey parameter) { - return this.contexts.has(parameter); - } - - public T getParameterOrThrow(ContextKey parameter) { - return this.contexts.getOrThrow(parameter); + return super.contexts.getOptional(parameter); } public float luck() { return luck; } - public ContextHolder contexts() { - return contexts; - } - public World world() { return world; } diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/LootTable.java b/core/src/main/java/net/momirealms/craftengine/core/loot/LootTable.java index e8b2176ff..152eec336 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/LootTable.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/LootTable.java @@ -80,7 +80,7 @@ public class LootTable { } public ArrayList> getRandomItems(ContextHolder parameters, World world) { - return this.getRandomItems(new LootContext(world, parameters, ThreadLocalRandom.current(), 1)); + return this.getRandomItems(new LootContext(world, 1, ThreadLocalRandom.current(), parameters)); } private ArrayList> getRandomItems(LootContext context) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/condition/AllOfCondition.java b/core/src/main/java/net/momirealms/craftengine/core/loot/condition/AllOfCondition.java index 6c1e9eaa1..7a693dde4 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/condition/AllOfCondition.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/condition/AllOfCondition.java @@ -30,6 +30,7 @@ public class AllOfCondition implements LootCondition { } public static class Factory implements LootConditionFactory { + @SuppressWarnings("unchecked") @Override public LootCondition create(Map arguments) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/AbstractPackManager.java b/core/src/main/java/net/momirealms/craftengine/core/pack/AbstractPackManager.java index bc4831cec..ff722cd59 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/AbstractPackManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/AbstractPackManager.java @@ -7,7 +7,7 @@ import net.momirealms.craftengine.core.font.BitmapImage; import net.momirealms.craftengine.core.font.Font; import net.momirealms.craftengine.core.item.EquipmentData; import net.momirealms.craftengine.core.pack.conflict.PathContext; -import net.momirealms.craftengine.core.pack.conflict.resolution.ConditionalResolution; +import net.momirealms.craftengine.core.pack.conflict.resolution.ResolutionConditional; import net.momirealms.craftengine.core.pack.host.ResourcePackHost; import net.momirealms.craftengine.core.pack.host.ResourcePackHosts; import net.momirealms.craftengine.core.pack.host.impl.NoneHost; @@ -1159,7 +1159,7 @@ public abstract class AbstractPackManager implements PackManager { PathContext relativeCTX = PathContext.of(relative); PathContext targetCTX = PathContext.of(targetPath); PathContext fileCTX = PathContext.of(file); - for (ConditionalResolution resolution : Config.resolutions()) { + for (ResolutionConditional resolution : Config.resolutions()) { if (resolution.matcher().test(relativeCTX)) { resolution.resolution().run(targetCTX, fileCTX); return FileVisitResult.CONTINUE; diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/AllOfPathMatcher.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherAllOf.java similarity index 79% rename from core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/AllOfPathMatcher.java rename to core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherAllOf.java index 325f7632b..70daf8447 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/AllOfPathMatcher.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherAllOf.java @@ -10,18 +10,13 @@ import net.momirealms.craftengine.core.util.context.Condition; import java.util.List; import java.util.Map; -public class AllOfPathMatcher extends AllOfCondition implements PathMatcher { +public class PathMatcherAllOf extends AllOfCondition implements PathMatcher { public static final Factory FACTORY = new Factory(); - public AllOfPathMatcher(List> conditions) { + public PathMatcherAllOf(List> conditions) { super(conditions); } - @Override - public Key type() { - return PathMatchers.ALL_OF; - } - public static class Factory implements PathMatcherFactory { @SuppressWarnings("unchecked") @@ -30,10 +25,10 @@ public class AllOfPathMatcher extends AllOfCondition implements Pat Object termsObj = arguments.get("terms"); if (termsObj instanceof List list) { List> terms = (List>) list; - return new AllOfPathMatcher(PathMatchers.fromMapList(terms)); + return new PathMatcherAllOf(PathMatchers.fromMapList(terms)); } else if (termsObj instanceof Map) { Map terms = MiscUtils.castToMap(termsObj, false); - return new AllOfPathMatcher(PathMatchers.fromMapList(List.of(terms))); + return new PathMatcherAllOf(PathMatchers.fromMapList(List.of(terms))); } else { throw new LocalizedException("warning.config.conflict_matcher.all_of.missing_terms"); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/AnyOfPathMatcher.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherAnyOf.java similarity index 76% rename from core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/AnyOfPathMatcher.java rename to core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherAnyOf.java index 4138629e2..efb1d584c 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/AnyOfPathMatcher.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherAnyOf.java @@ -2,7 +2,6 @@ package net.momirealms.craftengine.core.pack.conflict.matcher; import net.momirealms.craftengine.core.pack.conflict.PathContext; import net.momirealms.craftengine.core.plugin.locale.LocalizedException; -import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.MiscUtils; import net.momirealms.craftengine.core.util.condition.AnyOfCondition; import net.momirealms.craftengine.core.util.context.Condition; @@ -10,18 +9,13 @@ import net.momirealms.craftengine.core.util.context.Condition; import java.util.List; import java.util.Map; -public class AnyOfPathMatcher extends AnyOfCondition implements PathMatcher { +public class PathMatcherAnyOf extends AnyOfCondition implements PathMatcher { public static final Factory FACTORY = new Factory(); - public AnyOfPathMatcher(List> conditions) { + public PathMatcherAnyOf(List> conditions) { super(conditions); } - @Override - public Key type() { - return PathMatchers.ANY_OF; - } - public static class Factory implements PathMatcherFactory { @SuppressWarnings("unchecked") @@ -30,10 +24,10 @@ public class AnyOfPathMatcher extends AnyOfCondition implements Pat Object termsObj = arguments.get("terms"); if (termsObj instanceof List list) { List> terms = (List>) list; - return new AnyOfPathMatcher(PathMatchers.fromMapList(terms)); + return new PathMatcherAnyOf(PathMatchers.fromMapList(terms)); } else if (termsObj instanceof Map) { Map terms = MiscUtils.castToMap(termsObj, false); - return new AnyOfPathMatcher(PathMatchers.fromMapList(List.of(terms))); + return new PathMatcherAnyOf(PathMatchers.fromMapList(List.of(terms))); } else { throw new LocalizedException("warning.config.conflict_matcher.any_of.missing_terms"); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathContainsMatcher.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherContains.java similarity index 87% rename from core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathContainsMatcher.java rename to core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherContains.java index b11b30f2a..77ee9f683 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathContainsMatcher.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherContains.java @@ -7,11 +7,11 @@ import net.momirealms.craftengine.core.util.ResourceConfigUtils; import java.util.Map; -public class PathContainsMatcher implements PathMatcher { +public class PathMatcherContains implements PathMatcher { public static final Factory FACTORY = new Factory(); private final String path; - public PathContainsMatcher(String path) { + public PathMatcherContains(String path) { this.path = path; } @@ -31,7 +31,7 @@ public class PathContainsMatcher implements PathMatcher { @Override public PathMatcher create(Map arguments) { String path = ResourceConfigUtils.requireNonEmptyStringOrThrow(arguments.get("path"), () -> new LocalizedException("warning.config.conflict_matcher.contains.missing_path")); - return new PathContainsMatcher(path); + return new PathMatcherContains(path); } } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/ExactPathMatcher.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherExact.java similarity index 88% rename from core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/ExactPathMatcher.java rename to core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherExact.java index 34b55bb4d..7864822fa 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/ExactPathMatcher.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherExact.java @@ -7,11 +7,11 @@ import net.momirealms.craftengine.core.util.ResourceConfigUtils; import java.util.Map; -public class ExactPathMatcher implements PathMatcher { +public class PathMatcherExact implements PathMatcher { public static final Factory FACTORY = new Factory(); private final String path; - public ExactPathMatcher(String path) { + public PathMatcherExact(String path) { this.path = path; } @@ -31,7 +31,7 @@ public class ExactPathMatcher implements PathMatcher { @Override public PathMatcher create(Map arguments) { String path = ResourceConfigUtils.requireNonEmptyStringOrThrow(arguments.get("path"), () -> new LocalizedException("warning.config.conflict_matcher.exact.missing_path")); - return new ExactPathMatcher(path); + return new PathMatcherExact(path); } } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/FilenameMatcher.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherFilename.java similarity index 87% rename from core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/FilenameMatcher.java rename to core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherFilename.java index e221ebfd2..3a33b6442 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/FilenameMatcher.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherFilename.java @@ -7,11 +7,11 @@ import net.momirealms.craftengine.core.util.ResourceConfigUtils; import java.util.Map; -public class FilenameMatcher implements PathMatcher { +public class PathMatcherFilename implements PathMatcher { public static final Factory FACTORY = new Factory(); private final String name; - public FilenameMatcher(String name) { + public PathMatcherFilename(String name) { this.name = name; } @@ -31,7 +31,7 @@ public class FilenameMatcher implements PathMatcher { @Override public PathMatcher create(Map arguments) { String name = ResourceConfigUtils.requireNonEmptyStringOrThrow(arguments.get("name"), () -> new LocalizedException("warning.config.conflict_matcher.filename.missing_name")); - return new FilenameMatcher(name); + return new PathMatcherFilename(name); } } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/InvertedPathMatcher.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherInverted.java similarity index 79% rename from core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/InvertedPathMatcher.java rename to core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherInverted.java index d200f979e..c1d6060fb 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/InvertedPathMatcher.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherInverted.java @@ -9,25 +9,20 @@ import net.momirealms.craftengine.core.util.condition.InvertedCondition; import java.util.Map; -public class InvertedPathMatcher extends InvertedCondition implements PathMatcher { +public class PathMatcherInverted extends InvertedCondition implements PathMatcher { public static final Factory FACTORY = new Factory(); - public InvertedPathMatcher(PathMatcher condition) { + public PathMatcherInverted(PathMatcher condition) { super(condition); } - @Override - public Key type() { - return PathMatchers.INVERTED; - } - public static class Factory implements PathMatcherFactory { @Override public PathMatcher create(Map arguments) { Object inverted = ResourceConfigUtils.requireNonNullOrThrow(arguments.get("term"), () -> new LocalizedException("warning.config.conflict_matcher.inverted.missing_term")); Map term = MiscUtils.castToMap(inverted, false); - return new InvertedPathMatcher(PathMatchers.fromMap(term)); + return new PathMatcherInverted(PathMatchers.fromMap(term)); } } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/ParentPathPrefixMatcher.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherParentPrefix.java similarity index 87% rename from core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/ParentPathPrefixMatcher.java rename to core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherParentPrefix.java index 9b753bebd..fb3bbafa7 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/ParentPathPrefixMatcher.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherParentPrefix.java @@ -8,11 +8,11 @@ import net.momirealms.craftengine.core.util.ResourceConfigUtils; import java.nio.file.Path; import java.util.Map; -public class ParentPathPrefixMatcher implements PathMatcher { +public class PathMatcherParentPrefix implements PathMatcher { public static final Factory FACTORY = new Factory(); private final String prefix; - public ParentPathPrefixMatcher(String prefix) { + public PathMatcherParentPrefix(String prefix) { this.prefix = prefix; } @@ -34,7 +34,7 @@ public class ParentPathPrefixMatcher implements PathMatcher { @Override public PathMatcher create(Map arguments) { String prefix = ResourceConfigUtils.requireNonEmptyStringOrThrow(arguments.get("prefix"), () -> new LocalizedException("warning.config.conflict_matcher.parent_prefix.missing_prefix")); - return new ParentPathPrefixMatcher(prefix); + return new PathMatcherParentPrefix(prefix); } } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/ParentPathSuffixMatcher.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherParentSuffix.java similarity index 87% rename from core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/ParentPathSuffixMatcher.java rename to core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherParentSuffix.java index e91fc8e1a..971cdd82b 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/ParentPathSuffixMatcher.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherParentSuffix.java @@ -8,11 +8,11 @@ import net.momirealms.craftengine.core.util.ResourceConfigUtils; import java.nio.file.Path; import java.util.Map; -public class ParentPathSuffixMatcher implements PathMatcher { +public class PathMatcherParentSuffix implements PathMatcher { public static final Factory FACTORY = new Factory(); private final String suffix; - public ParentPathSuffixMatcher(String suffix) { + public PathMatcherParentSuffix(String suffix) { this.suffix = suffix; } @@ -34,7 +34,7 @@ public class ParentPathSuffixMatcher implements PathMatcher { @Override public PathMatcher create(Map arguments) { String suffix = ResourceConfigUtils.requireNonEmptyStringOrThrow(arguments.get("suffix"), () -> new LocalizedException("warning.config.conflict_matcher.parent_suffix.missing_suffix")); - return new ParentPathSuffixMatcher(suffix); + return new PathMatcherParentSuffix(suffix); } } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatchers.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatchers.java index a9de55bfd..7316e0d58 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatchers.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatchers.java @@ -8,6 +8,7 @@ import net.momirealms.craftengine.core.registry.WritableRegistry; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.ResourceConfigUtils; import net.momirealms.craftengine.core.util.ResourceKey; +import net.momirealms.craftengine.core.util.condition.AllOfCondition; import java.util.ArrayList; import java.util.List; @@ -25,15 +26,15 @@ public class PathMatchers { public static final Key INVERTED = Key.of("craftengine:inverted"); static { - register(PARENT_PATH_SUFFIX, ParentPathSuffixMatcher.FACTORY); - register(PARENT_PATH_PREFIX, ParentPathPrefixMatcher.FACTORY); + register(PARENT_PATH_SUFFIX, PathMatcherParentSuffix.FACTORY); + register(PARENT_PATH_PREFIX, PathMatcherParentPrefix.FACTORY); register(PATTERN, PathPatternMatcher.FACTORY); - register(EXACT, ExactPathMatcher.FACTORY); - register(FILENAME, FilenameMatcher.FACTORY); - register(ANY_OF, AnyOfPathMatcher.FACTORY); - register(ALL_OF, AllOfPathMatcher.FACTORY); - register(INVERTED, InvertedPathMatcher.FACTORY); - register(CONTAINS, PathContainsMatcher.FACTORY); + register(EXACT, PathMatcherExact.FACTORY); + register(FILENAME, PathMatcherFilename.FACTORY); + register(ANY_OF, PathMatcherAnyOf.FACTORY); + register(ALL_OF, PathMatcherAllOf.FACTORY); + register(INVERTED, PathMatcherInverted.FACTORY); + register(CONTAINS, PathMatcherContains.FACTORY); } public static void register(Key key, PathMatcherFactory factory) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/ConditionalResolution.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/ResolutionConditional.java similarity index 85% rename from core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/ConditionalResolution.java rename to core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/ResolutionConditional.java index f54c04c39..0c79d0c23 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/ConditionalResolution.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/ResolutionConditional.java @@ -8,7 +8,7 @@ import net.momirealms.craftengine.core.util.MiscUtils; import java.util.Map; -public record ConditionalResolution(PathMatcher matcher, Resolution resolution) implements Resolution { +public record ResolutionConditional(PathMatcher matcher, Resolution resolution) implements Resolution { public static final Factory FACTORY = new Factory(); @Override @@ -26,10 +26,10 @@ public record ConditionalResolution(PathMatcher matcher, Resolution resolution) public static class Factory implements ResolutionFactory { @Override - public ConditionalResolution create(Map arguments) { + public ResolutionConditional create(Map arguments) { Map term = MiscUtils.castToMap(arguments.get("term"), false); Map resolution = MiscUtils.castToMap(arguments.get("resolution"), false); - return new ConditionalResolution(PathMatchers.fromMap(term), Resolutions.fromMap(resolution)); + return new ResolutionConditional(PathMatchers.fromMap(term), Resolutions.fromMap(resolution)); } } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/MergeAltasResolution.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/ResolutionMergeAltas.java similarity index 93% rename from core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/MergeAltasResolution.java rename to core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/ResolutionMergeAltas.java index 6cced38f0..6f75bbb4d 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/MergeAltasResolution.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/ResolutionMergeAltas.java @@ -12,9 +12,9 @@ import java.io.IOException; import java.util.HashSet; import java.util.Map; -public class MergeAltasResolution implements Resolution { +public class ResolutionMergeAltas implements Resolution { public static final Factory FACTORY = new Factory(); - public static final MergeAltasResolution INSTANCE = new MergeAltasResolution(); + public static final ResolutionMergeAltas INSTANCE = new ResolutionMergeAltas(); @Override public void run(PathContext existing, PathContext conflict) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/MergeJsonResolution.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/ResolutionMergeJson.java similarity index 90% rename from core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/MergeJsonResolution.java rename to core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/ResolutionMergeJson.java index aca0b9425..88679856d 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/MergeJsonResolution.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/ResolutionMergeJson.java @@ -9,11 +9,11 @@ import net.momirealms.craftengine.core.util.Key; import java.io.IOException; import java.util.Map; -public class MergeJsonResolution implements Resolution { +public class ResolutionMergeJson implements Resolution { public static final Factory FACTORY = new Factory(); private final boolean deeply; - public MergeJsonResolution(boolean deeply) { + public ResolutionMergeJson(boolean deeply) { this.deeply = deeply; } @@ -44,7 +44,7 @@ public class MergeJsonResolution implements Resolution { @Override public Resolution create(Map arguments) { boolean deeply = (boolean) arguments.getOrDefault("deeply", false); - return new MergeJsonResolution(deeply); + return new ResolutionMergeJson(deeply); } } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/MergePackMcMetaResolution.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/ResolutionMergePackMcMeta.java similarity index 97% rename from core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/MergePackMcMetaResolution.java rename to core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/ResolutionMergePackMcMeta.java index 1ebeadd67..186a1c3eb 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/MergePackMcMetaResolution.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/ResolutionMergePackMcMeta.java @@ -11,11 +11,11 @@ import java.io.IOException; import java.nio.file.Path; import java.util.Map; -public class MergePackMcMetaResolution implements Resolution { +public class ResolutionMergePackMcMeta implements Resolution { public static final Factory FACTORY = new Factory(); private final String description; - public MergePackMcMetaResolution(String description) { + public ResolutionMergePackMcMeta(String description) { this.description = description; } @@ -209,7 +209,7 @@ public class MergePackMcMetaResolution implements Resolution { @Override public Resolution create(Map arguments) { String description = arguments.getOrDefault("description", "CraftEngine ResourcePack").toString(); - return new MergePackMcMetaResolution(description); + return new ResolutionMergePackMcMeta(description); } } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/Resolutions.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/Resolutions.java index 38f7754ca..86a3ae54d 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/Resolutions.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/Resolutions.java @@ -20,10 +20,10 @@ public class Resolutions { static { register(RETAIN_MATCHING, RetainMatchingResolution.FACTORY); - register(MERGE_JSON, MergeJsonResolution.FACTORY); - register(CONDITIONAL, ConditionalResolution.FACTORY); - register(MERGE_PACK_MCMETA, MergePackMcMetaResolution.FACTORY); - register(MERGE_ATLAS, MergeAltasResolution.FACTORY); + register(MERGE_JSON, ResolutionMergeJson.FACTORY); + register(CONDITIONAL, ResolutionConditional.FACTORY); + register(MERGE_PACK_MCMETA, ResolutionMergePackMcMeta.FACTORY); + register(MERGE_ATLAS, ResolutionMergeAltas.FACTORY); } public static void register(Key key, ResolutionFactory factory) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/Config.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/Config.java index e823d35e4..be4757d67 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/Config.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/Config.java @@ -13,7 +13,7 @@ import dev.dejvokep.boostedyaml.settings.updater.UpdaterSettings; import dev.dejvokep.boostedyaml.utils.format.NodeRole; import net.kyori.adventure.text.Component; import net.momirealms.craftengine.core.entity.furniture.ColliderType; -import net.momirealms.craftengine.core.pack.conflict.resolution.ConditionalResolution; +import net.momirealms.craftengine.core.pack.conflict.resolution.ResolutionConditional; import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.plugin.PluginProperties; import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; @@ -54,7 +54,7 @@ public class Config { protected boolean resource_pack$remove_tinted_leaves_particle; protected boolean resource_pack$generate_mod_assets; protected boolean resource_pack$override_uniform_font; - protected List resource_pack$duplicated_files_handler; + protected List resource_pack$duplicated_files_handler; protected List resource_pack$merge_external_folders; protected boolean resource_pack$protection$crash_tools$method_1; @@ -245,7 +245,7 @@ public class Config { try { resource_pack$duplicated_files_handler = config.getMapList("resource-pack.duplicated-files-handler").stream().map(it -> { Map args = MiscUtils.castToMap(it, false); - return ConditionalResolution.FACTORY.create(args); + return ResolutionConditional.FACTORY.create(args); }).toList(); } catch (LocalizedResourceConfigException e) { TranslationManager.instance().log(e.node(), e.arguments()); @@ -479,7 +479,7 @@ public class Config { return instance.resource_pack$delivery$file_to_upload; } - public static List resolutions() { + public static List resolutions() { return instance.resource_pack$duplicated_files_handler; } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/MiniMessageTextContext.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/MiniMessageTextContext.java index 5fe4279ec..fea64a87b 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/MiniMessageTextContext.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/MiniMessageTextContext.java @@ -2,7 +2,6 @@ package net.momirealms.craftengine.core.plugin.text.minimessage; import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import net.momirealms.craftengine.core.util.context.Context; -import net.momirealms.craftengine.core.util.context.ContextHolder; public interface MiniMessageTextContext extends Context { diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/condition/AllOfCondition.java b/core/src/main/java/net/momirealms/craftengine/core/util/condition/AllOfCondition.java index c50420e13..3abcf3ef1 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/util/condition/AllOfCondition.java +++ b/core/src/main/java/net/momirealms/craftengine/core/util/condition/AllOfCondition.java @@ -1,5 +1,6 @@ package net.momirealms.craftengine.core.util.condition; +import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.context.Condition; import java.util.List; @@ -20,4 +21,9 @@ public abstract class AllOfCondition implements Condition { } return true; } + + @Override + public Key type() { + return CommonConditions.ALL_OF; + } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/condition/AnyOfCondition.java b/core/src/main/java/net/momirealms/craftengine/core/util/condition/AnyOfCondition.java index bb2e08e4a..b9803a62b 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/util/condition/AnyOfCondition.java +++ b/core/src/main/java/net/momirealms/craftengine/core/util/condition/AnyOfCondition.java @@ -1,5 +1,6 @@ package net.momirealms.craftengine.core.util.condition; +import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.context.Condition; import java.util.List; @@ -20,4 +21,9 @@ public abstract class AnyOfCondition implements Condition { } return false; } + + @Override + public Key type() { + return CommonConditions.ANY_OF; + } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/condition/CommonConditions.java b/core/src/main/java/net/momirealms/craftengine/core/util/condition/CommonConditions.java new file mode 100644 index 000000000..017c51d11 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/condition/CommonConditions.java @@ -0,0 +1,11 @@ +package net.momirealms.craftengine.core.util.condition; + +import net.momirealms.craftengine.core.util.Key; + +public final class CommonConditions { + private CommonConditions() {} + + 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 INVERTED = Key.of("craftengine:inverted"); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/condition/InvertedCondition.java b/core/src/main/java/net/momirealms/craftengine/core/util/condition/InvertedCondition.java index 6fa42c944..7c2304344 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/util/condition/InvertedCondition.java +++ b/core/src/main/java/net/momirealms/craftengine/core/util/condition/InvertedCondition.java @@ -1,5 +1,6 @@ package net.momirealms.craftengine.core.util.condition; +import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.context.Condition; public abstract class InvertedCondition implements Condition { @@ -13,4 +14,9 @@ public abstract class InvertedCondition implements Condition { public boolean test(CTX ctx) { return !this.condition.test(ctx); } + + @Override + public Key type() { + return CommonConditions.INVERTED; + } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/context/CommonContext.java b/core/src/main/java/net/momirealms/craftengine/core/util/context/CommonContext.java index 7941d363a..be8a598f7 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/util/context/CommonContext.java +++ b/core/src/main/java/net/momirealms/craftengine/core/util/context/CommonContext.java @@ -1,14 +1,14 @@ package net.momirealms.craftengine.core.util.context; public abstract class CommonContext implements Context { - protected final ContextHolder holder; + protected final ContextHolder contexts; - public CommonContext(ContextHolder holder) { - this.holder = holder; + public CommonContext(ContextHolder contexts) { + this.contexts = contexts; } @Override public ContextHolder contexts() { - return holder; + return contexts; } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/context/CommonParameters.java b/core/src/main/java/net/momirealms/craftengine/core/util/context/CommonParameters.java index 5544449b7..339e41e93 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/util/context/CommonParameters.java +++ b/core/src/main/java/net/momirealms/craftengine/core/util/context/CommonParameters.java @@ -1,4 +1,9 @@ package net.momirealms.craftengine.core.util.context; -public class CommonParameters { +public final class CommonParameters { + + private CommonParameters() {} + + public static ContextKey RANDOM = ContextKey.of("random"); + public static ContextKey LAST_RANDOM = ContextKey.of("last_random"); } From 6a64097b72ad105fb0edcd641ac5a2e845a5bd67 Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Fri, 2 May 2025 19:24:25 +0800 Subject: [PATCH 16/51] =?UTF-8?q?=E8=BF=99=E6=A0=B7=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=BA=94=E8=AF=A5=E4=B8=8D=E9=94=99=EF=BC=8C=E4=BD=86=E8=BF=98?= =?UTF-8?q?=E6=98=AF=E5=B7=AE=E7=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bukkit/api/BukkitAdaptors.java | 6 +- .../bukkit/item/behavior/AxeItemBehavior.java | 4 +- .../item/behavior/BoneMealItemBehavior.java | 4 +- .../item/behavior/BucketItemBehavior.java | 4 +- .../behavior/WaterBucketItemBehavior.java | 4 +- ...orldBlock.java => BukkitBlockInWorld.java} | 30 +++++-- .../craftengine/bukkit/world/BukkitWorld.java | 6 +- .../core/block/PlayerBlockActionContext.java | 15 ++++ .../core/font/AbstractFontManager.java | 8 +- .../core/item/ItemBuildContext.java | 4 +- .../craftengine/core/loot/LootContext.java | 4 - ...Condition.java => LootConditionAllOf.java} | 6 +- ...Condition.java => LootConditionAnyOf.java} | 6 +- ...ion.java => LootConditionEnchantment.java} | 6 +- ...ndition.java => LootConditionFalling.java} | 4 +- ...dition.java => LootConditionInverted.java} | 6 +- ...a => LootConditionMatchBlockProperty.java} | 6 +- ...ition.java => LootConditionMatchItem.java} | 6 +- ...ondition.java => LootConditionRandom.java} | 6 +- ...va => LootConditionSurvivesExplosion.java} | 4 +- ...tion.java => LootConditionTableBonus.java} | 8 +- .../core/loot/condition/LootConditions.java | 20 ++--- ....java => LootFunctionApplyBonusCount.java} | 6 +- ...Function.java => LootFunctionDropExp.java} | 6 +- ...n.java => LootFunctionExplosionDecay.java} | 6 +- ...unction.java => LootFunctionSetCount.java} | 6 +- .../core/loot/function/LootFunctions.java | 8 +- .../gui/category/ItemBrowserManagerImpl.java | 16 ++-- .../text/minimessage/NamedArgumentTag.java | 8 +- .../core/registry/BuiltInRegistries.java | 4 +- .../craftengine/core/registry/Registries.java | 4 +- .../core/util/context/CommonContext.java | 18 ++++ .../core/util/context/Context.java | 8 ++ .../core/util/context/ContextKey.java | 2 +- .../context/LazyContextParameterProvider.java | 21 +++++ .../core/util/context/PlayerContext.java | 37 -------- .../util/context/PlayerOptionalContext.java | 87 +++++++++++++++++++ .../core/util/context/PlayerParameters.java | 18 ++++ .../{WorldBlock.java => BlockInWorld.java} | 8 +- .../craftengine/core/world/World.java | 4 +- 40 files changed, 292 insertions(+), 142 deletions(-) rename bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/{BukkitWorldBlock.java => BukkitBlockInWorld.java} (79%) create mode 100644 core/src/main/java/net/momirealms/craftengine/core/block/PlayerBlockActionContext.java rename core/src/main/java/net/momirealms/craftengine/core/loot/condition/{AllOfCondition.java => LootConditionAllOf.java} (83%) rename core/src/main/java/net/momirealms/craftengine/core/loot/condition/{AnyOfCondition.java => LootConditionAnyOf.java} (83%) rename core/src/main/java/net/momirealms/craftengine/core/loot/condition/{EnchantmentCondition.java => LootConditionEnchantment.java} (90%) rename core/src/main/java/net/momirealms/craftengine/core/loot/condition/{FallingCondition.java => LootConditionFalling.java} (84%) rename core/src/main/java/net/momirealms/craftengine/core/loot/condition/{InvertedCondition.java => LootConditionInverted.java} (80%) rename core/src/main/java/net/momirealms/craftengine/core/loot/condition/{MatchBlockPropertyCondition.java => LootConditionMatchBlockProperty.java} (90%) rename core/src/main/java/net/momirealms/craftengine/core/loot/condition/{MatchItemCondition.java => LootConditionMatchItem.java} (88%) rename core/src/main/java/net/momirealms/craftengine/core/loot/condition/{RandomCondition.java => LootConditionRandom.java} (85%) rename core/src/main/java/net/momirealms/craftengine/core/loot/condition/{SurvivesExplosionCondition.java => LootConditionSurvivesExplosion.java} (84%) rename core/src/main/java/net/momirealms/craftengine/core/loot/condition/{TableBonusCondition.java => LootConditionTableBonus.java} (88%) rename core/src/main/java/net/momirealms/craftengine/core/loot/function/{ApplyBonusCountFunction.java => LootFunctionApplyBonusCount.java} (95%) rename core/src/main/java/net/momirealms/craftengine/core/loot/function/{DropExpFunction.java => LootFunctionDropExp.java} (88%) rename core/src/main/java/net/momirealms/craftengine/core/loot/function/{ExplosionDecayFunction.java => LootFunctionExplosionDecay.java} (88%) rename core/src/main/java/net/momirealms/craftengine/core/loot/function/{SetCountFunction.java => LootFunctionSetCount.java} (86%) create mode 100644 core/src/main/java/net/momirealms/craftengine/core/util/context/LazyContextParameterProvider.java delete mode 100644 core/src/main/java/net/momirealms/craftengine/core/util/context/PlayerContext.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/util/context/PlayerOptionalContext.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/util/context/PlayerParameters.java rename core/src/main/java/net/momirealms/craftengine/core/world/{WorldBlock.java => BlockInWorld.java} (81%) diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/BukkitAdaptors.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/BukkitAdaptors.java index d49ca44c8..ee1f0524f 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/BukkitAdaptors.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/BukkitAdaptors.java @@ -4,7 +4,7 @@ import net.momirealms.craftengine.bukkit.entity.BukkitEntity; import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; import net.momirealms.craftengine.bukkit.plugin.user.BukkitServerPlayer; import net.momirealms.craftengine.bukkit.world.BukkitWorld; -import net.momirealms.craftengine.bukkit.world.BukkitWorldBlock; +import net.momirealms.craftengine.bukkit.world.BukkitBlockInWorld; import org.bukkit.World; import org.bukkit.block.Block; import org.bukkit.entity.Entity; @@ -26,7 +26,7 @@ public final class BukkitAdaptors { return new BukkitEntity(entity); } - public static BukkitWorldBlock adapt(final Block block) { - return new BukkitWorldBlock(block); + public static BukkitBlockInWorld adapt(final Block block) { + return new BukkitBlockInWorld(block); } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/AxeItemBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/AxeItemBehavior.java index 47b466610..732978b30 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/AxeItemBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/AxeItemBehavior.java @@ -4,7 +4,7 @@ import net.momirealms.craftengine.bukkit.api.CraftEngineBlocks; import net.momirealms.craftengine.bukkit.block.BukkitBlockManager; import net.momirealms.craftengine.bukkit.block.behavior.StrippableBlockBehavior; import net.momirealms.craftengine.bukkit.util.*; -import net.momirealms.craftengine.bukkit.world.BukkitWorldBlock; +import net.momirealms.craftengine.bukkit.world.BukkitBlockInWorld; import net.momirealms.craftengine.core.block.CustomBlock; import net.momirealms.craftengine.core.block.ImmutableBlockState; import net.momirealms.craftengine.core.block.UpdateOption; @@ -43,7 +43,7 @@ public class AxeItemBehavior extends ItemBehavior { @SuppressWarnings("unchecked") @Override public InteractionResult useOnBlock(UseOnContext context) { - BukkitWorldBlock clicked = (BukkitWorldBlock) context.getLevel().getBlockAt(context.getClickedPos()); + BukkitBlockInWorld clicked = (BukkitBlockInWorld) context.getLevel().getBlockAt(context.getClickedPos()); Block block = clicked.block(); ImmutableBlockState state = BukkitBlockManager.instance().getImmutableBlockState(BlockStateUtils.blockDataToId(block.getBlockData())); if (state == null || state.isEmpty()) return InteractionResult.PASS; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/BoneMealItemBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/BoneMealItemBehavior.java index 6d60e9e44..2996694ed 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/BoneMealItemBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/BoneMealItemBehavior.java @@ -8,7 +8,7 @@ import net.momirealms.craftengine.bukkit.nms.FastNMS; import net.momirealms.craftengine.bukkit.util.BlockStateUtils; import net.momirealms.craftengine.bukkit.util.LocationUtils; import net.momirealms.craftengine.bukkit.util.Reflections; -import net.momirealms.craftengine.bukkit.world.BukkitWorldBlock; +import net.momirealms.craftengine.bukkit.world.BukkitBlockInWorld; import net.momirealms.craftengine.core.block.ImmutableBlockState; import net.momirealms.craftengine.core.entity.player.InteractionResult; import net.momirealms.craftengine.core.item.behavior.ItemBehavior; @@ -32,7 +32,7 @@ public class BoneMealItemBehavior extends ItemBehavior { return InteractionResult.PASS; } - BukkitWorldBlock clicked = (BukkitWorldBlock) context.getLevel().getBlockAt(context.getClickedPos()); + BukkitBlockInWorld clicked = (BukkitBlockInWorld) context.getLevel().getBlockAt(context.getClickedPos()); Block block = clicked.block(); ImmutableBlockState state = BukkitBlockManager.instance().getImmutableBlockState(BlockStateUtils.blockDataToId(block.getBlockData())); if (state == null || state.isEmpty()) return InteractionResult.PASS; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/BucketItemBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/BucketItemBehavior.java index e8f90596f..570786360 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/BucketItemBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/BucketItemBehavior.java @@ -4,7 +4,7 @@ import net.momirealms.craftengine.bukkit.api.CraftEngineBlocks; import net.momirealms.craftengine.bukkit.block.BukkitBlockManager; import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; import net.momirealms.craftengine.bukkit.util.BlockStateUtils; -import net.momirealms.craftengine.bukkit.world.BukkitWorldBlock; +import net.momirealms.craftengine.bukkit.world.BukkitBlockInWorld; import net.momirealms.craftengine.core.block.CustomBlock; import net.momirealms.craftengine.core.block.ImmutableBlockState; import net.momirealms.craftengine.core.block.UpdateOption; @@ -35,7 +35,7 @@ public class BucketItemBehavior extends ItemBehavior { @Override public InteractionResult useOnBlock(UseOnContext context) { if (context.getPlayer().isAdventureMode()) return InteractionResult.PASS; - BukkitWorldBlock clicked = (BukkitWorldBlock) context.getLevel().getBlockAt(context.getClickedPos()); + BukkitBlockInWorld clicked = (BukkitBlockInWorld) context.getLevel().getBlockAt(context.getClickedPos()); Block block = clicked.block(); ImmutableBlockState state = BukkitBlockManager.instance().getImmutableBlockState(BlockStateUtils.blockDataToId(block.getBlockData())); if (state == null || state.isEmpty()) return InteractionResult.PASS; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/WaterBucketItemBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/WaterBucketItemBehavior.java index 1ec481214..af31edd9d 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/WaterBucketItemBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/WaterBucketItemBehavior.java @@ -4,7 +4,7 @@ import net.momirealms.craftengine.bukkit.api.CraftEngineBlocks; import net.momirealms.craftengine.bukkit.block.BukkitBlockManager; import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; import net.momirealms.craftengine.bukkit.util.BlockStateUtils; -import net.momirealms.craftengine.bukkit.world.BukkitWorldBlock; +import net.momirealms.craftengine.bukkit.world.BukkitBlockInWorld; import net.momirealms.craftengine.core.block.CustomBlock; import net.momirealms.craftengine.core.block.ImmutableBlockState; import net.momirealms.craftengine.core.block.UpdateOption; @@ -33,7 +33,7 @@ public class WaterBucketItemBehavior extends ItemBehavior { public InteractionResult useOnBlock(UseOnContext context) { if (context.getPlayer().isAdventureMode()) return InteractionResult.PASS; BlockPos pos = context.getClickedPos(); - BukkitWorldBlock clicked = (BukkitWorldBlock) context.getLevel().getBlockAt(pos); + BukkitBlockInWorld clicked = (BukkitBlockInWorld) context.getLevel().getBlockAt(pos); Block block = clicked.block(); ImmutableBlockState state = BukkitBlockManager.instance().getImmutableBlockState(BlockStateUtils.blockDataToId(block.getBlockData())); if (state == null || state.isEmpty()) return InteractionResult.PASS; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitWorldBlock.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitBlockInWorld.java similarity index 79% rename from bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitWorldBlock.java rename to bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitBlockInWorld.java index 105ac4443..7411024be 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitWorldBlock.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitBlockInWorld.java @@ -12,25 +12,26 @@ import net.momirealms.craftengine.core.item.CustomItem; import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.item.context.BlockPlaceContext; import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.plugin.text.minimessage.NamedArgumentTag; import net.momirealms.craftengine.core.util.Key; -import net.momirealms.craftengine.core.world.WorldBlock; +import net.momirealms.craftengine.core.world.BlockInWorld; import org.bukkit.Location; import org.bukkit.block.Block; import org.bukkit.inventory.ItemStack; import java.util.Optional; -public class BukkitWorldBlock implements WorldBlock { +public class BukkitBlockInWorld implements BlockInWorld { private final Block block; - public BukkitWorldBlock(Block block) { + public BukkitBlockInWorld(Block block) { this.block = block; } @SuppressWarnings("unchecked") @Override public boolean canBeReplaced(BlockPlaceContext context) { - ImmutableBlockState customState = BukkitBlockManager.instance().getImmutableBlockState(BlockStateUtils.blockDataToId(block.getBlockData())); + ImmutableBlockState customState = BukkitBlockManager.instance().getImmutableBlockState(BlockStateUtils.blockDataToId(this.block.getBlockData())); if (customState != null && !customState.isEmpty()) { Key clickedBlockId = customState.owner().value().id(); Item item = (Item) context.getPlayer().getItemInHand(context.getHand()); @@ -45,14 +46,14 @@ public class BukkitWorldBlock implements WorldBlock { } } } - return block.isReplaceable(); + return this.block.isReplaceable(); } @Override public boolean isWaterSource(BlockPlaceContext blockPlaceContext) { try { - Location location = block.getLocation(); - Object serverLevel = FastNMS.INSTANCE.field$CraftWorld$ServerLevel(block.getWorld()); + Location location = this.block.getLocation(); + Object serverLevel = FastNMS.INSTANCE.field$CraftWorld$ServerLevel(this.block.getWorld()); Object fluidData = Reflections.method$Level$getFluidState.invoke(serverLevel, LocationUtils.toBlockPos(location.getBlockX(), location.getBlockY(), location.getBlockZ())); if (fluidData == null) return false; return Reflections.method$FluidState$getType.invoke(fluidData) == Reflections.instance$Fluids$WATER; @@ -62,6 +63,21 @@ public class BukkitWorldBlock implements WorldBlock { } } + @Override + public int x() { + return this.block.getX(); + } + + @Override + public int y() { + return this.block.getY(); + } + + @Override + public int z() { + return this.block.getZ(); + } + public Block block() { return block; } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitWorld.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitWorld.java index b63a851ac..d39fdf887 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitWorld.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitWorld.java @@ -8,7 +8,7 @@ import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.VersionHelper; import net.momirealms.craftengine.core.world.Vec3d; import net.momirealms.craftengine.core.world.World; -import net.momirealms.craftengine.core.world.WorldBlock; +import net.momirealms.craftengine.core.world.BlockInWorld; import net.momirealms.craftengine.core.world.WorldHeight; import org.bukkit.Location; import org.bukkit.SoundCategory; @@ -51,8 +51,8 @@ public class BukkitWorld implements World { } @Override - public WorldBlock getBlockAt(int x, int y, int z) { - return new BukkitWorldBlock(platformWorld().getBlockAt(x, y, z)); + public BlockInWorld getBlockAt(int x, int y, int z) { + return new BukkitBlockInWorld(platformWorld().getBlockAt(x, y, z)); } @Override diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/PlayerBlockActionContext.java b/core/src/main/java/net/momirealms/craftengine/core/block/PlayerBlockActionContext.java new file mode 100644 index 000000000..81b41ad08 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/block/PlayerBlockActionContext.java @@ -0,0 +1,15 @@ +package net.momirealms.craftengine.core.block; + +import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.util.context.ContextHolder; +import net.momirealms.craftengine.core.util.context.PlayerOptionalContext; +import net.momirealms.craftengine.core.world.BlockInWorld; +import org.jetbrains.annotations.NotNull; + +public class PlayerBlockActionContext extends PlayerOptionalContext { + private BlockInWorld block; + + public PlayerBlockActionContext(@NotNull Player player, @NotNull ContextHolder contexts) { + super(player, contexts); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/font/AbstractFontManager.java b/core/src/main/java/net/momirealms/craftengine/core/font/AbstractFontManager.java index 3277303cf..771388222 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/font/AbstractFontManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/font/AbstractFontManager.java @@ -11,7 +11,7 @@ import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigExce import net.momirealms.craftengine.core.plugin.locale.TranslationManager; import net.momirealms.craftengine.core.util.*; import net.momirealms.craftengine.core.util.context.ContextHolder; -import net.momirealms.craftengine.core.util.context.PlayerContext; +import net.momirealms.craftengine.core.util.context.PlayerOptionalContext; import org.ahocorasick.trie.Token; import org.ahocorasick.trie.Trie; import org.jetbrains.annotations.NotNull; @@ -121,7 +121,7 @@ public abstract class AbstractFontManager implements FontManager { continue; Component content = AdventureHelper.miniMessage().deserialize( emoji.content(), - PlayerContext.of(player, ContextHolder.builder() + PlayerOptionalContext.of(player, ContextHolder.builder() .withOptionalParameter(EmojiParameters.EMOJI, emoji.emojiImage()) .withParameter(EmojiParameters.KEYWORD, emoji.keywords().get(0)) .build()).tagResolvers() @@ -167,7 +167,7 @@ public abstract class AbstractFontManager implements FontManager { continue; emojis.put(fragment, AdventureHelper.miniMessage().deserialize( emoji.content(), - PlayerContext.of(player, ContextHolder.builder() + PlayerOptionalContext.of(player, ContextHolder.builder() .withOptionalParameter(EmojiParameters.EMOJI, emoji.emojiImage()) .withParameter(EmojiParameters.KEYWORD, emoji.keywords().get(0)) .build()).tagResolvers()) @@ -199,7 +199,7 @@ public abstract class AbstractFontManager implements FontManager { continue; emojis.put(fragment, AdventureHelper.miniMessage().deserialize( emoji.content(), - PlayerContext.of(player, + PlayerOptionalContext.of(player, ContextHolder.builder() .withOptionalParameter(EmojiParameters.EMOJI, emoji.emojiImage()) .withParameter(EmojiParameters.KEYWORD, emoji.keywords().get(0)) diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/ItemBuildContext.java b/core/src/main/java/net/momirealms/craftengine/core/item/ItemBuildContext.java index 5f7ccfd0a..fdc53f6e4 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/ItemBuildContext.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/ItemBuildContext.java @@ -2,11 +2,11 @@ package net.momirealms.craftengine.core.item; import net.momirealms.craftengine.core.entity.player.Player; import net.momirealms.craftengine.core.util.context.ContextHolder; -import net.momirealms.craftengine.core.util.context.PlayerContext; +import net.momirealms.craftengine.core.util.context.PlayerOptionalContext; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -public class ItemBuildContext extends PlayerContext { +public class ItemBuildContext extends PlayerOptionalContext { public static final ItemBuildContext EMPTY = new ItemBuildContext(null, ContextHolder.EMPTY); public ItemBuildContext(@Nullable Player player, @NotNull ContextHolder contexts) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/LootContext.java b/core/src/main/java/net/momirealms/craftengine/core/loot/LootContext.java index ae73df88a..b996d1157 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/LootContext.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/LootContext.java @@ -24,10 +24,6 @@ public class LootContext extends CommonContext { return this.randomSource; } - public Optional getOptionalParameter(ContextKey parameter) { - return super.contexts.getOptional(parameter); - } - public float luck() { return luck; } diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/condition/AllOfCondition.java b/core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditionAllOf.java similarity index 83% rename from core/src/main/java/net/momirealms/craftengine/core/loot/condition/AllOfCondition.java rename to core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditionAllOf.java index 7a693dde4..6496fa4aa 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/condition/AllOfCondition.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditionAllOf.java @@ -6,11 +6,11 @@ import net.momirealms.craftengine.core.util.Key; import java.util.List; import java.util.Map; -public class AllOfCondition implements LootCondition { +public class LootConditionAllOf implements LootCondition { public static final Factory FACTORY = new Factory(); private final List conditions; - public AllOfCondition(List conditions) { + public LootConditionAllOf(List conditions) { this.conditions = conditions; } @@ -35,7 +35,7 @@ public class AllOfCondition implements LootCondition { @Override public LootCondition create(Map arguments) { List> terms = (List>) arguments.get("terms"); - return new AllOfCondition(LootConditions.fromMapList(terms)); + return new LootConditionAllOf(LootConditions.fromMapList(terms)); } } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/condition/AnyOfCondition.java b/core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditionAnyOf.java similarity index 83% rename from core/src/main/java/net/momirealms/craftengine/core/loot/condition/AnyOfCondition.java rename to core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditionAnyOf.java index 8ed439c3e..c7267bce6 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/condition/AnyOfCondition.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditionAnyOf.java @@ -6,11 +6,11 @@ import net.momirealms.craftengine.core.util.Key; import java.util.List; import java.util.Map; -public class AnyOfCondition implements LootCondition { +public class LootConditionAnyOf implements LootCondition { public static final Factory FACTORY = new Factory(); private final List conditions; - public AnyOfCondition(List conditions) { + public LootConditionAnyOf(List conditions) { this.conditions = conditions; } @@ -34,7 +34,7 @@ public class AnyOfCondition implements LootCondition { @Override public LootCondition create(Map arguments) { List> terms = (List>) arguments.get("terms"); - return new AnyOfCondition(LootConditions.fromMapList(terms)); + return new LootConditionAnyOf(LootConditions.fromMapList(terms)); } } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/condition/EnchantmentCondition.java b/core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditionEnchantment.java similarity index 90% rename from core/src/main/java/net/momirealms/craftengine/core/loot/condition/EnchantmentCondition.java rename to core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditionEnchantment.java index 067a8a3e1..16e861b4c 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/condition/EnchantmentCondition.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditionEnchantment.java @@ -10,12 +10,12 @@ import java.util.Map; import java.util.Optional; import java.util.function.Function; -public class EnchantmentCondition implements LootCondition { +public class LootConditionEnchantment implements LootCondition { public static final Factory FACTORY = new Factory(); private final Key id; private final Function expression; - public EnchantmentCondition(Key id, Function expression) { + public LootConditionEnchantment(Key id, Function expression) { this.id = id; this.expression = expression; } @@ -50,7 +50,7 @@ public class EnchantmentCondition implements LootCondition { case ">=" -> expression = (i -> i >= level); default -> throw new IllegalArgumentException("Unknown operator: " + operator); } - return new EnchantmentCondition(Key.of(split[0]), expression); + return new LootConditionEnchantment(Key.of(split[0]), expression); } } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/condition/FallingCondition.java b/core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditionFalling.java similarity index 84% rename from core/src/main/java/net/momirealms/craftengine/core/loot/condition/FallingCondition.java rename to core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditionFalling.java index 0e4b6324b..b47cb29c0 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/condition/FallingCondition.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditionFalling.java @@ -6,9 +6,9 @@ import net.momirealms.craftengine.core.util.Key; import java.util.Map; -public class FallingCondition implements LootCondition { +public class LootConditionFalling implements LootCondition { public static final Factory FACTORY = new Factory(); - public static final FallingCondition INSTANCE = new FallingCondition(); + public static final LootConditionFalling INSTANCE = new LootConditionFalling(); @Override public Key type() { diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/condition/InvertedCondition.java b/core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditionInverted.java similarity index 80% rename from core/src/main/java/net/momirealms/craftengine/core/loot/condition/InvertedCondition.java rename to core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditionInverted.java index 7dc3a9cd7..01d89fa09 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/condition/InvertedCondition.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditionInverted.java @@ -5,11 +5,11 @@ import net.momirealms.craftengine.core.util.Key; import java.util.Map; -public class InvertedCondition implements LootCondition { +public class LootConditionInverted implements LootCondition { public static final Factory FACTORY = new Factory(); private final LootCondition condition; - public InvertedCondition(LootCondition condition) { + public LootConditionInverted(LootCondition condition) { this.condition = condition; } @@ -28,7 +28,7 @@ public class InvertedCondition implements LootCondition { @Override public LootCondition create(Map arguments) { Map term = (Map) arguments.get("term"); - return new InvertedCondition(LootConditions.fromMap(term)); + return new LootConditionInverted(LootConditions.fromMap(term)); } } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/condition/MatchBlockPropertyCondition.java b/core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditionMatchBlockProperty.java similarity index 90% rename from core/src/main/java/net/momirealms/craftengine/core/loot/condition/MatchBlockPropertyCondition.java rename to core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditionMatchBlockProperty.java index 24c91cd6e..c3a30b8f4 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/condition/MatchBlockPropertyCondition.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditionMatchBlockProperty.java @@ -12,11 +12,11 @@ import java.util.List; import java.util.Locale; import java.util.Map; -public class MatchBlockPropertyCondition implements LootCondition { +public class LootConditionMatchBlockProperty implements LootCondition { public static final Factory FACTORY = new Factory(); private final List> properties; - public MatchBlockPropertyCondition(List> properties) { + public LootConditionMatchBlockProperty(List> properties) { this.properties = properties; } @@ -55,7 +55,7 @@ public class MatchBlockPropertyCondition implements LootCondition { for (Map.Entry entry : properties.entrySet()) { propertyList.add(new Pair<>(entry.getKey(), entry.getValue().toString())); } - return new MatchBlockPropertyCondition(propertyList); + return new LootConditionMatchBlockProperty(propertyList); } } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/condition/MatchItemCondition.java b/core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditionMatchItem.java similarity index 88% rename from core/src/main/java/net/momirealms/craftengine/core/loot/condition/MatchItemCondition.java rename to core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditionMatchItem.java index 367ac6ec3..c2b4c4c2b 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/condition/MatchItemCondition.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditionMatchItem.java @@ -8,12 +8,12 @@ import net.momirealms.craftengine.core.util.MiscUtils; import java.util.*; -public class MatchItemCondition implements LootCondition { +public class LootConditionMatchItem implements LootCondition { public static final Factory FACTORY = new Factory(); private final Set ids; private final boolean regexMatch; - public MatchItemCondition(Collection ids, boolean regexMatch) { + public LootConditionMatchItem(Collection ids, boolean regexMatch) { this.ids = new HashSet<>(ids); this.regexMatch = regexMatch; } @@ -46,7 +46,7 @@ public class MatchItemCondition implements LootCondition { public LootCondition create(Map arguments) { List ids = MiscUtils.getAsStringList(arguments.get("id")); boolean regex = (boolean) arguments.getOrDefault("regex", false); - return new MatchItemCondition(ids, regex); + return new LootConditionMatchItem(ids, regex); } } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/condition/RandomCondition.java b/core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditionRandom.java similarity index 85% rename from core/src/main/java/net/momirealms/craftengine/core/loot/condition/RandomCondition.java rename to core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditionRandom.java index 50cb43f1e..77a99c196 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/condition/RandomCondition.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditionRandom.java @@ -7,11 +7,11 @@ import net.momirealms.craftengine.core.util.ResourceConfigUtils; import java.util.Map; -public class RandomCondition implements LootCondition { +public class LootConditionRandom implements LootCondition { public static final Factory FACTORY = new Factory(); private final float chance; - public RandomCondition(float chance) { + public LootConditionRandom(float chance) { this.chance = chance; } @@ -29,7 +29,7 @@ public class RandomCondition implements LootCondition { @Override public LootCondition create(Map arguments) { float chance = ResourceConfigUtils.getAsFloat(arguments.getOrDefault("value", 0.5f), "value"); - return new RandomCondition(chance); + return new LootConditionRandom(chance); } } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/condition/SurvivesExplosionCondition.java b/core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditionSurvivesExplosion.java similarity index 84% rename from core/src/main/java/net/momirealms/craftengine/core/loot/condition/SurvivesExplosionCondition.java rename to core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditionSurvivesExplosion.java index 3fd8f8cf6..68ae812da 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/condition/SurvivesExplosionCondition.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditionSurvivesExplosion.java @@ -7,9 +7,9 @@ import net.momirealms.craftengine.core.util.Key; import java.util.Map; import java.util.Optional; -public class SurvivesExplosionCondition implements LootCondition { +public class LootConditionSurvivesExplosion implements LootCondition { public static final Factory FACTORY = new Factory(); - private static final SurvivesExplosionCondition INSTANCE = new SurvivesExplosionCondition(); + private static final LootConditionSurvivesExplosion INSTANCE = new LootConditionSurvivesExplosion(); @Override public Key type() { diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/condition/TableBonusCondition.java b/core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditionTableBonus.java similarity index 88% rename from core/src/main/java/net/momirealms/craftengine/core/loot/condition/TableBonusCondition.java rename to core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditionTableBonus.java index 125d5859d..e17179ebc 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/condition/TableBonusCondition.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditionTableBonus.java @@ -13,12 +13,12 @@ import java.util.List; import java.util.Map; import java.util.Optional; -public class TableBonusCondition implements LootCondition { +public class LootConditionTableBonus implements LootCondition { public static final Factory FACTORY = new Factory(); private final Key enchantmentType; private final List values; - public TableBonusCondition(Key enchantmentType, List values) { + public LootConditionTableBonus(Key enchantmentType, List values) { this.enchantmentType = enchantmentType; this.values = values; } @@ -47,13 +47,13 @@ public class TableBonusCondition implements LootCondition { Object chances = arguments.get("chances"); if (chances != null) { if (chances instanceof Number number) { - return new TableBonusCondition(enchantmentType, List.of(number.floatValue())); + return new LootConditionTableBonus(enchantmentType, List.of(number.floatValue())); } else if (chances instanceof List list) { List values = new ArrayList<>(list.size()); for (Object o : list) { values.add(ResourceConfigUtils.getAsFloat(o, "chances")); } - return new TableBonusCondition(enchantmentType, values); + return new LootConditionTableBonus(enchantmentType, values); } } throw new LocalizedResourceConfigException("warning.config.loot_table.condition.table_bonus.missing_chances"); diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditions.java b/core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditions.java index fd8f55e2b..d9ba14a51 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditions.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditions.java @@ -26,16 +26,16 @@ public class LootConditions { public static final Key FALLING_BLOCK = Key.from("craftengine:falling_block"); static { - register(MATCH_ITEM, MatchItemCondition.FACTORY); - register(MATCH_BLOCK_PROPERTY, MatchBlockPropertyCondition.FACTORY); - register(TABLE_BONUS, TableBonusCondition.FACTORY); - register(SURVIVES_EXPLOSION, SurvivesExplosionCondition.FACTORY); - register(ANY_OF, AnyOfCondition.FACTORY); - register(ALL_OF, AllOfCondition.FACTORY); - register(ENCHANTMENT, EnchantmentCondition.FACTORY); - register(INVERTED, InvertedCondition.FACTORY); - register(FALLING_BLOCK, FallingCondition.FACTORY); - register(RANDOM, RandomCondition.FACTORY); + register(MATCH_ITEM, LootConditionMatchItem.FACTORY); + register(MATCH_BLOCK_PROPERTY, LootConditionMatchBlockProperty.FACTORY); + register(TABLE_BONUS, LootConditionTableBonus.FACTORY); + register(SURVIVES_EXPLOSION, LootConditionSurvivesExplosion.FACTORY); + register(ANY_OF, LootConditionAnyOf.FACTORY); + register(ALL_OF, LootConditionAllOf.FACTORY); + register(ENCHANTMENT, LootConditionEnchantment.FACTORY); + register(INVERTED, LootConditionInverted.FACTORY); + register(FALLING_BLOCK, LootConditionFalling.FACTORY); + register(RANDOM, LootConditionRandom.FACTORY); } public static void register(Key key, LootConditionFactory factory) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/function/ApplyBonusCountFunction.java b/core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctionApplyBonusCount.java similarity index 95% rename from core/src/main/java/net/momirealms/craftengine/core/loot/function/ApplyBonusCountFunction.java rename to core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctionApplyBonusCount.java index 3e55a198f..230b66eac 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/function/ApplyBonusCountFunction.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctionApplyBonusCount.java @@ -19,12 +19,12 @@ import java.util.Map; import java.util.Optional; import java.util.concurrent.ThreadLocalRandom; -public class ApplyBonusCountFunction extends AbstractLootConditionalFunction { +public class LootFunctionApplyBonusCount extends AbstractLootConditionalFunction { public static final Factory FACTORY = new Factory<>(); private final Key enchantment; private final Formula formula; - public ApplyBonusCountFunction(List predicates, Key enchantment, Formula formula) { + public LootFunctionApplyBonusCount(List predicates, Key enchantment, Formula formula) { super(predicates); this.enchantment = enchantment; this.formula = formula; @@ -57,7 +57,7 @@ public class ApplyBonusCountFunction extends AbstractLootConditionalFunction< List conditions = Optional.ofNullable(arguments.get("conditions")) .map(it -> LootConditions.fromMapList((List>) it)) .orElse(Collections.emptyList()); - return new ApplyBonusCountFunction<>(conditions, Key.from(enchantment), Formulas.fromMap(formulaMap)); + return new LootFunctionApplyBonusCount<>(conditions, Key.from(enchantment), Formulas.fromMap(formulaMap)); } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/function/DropExpFunction.java b/core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctionDropExp.java similarity index 88% rename from core/src/main/java/net/momirealms/craftengine/core/loot/function/DropExpFunction.java rename to core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctionDropExp.java index cecd00e2e..24c353736 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/function/DropExpFunction.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctionDropExp.java @@ -15,11 +15,11 @@ import java.util.List; import java.util.Map; import java.util.Optional; -public class DropExpFunction extends AbstractLootConditionalFunction { +public class LootFunctionDropExp extends AbstractLootConditionalFunction { public static final Factory FACTORY = new Factory<>(); private final NumberProvider value; - public DropExpFunction(NumberProvider value, List predicates) { + public LootFunctionDropExp(NumberProvider value, List predicates) { super(predicates); this.value = value; } @@ -44,7 +44,7 @@ public class DropExpFunction extends AbstractLootConditionalFunction { List conditions = Optional.ofNullable(arguments.get("conditions")) .map(it -> LootConditions.fromMapList((List>) it)) .orElse(Collections.emptyList()); - return new DropExpFunction<>(NumberProviders.fromObject(value), conditions); + return new LootFunctionDropExp<>(NumberProviders.fromObject(value), conditions); } } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/function/ExplosionDecayFunction.java b/core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctionExplosionDecay.java similarity index 88% rename from core/src/main/java/net/momirealms/craftengine/core/loot/function/ExplosionDecayFunction.java rename to core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctionExplosionDecay.java index 9a3fc8689..7a8c8ff61 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/function/ExplosionDecayFunction.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctionExplosionDecay.java @@ -9,10 +9,10 @@ import net.momirealms.craftengine.core.util.Key; import java.util.*; -public class ExplosionDecayFunction extends AbstractLootConditionalFunction { +public class LootFunctionExplosionDecay extends AbstractLootConditionalFunction { public static final Factory FACTORY = new Factory<>(); - public ExplosionDecayFunction(List predicates) { + public LootFunctionExplosionDecay(List predicates) { super(predicates); } @@ -46,7 +46,7 @@ public class ExplosionDecayFunction extends AbstractLootConditionalFunction conditions = Optional.ofNullable(arguments.get("conditions")) .map(it -> LootConditions.fromMapList((List>) it)) .orElse(Collections.emptyList()); - return new ExplosionDecayFunction<>(conditions); + return new LootFunctionExplosionDecay<>(conditions); } } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/function/SetCountFunction.java b/core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctionSetCount.java similarity index 86% rename from core/src/main/java/net/momirealms/craftengine/core/loot/function/SetCountFunction.java rename to core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctionSetCount.java index 969c778f9..85aafdcc7 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/function/SetCountFunction.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctionSetCount.java @@ -14,13 +14,13 @@ import java.util.List; import java.util.Map; import java.util.Optional; -public class SetCountFunction extends AbstractLootConditionalFunction { +public class LootFunctionSetCount extends AbstractLootConditionalFunction { public static final Factory FACTORY = new Factory<>(); private final NumberProvider value; private final boolean add; - public SetCountFunction(List conditions, NumberProvider value, boolean add) { + public LootFunctionSetCount(List conditions, NumberProvider value, boolean add) { super(conditions); this.value = value; this.add = add; @@ -47,7 +47,7 @@ public class SetCountFunction extends AbstractLootConditionalFunction { List conditions = Optional.ofNullable(arguments.get("conditions")) .map(it -> LootConditions.fromMapList((List>) it)) .orElse(Collections.emptyList()); - return new SetCountFunction<>(conditions, NumberProviders.fromObject(value), add); + return new LootFunctionSetCount<>(conditions, NumberProviders.fromObject(value), add); } } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctions.java b/core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctions.java index 17a88c0c7..24cdb87c7 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctions.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctions.java @@ -23,10 +23,10 @@ public class LootFunctions { public static final Key DROP_EXP = Key.from("craftengine:drop_exp"); static { - register(SET_COUNT, SetCountFunction.FACTORY); - register(EXPLOSION_DECAY, ExplosionDecayFunction.FACTORY); - register(APPLY_BONUS, ApplyBonusCountFunction.FACTORY); - register(DROP_EXP, DropExpFunction.FACTORY); + register(SET_COUNT, LootFunctionSetCount.FACTORY); + register(EXPLOSION_DECAY, LootFunctionExplosionDecay.FACTORY); + register(APPLY_BONUS, LootFunctionApplyBonusCount.FACTORY); + register(DROP_EXP, LootFunctionDropExp.FACTORY); } public static void register(Key key, LootFunctionFactory factory) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/category/ItemBrowserManagerImpl.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/category/ItemBrowserManagerImpl.java index 6bed70f13..60dd2120f 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/category/ItemBrowserManagerImpl.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/category/ItemBrowserManagerImpl.java @@ -17,7 +17,7 @@ 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.util.context.ContextHolder; -import net.momirealms.craftengine.core.util.context.PlayerContext; +import net.momirealms.craftengine.core.util.context.PlayerOptionalContext; import java.nio.file.Path; import java.util.*; @@ -177,7 +177,7 @@ public class ItemBrowserManagerImpl implements ItemBrowserManager { } }) .build() - .title(AdventureHelper.miniMessage().deserialize(Constants.BROWSER_TITLE, PlayerContext.of(player, ContextHolder.EMPTY).tagResolvers())) + .title(AdventureHelper.miniMessage().deserialize(Constants.BROWSER_TITLE, PlayerOptionalContext.of(player, ContextHolder.EMPTY).tagResolvers())) .refresh() .open(player); } @@ -292,7 +292,7 @@ public class ItemBrowserManagerImpl implements ItemBrowserManager { } }) .build() - .title(AdventureHelper.miniMessage().deserialize(Constants.CATEGORY_TITLE, PlayerContext.of(player, ContextHolder.EMPTY).tagResolvers())) + .title(AdventureHelper.miniMessage().deserialize(Constants.CATEGORY_TITLE, PlayerOptionalContext.of(player, ContextHolder.EMPTY).tagResolvers())) .refresh() .open(player); } @@ -353,7 +353,7 @@ public class ItemBrowserManagerImpl implements ItemBrowserManager { } }) .build() - .title(AdventureHelper.miniMessage().deserialize(Constants.RECIPE_NONE_TITLE, PlayerContext.of(player, ContextHolder.EMPTY).tagResolvers())) + .title(AdventureHelper.miniMessage().deserialize(Constants.RECIPE_NONE_TITLE, PlayerOptionalContext.of(player, ContextHolder.EMPTY).tagResolvers())) .refresh() .open(player); } @@ -578,7 +578,7 @@ public class ItemBrowserManagerImpl implements ItemBrowserManager { } }) .build() - .title(AdventureHelper.miniMessage().deserialize(Constants.RECIPE_SMITHING_TRANSFORM_TITLE, PlayerContext.of(player, ContextHolder.EMPTY).tagResolvers())) + .title(AdventureHelper.miniMessage().deserialize(Constants.RECIPE_SMITHING_TRANSFORM_TITLE, PlayerOptionalContext.of(player, ContextHolder.EMPTY).tagResolvers())) .refresh() .open(player); } @@ -711,7 +711,7 @@ public class ItemBrowserManagerImpl implements ItemBrowserManager { } }) .build() - .title(AdventureHelper.miniMessage().deserialize(Constants.RECIPE_STONECUTTING_TITLE, PlayerContext.of(player, ContextHolder.EMPTY).tagResolvers())) + .title(AdventureHelper.miniMessage().deserialize(Constants.RECIPE_STONECUTTING_TITLE, PlayerOptionalContext.of(player, ContextHolder.EMPTY).tagResolvers())) .refresh() .open(player); } @@ -861,7 +861,7 @@ public class ItemBrowserManagerImpl implements ItemBrowserManager { } }) .build() - .title(AdventureHelper.miniMessage().deserialize(title, PlayerContext.of(player, ContextHolder.EMPTY).tagResolvers())) + .title(AdventureHelper.miniMessage().deserialize(title, PlayerOptionalContext.of(player, ContextHolder.EMPTY).tagResolvers())) .refresh() .open(player); } @@ -1056,7 +1056,7 @@ public class ItemBrowserManagerImpl implements ItemBrowserManager { } }) .build() - .title(AdventureHelper.miniMessage().deserialize(Constants.RECIPE_CRAFTING_TITLE, PlayerContext.of(player, ContextHolder.EMPTY).tagResolvers())) + .title(AdventureHelper.miniMessage().deserialize(Constants.RECIPE_CRAFTING_TITLE, PlayerOptionalContext.of(player, ContextHolder.EMPTY).tagResolvers())) .refresh() .open(player); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/NamedArgumentTag.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/NamedArgumentTag.java index 67f2b335f..b48a8c43c 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/NamedArgumentTag.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/NamedArgumentTag.java @@ -12,6 +12,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.Objects; +import java.util.Optional; public class NamedArgumentTag implements TagResolver { private static final String NAME_0 = "argument"; @@ -29,11 +30,12 @@ public class NamedArgumentTag implements TagResolver { return null; } String argumentKey = arguments.popOr("No argument key provided").toString(); - ContextKey key = ContextKey.of(Key.of(argumentKey)); - if (!this.context.contexts().has(key)) { + ContextKey key = ContextKey.of(Key.withDefaultNamespace(argumentKey, "craftengine")); + Optional optional = this.context.getOptionalParameter(key); + if (optional.isEmpty()) { throw ctx.newException("Invalid argument key", arguments); } - return Tag.selfClosingInserting(AdventureHelper.miniMessage().deserialize(this.context.contexts().getOrThrow(key), this.context.tagResolvers())); + return Tag.selfClosingInserting(AdventureHelper.miniMessage().deserialize(String.valueOf(optional.get()), this.context.tagResolvers())); } @Override diff --git a/core/src/main/java/net/momirealms/craftengine/core/registry/BuiltInRegistries.java b/core/src/main/java/net/momirealms/craftengine/core/registry/BuiltInRegistries.java index 59d7b9711..e3333d608 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/registry/BuiltInRegistries.java +++ b/core/src/main/java/net/momirealms/craftengine/core/registry/BuiltInRegistries.java @@ -9,7 +9,7 @@ import net.momirealms.craftengine.core.item.recipe.CustomSmithingTransformRecipe import net.momirealms.craftengine.core.item.recipe.RecipeFactory; import net.momirealms.craftengine.core.loot.condition.LootConditionFactory; import net.momirealms.craftengine.core.loot.entry.LootEntryContainerFactory; -import net.momirealms.craftengine.core.loot.function.ApplyBonusCountFunction; +import net.momirealms.craftengine.core.loot.function.LootFunctionApplyBonusCount; import net.momirealms.craftengine.core.loot.function.LootFunctionFactory; import net.momirealms.craftengine.core.loot.number.NumberProviderFactory; import net.momirealms.craftengine.core.pack.conflict.matcher.PathMatcherFactory; @@ -43,7 +43,7 @@ public class BuiltInRegistries { public static final Registry CONDITION_PROPERTY_FACTORY = createRegistry(Registries.CONDITION_PROPERTY_FACTORY); public static final Registry SELECT_PROPERTY_FACTORY = createRegistry(Registries.SELECT_PROPERTY_FACTORY); public static final Registry> RECIPE_FACTORY = createRegistry(Registries.RECIPE_FACTORY); - public static final Registry FORMULA_FACTORY = createRegistry(Registries.FORMULA_FACTORY); + public static final Registry FORMULA_FACTORY = createRegistry(Registries.FORMULA_FACTORY); public static final Registry PATH_MATCHER_FACTORY = createRegistry(Registries.PATH_MATCHER_FACTORY); public static final Registry RESOLUTION_FACTORY = createRegistry(Registries.RESOLUTION_FACTORY); public static final Registry SMITHING_RESULT_PROCESSOR_FACTORY = createRegistry(Registries.SMITHING_RESULT_PROCESSOR_FACTORY); diff --git a/core/src/main/java/net/momirealms/craftengine/core/registry/Registries.java b/core/src/main/java/net/momirealms/craftengine/core/registry/Registries.java index 07e1e4ef8..0071569c5 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/registry/Registries.java +++ b/core/src/main/java/net/momirealms/craftengine/core/registry/Registries.java @@ -9,7 +9,7 @@ import net.momirealms.craftengine.core.item.recipe.CustomSmithingTransformRecipe import net.momirealms.craftengine.core.item.recipe.RecipeFactory; import net.momirealms.craftengine.core.loot.condition.LootConditionFactory; import net.momirealms.craftengine.core.loot.entry.LootEntryContainerFactory; -import net.momirealms.craftengine.core.loot.function.ApplyBonusCountFunction; +import net.momirealms.craftengine.core.loot.function.LootFunctionApplyBonusCount; import net.momirealms.craftengine.core.loot.function.LootFunctionFactory; import net.momirealms.craftengine.core.loot.number.NumberProviderFactory; import net.momirealms.craftengine.core.pack.conflict.matcher.PathMatcherFactory; @@ -44,7 +44,7 @@ public class Registries { public static final ResourceKey> CONDITION_PROPERTY_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("condition_property_factory")); public static final ResourceKey> SELECT_PROPERTY_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("select_property_factory")); public static final ResourceKey>> RECIPE_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("recipe_factory")); - public static final ResourceKey> FORMULA_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("formula_factory")); + public static final ResourceKey> FORMULA_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("formula_factory")); public static final ResourceKey> PATH_MATCHER_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("path_matcher_factory")); public static final ResourceKey> RESOLUTION_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("resolution_factory")); public static final ResourceKey> SMITHING_RESULT_PROCESSOR_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("smithing_result_processor_factory")); diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/context/CommonContext.java b/core/src/main/java/net/momirealms/craftengine/core/util/context/CommonContext.java index be8a598f7..ef6754308 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/util/context/CommonContext.java +++ b/core/src/main/java/net/momirealms/craftengine/core/util/context/CommonContext.java @@ -1,5 +1,7 @@ package net.momirealms.craftengine.core.util.context; +import java.util.Optional; + public abstract class CommonContext implements Context { protected final ContextHolder contexts; @@ -11,4 +13,20 @@ public abstract class CommonContext implements Context { public ContextHolder contexts() { return contexts; } + + @Override + public Optional getOptionalParameter(ContextKey parameter) { + return this.contexts.getOptional(parameter); + } + + @Override + public T getParameterOrThrow(ContextKey parameter) { + return this.contexts.getOrThrow(parameter); + } + + @Override + public CommonContext withParameter(ContextKey parameter, T value) { + this.contexts.withParameter(parameter, value); + return this; + } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/context/Context.java b/core/src/main/java/net/momirealms/craftengine/core/util/context/Context.java index 5901daaa4..56ff668c4 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/util/context/Context.java +++ b/core/src/main/java/net/momirealms/craftengine/core/util/context/Context.java @@ -1,6 +1,14 @@ package net.momirealms.craftengine.core.util.context; +import java.util.Optional; + public interface Context { ContextHolder contexts(); + + Optional getOptionalParameter(ContextKey parameter); + + T getParameterOrThrow(ContextKey parameter); + + Context withParameter(ContextKey parameter, T value); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/context/ContextKey.java b/core/src/main/java/net/momirealms/craftengine/core/util/context/ContextKey.java index 4ea446ffb..4c690da88 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/util/context/ContextKey.java +++ b/core/src/main/java/net/momirealms/craftengine/core/util/context/ContextKey.java @@ -22,7 +22,7 @@ public class ContextKey { @NotNull public static ContextKey of(@NotNull String id) { - return new ContextKey<>(Key.of(id)); + return new ContextKey<>(Key.withDefaultNamespace(id, "craftengine")); } @Override diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/context/LazyContextParameterProvider.java b/core/src/main/java/net/momirealms/craftengine/core/util/context/LazyContextParameterProvider.java new file mode 100644 index 000000000..796df1230 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/context/LazyContextParameterProvider.java @@ -0,0 +1,21 @@ +package net.momirealms.craftengine.core.util.context; + +import java.util.Optional; + +public interface LazyContextParameterProvider { + + Optional getOptionalParameter(ContextKey parameter); + + static LazyContextParameterProvider dummy() { + return DummyContextParameterProvider.INSTANCE; + } + + class DummyContextParameterProvider implements LazyContextParameterProvider { + static final DummyContextParameterProvider INSTANCE = new DummyContextParameterProvider(); + + @Override + public Optional getOptionalParameter(ContextKey parameter) { + return Optional.empty(); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/context/PlayerContext.java b/core/src/main/java/net/momirealms/craftengine/core/util/context/PlayerContext.java deleted file mode 100644 index ff44eb60a..000000000 --- a/core/src/main/java/net/momirealms/craftengine/core/util/context/PlayerContext.java +++ /dev/null @@ -1,37 +0,0 @@ -package net.momirealms.craftengine.core.util.context; - -import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; -import net.momirealms.craftengine.core.entity.player.Player; -import net.momirealms.craftengine.core.plugin.text.minimessage.*; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -public class PlayerContext extends CommonContext implements MiniMessageTextContext { - public static final PlayerContext EMPTY = new PlayerContext(null, ContextHolder.EMPTY); - private final Player player; - private TagResolver[] tagResolvers; - - public PlayerContext(@Nullable Player player, @NotNull ContextHolder contexts) { - super(contexts); - this.player = player; - } - - @NotNull - public static PlayerContext of(@Nullable Player player, @NotNull ContextHolder contexts) { - return new PlayerContext(player, contexts); - } - - @Nullable - public Player player() { - return this.player; - } - - @Override - @NotNull - public TagResolver[] tagResolvers() { - if (this.tagResolvers == null) { - this.tagResolvers = new TagResolver[]{ShiftTag.INSTANCE, ImageTag.INSTANCE, new PlaceholderTag(this.player), new I18NTag(this), new NamedArgumentTag(this)}; - } - return this.tagResolvers; - } -} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/context/PlayerOptionalContext.java b/core/src/main/java/net/momirealms/craftengine/core/util/context/PlayerOptionalContext.java new file mode 100644 index 000000000..e3f711135 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/context/PlayerOptionalContext.java @@ -0,0 +1,87 @@ +package net.momirealms.craftengine.core.util.context; + +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; +import net.momirealms.craftengine.core.entity.Entity; +import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.plugin.text.minimessage.*; +import net.momirealms.craftengine.core.util.MCUtils; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.function.Function; + +public class PlayerOptionalContext extends CommonContext implements MiniMessageTextContext { + public static final PlayerOptionalContext EMPTY = new PlayerOptionalContext(null, ContextHolder.EMPTY); + private final Player player; + private final LazyContextParameterProvider playerParameterProvider; + private TagResolver[] tagResolvers; + + public PlayerOptionalContext(@Nullable Player player, @NotNull ContextHolder contexts) { + super(contexts); + this.player = player; + this.playerParameterProvider = player == null ? LazyContextParameterProvider.dummy() : new PlayerParameterGetter(player); + } + + @NotNull + public static PlayerOptionalContext of(@Nullable Player player, @NotNull ContextHolder contexts) { + return new PlayerOptionalContext(player, contexts); + } + + @Nullable + public Player player() { + return this.player; + } + + @Override + @NotNull + public TagResolver[] tagResolvers() { + if (this.tagResolvers == null) { + this.tagResolvers = new TagResolver[]{ShiftTag.INSTANCE, ImageTag.INSTANCE, new PlaceholderTag(this.player), new I18NTag(this), new NamedArgumentTag(this)}; + } + return this.tagResolvers; + } + + @Override + public Optional getOptionalParameter(ContextKey parameter) { + Optional optional = this.playerParameterProvider.getOptionalParameter(parameter); + if (optional.isPresent()) { + return optional; + } + return super.getOptionalParameter(parameter); + } + + @Override + public T getParameterOrThrow(ContextKey parameter) { + return this.playerParameterProvider.getOptionalParameter(parameter).orElseGet(() -> super.getParameterOrThrow(parameter)); + } + + public static class PlayerParameterGetter implements LazyContextParameterProvider { + private static final Map, Function> CONTEXT_FUNCTIONS = new HashMap<>(); + static { + CONTEXT_FUNCTIONS.put(PlayerParameters.X, Entity::x); + CONTEXT_FUNCTIONS.put(PlayerParameters.Y, Entity::y); + CONTEXT_FUNCTIONS.put(PlayerParameters.Z, Entity::z); + CONTEXT_FUNCTIONS.put(PlayerParameters.BLOCK_X, p -> MCUtils.fastFloor(p.x())); + CONTEXT_FUNCTIONS.put(PlayerParameters.BLOCK_Y, p -> MCUtils.fastFloor(p.y())); + CONTEXT_FUNCTIONS.put(PlayerParameters.BLOCK_Z, p -> MCUtils.fastFloor(p.z())); + CONTEXT_FUNCTIONS.put(PlayerParameters.NAME, Player::name); + CONTEXT_FUNCTIONS.put(PlayerParameters.UUID, Player::uuid); + } + + private final Player player; + + public PlayerParameterGetter(@NotNull Player player) { + this.player = Objects.requireNonNull(player); + } + + @SuppressWarnings("unchecked") + @Override + public Optional getOptionalParameter(ContextKey parameter) { + return (Optional) Optional.ofNullable(CONTEXT_FUNCTIONS.get(parameter)).map(f -> f.apply(this.player)); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/context/PlayerParameters.java b/core/src/main/java/net/momirealms/craftengine/core/util/context/PlayerParameters.java new file mode 100644 index 000000000..469e5a6c6 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/context/PlayerParameters.java @@ -0,0 +1,18 @@ +package net.momirealms.craftengine.core.util.context; + +import net.momirealms.craftengine.core.util.Key; + +import java.util.UUID; + +public final class PlayerParameters { + private PlayerParameters() {} + + public static final ContextKey X = new ContextKey<>(Key.of("craftengine:player.x")); + public static final ContextKey Y = new ContextKey<>(Key.of("craftengine:player.y")); + public static final ContextKey Z = new ContextKey<>(Key.of("craftengine:player.z")); + public static final ContextKey BLOCK_X = new ContextKey<>(Key.of("craftengine:player.block_x")); + public static final ContextKey BLOCK_Y = new ContextKey<>(Key.of("craftengine:player.block_y")); + public static final ContextKey BLOCK_Z = new ContextKey<>(Key.of("craftengine:player.block_z")); + public static final ContextKey NAME = new ContextKey<>(Key.of("craftengine:player.name")); + public static final ContextKey UUID = new ContextKey<>(Key.of("craftengine:player.uuid")); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/WorldBlock.java b/core/src/main/java/net/momirealms/craftengine/core/world/BlockInWorld.java similarity index 81% rename from core/src/main/java/net/momirealms/craftengine/core/world/WorldBlock.java rename to core/src/main/java/net/momirealms/craftengine/core/world/BlockInWorld.java index 4da8df826..192d2c984 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/world/WorldBlock.java +++ b/core/src/main/java/net/momirealms/craftengine/core/world/BlockInWorld.java @@ -2,7 +2,7 @@ package net.momirealms.craftengine.core.world; import net.momirealms.craftengine.core.item.context.BlockPlaceContext; -public interface WorldBlock { +public interface BlockInWorld { default boolean canBeReplaced(BlockPlaceContext blockPlaceContext) { return false; @@ -11,4 +11,10 @@ public interface WorldBlock { default boolean isWaterSource(BlockPlaceContext blockPlaceContext) { return false; } + + int x(); + + int y(); + + int z(); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/World.java b/core/src/main/java/net/momirealms/craftengine/core/world/World.java index 36979368c..5817a5e1f 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/world/World.java +++ b/core/src/main/java/net/momirealms/craftengine/core/world/World.java @@ -15,9 +15,9 @@ public interface World { WorldHeight worldHeight(); - WorldBlock getBlockAt(int x, int y, int z); + BlockInWorld getBlockAt(int x, int y, int z); - default WorldBlock getBlockAt(final BlockPos pos) { + default BlockInWorld getBlockAt(final BlockPos pos) { return getBlockAt(pos.x(), pos.y(), pos.z()); } From c33f71ae002483c362e8fee14a5cc179bd1a1a4b Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Fri, 2 May 2025 20:52:04 +0800 Subject: [PATCH 17/51] =?UTF-8?q?fix(core):=20=E5=A2=9E=E5=BC=BA=E5=AD=97?= =?UTF-8?q?=E7=AC=A6=E5=A4=84=E7=90=86=E9=80=BB=E8=BE=91=E5=B9=B6=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E9=94=99=E8=AF=AF=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/translations/en.yml | 2 +- .../src/main/resources/translations/zh_cn.yml | 2 +- .../core/font/AbstractFontManager.java | 15 ++++++++++-- .../craftengine/core/util/CharacterUtils.java | 24 +++++++++++++++++++ 4 files changed, 39 insertions(+), 4 deletions(-) diff --git a/bukkit/loader/src/main/resources/translations/en.yml b/bukkit/loader/src/main/resources/translations/en.yml index 06b1acd9f..28cf30a1f 100644 --- a/bukkit/loader/src/main/resources/translations/en.yml +++ b/bukkit/loader/src/main/resources/translations/en.yml @@ -80,7 +80,7 @@ warning.config.image.invalid_font_chars: "Issue found in file - warning.config.image.missing_char: "Issue found in file - The image '' is missing the required 'char' argument." warning.config.image.codepoint_conflict: "Issue found in file - The image '' is using a character '()' in font that has been used by another image ''." warning.config.image.invalid_codepoint_grid: "Issue found in file - Image '' has an invalid 'chars' codepoint grid." -warning.config.image.invalid_char: "Issue found in file - The image '' has a 'char' argument is invalid. Please do not write a character that contains two Unicode characters such as '⁉️'." +warning.config.image.invalid_char: "Issue found in file - Image '' has a char parameter containing combining characters, which may result in image splitting." warning.config.image.file_not_found: "Issue found in file - PNG file '' not found for image ''." warning.config.image.invalid_hex_value: "Issue found in file - The image '' is using a unicode character '' that is not a valid hexadecimal (radix 16) value." warning.config.recipe.duplicate: "Issue found in file - Duplicated recipe ''. Please check if there is the same configuration in other files." diff --git a/bukkit/loader/src/main/resources/translations/zh_cn.yml b/bukkit/loader/src/main/resources/translations/zh_cn.yml index c1d7f67a8..dff59914a 100644 --- a/bukkit/loader/src/main/resources/translations/zh_cn.yml +++ b/bukkit/loader/src/main/resources/translations/zh_cn.yml @@ -80,7 +80,7 @@ warning.config.image.invalid_font_chars: "在文件 发现问题 warning.config.image.missing_char: "在文件 发现问题 - 图片 '' 缺少必需的 'char' 参数" warning.config.image.codepoint_conflict: "在文件 发现问题 - 图片 '' 在字体 中使用的字符 '()' 已被其他图片 '' 占用" warning.config.image.invalid_codepoint_grid: "在文件 发现问题 - 图片 '' 的 'chars' 码位网格无效" -warning.config.image.invalid_char: "在文件 发现问题 - 图片 '' 的 'char' 参数无效 请不要写一个包含两个 Unicode 的字符例如 '⁉️'" +warning.config.image.invalid_char: "在文件 发现问题 - 图片 '' 的 'char' 参数包含组合字符可能导致图片分裂" warning.config.image.file_not_found: "在文件 发现问题 - 图片 '' 的 PNG 文件 '' 未找到" warning.config.image.invalid_hex_value: "在文件 发现问题 - 图片 '' 使用的 Unicode 字符 '' 不是有效的十六进制值" warning.config.recipe.duplicate: "在文件 发现问题 - 重复的配方 '' 请检查其他文件中是否存在相同配置" diff --git a/core/src/main/java/net/momirealms/craftengine/core/font/AbstractFontManager.java b/core/src/main/java/net/momirealms/craftengine/core/font/AbstractFontManager.java index 5dc6a1986..fd0c030a0 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/font/AbstractFontManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/font/AbstractFontManager.java @@ -462,7 +462,18 @@ public abstract class AbstractFontManager implements FontManager { if (character.length() == 1) { chars = List.of(character.toCharArray()); } else { - chars = List.of(CharacterUtils.decodeUnicodeToChars(character)); + if (character.startsWith("\\u")) { + chars = List.of(CharacterUtils.decodeUnicodeToChars(character)); + } else { + if (CharacterUtils.containsCombinedCharacter(character)) { + TranslationManager.instance().log("warning.config.image.invalid_char", path.toString(), id.toString()); + } + StringBuilder stringBuilder = new StringBuilder(); + for (char c : character.toCharArray()) { + stringBuilder.append(String.format("\\u%04x", (int) c)); + } + chars = List.of(CharacterUtils.decodeUnicodeToChars(stringBuilder.toString())); + } } } } @@ -482,7 +493,7 @@ public abstract class AbstractFontManager implements FontManager { } } if (codepoints.length == 0) { - throw new LocalizedResourceConfigException("warning.config.image.invalid_char", path, id); + throw new LocalizedResourceConfigException("warning.config.image.missing_char", path, id); } codepointGrid[i] = codepoints; if (size == -1) size = codepoints.length; diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/CharacterUtils.java b/core/src/main/java/net/momirealms/craftengine/core/util/CharacterUtils.java index 2d8693728..940274bba 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/util/CharacterUtils.java +++ b/core/src/main/java/net/momirealms/craftengine/core/util/CharacterUtils.java @@ -2,6 +2,7 @@ package net.momirealms.craftengine.core.util; import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; +import java.util.regex.Pattern; import java.util.stream.IntStream; public class CharacterUtils { @@ -72,4 +73,27 @@ public class CharacterUtils { } return builder.toString(); } + + public static boolean containsCombinedCharacter(String input) { + if (input == null || input.isEmpty() || input.length() == 1) return false; + for (int i = 0; i < input.length();) { + int codePoint = input.codePointAt(i); + i += Character.charCount(codePoint); + int type = Character.getType(codePoint); + if (type == Character.NON_SPACING_MARK || + type == Character.ENCLOSING_MARK || + type == Character.COMBINING_SPACING_MARK || + type == Character.FORMAT || + type == Character.CONTROL || + type == Character.SURROGATE || + type == Character.PRIVATE_USE || + Pattern.compile("[\\p{Mn}\\p{Me}\\p{Mc}\\p{Cf}]").matcher(new String(Character.toChars(codePoint))).find() + ) return true; + if (i < input.length()) { + int nextCodePoint = input.codePointAt(i); + if (Character.isSurrogatePair(Character.toChars(codePoint)[0], Character.toChars(nextCodePoint)[0])) return true; + } + } + return false; + } } From 5dbe51f016934355ea099263883b6809005d5e0b Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Sat, 3 May 2025 13:35:29 +0800 Subject: [PATCH 18/51] =?UTF-8?q?=E6=94=B9=E8=BF=9Bcontext?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../craftengine/core/loot/LootContext.java | 6 +- .../core/pack/conflict/PathContext.java | 4 +- .../core/plugin/text/minimessage/I18NTag.java | 4 +- ...ontext.java => MiniMessageTagContext.java} | 2 +- .../text/minimessage/NamedArgumentTag.java | 4 +- .../AbstractAdditionalCommonContext.java | 42 +++++++++++++ .../util/context/AbstractCommonContext.java | 46 ++++++++++++++ .../core/util/context/CommonContext.java | 32 ---------- .../core/util/context/CommonParameters.java | 9 --- .../util/context/PlayerOptionalContext.java | 62 +++---------------- .../parameter/BlockParameterProvider.java | 34 ++++++++++ .../context/parameter/BlockParameters.java | 21 +++++++ .../parameter/CommonParameterProvider.java | 31 ++++++++++ .../context/parameter/CommonParameters.java | 10 +++ .../parameter/PlayerParameterProvider.java | 40 ++++++++++++ .../{ => parameter}/PlayerParameters.java | 3 +- 16 files changed, 245 insertions(+), 105 deletions(-) rename core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/{MiniMessageTextContext.java => MiniMessageTagContext.java} (80%) create mode 100644 core/src/main/java/net/momirealms/craftengine/core/util/context/AbstractAdditionalCommonContext.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/util/context/AbstractCommonContext.java delete mode 100644 core/src/main/java/net/momirealms/craftengine/core/util/context/CommonContext.java delete mode 100644 core/src/main/java/net/momirealms/craftengine/core/util/context/CommonParameters.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/util/context/parameter/BlockParameterProvider.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/util/context/parameter/BlockParameters.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/util/context/parameter/CommonParameterProvider.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/util/context/parameter/CommonParameters.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/util/context/parameter/PlayerParameterProvider.java rename core/src/main/java/net/momirealms/craftengine/core/util/context/{ => parameter}/PlayerParameters.java (88%) diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/LootContext.java b/core/src/main/java/net/momirealms/craftengine/core/loot/LootContext.java index b996d1157..c565134fd 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/LootContext.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/LootContext.java @@ -1,14 +1,12 @@ package net.momirealms.craftengine.core.loot; -import net.momirealms.craftengine.core.util.context.CommonContext; +import net.momirealms.craftengine.core.util.context.AbstractCommonContext; import net.momirealms.craftengine.core.util.context.ContextHolder; -import net.momirealms.craftengine.core.util.context.ContextKey; import net.momirealms.craftengine.core.world.World; -import java.util.Optional; import java.util.Random; -public class LootContext extends CommonContext { +public class LootContext extends AbstractCommonContext { private final World world; private final Random randomSource; private final float luck; diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/PathContext.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/PathContext.java index 3062b256b..05c66434f 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/PathContext.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/PathContext.java @@ -1,11 +1,11 @@ package net.momirealms.craftengine.core.pack.conflict; -import net.momirealms.craftengine.core.util.context.CommonContext; +import net.momirealms.craftengine.core.util.context.AbstractCommonContext; import net.momirealms.craftengine.core.util.context.ContextHolder; import java.nio.file.Path; -public class PathContext extends CommonContext { +public class PathContext extends AbstractCommonContext { private final Path path; public PathContext(ContextHolder holder, Path path) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/I18NTag.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/I18NTag.java index c805a98d6..2887e7338 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/I18NTag.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/I18NTag.java @@ -11,9 +11,9 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; public class I18NTag implements TagResolver { - private final MiniMessageTextContext context; + private final MiniMessageTagContext context; - public I18NTag(MiniMessageTextContext context) { + public I18NTag(MiniMessageTagContext context) { this.context = context; } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/MiniMessageTextContext.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/MiniMessageTagContext.java similarity index 80% rename from core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/MiniMessageTextContext.java rename to core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/MiniMessageTagContext.java index fea64a87b..17234aae0 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/MiniMessageTextContext.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/MiniMessageTagContext.java @@ -3,7 +3,7 @@ package net.momirealms.craftengine.core.plugin.text.minimessage; import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import net.momirealms.craftengine.core.util.context.Context; -public interface MiniMessageTextContext extends Context { +public interface MiniMessageTagContext extends Context { TagResolver[] tagResolvers(); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/NamedArgumentTag.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/NamedArgumentTag.java index b48a8c43c..548484c28 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/NamedArgumentTag.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/NamedArgumentTag.java @@ -18,9 +18,9 @@ public class NamedArgumentTag implements TagResolver { private static final String NAME_0 = "argument"; private static final String NAME_1 = "arg"; - private final MiniMessageTextContext context; + private final MiniMessageTagContext context; - public NamedArgumentTag(@NotNull MiniMessageTextContext context) { + public NamedArgumentTag(@NotNull MiniMessageTagContext context) { this.context = Objects.requireNonNull(context, "context holder"); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/context/AbstractAdditionalCommonContext.java b/core/src/main/java/net/momirealms/craftengine/core/util/context/AbstractAdditionalCommonContext.java new file mode 100644 index 000000000..c16ffa97d --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/context/AbstractAdditionalCommonContext.java @@ -0,0 +1,42 @@ +package net.momirealms.craftengine.core.util.context; + +import net.momirealms.craftengine.core.util.context.parameter.CommonParameterProvider; + +import java.util.List; +import java.util.Optional; + +public abstract class AbstractAdditionalCommonContext extends AbstractCommonContext { + private final List providers; + + public AbstractAdditionalCommonContext(ContextHolder contexts, List providers) { + super(contexts); + this.providers = providers; + } + + public AbstractAdditionalCommonContext(ContextHolder contexts) { + super(contexts); + this.providers = List.of(new CommonParameterProvider()); + } + + @Override + public Optional getOptionalParameter(ContextKey parameter) { + for (LazyContextParameterProvider provider : providers) { + Optional result = provider.getOptionalParameter(parameter); + if (result.isPresent()) { + return result; + } + } + return super.getOptionalParameter(parameter); + } + + @Override + public T getParameterOrThrow(ContextKey parameter) { + for (LazyContextParameterProvider provider : providers) { + Optional result = provider.getOptionalParameter(parameter); + if (result.isPresent()) { + return result.get(); + } + } + return super.getParameterOrThrow(parameter); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/context/AbstractCommonContext.java b/core/src/main/java/net/momirealms/craftengine/core/util/context/AbstractCommonContext.java new file mode 100644 index 000000000..cc7f85791 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/context/AbstractCommonContext.java @@ -0,0 +1,46 @@ +package net.momirealms.craftengine.core.util.context; + +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; +import net.momirealms.craftengine.core.plugin.text.minimessage.*; +import org.jetbrains.annotations.NotNull; + +import java.util.Optional; + +public abstract class AbstractCommonContext implements MiniMessageTagContext { + protected final ContextHolder contexts; + protected TagResolver[] tagResolvers; + + public AbstractCommonContext(ContextHolder contexts) { + this.contexts = contexts; + } + + @Override + public ContextHolder contexts() { + return contexts; + } + + @Override + @NotNull + public TagResolver[] tagResolvers() { + if (this.tagResolvers == null) { + this.tagResolvers = new TagResolver[]{ShiftTag.INSTANCE, ImageTag.INSTANCE, new I18NTag(this), new NamedArgumentTag(this)}; + } + return this.tagResolvers; + } + + @Override + public Optional getOptionalParameter(ContextKey parameter) { + return this.contexts.getOptional(parameter); + } + + @Override + public T getParameterOrThrow(ContextKey parameter) { + return this.contexts.getOrThrow(parameter); + } + + @Override + public AbstractCommonContext withParameter(ContextKey parameter, T value) { + this.contexts.withParameter(parameter, value); + return this; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/context/CommonContext.java b/core/src/main/java/net/momirealms/craftengine/core/util/context/CommonContext.java deleted file mode 100644 index ef6754308..000000000 --- a/core/src/main/java/net/momirealms/craftengine/core/util/context/CommonContext.java +++ /dev/null @@ -1,32 +0,0 @@ -package net.momirealms.craftengine.core.util.context; - -import java.util.Optional; - -public abstract class CommonContext implements Context { - protected final ContextHolder contexts; - - public CommonContext(ContextHolder contexts) { - this.contexts = contexts; - } - - @Override - public ContextHolder contexts() { - return contexts; - } - - @Override - public Optional getOptionalParameter(ContextKey parameter) { - return this.contexts.getOptional(parameter); - } - - @Override - public T getParameterOrThrow(ContextKey parameter) { - return this.contexts.getOrThrow(parameter); - } - - @Override - public CommonContext withParameter(ContextKey parameter, T value) { - this.contexts.withParameter(parameter, value); - return this; - } -} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/context/CommonParameters.java b/core/src/main/java/net/momirealms/craftengine/core/util/context/CommonParameters.java deleted file mode 100644 index 339e41e93..000000000 --- a/core/src/main/java/net/momirealms/craftengine/core/util/context/CommonParameters.java +++ /dev/null @@ -1,9 +0,0 @@ -package net.momirealms.craftengine.core.util.context; - -public final class CommonParameters { - - private CommonParameters() {} - - public static ContextKey RANDOM = ContextKey.of("random"); - public static ContextKey LAST_RANDOM = ContextKey.of("last_random"); -} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/context/PlayerOptionalContext.java b/core/src/main/java/net/momirealms/craftengine/core/util/context/PlayerOptionalContext.java index e3f711135..87b33d632 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/util/context/PlayerOptionalContext.java +++ b/core/src/main/java/net/momirealms/craftengine/core/util/context/PlayerOptionalContext.java @@ -1,29 +1,27 @@ package net.momirealms.craftengine.core.util.context; import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; -import net.momirealms.craftengine.core.entity.Entity; import net.momirealms.craftengine.core.entity.player.Player; import net.momirealms.craftengine.core.plugin.text.minimessage.*; -import net.momirealms.craftengine.core.util.MCUtils; +import net.momirealms.craftengine.core.util.context.parameter.CommonParameterProvider; +import net.momirealms.craftengine.core.util.context.parameter.PlayerParameterProvider; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; -import java.util.function.Function; +import java.util.*; -public class PlayerOptionalContext extends CommonContext implements MiniMessageTextContext { +public class PlayerOptionalContext extends AbstractAdditionalCommonContext implements MiniMessageTagContext { public static final PlayerOptionalContext EMPTY = new PlayerOptionalContext(null, ContextHolder.EMPTY); private final Player player; - private final LazyContextParameterProvider playerParameterProvider; - private TagResolver[] tagResolvers; public PlayerOptionalContext(@Nullable Player player, @NotNull ContextHolder contexts) { - super(contexts); + super(contexts, player == null ? List.of(new CommonParameterProvider()) : List.of(new CommonParameterProvider(), new PlayerParameterProvider(player))); + this.player = player; + } + + public PlayerOptionalContext(@Nullable Player player, @NotNull ContextHolder contexts, @NotNull List providers) { + super(contexts, providers); this.player = player; - this.playerParameterProvider = player == null ? LazyContextParameterProvider.dummy() : new PlayerParameterGetter(player); } @NotNull @@ -44,44 +42,4 @@ public class PlayerOptionalContext extends CommonContext implements MiniMessageT } return this.tagResolvers; } - - @Override - public Optional getOptionalParameter(ContextKey parameter) { - Optional optional = this.playerParameterProvider.getOptionalParameter(parameter); - if (optional.isPresent()) { - return optional; - } - return super.getOptionalParameter(parameter); - } - - @Override - public T getParameterOrThrow(ContextKey parameter) { - return this.playerParameterProvider.getOptionalParameter(parameter).orElseGet(() -> super.getParameterOrThrow(parameter)); - } - - public static class PlayerParameterGetter implements LazyContextParameterProvider { - private static final Map, Function> CONTEXT_FUNCTIONS = new HashMap<>(); - static { - CONTEXT_FUNCTIONS.put(PlayerParameters.X, Entity::x); - CONTEXT_FUNCTIONS.put(PlayerParameters.Y, Entity::y); - CONTEXT_FUNCTIONS.put(PlayerParameters.Z, Entity::z); - CONTEXT_FUNCTIONS.put(PlayerParameters.BLOCK_X, p -> MCUtils.fastFloor(p.x())); - CONTEXT_FUNCTIONS.put(PlayerParameters.BLOCK_Y, p -> MCUtils.fastFloor(p.y())); - CONTEXT_FUNCTIONS.put(PlayerParameters.BLOCK_Z, p -> MCUtils.fastFloor(p.z())); - CONTEXT_FUNCTIONS.put(PlayerParameters.NAME, Player::name); - CONTEXT_FUNCTIONS.put(PlayerParameters.UUID, Player::uuid); - } - - private final Player player; - - public PlayerParameterGetter(@NotNull Player player) { - this.player = Objects.requireNonNull(player); - } - - @SuppressWarnings("unchecked") - @Override - public Optional getOptionalParameter(ContextKey parameter) { - return (Optional) Optional.ofNullable(CONTEXT_FUNCTIONS.get(parameter)).map(f -> f.apply(this.player)); - } - } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/context/parameter/BlockParameterProvider.java b/core/src/main/java/net/momirealms/craftengine/core/util/context/parameter/BlockParameterProvider.java new file mode 100644 index 000000000..243cb585f --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/context/parameter/BlockParameterProvider.java @@ -0,0 +1,34 @@ +package net.momirealms.craftengine.core.util.context.parameter; + +import net.momirealms.craftengine.core.util.MCUtils; +import net.momirealms.craftengine.core.util.context.ContextKey; +import net.momirealms.craftengine.core.util.context.LazyContextParameterProvider; +import net.momirealms.craftengine.core.world.BlockInWorld; +import org.jetbrains.annotations.NotNull; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.function.Function; + +public class BlockParameterProvider implements LazyContextParameterProvider { + private static final Map, Function> CONTEXT_FUNCTIONS = new HashMap<>(); + static { + CONTEXT_FUNCTIONS.put(BlockParameters.BLOCK_X, b -> MCUtils.fastFloor(b.x())); + CONTEXT_FUNCTIONS.put(BlockParameters.BLOCK_Y, b -> MCUtils.fastFloor(b.y())); + CONTEXT_FUNCTIONS.put(BlockParameters.BLOCK_Z, b -> MCUtils.fastFloor(b.z())); + } + + private final BlockInWorld block; + + public BlockParameterProvider(@NotNull BlockInWorld block) { + this.block = Objects.requireNonNull(block); + } + + @SuppressWarnings("unchecked") + @Override + public Optional getOptionalParameter(ContextKey parameter) { + return (Optional) Optional.ofNullable(CONTEXT_FUNCTIONS.get(parameter)).map(f -> f.apply(this.block)); + } +} \ No newline at end of file diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/context/parameter/BlockParameters.java b/core/src/main/java/net/momirealms/craftengine/core/util/context/parameter/BlockParameters.java new file mode 100644 index 000000000..6ccdf1ec9 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/context/parameter/BlockParameters.java @@ -0,0 +1,21 @@ +package net.momirealms.craftengine.core.util.context.parameter; + +import net.momirealms.craftengine.core.block.ImmutableBlockState; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.context.ContextKey; + +import java.util.UUID; + +public final class BlockParameters { + private BlockParameters() {} + + public static final ContextKey X = new ContextKey<>(Key.of("craftengine:block.x")); + public static final ContextKey Y = new ContextKey<>(Key.of("craftengine:block.y")); + public static final ContextKey Z = new ContextKey<>(Key.of("craftengine:block.z")); + public static final ContextKey BLOCK_X = new ContextKey<>(Key.of("craftengine:block.block_x")); + public static final ContextKey BLOCK_Y = new ContextKey<>(Key.of("craftengine:block.block_y")); + public static final ContextKey BLOCK_Z = new ContextKey<>(Key.of("craftengine:block.block_z")); + public static final ContextKey BLOCK_STATE = new ContextKey<>(Key.of("craftengine:block.state")); + public static final ContextKey BLOCK_OWNER = new ContextKey<>(Key.of("craftengine:block.owner")); + +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/context/parameter/CommonParameterProvider.java b/core/src/main/java/net/momirealms/craftengine/core/util/context/parameter/CommonParameterProvider.java new file mode 100644 index 000000000..64515a5d4 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/context/parameter/CommonParameterProvider.java @@ -0,0 +1,31 @@ +package net.momirealms.craftengine.core.util.context.parameter; + +import net.momirealms.craftengine.core.util.RandomUtils; +import net.momirealms.craftengine.core.util.context.ContextKey; +import net.momirealms.craftengine.core.util.context.LazyContextParameterProvider; + +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; +import java.util.function.Function; + +public class CommonParameterProvider implements LazyContextParameterProvider { + private double lastRandom = -1; + + private static final Map, Function> CONTEXT_FUNCTIONS = new HashMap<>(); + static { + CONTEXT_FUNCTIONS.put(CommonParameters.RANDOM, (f) -> RandomUtils.generateRandomDouble(0,1)); + CONTEXT_FUNCTIONS.put(CommonParameters.LAST_RANDOM, (f) -> { + if (f.lastRandom == -1) { + f.lastRandom = RandomUtils.generateRandomDouble(0, 1); + } + return f.lastRandom; + }); + } + + @SuppressWarnings("unchecked") + @Override + public Optional getOptionalParameter(ContextKey parameter) { + return (Optional) Optional.ofNullable(CONTEXT_FUNCTIONS.get(parameter)).map(f -> f.apply(this)); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/context/parameter/CommonParameters.java b/core/src/main/java/net/momirealms/craftengine/core/util/context/parameter/CommonParameters.java new file mode 100644 index 000000000..07ac2885c --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/context/parameter/CommonParameters.java @@ -0,0 +1,10 @@ +package net.momirealms.craftengine.core.util.context.parameter; + +import net.momirealms.craftengine.core.util.context.ContextKey; + +public final class CommonParameters { + private CommonParameters() {} + + public static final ContextKey RANDOM = ContextKey.of("random"); + public static final ContextKey LAST_RANDOM = ContextKey.of("last_random"); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/context/parameter/PlayerParameterProvider.java b/core/src/main/java/net/momirealms/craftengine/core/util/context/parameter/PlayerParameterProvider.java new file mode 100644 index 000000000..18e7cb668 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/context/parameter/PlayerParameterProvider.java @@ -0,0 +1,40 @@ +package net.momirealms.craftengine.core.util.context.parameter; + +import net.momirealms.craftengine.core.entity.Entity; +import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.util.MCUtils; +import net.momirealms.craftengine.core.util.context.ContextKey; +import net.momirealms.craftengine.core.util.context.LazyContextParameterProvider; +import org.jetbrains.annotations.NotNull; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.function.Function; + +public class PlayerParameterProvider implements LazyContextParameterProvider { + private static final Map, Function> CONTEXT_FUNCTIONS = new HashMap<>(); + static { + CONTEXT_FUNCTIONS.put(PlayerParameters.X, Entity::x); + CONTEXT_FUNCTIONS.put(PlayerParameters.Y, Entity::y); + CONTEXT_FUNCTIONS.put(PlayerParameters.Z, Entity::z); + CONTEXT_FUNCTIONS.put(PlayerParameters.BLOCK_X, p -> MCUtils.fastFloor(p.x())); + CONTEXT_FUNCTIONS.put(PlayerParameters.BLOCK_Y, p -> MCUtils.fastFloor(p.y())); + CONTEXT_FUNCTIONS.put(PlayerParameters.BLOCK_Z, p -> MCUtils.fastFloor(p.z())); + CONTEXT_FUNCTIONS.put(PlayerParameters.NAME, Player::name); + CONTEXT_FUNCTIONS.put(PlayerParameters.UUID, Player::uuid); + } + + private final Player player; + + public PlayerParameterProvider(@NotNull Player player) { + this.player = Objects.requireNonNull(player); + } + + @SuppressWarnings("unchecked") + @Override + public Optional getOptionalParameter(ContextKey parameter) { + return (Optional) Optional.ofNullable(CONTEXT_FUNCTIONS.get(parameter)).map(f -> f.apply(this.player)); + } +} \ No newline at end of file diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/context/PlayerParameters.java b/core/src/main/java/net/momirealms/craftengine/core/util/context/parameter/PlayerParameters.java similarity index 88% rename from core/src/main/java/net/momirealms/craftengine/core/util/context/PlayerParameters.java rename to core/src/main/java/net/momirealms/craftengine/core/util/context/parameter/PlayerParameters.java index 469e5a6c6..9ead3e94a 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/util/context/PlayerParameters.java +++ b/core/src/main/java/net/momirealms/craftengine/core/util/context/parameter/PlayerParameters.java @@ -1,6 +1,7 @@ -package net.momirealms.craftengine.core.util.context; +package net.momirealms.craftengine.core.util.context.parameter; import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.context.ContextKey; import java.util.UUID; From 2b7b218bd3f5ebc0d0948b794b5468fc6b4ce039 Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Sat, 3 May 2025 14:42:22 +0800 Subject: [PATCH 19/51] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=96=B9=E5=9D=97?= =?UTF-8?q?=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../worldedit/FastAsyncWorldEditDelegate.java | 36 ++++++++++--------- .../bukkit/world/BukkitBlockInWorld.java | 22 +++++++++++- .../core/font/AbstractFontManager.java | 6 ++++ .../resolution/ResolutionMergeAltas.java | 6 ++-- .../craftengine/core/util/CharacterUtils.java | 3 +- .../parameter/BlockParameterProvider.java | 12 ++++--- .../context/parameter/BlockParameters.java | 1 - .../craftengine/core/world/BlockInWorld.java | 5 +++ gradle.properties | 4 +-- 9 files changed, 66 insertions(+), 29 deletions(-) diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java index 53987af76..1adf0be83 100644 --- a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java @@ -11,11 +11,13 @@ import com.sk89q.worldedit.function.pattern.Pattern; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.regions.Region; import com.sk89q.worldedit.util.eventbus.Subscribe; +import com.sk89q.worldedit.world.World; import com.sk89q.worldedit.world.block.BaseBlock; import com.sk89q.worldedit.world.block.BlockStateHolder; import net.momirealms.craftengine.bukkit.block.BukkitBlockManager; import net.momirealms.craftengine.bukkit.util.BlockStateUtils; import net.momirealms.craftengine.core.block.EmptyBlock; +import net.momirealms.craftengine.core.block.ImmutableBlockState; import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.world.CEWorld; import net.momirealms.craftengine.core.world.ChunkPos; @@ -24,20 +26,21 @@ import org.bukkit.Bukkit; import java.io.IOException; import java.util.HashSet; +import java.util.Optional; import java.util.Set; import static java.util.Objects.requireNonNull; public class FastAsyncWorldEditDelegate extends AbstractDelegateExtent { - private final Set needSaveChunks; + private final Set chunksToSave; private final CEWorld ceWorld; protected FastAsyncWorldEditDelegate(EditSessionEvent event) { super(event.getExtent()); - this.needSaveChunks = new HashSet<>(); - var weWorld = event.getWorld(); - var world = Bukkit.getWorld(requireNonNull(weWorld).getName()); - var ceWorld = CraftEngine.instance().worldManager().getWorld(requireNonNull(world).getUID()); + this.chunksToSave = new HashSet<>(); + World weWorld = event.getWorld(); + org.bukkit.World world = Bukkit.getWorld(requireNonNull(weWorld).getName()); + CEWorld ceWorld = CraftEngine.instance().worldManager().getWorld(requireNonNull(world).getUID()); this.ceWorld = requireNonNull(ceWorld); } @@ -65,7 +68,6 @@ public class FastAsyncWorldEditDelegate extends AbstractDelegateExtent { return super.setBlocks(region, pattern); } - @Override public > int setBlocks(final Region region, final B block) { this.processBlocks(region, block); @@ -77,6 +79,7 @@ public class FastAsyncWorldEditDelegate extends AbstractDelegateExtent { this.processBlocks(region, pattern); return super.replaceBlocks(region, mask, pattern); } + @Override public > int replaceBlocks(final Region region, final Set filter, final B replacement) { this.processBlocks(region, replacement); @@ -136,28 +139,27 @@ public class FastAsyncWorldEditDelegate extends AbstractDelegateExtent { private void processBlock(int blockX, int blockY, int blockZ, BaseBlock blockState, BaseBlock oldBlockState) throws IOException { int chunkX = blockX >> 4; int chunkZ = blockZ >> 4; - int stateId = BlockStateUtils.blockDataToId(Bukkit.createBlockData(blockState.getAsString())); - int oldStateId = BlockStateUtils.blockDataToId(Bukkit.createBlockData(oldBlockState.getAsString())); - if (BlockStateUtils.isVanillaBlock(stateId) && BlockStateUtils.isVanillaBlock(oldStateId)) return; - var ceChunk = this.ceWorld.getChunkAtIfLoaded(chunkX, chunkZ); - if (ceChunk == null) { - ceChunk = this.ceWorld.worldDataStorage().readChunkAt(this.ceWorld, new ChunkPos(chunkX, chunkZ)); - } - var immutableBlockState = BukkitBlockManager.instance().getImmutableBlockState(stateId); + int newStateId = BlockStateUtils.blockDataToId(Bukkit.createBlockData(blockState.getAsString())); +// int oldStateId = BlockStateUtils.blockDataToId(Bukkit.createBlockData(oldBlockState.getAsString())); + if (BlockStateUtils.isVanillaBlock(newStateId) /* && BlockStateUtils.isVanillaBlock(oldStateId) */) + return; + CEChunk ceChunk = Optional.ofNullable(this.ceWorld.getChunkAtIfLoaded(chunkX, chunkZ)) + .orElse(this.ceWorld.worldDataStorage().readChunkAt(this.ceWorld, new ChunkPos(chunkX, chunkZ))); + ImmutableBlockState immutableBlockState = BukkitBlockManager.instance().getImmutableBlockState(newStateId); if (immutableBlockState == null) { ceChunk.setBlockState(blockX, blockY, blockZ, EmptyBlock.STATE); } else { ceChunk.setBlockState(blockX, blockY, blockZ, immutableBlockState); } - this.needSaveChunks.add(ceChunk); + this.chunksToSave.add(ceChunk); } private void saveAllChunks() { try { - for (CEChunk ceChunk : this.needSaveChunks) { + for (CEChunk ceChunk : this.chunksToSave) { this.ceWorld.worldDataStorage().writeChunkAt(ceChunk.chunkPos(), ceChunk, true); } - this.needSaveChunks.clear(); + this.chunksToSave.clear(); } catch (Exception e) { CraftEngine.instance().logger().warn("Error when recording FastAsyncWorldEdit operation chunks", e); } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitBlockInWorld.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitBlockInWorld.java index 7411024be..e765f16c2 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitBlockInWorld.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitBlockInWorld.java @@ -1,10 +1,12 @@ package net.momirealms.craftengine.bukkit.world; +import net.momirealms.craftengine.bukkit.api.CraftEngineBlocks; import net.momirealms.craftengine.bukkit.block.BukkitBlockManager; import net.momirealms.craftengine.bukkit.item.BukkitItemManager; import net.momirealms.craftengine.bukkit.item.behavior.BlockItemBehavior; import net.momirealms.craftengine.bukkit.nms.FastNMS; import net.momirealms.craftengine.bukkit.util.BlockStateUtils; +import net.momirealms.craftengine.bukkit.util.KeyUtils; import net.momirealms.craftengine.bukkit.util.LocationUtils; import net.momirealms.craftengine.bukkit.util.Reflections; import net.momirealms.craftengine.core.block.ImmutableBlockState; @@ -78,7 +80,25 @@ public class BukkitBlockInWorld implements BlockInWorld { return this.block.getZ(); } + @Override + public String getAsString() { + ImmutableBlockState state = CraftEngineBlocks.getCustomBlockState(this.block); + if (state != null) { + return state.toString(); + } + return this.block.getBlockData().getAsString(); + } + + @Override + public Key owner() { + ImmutableBlockState state = CraftEngineBlocks.getCustomBlockState(this.block); + if (state != null) { + return state.owner().value().id(); + } + return KeyUtils.namespacedKey2Key(this.block.getType().getKey()); + } + public Block block() { - return block; + return this.block; } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/font/AbstractFontManager.java b/core/src/main/java/net/momirealms/craftengine/core/font/AbstractFontManager.java index bbb3d4b25..325c63b9b 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/font/AbstractFontManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/font/AbstractFontManager.java @@ -454,11 +454,17 @@ public abstract class AbstractFontManager implements FontManager { return it.toCharArray(); } }).toList(); + if (chars.isEmpty()) { + throw new LocalizedResourceConfigException("warning.config.image.missing_char", path, id); + } } else { if (charsObj instanceof Integer integer) { chars = List.of(new char[]{(char) integer.intValue()}); } else { String character = charsObj.toString(); + if (character.isEmpty()) { + throw new LocalizedResourceConfigException("warning.config.image.missing_char", path, id); + } if (character.length() == 1) { chars = List.of(character.toCharArray()); } else { diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/ResolutionMergeAltas.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/ResolutionMergeAltas.java index 6f75bbb4d..b5c75a1b6 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/ResolutionMergeAltas.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/ResolutionMergeAltas.java @@ -27,18 +27,18 @@ public class ResolutionMergeAltas implements Resolution { JsonArray ja3 = new JsonArray(); HashSet elements = new HashSet<>(); for (JsonElement je : ja1) { - if (elements.add(je.getAsString())) { + if (elements.add(je.toString())) { ja3.add(je); } } for (JsonElement je : ja2) { - if (elements.add(je.getAsString())) { + if (elements.add(je.toString())) { ja3.add(je); } } j3.add("sources", ja3); GsonHelper.writeJsonFile(j3, existing.path()); - } catch (IOException e) { + } catch (Exception e) { CraftEngine.instance().logger().severe("Failed to merge json when resolving file conflicts", e); } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/CharacterUtils.java b/core/src/main/java/net/momirealms/craftengine/core/util/CharacterUtils.java index 940274bba..7e5e154da 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/util/CharacterUtils.java +++ b/core/src/main/java/net/momirealms/craftengine/core/util/CharacterUtils.java @@ -6,6 +6,7 @@ import java.util.regex.Pattern; import java.util.stream.IntStream; public class CharacterUtils { + private static final Pattern PATTERN = Pattern.compile("[\\p{Mn}\\p{Me}\\p{Mc}\\p{Cf}]"); private CharacterUtils() {} @@ -87,7 +88,7 @@ public class CharacterUtils { type == Character.CONTROL || type == Character.SURROGATE || type == Character.PRIVATE_USE || - Pattern.compile("[\\p{Mn}\\p{Me}\\p{Mc}\\p{Cf}]").matcher(new String(Character.toChars(codePoint))).find() + PATTERN.matcher(new String(Character.toChars(codePoint))).find() ) return true; if (i < input.length()) { int nextCodePoint = input.codePointAt(i); diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/context/parameter/BlockParameterProvider.java b/core/src/main/java/net/momirealms/craftengine/core/util/context/parameter/BlockParameterProvider.java index 243cb585f..7f9f91872 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/util/context/parameter/BlockParameterProvider.java +++ b/core/src/main/java/net/momirealms/craftengine/core/util/context/parameter/BlockParameterProvider.java @@ -1,6 +1,5 @@ package net.momirealms.craftengine.core.util.context.parameter; -import net.momirealms.craftengine.core.util.MCUtils; import net.momirealms.craftengine.core.util.context.ContextKey; import net.momirealms.craftengine.core.util.context.LazyContextParameterProvider; import net.momirealms.craftengine.core.world.BlockInWorld; @@ -15,9 +14,14 @@ import java.util.function.Function; public class BlockParameterProvider implements LazyContextParameterProvider { private static final Map, Function> CONTEXT_FUNCTIONS = new HashMap<>(); static { - CONTEXT_FUNCTIONS.put(BlockParameters.BLOCK_X, b -> MCUtils.fastFloor(b.x())); - CONTEXT_FUNCTIONS.put(BlockParameters.BLOCK_Y, b -> MCUtils.fastFloor(b.y())); - CONTEXT_FUNCTIONS.put(BlockParameters.BLOCK_Z, b -> MCUtils.fastFloor(b.z())); + CONTEXT_FUNCTIONS.put(BlockParameters.X, BlockInWorld::x); + CONTEXT_FUNCTIONS.put(BlockParameters.Y, BlockInWorld::y); + CONTEXT_FUNCTIONS.put(BlockParameters.Z, BlockInWorld::z); + CONTEXT_FUNCTIONS.put(BlockParameters.BLOCK_X, BlockInWorld::x); + CONTEXT_FUNCTIONS.put(BlockParameters.BLOCK_Y, BlockInWorld::y); + CONTEXT_FUNCTIONS.put(BlockParameters.BLOCK_Z, BlockInWorld::z); + CONTEXT_FUNCTIONS.put(BlockParameters.BLOCK_OWNER, BlockInWorld::owner); + CONTEXT_FUNCTIONS.put(BlockParameters.BLOCK_STATE, BlockInWorld::getAsString); } private final BlockInWorld block; diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/context/parameter/BlockParameters.java b/core/src/main/java/net/momirealms/craftengine/core/util/context/parameter/BlockParameters.java index 6ccdf1ec9..b724ef86d 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/util/context/parameter/BlockParameters.java +++ b/core/src/main/java/net/momirealms/craftengine/core/util/context/parameter/BlockParameters.java @@ -17,5 +17,4 @@ public final class BlockParameters { public static final ContextKey BLOCK_Z = new ContextKey<>(Key.of("craftengine:block.block_z")); public static final ContextKey BLOCK_STATE = new ContextKey<>(Key.of("craftengine:block.state")); public static final ContextKey BLOCK_OWNER = new ContextKey<>(Key.of("craftengine:block.owner")); - } diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/BlockInWorld.java b/core/src/main/java/net/momirealms/craftengine/core/world/BlockInWorld.java index 192d2c984..2b38da29f 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/world/BlockInWorld.java +++ b/core/src/main/java/net/momirealms/craftengine/core/world/BlockInWorld.java @@ -1,6 +1,7 @@ package net.momirealms.craftengine.core.world; import net.momirealms.craftengine.core.item.context.BlockPlaceContext; +import net.momirealms.craftengine.core.util.Key; public interface BlockInWorld { @@ -12,6 +13,10 @@ public interface BlockInWorld { return false; } + Key owner(); + + String getAsString(); + int x(); int y(); diff --git a/gradle.properties b/gradle.properties index 30c9a5e26..d511d872d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,7 +2,7 @@ org.gradle.jvmargs=-Xmx1G # Project settings # Rule: [major update].[feature update].[bug fix] -project_version=0.0.53-beta.1 +project_version=0.0.53-beta.2 config_version=31 lang_version=10 project_group=net.momirealms @@ -50,7 +50,7 @@ byte_buddy_version=1.17.5 ahocorasick_version=0.6.3 snake_yaml_version=2.4 anti_grief_version=0.15 -nms_helper_version=0.64.3 +nms_helper_version=0.64.4 reactive_streams_version=1.0.4 amazon_awssdk_version=2.31.23 amazon_awssdk_eventstream_version=1.0.1 From c1aac8c9f854051415907a5575f14c01a32bf894 Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Sat, 3 May 2025 19:12:48 +0800 Subject: [PATCH 20/51] =?UTF-8?q?=E6=9B=B4=E6=96=B0nbt=E5=BA=93=E9=80=82?= =?UTF-8?q?=E9=85=8D1.21.5=E7=BB=84=E4=BB=B6=E5=8F=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bukkit/loader/src/main/resources/todo.yml | 72 ------------------- .../bukkit/api/BukkitAdaptors.java | 2 +- .../bukkit/entity/BukkitEntity.java | 2 +- .../bukkit/item/ItemEventListener.java | 4 +- .../plugin/command/feature/TestCommand.java | 14 ++-- .../plugin/network/PacketConsumers.java | 2 +- .../plugin/user/BukkitServerPlayer.java | 2 +- .../bukkit/util/ParticleUtils.java | 2 +- .../bukkit/world/BukkitBlockInWorld.java | 7 +- .../craftengine/bukkit/world/BukkitWorld.java | 2 +- .../core/block/PlayerBlockActionContext.java | 15 ---- .../craftengine/core/entity/Entity.java | 2 +- .../core/font/AbstractFontManager.java | 3 +- .../core/font/EmojiParameters.java | 9 +-- .../core/item/context/UseOnContext.java | 2 +- .../core/loot/parameter/LootParameters.java | 21 +++--- .../conflict/matcher/PathMatcherAllOf.java | 1 - .../conflict/matcher/PathMatcherInverted.java | 1 - .../pack/conflict/matcher/PathMatchers.java | 1 - .../resolution/ResolutionMergeAltas.java | 1 - .../core/util/AdventureHelper.java | 17 ++++- .../context/PlayerBlockActionContext.java | 21 ++++++ .../util/context/PlayerOptionalContext.java | 2 +- .../parameter/BlockParameterProvider.java | 1 + .../context/parameter/BlockParameters.java | 19 +++-- .../parameter/CommonParameterProvider.java | 5 +- .../parameter/PlayerParameterProvider.java | 1 + .../context/parameter/PlayerParameters.java | 18 ++--- .../craftengine/core/world/BlockInWorld.java | 2 + gradle.properties | 2 +- 30 files changed, 109 insertions(+), 144 deletions(-) delete mode 100644 bukkit/loader/src/main/resources/todo.yml delete mode 100644 core/src/main/java/net/momirealms/craftengine/core/block/PlayerBlockActionContext.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/util/context/PlayerBlockActionContext.java diff --git a/bukkit/loader/src/main/resources/todo.yml b/bukkit/loader/src/main/resources/todo.yml deleted file mode 100644 index e487968bc..000000000 --- a/bukkit/loader/src/main/resources/todo.yml +++ /dev/null @@ -1,72 +0,0 @@ -# Stores something that has not been implemented yet - -######################################################################################################################################################################################################################## -# If you want to create more doors, you can use doors of other materials, such as birch. You can only create one custom door from each vanilla door. -# Oak Door -minecraft:oak_door[facing=north,half=lower,hinge=right,open=false,powered=true]: minecraft:oak_door[facing=north,half=lower,hinge=right,open=false,powered=false] -minecraft:oak_door[facing=south,half=lower,hinge=right,open=false,powered=true]: minecraft:oak_door[facing=south,half=lower,hinge=right,open=false,powered=false] -minecraft:oak_door[facing=east,half=lower,hinge=right,open=false,powered=true]: minecraft:oak_door[facing=east,half=lower,hinge=right,open=false,powered=false] -minecraft:oak_door[facing=west,half=lower,hinge=right,open=false,powered=true]: minecraft:oak_door[facing=west,half=lower,hinge=right,open=false,powered=false] -minecraft:oak_door[facing=north,half=lower,hinge=right,open=true,powered=true]: minecraft:oak_door[facing=north,half=lower,hinge=right,open=true,powered=false] -minecraft:oak_door[facing=south,half=lower,hinge=right,open=true,powered=true]: minecraft:oak_door[facing=south,half=lower,hinge=right,open=true,powered=false] -minecraft:oak_door[facing=east,half=lower,hinge=right,open=true,powered=true]: minecraft:oak_door[facing=east,half=lower,hinge=right,open=true,powered=false] -minecraft:oak_door[facing=west,half=lower,hinge=right,open=true,powered=true]: minecraft:oak_door[facing=west,half=lower,hinge=right,open=true,powered=false] -minecraft:oak_door[facing=north,half=lower,hinge=left,open=false,powered=true]: minecraft:oak_door[facing=north,half=lower,hinge=left,open=false,powered=false] -minecraft:oak_door[facing=south,half=lower,hinge=left,open=false,powered=true]: minecraft:oak_door[facing=south,half=lower,hinge=left,open=false,powered=false] -minecraft:oak_door[facing=east,half=lower,hinge=left,open=false,powered=true]: minecraft:oak_door[facing=east,half=lower,hinge=left,open=false,powered=false] -minecraft:oak_door[facing=west,half=lower,hinge=left,open=false,powered=true]: minecraft:oak_door[facing=west,half=lower,hinge=left,open=false,powered=false] -minecraft:oak_door[facing=north,half=lower,hinge=left,open=true,powered=true]: minecraft:oak_door[facing=north,half=lower,hinge=left,open=true,powered=false] -minecraft:oak_door[facing=south,half=lower,hinge=left,open=true,powered=true]: minecraft:oak_door[facing=south,half=lower,hinge=left,open=true,powered=false] -minecraft:oak_door[facing=east,half=lower,hinge=left,open=true,powered=true]: minecraft:oak_door[facing=east,half=lower,hinge=left,open=true,powered=false] -minecraft:oak_door[facing=west,half=lower,hinge=left,open=true,powered=true]: minecraft:oak_door[facing=west,half=lower,hinge=left,open=true,powered=false] -minecraft:oak_door[facing=north,half=upper,hinge=right,open=false,powered=true]: minecraft:oak_door[facing=north,half=upper,hinge=right,open=false,powered=false] -minecraft:oak_door[facing=south,half=upper,hinge=right,open=false,powered=true]: minecraft:oak_door[facing=south,half=upper,hinge=right,open=false,powered=false] -minecraft:oak_door[facing=east,half=upper,hinge=right,open=false,powered=true]: minecraft:oak_door[facing=east,half=upper,hinge=right,open=false,powered=false] -minecraft:oak_door[facing=west,half=upper,hinge=right,open=false,powered=true]: minecraft:oak_door[facing=west,half=upper,hinge=right,open=false,powered=false] -minecraft:oak_door[facing=north,half=upper,hinge=right,open=true,powered=true]: minecraft:oak_door[facing=north,half=upper,hinge=right,open=true,powered=false] -minecraft:oak_door[facing=south,half=upper,hinge=right,open=true,powered=true]: minecraft:oak_door[facing=south,half=upper,hinge=right,open=true,powered=false] -minecraft:oak_door[facing=east,half=upper,hinge=right,open=true,powered=true]: minecraft:oak_door[facing=east,half=upper,hinge=right,open=true,powered=false] -minecraft:oak_door[facing=west,half=upper,hinge=right,open=true,powered=true]: minecraft:oak_door[facing=west,half=upper,hinge=right,open=true,powered=false] -minecraft:oak_door[facing=north,half=upper,hinge=left,open=false,powered=true]: minecraft:oak_door[facing=north,half=upper,hinge=left,open=false,powered=false] -minecraft:oak_door[facing=south,half=upper,hinge=left,open=false,powered=true]: minecraft:oak_door[facing=south,half=upper,hinge=left,open=false,powered=false] -minecraft:oak_door[facing=east,half=upper,hinge=left,open=false,powered=true]: minecraft:oak_door[facing=east,half=upper,hinge=left,open=false,powered=false] -minecraft:oak_door[facing=west,half=upper,hinge=left,open=false,powered=true]: minecraft:oak_door[facing=west,half=upper,hinge=left,open=false,powered=false] -minecraft:oak_door[facing=north,half=upper,hinge=left,open=true,powered=true]: minecraft:oak_door[facing=north,half=upper,hinge=left,open=true,powered=false] -minecraft:oak_door[facing=south,half=upper,hinge=left,open=true,powered=true]: minecraft:oak_door[facing=south,half=upper,hinge=left,open=true,powered=false] -minecraft:oak_door[facing=east,half=upper,hinge=left,open=true,powered=true]: minecraft:oak_door[facing=east,half=upper,hinge=left,open=true,powered=false] -minecraft:oak_door[facing=west,half=upper,hinge=left,open=true,powered=true]: minecraft:oak_door[facing=west,half=upper,hinge=left,open=true,powered=false] -# You can create more trapdoor if you don't care the facing. -# Oak Trapdoor -minecraft:oak_trapdoor[facing=north,open=false,powered=true,waterlogged=false]: minecraft:oak_trapdoor[facing=north,open=false,powered=false,waterlogged=false] -minecraft:oak_trapdoor[facing=north,open=false,powered=true,waterlogged=true]: minecraft:oak_trapdoor[facing=north,open=false,powered=false,waterlogged=true] -minecraft:oak_trapdoor[facing=north,open=true,powered=true,waterlogged=false]: minecraft:oak_trapdoor[facing=north,open=true,powered=false,waterlogged=false] -minecraft:oak_trapdoor[facing=north,open=true,powered=true,waterlogged=true]: minecraft:oak_trapdoor[facing=north,open=true,powered=false,waterlogged=true] -minecraft:oak_trapdoor[facing=south,open=false,powered=true,waterlogged=false]: minecraft:oak_trapdoor[facing=south,open=false,powered=false,waterlogged=false] -minecraft:oak_trapdoor[facing=south,open=false,powered=true,waterlogged=true]: minecraft:oak_trapdoor[facing=south,open=false,powered=false,waterlogged=true] -minecraft:oak_trapdoor[facing=south,open=true,powered=true,waterlogged=false]: minecraft:oak_trapdoor[facing=south,open=true,powered=false,waterlogged=false] -minecraft:oak_trapdoor[facing=south,open=true,powered=true,waterlogged=true]: minecraft:oak_trapdoor[facing=south,open=true,powered=false,waterlogged=true] -minecraft:oak_trapdoor[facing=east,open=false,powered=true,waterlogged=false]: minecraft:oak_trapdoor[facing=east,open=false,powered=false,waterlogged=false] -minecraft:oak_trapdoor[facing=east,open=false,powered=true,waterlogged=true]: minecraft:oak_trapdoor[facing=east,open=false,powered=false,waterlogged=true] -minecraft:oak_trapdoor[facing=east,open=true,powered=true,waterlogged=false]: minecraft:oak_trapdoor[facing=east,open=true,powered=false,waterlogged=false] -minecraft:oak_trapdoor[facing=east,open=true,powered=true,waterlogged=true]: minecraft:oak_trapdoor[facing=east,open=true,powered=false,waterlogged=true] -minecraft:oak_trapdoor[facing=west,open=false,powered=true,waterlogged=false]: minecraft:oak_trapdoor[facing=west,open=false,powered=false,waterlogged=false] -minecraft:oak_trapdoor[facing=west,open=false,powered=true,waterlogged=true]: minecraft:oak_trapdoor[facing=west,open=false,powered=false,waterlogged=true] -minecraft:oak_trapdoor[facing=west,open=true,powered=true,waterlogged=false]: minecraft:oak_trapdoor[facing=west,open=true,powered=false,waterlogged=false] -minecraft:oak_trapdoor[facing=west,open=true,powered=true,waterlogged=true]: minecraft:oak_trapdoor[facing=west,open=true,powered=false,waterlogged=true] -# fence_gate -minecraft:oak_fence_gate[facing=north,open=false,powered=true,in_wall=false]: minecraft:oak_fence_gate[facing=north,open=false,powered=false,in_wall=false] -minecraft:oak_fence_gate[facing=north,open=false,powered=true,in_wall=true]: minecraft:oak_fence_gate[facing=north,open=false,powered=false,in_wall=true] -minecraft:oak_fence_gate[facing=north,open=true,powered=true,in_wall=false]: minecraft:oak_fence_gate[facing=north,open=true,powered=false,in_wall=false] -minecraft:oak_fence_gate[facing=north,open=true,powered=true,in_wall=true]: minecraft:oak_fence_gate[facing=north,open=true,powered=false,in_wall=true] -minecraft:oak_fence_gate[facing=south,open=false,powered=true,in_wall=false]: minecraft:oak_fence_gate[facing=south,open=false,powered=false,in_wall=false] -minecraft:oak_fence_gate[facing=south,open=false,powered=true,in_wall=true]: minecraft:oak_fence_gate[facing=south,open=false,powered=false,in_wall=true] -minecraft:oak_fence_gate[facing=south,open=true,powered=true,in_wall=false]: minecraft:oak_fence_gate[facing=south,open=true,powered=false,in_wall=false] -minecraft:oak_fence_gate[facing=south,open=true,powered=true,in_wall=true]: minecraft:oak_fence_gate[facing=south,open=true,powered=false,in_wall=true] -minecraft:oak_fence_gate[facing=east,open=false,powered=true,in_wall=false]: minecraft:oak_fence_gate[facing=east,open=false,powered=false,in_wall=false] -minecraft:oak_fence_gate[facing=east,open=false,powered=true,in_wall=true]: minecraft:oak_fence_gate[facing=east,open=false,powered=false,in_wall=true] -minecraft:oak_fence_gate[facing=east,open=true,powered=true,in_wall=false]: minecraft:oak_fence_gate[facing=east,open=true,powered=false,in_wall=false] -minecraft:oak_fence_gate[facing=east,open=true,powered=true,in_wall=true]: minecraft:oak_fence_gate[facing=east,open=true,powered=false,in_wall=true] -minecraft:oak_fence_gate[facing=west,open=false,powered=true,in_wall=false]: minecraft:oak_fence_gate[facing=west,open=false,powered=false,in_wall=false] -minecraft:oak_fence_gate[facing=west,open=false,powered=true,in_wall=true]: minecraft:oak_fence_gate[facing=west,open=false,powered=false,in_wall=true] -minecraft:oak_fence_gate[facing=west,open=true,powered=true,in_wall=false]: minecraft:oak_fence_gate[facing=west,open=true,powered=false,in_wall=false] -minecraft:oak_fence_gate[facing=west,open=true,powered=true,in_wall=true]: minecraft:oak_fence_gate[facing=west,open=true,powered=false,in_wall=true] diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/BukkitAdaptors.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/BukkitAdaptors.java index ee1f0524f..f11ae4be3 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/BukkitAdaptors.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/BukkitAdaptors.java @@ -3,8 +3,8 @@ package net.momirealms.craftengine.bukkit.api; import net.momirealms.craftengine.bukkit.entity.BukkitEntity; import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; import net.momirealms.craftengine.bukkit.plugin.user.BukkitServerPlayer; -import net.momirealms.craftengine.bukkit.world.BukkitWorld; import net.momirealms.craftengine.bukkit.world.BukkitBlockInWorld; +import net.momirealms.craftengine.bukkit.world.BukkitWorld; import org.bukkit.World; import org.bukkit.block.Block; import org.bukkit.entity.Entity; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/BukkitEntity.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/BukkitEntity.java index d61bfce98..0c719082d 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/BukkitEntity.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/BukkitEntity.java @@ -49,7 +49,7 @@ public class BukkitEntity extends Entity { } @Override - public World level() { + public World world() { return new BukkitWorld(literalObject().getWorld()); } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/ItemEventListener.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/ItemEventListener.java index a23cf371a..bc5e9772f 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/ItemEventListener.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/ItemEventListener.java @@ -100,7 +100,7 @@ public class ItemEventListener implements Listener { if (optionalItemBehaviors.isPresent()) { for (ItemBehavior itemBehavior : optionalItemBehaviors.get()) { - InteractionResult result = itemBehavior.use(player.level(), player, hand); + InteractionResult result = itemBehavior.use(player.world(), player, hand); if (result == InteractionResult.SUCCESS_AND_CANCEL) { event.setCancelled(true); return; @@ -167,7 +167,7 @@ public class ItemEventListener implements Listener { event.setCancelled(true); return; } - int maxY = player.level().worldHeight().getMaxBuildHeight() - 1; + int maxY = player.world().worldHeight().getMaxBuildHeight() - 1; if (direction == Direction.UP && result != InteractionResult.SUCCESS && pos.y() >= maxY diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/TestCommand.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/TestCommand.java index 5e1ae7447..c318bac10 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/TestCommand.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/TestCommand.java @@ -1,13 +1,16 @@ package net.momirealms.craftengine.bukkit.plugin.command.feature; -import net.momirealms.craftengine.bukkit.item.BukkitItemManager; +import com.saicone.rtag.util.ChatComponent; +import net.kyori.adventure.text.Component; import net.momirealms.craftengine.bukkit.plugin.command.BukkitCommandFeature; +import net.momirealms.craftengine.bukkit.util.ComponentUtils; import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.plugin.command.CraftEngineCommandManager; -import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.AdventureHelper; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.incendo.cloud.Command; +import org.incendo.cloud.parser.standard.StringParser; public class TestCommand extends BukkitCommandFeature { @@ -19,9 +22,12 @@ public class TestCommand extends BukkitCommandFeature { public Command.Builder assembleCommand(org.incendo.cloud.CommandManager manager, Command.Builder builder) { return builder .senderType(Player.class) + .required("text", StringParser.greedyStringParser()) .handler(context -> { - Player player = context.sender(); - player.getInventory().addItem(BukkitItemManager.instance().createWrappedItem(Key.from("default:topaz"), null).getItem()); + plugin().senderFactory().wrap(context.sender()).sendMessage(Component.text( + ChatComponent.toTag(ComponentUtils.adventureToMinecraft(AdventureHelper.miniMessage().deserialize(context.get("text")))).toString() + )); + plugin().senderFactory().wrap(context.sender()).sendMessage(AdventureHelper.miniMessage().deserialize(context.get("text"))); }); } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java index 0b9b202fa..c8a427258 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java @@ -1349,7 +1349,7 @@ public class PacketConsumers { } catch (Exception e) { CraftEngine.instance().logger().warn("Failed to handle ServerboundSetCreativeModeSlotPacket", e); } - }, (World) player.level().platformWorld(), (MCUtils.fastFloor(player.x())) >> 4, (MCUtils.fastFloor(player.z())) >> 4); + }, (World) player.world().platformWorld(), (MCUtils.fastFloor(player.x())) >> 4, (MCUtils.fastFloor(player.z())) >> 4); } else { handleSetCreativeSlotPacketOnMainThread(player, packet); } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java index 13341b5b2..a7c20f9c7 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java @@ -677,7 +677,7 @@ public class BukkitServerPlayer extends Player { } @Override - public World level() { + public World world() { return new BukkitWorld(platformPlayer().getWorld()); } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/ParticleUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/ParticleUtils.java index 3b44594e6..6e847f6f9 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/ParticleUtils.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/ParticleUtils.java @@ -11,7 +11,7 @@ public class ParticleUtils { } catch (IllegalArgumentException e) { return switch (particle) { case "REDSTONE" -> Particle.valueOf("DUST"); - case "VILLAGER_HAPPY" -> Particle.valueOf(VersionHelper.isOrAbove1_20_5() ? "HAPPY_VILLAGER" : "VILLAGER_HAPPY"); + case "VILLAGER_HAPPY", "HAPPY_VILLAGER" -> Particle.valueOf(VersionHelper.isOrAbove1_20_5() ? "HAPPY_VILLAGER" : "VILLAGER_HAPPY"); default -> Particle.valueOf(particle); }; } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitBlockInWorld.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitBlockInWorld.java index e765f16c2..a7dc16a3d 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitBlockInWorld.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitBlockInWorld.java @@ -14,9 +14,9 @@ import net.momirealms.craftengine.core.item.CustomItem; import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.item.context.BlockPlaceContext; import net.momirealms.craftengine.core.plugin.CraftEngine; -import net.momirealms.craftengine.core.plugin.text.minimessage.NamedArgumentTag; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.world.BlockInWorld; +import net.momirealms.craftengine.core.world.World; import org.bukkit.Location; import org.bukkit.block.Block; import org.bukkit.inventory.ItemStack; @@ -80,6 +80,11 @@ public class BukkitBlockInWorld implements BlockInWorld { return this.block.getZ(); } + @Override + public World world() { + return new BukkitWorld(this.block.getWorld()); + } + @Override public String getAsString() { ImmutableBlockState state = CraftEngineBlocks.getCustomBlockState(this.block); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitWorld.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitWorld.java index d39fdf887..5223b9bd4 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitWorld.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitWorld.java @@ -6,9 +6,9 @@ import net.momirealms.craftengine.bukkit.util.ItemUtils; import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.VersionHelper; +import net.momirealms.craftengine.core.world.BlockInWorld; import net.momirealms.craftengine.core.world.Vec3d; import net.momirealms.craftengine.core.world.World; -import net.momirealms.craftengine.core.world.BlockInWorld; import net.momirealms.craftengine.core.world.WorldHeight; import org.bukkit.Location; import org.bukkit.SoundCategory; diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/PlayerBlockActionContext.java b/core/src/main/java/net/momirealms/craftengine/core/block/PlayerBlockActionContext.java deleted file mode 100644 index 81b41ad08..000000000 --- a/core/src/main/java/net/momirealms/craftengine/core/block/PlayerBlockActionContext.java +++ /dev/null @@ -1,15 +0,0 @@ -package net.momirealms.craftengine.core.block; - -import net.momirealms.craftengine.core.entity.player.Player; -import net.momirealms.craftengine.core.util.context.ContextHolder; -import net.momirealms.craftengine.core.util.context.PlayerOptionalContext; -import net.momirealms.craftengine.core.world.BlockInWorld; -import org.jetbrains.annotations.NotNull; - -public class PlayerBlockActionContext extends PlayerOptionalContext { - private BlockInWorld block; - - public PlayerBlockActionContext(@NotNull Player player, @NotNull ContextHolder contexts) { - super(player, contexts); - } -} diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/Entity.java b/core/src/main/java/net/momirealms/craftengine/core/entity/Entity.java index fd45a8f1c..4df160563 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/entity/Entity.java +++ b/core/src/main/java/net/momirealms/craftengine/core/entity/Entity.java @@ -19,7 +19,7 @@ public abstract class Entity { public abstract float getYRot(); - public abstract World level(); + public abstract World world(); public abstract Direction getDirection(); diff --git a/core/src/main/java/net/momirealms/craftengine/core/font/AbstractFontManager.java b/core/src/main/java/net/momirealms/craftengine/core/font/AbstractFontManager.java index 325c63b9b..76283a5b7 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/font/AbstractFontManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/font/AbstractFontManager.java @@ -170,7 +170,8 @@ public abstract class AbstractFontManager implements FontManager { PlayerOptionalContext.of(player, ContextHolder.builder() .withOptionalParameter(EmojiParameters.EMOJI, emoji.emojiImage()) .withParameter(EmojiParameters.KEYWORD, emoji.keywords().get(0)) - .build()).tagResolvers()) + .build()) + .tagResolvers()) ); if (emojis.size() >= maxTimes) break; } diff --git a/core/src/main/java/net/momirealms/craftengine/core/font/EmojiParameters.java b/core/src/main/java/net/momirealms/craftengine/core/font/EmojiParameters.java index 83c91536d..f3344e548 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/font/EmojiParameters.java +++ b/core/src/main/java/net/momirealms/craftengine/core/font/EmojiParameters.java @@ -1,9 +1,10 @@ package net.momirealms.craftengine.core.font; -import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.context.ContextKey; -public class EmojiParameters { - public static final ContextKey KEYWORD = new ContextKey<>(Key.of("keyword")); - public static final ContextKey EMOJI = new ContextKey<>(Key.of("emoji")); +public final class EmojiParameters { + private EmojiParameters() {} + + public static final ContextKey KEYWORD = ContextKey.of("keyword"); + public static final ContextKey EMOJI = ContextKey.of("emoji"); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/context/UseOnContext.java b/core/src/main/java/net/momirealms/craftengine/core/item/context/UseOnContext.java index ff6a6514e..5e6280e02 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/context/UseOnContext.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/context/UseOnContext.java @@ -17,7 +17,7 @@ public class UseOnContext { private final Item itemStack; public UseOnContext(Player player, InteractionHand hand, BlockHitResult hit) { - this(player.level(), player, hand, player.getItemInHand(hand), hit); + this(player.world(), player, hand, player.getItemInHand(hand), hit); } public UseOnContext(World world, Player player, InteractionHand hand, Item stack, BlockHitResult hit) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/parameter/LootParameters.java b/core/src/main/java/net/momirealms/craftengine/core/loot/parameter/LootParameters.java index ca09453ea..abe27d435 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/parameter/LootParameters.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/parameter/LootParameters.java @@ -4,18 +4,19 @@ import net.momirealms.craftengine.core.block.ImmutableBlockState; import net.momirealms.craftengine.core.entity.Entity; import net.momirealms.craftengine.core.entity.player.Player; import net.momirealms.craftengine.core.item.Item; -import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.context.ContextKey; import net.momirealms.craftengine.core.world.Vec3d; import net.momirealms.craftengine.core.world.World; -public class LootParameters { - public static final ContextKey LOCATION = new ContextKey<>(Key.of("craftengine:location")); - public static final ContextKey WORLD = new ContextKey<>(Key.of("craftengine:world")); - public static final ContextKey ENTITY = new ContextKey<>(Key.of("craftengine:entity")); - public static final ContextKey FALLING_BLOCK = new ContextKey<>(Key.of("craftengine:falling_block")); - public static final ContextKey EXPLOSION_RADIUS = new ContextKey<>(Key.of("craftengine:explosion_radius")); - public static final ContextKey PLAYER = new ContextKey<>(Key.of("craftengine:player")); - public static final ContextKey> TOOL = new ContextKey<>(Key.of("craftengine:tool")); - public static final ContextKey BLOCK_STATE = new ContextKey<>(Key.of("craftengine:block_state")); +public final class LootParameters { + private LootParameters() {} + + public static final ContextKey LOCATION = ContextKey.of("location"); + public static final ContextKey WORLD = ContextKey.of("world"); + public static final ContextKey ENTITY = ContextKey.of("entity"); + public static final ContextKey FALLING_BLOCK = ContextKey.of("falling_block"); + public static final ContextKey EXPLOSION_RADIUS = ContextKey.of("explosion_radius"); + public static final ContextKey PLAYER = ContextKey.of("player"); + public static final ContextKey> TOOL = ContextKey.of("tool"); + public static final ContextKey BLOCK_STATE = ContextKey.of("block_state"); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherAllOf.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherAllOf.java index 70daf8447..e98057453 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherAllOf.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherAllOf.java @@ -2,7 +2,6 @@ package net.momirealms.craftengine.core.pack.conflict.matcher; import net.momirealms.craftengine.core.pack.conflict.PathContext; import net.momirealms.craftengine.core.plugin.locale.LocalizedException; -import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.MiscUtils; import net.momirealms.craftengine.core.util.condition.AllOfCondition; import net.momirealms.craftengine.core.util.context.Condition; diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherInverted.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherInverted.java index c1d6060fb..1d5b88493 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherInverted.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherInverted.java @@ -2,7 +2,6 @@ package net.momirealms.craftengine.core.pack.conflict.matcher; import net.momirealms.craftengine.core.pack.conflict.PathContext; import net.momirealms.craftengine.core.plugin.locale.LocalizedException; -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.util.condition.InvertedCondition; diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatchers.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatchers.java index 7316e0d58..7afc670bc 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatchers.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatchers.java @@ -8,7 +8,6 @@ import net.momirealms.craftengine.core.registry.WritableRegistry; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.ResourceConfigUtils; import net.momirealms.craftengine.core.util.ResourceKey; -import net.momirealms.craftengine.core.util.condition.AllOfCondition; import java.util.ArrayList; import java.util.List; diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/ResolutionMergeAltas.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/ResolutionMergeAltas.java index b5c75a1b6..65e0daf81 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/ResolutionMergeAltas.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/ResolutionMergeAltas.java @@ -8,7 +8,6 @@ import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.util.GsonHelper; import net.momirealms.craftengine.core.util.Key; -import java.io.IOException; import java.util.HashSet; import java.util.Map; diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/AdventureHelper.java b/core/src/main/java/net/momirealms/craftengine/core/util/AdventureHelper.java index 1cfa6f2d4..0062e5bd6 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/util/AdventureHelper.java +++ b/core/src/main/java/net/momirealms/craftengine/core/util/AdventureHelper.java @@ -13,6 +13,7 @@ import net.kyori.adventure.text.serializer.json.JSONOptions; import net.kyori.adventure.text.serializer.json.legacyimpl.NBTLegacyHoverEventSerializer; import net.momirealms.sparrow.nbt.Tag; import net.momirealms.sparrow.nbt.serializer.NBTComponentSerializer; +import net.momirealms.sparrow.nbt.serializer.NBTSerializerOptions; /** * Helper class for handling Adventure components and related functionalities. @@ -34,8 +35,22 @@ public class AdventureHelper { builder.legacyHoverEventSerializer(NBTLegacyHoverEventSerializer.get()); builder.editOptions((b) -> b.value(JSONOptions.EMIT_HOVER_SHOW_ENTITY_ID_AS_INT_ARRAY, false)); } + if (!VersionHelper.isOrAbove1_21_5()) { + builder.editOptions((b) -> { + b.value(JSONOptions.EMIT_CLICK_EVENT_TYPE, JSONOptions.ClickEventValueMode.CAMEL_CASE); + b.value(JSONOptions.EMIT_HOVER_EVENT_TYPE, JSONOptions.HoverEventValueMode.CAMEL_CASE); + b.value(JSONOptions.EMIT_HOVER_SHOW_ENTITY_KEY_AS_TYPE_AND_UUID_AS_ID, true); + }); + } this.gsonComponentSerializer = builder.build(); - this.nbtComponentSerializer = NBTComponentSerializer.builder().build(); + this.nbtComponentSerializer = NBTComponentSerializer.builder() + .editOptions((b) -> { + if (!VersionHelper.isOrAbove1_21_5()) { + b.value(NBTSerializerOptions.EMIT_CLICK_EVENT_TYPE, false); + b.value(NBTSerializerOptions.EMIT_HOVER_EVENT_TYPE, false); + } + }) + .build(); } private static class SingletonHolder { diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/context/PlayerBlockActionContext.java b/core/src/main/java/net/momirealms/craftengine/core/util/context/PlayerBlockActionContext.java new file mode 100644 index 000000000..5adea9974 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/context/PlayerBlockActionContext.java @@ -0,0 +1,21 @@ +package net.momirealms.craftengine.core.util.context; + +import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.util.context.parameter.BlockParameterProvider; +import net.momirealms.craftengine.core.util.context.parameter.CommonParameterProvider; +import net.momirealms.craftengine.core.util.context.parameter.PlayerParameterProvider; +import net.momirealms.craftengine.core.world.BlockInWorld; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +public class PlayerBlockActionContext extends PlayerOptionalContext { + + public PlayerBlockActionContext(@NotNull Player player, @NotNull BlockInWorld block, @NotNull ContextHolder contexts) { + super(player, contexts, List.of(new CommonParameterProvider(), new PlayerParameterProvider(player), new BlockParameterProvider(block))); + } + + public static PlayerBlockActionContext of(@NotNull Player player, @NotNull BlockInWorld block, @NotNull ContextHolder contexts) { + return new PlayerBlockActionContext(player, block, contexts); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/context/PlayerOptionalContext.java b/core/src/main/java/net/momirealms/craftengine/core/util/context/PlayerOptionalContext.java index 87b33d632..fec8f3c0c 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/util/context/PlayerOptionalContext.java +++ b/core/src/main/java/net/momirealms/craftengine/core/util/context/PlayerOptionalContext.java @@ -8,7 +8,7 @@ import net.momirealms.craftengine.core.util.context.parameter.PlayerParameterPro import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.*; +import java.util.List; public class PlayerOptionalContext extends AbstractAdditionalCommonContext implements MiniMessageTagContext { public static final PlayerOptionalContext EMPTY = new PlayerOptionalContext(null, ContextHolder.EMPTY); diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/context/parameter/BlockParameterProvider.java b/core/src/main/java/net/momirealms/craftengine/core/util/context/parameter/BlockParameterProvider.java index 7f9f91872..8d28fd0fa 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/util/context/parameter/BlockParameterProvider.java +++ b/core/src/main/java/net/momirealms/craftengine/core/util/context/parameter/BlockParameterProvider.java @@ -22,6 +22,7 @@ public class BlockParameterProvider implements LazyContextParameterProvider { CONTEXT_FUNCTIONS.put(BlockParameters.BLOCK_Z, BlockInWorld::z); CONTEXT_FUNCTIONS.put(BlockParameters.BLOCK_OWNER, BlockInWorld::owner); CONTEXT_FUNCTIONS.put(BlockParameters.BLOCK_STATE, BlockInWorld::getAsString); + CONTEXT_FUNCTIONS.put(BlockParameters.WORLD_NAME, b -> b.world().name()); } private final BlockInWorld block; diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/context/parameter/BlockParameters.java b/core/src/main/java/net/momirealms/craftengine/core/util/context/parameter/BlockParameters.java index b724ef86d..2e0edaeb0 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/util/context/parameter/BlockParameters.java +++ b/core/src/main/java/net/momirealms/craftengine/core/util/context/parameter/BlockParameters.java @@ -4,17 +4,16 @@ import net.momirealms.craftengine.core.block.ImmutableBlockState; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.context.ContextKey; -import java.util.UUID; - public final class BlockParameters { private BlockParameters() {} - public static final ContextKey X = new ContextKey<>(Key.of("craftengine:block.x")); - public static final ContextKey Y = new ContextKey<>(Key.of("craftengine:block.y")); - public static final ContextKey Z = new ContextKey<>(Key.of("craftengine:block.z")); - public static final ContextKey BLOCK_X = new ContextKey<>(Key.of("craftengine:block.block_x")); - public static final ContextKey BLOCK_Y = new ContextKey<>(Key.of("craftengine:block.block_y")); - public static final ContextKey BLOCK_Z = new ContextKey<>(Key.of("craftengine:block.block_z")); - public static final ContextKey BLOCK_STATE = new ContextKey<>(Key.of("craftengine:block.state")); - public static final ContextKey BLOCK_OWNER = new ContextKey<>(Key.of("craftengine:block.owner")); + public static final ContextKey X = ContextKey.of("block.x"); + public static final ContextKey Y = ContextKey.of("block.y"); + public static final ContextKey Z = ContextKey.of("block.z"); + public static final ContextKey BLOCK_X = ContextKey.of("block.block_x"); + public static final ContextKey BLOCK_Y = ContextKey.of("block.block_y"); + public static final ContextKey BLOCK_Z = ContextKey.of("block.block_z"); + public static final ContextKey BLOCK_STATE = ContextKey.of("block.state"); + public static final ContextKey BLOCK_OWNER = ContextKey.of("block.owner.id"); + public static final ContextKey WORLD_NAME = ContextKey.of("block.world.name"); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/context/parameter/CommonParameterProvider.java b/core/src/main/java/net/momirealms/craftengine/core/util/context/parameter/CommonParameterProvider.java index 64515a5d4..396bbdfdd 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/util/context/parameter/CommonParameterProvider.java +++ b/core/src/main/java/net/momirealms/craftengine/core/util/context/parameter/CommonParameterProvider.java @@ -14,7 +14,10 @@ public class CommonParameterProvider implements LazyContextParameterProvider { private static final Map, Function> CONTEXT_FUNCTIONS = new HashMap<>(); static { - CONTEXT_FUNCTIONS.put(CommonParameters.RANDOM, (f) -> RandomUtils.generateRandomDouble(0,1)); + CONTEXT_FUNCTIONS.put(CommonParameters.RANDOM, (f) -> { + f.lastRandom = RandomUtils.generateRandomDouble(0,1); + return f.lastRandom; + }); CONTEXT_FUNCTIONS.put(CommonParameters.LAST_RANDOM, (f) -> { if (f.lastRandom == -1) { f.lastRandom = RandomUtils.generateRandomDouble(0, 1); diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/context/parameter/PlayerParameterProvider.java b/core/src/main/java/net/momirealms/craftengine/core/util/context/parameter/PlayerParameterProvider.java index 18e7cb668..ca2040f86 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/util/context/parameter/PlayerParameterProvider.java +++ b/core/src/main/java/net/momirealms/craftengine/core/util/context/parameter/PlayerParameterProvider.java @@ -24,6 +24,7 @@ public class PlayerParameterProvider implements LazyContextParameterProvider { CONTEXT_FUNCTIONS.put(PlayerParameters.BLOCK_Z, p -> MCUtils.fastFloor(p.z())); CONTEXT_FUNCTIONS.put(PlayerParameters.NAME, Player::name); CONTEXT_FUNCTIONS.put(PlayerParameters.UUID, Player::uuid); + CONTEXT_FUNCTIONS.put(PlayerParameters.WORLD_NAME, p -> p.world().name()); } private final Player player; diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/context/parameter/PlayerParameters.java b/core/src/main/java/net/momirealms/craftengine/core/util/context/parameter/PlayerParameters.java index 9ead3e94a..0604f864d 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/util/context/parameter/PlayerParameters.java +++ b/core/src/main/java/net/momirealms/craftengine/core/util/context/parameter/PlayerParameters.java @@ -1,6 +1,5 @@ package net.momirealms.craftengine.core.util.context.parameter; -import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.context.ContextKey; import java.util.UUID; @@ -8,12 +7,13 @@ import java.util.UUID; public final class PlayerParameters { private PlayerParameters() {} - public static final ContextKey X = new ContextKey<>(Key.of("craftengine:player.x")); - public static final ContextKey Y = new ContextKey<>(Key.of("craftengine:player.y")); - public static final ContextKey Z = new ContextKey<>(Key.of("craftengine:player.z")); - public static final ContextKey BLOCK_X = new ContextKey<>(Key.of("craftengine:player.block_x")); - public static final ContextKey BLOCK_Y = new ContextKey<>(Key.of("craftengine:player.block_y")); - public static final ContextKey BLOCK_Z = new ContextKey<>(Key.of("craftengine:player.block_z")); - public static final ContextKey NAME = new ContextKey<>(Key.of("craftengine:player.name")); - public static final ContextKey UUID = new ContextKey<>(Key.of("craftengine:player.uuid")); + public static final ContextKey X = ContextKey.of("player.x"); + public static final ContextKey Y = ContextKey.of("player.y"); + public static final ContextKey Z = ContextKey.of("player.z"); + public static final ContextKey BLOCK_X = ContextKey.of("player.block_x"); + public static final ContextKey BLOCK_Y = ContextKey.of("player.block_y"); + public static final ContextKey BLOCK_Z = ContextKey.of("player.block_z"); + public static final ContextKey NAME = ContextKey.of("player.name"); + public static final ContextKey WORLD_NAME = ContextKey.of("player.world.name"); + public static final ContextKey UUID = ContextKey.of("player.uuid"); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/BlockInWorld.java b/core/src/main/java/net/momirealms/craftengine/core/world/BlockInWorld.java index 2b38da29f..461ef2699 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/world/BlockInWorld.java +++ b/core/src/main/java/net/momirealms/craftengine/core/world/BlockInWorld.java @@ -17,6 +17,8 @@ public interface BlockInWorld { String getAsString(); + World world(); + int x(); int y(); diff --git a/gradle.properties b/gradle.properties index d511d872d..d7e66055a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -39,7 +39,7 @@ lz4_version=1.8.0 geantyref_version=1.3.16 zstd_version=1.5.7-2 commons_io_version=2.18.0 -sparrow_nbt_version=0.6.2 +sparrow_nbt_version=0.7.1 sparrow_util_version=0.39 fastutil_version=8.5.15 netty_version=4.1.119.Final From 8e210bb5df1987d5eb1ad405b86bd4004feff1e6 Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Sat, 3 May 2025 19:39:33 +0800 Subject: [PATCH 21/51] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dcomponent=E5=8F=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bukkit/plugin/command/BukkitSenderFactory.java | 6 +++++- gradle.properties | 4 ++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/BukkitSenderFactory.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/BukkitSenderFactory.java index df890ee5d..a9a2ba020 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/BukkitSenderFactory.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/BukkitSenderFactory.java @@ -3,7 +3,9 @@ package net.momirealms.craftengine.bukkit.plugin.command; import net.kyori.adventure.audience.Audience; import net.kyori.adventure.platform.bukkit.BukkitAudiences; import net.kyori.adventure.text.Component; +import net.momirealms.craftengine.bukkit.nms.FastNMS; import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; +import net.momirealms.craftengine.bukkit.util.ComponentUtils; import net.momirealms.craftengine.core.plugin.command.sender.Sender; import net.momirealms.craftengine.core.plugin.command.sender.SenderFactory; import net.momirealms.craftengine.core.util.Tristate; @@ -47,7 +49,9 @@ public class BukkitSenderFactory extends SenderFactory audience(sender).sendMessage(message)); diff --git a/gradle.properties b/gradle.properties index d7e66055a..4783415e2 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,7 +2,7 @@ org.gradle.jvmargs=-Xmx1G # Project settings # Rule: [major update].[feature update].[bug fix] -project_version=0.0.53-beta.2 +project_version=0.0.53-beta.3 config_version=31 lang_version=10 project_group=net.momirealms @@ -50,7 +50,7 @@ byte_buddy_version=1.17.5 ahocorasick_version=0.6.3 snake_yaml_version=2.4 anti_grief_version=0.15 -nms_helper_version=0.64.4 +nms_helper_version=0.64.5 reactive_streams_version=1.0.4 amazon_awssdk_version=2.31.23 amazon_awssdk_eventstream_version=1.0.1 From 261e5dcd5216f3f2103657ee68cc76cfc953b364 Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Sat, 3 May 2025 21:11:11 +0800 Subject: [PATCH 22/51] =?UTF-8?q?=E9=87=8D=E6=9E=84=E6=9D=A1=E4=BB=B6?= =?UTF-8?q?=E7=B3=BB=E7=BB=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../LegacySlimeWorldDataStorage.java | 13 ----- .../bukkit/api/CraftEngineBlocks.java | 10 ++-- .../bukkit/api/CraftEngineFurniture.java | 12 ++--- .../bukkit/block/BlockEventListener.java | 34 ++++++------ .../bukkit/block/BukkitBlockManager.java | 6 +-- .../block/FallingBlockRemoveListener.java | 10 ++-- .../block/behavior/BushBlockBehavior.java | 8 +-- .../block/behavior/CropBlockBehavior.java | 12 ++--- .../block/behavior/FallingBlockBehavior.java | 10 ++-- .../block/behavior/LeavesBlockBehavior.java | 8 +-- .../behavior/SugarCaneBlockBehavior.java | 8 +-- .../bukkit/item/BukkitItemManager.java | 2 +- .../item/recipe/RecipeEventListener.java | 2 +- .../bukkit/loot/BukkitVanillaLootManager.java | 13 ++--- .../plugin/user/BukkitServerPlayer.java | 4 +- .../core/block/ImmutableBlockState.java | 6 +-- .../core/block/behavior/BlockBehaviors.java | 2 +- .../core/block/properties/Properties.java | 2 +- .../core/font/AbstractFontManager.java | 4 +- .../core/font/EmojiParameters.java | 2 +- .../craftengine/core/item/BuildableItem.java | 2 +- .../craftengine/core/item/CustomItem.java | 2 +- .../core/item/ItemBuildContext.java | 4 +- .../core/item/behavior/ItemBehaviors.java | 4 +- .../recipe/CustomSmithingTransformRecipe.java | 2 +- .../craftengine/core/loot/LootContext.java | 4 +- .../craftengine/core/loot/LootPool.java | 10 ++-- .../craftengine/core/loot/LootTable.java | 10 ++-- .../core/loot/condition/LootCondition.java | 11 ---- .../loot/condition/LootConditionAllOf.java | 41 -------------- .../loot/condition/LootConditionAnyOf.java | 40 -------------- .../loot/condition/LootConditionFactory.java | 8 --- .../loot/condition/LootConditionFalling.java | 29 ---------- .../loot/condition/LootConditionInverted.java | 34 ------------ .../loot/condition/LootConditionRandom.java | 35 ------------ .../LootConditionSurvivesExplosion.java | 35 ------------ .../core/loot/condition/LootConditions.java | 54 ++++++++----------- .../AbstractCompositeLootEntryContainer.java | 4 +- .../entry/AbstractLootEntryContainer.java | 6 +-- .../AbstractSingleLootEntryContainer.java | 4 +- .../entry/AlternativesLootEntryContainer.java | 7 +-- .../loot/entry/ExpLootEntryContainer.java | 16 +++--- .../core/loot/entry/LootEntryContainers.java | 2 +- .../entry/SingleItemLootEntryContainer.java | 10 ++-- .../AbstractLootConditionalFunction.java | 6 +-- .../function/LootFunctionApplyBonusCount.java | 12 ++--- .../loot/function/LootFunctionDropExp.java | 16 +++--- .../function/LootFunctionExplosionDecay.java | 10 ++-- .../loot/function/LootFunctionSetCount.java | 10 ++-- .../core/loot/function/LootFunctions.java | 2 +- .../core/pack/conflict/PathContext.java | 4 +- .../pack/conflict/matcher/PathMatcher.java | 2 +- .../conflict/matcher/PathMatcherAllOf.java | 4 +- .../conflict/matcher/PathMatcherAnyOf.java | 4 +- .../conflict/matcher/PathMatcherInverted.java | 2 +- .../pack/conflict/matcher/PathMatchers.java | 2 +- .../pack/conflict/resolution/Resolutions.java | 2 +- .../core/pack/host/ResourcePackHosts.java | 2 +- .../craftengine/core/plugin/CraftEngine.java | 1 - .../config/template/TemplateArguments.java | 2 +- .../AbstractAdditionalCommonContext.java | 4 +- .../context/AbstractCommonContext.java | 11 ++-- .../{util => plugin}/context/Condition.java | 4 +- .../{util => plugin}/context/Context.java | 6 ++- .../context/ContextHolder.java | 2 +- .../{util => plugin}/context/ContextKey.java | 2 +- .../context/LazyContextParameterProvider.java | 2 +- .../context/PlayerBlockActionContext.java | 8 +-- .../context/PlayerOptionalContext.java | 8 +-- .../context/condition/AllOfCondition.java | 53 ++++++++++++++++++ .../context/condition/AnyOfCondition.java | 53 ++++++++++++++++++ .../context/condition/EmptyCondition.java | 29 ++++++++++ .../condition/EnchantmentCondition.java} | 28 +++++----- .../condition/FallingBlockCondition.java | 30 +++++++++++ .../context/condition/InvertedCondition.java | 42 +++++++++++++++ .../MatchBlockPropertyCondition.java} | 25 ++++----- .../condition/MatchItemCondition.java} | 26 ++++----- .../context/condition/RandomCondition.java | 37 +++++++++++++ .../context/condition/SharedConditions.java | 19 +++++++ .../condition/SurvivesExplosionCondition.java | 37 +++++++++++++ .../condition/TableBonusCondition.java} | 31 ++++++----- .../context}/number/FixedNumberProvider.java | 2 +- .../context}/number/NumberProvider.java | 2 +- .../number/NumberProviderFactory.java | 2 +- .../context}/number/NumberProviders.java | 4 +- .../number/UniformNumberProvider.java | 2 +- .../parameter/BlockParameterProvider.java | 6 +-- .../context/parameter/BlockParameters.java | 4 +- .../parameter/CommonParameterProvider.java | 6 +-- .../context/parameter/CommonParameters.java} | 11 ++-- .../parameter/PlayerParameterProvider.java | 6 +-- .../context/parameter/PlayerParameters.java | 4 +- .../core/plugin/gui/GuiParameters.java | 2 +- .../gui/category/ItemBrowserManagerImpl.java | 4 +- .../locale/MiniMessageTranslatorImpl.java | 2 +- .../plugin/locale/TranslationManagerImpl.java | 2 +- .../core/plugin/text/minimessage/I18NTag.java | 8 +-- .../minimessage/MiniMessageTagContext.java | 9 ---- .../text/minimessage/NamedArgumentTag.java | 12 ++--- .../core/registry/BuiltInRegistries.java | 8 +-- .../craftengine/core/registry/Registries.java | 8 +-- .../craftengine/core/util/Factory.java | 8 +++ .../momirealms/craftengine/core/util/Key.java | 1 - .../core/util/condition/AllOfCondition.java | 29 ---------- .../core/util/condition/AnyOfCondition.java | 29 ---------- .../core/util/condition/CommonConditions.java | 11 ---- .../util/condition/InvertedCondition.java | 22 -------- .../context/parameter/CommonParameters.java | 10 ---- .../core/util/os/Architecture.java | 49 ----------------- .../craftengine/core/util/os/Platform.java | 45 ---------------- 110 files changed, 630 insertions(+), 758 deletions(-) delete mode 100644 core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootCondition.java delete mode 100644 core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditionAllOf.java delete mode 100644 core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditionAnyOf.java delete mode 100644 core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditionFactory.java delete mode 100644 core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditionFalling.java delete mode 100644 core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditionInverted.java delete mode 100644 core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditionRandom.java delete mode 100644 core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditionSurvivesExplosion.java rename core/src/main/java/net/momirealms/craftengine/core/{util => plugin}/context/AbstractAdditionalCommonContext.java (90%) rename core/src/main/java/net/momirealms/craftengine/core/{util => plugin}/context/AbstractCommonContext.java (71%) rename core/src/main/java/net/momirealms/craftengine/core/{util => plugin}/context/Condition.java (59%) rename core/src/main/java/net/momirealms/craftengine/core/{util => plugin}/context/Context.java (63%) rename core/src/main/java/net/momirealms/craftengine/core/{util => plugin}/context/ContextHolder.java (98%) rename core/src/main/java/net/momirealms/craftengine/core/{util => plugin}/context/ContextKey.java (93%) rename core/src/main/java/net/momirealms/craftengine/core/{util => plugin}/context/LazyContextParameterProvider.java (91%) rename core/src/main/java/net/momirealms/craftengine/core/{util => plugin}/context/PlayerBlockActionContext.java (69%) rename core/src/main/java/net/momirealms/craftengine/core/{util => plugin}/context/PlayerOptionalContext.java (85%) create mode 100644 core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/AllOfCondition.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/AnyOfCondition.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/EmptyCondition.java rename core/src/main/java/net/momirealms/craftengine/core/{loot/condition/LootConditionEnchantment.java => plugin/context/condition/EnchantmentCondition.java} (62%) create mode 100644 core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/FallingBlockCondition.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/InvertedCondition.java rename core/src/main/java/net/momirealms/craftengine/core/{loot/condition/LootConditionMatchBlockProperty.java => plugin/context/condition/MatchBlockPropertyCondition.java} (63%) rename core/src/main/java/net/momirealms/craftengine/core/{loot/condition/LootConditionMatchItem.java => plugin/context/condition/MatchItemCondition.java} (53%) create mode 100644 core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/RandomCondition.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/SharedConditions.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/SurvivesExplosionCondition.java rename core/src/main/java/net/momirealms/craftengine/core/{loot/condition/LootConditionTableBonus.java => plugin/context/condition/TableBonusCondition.java} (61%) rename core/src/main/java/net/momirealms/craftengine/core/{loot => plugin/context}/number/FixedNumberProvider.java (93%) rename core/src/main/java/net/momirealms/craftengine/core/{loot => plugin/context}/number/NumberProvider.java (82%) rename core/src/main/java/net/momirealms/craftengine/core/{loot => plugin/context}/number/NumberProviderFactory.java (66%) rename core/src/main/java/net/momirealms/craftengine/core/{loot => plugin/context}/number/NumberProviders.java (95%) rename core/src/main/java/net/momirealms/craftengine/core/{loot => plugin/context}/number/UniformNumberProvider.java (95%) rename core/src/main/java/net/momirealms/craftengine/core/{util => plugin}/context/parameter/BlockParameterProvider.java (87%) rename core/src/main/java/net/momirealms/craftengine/core/{util => plugin}/context/parameter/BlockParameters.java (87%) rename core/src/main/java/net/momirealms/craftengine/core/{util => plugin}/context/parameter/CommonParameterProvider.java (83%) rename core/src/main/java/net/momirealms/craftengine/core/{loot/parameter/LootParameters.java => plugin/context/parameter/CommonParameters.java} (73%) rename core/src/main/java/net/momirealms/craftengine/core/{util => plugin}/context/parameter/PlayerParameterProvider.java (88%) rename core/src/main/java/net/momirealms/craftengine/core/{util => plugin}/context/parameter/PlayerParameters.java (86%) delete mode 100644 core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/MiniMessageTagContext.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/util/Factory.java delete mode 100644 core/src/main/java/net/momirealms/craftengine/core/util/condition/AllOfCondition.java delete mode 100644 core/src/main/java/net/momirealms/craftengine/core/util/condition/AnyOfCondition.java delete mode 100644 core/src/main/java/net/momirealms/craftengine/core/util/condition/CommonConditions.java delete mode 100644 core/src/main/java/net/momirealms/craftengine/core/util/condition/InvertedCondition.java delete mode 100644 core/src/main/java/net/momirealms/craftengine/core/util/context/parameter/CommonParameters.java delete mode 100644 core/src/main/java/net/momirealms/craftengine/core/util/os/Architecture.java delete mode 100644 core/src/main/java/net/momirealms/craftengine/core/util/os/Platform.java diff --git a/bukkit/compatibility/legacy/src/main/java/net/momirealms/craftengine/bukkit/compatibility/legacy/slimeworld/LegacySlimeWorldDataStorage.java b/bukkit/compatibility/legacy/src/main/java/net/momirealms/craftengine/bukkit/compatibility/legacy/slimeworld/LegacySlimeWorldDataStorage.java index b4550330f..74acc1e05 100644 --- a/bukkit/compatibility/legacy/src/main/java/net/momirealms/craftengine/bukkit/compatibility/legacy/slimeworld/LegacySlimeWorldDataStorage.java +++ b/bukkit/compatibility/legacy/src/main/java/net/momirealms/craftengine/bukkit/compatibility/legacy/slimeworld/LegacySlimeWorldDataStorage.java @@ -1,7 +1,6 @@ package net.momirealms.craftengine.bukkit.compatibility.legacy.slimeworld; import com.flowpowered.nbt.ByteArrayTag; -import com.flowpowered.nbt.CompoundMap; import com.infernalsuite.aswm.api.world.SlimeChunk; import com.infernalsuite.aswm.api.world.SlimeWorld; import net.momirealms.craftengine.core.world.CEWorld; @@ -42,18 +41,6 @@ public class LegacySlimeWorldDataStorage implements WorldDataStorage { } } - private CompoundMap createOrGetDataMap(SlimeWorld world) { - Optional optionalCompoundTag = world.getExtraData().getAsCompoundTag("craftengine"); - CompoundMap ccDataMap; - if (optionalCompoundTag.isEmpty()) { - ccDataMap = new CompoundMap(); - world.getExtraData().getValue().put(new com.flowpowered.nbt.CompoundTag("customcrops", ccDataMap)); - } else { - ccDataMap = optionalCompoundTag.get().getValue(); - } - return ccDataMap; - } - @Override public void writeChunkAt(@NotNull ChunkPos pos, @NotNull CEChunk chunk, boolean immediately) { SlimeChunk slimeChunk = getWorld().getChunk(pos.x, pos.z); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/CraftEngineBlocks.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/CraftEngineBlocks.java index 7b8467ea5..49a12d9ca 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/CraftEngineBlocks.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/CraftEngineBlocks.java @@ -12,9 +12,9 @@ import net.momirealms.craftengine.core.block.ImmutableBlockState; import net.momirealms.craftengine.core.block.UpdateOption; import net.momirealms.craftengine.core.entity.player.InteractionHand; import net.momirealms.craftengine.core.item.Item; -import net.momirealms.craftengine.core.loot.parameter.LootParameters; +import net.momirealms.craftengine.core.plugin.context.ContextHolder; +import net.momirealms.craftengine.core.plugin.context.parameter.CommonParameters; import net.momirealms.craftengine.core.util.Key; -import net.momirealms.craftengine.core.util.context.ContextHolder; import net.momirealms.craftengine.core.world.Vec3d; import net.momirealms.craftengine.core.world.World; import net.momirealms.craftengine.core.world.WorldEvents; @@ -172,11 +172,11 @@ public final class CraftEngineBlocks { Location location = block.getLocation(); Vec3d vec3d = new Vec3d(location.getBlockX() + 0.5, location.getBlockY() + 0.5, location.getBlockZ() + 0.5); if (dropLoot) { - ContextHolder.Builder builder = new ContextHolder.Builder().withParameter(LootParameters.WORLD, world).withParameter(LootParameters.LOCATION, vec3d); + ContextHolder.Builder builder = new ContextHolder.Builder().withParameter(CommonParameters.WORLD, world).withParameter(CommonParameters.LOCATION, vec3d); BukkitServerPlayer serverPlayer = BukkitCraftEngine.instance().adapt(player); if (player != null) { - builder.withParameter(LootParameters.PLAYER, serverPlayer); - builder.withOptionalParameter(LootParameters.TOOL, serverPlayer.getItemInHand(InteractionHand.MAIN_HAND)); + builder.withParameter(CommonParameters.PLAYER, serverPlayer); + builder.withOptionalParameter(CommonParameters.TOOL, serverPlayer.getItemInHand(InteractionHand.MAIN_HAND)); } for (Item item : state.getDrops(builder, world)) { world.dropItemNaturally(vec3d, item); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/CraftEngineFurniture.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/CraftEngineFurniture.java index 4abf9bbab..96b537084 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/CraftEngineFurniture.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/CraftEngineFurniture.java @@ -12,9 +12,9 @@ import net.momirealms.craftengine.core.entity.furniture.CustomFurniture; import net.momirealms.craftengine.core.entity.player.InteractionHand; import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.loot.LootTable; -import net.momirealms.craftengine.core.loot.parameter.LootParameters; +import net.momirealms.craftengine.core.plugin.context.ContextHolder; +import net.momirealms.craftengine.core.plugin.context.parameter.CommonParameters; import net.momirealms.craftengine.core.util.Key; -import net.momirealms.craftengine.core.util.context.ContextHolder; import net.momirealms.craftengine.core.world.Vec3d; import net.momirealms.craftengine.core.world.World; import org.bukkit.Location; @@ -271,11 +271,11 @@ public final class CraftEngineFurniture { World world = new BukkitWorld(location.getWorld()); if (dropLoot && lootTable != null) { ContextHolder.Builder builder = ContextHolder.builder(); - builder.withParameter(LootParameters.LOCATION, vec3d); - builder.withParameter(LootParameters.WORLD, world); + builder.withParameter(CommonParameters.LOCATION, vec3d); + builder.withParameter(CommonParameters.WORLD, world); if (player != null) { - builder.withParameter(LootParameters.PLAYER, player); - builder.withOptionalParameter(LootParameters.TOOL, player.getItemInHand(InteractionHand.MAIN_HAND)); + builder.withParameter(CommonParameters.PLAYER, player); + builder.withOptionalParameter(CommonParameters.TOOL, player.getItemInHand(InteractionHand.MAIN_HAND)); } List> items = lootTable.getRandomItems(builder.build(), world); for (Item item : items) { diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BlockEventListener.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BlockEventListener.java index 6b4dcd633..1209ed4b5 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BlockEventListener.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BlockEventListener.java @@ -12,10 +12,10 @@ import net.momirealms.craftengine.core.block.properties.Property; import net.momirealms.craftengine.core.entity.player.InteractionHand; import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.loot.LootTable; -import net.momirealms.craftengine.core.loot.parameter.LootParameters; import net.momirealms.craftengine.core.plugin.config.Config; +import net.momirealms.craftengine.core.plugin.context.ContextHolder; +import net.momirealms.craftengine.core.plugin.context.parameter.CommonParameters; import net.momirealms.craftengine.core.util.VersionHelper; -import net.momirealms.craftengine.core.util.context.ContextHolder; import net.momirealms.craftengine.core.world.BlockPos; import net.momirealms.craftengine.core.world.Vec3d; import org.bukkit.*; @@ -151,10 +151,10 @@ public class BlockEventListener implements Listener { // drop items ContextHolder.Builder builder = ContextHolder.builder(); - builder.withParameter(LootParameters.WORLD, world); - builder.withParameter(LootParameters.LOCATION, vec3d); - builder.withParameter(LootParameters.PLAYER, serverPlayer); - builder.withOptionalParameter(LootParameters.TOOL, itemInHand); + builder.withParameter(CommonParameters.WORLD, world); + builder.withParameter(CommonParameters.LOCATION, vec3d); + builder.withParameter(CommonParameters.PLAYER, serverPlayer); + builder.withOptionalParameter(CommonParameters.TOOL, itemInHand); for (Item item : state.getDrops(builder, world)) { world.dropItemNaturally(vec3d, item); } @@ -172,10 +172,10 @@ public class BlockEventListener implements Listener { net.momirealms.craftengine.core.world.World world = new BukkitWorld(player.getWorld()); Vec3d vec3d = new Vec3d(location.getBlockX() + 0.5, location.getBlockY() + 0.5, location.getBlockZ() + 0.5); ContextHolder.Builder builder = ContextHolder.builder(); - builder.withParameter(LootParameters.WORLD, world); - builder.withParameter(LootParameters.LOCATION, vec3d); - builder.withParameter(LootParameters.PLAYER, serverPlayer); - builder.withOptionalParameter(LootParameters.TOOL, serverPlayer.getItemInHand(InteractionHand.MAIN_HAND)); + builder.withParameter(CommonParameters.WORLD, world); + builder.withParameter(CommonParameters.LOCATION, vec3d); + builder.withParameter(CommonParameters.PLAYER, serverPlayer); + builder.withOptionalParameter(CommonParameters.TOOL, serverPlayer.getItemInHand(InteractionHand.MAIN_HAND)); ContextHolder contextHolder = builder.build(); for (LootTable lootTable : it.lootTables()) { for (Item item : lootTable.getRandomItems(contextHolder, world)) { @@ -214,8 +214,8 @@ public class BlockEventListener implements Listener { net.momirealms.craftengine.core.world.World world = new BukkitWorld(block.getWorld()); Vec3d vec3d = new Vec3d(location.getBlockX() + 0.5, location.getBlockY() + 0.5, location.getBlockZ() + 0.5); ContextHolder.Builder builder = ContextHolder.builder(); - builder.withParameter(LootParameters.WORLD, world); - builder.withParameter(LootParameters.LOCATION, vec3d); + builder.withParameter(CommonParameters.WORLD, world); + builder.withParameter(CommonParameters.LOCATION, vec3d); for (Item item : immutableBlockState.getDrops(builder, world)) { world.dropItemNaturally(vec3d, item); } @@ -232,8 +232,8 @@ public class BlockEventListener implements Listener { Vec3d vec3d = new Vec3d(location.getBlockX() + 0.5, location.getBlockY() + 0.5, location.getBlockZ() + 0.5); net.momirealms.craftengine.core.world.World world = new BukkitWorld(location.getWorld()); ContextHolder.Builder builder = ContextHolder.builder(); - builder.withParameter(LootParameters.WORLD, world); - builder.withParameter(LootParameters.LOCATION, vec3d); + builder.withParameter(CommonParameters.WORLD, world); + builder.withParameter(CommonParameters.LOCATION, vec3d); ContextHolder contextHolder = builder.build(); for (LootTable lootTable : it.lootTables()) { for (Item item : lootTable.getRandomItems(contextHolder, world)) { @@ -329,10 +329,10 @@ public class BlockEventListener implements Listener { if (state != null && !state.isEmpty()) { ContextHolder.Builder builder = ContextHolder.builder(); Vec3d vec3d = Vec3d.atCenterOf(blockPos); - builder.withParameter(LootParameters.LOCATION, vec3d); - builder.withParameter(LootParameters.WORLD, world); + builder.withParameter(CommonParameters.LOCATION, vec3d); + builder.withParameter(CommonParameters.WORLD, world); if (yield < 1f) { - builder.withParameter(LootParameters.EXPLOSION_RADIUS, 1.0f / yield); + builder.withParameter(CommonParameters.EXPLOSION_RADIUS, 1.0f / yield); } for (Item item : state.getDrops(builder, world)) { world.dropItemNaturally(vec3d, item); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BukkitBlockManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BukkitBlockManager.java index 74e9e5019..6142cbed6 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BukkitBlockManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BukkitBlockManager.java @@ -359,7 +359,7 @@ public class BukkitBlockManager extends AbstractBlockManager { appearances = Map.of("default", pair.right()); String internalBlock = pair.left().value() + "_" + internalId; - Key internalBlockId = Key.of(CraftEngine.NAMESPACE, internalBlock); + Key internalBlockId = Key.of(Key.DEFAULT_NAMESPACE, internalBlock); int internalBlockRegistryId = Optional.ofNullable(internalId2StateId.get(internalBlockId)).orElse(-1); if (internalBlockRegistryId == -1) { throw new LocalizedResourceConfigException("warning.config.block.state.invalid_real_id", @@ -408,7 +408,7 @@ public class BukkitBlockManager extends AbstractBlockManager { } int internalId = ResourceConfigUtils.getAsInt(variantSection.getOrDefault("id", -1), "id"); Key baseBlock = tempTypeMap.get(appearance); - Key internalBlockId = Key.of(CraftEngine.NAMESPACE, baseBlock.value() + "_" + internalId); + Key internalBlockId = Key.of(Key.DEFAULT_NAMESPACE, baseBlock.value() + "_" + internalId); int internalBlockRegistryId = Optional.ofNullable(internalId2StateId.get(internalBlockId)).orElse(-1); if (internalBlockRegistryId == -1) { throw new LocalizedResourceConfigException("warning.config.block.state.invalid_real_id", @@ -782,7 +782,7 @@ public class BukkitBlockManager extends AbstractBlockManager { } private Key createRealBlockKey(Key replacedBlock, int index) { - return Key.of(CraftEngine.NAMESPACE, replacedBlock.value() + "_" + index); + return Key.of(Key.DEFAULT_NAMESPACE, replacedBlock.value() + "_" + index); } private Object createBlockProperties(Key realBlockKey) throws Exception { diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/FallingBlockRemoveListener.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/FallingBlockRemoveListener.java index f40a43172..1023e23c6 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/FallingBlockRemoveListener.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/FallingBlockRemoveListener.java @@ -5,9 +5,9 @@ import net.momirealms.craftengine.bukkit.util.Reflections; import net.momirealms.craftengine.bukkit.world.BukkitWorld; import net.momirealms.craftengine.core.block.ImmutableBlockState; import net.momirealms.craftengine.core.item.Item; -import net.momirealms.craftengine.core.loot.parameter.LootParameters; import net.momirealms.craftengine.core.plugin.CraftEngine; -import net.momirealms.craftengine.core.util.context.ContextHolder; +import net.momirealms.craftengine.core.plugin.context.ContextHolder; +import net.momirealms.craftengine.core.plugin.context.parameter.CommonParameters; import net.momirealms.craftengine.core.world.Vec3d; import org.bukkit.entity.FallingBlock; import org.bukkit.event.EventHandler; @@ -32,14 +32,14 @@ public class FallingBlockRemoveListener implements Listener { ImmutableBlockState immutableBlockState = BukkitBlockManager.instance().getImmutableBlockState(stateId); if (immutableBlockState == null || immutableBlockState.isEmpty()) return; ContextHolder.Builder builder = ContextHolder.builder(); - builder.withParameter(LootParameters.FALLING_BLOCK, true); + builder.withParameter(CommonParameters.FALLING_BLOCK, true); double x = Reflections.field$Entity$xo.getDouble(fallingBlockEntity); double y = Reflections.field$Entity$yo.getDouble(fallingBlockEntity); double z = Reflections.field$Entity$zo.getDouble(fallingBlockEntity); Vec3d vec3d = new Vec3d(x, y, z); net.momirealms.craftengine.core.world.World world = new BukkitWorld(fallingBlock.getWorld()); - builder.withParameter(LootParameters.LOCATION, vec3d); - builder.withParameter(LootParameters.WORLD, world); + builder.withParameter(CommonParameters.LOCATION, vec3d); + builder.withParameter(CommonParameters.WORLD, world); for (Item item : immutableBlockState.getDrops(builder, world)) { world.dropItemNaturally(vec3d, item); } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BushBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BushBlockBehavior.java index b19b7bdbf..beb24c5d2 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BushBlockBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BushBlockBehavior.java @@ -11,12 +11,12 @@ import net.momirealms.craftengine.core.block.CustomBlock; import net.momirealms.craftengine.core.block.ImmutableBlockState; import net.momirealms.craftengine.core.block.behavior.BlockBehaviorFactory; import net.momirealms.craftengine.core.item.Item; -import net.momirealms.craftengine.core.loot.parameter.LootParameters; +import net.momirealms.craftengine.core.plugin.context.ContextHolder; +import net.momirealms.craftengine.core.plugin.context.parameter.CommonParameters; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.MiscUtils; import net.momirealms.craftengine.core.util.Tuple; import net.momirealms.craftengine.core.util.VersionHelper; -import net.momirealms.craftengine.core.util.context.ContextHolder; import net.momirealms.craftengine.core.world.BlockPos; import net.momirealms.craftengine.core.world.Vec3d; import net.momirealms.craftengine.core.world.WorldEvents; @@ -71,8 +71,8 @@ public class BushBlockBehavior extends BukkitBlockBehavior { BlockPos pos = LocationUtils.fromBlockPos(blockPos); Vec3d vec3d = Vec3d.atCenterOf(pos); net.momirealms.craftengine.core.world.World world = new BukkitWorld(FastNMS.INSTANCE.method$Level$getCraftWorld(level)); - builder.withParameter(LootParameters.LOCATION, vec3d); - builder.withParameter(LootParameters.WORLD, world); + builder.withParameter(CommonParameters.LOCATION, vec3d); + builder.withParameter(CommonParameters.WORLD, world); for (Item item : previousState.getDrops(builder, world)) { world.dropItemNaturally(vec3d, item); } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/CropBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/CropBlockBehavior.java index 9228904eb..98b5dd75c 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/CropBlockBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/CropBlockBehavior.java @@ -13,13 +13,13 @@ import net.momirealms.craftengine.core.block.behavior.BlockBehaviorFactory; import net.momirealms.craftengine.core.block.properties.IntegerProperty; import net.momirealms.craftengine.core.block.properties.Property; import net.momirealms.craftengine.core.loot.LootContext; -import net.momirealms.craftengine.core.loot.number.NumberProvider; -import net.momirealms.craftengine.core.loot.number.NumberProviders; -import net.momirealms.craftengine.core.loot.parameter.LootParameters; +import net.momirealms.craftengine.core.plugin.context.ContextHolder; +import net.momirealms.craftengine.core.plugin.context.number.NumberProvider; +import net.momirealms.craftengine.core.plugin.context.number.NumberProviders; +import net.momirealms.craftengine.core.plugin.context.parameter.CommonParameters; import net.momirealms.craftengine.core.util.RandomUtils; import net.momirealms.craftengine.core.util.ResourceConfigUtils; import net.momirealms.craftengine.core.util.Tuple; -import net.momirealms.craftengine.core.util.context.ContextHolder; import net.momirealms.craftengine.core.world.Vec3d; import net.momirealms.craftengine.core.world.Vec3i; import net.momirealms.craftengine.shared.block.BlockBehavior; @@ -149,8 +149,8 @@ public class CropBlockBehavior extends BushBlockBehavior { net.momirealms.craftengine.core.world.World wrappedWorld = new BukkitWorld(world); int i = this.getAge(immutableBlockState) + this.boneMealBonus.getInt(new LootContext(wrappedWorld, 1, ThreadLocalRandom.current(), ContextHolder.builder() - .withParameter(LootParameters.WORLD, wrappedWorld) - .withParameter(LootParameters.LOCATION, Vec3d.atCenterOf(new Vec3i(x, y, z))) + .withParameter(CommonParameters.WORLD, wrappedWorld) + .withParameter(CommonParameters.LOCATION, Vec3d.atCenterOf(new Vec3i(x, y, z))) .build())); int maxAge = this.ageProperty.max; if (i > maxAge) { diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/FallingBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/FallingBlockBehavior.java index 54b2d436a..e7d04e967 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/FallingBlockBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/FallingBlockBehavior.java @@ -10,10 +10,10 @@ import net.momirealms.craftengine.core.block.CustomBlock; import net.momirealms.craftengine.core.block.ImmutableBlockState; import net.momirealms.craftengine.core.block.behavior.BlockBehaviorFactory; import net.momirealms.craftengine.core.item.Item; -import net.momirealms.craftengine.core.loot.parameter.LootParameters; +import net.momirealms.craftengine.core.plugin.context.ContextHolder; +import net.momirealms.craftengine.core.plugin.context.parameter.CommonParameters; import net.momirealms.craftengine.core.util.ResourceConfigUtils; import net.momirealms.craftengine.core.util.VersionHelper; -import net.momirealms.craftengine.core.util.context.ContextHolder; import net.momirealms.craftengine.core.world.Vec3d; import net.momirealms.craftengine.shared.block.BlockBehavior; @@ -91,14 +91,14 @@ public class FallingBlockBehavior extends BukkitBlockBehavior { ImmutableBlockState immutableBlockState = BukkitBlockManager.instance().getImmutableBlockState(stateId); if (immutableBlockState == null || immutableBlockState.isEmpty()) return; ContextHolder.Builder builder = ContextHolder.builder(); - builder.withParameter(LootParameters.FALLING_BLOCK, true); + builder.withParameter(CommonParameters.FALLING_BLOCK, true); double x = Reflections.field$Entity$xo.getDouble(fallingBlockEntity); double y = Reflections.field$Entity$yo.getDouble(fallingBlockEntity); double z = Reflections.field$Entity$zo.getDouble(fallingBlockEntity); Vec3d vec3d = new Vec3d(x, y, z); net.momirealms.craftengine.core.world.World world = new BukkitWorld(FastNMS.INSTANCE.method$Level$getCraftWorld(level)); - builder.withParameter(LootParameters.LOCATION, vec3d); - builder.withParameter(LootParameters.WORLD, world); + builder.withParameter(CommonParameters.LOCATION, vec3d); + builder.withParameter(CommonParameters.WORLD, world); for (Item item : immutableBlockState.getDrops(builder, world)) { world.dropItemNaturally(vec3d, item); } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/LeavesBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/LeavesBlockBehavior.java index 4686b022c..572ebf985 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/LeavesBlockBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/LeavesBlockBehavior.java @@ -13,12 +13,12 @@ import net.momirealms.craftengine.core.block.UpdateOption; import net.momirealms.craftengine.core.block.behavior.BlockBehaviorFactory; import net.momirealms.craftengine.core.block.properties.Property; import net.momirealms.craftengine.core.item.Item; -import net.momirealms.craftengine.core.loot.parameter.LootParameters; +import net.momirealms.craftengine.core.plugin.context.ContextHolder; +import net.momirealms.craftengine.core.plugin.context.parameter.CommonParameters; import net.momirealms.craftengine.core.util.Direction; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.ResourceConfigUtils; import net.momirealms.craftengine.core.util.VersionHelper; -import net.momirealms.craftengine.core.util.context.ContextHolder; import net.momirealms.craftengine.core.world.BlockPos; import net.momirealms.craftengine.core.world.Vec3d; import net.momirealms.craftengine.shared.block.BlockBehavior; @@ -125,8 +125,8 @@ public class LeavesBlockBehavior extends WaterLoggedBlockBehavior { Vec3d vec3d = Vec3d.atCenterOf(pos); net.momirealms.craftengine.core.world.World world = new BukkitWorld(bukkitWorld); ContextHolder.Builder builder = ContextHolder.builder() - .withParameter(LootParameters.LOCATION, vec3d) - .withParameter(LootParameters.WORLD, world); + .withParameter(CommonParameters.LOCATION, vec3d) + .withParameter(CommonParameters.WORLD, world); for (Item item : immutableBlockState.getDrops(builder, world)) { world.dropItemNaturally(vec3d, item); } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/SugarCaneBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/SugarCaneBlockBehavior.java index cf1b77194..dc31b1b67 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/SugarCaneBlockBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/SugarCaneBlockBehavior.java @@ -13,9 +13,9 @@ import net.momirealms.craftengine.core.block.behavior.BlockBehaviorFactory; import net.momirealms.craftengine.core.block.properties.IntegerProperty; import net.momirealms.craftengine.core.block.properties.Property; import net.momirealms.craftengine.core.item.Item; -import net.momirealms.craftengine.core.loot.parameter.LootParameters; +import net.momirealms.craftengine.core.plugin.context.ContextHolder; +import net.momirealms.craftengine.core.plugin.context.parameter.CommonParameters; import net.momirealms.craftengine.core.util.*; -import net.momirealms.craftengine.core.util.context.ContextHolder; import net.momirealms.craftengine.core.world.BlockPos; import net.momirealms.craftengine.core.world.Vec3d; import net.momirealms.craftengine.core.world.WorldEvents; @@ -61,8 +61,8 @@ public class SugarCaneBlockBehavior extends BushBlockBehavior { Vec3d vec3d = Vec3d.atCenterOf(LocationUtils.fromBlockPos(blockPos)); net.momirealms.craftengine.core.world.World world = new BukkitWorld(FastNMS.INSTANCE.method$Level$getCraftWorld(level)); ContextHolder.Builder builder = ContextHolder.builder() - .withParameter(LootParameters.LOCATION, vec3d) - .withParameter(LootParameters.WORLD, world); + .withParameter(CommonParameters.LOCATION, vec3d) + .withParameter(CommonParameters.WORLD, world); for (Item item : currentState.getDrops(builder, world)) { world.dropItemNaturally(vec3d, item); } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/BukkitItemManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/BukkitItemManager.java index 6dc5566af..9296dd4c5 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/BukkitItemManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/BukkitItemManager.java @@ -28,12 +28,12 @@ import net.momirealms.craftengine.core.pack.model.select.ChargeTypeSelectPropert import net.momirealms.craftengine.core.pack.model.select.TrimMaterialSelectProperty; import net.momirealms.craftengine.core.plugin.config.Config; import net.momirealms.craftengine.core.plugin.config.ConfigSectionParser; +import net.momirealms.craftengine.core.plugin.context.ContextHolder; import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; import net.momirealms.craftengine.core.registry.BuiltInRegistries; import net.momirealms.craftengine.core.registry.Holder; import net.momirealms.craftengine.core.registry.WritableRegistry; import net.momirealms.craftengine.core.util.*; -import net.momirealms.craftengine.core.util.context.ContextHolder; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.NamespacedKey; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/RecipeEventListener.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/RecipeEventListener.java index 7bc3042f3..ecf349fb6 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/RecipeEventListener.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/RecipeEventListener.java @@ -19,13 +19,13 @@ import net.momirealms.craftengine.core.item.recipe.input.CraftingInput; import net.momirealms.craftengine.core.item.recipe.input.SingleItemInput; import net.momirealms.craftengine.core.item.recipe.input.SmithingInput; import net.momirealms.craftengine.core.plugin.config.Config; +import net.momirealms.craftengine.core.plugin.context.ContextHolder; import net.momirealms.craftengine.core.registry.BuiltInRegistries; import net.momirealms.craftengine.core.registry.Holder; import net.momirealms.craftengine.core.util.AdventureHelper; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.Pair; import net.momirealms.craftengine.core.util.VersionHelper; -import net.momirealms.craftengine.core.util.context.ContextHolder; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.block.Campfire; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/loot/BukkitVanillaLootManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/loot/BukkitVanillaLootManager.java index 1bfb8cd09..db72d7a54 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/loot/BukkitVanillaLootManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/loot/BukkitVanillaLootManager.java @@ -11,13 +11,13 @@ import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.loot.AbstractVanillaLootManager; import net.momirealms.craftengine.core.loot.LootTable; import net.momirealms.craftengine.core.loot.VanillaLoot; -import net.momirealms.craftengine.core.loot.parameter.LootParameters; import net.momirealms.craftengine.core.pack.LoadingSequence; import net.momirealms.craftengine.core.pack.Pack; import net.momirealms.craftengine.core.plugin.config.ConfigSectionParser; +import net.momirealms.craftengine.core.plugin.context.ContextHolder; +import net.momirealms.craftengine.core.plugin.context.parameter.CommonParameters; import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; import net.momirealms.craftengine.core.util.*; -import net.momirealms.craftengine.core.util.context.ContextHolder; import net.momirealms.craftengine.core.world.Vec3d; import org.bukkit.Bukkit; import org.bukkit.Location; @@ -68,13 +68,14 @@ public class BukkitVanillaLootManager extends AbstractVanillaLootManager impleme net.momirealms.craftengine.core.world.World world = new BukkitWorld(entity.getWorld()); Vec3d vec3d = new Vec3d(location.getBlockX() + 0.5, location.getBlockY() + 0.5, location.getBlockZ() + 0.5); ContextHolder.Builder builder = ContextHolder.builder(); - builder.withParameter(LootParameters.WORLD, world); - builder.withParameter(LootParameters.LOCATION, vec3d); + builder.withParameter(CommonParameters.WORLD, world); + builder.withParameter(CommonParameters.LOCATION, vec3d); + // TODO Vanilla State Parameter if (VersionHelper.isOrAbove1_20_5()) { if (event.getDamageSource().getCausingEntity() instanceof Player player) { BukkitServerPlayer serverPlayer = this.plugin.adapt(player); - builder.withParameter(LootParameters.PLAYER, serverPlayer); - builder.withOptionalParameter(LootParameters.TOOL, serverPlayer.getItemInHand(InteractionHand.MAIN_HAND)); + builder.withParameter(CommonParameters.PLAYER, serverPlayer); + builder.withOptionalParameter(CommonParameters.TOOL, serverPlayer.getItemInHand(InteractionHand.MAIN_HAND)); } } ContextHolder contextHolder = builder.build(); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java index a7c20f9c7..c5c54386d 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java @@ -427,8 +427,8 @@ public class BukkitServerPlayer extends Player { } else { if (VersionHelper.isOrAbove1_20_5()) { Object attributeModifier = VersionHelper.isOrAbove1_21() ? - Reflections.constructor$AttributeModifier.newInstance(KeyUtils.toResourceLocation("craftengine", "custom_hardness"), -9999d, Reflections.instance$AttributeModifier$Operation$ADD_VALUE) : - Reflections.constructor$AttributeModifier.newInstance(UUID.randomUUID(), "craftengine:custom_hardness", -9999d, Reflections.instance$AttributeModifier$Operation$ADD_VALUE); + Reflections.constructor$AttributeModifier.newInstance(KeyUtils.toResourceLocation(Key.DEFAULT_NAMESPACE, "custom_hardness"), -9999d, Reflections.instance$AttributeModifier$Operation$ADD_VALUE) : + Reflections.constructor$AttributeModifier.newInstance(UUID.randomUUID(), Key.DEFAULT_NAMESPACE + ":custom_hardness", -9999d, Reflections.instance$AttributeModifier$Operation$ADD_VALUE); Object attributeSnapshot = Reflections.constructor$ClientboundUpdateAttributesPacket$AttributeSnapshot.newInstance(Reflections.instance$Holder$Attribute$block_break_speed, 1d, Lists.newArrayList(attributeModifier)); Object newPacket = Reflections.constructor$ClientboundUpdateAttributesPacket1.newInstance(entityID(), Lists.newArrayList(attributeSnapshot)); sendPacket(newPacket, true); diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/ImmutableBlockState.java b/core/src/main/java/net/momirealms/craftengine/core/block/ImmutableBlockState.java index 4f6ca3a96..dad93e792 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/block/ImmutableBlockState.java +++ b/core/src/main/java/net/momirealms/craftengine/core/block/ImmutableBlockState.java @@ -4,9 +4,9 @@ import it.unimi.dsi.fastutil.objects.Reference2ObjectArrayMap; import net.momirealms.craftengine.core.block.properties.Property; import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.loot.LootTable; -import net.momirealms.craftengine.core.loot.parameter.LootParameters; +import net.momirealms.craftengine.core.plugin.context.ContextHolder; +import net.momirealms.craftengine.core.plugin.context.parameter.CommonParameters; import net.momirealms.craftengine.core.registry.Holder; -import net.momirealms.craftengine.core.util.context.ContextHolder; import net.momirealms.craftengine.core.world.World; import net.momirealms.craftengine.shared.block.BlockBehavior; import net.momirealms.sparrow.nbt.CompoundTag; @@ -144,6 +144,6 @@ public class ImmutableBlockState extends BlockStateHolder { if (block == null) return List.of(); LootTable lootTable = (LootTable) block.lootTable(); if (lootTable == null) return List.of(); - return lootTable.getRandomItems(builder.withParameter(LootParameters.BLOCK_STATE, this).build(), world); + return lootTable.getRandomItems(builder.withParameter(CommonParameters.BLOCK_STATE, this).build(), world); } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/behavior/BlockBehaviors.java b/core/src/main/java/net/momirealms/craftengine/core/block/behavior/BlockBehaviors.java index e67a96dc1..d75ffc494 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/block/behavior/BlockBehaviors.java +++ b/core/src/main/java/net/momirealms/craftengine/core/block/behavior/BlockBehaviors.java @@ -27,7 +27,7 @@ public class BlockBehaviors { public static BlockBehavior fromMap(CustomBlock block, @Nullable Map map) { if (map == null || map.isEmpty()) return EmptyBlockBehavior.INSTANCE; String type = ResourceConfigUtils.requireNonEmptyStringOrThrow(map.get("type"), "warning.config.block.behavior.missing_type"); - Key key = Key.withDefaultNamespace(type, "craftengine"); + Key key = Key.withDefaultNamespace(type, Key.DEFAULT_NAMESPACE); BlockBehaviorFactory factory = BuiltInRegistries.BLOCK_BEHAVIOR_FACTORY.getValue(key); if (factory == null) { throw new LocalizedResourceConfigException("warning.config.block.behavior.invalid_type", type.toString()); diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/properties/Properties.java b/core/src/main/java/net/momirealms/craftengine/core/block/properties/Properties.java index bf1b1c0a5..44194f07a 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/block/properties/Properties.java +++ b/core/src/main/java/net/momirealms/craftengine/core/block/properties/Properties.java @@ -33,7 +33,7 @@ public class Properties { public static Property fromMap(String name, Map map) { String type = ResourceConfigUtils.requireNonEmptyStringOrThrow(map.get("type"), "warning.config.block.state.property.missing_type"); - Key key = Key.withDefaultNamespace(type, "craftengine"); + Key key = Key.withDefaultNamespace(type, Key.DEFAULT_NAMESPACE); PropertyFactory factory = BuiltInRegistries.PROPERTY_FACTORY.getValue(key); if (factory == null) { throw new LocalizedResourceConfigException("warning.config.block.state.property.invalid_type", key.toString(), name); diff --git a/core/src/main/java/net/momirealms/craftengine/core/font/AbstractFontManager.java b/core/src/main/java/net/momirealms/craftengine/core/font/AbstractFontManager.java index 76283a5b7..c8151079b 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/font/AbstractFontManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/font/AbstractFontManager.java @@ -7,11 +7,11 @@ import net.momirealms.craftengine.core.pack.Pack; import net.momirealms.craftengine.core.pack.ResourceLocation; import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.plugin.config.ConfigSectionParser; +import net.momirealms.craftengine.core.plugin.context.ContextHolder; +import net.momirealms.craftengine.core.plugin.context.PlayerOptionalContext; import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; import net.momirealms.craftengine.core.plugin.locale.TranslationManager; import net.momirealms.craftengine.core.util.*; -import net.momirealms.craftengine.core.util.context.ContextHolder; -import net.momirealms.craftengine.core.util.context.PlayerOptionalContext; import org.ahocorasick.trie.Token; import org.ahocorasick.trie.Trie; import org.jetbrains.annotations.NotNull; diff --git a/core/src/main/java/net/momirealms/craftengine/core/font/EmojiParameters.java b/core/src/main/java/net/momirealms/craftengine/core/font/EmojiParameters.java index f3344e548..5cf91415a 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/font/EmojiParameters.java +++ b/core/src/main/java/net/momirealms/craftengine/core/font/EmojiParameters.java @@ -1,6 +1,6 @@ package net.momirealms.craftengine.core.font; -import net.momirealms.craftengine.core.util.context.ContextKey; +import net.momirealms.craftengine.core.plugin.context.ContextKey; public final class EmojiParameters { private EmojiParameters() {} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/BuildableItem.java b/core/src/main/java/net/momirealms/craftengine/core/item/BuildableItem.java index 3f755d6b1..ed2e23317 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/BuildableItem.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/BuildableItem.java @@ -1,8 +1,8 @@ package net.momirealms.craftengine.core.item; import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.plugin.context.ContextHolder; import net.momirealms.craftengine.core.util.Key; -import net.momirealms.craftengine.core.util.context.ContextHolder; public interface BuildableItem { diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/CustomItem.java b/core/src/main/java/net/momirealms/craftengine/core/item/CustomItem.java index 6d72163f1..af3b05eed 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/CustomItem.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/CustomItem.java @@ -3,8 +3,8 @@ package net.momirealms.craftengine.core.item; import net.momirealms.craftengine.core.entity.player.Player; import net.momirealms.craftengine.core.item.behavior.ItemBehavior; import net.momirealms.craftengine.core.item.modifier.ItemDataModifier; +import net.momirealms.craftengine.core.plugin.context.ContextHolder; import net.momirealms.craftengine.core.util.Key; -import net.momirealms.craftengine.core.util.context.ContextHolder; import org.jetbrains.annotations.NotNull; import java.util.List; diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/ItemBuildContext.java b/core/src/main/java/net/momirealms/craftengine/core/item/ItemBuildContext.java index fdc53f6e4..8ad1474df 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/ItemBuildContext.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/ItemBuildContext.java @@ -1,8 +1,8 @@ package net.momirealms.craftengine.core.item; import net.momirealms.craftengine.core.entity.player.Player; -import net.momirealms.craftengine.core.util.context.ContextHolder; -import net.momirealms.craftengine.core.util.context.PlayerOptionalContext; +import net.momirealms.craftengine.core.plugin.context.ContextHolder; +import net.momirealms.craftengine.core.plugin.context.PlayerOptionalContext; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/behavior/ItemBehaviors.java b/core/src/main/java/net/momirealms/craftengine/core/item/behavior/ItemBehaviors.java index c2217ec6a..af0524d2a 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/behavior/ItemBehaviors.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/behavior/ItemBehaviors.java @@ -14,7 +14,7 @@ import java.nio.file.Path; import java.util.Map; public class ItemBehaviors { - public static final Key EMPTY = Key.from("craftengine:empty"); + public static final Key EMPTY = Key.withDefaultNamespace("empty", Key.DEFAULT_NAMESPACE); public static void register(Key key, ItemBehaviorFactory factory) { Holder.Reference holder = ((WritableRegistry) BuiltInRegistries.ITEM_BEHAVIOR_FACTORY) @@ -25,7 +25,7 @@ public class ItemBehaviors { public static ItemBehavior fromMap(Pack pack, Path path, Key id, Map map) { if (map == null || map.isEmpty()) return EmptyItemBehavior.INSTANCE; String type = ResourceConfigUtils.requireNonEmptyStringOrThrow(map.get("type"), "warning.config.item.behavior.missing_type"); - Key key = Key.withDefaultNamespace(type, "craftengine"); + Key key = Key.withDefaultNamespace(type, Key.DEFAULT_NAMESPACE); ItemBehaviorFactory factory = BuiltInRegistries.ITEM_BEHAVIOR_FACTORY.getValue(key); if (factory == null) { throw new LocalizedResourceConfigException("warning.config.item.behavior.invalid_type", type.toString()); diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomSmithingTransformRecipe.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomSmithingTransformRecipe.java index 1742fcc19..5d83f7df0 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomSmithingTransformRecipe.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomSmithingTransformRecipe.java @@ -184,7 +184,7 @@ public class CustomSmithingTransformRecipe implements Recipe { if (type == null) { throw new LocalizedResourceConfigException("warning.config.recipe.smithing_transform.post_processor.missing_type"); } - Key key = Key.withDefaultNamespace(type, "craftengine"); + Key key = Key.withDefaultNamespace(type, Key.DEFAULT_NAMESPACE); ItemDataProcessor.Factory factory = BuiltInRegistries.SMITHING_RESULT_PROCESSOR_FACTORY.getValue(key); if (factory == null) { throw new LocalizedResourceConfigException("warning.config.recipe.smithing_transform.post_processor.invalid_type", type); diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/LootContext.java b/core/src/main/java/net/momirealms/craftengine/core/loot/LootContext.java index c565134fd..5c14026b1 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/LootContext.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/LootContext.java @@ -1,7 +1,7 @@ package net.momirealms.craftengine.core.loot; -import net.momirealms.craftengine.core.util.context.AbstractCommonContext; -import net.momirealms.craftengine.core.util.context.ContextHolder; +import net.momirealms.craftengine.core.plugin.context.AbstractCommonContext; +import net.momirealms.craftengine.core.plugin.context.ContextHolder; import net.momirealms.craftengine.core.world.World; import java.util.Random; diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/LootPool.java b/core/src/main/java/net/momirealms/craftengine/core/loot/LootPool.java index 981093c85..28a012dc6 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/LootPool.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/LootPool.java @@ -2,13 +2,13 @@ package net.momirealms.craftengine.core.loot; import com.google.common.collect.Lists; import net.momirealms.craftengine.core.item.Item; -import net.momirealms.craftengine.core.loot.condition.LootCondition; import net.momirealms.craftengine.core.loot.condition.LootConditions; import net.momirealms.craftengine.core.loot.entry.LootEntry; import net.momirealms.craftengine.core.loot.entry.LootEntryContainer; import net.momirealms.craftengine.core.loot.function.LootFunction; import net.momirealms.craftengine.core.loot.function.LootFunctions; -import net.momirealms.craftengine.core.loot.number.NumberProvider; +import net.momirealms.craftengine.core.plugin.context.Condition; +import net.momirealms.craftengine.core.plugin.context.number.NumberProvider; import net.momirealms.craftengine.core.util.MCUtils; import net.momirealms.craftengine.core.util.MutableInt; @@ -20,14 +20,14 @@ import java.util.function.Predicate; public class LootPool { private final List> entryContainers; - private final List conditions; + private final List> conditions; private final Predicate compositeCondition; private final List> functions; private final BiFunction, LootContext, Item> compositeFunction; private final NumberProvider rolls; private final NumberProvider bonusRolls; - public LootPool(List> entryContainers, List conditions, List> functions, NumberProvider rolls, NumberProvider bonusRolls) { + public LootPool(List> entryContainers, List> conditions, List> functions, NumberProvider rolls, NumberProvider bonusRolls) { this.entryContainers = entryContainers; this.conditions = conditions; this.functions = functions; @@ -38,7 +38,7 @@ public class LootPool { } public void addRandomItems(Consumer> lootConsumer, LootContext context) { - for (LootCondition condition : this.conditions) { + for (Condition condition : this.conditions) { if (!condition.test(context)) { return; } diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/LootTable.java b/core/src/main/java/net/momirealms/craftengine/core/loot/LootTable.java index 152eec336..b404c7456 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/LootTable.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/LootTable.java @@ -2,18 +2,18 @@ package net.momirealms.craftengine.core.loot; import com.google.common.collect.Lists; import net.momirealms.craftengine.core.item.Item; -import net.momirealms.craftengine.core.loot.condition.LootCondition; import net.momirealms.craftengine.core.loot.condition.LootConditions; import net.momirealms.craftengine.core.loot.entry.LootEntryContainer; import net.momirealms.craftengine.core.loot.entry.LootEntryContainers; import net.momirealms.craftengine.core.loot.function.LootFunction; import net.momirealms.craftengine.core.loot.function.LootFunctions; -import net.momirealms.craftengine.core.loot.number.NumberProvider; -import net.momirealms.craftengine.core.loot.number.NumberProviders; +import net.momirealms.craftengine.core.plugin.context.Condition; +import net.momirealms.craftengine.core.plugin.context.ContextHolder; +import net.momirealms.craftengine.core.plugin.context.number.NumberProvider; +import net.momirealms.craftengine.core.plugin.context.number.NumberProviders; import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; import net.momirealms.craftengine.core.util.MiscUtils; import net.momirealms.craftengine.core.util.ResourceConfigUtils; -import net.momirealms.craftengine.core.util.context.ContextHolder; import net.momirealms.craftengine.core.world.World; import org.jetbrains.annotations.Nullable; @@ -52,7 +52,7 @@ public class LootTable { Map pool = MiscUtils.castToMap(rawPoolMap, false); NumberProvider rolls = NumberProviders.fromObject(pool.getOrDefault("rolls", 1)); NumberProvider bonus_rolls = NumberProviders.fromObject(pool.getOrDefault("bonus_rolls", 0)); - List conditions = Optional.ofNullable(pool.get("conditions")) + List> conditions = Optional.ofNullable(pool.get("conditions")) .map(it -> LootConditions.fromMapList(castToMapListOrThrow(it, () -> new LocalizedResourceConfigException("warning.config.loot_table.invalid_conditions_type", it.getClass().getSimpleName())))) .orElse(Lists.newArrayList()); diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootCondition.java b/core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootCondition.java deleted file mode 100644 index 5a684a171..000000000 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootCondition.java +++ /dev/null @@ -1,11 +0,0 @@ -package net.momirealms.craftengine.core.loot.condition; - -import net.momirealms.craftengine.core.loot.LootContext; -import net.momirealms.craftengine.core.util.Key; - -import java.util.function.Predicate; - -public interface LootCondition extends Predicate { - - Key type(); -} diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditionAllOf.java b/core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditionAllOf.java deleted file mode 100644 index 6496fa4aa..000000000 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditionAllOf.java +++ /dev/null @@ -1,41 +0,0 @@ -package net.momirealms.craftengine.core.loot.condition; - -import net.momirealms.craftengine.core.loot.LootContext; -import net.momirealms.craftengine.core.util.Key; - -import java.util.List; -import java.util.Map; - -public class LootConditionAllOf implements LootCondition { - public static final Factory FACTORY = new Factory(); - private final List conditions; - - public LootConditionAllOf(List conditions) { - this.conditions = conditions; - } - - @Override - public Key type() { - return LootConditions.ALL_OF; - } - - @Override - public boolean test(LootContext lootContext) { - for (LootCondition condition : conditions) { - if (!condition.test(lootContext)) { - return false; - } - } - return true; - } - - public static class Factory implements LootConditionFactory { - - @SuppressWarnings("unchecked") - @Override - public LootCondition create(Map arguments) { - List> terms = (List>) arguments.get("terms"); - return new LootConditionAllOf(LootConditions.fromMapList(terms)); - } - } -} diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditionAnyOf.java b/core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditionAnyOf.java deleted file mode 100644 index c7267bce6..000000000 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditionAnyOf.java +++ /dev/null @@ -1,40 +0,0 @@ -package net.momirealms.craftengine.core.loot.condition; - -import net.momirealms.craftengine.core.loot.LootContext; -import net.momirealms.craftengine.core.util.Key; - -import java.util.List; -import java.util.Map; - -public class LootConditionAnyOf implements LootCondition { - public static final Factory FACTORY = new Factory(); - private final List conditions; - - public LootConditionAnyOf(List conditions) { - this.conditions = conditions; - } - - @Override - public Key type() { - return LootConditions.ANY_OF; - } - - @Override - public boolean test(LootContext lootContext) { - for (LootCondition condition : conditions) { - if (condition.test(lootContext)) { - return true; - } - } - return false; - } - - public static class Factory implements LootConditionFactory { - @SuppressWarnings("unchecked") - @Override - public LootCondition create(Map arguments) { - List> terms = (List>) arguments.get("terms"); - return new LootConditionAnyOf(LootConditions.fromMapList(terms)); - } - } -} diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditionFactory.java b/core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditionFactory.java deleted file mode 100644 index 6f8173511..000000000 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditionFactory.java +++ /dev/null @@ -1,8 +0,0 @@ -package net.momirealms.craftengine.core.loot.condition; - -import java.util.Map; - -public interface LootConditionFactory { - - LootCondition create(Map arguments); -} diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditionFalling.java b/core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditionFalling.java deleted file mode 100644 index b47cb29c0..000000000 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditionFalling.java +++ /dev/null @@ -1,29 +0,0 @@ -package net.momirealms.craftengine.core.loot.condition; - -import net.momirealms.craftengine.core.loot.LootContext; -import net.momirealms.craftengine.core.loot.parameter.LootParameters; -import net.momirealms.craftengine.core.util.Key; - -import java.util.Map; - -public class LootConditionFalling implements LootCondition { - public static final Factory FACTORY = new Factory(); - public static final LootConditionFalling INSTANCE = new LootConditionFalling(); - - @Override - public Key type() { - return LootConditions.FALLING_BLOCK; - } - - @Override - public boolean test(LootContext lootContext) { - return lootContext.getOptionalParameter(LootParameters.FALLING_BLOCK).orElse(false); - } - - public static class Factory implements LootConditionFactory { - @Override - public LootCondition create(Map arguments) { - return INSTANCE; - } - } -} diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditionInverted.java b/core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditionInverted.java deleted file mode 100644 index 01d89fa09..000000000 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditionInverted.java +++ /dev/null @@ -1,34 +0,0 @@ -package net.momirealms.craftengine.core.loot.condition; - -import net.momirealms.craftengine.core.loot.LootContext; -import net.momirealms.craftengine.core.util.Key; - -import java.util.Map; - -public class LootConditionInverted implements LootCondition { - public static final Factory FACTORY = new Factory(); - private final LootCondition condition; - - public LootConditionInverted(LootCondition condition) { - this.condition = condition; - } - - @Override - public Key type() { - return LootConditions.INVERTED; - } - - @Override - public boolean test(LootContext lootContext) { - return !condition.test(lootContext); - } - - public static class Factory implements LootConditionFactory { - @SuppressWarnings("unchecked") - @Override - public LootCondition create(Map arguments) { - Map term = (Map) arguments.get("term"); - return new LootConditionInverted(LootConditions.fromMap(term)); - } - } -} diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditionRandom.java b/core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditionRandom.java deleted file mode 100644 index 77a99c196..000000000 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditionRandom.java +++ /dev/null @@ -1,35 +0,0 @@ -package net.momirealms.craftengine.core.loot.condition; - -import net.momirealms.craftengine.core.loot.LootContext; -import net.momirealms.craftengine.core.util.Key; -import net.momirealms.craftengine.core.util.RandomUtils; -import net.momirealms.craftengine.core.util.ResourceConfigUtils; - -import java.util.Map; - -public class LootConditionRandom implements LootCondition { - public static final Factory FACTORY = new Factory(); - private final float chance; - - public LootConditionRandom(float chance) { - this.chance = chance; - } - - @Override - public Key type() { - return LootConditions.RANDOM; - } - - @Override - public boolean test(LootContext lootContext) { - return RandomUtils.generateRandomFloat(0, 1) < this.chance; - } - - public static class Factory implements LootConditionFactory { - @Override - public LootCondition create(Map arguments) { - float chance = ResourceConfigUtils.getAsFloat(arguments.getOrDefault("value", 0.5f), "value"); - return new LootConditionRandom(chance); - } - } -} diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditionSurvivesExplosion.java b/core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditionSurvivesExplosion.java deleted file mode 100644 index 68ae812da..000000000 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditionSurvivesExplosion.java +++ /dev/null @@ -1,35 +0,0 @@ -package net.momirealms.craftengine.core.loot.condition; - -import net.momirealms.craftengine.core.loot.LootContext; -import net.momirealms.craftengine.core.loot.parameter.LootParameters; -import net.momirealms.craftengine.core.util.Key; - -import java.util.Map; -import java.util.Optional; - -public class LootConditionSurvivesExplosion implements LootCondition { - public static final Factory FACTORY = new Factory(); - private static final LootConditionSurvivesExplosion INSTANCE = new LootConditionSurvivesExplosion(); - - @Override - public Key type() { - return LootConditions.SURVIVES_EXPLOSION; - } - - @Override - public boolean test(LootContext lootContext) { - Optional radius = lootContext.getOptionalParameter(LootParameters.EXPLOSION_RADIUS); - if (radius.isPresent()) { - float f = 1f / radius.get(); - return lootContext.randomSource().nextFloat() < f; - } - return true; - } - - public static class Factory implements LootConditionFactory { - @Override - public LootCondition create(Map arguments) { - return INSTANCE; - } - } -} diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditions.java b/core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditions.java index d9ba14a51..8e98d73d2 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditions.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditions.java @@ -1,11 +1,16 @@ package net.momirealms.craftengine.core.loot.condition; +import net.momirealms.craftengine.core.loot.LootContext; +import net.momirealms.craftengine.core.plugin.context.Condition; +import net.momirealms.craftengine.core.plugin.context.condition.*; import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; import net.momirealms.craftengine.core.registry.BuiltInRegistries; import net.momirealms.craftengine.core.registry.Holder; import net.momirealms.craftengine.core.registry.Registries; import net.momirealms.craftengine.core.registry.WritableRegistry; +import net.momirealms.craftengine.core.util.Factory; import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; import net.momirealms.craftengine.core.util.ResourceKey; import java.util.ArrayList; @@ -14,32 +19,22 @@ import java.util.Map; import java.util.function.Predicate; public class LootConditions { - public static final Key MATCH_ITEM = Key.from("craftengine:match_item"); - public static final Key MATCH_BLOCK_PROPERTY = Key.from("craftengine:match_block_property"); - public static final Key TABLE_BONUS = Key.from("craftengine:table_bonus"); - public static final Key SURVIVES_EXPLOSION = Key.from("craftengine:survives_explosion"); - public static final Key RANDOM = Key.from("craftengine:random"); - public static final Key ANY_OF = Key.from("craftengine:any_of"); - public static final Key ALL_OF = Key.from("craftengine:all_of"); - public static final Key ENCHANTMENT = Key.from("craftengine:enchantment"); - public static final Key INVERTED = Key.from("craftengine:inverted"); - public static final Key FALLING_BLOCK = Key.from("craftengine:falling_block"); static { - register(MATCH_ITEM, LootConditionMatchItem.FACTORY); - register(MATCH_BLOCK_PROPERTY, LootConditionMatchBlockProperty.FACTORY); - register(TABLE_BONUS, LootConditionTableBonus.FACTORY); - register(SURVIVES_EXPLOSION, LootConditionSurvivesExplosion.FACTORY); - register(ANY_OF, LootConditionAnyOf.FACTORY); - register(ALL_OF, LootConditionAllOf.FACTORY); - register(ENCHANTMENT, LootConditionEnchantment.FACTORY); - register(INVERTED, LootConditionInverted.FACTORY); - register(FALLING_BLOCK, LootConditionFalling.FACTORY); - register(RANDOM, LootConditionRandom.FACTORY); + register(SharedConditions.MATCH_ITEM, new MatchItemCondition.FactoryImpl<>()); + register(SharedConditions.MATCH_BLOCK_PROPERTY, new MatchBlockPropertyCondition.FactoryImpl<>()); + register(SharedConditions.TABLE_BONUS, new TableBonusCondition.FactoryImpl<>()); + register(SharedConditions.SURVIVES_EXPLOSION, new SurvivesExplosionCondition.FactoryImpl<>()); + register(SharedConditions.ANY_OF, new AnyOfCondition.FactoryImpl<>(LootConditions::fromMap)); + register(SharedConditions.ALL_OF, new AllOfCondition.FactoryImpl<>(LootConditions::fromMap)); + register(SharedConditions.ENCHANTMENT, new EnchantmentCondition.FactoryImpl<>()); + register(SharedConditions.INVERTED, new InvertedCondition.FactoryImpl<>(LootConditions::fromMap)); + register(SharedConditions.FALLING_BLOCK, new FallingBlockCondition.FactoryImpl<>()); + register(SharedConditions.RANDOM, new RandomCondition.FactoryImpl<>()); } - public static void register(Key key, LootConditionFactory factory) { - Holder.Reference holder = ((WritableRegistry) BuiltInRegistries.LOOT_CONDITION_FACTORY) + public static void register(Key key, Factory> factory) { + Holder.Reference>> holder = ((WritableRegistry>>) BuiltInRegistries.LOOT_CONDITION_FACTORY) .registerForHolder(new ResourceKey<>(Registries.LOOT_CONDITION_FACTORY.location(), key)); holder.bindValue(factory); } @@ -78,22 +73,19 @@ public class LootConditions { }; } - public static List fromMapList(List> mapList) { + public static List> fromMapList(List> mapList) { if (mapList == null || mapList.isEmpty()) return List.of(); - List functions = new ArrayList<>(); + List> functions = new ArrayList<>(); for (Map map : mapList) { functions.add(fromMap(map)); } return functions; } - public static LootCondition fromMap(Map map) { - String type = (String) map.get("type"); - if (type == null) { - throw new LocalizedResourceConfigException("warning.config.loot_table.condition.missing_type"); - } - Key key = Key.withDefaultNamespace(type, "craftengine"); - LootConditionFactory factory = BuiltInRegistries.LOOT_CONDITION_FACTORY.getValue(key); + public static Condition fromMap(Map map) { + String type = ResourceConfigUtils.requireNonEmptyStringOrThrow(map.get("type"), "warning.config.loot_table.condition.missing_type"); + Key key = Key.withDefaultNamespace(type, Key.DEFAULT_NAMESPACE); + Factory> factory = BuiltInRegistries.LOOT_CONDITION_FACTORY.getValue(key); if (factory == null) { throw new LocalizedResourceConfigException("warning.config.loot_table.condition.invalid_type", type); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/entry/AbstractCompositeLootEntryContainer.java b/core/src/main/java/net/momirealms/craftengine/core/loot/entry/AbstractCompositeLootEntryContainer.java index 76f4a57ea..c30f2407a 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/entry/AbstractCompositeLootEntryContainer.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/entry/AbstractCompositeLootEntryContainer.java @@ -1,7 +1,7 @@ package net.momirealms.craftengine.core.loot.entry; import net.momirealms.craftengine.core.loot.LootContext; -import net.momirealms.craftengine.core.loot.condition.LootCondition; +import net.momirealms.craftengine.core.plugin.context.Condition; import java.util.List; import java.util.function.Consumer; @@ -10,7 +10,7 @@ public abstract class AbstractCompositeLootEntryContainer extends AbstractLoo protected final List> children; private final LootEntryContainer composedChildren; - protected AbstractCompositeLootEntryContainer(List conditions, List> children) { + protected AbstractCompositeLootEntryContainer(List> conditions, List> children) { super(conditions); this.children = children; this.composedChildren = compose(children); diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/entry/AbstractLootEntryContainer.java b/core/src/main/java/net/momirealms/craftengine/core/loot/entry/AbstractLootEntryContainer.java index a71d1651d..7538d3f7f 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/entry/AbstractLootEntryContainer.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/entry/AbstractLootEntryContainer.java @@ -1,7 +1,7 @@ package net.momirealms.craftengine.core.loot.entry; import net.momirealms.craftengine.core.loot.LootContext; -import net.momirealms.craftengine.core.loot.condition.LootCondition; +import net.momirealms.craftengine.core.plugin.context.Condition; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.MCUtils; @@ -9,10 +9,10 @@ import java.util.List; import java.util.function.Predicate; public abstract class AbstractLootEntryContainer implements LootEntryContainer, Predicate { - protected final List conditions; + protected final List> conditions; private final Predicate compositeCondition; - protected AbstractLootEntryContainer(List conditions) { + protected AbstractLootEntryContainer(List> conditions) { this.conditions = conditions; this.compositeCondition = MCUtils.allOf(conditions); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/entry/AbstractSingleLootEntryContainer.java b/core/src/main/java/net/momirealms/craftengine/core/loot/entry/AbstractSingleLootEntryContainer.java index 86f866a29..0d57d6d39 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/entry/AbstractSingleLootEntryContainer.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/entry/AbstractSingleLootEntryContainer.java @@ -2,9 +2,9 @@ package net.momirealms.craftengine.core.loot.entry; import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.loot.LootContext; -import net.momirealms.craftengine.core.loot.condition.LootCondition; import net.momirealms.craftengine.core.loot.function.LootFunction; import net.momirealms.craftengine.core.loot.function.LootFunctions; +import net.momirealms.craftengine.core.plugin.context.Condition; import java.util.List; import java.util.function.BiFunction; @@ -24,7 +24,7 @@ public abstract class AbstractSingleLootEntryContainer extends AbstractLootEn } }; - protected AbstractSingleLootEntryContainer(List conditions, List> functions, int weight, int quality) { + protected AbstractSingleLootEntryContainer(List> conditions, List> functions, int weight, int quality) { super(conditions); this.weight = weight; this.quality = quality; diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/entry/AlternativesLootEntryContainer.java b/core/src/main/java/net/momirealms/craftengine/core/loot/entry/AlternativesLootEntryContainer.java index 3c5e91f4e..9b22cbf89 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/entry/AlternativesLootEntryContainer.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/entry/AlternativesLootEntryContainer.java @@ -1,7 +1,8 @@ package net.momirealms.craftengine.core.loot.entry; -import net.momirealms.craftengine.core.loot.condition.LootCondition; +import net.momirealms.craftengine.core.loot.LootContext; import net.momirealms.craftengine.core.loot.condition.LootConditions; +import net.momirealms.craftengine.core.plugin.context.Condition; import net.momirealms.craftengine.core.util.Key; import java.util.*; @@ -9,7 +10,7 @@ import java.util.*; public class AlternativesLootEntryContainer extends AbstractCompositeLootEntryContainer { public static final Factory FACTORY = new Factory<>(); - protected AlternativesLootEntryContainer(List conditions, List> children) { + protected AlternativesLootEntryContainer(List> conditions, List> children) { super(conditions, children); } @@ -42,7 +43,7 @@ public class AlternativesLootEntryContainer extends AbstractCompositeLootEntr List> containers = Optional.ofNullable(arguments.get("children")) .map(it -> (List>) new ArrayList>(LootEntryContainers.fromMapList((List>) it))) .orElse(Collections.emptyList()); - List conditions = Optional.ofNullable(arguments.get("conditions")) + List> conditions = Optional.ofNullable(arguments.get("conditions")) .map(it -> LootConditions.fromMapList((List>) it)) .orElse(Collections.emptyList()); return new AlternativesLootEntryContainer<>(conditions, containers); diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/entry/ExpLootEntryContainer.java b/core/src/main/java/net/momirealms/craftengine/core/loot/entry/ExpLootEntryContainer.java index 41d0d5de8..4c03b9873 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/entry/ExpLootEntryContainer.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/entry/ExpLootEntryContainer.java @@ -1,11 +1,11 @@ package net.momirealms.craftengine.core.loot.entry; import net.momirealms.craftengine.core.loot.LootContext; -import net.momirealms.craftengine.core.loot.condition.LootCondition; import net.momirealms.craftengine.core.loot.condition.LootConditions; -import net.momirealms.craftengine.core.loot.number.NumberProvider; -import net.momirealms.craftengine.core.loot.number.NumberProviders; -import net.momirealms.craftengine.core.loot.parameter.LootParameters; +import net.momirealms.craftengine.core.plugin.context.Condition; +import net.momirealms.craftengine.core.plugin.context.number.NumberProvider; +import net.momirealms.craftengine.core.plugin.context.number.NumberProviders; +import net.momirealms.craftengine.core.plugin.context.parameter.CommonParameters; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.ResourceConfigUtils; @@ -19,7 +19,7 @@ public class ExpLootEntryContainer extends AbstractLootEntryContainer { public static final Factory FACTORY = new Factory<>(); private final NumberProvider value; - protected ExpLootEntryContainer(NumberProvider value, List conditions) { + protected ExpLootEntryContainer(NumberProvider value, List> conditions) { super(conditions); this.value = value; } @@ -32,8 +32,8 @@ public class ExpLootEntryContainer extends AbstractLootEntryContainer { @Override public boolean expand(LootContext context, Consumer> choiceConsumer) { if (super.test(context)) { - context.getOptionalParameter(LootParameters.WORLD) - .ifPresent(it -> context.getOptionalParameter(LootParameters.LOCATION).ifPresent(loc -> it.dropExp(loc.toCenter(), value.getInt(context)))); + context.getOptionalParameter(CommonParameters.WORLD) + .ifPresent(it -> context.getOptionalParameter(CommonParameters.LOCATION).ifPresent(loc -> it.dropExp(loc.toCenter(), value.getInt(context)))); return true; } else { return false; @@ -45,7 +45,7 @@ public class ExpLootEntryContainer extends AbstractLootEntryContainer { @Override public LootEntryContainer create(Map arguments) { Object value = ResourceConfigUtils.requireNonNullOrThrow(arguments.get("count"), "warning.config.loot_table.entry.exp.missing_count"); - List conditions = Optional.ofNullable(arguments.get("conditions")) + List> conditions = Optional.ofNullable(arguments.get("conditions")) .map(it -> LootConditions.fromMapList((List>) it)) .orElse(Collections.emptyList()); return new ExpLootEntryContainer<>(NumberProviders.fromObject(value), conditions); diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/entry/LootEntryContainers.java b/core/src/main/java/net/momirealms/craftengine/core/loot/entry/LootEntryContainers.java index b9f9ce3e0..5d44629dc 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/entry/LootEntryContainers.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/entry/LootEntryContainers.java @@ -42,7 +42,7 @@ public class LootEntryContainers { @SuppressWarnings("unchecked") public static LootEntryContainer fromMap(Map map) { String type = ResourceConfigUtils.requireNonEmptyStringOrThrow(map.get("type"), "warning.config.loot_table.entry.missing_type"); - Key key = Key.withDefaultNamespace(type, "craftengine"); + Key key = Key.withDefaultNamespace(type, Key.DEFAULT_NAMESPACE); LootEntryContainerFactory factory = (LootEntryContainerFactory) BuiltInRegistries.LOOT_ENTRY_CONTAINER_FACTORY.getValue(key); if (factory == null) { throw new LocalizedResourceConfigException("warning.config.loot_table.entry.invalid_type", type); diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/entry/SingleItemLootEntryContainer.java b/core/src/main/java/net/momirealms/craftengine/core/loot/entry/SingleItemLootEntryContainer.java index 28830b557..a17fecb5b 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/entry/SingleItemLootEntryContainer.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/entry/SingleItemLootEntryContainer.java @@ -2,12 +2,12 @@ package net.momirealms.craftengine.core.loot.entry; import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.loot.LootContext; -import net.momirealms.craftengine.core.loot.condition.LootCondition; import net.momirealms.craftengine.core.loot.condition.LootConditions; import net.momirealms.craftengine.core.loot.function.LootFunction; import net.momirealms.craftengine.core.loot.function.LootFunctions; -import net.momirealms.craftengine.core.loot.parameter.LootParameters; import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.plugin.context.Condition; +import net.momirealms.craftengine.core.plugin.context.parameter.CommonParameters; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.ResourceConfigUtils; @@ -18,7 +18,7 @@ public class SingleItemLootEntryContainer extends AbstractSingleLootEntryCont public static final Factory FACTORY = new Factory<>(); private final Key item; - protected SingleItemLootEntryContainer(Key item, List conditions, List> lootFunctions, int weight, int quality) { + protected SingleItemLootEntryContainer(Key item, List> conditions, List> lootFunctions, int weight, int quality) { super(conditions, lootFunctions, weight, quality); this.item = item; } @@ -31,7 +31,7 @@ public class SingleItemLootEntryContainer extends AbstractSingleLootEntryCont @SuppressWarnings("unchecked") @Override protected void createItem(Consumer> lootConsumer, LootContext context) { - Item tItem = (Item) CraftEngine.instance().itemManager().createWrappedItem(this.item, context.getOptionalParameter(LootParameters.PLAYER).orElse(null)); + Item tItem = (Item) CraftEngine.instance().itemManager().createWrappedItem(this.item, context.getOptionalParameter(CommonParameters.PLAYER).orElse(null)); if (tItem != null) { lootConsumer.accept(tItem); } else { @@ -47,7 +47,7 @@ public class SingleItemLootEntryContainer extends AbstractSingleLootEntryCont Key item = Key.from(itemObj); int weight = ResourceConfigUtils.getAsInt(arguments.getOrDefault("weight", 1), "weight"); int quality = ResourceConfigUtils.getAsInt(arguments.getOrDefault("quality", 0), "quality"); - List conditions = Optional.ofNullable(arguments.get("conditions")) + List> conditions = Optional.ofNullable(arguments.get("conditions")) .map(it -> LootConditions.fromMapList((List>) it)) .orElse(Collections.emptyList()); List> functions = Optional.ofNullable(arguments.get("functions")) diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/function/AbstractLootConditionalFunction.java b/core/src/main/java/net/momirealms/craftengine/core/loot/function/AbstractLootConditionalFunction.java index c0de92238..89a918222 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/function/AbstractLootConditionalFunction.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/function/AbstractLootConditionalFunction.java @@ -2,17 +2,17 @@ package net.momirealms.craftengine.core.loot.function; import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.loot.LootContext; -import net.momirealms.craftengine.core.loot.condition.LootCondition; +import net.momirealms.craftengine.core.plugin.context.Condition; import net.momirealms.craftengine.core.util.MCUtils; import java.util.List; import java.util.function.Predicate; public abstract class AbstractLootConditionalFunction implements LootFunction { - protected final List predicates; + protected final List> predicates; private final Predicate compositePredicates; - public AbstractLootConditionalFunction(List predicates) { + public AbstractLootConditionalFunction(List> predicates) { this.predicates = predicates; this.compositePredicates = MCUtils.allOf(predicates); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctionApplyBonusCount.java b/core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctionApplyBonusCount.java index 230b66eac..c8105921f 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctionApplyBonusCount.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctionApplyBonusCount.java @@ -3,9 +3,9 @@ package net.momirealms.craftengine.core.loot.function; import net.momirealms.craftengine.core.item.Enchantment; import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.loot.LootContext; -import net.momirealms.craftengine.core.loot.condition.LootCondition; import net.momirealms.craftengine.core.loot.condition.LootConditions; -import net.momirealms.craftengine.core.loot.parameter.LootParameters; +import net.momirealms.craftengine.core.plugin.context.Condition; +import net.momirealms.craftengine.core.plugin.context.parameter.CommonParameters; import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; import net.momirealms.craftengine.core.registry.BuiltInRegistries; import net.momirealms.craftengine.core.registry.Holder; @@ -24,7 +24,7 @@ public class LootFunctionApplyBonusCount extends AbstractLootConditionalFunct private final Key enchantment; private final Formula formula; - public LootFunctionApplyBonusCount(List predicates, Key enchantment, Formula formula) { + public LootFunctionApplyBonusCount(List> predicates, Key enchantment, Formula formula) { super(predicates); this.enchantment = enchantment; this.formula = formula; @@ -32,7 +32,7 @@ public class LootFunctionApplyBonusCount extends AbstractLootConditionalFunct @Override protected Item applyInternal(Item item, LootContext context) { - Optional> itemInHand = context.getOptionalParameter(LootParameters.TOOL); + Optional> itemInHand = context.getOptionalParameter(CommonParameters.TOOL); int level = itemInHand.map(value -> value.getEnchantment(this.enchantment).map(Enchantment::level).orElse(0)).orElse(0); int newCount = this.formula.apply(item.count(), level); item.count(newCount); @@ -54,7 +54,7 @@ public class LootFunctionApplyBonusCount extends AbstractLootConditionalFunct if (formulaMap == null) { throw new LocalizedResourceConfigException("warning.config.loot_table.function.apply_bonus.missing_formula"); } - List conditions = Optional.ofNullable(arguments.get("conditions")) + List> conditions = Optional.ofNullable(arguments.get("conditions")) .map(it -> LootConditions.fromMapList((List>) it)) .orElse(Collections.emptyList()); return new LootFunctionApplyBonusCount<>(conditions, Key.from(enchantment), Formulas.fromMap(formulaMap)); @@ -92,7 +92,7 @@ public class LootFunctionApplyBonusCount extends AbstractLootConditionalFunct if (type == null) { throw new NullPointerException("number type cannot be null"); } - Key key = Key.withDefaultNamespace(type, "craftengine"); + Key key = Key.withDefaultNamespace(type, Key.DEFAULT_NAMESPACE); FormulaFactory factory = BuiltInRegistries.FORMULA_FACTORY.getValue(key); if (factory == null) { throw new IllegalArgumentException("Unknown formula type: " + type); diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctionDropExp.java b/core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctionDropExp.java index 24c353736..0a1d791b3 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctionDropExp.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctionDropExp.java @@ -2,11 +2,11 @@ package net.momirealms.craftengine.core.loot.function; import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.loot.LootContext; -import net.momirealms.craftengine.core.loot.condition.LootCondition; import net.momirealms.craftengine.core.loot.condition.LootConditions; -import net.momirealms.craftengine.core.loot.number.NumberProvider; -import net.momirealms.craftengine.core.loot.number.NumberProviders; -import net.momirealms.craftengine.core.loot.parameter.LootParameters; +import net.momirealms.craftengine.core.plugin.context.Condition; +import net.momirealms.craftengine.core.plugin.context.number.NumberProvider; +import net.momirealms.craftengine.core.plugin.context.number.NumberProviders; +import net.momirealms.craftengine.core.plugin.context.parameter.CommonParameters; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.ResourceConfigUtils; @@ -19,15 +19,15 @@ public class LootFunctionDropExp extends AbstractLootConditionalFunction { public static final Factory FACTORY = new Factory<>(); private final NumberProvider value; - public LootFunctionDropExp(NumberProvider value, List predicates) { + public LootFunctionDropExp(NumberProvider value, List> predicates) { super(predicates); this.value = value; } @Override protected Item applyInternal(Item item, LootContext context) { - context.getOptionalParameter(LootParameters.WORLD) - .ifPresent(it -> context.getOptionalParameter(LootParameters.LOCATION).ifPresent(loc -> it.dropExp(loc.toCenter(), value.getInt(context)))); + context.getOptionalParameter(CommonParameters.WORLD) + .ifPresent(it -> context.getOptionalParameter(CommonParameters.LOCATION).ifPresent(loc -> it.dropExp(loc.toCenter(), value.getInt(context)))); return item; } @@ -41,7 +41,7 @@ public class LootFunctionDropExp extends AbstractLootConditionalFunction { @Override public LootFunction create(Map arguments) { Object value = ResourceConfigUtils.requireNonNullOrThrow(arguments.get("count"), "warning.config.loot_table.function.drop_exp.missing_count"); - List conditions = Optional.ofNullable(arguments.get("conditions")) + List> conditions = Optional.ofNullable(arguments.get("conditions")) .map(it -> LootConditions.fromMapList((List>) it)) .orElse(Collections.emptyList()); return new LootFunctionDropExp<>(NumberProviders.fromObject(value), conditions); diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctionExplosionDecay.java b/core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctionExplosionDecay.java index 7a8c8ff61..7f0caa415 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctionExplosionDecay.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctionExplosionDecay.java @@ -2,9 +2,9 @@ package net.momirealms.craftengine.core.loot.function; import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.loot.LootContext; -import net.momirealms.craftengine.core.loot.condition.LootCondition; import net.momirealms.craftengine.core.loot.condition.LootConditions; -import net.momirealms.craftengine.core.loot.parameter.LootParameters; +import net.momirealms.craftengine.core.plugin.context.Condition; +import net.momirealms.craftengine.core.plugin.context.parameter.CommonParameters; import net.momirealms.craftengine.core.util.Key; import java.util.*; @@ -12,13 +12,13 @@ import java.util.*; public class LootFunctionExplosionDecay extends AbstractLootConditionalFunction { public static final Factory FACTORY = new Factory<>(); - public LootFunctionExplosionDecay(List predicates) { + public LootFunctionExplosionDecay(List> predicates) { super(predicates); } @Override protected Item applyInternal(Item item, LootContext context) { - Optional radius = context.getOptionalParameter(LootParameters.EXPLOSION_RADIUS); + Optional radius = context.getOptionalParameter(CommonParameters.EXPLOSION_RADIUS); if (radius.isPresent()) { Random random = context.randomSource(); float f = 1f / radius.get(); @@ -43,7 +43,7 @@ public class LootFunctionExplosionDecay extends AbstractLootConditionalFuncti @SuppressWarnings("unchecked") @Override public LootFunction create(Map arguments) { - List conditions = Optional.ofNullable(arguments.get("conditions")) + List> conditions = Optional.ofNullable(arguments.get("conditions")) .map(it -> LootConditions.fromMapList((List>) it)) .orElse(Collections.emptyList()); return new LootFunctionExplosionDecay<>(conditions); diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctionSetCount.java b/core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctionSetCount.java index 85aafdcc7..d0c8e92db 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctionSetCount.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctionSetCount.java @@ -2,10 +2,10 @@ package net.momirealms.craftengine.core.loot.function; import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.loot.LootContext; -import net.momirealms.craftengine.core.loot.condition.LootCondition; import net.momirealms.craftengine.core.loot.condition.LootConditions; -import net.momirealms.craftengine.core.loot.number.NumberProvider; -import net.momirealms.craftengine.core.loot.number.NumberProviders; +import net.momirealms.craftengine.core.plugin.context.Condition; +import net.momirealms.craftengine.core.plugin.context.number.NumberProvider; +import net.momirealms.craftengine.core.plugin.context.number.NumberProviders; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.ResourceConfigUtils; @@ -20,7 +20,7 @@ public class LootFunctionSetCount extends AbstractLootConditionalFunction private final NumberProvider value; private final boolean add; - public LootFunctionSetCount(List conditions, NumberProvider value, boolean add) { + public LootFunctionSetCount(List> conditions, NumberProvider value, boolean add) { super(conditions); this.value = value; this.add = add; @@ -44,7 +44,7 @@ public class LootFunctionSetCount extends AbstractLootConditionalFunction public LootFunction create(Map arguments) { Object value = ResourceConfigUtils.requireNonNullOrThrow(arguments.get("count"), "warning.config.loot_table.function.set_count.missing_count"); boolean add = (boolean) arguments.getOrDefault("add", false); - List conditions = Optional.ofNullable(arguments.get("conditions")) + List> conditions = Optional.ofNullable(arguments.get("conditions")) .map(it -> LootConditions.fromMapList((List>) it)) .orElse(Collections.emptyList()); return new LootFunctionSetCount<>(conditions, NumberProviders.fromObject(value), add); diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctions.java b/core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctions.java index 24cdb87c7..04fcf0709 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctions.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctions.java @@ -70,7 +70,7 @@ public class LootFunctions { @SuppressWarnings("unchecked") public static LootFunction fromMap(Map map) { String type = ResourceConfigUtils.requireNonEmptyStringOrThrow(map.get("type"), "warning.config.loot_table.function.missing_type"); - Key key = Key.withDefaultNamespace(type, "craftengine"); + Key key = Key.withDefaultNamespace(type, Key.DEFAULT_NAMESPACE); LootFunctionFactory factory = (LootFunctionFactory) BuiltInRegistries.LOOT_FUNCTION_FACTORY.getValue(key); if (factory == null) { throw new LocalizedResourceConfigException("warning.config.loot_table.function.invalid_type", type); diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/PathContext.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/PathContext.java index 05c66434f..55bdce4db 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/PathContext.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/PathContext.java @@ -1,7 +1,7 @@ package net.momirealms.craftengine.core.pack.conflict; -import net.momirealms.craftengine.core.util.context.AbstractCommonContext; -import net.momirealms.craftengine.core.util.context.ContextHolder; +import net.momirealms.craftengine.core.plugin.context.AbstractCommonContext; +import net.momirealms.craftengine.core.plugin.context.ContextHolder; import java.nio.file.Path; diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcher.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcher.java index 1bb9a746e..b00efefef 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcher.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcher.java @@ -1,7 +1,7 @@ package net.momirealms.craftengine.core.pack.conflict.matcher; import net.momirealms.craftengine.core.pack.conflict.PathContext; -import net.momirealms.craftengine.core.util.context.Condition; +import net.momirealms.craftengine.core.plugin.context.Condition; public interface PathMatcher extends Condition { } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherAllOf.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherAllOf.java index e98057453..7ed47270b 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherAllOf.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherAllOf.java @@ -1,10 +1,10 @@ package net.momirealms.craftengine.core.pack.conflict.matcher; import net.momirealms.craftengine.core.pack.conflict.PathContext; +import net.momirealms.craftengine.core.plugin.context.Condition; +import net.momirealms.craftengine.core.plugin.context.condition.AllOfCondition; import net.momirealms.craftengine.core.plugin.locale.LocalizedException; import net.momirealms.craftengine.core.util.MiscUtils; -import net.momirealms.craftengine.core.util.condition.AllOfCondition; -import net.momirealms.craftengine.core.util.context.Condition; import java.util.List; import java.util.Map; diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherAnyOf.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherAnyOf.java index efb1d584c..027d8f1b6 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherAnyOf.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherAnyOf.java @@ -1,10 +1,10 @@ package net.momirealms.craftengine.core.pack.conflict.matcher; import net.momirealms.craftengine.core.pack.conflict.PathContext; +import net.momirealms.craftengine.core.plugin.context.Condition; +import net.momirealms.craftengine.core.plugin.context.condition.AnyOfCondition; import net.momirealms.craftengine.core.plugin.locale.LocalizedException; import net.momirealms.craftengine.core.util.MiscUtils; -import net.momirealms.craftengine.core.util.condition.AnyOfCondition; -import net.momirealms.craftengine.core.util.context.Condition; import java.util.List; import java.util.Map; diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherInverted.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherInverted.java index 1d5b88493..8a7b47e7f 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherInverted.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherInverted.java @@ -1,10 +1,10 @@ package net.momirealms.craftengine.core.pack.conflict.matcher; import net.momirealms.craftengine.core.pack.conflict.PathContext; +import net.momirealms.craftengine.core.plugin.context.condition.InvertedCondition; import net.momirealms.craftengine.core.plugin.locale.LocalizedException; import net.momirealms.craftengine.core.util.MiscUtils; import net.momirealms.craftengine.core.util.ResourceConfigUtils; -import net.momirealms.craftengine.core.util.condition.InvertedCondition; import java.util.Map; diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatchers.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatchers.java index 7afc670bc..c9ae0edb8 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatchers.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatchers.java @@ -51,7 +51,7 @@ public class PathMatchers { public static PathMatcher fromMap(Map map) { String type = ResourceConfigUtils.requireNonEmptyStringOrThrow(map.get("type"), () -> new LocalizedException("warning.config.conflict_matcher.missing_type")); - Key key = Key.withDefaultNamespace(type, "craftengine"); + Key key = Key.withDefaultNamespace(type, Key.DEFAULT_NAMESPACE); PathMatcherFactory factory = BuiltInRegistries.PATH_MATCHER_FACTORY.getValue(key); if (factory == null) { throw new LocalizedException("warning.config.conflict_matcher.invalid_type", type); diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/Resolutions.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/Resolutions.java index 86a3ae54d..b80302a07 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/Resolutions.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/Resolutions.java @@ -33,7 +33,7 @@ public class Resolutions { public static Resolution fromMap(Map map) { String type = ResourceConfigUtils.requireNonEmptyStringOrThrow(map.get("type"), () -> new LocalizedException("warning.config.conflict_resolution.missing_type")); - Key key = Key.withDefaultNamespace(type, "craftengine"); + Key key = Key.withDefaultNamespace(type, Key.DEFAULT_NAMESPACE); ResolutionFactory factory = BuiltInRegistries.RESOLUTION_FACTORY.getValue(key); if (factory == null) { throw new LocalizedException("warning.config.conflict_resolution.invalid_type", type); diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/host/ResourcePackHosts.java b/core/src/main/java/net/momirealms/craftengine/core/pack/host/ResourcePackHosts.java index 8421c62c8..ccf56c684 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/host/ResourcePackHosts.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/host/ResourcePackHosts.java @@ -45,7 +45,7 @@ public class ResourcePackHosts { if (type == null) { throw new LocalizedException("warning.config.host.missing_type"); } - Key key = Key.withDefaultNamespace(type, "craftengine"); + Key key = Key.withDefaultNamespace(type, Key.DEFAULT_NAMESPACE); ResourcePackHostFactory factory = BuiltInRegistries.RESOURCE_PACK_HOST_FACTORY.getValue(key); if (factory == null) { throw new LocalizedException("warning.config.host.invalid_type", type); diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/CraftEngine.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/CraftEngine.java index a0c9669e2..af0e3fed0 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/CraftEngine.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/CraftEngine.java @@ -42,7 +42,6 @@ import java.util.function.Supplier; public abstract class CraftEngine implements Plugin { public static final String MOD_CLASS = "net.momirealms.craftengine.mod.CraftEnginePlugin"; - public static final String NAMESPACE = "craftengine"; private static CraftEngine instance; protected PluginLogger logger; protected Consumer> debugger = (s) -> {}; diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/template/TemplateArguments.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/template/TemplateArguments.java index a49348a04..f437a7493 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/template/TemplateArguments.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/template/TemplateArguments.java @@ -36,7 +36,7 @@ public class TemplateArguments { if (type == null) { return MapTemplateArgument.FACTORY.create(map); } else { - Key key = Key.withDefaultNamespace(type, "craftengine"); + Key key = Key.withDefaultNamespace(type, Key.DEFAULT_NAMESPACE); TemplateArgumentFactory factory = BuiltInRegistries.TEMPLATE_ARGUMENT_FACTORY.getValue(key); if (factory == null) { throw new IllegalArgumentException("Unknown argument type: " + type); diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/context/AbstractAdditionalCommonContext.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/AbstractAdditionalCommonContext.java similarity index 90% rename from core/src/main/java/net/momirealms/craftengine/core/util/context/AbstractAdditionalCommonContext.java rename to core/src/main/java/net/momirealms/craftengine/core/plugin/context/AbstractAdditionalCommonContext.java index c16ffa97d..0011e6247 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/util/context/AbstractAdditionalCommonContext.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/AbstractAdditionalCommonContext.java @@ -1,6 +1,6 @@ -package net.momirealms.craftengine.core.util.context; +package net.momirealms.craftengine.core.plugin.context; -import net.momirealms.craftengine.core.util.context.parameter.CommonParameterProvider; +import net.momirealms.craftengine.core.plugin.context.parameter.CommonParameterProvider; import java.util.List; import java.util.Optional; diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/context/AbstractCommonContext.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/AbstractCommonContext.java similarity index 71% rename from core/src/main/java/net/momirealms/craftengine/core/util/context/AbstractCommonContext.java rename to core/src/main/java/net/momirealms/craftengine/core/plugin/context/AbstractCommonContext.java index cc7f85791..93332ab6d 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/util/context/AbstractCommonContext.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/AbstractCommonContext.java @@ -1,12 +1,15 @@ -package net.momirealms.craftengine.core.util.context; +package net.momirealms.craftengine.core.plugin.context; import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; -import net.momirealms.craftengine.core.plugin.text.minimessage.*; +import net.momirealms.craftengine.core.plugin.text.minimessage.I18NTag; +import net.momirealms.craftengine.core.plugin.text.minimessage.ImageTag; +import net.momirealms.craftengine.core.plugin.text.minimessage.NamedArgumentTag; +import net.momirealms.craftengine.core.plugin.text.minimessage.ShiftTag; import org.jetbrains.annotations.NotNull; import java.util.Optional; -public abstract class AbstractCommonContext implements MiniMessageTagContext { +public abstract class AbstractCommonContext implements Context { protected final ContextHolder contexts; protected TagResolver[] tagResolvers; @@ -16,7 +19,7 @@ public abstract class AbstractCommonContext implements MiniMessageTagContext { @Override public ContextHolder contexts() { - return contexts; + return this.contexts; } @Override diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/context/Condition.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/Condition.java similarity index 59% rename from core/src/main/java/net/momirealms/craftengine/core/util/context/Condition.java rename to core/src/main/java/net/momirealms/craftengine/core/plugin/context/Condition.java index 373fe4897..d2b05a7fa 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/util/context/Condition.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/Condition.java @@ -1,10 +1,10 @@ -package net.momirealms.craftengine.core.util.context; +package net.momirealms.craftengine.core.plugin.context; import net.momirealms.craftengine.core.util.Key; import java.util.function.Predicate; -public interface Condition extends Predicate { +public interface Condition extends Predicate { @Override default boolean test(CTX ctx) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/context/Context.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/Context.java similarity index 63% rename from core/src/main/java/net/momirealms/craftengine/core/util/context/Context.java rename to core/src/main/java/net/momirealms/craftengine/core/plugin/context/Context.java index 56ff668c4..ac3e5d3fe 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/util/context/Context.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/Context.java @@ -1,4 +1,6 @@ -package net.momirealms.craftengine.core.util.context; +package net.momirealms.craftengine.core.plugin.context; + +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import java.util.Optional; @@ -6,6 +8,8 @@ public interface Context { ContextHolder contexts(); + TagResolver[] tagResolvers(); + Optional getOptionalParameter(ContextKey parameter); T getParameterOrThrow(ContextKey parameter); diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/context/ContextHolder.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/ContextHolder.java similarity index 98% rename from core/src/main/java/net/momirealms/craftengine/core/util/context/ContextHolder.java rename to core/src/main/java/net/momirealms/craftengine/core/plugin/context/ContextHolder.java index 718dd54de..c14652f7e 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/util/context/ContextHolder.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/ContextHolder.java @@ -1,4 +1,4 @@ -package net.momirealms.craftengine.core.util.context; +package net.momirealms.craftengine.core.plugin.context; import com.google.common.collect.ImmutableMap; diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/context/ContextKey.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/ContextKey.java similarity index 93% rename from core/src/main/java/net/momirealms/craftengine/core/util/context/ContextKey.java rename to core/src/main/java/net/momirealms/craftengine/core/plugin/context/ContextKey.java index 4c690da88..4d5529baf 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/util/context/ContextKey.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/ContextKey.java @@ -1,4 +1,4 @@ -package net.momirealms.craftengine.core.util.context; +package net.momirealms.craftengine.core.plugin.context; import net.momirealms.craftengine.core.util.Key; import org.jetbrains.annotations.NotNull; diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/context/LazyContextParameterProvider.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/LazyContextParameterProvider.java similarity index 91% rename from core/src/main/java/net/momirealms/craftengine/core/util/context/LazyContextParameterProvider.java rename to core/src/main/java/net/momirealms/craftengine/core/plugin/context/LazyContextParameterProvider.java index 796df1230..0758f7770 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/util/context/LazyContextParameterProvider.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/LazyContextParameterProvider.java @@ -1,4 +1,4 @@ -package net.momirealms.craftengine.core.util.context; +package net.momirealms.craftengine.core.plugin.context; import java.util.Optional; diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/context/PlayerBlockActionContext.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/PlayerBlockActionContext.java similarity index 69% rename from core/src/main/java/net/momirealms/craftengine/core/util/context/PlayerBlockActionContext.java rename to core/src/main/java/net/momirealms/craftengine/core/plugin/context/PlayerBlockActionContext.java index 5adea9974..bbabeb79a 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/util/context/PlayerBlockActionContext.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/PlayerBlockActionContext.java @@ -1,9 +1,9 @@ -package net.momirealms.craftengine.core.util.context; +package net.momirealms.craftengine.core.plugin.context; import net.momirealms.craftengine.core.entity.player.Player; -import net.momirealms.craftengine.core.util.context.parameter.BlockParameterProvider; -import net.momirealms.craftengine.core.util.context.parameter.CommonParameterProvider; -import net.momirealms.craftengine.core.util.context.parameter.PlayerParameterProvider; +import net.momirealms.craftengine.core.plugin.context.parameter.BlockParameterProvider; +import net.momirealms.craftengine.core.plugin.context.parameter.CommonParameterProvider; +import net.momirealms.craftengine.core.plugin.context.parameter.PlayerParameterProvider; import net.momirealms.craftengine.core.world.BlockInWorld; import org.jetbrains.annotations.NotNull; diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/context/PlayerOptionalContext.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/PlayerOptionalContext.java similarity index 85% rename from core/src/main/java/net/momirealms/craftengine/core/util/context/PlayerOptionalContext.java rename to core/src/main/java/net/momirealms/craftengine/core/plugin/context/PlayerOptionalContext.java index fec8f3c0c..2071848ce 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/util/context/PlayerOptionalContext.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/PlayerOptionalContext.java @@ -1,16 +1,16 @@ -package net.momirealms.craftengine.core.util.context; +package net.momirealms.craftengine.core.plugin.context; import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.plugin.context.parameter.CommonParameterProvider; +import net.momirealms.craftengine.core.plugin.context.parameter.PlayerParameterProvider; import net.momirealms.craftengine.core.plugin.text.minimessage.*; -import net.momirealms.craftengine.core.util.context.parameter.CommonParameterProvider; -import net.momirealms.craftengine.core.util.context.parameter.PlayerParameterProvider; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.List; -public class PlayerOptionalContext extends AbstractAdditionalCommonContext implements MiniMessageTagContext { +public class PlayerOptionalContext extends AbstractAdditionalCommonContext implements Context { public static final PlayerOptionalContext EMPTY = new PlayerOptionalContext(null, ContextHolder.EMPTY); private final Player player; diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/AllOfCondition.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/AllOfCondition.java new file mode 100644 index 000000000..eee327cc9 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/AllOfCondition.java @@ -0,0 +1,53 @@ +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.Factory; +import net.momirealms.craftengine.core.util.Key; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.function.Function; + +public class AllOfCondition implements Condition { + protected final List> conditions; + + public AllOfCondition(List> conditions) { + this.conditions = conditions; + } + + @Override + public boolean test(CTX ctx) { + for (Condition condition : conditions) { + if (!condition.test(ctx)) { + return false; + } + } + return true; + } + + @Override + public Key type() { + return SharedConditions.ALL_OF; + } + + public static class FactoryImpl implements Factory> { + private final Function, Condition> factory; + + public FactoryImpl(Function, Condition> factory) { + this.factory = factory; + } + + @SuppressWarnings("unchecked") + @Override + public Condition create(Map arguments) { + List> terms = (List>) arguments.get("terms"); + List> conditions = new ArrayList<>(); + for (Map term : terms) { + conditions.add(factory.apply(term)); + } + return new AllOfCondition<>(conditions); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/AnyOfCondition.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/AnyOfCondition.java new file mode 100644 index 000000000..49a279bb7 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/AnyOfCondition.java @@ -0,0 +1,53 @@ +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.Factory; +import net.momirealms.craftengine.core.util.Key; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.function.Function; + +public class AnyOfCondition implements Condition { + protected final List> conditions; + + public AnyOfCondition(List> conditions) { + this.conditions = conditions; + } + + @Override + public boolean test(CTX ctx) { + for (Condition condition : conditions) { + if (condition.test(ctx)) { + return true; + } + } + return false; + } + + @Override + public Key type() { + return SharedConditions.ANY_OF; + } + + public static class FactoryImpl implements Factory> { + private final Function, Condition> factory; + + public FactoryImpl(Function, Condition> factory) { + this.factory = factory; + } + + @SuppressWarnings("unchecked") + @Override + public Condition create(Map arguments) { + List> terms = (List>) arguments.get("terms"); + List> conditions = new ArrayList<>(); + for (Map term : terms) { + conditions.add(factory.apply(term)); + } + return new AnyOfCondition<>(conditions); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/EmptyCondition.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/EmptyCondition.java new file mode 100644 index 000000000..42bc2e520 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/EmptyCondition.java @@ -0,0 +1,29 @@ +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.Factory; +import net.momirealms.craftengine.core.util.Key; + +import java.util.Map; + +public class EmptyCondition implements Condition { + + @Override + public Key type() { + return SharedConditions.EMPTY; + } + + @Override + public boolean test(CTX ctx) { + return true; + } + + public static class FactoryImpl implements Factory> { + + @Override + public Condition create(Map arguments) { + return new EmptyCondition<>(); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditionEnchantment.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/EnchantmentCondition.java similarity index 62% rename from core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditionEnchantment.java rename to core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/EnchantmentCondition.java index 16e861b4c..8df501f88 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditionEnchantment.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/EnchantmentCondition.java @@ -1,42 +1,44 @@ -package net.momirealms.craftengine.core.loot.condition; +package net.momirealms.craftengine.core.plugin.context.condition; import net.momirealms.craftengine.core.item.Enchantment; import net.momirealms.craftengine.core.item.Item; -import net.momirealms.craftengine.core.loot.LootContext; -import net.momirealms.craftengine.core.loot.parameter.LootParameters; +import net.momirealms.craftengine.core.plugin.context.Condition; +import net.momirealms.craftengine.core.plugin.context.Context; +import net.momirealms.craftengine.core.plugin.context.parameter.CommonParameters; +import net.momirealms.craftengine.core.util.Factory; import net.momirealms.craftengine.core.util.Key; import java.util.Map; import java.util.Optional; import java.util.function.Function; -public class LootConditionEnchantment implements LootCondition { - public static final Factory FACTORY = new Factory(); +public class EnchantmentCondition implements Condition { private final Key id; private final Function expression; - public LootConditionEnchantment(Key id, Function expression) { - this.id = id; + public EnchantmentCondition(Key id, Function expression) { this.expression = expression; + this.id = id; } @Override public Key type() { - return LootConditions.ENCHANTMENT; + return SharedConditions.ENCHANTMENT; } @Override - public boolean test(LootContext lootContext) { - Optional> item = lootContext.getOptionalParameter(LootParameters.TOOL); + public boolean test(CTX ctx) { + Optional> item = ctx.getOptionalParameter(CommonParameters.TOOL); if (item.isEmpty()) return false; Optional enchantment = item.get().getEnchantment(id); int level = enchantment.map(Enchantment::level).orElse(0); return this.expression.apply(level); } - public static class Factory implements LootConditionFactory { + public static class FactoryImpl implements Factory> { + @Override - public LootCondition create(Map arguments) { + public Condition create(Map arguments) { String predicate = (String) arguments.get("predicate"); String[] split = predicate.split("(<=|>=|<|>|==|=)", 2); int level = Integer.parseInt(split[1]); @@ -50,7 +52,7 @@ public class LootConditionEnchantment implements LootCondition { case ">=" -> expression = (i -> i >= level); default -> throw new IllegalArgumentException("Unknown operator: " + operator); } - return new LootConditionEnchantment(Key.of(split[0]), expression); + return new EnchantmentCondition<>(Key.of(split[0]), expression); } } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/FallingBlockCondition.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/FallingBlockCondition.java new file mode 100644 index 000000000..a4ee999f4 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/FallingBlockCondition.java @@ -0,0 +1,30 @@ +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.plugin.context.parameter.CommonParameters; +import net.momirealms.craftengine.core.util.Factory; +import net.momirealms.craftengine.core.util.Key; + +import java.util.Map; + +public class FallingBlockCondition implements Condition { + + @Override + public Key type() { + return SharedConditions.FALLING_BLOCK; + } + + @Override + public boolean test(CTX ctx) { + return ctx.getOptionalParameter(CommonParameters.FALLING_BLOCK).orElse(false); + } + + public static class FactoryImpl implements Factory> { + + @Override + public Condition create(Map arguments) { + return new FallingBlockCondition<>(); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/InvertedCondition.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/InvertedCondition.java new file mode 100644 index 000000000..bc5c85b01 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/InvertedCondition.java @@ -0,0 +1,42 @@ +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.Factory; +import net.momirealms.craftengine.core.util.Key; + +import java.util.Map; +import java.util.function.Function; + +public class InvertedCondition implements Condition { + protected final Condition condition; + + public InvertedCondition(Condition condition) { + this.condition = condition; + } + + @Override + public boolean test(CTX ctx) { + return !this.condition.test(ctx); + } + + @Override + public Key type() { + return SharedConditions.INVERTED; + } + + public static class FactoryImpl implements Factory> { + private final Function, Condition> factory; + + public FactoryImpl(Function, Condition> factory) { + this.factory = factory; + } + + @SuppressWarnings("unchecked") + @Override + public Condition create(Map arguments) { + Map term = (Map) arguments.get("term"); + return new InvertedCondition<>(this.factory.apply(term)); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditionMatchBlockProperty.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/MatchBlockPropertyCondition.java similarity index 63% rename from core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditionMatchBlockProperty.java rename to core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/MatchBlockPropertyCondition.java index c3a30b8f4..e7381ae5d 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditionMatchBlockProperty.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/MatchBlockPropertyCondition.java @@ -1,9 +1,11 @@ -package net.momirealms.craftengine.core.loot.condition; +package net.momirealms.craftengine.core.plugin.context.condition; import net.momirealms.craftengine.core.block.CustomBlock; import net.momirealms.craftengine.core.block.properties.Property; -import net.momirealms.craftengine.core.loot.LootContext; -import net.momirealms.craftengine.core.loot.parameter.LootParameters; +import net.momirealms.craftengine.core.plugin.context.Condition; +import net.momirealms.craftengine.core.plugin.context.Context; +import net.momirealms.craftengine.core.plugin.context.parameter.CommonParameters; +import net.momirealms.craftengine.core.util.Factory; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.Pair; @@ -12,22 +14,21 @@ import java.util.List; import java.util.Locale; import java.util.Map; -public class LootConditionMatchBlockProperty implements LootCondition { - public static final Factory FACTORY = new Factory(); +public class MatchBlockPropertyCondition implements Condition { private final List> properties; - public LootConditionMatchBlockProperty(List> properties) { + public MatchBlockPropertyCondition(List> properties) { this.properties = properties; } @Override public Key type() { - return LootConditions.MATCH_BLOCK_PROPERTY; + return SharedConditions.MATCH_BLOCK_PROPERTY; } @Override - public boolean test(LootContext lootContext) { - return lootContext.getOptionalParameter(LootParameters.BLOCK_STATE).map(state -> { + public boolean test(CTX ctx) { + return ctx.getOptionalParameter(CommonParameters.BLOCK_STATE).map(state -> { CustomBlock block = state.owner().value(); for (Pair property : this.properties) { Property propertyIns = block.getProperty(property.left()); @@ -42,11 +43,11 @@ public class LootConditionMatchBlockProperty implements LootCondition { }).orElse(false); } - public static class Factory implements LootConditionFactory { + public static class FactoryImpl implements Factory> { @SuppressWarnings("unchecked") @Override - public LootCondition create(Map arguments) { + public Condition create(Map arguments) { Map properties = (Map) arguments.get("properties"); if (properties == null) { throw new IllegalArgumentException("Missing 'properties' argument for 'match_block_property'"); @@ -55,7 +56,7 @@ public class LootConditionMatchBlockProperty implements LootCondition { for (Map.Entry entry : properties.entrySet()) { propertyList.add(new Pair<>(entry.getKey(), entry.getValue().toString())); } - return new LootConditionMatchBlockProperty(propertyList); + return new MatchBlockPropertyCondition<>(propertyList); } } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditionMatchItem.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/MatchItemCondition.java similarity index 53% rename from core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditionMatchItem.java rename to core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/MatchItemCondition.java index c2b4c4c2b..11e2180b8 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditionMatchItem.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/MatchItemCondition.java @@ -1,31 +1,32 @@ -package net.momirealms.craftengine.core.loot.condition; +package net.momirealms.craftengine.core.plugin.context.condition; import net.momirealms.craftengine.core.item.Item; -import net.momirealms.craftengine.core.loot.LootContext; -import net.momirealms.craftengine.core.loot.parameter.LootParameters; +import net.momirealms.craftengine.core.plugin.context.Condition; +import net.momirealms.craftengine.core.plugin.context.Context; +import net.momirealms.craftengine.core.plugin.context.parameter.CommonParameters; +import net.momirealms.craftengine.core.util.Factory; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.MiscUtils; import java.util.*; -public class LootConditionMatchItem implements LootCondition { - public static final Factory FACTORY = new Factory(); +public class MatchItemCondition implements Condition { private final Set ids; private final boolean regexMatch; - public LootConditionMatchItem(Collection ids, boolean regexMatch) { + public MatchItemCondition(Collection ids, boolean regexMatch) { this.ids = new HashSet<>(ids); this.regexMatch = regexMatch; } @Override public Key type() { - return LootConditions.MATCH_ITEM; + return SharedConditions.MATCH_ITEM; } @Override - public boolean test(LootContext lootContext) { - Optional> item = lootContext.getOptionalParameter(LootParameters.TOOL); + public boolean test(CTX ctx) { + Optional> item = ctx.getOptionalParameter(CommonParameters.TOOL); if (item.isEmpty()) return false; Key key = item.get().id(); String itemId = key.toString(); @@ -41,12 +42,13 @@ public class LootConditionMatchItem implements LootCondition { return false; } - public static class Factory implements LootConditionFactory { + public static class FactoryImpl implements Factory> { + @Override - public LootCondition create(Map arguments) { + public Condition create(Map arguments) { List ids = MiscUtils.getAsStringList(arguments.get("id")); boolean regex = (boolean) arguments.getOrDefault("regex", false); - return new LootConditionMatchItem(ids, regex); + return new MatchItemCondition<>(ids, regex); } } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/RandomCondition.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/RandomCondition.java new file mode 100644 index 000000000..21fe97429 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/RandomCondition.java @@ -0,0 +1,37 @@ +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.Factory; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.RandomUtils; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; + +import java.util.Map; + +public class RandomCondition implements Condition { + private final float chance; + + public RandomCondition(float chance) { + this.chance = chance; + } + + @Override + public Key type() { + return SharedConditions.RANDOM; + } + + @Override + public boolean test(CTX ctx) { + return RandomUtils.generateRandomFloat(0, 1) < this.chance; + } + + public static class FactoryImpl implements Factory> { + + @Override + public Condition create(Map arguments) { + float provider = ResourceConfigUtils.getAsFloat(arguments.getOrDefault("value", 0.5f), "value"); + return new RandomCondition<>(provider); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/SharedConditions.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/SharedConditions.java new file mode 100644 index 000000000..67fee2254 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/SharedConditions.java @@ -0,0 +1,19 @@ +package net.momirealms.craftengine.core.plugin.context.condition; + +import net.momirealms.craftengine.core.util.Key; + +public final class SharedConditions { + private SharedConditions() {} + + public static final Key EMPTY = Key.of("craftengine:empty"); + 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 INVERTED = Key.of("craftengine:inverted"); + public static final Key MATCH_ITEM = Key.of("craftengine:match_item"); + public static final Key MATCH_BLOCK_PROPERTY = Key.from("craftengine:match_block_property"); + public static final Key TABLE_BONUS = Key.from("craftengine:table_bonus"); + public static final Key SURVIVES_EXPLOSION = Key.from("craftengine:survives_explosion"); + public static final Key RANDOM = Key.from("craftengine:random"); + public static final Key ENCHANTMENT = Key.from("craftengine:enchantment"); + public static final Key FALLING_BLOCK = Key.from("craftengine:falling_block"); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/SurvivesExplosionCondition.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/SurvivesExplosionCondition.java new file mode 100644 index 000000000..f7f97e135 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/SurvivesExplosionCondition.java @@ -0,0 +1,37 @@ +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.plugin.context.parameter.CommonParameters; +import net.momirealms.craftengine.core.util.Factory; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.RandomUtils; + +import java.util.Map; +import java.util.Optional; + +public class SurvivesExplosionCondition implements Condition { + + @Override + public Key type() { + return SharedConditions.SURVIVES_EXPLOSION; + } + + @Override + public boolean test(CTX ctx) { + Optional radius = ctx.getOptionalParameter(CommonParameters.EXPLOSION_RADIUS); + if (radius.isPresent()) { + float f = 1f / radius.get(); + return RandomUtils.generateRandomFloat(0, 1) < f; + } + return true; + } + + public static class FactoryImpl implements Factory> { + + @Override + public Condition create(Map arguments) { + return new SurvivesExplosionCondition<>(); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditionTableBonus.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/TableBonusCondition.java similarity index 61% rename from core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditionTableBonus.java rename to core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/TableBonusCondition.java index e17179ebc..b1e44389d 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditionTableBonus.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/TableBonusCondition.java @@ -1,11 +1,14 @@ -package net.momirealms.craftengine.core.loot.condition; +package net.momirealms.craftengine.core.plugin.context.condition; import net.momirealms.craftengine.core.item.Enchantment; import net.momirealms.craftengine.core.item.Item; -import net.momirealms.craftengine.core.loot.LootContext; -import net.momirealms.craftengine.core.loot.parameter.LootParameters; +import net.momirealms.craftengine.core.plugin.context.Condition; +import net.momirealms.craftengine.core.plugin.context.Context; +import net.momirealms.craftengine.core.plugin.context.parameter.CommonParameters; import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; +import net.momirealms.craftengine.core.util.Factory; import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.RandomUtils; import net.momirealms.craftengine.core.util.ResourceConfigUtils; import java.util.ArrayList; @@ -13,32 +16,32 @@ import java.util.List; import java.util.Map; import java.util.Optional; -public class LootConditionTableBonus implements LootCondition { - public static final Factory FACTORY = new Factory(); +public class TableBonusCondition implements Condition { private final Key enchantmentType; private final List values; - public LootConditionTableBonus(Key enchantmentType, List values) { + public TableBonusCondition(Key enchantmentType, List values) { this.enchantmentType = enchantmentType; this.values = values; } @Override public Key type() { - return LootConditions.TABLE_BONUS; + return SharedConditions.TABLE_BONUS; } @Override - public boolean test(LootContext lootContext) { - Optional> item = lootContext.getOptionalParameter(LootParameters.TOOL); + public boolean test(CTX ctx) { + Optional> item = ctx.getOptionalParameter(CommonParameters.TOOL); int level = item.map(value -> value.getEnchantment(this.enchantmentType).map(Enchantment::level).orElse(0)).orElse(0); float f = this.values.get(Math.min(level, this.values.size() - 1)); - return lootContext.randomSource().nextFloat() < f; + return RandomUtils.generateRandomFloat(0, 1) < f; } - public static class Factory implements LootConditionFactory { + public static class FactoryImpl implements Factory> { + @Override - public LootCondition create(Map arguments) { + public Condition create(Map arguments) { Object enchantmentObj = arguments.get("enchantment"); if (enchantmentObj == null) { throw new LocalizedResourceConfigException("warning.config.loot_table.condition.table_bonus.missing_enchantment"); @@ -47,13 +50,13 @@ public class LootConditionTableBonus implements LootCondition { Object chances = arguments.get("chances"); if (chances != null) { if (chances instanceof Number number) { - return new LootConditionTableBonus(enchantmentType, List.of(number.floatValue())); + return new TableBonusCondition<>(enchantmentType, List.of(number.floatValue())); } else if (chances instanceof List list) { List values = new ArrayList<>(list.size()); for (Object o : list) { values.add(ResourceConfigUtils.getAsFloat(o, "chances")); } - return new LootConditionTableBonus(enchantmentType, values); + return new TableBonusCondition<>(enchantmentType, values); } } throw new LocalizedResourceConfigException("warning.config.loot_table.condition.table_bonus.missing_chances"); diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/number/FixedNumberProvider.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/number/FixedNumberProvider.java similarity index 93% rename from core/src/main/java/net/momirealms/craftengine/core/loot/number/FixedNumberProvider.java rename to core/src/main/java/net/momirealms/craftengine/core/plugin/context/number/FixedNumberProvider.java index 653bd3825..fcf8703bd 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/number/FixedNumberProvider.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/number/FixedNumberProvider.java @@ -1,4 +1,4 @@ -package net.momirealms.craftengine.core.loot.number; +package net.momirealms.craftengine.core.plugin.context.number; import net.momirealms.craftengine.core.loot.LootContext; import net.momirealms.craftengine.core.util.Key; diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/number/NumberProvider.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/number/NumberProvider.java similarity index 82% rename from core/src/main/java/net/momirealms/craftengine/core/loot/number/NumberProvider.java rename to core/src/main/java/net/momirealms/craftengine/core/plugin/context/number/NumberProvider.java index 80352d2af..3d23c3cd3 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/number/NumberProvider.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/number/NumberProvider.java @@ -1,4 +1,4 @@ -package net.momirealms.craftengine.core.loot.number; +package net.momirealms.craftengine.core.plugin.context.number; import net.momirealms.craftengine.core.loot.LootContext; import net.momirealms.craftengine.core.util.Key; diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/number/NumberProviderFactory.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/number/NumberProviderFactory.java similarity index 66% rename from core/src/main/java/net/momirealms/craftengine/core/loot/number/NumberProviderFactory.java rename to core/src/main/java/net/momirealms/craftengine/core/plugin/context/number/NumberProviderFactory.java index cc163082e..0093dfcde 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/number/NumberProviderFactory.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/number/NumberProviderFactory.java @@ -1,4 +1,4 @@ -package net.momirealms.craftengine.core.loot.number; +package net.momirealms.craftengine.core.plugin.context.number; import java.util.Map; diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/number/NumberProviders.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/number/NumberProviders.java similarity index 95% rename from core/src/main/java/net/momirealms/craftengine/core/loot/number/NumberProviders.java rename to core/src/main/java/net/momirealms/craftengine/core/plugin/context/number/NumberProviders.java index 32af65b44..162e25bff 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/number/NumberProviders.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/number/NumberProviders.java @@ -1,4 +1,4 @@ -package net.momirealms.craftengine.core.loot.number; +package net.momirealms.craftengine.core.plugin.context.number; import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; import net.momirealms.craftengine.core.registry.BuiltInRegistries; @@ -39,7 +39,7 @@ public class NumberProviders { public static NumberProvider fromMap(Map map) { String type = ResourceConfigUtils.requireNonEmptyStringOrThrow(map.get("type"), "warning.config.loot_table.number.missing_type"); - Key key = Key.withDefaultNamespace(type, "craftengine"); + Key key = Key.withDefaultNamespace(type, Key.DEFAULT_NAMESPACE); NumberProviderFactory factory = BuiltInRegistries.NUMBER_PROVIDER_FACTORY.getValue(key); if (factory == null) { throw new LocalizedResourceConfigException("warning.config.loot_table.number.invalid_type", type); diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/number/UniformNumberProvider.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/number/UniformNumberProvider.java similarity index 95% rename from core/src/main/java/net/momirealms/craftengine/core/loot/number/UniformNumberProvider.java rename to core/src/main/java/net/momirealms/craftengine/core/plugin/context/number/UniformNumberProvider.java index b294daea1..aac5be744 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/number/UniformNumberProvider.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/number/UniformNumberProvider.java @@ -1,4 +1,4 @@ -package net.momirealms.craftengine.core.loot.number; +package net.momirealms.craftengine.core.plugin.context.number; import net.momirealms.craftengine.core.loot.LootContext; import net.momirealms.craftengine.core.util.Key; diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/context/parameter/BlockParameterProvider.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/parameter/BlockParameterProvider.java similarity index 87% rename from core/src/main/java/net/momirealms/craftengine/core/util/context/parameter/BlockParameterProvider.java rename to core/src/main/java/net/momirealms/craftengine/core/plugin/context/parameter/BlockParameterProvider.java index 8d28fd0fa..50107633d 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/util/context/parameter/BlockParameterProvider.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/parameter/BlockParameterProvider.java @@ -1,7 +1,7 @@ -package net.momirealms.craftengine.core.util.context.parameter; +package net.momirealms.craftengine.core.plugin.context.parameter; -import net.momirealms.craftengine.core.util.context.ContextKey; -import net.momirealms.craftengine.core.util.context.LazyContextParameterProvider; +import net.momirealms.craftengine.core.plugin.context.ContextKey; +import net.momirealms.craftengine.core.plugin.context.LazyContextParameterProvider; import net.momirealms.craftengine.core.world.BlockInWorld; import org.jetbrains.annotations.NotNull; diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/context/parameter/BlockParameters.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/parameter/BlockParameters.java similarity index 87% rename from core/src/main/java/net/momirealms/craftengine/core/util/context/parameter/BlockParameters.java rename to core/src/main/java/net/momirealms/craftengine/core/plugin/context/parameter/BlockParameters.java index 2e0edaeb0..68d2988b8 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/util/context/parameter/BlockParameters.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/parameter/BlockParameters.java @@ -1,8 +1,8 @@ -package net.momirealms.craftengine.core.util.context.parameter; +package net.momirealms.craftengine.core.plugin.context.parameter; import net.momirealms.craftengine.core.block.ImmutableBlockState; +import net.momirealms.craftengine.core.plugin.context.ContextKey; import net.momirealms.craftengine.core.util.Key; -import net.momirealms.craftengine.core.util.context.ContextKey; public final class BlockParameters { private BlockParameters() {} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/context/parameter/CommonParameterProvider.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/parameter/CommonParameterProvider.java similarity index 83% rename from core/src/main/java/net/momirealms/craftengine/core/util/context/parameter/CommonParameterProvider.java rename to core/src/main/java/net/momirealms/craftengine/core/plugin/context/parameter/CommonParameterProvider.java index 396bbdfdd..de5df90c1 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/util/context/parameter/CommonParameterProvider.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/parameter/CommonParameterProvider.java @@ -1,8 +1,8 @@ -package net.momirealms.craftengine.core.util.context.parameter; +package net.momirealms.craftengine.core.plugin.context.parameter; +import net.momirealms.craftengine.core.plugin.context.ContextKey; +import net.momirealms.craftengine.core.plugin.context.LazyContextParameterProvider; import net.momirealms.craftengine.core.util.RandomUtils; -import net.momirealms.craftengine.core.util.context.ContextKey; -import net.momirealms.craftengine.core.util.context.LazyContextParameterProvider; import java.util.HashMap; import java.util.Map; diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/parameter/LootParameters.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/parameter/CommonParameters.java similarity index 73% rename from core/src/main/java/net/momirealms/craftengine/core/loot/parameter/LootParameters.java rename to core/src/main/java/net/momirealms/craftengine/core/plugin/context/parameter/CommonParameters.java index abe27d435..d9e59c0c7 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/parameter/LootParameters.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/parameter/CommonParameters.java @@ -1,15 +1,18 @@ -package net.momirealms.craftengine.core.loot.parameter; +package net.momirealms.craftengine.core.plugin.context.parameter; import net.momirealms.craftengine.core.block.ImmutableBlockState; import net.momirealms.craftengine.core.entity.Entity; import net.momirealms.craftengine.core.entity.player.Player; import net.momirealms.craftengine.core.item.Item; -import net.momirealms.craftengine.core.util.context.ContextKey; +import net.momirealms.craftengine.core.plugin.context.ContextKey; import net.momirealms.craftengine.core.world.Vec3d; import net.momirealms.craftengine.core.world.World; -public final class LootParameters { - private LootParameters() {} +public final class CommonParameters { + private CommonParameters() {} + + public static final ContextKey RANDOM = ContextKey.of("random"); + public static final ContextKey LAST_RANDOM = ContextKey.of("last_random"); public static final ContextKey LOCATION = ContextKey.of("location"); public static final ContextKey WORLD = ContextKey.of("world"); diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/context/parameter/PlayerParameterProvider.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/parameter/PlayerParameterProvider.java similarity index 88% rename from core/src/main/java/net/momirealms/craftengine/core/util/context/parameter/PlayerParameterProvider.java rename to core/src/main/java/net/momirealms/craftengine/core/plugin/context/parameter/PlayerParameterProvider.java index ca2040f86..d79f10448 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/util/context/parameter/PlayerParameterProvider.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/parameter/PlayerParameterProvider.java @@ -1,10 +1,10 @@ -package net.momirealms.craftengine.core.util.context.parameter; +package net.momirealms.craftengine.core.plugin.context.parameter; import net.momirealms.craftengine.core.entity.Entity; import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.plugin.context.ContextKey; +import net.momirealms.craftengine.core.plugin.context.LazyContextParameterProvider; import net.momirealms.craftengine.core.util.MCUtils; -import net.momirealms.craftengine.core.util.context.ContextKey; -import net.momirealms.craftengine.core.util.context.LazyContextParameterProvider; import org.jetbrains.annotations.NotNull; import java.util.HashMap; diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/context/parameter/PlayerParameters.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/parameter/PlayerParameters.java similarity index 86% rename from core/src/main/java/net/momirealms/craftengine/core/util/context/parameter/PlayerParameters.java rename to core/src/main/java/net/momirealms/craftengine/core/plugin/context/parameter/PlayerParameters.java index 0604f864d..68d5fe9a5 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/util/context/parameter/PlayerParameters.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/parameter/PlayerParameters.java @@ -1,6 +1,6 @@ -package net.momirealms.craftengine.core.util.context.parameter; +package net.momirealms.craftengine.core.plugin.context.parameter; -import net.momirealms.craftengine.core.util.context.ContextKey; +import net.momirealms.craftengine.core.plugin.context.ContextKey; import java.util.UUID; diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/GuiParameters.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/GuiParameters.java index 283b42f9a..946cbf505 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/GuiParameters.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/GuiParameters.java @@ -1,6 +1,6 @@ package net.momirealms.craftengine.core.plugin.gui; -import net.momirealms.craftengine.core.util.context.ContextKey; +import net.momirealms.craftengine.core.plugin.context.ContextKey; public class GuiParameters { public static final ContextKey MAX_PAGE = ContextKey.of("max_page"); diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/category/ItemBrowserManagerImpl.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/category/ItemBrowserManagerImpl.java index 60dd2120f..b4669e24b 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/category/ItemBrowserManagerImpl.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/category/ItemBrowserManagerImpl.java @@ -9,6 +9,8 @@ import net.momirealms.craftengine.core.pack.LoadingSequence; import net.momirealms.craftengine.core.pack.Pack; import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.plugin.config.ConfigSectionParser; +import net.momirealms.craftengine.core.plugin.context.ContextHolder; +import net.momirealms.craftengine.core.plugin.context.PlayerOptionalContext; import net.momirealms.craftengine.core.plugin.gui.*; import net.momirealms.craftengine.core.plugin.gui.Ingredient; import net.momirealms.craftengine.core.registry.Holder; @@ -16,8 +18,6 @@ import net.momirealms.craftengine.core.util.AdventureHelper; 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.util.context.ContextHolder; -import net.momirealms.craftengine.core.util.context.PlayerOptionalContext; import java.nio.file.Path; import java.util.*; diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/MiniMessageTranslatorImpl.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/MiniMessageTranslatorImpl.java index d5da280c8..d096d47ca 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/MiniMessageTranslatorImpl.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/MiniMessageTranslatorImpl.java @@ -18,7 +18,7 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Stream; public class MiniMessageTranslatorImpl implements MiniMessageTranslator { - private static final Key NAME = Key.key("craftengine", "main"); + private static final Key NAME = Key.key(net.momirealms.craftengine.core.util.Key.DEFAULT_NAMESPACE, "main"); static final MiniMessageTranslatorImpl INSTANCE = new MiniMessageTranslatorImpl(); final TranslatableComponentRenderer renderer = TranslatableComponentRenderer.usingTranslationSource(this); private final Set sources = Collections.newSetFromMap(new ConcurrentHashMap<>()); diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/TranslationManagerImpl.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/TranslationManagerImpl.java index 1d540278e..dbbcdd70c 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/TranslationManagerImpl.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/TranslationManagerImpl.java @@ -93,7 +93,7 @@ public class TranslationManagerImpl implements TranslationManager { this.plugin.saveResource("translations/" + lang + ".yml"); } - this.registry = MiniMessageTranslationRegistry.create(Key.key("craftengine", "main"), AdventureHelper.miniMessage()); + this.registry = MiniMessageTranslationRegistry.create(Key.key(net.momirealms.craftengine.core.util.Key.DEFAULT_NAMESPACE, "main"), AdventureHelper.miniMessage()); this.registry.defaultLocale(DEFAULT_LOCALE); this.loadFromFileSystem(this.translationsDirectory, false); MiniMessageTranslator.translator().addSource(this.registry); diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/I18NTag.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/I18NTag.java index 2887e7338..920796809 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/I18NTag.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/I18NTag.java @@ -1,24 +1,24 @@ package net.momirealms.craftengine.core.plugin.text.minimessage; -import net.kyori.adventure.text.minimessage.Context; import net.kyori.adventure.text.minimessage.ParsingException; import net.kyori.adventure.text.minimessage.tag.Tag; import net.kyori.adventure.text.minimessage.tag.resolver.ArgumentQueue; import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; +import net.momirealms.craftengine.core.plugin.context.Context; import net.momirealms.craftengine.core.plugin.locale.TranslationManager; import net.momirealms.craftengine.core.util.AdventureHelper; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; public class I18NTag implements TagResolver { - private final MiniMessageTagContext context; + private final Context context; - public I18NTag(MiniMessageTagContext context) { + public I18NTag(Context context) { this.context = context; } @Override - public @Nullable Tag resolve(@NotNull String name, @NotNull ArgumentQueue arguments, @NotNull Context ctx) throws ParsingException { + public @Nullable Tag resolve(@NotNull String name, @NotNull ArgumentQueue arguments, @NotNull net.kyori.adventure.text.minimessage.Context ctx) throws ParsingException { if (!this.has(name)) { return null; } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/MiniMessageTagContext.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/MiniMessageTagContext.java deleted file mode 100644 index 17234aae0..000000000 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/MiniMessageTagContext.java +++ /dev/null @@ -1,9 +0,0 @@ -package net.momirealms.craftengine.core.plugin.text.minimessage; - -import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; -import net.momirealms.craftengine.core.util.context.Context; - -public interface MiniMessageTagContext extends Context { - - TagResolver[] tagResolvers(); -} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/NamedArgumentTag.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/NamedArgumentTag.java index 548484c28..c59067f59 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/NamedArgumentTag.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/NamedArgumentTag.java @@ -1,13 +1,13 @@ package net.momirealms.craftengine.core.plugin.text.minimessage; -import net.kyori.adventure.text.minimessage.Context; import net.kyori.adventure.text.minimessage.ParsingException; import net.kyori.adventure.text.minimessage.tag.Tag; import net.kyori.adventure.text.minimessage.tag.resolver.ArgumentQueue; import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; +import net.momirealms.craftengine.core.plugin.context.Context; +import net.momirealms.craftengine.core.plugin.context.ContextKey; import net.momirealms.craftengine.core.util.AdventureHelper; import net.momirealms.craftengine.core.util.Key; -import net.momirealms.craftengine.core.util.context.ContextKey; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -18,19 +18,19 @@ public class NamedArgumentTag implements TagResolver { private static final String NAME_0 = "argument"; private static final String NAME_1 = "arg"; - private final MiniMessageTagContext context; + private final Context context; - public NamedArgumentTag(@NotNull MiniMessageTagContext context) { + public NamedArgumentTag(@NotNull Context context) { this.context = Objects.requireNonNull(context, "context holder"); } @Override - public @Nullable Tag resolve(@NotNull String name, @NotNull ArgumentQueue arguments, @NotNull Context ctx) throws ParsingException { + public @Nullable Tag resolve(@NotNull String name, @NotNull ArgumentQueue arguments, @NotNull net.kyori.adventure.text.minimessage.Context ctx) throws ParsingException { if (!has(name)) { return null; } String argumentKey = arguments.popOr("No argument key provided").toString(); - ContextKey key = ContextKey.of(Key.withDefaultNamespace(argumentKey, "craftengine")); + ContextKey key = ContextKey.of(Key.withDefaultNamespace(argumentKey, Key.DEFAULT_NAMESPACE)); Optional optional = this.context.getOptionalParameter(key); if (optional.isEmpty()) { throw ctx.newException("Invalid argument key", arguments); diff --git a/core/src/main/java/net/momirealms/craftengine/core/registry/BuiltInRegistries.java b/core/src/main/java/net/momirealms/craftengine/core/registry/BuiltInRegistries.java index e3333d608..78f295dd7 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/registry/BuiltInRegistries.java +++ b/core/src/main/java/net/momirealms/craftengine/core/registry/BuiltInRegistries.java @@ -7,11 +7,10 @@ import net.momirealms.craftengine.core.entity.furniture.HitBoxFactory; import net.momirealms.craftengine.core.item.behavior.ItemBehaviorFactory; import net.momirealms.craftengine.core.item.recipe.CustomSmithingTransformRecipe; import net.momirealms.craftengine.core.item.recipe.RecipeFactory; -import net.momirealms.craftengine.core.loot.condition.LootConditionFactory; +import net.momirealms.craftengine.core.loot.LootContext; import net.momirealms.craftengine.core.loot.entry.LootEntryContainerFactory; import net.momirealms.craftengine.core.loot.function.LootFunctionApplyBonusCount; import net.momirealms.craftengine.core.loot.function.LootFunctionFactory; -import net.momirealms.craftengine.core.loot.number.NumberProviderFactory; import net.momirealms.craftengine.core.pack.conflict.matcher.PathMatcherFactory; import net.momirealms.craftengine.core.pack.conflict.resolution.ResolutionFactory; import net.momirealms.craftengine.core.pack.host.ResourcePackHostFactory; @@ -22,6 +21,9 @@ import net.momirealms.craftengine.core.pack.model.select.SelectPropertyFactory; import net.momirealms.craftengine.core.pack.model.special.SpecialModelFactory; import net.momirealms.craftengine.core.pack.model.tint.TintFactory; import net.momirealms.craftengine.core.plugin.config.template.TemplateArgumentFactory; +import net.momirealms.craftengine.core.plugin.context.Condition; +import net.momirealms.craftengine.core.plugin.context.number.NumberProviderFactory; +import net.momirealms.craftengine.core.util.Factory; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.ResourceKey; @@ -31,7 +33,7 @@ public class BuiltInRegistries { public static final Registry PROPERTY_FACTORY = createRegistry(Registries.PROPERTY_FACTORY); public static final Registry BLOCK_BEHAVIOR_FACTORY = createRegistry(Registries.BLOCK_BEHAVIOR_FACTORY); public static final Registry> LOOT_FUNCTION_FACTORY = createRegistry(Registries.LOOT_FUNCTION_FACTORY); - public static final Registry LOOT_CONDITION_FACTORY = createRegistry(Registries.LOOT_CONDITION_FACTORY); + public static final Registry>> LOOT_CONDITION_FACTORY = createRegistry(Registries.LOOT_CONDITION_FACTORY); public static final Registry> LOOT_ENTRY_CONTAINER_FACTORY = createRegistry(Registries.LOOT_ENTRY_CONTAINER_FACTORY); public static final Registry NUMBER_PROVIDER_FACTORY = createRegistry(Registries.NUMBER_PROVIDER_FACTORY); public static final Registry ITEM_BEHAVIOR_FACTORY = createRegistry(Registries.ITEM_BEHAVIOR_FACTORY); diff --git a/core/src/main/java/net/momirealms/craftengine/core/registry/Registries.java b/core/src/main/java/net/momirealms/craftengine/core/registry/Registries.java index 0071569c5..06225b41c 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/registry/Registries.java +++ b/core/src/main/java/net/momirealms/craftengine/core/registry/Registries.java @@ -7,11 +7,10 @@ import net.momirealms.craftengine.core.entity.furniture.HitBoxFactory; import net.momirealms.craftengine.core.item.behavior.ItemBehaviorFactory; import net.momirealms.craftengine.core.item.recipe.CustomSmithingTransformRecipe; import net.momirealms.craftengine.core.item.recipe.RecipeFactory; -import net.momirealms.craftengine.core.loot.condition.LootConditionFactory; +import net.momirealms.craftengine.core.loot.LootContext; import net.momirealms.craftengine.core.loot.entry.LootEntryContainerFactory; import net.momirealms.craftengine.core.loot.function.LootFunctionApplyBonusCount; import net.momirealms.craftengine.core.loot.function.LootFunctionFactory; -import net.momirealms.craftengine.core.loot.number.NumberProviderFactory; import net.momirealms.craftengine.core.pack.conflict.matcher.PathMatcherFactory; import net.momirealms.craftengine.core.pack.conflict.resolution.ResolutionFactory; import net.momirealms.craftengine.core.pack.host.ResourcePackHostFactory; @@ -22,6 +21,9 @@ import net.momirealms.craftengine.core.pack.model.select.SelectPropertyFactory; import net.momirealms.craftengine.core.pack.model.special.SpecialModelFactory; import net.momirealms.craftengine.core.pack.model.tint.TintFactory; import net.momirealms.craftengine.core.plugin.config.template.TemplateArgumentFactory; +import net.momirealms.craftengine.core.plugin.context.Condition; +import net.momirealms.craftengine.core.plugin.context.number.NumberProviderFactory; +import net.momirealms.craftengine.core.util.Factory; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.ResourceKey; @@ -34,7 +36,7 @@ public class Registries { public static final ResourceKey> ITEM_BEHAVIOR_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("item_behavior_factory")); public static final ResourceKey>> LOOT_FUNCTION_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("loot_function_factory")); public static final ResourceKey>> LOOT_ENTRY_CONTAINER_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("loot_entry_container_factory")); - public static final ResourceKey> LOOT_CONDITION_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("loot_condition_factory")); + public static final ResourceKey>>> LOOT_CONDITION_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("loot_condition_factory")); public static final ResourceKey> NUMBER_PROVIDER_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("number_provider_factory")); public static final ResourceKey> TEMPLATE_ARGUMENT_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("template_argument_factory")); public static final ResourceKey> ITEM_MODEL_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("item_model_factory")); diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/Factory.java b/core/src/main/java/net/momirealms/craftengine/core/util/Factory.java new file mode 100644 index 000000000..ec3e37b2f --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/Factory.java @@ -0,0 +1,8 @@ +package net.momirealms.craftengine.core.util; + +import java.util.Map; + +public interface Factory { + + T create(Map args); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/Key.java b/core/src/main/java/net/momirealms/craftengine/core/util/Key.java index f536fa5ba..c769b1738 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/util/Key.java +++ b/core/src/main/java/net/momirealms/craftengine/core/util/Key.java @@ -1,7 +1,6 @@ package net.momirealms.craftengine.core.util; public record Key(String namespace, String value) { - public static final String DEFAULT_NAMESPACE = "craftengine"; public static Key withDefaultNamespace(String value) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/condition/AllOfCondition.java b/core/src/main/java/net/momirealms/craftengine/core/util/condition/AllOfCondition.java deleted file mode 100644 index 3abcf3ef1..000000000 --- a/core/src/main/java/net/momirealms/craftengine/core/util/condition/AllOfCondition.java +++ /dev/null @@ -1,29 +0,0 @@ -package net.momirealms.craftengine.core.util.condition; - -import net.momirealms.craftengine.core.util.Key; -import net.momirealms.craftengine.core.util.context.Condition; - -import java.util.List; - -public abstract class AllOfCondition implements Condition { - protected final List> conditions; - - public AllOfCondition(List> conditions) { - this.conditions = conditions; - } - - @Override - public boolean test(CTX ctx) { - for (Condition condition : conditions) { - if (!condition.test(ctx)) { - return false; - } - } - return true; - } - - @Override - public Key type() { - return CommonConditions.ALL_OF; - } -} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/condition/AnyOfCondition.java b/core/src/main/java/net/momirealms/craftengine/core/util/condition/AnyOfCondition.java deleted file mode 100644 index b9803a62b..000000000 --- a/core/src/main/java/net/momirealms/craftengine/core/util/condition/AnyOfCondition.java +++ /dev/null @@ -1,29 +0,0 @@ -package net.momirealms.craftengine.core.util.condition; - -import net.momirealms.craftengine.core.util.Key; -import net.momirealms.craftengine.core.util.context.Condition; - -import java.util.List; - -public abstract class AnyOfCondition implements Condition { - protected final List> conditions; - - public AnyOfCondition(List> conditions) { - this.conditions = conditions; - } - - @Override - public boolean test(CTX ctx) { - for (Condition condition : conditions) { - if (condition.test(ctx)) { - return true; - } - } - return false; - } - - @Override - public Key type() { - return CommonConditions.ANY_OF; - } -} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/condition/CommonConditions.java b/core/src/main/java/net/momirealms/craftengine/core/util/condition/CommonConditions.java deleted file mode 100644 index 017c51d11..000000000 --- a/core/src/main/java/net/momirealms/craftengine/core/util/condition/CommonConditions.java +++ /dev/null @@ -1,11 +0,0 @@ -package net.momirealms.craftengine.core.util.condition; - -import net.momirealms.craftengine.core.util.Key; - -public final class CommonConditions { - private CommonConditions() {} - - 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 INVERTED = Key.of("craftengine:inverted"); -} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/condition/InvertedCondition.java b/core/src/main/java/net/momirealms/craftengine/core/util/condition/InvertedCondition.java deleted file mode 100644 index 7c2304344..000000000 --- a/core/src/main/java/net/momirealms/craftengine/core/util/condition/InvertedCondition.java +++ /dev/null @@ -1,22 +0,0 @@ -package net.momirealms.craftengine.core.util.condition; - -import net.momirealms.craftengine.core.util.Key; -import net.momirealms.craftengine.core.util.context.Condition; - -public abstract class InvertedCondition implements Condition { - protected final Condition condition; - - public InvertedCondition(Condition condition) { - this.condition = condition; - } - - @Override - public boolean test(CTX ctx) { - return !this.condition.test(ctx); - } - - @Override - public Key type() { - return CommonConditions.INVERTED; - } -} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/context/parameter/CommonParameters.java b/core/src/main/java/net/momirealms/craftengine/core/util/context/parameter/CommonParameters.java deleted file mode 100644 index 07ac2885c..000000000 --- a/core/src/main/java/net/momirealms/craftengine/core/util/context/parameter/CommonParameters.java +++ /dev/null @@ -1,10 +0,0 @@ -package net.momirealms.craftengine.core.util.context.parameter; - -import net.momirealms.craftengine.core.util.context.ContextKey; - -public final class CommonParameters { - private CommonParameters() {} - - public static final ContextKey RANDOM = ContextKey.of("random"); - public static final ContextKey LAST_RANDOM = ContextKey.of("last_random"); -} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/os/Architecture.java b/core/src/main/java/net/momirealms/craftengine/core/util/os/Architecture.java deleted file mode 100644 index ab97a1da9..000000000 --- a/core/src/main/java/net/momirealms/craftengine/core/util/os/Architecture.java +++ /dev/null @@ -1,49 +0,0 @@ -package net.momirealms.craftengine.core.util.os; - -import java.util.Locale; - -public enum Architecture { - X64(true), - X86(false), - ARM64(true), - ARM32(false), - PPC64LE(true), - RISCV64(true); - - static final Architecture current; - final boolean is64Bit; - - Architecture(boolean is64Bit) { - this.is64Bit = is64Bit; - } - - public String getNativePath() { - return name().toLowerCase(Locale.ENGLISH); - } - - public static Architecture get() { - return current; - } - - static { - String osArch = System.getProperty("os.arch"); - boolean is64Bit = osArch.contains("64") || osArch.startsWith("armv8"); - if (!osArch.startsWith("arm") && !osArch.startsWith("aarch")) { - if (osArch.startsWith("ppc")) { - if (!"ppc64le".equals(osArch)) { - throw new UnsupportedOperationException("Only PowerPC 64 LE is supported."); - } - current = PPC64LE; - } else if (osArch.startsWith("riscv")) { - if (!"riscv64".equals(osArch)) { - throw new UnsupportedOperationException("Only RISC-V 64 is supported."); - } - current = RISCV64; - } else { - current = is64Bit ? X64 : X86; - } - } else { - current = is64Bit ? ARM64 : ARM32; - } - } -} \ No newline at end of file diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/os/Platform.java b/core/src/main/java/net/momirealms/craftengine/core/util/os/Platform.java deleted file mode 100644 index fd864193d..000000000 --- a/core/src/main/java/net/momirealms/craftengine/core/util/os/Platform.java +++ /dev/null @@ -1,45 +0,0 @@ -package net.momirealms.craftengine.core.util.os; - -public enum Platform { - FREEBSD("FreeBSD", "freebsd"), - LINUX("Linux", "linux"), - MACOS("macOS", "macos"), - WINDOWS("Windows", "windows"); - - private static final Platform current; - private final String name; - private final String nativePath; - - Platform(String name, String nativePath) { - this.name = name; - this.nativePath = nativePath; - } - - public String getName() { - return this.name; - } - - public String getNativePath() { - return nativePath; - } - - public static Platform get() { - return current; - } - - static { - String osName = System.getProperty("os.name"); - if (osName.startsWith("Windows")) { - current = WINDOWS; - } else if (osName.startsWith("FreeBSD")) { - current = FREEBSD; - } else if (!osName.startsWith("Linux") && !osName.startsWith("SunOS") && !osName.startsWith("Unix")) { - if (!osName.startsWith("Mac OS X") && !osName.startsWith("Darwin")) { - throw new LinkageError("Unknown platform: " + osName); - } - current = MACOS; - } else { - current = LINUX; - } - } -} From 25630d47759d6927431b1993a1a568ccff01c677 Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Sun, 4 May 2025 02:46:21 +0800 Subject: [PATCH 23/51] =?UTF-8?q?=E4=BD=BF=E7=94=A8=E6=9B=B4=E5=A5=BD?= =?UTF-8?q?=E7=9A=84=E6=9D=A1=E4=BB=B6=E7=B3=BB=E7=BB=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pack/conflict/matcher/PathMatcher.java | 7 ---- .../conflict/matcher/PathMatcherAllOf.java | 36 ----------------- .../conflict/matcher/PathMatcherAnyOf.java | 36 ----------------- .../conflict/matcher/PathMatcherContains.java | 9 +++-- .../conflict/matcher/PathMatcherExact.java | 9 +++-- .../conflict/matcher/PathMatcherFactory.java | 9 ----- .../conflict/matcher/PathMatcherFilename.java | 9 +++-- .../conflict/matcher/PathMatcherInverted.java | 27 ------------- .../matcher/PathMatcherParentPrefix.java | 9 +++-- .../matcher/PathMatcherParentSuffix.java | 9 +++-- .../pack/conflict/matcher/PathMatchers.java | 40 ++++++++++--------- .../conflict/matcher/PathPatternMatcher.java | 9 +++-- .../resolution/ResolutionConditional.java | 4 +- .../resolution/RetainMatchingResolution.java | 6 +-- .../context/number/FixedNumberProvider.java | 4 +- .../plugin/context/number/NumberProvider.java | 6 +-- .../context/number/NumberProviders.java | 19 ++++++++- .../context/number/UniformNumberProvider.java | 18 ++++++--- .../core/registry/BuiltInRegistries.java | 4 +- .../craftengine/core/registry/Registries.java | 4 +- .../DelayedDefaultRegionFileStorage.java | 1 + 21 files changed, 97 insertions(+), 178 deletions(-) delete mode 100644 core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcher.java delete mode 100644 core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherAllOf.java delete mode 100644 core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherAnyOf.java delete mode 100644 core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherFactory.java delete mode 100644 core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherInverted.java diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcher.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcher.java deleted file mode 100644 index b00efefef..000000000 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcher.java +++ /dev/null @@ -1,7 +0,0 @@ -package net.momirealms.craftengine.core.pack.conflict.matcher; - -import net.momirealms.craftengine.core.pack.conflict.PathContext; -import net.momirealms.craftengine.core.plugin.context.Condition; - -public interface PathMatcher extends Condition { -} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherAllOf.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherAllOf.java deleted file mode 100644 index 7ed47270b..000000000 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherAllOf.java +++ /dev/null @@ -1,36 +0,0 @@ -package net.momirealms.craftengine.core.pack.conflict.matcher; - -import net.momirealms.craftengine.core.pack.conflict.PathContext; -import net.momirealms.craftengine.core.plugin.context.Condition; -import net.momirealms.craftengine.core.plugin.context.condition.AllOfCondition; -import net.momirealms.craftengine.core.plugin.locale.LocalizedException; -import net.momirealms.craftengine.core.util.MiscUtils; - -import java.util.List; -import java.util.Map; - -public class PathMatcherAllOf extends AllOfCondition implements PathMatcher { - public static final Factory FACTORY = new Factory(); - - public PathMatcherAllOf(List> conditions) { - super(conditions); - } - - public static class Factory implements PathMatcherFactory { - - @SuppressWarnings("unchecked") - @Override - public PathMatcher create(Map arguments) { - Object termsObj = arguments.get("terms"); - if (termsObj instanceof List list) { - List> terms = (List>) list; - return new PathMatcherAllOf(PathMatchers.fromMapList(terms)); - } else if (termsObj instanceof Map) { - Map terms = MiscUtils.castToMap(termsObj, false); - return new PathMatcherAllOf(PathMatchers.fromMapList(List.of(terms))); - } else { - throw new LocalizedException("warning.config.conflict_matcher.all_of.missing_terms"); - } - } - } -} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherAnyOf.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherAnyOf.java deleted file mode 100644 index 027d8f1b6..000000000 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherAnyOf.java +++ /dev/null @@ -1,36 +0,0 @@ -package net.momirealms.craftengine.core.pack.conflict.matcher; - -import net.momirealms.craftengine.core.pack.conflict.PathContext; -import net.momirealms.craftengine.core.plugin.context.Condition; -import net.momirealms.craftengine.core.plugin.context.condition.AnyOfCondition; -import net.momirealms.craftengine.core.plugin.locale.LocalizedException; -import net.momirealms.craftengine.core.util.MiscUtils; - -import java.util.List; -import java.util.Map; - -public class PathMatcherAnyOf extends AnyOfCondition implements PathMatcher { - public static final Factory FACTORY = new Factory(); - - public PathMatcherAnyOf(List> conditions) { - super(conditions); - } - - public static class Factory implements PathMatcherFactory { - - @SuppressWarnings("unchecked") - @Override - public PathMatcher create(Map arguments) { - Object termsObj = arguments.get("terms"); - if (termsObj instanceof List list) { - List> terms = (List>) list; - return new PathMatcherAnyOf(PathMatchers.fromMapList(terms)); - } else if (termsObj instanceof Map) { - Map terms = MiscUtils.castToMap(termsObj, false); - return new PathMatcherAnyOf(PathMatchers.fromMapList(List.of(terms))); - } else { - throw new LocalizedException("warning.config.conflict_matcher.any_of.missing_terms"); - } - } - } -} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherContains.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherContains.java index 77ee9f683..fba21b9e2 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherContains.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherContains.java @@ -1,14 +1,15 @@ package net.momirealms.craftengine.core.pack.conflict.matcher; import net.momirealms.craftengine.core.pack.conflict.PathContext; +import net.momirealms.craftengine.core.plugin.context.Condition; import net.momirealms.craftengine.core.plugin.locale.LocalizedException; +import net.momirealms.craftengine.core.util.Factory; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.ResourceConfigUtils; import java.util.Map; -public class PathMatcherContains implements PathMatcher { - public static final Factory FACTORY = new Factory(); +public class PathMatcherContains implements Condition { private final String path; public PathMatcherContains(String path) { @@ -26,10 +27,10 @@ public class PathMatcherContains implements PathMatcher { return PathMatchers.CONTAINS; } - public static class Factory implements PathMatcherFactory { + public static class FactoryImpl implements Factory> { @Override - public PathMatcher create(Map arguments) { + public Condition create(Map arguments) { String path = ResourceConfigUtils.requireNonEmptyStringOrThrow(arguments.get("path"), () -> new LocalizedException("warning.config.conflict_matcher.contains.missing_path")); return new PathMatcherContains(path); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherExact.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherExact.java index 7864822fa..e632d562a 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherExact.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherExact.java @@ -1,14 +1,15 @@ package net.momirealms.craftengine.core.pack.conflict.matcher; import net.momirealms.craftengine.core.pack.conflict.PathContext; +import net.momirealms.craftengine.core.plugin.context.Condition; import net.momirealms.craftengine.core.plugin.locale.LocalizedException; +import net.momirealms.craftengine.core.util.Factory; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.ResourceConfigUtils; import java.util.Map; -public class PathMatcherExact implements PathMatcher { - public static final Factory FACTORY = new Factory(); +public class PathMatcherExact implements Condition { private final String path; public PathMatcherExact(String path) { @@ -26,10 +27,10 @@ public class PathMatcherExact implements PathMatcher { return PathMatchers.EXACT; } - public static class Factory implements PathMatcherFactory { + public static class FactoryImpl implements Factory> { @Override - public PathMatcher create(Map arguments) { + public Condition create(Map arguments) { String path = ResourceConfigUtils.requireNonEmptyStringOrThrow(arguments.get("path"), () -> new LocalizedException("warning.config.conflict_matcher.exact.missing_path")); return new PathMatcherExact(path); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherFactory.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherFactory.java deleted file mode 100644 index b4817c9ad..000000000 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherFactory.java +++ /dev/null @@ -1,9 +0,0 @@ -package net.momirealms.craftengine.core.pack.conflict.matcher; - -import java.util.Map; - -@FunctionalInterface -public interface PathMatcherFactory { - - PathMatcher create(Map arguments); -} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherFilename.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherFilename.java index 3a33b6442..a2e861d56 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherFilename.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherFilename.java @@ -1,14 +1,15 @@ package net.momirealms.craftengine.core.pack.conflict.matcher; import net.momirealms.craftengine.core.pack.conflict.PathContext; +import net.momirealms.craftengine.core.plugin.context.Condition; import net.momirealms.craftengine.core.plugin.locale.LocalizedException; +import net.momirealms.craftengine.core.util.Factory; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.ResourceConfigUtils; import java.util.Map; -public class PathMatcherFilename implements PathMatcher { - public static final Factory FACTORY = new Factory(); +public class PathMatcherFilename implements Condition { private final String name; public PathMatcherFilename(String name) { @@ -26,10 +27,10 @@ public class PathMatcherFilename implements PathMatcher { return PathMatchers.FILENAME; } - public static class Factory implements PathMatcherFactory { + public static class FactoryImpl implements Factory> { @Override - public PathMatcher create(Map arguments) { + public Condition create(Map arguments) { String name = ResourceConfigUtils.requireNonEmptyStringOrThrow(arguments.get("name"), () -> new LocalizedException("warning.config.conflict_matcher.filename.missing_name")); return new PathMatcherFilename(name); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherInverted.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherInverted.java deleted file mode 100644 index 8a7b47e7f..000000000 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherInverted.java +++ /dev/null @@ -1,27 +0,0 @@ -package net.momirealms.craftengine.core.pack.conflict.matcher; - -import net.momirealms.craftengine.core.pack.conflict.PathContext; -import net.momirealms.craftengine.core.plugin.context.condition.InvertedCondition; -import net.momirealms.craftengine.core.plugin.locale.LocalizedException; -import net.momirealms.craftengine.core.util.MiscUtils; -import net.momirealms.craftengine.core.util.ResourceConfigUtils; - -import java.util.Map; - -public class PathMatcherInverted extends InvertedCondition implements PathMatcher { - public static final Factory FACTORY = new Factory(); - - public PathMatcherInverted(PathMatcher condition) { - super(condition); - } - - public static class Factory implements PathMatcherFactory { - - @Override - public PathMatcher create(Map arguments) { - Object inverted = ResourceConfigUtils.requireNonNullOrThrow(arguments.get("term"), () -> new LocalizedException("warning.config.conflict_matcher.inverted.missing_term")); - Map term = MiscUtils.castToMap(inverted, false); - return new PathMatcherInverted(PathMatchers.fromMap(term)); - } - } -} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherParentPrefix.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherParentPrefix.java index fb3bbafa7..df4b639c6 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherParentPrefix.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherParentPrefix.java @@ -1,15 +1,16 @@ package net.momirealms.craftengine.core.pack.conflict.matcher; import net.momirealms.craftengine.core.pack.conflict.PathContext; +import net.momirealms.craftengine.core.plugin.context.Condition; import net.momirealms.craftengine.core.plugin.locale.LocalizedException; +import net.momirealms.craftengine.core.util.Factory; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.ResourceConfigUtils; import java.nio.file.Path; import java.util.Map; -public class PathMatcherParentPrefix implements PathMatcher { - public static final Factory FACTORY = new Factory(); +public class PathMatcherParentPrefix implements Condition { private final String prefix; public PathMatcherParentPrefix(String prefix) { @@ -29,10 +30,10 @@ public class PathMatcherParentPrefix implements PathMatcher { return PathMatchers.PARENT_PATH_PREFIX; } - public static class Factory implements PathMatcherFactory { + public static class FactoryImpl implements Factory> { @Override - public PathMatcher create(Map arguments) { + public Condition create(Map arguments) { String prefix = ResourceConfigUtils.requireNonEmptyStringOrThrow(arguments.get("prefix"), () -> new LocalizedException("warning.config.conflict_matcher.parent_prefix.missing_prefix")); return new PathMatcherParentPrefix(prefix); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherParentSuffix.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherParentSuffix.java index 971cdd82b..c53ca69b6 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherParentSuffix.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherParentSuffix.java @@ -1,15 +1,16 @@ package net.momirealms.craftengine.core.pack.conflict.matcher; import net.momirealms.craftengine.core.pack.conflict.PathContext; +import net.momirealms.craftengine.core.plugin.context.Condition; import net.momirealms.craftengine.core.plugin.locale.LocalizedException; +import net.momirealms.craftengine.core.util.Factory; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.ResourceConfigUtils; import java.nio.file.Path; import java.util.Map; -public class PathMatcherParentSuffix implements PathMatcher { - public static final Factory FACTORY = new Factory(); +public class PathMatcherParentSuffix implements Condition { private final String suffix; public PathMatcherParentSuffix(String suffix) { @@ -29,10 +30,10 @@ public class PathMatcherParentSuffix implements PathMatcher { return PathMatchers.PARENT_PATH_SUFFIX; } - public static class Factory implements PathMatcherFactory { + public static class FactoryImpl implements Factory> { @Override - public PathMatcher create(Map arguments) { + public Condition create(Map arguments) { String suffix = ResourceConfigUtils.requireNonEmptyStringOrThrow(arguments.get("suffix"), () -> new LocalizedException("warning.config.conflict_matcher.parent_suffix.missing_suffix")); return new PathMatcherParentSuffix(suffix); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatchers.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatchers.java index c9ae0edb8..90dc0a83c 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatchers.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatchers.java @@ -1,10 +1,17 @@ package net.momirealms.craftengine.core.pack.conflict.matcher; +import net.momirealms.craftengine.core.pack.conflict.PathContext; +import net.momirealms.craftengine.core.plugin.context.Condition; +import net.momirealms.craftengine.core.plugin.context.condition.AllOfCondition; +import net.momirealms.craftengine.core.plugin.context.condition.AnyOfCondition; +import net.momirealms.craftengine.core.plugin.context.condition.InvertedCondition; +import net.momirealms.craftengine.core.plugin.context.condition.SharedConditions; import net.momirealms.craftengine.core.plugin.locale.LocalizedException; import net.momirealms.craftengine.core.registry.BuiltInRegistries; import net.momirealms.craftengine.core.registry.Holder; import net.momirealms.craftengine.core.registry.Registries; import net.momirealms.craftengine.core.registry.WritableRegistry; +import net.momirealms.craftengine.core.util.Factory; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.ResourceConfigUtils; import net.momirealms.craftengine.core.util.ResourceKey; @@ -20,39 +27,36 @@ public class PathMatchers { public static final Key PARENT_PATH_SUFFIX = Key.of("craftengine:parent_path_suffix"); public static final Key PARENT_PATH_PREFIX = Key.of("craftengine:parent_path_prefix"); public static final Key PATTERN = Key.of("craftengine:pattern"); - public static final Key ANY_OF = Key.of("craftengine:any_of"); - public static final Key ALL_OF = Key.of("craftengine:all_of"); - public static final Key INVERTED = Key.of("craftengine:inverted"); static { - register(PARENT_PATH_SUFFIX, PathMatcherParentSuffix.FACTORY); - register(PARENT_PATH_PREFIX, PathMatcherParentPrefix.FACTORY); - register(PATTERN, PathPatternMatcher.FACTORY); - register(EXACT, PathMatcherExact.FACTORY); - register(FILENAME, PathMatcherFilename.FACTORY); - register(ANY_OF, PathMatcherAnyOf.FACTORY); - register(ALL_OF, PathMatcherAllOf.FACTORY); - register(INVERTED, PathMatcherInverted.FACTORY); - register(CONTAINS, PathMatcherContains.FACTORY); + register(SharedConditions.ANY_OF, new AnyOfCondition.FactoryImpl<>(PathMatchers::fromMap)); + register(SharedConditions.ALL_OF, new AllOfCondition.FactoryImpl<>(PathMatchers::fromMap)); + register(SharedConditions.INVERTED, new InvertedCondition.FactoryImpl<>(PathMatchers::fromMap)); + register(PARENT_PATH_SUFFIX, new PathMatcherParentSuffix.FactoryImpl()); + register(PARENT_PATH_PREFIX, new PathMatcherParentPrefix.FactoryImpl()); + register(PATTERN, new PathPatternMatcher.FactoryImpl()); + register(EXACT, new PathMatcherExact.FactoryImpl()); + register(FILENAME, new PathMatcherFilename.FactoryImpl()); + register(CONTAINS, new PathMatcherContains.FactoryImpl()); } - public static void register(Key key, PathMatcherFactory factory) { - Holder.Reference holder = ((WritableRegistry) BuiltInRegistries.PATH_MATCHER_FACTORY).registerForHolder(new ResourceKey<>(Registries.PATH_MATCHER_FACTORY.location(), key)); + public static void register(Key key, Factory> factory) { + Holder.Reference>> holder = ((WritableRegistry>>) BuiltInRegistries.PATH_MATCHER_FACTORY).registerForHolder(new ResourceKey<>(Registries.PATH_MATCHER_FACTORY.location(), key)); holder.bindValue(factory); } - public static List fromMapList(List> arguments) { - List matchers = new ArrayList<>(); + public static List> fromMapList(List> arguments) { + List> matchers = new ArrayList<>(); for (Map term : arguments) { matchers.add(PathMatchers.fromMap(term)); } return matchers; } - public static PathMatcher fromMap(Map map) { + public static Condition fromMap(Map map) { String type = ResourceConfigUtils.requireNonEmptyStringOrThrow(map.get("type"), () -> new LocalizedException("warning.config.conflict_matcher.missing_type")); Key key = Key.withDefaultNamespace(type, Key.DEFAULT_NAMESPACE); - PathMatcherFactory factory = BuiltInRegistries.PATH_MATCHER_FACTORY.getValue(key); + Factory> factory = BuiltInRegistries.PATH_MATCHER_FACTORY.getValue(key); if (factory == null) { throw new LocalizedException("warning.config.conflict_matcher.invalid_type", type); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathPatternMatcher.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathPatternMatcher.java index 8d0fed1c8..9261bffc2 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathPatternMatcher.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathPatternMatcher.java @@ -1,15 +1,16 @@ package net.momirealms.craftengine.core.pack.conflict.matcher; import net.momirealms.craftengine.core.pack.conflict.PathContext; +import net.momirealms.craftengine.core.plugin.context.Condition; import net.momirealms.craftengine.core.plugin.locale.LocalizedException; +import net.momirealms.craftengine.core.util.Factory; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.ResourceConfigUtils; import java.util.Map; import java.util.regex.Pattern; -public class PathPatternMatcher implements PathMatcher { - public static final Factory FACTORY = new Factory(); +public class PathPatternMatcher implements Condition { private final Pattern pattern; public PathPatternMatcher(String pattern) { @@ -35,10 +36,10 @@ public class PathPatternMatcher implements PathMatcher { return pattern; } - public static class Factory implements PathMatcherFactory { + public static class FactoryImpl implements Factory> { @Override - public PathMatcher create(Map arguments) { + public Condition create(Map arguments) { String pattern = ResourceConfigUtils.requireNonEmptyStringOrThrow(arguments.get("pattern"), () -> new LocalizedException("warning.config.conflict_matcher.pattern.missing_pattern")); return new PathPatternMatcher(pattern); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/ResolutionConditional.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/ResolutionConditional.java index 0c79d0c23..4eb182943 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/ResolutionConditional.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/ResolutionConditional.java @@ -1,14 +1,14 @@ package net.momirealms.craftengine.core.pack.conflict.resolution; import net.momirealms.craftengine.core.pack.conflict.PathContext; -import net.momirealms.craftengine.core.pack.conflict.matcher.PathMatcher; import net.momirealms.craftengine.core.pack.conflict.matcher.PathMatchers; +import net.momirealms.craftengine.core.plugin.context.Condition; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.MiscUtils; import java.util.Map; -public record ResolutionConditional(PathMatcher matcher, Resolution resolution) implements Resolution { +public record ResolutionConditional(Condition matcher, Resolution resolution) implements Resolution { public static final Factory FACTORY = new Factory(); @Override diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/RetainMatchingResolution.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/RetainMatchingResolution.java index 3b20601d0..490e46671 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/RetainMatchingResolution.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/RetainMatchingResolution.java @@ -1,9 +1,9 @@ package net.momirealms.craftengine.core.pack.conflict.resolution; import net.momirealms.craftengine.core.pack.conflict.PathContext; -import net.momirealms.craftengine.core.pack.conflict.matcher.PathMatcher; import net.momirealms.craftengine.core.pack.conflict.matcher.PathMatchers; import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.plugin.context.Condition; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.MiscUtils; @@ -14,9 +14,9 @@ import java.util.Map; public class RetainMatchingResolution implements Resolution { public static final Factory FACTORY = new Factory(); - private final PathMatcher matcher; + private final Condition matcher; - public RetainMatchingResolution(PathMatcher matcher) { + public RetainMatchingResolution(Condition matcher) { this.matcher = matcher; } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/number/FixedNumberProvider.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/number/FixedNumberProvider.java index fcf8703bd..0e71e8332 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/number/FixedNumberProvider.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/number/FixedNumberProvider.java @@ -1,6 +1,6 @@ package net.momirealms.craftengine.core.plugin.context.number; -import net.momirealms.craftengine.core.loot.LootContext; +import net.momirealms.craftengine.core.plugin.context.Context; import net.momirealms.craftengine.core.util.Key; import java.util.Map; @@ -14,7 +14,7 @@ public class FixedNumberProvider implements NumberProvider { } @Override - public float getFloat(LootContext context) { + public float getFloat(Context context) { return this.value; } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/number/NumberProvider.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/number/NumberProvider.java index 3d23c3cd3..93cdd64a0 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/number/NumberProvider.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/number/NumberProvider.java @@ -1,13 +1,13 @@ package net.momirealms.craftengine.core.plugin.context.number; -import net.momirealms.craftengine.core.loot.LootContext; +import net.momirealms.craftengine.core.plugin.context.Context; import net.momirealms.craftengine.core.util.Key; public interface NumberProvider { - float getFloat(LootContext context); + float getFloat(Context context); - default int getInt(LootContext context) { + default int getInt(Context context) { return Math.round(this.getFloat(context)); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/number/NumberProviders.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/number/NumberProviders.java index 162e25bff..23552f78c 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/number/NumberProviders.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/number/NumberProviders.java @@ -8,6 +8,7 @@ import net.momirealms.craftengine.core.registry.WritableRegistry; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.ResourceConfigUtils; import net.momirealms.craftengine.core.util.ResourceKey; +import software.amazon.awssdk.services.s3.endpoints.internal.Value; import java.util.ArrayList; import java.util.List; @@ -55,7 +56,23 @@ public class NumberProviders { if (object instanceof Number number) { return new FixedNumberProvider(number.floatValue()); } else if (object instanceof String string) { - return new FixedNumberProvider(Float.parseFloat(string)); + if (string.contains("~")) { + int first = string.indexOf('~'); + int second = string.indexOf('~', first + 1); + if (second == -1) { + try { + float min = Float.parseFloat(string.substring(0, first)); + float max = Float.parseFloat(string.substring(first + 1)); + return new UniformNumberProvider(min, max); + } catch (NumberFormatException e) { + throw e; + } + } else { + throw new IllegalArgumentException("Illegal number format: " + string); + } + } else { + return new FixedNumberProvider(Float.parseFloat(string)); + } } else if (object instanceof Map map) { return fromMap((Map) map); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/number/UniformNumberProvider.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/number/UniformNumberProvider.java index aac5be744..d90880eb9 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/number/UniformNumberProvider.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/number/UniformNumberProvider.java @@ -1,7 +1,8 @@ package net.momirealms.craftengine.core.plugin.context.number; -import net.momirealms.craftengine.core.loot.LootContext; +import net.momirealms.craftengine.core.plugin.context.Context; import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.RandomUtils; import java.util.Map; @@ -15,14 +16,19 @@ public class UniformNumberProvider implements NumberProvider { this.max = max; } - @Override - public int getInt(LootContext context) { - return context.randomSource().nextInt(this.min.getInt(context), this.max.getInt(context) + 1); + public UniformNumberProvider(float min, float max) { + this.min = new FixedNumberProvider(min); + this.max = new FixedNumberProvider(max); } @Override - public float getFloat(LootContext context) { - return context.randomSource().nextFloat(this.min.getFloat(context), this.max.getFloat(context)); + public int getInt(Context context) { + return RandomUtils.generateRandomInt(this.min.getInt(context), this.max.getInt(context)); + } + + @Override + public float getFloat(Context context) { + return RandomUtils.generateRandomFloat(this.min.getFloat(context), this.max.getFloat(context)); } @Override diff --git a/core/src/main/java/net/momirealms/craftengine/core/registry/BuiltInRegistries.java b/core/src/main/java/net/momirealms/craftengine/core/registry/BuiltInRegistries.java index 78f295dd7..7a1a2a22a 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/registry/BuiltInRegistries.java +++ b/core/src/main/java/net/momirealms/craftengine/core/registry/BuiltInRegistries.java @@ -11,7 +11,7 @@ import net.momirealms.craftengine.core.loot.LootContext; import net.momirealms.craftengine.core.loot.entry.LootEntryContainerFactory; import net.momirealms.craftengine.core.loot.function.LootFunctionApplyBonusCount; import net.momirealms.craftengine.core.loot.function.LootFunctionFactory; -import net.momirealms.craftengine.core.pack.conflict.matcher.PathMatcherFactory; +import net.momirealms.craftengine.core.pack.conflict.PathContext; import net.momirealms.craftengine.core.pack.conflict.resolution.ResolutionFactory; import net.momirealms.craftengine.core.pack.host.ResourcePackHostFactory; import net.momirealms.craftengine.core.pack.model.ItemModelFactory; @@ -46,7 +46,7 @@ public class BuiltInRegistries { public static final Registry SELECT_PROPERTY_FACTORY = createRegistry(Registries.SELECT_PROPERTY_FACTORY); public static final Registry> RECIPE_FACTORY = createRegistry(Registries.RECIPE_FACTORY); public static final Registry FORMULA_FACTORY = createRegistry(Registries.FORMULA_FACTORY); - public static final Registry PATH_MATCHER_FACTORY = createRegistry(Registries.PATH_MATCHER_FACTORY); + public static final Registry>> PATH_MATCHER_FACTORY = createRegistry(Registries.PATH_MATCHER_FACTORY); public static final Registry RESOLUTION_FACTORY = createRegistry(Registries.RESOLUTION_FACTORY); public static final Registry SMITHING_RESULT_PROCESSOR_FACTORY = createRegistry(Registries.SMITHING_RESULT_PROCESSOR_FACTORY); public static final Registry HITBOX_FACTORY = createRegistry(Registries.HITBOX_FACTORY); diff --git a/core/src/main/java/net/momirealms/craftengine/core/registry/Registries.java b/core/src/main/java/net/momirealms/craftengine/core/registry/Registries.java index 06225b41c..3bad798af 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/registry/Registries.java +++ b/core/src/main/java/net/momirealms/craftengine/core/registry/Registries.java @@ -11,7 +11,7 @@ import net.momirealms.craftengine.core.loot.LootContext; import net.momirealms.craftengine.core.loot.entry.LootEntryContainerFactory; import net.momirealms.craftengine.core.loot.function.LootFunctionApplyBonusCount; import net.momirealms.craftengine.core.loot.function.LootFunctionFactory; -import net.momirealms.craftengine.core.pack.conflict.matcher.PathMatcherFactory; +import net.momirealms.craftengine.core.pack.conflict.PathContext; import net.momirealms.craftengine.core.pack.conflict.resolution.ResolutionFactory; import net.momirealms.craftengine.core.pack.host.ResourcePackHostFactory; import net.momirealms.craftengine.core.pack.model.ItemModelFactory; @@ -47,7 +47,7 @@ public class Registries { public static final ResourceKey> SELECT_PROPERTY_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("select_property_factory")); public static final ResourceKey>> RECIPE_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("recipe_factory")); public static final ResourceKey> FORMULA_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("formula_factory")); - public static final ResourceKey> PATH_MATCHER_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("path_matcher_factory")); + public static final ResourceKey>>> PATH_MATCHER_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("path_matcher_factory")); public static final ResourceKey> RESOLUTION_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("resolution_factory")); public static final ResourceKey> SMITHING_RESULT_PROCESSOR_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("smithing_result_processor_factory")); public static final ResourceKey> HITBOX_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("hitbox_factory")); diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/DelayedDefaultRegionFileStorage.java b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/DelayedDefaultRegionFileStorage.java index 04dceb3a0..49f580494 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/DelayedDefaultRegionFileStorage.java +++ b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/DelayedDefaultRegionFileStorage.java @@ -61,6 +61,7 @@ public class DelayedDefaultRegionFileStorage extends DefaultRegionFileStorage { public synchronized void close() throws IOException { this.saveCache(); super.close(); + this.chunkCache.cleanUp(); } private void saveCache() { From 11642aa1ad15322935b0166d8ae4bad2cd9482f8 Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Sun, 4 May 2025 03:17:15 +0800 Subject: [PATCH 24/51] =?UTF-8?q?=E9=9C=80=E8=A6=81=E6=97=B6=E6=89=8D?= =?UTF-8?q?=E5=8A=A0=E8=BD=BD=E9=83=A8=E5=88=86=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bukkit/build.gradle.kts | 2 +- bukkit/loader/build.gradle.kts | 2 +- .../main/resources/craft-engine.properties | 3 +- core/build.gradle.kts | 7 ++- .../core/pack/host/ResourcePackHosts.java | 2 +- .../core/pack/host/impl/S3HostFactory.java | 54 +++++++++++++++++++ .../craftengine/core/plugin/CraftEngine.java | 37 +------------ .../core/plugin/dependency/Dependencies.java | 8 +++ gradle.properties | 1 + 9 files changed, 76 insertions(+), 40 deletions(-) create mode 100644 core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/S3HostFactory.java diff --git a/bukkit/build.gradle.kts b/bukkit/build.gradle.kts index 92915efaf..607fff3b3 100644 --- a/bukkit/build.gradle.kts +++ b/bukkit/build.gradle.kts @@ -91,10 +91,10 @@ tasks { relocate("org.apache.commons.io", "net.momirealms.craftengine.libraries.commons.io") relocate("org.bstats", "net.momirealms.craftengine.libraries.bstats") relocate("com.github.benmanes.caffeine", "net.momirealms.craftengine.libraries.caffeine") - relocate("net.objecthunter.exp4j", "net.momirealms.craftengine.libraries.exp4j") relocate("net.bytebuddy", "net.momirealms.craftengine.libraries.bytebuddy") relocate("org.yaml.snakeyaml", "net.momirealms.craftengine.libraries.snakeyaml") relocate("org.ahocorasick", "net.momirealms.craftengine.libraries.ahocorasick") + relocate("com.ezylang.evalex", "net.momirealms.craftengine.libraries.evalex") } } diff --git a/bukkit/loader/build.gradle.kts b/bukkit/loader/build.gradle.kts index a373bbeff..dae694cd2 100644 --- a/bukkit/loader/build.gradle.kts +++ b/bukkit/loader/build.gradle.kts @@ -71,7 +71,7 @@ tasks { relocate("org.apache.commons.io", "net.momirealms.craftengine.libraries.commons.io") relocate("org.bstats", "net.momirealms.craftengine.libraries.bstats") relocate("com.github.benmanes.caffeine", "net.momirealms.craftengine.libraries.caffeine") - relocate("net.objecthunter.exp4j", "net.momirealms.craftengine.libraries.exp4j") + relocate("com.ezylang.evalex", "net.momirealms.craftengine.libraries.evalex") relocate("net.bytebuddy", "net.momirealms.craftengine.libraries.bytebuddy") relocate("org.yaml.snakeyaml", "net.momirealms.craftengine.libraries.snakeyaml") relocate("org.ahocorasick", "net.momirealms.craftengine.libraries.ahocorasick") diff --git a/bukkit/loader/src/main/resources/craft-engine.properties b/bukkit/loader/src/main/resources/craft-engine.properties index 5901f43dd..c94d83fa0 100644 --- a/bukkit/loader/src/main/resources/craft-engine.properties +++ b/bukkit/loader/src/main/resources/craft-engine.properties @@ -32,4 +32,5 @@ lz4=${lz4_version} netty-codec-http2=${netty_version} reactive-streams=${reactive_streams_version} amazon-sdk-s3=${amazon_awssdk_version} -amazon-sdk-eventstream=${amazon_awssdk_eventstream_version} \ No newline at end of file +amazon-sdk-eventstream=${amazon_awssdk_eventstream_version} +evalex=${evalex_version} \ No newline at end of file diff --git a/core/build.gradle.kts b/core/build.gradle.kts index 0ba9d3b0a..83e995a17 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -52,8 +52,12 @@ dependencies { // Aho-Corasick java implementation compileOnly("org.ahocorasick:ahocorasick:${rootProject.properties["ahocorasick_version"]}") // Amazon S3 - compileOnly("software.amazon.awssdk:s3:${rootProject.properties["amazon_awssdk_version"]}") + compileOnly("software.amazon.awssdk:s3:${rootProject.properties["amazon_awssdk_version"]}") { + + } compileOnly("software.amazon.awssdk:netty-nio-client:${rootProject.properties["amazon_awssdk_version"]}") + // EvalEx + compileOnly("com.ezylang:EvalEx:${rootProject.properties["evalex_version"]}") } java { @@ -85,6 +89,7 @@ tasks { relocate("net.jpountz", "net.momirealms.craftengine.libraries.jpountz") // lz4 relocate("software.amazon.awssdk", "net.momirealms.craftengine.libraries.awssdk") // awssdk relocate("software.amazon.eventstream", "net.momirealms.craftengine.libraries.eventstream") // awssdk + relocate("com.ezylang.evalex", "net.momirealms.craftengine.libraries.evalex") } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/host/ResourcePackHosts.java b/core/src/main/java/net/momirealms/craftengine/core/pack/host/ResourcePackHosts.java index ccf56c684..3c88658fd 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/host/ResourcePackHosts.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/host/ResourcePackHosts.java @@ -27,7 +27,7 @@ public class ResourcePackHosts { register(SELF, SelfHost.FACTORY); register(EXTERNAL, ExternalHost.FACTORY); register(LOBFILE, LobFileHost.FACTORY); - register(S3, S3Host.FACTORY); + register(S3, S3HostFactory.INSTANCE); register(ALIST, AlistHost.FACTORY); register(DROPBOX, DropboxHost.FACTORY); register(ONEDRIVE, OneDriveHost.FACTORY); diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/S3HostFactory.java b/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/S3HostFactory.java new file mode 100644 index 000000000..5de2fa3b0 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/S3HostFactory.java @@ -0,0 +1,54 @@ +package net.momirealms.craftengine.core.pack.host.impl; + +import net.momirealms.craftengine.core.pack.host.ResourcePackHost; +import net.momirealms.craftengine.core.pack.host.ResourcePackHostFactory; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.plugin.dependency.Dependencies; + +import java.util.List; +import java.util.Map; + +public class S3HostFactory implements ResourcePackHostFactory { + public static final S3HostFactory INSTANCE = new S3HostFactory(); + + @Override + public ResourcePackHost create(Map arguments) { + CraftEngine.instance().dependencyManager().loadDependencies( + List.of( + Dependencies.NETTY_HTTP, + Dependencies.NETTY_HTTP2, + Dependencies.REACTIVE_STREAMS, + Dependencies.AMAZON_AWSSDK_S3, + Dependencies.AMAZON_AWSSDK_NETTY_NIO_CLIENT, + Dependencies.AMAZON_AWSSDK_SDK_CORE, + Dependencies.AMAZON_AWSSDK_AUTH, + Dependencies.AMAZON_AWSSDK_REGIONS, + Dependencies.AMAZON_AWSSDK_IDENTITY_SPI, + Dependencies.AMAZON_AWSSDK_HTTP_CLIENT_SPI, + Dependencies.AMAZON_AWSSDK_PROTOCOL_CORE, + Dependencies.AMAZON_AWSSDK_AWS_XML_PROTOCOL, + Dependencies.AMAZON_AWSSDK_JSON_UTILS, + Dependencies.AMAZON_AWSSDK_AWS_CORE, + Dependencies.AMAZON_AWSSDK_UTILS, + Dependencies.AMAZON_AWSSDK_ANNOTATIONS, + Dependencies.AMAZON_AWSSDK_CRT_CORE, + Dependencies.AMAZON_AWSSDK_CHECKSUMS, + Dependencies.AMAZON_EVENTSTREAM, + Dependencies.AMAZON_AWSSDK_PROFILES, + Dependencies.AMAZON_AWSSDK_RETRIES, + Dependencies.AMAZON_AWSSDK_ENDPOINTS_SPI, + Dependencies.AMAZON_AWSSDK_ARNS, + Dependencies.AMAZON_AWSSDK_AWS_QUERY_PROTOCOL, + Dependencies.AMAZON_AWSSDK_HTTP_AUTH_AWS, + Dependencies.AMAZON_AWSSDK_HTTP_AUTH_SPI, + Dependencies.AMAZON_AWSSDK_HTTP_AUTH, + Dependencies.AMAZON_AWSSDK_HTTP_AUTH_AWS_EVENTSTREAM, + Dependencies.AMAZON_AWSSDK_CHECKSUMS_SPI, + Dependencies.AMAZON_AWSSDK_RETRIES_SPI, + Dependencies.AMAZON_AWSSDK_METRICS_SPI, + Dependencies.AMAZON_AWSSDK_THIRD_PARTY_JACKSON_CORE + ) + ); + return S3Host.FACTORY.create(arguments); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/CraftEngine.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/CraftEngine.java index af0e3fed0..83feda34f 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/CraftEngine.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/CraftEngine.java @@ -287,49 +287,16 @@ public abstract class CraftEngine implements Plugin { Dependencies.GEANTY_REF, Dependencies.CLOUD_CORE, Dependencies.CLOUD_SERVICES, Dependencies.GSON, - Dependencies.SLF4J_API, Dependencies.SLF4J_SIMPLE, Dependencies.COMMONS_IO, Dependencies.ZSTD, Dependencies.BYTE_BUDDY, Dependencies.SNAKE_YAML, Dependencies.BOOSTED_YAML, Dependencies.MINIMESSAGE, - Dependencies.TEXT_SERIALIZER_GSON, Dependencies.TEXT_SERIALIZER_GSON_LEGACY, - Dependencies.TEXT_SERIALIZER_JSON, + Dependencies.TEXT_SERIALIZER_GSON, Dependencies.TEXT_SERIALIZER_GSON_LEGACY, Dependencies.TEXT_SERIALIZER_JSON, Dependencies.AHO_CORASICK, Dependencies.LZ4, - Dependencies.NETTY_HTTP, - Dependencies.NETTY_HTTP2, - Dependencies.REACTIVE_STREAMS, - Dependencies.AMAZON_AWSSDK_S3, - Dependencies.AMAZON_AWSSDK_NETTY_NIO_CLIENT, - Dependencies.AMAZON_AWSSDK_SDK_CORE, - Dependencies.AMAZON_AWSSDK_AUTH, - Dependencies.AMAZON_AWSSDK_REGIONS, - Dependencies.AMAZON_AWSSDK_IDENTITY_SPI, - Dependencies.AMAZON_AWSSDK_HTTP_CLIENT_SPI, - Dependencies.AMAZON_AWSSDK_PROTOCOL_CORE, - Dependencies.AMAZON_AWSSDK_AWS_XML_PROTOCOL, - Dependencies.AMAZON_AWSSDK_JSON_UTILS, - Dependencies.AMAZON_AWSSDK_AWS_CORE, - Dependencies.AMAZON_AWSSDK_UTILS, - Dependencies.AMAZON_AWSSDK_ANNOTATIONS, - Dependencies.AMAZON_AWSSDK_CRT_CORE, - Dependencies.AMAZON_AWSSDK_CHECKSUMS, - Dependencies.AMAZON_EVENTSTREAM, - Dependencies.AMAZON_AWSSDK_PROFILES, - Dependencies.AMAZON_AWSSDK_RETRIES, - Dependencies.AMAZON_AWSSDK_ENDPOINTS_SPI, - Dependencies.AMAZON_AWSSDK_ARNS, - Dependencies.AMAZON_AWSSDK_AWS_QUERY_PROTOCOL, - Dependencies.AMAZON_AWSSDK_HTTP_AUTH_AWS, - Dependencies.AMAZON_AWSSDK_HTTP_AUTH_SPI, - Dependencies.AMAZON_AWSSDK_HTTP_AUTH, - Dependencies.AMAZON_AWSSDK_HTTP_AUTH_AWS_EVENTSTREAM, - Dependencies.AMAZON_AWSSDK_CHECKSUMS_SPI, - Dependencies.AMAZON_AWSSDK_RETRIES_SPI, - Dependencies.AMAZON_AWSSDK_METRICS_SPI, - Dependencies.AMAZON_AWSSDK_THIRD_PARTY_JACKSON_CORE + Dependencies.EVALEX ); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/dependency/Dependencies.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/dependency/Dependencies.java index 1859a2847..285430f15 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/dependency/Dependencies.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/dependency/Dependencies.java @@ -248,6 +248,14 @@ public class Dependencies { List.of(Relocation.of("jpountz", "net{}jpountz")) ); + public static final Dependency EVALEX = new Dependency( + "evalex", + "com{}ezylang", + "EvalEx", + "evalex", + List.of(Relocation.of("evalex", "com{}ezylang{}evalex")) + ); + public static final Dependency NETTY_HTTP = new Dependency( "netty-codec-http", "io{}netty", diff --git a/gradle.properties b/gradle.properties index 4783415e2..69b28ee28 100644 --- a/gradle.properties +++ b/gradle.properties @@ -51,6 +51,7 @@ ahocorasick_version=0.6.3 snake_yaml_version=2.4 anti_grief_version=0.15 nms_helper_version=0.64.5 +evalex_version=3.5.0 reactive_streams_version=1.0.4 amazon_awssdk_version=2.31.23 amazon_awssdk_eventstream_version=1.0.1 From 5e28d964be96820a60ee602356fd1d2f1bb5fd27 Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Sun, 4 May 2025 15:36:08 +0800 Subject: [PATCH 25/51] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dteam?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bukkit/plugin/network/PacketConsumers.java | 18 ++++++++++++++---- .../DelayedDefaultRegionFileStorage.java | 6 ++++-- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java index c8a427258..413ec486b 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java @@ -1,5 +1,6 @@ package net.momirealms.craftengine.bukkit.plugin.network; +import com.mojang.datafixers.util.Either; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import it.unimi.dsi.fastutil.ints.IntList; @@ -331,8 +332,17 @@ public class PacketConsumers { Tag displayName = buf.readNbt(false); if (displayName == null) return; byte friendlyFlags = buf.readByte(); - String nameTagVisibility = buf.readUtf(40); - String collisionRule = buf.readUtf(40); + + Either eitherVisibility; + Either eitherCollisionRule; + + if (VersionHelper.isOrAbove1_21_5()) { + eitherVisibility = Either.right(buf.readVarInt()); + eitherCollisionRule = Either.right(buf.readVarInt()); + } else { + eitherVisibility = Either.left(buf.readUtf(40)); + eitherCollisionRule = Either.left(buf.readUtf(40)); + } int color = buf.readVarInt(); Tag prefix = buf.readNbt(false); if (prefix == null) return; @@ -368,8 +378,8 @@ public class PacketConsumers { } buf.writeByte(friendlyFlags); - buf.writeUtf(nameTagVisibility); - buf.writeUtf(collisionRule); + eitherVisibility.ifLeft(buf::writeUtf).ifRight(buf::writeVarInt); + eitherCollisionRule.ifLeft(buf::writeUtf).ifRight(buf::writeVarInt); buf.writeVarInt(color); if (!tokens2.isEmpty()) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/DelayedDefaultRegionFileStorage.java b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/DelayedDefaultRegionFileStorage.java index 49f580494..1df369736 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/DelayedDefaultRegionFileStorage.java +++ b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/DelayedDefaultRegionFileStorage.java @@ -15,13 +15,14 @@ import java.util.concurrent.TimeUnit; public class DelayedDefaultRegionFileStorage extends DefaultRegionFileStorage { private final Cache chunkCache; + private boolean isClosed; public DelayedDefaultRegionFileStorage(Path directory, int time) { super(directory); this.chunkCache = Caffeine.newBuilder() .expireAfterWrite(time, TimeUnit.SECONDS) .removalListener((ChunkPos key, CEChunk value, RemovalCause cause) -> { - if (key == null || value == null) { + if (key == null || value == null || isClosed) { return; } if (cause == RemovalCause.EXPIRED || cause == RemovalCause.SIZE) { @@ -60,8 +61,9 @@ public class DelayedDefaultRegionFileStorage extends DefaultRegionFileStorage { @Override public synchronized void close() throws IOException { this.saveCache(); - super.close(); this.chunkCache.cleanUp(); + this.isClosed = true; + super.close(); } private void saveCache() { From dd3e1276ec6afb77df2204d2cdfeea2cc4e25af2 Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Sun, 4 May 2025 19:52:26 +0800 Subject: [PATCH 26/51] =?UTF-8?q?=E5=A2=9E=E5=BC=BA=E6=95=B0=E5=AD=97?= =?UTF-8?q?=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/translations/en.yml | 21 +++++++- .../src/main/resources/translations/zh_cn.yml | 25 +++++++-- .../bukkit/block/BlockEventListener.java | 26 +++++----- .../block/behavior/CropBlockBehavior.java | 3 +- .../item/recipe/RecipeEventListener.java | 2 +- .../bukkit/loot/BukkitVanillaLootManager.java | 1 - .../plugin/command/feature/TestCommand.java | 12 ++--- .../plugin/network/PacketConsumers.java | 1 - .../core/font/AbstractFontManager.java | 13 ++--- .../craftengine/core/item/CustomItem.java | 3 +- .../core/item/ItemBuildContext.java | 15 ++++++ .../craftengine/core/loot/LootContext.java | 17 ++---- .../craftengine/core/loot/LootPool.java | 5 +- .../craftengine/core/loot/LootTable.java | 3 +- .../core/loot/condition/LootConditions.java | 20 +++---- .../function/LootFunctionApplyBonusCount.java | 3 +- .../function/LootFunctionExplosionDecay.java | 9 ++-- .../pack/conflict/matcher/PathMatchers.java | 8 +-- ...> AbstractAdditionalParameterContext.java} | 6 +-- .../plugin/context/AbstractCommonContext.java | 7 +-- .../core/plugin/context/ContextHolder.java | 2 +- .../core/plugin/context/ContextKey.java | 14 ++--- .../plugin/context/PlayerOptionalContext.java | 16 +++++- .../context/condition/AllOfCondition.java | 24 ++++++--- .../context/condition/AnyOfCondition.java | 24 ++++++--- ...dConditions.java => CommonConditions.java} | 4 +- .../context/condition/EmptyCondition.java | 2 +- .../condition/EnchantmentCondition.java | 15 ++++-- .../condition/FallingBlockCondition.java | 2 +- .../context/condition/InvertedCondition.java | 24 +++++++-- .../MatchBlockPropertyCondition.java | 14 ++--- .../context/condition/MatchItemCondition.java | 6 ++- .../context/condition/RandomCondition.java | 13 ++--- .../condition/SurvivesExplosionCondition.java | 2 +- .../condition/TableBonusCondition.java | 6 +-- .../number/ExpressionNumberProvider.java | 52 +++++++++++++++++++ .../context/number/FixedNumberProvider.java | 23 ++++++-- .../context/number/NumberProviderFactory.java | 8 --- .../context/number/NumberProviders.java | 44 +++++++++------- .../context/number/UniformNumberProvider.java | 22 +++++--- .../context/parameter/CommonParameters.java | 3 -- .../gui/category/ItemBrowserManagerImpl.java | 52 +++++++++---------- .../text/minimessage/NamedArgumentTag.java | 11 ++-- .../text/minimessage/PlaceholderTag.java | 7 ++- .../core/registry/BuiltInRegistries.java | 4 +- .../craftengine/core/registry/Registries.java | 4 +- .../craftengine/core/util/RandomUtils.java | 28 +++------- .../craftengine/core/world/chunk/CEChunk.java | 4 +- 48 files changed, 388 insertions(+), 242 deletions(-) rename core/src/main/java/net/momirealms/craftengine/core/plugin/context/{AbstractAdditionalCommonContext.java => AbstractAdditionalParameterContext.java} (81%) rename core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/{SharedConditions.java => CommonConditions.java} (93%) create mode 100644 core/src/main/java/net/momirealms/craftengine/core/plugin/context/number/ExpressionNumberProvider.java delete mode 100644 core/src/main/java/net/momirealms/craftengine/core/plugin/context/number/NumberProviderFactory.java diff --git a/bukkit/loader/src/main/resources/translations/en.yml b/bukkit/loader/src/main/resources/translations/en.yml index 28cf30a1f..6011167dd 100644 --- a/bukkit/loader/src/main/resources/translations/en.yml +++ b/bukkit/loader/src/main/resources/translations/en.yml @@ -70,6 +70,25 @@ warning.config.type.float: "Issue found in file - Failed to load warning.config.type.double: "Issue found in file - Failed to load '': Cannot cast '' to double type for option ''." warning.config.type.quaternionf: "Issue found in file - Failed to load '': Cannot cast '' to Quaternionf type for option ''." warning.config.type.vector3f: "Issue found in file - Failed to load '': Cannot cast '' to Vector3f type for option ''." +warning.config.number.missing_argument: "Issue found in file - The config '' is missing the argument for 'number'." +warning.config.number.invalid_format: "Issue found in file - The config '' is using an invalid number format ''." +warning.config.number.fixed.missing_value: "Issue found in file - The config '' is missing the required 'value' argument for 'constant' number." +warning.config.number.fixed.invalid_value: "Issue found in file - The config '' is using the invalid 'value' argument '' for 'constant' number." +warning.config.number.expression.missing_expression: "Issue found in file - The config '' is missing the required 'expression' argument for 'expression' number." +warning.config.number.uniform.missing_min: "Issue found in file - The config '' is missing the required 'min' argument for 'uniform' number." +warning.config.number.uniform.missing_max: "Issue found in file - The config '' is missing the required 'max' argument for 'uniform' number." +warning.config.condition.all_of.missing_terms: "Issue found in file - The config '' is missing the required 'terms' argument for 'all_of' condition." +warning.config.condition.all_of.invalid_terms_type: "Issue found in file - The config '' has a misconfigured 'all_of' condition, 'terms' should be a map list, current type: ''." +warning.config.condition.any_of.missing_terms: "Issue found in file - The config '' is missing the required 'terms' argument for 'any_of' condition." +warning.config.condition.any_of.invalid_terms_type: "Issue found in file - The config '' has a misconfigured 'any_of' condition, 'terms' should be a map list, current type: ''." +warning.config.condition.inverted.missing_term: "Issue found in file - The config '' is missing the required 'term' argument for 'inverted' condition." +warning.config.condition.inverted.invalid_term_type: "Issue found in file - The config '' has a misconfigured 'inverted' condition, 'term' should be a config section, current type: ''." +warning.config.condition.enchantment.missing_predicate: "Issue found in file - The config '' is missing the required 'predicate' argument for 'enchantment' condition." +warning.config.condition.enchantment.invalid_predicate: "Issue found in file - The config '' is using an invalid enchantment 'predicate' argument ''." +warning.config.condition.match_block_property.missing_properties: "Issue found in file - The config '' is missing the required 'properties' argument for 'match_block_property' condition." +warning.config.condition.match_item.missing_id: "Issue found in file - The config '' is missing the required 'id' argument for 'match_item' condition." +warning.config.condition.table_bonus.missing_enchantment: "Issue found in file - The config '' is missing the required 'enchantment' argument for 'table_bonus' condition." +warning.config.condition.table_bonus.missing_chances: "Issue found in file - The config '' is missing the required 'chances' argument for 'table_bonus' condition." warning.config.structure.not_section: "Issue found in file - The config '' is expected to be a config section while it's actually a(n) ''." warning.config.image.duplicate: "Issue found in file - Duplicated image ''. Please check if there is the same configuration in other files." warning.config.image.missing_height: "Issue found in file - The image '' is missing the required 'height' argument." @@ -228,8 +247,6 @@ warning.config.loot_table.entry.exp.missing_count: "Issue found in file warning.config.loot_table.entry.item.missing_item: "Issue found in file - '' has a misconfigured loot table, entry 'item' is missing the required 'item' argument." warning.config.loot_table.condition.missing_type: "Issue found in file - '' has a misconfigured loot table, one of the conditions is missing the required 'type' argument." warning.config.loot_table.condition.invalid_type: "Issue found in file - '' has a misconfigured loot table, one of the conditions is using an invalid condition type ''." -warning.config.loot_table.condition.table_bonus.missing_enchantment: "Issue found in file - '' has a misconfigured loot table, 'table_bonus' condition is missing the required 'enchantment' argument." -warning.config.loot_table.condition.table_bonus.missing_chances: "Issue found in file - '' has a misconfigured loot table, 'table_bonus' condition is missing the required 'chances' argument." warning.config.loot_table.number.missing_type: "Issue found in file - '' has a misconfigured loot table, one of the numbers is missing the required 'type' argument." warning.config.loot_table.number.invalid_type: "Issue found in file - '' has a misconfigured loot table, one of the numbers is using an invalid number type ''." warning.config.host.missing_type: "Issue found in config.yml at 'resource-pack.delivery.hosting' - Missing required 'type' argument for host." diff --git a/bukkit/loader/src/main/resources/translations/zh_cn.yml b/bukkit/loader/src/main/resources/translations/zh_cn.yml index dff59914a..d2dd13dd8 100644 --- a/bukkit/loader/src/main/resources/translations/zh_cn.yml +++ b/bukkit/loader/src/main/resources/translations/zh_cn.yml @@ -40,11 +40,11 @@ argument.parse.failure.aggregate.failure: "无效的组件 '': 无法从 '' 解析 " argument.parse.failure.namedtextcolor: "'' 不是颜色代码" command.reload.config.success: "重新加载配置完成. 耗时 毫秒 (异步: ms | 同步: ms)" -command.reload.config.failure: "重新加载配置失败,请检查控制台日志" +command.reload.config.failure: "重新加载配置失败, 请检查控制台日志" command.reload.pack.success: "资源包重新加载完成. 耗时 毫秒" -command.reload.pack.failure: "重新加载资源包失败,请检查控制台日志" +command.reload.pack.failure: "重新加载资源包失败, 请检查控制台日志" command.reload.all.success: "全部重新加载完成. 耗时 毫秒 (异步: ms | 同步: ms | 资源包: ms)" -command.reload.all.failure: "重新加载失败,请检查控制台日志" +command.reload.all.failure: "重新加载失败, 请检查控制台日志" command.item.get.success: "获得" command.item.get.failure.not_exist: "'>" command.item.give.success.single: "':'':''>" @@ -70,6 +70,25 @@ warning.config.type.float: "在文件 发现问题 - 无法加 warning.config.type.double: "在文件 发现问题 - 无法加载 '': 无法将 '' 转换为双精度类型 (选项 '')" warning.config.type.quaternionf: "在文件 发现问题 - 无法加载 '': 无法将 '' 转换为四元数类型 (选项 '')" warning.config.type.vector3f: "在文件 发现问题 - 无法加载 '': 无法将 '' 转换为三维向量类型 (选项 '')" +warning.config.number.missing_argument: "在文件 发现问题 - 配置项 '' 缺少数字参数" +warning.config.number.invalid_format: "在文件 发现问题 - 配置项 '' 使用了无效的数字格式 ''" +warning.config.number.fixed.missing_value: "在文件 发现问题 - 配置项 '' 缺少 'constant' 数字类型所需的 'value' 参数" +warning.config.number.fixed.invalid_value: "在文件 发现问题 - 配置项 '' 使用了无效的常量值参数 ''" +warning.config.number.expression.missing_expression: "在文件 发现问题 - 配置项 '' 缺少 'expression' 数字类型所需的 'expression' 参数" +warning.config.number.uniform.missing_min: "在文件 发现问题 - 配置项 '' 缺少 'uniform' 数字类型所需的 'min' 参数" +warning.config.number.uniform.missing_max: "在文件 发现问题 - 配置项 '' 缺少 'uniform' 数字类型所需的 'max' 参数" +warning.config.condition.all_of.missing_terms: "在文件 发现问题 - 配置项 '' 缺少 'all_of' 条件所需的 'terms' 参数" +warning.config.condition.all_of.invalid_terms_type: "在文件 发现问题 - 配置项 '' 的 'all_of' 条件配置错误, 'terms' 应为映射列表, 当前类型: ''" +warning.config.condition.any_of.missing_terms: "在文件 发现问题 - 配置项 '' 缺少 'any_of' 条件所需的 'terms' 参数" +warning.config.condition.any_of.invalid_terms_type: "在文件 发现问题 - 配置项 '' 的 'any_of' 条件配置错误, 'terms' 应为映射列表, 当前类型: ''" +warning.config.condition.inverted.missing_term: "在文件 发现问题 - 配置项 '' 缺少 'inverted' 条件所需的 'term' 参数" +warning.config.condition.inverted.invalid_term_type: "在文件 发现问题 - 配置项 '' 的 'inverted' 条件配置错误, 'term' 应为配置节点, 当前类型: ''" +warning.config.condition.enchantment.missing_predicate: "在文件 发现问题 - 配置项 '' 缺少 'enchantment' 条件所需的 'predicate' 参数" +warning.config.condition.enchantment.invalid_predicate: "在文件 发现问题 - 配置项 '' 使用了无效的附魔 'predicate' 参数 ''" +warning.config.condition.match_block_property.missing_properties: "在文件 发现问题 - 配置项 '' 缺少 'match_block_property' 条件所需的 'properties' 参数" +warning.config.condition.match_item.missing_id: "在文件 发现问题 - 配置项 '' 缺少 'match_item' 条件所需的 'id' 参数" +warning.config.condition.table_bonus.missing_enchantment: "在文件 发现问题 - 配置项 '' 缺少 'table_bonus' 条件所需的 'enchantment' 参数" +warning.config.condition.table_bonus.missing_chances: "在文件 发现问题 - 配置项 '' 缺少 'table_bonus' 条件所需的 'chances' 参数" warning.config.structure.not_section: "在文件 发现问题 - 配置项 '' 应为配置段落 但实际类型为 ''" warning.config.image.duplicate: "在文件 发现问题 - 重复的图片配置 '' 请检查其他文件中是否存在相同配置" warning.config.image.missing_height: "在文件 发现问题 - 图片 '' 缺少必需的 'height' 参数" diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BlockEventListener.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BlockEventListener.java index 1209ed4b5..edb48354b 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BlockEventListener.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BlockEventListener.java @@ -150,11 +150,11 @@ public class BlockEventListener implements Listener { } // drop items - ContextHolder.Builder builder = ContextHolder.builder(); - builder.withParameter(CommonParameters.WORLD, world); - builder.withParameter(CommonParameters.LOCATION, vec3d); - builder.withParameter(CommonParameters.PLAYER, serverPlayer); - builder.withOptionalParameter(CommonParameters.TOOL, itemInHand); + ContextHolder.Builder builder = ContextHolder.builder() + .withParameter(CommonParameters.WORLD, world) + .withParameter(CommonParameters.LOCATION, vec3d) + .withParameter(CommonParameters.PLAYER, serverPlayer) + .withOptionalParameter(CommonParameters.TOOL, itemInHand); for (Item item : state.getDrops(builder, world)) { world.dropItemNaturally(vec3d, item); } @@ -171,11 +171,11 @@ public class BlockEventListener implements Listener { BukkitServerPlayer serverPlayer = this.plugin.adapt(player); net.momirealms.craftengine.core.world.World world = new BukkitWorld(player.getWorld()); Vec3d vec3d = new Vec3d(location.getBlockX() + 0.5, location.getBlockY() + 0.5, location.getBlockZ() + 0.5); - ContextHolder.Builder builder = ContextHolder.builder(); - builder.withParameter(CommonParameters.WORLD, world); - builder.withParameter(CommonParameters.LOCATION, vec3d); - builder.withParameter(CommonParameters.PLAYER, serverPlayer); - builder.withOptionalParameter(CommonParameters.TOOL, serverPlayer.getItemInHand(InteractionHand.MAIN_HAND)); + ContextHolder.Builder builder = ContextHolder.builder() + .withParameter(CommonParameters.WORLD, world) + .withParameter(CommonParameters.LOCATION, vec3d) + .withParameter(CommonParameters.PLAYER, serverPlayer) + .withOptionalParameter(CommonParameters.TOOL, serverPlayer.getItemInHand(InteractionHand.MAIN_HAND)); ContextHolder contextHolder = builder.build(); for (LootTable lootTable : it.lootTables()) { for (Item item : lootTable.getRandomItems(contextHolder, world)) { @@ -213,9 +213,9 @@ public class BlockEventListener implements Listener { Location location = block.getLocation(); net.momirealms.craftengine.core.world.World world = new BukkitWorld(block.getWorld()); Vec3d vec3d = new Vec3d(location.getBlockX() + 0.5, location.getBlockY() + 0.5, location.getBlockZ() + 0.5); - ContextHolder.Builder builder = ContextHolder.builder(); - builder.withParameter(CommonParameters.WORLD, world); - builder.withParameter(CommonParameters.LOCATION, vec3d); + ContextHolder.Builder builder = ContextHolder.builder() + .withParameter(CommonParameters.WORLD, world) + .withParameter(CommonParameters.LOCATION, vec3d); for (Item item : immutableBlockState.getDrops(builder, world)) { world.dropItemNaturally(vec3d, item); } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/CropBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/CropBlockBehavior.java index 98b5dd75c..0c13c3867 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/CropBlockBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/CropBlockBehavior.java @@ -30,7 +30,6 @@ import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.Callable; -import java.util.concurrent.ThreadLocalRandom; public class CropBlockBehavior extends BushBlockBehavior { public static final Factory FACTORY = new Factory(); @@ -148,7 +147,7 @@ public class CropBlockBehavior extends BushBlockBehavior { int z = FastNMS.INSTANCE.field$Vec3i$z(pos); net.momirealms.craftengine.core.world.World wrappedWorld = new BukkitWorld(world); - int i = this.getAge(immutableBlockState) + this.boneMealBonus.getInt(new LootContext(wrappedWorld, 1, ThreadLocalRandom.current(), ContextHolder.builder() + int i = this.getAge(immutableBlockState) + this.boneMealBonus.getInt(new LootContext(wrappedWorld, 1, ContextHolder.builder() .withParameter(CommonParameters.WORLD, wrappedWorld) .withParameter(CommonParameters.LOCATION, Vec3d.atCenterOf(new Vec3i(x, y, z))) .build())); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/RecipeEventListener.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/RecipeEventListener.java index ecf349fb6..aaa910a99 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/RecipeEventListener.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/RecipeEventListener.java @@ -752,7 +752,7 @@ public class RecipeEventListener implements Listener { return; } - Item newItem = customItem.buildItem(ItemBuildContext.of(plugin.adapt(player), ContextHolder.EMPTY)); + Item newItem = customItem.buildItem(ItemBuildContext.of(plugin.adapt(player))); int remainingDurability = totalMaxDamage - totalDamage; int newItemDamage = Math.max(0, newItem.maxDamage().get() - remainingDurability); newItem.damage(newItemDamage); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/loot/BukkitVanillaLootManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/loot/BukkitVanillaLootManager.java index db72d7a54..665e1fd2f 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/loot/BukkitVanillaLootManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/loot/BukkitVanillaLootManager.java @@ -70,7 +70,6 @@ public class BukkitVanillaLootManager extends AbstractVanillaLootManager impleme ContextHolder.Builder builder = ContextHolder.builder(); builder.withParameter(CommonParameters.WORLD, world); builder.withParameter(CommonParameters.LOCATION, vec3d); - // TODO Vanilla State Parameter if (VersionHelper.isOrAbove1_20_5()) { if (event.getDamageSource().getCausingEntity() instanceof Player player) { BukkitServerPlayer serverPlayer = this.plugin.adapt(player); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/TestCommand.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/TestCommand.java index c318bac10..116ac584a 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/TestCommand.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/TestCommand.java @@ -1,11 +1,10 @@ package net.momirealms.craftengine.bukkit.plugin.command.feature; -import com.saicone.rtag.util.ChatComponent; -import net.kyori.adventure.text.Component; import net.momirealms.craftengine.bukkit.plugin.command.BukkitCommandFeature; -import net.momirealms.craftengine.bukkit.util.ComponentUtils; import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.plugin.command.CraftEngineCommandManager; +import net.momirealms.craftengine.core.plugin.context.ContextHolder; +import net.momirealms.craftengine.core.plugin.context.PlayerOptionalContext; import net.momirealms.craftengine.core.util.AdventureHelper; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -24,10 +23,9 @@ public class TestCommand extends BukkitCommandFeature { .senderType(Player.class) .required("text", StringParser.greedyStringParser()) .handler(context -> { - plugin().senderFactory().wrap(context.sender()).sendMessage(Component.text( - ChatComponent.toTag(ComponentUtils.adventureToMinecraft(AdventureHelper.miniMessage().deserialize(context.get("text")))).toString() - )); - plugin().senderFactory().wrap(context.sender()).sendMessage(AdventureHelper.miniMessage().deserialize(context.get("text"))); + String text = ""; + PlayerOptionalContext context1 = PlayerOptionalContext.of(plugin().adapt(context.sender()), ContextHolder.builder()); + plugin().senderFactory().wrap(context.sender()).sendMessage(AdventureHelper.customMiniMessage().deserialize(text, context1.tagResolvers())); }); } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java index 413ec486b..c611b7049 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java @@ -199,7 +199,6 @@ public class PacketConsumers { buf.writeInt(chunkZ); if (VersionHelper.isOrAbove1_21_5()) { buf.writeVarInt(heightmapsCount); - assert heightmapsMap != null; for (Map.Entry entry : heightmapsMap.entrySet()) { buf.writeVarInt(entry.getKey()); buf.writeLongArray(entry.getValue()); diff --git a/core/src/main/java/net/momirealms/craftengine/core/font/AbstractFontManager.java b/core/src/main/java/net/momirealms/craftengine/core/font/AbstractFontManager.java index c8151079b..aa7a7797e 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/font/AbstractFontManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/font/AbstractFontManager.java @@ -124,7 +124,7 @@ public abstract class AbstractFontManager implements FontManager { PlayerOptionalContext.of(player, ContextHolder.builder() .withOptionalParameter(EmojiParameters.EMOJI, emoji.emojiImage()) .withParameter(EmojiParameters.KEYWORD, emoji.keywords().get(0)) - .build()).tagResolvers() + ).tagResolvers() ); replacements.put(fragment, AdventureHelper.componentToMiniMessage(content)); } @@ -170,8 +170,7 @@ public abstract class AbstractFontManager implements FontManager { PlayerOptionalContext.of(player, ContextHolder.builder() .withOptionalParameter(EmojiParameters.EMOJI, emoji.emojiImage()) .withParameter(EmojiParameters.KEYWORD, emoji.keywords().get(0)) - .build()) - .tagResolvers()) + ).tagResolvers()) ); if (emojis.size() >= maxTimes) break; } @@ -200,11 +199,9 @@ public abstract class AbstractFontManager implements FontManager { continue; emojis.put(fragment, AdventureHelper.miniMessage().deserialize( emoji.content(), - PlayerOptionalContext.of(player, - ContextHolder.builder() - .withOptionalParameter(EmojiParameters.EMOJI, emoji.emojiImage()) - .withParameter(EmojiParameters.KEYWORD, emoji.keywords().get(0)) - .build() + PlayerOptionalContext.of(player, ContextHolder.builder() + .withOptionalParameter(EmojiParameters.EMOJI, emoji.emojiImage()) + .withParameter(EmojiParameters.KEYWORD, emoji.keywords().get(0)) ).tagResolvers() )); if (emojis.size() >= maxTimes) break; diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/CustomItem.java b/core/src/main/java/net/momirealms/craftengine/core/item/CustomItem.java index af3b05eed..b4ff58f2a 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/CustomItem.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/CustomItem.java @@ -3,7 +3,6 @@ package net.momirealms.craftengine.core.item; import net.momirealms.craftengine.core.entity.player.Player; import net.momirealms.craftengine.core.item.behavior.ItemBehavior; import net.momirealms.craftengine.core.item.modifier.ItemDataModifier; -import net.momirealms.craftengine.core.plugin.context.ContextHolder; import net.momirealms.craftengine.core.util.Key; import org.jetbrains.annotations.NotNull; @@ -35,7 +34,7 @@ public interface CustomItem extends BuildableItem { } default Item buildItem(Player player) { - return buildItem(ItemBuildContext.of(player, ContextHolder.EMPTY)); + return buildItem(ItemBuildContext.of(player)); } Item buildItem(ItemBuildContext context); diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/ItemBuildContext.java b/core/src/main/java/net/momirealms/craftengine/core/item/ItemBuildContext.java index 8ad1474df..521907dc3 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/ItemBuildContext.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/ItemBuildContext.java @@ -3,9 +3,12 @@ package net.momirealms.craftengine.core.item; import net.momirealms.craftengine.core.entity.player.Player; import net.momirealms.craftengine.core.plugin.context.ContextHolder; import net.momirealms.craftengine.core.plugin.context.PlayerOptionalContext; +import net.momirealms.craftengine.core.plugin.context.parameter.CommonParameters; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.Map; + public class ItemBuildContext extends PlayerOptionalContext { public static final ItemBuildContext EMPTY = new ItemBuildContext(null, ContextHolder.EMPTY); @@ -17,4 +20,16 @@ public class ItemBuildContext extends PlayerOptionalContext { public static ItemBuildContext of(@Nullable Player player, @NotNull ContextHolder contexts) { return new ItemBuildContext(player, contexts); } + + @NotNull + public static ItemBuildContext of(@Nullable Player player, @NotNull ContextHolder.Builder builder) { + if (player != null) builder.withParameter(CommonParameters.PLAYER, player); + return new ItemBuildContext(player, builder.build()); + } + + @NotNull + public static ItemBuildContext of(@Nullable Player player) { + if (player == null) return new ItemBuildContext(null, ContextHolder.EMPTY); + return new ItemBuildContext(player, new ContextHolder(Map.of(CommonParameters.PLAYER, () -> player))); + } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/LootContext.java b/core/src/main/java/net/momirealms/craftengine/core/loot/LootContext.java index 5c14026b1..c67948fdc 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/LootContext.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/LootContext.java @@ -1,27 +1,20 @@ package net.momirealms.craftengine.core.loot; -import net.momirealms.craftengine.core.plugin.context.AbstractCommonContext; import net.momirealms.craftengine.core.plugin.context.ContextHolder; +import net.momirealms.craftengine.core.plugin.context.PlayerOptionalContext; +import net.momirealms.craftengine.core.plugin.context.parameter.CommonParameters; import net.momirealms.craftengine.core.world.World; -import java.util.Random; - -public class LootContext extends AbstractCommonContext { +public class LootContext extends PlayerOptionalContext { private final World world; - private final Random randomSource; private final float luck; - public LootContext(World world, float luck, Random randomSource, ContextHolder contexts) { - super(contexts); - this.randomSource = randomSource; + public LootContext(World world, float luck, ContextHolder contexts) { + super(contexts.getOptional(CommonParameters.PLAYER).orElse(null), contexts); this.world = world; this.luck = luck; } - public Random randomSource() { - return this.randomSource; - } - public float luck() { return luck; } diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/LootPool.java b/core/src/main/java/net/momirealms/craftengine/core/loot/LootPool.java index 28a012dc6..1bc846899 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/LootPool.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/LootPool.java @@ -11,9 +11,9 @@ import net.momirealms.craftengine.core.plugin.context.Condition; import net.momirealms.craftengine.core.plugin.context.number.NumberProvider; import net.momirealms.craftengine.core.util.MCUtils; import net.momirealms.craftengine.core.util.MutableInt; +import net.momirealms.craftengine.core.util.RandomUtils; import java.util.List; -import java.util.Random; import java.util.function.BiFunction; import java.util.function.Consumer; import java.util.function.Predicate; @@ -62,7 +62,6 @@ public class LootPool { } private void addRandomItem(Consumer> lootConsumer, LootContext context) { - Random randomSource = context.randomSource(); List> list = Lists.newArrayList(); MutableInt mutableInt = new MutableInt(0); for (LootEntryContainer lootPoolEntryContainer : this.entryContainers) { @@ -79,7 +78,7 @@ public class LootPool { if (i == 1) { list.get(0).createItem(lootConsumer, context); } else { - int j = randomSource.nextInt(mutableInt.intValue()); + int j = RandomUtils.generateRandomInt(0, mutableInt.intValue()); for (LootEntry loot : list) { j -= loot.getWeight(context.luck()); if (j < 0) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/LootTable.java b/core/src/main/java/net/momirealms/craftengine/core/loot/LootTable.java index b404c7456..8804ac429 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/LootTable.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/LootTable.java @@ -21,7 +21,6 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Optional; -import java.util.concurrent.ThreadLocalRandom; import java.util.function.BiFunction; import java.util.function.Consumer; import java.util.function.Supplier; @@ -80,7 +79,7 @@ public class LootTable { } public ArrayList> getRandomItems(ContextHolder parameters, World world) { - return this.getRandomItems(new LootContext(world, 1, ThreadLocalRandom.current(), parameters)); + return this.getRandomItems(new LootContext(world, 1, parameters)); } private ArrayList> getRandomItems(LootContext context) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditions.java b/core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditions.java index 8e98d73d2..f3ce5cd7d 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditions.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditions.java @@ -21,16 +21,16 @@ import java.util.function.Predicate; public class LootConditions { static { - register(SharedConditions.MATCH_ITEM, new MatchItemCondition.FactoryImpl<>()); - register(SharedConditions.MATCH_BLOCK_PROPERTY, new MatchBlockPropertyCondition.FactoryImpl<>()); - register(SharedConditions.TABLE_BONUS, new TableBonusCondition.FactoryImpl<>()); - register(SharedConditions.SURVIVES_EXPLOSION, new SurvivesExplosionCondition.FactoryImpl<>()); - register(SharedConditions.ANY_OF, new AnyOfCondition.FactoryImpl<>(LootConditions::fromMap)); - register(SharedConditions.ALL_OF, new AllOfCondition.FactoryImpl<>(LootConditions::fromMap)); - register(SharedConditions.ENCHANTMENT, new EnchantmentCondition.FactoryImpl<>()); - register(SharedConditions.INVERTED, new InvertedCondition.FactoryImpl<>(LootConditions::fromMap)); - register(SharedConditions.FALLING_BLOCK, new FallingBlockCondition.FactoryImpl<>()); - register(SharedConditions.RANDOM, new RandomCondition.FactoryImpl<>()); + register(CommonConditions.MATCH_ITEM, new MatchItemCondition.FactoryImpl<>()); + register(CommonConditions.MATCH_BLOCK_PROPERTY, new MatchBlockPropertyCondition.FactoryImpl<>()); + register(CommonConditions.TABLE_BONUS, new TableBonusCondition.FactoryImpl<>()); + register(CommonConditions.SURVIVES_EXPLOSION, new SurvivesExplosionCondition.FactoryImpl<>()); + register(CommonConditions.ANY_OF, new AnyOfCondition.FactoryImpl<>(LootConditions::fromMap)); + register(CommonConditions.ALL_OF, new AllOfCondition.FactoryImpl<>(LootConditions::fromMap)); + register(CommonConditions.ENCHANTMENT, new EnchantmentCondition.FactoryImpl<>()); + register(CommonConditions.INVERTED, new InvertedCondition.FactoryImpl<>(LootConditions::fromMap)); + register(CommonConditions.FALLING_BLOCK, new FallingBlockCondition.FactoryImpl<>()); + register(CommonConditions.RANDOM, new RandomCondition.FactoryImpl<>()); } public static void register(Key key, Factory> factory) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctionApplyBonusCount.java b/core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctionApplyBonusCount.java index c8105921f..988839a5b 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctionApplyBonusCount.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctionApplyBonusCount.java @@ -17,7 +17,6 @@ import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Optional; -import java.util.concurrent.ThreadLocalRandom; public class LootFunctionApplyBonusCount extends AbstractLootConditionalFunction { public static final Factory FACTORY = new Factory<>(); @@ -108,7 +107,7 @@ public class LootFunctionApplyBonusCount extends AbstractLootConditionalFunct @Override public int apply(int initialCount, int enchantmentLevel) { if (enchantmentLevel > 0) { - int i = ThreadLocalRandom.current().nextInt(enchantmentLevel + 2) - 1; + int i = RandomUtils.generateRandomInt(0, enchantmentLevel + 2) - 1; if (i < 0) { i = 0; } diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctionExplosionDecay.java b/core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctionExplosionDecay.java index 7f0caa415..8e042ff08 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctionExplosionDecay.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctionExplosionDecay.java @@ -6,8 +6,12 @@ import net.momirealms.craftengine.core.loot.condition.LootConditions; import net.momirealms.craftengine.core.plugin.context.Condition; import net.momirealms.craftengine.core.plugin.context.parameter.CommonParameters; import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.RandomUtils; -import java.util.*; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Optional; public class LootFunctionExplosionDecay extends AbstractLootConditionalFunction { public static final Factory FACTORY = new Factory<>(); @@ -20,12 +24,11 @@ public class LootFunctionExplosionDecay extends AbstractLootConditionalFuncti protected Item applyInternal(Item item, LootContext context) { Optional radius = context.getOptionalParameter(CommonParameters.EXPLOSION_RADIUS); if (radius.isPresent()) { - Random random = context.randomSource(); float f = 1f / radius.get(); int amount = item.count(); int survive = 0; for (int j = 0; j < amount; j++) { - if (random.nextFloat() <= f) { + if (RandomUtils.generateRandomFloat(0, 1) <= f) { survive++; } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatchers.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatchers.java index 90dc0a83c..a80c9bdde 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatchers.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatchers.java @@ -5,7 +5,7 @@ import net.momirealms.craftengine.core.plugin.context.Condition; import net.momirealms.craftengine.core.plugin.context.condition.AllOfCondition; import net.momirealms.craftengine.core.plugin.context.condition.AnyOfCondition; import net.momirealms.craftengine.core.plugin.context.condition.InvertedCondition; -import net.momirealms.craftengine.core.plugin.context.condition.SharedConditions; +import net.momirealms.craftengine.core.plugin.context.condition.CommonConditions; import net.momirealms.craftengine.core.plugin.locale.LocalizedException; import net.momirealms.craftengine.core.registry.BuiltInRegistries; import net.momirealms.craftengine.core.registry.Holder; @@ -29,9 +29,9 @@ public class PathMatchers { public static final Key PATTERN = Key.of("craftengine:pattern"); static { - register(SharedConditions.ANY_OF, new AnyOfCondition.FactoryImpl<>(PathMatchers::fromMap)); - register(SharedConditions.ALL_OF, new AllOfCondition.FactoryImpl<>(PathMatchers::fromMap)); - register(SharedConditions.INVERTED, new InvertedCondition.FactoryImpl<>(PathMatchers::fromMap)); + register(CommonConditions.ANY_OF, new AnyOfCondition.FactoryImpl<>(PathMatchers::fromMap)); + register(CommonConditions.ALL_OF, new AllOfCondition.FactoryImpl<>(PathMatchers::fromMap)); + register(CommonConditions.INVERTED, new InvertedCondition.FactoryImpl<>(PathMatchers::fromMap)); register(PARENT_PATH_SUFFIX, new PathMatcherParentSuffix.FactoryImpl()); register(PARENT_PATH_PREFIX, new PathMatcherParentPrefix.FactoryImpl()); register(PATTERN, new PathPatternMatcher.FactoryImpl()); diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/AbstractAdditionalCommonContext.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/AbstractAdditionalParameterContext.java similarity index 81% rename from core/src/main/java/net/momirealms/craftengine/core/plugin/context/AbstractAdditionalCommonContext.java rename to core/src/main/java/net/momirealms/craftengine/core/plugin/context/AbstractAdditionalParameterContext.java index 0011e6247..97a3ff9b9 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/AbstractAdditionalCommonContext.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/AbstractAdditionalParameterContext.java @@ -5,15 +5,15 @@ import net.momirealms.craftengine.core.plugin.context.parameter.CommonParameterP import java.util.List; import java.util.Optional; -public abstract class AbstractAdditionalCommonContext extends AbstractCommonContext { +public abstract class AbstractAdditionalParameterContext extends AbstractCommonContext { private final List providers; - public AbstractAdditionalCommonContext(ContextHolder contexts, List providers) { + public AbstractAdditionalParameterContext(ContextHolder contexts, List providers) { super(contexts); this.providers = providers; } - public AbstractAdditionalCommonContext(ContextHolder contexts) { + public AbstractAdditionalParameterContext(ContextHolder contexts) { super(contexts); this.providers = List.of(new CommonParameterProvider()); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/AbstractCommonContext.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/AbstractCommonContext.java index 93332ab6d..9e07b9423 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/AbstractCommonContext.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/AbstractCommonContext.java @@ -1,10 +1,7 @@ package net.momirealms.craftengine.core.plugin.context; import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; -import net.momirealms.craftengine.core.plugin.text.minimessage.I18NTag; -import net.momirealms.craftengine.core.plugin.text.minimessage.ImageTag; -import net.momirealms.craftengine.core.plugin.text.minimessage.NamedArgumentTag; -import net.momirealms.craftengine.core.plugin.text.minimessage.ShiftTag; +import net.momirealms.craftengine.core.plugin.text.minimessage.*; import org.jetbrains.annotations.NotNull; import java.util.Optional; @@ -26,7 +23,7 @@ public abstract class AbstractCommonContext implements Context { @NotNull public TagResolver[] tagResolvers() { if (this.tagResolvers == null) { - this.tagResolvers = new TagResolver[]{ShiftTag.INSTANCE, ImageTag.INSTANCE, new I18NTag(this), new NamedArgumentTag(this)}; + this.tagResolvers = new TagResolver[]{ShiftTag.INSTANCE, ImageTag.INSTANCE, new I18NTag(this), new NamedArgumentTag(this), new PlaceholderTag(null)}; } return this.tagResolvers; } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/ContextHolder.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/ContextHolder.java index c14652f7e..e01c447e2 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/ContextHolder.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/ContextHolder.java @@ -13,7 +13,7 @@ public class ContextHolder { public static final ContextHolder EMPTY = ContextHolder.builder().immutable(true).build(); protected final Map, Supplier> params; - protected ContextHolder(Map, Supplier> params) { + public ContextHolder(Map, Supplier> params) { this.params = params; } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/ContextKey.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/ContextKey.java index 4d5529baf..a33dffffd 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/ContextKey.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/ContextKey.java @@ -1,28 +1,22 @@ package net.momirealms.craftengine.core.plugin.context; -import net.momirealms.craftengine.core.util.Key; import org.jetbrains.annotations.NotNull; public class ContextKey { - private final Key id; + private final String id; - public ContextKey(@NotNull Key id) { + public ContextKey(@NotNull String id) { this.id = id; } @NotNull - public Key id() { + public String id() { return id; } - @NotNull - public static ContextKey of(@NotNull Key id) { - return new ContextKey<>(id); - } - @NotNull public static ContextKey of(@NotNull String id) { - return new ContextKey<>(Key.withDefaultNamespace(id, "craftengine")); + return new ContextKey<>(id); } @Override diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/PlayerOptionalContext.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/PlayerOptionalContext.java index 2071848ce..3436e4605 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/PlayerOptionalContext.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/PlayerOptionalContext.java @@ -3,14 +3,16 @@ package net.momirealms.craftengine.core.plugin.context; import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import net.momirealms.craftengine.core.entity.player.Player; import net.momirealms.craftengine.core.plugin.context.parameter.CommonParameterProvider; +import net.momirealms.craftengine.core.plugin.context.parameter.CommonParameters; import net.momirealms.craftengine.core.plugin.context.parameter.PlayerParameterProvider; import net.momirealms.craftengine.core.plugin.text.minimessage.*; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.List; +import java.util.Map; -public class PlayerOptionalContext extends AbstractAdditionalCommonContext implements Context { +public class PlayerOptionalContext extends AbstractAdditionalParameterContext implements Context { public static final PlayerOptionalContext EMPTY = new PlayerOptionalContext(null, ContextHolder.EMPTY); private final Player player; @@ -29,6 +31,18 @@ public class PlayerOptionalContext extends AbstractAdditionalCommonContext imple return new PlayerOptionalContext(player, contexts); } + @NotNull + public static PlayerOptionalContext of(@Nullable Player player, @NotNull ContextHolder.Builder contexts) { + if (player != null) contexts.withParameter(CommonParameters.PLAYER, player); + return new PlayerOptionalContext(player, contexts.build()); + } + + @NotNull + public static PlayerOptionalContext of(@Nullable Player player) { + if (player == null) return EMPTY; + return new PlayerOptionalContext(player, new ContextHolder(Map.of(CommonParameters.PLAYER, () -> player))); + } + @Nullable public Player player() { return this.player; diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/AllOfCondition.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/AllOfCondition.java index eee327cc9..e1b128982 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/AllOfCondition.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/AllOfCondition.java @@ -2,8 +2,11 @@ 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.plugin.locale.LocalizedResourceConfigException; import net.momirealms.craftengine.core.util.Factory; import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.MiscUtils; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; import java.util.ArrayList; import java.util.List; @@ -29,7 +32,7 @@ public class AllOfCondition implements Condition { @Override public Key type() { - return SharedConditions.ALL_OF; + return CommonConditions.ALL_OF; } public static class FactoryImpl implements Factory> { @@ -42,12 +45,21 @@ public class AllOfCondition implements Condition { @SuppressWarnings("unchecked") @Override public Condition create(Map arguments) { - List> terms = (List>) arguments.get("terms"); - List> conditions = new ArrayList<>(); - for (Map term : terms) { - conditions.add(factory.apply(term)); + Object termsArg = ResourceConfigUtils.requireNonNullOrThrow( + ResourceConfigUtils.get(arguments, "terms", "term"), + "warning.config.condition.all_of.missing_terms" + ); + if (termsArg instanceof Map map) { + return new AllOfCondition<>(List.of(factory.apply(MiscUtils.castToMap(map, false)))); + } else if (termsArg instanceof List list) { + List> conditions = new ArrayList<>(); + for (Map term : (List>) list) { + conditions.add(factory.apply(term)); + } + return new AllOfCondition<>(conditions); + } else { + throw new LocalizedResourceConfigException("warning.config.condition.all_of.invalid_terms_type", termsArg.getClass().getSimpleName()); } - return new AllOfCondition<>(conditions); } } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/AnyOfCondition.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/AnyOfCondition.java index 49a279bb7..c0e20d22b 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/AnyOfCondition.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/AnyOfCondition.java @@ -2,8 +2,11 @@ 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.plugin.locale.LocalizedResourceConfigException; import net.momirealms.craftengine.core.util.Factory; import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.MiscUtils; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; import java.util.ArrayList; import java.util.List; @@ -29,7 +32,7 @@ public class AnyOfCondition implements Condition { @Override public Key type() { - return SharedConditions.ANY_OF; + return CommonConditions.ANY_OF; } public static class FactoryImpl implements Factory> { @@ -42,12 +45,21 @@ public class AnyOfCondition implements Condition { @SuppressWarnings("unchecked") @Override public Condition create(Map arguments) { - List> terms = (List>) arguments.get("terms"); - List> conditions = new ArrayList<>(); - for (Map term : terms) { - conditions.add(factory.apply(term)); + Object termsArg = ResourceConfigUtils.requireNonNullOrThrow( + ResourceConfigUtils.get(arguments, "terms", "term"), + "warning.config.condition.any_of.missing_terms" + ); + if (termsArg instanceof Map map) { + return new AnyOfCondition<>(List.of(factory.apply(MiscUtils.castToMap(map, false)))); + } else if (termsArg instanceof List list) { + List> conditions = new ArrayList<>(); + for (Map term : (List>) list) { + conditions.add(factory.apply(term)); + } + return new AnyOfCondition<>(conditions); + } else { + throw new LocalizedResourceConfigException("warning.config.condition.any_of.invalid_terms_type", termsArg.getClass().getSimpleName()); } - return new AnyOfCondition<>(conditions); } } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/SharedConditions.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/CommonConditions.java similarity index 93% rename from core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/SharedConditions.java rename to core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/CommonConditions.java index 67fee2254..a8700127a 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/SharedConditions.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/CommonConditions.java @@ -2,8 +2,8 @@ package net.momirealms.craftengine.core.plugin.context.condition; import net.momirealms.craftengine.core.util.Key; -public final class SharedConditions { - private SharedConditions() {} +public final class CommonConditions { + private CommonConditions() {} public static final Key EMPTY = Key.of("craftengine:empty"); public static final Key ALL_OF = Key.of("craftengine:all_of"); diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/EmptyCondition.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/EmptyCondition.java index 42bc2e520..291e0d14e 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/EmptyCondition.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/EmptyCondition.java @@ -11,7 +11,7 @@ public class EmptyCondition implements Condition { @Override public Key type() { - return SharedConditions.EMPTY; + return CommonConditions.EMPTY; } @Override diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/EnchantmentCondition.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/EnchantmentCondition.java index 8df501f88..57825c36a 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/EnchantmentCondition.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/EnchantmentCondition.java @@ -5,8 +5,10 @@ import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.plugin.context.Condition; import net.momirealms.craftengine.core.plugin.context.Context; import net.momirealms.craftengine.core.plugin.context.parameter.CommonParameters; +import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; import net.momirealms.craftengine.core.util.Factory; import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; import java.util.Map; import java.util.Optional; @@ -23,7 +25,7 @@ public class EnchantmentCondition implements Condition @Override public Key type() { - return SharedConditions.ENCHANTMENT; + return CommonConditions.ENCHANTMENT; } @Override @@ -39,9 +41,14 @@ public class EnchantmentCondition implements Condition @Override public Condition create(Map arguments) { - String predicate = (String) arguments.get("predicate"); + String predicate = ResourceConfigUtils.requireNonEmptyStringOrThrow(arguments.get("predicate"), "warning.config.condition.enchantment.missing_predicate"); String[] split = predicate.split("(<=|>=|<|>|==|=)", 2); - int level = Integer.parseInt(split[1]); + int level; + try { + level = Integer.parseInt(split[1]); + } catch (NumberFormatException e) { + throw new LocalizedResourceConfigException("warning.config.condition.enchantment.invalid_predicate", e, predicate); + } String operator = predicate.substring(split[0].length(), predicate.length() - split[1].length()); Function expression; switch (operator) { @@ -50,7 +57,7 @@ public class EnchantmentCondition implements Condition case "==", "=" -> expression = (i -> i == level); case "<=" -> expression = (i -> i <= level); case ">=" -> expression = (i -> i >= level); - default -> throw new IllegalArgumentException("Unknown operator: " + operator); + default -> throw new LocalizedResourceConfigException("warning.config.condition.enchantment.invalid_predicate", predicate); } return new EnchantmentCondition<>(Key.of(split[0]), expression); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/FallingBlockCondition.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/FallingBlockCondition.java index a4ee999f4..820fc2820 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/FallingBlockCondition.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/FallingBlockCondition.java @@ -12,7 +12,7 @@ public class FallingBlockCondition implements Condition implements Condition { @Override public Key type() { - return SharedConditions.INVERTED; + return CommonConditions.INVERTED; } public static class FactoryImpl implements Factory> { @@ -35,8 +40,21 @@ public class InvertedCondition implements Condition { @SuppressWarnings("unchecked") @Override public Condition create(Map arguments) { - Map term = (Map) arguments.get("term"); - return new InvertedCondition<>(this.factory.apply(term)); + Object termObj = ResourceConfigUtils.requireNonNullOrThrow( + ResourceConfigUtils.get(arguments, "term", "terms"), + "warning.config.condition.inverted.missing_term" + ); + if (termObj instanceof Map map) { + return new InvertedCondition<>(this.factory.apply(MiscUtils.castToMap(map, false))); + } else if (termObj instanceof List list) { + List> conditions = new ArrayList<>(); + for (Map term : (List>) list) { + conditions.add(factory.apply(term)); + } + return new InvertedCondition<>(new AllOfCondition<>(conditions)); + } else { + throw new LocalizedResourceConfigException("warning.config.condition.inverted.invalid_term_type", termObj.getClass().getSimpleName()); + } } } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/MatchBlockPropertyCondition.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/MatchBlockPropertyCondition.java index e7381ae5d..e1aee710e 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/MatchBlockPropertyCondition.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/MatchBlockPropertyCondition.java @@ -5,9 +5,7 @@ import net.momirealms.craftengine.core.block.properties.Property; import net.momirealms.craftengine.core.plugin.context.Condition; import net.momirealms.craftengine.core.plugin.context.Context; import net.momirealms.craftengine.core.plugin.context.parameter.CommonParameters; -import net.momirealms.craftengine.core.util.Factory; -import net.momirealms.craftengine.core.util.Key; -import net.momirealms.craftengine.core.util.Pair; +import net.momirealms.craftengine.core.util.*; import java.util.ArrayList; import java.util.List; @@ -23,7 +21,7 @@ public class MatchBlockPropertyCondition implements Conditi @Override public Key type() { - return SharedConditions.MATCH_BLOCK_PROPERTY; + return CommonConditions.MATCH_BLOCK_PROPERTY; } @Override @@ -45,15 +43,11 @@ public class MatchBlockPropertyCondition implements Conditi public static class FactoryImpl implements Factory> { - @SuppressWarnings("unchecked") @Override public Condition create(Map arguments) { - Map properties = (Map) arguments.get("properties"); - if (properties == null) { - throw new IllegalArgumentException("Missing 'properties' argument for 'match_block_property'"); - } + Object propertyObj = ResourceConfigUtils.requireNonNullOrThrow(arguments.get("properties"), "warning.config.condition.match_block_property.missing_properties"); List> propertyList = new ArrayList<>(); - for (Map.Entry entry : properties.entrySet()) { + for (Map.Entry entry : MiscUtils.castToMap(propertyObj, false).entrySet()) { propertyList.add(new Pair<>(entry.getKey(), entry.getValue().toString())); } return new MatchBlockPropertyCondition<>(propertyList); diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/MatchItemCondition.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/MatchItemCondition.java index 11e2180b8..48a199634 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/MatchItemCondition.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/MatchItemCondition.java @@ -4,6 +4,7 @@ import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.plugin.context.Condition; import net.momirealms.craftengine.core.plugin.context.Context; import net.momirealms.craftengine.core.plugin.context.parameter.CommonParameters; +import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; import net.momirealms.craftengine.core.util.Factory; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.MiscUtils; @@ -21,7 +22,7 @@ public class MatchItemCondition implements Condition { @Override public Key type() { - return SharedConditions.MATCH_ITEM; + return CommonConditions.MATCH_ITEM; } @Override @@ -47,6 +48,9 @@ public class MatchItemCondition implements Condition { @Override public Condition create(Map arguments) { List ids = MiscUtils.getAsStringList(arguments.get("id")); + if (ids.isEmpty()) { + throw new LocalizedResourceConfigException("warning.config.condition.match_item.missing_id"); + } boolean regex = (boolean) arguments.getOrDefault("regex", false); return new MatchItemCondition<>(ids, regex); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/RandomCondition.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/RandomCondition.java index 21fe97429..9e7657ea8 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/RandomCondition.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/RandomCondition.java @@ -2,35 +2,36 @@ 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.plugin.context.number.NumberProvider; +import net.momirealms.craftengine.core.plugin.context.number.NumberProviders; import net.momirealms.craftengine.core.util.Factory; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.RandomUtils; -import net.momirealms.craftengine.core.util.ResourceConfigUtils; import java.util.Map; public class RandomCondition implements Condition { - private final float chance; + private final NumberProvider chance; - public RandomCondition(float chance) { + public RandomCondition(NumberProvider chance) { this.chance = chance; } @Override public Key type() { - return SharedConditions.RANDOM; + return CommonConditions.RANDOM; } @Override public boolean test(CTX ctx) { - return RandomUtils.generateRandomFloat(0, 1) < this.chance; + return RandomUtils.generateRandomFloat(0, 1) < this.chance.getFloat(ctx); } public static class FactoryImpl implements Factory> { @Override public Condition create(Map arguments) { - float provider = ResourceConfigUtils.getAsFloat(arguments.getOrDefault("value", 0.5f), "value"); + NumberProvider provider = NumberProviders.fromObject(arguments.getOrDefault("value", 0.5f)); return new RandomCondition<>(provider); } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/SurvivesExplosionCondition.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/SurvivesExplosionCondition.java index f7f97e135..da6277ded 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/SurvivesExplosionCondition.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/SurvivesExplosionCondition.java @@ -14,7 +14,7 @@ public class SurvivesExplosionCondition implements Conditio @Override public Key type() { - return SharedConditions.SURVIVES_EXPLOSION; + return CommonConditions.SURVIVES_EXPLOSION; } @Override diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/TableBonusCondition.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/TableBonusCondition.java index b1e44389d..880a52bcb 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/TableBonusCondition.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/TableBonusCondition.java @@ -27,7 +27,7 @@ public class TableBonusCondition implements Condition @Override public Key type() { - return SharedConditions.TABLE_BONUS; + return CommonConditions.TABLE_BONUS; } @Override @@ -44,7 +44,7 @@ public class TableBonusCondition implements Condition public Condition create(Map arguments) { Object enchantmentObj = arguments.get("enchantment"); if (enchantmentObj == null) { - throw new LocalizedResourceConfigException("warning.config.loot_table.condition.table_bonus.missing_enchantment"); + throw new LocalizedResourceConfigException("warning.config.condition.table_bonus.missing_enchantment"); } Key enchantmentType = Key.of(enchantmentObj.toString()); Object chances = arguments.get("chances"); @@ -59,7 +59,7 @@ public class TableBonusCondition implements Condition return new TableBonusCondition<>(enchantmentType, values); } } - throw new LocalizedResourceConfigException("warning.config.loot_table.condition.table_bonus.missing_chances"); + throw new LocalizedResourceConfigException("warning.config.condition.table_bonus.missing_chances"); } } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/number/ExpressionNumberProvider.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/number/ExpressionNumberProvider.java new file mode 100644 index 000000000..21c2ccabf --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/number/ExpressionNumberProvider.java @@ -0,0 +1,52 @@ +package net.momirealms.craftengine.core.plugin.context.number; + +import com.ezylang.evalex.EvaluationException; +import com.ezylang.evalex.Expression; +import com.ezylang.evalex.parser.ParseException; +import net.kyori.adventure.text.Component; +import net.momirealms.craftengine.core.plugin.context.Context; +import net.momirealms.craftengine.core.util.AdventureHelper; +import net.momirealms.craftengine.core.util.Factory; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; + +import java.util.Map; + +public class ExpressionNumberProvider implements NumberProvider { + public static final FactoryImpl FACTORY = new FactoryImpl(); + private final String expr; + + public ExpressionNumberProvider(String expr) { + this.expr = expr; + } + + @Override + public float getFloat(Context context) { + Component resultComponent = AdventureHelper.customMiniMessage().deserialize(this.expr, context.tagResolvers()); + String resultString = AdventureHelper.plainTextContent(resultComponent); + Expression expression = new Expression(resultString); + try { + return expression.evaluate().getNumberValue().floatValue(); + } catch (EvaluationException | ParseException e) { + throw new RuntimeException("Invalid expression: " + this.expr + " -> " + resultString + " -> Cannot parse", e); + } + } + + @Override + public Key type() { + return NumberProviders.EXPRESSION; + } + + public String expression() { + return this.expr; + } + + public static class FactoryImpl implements Factory { + + @Override + public NumberProvider create(Map arguments) { + String value = ResourceConfigUtils.requireNonEmptyStringOrThrow(arguments.get("expression"), "warning.config.number.expression.missing_expression"); + return new ExpressionNumberProvider(value); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/number/FixedNumberProvider.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/number/FixedNumberProvider.java index 0e71e8332..cfbd165f9 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/number/FixedNumberProvider.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/number/FixedNumberProvider.java @@ -1,12 +1,16 @@ package net.momirealms.craftengine.core.plugin.context.number; +import com.ezylang.evalex.Expression; import net.momirealms.craftengine.core.plugin.context.Context; +import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; +import net.momirealms.craftengine.core.util.Factory; import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; import java.util.Map; public class FixedNumberProvider implements NumberProvider { - public static final Factory FACTORY = new Factory(); + public static final FactoryImpl FACTORY = new FactoryImpl(); private final float value; public FixedNumberProvider(float value) { @@ -23,11 +27,22 @@ public class FixedNumberProvider implements NumberProvider { return NumberProviders.FIXED; } - public static class Factory implements NumberProviderFactory { + public static class FactoryImpl implements Factory { + @Override public NumberProvider create(Map arguments) { - Number value = (Number) arguments.get("value"); - return new FixedNumberProvider(value.floatValue()); + String plainOrExpression = ResourceConfigUtils.requireNonEmptyStringOrThrow(arguments.get("value"), "warning.config.number.fixed.missing_value"); + try { + float value = Float.parseFloat(plainOrExpression); + return new FixedNumberProvider(value); + } catch (NumberFormatException e) { + Expression expression = new Expression(plainOrExpression); + try { + return new FixedNumberProvider(expression.evaluate().getNumberValue().floatValue()); + } catch (Exception e1) { + throw new LocalizedResourceConfigException("warning.config.number.fixed.invalid_value", e1, plainOrExpression); + } + } } } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/number/NumberProviderFactory.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/number/NumberProviderFactory.java deleted file mode 100644 index 0093dfcde..000000000 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/number/NumberProviderFactory.java +++ /dev/null @@ -1,8 +0,0 @@ -package net.momirealms.craftengine.core.plugin.context.number; - -import java.util.Map; - -public interface NumberProviderFactory { - - NumberProvider create(Map arguments); -} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/number/NumberProviders.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/number/NumberProviders.java index 23552f78c..2d73ce359 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/number/NumberProviders.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/number/NumberProviders.java @@ -5,26 +5,30 @@ import net.momirealms.craftengine.core.registry.BuiltInRegistries; import net.momirealms.craftengine.core.registry.Holder; import net.momirealms.craftengine.core.registry.Registries; import net.momirealms.craftengine.core.registry.WritableRegistry; +import net.momirealms.craftengine.core.util.Factory; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.ResourceConfigUtils; import net.momirealms.craftengine.core.util.ResourceKey; -import software.amazon.awssdk.services.s3.endpoints.internal.Value; import java.util.ArrayList; import java.util.List; import java.util.Map; public class NumberProviders { - public static final Key FIXED = Key.of("craftengine:constant"); + public static final Key FIXED = Key.of("craftengine:fixed"); + public static final Key CONSTANT = Key.of("craftengine:constant"); public static final Key UNIFORM = Key.of("craftengine:uniform"); + public static final Key EXPRESSION = Key.of("craftengine:expression"); static { register(FIXED, FixedNumberProvider.FACTORY); + register(CONSTANT, FixedNumberProvider.FACTORY); register(UNIFORM, UniformNumberProvider.FACTORY); + register(EXPRESSION, ExpressionNumberProvider.FACTORY); } - public static void register(Key key, NumberProviderFactory factory) { - Holder.Reference holder = ((WritableRegistry) BuiltInRegistries.NUMBER_PROVIDER_FACTORY) + public static void register(Key key, Factory factory) { + Holder.Reference> holder = ((WritableRegistry>) BuiltInRegistries.NUMBER_PROVIDER_FACTORY) .registerForHolder(new ResourceKey<>(Registries.NUMBER_PROVIDER_FACTORY.location(), key)); holder.bindValue(factory); } @@ -41,7 +45,7 @@ public class NumberProviders { public static NumberProvider fromMap(Map map) { String type = ResourceConfigUtils.requireNonEmptyStringOrThrow(map.get("type"), "warning.config.loot_table.number.missing_type"); Key key = Key.withDefaultNamespace(type, Key.DEFAULT_NAMESPACE); - NumberProviderFactory factory = BuiltInRegistries.NUMBER_PROVIDER_FACTORY.getValue(key); + Factory factory = BuiltInRegistries.NUMBER_PROVIDER_FACTORY.getValue(key); if (factory == null) { throw new LocalizedResourceConfigException("warning.config.loot_table.number.invalid_type", type); } @@ -51,31 +55,33 @@ public class NumberProviders { @SuppressWarnings("unchecked") public static NumberProvider fromObject(Object object) { if (object == null) { - throw new NullPointerException("number argument is null"); + throw new LocalizedResourceConfigException("warning.config.number.missing_argument"); } if (object instanceof Number number) { return new FixedNumberProvider(number.floatValue()); - } else if (object instanceof String string) { + } else if (object instanceof Map map) { + return fromMap((Map) map); + } else { + String string = object.toString(); if (string.contains("~")) { int first = string.indexOf('~'); int second = string.indexOf('~', first + 1); if (second == -1) { - try { - float min = Float.parseFloat(string.substring(0, first)); - float max = Float.parseFloat(string.substring(first + 1)); - return new UniformNumberProvider(min, max); - } catch (NumberFormatException e) { - throw e; - } + NumberProvider min = fromObject(string.substring(0, first)); + NumberProvider max = fromObject(string.substring(first + 1)); + return new UniformNumberProvider(min, max); } else { - throw new IllegalArgumentException("Illegal number format: " + string); + throw new LocalizedResourceConfigException("warning.config.number.invalid_format", string); } + } else if (string.contains("<") && string.contains(">") && string.contains(":")) { + return new ExpressionNumberProvider(string); } else { - return new FixedNumberProvider(Float.parseFloat(string)); + try { + return new FixedNumberProvider(Float.parseFloat(string)); + } catch (NumberFormatException e) { + throw new LocalizedResourceConfigException("warning.config.number.invalid_format", e, string); + } } - } else if (object instanceof Map map) { - return fromMap((Map) map); } - throw new IllegalArgumentException("Can't convert " + object + " to " + NumberProvider.class.getSimpleName()); } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/number/UniformNumberProvider.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/number/UniformNumberProvider.java index d90880eb9..38cbf80ae 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/number/UniformNumberProvider.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/number/UniformNumberProvider.java @@ -1,13 +1,15 @@ package net.momirealms.craftengine.core.plugin.context.number; import net.momirealms.craftengine.core.plugin.context.Context; +import net.momirealms.craftengine.core.util.Factory; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.RandomUtils; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; import java.util.Map; public class UniformNumberProvider implements NumberProvider { - public static final Factory FACTORY = new Factory(); + public static final FactoryImpl FACTORY = new FactoryImpl(); private final NumberProvider min; private final NumberProvider max; @@ -16,14 +18,17 @@ public class UniformNumberProvider implements NumberProvider { this.max = max; } - public UniformNumberProvider(float min, float max) { - this.min = new FixedNumberProvider(min); - this.max = new FixedNumberProvider(max); + public NumberProvider max() { + return max; + } + + public NumberProvider min() { + return min; } @Override public int getInt(Context context) { - return RandomUtils.generateRandomInt(this.min.getInt(context), this.max.getInt(context)); + return RandomUtils.generateRandomInt(this.min.getInt(context), this.max.getInt(context) + 1); } @Override @@ -36,11 +41,12 @@ public class UniformNumberProvider implements NumberProvider { return NumberProviders.UNIFORM; } - public static class Factory implements NumberProviderFactory { + public static class FactoryImpl implements Factory { + @Override public NumberProvider create(Map arguments) { - Object min = arguments.getOrDefault("min", 1); - Object max = arguments.getOrDefault("max", 1); + Object min = ResourceConfigUtils.requireNonNullOrThrow(arguments.get("min"), "warning.config.number.uniform.missing_min"); + Object max = ResourceConfigUtils.requireNonNullOrThrow(arguments.get("max"), "warning.config.number.uniform.missing_max"); return new UniformNumberProvider(NumberProviders.fromObject(min), NumberProviders.fromObject(max)); } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/parameter/CommonParameters.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/parameter/CommonParameters.java index d9e59c0c7..e6c8d24ff 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/parameter/CommonParameters.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/parameter/CommonParameters.java @@ -1,7 +1,6 @@ package net.momirealms.craftengine.core.plugin.context.parameter; import net.momirealms.craftengine.core.block.ImmutableBlockState; -import net.momirealms.craftengine.core.entity.Entity; import net.momirealms.craftengine.core.entity.player.Player; import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.plugin.context.ContextKey; @@ -13,10 +12,8 @@ public final class CommonParameters { public static final ContextKey RANDOM = ContextKey.of("random"); public static final ContextKey LAST_RANDOM = ContextKey.of("last_random"); - public static final ContextKey LOCATION = ContextKey.of("location"); public static final ContextKey WORLD = ContextKey.of("world"); - public static final ContextKey ENTITY = ContextKey.of("entity"); public static final ContextKey FALLING_BLOCK = ContextKey.of("falling_block"); public static final ContextKey EXPLOSION_RADIUS = ContextKey.of("explosion_radius"); public static final ContextKey PLAYER = ContextKey.of("player"); diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/category/ItemBrowserManagerImpl.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/category/ItemBrowserManagerImpl.java index b4669e24b..9d6f17d16 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/category/ItemBrowserManagerImpl.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/category/ItemBrowserManagerImpl.java @@ -137,7 +137,7 @@ public class ItemBrowserManagerImpl implements ItemBrowserManager { .map(it -> it.buildItem(ItemBuildContext.of(player, ContextHolder.builder() .withParameter(GuiParameters.CURRENT_PAGE, String.valueOf(element.gui().currentPage())) .withParameter(GuiParameters.MAX_PAGE, String.valueOf(element.gui().maxPages())) - .build()))) + ))) .orElseThrow(() -> new GuiElementMissingException("Can't find gui element " + next)); }, true) ) @@ -147,7 +147,7 @@ public class ItemBrowserManagerImpl implements ItemBrowserManager { .map(it -> it.buildItem(ItemBuildContext.of(player, ContextHolder.builder() .withParameter(GuiParameters.CURRENT_PAGE, String.valueOf(element.gui().currentPage())) .withParameter(GuiParameters.MAX_PAGE, String.valueOf(element.gui().maxPages())) - .build()))) + ))) .orElseThrow(() -> new GuiElementMissingException("Can't find gui element " + previous)); }, false) ); @@ -177,7 +177,7 @@ public class ItemBrowserManagerImpl implements ItemBrowserManager { } }) .build() - .title(AdventureHelper.miniMessage().deserialize(Constants.BROWSER_TITLE, PlayerOptionalContext.of(player, ContextHolder.EMPTY).tagResolvers())) + .title(AdventureHelper.miniMessage().deserialize(Constants.BROWSER_TITLE, PlayerOptionalContext.of(player).tagResolvers())) .refresh() .open(player); } @@ -193,7 +193,7 @@ public class ItemBrowserManagerImpl implements ItemBrowserManager { ) .addIngredient('A', Ingredient.paged()) .addIngredient('=', GuiElement.constant(this.plugin.itemManager().getCustomItem(parentGui != null ? Constants.CATEGORY_BACK : Constants.CATEGORY_EXIT) - .map(it -> it.buildItem(ItemBuildContext.of(player, ContextHolder.EMPTY))) + .map(it -> it.buildItem(ItemBuildContext.of(player))) .orElseThrow(() -> new GuiElementMissingException("Can't find gui element " + (parentGui != null ? Constants.CATEGORY_BACK : Constants.CATEGORY_EXIT))), ((element, click) -> { click.cancel(); @@ -211,7 +211,7 @@ public class ItemBrowserManagerImpl implements ItemBrowserManager { .map(it -> it.buildItem(ItemBuildContext.of(player, ContextHolder.builder() .withParameter(GuiParameters.CURRENT_PAGE, String.valueOf(element.gui().currentPage())) .withParameter(GuiParameters.MAX_PAGE, String.valueOf(element.gui().maxPages())) - .build()))) + ))) .orElseThrow(() -> new GuiElementMissingException("Can't find gui element " + next)); }, true) ) @@ -221,7 +221,7 @@ public class ItemBrowserManagerImpl implements ItemBrowserManager { .map(it -> it.buildItem(ItemBuildContext.of(player, ContextHolder.builder() .withParameter(GuiParameters.CURRENT_PAGE, String.valueOf(element.gui().currentPage())) .withParameter(GuiParameters.MAX_PAGE, String.valueOf(element.gui().maxPages())) - .build()))) + ))) .orElseThrow(() -> new GuiElementMissingException("Can't find gui element " + previous)); }, false) ); @@ -292,7 +292,7 @@ public class ItemBrowserManagerImpl implements ItemBrowserManager { } }) .build() - .title(AdventureHelper.miniMessage().deserialize(Constants.CATEGORY_TITLE, PlayerOptionalContext.of(player, ContextHolder.EMPTY).tagResolvers())) + .title(AdventureHelper.miniMessage().deserialize(Constants.CATEGORY_TITLE, PlayerOptionalContext.of(player).tagResolvers())) .refresh() .open(player); } @@ -332,7 +332,7 @@ public class ItemBrowserManagerImpl implements ItemBrowserManager { } }) : GuiElement.EMPTY) .addIngredient('=', GuiElement.constant(this.plugin.itemManager().getCustomItem(parentGui != null ? Constants.RECIPE_BACK : Constants.RECIPE_EXIT) - .map(it -> it.buildItem(ItemBuildContext.of(player, ContextHolder.EMPTY))) + .map(it -> it.buildItem(ItemBuildContext.of(player))) .orElseThrow(() -> new GuiElementMissingException("Can't find gui element " + (parentGui != null ? Constants.RECIPE_BACK : Constants.RECIPE_EXIT))), ((element, click) -> { click.cancel(); @@ -353,7 +353,7 @@ public class ItemBrowserManagerImpl implements ItemBrowserManager { } }) .build() - .title(AdventureHelper.miniMessage().deserialize(Constants.RECIPE_NONE_TITLE, PlayerOptionalContext.of(player, ContextHolder.EMPTY).tagResolvers())) + .title(AdventureHelper.miniMessage().deserialize(Constants.RECIPE_NONE_TITLE, PlayerOptionalContext.of(player).tagResolvers())) .refresh() .open(player); } @@ -431,7 +431,7 @@ public class ItemBrowserManagerImpl implements ItemBrowserManager { } }) : GuiElement.EMPTY) .addIngredient('=', GuiElement.constant(this.plugin.itemManager().getCustomItem(parentGui != null ? Constants.RECIPE_BACK : Constants.RECIPE_EXIT) - .map(it -> it.buildItem(ItemBuildContext.of(player, ContextHolder.EMPTY))) + .map(it -> it.buildItem(ItemBuildContext.of(player))) .orElseThrow(() -> new GuiElementMissingException("Can't find gui element " + (parentGui != null ? Constants.RECIPE_BACK : Constants.RECIPE_EXIT))), ((element, click) -> { click.cancel(); @@ -448,7 +448,7 @@ public class ItemBrowserManagerImpl implements ItemBrowserManager { .map(it -> it.buildItem(ItemBuildContext.of(player, ContextHolder.builder() .withParameter(GuiParameters.CURRENT_PAGE, String.valueOf(index + 1)) .withParameter(GuiParameters.MAX_PAGE, String.valueOf(recipes.size())) - .build()))) + ))) .orElseThrow(() -> new GuiElementMissingException("Can't find gui element " + next)), (e, c) -> { c.cancel(); if (index + 1 < recipes.size()) { @@ -461,7 +461,7 @@ public class ItemBrowserManagerImpl implements ItemBrowserManager { .map(it -> it.buildItem(ItemBuildContext.of(player, ContextHolder.builder() .withParameter(GuiParameters.CURRENT_PAGE, String.valueOf(index + 1)) .withParameter(GuiParameters.MAX_PAGE, String.valueOf(recipes.size())) - .build()))) + ))) .orElseThrow(() -> new GuiElementMissingException("Can't find gui element " + previous)), (e, c) -> { c.cancel(); if (index > 0) { @@ -578,7 +578,7 @@ public class ItemBrowserManagerImpl implements ItemBrowserManager { } }) .build() - .title(AdventureHelper.miniMessage().deserialize(Constants.RECIPE_SMITHING_TRANSFORM_TITLE, PlayerOptionalContext.of(player, ContextHolder.EMPTY).tagResolvers())) + .title(AdventureHelper.miniMessage().deserialize(Constants.RECIPE_SMITHING_TRANSFORM_TITLE, PlayerOptionalContext.of(player).tagResolvers())) .refresh() .open(player); } @@ -664,7 +664,7 @@ public class ItemBrowserManagerImpl implements ItemBrowserManager { } })) .addIngredient('=', GuiElement.constant(this.plugin.itemManager().getCustomItem(parentGui != null ? Constants.RECIPE_BACK : Constants.RECIPE_EXIT) - .map(it -> it.buildItem(ItemBuildContext.of(player, ContextHolder.EMPTY))) + .map(it -> it.buildItem(ItemBuildContext.of(player))) .orElseThrow(() -> new GuiElementMissingException("Can't find gui element " + (parentGui != null ? Constants.RECIPE_BACK : Constants.RECIPE_EXIT))), ((element, click) -> { click.cancel(); @@ -681,7 +681,7 @@ public class ItemBrowserManagerImpl implements ItemBrowserManager { .map(it -> it.buildItem(ItemBuildContext.of(player, ContextHolder.builder() .withParameter(GuiParameters.CURRENT_PAGE, String.valueOf(index + 1)) .withParameter(GuiParameters.MAX_PAGE, String.valueOf(recipes.size())) - .build()))) + ))) .orElseThrow(() -> new GuiElementMissingException("Can't find gui element " + next)), (e, c) -> { c.cancel(); if (index + 1 < recipes.size()) { @@ -694,7 +694,7 @@ public class ItemBrowserManagerImpl implements ItemBrowserManager { .map(it -> it.buildItem(ItemBuildContext.of(player, ContextHolder.builder() .withParameter(GuiParameters.CURRENT_PAGE, String.valueOf(index + 1)) .withParameter(GuiParameters.MAX_PAGE, String.valueOf(recipes.size())) - .build()))) + ))) .orElseThrow(() -> new GuiElementMissingException("Can't find gui element " + previous)), (e, c) -> { c.cancel(); if (index > 0) { @@ -711,7 +711,7 @@ public class ItemBrowserManagerImpl implements ItemBrowserManager { } }) .build() - .title(AdventureHelper.miniMessage().deserialize(Constants.RECIPE_STONECUTTING_TITLE, PlayerOptionalContext.of(player, ContextHolder.EMPTY).tagResolvers())) + .title(AdventureHelper.miniMessage().deserialize(Constants.RECIPE_STONECUTTING_TITLE, PlayerOptionalContext.of(player).tagResolvers())) .refresh() .open(player); } @@ -764,7 +764,7 @@ public class ItemBrowserManagerImpl implements ItemBrowserManager { .map(it -> it.buildItem(ItemBuildContext.of(player, ContextHolder.builder() .withParameter(GuiParameters.COOKING_TIME, String.valueOf(recipe.cookingTime())) .withParameter(GuiParameters.COOKING_EXPERIENCE, String.valueOf(recipe.experience())) - .build()))) + ))) .orElseThrow(() -> new GuiElementMissingException("Can't find gui element " + Constants.RECIPE_COOKING_INFO)), (e, c) -> c.cancel())) .addIngredient('^', player.hasPermission(GET_ITEM_PERMISSION) ? GuiElement.constant(this.plugin.itemManager().createWrappedItem(Constants.RECIPE_GET_ITEM, player), (e, c) -> { c.cancel(); @@ -803,7 +803,7 @@ public class ItemBrowserManagerImpl implements ItemBrowserManager { } })) .addIngredient('=', GuiElement.constant(this.plugin.itemManager().getCustomItem(parentGui != null ? Constants.RECIPE_BACK : Constants.RECIPE_EXIT) - .map(it -> it.buildItem(ItemBuildContext.of(player, ContextHolder.EMPTY))) + .map(it -> it.buildItem(ItemBuildContext.of(player))) .orElseThrow(() -> new GuiElementMissingException("Can't find gui element " + (parentGui != null ? Constants.RECIPE_BACK : Constants.RECIPE_EXIT))), ((element, click) -> { click.cancel(); @@ -820,7 +820,7 @@ public class ItemBrowserManagerImpl implements ItemBrowserManager { .map(it -> it.buildItem(ItemBuildContext.of(player, ContextHolder.builder() .withParameter(GuiParameters.CURRENT_PAGE, String.valueOf(index + 1)) .withParameter(GuiParameters.MAX_PAGE, String.valueOf(recipes.size())) - .build()))) + ))) .orElseThrow(() -> new GuiElementMissingException("Can't find gui element " + next)), (e, c) -> { c.cancel(); if (index + 1 < recipes.size()) { @@ -833,7 +833,7 @@ public class ItemBrowserManagerImpl implements ItemBrowserManager { .map(it -> it.buildItem(ItemBuildContext.of(player, ContextHolder.builder() .withParameter(GuiParameters.CURRENT_PAGE, String.valueOf(index + 1)) .withParameter(GuiParameters.MAX_PAGE, String.valueOf(recipes.size())) - .build()))) + ))) .orElseThrow(() -> new GuiElementMissingException("Can't find gui element " + previous)), (e, c) -> { c.cancel(); if (index > 0) { @@ -861,7 +861,7 @@ public class ItemBrowserManagerImpl implements ItemBrowserManager { } }) .build() - .title(AdventureHelper.miniMessage().deserialize(title, PlayerOptionalContext.of(player, ContextHolder.EMPTY).tagResolvers())) + .title(AdventureHelper.miniMessage().deserialize(title, PlayerOptionalContext.of(player).tagResolvers())) .refresh() .open(player); } @@ -916,7 +916,7 @@ public class ItemBrowserManagerImpl implements ItemBrowserManager { } }) : GuiElement.EMPTY) .addIngredient('=', GuiElement.constant(this.plugin.itemManager().getCustomItem(parentGui != null ? Constants.RECIPE_BACK : Constants.RECIPE_EXIT) - .map(it -> it.buildItem(ItemBuildContext.of(player, ContextHolder.EMPTY))) + .map(it -> it.buildItem(ItemBuildContext.of(player))) .orElseThrow(() -> new GuiElementMissingException("Can't find gui element " + (parentGui != null ? Constants.RECIPE_BACK : Constants.RECIPE_EXIT))), ((element, click) -> { click.cancel(); @@ -933,7 +933,7 @@ public class ItemBrowserManagerImpl implements ItemBrowserManager { .map(it -> it.buildItem(ItemBuildContext.of(player, ContextHolder.builder() .withParameter(GuiParameters.CURRENT_PAGE, String.valueOf(index + 1)) .withParameter(GuiParameters.MAX_PAGE, String.valueOf(recipes.size())) - .build()))) + ))) .orElseThrow(() -> new GuiElementMissingException("Can't find gui element " + next)), (e, c) -> { c.cancel(); if (index + 1 < recipes.size()) { @@ -946,7 +946,7 @@ public class ItemBrowserManagerImpl implements ItemBrowserManager { .map(it -> it.buildItem(ItemBuildContext.of(player, ContextHolder.builder() .withParameter(GuiParameters.CURRENT_PAGE, String.valueOf(index + 1)) .withParameter(GuiParameters.MAX_PAGE, String.valueOf(recipes.size())) - .build()))) + ))) .orElseThrow(() -> new GuiElementMissingException("Can't find gui element " + previous)), (e, c) -> { c.cancel(); if (index > 0) { @@ -1056,7 +1056,7 @@ public class ItemBrowserManagerImpl implements ItemBrowserManager { } }) .build() - .title(AdventureHelper.miniMessage().deserialize(Constants.RECIPE_CRAFTING_TITLE, PlayerOptionalContext.of(player, ContextHolder.EMPTY).tagResolvers())) + .title(AdventureHelper.miniMessage().deserialize(Constants.RECIPE_CRAFTING_TITLE, PlayerOptionalContext.of(player).tagResolvers())) .refresh() .open(player); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/NamedArgumentTag.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/NamedArgumentTag.java index c59067f59..c2db728c5 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/NamedArgumentTag.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/NamedArgumentTag.java @@ -7,7 +7,6 @@ import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import net.momirealms.craftengine.core.plugin.context.Context; import net.momirealms.craftengine.core.plugin.context.ContextKey; import net.momirealms.craftengine.core.util.AdventureHelper; -import net.momirealms.craftengine.core.util.Key; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -29,13 +28,13 @@ public class NamedArgumentTag implements TagResolver { if (!has(name)) { return null; } - String argumentKey = arguments.popOr("No argument key provided").toString(); - ContextKey key = ContextKey.of(Key.withDefaultNamespace(argumentKey, Key.DEFAULT_NAMESPACE)); + ContextKey key = ContextKey.of(arguments.popOr("No argument key provided").toString()); Optional optional = this.context.getOptionalParameter(key); - if (optional.isEmpty()) { - throw ctx.newException("Invalid argument key", arguments); + Object value = optional.orElse(null); + if (value == null) { + value = arguments.popOr("No default value provided").toString(); } - return Tag.selfClosingInserting(AdventureHelper.miniMessage().deserialize(String.valueOf(optional.get()), this.context.tagResolvers())); + return Tag.selfClosingInserting(AdventureHelper.miniMessage().deserialize(String.valueOf(value), this.context.tagResolvers())); } @Override diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/PlaceholderTag.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/PlaceholderTag.java index 59b331975..07ac1d36d 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/PlaceholderTag.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/PlaceholderTag.java @@ -23,8 +23,11 @@ public class PlaceholderTag implements TagResolver { if (!this.has(name) || !CraftEngine.instance().compatibilityManager().hasPlaceholderAPI()) { return null; } - String placeholder = arguments.popOr("No argument placeholder provided").toString(); - String parsed = CraftEngine.instance().compatibilityManager().parse(player, "%" + placeholder + "%"); + String placeholder = "%" + arguments.popOr("No argument placeholder provided") + "%"; + String parsed = CraftEngine.instance().compatibilityManager().parse(player, placeholder); + if (parsed.equals(placeholder)) { + parsed = arguments.popOr("No default papi value provided").toString(); + } return Tag.inserting(AdventureHelper.miniMessage().deserialize(parsed)); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/registry/BuiltInRegistries.java b/core/src/main/java/net/momirealms/craftengine/core/registry/BuiltInRegistries.java index 7a1a2a22a..097387d80 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/registry/BuiltInRegistries.java +++ b/core/src/main/java/net/momirealms/craftengine/core/registry/BuiltInRegistries.java @@ -22,7 +22,7 @@ import net.momirealms.craftengine.core.pack.model.special.SpecialModelFactory; import net.momirealms.craftengine.core.pack.model.tint.TintFactory; import net.momirealms.craftengine.core.plugin.config.template.TemplateArgumentFactory; import net.momirealms.craftengine.core.plugin.context.Condition; -import net.momirealms.craftengine.core.plugin.context.number.NumberProviderFactory; +import net.momirealms.craftengine.core.plugin.context.number.NumberProvider; import net.momirealms.craftengine.core.util.Factory; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.ResourceKey; @@ -35,7 +35,7 @@ public class BuiltInRegistries { public static final Registry> LOOT_FUNCTION_FACTORY = createRegistry(Registries.LOOT_FUNCTION_FACTORY); public static final Registry>> LOOT_CONDITION_FACTORY = createRegistry(Registries.LOOT_CONDITION_FACTORY); public static final Registry> LOOT_ENTRY_CONTAINER_FACTORY = createRegistry(Registries.LOOT_ENTRY_CONTAINER_FACTORY); - public static final Registry NUMBER_PROVIDER_FACTORY = createRegistry(Registries.NUMBER_PROVIDER_FACTORY); + public static final Registry> NUMBER_PROVIDER_FACTORY = createRegistry(Registries.NUMBER_PROVIDER_FACTORY); public static final Registry ITEM_BEHAVIOR_FACTORY = createRegistry(Registries.ITEM_BEHAVIOR_FACTORY); public static final Registry TEMPLATE_ARGUMENT_FACTORY = createRegistry(Registries.TEMPLATE_ARGUMENT_FACTORY); public static final Registry ITEM_MODEL_FACTORY = createRegistry(Registries.ITEM_MODEL_FACTORY); diff --git a/core/src/main/java/net/momirealms/craftengine/core/registry/Registries.java b/core/src/main/java/net/momirealms/craftengine/core/registry/Registries.java index 3bad798af..b67a7b1ad 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/registry/Registries.java +++ b/core/src/main/java/net/momirealms/craftengine/core/registry/Registries.java @@ -22,7 +22,7 @@ import net.momirealms.craftengine.core.pack.model.special.SpecialModelFactory; import net.momirealms.craftengine.core.pack.model.tint.TintFactory; import net.momirealms.craftengine.core.plugin.config.template.TemplateArgumentFactory; import net.momirealms.craftengine.core.plugin.context.Condition; -import net.momirealms.craftengine.core.plugin.context.number.NumberProviderFactory; +import net.momirealms.craftengine.core.plugin.context.number.NumberProvider; import net.momirealms.craftengine.core.util.Factory; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.ResourceKey; @@ -37,7 +37,7 @@ public class Registries { public static final ResourceKey>> LOOT_FUNCTION_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("loot_function_factory")); public static final ResourceKey>> LOOT_ENTRY_CONTAINER_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("loot_entry_container_factory")); public static final ResourceKey>>> LOOT_CONDITION_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("loot_condition_factory")); - public static final ResourceKey> NUMBER_PROVIDER_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("number_provider_factory")); + public static final ResourceKey>> NUMBER_PROVIDER_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("number_provider_factory")); public static final ResourceKey> TEMPLATE_ARGUMENT_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("template_argument_factory")); public static final ResourceKey> ITEM_MODEL_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("item_model_factory")); public static final ResourceKey> TINT_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("tint_factory")); diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/RandomUtils.java b/core/src/main/java/net/momirealms/craftengine/core/util/RandomUtils.java index 34c0b03e7..b659d4c28 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/util/RandomUtils.java +++ b/core/src/main/java/net/momirealms/craftengine/core/util/RandomUtils.java @@ -1,37 +1,25 @@ package net.momirealms.craftengine.core.util; -import java.util.Random; import java.util.concurrent.ThreadLocalRandom; -public class RandomUtils { - private final Random random; +public final class RandomUtils { - private RandomUtils() { - random = ThreadLocalRandom.current(); - } - - private static class SingletonHolder { - private static final RandomUtils INSTANCE = new RandomUtils(); - } - - private static RandomUtils getInstance() { - return SingletonHolder.INSTANCE; - } + private RandomUtils() {} public static double generateRandomDouble(double min, double max) { - return min + (max - min) * getInstance().random.nextDouble(); + return min + (max - min) * ThreadLocalRandom.current().nextDouble(); } public static float generateRandomFloat(float min, float max) { - return min + (max - min) * getInstance().random.nextFloat(); + return min + (max - min) * ThreadLocalRandom.current().nextFloat(); } public static int generateRandomInt(int min, int max) { - return min >= max ? min : getInstance().random.nextInt(max - min + 1) + min; + return min >= max ? min : ThreadLocalRandom.current().nextInt(max - min) + min; } public static boolean generateRandomBoolean() { - return getInstance().random.nextBoolean(); + return ThreadLocalRandom.current().nextBoolean(); } public static double triangle(double mode, double deviation) { @@ -39,7 +27,7 @@ public class RandomUtils { } public static T getRandomElementFromArray(T[] array) { - int index = getInstance().random.nextInt(array.length); + int index = ThreadLocalRandom.current().nextInt(array.length); return array[index]; } @@ -50,7 +38,7 @@ public class RandomUtils { @SuppressWarnings("unchecked") T[] result = (T[]) new Object[count]; for (int i = 0; i < count; i++) { - int index = getInstance().random.nextInt(array.length - i); + int index = ThreadLocalRandom.current().nextInt(array.length - i); result[i] = array[index]; array[index] = array[array.length - i - 1]; } diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/chunk/CEChunk.java b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/CEChunk.java index 1ae57e38b..45b0a52b8 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/world/chunk/CEChunk.java +++ b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/CEChunk.java @@ -47,11 +47,11 @@ public class CEChunk { } public Map blockEntities() { - return blockEntities; + return this.blockEntities; } public boolean dirty() { - return dirty; + return this.dirty; } public void setDirty(boolean dirty) { From 79c441c0e06afda83f8574568798fd48c7ecb22f Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Tue, 6 May 2025 02:34:03 +0800 Subject: [PATCH 27/51] =?UTF-8?q?=E9=87=8D=E6=9E=84context=20again?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bukkit/util/LegacyAttributeUtils.java | 7 ++ .../src/main/resources/translations/en.yml | 3 +- .../bukkit/api/CraftEngineBlocks.java | 5 +- .../bukkit/api/CraftEngineFurniture.java | 5 +- .../bukkit/block/BlockEventListener.java | 18 ++--- .../block/FallingBlockRemoveListener.java | 2 +- .../block/behavior/BushBlockBehavior.java | 2 +- .../block/behavior/CropBlockBehavior.java | 16 ++-- .../block/behavior/FallingBlockBehavior.java | 2 +- .../block/behavior/LeavesBlockBehavior.java | 2 +- .../behavior/SugarCaneBlockBehavior.java | 2 +- .../bukkit/entity/BukkitEntity.java | 7 ++ .../bukkit/loot/BukkitVanillaLootManager.java | 10 +-- .../bukkit/plugin/BukkitCraftEngine.java | 1 + .../bukkit/plugin/BukkitPlatform.java | 12 +++ .../plugin/user/BukkitServerPlayer.java | 16 ++++ .../core/block/ImmutableBlockState.java | 10 ++- .../craftengine/core/entity/Entity.java | 8 ++ .../core/entity/player/Player.java | 10 +++ .../recipe/CustomSmithingTransformRecipe.java | 12 +-- .../loot/{condition => }/LootConditions.java | 25 +++--- .../craftengine/core/loot/LootContext.java | 23 ++++-- .../craftengine/core/loot/LootPool.java | 1 - .../craftengine/core/loot/LootTable.java | 8 +- .../entry/AlternativesLootEntryContainer.java | 2 +- .../loot/entry/ExpLootEntryContainer.java | 2 +- .../entry/SingleItemLootEntryContainer.java | 2 +- ...ount.java => ApplyBonusCountFunction.java} | 12 +-- ...ctionDropExp.java => DropExpFunction.java} | 8 +- ...Decay.java => ExplosionDecayFunction.java} | 8 +- .../core/loot/function/LootFunctions.java | 8 +- ...ionSetCount.java => SetCountFunction.java} | 8 +- .../conflict/matcher/PathMatcherContains.java | 4 +- .../conflict/matcher/PathMatcherExact.java | 4 +- .../conflict/matcher/PathMatcherFilename.java | 4 +- .../matcher/PathMatcherParentPrefix.java | 4 +- .../matcher/PathMatcherParentSuffix.java | 4 +- .../pack/conflict/matcher/PathMatchers.java | 27 ++++--- .../conflict/matcher/PathPatternMatcher.java | 4 +- .../craftengine/core/plugin/CraftEngine.java | 6 ++ .../craftengine/core/plugin/Platform.java | 6 ++ .../craftengine/core/plugin/Plugin.java | 2 + .../plugin/context/AbstractCommonContext.java | 14 ++-- .../core/plugin/context/Context.java | 2 - .../core/plugin/context/ContextHolder.java | 2 +- .../context/PlayerFurnitureActionContext.java | 20 +++++ .../plugin/context/PlayerOptionalContext.java | 4 +- .../plugin/context/RelationalContext.java | 12 +++ .../core/plugin/context/SimpleContext.java | 12 +++ .../core/plugin/context/ViewerContext.java | 67 ++++++++++++++++ .../context/condition/AllOfCondition.java | 3 +- .../context/condition/AnyOfCondition.java | 3 +- .../context/condition/CommonConditions.java | 1 + .../context/condition/ConditionFactory.java | 11 +++ .../context/condition/DistanceCondition.java | 65 ++++++++++++++++ .../context/condition/EmptyCondition.java | 3 +- .../condition/EnchantmentCondition.java | 7 +- .../condition/FallingBlockCondition.java | 3 +- .../context/condition/InvertedCondition.java | 3 +- .../MatchBlockPropertyCondition.java | 7 +- .../context/condition/MatchItemCondition.java | 7 +- .../context/condition/RandomCondition.java | 23 ++++-- .../condition/SurvivesExplosionCondition.java | 3 +- .../condition/TableBonusCondition.java | 7 +- .../function/AbstractConditionalFunction.java | 55 +++++++++++++ .../context/function/CommandFunction.java | 78 +++++++++++++++++++ .../context/function/CommonFunctions.java | 8 ++ .../plugin/context/function/Function.java | 11 +++ .../context/parameter/CommonParameters.java | 2 - .../parameter/PlayerParameterProvider.java | 4 + .../context/parameter/PlayerParameters.java | 5 ++ .../context/selector/AllPlayerSelector.java | 58 ++++++++++++++ .../context/selector/PlayerSelector.java | 14 ++++ .../context/selector/PlayerSelectors.java | 21 +++++ .../context/selector/SelfPlayerSelector.java | 21 +++++ .../context/text/PlainTextProvider.java | 26 +++++++ .../plugin/context/text/TagTextProvider.java | 29 +++++++ .../plugin/context/text/TextProvider.java | 11 +++ .../plugin/context/text/TextProviders.java | 15 ++++ .../plugin/event/BlockEventConditions.java | 33 ++++++++ .../plugin/event/BlockEventFunctions.java | 40 ++++++++++ .../core/plugin/event/EventTrigger.java | 8 ++ .../core/plugin/event/Trigger.java | 15 ---- .../core/plugin/event/Triggers.java | 21 ----- .../core/plugin/network/NetworkManager.java | 2 +- .../text/minimessage/ExpressionTag.java | 59 ++++++++++++++ .../core/plugin/text/minimessage/I18NTag.java | 4 +- .../plugin/text/minimessage/ImageTag.java | 4 +- .../text/minimessage/IndexedArgumentTag.java | 5 +- .../text/minimessage/NamedArgumentTag.java | 5 +- .../text/minimessage/PlaceholderTag.java | 2 +- .../plugin/text/minimessage/ShiftTag.java | 2 +- .../minimessage/ViewerNamedArgumentTag.java | 16 ++++ .../minimessage/ViewerPlaceholderTag.java | 17 ++++ .../core/registry/BuiltInRegistries.java | 19 +++-- .../craftengine/core/registry/Registries.java | 15 ++-- .../momirealms/craftengine/core/util/Key.java | 8 +- gradle.properties | 4 +- 98 files changed, 1022 insertions(+), 216 deletions(-) create mode 100644 bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/BukkitPlatform.java rename core/src/main/java/net/momirealms/craftengine/core/loot/{condition => }/LootConditions.java (76%) rename core/src/main/java/net/momirealms/craftengine/core/loot/function/{LootFunctionApplyBonusCount.java => ApplyBonusCountFunction.java} (93%) rename core/src/main/java/net/momirealms/craftengine/core/loot/function/{LootFunctionDropExp.java => DropExpFunction.java} (84%) rename core/src/main/java/net/momirealms/craftengine/core/loot/function/{LootFunctionExplosionDecay.java => ExplosionDecayFunction.java} (85%) rename core/src/main/java/net/momirealms/craftengine/core/loot/function/{LootFunctionSetCount.java => SetCountFunction.java} (83%) create mode 100644 core/src/main/java/net/momirealms/craftengine/core/plugin/Platform.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/plugin/context/PlayerFurnitureActionContext.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/plugin/context/RelationalContext.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/plugin/context/SimpleContext.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/plugin/context/ViewerContext.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/ConditionFactory.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/DistanceCondition.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/AbstractConditionalFunction.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/CommandFunction.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/CommonFunctions.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/Function.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/plugin/context/selector/AllPlayerSelector.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/plugin/context/selector/PlayerSelector.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/plugin/context/selector/PlayerSelectors.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/plugin/context/selector/SelfPlayerSelector.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/plugin/context/text/PlainTextProvider.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/plugin/context/text/TagTextProvider.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/plugin/context/text/TextProvider.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/plugin/context/text/TextProviders.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/plugin/event/BlockEventConditions.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/plugin/event/BlockEventFunctions.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/plugin/event/EventTrigger.java delete mode 100644 core/src/main/java/net/momirealms/craftengine/core/plugin/event/Trigger.java delete mode 100644 core/src/main/java/net/momirealms/craftengine/core/plugin/event/Triggers.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/ExpressionTag.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/ViewerNamedArgumentTag.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/ViewerPlaceholderTag.java diff --git a/bukkit/legacy/src/main/java/net/momirealms/craftengine/bukkit/util/LegacyAttributeUtils.java b/bukkit/legacy/src/main/java/net/momirealms/craftengine/bukkit/util/LegacyAttributeUtils.java index 46552b43f..639c83553 100644 --- a/bukkit/legacy/src/main/java/net/momirealms/craftengine/bukkit/util/LegacyAttributeUtils.java +++ b/bukkit/legacy/src/main/java/net/momirealms/craftengine/bukkit/util/LegacyAttributeUtils.java @@ -1,13 +1,20 @@ package net.momirealms.craftengine.bukkit.util; import org.bukkit.attribute.Attribute; +import org.bukkit.attribute.AttributeInstance; import org.bukkit.entity.ArmorStand; +import org.bukkit.entity.Player; import java.util.Objects; +import java.util.Optional; public class LegacyAttributeUtils { public static void setMaxHealth(ArmorStand entity) { Objects.requireNonNull(entity.getAttribute(Attribute.GENERIC_MAX_HEALTH)).setBaseValue(0.01); } + + public static double getLuck(Player player) { + return Optional.ofNullable(player.getAttribute(Attribute.GENERIC_LUCK)).map(AttributeInstance::getValue).orElse(1d); + } } diff --git a/bukkit/loader/src/main/resources/translations/en.yml b/bukkit/loader/src/main/resources/translations/en.yml index 6011167dd..5e545aeb3 100644 --- a/bukkit/loader/src/main/resources/translations/en.yml +++ b/bukkit/loader/src/main/resources/translations/en.yml @@ -291,4 +291,5 @@ warning.config.conflict_matcher.inverted.missing_term: "Issue found in c warning.config.conflict_matcher.all_of.missing_terms: "Issue found in config.yml at 'resource-pack.duplicated-files-handler' - Missing required 'terms' argument for 'all_of' matcher." warning.config.conflict_matcher.any_of.missing_terms: "Issue found in config.yml at 'resource-pack.duplicated-files-handler' - Missing required 'terms' argument for 'any_of' matcher." warning.config.conflict_resolution.missing_type: "Issue found in config.yml at 'resource-pack.duplicated-files-handler' - Missing required 'type' argument for one of the resolutions." -warning.config.conflict_resolution.invalid_type: "Issue found in config.yml at 'resource-pack.duplicated-files-handler' - One of the resolutions is using the invalid type ''." \ No newline at end of file +warning.config.conflict_resolution.invalid_type: "Issue found in config.yml at 'resource-pack.duplicated-files-handler' - One of the resolutions is using the invalid type ''." +warning.config.function.command.missing_command: "Issue found in file - The config '' is missing the required 'command' argument for 'command' function." \ No newline at end of file diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/CraftEngineBlocks.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/CraftEngineBlocks.java index 49a12d9ca..17a8d21b4 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/CraftEngineBlocks.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/CraftEngineBlocks.java @@ -10,7 +10,6 @@ import net.momirealms.craftengine.bukkit.world.BukkitWorld; import net.momirealms.craftengine.core.block.CustomBlock; import net.momirealms.craftengine.core.block.ImmutableBlockState; import net.momirealms.craftengine.core.block.UpdateOption; -import net.momirealms.craftengine.core.entity.player.InteractionHand; import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.plugin.context.ContextHolder; import net.momirealms.craftengine.core.plugin.context.parameter.CommonParameters; @@ -176,9 +175,9 @@ public final class CraftEngineBlocks { BukkitServerPlayer serverPlayer = BukkitCraftEngine.instance().adapt(player); if (player != null) { builder.withParameter(CommonParameters.PLAYER, serverPlayer); - builder.withOptionalParameter(CommonParameters.TOOL, serverPlayer.getItemInHand(InteractionHand.MAIN_HAND)); + //mark item builder.withOptionalParameter(CommonParameters.MAIN_HAND_ITEM, serverPlayer.getItemInHand(InteractionHand.MAIN_HAND)); } - for (Item item : state.getDrops(builder, world)) { + for (Item item : state.getDrops(builder, world, serverPlayer)) { world.dropItemNaturally(vec3d, item); } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/CraftEngineFurniture.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/CraftEngineFurniture.java index 96b537084..134fda9a6 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/CraftEngineFurniture.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/CraftEngineFurniture.java @@ -9,7 +9,6 @@ import net.momirealms.craftengine.bukkit.util.LocationUtils; import net.momirealms.craftengine.bukkit.world.BukkitWorld; import net.momirealms.craftengine.core.entity.furniture.AnchorType; import net.momirealms.craftengine.core.entity.furniture.CustomFurniture; -import net.momirealms.craftengine.core.entity.player.InteractionHand; import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.loot.LootTable; import net.momirealms.craftengine.core.plugin.context.ContextHolder; @@ -275,9 +274,9 @@ public final class CraftEngineFurniture { builder.withParameter(CommonParameters.WORLD, world); if (player != null) { builder.withParameter(CommonParameters.PLAYER, player); - builder.withOptionalParameter(CommonParameters.TOOL, player.getItemInHand(InteractionHand.MAIN_HAND)); + //mark item builder.withOptionalParameter(CommonParameters.MAIN_HAND_ITEM, player.getItemInHand(InteractionHand.MAIN_HAND)); } - List> items = lootTable.getRandomItems(builder.build(), world); + List> items = lootTable.getRandomItems(builder.build(), world, player); for (Item item : items) { world.dropItemNaturally(vec3d, item); } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BlockEventListener.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BlockEventListener.java index edb48354b..a31e0023a 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BlockEventListener.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BlockEventListener.java @@ -153,9 +153,9 @@ public class BlockEventListener implements Listener { ContextHolder.Builder builder = ContextHolder.builder() .withParameter(CommonParameters.WORLD, world) .withParameter(CommonParameters.LOCATION, vec3d) - .withParameter(CommonParameters.PLAYER, serverPlayer) - .withOptionalParameter(CommonParameters.TOOL, itemInHand); - for (Item item : state.getDrops(builder, world)) { + .withParameter(CommonParameters.PLAYER, serverPlayer); + //mark item .withOptionalParameter(CommonParameters.MAIN_HAND_ITEM, itemInHand); + for (Item item : state.getDrops(builder, world, serverPlayer)) { world.dropItemNaturally(vec3d, item); } } @@ -174,11 +174,11 @@ public class BlockEventListener implements Listener { ContextHolder.Builder builder = ContextHolder.builder() .withParameter(CommonParameters.WORLD, world) .withParameter(CommonParameters.LOCATION, vec3d) - .withParameter(CommonParameters.PLAYER, serverPlayer) - .withOptionalParameter(CommonParameters.TOOL, serverPlayer.getItemInHand(InteractionHand.MAIN_HAND)); + .withParameter(CommonParameters.PLAYER, serverPlayer); + //mark item .withOptionalParameter(CommonParameters.MAIN_HAND_ITEM, serverPlayer.getItemInHand(InteractionHand.MAIN_HAND)); ContextHolder contextHolder = builder.build(); for (LootTable lootTable : it.lootTables()) { - for (Item item : lootTable.getRandomItems(contextHolder, world)) { + for (Item item : lootTable.getRandomItems(contextHolder, world, serverPlayer)) { world.dropItemNaturally(vec3d, item); } } @@ -216,7 +216,7 @@ public class BlockEventListener implements Listener { ContextHolder.Builder builder = ContextHolder.builder() .withParameter(CommonParameters.WORLD, world) .withParameter(CommonParameters.LOCATION, vec3d); - for (Item item : immutableBlockState.getDrops(builder, world)) { + for (Item item : immutableBlockState.getDrops(builder, world, null)) { world.dropItemNaturally(vec3d, item); } } @@ -236,7 +236,7 @@ public class BlockEventListener implements Listener { builder.withParameter(CommonParameters.LOCATION, vec3d); ContextHolder contextHolder = builder.build(); for (LootTable lootTable : it.lootTables()) { - for (Item item : lootTable.getRandomItems(contextHolder, world)) { + for (Item item : lootTable.getRandomItems(contextHolder, world, null)) { world.dropItemNaturally(vec3d, item); } } @@ -334,7 +334,7 @@ public class BlockEventListener implements Listener { if (yield < 1f) { builder.withParameter(CommonParameters.EXPLOSION_RADIUS, 1.0f / yield); } - for (Item item : state.getDrops(builder, world)) { + for (Item item : state.getDrops(builder, world, null)) { world.dropItemNaturally(vec3d, item); } world.playBlockSound(vec3d, state.sounds().breakSound()); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/FallingBlockRemoveListener.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/FallingBlockRemoveListener.java index 1023e23c6..20e17db9d 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/FallingBlockRemoveListener.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/FallingBlockRemoveListener.java @@ -40,7 +40,7 @@ public class FallingBlockRemoveListener implements Listener { net.momirealms.craftengine.core.world.World world = new BukkitWorld(fallingBlock.getWorld()); builder.withParameter(CommonParameters.LOCATION, vec3d); builder.withParameter(CommonParameters.WORLD, world); - for (Item item : immutableBlockState.getDrops(builder, world)) { + for (Item item : immutableBlockState.getDrops(builder, world, null)) { world.dropItemNaturally(vec3d, item); } Object entityData = Reflections.field$Entity$entityData.get(fallingBlockEntity); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BushBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BushBlockBehavior.java index beb24c5d2..06b6bac69 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BushBlockBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BushBlockBehavior.java @@ -73,7 +73,7 @@ public class BushBlockBehavior extends BukkitBlockBehavior { net.momirealms.craftengine.core.world.World world = new BukkitWorld(FastNMS.INSTANCE.method$Level$getCraftWorld(level)); builder.withParameter(CommonParameters.LOCATION, vec3d); builder.withParameter(CommonParameters.WORLD, world); - for (Item item : previousState.getDrops(builder, world)) { + for (Item item : previousState.getDrops(builder, world, null)) { world.dropItemNaturally(vec3d, item); } world.playBlockSound(vec3d, previousState.sounds().breakSound()); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/CropBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/CropBlockBehavior.java index 0c13c3867..f74239a2d 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/CropBlockBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/CropBlockBehavior.java @@ -12,8 +12,8 @@ import net.momirealms.craftengine.core.block.UpdateOption; import net.momirealms.craftengine.core.block.behavior.BlockBehaviorFactory; import net.momirealms.craftengine.core.block.properties.IntegerProperty; import net.momirealms.craftengine.core.block.properties.Property; -import net.momirealms.craftengine.core.loot.LootContext; import net.momirealms.craftengine.core.plugin.context.ContextHolder; +import net.momirealms.craftengine.core.plugin.context.SimpleContext; import net.momirealms.craftengine.core.plugin.context.number.NumberProvider; import net.momirealms.craftengine.core.plugin.context.number.NumberProviders; import net.momirealms.craftengine.core.plugin.context.parameter.CommonParameters; @@ -145,12 +145,14 @@ public class CropBlockBehavior extends BushBlockBehavior { int x = FastNMS.INSTANCE.field$Vec3i$x(pos); int y = FastNMS.INSTANCE.field$Vec3i$y(pos); int z = FastNMS.INSTANCE.field$Vec3i$z(pos); - - net.momirealms.craftengine.core.world.World wrappedWorld = new BukkitWorld(world); - int i = this.getAge(immutableBlockState) + this.boneMealBonus.getInt(new LootContext(wrappedWorld, 1, ContextHolder.builder() - .withParameter(CommonParameters.WORLD, wrappedWorld) - .withParameter(CommonParameters.LOCATION, Vec3d.atCenterOf(new Vec3i(x, y, z))) - .build())); + int i = this.getAge(immutableBlockState) + this.boneMealBonus.getInt( + SimpleContext.of( + ContextHolder.builder() + .withParameter(CommonParameters.WORLD, new BukkitWorld(world)) + .withParameter(CommonParameters.LOCATION, Vec3d.atCenterOf(new Vec3i(x, y, z))) + .build() + ) + ); int maxAge = this.ageProperty.max; if (i > maxAge) { i = maxAge; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/FallingBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/FallingBlockBehavior.java index e7d04e967..f90956c5f 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/FallingBlockBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/FallingBlockBehavior.java @@ -99,7 +99,7 @@ public class FallingBlockBehavior extends BukkitBlockBehavior { net.momirealms.craftengine.core.world.World world = new BukkitWorld(FastNMS.INSTANCE.method$Level$getCraftWorld(level)); builder.withParameter(CommonParameters.LOCATION, vec3d); builder.withParameter(CommonParameters.WORLD, world); - for (Item item : immutableBlockState.getDrops(builder, world)) { + for (Item item : immutableBlockState.getDrops(builder, world, null)) { world.dropItemNaturally(vec3d, item); } Object entityData = Reflections.field$Entity$entityData.get(fallingBlockEntity); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/LeavesBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/LeavesBlockBehavior.java index 572ebf985..cf88d726f 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/LeavesBlockBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/LeavesBlockBehavior.java @@ -127,7 +127,7 @@ public class LeavesBlockBehavior extends WaterLoggedBlockBehavior { ContextHolder.Builder builder = ContextHolder.builder() .withParameter(CommonParameters.LOCATION, vec3d) .withParameter(CommonParameters.WORLD, world); - for (Item item : immutableBlockState.getDrops(builder, world)) { + for (Item item : immutableBlockState.getDrops(builder, world, null)) { world.dropItemNaturally(vec3d, item); } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/SugarCaneBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/SugarCaneBlockBehavior.java index dc31b1b67..1deb5712f 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/SugarCaneBlockBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/SugarCaneBlockBehavior.java @@ -63,7 +63,7 @@ public class SugarCaneBlockBehavior extends BushBlockBehavior { ContextHolder.Builder builder = ContextHolder.builder() .withParameter(CommonParameters.LOCATION, vec3d) .withParameter(CommonParameters.WORLD, world); - for (Item item : currentState.getDrops(builder, world)) { + for (Item item : currentState.getDrops(builder, world, null)) { world.dropItemNaturally(vec3d, item); } world.playBlockSound(vec3d, currentState.sounds().breakSound()); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/BukkitEntity.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/BukkitEntity.java index 0c719082d..d8bc859de 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/BukkitEntity.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/BukkitEntity.java @@ -1,8 +1,10 @@ package net.momirealms.craftengine.bukkit.entity; +import net.momirealms.craftengine.bukkit.util.KeyUtils; import net.momirealms.craftengine.bukkit.world.BukkitWorld; import net.momirealms.craftengine.core.entity.Entity; import net.momirealms.craftengine.core.util.Direction; +import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.world.World; import java.lang.ref.WeakReference; @@ -62,4 +64,9 @@ public class BukkitEntity extends Entity { public org.bukkit.entity.Entity literalObject() { return this.entity.get(); } + + @Override + public Key type() { + return KeyUtils.namespacedKey2Key(literalObject().getType().getKey()); + } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/loot/BukkitVanillaLootManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/loot/BukkitVanillaLootManager.java index 665e1fd2f..f994c121b 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/loot/BukkitVanillaLootManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/loot/BukkitVanillaLootManager.java @@ -6,7 +6,6 @@ import net.momirealms.craftengine.bukkit.util.BlockStateUtils; import net.momirealms.craftengine.bukkit.util.KeyUtils; import net.momirealms.craftengine.bukkit.util.Reflections; import net.momirealms.craftengine.bukkit.world.BukkitWorld; -import net.momirealms.craftengine.core.entity.player.InteractionHand; import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.loot.AbstractVanillaLootManager; import net.momirealms.craftengine.core.loot.LootTable; @@ -70,16 +69,17 @@ public class BukkitVanillaLootManager extends AbstractVanillaLootManager impleme ContextHolder.Builder builder = ContextHolder.builder(); builder.withParameter(CommonParameters.WORLD, world); builder.withParameter(CommonParameters.LOCATION, vec3d); + BukkitServerPlayer optionalPlayer = null; if (VersionHelper.isOrAbove1_20_5()) { if (event.getDamageSource().getCausingEntity() instanceof Player player) { - BukkitServerPlayer serverPlayer = this.plugin.adapt(player); - builder.withParameter(CommonParameters.PLAYER, serverPlayer); - builder.withOptionalParameter(CommonParameters.TOOL, serverPlayer.getItemInHand(InteractionHand.MAIN_HAND)); + optionalPlayer = this.plugin.adapt(player); + builder.withParameter(CommonParameters.PLAYER, optionalPlayer); + //mark item builder.withOptionalParameter(CommonParameters.MAIN_HAND_ITEM, serverPlayer.getItemInHand(InteractionHand.MAIN_HAND)); } } ContextHolder contextHolder = builder.build(); for (LootTable lootTable : loot.lootTables()) { - for (Item item : lootTable.getRandomItems(contextHolder, world)) { + for (Item item : lootTable.getRandomItems(contextHolder, world, optionalPlayer)) { world.dropItemNaturally(vec3d, item); } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/BukkitCraftEngine.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/BukkitCraftEngine.java index d6741da96..fe7f48e8f 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/BukkitCraftEngine.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/BukkitCraftEngine.java @@ -75,6 +75,7 @@ public class BukkitCraftEngine extends CraftEngine { super.classPathAppender = new ReflectionClassPathAppender(this); super.scheduler = new BukkitSchedulerAdapter(this); super.logger = new JavaPluginLogger(bootstrap.getLogger()); + super.platform = new BukkitPlatform(); // find mod class if present Class modClass = ReflectionUtils.getClazz(MOD_CLASS); if (modClass != null) { diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/BukkitPlatform.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/BukkitPlatform.java new file mode 100644 index 000000000..2b3647fa1 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/BukkitPlatform.java @@ -0,0 +1,12 @@ +package net.momirealms.craftengine.bukkit.plugin; + +import net.momirealms.craftengine.core.plugin.Platform; +import org.bukkit.Bukkit; + +public class BukkitPlatform implements Platform { + + @Override + public void dispatchCommand(String command) { + Bukkit.getServer().dispatchCommand(Bukkit.getConsoleSender(), command); + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java index c5c54386d..c3352106c 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java @@ -26,6 +26,8 @@ import net.momirealms.craftengine.core.world.BlockPos; import net.momirealms.craftengine.core.world.World; import net.momirealms.craftengine.core.world.WorldEvents; import org.bukkit.*; +import org.bukkit.attribute.Attribute; +import org.bukkit.attribute.AttributeInstance; import org.bukkit.block.Block; import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.ItemStack; @@ -800,4 +802,18 @@ public class BukkitServerPlayer extends Player { this.resourcePackUUID.clear(); } } + + @Override + public void performCommand(String command) { + platformPlayer().performCommand(command); + } + + @Override + public double luck() { + if (VersionHelper.isOrAbove1_21_3()) { + return Optional.ofNullable(platformPlayer().getAttribute(Attribute.LUCK)).map(AttributeInstance::getValue).orElse(1d); + } else { + return LegacyAttributeUtils.getLuck(platformPlayer()); + } + } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/ImmutableBlockState.java b/core/src/main/java/net/momirealms/craftengine/core/block/ImmutableBlockState.java index dad93e792..7e53699aa 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/block/ImmutableBlockState.java +++ b/core/src/main/java/net/momirealms/craftengine/core/block/ImmutableBlockState.java @@ -2,6 +2,7 @@ package net.momirealms.craftengine.core.block; import it.unimi.dsi.fastutil.objects.Reference2ObjectArrayMap; import net.momirealms.craftengine.core.block.properties.Property; +import net.momirealms.craftengine.core.entity.player.Player; import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.loot.LootTable; import net.momirealms.craftengine.core.plugin.context.ContextHolder; @@ -12,6 +13,7 @@ import net.momirealms.craftengine.shared.block.BlockBehavior; import net.momirealms.sparrow.nbt.CompoundTag; import net.momirealms.sparrow.nbt.NBT; import net.momirealms.sparrow.nbt.Tag; +import org.jetbrains.annotations.NotNull; import javax.annotation.Nullable; import java.util.List; @@ -138,12 +140,16 @@ public class ImmutableBlockState extends BlockStateHolder { return state.with(property, (T) value); } + public List> getDrops(@NotNull ContextHolder.Builder builder, @NotNull World world) { + return this.getDrops(builder, world, null); + } + @SuppressWarnings("unchecked") - public List> getDrops(ContextHolder.Builder builder, World world) { + public List> getDrops(@NotNull ContextHolder.Builder builder, @NotNull World world, @Nullable Player player) { CustomBlock block = owner.value(); if (block == null) return List.of(); LootTable lootTable = (LootTable) block.lootTable(); if (lootTable == null) return List.of(); - return lootTable.getRandomItems(builder.withParameter(CommonParameters.BLOCK_STATE, this).build(), world); + return lootTable.getRandomItems(builder.withParameter(CommonParameters.BLOCK_STATE, this).build(), world, player); } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/Entity.java b/core/src/main/java/net/momirealms/craftengine/core/entity/Entity.java index 4df160563..24efd4208 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/entity/Entity.java +++ b/core/src/main/java/net/momirealms/craftengine/core/entity/Entity.java @@ -1,16 +1,24 @@ package net.momirealms.craftengine.core.entity; import net.momirealms.craftengine.core.util.Direction; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.world.Vec3d; import net.momirealms.craftengine.core.world.World; public abstract class Entity { + public abstract Key type(); + public abstract double x(); public abstract double y(); public abstract double z(); + public Vec3d position() { + return new Vec3d(x(), y(), z()); + } + public abstract void tick(); public abstract int entityID(); diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/player/Player.java b/core/src/main/java/net/momirealms/craftengine/core/entity/player/Player.java index 0af8d0e34..48d6b6185 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/entity/player/Player.java +++ b/core/src/main/java/net/momirealms/craftengine/core/entity/player/Player.java @@ -11,6 +11,7 @@ import org.jetbrains.annotations.Nullable; import java.util.List; public abstract class Player extends Entity implements NetWorkUser { + private static final Key TYPE = Key.of("minecraft:player"); public abstract boolean isSecondaryUseActive(); @@ -84,4 +85,13 @@ public abstract class Player extends Entity implements NetWorkUser { public abstract void clearView(); public abstract void unloadCurrentResourcePack(); + + public abstract void performCommand(String command); + + public abstract double luck(); + + @Override + public Key type() { + return TYPE; + } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomSmithingTransformRecipe.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomSmithingTransformRecipe.java index 5d83f7df0..b4698e00b 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomSmithingTransformRecipe.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomSmithingTransformRecipe.java @@ -185,15 +185,15 @@ public class CustomSmithingTransformRecipe implements Recipe { throw new LocalizedResourceConfigException("warning.config.recipe.smithing_transform.post_processor.missing_type"); } Key key = Key.withDefaultNamespace(type, Key.DEFAULT_NAMESPACE); - ItemDataProcessor.Factory factory = BuiltInRegistries.SMITHING_RESULT_PROCESSOR_FACTORY.getValue(key); + ItemDataProcessor.ProcessorFactory factory = BuiltInRegistries.SMITHING_RESULT_PROCESSOR_FACTORY.getValue(key); if (factory == null) { throw new LocalizedResourceConfigException("warning.config.recipe.smithing_transform.post_processor.invalid_type", type); } return factory.create(map); } - public static void register(Key key, ItemDataProcessor.Factory factory) { - Holder.Reference holder = ((WritableRegistry) BuiltInRegistries.SMITHING_RESULT_PROCESSOR_FACTORY) + public static void register(Key key, ItemDataProcessor.ProcessorFactory factory) { + Holder.Reference holder = ((WritableRegistry) BuiltInRegistries.SMITHING_RESULT_PROCESSOR_FACTORY) .registerForHolder(new ResourceKey<>(Registries.SMITHING_RESULT_PROCESSOR_FACTORY.location(), key)); holder.bindValue(factory); } @@ -203,7 +203,7 @@ public class CustomSmithingTransformRecipe implements Recipe { Key type(); - interface Factory { + interface ProcessorFactory { ItemDataProcessor create(Map arguments); } } @@ -231,7 +231,7 @@ public class CustomSmithingTransformRecipe implements Recipe { return ItemDataProcessors.KEEP_COMPONENTS; } - public static class Factory implements ItemDataProcessor.Factory { + public static class Factory implements ProcessorFactory { @Override public ItemDataProcessor create(Map arguments) { @@ -268,7 +268,7 @@ public class CustomSmithingTransformRecipe implements Recipe { return ItemDataProcessors.KEEP_TAGS; } - public static class Factory implements ItemDataProcessor.Factory { + public static class Factory implements ProcessorFactory { @Override public ItemDataProcessor create(Map arguments) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditions.java b/core/src/main/java/net/momirealms/craftengine/core/loot/LootConditions.java similarity index 76% rename from core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditions.java rename to core/src/main/java/net/momirealms/craftengine/core/loot/LootConditions.java index f3ce5cd7d..0dc4c9a32 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditions.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/LootConditions.java @@ -1,6 +1,5 @@ -package net.momirealms.craftengine.core.loot.condition; +package net.momirealms.craftengine.core.loot; -import net.momirealms.craftengine.core.loot.LootContext; import net.momirealms.craftengine.core.plugin.context.Condition; import net.momirealms.craftengine.core.plugin.context.condition.*; import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; @@ -8,7 +7,6 @@ import net.momirealms.craftengine.core.registry.BuiltInRegistries; import net.momirealms.craftengine.core.registry.Holder; import net.momirealms.craftengine.core.registry.Registries; import net.momirealms.craftengine.core.registry.WritableRegistry; -import net.momirealms.craftengine.core.util.Factory; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.ResourceConfigUtils; import net.momirealms.craftengine.core.util.ResourceKey; @@ -31,10 +29,11 @@ public class LootConditions { register(CommonConditions.INVERTED, new InvertedCondition.FactoryImpl<>(LootConditions::fromMap)); register(CommonConditions.FALLING_BLOCK, new FallingBlockCondition.FactoryImpl<>()); register(CommonConditions.RANDOM, new RandomCondition.FactoryImpl<>()); + register(CommonConditions.DISTANCE, new DistanceCondition.FactoryImpl<>()); } - public static void register(Key key, Factory> factory) { - Holder.Reference>> holder = ((WritableRegistry>>) BuiltInRegistries.LOOT_CONDITION_FACTORY) + public static void register(Key key, ConditionFactory factory) { + Holder.Reference> holder = ((WritableRegistry>) BuiltInRegistries.LOOT_CONDITION_FACTORY) .registerForHolder(new ResourceKey<>(Registries.LOOT_CONDITION_FACTORY.location(), key)); holder.bindValue(factory); } @@ -85,10 +84,18 @@ public class LootConditions { public static Condition fromMap(Map map) { String type = ResourceConfigUtils.requireNonEmptyStringOrThrow(map.get("type"), "warning.config.loot_table.condition.missing_type"); Key key = Key.withDefaultNamespace(type, Key.DEFAULT_NAMESPACE); - Factory> factory = BuiltInRegistries.LOOT_CONDITION_FACTORY.getValue(key); - if (factory == null) { - throw new LocalizedResourceConfigException("warning.config.loot_table.condition.invalid_type", type); + if (key.value().charAt(0) == '!') { + ConditionFactory factory = BuiltInRegistries.LOOT_CONDITION_FACTORY.getValue(new Key(key.namespace(), key.value().substring(1))); + if (factory == null) { + throw new LocalizedResourceConfigException("warning.config.loot_table.condition.invalid_type", type); + } + return new InvertedCondition<>(factory.create(map)); + } else { + ConditionFactory factory = BuiltInRegistries.LOOT_CONDITION_FACTORY.getValue(key); + if (factory == null) { + throw new LocalizedResourceConfigException("warning.config.loot_table.condition.invalid_type", type); + } + return factory.create(map); } - return factory.create(map); } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/LootContext.java b/core/src/main/java/net/momirealms/craftengine/core/loot/LootContext.java index c67948fdc..c7251cd9e 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/LootContext.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/LootContext.java @@ -1,25 +1,38 @@ package net.momirealms.craftengine.core.loot; +import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.plugin.context.ContextHolder; import net.momirealms.craftengine.core.plugin.context.PlayerOptionalContext; -import net.momirealms.craftengine.core.plugin.context.parameter.CommonParameters; import net.momirealms.craftengine.core.world.World; +import org.jetbrains.annotations.NotNull; + +import javax.annotation.Nullable; public class LootContext extends PlayerOptionalContext { private final World world; private final float luck; + private Item tempLoot; - public LootContext(World world, float luck, ContextHolder contexts) { - super(contexts.getOptional(CommonParameters.PLAYER).orElse(null), contexts); + public LootContext(@NotNull World world, @Nullable Player player, float luck, @NotNull ContextHolder contexts) { + super(player, contexts); this.world = world; this.luck = luck; } public float luck() { - return luck; + return this.luck; } public World world() { - return world; + return this.world; + } + + public Item tempLoot() { + return this.tempLoot; + } + + public void setTempLoot(Item tempLoot) { + this.tempLoot = tempLoot; } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/LootPool.java b/core/src/main/java/net/momirealms/craftengine/core/loot/LootPool.java index 1bc846899..41694006f 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/LootPool.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/LootPool.java @@ -2,7 +2,6 @@ package net.momirealms.craftengine.core.loot; import com.google.common.collect.Lists; import net.momirealms.craftengine.core.item.Item; -import net.momirealms.craftengine.core.loot.condition.LootConditions; import net.momirealms.craftengine.core.loot.entry.LootEntry; import net.momirealms.craftengine.core.loot.entry.LootEntryContainer; import net.momirealms.craftengine.core.loot.function.LootFunction; diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/LootTable.java b/core/src/main/java/net/momirealms/craftengine/core/loot/LootTable.java index 8804ac429..3ea626c53 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/LootTable.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/LootTable.java @@ -1,8 +1,8 @@ package net.momirealms.craftengine.core.loot; import com.google.common.collect.Lists; +import net.momirealms.craftengine.core.entity.player.Player; import net.momirealms.craftengine.core.item.Item; -import net.momirealms.craftengine.core.loot.condition.LootConditions; import net.momirealms.craftengine.core.loot.entry.LootEntryContainer; import net.momirealms.craftengine.core.loot.entry.LootEntryContainers; import net.momirealms.craftengine.core.loot.function.LootFunction; @@ -79,7 +79,11 @@ public class LootTable { } public ArrayList> getRandomItems(ContextHolder parameters, World world) { - return this.getRandomItems(new LootContext(world, 1, parameters)); + return this.getRandomItems(parameters, world, null); + } + + public ArrayList> getRandomItems(ContextHolder parameters, World world, @Nullable Player player) { + return this.getRandomItems(new LootContext(world, player, player == null ? 1f : (float) player.luck(), parameters)); } private ArrayList> getRandomItems(LootContext context) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/entry/AlternativesLootEntryContainer.java b/core/src/main/java/net/momirealms/craftengine/core/loot/entry/AlternativesLootEntryContainer.java index 9b22cbf89..9ed2f42e4 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/entry/AlternativesLootEntryContainer.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/entry/AlternativesLootEntryContainer.java @@ -1,7 +1,7 @@ package net.momirealms.craftengine.core.loot.entry; +import net.momirealms.craftengine.core.loot.LootConditions; import net.momirealms.craftengine.core.loot.LootContext; -import net.momirealms.craftengine.core.loot.condition.LootConditions; import net.momirealms.craftengine.core.plugin.context.Condition; import net.momirealms.craftengine.core.util.Key; diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/entry/ExpLootEntryContainer.java b/core/src/main/java/net/momirealms/craftengine/core/loot/entry/ExpLootEntryContainer.java index 4c03b9873..eaf7a96ac 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/entry/ExpLootEntryContainer.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/entry/ExpLootEntryContainer.java @@ -1,7 +1,7 @@ package net.momirealms.craftengine.core.loot.entry; +import net.momirealms.craftengine.core.loot.LootConditions; import net.momirealms.craftengine.core.loot.LootContext; -import net.momirealms.craftengine.core.loot.condition.LootConditions; import net.momirealms.craftengine.core.plugin.context.Condition; import net.momirealms.craftengine.core.plugin.context.number.NumberProvider; import net.momirealms.craftengine.core.plugin.context.number.NumberProviders; diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/entry/SingleItemLootEntryContainer.java b/core/src/main/java/net/momirealms/craftengine/core/loot/entry/SingleItemLootEntryContainer.java index a17fecb5b..4b5c300f2 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/entry/SingleItemLootEntryContainer.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/entry/SingleItemLootEntryContainer.java @@ -1,8 +1,8 @@ package net.momirealms.craftengine.core.loot.entry; import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.loot.LootConditions; import net.momirealms.craftengine.core.loot.LootContext; -import net.momirealms.craftengine.core.loot.condition.LootConditions; import net.momirealms.craftengine.core.loot.function.LootFunction; import net.momirealms.craftengine.core.loot.function.LootFunctions; import net.momirealms.craftengine.core.plugin.CraftEngine; diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctionApplyBonusCount.java b/core/src/main/java/net/momirealms/craftengine/core/loot/function/ApplyBonusCountFunction.java similarity index 93% rename from core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctionApplyBonusCount.java rename to core/src/main/java/net/momirealms/craftengine/core/loot/function/ApplyBonusCountFunction.java index 988839a5b..ea6f98583 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctionApplyBonusCount.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/function/ApplyBonusCountFunction.java @@ -2,10 +2,10 @@ package net.momirealms.craftengine.core.loot.function; import net.momirealms.craftengine.core.item.Enchantment; import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.loot.LootConditions; import net.momirealms.craftengine.core.loot.LootContext; -import net.momirealms.craftengine.core.loot.condition.LootConditions; import net.momirealms.craftengine.core.plugin.context.Condition; -import net.momirealms.craftengine.core.plugin.context.parameter.CommonParameters; +import net.momirealms.craftengine.core.plugin.context.parameter.PlayerParameters; import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; import net.momirealms.craftengine.core.registry.BuiltInRegistries; import net.momirealms.craftengine.core.registry.Holder; @@ -18,12 +18,12 @@ import java.util.List; import java.util.Map; import java.util.Optional; -public class LootFunctionApplyBonusCount extends AbstractLootConditionalFunction { +public class ApplyBonusCountFunction extends AbstractLootConditionalFunction { public static final Factory FACTORY = new Factory<>(); private final Key enchantment; private final Formula formula; - public LootFunctionApplyBonusCount(List> predicates, Key enchantment, Formula formula) { + public ApplyBonusCountFunction(List> predicates, Key enchantment, Formula formula) { super(predicates); this.enchantment = enchantment; this.formula = formula; @@ -31,7 +31,7 @@ public class LootFunctionApplyBonusCount extends AbstractLootConditionalFunct @Override protected Item applyInternal(Item item, LootContext context) { - Optional> itemInHand = context.getOptionalParameter(CommonParameters.TOOL); + Optional> itemInHand = context.getOptionalParameter(PlayerParameters.MAIN_HAND_ITEM); int level = itemInHand.map(value -> value.getEnchantment(this.enchantment).map(Enchantment::level).orElse(0)).orElse(0); int newCount = this.formula.apply(item.count(), level); item.count(newCount); @@ -56,7 +56,7 @@ public class LootFunctionApplyBonusCount extends AbstractLootConditionalFunct List> conditions = Optional.ofNullable(arguments.get("conditions")) .map(it -> LootConditions.fromMapList((List>) it)) .orElse(Collections.emptyList()); - return new LootFunctionApplyBonusCount<>(conditions, Key.from(enchantment), Formulas.fromMap(formulaMap)); + return new ApplyBonusCountFunction<>(conditions, Key.from(enchantment), Formulas.fromMap(formulaMap)); } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctionDropExp.java b/core/src/main/java/net/momirealms/craftengine/core/loot/function/DropExpFunction.java similarity index 84% rename from core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctionDropExp.java rename to core/src/main/java/net/momirealms/craftengine/core/loot/function/DropExpFunction.java index 0a1d791b3..88e9664dc 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctionDropExp.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/function/DropExpFunction.java @@ -1,8 +1,8 @@ package net.momirealms.craftengine.core.loot.function; import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.loot.LootConditions; import net.momirealms.craftengine.core.loot.LootContext; -import net.momirealms.craftengine.core.loot.condition.LootConditions; import net.momirealms.craftengine.core.plugin.context.Condition; import net.momirealms.craftengine.core.plugin.context.number.NumberProvider; import net.momirealms.craftengine.core.plugin.context.number.NumberProviders; @@ -15,11 +15,11 @@ import java.util.List; import java.util.Map; import java.util.Optional; -public class LootFunctionDropExp extends AbstractLootConditionalFunction { +public class DropExpFunction extends AbstractLootConditionalFunction { public static final Factory FACTORY = new Factory<>(); private final NumberProvider value; - public LootFunctionDropExp(NumberProvider value, List> predicates) { + public DropExpFunction(NumberProvider value, List> predicates) { super(predicates); this.value = value; } @@ -44,7 +44,7 @@ public class LootFunctionDropExp extends AbstractLootConditionalFunction { List> conditions = Optional.ofNullable(arguments.get("conditions")) .map(it -> LootConditions.fromMapList((List>) it)) .orElse(Collections.emptyList()); - return new LootFunctionDropExp<>(NumberProviders.fromObject(value), conditions); + return new DropExpFunction<>(NumberProviders.fromObject(value), conditions); } } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctionExplosionDecay.java b/core/src/main/java/net/momirealms/craftengine/core/loot/function/ExplosionDecayFunction.java similarity index 85% rename from core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctionExplosionDecay.java rename to core/src/main/java/net/momirealms/craftengine/core/loot/function/ExplosionDecayFunction.java index 8e042ff08..0ab1b6f5e 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctionExplosionDecay.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/function/ExplosionDecayFunction.java @@ -1,8 +1,8 @@ package net.momirealms.craftengine.core.loot.function; import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.loot.LootConditions; import net.momirealms.craftengine.core.loot.LootContext; -import net.momirealms.craftengine.core.loot.condition.LootConditions; import net.momirealms.craftengine.core.plugin.context.Condition; import net.momirealms.craftengine.core.plugin.context.parameter.CommonParameters; import net.momirealms.craftengine.core.util.Key; @@ -13,10 +13,10 @@ import java.util.List; import java.util.Map; import java.util.Optional; -public class LootFunctionExplosionDecay extends AbstractLootConditionalFunction { +public class ExplosionDecayFunction extends AbstractLootConditionalFunction { public static final Factory FACTORY = new Factory<>(); - public LootFunctionExplosionDecay(List> predicates) { + public ExplosionDecayFunction(List> predicates) { super(predicates); } @@ -49,7 +49,7 @@ public class LootFunctionExplosionDecay extends AbstractLootConditionalFuncti List> conditions = Optional.ofNullable(arguments.get("conditions")) .map(it -> LootConditions.fromMapList((List>) it)) .orElse(Collections.emptyList()); - return new LootFunctionExplosionDecay<>(conditions); + return new ExplosionDecayFunction<>(conditions); } } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctions.java b/core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctions.java index 04fcf0709..e380bf022 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctions.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctions.java @@ -23,10 +23,10 @@ public class LootFunctions { public static final Key DROP_EXP = Key.from("craftengine:drop_exp"); static { - register(SET_COUNT, LootFunctionSetCount.FACTORY); - register(EXPLOSION_DECAY, LootFunctionExplosionDecay.FACTORY); - register(APPLY_BONUS, LootFunctionApplyBonusCount.FACTORY); - register(DROP_EXP, LootFunctionDropExp.FACTORY); + register(SET_COUNT, SetCountFunction.FACTORY); + register(EXPLOSION_DECAY, ExplosionDecayFunction.FACTORY); + register(APPLY_BONUS, ApplyBonusCountFunction.FACTORY); + register(DROP_EXP, DropExpFunction.FACTORY); } public static void register(Key key, LootFunctionFactory factory) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctionSetCount.java b/core/src/main/java/net/momirealms/craftengine/core/loot/function/SetCountFunction.java similarity index 83% rename from core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctionSetCount.java rename to core/src/main/java/net/momirealms/craftengine/core/loot/function/SetCountFunction.java index d0c8e92db..02cfdaa73 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctionSetCount.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/function/SetCountFunction.java @@ -1,8 +1,8 @@ package net.momirealms.craftengine.core.loot.function; import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.loot.LootConditions; import net.momirealms.craftengine.core.loot.LootContext; -import net.momirealms.craftengine.core.loot.condition.LootConditions; import net.momirealms.craftengine.core.plugin.context.Condition; import net.momirealms.craftengine.core.plugin.context.number.NumberProvider; import net.momirealms.craftengine.core.plugin.context.number.NumberProviders; @@ -14,13 +14,13 @@ import java.util.List; import java.util.Map; import java.util.Optional; -public class LootFunctionSetCount extends AbstractLootConditionalFunction { +public class SetCountFunction extends AbstractLootConditionalFunction { public static final Factory FACTORY = new Factory<>(); private final NumberProvider value; private final boolean add; - public LootFunctionSetCount(List> conditions, NumberProvider value, boolean add) { + public SetCountFunction(List> conditions, NumberProvider value, boolean add) { super(conditions); this.value = value; this.add = add; @@ -47,7 +47,7 @@ public class LootFunctionSetCount extends AbstractLootConditionalFunction List> conditions = Optional.ofNullable(arguments.get("conditions")) .map(it -> LootConditions.fromMapList((List>) it)) .orElse(Collections.emptyList()); - return new LootFunctionSetCount<>(conditions, NumberProviders.fromObject(value), add); + return new SetCountFunction<>(conditions, NumberProviders.fromObject(value), add); } } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherContains.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherContains.java index fba21b9e2..3c17607ca 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherContains.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherContains.java @@ -2,8 +2,8 @@ package net.momirealms.craftengine.core.pack.conflict.matcher; import net.momirealms.craftengine.core.pack.conflict.PathContext; import net.momirealms.craftengine.core.plugin.context.Condition; +import net.momirealms.craftengine.core.plugin.context.condition.ConditionFactory; import net.momirealms.craftengine.core.plugin.locale.LocalizedException; -import net.momirealms.craftengine.core.util.Factory; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.ResourceConfigUtils; @@ -27,7 +27,7 @@ public class PathMatcherContains implements Condition { return PathMatchers.CONTAINS; } - public static class FactoryImpl implements Factory> { + public static class FactoryImpl implements ConditionFactory { @Override public Condition create(Map arguments) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherExact.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherExact.java index e632d562a..bebd9c61a 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherExact.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherExact.java @@ -2,8 +2,8 @@ package net.momirealms.craftengine.core.pack.conflict.matcher; import net.momirealms.craftengine.core.pack.conflict.PathContext; import net.momirealms.craftengine.core.plugin.context.Condition; +import net.momirealms.craftengine.core.plugin.context.condition.ConditionFactory; import net.momirealms.craftengine.core.plugin.locale.LocalizedException; -import net.momirealms.craftengine.core.util.Factory; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.ResourceConfigUtils; @@ -27,7 +27,7 @@ public class PathMatcherExact implements Condition { return PathMatchers.EXACT; } - public static class FactoryImpl implements Factory> { + public static class FactoryImpl implements ConditionFactory { @Override public Condition create(Map arguments) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherFilename.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherFilename.java index a2e861d56..b7b7f2f26 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherFilename.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherFilename.java @@ -2,8 +2,8 @@ package net.momirealms.craftengine.core.pack.conflict.matcher; import net.momirealms.craftengine.core.pack.conflict.PathContext; import net.momirealms.craftengine.core.plugin.context.Condition; +import net.momirealms.craftengine.core.plugin.context.condition.ConditionFactory; import net.momirealms.craftengine.core.plugin.locale.LocalizedException; -import net.momirealms.craftengine.core.util.Factory; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.ResourceConfigUtils; @@ -27,7 +27,7 @@ public class PathMatcherFilename implements Condition { return PathMatchers.FILENAME; } - public static class FactoryImpl implements Factory> { + public static class FactoryImpl implements ConditionFactory { @Override public Condition create(Map arguments) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherParentPrefix.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherParentPrefix.java index df4b639c6..212ff4c39 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherParentPrefix.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherParentPrefix.java @@ -2,8 +2,8 @@ package net.momirealms.craftengine.core.pack.conflict.matcher; import net.momirealms.craftengine.core.pack.conflict.PathContext; import net.momirealms.craftengine.core.plugin.context.Condition; +import net.momirealms.craftengine.core.plugin.context.condition.ConditionFactory; import net.momirealms.craftengine.core.plugin.locale.LocalizedException; -import net.momirealms.craftengine.core.util.Factory; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.ResourceConfigUtils; @@ -30,7 +30,7 @@ public class PathMatcherParentPrefix implements Condition { return PathMatchers.PARENT_PATH_PREFIX; } - public static class FactoryImpl implements Factory> { + public static class FactoryImpl implements ConditionFactory { @Override public Condition create(Map arguments) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherParentSuffix.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherParentSuffix.java index c53ca69b6..77c061228 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherParentSuffix.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherParentSuffix.java @@ -2,8 +2,8 @@ package net.momirealms.craftengine.core.pack.conflict.matcher; import net.momirealms.craftengine.core.pack.conflict.PathContext; import net.momirealms.craftengine.core.plugin.context.Condition; +import net.momirealms.craftengine.core.plugin.context.condition.ConditionFactory; import net.momirealms.craftengine.core.plugin.locale.LocalizedException; -import net.momirealms.craftengine.core.util.Factory; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.ResourceConfigUtils; @@ -30,7 +30,7 @@ public class PathMatcherParentSuffix implements Condition { return PathMatchers.PARENT_PATH_SUFFIX; } - public static class FactoryImpl implements Factory> { + public static class FactoryImpl implements ConditionFactory { @Override public Condition create(Map arguments) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatchers.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatchers.java index a80c9bdde..7bffb8178 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatchers.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatchers.java @@ -2,16 +2,12 @@ package net.momirealms.craftengine.core.pack.conflict.matcher; import net.momirealms.craftengine.core.pack.conflict.PathContext; import net.momirealms.craftengine.core.plugin.context.Condition; -import net.momirealms.craftengine.core.plugin.context.condition.AllOfCondition; -import net.momirealms.craftengine.core.plugin.context.condition.AnyOfCondition; -import net.momirealms.craftengine.core.plugin.context.condition.InvertedCondition; -import net.momirealms.craftengine.core.plugin.context.condition.CommonConditions; +import net.momirealms.craftengine.core.plugin.context.condition.*; import net.momirealms.craftengine.core.plugin.locale.LocalizedException; import net.momirealms.craftengine.core.registry.BuiltInRegistries; import net.momirealms.craftengine.core.registry.Holder; import net.momirealms.craftengine.core.registry.Registries; import net.momirealms.craftengine.core.registry.WritableRegistry; -import net.momirealms.craftengine.core.util.Factory; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.ResourceConfigUtils; import net.momirealms.craftengine.core.util.ResourceKey; @@ -40,8 +36,9 @@ public class PathMatchers { register(CONTAINS, new PathMatcherContains.FactoryImpl()); } - public static void register(Key key, Factory> factory) { - Holder.Reference>> holder = ((WritableRegistry>>) BuiltInRegistries.PATH_MATCHER_FACTORY).registerForHolder(new ResourceKey<>(Registries.PATH_MATCHER_FACTORY.location(), key)); + public static void register(Key key, ConditionFactory factory) { + Holder.Reference> holder = ((WritableRegistry>) BuiltInRegistries.PATH_MATCHER_FACTORY) + .registerForHolder(new ResourceKey<>(Registries.PATH_MATCHER_FACTORY.location(), key)); holder.bindValue(factory); } @@ -56,10 +53,18 @@ public class PathMatchers { public static Condition fromMap(Map map) { String type = ResourceConfigUtils.requireNonEmptyStringOrThrow(map.get("type"), () -> new LocalizedException("warning.config.conflict_matcher.missing_type")); Key key = Key.withDefaultNamespace(type, Key.DEFAULT_NAMESPACE); - Factory> factory = BuiltInRegistries.PATH_MATCHER_FACTORY.getValue(key); - if (factory == null) { - throw new LocalizedException("warning.config.conflict_matcher.invalid_type", type); + if (key.value().charAt(0) == '!') { + ConditionFactory factory = BuiltInRegistries.PATH_MATCHER_FACTORY.getValue(new Key(key.namespace(), key.value().substring(1))); + if (factory == null) { + throw new LocalizedException("warning.config.conflict_matcher.invalid_type", type); + } + return new InvertedCondition<>(factory.create(map)); + } else { + ConditionFactory factory = BuiltInRegistries.PATH_MATCHER_FACTORY.getValue(key); + if (factory == null) { + throw new LocalizedException("warning.config.conflict_matcher.invalid_type", type); + } + return factory.create(map); } - return factory.create(map); } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathPatternMatcher.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathPatternMatcher.java index 9261bffc2..6826a42aa 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathPatternMatcher.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathPatternMatcher.java @@ -2,8 +2,8 @@ package net.momirealms.craftengine.core.pack.conflict.matcher; import net.momirealms.craftengine.core.pack.conflict.PathContext; import net.momirealms.craftengine.core.plugin.context.Condition; +import net.momirealms.craftengine.core.plugin.context.condition.ConditionFactory; import net.momirealms.craftengine.core.plugin.locale.LocalizedException; -import net.momirealms.craftengine.core.util.Factory; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.ResourceConfigUtils; @@ -36,7 +36,7 @@ public class PathPatternMatcher implements Condition { return pattern; } - public static class FactoryImpl implements Factory> { + public static class FactoryImpl implements ConditionFactory { @Override public Condition create(Map arguments) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/CraftEngine.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/CraftEngine.java index 83feda34f..64fa38f73 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/CraftEngine.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/CraftEngine.java @@ -46,6 +46,7 @@ public abstract class CraftEngine implements Plugin { protected PluginLogger logger; protected Consumer> debugger = (s) -> {}; protected Config config; + protected Platform platform; protected ClassPathAppender classPathAppender; protected DependencyManager dependencyManager; protected SchedulerAdapter scheduler; @@ -428,4 +429,9 @@ public abstract class CraftEngine implements Plugin { public CompatibilityManager compatibilityManager() { return compatibilityManager; } + + @Override + public Platform platform() { + return platform; + } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/Platform.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/Platform.java new file mode 100644 index 000000000..3c48cfb5e --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/Platform.java @@ -0,0 +1,6 @@ +package net.momirealms.craftengine.core.plugin; + +public interface Platform { + + void dispatchCommand(String command); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/Plugin.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/Plugin.java index d7d693264..37ef07865 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/Plugin.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/Plugin.java @@ -90,4 +90,6 @@ public interface Plugin { void debug(Supplier message); CompatibilityManager compatibilityManager(); + + Platform platform(); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/AbstractCommonContext.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/AbstractCommonContext.java index 9e07b9423..4717ae0e0 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/AbstractCommonContext.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/AbstractCommonContext.java @@ -23,7 +23,8 @@ public abstract class AbstractCommonContext implements Context { @NotNull public TagResolver[] tagResolvers() { if (this.tagResolvers == null) { - this.tagResolvers = new TagResolver[]{ShiftTag.INSTANCE, ImageTag.INSTANCE, new I18NTag(this), new NamedArgumentTag(this), new PlaceholderTag(null)}; + this.tagResolvers = new TagResolver[]{ShiftTag.INSTANCE, ImageTag.INSTANCE, new I18NTag(this), new NamedArgumentTag(this), + new PlaceholderTag(null), new ExpressionTag(this)}; } return this.tagResolvers; } @@ -38,9 +39,10 @@ public abstract class AbstractCommonContext implements Context { return this.contexts.getOrThrow(parameter); } - @Override - public AbstractCommonContext withParameter(ContextKey parameter, T value) { - this.contexts.withParameter(parameter, value); - return this; - } + // It's not designed as mutable +// @Override +// public AbstractCommonContext withParameter(ContextKey parameter, T value) { +// this.contexts.withParameter(parameter, value); +// return this; +// } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/Context.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/Context.java index ac3e5d3fe..989def892 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/Context.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/Context.java @@ -13,6 +13,4 @@ public interface Context { Optional getOptionalParameter(ContextKey parameter); T getParameterOrThrow(ContextKey parameter); - - Context withParameter(ContextKey parameter, T value); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/ContextHolder.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/ContextHolder.java index e01c447e2..d184c694e 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/ContextHolder.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/ContextHolder.java @@ -96,7 +96,7 @@ public class ContextHolder { public T getParameterOrThrow(ContextKey parameter) { Supplier object = (Supplier) this.params.get(parameter); if (object == null) { - throw new NoSuchElementException(parameter.id().toString()); + throw new NoSuchElementException(parameter.id()); } else { return object.get(); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/PlayerFurnitureActionContext.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/PlayerFurnitureActionContext.java new file mode 100644 index 000000000..4066c0405 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/PlayerFurnitureActionContext.java @@ -0,0 +1,20 @@ +package net.momirealms.craftengine.core.plugin.context; + +import net.momirealms.craftengine.core.entity.furniture.Furniture; +import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.plugin.context.parameter.CommonParameterProvider; +import net.momirealms.craftengine.core.plugin.context.parameter.PlayerParameterProvider; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +public class PlayerFurnitureActionContext extends PlayerOptionalContext { + + public PlayerFurnitureActionContext(@NotNull Player player, @NotNull Furniture furniture, @NotNull ContextHolder contexts) { + super(player, contexts, List.of(new CommonParameterProvider(), new PlayerParameterProvider(player))); + } + + public static PlayerFurnitureActionContext of(@NotNull Player player, @NotNull Furniture furniture, @NotNull ContextHolder contexts) { + return new PlayerFurnitureActionContext(player, furniture, contexts); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/PlayerOptionalContext.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/PlayerOptionalContext.java index 3436e4605..e471cc51a 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/PlayerOptionalContext.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/PlayerOptionalContext.java @@ -14,7 +14,7 @@ import java.util.Map; public class PlayerOptionalContext extends AbstractAdditionalParameterContext implements Context { public static final PlayerOptionalContext EMPTY = new PlayerOptionalContext(null, ContextHolder.EMPTY); - private final Player player; + protected final Player player; public PlayerOptionalContext(@Nullable Player player, @NotNull ContextHolder contexts) { super(contexts, player == null ? List.of(new CommonParameterProvider()) : List.of(new CommonParameterProvider(), new PlayerParameterProvider(player))); @@ -52,7 +52,7 @@ public class PlayerOptionalContext extends AbstractAdditionalParameterContext im @NotNull public TagResolver[] tagResolvers() { if (this.tagResolvers == null) { - this.tagResolvers = new TagResolver[]{ShiftTag.INSTANCE, ImageTag.INSTANCE, new PlaceholderTag(this.player), new I18NTag(this), new NamedArgumentTag(this)}; + this.tagResolvers = new TagResolver[]{ShiftTag.INSTANCE, ImageTag.INSTANCE, new PlaceholderTag(this.player), new I18NTag(this), new NamedArgumentTag(this), new ExpressionTag(this)}; } return this.tagResolvers; } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/RelationalContext.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/RelationalContext.java new file mode 100644 index 000000000..7879b155b --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/RelationalContext.java @@ -0,0 +1,12 @@ +package net.momirealms.craftengine.core.plugin.context; + +import java.util.Optional; + +public interface RelationalContext extends Context { + + ContextHolder viewerContexts(); + + Optional getViewerOptionalParameter(ContextKey parameter); + + T getViewerParameterOrThrow(ContextKey parameter); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/SimpleContext.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/SimpleContext.java new file mode 100644 index 000000000..a6b92e94e --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/SimpleContext.java @@ -0,0 +1,12 @@ +package net.momirealms.craftengine.core.plugin.context; + +public class SimpleContext extends AbstractCommonContext { + + public SimpleContext(ContextHolder contexts) { + super(contexts); + } + + public static SimpleContext of(ContextHolder contexts) { + return new SimpleContext(contexts); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/ViewerContext.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/ViewerContext.java new file mode 100644 index 000000000..4591d242d --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/ViewerContext.java @@ -0,0 +1,67 @@ +package net.momirealms.craftengine.core.plugin.context; + +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; +import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.plugin.text.minimessage.*; + +import java.util.Optional; + +public class ViewerContext implements RelationalContext { + private final Context owner; + private final PlayerOptionalContext viewer; + private TagResolver[] tagResolvers; + + public ViewerContext(Context owner, PlayerOptionalContext viewer) { + this.owner = owner; + this.viewer = viewer; + } + + public static ViewerContext of(Context owner, PlayerOptionalContext viewer) { + return new ViewerContext(owner, viewer); + } + + @Override + public Optional getViewerOptionalParameter(ContextKey parameter) { + return this.viewer.getOptionalParameter(parameter); + } + + @Override + public ContextHolder viewerContexts() { + return this.viewer.contexts(); + } + + @Override + public T getViewerParameterOrThrow(ContextKey parameter) { + return this.viewer.getParameterOrThrow(parameter); + } + + @Override + public ContextHolder contexts() { + return this.owner.contexts(); + } + + @Override + public Optional getOptionalParameter(ContextKey parameter) { + return this.owner.getOptionalParameter(parameter); + } + + @Override + public T getParameterOrThrow(ContextKey parameter) { + return this.owner.getParameterOrThrow(parameter); + } + + @Override + public TagResolver[] tagResolvers() { + if (this.tagResolvers == null) { + Player optionalOwner = null; + if (this.owner instanceof PlayerOptionalContext context) { + optionalOwner = context.player(); + } + this.tagResolvers = new TagResolver[]{ShiftTag.INSTANCE, ImageTag.INSTANCE, + new PlaceholderTag(optionalOwner), new ViewerPlaceholderTag(this.viewer.player()), + new NamedArgumentTag(this.owner), new ViewerNamedArgumentTag(this.viewer), + new I18NTag(this), new ExpressionTag(this)}; + } + return this.tagResolvers; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/AllOfCondition.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/AllOfCondition.java index e1b128982..c89b52606 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/AllOfCondition.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/AllOfCondition.java @@ -3,7 +3,6 @@ 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.plugin.locale.LocalizedResourceConfigException; -import net.momirealms.craftengine.core.util.Factory; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.MiscUtils; import net.momirealms.craftengine.core.util.ResourceConfigUtils; @@ -35,7 +34,7 @@ public class AllOfCondition implements Condition { return CommonConditions.ALL_OF; } - public static class FactoryImpl implements Factory> { + public static class FactoryImpl implements ConditionFactory { private final Function, Condition> factory; public FactoryImpl(Function, Condition> factory) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/AnyOfCondition.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/AnyOfCondition.java index c0e20d22b..4151e9870 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/AnyOfCondition.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/AnyOfCondition.java @@ -3,7 +3,6 @@ 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.plugin.locale.LocalizedResourceConfigException; -import net.momirealms.craftengine.core.util.Factory; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.MiscUtils; import net.momirealms.craftengine.core.util.ResourceConfigUtils; @@ -35,7 +34,7 @@ public class AnyOfCondition implements Condition { return CommonConditions.ANY_OF; } - public static class FactoryImpl implements Factory> { + public static class FactoryImpl implements ConditionFactory { private final Function, Condition> factory; public FactoryImpl(Function, Condition> factory) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/CommonConditions.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/CommonConditions.java index a8700127a..1607f8013 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/CommonConditions.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/CommonConditions.java @@ -16,4 +16,5 @@ public final class CommonConditions { public static final Key RANDOM = Key.from("craftengine:random"); public static final Key ENCHANTMENT = Key.from("craftengine:enchantment"); public static final Key FALLING_BLOCK = Key.from("craftengine:falling_block"); + public static final Key DISTANCE = Key.from("craftengine:distance"); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/ConditionFactory.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/ConditionFactory.java new file mode 100644 index 000000000..06e595886 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/ConditionFactory.java @@ -0,0 +1,11 @@ +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 java.util.Map; + +public interface ConditionFactory { + + Condition create(Map args); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/DistanceCondition.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/DistanceCondition.java new file mode 100644 index 000000000..52e22d6a6 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/DistanceCondition.java @@ -0,0 +1,65 @@ +package net.momirealms.craftengine.core.plugin.context.condition; + +import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.plugin.context.Condition; +import net.momirealms.craftengine.core.plugin.context.Context; +import net.momirealms.craftengine.core.plugin.context.number.NumberProvider; +import net.momirealms.craftengine.core.plugin.context.number.NumberProviders; +import net.momirealms.craftengine.core.plugin.context.parameter.CommonParameters; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.world.Vec3d; +import net.momirealms.craftengine.core.world.World; + +import java.util.Map; +import java.util.Optional; + +// TODO It's designed for players for the moment, better using entities +public class DistanceCondition implements Condition { + private final NumberProvider min; + private final NumberProvider max; + + public DistanceCondition(NumberProvider min, NumberProvider max) { + this.max = max; + this.min = min; + } + + @Override + public Key type() { + return CommonConditions.DISTANCE; + } + + @Override + public boolean test(CTX ctx) { + float min = this.min.getFloat(ctx); + float max = this.max.getFloat(ctx); + Optional optionalPlayer = ctx.getOptionalParameter(CommonParameters.PLAYER); + World world = ctx.getParameterOrThrow(CommonParameters.WORLD); + Vec3d location = ctx.getParameterOrThrow(CommonParameters.LOCATION); + if (optionalPlayer.isEmpty()) { + return false; + } + Player player = optionalPlayer.get(); + if (!player.world().uuid().equals(world.uuid())) { + return false; + } + + double dx = location.x() - player.x(); + double dy = location.y() - player.y(); + double dz = location.z() - player.z(); + double distanceSquared = dx * dx + dy * dy + dz * dz; + double minSquared = min * min; + double maxSquared = max * max; + + return distanceSquared >= minSquared && distanceSquared <= maxSquared; + } + + public static class FactoryImpl implements ConditionFactory { + + @Override + public Condition create(Map arguments) { + NumberProvider min = NumberProviders.fromObject(arguments.getOrDefault("min", 0)); + NumberProvider max = NumberProviders.fromObject(arguments.getOrDefault("max", 32)); + return new DistanceCondition<>(min, max); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/EmptyCondition.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/EmptyCondition.java index 291e0d14e..dda586d78 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/EmptyCondition.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/EmptyCondition.java @@ -2,7 +2,6 @@ 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.Factory; import net.momirealms.craftengine.core.util.Key; import java.util.Map; @@ -19,7 +18,7 @@ public class EmptyCondition implements Condition { return true; } - public static class FactoryImpl implements Factory> { + public static class FactoryImpl implements ConditionFactory { @Override public Condition create(Map arguments) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/EnchantmentCondition.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/EnchantmentCondition.java index 57825c36a..3523c9ae4 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/EnchantmentCondition.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/EnchantmentCondition.java @@ -4,9 +4,8 @@ import net.momirealms.craftengine.core.item.Enchantment; import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.plugin.context.Condition; import net.momirealms.craftengine.core.plugin.context.Context; -import net.momirealms.craftengine.core.plugin.context.parameter.CommonParameters; +import net.momirealms.craftengine.core.plugin.context.parameter.PlayerParameters; import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; -import net.momirealms.craftengine.core.util.Factory; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.ResourceConfigUtils; @@ -30,14 +29,14 @@ public class EnchantmentCondition implements Condition @Override public boolean test(CTX ctx) { - Optional> item = ctx.getOptionalParameter(CommonParameters.TOOL); + Optional> item = ctx.getOptionalParameter(PlayerParameters.MAIN_HAND_ITEM); if (item.isEmpty()) return false; Optional enchantment = item.get().getEnchantment(id); int level = enchantment.map(Enchantment::level).orElse(0); return this.expression.apply(level); } - public static class FactoryImpl implements Factory> { + public static class FactoryImpl implements ConditionFactory { @Override public Condition create(Map arguments) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/FallingBlockCondition.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/FallingBlockCondition.java index 820fc2820..1ab5a31b2 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/FallingBlockCondition.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/FallingBlockCondition.java @@ -3,7 +3,6 @@ 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.plugin.context.parameter.CommonParameters; -import net.momirealms.craftengine.core.util.Factory; import net.momirealms.craftengine.core.util.Key; import java.util.Map; @@ -20,7 +19,7 @@ public class FallingBlockCondition implements Condition implements Factory> { + public static class FactoryImpl implements ConditionFactory { @Override public Condition create(Map arguments) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/InvertedCondition.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/InvertedCondition.java index bf9febb00..059339456 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/InvertedCondition.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/InvertedCondition.java @@ -3,7 +3,6 @@ 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.plugin.locale.LocalizedResourceConfigException; -import net.momirealms.craftengine.core.util.Factory; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.MiscUtils; import net.momirealms.craftengine.core.util.ResourceConfigUtils; @@ -30,7 +29,7 @@ public class InvertedCondition implements Condition { return CommonConditions.INVERTED; } - public static class FactoryImpl implements Factory> { + public static class FactoryImpl implements ConditionFactory { private final Function, Condition> factory; public FactoryImpl(Function, Condition> factory) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/MatchBlockPropertyCondition.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/MatchBlockPropertyCondition.java index e1aee710e..d33b75f8e 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/MatchBlockPropertyCondition.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/MatchBlockPropertyCondition.java @@ -5,7 +5,10 @@ import net.momirealms.craftengine.core.block.properties.Property; import net.momirealms.craftengine.core.plugin.context.Condition; import net.momirealms.craftengine.core.plugin.context.Context; import net.momirealms.craftengine.core.plugin.context.parameter.CommonParameters; -import net.momirealms.craftengine.core.util.*; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.MiscUtils; +import net.momirealms.craftengine.core.util.Pair; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; import java.util.ArrayList; import java.util.List; @@ -41,7 +44,7 @@ public class MatchBlockPropertyCondition implements Conditi }).orElse(false); } - public static class FactoryImpl implements Factory> { + public static class FactoryImpl implements ConditionFactory { @Override public Condition create(Map arguments) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/MatchItemCondition.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/MatchItemCondition.java index 48a199634..09951996a 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/MatchItemCondition.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/MatchItemCondition.java @@ -3,9 +3,8 @@ package net.momirealms.craftengine.core.plugin.context.condition; import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.plugin.context.Condition; import net.momirealms.craftengine.core.plugin.context.Context; -import net.momirealms.craftengine.core.plugin.context.parameter.CommonParameters; +import net.momirealms.craftengine.core.plugin.context.parameter.PlayerParameters; import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; -import net.momirealms.craftengine.core.util.Factory; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.MiscUtils; @@ -27,7 +26,7 @@ public class MatchItemCondition implements Condition { @Override public boolean test(CTX ctx) { - Optional> item = ctx.getOptionalParameter(CommonParameters.TOOL); + Optional> item = ctx.getOptionalParameter(PlayerParameters.MAIN_HAND_ITEM); if (item.isEmpty()) return false; Key key = item.get().id(); String itemId = key.toString(); @@ -43,7 +42,7 @@ public class MatchItemCondition implements Condition { return false; } - public static class FactoryImpl implements Factory> { + public static class FactoryImpl implements ConditionFactory { @Override public Condition create(Map arguments) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/RandomCondition.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/RandomCondition.java index 9e7657ea8..a855b84f9 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/RandomCondition.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/RandomCondition.java @@ -4,17 +4,20 @@ import net.momirealms.craftengine.core.plugin.context.Condition; import net.momirealms.craftengine.core.plugin.context.Context; import net.momirealms.craftengine.core.plugin.context.number.NumberProvider; import net.momirealms.craftengine.core.plugin.context.number.NumberProviders; -import net.momirealms.craftengine.core.util.Factory; +import net.momirealms.craftengine.core.plugin.context.parameter.CommonParameters; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.RandomUtils; import java.util.Map; +import java.util.Optional; public class RandomCondition implements Condition { private final NumberProvider chance; + private final boolean previous; - public RandomCondition(NumberProvider chance) { + public RandomCondition(NumberProvider chance, boolean previous) { this.chance = chance; + this.previous = previous; } @Override @@ -24,15 +27,25 @@ public class RandomCondition implements Condition { @Override public boolean test(CTX ctx) { - return RandomUtils.generateRandomFloat(0, 1) < this.chance.getFloat(ctx); + if (this.previous) { + // TODO This might produce bugs if the context doesn't use a common provider + Optional random = ctx.getOptionalParameter(CommonParameters.LAST_RANDOM); + return random.map(d -> d < this.chance.getFloat(ctx)) + .orElseGet(() -> RandomUtils.generateRandomFloat(0, 1) < this.chance.getFloat(ctx)); + } else { + Optional random = ctx.getOptionalParameter(CommonParameters.RANDOM); + return random.map(d -> d < this.chance.getFloat(ctx)) + .orElseGet(() -> RandomUtils.generateRandomFloat(0, 1) < this.chance.getFloat(ctx)); + } } - public static class FactoryImpl implements Factory> { + public static class FactoryImpl implements ConditionFactory { @Override public Condition create(Map arguments) { NumberProvider provider = NumberProviders.fromObject(arguments.getOrDefault("value", 0.5f)); - return new RandomCondition<>(provider); + boolean useLastRandom = Boolean.parseBoolean(arguments.getOrDefault("use-last", "false").toString()); + return new RandomCondition<>(provider, useLastRandom); } } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/SurvivesExplosionCondition.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/SurvivesExplosionCondition.java index da6277ded..385bb708f 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/SurvivesExplosionCondition.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/SurvivesExplosionCondition.java @@ -3,7 +3,6 @@ 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.plugin.context.parameter.CommonParameters; -import net.momirealms.craftengine.core.util.Factory; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.RandomUtils; @@ -27,7 +26,7 @@ public class SurvivesExplosionCondition implements Conditio return true; } - public static class FactoryImpl implements Factory> { + public static class FactoryImpl implements ConditionFactory { @Override public Condition create(Map arguments) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/TableBonusCondition.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/TableBonusCondition.java index 880a52bcb..fb0870344 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/TableBonusCondition.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/TableBonusCondition.java @@ -4,9 +4,8 @@ import net.momirealms.craftengine.core.item.Enchantment; import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.plugin.context.Condition; import net.momirealms.craftengine.core.plugin.context.Context; -import net.momirealms.craftengine.core.plugin.context.parameter.CommonParameters; +import net.momirealms.craftengine.core.plugin.context.parameter.PlayerParameters; import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; -import net.momirealms.craftengine.core.util.Factory; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.RandomUtils; import net.momirealms.craftengine.core.util.ResourceConfigUtils; @@ -32,13 +31,13 @@ public class TableBonusCondition implements Condition @Override public boolean test(CTX ctx) { - Optional> item = ctx.getOptionalParameter(CommonParameters.TOOL); + Optional> item = ctx.getOptionalParameter(PlayerParameters.MAIN_HAND_ITEM); int level = item.map(value -> value.getEnchantment(this.enchantmentType).map(Enchantment::level).orElse(0)).orElse(0); float f = this.values.get(Math.min(level, this.values.size() - 1)); return RandomUtils.generateRandomFloat(0, 1) < f; } - public static class FactoryImpl implements Factory> { + public static class FactoryImpl implements ConditionFactory { @Override public Condition create(Map arguments) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/AbstractConditionalFunction.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/AbstractConditionalFunction.java new file mode 100644 index 000000000..25d56a813 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/AbstractConditionalFunction.java @@ -0,0 +1,55 @@ +package net.momirealms.craftengine.core.plugin.context.function; + +import net.momirealms.craftengine.core.plugin.context.Condition; +import net.momirealms.craftengine.core.plugin.context.Context; +import net.momirealms.craftengine.core.util.Factory; +import net.momirealms.craftengine.core.util.MCUtils; +import net.momirealms.craftengine.core.util.MiscUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.function.Predicate; + +// TODO 将loot functions迁移过来 +public abstract class AbstractConditionalFunction implements Function { + protected final List> predicates; + private final Predicate compositePredicates; + + public AbstractConditionalFunction(List> predicates) { + this.predicates = predicates; + this.compositePredicates = MCUtils.allOf(predicates); + } + + @Override + public void run(CTX ctx) { + if (this.compositePredicates.test(ctx)) { + this.runInternal(ctx); + } + } + + protected abstract void runInternal(CTX ctx); + + public static abstract class AbstractFactory implements Factory> { + private final java.util.function.Function, Condition> factory; + + public AbstractFactory(java.util.function.Function, Condition> factory) { + this.factory = factory; + } + + protected List> getPredicates(Map arguments) { + Object predicates = arguments.get("conditions"); + if (predicates == null) return List.of(); + if (predicates instanceof List list) { + List> conditions = new ArrayList<>(list.size()); + for (Object o : list) { + conditions.add(factory.apply(MiscUtils.castToMap(o, false))); + } + return conditions; + } else if (predicates instanceof Map map) { + return List.of(factory.apply(MiscUtils.castToMap(map, false))); + } + throw new IllegalArgumentException("Unsupported condition type: " + predicates.getClass().getSimpleName()); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/CommandFunction.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/CommandFunction.java new file mode 100644 index 000000000..a6dd5254d --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/CommandFunction.java @@ -0,0 +1,78 @@ +package net.momirealms.craftengine.core.plugin.context.function; + +import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.plugin.Platform; +import net.momirealms.craftengine.core.plugin.context.*; +import net.momirealms.craftengine.core.plugin.context.parameter.CommonParameters; +import net.momirealms.craftengine.core.plugin.context.selector.PlayerSelector; +import net.momirealms.craftengine.core.plugin.context.selector.PlayerSelectors; +import net.momirealms.craftengine.core.plugin.context.text.TextProvider; +import net.momirealms.craftengine.core.plugin.context.text.TextProviders; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.MiscUtils; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; + +import javax.annotation.Nullable; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +public class CommandFunction extends AbstractConditionalFunction { + private final List command; + private final boolean asPlayer; + private final PlayerSelector selector; + + public CommandFunction(List> predicates, List command, boolean asPlayer, @Nullable PlayerSelector selector) { + super(predicates); + this.asPlayer = asPlayer; + this.command = command; + this.selector = selector; + } + + @Override + public void runInternal(CTX ctx) { + if (this.asPlayer) { + Optional owner = ctx.getOptionalParameter(CommonParameters.PLAYER); + if (this.selector == null) { + owner.ifPresent(it -> { + for (TextProvider c : this.command) { + it.performCommand(c.get(ctx)); + } + }); + } else { + for (Player viewer : this.selector.get(ctx)) { + RelationalContext relationalContext = ViewerContext.of(ctx, PlayerOptionalContext.of(viewer, ContextHolder.EMPTY)); + for (TextProvider c : this.command) { + viewer.performCommand(c.get(relationalContext)); + } + } + } + } else { + Platform platform = CraftEngine.instance().platform(); + for (TextProvider c : this.command) { + platform.dispatchCommand(c.get(ctx)); + } + } + } + + @Override + public Key type() { + return CommonFunctions.COMMAND; + } + + public static class FactoryImpl extends AbstractFactory { + + public FactoryImpl(java.util.function.Function, Condition> factory) { + super(factory); + } + + @Override + public Function create(Map arguments) { + Object command = ResourceConfigUtils.requireNonNullOrThrow(ResourceConfigUtils.get(arguments, "command", "commands"), "warning.config.function.command.missing_command"); + List commands = MiscUtils.getAsStringList(command).stream().map(TextProviders::fromString).toList(); + boolean asPlayer = (boolean) arguments.getOrDefault("as-player", false); + return new CommandFunction<>(getPredicates(arguments), commands, asPlayer, PlayerSelectors.fromObject(arguments.get("target"))); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/CommonFunctions.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/CommonFunctions.java new file mode 100644 index 000000000..574ad1ba0 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/CommonFunctions.java @@ -0,0 +1,8 @@ +package net.momirealms.craftengine.core.plugin.context.function; + +import net.momirealms.craftengine.core.util.Key; + +public class CommonFunctions { + public static final Key COMMAND = Key.of("craftengine:command"); + +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/Function.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/Function.java new file mode 100644 index 000000000..968feb369 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/Function.java @@ -0,0 +1,11 @@ +package net.momirealms.craftengine.core.plugin.context.function; + +import net.momirealms.craftengine.core.plugin.context.Context; +import net.momirealms.craftengine.core.util.Key; + +public interface Function { + + void run(CTX ctx); + + Key type(); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/parameter/CommonParameters.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/parameter/CommonParameters.java index e6c8d24ff..e84c45315 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/parameter/CommonParameters.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/parameter/CommonParameters.java @@ -2,7 +2,6 @@ package net.momirealms.craftengine.core.plugin.context.parameter; import net.momirealms.craftengine.core.block.ImmutableBlockState; import net.momirealms.craftengine.core.entity.player.Player; -import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.plugin.context.ContextKey; import net.momirealms.craftengine.core.world.Vec3d; import net.momirealms.craftengine.core.world.World; @@ -17,6 +16,5 @@ public final class CommonParameters { public static final ContextKey FALLING_BLOCK = ContextKey.of("falling_block"); public static final ContextKey EXPLOSION_RADIUS = ContextKey.of("explosion_radius"); public static final ContextKey PLAYER = ContextKey.of("player"); - public static final ContextKey> TOOL = ContextKey.of("tool"); public static final ContextKey BLOCK_STATE = ContextKey.of("block_state"); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/parameter/PlayerParameterProvider.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/parameter/PlayerParameterProvider.java index d79f10448..c3a17484f 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/parameter/PlayerParameterProvider.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/parameter/PlayerParameterProvider.java @@ -1,6 +1,7 @@ package net.momirealms.craftengine.core.plugin.context.parameter; import net.momirealms.craftengine.core.entity.Entity; +import net.momirealms.craftengine.core.entity.player.InteractionHand; import net.momirealms.craftengine.core.entity.player.Player; import net.momirealms.craftengine.core.plugin.context.ContextKey; import net.momirealms.craftengine.core.plugin.context.LazyContextParameterProvider; @@ -19,12 +20,15 @@ public class PlayerParameterProvider implements LazyContextParameterProvider { CONTEXT_FUNCTIONS.put(PlayerParameters.X, Entity::x); CONTEXT_FUNCTIONS.put(PlayerParameters.Y, Entity::y); CONTEXT_FUNCTIONS.put(PlayerParameters.Z, Entity::z); + CONTEXT_FUNCTIONS.put(PlayerParameters.POS, Entity::position); CONTEXT_FUNCTIONS.put(PlayerParameters.BLOCK_X, p -> MCUtils.fastFloor(p.x())); CONTEXT_FUNCTIONS.put(PlayerParameters.BLOCK_Y, p -> MCUtils.fastFloor(p.y())); CONTEXT_FUNCTIONS.put(PlayerParameters.BLOCK_Z, p -> MCUtils.fastFloor(p.z())); CONTEXT_FUNCTIONS.put(PlayerParameters.NAME, Player::name); CONTEXT_FUNCTIONS.put(PlayerParameters.UUID, Player::uuid); CONTEXT_FUNCTIONS.put(PlayerParameters.WORLD_NAME, p -> p.world().name()); + CONTEXT_FUNCTIONS.put(PlayerParameters.MAIN_HAND_ITEM, p -> p.getItemInHand(InteractionHand.MAIN_HAND)); + CONTEXT_FUNCTIONS.put(PlayerParameters.OFF_HAND_ITEM, p -> p.getItemInHand(InteractionHand.OFF_HAND)); } private final Player player; diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/parameter/PlayerParameters.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/parameter/PlayerParameters.java index 68d5fe9a5..4d558ba1b 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/parameter/PlayerParameters.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/parameter/PlayerParameters.java @@ -1,6 +1,8 @@ package net.momirealms.craftengine.core.plugin.context.parameter; +import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.plugin.context.ContextKey; +import net.momirealms.craftengine.core.world.Vec3d; import java.util.UUID; @@ -10,10 +12,13 @@ public final class PlayerParameters { public static final ContextKey X = ContextKey.of("player.x"); public static final ContextKey Y = ContextKey.of("player.y"); public static final ContextKey Z = ContextKey.of("player.z"); + public static final ContextKey POS = ContextKey.of("player.pos"); public static final ContextKey BLOCK_X = ContextKey.of("player.block_x"); public static final ContextKey BLOCK_Y = ContextKey.of("player.block_y"); public static final ContextKey BLOCK_Z = ContextKey.of("player.block_z"); public static final ContextKey NAME = ContextKey.of("player.name"); public static final ContextKey WORLD_NAME = ContextKey.of("player.world.name"); public static final ContextKey UUID = ContextKey.of("player.uuid"); + public static final ContextKey> MAIN_HAND_ITEM = ContextKey.of("player.main_hand"); + public static final ContextKey> OFF_HAND_ITEM = ContextKey.of("player.off_hand"); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/selector/AllPlayerSelector.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/selector/AllPlayerSelector.java new file mode 100644 index 000000000..77e431e1a --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/selector/AllPlayerSelector.java @@ -0,0 +1,58 @@ +package net.momirealms.craftengine.core.plugin.context.selector; + +import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.plugin.context.Condition; +import net.momirealms.craftengine.core.plugin.context.Context; +import net.momirealms.craftengine.core.plugin.context.ContextHolder; +import net.momirealms.craftengine.core.plugin.context.PlayerOptionalContext; +import net.momirealms.craftengine.core.plugin.context.parameter.CommonParameters; +import net.momirealms.craftengine.core.util.Key; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class AllPlayerSelector implements PlayerSelector { + private final List> predicates; + + public AllPlayerSelector(List> predicates) { + this.predicates = predicates; + } + + public AllPlayerSelector() { + this.predicates = List.of(); + } + + public List> predicates() { + return predicates; + } + + @SuppressWarnings("unchecked") + @Override + public List get(CTX context) { + if (this.predicates.isEmpty()) { + return Arrays.asList(CraftEngine.instance().networkManager().onlineUsers()); + } else { + List players = new ArrayList<>(); + outer: for (Player player : CraftEngine.instance().networkManager().onlineUsers()) { + PlayerOptionalContext newContext = PlayerOptionalContext.of(player, ContextHolder.builder() + .withOptionalParameter(CommonParameters.WORLD, context.getOptionalParameter(CommonParameters.WORLD).orElse(null)) + .withOptionalParameter(CommonParameters.LOCATION, context.getOptionalParameter(CommonParameters.LOCATION).orElse(null)) + ); + for (Condition predicate : this.predicates) { + if (!predicate.test((CTX) newContext)) { + continue outer; + } + } + players.add(player); + } + return players; + } + } + + @Override + public Key type() { + return PlayerSelectors.ALL; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/selector/PlayerSelector.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/selector/PlayerSelector.java new file mode 100644 index 000000000..1c70278d2 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/selector/PlayerSelector.java @@ -0,0 +1,14 @@ +package net.momirealms.craftengine.core.plugin.context.selector; + +import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.plugin.context.Context; +import net.momirealms.craftengine.core.util.Key; + +import java.util.List; + +public interface PlayerSelector { + + List get(CTX context); + + Key type(); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/selector/PlayerSelectors.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/selector/PlayerSelectors.java new file mode 100644 index 000000000..ae5010c81 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/selector/PlayerSelectors.java @@ -0,0 +1,21 @@ +package net.momirealms.craftengine.core.plugin.context.selector; + +import net.momirealms.craftengine.core.plugin.context.Context; +import net.momirealms.craftengine.core.util.Key; + +public class PlayerSelectors { + public static final Key ALL = Key.of("craftengine:all"); + public static final Key SELF = Key.of("craftengine:self"); + + public static PlayerSelector fromObject(Object object) { + if (object == null) return null; + if (object instanceof String string) { + if (string.equals("self") || string.equals("@self") || string.equals("@s")) { + return new SelfPlayerSelector<>(); + } else if (string.equals("all") || string.equals("@all") || string.equals("@a")) { + return new AllPlayerSelector<>(); + } + } + throw new UnsupportedOperationException("Not supported yet."); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/selector/SelfPlayerSelector.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/selector/SelfPlayerSelector.java new file mode 100644 index 000000000..ea749f3ba --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/selector/SelfPlayerSelector.java @@ -0,0 +1,21 @@ +package net.momirealms.craftengine.core.plugin.context.selector; + +import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.plugin.context.Context; +import net.momirealms.craftengine.core.plugin.context.parameter.CommonParameters; +import net.momirealms.craftengine.core.util.Key; + +import java.util.List; + +public class SelfPlayerSelector implements PlayerSelector { + + @Override + public List get(CTX context) { + return List.of(context.getParameterOrThrow(CommonParameters.PLAYER)); + } + + @Override + public Key type() { + return PlayerSelectors.SELF; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/text/PlainTextProvider.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/text/PlainTextProvider.java new file mode 100644 index 000000000..44f481026 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/text/PlainTextProvider.java @@ -0,0 +1,26 @@ +package net.momirealms.craftengine.core.plugin.context.text; + +import net.momirealms.craftengine.core.plugin.context.Context; +import net.momirealms.craftengine.core.util.Key; + +public class PlainTextProvider implements TextProvider { + private final String text; + + public PlainTextProvider(String text) { + this.text = text; + } + + public static PlainTextProvider of(String text) { + return new PlainTextProvider(text); + } + + @Override + public String get(Context context) { + return this.text; + } + + @Override + public Key type() { + return TextProviders.PLAIN; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/text/TagTextProvider.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/text/TagTextProvider.java new file mode 100644 index 000000000..11c63ac21 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/text/TagTextProvider.java @@ -0,0 +1,29 @@ +package net.momirealms.craftengine.core.plugin.context.text; + +import net.kyori.adventure.text.Component; +import net.momirealms.craftengine.core.plugin.context.Context; +import net.momirealms.craftengine.core.util.AdventureHelper; +import net.momirealms.craftengine.core.util.Key; + +public class TagTextProvider implements TextProvider { + private final String text; + + public TagTextProvider(String text) { + this.text = text; + } + + public static TagTextProvider of(String text) { + return new TagTextProvider(text); + } + + @Override + public String get(Context context) { + Component resultComponent = AdventureHelper.customMiniMessage().deserialize(this.text, context.tagResolvers()); + return AdventureHelper.plainTextContent(resultComponent); + } + + @Override + public Key type() { + return TextProviders.TAG; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/text/TextProvider.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/text/TextProvider.java new file mode 100644 index 000000000..5bd2b1950 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/text/TextProvider.java @@ -0,0 +1,11 @@ +package net.momirealms.craftengine.core.plugin.context.text; + +import net.momirealms.craftengine.core.plugin.context.Context; +import net.momirealms.craftengine.core.util.Key; + +public interface TextProvider { + + String get(Context context); + + Key type(); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/text/TextProviders.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/text/TextProviders.java new file mode 100644 index 000000000..b55de1e34 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/text/TextProviders.java @@ -0,0 +1,15 @@ +package net.momirealms.craftengine.core.plugin.context.text; + +import net.momirealms.craftengine.core.util.Key; + +public class TextProviders { + public static final Key PLAIN = Key.of("craftengine:plain"); + public static final Key TAG = Key.of("craftengine:tag"); + + public static TextProvider fromString(String string) { + if (!string.contains("<") || !string.contains(">")) { + return PlainTextProvider.of(string); + } + return TagTextProvider.of(string); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/event/BlockEventConditions.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/event/BlockEventConditions.java new file mode 100644 index 000000000..b6883e577 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/event/BlockEventConditions.java @@ -0,0 +1,33 @@ +package net.momirealms.craftengine.core.plugin.event; + +import net.momirealms.craftengine.core.plugin.context.Condition; +import net.momirealms.craftengine.core.plugin.context.PlayerBlockActionContext; +import net.momirealms.craftengine.core.plugin.context.condition.InvertedCondition; +import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; +import net.momirealms.craftengine.core.registry.BuiltInRegistries; +import net.momirealms.craftengine.core.util.Factory; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; + +import java.util.Map; + +public class BlockEventConditions { + + public static Condition fromMap(Map map) { + String type = ResourceConfigUtils.requireNonEmptyStringOrThrow(map.get("type"), "TODO I18N"); + Key key = Key.withDefaultNamespace(type, Key.DEFAULT_NAMESPACE); + if (key.value().charAt(0) == '!') { + Factory> factory = BuiltInRegistries.PLAYER_BLOCK_CONDITION_FACTORY.getValue(new Key(key.namespace(), key.value().substring(1))); + if (factory == null) { + throw new LocalizedResourceConfigException("TODO I18N", type); + } + return new InvertedCondition<>(factory.create(map)); + } else { + Factory> factory = BuiltInRegistries.PLAYER_BLOCK_CONDITION_FACTORY.getValue(key); + if (factory == null) { + throw new LocalizedResourceConfigException("TODO I18N", type); + } + return factory.create(map); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/event/BlockEventFunctions.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/event/BlockEventFunctions.java new file mode 100644 index 000000000..885e7fec2 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/event/BlockEventFunctions.java @@ -0,0 +1,40 @@ +package net.momirealms.craftengine.core.plugin.event; + +import net.momirealms.craftengine.core.plugin.context.PlayerBlockActionContext; +import net.momirealms.craftengine.core.plugin.context.function.CommandFunction; +import net.momirealms.craftengine.core.plugin.context.function.CommonFunctions; +import net.momirealms.craftengine.core.plugin.context.function.Function; +import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; +import net.momirealms.craftengine.core.registry.BuiltInRegistries; +import net.momirealms.craftengine.core.registry.Holder; +import net.momirealms.craftengine.core.registry.Registries; +import net.momirealms.craftengine.core.registry.WritableRegistry; +import net.momirealms.craftengine.core.util.Factory; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; +import net.momirealms.craftengine.core.util.ResourceKey; + +import java.util.Map; + +public class BlockEventFunctions { + + static { + register(CommonFunctions.COMMAND, new CommandFunction.FactoryImpl<>(BlockEventConditions::fromMap)); + } + + public static void register(Key key, Factory> factory) { + Holder.Reference>> holder = ((WritableRegistry>>) BuiltInRegistries.PLAYER_BLOCK_FUNCTION_FACTORY) + .registerForHolder(new ResourceKey<>(Registries.PLAYER_BLOCK_FUNCTION_FACTORY.location(), key)); + holder.bindValue(factory); + } + + public static Function fromMap(Map map) { + String type = ResourceConfigUtils.requireNonEmptyStringOrThrow(map.get("type"), "TODO I18N"); + Key key = Key.withDefaultNamespace(type, Key.DEFAULT_NAMESPACE); + Factory> factory = BuiltInRegistries.PLAYER_BLOCK_FUNCTION_FACTORY.getValue(key); + if (factory == null) { + throw new LocalizedResourceConfigException("TODO I18N", type); + } + return factory.create(map); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/event/EventTrigger.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/event/EventTrigger.java new file mode 100644 index 000000000..2ea3421eb --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/event/EventTrigger.java @@ -0,0 +1,8 @@ +package net.momirealms.craftengine.core.plugin.event; + +public enum EventTrigger { + USE_ITEM, + USE_ITEM_ON, + CONSUME, + +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/event/Trigger.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/event/Trigger.java deleted file mode 100644 index 4eb301457..000000000 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/event/Trigger.java +++ /dev/null @@ -1,15 +0,0 @@ -package net.momirealms.craftengine.core.plugin.event; - -import net.momirealms.craftengine.core.util.Key; - -public class Trigger { - private final Key id; - - public Trigger(Key id) { - this.id = id; - } - - public Key id() { - return id; - } -} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/event/Triggers.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/event/Triggers.java deleted file mode 100644 index 474bf48a6..000000000 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/event/Triggers.java +++ /dev/null @@ -1,21 +0,0 @@ -package net.momirealms.craftengine.core.plugin.event; - -import net.momirealms.craftengine.core.util.Key; - -import java.util.HashMap; -import java.util.Map; - -public class Triggers { - public static final Map TRIGGERS = new HashMap<>(); - - public static final Trigger USE_ITEM = create(Key.of("use_item")); - public static final Trigger INTERACT = create(Key.of("interact")); - public static final Trigger CONSUME = create(Key.of("consume")); - public static final Trigger BREAK = create(Key.of("break")); - - private static Trigger create(Key id) { - Trigger trigger = new Trigger(id); - TRIGGERS.put(id, trigger); - return trigger; - } -} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/network/NetworkManager.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/network/NetworkManager.java index facef471a..8d2b0c0ba 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/network/NetworkManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/network/NetworkManager.java @@ -19,7 +19,7 @@ public interface NetworkManager extends Manageable { Channel getChannel(Player player); - NetWorkUser[] onlineUsers(); + Player[] onlineUsers(); default void sendPacket(@NotNull NetWorkUser player, Object packet) { sendPacket(player, packet, false); diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/ExpressionTag.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/ExpressionTag.java new file mode 100644 index 000000000..a0f58cc91 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/ExpressionTag.java @@ -0,0 +1,59 @@ +package net.momirealms.craftengine.core.plugin.text.minimessage; + +import com.ezylang.evalex.EvaluationException; +import com.ezylang.evalex.Expression; +import com.ezylang.evalex.parser.ParseException; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.Context; +import net.kyori.adventure.text.minimessage.ParsingException; +import net.kyori.adventure.text.minimessage.tag.Tag; +import net.kyori.adventure.text.minimessage.tag.resolver.ArgumentQueue; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; +import net.momirealms.craftengine.core.util.AdventureHelper; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.text.DecimalFormat; +import java.text.DecimalFormatSymbols; +import java.util.Locale; +import java.util.Objects; + +public class ExpressionTag implements TagResolver { + private final net.momirealms.craftengine.core.plugin.context.Context context; + + public ExpressionTag(@NotNull net.momirealms.craftengine.core.plugin.context.Context context) { + this.context = Objects.requireNonNull(context, "context"); + } + + @Override + public @Nullable Tag resolve(@NotNull String name, @NotNull ArgumentQueue arguments, @NotNull Context ctx) throws ParsingException { + if (!has(name)) { + return null; + } + + String format = arguments.popOr("No format provided").toString(); + String expr = arguments.popOr("No expression provided").toString(); + + Component resultComponent = AdventureHelper.customMiniMessage().deserialize(expr, context.tagResolvers()); + String resultString = AdventureHelper.plainTextContent(resultComponent); + Expression expression = new Expression(resultString); + + try { + Number numberValue = expression.evaluate().getNumberValue(); + DecimalFormat df = new DecimalFormat(format); + DecimalFormatSymbols symbols = new DecimalFormatSymbols(Locale.US); + df.setDecimalFormatSymbols(symbols); + String formatted = df.format(numberValue); + return Tag.selfClosingInserting(Component.text(formatted)); + } catch (IllegalArgumentException e) { + throw ctx.newException("Invalid number format: " + format, arguments); + } catch (EvaluationException | ParseException e) { + throw ctx.newException("Invalid expression: " + e.getMessage(), arguments); + } + } + + @Override + public boolean has(@NotNull String name) { + return "expr".equals(name); + } +} \ No newline at end of file diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/I18NTag.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/I18NTag.java index 920796809..b0fa17a5b 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/I18NTag.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/I18NTag.java @@ -24,11 +24,11 @@ public class I18NTag implements TagResolver { } String i18nKey = arguments.popOr("No argument i18n key provided").toString(); String translation = TranslationManager.instance().miniMessageTranslation(i18nKey); - return Tag.inserting(AdventureHelper.miniMessage().deserialize(translation, this.context.tagResolvers())); + return Tag.selfClosingInserting(AdventureHelper.miniMessage().deserialize(translation, this.context.tagResolvers())); } @Override public boolean has(@NotNull String name) { - return "i18n".equals(name) || "l10n".equals(name); + return "i18n".equals(name); } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/ImageTag.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/ImageTag.java index a6d718aea..6ba90c439 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/ImageTag.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/ImageTag.java @@ -34,9 +34,9 @@ public class ImageTag implements TagResolver { if (arguments.hasNext()) { int row = arguments.popOr("No argument row provided").asInt().orElseThrow(() -> ctx.newException("Invalid argument number", arguments)); int column = arguments.popOr("No argument column provided").asInt().orElseThrow(() -> ctx.newException("Invalid argument number", arguments)); - return Tag.inserting(Component.empty().children(List.of(optional.get().componentAt(row,column)))); + return Tag.selfClosingInserting(Component.empty().children(List.of(optional.get().componentAt(row,column)))); } else { - return Tag.inserting(Component.empty().children(List.of(optional.get().componentAt(0,0)))); + return Tag.selfClosingInserting(Component.empty().children(List.of(optional.get().componentAt(0,0)))); } } else { throw ctx.newException("Invalid image id", arguments); diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/IndexedArgumentTag.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/IndexedArgumentTag.java index 098b4f6e0..f8a4f6c0e 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/IndexedArgumentTag.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/IndexedArgumentTag.java @@ -13,9 +13,6 @@ import java.util.List; import java.util.Objects; public class IndexedArgumentTag implements TagResolver { - private static final String NAME_0 = "argument"; - private static final String NAME_1 = "arg"; - private final List argumentComponents; public IndexedArgumentTag(@NotNull List argumentComponents) { @@ -39,6 +36,6 @@ public class IndexedArgumentTag implements TagResolver { @Override public boolean has(@NotNull String name) { - return name.equals(NAME_0) || name.equals(NAME_1); + return name.equals("arg"); } } \ No newline at end of file diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/NamedArgumentTag.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/NamedArgumentTag.java index c2db728c5..595be9c85 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/NamedArgumentTag.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/NamedArgumentTag.java @@ -14,9 +14,6 @@ import java.util.Objects; import java.util.Optional; public class NamedArgumentTag implements TagResolver { - private static final String NAME_0 = "argument"; - private static final String NAME_1 = "arg"; - private final Context context; public NamedArgumentTag(@NotNull Context context) { @@ -39,6 +36,6 @@ public class NamedArgumentTag implements TagResolver { @Override public boolean has(@NotNull String name) { - return name.equals(NAME_0) || name.equals(NAME_1); + return name.equals("arg"); } } \ No newline at end of file diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/PlaceholderTag.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/PlaceholderTag.java index 07ac1d36d..c326b284b 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/PlaceholderTag.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/PlaceholderTag.java @@ -28,7 +28,7 @@ public class PlaceholderTag implements TagResolver { if (parsed.equals(placeholder)) { parsed = arguments.popOr("No default papi value provided").toString(); } - return Tag.inserting(AdventureHelper.miniMessage().deserialize(parsed)); + return Tag.selfClosingInserting(AdventureHelper.miniMessage().deserialize(parsed)); } @Override diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/ShiftTag.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/ShiftTag.java index e5ccf26ae..6ed7fdb3f 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/ShiftTag.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/ShiftTag.java @@ -25,7 +25,7 @@ public class ShiftTag implements TagResolver { String shiftAmount = arguments.popOr("No argument shift provided").toString(); try { int shift = Integer.parseInt(shiftAmount); - return Tag.inserting(AdventureHelper.miniMessage().deserialize(CraftEngine.instance().fontManager().createMiniMessageOffsets(shift))); + return Tag.selfClosingInserting(AdventureHelper.miniMessage().deserialize(CraftEngine.instance().fontManager().createMiniMessageOffsets(shift))); } catch (NumberFormatException e) { throw ctx.newException("Invalid shift value", arguments); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/ViewerNamedArgumentTag.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/ViewerNamedArgumentTag.java new file mode 100644 index 000000000..e1c2d5e94 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/ViewerNamedArgumentTag.java @@ -0,0 +1,16 @@ +package net.momirealms.craftengine.core.plugin.text.minimessage; + +import net.momirealms.craftengine.core.plugin.context.Context; +import org.jetbrains.annotations.NotNull; + +public class ViewerNamedArgumentTag extends NamedArgumentTag { + + public ViewerNamedArgumentTag(@NotNull Context context) { + super(context); + } + + @Override + public boolean has(@NotNull String name) { + return name.equals("viewer_arg"); + } +} \ No newline at end of file diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/ViewerPlaceholderTag.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/ViewerPlaceholderTag.java new file mode 100644 index 000000000..397a891ff --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/ViewerPlaceholderTag.java @@ -0,0 +1,17 @@ +package net.momirealms.craftengine.core.plugin.text.minimessage; + +import net.momirealms.craftengine.core.entity.player.Player; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class ViewerPlaceholderTag extends PlaceholderTag { + + public ViewerPlaceholderTag(@Nullable Player player) { + super(player); + } + + @Override + public boolean has(@NotNull String name) { + return "viewer_papi".equals(name); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/registry/BuiltInRegistries.java b/core/src/main/java/net/momirealms/craftengine/core/registry/BuiltInRegistries.java index 097387d80..a92d3db1d 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/registry/BuiltInRegistries.java +++ b/core/src/main/java/net/momirealms/craftengine/core/registry/BuiltInRegistries.java @@ -9,7 +9,7 @@ import net.momirealms.craftengine.core.item.recipe.CustomSmithingTransformRecipe import net.momirealms.craftengine.core.item.recipe.RecipeFactory; import net.momirealms.craftengine.core.loot.LootContext; import net.momirealms.craftengine.core.loot.entry.LootEntryContainerFactory; -import net.momirealms.craftengine.core.loot.function.LootFunctionApplyBonusCount; +import net.momirealms.craftengine.core.loot.function.ApplyBonusCountFunction; import net.momirealms.craftengine.core.loot.function.LootFunctionFactory; import net.momirealms.craftengine.core.pack.conflict.PathContext; import net.momirealms.craftengine.core.pack.conflict.resolution.ResolutionFactory; @@ -22,6 +22,9 @@ import net.momirealms.craftengine.core.pack.model.special.SpecialModelFactory; import net.momirealms.craftengine.core.pack.model.tint.TintFactory; import net.momirealms.craftengine.core.plugin.config.template.TemplateArgumentFactory; import net.momirealms.craftengine.core.plugin.context.Condition; +import net.momirealms.craftengine.core.plugin.context.PlayerBlockActionContext; +import net.momirealms.craftengine.core.plugin.context.condition.ConditionFactory; +import net.momirealms.craftengine.core.plugin.context.function.Function; import net.momirealms.craftengine.core.plugin.context.number.NumberProvider; import net.momirealms.craftengine.core.util.Factory; import net.momirealms.craftengine.core.util.Key; @@ -30,13 +33,13 @@ import net.momirealms.craftengine.core.util.ResourceKey; public class BuiltInRegistries { public static final Registry BLOCK = createRegistry(Registries.BLOCK); public static final Registry OPTIMIZED_ITEM_ID = createRegistry(Registries.OPTIMIZED_ITEM_ID); - public static final Registry PROPERTY_FACTORY = createRegistry(Registries.PROPERTY_FACTORY); public static final Registry BLOCK_BEHAVIOR_FACTORY = createRegistry(Registries.BLOCK_BEHAVIOR_FACTORY); + public static final Registry ITEM_BEHAVIOR_FACTORY = createRegistry(Registries.ITEM_BEHAVIOR_FACTORY); + public static final Registry PROPERTY_FACTORY = createRegistry(Registries.PROPERTY_FACTORY); public static final Registry> LOOT_FUNCTION_FACTORY = createRegistry(Registries.LOOT_FUNCTION_FACTORY); - public static final Registry>> LOOT_CONDITION_FACTORY = createRegistry(Registries.LOOT_CONDITION_FACTORY); + public static final Registry> LOOT_CONDITION_FACTORY = createRegistry(Registries.LOOT_CONDITION_FACTORY); public static final Registry> LOOT_ENTRY_CONTAINER_FACTORY = createRegistry(Registries.LOOT_ENTRY_CONTAINER_FACTORY); public static final Registry> NUMBER_PROVIDER_FACTORY = createRegistry(Registries.NUMBER_PROVIDER_FACTORY); - public static final Registry ITEM_BEHAVIOR_FACTORY = createRegistry(Registries.ITEM_BEHAVIOR_FACTORY); public static final Registry TEMPLATE_ARGUMENT_FACTORY = createRegistry(Registries.TEMPLATE_ARGUMENT_FACTORY); public static final Registry ITEM_MODEL_FACTORY = createRegistry(Registries.ITEM_MODEL_FACTORY); public static final Registry TINT_FACTORY = createRegistry(Registries.TINT_FACTORY); @@ -45,12 +48,14 @@ public class BuiltInRegistries { public static final Registry CONDITION_PROPERTY_FACTORY = createRegistry(Registries.CONDITION_PROPERTY_FACTORY); public static final Registry SELECT_PROPERTY_FACTORY = createRegistry(Registries.SELECT_PROPERTY_FACTORY); public static final Registry> RECIPE_FACTORY = createRegistry(Registries.RECIPE_FACTORY); - public static final Registry FORMULA_FACTORY = createRegistry(Registries.FORMULA_FACTORY); - public static final Registry>> PATH_MATCHER_FACTORY = createRegistry(Registries.PATH_MATCHER_FACTORY); + public static final Registry FORMULA_FACTORY = createRegistry(Registries.FORMULA_FACTORY); + public static final Registry> PATH_MATCHER_FACTORY = createRegistry(Registries.PATH_MATCHER_FACTORY); public static final Registry RESOLUTION_FACTORY = createRegistry(Registries.RESOLUTION_FACTORY); - public static final Registry SMITHING_RESULT_PROCESSOR_FACTORY = createRegistry(Registries.SMITHING_RESULT_PROCESSOR_FACTORY); + public static final Registry SMITHING_RESULT_PROCESSOR_FACTORY = createRegistry(Registries.SMITHING_RESULT_PROCESSOR_FACTORY); public static final Registry HITBOX_FACTORY = createRegistry(Registries.HITBOX_FACTORY); public static final Registry RESOURCE_PACK_HOST_FACTORY = createRegistry(Registries.RESOURCE_PACK_HOST_FACTORY); + public static final Registry>> PLAYER_BLOCK_FUNCTION_FACTORY = createRegistry(Registries.PLAYER_BLOCK_FUNCTION_FACTORY); + public static final Registry>> PLAYER_BLOCK_CONDITION_FACTORY = createRegistry(Registries.PLAYER_BLOCK_CONDITION_FACTORY); private static Registry createRegistry(ResourceKey> key) { return new MappedRegistry<>(key); diff --git a/core/src/main/java/net/momirealms/craftengine/core/registry/Registries.java b/core/src/main/java/net/momirealms/craftengine/core/registry/Registries.java index b67a7b1ad..434302ba9 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/registry/Registries.java +++ b/core/src/main/java/net/momirealms/craftengine/core/registry/Registries.java @@ -9,7 +9,7 @@ import net.momirealms.craftengine.core.item.recipe.CustomSmithingTransformRecipe import net.momirealms.craftengine.core.item.recipe.RecipeFactory; import net.momirealms.craftengine.core.loot.LootContext; import net.momirealms.craftengine.core.loot.entry.LootEntryContainerFactory; -import net.momirealms.craftengine.core.loot.function.LootFunctionApplyBonusCount; +import net.momirealms.craftengine.core.loot.function.ApplyBonusCountFunction; import net.momirealms.craftengine.core.loot.function.LootFunctionFactory; import net.momirealms.craftengine.core.pack.conflict.PathContext; import net.momirealms.craftengine.core.pack.conflict.resolution.ResolutionFactory; @@ -22,6 +22,9 @@ import net.momirealms.craftengine.core.pack.model.special.SpecialModelFactory; import net.momirealms.craftengine.core.pack.model.tint.TintFactory; import net.momirealms.craftengine.core.plugin.config.template.TemplateArgumentFactory; import net.momirealms.craftengine.core.plugin.context.Condition; +import net.momirealms.craftengine.core.plugin.context.PlayerBlockActionContext; +import net.momirealms.craftengine.core.plugin.context.condition.ConditionFactory; +import net.momirealms.craftengine.core.plugin.context.function.Function; import net.momirealms.craftengine.core.plugin.context.number.NumberProvider; import net.momirealms.craftengine.core.util.Factory; import net.momirealms.craftengine.core.util.Key; @@ -36,7 +39,7 @@ public class Registries { public static final ResourceKey> ITEM_BEHAVIOR_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("item_behavior_factory")); public static final ResourceKey>> LOOT_FUNCTION_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("loot_function_factory")); public static final ResourceKey>> LOOT_ENTRY_CONTAINER_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("loot_entry_container_factory")); - public static final ResourceKey>>> LOOT_CONDITION_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("loot_condition_factory")); + public static final ResourceKey>> LOOT_CONDITION_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("loot_condition_factory")); public static final ResourceKey>> NUMBER_PROVIDER_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("number_provider_factory")); public static final ResourceKey> TEMPLATE_ARGUMENT_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("template_argument_factory")); public static final ResourceKey> ITEM_MODEL_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("item_model_factory")); @@ -46,10 +49,12 @@ public class Registries { public static final ResourceKey> CONDITION_PROPERTY_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("condition_property_factory")); public static final ResourceKey> SELECT_PROPERTY_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("select_property_factory")); public static final ResourceKey>> RECIPE_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("recipe_factory")); - public static final ResourceKey> FORMULA_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("formula_factory")); - public static final ResourceKey>>> PATH_MATCHER_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("path_matcher_factory")); + public static final ResourceKey> FORMULA_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("formula_factory")); + public static final ResourceKey>> PATH_MATCHER_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("path_matcher_factory")); public static final ResourceKey> RESOLUTION_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("resolution_factory")); - public static final ResourceKey> SMITHING_RESULT_PROCESSOR_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("smithing_result_processor_factory")); + public static final ResourceKey> SMITHING_RESULT_PROCESSOR_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("smithing_result_processor_factory")); public static final ResourceKey> HITBOX_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("hitbox_factory")); public static final ResourceKey> RESOURCE_PACK_HOST_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("resource_pack_host_factory")); + public static final ResourceKey>>> PLAYER_BLOCK_FUNCTION_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("player_block_function_factory")); + public static final ResourceKey>>> PLAYER_BLOCK_CONDITION_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("player_block_condition_factory")); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/Key.java b/core/src/main/java/net/momirealms/craftengine/core/util/Key.java index c769b1738..ed43ffe8c 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/util/Key.java +++ b/core/src/main/java/net/momirealms/craftengine/core/util/Key.java @@ -1,5 +1,7 @@ package net.momirealms.craftengine.core.util; +import org.jetbrains.annotations.NotNull; + public record Key(String namespace, String value) { public static final String DEFAULT_NAMESPACE = "craftengine"; @@ -27,6 +29,10 @@ public record Key(String namespace, String value) { return of(decompose(namespacedId, "minecraft")); } + public static Key fromNamespaceAndPath(String namespace, String path) { + return Key.of(namespace, path); + } + public String[] decompose() { return new String[] { namespace, value }; } @@ -47,7 +53,7 @@ public record Key(String namespace, String value) { } @Override - public String toString() { + public @NotNull String toString() { return namespace + ":" + value; } diff --git a/gradle.properties b/gradle.properties index 69b28ee28..788fe5770 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,7 +4,7 @@ org.gradle.jvmargs=-Xmx1G # Rule: [major update].[feature update].[bug fix] project_version=0.0.53-beta.3 config_version=31 -lang_version=10 +lang_version=11 project_group=net.momirealms latest_supported_version=1.21.5 @@ -39,7 +39,7 @@ lz4_version=1.8.0 geantyref_version=1.3.16 zstd_version=1.5.7-2 commons_io_version=2.18.0 -sparrow_nbt_version=0.7.1 +sparrow_nbt_version=0.7.3 sparrow_util_version=0.39 fastutil_version=8.5.15 netty_version=4.1.119.Final From 279afcd0bcc34d8e73257c1c6dc3c502e4b44b42 Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Tue, 6 May 2025 03:13:19 +0800 Subject: [PATCH 28/51] =?UTF-8?q?fix(core):=20=E4=BF=AE=E5=A4=8D=E9=9D=9E?= =?UTF-8?q?=E6=B3=95=E5=8F=82=E6=95=B0=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../worldedit/FastAsyncWorldEditDelegate.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java index 1adf0be83..7c45577ae 100644 --- a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java @@ -23,6 +23,7 @@ import net.momirealms.craftengine.core.world.CEWorld; import net.momirealms.craftengine.core.world.ChunkPos; import net.momirealms.craftengine.core.world.chunk.CEChunk; import org.bukkit.Bukkit; +import org.bukkit.block.data.BlockData; import java.io.IOException; import java.util.HashSet; @@ -139,7 +140,13 @@ public class FastAsyncWorldEditDelegate extends AbstractDelegateExtent { private void processBlock(int blockX, int blockY, int blockZ, BaseBlock blockState, BaseBlock oldBlockState) throws IOException { int chunkX = blockX >> 4; int chunkZ = blockZ >> 4; - int newStateId = BlockStateUtils.blockDataToId(Bukkit.createBlockData(blockState.getAsString())); + BlockData blockData; + try { + blockData = Bukkit.createBlockData(blockState.getAsString()); + } catch (IllegalArgumentException e) { + blockData = Bukkit.createBlockData(blockState.getBlockType().id()); + } + int newStateId = BlockStateUtils.blockDataToId(blockData); // int oldStateId = BlockStateUtils.blockDataToId(Bukkit.createBlockData(oldBlockState.getAsString())); if (BlockStateUtils.isVanillaBlock(newStateId) /* && BlockStateUtils.isVanillaBlock(oldStateId) */) return; From 179f4eb43db6a77184a41a1dc7a36a5b960ecd3a Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Tue, 6 May 2025 03:19:42 +0800 Subject: [PATCH 29/51] =?UTF-8?q?fix(core):=20=E4=BF=AE=E5=A4=8D=E9=9D=9E?= =?UTF-8?q?=E6=B3=95=E5=8F=82=E6=95=B0=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../worldedit/FastAsyncWorldEditDelegate.java | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java index 7c45577ae..887f85aa7 100644 --- a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java @@ -27,8 +27,10 @@ import org.bukkit.block.data.BlockData; import java.io.IOException; import java.util.HashSet; +import java.util.Locale; import java.util.Optional; import java.util.Set; +import java.util.stream.Collectors; import static java.util.Objects.requireNonNull; @@ -140,13 +142,18 @@ public class FastAsyncWorldEditDelegate extends AbstractDelegateExtent { private void processBlock(int blockX, int blockY, int blockZ, BaseBlock blockState, BaseBlock oldBlockState) throws IOException { int chunkX = blockX >> 4; int chunkZ = blockZ >> 4; - BlockData blockData; - try { - blockData = Bukkit.createBlockData(blockState.getAsString()); - } catch (IllegalArgumentException e) { - blockData = Bukkit.createBlockData(blockState.getBlockType().id()); + String stringBlockState; + if (blockState.getStates().isEmpty()) { + stringBlockState = blockState.getBlockType().id(); + } else { + String properties = blockState.getStates().entrySet().stream() + .map(entry -> entry.getKey().getName() + + "=" + + entry.getValue().toString().toLowerCase(Locale.ROOT)) + .collect(Collectors.joining(",")); + stringBlockState = blockState.getBlockType().id() + "[" + properties + "]"; } - int newStateId = BlockStateUtils.blockDataToId(blockData); + int newStateId = BlockStateUtils.blockDataToId(Bukkit.createBlockData(stringBlockState)); // int oldStateId = BlockStateUtils.blockDataToId(Bukkit.createBlockData(oldBlockState.getAsString())); if (BlockStateUtils.isVanillaBlock(newStateId) /* && BlockStateUtils.isVanillaBlock(oldStateId) */) return; From c61f6c7e1ae17336fd8f7c12cab7d6f677146b17 Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Tue, 6 May 2025 03:21:26 +0800 Subject: [PATCH 30/51] =?UTF-8?q?fix(core):=20=E4=BF=AE=E5=A4=8D=E9=9D=9E?= =?UTF-8?q?=E6=B3=95=E5=8F=82=E6=95=B0=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../worldedit/FastAsyncWorldEditDelegate.java | 27 ++++++++++--------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java index 887f85aa7..e78c6aa4e 100644 --- a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java @@ -23,7 +23,6 @@ import net.momirealms.craftengine.core.world.CEWorld; import net.momirealms.craftengine.core.world.ChunkPos; import net.momirealms.craftengine.core.world.chunk.CEChunk; import org.bukkit.Bukkit; -import org.bukkit.block.data.BlockData; import java.io.IOException; import java.util.HashSet; @@ -142,18 +141,7 @@ public class FastAsyncWorldEditDelegate extends AbstractDelegateExtent { private void processBlock(int blockX, int blockY, int blockZ, BaseBlock blockState, BaseBlock oldBlockState) throws IOException { int chunkX = blockX >> 4; int chunkZ = blockZ >> 4; - String stringBlockState; - if (blockState.getStates().isEmpty()) { - stringBlockState = blockState.getBlockType().id(); - } else { - String properties = blockState.getStates().entrySet().stream() - .map(entry -> entry.getKey().getName() - + "=" - + entry.getValue().toString().toLowerCase(Locale.ROOT)) - .collect(Collectors.joining(",")); - stringBlockState = blockState.getBlockType().id() + "[" + properties + "]"; - } - int newStateId = BlockStateUtils.blockDataToId(Bukkit.createBlockData(stringBlockState)); + int newStateId = BlockStateUtils.blockDataToId(Bukkit.createBlockData(getStringBlockState(blockState))); // int oldStateId = BlockStateUtils.blockDataToId(Bukkit.createBlockData(oldBlockState.getAsString())); if (BlockStateUtils.isVanillaBlock(newStateId) /* && BlockStateUtils.isVanillaBlock(oldStateId) */) return; @@ -178,4 +166,17 @@ public class FastAsyncWorldEditDelegate extends AbstractDelegateExtent { CraftEngine.instance().logger().warn("Error when recording FastAsyncWorldEdit operation chunks", e); } } + + private String getStringBlockState(BaseBlock blockState) { + if (blockState.getStates().isEmpty()) { + return blockState.getBlockType().id(); + } else { + String properties = blockState.getStates().entrySet().stream() + .map(entry -> entry.getKey().getName() + + "=" + + entry.getValue().toString().toLowerCase(Locale.ROOT)) + .collect(Collectors.joining(",")); + return blockState.getBlockType().id() + "[" + properties + "]"; + } + } } From 3c9651a1b33ec8101f43a6d8c9908797bf065532 Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Tue, 6 May 2025 04:19:20 +0800 Subject: [PATCH 31/51] =?UTF-8?q?fix(core):=20=E4=BF=AE=E5=A4=8D=E9=9D=9E?= =?UTF-8?q?=E6=B3=95=E5=8F=82=E6=95=B0=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../worldedit/FastAsyncWorldEditDelegate.java | 27 ++++++------------- 1 file changed, 8 insertions(+), 19 deletions(-) diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java index e78c6aa4e..36ef29ada 100644 --- a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java @@ -1,8 +1,10 @@ package net.momirealms.craftengine.bukkit.compatibility.worldedit; +import com.fastasyncworldedit.bukkit.adapter.FaweAdapter; import com.fastasyncworldedit.core.configuration.Settings; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.WorldEdit; +import com.sk89q.worldedit.bukkit.WorldEditPlugin; import com.sk89q.worldedit.event.extent.EditSessionEvent; import com.sk89q.worldedit.extent.AbstractDelegateExtent; import com.sk89q.worldedit.function.mask.Mask; @@ -26,14 +28,13 @@ import org.bukkit.Bukkit; import java.io.IOException; import java.util.HashSet; -import java.util.Locale; import java.util.Optional; import java.util.Set; -import java.util.stream.Collectors; import static java.util.Objects.requireNonNull; public class FastAsyncWorldEditDelegate extends AbstractDelegateExtent { + private final FaweAdapter adapter = (FaweAdapter) WorldEditPlugin.getInstance().getBukkitImplAdapter(); private final Set chunksToSave; private final CEWorld ceWorld; @@ -141,10 +142,10 @@ public class FastAsyncWorldEditDelegate extends AbstractDelegateExtent { private void processBlock(int blockX, int blockY, int blockZ, BaseBlock blockState, BaseBlock oldBlockState) throws IOException { int chunkX = blockX >> 4; int chunkZ = blockZ >> 4; - int newStateId = BlockStateUtils.blockDataToId(Bukkit.createBlockData(getStringBlockState(blockState))); -// int oldStateId = BlockStateUtils.blockDataToId(Bukkit.createBlockData(oldBlockState.getAsString())); - if (BlockStateUtils.isVanillaBlock(newStateId) /* && BlockStateUtils.isVanillaBlock(oldStateId) */) - return; + int newStateId = BlockStateUtils.blockDataToId(this.adapter.adapt(blockState)); + int oldStateId = BlockStateUtils.blockDataToId(this.adapter.adapt(oldBlockState)); + CraftEngine.instance().debug(() -> "Processing block at " + blockX + ", " + blockY + ", " + blockZ + ": " + oldStateId + " -> " + newStateId); + if (BlockStateUtils.isVanillaBlock(newStateId) && BlockStateUtils.isVanillaBlock(oldStateId)) return; CEChunk ceChunk = Optional.ofNullable(this.ceWorld.getChunkAtIfLoaded(chunkX, chunkZ)) .orElse(this.ceWorld.worldDataStorage().readChunkAt(this.ceWorld, new ChunkPos(chunkX, chunkZ))); ImmutableBlockState immutableBlockState = BukkitBlockManager.instance().getImmutableBlockState(newStateId); @@ -159,6 +160,7 @@ public class FastAsyncWorldEditDelegate extends AbstractDelegateExtent { private void saveAllChunks() { try { for (CEChunk ceChunk : this.chunksToSave) { + CraftEngine.instance().debug(() -> "Saving chunk " + ceChunk.chunkPos()); this.ceWorld.worldDataStorage().writeChunkAt(ceChunk.chunkPos(), ceChunk, true); } this.chunksToSave.clear(); @@ -166,17 +168,4 @@ public class FastAsyncWorldEditDelegate extends AbstractDelegateExtent { CraftEngine.instance().logger().warn("Error when recording FastAsyncWorldEdit operation chunks", e); } } - - private String getStringBlockState(BaseBlock blockState) { - if (blockState.getStates().isEmpty()) { - return blockState.getBlockType().id(); - } else { - String properties = blockState.getStates().entrySet().stream() - .map(entry -> entry.getKey().getName() - + "=" - + entry.getValue().toString().toLowerCase(Locale.ROOT)) - .collect(Collectors.joining(",")); - return blockState.getBlockType().id() + "[" + properties + "]"; - } - } } From afa3d033dcddc1b6a3c86df82e975bf976b89819 Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Tue, 6 May 2025 15:37:22 +0800 Subject: [PATCH 32/51] =?UTF-8?q?refactor(core):=20=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E8=B5=84=E6=BA=90=E5=8C=85=E7=9A=84=E4=B8=80=E4=BA=9B=E4=B8=9C?= =?UTF-8?q?=E8=A5=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bukkit/loader/src/main/resources/config.yml | 2 + .../src/main/resources/translations/en.yml | 4 +- .../src/main/resources/translations/zh_cn.yml | 4 +- .../plugin/command/feature/ReloadCommand.java | 8 +++- .../plugin/network/PacketConsumers.java | 3 +- .../core/pack/AbstractPackManager.java | 40 ++++++++++++++++++- .../core/pack/host/impl/SelfHost.java | 9 ++++- .../pack/host/impl/SelfHostHttpServer.java | 6 +++ .../core/plugin/network/ProtocolVersion.java | 4 ++ .../core/util/ProtocolVersionUtils.java | 10 ----- gradle.properties | 4 +- 11 files changed, 76 insertions(+), 18 deletions(-) delete mode 100644 core/src/main/java/net/momirealms/craftengine/core/util/ProtocolVersionUtils.java diff --git a/bukkit/loader/src/main/resources/config.yml b/bukkit/loader/src/main/resources/config.yml index da8cf0aa0..c4d0b734f 100644 --- a/bukkit/loader/src/main/resources/config.yml +++ b/bukkit/loader/src/main/resources/config.yml @@ -78,6 +78,8 @@ resource-pack: ip: "localhost" port: 8163 protocol: "http" + # The optional URL must be complete and include a trailing slash / at the end. + #url: "http://localhost:8163/" deny-non-minecraft-request: true one-time-token: true rate-limit: diff --git a/bukkit/loader/src/main/resources/translations/en.yml b/bukkit/loader/src/main/resources/translations/en.yml index 5e545aeb3..77375beb6 100644 --- a/bukkit/loader/src/main/resources/translations/en.yml +++ b/bukkit/loader/src/main/resources/translations/en.yml @@ -272,6 +272,7 @@ warning.config.host.s3.missing_secret: "Issue found in config.yml at 're warning.config.host.s3.missing_upload_path: "Issue found in config.yml at 'resource-pack.delivery.hosting' - Missing required 'upload-path' argument for s3 host." warning.config.host.self.missing_ip: "Issue found in config.yml at 'resource-pack.delivery.hosting' - Missing required 'ip' argument for self host." warning.config.host.self.invalid_port: "Issue found in config.yml at 'resource-pack.delivery.hosting' - Invalid port '' for self host." +warning.config.host.self.invalid_url: "Issue found in config.yml at 'resource-pack.delivery.hosting' - Invalid url '' for self host." warning.config.host.gitlab.missing_url: "Issue found in config.yml at 'resource-pack.delivery.hosting' - Missing required 'gitlab-url' argument for gitlab host." warning.config.host.gitlab.missing_token: "Issue found in config.yml at 'resource-pack.delivery.hosting' - Missing required 'access-token' argument for gitlab host." warning.config.host.gitlab.missing_project: "Issue found in config.yml at 'resource-pack.delivery.hosting' - Missing required 'project-id' argument for gitlab host." @@ -292,4 +293,5 @@ warning.config.conflict_matcher.all_of.missing_terms: "Issue found in co warning.config.conflict_matcher.any_of.missing_terms: "Issue found in config.yml at 'resource-pack.duplicated-files-handler' - Missing required 'terms' argument for 'any_of' matcher." warning.config.conflict_resolution.missing_type: "Issue found in config.yml at 'resource-pack.duplicated-files-handler' - Missing required 'type' argument for one of the resolutions." warning.config.conflict_resolution.invalid_type: "Issue found in config.yml at 'resource-pack.duplicated-files-handler' - One of the resolutions is using the invalid type ''." -warning.config.function.command.missing_command: "Issue found in file - The config '' is missing the required 'command' argument for 'command' function." \ No newline at end of file +warning.config.function.command.missing_command: "Issue found in file - The config '' is missing the required 'command' argument for 'command' function." +warning.resource_pack.generation_in_progress: "Resource pack generation is already in progress. Please wait until it finishes." \ No newline at end of file diff --git a/bukkit/loader/src/main/resources/translations/zh_cn.yml b/bukkit/loader/src/main/resources/translations/zh_cn.yml index d2dd13dd8..1a1152fc3 100644 --- a/bukkit/loader/src/main/resources/translations/zh_cn.yml +++ b/bukkit/loader/src/main/resources/translations/zh_cn.yml @@ -274,6 +274,7 @@ warning.config.host.s3.missing_secret: "在 config.yml 的 'resource-pac warning.config.host.s3.missing_upload_path: "在 config.yml 的 'resource-pack.delivery.hosting' 处发现问题 - S3 托管缺少必需的 'upload-path' 参数" warning.config.host.self.missing_ip: "在 config.yml 的 'resource-pack.delivery.hosting' 处发现问题 - 自托管托管缺少必需的 'ip' 参数" warning.config.host.self.invalid_port: "在 config.yml 的 'resource-pack.delivery.hosting' 处发现问题 - 自托管托管的端口 '' 无效" +warning.config.host.self.invalid_url: "在 config.yml 的 'resource-pack.delivery.hosting' 处发现问题 - 自托管托管的 URL '' 无效" warning.config.host.gitlab.missing_url: "在 config.yml 的 'resource-pack.delivery.hosting' 处发现问题 - GitLab 托管缺少必需的 'gitlab-url' 参数" warning.config.host.gitlab.missing_token: "在 config.yml 的 'resource-pack.delivery.hosting' 处发现问题 - GitLab 托管缺少必需的 'access-token' 参数" warning.config.host.gitlab.missing_project: "在 config.yml 的 'resource-pack.delivery.hosting' 处发现问题 - GitLab 托管缺少必需的 'project-id' 参数" @@ -293,4 +294,5 @@ warning.config.conflict_matcher.inverted.missing_term: "在 config.yml warning.config.conflict_matcher.all_of.missing_terms: "在 config.yml 的 'resource-pack.duplicated-files-handler' 处发现问题 - 全匹配器缺少必需的 'terms' 参数" warning.config.conflict_matcher.any_of.missing_terms: "在 config.yml 的 'resource-pack.duplicated-files-handler' 处发现问题 - 任一匹配器缺少必需的 'terms' 参数" warning.config.conflict_resolution.missing_type: "在 config.yml 的 'resource-pack.duplicated-files-handler' 处发现问题 - 文件冲突处理器的某个解决方案缺少必需的 'type' 参数" -warning.config.conflict_resolution.invalid_type: "在 config.yml 的 'resource-pack.duplicated-files-handler' 处发现问题 - 文件冲突处理器的某个解决方案使用了无效类型 ''" \ No newline at end of file +warning.config.conflict_resolution.invalid_type: "在 config.yml 的 'resource-pack.duplicated-files-handler' 处发现问题 - 文件冲突处理器的某个解决方案使用了无效类型 ''" +warning.resource_pack.generation_in_progress: "资源包正在生成中, 请等待完成再试" \ No newline at end of file diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/ReloadCommand.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/ReloadCommand.java index 00056ba91..76af5ab13 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/ReloadCommand.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/ReloadCommand.java @@ -4,6 +4,7 @@ import net.kyori.adventure.text.Component; import net.momirealms.craftengine.bukkit.plugin.command.BukkitCommandFeature; import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.plugin.command.CraftEngineCommandManager; +import net.momirealms.craftengine.core.plugin.locale.LocalizedException; import net.momirealms.craftengine.core.plugin.locale.MessageConstants; import org.bukkit.command.CommandSender; import org.incendo.cloud.Command; @@ -68,7 +69,9 @@ public class ReloadCommand extends BukkitCommandFeature { long time2 = System.currentTimeMillis(); long packTime = time2 - time1; handleFeedback(context, MessageConstants.COMMAND_RELOAD_PACK_SUCCESS, Component.text(packTime)); - + } catch (LocalizedException e) { + handleFeedback(context, MessageConstants.COMMAND_RELOAD_PACK_FAILURE); + plugin().logger().warn(e.getMessage()); } catch (Exception e) { handleFeedback(context, MessageConstants.COMMAND_RELOAD_PACK_FAILURE); plugin().logger().warn("Failed to generate resource pack", e); @@ -89,6 +92,9 @@ public class ReloadCommand extends BukkitCommandFeature { Component.text(reloadResult.syncTime()), Component.text(packTime) ); + } catch (LocalizedException e) { + handleFeedback(context, MessageConstants.COMMAND_RELOAD_PACK_FAILURE); + plugin().logger().warn(e.getMessage()); } finally { RELOAD_PACK_FLAG = false; } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java index c611b7049..1651cf099 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java @@ -34,6 +34,7 @@ import net.momirealms.craftengine.core.plugin.config.Config; import net.momirealms.craftengine.core.plugin.network.ConnectionState; import net.momirealms.craftengine.core.plugin.network.NetWorkUser; import net.momirealms.craftengine.core.plugin.network.NetworkManager; +import net.momirealms.craftengine.core.plugin.network.ProtocolVersion; import net.momirealms.craftengine.core.util.*; import net.momirealms.craftengine.core.world.BlockHitResult; import net.momirealms.craftengine.core.world.BlockPos; @@ -1348,7 +1349,7 @@ public class PacketConsumers { // When the hotbar is full, the latest creative mode inventory can only be accessed when the player opens the inventory screen. Currently, it is not worth further handling this issue. public static final TriConsumer SET_CREATIVE_SLOT = (user, event, packet) -> { try { - if (VersionHelper.isOrAbove1_21_4()) return; + if (user.protocolVersion().isVersionNewerThan(ProtocolVersion.V1_21_4)) return; if (!user.isOnline()) return; BukkitServerPlayer player = (BukkitServerPlayer) user; if (VersionHelper.isFolia()) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/AbstractPackManager.java b/core/src/main/java/net/momirealms/craftengine/core/pack/AbstractPackManager.java index ff722cd59..448873dca 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/AbstractPackManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/AbstractPackManager.java @@ -44,6 +44,7 @@ import java.util.*; import java.util.function.BiConsumer; import java.util.function.Consumer; import java.util.function.Predicate; +import java.util.stream.Stream; import static net.momirealms.craftengine.core.util.MiscUtils.castToMap; @@ -73,6 +74,7 @@ public abstract class AbstractPackManager implements PackManager { private final TreeMap> cachedConfigs = new TreeMap<>(); protected BiConsumer zipGenerator; protected ResourcePackHost resourcePackHost; + private boolean generateResourcePack = false; public AbstractPackManager(CraftEngine plugin, BiConsumer eventDispatcher) { this.plugin = plugin; @@ -141,6 +143,7 @@ public abstract class AbstractPackManager implements PackManager { @Override public void load() { + initFileSystemProvider(); List> list = Config.instance().settings().getMapList("resource-pack.delivery.hosting"); if (list == null || list.isEmpty()) { this.resourcePackHost = NoneHost.INSTANCE; @@ -484,8 +487,42 @@ public abstract class AbstractPackManager implements PackManager { } } + private static void initFileSystemProvider() { + String osName = System.getProperty("os.name").toLowerCase(); + String providerClass = null; + if (osName.contains("win")) { + providerClass = "sun.nio.fs.WindowsFileSystemProvider"; + } else if (osName.contains("nix") || osName.contains("nux") || osName.contains("aix")) { + providerClass = "sun.nio.fs.LinuxFileSystemProvider"; + } else if (osName.contains("mac")) { + providerClass = "sun.nio.fs.MacOSXFileSystemProvider"; + } + if (providerClass != null) { + try { + System.setProperty("java.nio.file.spi.DefaultFileSystemProvider", providerClass); + } catch (Exception ignored) {} + } + } + + private static void deleteDirectory(Path folder) throws IOException { + if (!Files.exists(folder)) return; + try (Stream walk = Files.walk(folder)) { + walk.sorted(Comparator.reverseOrder()) + .parallel() + .forEach(path -> { + try { + Files.delete(path); + } catch (IOException ignored) {} + }); + } + } + @Override public void generateResourcePack() { + if (this.generateResourcePack) { + throw new LocalizedException("warning.resource_pack.generation_in_progress"); + } + this.generateResourcePack = true; this.plugin.logger().info("Generating resource pack..."); long start = System.currentTimeMillis(); // get the target location @@ -494,7 +531,7 @@ public abstract class AbstractPackManager implements PackManager { .resolve("resource_pack"); try { - org.apache.commons.io.FileUtils.deleteDirectory(generatedPackPath.toFile()); + deleteDirectory(generatedPackPath); } catch (IOException e) { this.plugin.logger().severe("Error deleting previous resource pack", e); } @@ -547,6 +584,7 @@ public abstract class AbstractPackManager implements PackManager { long end = System.currentTimeMillis(); this.plugin.logger().info("Finished generating resource pack in " + (end - start) + "ms"); this.eventDispatcher.accept(generatedPackPath, zipFile); + this.generateResourcePack = false; } private void generateParticle(Path generatedPackPath) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/SelfHost.java b/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/SelfHost.java index de38d7771..acfdd0800 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/SelfHost.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/SelfHost.java @@ -66,6 +66,13 @@ public class SelfHost implements ResourcePackHost { if (port <= 0 || port > 65535) { throw new LocalizedException("warning.config.host.self.invalid_port", String.valueOf(port)); } + String url = arguments.getOrDefault("url", "").toString(); + if (!url.isEmpty()) { + if (!url.startsWith("http://") && !url.startsWith("https://")) { + throw new LocalizedException("warning.config.host.self.invalid_url", url); + } + if (!url.endsWith("/")) url += "/"; + } boolean oneTimeToken = (boolean) arguments.getOrDefault("one-time-token", true); String protocol = arguments.getOrDefault("protocol", "http").toString(); boolean denyNonMinecraftRequest = (boolean) arguments.getOrDefault("deny-non-minecraft-request", true); @@ -76,7 +83,7 @@ public class SelfHost implements ResourcePackHost { maxRequests = ResourceConfigUtils.getAsInt(rateMap.getOrDefault("max-requests", 5), "max-requests"); resetInterval = ResourceConfigUtils.getAsInt(rateMap.getOrDefault("reset-interval", 20), "reset-interval") * 1000; } - selfHostHttpServer.updateProperties(ip, port, denyNonMinecraftRequest, protocol, maxRequests, resetInterval, oneTimeToken); + selfHostHttpServer.updateProperties(ip, port, url, denyNonMinecraftRequest, protocol, maxRequests, resetInterval, oneTimeToken); return INSTANCE; } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/SelfHostHttpServer.java b/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/SelfHostHttpServer.java index 6ce927583..785a00c6d 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/SelfHostHttpServer.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/SelfHostHttpServer.java @@ -48,6 +48,7 @@ public class SelfHostHttpServer { private String ip = "localhost"; private int port = -1; private String protocol = "http"; + private String url; private boolean denyNonMinecraft = true; private boolean useToken; @@ -57,12 +58,14 @@ public class SelfHostHttpServer { public void updateProperties(String ip, int port, + String url, boolean denyNonMinecraft, String protocol, int maxRequests, int resetInternal, boolean token) { this.ip = ip; + this.url = url; this.denyNonMinecraft = denyNonMinecraft; this.protocol = protocol; this.rateLimit = maxRequests; @@ -112,6 +115,9 @@ public class SelfHostHttpServer { } public String url() { + if (this.url != null && !this.url.isEmpty()) { + return this.url; + } return this.protocol + "://" + this.ip + ":" + this.port + "/"; } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/network/ProtocolVersion.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/network/ProtocolVersion.java index c692c6da6..f9e3c4b05 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/network/ProtocolVersion.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/network/ProtocolVersion.java @@ -32,6 +32,10 @@ public enum ProtocolVersion { return name; } + public boolean isVersionNewerThan(ProtocolVersion targetVersion) { + return this.getId() >= targetVersion.getId(); + } + public static ProtocolVersion getByName(String name) { for (ProtocolVersion version : values()) { if (version.getName().equals(name)) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/ProtocolVersionUtils.java b/core/src/main/java/net/momirealms/craftengine/core/util/ProtocolVersionUtils.java deleted file mode 100644 index 8372e1117..000000000 --- a/core/src/main/java/net/momirealms/craftengine/core/util/ProtocolVersionUtils.java +++ /dev/null @@ -1,10 +0,0 @@ -package net.momirealms.craftengine.core.util; - -import net.momirealms.craftengine.core.plugin.network.ProtocolVersion; - -public class ProtocolVersionUtils { - - public static boolean isVersionNewerThan(ProtocolVersion version, ProtocolVersion targetVersion) { - return version.getId() >= targetVersion.getId(); - } -} diff --git a/gradle.properties b/gradle.properties index 788fe5770..4c60323b6 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,7 +4,7 @@ org.gradle.jvmargs=-Xmx1G # Rule: [major update].[feature update].[bug fix] project_version=0.0.53-beta.3 config_version=31 -lang_version=11 +lang_version=12 project_group=net.momirealms latest_supported_version=1.21.5 @@ -40,7 +40,7 @@ geantyref_version=1.3.16 zstd_version=1.5.7-2 commons_io_version=2.18.0 sparrow_nbt_version=0.7.3 -sparrow_util_version=0.39 +sparrow_util_version=0.40 fastutil_version=8.5.15 netty_version=4.1.119.Final joml_version=1.10.8 From 066f42f1f48c62a6bec9d3cbd39c4937f47dd234 Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Tue, 6 May 2025 15:41:04 +0800 Subject: [PATCH 33/51] =?UTF-8?q?refactor(core):=20=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E8=B5=84=E6=BA=90=E5=8C=85=E7=9A=84=E4=B8=80=E4=BA=9B=E4=B8=9C?= =?UTF-8?q?=E8=A5=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bukkit/loader/src/main/resources/translations/en.yml | 4 ++-- bukkit/loader/src/main/resources/translations/zh_cn.yml | 4 ++-- .../momirealms/craftengine/core/pack/AbstractPackManager.java | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/bukkit/loader/src/main/resources/translations/en.yml b/bukkit/loader/src/main/resources/translations/en.yml index 77375beb6..1f496412f 100644 --- a/bukkit/loader/src/main/resources/translations/en.yml +++ b/bukkit/loader/src/main/resources/translations/en.yml @@ -64,6 +64,7 @@ command.upload.failure.not_supported: "Current hosting method '' doe command.upload.on_progress: "Started uploading progress. Check the console for more information." command.send_resource_pack.success.single: "Sent resource pack to ." command.send_resource_pack.success.multiple: "Send resource packs to players." +command.resource_pack.generation_in_progress: "Resource pack generation is already in progress. Please wait until it finishes." warning.config.pack.duplicated_files: "Duplicated files Found. Please resolve them through config.yml 'resource-pack.duplicated-files-handler' section." warning.config.type.int: "Issue found in file - Failed to load '': Cannot cast '' to integer type for option ''." warning.config.type.float: "Issue found in file - Failed to load '': Cannot cast '' to float type for option ''." @@ -293,5 +294,4 @@ warning.config.conflict_matcher.all_of.missing_terms: "Issue found in co warning.config.conflict_matcher.any_of.missing_terms: "Issue found in config.yml at 'resource-pack.duplicated-files-handler' - Missing required 'terms' argument for 'any_of' matcher." warning.config.conflict_resolution.missing_type: "Issue found in config.yml at 'resource-pack.duplicated-files-handler' - Missing required 'type' argument for one of the resolutions." warning.config.conflict_resolution.invalid_type: "Issue found in config.yml at 'resource-pack.duplicated-files-handler' - One of the resolutions is using the invalid type ''." -warning.config.function.command.missing_command: "Issue found in file - The config '' is missing the required 'command' argument for 'command' function." -warning.resource_pack.generation_in_progress: "Resource pack generation is already in progress. Please wait until it finishes." \ No newline at end of file +warning.config.function.command.missing_command: "Issue found in file - The config '' is missing the required 'command' argument for 'command' function." \ No newline at end of file diff --git a/bukkit/loader/src/main/resources/translations/zh_cn.yml b/bukkit/loader/src/main/resources/translations/zh_cn.yml index 1a1152fc3..09b3238ad 100644 --- a/bukkit/loader/src/main/resources/translations/zh_cn.yml +++ b/bukkit/loader/src/main/resources/translations/zh_cn.yml @@ -64,6 +64,7 @@ command.upload.failure.not_supported: "当前托管模式 '' 不支 command.upload.on_progress: "已开始上传进程. 检查控制台以获取详细信息." command.send_resource_pack.success.single: "发送资源包给 " command.send_resource_pack.success.multiple: "发送资源包给 个玩家" +command.resource_pack.generation_in_progress: "资源包正在生成中, 请等待完成再试" warning.config.pack.duplicated_files: "发现重复文件 请通过 config.yml 的 'resource-pack.duplicated-files-handler' 部分解决" warning.config.type.int: "在文件 发现问题 - 无法加载 '': 无法将 '' 转换为整数类型 (选项 '')" warning.config.type.float: "在文件 发现问题 - 无法加载 '': 无法将 '' 转换为浮点数类型 (选项 '')" @@ -294,5 +295,4 @@ warning.config.conflict_matcher.inverted.missing_term: "在 config.yml warning.config.conflict_matcher.all_of.missing_terms: "在 config.yml 的 'resource-pack.duplicated-files-handler' 处发现问题 - 全匹配器缺少必需的 'terms' 参数" warning.config.conflict_matcher.any_of.missing_terms: "在 config.yml 的 'resource-pack.duplicated-files-handler' 处发现问题 - 任一匹配器缺少必需的 'terms' 参数" warning.config.conflict_resolution.missing_type: "在 config.yml 的 'resource-pack.duplicated-files-handler' 处发现问题 - 文件冲突处理器的某个解决方案缺少必需的 'type' 参数" -warning.config.conflict_resolution.invalid_type: "在 config.yml 的 'resource-pack.duplicated-files-handler' 处发现问题 - 文件冲突处理器的某个解决方案使用了无效类型 ''" -warning.resource_pack.generation_in_progress: "资源包正在生成中, 请等待完成再试" \ No newline at end of file +warning.config.conflict_resolution.invalid_type: "在 config.yml 的 'resource-pack.duplicated-files-handler' 处发现问题 - 文件冲突处理器的某个解决方案使用了无效类型 ''" \ No newline at end of file diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/AbstractPackManager.java b/core/src/main/java/net/momirealms/craftengine/core/pack/AbstractPackManager.java index 448873dca..516939c20 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/AbstractPackManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/AbstractPackManager.java @@ -520,7 +520,7 @@ public abstract class AbstractPackManager implements PackManager { @Override public void generateResourcePack() { if (this.generateResourcePack) { - throw new LocalizedException("warning.resource_pack.generation_in_progress"); + throw new LocalizedException("command.resource_pack.generation_in_progress"); } this.generateResourcePack = true; this.plugin.logger().info("Generating resource pack..."); From 6fe8f31f7ccc3837c0fbe8b01657bfdb04c26aec Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Tue, 6 May 2025 15:42:59 +0800 Subject: [PATCH 34/51] =?UTF-8?q?refactor(core):=20=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E8=B5=84=E6=BA=90=E5=8C=85=E7=9A=84=E4=B8=80=E4=BA=9B=E4=B8=9C?= =?UTF-8?q?=E8=A5=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bukkit/loader/src/main/resources/translations/en.yml | 1 - bukkit/loader/src/main/resources/translations/zh_cn.yml | 1 - .../bukkit/plugin/command/feature/ReloadCommand.java | 6 ------ .../craftengine/core/pack/AbstractPackManager.java | 6 ------ 4 files changed, 14 deletions(-) diff --git a/bukkit/loader/src/main/resources/translations/en.yml b/bukkit/loader/src/main/resources/translations/en.yml index 1f496412f..96cd97723 100644 --- a/bukkit/loader/src/main/resources/translations/en.yml +++ b/bukkit/loader/src/main/resources/translations/en.yml @@ -64,7 +64,6 @@ command.upload.failure.not_supported: "Current hosting method '' doe command.upload.on_progress: "Started uploading progress. Check the console for more information." command.send_resource_pack.success.single: "Sent resource pack to ." command.send_resource_pack.success.multiple: "Send resource packs to players." -command.resource_pack.generation_in_progress: "Resource pack generation is already in progress. Please wait until it finishes." warning.config.pack.duplicated_files: "Duplicated files Found. Please resolve them through config.yml 'resource-pack.duplicated-files-handler' section." warning.config.type.int: "Issue found in file - Failed to load '': Cannot cast '' to integer type for option ''." warning.config.type.float: "Issue found in file - Failed to load '': Cannot cast '' to float type for option ''." diff --git a/bukkit/loader/src/main/resources/translations/zh_cn.yml b/bukkit/loader/src/main/resources/translations/zh_cn.yml index 09b3238ad..f191e0076 100644 --- a/bukkit/loader/src/main/resources/translations/zh_cn.yml +++ b/bukkit/loader/src/main/resources/translations/zh_cn.yml @@ -64,7 +64,6 @@ command.upload.failure.not_supported: "当前托管模式 '' 不支 command.upload.on_progress: "已开始上传进程. 检查控制台以获取详细信息." command.send_resource_pack.success.single: "发送资源包给 " command.send_resource_pack.success.multiple: "发送资源包给 个玩家" -command.resource_pack.generation_in_progress: "资源包正在生成中, 请等待完成再试" warning.config.pack.duplicated_files: "发现重复文件 请通过 config.yml 的 'resource-pack.duplicated-files-handler' 部分解决" warning.config.type.int: "在文件 发现问题 - 无法加载 '': 无法将 '' 转换为整数类型 (选项 '')" warning.config.type.float: "在文件 发现问题 - 无法加载 '': 无法将 '' 转换为浮点数类型 (选项 '')" diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/ReloadCommand.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/ReloadCommand.java index 76af5ab13..b1ee0e30d 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/ReloadCommand.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/ReloadCommand.java @@ -69,9 +69,6 @@ public class ReloadCommand extends BukkitCommandFeature { long time2 = System.currentTimeMillis(); long packTime = time2 - time1; handleFeedback(context, MessageConstants.COMMAND_RELOAD_PACK_SUCCESS, Component.text(packTime)); - } catch (LocalizedException e) { - handleFeedback(context, MessageConstants.COMMAND_RELOAD_PACK_FAILURE); - plugin().logger().warn(e.getMessage()); } catch (Exception e) { handleFeedback(context, MessageConstants.COMMAND_RELOAD_PACK_FAILURE); plugin().logger().warn("Failed to generate resource pack", e); @@ -92,9 +89,6 @@ public class ReloadCommand extends BukkitCommandFeature { Component.text(reloadResult.syncTime()), Component.text(packTime) ); - } catch (LocalizedException e) { - handleFeedback(context, MessageConstants.COMMAND_RELOAD_PACK_FAILURE); - plugin().logger().warn(e.getMessage()); } finally { RELOAD_PACK_FLAG = false; } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/AbstractPackManager.java b/core/src/main/java/net/momirealms/craftengine/core/pack/AbstractPackManager.java index 516939c20..b582cb7d9 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/AbstractPackManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/AbstractPackManager.java @@ -74,7 +74,6 @@ public abstract class AbstractPackManager implements PackManager { private final TreeMap> cachedConfigs = new TreeMap<>(); protected BiConsumer zipGenerator; protected ResourcePackHost resourcePackHost; - private boolean generateResourcePack = false; public AbstractPackManager(CraftEngine plugin, BiConsumer eventDispatcher) { this.plugin = plugin; @@ -519,10 +518,6 @@ public abstract class AbstractPackManager implements PackManager { @Override public void generateResourcePack() { - if (this.generateResourcePack) { - throw new LocalizedException("command.resource_pack.generation_in_progress"); - } - this.generateResourcePack = true; this.plugin.logger().info("Generating resource pack..."); long start = System.currentTimeMillis(); // get the target location @@ -584,7 +579,6 @@ public abstract class AbstractPackManager implements PackManager { long end = System.currentTimeMillis(); this.plugin.logger().info("Finished generating resource pack in " + (end - start) + "ms"); this.eventDispatcher.accept(generatedPackPath, zipFile); - this.generateResourcePack = false; } private void generateParticle(Path generatedPackPath) { From 39226b67d47da4728c9bb02c3b4638b8cac9d80e Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Tue, 6 May 2025 16:04:27 +0800 Subject: [PATCH 35/51] =?UTF-8?q?=E4=BC=98=E5=8C=96FAWE=E5=85=BC=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../worldedit/FastAsyncWorldEditDelegate.java | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java index 36ef29ada..900825979 100644 --- a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java @@ -1,5 +1,6 @@ package net.momirealms.craftengine.bukkit.compatibility.worldedit; +import com.fastasyncworldedit.bukkit.adapter.CachedBukkitAdapter; import com.fastasyncworldedit.bukkit.adapter.FaweAdapter; import com.fastasyncworldedit.core.configuration.Settings; import com.sk89q.worldedit.EditSession; @@ -21,12 +22,14 @@ import net.momirealms.craftengine.bukkit.util.BlockStateUtils; import net.momirealms.craftengine.core.block.EmptyBlock; import net.momirealms.craftengine.core.block.ImmutableBlockState; import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.util.ReflectionUtils; import net.momirealms.craftengine.core.world.CEWorld; import net.momirealms.craftengine.core.world.ChunkPos; import net.momirealms.craftengine.core.world.chunk.CEChunk; import org.bukkit.Bukkit; import java.io.IOException; +import java.lang.reflect.Method; import java.util.HashSet; import java.util.Optional; import java.util.Set; @@ -34,9 +37,9 @@ import java.util.Set; import static java.util.Objects.requireNonNull; public class FastAsyncWorldEditDelegate extends AbstractDelegateExtent { - private final FaweAdapter adapter = (FaweAdapter) WorldEditPlugin.getInstance().getBukkitImplAdapter(); private final Set chunksToSave; private final CEWorld ceWorld; + private static int[] ordinalToIbdID; protected FastAsyncWorldEditDelegate(EditSessionEvent event) { super(event.getExtent()); @@ -49,6 +52,14 @@ public class FastAsyncWorldEditDelegate extends AbstractDelegateExtent { public static void init() { Settings.settings().EXTENT.ALLOWED_PLUGINS.add(FastAsyncWorldEditDelegate.class.getCanonicalName()); + FaweAdapter adapter= (FaweAdapter) WorldEditPlugin.getInstance().getBukkitImplAdapter(); + Method ordinalToIbdIDMethod = ReflectionUtils.getDeclaredMethod(CachedBukkitAdapter.class, int.class.arrayType(), new String[]{"getOrdinalToIbdID"}); + try { + assert ordinalToIbdIDMethod != null; + ordinalToIbdID = (int[]) ordinalToIbdIDMethod.invoke(adapter); + } catch (ReflectiveOperationException e) { + throw new RuntimeException("Failed to init FAWE compatibility", e); + } WorldEdit.getInstance().getEventBus().register(new Object() { @Subscribe @SuppressWarnings("unused") @@ -139,11 +150,11 @@ public class FastAsyncWorldEditDelegate extends AbstractDelegateExtent { } } - private void processBlock(int blockX, int blockY, int blockZ, BaseBlock blockState, BaseBlock oldBlockState) throws IOException { + private void processBlock(int blockX, int blockY, int blockZ, BaseBlock newBlock, BaseBlock oldBlock) throws IOException { int chunkX = blockX >> 4; int chunkZ = blockZ >> 4; - int newStateId = BlockStateUtils.blockDataToId(this.adapter.adapt(blockState)); - int oldStateId = BlockStateUtils.blockDataToId(this.adapter.adapt(oldBlockState)); + int newStateId = ordinalToIbdID[newBlock.getOrdinal()]; + int oldStateId = ordinalToIbdID[oldBlock.getOrdinal()]; CraftEngine.instance().debug(() -> "Processing block at " + blockX + ", " + blockY + ", " + blockZ + ": " + oldStateId + " -> " + newStateId); if (BlockStateUtils.isVanillaBlock(newStateId) && BlockStateUtils.isVanillaBlock(oldStateId)) return; CEChunk ceChunk = Optional.ofNullable(this.ceWorld.getChunkAtIfLoaded(chunkX, chunkZ)) From a1fac1575b5f4499f3fae26b04d10836198835ca Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Tue, 6 May 2025 16:14:27 +0800 Subject: [PATCH 36/51] =?UTF-8?q?=E5=A2=9E=E5=8A=A0BEFORE=5FCHANGE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../compatibility/worldedit/FastAsyncWorldEditDelegate.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java index 900825979..55767f3a9 100644 --- a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java @@ -64,8 +64,9 @@ public class FastAsyncWorldEditDelegate extends AbstractDelegateExtent { @Subscribe @SuppressWarnings("unused") public void onEditSessionEvent(EditSessionEvent event) { - if (event.getStage() != EditSession.Stage.BEFORE_HISTORY) return; - event.setExtent(new FastAsyncWorldEditDelegate(event)); + if (event.getStage() == EditSession.Stage.BEFORE_HISTORY || event.getStage() == EditSession.Stage.BEFORE_CHANGE) { + event.setExtent(new FastAsyncWorldEditDelegate(event)); + } } }); } From 044735ef0d80bc90a6758a0a9a486f9b91989ac8 Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Tue, 6 May 2025 16:21:38 +0800 Subject: [PATCH 37/51] =?UTF-8?q?=E6=9B=B4=E6=94=B9try=20catch=E4=BD=9C?= =?UTF-8?q?=E7=94=A8=E5=9F=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../worldedit/FastAsyncWorldEditDelegate.java | 64 ++++++++----------- 1 file changed, 28 insertions(+), 36 deletions(-) diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java index 55767f3a9..79a7d027a 100644 --- a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java @@ -52,7 +52,7 @@ public class FastAsyncWorldEditDelegate extends AbstractDelegateExtent { public static void init() { Settings.settings().EXTENT.ALLOWED_PLUGINS.add(FastAsyncWorldEditDelegate.class.getCanonicalName()); - FaweAdapter adapter= (FaweAdapter) WorldEditPlugin.getInstance().getBukkitImplAdapter(); + FaweAdapter adapter = (FaweAdapter) WorldEditPlugin.getInstance().getBukkitImplAdapter(); Method ordinalToIbdIDMethod = ReflectionUtils.getDeclaredMethod(CachedBukkitAdapter.class, int.class.arrayType(), new String[]{"getOrdinalToIbdID"}); try { assert ordinalToIbdIDMethod != null; @@ -109,23 +109,15 @@ public class FastAsyncWorldEditDelegate extends AbstractDelegateExtent { @Override public > boolean setBlock(int x, int y, int z, T block) { - try { - BaseBlock oldBlockState = getBlock(x, y, z).toBaseBlock(); - this.processBlock(x, y, z, block.toBaseBlock(), oldBlockState); - } catch (Exception e) { - CraftEngine.instance().logger().warn("Error when recording FastAsyncWorldEdit operation blocks", e); - } + BaseBlock oldBlockState = getBlock(x, y, z).toBaseBlock(); + this.processBlock(x, y, z, block.toBaseBlock(), oldBlockState); return super.setBlock(x, y, z, block); } @Override public > boolean setBlock(BlockVector3 position, T block) { - try { - BaseBlock oldBlockState = getBlock(position).toBaseBlock(); - this.processBlock(position.x(), position.y(), position.z(), block.toBaseBlock(), oldBlockState); - } catch (Exception e) { - CraftEngine.instance().logger().warn("Error when recording FastAsyncWorldEdit operation blocks", e); - } + BaseBlock oldBlockState = getBlock(position).toBaseBlock(); + this.processBlock(position.x(), position.y(), position.z(), block.toBaseBlock(), oldBlockState); return super.setBlock(position, block); } @@ -136,37 +128,37 @@ public class FastAsyncWorldEditDelegate extends AbstractDelegateExtent { } private void processBlocks(Iterable region, Pattern pattern) { - try { - for (BlockVector3 position : region) { - BaseBlock blockState = pattern.applyBlock(position); - BaseBlock oldBlockState = getBlock(position).toBaseBlock(); - int blockX = position.x(); - int blockY = position.y(); - int blockZ = position.z(); - this.processBlock(blockX, blockY, blockZ, blockState, oldBlockState); - } - saveAllChunks(); - } catch (Exception e) { - CraftEngine.instance().logger().warn("Error when recording FastAsyncWorldEdit operation blocks", e); + for (BlockVector3 position : region) { + BaseBlock blockState = pattern.applyBlock(position); + BaseBlock oldBlockState = getBlock(position).toBaseBlock(); + int blockX = position.x(); + int blockY = position.y(); + int blockZ = position.z(); + this.processBlock(blockX, blockY, blockZ, blockState, oldBlockState); } + saveAllChunks(); } - private void processBlock(int blockX, int blockY, int blockZ, BaseBlock newBlock, BaseBlock oldBlock) throws IOException { + private void processBlock(int blockX, int blockY, int blockZ, BaseBlock newBlock, BaseBlock oldBlock) { int chunkX = blockX >> 4; int chunkZ = blockZ >> 4; int newStateId = ordinalToIbdID[newBlock.getOrdinal()]; int oldStateId = ordinalToIbdID[oldBlock.getOrdinal()]; - CraftEngine.instance().debug(() -> "Processing block at " + blockX + ", " + blockY + ", " + blockZ + ": " + oldStateId + " -> " + newStateId); + //CraftEngine.instance().debug(() -> "Processing block at " + blockX + ", " + blockY + ", " + blockZ + ": " + oldStateId + " -> " + newStateId); if (BlockStateUtils.isVanillaBlock(newStateId) && BlockStateUtils.isVanillaBlock(oldStateId)) return; - CEChunk ceChunk = Optional.ofNullable(this.ceWorld.getChunkAtIfLoaded(chunkX, chunkZ)) - .orElse(this.ceWorld.worldDataStorage().readChunkAt(this.ceWorld, new ChunkPos(chunkX, chunkZ))); - ImmutableBlockState immutableBlockState = BukkitBlockManager.instance().getImmutableBlockState(newStateId); - if (immutableBlockState == null) { - ceChunk.setBlockState(blockX, blockY, blockZ, EmptyBlock.STATE); - } else { - ceChunk.setBlockState(blockX, blockY, blockZ, immutableBlockState); + try { + CEChunk ceChunk = Optional.ofNullable(this.ceWorld.getChunkAtIfLoaded(chunkX, chunkZ)) + .orElse(this.ceWorld.worldDataStorage().readChunkAt(this.ceWorld, new ChunkPos(chunkX, chunkZ))); + ImmutableBlockState immutableBlockState = BukkitBlockManager.instance().getImmutableBlockState(newStateId); + if (immutableBlockState == null) { + ceChunk.setBlockState(blockX, blockY, blockZ, EmptyBlock.STATE); + } else { + ceChunk.setBlockState(blockX, blockY, blockZ, immutableBlockState); + } + this.chunksToSave.add(ceChunk); + } catch (IOException e) { + CraftEngine.instance().logger().warn("Error when recording FastAsyncWorldEdit operation blocks", e); } - this.chunksToSave.add(ceChunk); } private void saveAllChunks() { @@ -176,7 +168,7 @@ public class FastAsyncWorldEditDelegate extends AbstractDelegateExtent { this.ceWorld.worldDataStorage().writeChunkAt(ceChunk.chunkPos(), ceChunk, true); } this.chunksToSave.clear(); - } catch (Exception e) { + } catch (IOException e) { CraftEngine.instance().logger().warn("Error when recording FastAsyncWorldEdit operation chunks", e); } } From 22d41bf78815e406edaef9119f9cea978dd7792f Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Tue, 6 May 2025 17:10:55 +0800 Subject: [PATCH 38/51] =?UTF-8?q?=E6=B7=BB=E5=8A=A0debug=E6=8C=87=E4=BB=A4?= =?UTF-8?q?=E6=A3=80=E6=B5=8B=E6=B3=A8=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../worldedit/FastAsyncWorldEditDelegate.java | 2 +- bukkit/loader/src/main/resources/commands.yml | 7 +++ .../src/main/resources/translations/en.yml | 2 + .../plugin/command/BukkitCommandManager.java | 1 + .../DebugIsSectionInjectedCommand.java | 50 +++++++++++++++++++ .../plugin/command/feature/ReloadCommand.java | 1 - .../plugin/injector/BukkitInjector.java | 9 +++- .../plugin/event/BlockEventConditions.java | 6 +-- gradle.properties | 2 +- .../craftengine/mod/CraftEnginePlugin.java | 1 + 10 files changed, 74 insertions(+), 7 deletions(-) create mode 100644 bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/DebugIsSectionInjectedCommand.java diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java index 79a7d027a..7f82fe30b 100644 --- a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java @@ -64,7 +64,7 @@ public class FastAsyncWorldEditDelegate extends AbstractDelegateExtent { @Subscribe @SuppressWarnings("unused") public void onEditSessionEvent(EditSessionEvent event) { - if (event.getStage() == EditSession.Stage.BEFORE_HISTORY || event.getStage() == EditSession.Stage.BEFORE_CHANGE) { + if (event.getStage() == EditSession.Stage.BEFORE_CHANGE) { event.setExtent(new FastAsyncWorldEditDelegate(event)); } } diff --git a/bukkit/loader/src/main/resources/commands.yml b/bukkit/loader/src/main/resources/commands.yml index be61cd3c6..fdf4e1613 100644 --- a/bukkit/loader/src/main/resources/commands.yml +++ b/bukkit/loader/src/main/resources/commands.yml @@ -168,6 +168,13 @@ debug_target_block: - /craftengine debug target-block - /ce debug target-block +debug_is_section_injected: + enable: true + permission: ce.command.debug.is_section_injected + usage: + - /craftengine debug is-section-injected + - /ce debug is-section-injected + debug_test: enable: true permission: ce.command.debug.test diff --git a/bukkit/loader/src/main/resources/translations/en.yml b/bukkit/loader/src/main/resources/translations/en.yml index 96cd97723..2d63d9711 100644 --- a/bukkit/loader/src/main/resources/translations/en.yml +++ b/bukkit/loader/src/main/resources/translations/en.yml @@ -222,6 +222,8 @@ warning.config.block.behavior.leaves.missing_distance: "Issue found in f warning.config.block.behavior.sapling.missing_stage: "Issue found in file - The block '' is missing the required 'stage' property for 'sapling_block' behavior." warning.config.block.behavior.sapling.missing_feature: "Issue found in file - The block '' is missing the required 'feature' argument for 'sapling_block' behavior." warning.config.block.behavior.strippable.missing_stripped: "Issue found in file - The block '' is missing the required 'stripped' argument for 'strippable_block' behavior." +warning.config.block.event.condition.missing_type: "Issue found in file - The block '' is missing the required 'type' argument for event condition." +warning.config.block.event.condition.invalid_type: "Issue found in file - The block '' is using an invalid 'type' argument for event condition." warning.config.model.generation.missing_parent: "Issue found in file - The config '' is missing the required 'parent' argument in 'generation' section." warning.config.model.generation.conflict: "Issue found in file - Failed to generate model for '' as two or more configurations attempt to generate different json models with the same path: ''." warning.config.model.generation.texture.invalid: "Issue found in file - The config '' has a texture '' with path '' that contains illegal characters. Please read https://minecraft.wiki/w/Resource_location#Legal_characters." diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/BukkitCommandManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/BukkitCommandManager.java index 0b5d4030e..c1f1c3f39 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/BukkitCommandManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/BukkitCommandManager.java @@ -46,6 +46,7 @@ public class BukkitCommandManager extends AbstractCommandManager new DebugSetBlockCommand(this, plugin), new DebugSpawnFurnitureCommand(this, plugin), new DebugTargetBlockCommand(this, plugin), + new DebugIsSectionInjectedCommand(this, plugin), new TotemAnimationCommand(this, plugin), new EnableResourceCommand(this, plugin), new DisableResourceCommand(this, plugin), diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/DebugIsSectionInjectedCommand.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/DebugIsSectionInjectedCommand.java new file mode 100644 index 000000000..b14e164e9 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/DebugIsSectionInjectedCommand.java @@ -0,0 +1,50 @@ +package net.momirealms.craftengine.bukkit.plugin.command.feature; + +import net.kyori.adventure.text.Component; +import net.momirealms.craftengine.bukkit.nms.FastNMS; +import net.momirealms.craftengine.bukkit.plugin.command.BukkitCommandFeature; +import net.momirealms.craftengine.bukkit.plugin.injector.BukkitInjector; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.plugin.command.CraftEngineCommandManager; +import net.momirealms.craftengine.core.plugin.command.sender.Sender; +import net.momirealms.craftengine.core.plugin.context.ContextHolder; +import net.momirealms.craftengine.core.plugin.context.PlayerOptionalContext; +import net.momirealms.craftengine.core.util.AdventureHelper; +import net.momirealms.craftengine.core.world.chunk.CESection; +import org.bukkit.Chunk; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.incendo.cloud.Command; +import org.incendo.cloud.parser.standard.StringParser; + +public class DebugIsSectionInjectedCommand extends BukkitCommandFeature { + + public DebugIsSectionInjectedCommand(CraftEngineCommandManager commandManager, CraftEngine plugin) { + super(commandManager, plugin); + } + + @Override + public Command.Builder assembleCommand(org.incendo.cloud.CommandManager manager, Command.Builder builder) { + return builder + .senderType(Player.class) + .handler(context -> { + Player player = context.sender(); + Chunk chunk = player.getChunk(); + Object worldServer = FastNMS.INSTANCE.field$CraftChunk$worldServer(chunk); + Object chunkSource = FastNMS.INSTANCE.method$ServerLevel$getChunkSource(worldServer); + Object levelChunk = FastNMS.INSTANCE.method$ServerChunkCache$getChunkAtIfLoadedMainThread(chunkSource, chunk.getX(), chunk.getZ()); + Object[] sections = FastNMS.INSTANCE.method$ChunkAccess$getSections(levelChunk); + int i = 0; + Sender sender = plugin().senderFactory().wrap(player); + for (Object section : sections) { + sender.sendMessage(Component.text("Section #" + i + ": " + BukkitInjector.isSectionInjected(section))); + i++; + } + }); + } + + @Override + public String getFeatureID() { + return "debug_is_section_injected"; + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/ReloadCommand.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/ReloadCommand.java index b1ee0e30d..db8d277a1 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/ReloadCommand.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/ReloadCommand.java @@ -4,7 +4,6 @@ import net.kyori.adventure.text.Component; import net.momirealms.craftengine.bukkit.plugin.command.BukkitCommandFeature; import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.plugin.command.CraftEngineCommandManager; -import net.momirealms.craftengine.core.plugin.locale.LocalizedException; import net.momirealms.craftengine.core.plugin.locale.MessageConstants; import org.bukkit.command.CommandSender; import org.incendo.cloud.Command; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/BukkitInjector.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/BukkitInjector.java index b68ef4a2d..79ddd56c3 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/BukkitInjector.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/BukkitInjector.java @@ -391,7 +391,7 @@ public class BukkitInjector { public synchronized static void injectLevelChunkSection(Object targetSection, CESection ceSection, CEWorld ceWorld, CEChunk chunk, SectionPos pos) { try { Object container = FastNMS.INSTANCE.field$LevelChunkSection$states(targetSection); - if (!clazz$InjectedPalettedContainer.isInstance(container)) { + if (!(container instanceof InjectedPalettedContainerHolder)) { InjectedPalettedContainerHolder injectedObject; if (Config.fastPaletteInjection()) { injectedObject = FastNMS.INSTANCE.createInjectedPalettedContainerHolder(container); @@ -411,6 +411,11 @@ public class BukkitInjector { } } + public static boolean isSectionInjected(Object section) { + Object container = FastNMS.INSTANCE.field$LevelChunkSection$states(section); + return container instanceof InjectedPalettedContainerHolder; + } + public synchronized static void uninjectLevelChunkSection(Object section) { try { Object states = FastNMS.INSTANCE.field$LevelChunkSection$states(section); @@ -707,6 +712,8 @@ public class BukkitInjector { ImmutableBlockState immutableBlockState = BukkitBlockManager.instance().getImmutableBlockStateUnsafe(stateId); ImmutableBlockState previousImmutableBlockState = section.setBlockState(x, y, z, immutableBlockState); // 如果之前的自定义块(空气)和当前自定义块不同 + System.out.println("1:" + immutableBlockState); + System.out.println("2:" + previousImmutableBlockState); if (previousImmutableBlockState != immutableBlockState) { holder.ceChunk().setDirty(true); if (Config.enableLightSystem() && !immutableBlockState.isEmpty()) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/event/BlockEventConditions.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/event/BlockEventConditions.java index b6883e577..5cb58ed8a 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/event/BlockEventConditions.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/event/BlockEventConditions.java @@ -14,18 +14,18 @@ import java.util.Map; public class BlockEventConditions { public static Condition fromMap(Map map) { - String type = ResourceConfigUtils.requireNonEmptyStringOrThrow(map.get("type"), "TODO I18N"); + String type = ResourceConfigUtils.requireNonEmptyStringOrThrow(map.get("type"), "warning.config.block.event.condition.missing_type"); Key key = Key.withDefaultNamespace(type, Key.DEFAULT_NAMESPACE); if (key.value().charAt(0) == '!') { Factory> factory = BuiltInRegistries.PLAYER_BLOCK_CONDITION_FACTORY.getValue(new Key(key.namespace(), key.value().substring(1))); if (factory == null) { - throw new LocalizedResourceConfigException("TODO I18N", type); + throw new LocalizedResourceConfigException("warning.config.block.event.condition.invalid_type", type); } return new InvertedCondition<>(factory.create(map)); } else { Factory> factory = BuiltInRegistries.PLAYER_BLOCK_CONDITION_FACTORY.getValue(key); if (factory == null) { - throw new LocalizedResourceConfigException("TODO I18N", type); + throw new LocalizedResourceConfigException("warning.config.block.event.condition.invalid_type", type); } return factory.create(map); } diff --git a/gradle.properties b/gradle.properties index 4c60323b6..749c4cce7 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,7 +2,7 @@ org.gradle.jvmargs=-Xmx1G # Project settings # Rule: [major update].[feature update].[bug fix] -project_version=0.0.53-beta.3 +project_version=0.0.53-beta.4 config_version=31 lang_version=12 project_group=net.momirealms diff --git a/server-mod/v1_21_5/src/main/java/net/momirealms/craftengine/mod/CraftEnginePlugin.java b/server-mod/v1_21_5/src/main/java/net/momirealms/craftengine/mod/CraftEnginePlugin.java index 6cb356a90..c0b7d7bf1 100644 --- a/server-mod/v1_21_5/src/main/java/net/momirealms/craftengine/mod/CraftEnginePlugin.java +++ b/server-mod/v1_21_5/src/main/java/net/momirealms/craftengine/mod/CraftEnginePlugin.java @@ -1,5 +1,6 @@ package net.momirealms.craftengine.mod; +import net.minecraft.world.level.chunk.LevelChunkSection; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.objectweb.asm.tree.ClassNode; From 93d09c73ee879b8db18ba13eee8adf96f31873c2 Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Tue, 6 May 2025 18:57:48 +0800 Subject: [PATCH 39/51] =?UTF-8?q?refactor(core):=20=E5=AE=8C=E5=85=A8?= =?UTF-8?q?=E5=85=BC=E5=AE=B9fawe?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../worldedit/FastAsyncWorldEditDelegate.java | 37 ++++++++++++++++++- .../plugin/injector/BukkitInjector.java | 2 - 2 files changed, 36 insertions(+), 3 deletions(-) diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java index 7f82fe30b..baf70618d 100644 --- a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java @@ -18,6 +18,8 @@ import com.sk89q.worldedit.world.World; import com.sk89q.worldedit.world.block.BaseBlock; import com.sk89q.worldedit.world.block.BlockStateHolder; import net.momirealms.craftengine.bukkit.block.BukkitBlockManager; +import net.momirealms.craftengine.bukkit.nms.FastNMS; +import net.momirealms.craftengine.bukkit.plugin.injector.BukkitInjector; import net.momirealms.craftengine.bukkit.util.BlockStateUtils; import net.momirealms.craftengine.core.block.EmptyBlock; import net.momirealms.craftengine.core.block.ImmutableBlockState; @@ -25,7 +27,9 @@ import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.util.ReflectionUtils; import net.momirealms.craftengine.core.world.CEWorld; import net.momirealms.craftengine.core.world.ChunkPos; +import net.momirealms.craftengine.core.world.SectionPos; import net.momirealms.craftengine.core.world.chunk.CEChunk; +import net.momirealms.craftengine.core.world.chunk.CESection; import org.bukkit.Bukkit; import java.io.IOException; @@ -40,6 +44,7 @@ public class FastAsyncWorldEditDelegate extends AbstractDelegateExtent { private final Set chunksToSave; private final CEWorld ceWorld; private static int[] ordinalToIbdID; + private static final Set chunksNeedInjection = new HashSet<>(); protected FastAsyncWorldEditDelegate(EditSessionEvent event) { super(event.getExtent()); @@ -58,7 +63,7 @@ public class FastAsyncWorldEditDelegate extends AbstractDelegateExtent { assert ordinalToIbdIDMethod != null; ordinalToIbdID = (int[]) ordinalToIbdIDMethod.invoke(adapter); } catch (ReflectiveOperationException e) { - throw new RuntimeException("Failed to init FAWE compatibility", e); + throw new RuntimeException("Failed to init FastAsyncWorldEdit compatibility", e); } WorldEdit.getInstance().getEventBus().register(new Object() { @Subscribe @@ -66,11 +71,40 @@ public class FastAsyncWorldEditDelegate extends AbstractDelegateExtent { public void onEditSessionEvent(EditSessionEvent event) { if (event.getStage() == EditSession.Stage.BEFORE_CHANGE) { event.setExtent(new FastAsyncWorldEditDelegate(event)); + } else if (event.getStage() == EditSession.Stage.BEFORE_HISTORY) { + event.setExtent(new AbstractDelegateExtent(event.getExtent()) { + @Override + public Operation commit() { + Set processedChunk = new HashSet<>(); + org.bukkit.World world = Bukkit.getWorld(requireNonNull(event.getWorld()).getName()); + CEWorld ceWorld = CraftEngine.instance().worldManager().getWorld(requireNonNull(world).getUID()); + chunksNeedInjection.forEach(ceChunk -> { + injectLevelChunk(requireNonNull(ceWorld), ceChunk); + processedChunk.add(ceChunk); + }); + processedChunk.forEach(chunksNeedInjection::remove); + return super.commit(); + } + }); } } }); } + private static void injectLevelChunk(CEWorld ceWorld, CEChunk ceChunk) { + ChunkPos pos = ceChunk.chunkPos(); + CESection[] ceSections = ceChunk.sections(); + Object worldServer = ceWorld.world().serverWorld(); + Object chunkSource = FastNMS.INSTANCE.method$ServerLevel$getChunkSource(worldServer); + Object levelChunk = FastNMS.INSTANCE.method$ServerChunkCache$getChunkAtIfLoadedMainThread(chunkSource, pos.x, pos.z); + Object[] sections = FastNMS.INSTANCE.method$ChunkAccess$getSections(levelChunk); + for (int i = 0; i < ceSections.length; i++) { + CESection ceSection = ceSections[i]; + Object section = sections[i]; + BukkitInjector.injectLevelChunkSection(section, ceSection, ceWorld, ceChunk, new SectionPos(pos.x, ceChunk.sectionY(i), pos.z)); + } + } + @Override public int setBlocks(final Set vset, final Pattern pattern) { this.processBlocks(vset, pattern); @@ -165,6 +199,7 @@ public class FastAsyncWorldEditDelegate extends AbstractDelegateExtent { try { for (CEChunk ceChunk : this.chunksToSave) { CraftEngine.instance().debug(() -> "Saving chunk " + ceChunk.chunkPos()); + chunksNeedInjection.add(ceChunk); this.ceWorld.worldDataStorage().writeChunkAt(ceChunk.chunkPos(), ceChunk, true); } this.chunksToSave.clear(); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/BukkitInjector.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/BukkitInjector.java index 79ddd56c3..9035d930c 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/BukkitInjector.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/BukkitInjector.java @@ -712,8 +712,6 @@ public class BukkitInjector { ImmutableBlockState immutableBlockState = BukkitBlockManager.instance().getImmutableBlockStateUnsafe(stateId); ImmutableBlockState previousImmutableBlockState = section.setBlockState(x, y, z, immutableBlockState); // 如果之前的自定义块(空气)和当前自定义块不同 - System.out.println("1:" + immutableBlockState); - System.out.println("2:" + previousImmutableBlockState); if (previousImmutableBlockState != immutableBlockState) { holder.ceChunk().setDirty(true); if (Config.enableLightSystem() && !immutableBlockState.isEmpty()) { From a7a706b680b3d4e5e8a42a062a76909bb14301aa Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Tue, 6 May 2025 19:10:22 +0800 Subject: [PATCH 40/51] =?UTF-8?q?fix(core):=20=E9=A2=84=E9=98=B2NPE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../compatibility/worldedit/FastAsyncWorldEditDelegate.java | 1 + 1 file changed, 1 insertion(+) diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java index baf70618d..2c56099ec 100644 --- a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java @@ -69,6 +69,7 @@ public class FastAsyncWorldEditDelegate extends AbstractDelegateExtent { @Subscribe @SuppressWarnings("unused") public void onEditSessionEvent(EditSessionEvent event) { + if (event.getWorld() == null) return; if (event.getStage() == EditSession.Stage.BEFORE_CHANGE) { event.setExtent(new FastAsyncWorldEditDelegate(event)); } else if (event.getStage() == EditSession.Stage.BEFORE_HISTORY) { From b01d564e4fc35a68b6f6312d892d711945d6b5d4 Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Tue, 6 May 2025 20:04:22 +0800 Subject: [PATCH 41/51] =?UTF-8?q?=E5=85=88=E6=94=B9=E4=BA=86=E4=B8=80?= =?UTF-8?q?=E5=8D=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../worldedit/FastAsyncWorldEditDelegate.java | 42 ++++++++----------- .../plugin/injector/BukkitInjector.java | 6 +-- .../bukkit/world/BukkitWorldManager.java | 2 +- .../core/plugin/command/FlagKeys.java | 6 ++- .../craftengine/core/world/ChunkPos.java | 4 ++ 5 files changed, 29 insertions(+), 31 deletions(-) diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java index 2c56099ec..e2523d3f1 100644 --- a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java @@ -25,6 +25,7 @@ import net.momirealms.craftengine.core.block.EmptyBlock; import net.momirealms.craftengine.core.block.ImmutableBlockState; import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.util.ReflectionUtils; +import net.momirealms.craftengine.core.util.VersionHelper; import net.momirealms.craftengine.core.world.CEWorld; import net.momirealms.craftengine.core.world.ChunkPos; import net.momirealms.craftengine.core.world.SectionPos; @@ -34,9 +35,7 @@ import org.bukkit.Bukkit; import java.io.IOException; import java.lang.reflect.Method; -import java.util.HashSet; -import java.util.Optional; -import java.util.Set; +import java.util.*; import static java.util.Objects.requireNonNull; @@ -44,7 +43,7 @@ public class FastAsyncWorldEditDelegate extends AbstractDelegateExtent { private final Set chunksToSave; private final CEWorld ceWorld; private static int[] ordinalToIbdID; - private static final Set chunksNeedInjection = new HashSet<>(); + private static final Set BROKEN_CHUNKS = Collections.synchronizedSet(new HashSet<>()); protected FastAsyncWorldEditDelegate(EditSessionEvent event) { super(event.getExtent()); @@ -69,40 +68,26 @@ public class FastAsyncWorldEditDelegate extends AbstractDelegateExtent { @Subscribe @SuppressWarnings("unused") public void onEditSessionEvent(EditSessionEvent event) { - if (event.getWorld() == null) return; + World weWorld = event.getWorld(); + if (weWorld == null) return; if (event.getStage() == EditSession.Stage.BEFORE_CHANGE) { event.setExtent(new FastAsyncWorldEditDelegate(event)); - } else if (event.getStage() == EditSession.Stage.BEFORE_HISTORY) { - event.setExtent(new AbstractDelegateExtent(event.getExtent()) { - @Override - public Operation commit() { - Set processedChunk = new HashSet<>(); - org.bukkit.World world = Bukkit.getWorld(requireNonNull(event.getWorld()).getName()); - CEWorld ceWorld = CraftEngine.instance().worldManager().getWorld(requireNonNull(world).getUID()); - chunksNeedInjection.forEach(ceChunk -> { - injectLevelChunk(requireNonNull(ceWorld), ceChunk); - processedChunk.add(ceChunk); - }); - processedChunk.forEach(chunksNeedInjection::remove); - return super.commit(); - } - }); } } }); } - private static void injectLevelChunk(CEWorld ceWorld, CEChunk ceChunk) { + private static void injectLevelChunk(CEChunk ceChunk) { ChunkPos pos = ceChunk.chunkPos(); CESection[] ceSections = ceChunk.sections(); - Object worldServer = ceWorld.world().serverWorld(); + Object worldServer = ceChunk.world().world().serverWorld(); Object chunkSource = FastNMS.INSTANCE.method$ServerLevel$getChunkSource(worldServer); Object levelChunk = FastNMS.INSTANCE.method$ServerChunkCache$getChunkAtIfLoadedMainThread(chunkSource, pos.x, pos.z); Object[] sections = FastNMS.INSTANCE.method$ChunkAccess$getSections(levelChunk); for (int i = 0; i < ceSections.length; i++) { CESection ceSection = ceSections[i]; Object section = sections[i]; - BukkitInjector.injectLevelChunkSection(section, ceSection, ceWorld, ceChunk, new SectionPos(pos.x, ceChunk.sectionY(i), pos.z)); + BukkitInjector.injectLevelChunkSection(section, ceSection, ceChunk, new SectionPos(pos.x, ceChunk.sectionY(i), pos.z)); } } @@ -158,7 +143,14 @@ public class FastAsyncWorldEditDelegate extends AbstractDelegateExtent { @Override protected Operation commitBefore() { - saveAllChunks(); + List chunks = new ArrayList<>(BROKEN_CHUNKS); + BROKEN_CHUNKS.clear(); + for (ChunkPos chunk : chunks) { + CEChunk loaded = this.ceWorld.getChunkAtIfLoaded(chunk.longKey()); + // only inject loaded chunks + if (loaded == null) continue; + injectLevelChunk(loaded); + } return super.commitBefore(); } @@ -179,6 +171,7 @@ public class FastAsyncWorldEditDelegate extends AbstractDelegateExtent { int chunkZ = blockZ >> 4; int newStateId = ordinalToIbdID[newBlock.getOrdinal()]; int oldStateId = ordinalToIbdID[oldBlock.getOrdinal()]; + BROKEN_CHUNKS.add(ChunkPos.of(chunkX, chunkZ)); //CraftEngine.instance().debug(() -> "Processing block at " + blockX + ", " + blockY + ", " + blockZ + ": " + oldStateId + " -> " + newStateId); if (BlockStateUtils.isVanillaBlock(newStateId) && BlockStateUtils.isVanillaBlock(oldStateId)) return; try { @@ -200,7 +193,6 @@ public class FastAsyncWorldEditDelegate extends AbstractDelegateExtent { try { for (CEChunk ceChunk : this.chunksToSave) { CraftEngine.instance().debug(() -> "Saving chunk " + ceChunk.chunkPos()); - chunksNeedInjection.add(ceChunk); this.ceWorld.worldDataStorage().writeChunkAt(ceChunk.chunkPos(), ceChunk, true); } this.chunksToSave.clear(); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/BukkitInjector.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/BukkitInjector.java index 9035d930c..501519f00 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/BukkitInjector.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/BukkitInjector.java @@ -388,7 +388,7 @@ public class BukkitInjector { // } // } - public synchronized static void injectLevelChunkSection(Object targetSection, CESection ceSection, CEWorld ceWorld, CEChunk chunk, SectionPos pos) { + public synchronized static void injectLevelChunkSection(Object targetSection, CESection ceSection, CEChunk chunk, SectionPos pos) { try { Object container = FastNMS.INSTANCE.field$LevelChunkSection$states(targetSection); if (!(container instanceof InjectedPalettedContainerHolder)) { @@ -399,7 +399,7 @@ public class BukkitInjector { injectedObject = (InjectedPalettedContainerHolder) Reflections.UNSAFE.allocateInstance(clazz$InjectedPalettedContainer); varHandle$InjectedPalettedContainer$target.set(injectedObject, container); } - injectedObject.ceWorld(ceWorld); + injectedObject.ceWorld(chunk.world()); injectedObject.ceChunk(chunk); injectedObject.ceSection(ceSection); injectedObject.cePos(pos); @@ -422,7 +422,7 @@ public class BukkitInjector { if (states instanceof InjectedPalettedContainerHolder holder) { Reflections.field$LevelChunkSection$states.set(section, holder.target()); } - } catch (Exception e) { + } catch (ReflectiveOperationException e) { CraftEngine.instance().logger().severe("Failed to inject chunk section", e); } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitWorldManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitWorldManager.java index c644076c8..e6bd597df 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitWorldManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitWorldManager.java @@ -383,7 +383,7 @@ public class BukkitWorldManager implements WorldManager, Listener { } } } - BukkitInjector.injectLevelChunkSection(section, ceSection, ceWorld, ceChunk, new SectionPos(pos.x, ceChunk.sectionY(i), pos.z)); + BukkitInjector.injectLevelChunkSection(section, ceSection, ceChunk, new SectionPos(pos.x, ceChunk.sectionY(i), pos.z)); } if (Config.enableRecipeSystem()) { @SuppressWarnings("unchecked") diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/command/FlagKeys.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/command/FlagKeys.java index 5cde8bd5c..a53e05dfa 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/command/FlagKeys.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/command/FlagKeys.java @@ -3,8 +3,10 @@ package net.momirealms.craftengine.core.plugin.command; import org.incendo.cloud.parser.flag.CommandFlag; public final class FlagKeys { + private FlagKeys() {} + public static final String SILENT = "silent"; - public static final CommandFlag SILENT_FLAG = CommandFlag.builder("silent").withAliases("s").build(); + public static final CommandFlag SILENT_FLAG = CommandFlag.builder(SILENT).withAliases("s").build(); public static final String TO_INVENTORY = "to-inventory"; - public static final CommandFlag TO_INVENTORY_FLAG = CommandFlag.builder("to-inventory").build(); + public static final CommandFlag TO_INVENTORY_FLAG = CommandFlag.builder(TO_INVENTORY).build(); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/ChunkPos.java b/core/src/main/java/net/momirealms/craftengine/core/world/ChunkPos.java index d64ff68c0..6962e334b 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/world/ChunkPos.java +++ b/core/src/main/java/net/momirealms/craftengine/core/world/ChunkPos.java @@ -12,6 +12,10 @@ public class ChunkPos { this.longKey = asLong(this.x, this.z); } + public static ChunkPos of(final int x, final int z) { + return new ChunkPos(x, z); + } + public ChunkPos(BlockPos pos) { this.x = SectionPos.blockToSectionCoord(pos.x()); this.z = SectionPos.blockToSectionCoord(pos.z()); From daf2ac3e8a13b4870ff3134df9ecdc3cb351bab5 Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Wed, 7 May 2025 01:54:51 +0800 Subject: [PATCH 42/51] =?UTF-8?q?=E6=8F=90=E9=AB=98=E5=BB=B6=E8=BF=9F?= =?UTF-8?q?=E5=8C=BA=E5=9F=9F=E5=AD=98=E5=82=A8=E7=9A=84=E7=A8=B3=E5=AE=9A?= =?UTF-8?q?=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../worldedit/FastAsyncWorldEditDelegate.java | 4 ++-- .../bukkit/item/behavior/FurnitureItemBehavior.java | 4 ---- .../core/plugin/scheduler/AbstractJavaScheduler.java | 1 - .../chunk/storage/DelayedDefaultRegionFileStorage.java | 8 +++++++- .../craftengine/core/world/chunk/storage/RegionFile.java | 7 +++++++ 5 files changed, 16 insertions(+), 8 deletions(-) diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java index e2523d3f1..e464eb263 100644 --- a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java @@ -25,7 +25,6 @@ import net.momirealms.craftengine.core.block.EmptyBlock; import net.momirealms.craftengine.core.block.ImmutableBlockState; import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.util.ReflectionUtils; -import net.momirealms.craftengine.core.util.VersionHelper; import net.momirealms.craftengine.core.world.CEWorld; import net.momirealms.craftengine.core.world.ChunkPos; import net.momirealms.craftengine.core.world.SectionPos; @@ -82,6 +81,7 @@ public class FastAsyncWorldEditDelegate extends AbstractDelegateExtent { CESection[] ceSections = ceChunk.sections(); Object worldServer = ceChunk.world().world().serverWorld(); Object chunkSource = FastNMS.INSTANCE.method$ServerLevel$getChunkSource(worldServer); + // TODO THREAD SAFETY? Object levelChunk = FastNMS.INSTANCE.method$ServerChunkCache$getChunkAtIfLoadedMainThread(chunkSource, pos.x, pos.z); Object[] sections = FastNMS.INSTANCE.method$ChunkAccess$getSections(levelChunk); for (int i = 0; i < ceSections.length; i++) { @@ -143,6 +143,7 @@ public class FastAsyncWorldEditDelegate extends AbstractDelegateExtent { @Override protected Operation commitBefore() { + saveAllChunks(); List chunks = new ArrayList<>(BROKEN_CHUNKS); BROKEN_CHUNKS.clear(); for (ChunkPos chunk : chunks) { @@ -163,7 +164,6 @@ public class FastAsyncWorldEditDelegate extends AbstractDelegateExtent { int blockZ = position.z(); this.processBlock(blockX, blockY, blockZ, blockState, oldBlockState); } - saveAllChunks(); } private void processBlock(int blockX, int blockY, int blockZ, BaseBlock newBlock, BaseBlock oldBlock) { diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/FurnitureItemBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/FurnitureItemBehavior.java index f61092a23..ff062ebec 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/FurnitureItemBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/FurnitureItemBehavior.java @@ -120,10 +120,6 @@ public class FurnitureItemBehavior extends ItemBehavior { return InteractionResult.FAIL; } - if (!BukkitCraftEngine.instance().antiGrief().canPlace(bukkitPlayer, furnitureLocation)) { - return InteractionResult.FAIL; - } - FurnitureAttemptPlaceEvent attemptPlaceEvent = new FurnitureAttemptPlaceEvent(bukkitPlayer, customFurniture, anchorType, furnitureLocation.clone(), DirectionUtils.toBlockFace(clickedFace), context.getHand(), world.getBlockAt(context.getClickedPos().x(), context.getClickedPos().y(), context.getClickedPos().z())); if (EventUtils.fireAndCheckCancel(attemptPlaceEvent)) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/scheduler/AbstractJavaScheduler.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/scheduler/AbstractJavaScheduler.java index 1198fa6ea..c728459ac 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/scheduler/AbstractJavaScheduler.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/scheduler/AbstractJavaScheduler.java @@ -19,7 +19,6 @@ public abstract class AbstractJavaScheduler implements SchedulerAdapter { public AbstractJavaScheduler(Plugin plugin) { this.plugin = plugin; - this.scheduler = new ScheduledThreadPoolExecutor(4, r -> { Thread thread = Executors.defaultThreadFactory().newThread(r); thread.setName("craft-engine-scheduler"); diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/DelayedDefaultRegionFileStorage.java b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/DelayedDefaultRegionFileStorage.java index 1df369736..f711fbbb3 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/DelayedDefaultRegionFileStorage.java +++ b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/DelayedDefaultRegionFileStorage.java @@ -10,6 +10,7 @@ import net.momirealms.craftengine.core.world.chunk.CEChunk; import org.jetbrains.annotations.NotNull; import java.io.IOException; +import java.nio.channels.ClosedChannelException; import java.nio.file.Path; import java.util.concurrent.TimeUnit; @@ -28,6 +29,11 @@ public class DelayedDefaultRegionFileStorage extends DefaultRegionFileStorage { if (cause == RemovalCause.EXPIRED || cause == RemovalCause.SIZE) { try { super.writeChunkAt(key, value, true); + } catch (ClosedChannelException e) { + if (this.isClosed) { + return; + } + CraftEngine.instance().logger().warn("Failed to write chunk at " + key, e); } catch (IOException e) { CraftEngine.instance().logger().warn("Failed to write chunk at " + key, e); } @@ -60,9 +66,9 @@ public class DelayedDefaultRegionFileStorage extends DefaultRegionFileStorage { @Override public synchronized void close() throws IOException { + this.isClosed = true; this.saveCache(); this.chunkCache.cleanUp(); - this.isClosed = true; super.close(); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/RegionFile.java b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/RegionFile.java index b2e8ad51b..b50452bae 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/RegionFile.java +++ b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/RegionFile.java @@ -11,6 +11,7 @@ import java.io.*; import java.nio.Buffer; import java.nio.ByteBuffer; import java.nio.IntBuffer; +import java.nio.channels.ClosedChannelException; import java.nio.channels.FileChannel; import java.nio.file.Files; import java.nio.file.Path; @@ -308,6 +309,9 @@ public class RegionFile implements AutoCloseable { } public void clear(ChunkPos pos) throws IOException { + if (!this.fileChannel.isOpen()) { + throw new ClosedChannelException(); + } int chunkLocation = RegionFile.getChunkLocation(pos); int sectorInfo = this.sectorInfo.get(chunkLocation); if (sectorInfo != INFO_NOT_PRESENT) { @@ -321,6 +325,9 @@ public class RegionFile implements AutoCloseable { @SuppressWarnings("ResultOfMethodCallIgnored") protected synchronized void write(ChunkPos pos, ByteBuffer buf) throws IOException { + if (!this.fileChannel.isOpen()) { + throw new ClosedChannelException(); + } // get old offset info int offsetIndex = RegionFile.getChunkLocation(pos); int previousSectorInfo = this.sectorInfo.get(offsetIndex); From 7c0d056637abcd7758ecb07ff759e24cdd85478c Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Wed, 7 May 2025 02:02:26 +0800 Subject: [PATCH 43/51] =?UTF-8?q?=E4=BD=BF=E7=94=A8=E7=BA=BF=E7=A8=8B?= =?UTF-8?q?=E5=AE=89=E5=85=A8=E7=9A=84=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../worldedit/FastAsyncWorldEditDelegate.java | 25 ++++++++++--------- gradle.properties | 2 +- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java index e464eb263..901a741ae 100644 --- a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java @@ -76,18 +76,17 @@ public class FastAsyncWorldEditDelegate extends AbstractDelegateExtent { }); } - private static void injectLevelChunk(CEChunk ceChunk) { + private static void injectLevelChunk(Object chunkSource, CEChunk ceChunk) { ChunkPos pos = ceChunk.chunkPos(); - CESection[] ceSections = ceChunk.sections(); - Object worldServer = ceChunk.world().world().serverWorld(); - Object chunkSource = FastNMS.INSTANCE.method$ServerLevel$getChunkSource(worldServer); - // TODO THREAD SAFETY? - Object levelChunk = FastNMS.INSTANCE.method$ServerChunkCache$getChunkAtIfLoadedMainThread(chunkSource, pos.x, pos.z); - Object[] sections = FastNMS.INSTANCE.method$ChunkAccess$getSections(levelChunk); - for (int i = 0; i < ceSections.length; i++) { - CESection ceSection = ceSections[i]; - Object section = sections[i]; - BukkitInjector.injectLevelChunkSection(section, ceSection, ceChunk, new SectionPos(pos.x, ceChunk.sectionY(i), pos.z)); + Object levelChunk = FastNMS.INSTANCE.method$ServerChunkCache$getChunk(chunkSource, pos.x, pos.z, false); + if (levelChunk != null) { + Object[] sections = FastNMS.INSTANCE.method$ChunkAccess$getSections(levelChunk); + CESection[] ceSections = ceChunk.sections(); + for (int i = 0; i < ceSections.length; i++) { + CESection ceSection = ceSections[i]; + Object section = sections[i]; + BukkitInjector.injectLevelChunkSection(section, ceSection, ceChunk, new SectionPos(pos.x, ceChunk.sectionY(i), pos.z)); + } } } @@ -146,11 +145,13 @@ public class FastAsyncWorldEditDelegate extends AbstractDelegateExtent { saveAllChunks(); List chunks = new ArrayList<>(BROKEN_CHUNKS); BROKEN_CHUNKS.clear(); + Object worldServer = this.ceWorld.world().serverWorld(); + Object chunkSource = FastNMS.INSTANCE.method$ServerLevel$getChunkSource(worldServer); for (ChunkPos chunk : chunks) { CEChunk loaded = this.ceWorld.getChunkAtIfLoaded(chunk.longKey()); // only inject loaded chunks if (loaded == null) continue; - injectLevelChunk(loaded); + injectLevelChunk(chunkSource, loaded); } return super.commitBefore(); } diff --git a/gradle.properties b/gradle.properties index 749c4cce7..980c2704a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -50,7 +50,7 @@ byte_buddy_version=1.17.5 ahocorasick_version=0.6.3 snake_yaml_version=2.4 anti_grief_version=0.15 -nms_helper_version=0.64.5 +nms_helper_version=0.64.6 evalex_version=3.5.0 reactive_streams_version=1.0.4 amazon_awssdk_version=2.31.23 From af084ad46cc7cce0cad66928c78ce2328051b38b Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Wed, 7 May 2025 04:51:47 +0800 Subject: [PATCH 44/51] =?UTF-8?q?=E5=B0=9D=E8=AF=95=E6=B7=BB=E5=8A=A0secti?= =?UTF-8?q?on=E6=B3=A8=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../worldedit/FastAsyncWorldEditDelegate.java | 14 +- bukkit/loader/src/main/resources/config.yml | 11 +- .../plugin/injector/BukkitInjector.java | 193 ++++++++++++------ .../craftengine/bukkit/util/Reflections.java | 1 - .../bukkit/world/BukkitWorldManager.java | 10 +- .../core/plugin/config/Config.java | 20 +- .../core/world/InjectionTarget.java | 6 + ...ntainerHolder.java => InjectedHolder.java} | 17 +- gradle.properties | 6 +- 9 files changed, 184 insertions(+), 94 deletions(-) create mode 100644 core/src/main/java/net/momirealms/craftengine/core/world/InjectionTarget.java rename core/src/main/java/net/momirealms/craftengine/core/world/chunk/{InjectedPalettedContainerHolder.java => InjectedHolder.java} (62%) diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java index 901a741ae..9127b6c7b 100644 --- a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java @@ -39,10 +39,10 @@ import java.util.*; import static java.util.Objects.requireNonNull; public class FastAsyncWorldEditDelegate extends AbstractDelegateExtent { + private static int[] ordinalToIbdID; private final Set chunksToSave; private final CEWorld ceWorld; - private static int[] ordinalToIbdID; - private static final Set BROKEN_CHUNKS = Collections.synchronizedSet(new HashSet<>()); + private final Set brokenChunks = Collections.synchronizedSet(new HashSet<>()); protected FastAsyncWorldEditDelegate(EditSessionEvent event) { super(event.getExtent()); @@ -85,7 +85,9 @@ public class FastAsyncWorldEditDelegate extends AbstractDelegateExtent { for (int i = 0; i < ceSections.length; i++) { CESection ceSection = ceSections[i]; Object section = sections[i]; - BukkitInjector.injectLevelChunkSection(section, ceSection, ceChunk, new SectionPos(pos.x, ceChunk.sectionY(i), pos.z)); + int finalI = i; + BukkitInjector.injectLevelChunkSection(section, ceSection, ceChunk, new SectionPos(pos.x, ceChunk.sectionY(i), pos.z), + (injected) -> sections[finalI] = injected); } } } @@ -143,8 +145,8 @@ public class FastAsyncWorldEditDelegate extends AbstractDelegateExtent { @Override protected Operation commitBefore() { saveAllChunks(); - List chunks = new ArrayList<>(BROKEN_CHUNKS); - BROKEN_CHUNKS.clear(); + List chunks = new ArrayList<>(this.brokenChunks); + this.brokenChunks.clear(); Object worldServer = this.ceWorld.world().serverWorld(); Object chunkSource = FastNMS.INSTANCE.method$ServerLevel$getChunkSource(worldServer); for (ChunkPos chunk : chunks) { @@ -172,7 +174,7 @@ public class FastAsyncWorldEditDelegate extends AbstractDelegateExtent { int chunkZ = blockZ >> 4; int newStateId = ordinalToIbdID[newBlock.getOrdinal()]; int oldStateId = ordinalToIbdID[oldBlock.getOrdinal()]; - BROKEN_CHUNKS.add(ChunkPos.of(chunkX, chunkZ)); + this.brokenChunks.add(ChunkPos.of(chunkX, chunkZ)); //CraftEngine.instance().debug(() -> "Processing block at " + blockX + ", " + blockY + ", " + blockZ + ": " + oldStateId + " -> " + newStateId); if (BlockStateUtils.isVanillaBlock(newStateId) && BlockStateUtils.isVanillaBlock(oldStateId)) return; try { diff --git a/bukkit/loader/src/main/resources/config.yml b/bukkit/loader/src/main/resources/config.yml index c4d0b734f..b25083cec 100644 --- a/bukkit/loader/src/main/resources/config.yml +++ b/bukkit/loader/src/main/resources/config.yml @@ -353,8 +353,15 @@ chunk-system: # 4 = LZ4 | Blazing-Fast Blazing-Fast Low Low | # 5 = ZSTD | Medium-Fast Fast High Medium | compression-method: 4 - # This might not work for some server forks that modify how Minecraft saves chunks. - fast-palette-injection: false + # Settings for injection + injection: + # Requires a restart to apply + # SECTION: Inject the LevelChunkSection (Faster, but may conflict with some plugins) + # PALETTE: Inject the PalettedContainer + target: PALETTE + # Enables faster injection method + # Note: May not work with certain server forks that alter chunk saving behavior + use-fast-method: false # Auto-convert custom blocks -> vanilla blocks when unloading chunks # # - When ENABLED (true): diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/BukkitInjector.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/BukkitInjector.java index 501519f00..0bb780dd4 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/BukkitInjector.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/BukkitInjector.java @@ -51,7 +51,7 @@ import net.momirealms.craftengine.core.world.CEWorld; import net.momirealms.craftengine.core.world.SectionPos; import net.momirealms.craftengine.core.world.chunk.CEChunk; import net.momirealms.craftengine.core.world.chunk.CESection; -import net.momirealms.craftengine.core.world.chunk.InjectedPalettedContainerHolder; +import net.momirealms.craftengine.core.world.chunk.InjectedHolder; import net.momirealms.craftengine.shared.ObjectHolder; import net.momirealms.craftengine.shared.block.*; import org.bukkit.inventory.ItemStack; @@ -69,12 +69,14 @@ import java.util.Objects; import java.util.Optional; import java.util.Set; import java.util.concurrent.Callable; +import java.util.function.Consumer; public class BukkitInjector { private static final ByteBuddy byteBuddy = new ByteBuddy(ClassFileVersion.JAVA_V17); private static final BukkitBlockShape STONE_SHAPE = new BukkitBlockShape(Reflections.instance$Blocks$STONE$defaultState); private static Class clazz$InjectedPalettedContainer; + private static Class clazz$InjectedLevelChunkSection; private static VarHandle varHandle$InjectedPalettedContainer$target; @@ -100,17 +102,14 @@ public class BukkitInjector { clazz$InjectedPalettedContainer = byteBuddy .subclass(Reflections.clazz$PalettedContainer) .name("net.minecraft.world.level.chunk.InjectedPalettedContainer") - .implement(InjectedPalettedContainerHolder.class) - .defineField("target", Reflections.clazz$PalettedContainer, Visibility.PRIVATE) - .defineField("ceworld", CEWorld.class, Visibility.PRIVATE) + .implement(InjectedHolder.Palette.class) + .defineField("target", Reflections.clazz$PalettedContainer, Visibility.PUBLIC) .defineField("cesection", CESection.class, Visibility.PRIVATE) .defineField("cechunk", CEChunk.class, Visibility.PRIVATE) .defineField("cepos", SectionPos.class, Visibility.PRIVATE) .method(ElementMatchers.any() .and(ElementMatchers.not(ElementMatchers.is(Reflections.method$PalettedContainer$getAndSet))) .and(ElementMatchers.not(ElementMatchers.isDeclaredBy(Object.class))) - // TODO Requires Paper Patch - //.and(ElementMatchers.not(ElementMatchers.named("get").and(ElementMatchers.takesArguments(int.class)).and(ElementMatchers.returns(Object.class)))) ) .intercept(MethodDelegation.toField("target")) .method(ElementMatchers.is(Reflections.method$PalettedContainer$getAndSet)) @@ -121,16 +120,33 @@ public class BukkitInjector { .intercept(FieldAccessor.ofField("cesection")) .method(ElementMatchers.named("ceChunk")) .intercept(FieldAccessor.ofField("cechunk")) - .method(ElementMatchers.named("ceWorld")) - .intercept(FieldAccessor.ofField("ceworld")) .method(ElementMatchers.named("cePos")) .intercept(FieldAccessor.ofField("cepos")) .make() .load(BukkitInjector.class.getClassLoader()) .getLoaded(); - varHandle$InjectedPalettedContainer$target = Objects.requireNonNull(ReflectionUtils.findVarHandle(clazz$InjectedPalettedContainer, "target", Reflections.clazz$PalettedContainer)); + // Level Chunk Section + clazz$InjectedLevelChunkSection = byteBuddy + .subclass(Reflections.clazz$LevelChunkSection) + .name("net.minecraft.world.level.chunk.InjectedLevelChunkSection") + .implement(InjectedHolder.Section.class) + .defineField("cesection", CESection.class, Visibility.PRIVATE) + .defineField("cechunk", CEChunk.class, Visibility.PRIVATE) + .defineField("cepos", SectionPos.class, Visibility.PRIVATE) + .method(ElementMatchers.is(Reflections.method$LevelChunkSection$setBlockState)) + .intercept(MethodDelegation.to(SetBlockStateInterceptor.INSTANCE)) + .method(ElementMatchers.named("ceSection")) + .intercept(FieldAccessor.ofField("cesection")) + .method(ElementMatchers.named("ceChunk")) + .intercept(FieldAccessor.ofField("cechunk")) + .method(ElementMatchers.named("cePos")) + .intercept(FieldAccessor.ofField("cepos")) + .make() + .load(BukkitInjector.class.getClassLoader()) + .getLoaded(); + // State Predicate DynamicType.Unloaded alwaysTrue = byteBuddy .subclass(Reflections.clazz$StatePredicate) @@ -388,23 +404,33 @@ public class BukkitInjector { // } // } - public synchronized static void injectLevelChunkSection(Object targetSection, CESection ceSection, CEChunk chunk, SectionPos pos) { + public synchronized static void injectLevelChunkSection(Object targetSection, CESection ceSection, CEChunk chunk, SectionPos pos, Consumer callback) { try { - Object container = FastNMS.INSTANCE.field$LevelChunkSection$states(targetSection); - if (!(container instanceof InjectedPalettedContainerHolder)) { - InjectedPalettedContainerHolder injectedObject; - if (Config.fastPaletteInjection()) { - injectedObject = FastNMS.INSTANCE.createInjectedPalettedContainerHolder(container); - } else { - injectedObject = (InjectedPalettedContainerHolder) Reflections.UNSAFE.allocateInstance(clazz$InjectedPalettedContainer); - varHandle$InjectedPalettedContainer$target.set(injectedObject, container); + if (Config.injectionTarget()) { + Object container = FastNMS.INSTANCE.field$LevelChunkSection$states(targetSection); + if (!(container instanceof InjectedHolder.Palette)) { + InjectedHolder.Palette injectedObject; + if (Config.fastInjection()) { + injectedObject = FastNMS.INSTANCE.createInjectedPalettedContainerHolder(container); + } else { + injectedObject = (InjectedHolder.Palette) Reflections.UNSAFE.allocateInstance(clazz$InjectedPalettedContainer); + varHandle$InjectedPalettedContainer$target.set(injectedObject, container); + } + injectedObject.ceChunk(chunk); + injectedObject.ceSection(ceSection); + injectedObject.cePos(pos); + Reflections.varHandle$PalettedContainer$data.setVolatile(injectedObject, Reflections.varHandle$PalettedContainer$data.get(container)); + Reflections.field$LevelChunkSection$states.set(targetSection, injectedObject); + } + } else { + InjectedHolder.Section injectedObject; + if (true) { + injectedObject = FastNMS.INSTANCE.createInjectedLevelChunkSectionHolder(targetSection); } - injectedObject.ceWorld(chunk.world()); injectedObject.ceChunk(chunk); injectedObject.ceSection(ceSection); injectedObject.cePos(pos); - Reflections.varHandle$PalettedContainer$data.setVolatile(injectedObject, Reflections.varHandle$PalettedContainer$data.get(container)); - Reflections.field$LevelChunkSection$states.set(targetSection, injectedObject); + callback.accept(injectedObject); } } catch (Exception e) { CraftEngine.instance().logger().severe("Failed to inject chunk section", e); @@ -412,19 +438,30 @@ public class BukkitInjector { } public static boolean isSectionInjected(Object section) { - Object container = FastNMS.INSTANCE.field$LevelChunkSection$states(section); - return container instanceof InjectedPalettedContainerHolder; + if (Config.injectionTarget()) { + Object container = FastNMS.INSTANCE.field$LevelChunkSection$states(section); + return container instanceof InjectedHolder.Palette; + } else { + return section instanceof InjectedHolder.Section; + } } - public synchronized static void uninjectLevelChunkSection(Object section) { - try { + public synchronized static Object uninjectLevelChunkSection(Object section) { + if (Config.injectionTarget()) { Object states = FastNMS.INSTANCE.field$LevelChunkSection$states(section); - if (states instanceof InjectedPalettedContainerHolder holder) { - Reflections.field$LevelChunkSection$states.set(section, holder.target()); + if (states instanceof InjectedHolder.Palette holder) { + try { + Reflections.field$LevelChunkSection$states.set(section, holder.target()); + } catch (ReflectiveOperationException e) { + CraftEngine.instance().logger().severe("Failed to uninject palette", e); + } + } + } else { + if (section instanceof InjectedHolder.Section holder) { + return FastNMS.INSTANCE.constructor$LevelChunkSection(holder); } - } catch (ReflectiveOperationException e) { - CraftEngine.instance().logger().severe("Failed to inject chunk section", e); } + return section; } public static class GetRecipeForMethodInterceptor1_20 { @@ -682,58 +719,78 @@ public class BukkitInjector { } } + public static class SetBlockStateInterceptor { + public static final SetBlockStateInterceptor INSTANCE = new SetBlockStateInterceptor(); + + @RuntimeType + public Object intercept(@This Object thisObj, @AllArguments Object[] args, @SuperCall Callable superMethod) throws Exception { + InjectedHolder.Section holder = (InjectedHolder.Section) thisObj; + int x = (int) args[0]; + int y = (int) args[1]; + int z = (int) args[2]; + Object newState = args[3]; + Object previousState = superMethod.call(); + compareAndUpdateBlockState(x, y, z, newState, previousState, holder); + return previousState; + } + } + public static class GetAndSetInterceptor { public static final GetAndSetInterceptor INSTANCE = new GetAndSetInterceptor(); @RuntimeType public Object intercept(@This Object thisObj, @AllArguments Object[] args) { - InjectedPalettedContainerHolder holder = (InjectedPalettedContainerHolder) thisObj; + InjectedHolder.Palette holder = (InjectedHolder.Palette) thisObj; Object targetStates = holder.target(); int x = (int) args[0]; int y = (int) args[1]; int z = (int) args[2]; - Object previousState = FastNMS.INSTANCE.method$PalettedContainer$getAndSet(targetStates, x, y, z, args[3]); - try { - Object newState = args[3]; - int stateId = BlockStateUtils.blockStateToId(newState); - CESection section = holder.ceSection(); - // 如果是原版方块 - if (BlockStateUtils.isVanillaBlock(stateId)) { - // 那么应该情况自定义块 - ImmutableBlockState previous = section.setBlockState(x, y, z, EmptyBlock.STATE); - // 如果先前不是空气则标记 - if (!previous.isEmpty()) { - holder.ceChunk().setDirty(true); - } - if (Config.enableLightSystem() && Config.forceUpdateLight()) { - updateLightIfChanged(holder, previousState, newState, null, y, z, x); - } - } else { - ImmutableBlockState immutableBlockState = BukkitBlockManager.instance().getImmutableBlockStateUnsafe(stateId); - ImmutableBlockState previousImmutableBlockState = section.setBlockState(x, y, z, immutableBlockState); - // 如果之前的自定义块(空气)和当前自定义块不同 - if (previousImmutableBlockState != immutableBlockState) { - holder.ceChunk().setDirty(true); - if (Config.enableLightSystem() && !immutableBlockState.isEmpty()) { - updateLightIfChanged(holder, previousState, newState, immutableBlockState.vanillaBlockState().handle(), y, z, x); - } - } - } - } catch (Exception e) { - CraftEngine.instance().logger().warn("Failed to intercept setBlockState", e); - } + Object newState = args[3]; + Object previousState = FastNMS.INSTANCE.method$PalettedContainer$getAndSet(targetStates, x, y, z, newState); + compareAndUpdateBlockState(x, y, z, newState, previousState, holder); return previousState; } + } - private void updateLightIfChanged(@This InjectedPalettedContainerHolder thisObj, Object previousBlockState, Object newState, @Nullable Object clientSideNewState, int y, int z, int x) throws ReflectiveOperationException { - int previousLight = BlockStateUtils.getLightEmission(previousBlockState); - int newLight = BlockStateUtils.getLightEmission(newState); - if (previousLight != newLight || (clientSideNewState != null && (BlockStateUtils.isOcclude(newState) != BlockStateUtils.isOcclude(clientSideNewState)))) { - CEWorld world = thisObj.ceWorld(); - SectionPos sectionPos = thisObj.cePos(); - Set posSet = SectionPosUtils.calculateAffectedRegions((sectionPos.x() << 4) + x, (sectionPos.y() << 4) + y, (sectionPos.z() << 4) + z, Math.max(newLight, previousLight)); - world.sectionLightUpdated(posSet); + protected static void compareAndUpdateBlockState(int x, int y, int z, Object newState, Object previousState, InjectedHolder holder) { + try { + int stateId = BlockStateUtils.blockStateToId(newState); + CESection section = holder.ceSection(); + // 如果是原版方块 + if (BlockStateUtils.isVanillaBlock(stateId)) { + // 那么应该情况自定义块 + ImmutableBlockState previous = section.setBlockState(x, y, z, EmptyBlock.STATE); + // 如果先前不是空气则标记 + if (!previous.isEmpty()) { + holder.ceChunk().setDirty(true); + } + if (Config.enableLightSystem() && Config.forceUpdateLight()) { + updateLightIfChanged(holder, previousState, newState, null, y, z, x); + } + } else { + ImmutableBlockState immutableBlockState = BukkitBlockManager.instance().getImmutableBlockStateUnsafe(stateId); + ImmutableBlockState previousImmutableBlockState = section.setBlockState(x, y, z, immutableBlockState); + // 如果之前的自定义块(空气)和当前自定义块不同 + if (previousImmutableBlockState != immutableBlockState) { + holder.ceChunk().setDirty(true); + if (Config.enableLightSystem() && !immutableBlockState.isEmpty()) { + updateLightIfChanged(holder, previousState, newState, immutableBlockState.vanillaBlockState().handle(), y, z, x); + } + } } + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to intercept setBlockState", e); + } + } + + protected static void updateLightIfChanged(@This InjectedHolder thisObj, Object previousBlockState, Object newState, @Nullable Object clientSideNewState, int y, int z, int x) throws ReflectiveOperationException { + int previousLight = BlockStateUtils.getLightEmission(previousBlockState); + int newLight = BlockStateUtils.getLightEmission(newState); + if (previousLight != newLight || (clientSideNewState != null && (BlockStateUtils.isOcclude(newState) != BlockStateUtils.isOcclude(clientSideNewState)))) { + CEWorld world = thisObj.ceChunk().world(); + SectionPos sectionPos = thisObj.cePos(); + Set posSet = SectionPosUtils.calculateAffectedRegions((sectionPos.x() << 4) + x, (sectionPos.y() << 4) + y, (sectionPos.z() << 4) + z, Math.max(newLight, previousLight)); + world.sectionLightUpdated(posSet); } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java index 85165e2e5..ed7918dd2 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java @@ -1928,7 +1928,6 @@ public class Reflections { // field$ChunkAccess$blockEntities = targetField; // } - @Deprecated public static final Method method$LevelChunkSection$setBlockState = requireNonNull( ReflectionUtils.getMethod( clazz$LevelChunkSection, clazz$BlockState, int.class, int.class, int.class, clazz$BlockState, boolean.class diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitWorldManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitWorldManager.java index e6bd597df..ffc0b77bf 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitWorldManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitWorldManager.java @@ -282,7 +282,11 @@ public class BukkitWorldManager implements WorldManager, Listener { for (int i = 0; i < ceSections.length; i++) { CESection ceSection = ceSections[i]; Object section = sections[i]; - BukkitInjector.uninjectLevelChunkSection(section); + Object uninjectedSection = BukkitInjector.uninjectLevelChunkSection(section); + if (uninjectedSection != section) { + sections[i] = uninjectedSection; + section = uninjectedSection; + } if (!ceSection.statesContainer().isEmpty()) { for (int x = 0; x < 16; x++) { for (int z = 0; z < 16; z++) { @@ -383,7 +387,9 @@ public class BukkitWorldManager implements WorldManager, Listener { } } } - BukkitInjector.injectLevelChunkSection(section, ceSection, ceChunk, new SectionPos(pos.x, ceChunk.sectionY(i), pos.z)); + int finalI = i; + BukkitInjector.injectLevelChunkSection(section, ceSection, ceChunk, new SectionPos(pos.x, ceChunk.sectionY(i), pos.z), + (injected) -> sections[finalI] = injected); } if (Config.enableRecipeSystem()) { @SuppressWarnings("unchecked") diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/Config.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/Config.java index be4757d67..e595457bf 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/Config.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/Config.java @@ -23,6 +23,7 @@ import net.momirealms.craftengine.core.util.AdventureHelper; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.MiscUtils; import net.momirealms.craftengine.core.util.ReflectionUtils; +import net.momirealms.craftengine.core.world.InjectionTarget; import net.momirealms.craftengine.core.world.chunk.storage.CompressionMethod; import java.io.File; @@ -46,6 +47,7 @@ public class Config { private final String configVersion; private YamlDocument config; + protected boolean firstTime = true; protected boolean debug; protected boolean checkUpdate; protected boolean metrics; @@ -100,7 +102,8 @@ public class Config { protected boolean chunk_system$restore_custom_blocks_on_chunk_load; protected boolean chunk_system$sync_custom_blocks_on_chunk_load; protected int chunk_system$delay_serialization; - protected boolean chunk_system$fast_paletted_injection; + protected boolean chunk_system$injection$use_fast_method; + protected boolean chunk_system$injection$target; protected boolean furniture$handle_invalid_furniture_on_chunk_load$enable; protected Map furniture$handle_invalid_furniture_on_chunk_load$mapping; @@ -272,7 +275,10 @@ public class Config { chunk_system$restore_custom_blocks_on_chunk_load = config.getBoolean("chunk-system.restore-custom-blocks-on-chunk-load", true); chunk_system$sync_custom_blocks_on_chunk_load = config.getBoolean("chunk-system.sync-custom-blocks-on-chunk-load", false); chunk_system$delay_serialization = config.getInt("chunk-system.delay-serialization", 20); - chunk_system$fast_paletted_injection = config.getBoolean("chunk-system.fast-palette-injection", false); + chunk_system$injection$use_fast_method = config.getBoolean("chunk-system.injection.use-fast-method", false); + if (firstTime) { + chunk_system$injection$target = config.getEnum("chunk-system.injection.target", InjectionTarget.class, InjectionTarget.PALETTE) == InjectionTarget.PALETTE; + } // furniture furniture$handle_invalid_furniture_on_chunk_load$enable = config.getBoolean("furniture.handle-invalid-furniture-on-chunk-load.enable", false); @@ -342,6 +348,8 @@ public class Config { plugin.logger().warn("Failed to set max chain update", e); } } + + firstTime = false; } private static float getVersion(String version) { @@ -695,8 +703,12 @@ public class Config { return instance.chunk_system$delay_serialization; } - public static boolean fastPaletteInjection() { - return instance.chunk_system$fast_paletted_injection; + public static boolean fastInjection() { + return instance.chunk_system$injection$use_fast_method; + } + + public static boolean injectionTarget() { + return instance.chunk_system$injection$target; } public YamlDocument loadOrCreateYamlData(String fileName) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/InjectionTarget.java b/core/src/main/java/net/momirealms/craftengine/core/world/InjectionTarget.java new file mode 100644 index 000000000..35149a464 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/world/InjectionTarget.java @@ -0,0 +1,6 @@ +package net.momirealms.craftengine.core.world; + +public enum InjectionTarget { + SECTION, + PALETTE +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/chunk/InjectedPalettedContainerHolder.java b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/InjectedHolder.java similarity index 62% rename from core/src/main/java/net/momirealms/craftengine/core/world/chunk/InjectedPalettedContainerHolder.java rename to core/src/main/java/net/momirealms/craftengine/core/world/chunk/InjectedHolder.java index f8d67784d..a625a0a47 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/world/chunk/InjectedPalettedContainerHolder.java +++ b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/InjectedHolder.java @@ -1,11 +1,8 @@ package net.momirealms.craftengine.core.world.chunk; -import net.momirealms.craftengine.core.world.CEWorld; import net.momirealms.craftengine.core.world.SectionPos; -public interface InjectedPalettedContainerHolder { - - Object target(); +public interface InjectedHolder { CESection ceSection(); @@ -15,11 +12,15 @@ public interface InjectedPalettedContainerHolder { void ceChunk(CEChunk chunk); - CEWorld ceWorld(); - - void ceWorld(CEWorld world); - SectionPos cePos(); void cePos(SectionPos pos); + + interface Section extends InjectedHolder { + } + + interface Palette extends InjectedHolder { + + Object target(); + } } diff --git a/gradle.properties b/gradle.properties index 980c2704a..3bb3ebc45 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,8 +2,8 @@ org.gradle.jvmargs=-Xmx1G # Project settings # Rule: [major update].[feature update].[bug fix] -project_version=0.0.53-beta.4 -config_version=31 +project_version=0.0.53-beta.6 +config_version=32 lang_version=12 project_group=net.momirealms latest_supported_version=1.21.5 @@ -50,7 +50,7 @@ byte_buddy_version=1.17.5 ahocorasick_version=0.6.3 snake_yaml_version=2.4 anti_grief_version=0.15 -nms_helper_version=0.64.6 +nms_helper_version=0.65.11 evalex_version=3.5.0 reactive_streams_version=1.0.4 amazon_awssdk_version=2.31.23 From 1b93704a4e17b7f5cecf684c556813caf67aa6c8 Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Wed, 7 May 2025 05:00:35 +0800 Subject: [PATCH 45/51] Update gradle.properties --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 3bb3ebc45..7d1d6d3f4 100644 --- a/gradle.properties +++ b/gradle.properties @@ -50,7 +50,7 @@ byte_buddy_version=1.17.5 ahocorasick_version=0.6.3 snake_yaml_version=2.4 anti_grief_version=0.15 -nms_helper_version=0.65.11 +nms_helper_version=0.65.12 evalex_version=3.5.0 reactive_streams_version=1.0.4 amazon_awssdk_version=2.31.23 From c3bf97a3f52f24c8b2cde67aa0451005d838f451 Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Wed, 7 May 2025 19:49:21 +0800 Subject: [PATCH 46/51] =?UTF-8?q?=E9=87=8D=E6=9E=84=E5=8C=BA=E5=9D=97?= =?UTF-8?q?=E7=BC=93=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../LegacySlimeWorldDataStorage.java | 2 +- .../slimeworld/SlimeWorldDataStorage.java | 2 +- .../worldedit/FastAsyncWorldEditDelegate.java | 2 +- bukkit/loader/src/main/resources/config.yml | 5 +- .../plugin/injector/BukkitInjector.java | 80 ++++++++++++----- .../bukkit/world/BukkitWorldManager.java | 35 ++++---- .../core/plugin/config/Config.java | 8 +- .../craftengine/core/world/CEWorld.java | 2 +- .../craftengine/core/world/ChunkPos.java | 13 +++ .../core/world/chunk/InjectedHolder.java | 6 ++ .../CachedDefaultRegionFileStorage.java | 43 ++++++++++ .../storage/DefaultRegionFileStorage.java | 2 +- .../chunk/storage/DefaultStorageAdaptor.java | 4 +- .../DelayedDefaultRegionFileStorage.java | 85 ------------------- .../core/world/chunk/storage/RegionFile.java | 6 -- .../world/chunk/storage/WorldDataStorage.java | 2 +- gradle.properties | 4 +- 17 files changed, 154 insertions(+), 147 deletions(-) create mode 100644 core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/CachedDefaultRegionFileStorage.java delete mode 100644 core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/DelayedDefaultRegionFileStorage.java diff --git a/bukkit/compatibility/legacy/src/main/java/net/momirealms/craftengine/bukkit/compatibility/legacy/slimeworld/LegacySlimeWorldDataStorage.java b/bukkit/compatibility/legacy/src/main/java/net/momirealms/craftengine/bukkit/compatibility/legacy/slimeworld/LegacySlimeWorldDataStorage.java index 74acc1e05..4feff8a93 100644 --- a/bukkit/compatibility/legacy/src/main/java/net/momirealms/craftengine/bukkit/compatibility/legacy/slimeworld/LegacySlimeWorldDataStorage.java +++ b/bukkit/compatibility/legacy/src/main/java/net/momirealms/craftengine/bukkit/compatibility/legacy/slimeworld/LegacySlimeWorldDataStorage.java @@ -42,7 +42,7 @@ public class LegacySlimeWorldDataStorage implements WorldDataStorage { } @Override - public void writeChunkAt(@NotNull ChunkPos pos, @NotNull CEChunk chunk, boolean immediately) { + public void writeChunkAt(@NotNull ChunkPos pos, @NotNull CEChunk chunk) { SlimeChunk slimeChunk = getWorld().getChunk(pos.x, pos.z); if (slimeChunk == null) return; CompoundTag nbt = DefaultChunkSerializer.serialize(chunk); diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/slimeworld/SlimeWorldDataStorage.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/slimeworld/SlimeWorldDataStorage.java index ae6703087..663689520 100644 --- a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/slimeworld/SlimeWorldDataStorage.java +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/slimeworld/SlimeWorldDataStorage.java @@ -44,7 +44,7 @@ public class SlimeWorldDataStorage implements WorldDataStorage { @SuppressWarnings("unchecked") @Override - public void writeChunkAt(@NotNull ChunkPos pos, @NotNull CEChunk chunk, boolean immediately) { + public void writeChunkAt(@NotNull ChunkPos pos, @NotNull CEChunk chunk) { SlimeChunk slimeChunk = getWorld().getChunk(pos.x, pos.z); if (slimeChunk == null) return; CompoundTag nbt = DefaultChunkSerializer.serialize(chunk); diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java index 9127b6c7b..8d7ee7e7e 100644 --- a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java @@ -196,7 +196,7 @@ public class FastAsyncWorldEditDelegate extends AbstractDelegateExtent { try { for (CEChunk ceChunk : this.chunksToSave) { CraftEngine.instance().debug(() -> "Saving chunk " + ceChunk.chunkPos()); - this.ceWorld.worldDataStorage().writeChunkAt(ceChunk.chunkPos(), ceChunk, true); + this.ceWorld.worldDataStorage().writeChunkAt(ceChunk.chunkPos(), ceChunk); } this.chunksToSave.clear(); } catch (IOException e) { diff --git a/bukkit/loader/src/main/resources/config.yml b/bukkit/loader/src/main/resources/config.yml index b25083cec..1c9c98fa2 100644 --- a/bukkit/loader/src/main/resources/config.yml +++ b/bukkit/loader/src/main/resources/config.yml @@ -345,8 +345,9 @@ light-system: force-update-light: false chunk-system: - # Unloaded chunks may be loaded soon. Delaying serialization can improve performance, especially for those double-dimension mob farms. - delay-serialization: 20 # seconds -1 = disable + # With cache system, those frequently load/unload chunks would consume fewer resources on serialization + # Enabling this option will increase memory consumption to a certain extent + cache-system: true # 1 = NONE | Compression Speed | Decompress Speed | Compression Ratio | Memory Usage | # 2 = DEFLATE | Medium-Slow Medium Moderate Low | # 3 = GZIP | Medium-Slow Medium Moderate Low | diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/BukkitInjector.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/BukkitInjector.java index 0bb780dd4..9a54e77a1 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/BukkitInjector.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/BukkitInjector.java @@ -17,6 +17,7 @@ import net.bytebuddy.implementation.bind.annotation.AllArguments; import net.bytebuddy.implementation.bind.annotation.RuntimeType; import net.bytebuddy.implementation.bind.annotation.SuperCall; import net.bytebuddy.implementation.bind.annotation.This; +import net.bytebuddy.implementation.bytecode.assign.Assigner; import net.bytebuddy.implementation.bytecode.assign.TypeCasting; import net.bytebuddy.implementation.bytecode.member.FieldAccess; import net.bytebuddy.implementation.bytecode.member.MethodReturn; @@ -77,6 +78,7 @@ public class BukkitInjector { private static Class clazz$InjectedPalettedContainer; private static Class clazz$InjectedLevelChunkSection; + private static MethodHandle constructor$InjectedLevelChunkSection; private static VarHandle varHandle$InjectedPalettedContainer$target; @@ -104,6 +106,7 @@ public class BukkitInjector { .name("net.minecraft.world.level.chunk.InjectedPalettedContainer") .implement(InjectedHolder.Palette.class) .defineField("target", Reflections.clazz$PalettedContainer, Visibility.PUBLIC) + .defineField("active", boolean.class, Visibility.PUBLIC) .defineField("cesection", CESection.class, Visibility.PRIVATE) .defineField("cechunk", CEChunk.class, Visibility.PRIVATE) .defineField("cepos", SectionPos.class, Visibility.PRIVATE) @@ -116,6 +119,10 @@ public class BukkitInjector { .intercept(MethodDelegation.to(GetAndSetInterceptor.INSTANCE)) .method(ElementMatchers.named("target")) .intercept(FieldAccessor.ofField("target")) + .method(ElementMatchers.named("setTarget")) + .intercept(FieldAccessor.ofField("target").withAssigner(Assigner.DEFAULT, Assigner.Typing.DYNAMIC)) + .method(ElementMatchers.named("isActive").or(ElementMatchers.named("setActive"))) + .intercept(FieldAccessor.ofField("active")) .method(ElementMatchers.named("ceSection")) .intercept(FieldAccessor.ofField("cesection")) .method(ElementMatchers.named("ceChunk")) @@ -125,13 +132,14 @@ public class BukkitInjector { .make() .load(BukkitInjector.class.getClassLoader()) .getLoaded(); - varHandle$InjectedPalettedContainer$target = Objects.requireNonNull(ReflectionUtils.findVarHandle(clazz$InjectedPalettedContainer, "target", Reflections.clazz$PalettedContainer)); + //varHandle$InjectedPalettedContainer$target = Objects.requireNonNull(ReflectionUtils.findVarHandle(clazz$InjectedPalettedContainer, "target", Reflections.clazz$PalettedContainer)); // Level Chunk Section clazz$InjectedLevelChunkSection = byteBuddy - .subclass(Reflections.clazz$LevelChunkSection) + .subclass(Reflections.clazz$LevelChunkSection, ConstructorStrategy.Default.IMITATE_SUPER_CLASS_OPENING) .name("net.minecraft.world.level.chunk.InjectedLevelChunkSection") .implement(InjectedHolder.Section.class) + .defineField("active", boolean.class, Visibility.PUBLIC) .defineField("cesection", CESection.class, Visibility.PRIVATE) .defineField("cechunk", CEChunk.class, Visibility.PRIVATE) .defineField("cepos", SectionPos.class, Visibility.PRIVATE) @@ -143,10 +151,16 @@ public class BukkitInjector { .intercept(FieldAccessor.ofField("cechunk")) .method(ElementMatchers.named("cePos")) .intercept(FieldAccessor.ofField("cepos")) + .method(ElementMatchers.named("isActive").or(ElementMatchers.named("setActive"))) + .intercept(FieldAccessor.ofField("active")) .make() .load(BukkitInjector.class.getClassLoader()) .getLoaded(); + constructor$InjectedLevelChunkSection = MethodHandles.publicLookup().in(clazz$InjectedLevelChunkSection) + .findConstructor(clazz$InjectedLevelChunkSection, MethodType.methodType(void.class, Reflections.clazz$PalettedContainer, Reflections.clazz$PalettedContainer)) + .asType(MethodType.methodType(Reflections.clazz$LevelChunkSection, Reflections.clazz$PalettedContainer, Reflections.clazz$PalettedContainer)); + // State Predicate DynamicType.Unloaded alwaysTrue = byteBuddy .subclass(Reflections.clazz$StatePredicate) @@ -408,32 +422,50 @@ public class BukkitInjector { try { if (Config.injectionTarget()) { Object container = FastNMS.INSTANCE.field$LevelChunkSection$states(targetSection); - if (!(container instanceof InjectedHolder.Palette)) { + if (!(container instanceof InjectedHolder.Palette holder)) { InjectedHolder.Palette injectedObject; if (Config.fastInjection()) { injectedObject = FastNMS.INSTANCE.createInjectedPalettedContainerHolder(container); } else { injectedObject = (InjectedHolder.Palette) Reflections.UNSAFE.allocateInstance(clazz$InjectedPalettedContainer); - varHandle$InjectedPalettedContainer$target.set(injectedObject, container); + injectedObject.setTarget(container); + //varHandle$InjectedPalettedContainer$target.set(injectedObject, container); } injectedObject.ceChunk(chunk); injectedObject.ceSection(ceSection); injectedObject.cePos(pos); + injectedObject.setActive(true); Reflections.varHandle$PalettedContainer$data.setVolatile(injectedObject, Reflections.varHandle$PalettedContainer$data.get(container)); Reflections.field$LevelChunkSection$states.set(targetSection, injectedObject); + } else { + holder.ceChunk(chunk); + holder.ceSection(ceSection); + holder.cePos(pos); + holder.setActive(true); } } else { - InjectedHolder.Section injectedObject; - if (true) { - injectedObject = FastNMS.INSTANCE.createInjectedLevelChunkSectionHolder(targetSection); + if (!(targetSection instanceof InjectedHolder.Section holder)) { + InjectedHolder.Section injectedObject; + if (Config.fastInjection()) { + injectedObject = FastNMS.INSTANCE.createInjectedLevelChunkSectionHolder(targetSection); + } else { + injectedObject = (InjectedHolder.Section) constructor$InjectedLevelChunkSection.invoke( + FastNMS.INSTANCE.field$LevelChunkSection$states(targetSection), FastNMS.INSTANCE.field$LevelChunkSection$biomes(targetSection)); + } + injectedObject.ceChunk(chunk); + injectedObject.ceSection(ceSection); + injectedObject.cePos(pos); + injectedObject.setActive(true); + callback.accept(injectedObject); + } else { + holder.ceChunk(chunk); + holder.ceSection(ceSection); + holder.cePos(pos); + holder.setActive(true); } - injectedObject.ceChunk(chunk); - injectedObject.ceSection(ceSection); - injectedObject.cePos(pos); - callback.accept(injectedObject); } - } catch (Exception e) { - CraftEngine.instance().logger().severe("Failed to inject chunk section", e); + } catch (Throwable e) { + CraftEngine.instance().logger().severe("Failed to inject chunk section " + pos, e); } } @@ -450,15 +482,17 @@ public class BukkitInjector { if (Config.injectionTarget()) { Object states = FastNMS.INSTANCE.field$LevelChunkSection$states(section); if (states instanceof InjectedHolder.Palette holder) { - try { - Reflections.field$LevelChunkSection$states.set(section, holder.target()); - } catch (ReflectiveOperationException e) { - CraftEngine.instance().logger().severe("Failed to uninject palette", e); - } + holder.setActive(false); +// try { +// Reflections.field$LevelChunkSection$states.set(section, holder.target()); +// } catch (ReflectiveOperationException e) { +// CraftEngine.instance().logger().severe("Failed to uninject palette", e); +// } } } else { if (section instanceof InjectedHolder.Section holder) { - return FastNMS.INSTANCE.constructor$LevelChunkSection(holder); + holder.setActive(false); + //return FastNMS.INSTANCE.constructor$LevelChunkSection(holder); } } return section; @@ -730,7 +764,9 @@ public class BukkitInjector { int z = (int) args[2]; Object newState = args[3]; Object previousState = superMethod.call(); - compareAndUpdateBlockState(x, y, z, newState, previousState, holder); + if (holder.isActive()) { + compareAndUpdateBlockState(x, y, z, newState, previousState, holder); + } return previousState; } } @@ -747,7 +783,9 @@ public class BukkitInjector { int z = (int) args[2]; Object newState = args[3]; Object previousState = FastNMS.INSTANCE.method$PalettedContainer$getAndSet(targetStates, x, y, z, newState); - compareAndUpdateBlockState(x, y, z, newState, previousState, holder); + if (holder.isActive()) { + compareAndUpdateBlockState(x, y, z, newState, previousState, holder); + } return previousState; } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitWorldManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitWorldManager.java index ffc0b77bf..d527a0ab7 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitWorldManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitWorldManager.java @@ -266,27 +266,24 @@ public class BukkitWorldManager implements WorldManager, Listener { if (ceChunk != null) { if (ceChunk.dirty()) { try { - world.worldDataStorage().writeChunkAt(pos, ceChunk, false); + this.plugin.debug(() -> "[Dirty Chunk]" + pos + " unloaded"); + world.worldDataStorage().writeChunkAt(pos, ceChunk); ceChunk.setDirty(false); } catch (IOException e) { this.plugin.logger().warn("Failed to write chunk tag at " + chunk.getX() + " " + chunk.getZ(), e); } } - if (Config.restoreVanillaBlocks()) { - boolean unsaved = false; - CESection[] ceSections = ceChunk.sections(); - Object worldServer = FastNMS.INSTANCE.field$CraftChunk$worldServer(chunk); - Object chunkSource = FastNMS.INSTANCE.method$ServerLevel$getChunkSource(worldServer); - Object levelChunk = FastNMS.INSTANCE.method$ServerChunkCache$getChunkAtIfLoadedMainThread(chunkSource, chunk.getX(), chunk.getZ()); - Object[] sections = FastNMS.INSTANCE.method$ChunkAccess$getSections(levelChunk); - for (int i = 0; i < ceSections.length; i++) { - CESection ceSection = ceSections[i]; - Object section = sections[i]; - Object uninjectedSection = BukkitInjector.uninjectLevelChunkSection(section); - if (uninjectedSection != section) { - sections[i] = uninjectedSection; - section = uninjectedSection; - } + boolean unsaved = false; + CESection[] ceSections = ceChunk.sections(); + Object worldServer = FastNMS.INSTANCE.field$CraftChunk$worldServer(chunk); + Object chunkSource = FastNMS.INSTANCE.method$ServerLevel$getChunkSource(worldServer); + Object levelChunk = FastNMS.INSTANCE.method$ServerChunkCache$getChunkAtIfLoadedMainThread(chunkSource, chunk.getX(), chunk.getZ()); + Object[] sections = FastNMS.INSTANCE.method$ChunkAccess$getSections(levelChunk); + for (int i = 0; i < ceSections.length; i++) { + CESection ceSection = ceSections[i]; + Object section = sections[i]; + BukkitInjector.uninjectLevelChunkSection(section); + if (Config.restoreVanillaBlocks()) { if (!ceSection.statesContainer().isEmpty()) { for (int x = 0; x < 16; x++) { for (int z = 0; z < 16; z++) { @@ -301,9 +298,9 @@ public class BukkitWorldManager implements WorldManager, Listener { } } } - if (unsaved && !FastNMS.INSTANCE.method$LevelChunk$isUnsaved(levelChunk)) { - FastNMS.INSTANCE.method$LevelChunk$markUnsaved(levelChunk); - } + } + if (unsaved && !FastNMS.INSTANCE.method$LevelChunk$isUnsaved(levelChunk)) { + FastNMS.INSTANCE.method$LevelChunk$markUnsaved(levelChunk); } ceChunk.unload(); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/Config.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/Config.java index e595457bf..fde4746d5 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/Config.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/Config.java @@ -101,7 +101,7 @@ public class Config { protected boolean chunk_system$restore_vanilla_blocks_on_chunk_unload; protected boolean chunk_system$restore_custom_blocks_on_chunk_load; protected boolean chunk_system$sync_custom_blocks_on_chunk_load; - protected int chunk_system$delay_serialization; + protected boolean chunk_system$cache_system; protected boolean chunk_system$injection$use_fast_method; protected boolean chunk_system$injection$target; @@ -274,7 +274,7 @@ public class Config { chunk_system$restore_vanilla_blocks_on_chunk_unload = config.getBoolean("chunk-system.restore-vanilla-blocks-on-chunk-unload", true); chunk_system$restore_custom_blocks_on_chunk_load = config.getBoolean("chunk-system.restore-custom-blocks-on-chunk-load", true); chunk_system$sync_custom_blocks_on_chunk_load = config.getBoolean("chunk-system.sync-custom-blocks-on-chunk-load", false); - chunk_system$delay_serialization = config.getInt("chunk-system.delay-serialization", 20); + chunk_system$cache_system = config.getBoolean("chunk-system.cache-system", true); chunk_system$injection$use_fast_method = config.getBoolean("chunk-system.injection.use-fast-method", false); if (firstTime) { chunk_system$injection$target = config.getEnum("chunk-system.injection.target", InjectionTarget.class, InjectionTarget.PALETTE) == InjectionTarget.PALETTE; @@ -699,8 +699,8 @@ public class Config { return instance.furniture$collision_entity_type; } - public static int delaySerialization() { - return instance.chunk_system$delay_serialization; + public static boolean enableChunkCache() { + return instance.chunk_system$cache_system; } public static boolean fastInjection() { diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/CEWorld.java b/core/src/main/java/net/momirealms/craftengine/core/world/CEWorld.java index 51bc86577..e36abc7ce 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/world/CEWorld.java +++ b/core/src/main/java/net/momirealms/craftengine/core/world/CEWorld.java @@ -49,7 +49,7 @@ public abstract class CEWorld { for (Map.Entry entry : this.loadedChunkMap.entrySet()) { CEChunk chunk = entry.getValue(); if (chunk.dirty()) { - worldDataStorage.writeChunkAt(new ChunkPos(entry.getKey()), chunk, true); + worldDataStorage.writeChunkAt(new ChunkPos(entry.getKey()), chunk); chunk.setDirty(false); } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/ChunkPos.java b/core/src/main/java/net/momirealms/craftengine/core/world/ChunkPos.java index 6962e334b..115dd689a 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/world/ChunkPos.java +++ b/core/src/main/java/net/momirealms/craftengine/core/world/ChunkPos.java @@ -68,4 +68,17 @@ public class ChunkPos { public static long asLong(int chunkX, int chunkZ) { return (long) chunkX & 4294967295L | ((long) chunkZ & 4294967295L) << 32; } + + @Override + public final boolean equals(Object o) { + if (!(o instanceof ChunkPos chunkPos)) return false; + return x == chunkPos.x && z == chunkPos.z; + } + + @Override + public int hashCode() { + int result = x; + result = 31 * result + z; + return result; + } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/chunk/InjectedHolder.java b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/InjectedHolder.java index a625a0a47..4287019e6 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/world/chunk/InjectedHolder.java +++ b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/InjectedHolder.java @@ -4,6 +4,10 @@ import net.momirealms.craftengine.core.world.SectionPos; public interface InjectedHolder { + boolean isActive(); + + void setActive(boolean active); + CESection ceSection(); void ceSection(CESection section); @@ -22,5 +26,7 @@ public interface InjectedHolder { interface Palette extends InjectedHolder { Object target(); + + void setTarget(Object target); } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/CachedDefaultRegionFileStorage.java b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/CachedDefaultRegionFileStorage.java new file mode 100644 index 000000000..782bbd90b --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/CachedDefaultRegionFileStorage.java @@ -0,0 +1,43 @@ +package net.momirealms.craftengine.core.world.chunk.storage; + +import com.github.benmanes.caffeine.cache.Cache; +import com.github.benmanes.caffeine.cache.Caffeine; +import com.github.benmanes.caffeine.cache.Scheduler; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.world.CEWorld; +import net.momirealms.craftengine.core.world.ChunkPos; +import net.momirealms.craftengine.core.world.chunk.CEChunk; +import org.jetbrains.annotations.NotNull; + +import java.io.IOException; +import java.nio.file.Path; +import java.util.concurrent.TimeUnit; + +public class CachedDefaultRegionFileStorage extends DefaultRegionFileStorage { + private final Cache chunkCache; + + public CachedDefaultRegionFileStorage(Path directory) { + super(directory); + this.chunkCache = Caffeine.newBuilder() + .executor(CraftEngine.instance().scheduler().async()) + .scheduler(Scheduler.systemScheduler()) + .expireAfterAccess(30, TimeUnit.SECONDS) + .build(); + } + + @Override + public @NotNull CEChunk readChunkAt(@NotNull CEWorld world, @NotNull ChunkPos pos) throws IOException { + CEChunk chunk = this.chunkCache.getIfPresent(pos); + if (chunk != null) { + return chunk; + } + chunk = super.readChunkAt(world, pos); + this.chunkCache.put(pos, chunk); + return chunk; + } + + @Override + public synchronized void close() throws IOException { + super.close(); + } +} \ No newline at end of file diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/DefaultRegionFileStorage.java b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/DefaultRegionFileStorage.java index 132bc699f..bfeef7a58 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/DefaultRegionFileStorage.java +++ b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/DefaultRegionFileStorage.java @@ -147,7 +147,7 @@ public class DefaultRegionFileStorage implements WorldDataStorage { } @Override - public void writeChunkAt(@NotNull ChunkPos pos, @NotNull CEChunk chunk, boolean immediately) throws IOException { + public void writeChunkAt(@NotNull ChunkPos pos, @NotNull CEChunk chunk) throws IOException { CompoundTag nbt = DefaultChunkSerializer.serialize(chunk); writeChunkTagAt(pos, nbt); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/DefaultStorageAdaptor.java b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/DefaultStorageAdaptor.java index 401ed6880..281add860 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/DefaultStorageAdaptor.java +++ b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/DefaultStorageAdaptor.java @@ -9,8 +9,8 @@ public class DefaultStorageAdaptor implements StorageAdaptor { @Override public @NotNull WorldDataStorage adapt(@NotNull World world) { - if (Config.delaySerialization() > 0) { - return new DelayedDefaultRegionFileStorage(world.directory().resolve(CEWorld.REGION_DIRECTORY), Config.delaySerialization()); + if (Config.enableChunkCache()) { + return new CachedDefaultRegionFileStorage(world.directory().resolve(CEWorld.REGION_DIRECTORY)); } else { return new DefaultRegionFileStorage(world.directory().resolve(CEWorld.REGION_DIRECTORY)); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/DelayedDefaultRegionFileStorage.java b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/DelayedDefaultRegionFileStorage.java deleted file mode 100644 index f711fbbb3..000000000 --- a/core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/DelayedDefaultRegionFileStorage.java +++ /dev/null @@ -1,85 +0,0 @@ -package net.momirealms.craftengine.core.world.chunk.storage; - -import com.github.benmanes.caffeine.cache.Cache; -import com.github.benmanes.caffeine.cache.Caffeine; -import com.github.benmanes.caffeine.cache.RemovalCause; -import net.momirealms.craftengine.core.plugin.CraftEngine; -import net.momirealms.craftengine.core.world.CEWorld; -import net.momirealms.craftengine.core.world.ChunkPos; -import net.momirealms.craftengine.core.world.chunk.CEChunk; -import org.jetbrains.annotations.NotNull; - -import java.io.IOException; -import java.nio.channels.ClosedChannelException; -import java.nio.file.Path; -import java.util.concurrent.TimeUnit; - -public class DelayedDefaultRegionFileStorage extends DefaultRegionFileStorage { - private final Cache chunkCache; - private boolean isClosed; - - public DelayedDefaultRegionFileStorage(Path directory, int time) { - super(directory); - this.chunkCache = Caffeine.newBuilder() - .expireAfterWrite(time, TimeUnit.SECONDS) - .removalListener((ChunkPos key, CEChunk value, RemovalCause cause) -> { - if (key == null || value == null || isClosed) { - return; - } - if (cause == RemovalCause.EXPIRED || cause == RemovalCause.SIZE) { - try { - super.writeChunkAt(key, value, true); - } catch (ClosedChannelException e) { - if (this.isClosed) { - return; - } - CraftEngine.instance().logger().warn("Failed to write chunk at " + key, e); - } catch (IOException e) { - CraftEngine.instance().logger().warn("Failed to write chunk at " + key, e); - } - } - }) - .build(); - } - - @Override - public @NotNull CEChunk readChunkAt(@NotNull CEWorld world, @NotNull ChunkPos pos) throws IOException { - CEChunk chunk = this.chunkCache.asMap().remove(pos); - if (chunk != null) { - return chunk; - } - return super.readChunkAt(world, pos); - } - - @Override - public void writeChunkAt(@NotNull ChunkPos pos, @NotNull CEChunk chunk, boolean immediately) throws IOException { - if (immediately) { - super.writeChunkAt(pos, chunk, true); - return; - } - if (chunk.isEmpty()) { - super.writeChunkTagAt(pos, null); - return; - } - this.chunkCache.put(pos, chunk); - } - - @Override - public synchronized void close() throws IOException { - this.isClosed = true; - this.saveCache(); - this.chunkCache.cleanUp(); - super.close(); - } - - private void saveCache() { - try { - for (var chunk : this.chunkCache.asMap().entrySet()) { - super.writeChunkAt(chunk.getKey(), chunk.getValue(), true); - } - } catch (IOException e) { - CraftEngine.instance().logger().warn("Failed to save chunks", e); - } - this.chunkCache.invalidateAll(); - } -} \ No newline at end of file diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/RegionFile.java b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/RegionFile.java index b50452bae..0ee384791 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/RegionFile.java +++ b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/RegionFile.java @@ -309,9 +309,6 @@ public class RegionFile implements AutoCloseable { } public void clear(ChunkPos pos) throws IOException { - if (!this.fileChannel.isOpen()) { - throw new ClosedChannelException(); - } int chunkLocation = RegionFile.getChunkLocation(pos); int sectorInfo = this.sectorInfo.get(chunkLocation); if (sectorInfo != INFO_NOT_PRESENT) { @@ -325,9 +322,6 @@ public class RegionFile implements AutoCloseable { @SuppressWarnings("ResultOfMethodCallIgnored") protected synchronized void write(ChunkPos pos, ByteBuffer buf) throws IOException { - if (!this.fileChannel.isOpen()) { - throw new ClosedChannelException(); - } // get old offset info int offsetIndex = RegionFile.getChunkLocation(pos); int previousSectorInfo = this.sectorInfo.get(offsetIndex); diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/WorldDataStorage.java b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/WorldDataStorage.java index b3b4dd47d..bd44492a9 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/WorldDataStorage.java +++ b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/WorldDataStorage.java @@ -12,7 +12,7 @@ public interface WorldDataStorage { @NotNull CEChunk readChunkAt(@NotNull CEWorld world, @NotNull ChunkPos pos) throws IOException; - void writeChunkAt(@NotNull ChunkPos pos, @NotNull CEChunk chunk, boolean immediately) throws IOException; + void writeChunkAt(@NotNull ChunkPos pos, @NotNull CEChunk chunk) throws IOException; void flush() throws IOException; diff --git a/gradle.properties b/gradle.properties index 7d1d6d3f4..cb3c9ca19 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,7 +2,7 @@ org.gradle.jvmargs=-Xmx1G # Project settings # Rule: [major update].[feature update].[bug fix] -project_version=0.0.53-beta.6 +project_version=0.0.53-beta.7 config_version=32 lang_version=12 project_group=net.momirealms @@ -50,7 +50,7 @@ byte_buddy_version=1.17.5 ahocorasick_version=0.6.3 snake_yaml_version=2.4 anti_grief_version=0.15 -nms_helper_version=0.65.12 +nms_helper_version=0.65.15 evalex_version=3.5.0 reactive_streams_version=1.0.4 amazon_awssdk_version=2.31.23 From 9ec258c526fac9d8b14d985f6c2cc5df3f96817b Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Wed, 7 May 2025 20:03:36 +0800 Subject: [PATCH 47/51] =?UTF-8?q?=E7=BC=93=E5=AD=98=E4=B8=80=E8=88=AC?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../LegacySlimeFormatStorageAdaptor.java | 5 +++- .../slimeworld/SlimeFormatStorageAdaptor.java | 5 +++- bukkit/loader/src/main/resources/config.yml | 4 ++-- ...ionFileStorage.java => CachedStorage.java} | 24 +++++++++++++------ .../chunk/storage/DefaultStorageAdaptor.java | 2 +- 5 files changed, 28 insertions(+), 12 deletions(-) rename core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/{CachedDefaultRegionFileStorage.java => CachedStorage.java} (67%) diff --git a/bukkit/compatibility/legacy/src/main/java/net/momirealms/craftengine/bukkit/compatibility/legacy/slimeworld/LegacySlimeFormatStorageAdaptor.java b/bukkit/compatibility/legacy/src/main/java/net/momirealms/craftengine/bukkit/compatibility/legacy/slimeworld/LegacySlimeFormatStorageAdaptor.java index 872e50bf8..982f91c5e 100644 --- a/bukkit/compatibility/legacy/src/main/java/net/momirealms/craftengine/bukkit/compatibility/legacy/slimeworld/LegacySlimeFormatStorageAdaptor.java +++ b/bukkit/compatibility/legacy/src/main/java/net/momirealms/craftengine/bukkit/compatibility/legacy/slimeworld/LegacySlimeFormatStorageAdaptor.java @@ -2,8 +2,10 @@ package net.momirealms.craftengine.bukkit.compatibility.legacy.slimeworld; import com.infernalsuite.aswm.api.events.LoadSlimeWorldEvent; import com.infernalsuite.aswm.api.world.SlimeWorld; +import net.momirealms.craftengine.core.plugin.config.Config; import net.momirealms.craftengine.core.world.World; import net.momirealms.craftengine.core.world.WorldManager; +import net.momirealms.craftengine.core.world.chunk.storage.CachedStorage; import net.momirealms.craftengine.core.world.chunk.storage.DefaultStorageAdaptor; import net.momirealms.craftengine.core.world.chunk.storage.WorldDataStorage; import org.bukkit.Bukkit; @@ -22,7 +24,8 @@ public class LegacySlimeFormatStorageAdaptor extends DefaultStorageAdaptor imple @EventHandler public void onWorldLoad(LoadSlimeWorldEvent event) { org.bukkit.World world = Bukkit.getWorld(event.getSlimeWorld().getName()); - this.worldManager.loadWorld(this.worldManager.createWorld(this.worldManager.wrap(world), new LegacySlimeWorldDataStorage(event.getSlimeWorld()))); + this.worldManager.loadWorld(this.worldManager.createWorld(this.worldManager.wrap(world), + Config.enableChunkCache() ? new CachedStorage<>(new LegacySlimeWorldDataStorage(event.getSlimeWorld())) : new LegacySlimeWorldDataStorage(event.getSlimeWorld()))); } public LegacySlimeFormatStorageAdaptor(WorldManager worldManager, int version) { diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/slimeworld/SlimeFormatStorageAdaptor.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/slimeworld/SlimeFormatStorageAdaptor.java index b01a6e1c1..2c02934a8 100644 --- a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/slimeworld/SlimeFormatStorageAdaptor.java +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/slimeworld/SlimeFormatStorageAdaptor.java @@ -3,9 +3,11 @@ package net.momirealms.craftengine.bukkit.compatibility.slimeworld; import com.infernalsuite.asp.api.AdvancedSlimePaperAPI; import com.infernalsuite.asp.api.events.LoadSlimeWorldEvent; import com.infernalsuite.asp.api.world.SlimeWorld; +import net.momirealms.craftengine.core.plugin.config.Config; import net.momirealms.craftengine.core.util.ReflectionUtils; import net.momirealms.craftengine.core.world.World; import net.momirealms.craftengine.core.world.WorldManager; +import net.momirealms.craftengine.core.world.chunk.storage.CachedStorage; import net.momirealms.craftengine.core.world.chunk.storage.DefaultStorageAdaptor; import net.momirealms.craftengine.core.world.chunk.storage.WorldDataStorage; import org.bukkit.Bukkit; @@ -24,7 +26,8 @@ public class SlimeFormatStorageAdaptor extends DefaultStorageAdaptor implements @EventHandler public void onWorldLoad(LoadSlimeWorldEvent event) { org.bukkit.World world = Bukkit.getWorld(event.getSlimeWorld().getName()); - this.worldManager.loadWorld(this.worldManager.createWorld(this.worldManager.wrap(world), new SlimeWorldDataStorage(event.getSlimeWorld(), this))); + this.worldManager.loadWorld(this.worldManager.createWorld(this.worldManager.wrap(world), + Config.enableChunkCache() ? new CachedStorage<>(new SlimeWorldDataStorage(event.getSlimeWorld(), this)) : new SlimeWorldDataStorage(event.getSlimeWorld(), this))); } public SlimeFormatStorageAdaptor(WorldManager worldManager) { diff --git a/bukkit/loader/src/main/resources/config.yml b/bukkit/loader/src/main/resources/config.yml index 1c9c98fa2..297be7fe4 100644 --- a/bukkit/loader/src/main/resources/config.yml +++ b/bukkit/loader/src/main/resources/config.yml @@ -357,11 +357,11 @@ chunk-system: # Settings for injection injection: # Requires a restart to apply - # SECTION: Inject the LevelChunkSection (Faster, but may conflict with some plugins) + # SECTION: Inject the LevelChunkSection (Faster & Experimental) since 0.0.53 # PALETTE: Inject the PalettedContainer target: PALETTE # Enables faster injection method - # Note: May not work with certain server forks that alter chunk saving behavior + # Note: May not work with certain server forks that alter chunk class structure (In most cases it won't conflict) use-fast-method: false # Auto-convert custom blocks -> vanilla blocks when unloading chunks # diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/CachedDefaultRegionFileStorage.java b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/CachedStorage.java similarity index 67% rename from core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/CachedDefaultRegionFileStorage.java rename to core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/CachedStorage.java index 782bbd90b..9cc9d5d5e 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/CachedDefaultRegionFileStorage.java +++ b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/CachedStorage.java @@ -10,14 +10,14 @@ import net.momirealms.craftengine.core.world.chunk.CEChunk; import org.jetbrains.annotations.NotNull; import java.io.IOException; -import java.nio.file.Path; import java.util.concurrent.TimeUnit; -public class CachedDefaultRegionFileStorage extends DefaultRegionFileStorage { +public class CachedStorage implements WorldDataStorage { + private final T storage; private final Cache chunkCache; - public CachedDefaultRegionFileStorage(Path directory) { - super(directory); + public CachedStorage(T storage) { + this.storage = storage; this.chunkCache = Caffeine.newBuilder() .executor(CraftEngine.instance().scheduler().async()) .scheduler(Scheduler.systemScheduler()) @@ -31,13 +31,23 @@ public class CachedDefaultRegionFileStorage extends DefaultRegionFileStorage { if (chunk != null) { return chunk; } - chunk = super.readChunkAt(world, pos); + chunk = this.storage.readChunkAt(world, pos); this.chunkCache.put(pos, chunk); return chunk; } @Override - public synchronized void close() throws IOException { - super.close(); + public void writeChunkAt(@NotNull ChunkPos pos, @NotNull CEChunk chunk) throws IOException { + this.storage.writeChunkAt(pos, chunk); + } + + @Override + public void close() throws IOException { + this.storage.close(); + } + + @Override + public void flush() throws IOException { + this.storage.flush(); } } \ No newline at end of file diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/DefaultStorageAdaptor.java b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/DefaultStorageAdaptor.java index 281add860..6b669241f 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/DefaultStorageAdaptor.java +++ b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/DefaultStorageAdaptor.java @@ -10,7 +10,7 @@ public class DefaultStorageAdaptor implements StorageAdaptor { @Override public @NotNull WorldDataStorage adapt(@NotNull World world) { if (Config.enableChunkCache()) { - return new CachedDefaultRegionFileStorage(world.directory().resolve(CEWorld.REGION_DIRECTORY)); + return new CachedStorage<>(new DefaultRegionFileStorage(world.directory().resolve(CEWorld.REGION_DIRECTORY))); } else { return new DefaultRegionFileStorage(world.directory().resolve(CEWorld.REGION_DIRECTORY)); } From e221c5a50b30257e4d86452cdf4df9b5b4da5532 Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Wed, 7 May 2025 20:35:07 +0800 Subject: [PATCH 48/51] =?UTF-8?q?=E4=BF=AE=E5=A4=8D1.21.5=E9=AA=A8?= =?UTF-8?q?=E7=B2=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../block/behavior/CropBlockBehavior.java | 2 +- .../craftengine/bukkit/util/Reflections.java | 4 ++-- .../craftengine/core/block/UpdateOption.java | 4 ++++ .../core/util/ReflectionUtils.java | 21 +++++++++++++++++++ 4 files changed, 28 insertions(+), 3 deletions(-) diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/CropBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/CropBlockBehavior.java index f74239a2d..e5681c5fb 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/CropBlockBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/CropBlockBehavior.java @@ -157,7 +157,7 @@ public class CropBlockBehavior extends BushBlockBehavior { if (i > maxAge) { i = maxAge; } - FastNMS.INSTANCE.method$LevelWriter$setBlock(level, pos, immutableBlockState.with(this.ageProperty, i).customBlockState().handle(), UpdateOption.UPDATE_NONE.flags()); + FastNMS.INSTANCE.method$LevelWriter$setBlock(level, pos, immutableBlockState.with(this.ageProperty, i).customBlockState().handle(), UpdateOption.UPDATE_ALL.flags()); if (sendParticles) { world.spawnParticle(ParticleUtils.getParticle("HAPPY_VILLAGER"), x + 0.5, y + 0.5, z + 0.5, 15, 0.25, 0.25, 0.25); } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java index ed7918dd2..87c8dfcd5 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java @@ -4962,10 +4962,10 @@ public class Reflections { public static final Method method$BonemealableBlock$isValidBonemealTarget = requireNonNull( VersionHelper.isOrAbove1_20_2() ? - ReflectionUtils.getMethod( + ReflectionUtils.getInstanceMethod( clazz$BonemealableBlock, boolean.class, clazz$LevelReader, clazz$BlockPos, clazz$BlockState ) : - ReflectionUtils.getMethod( + ReflectionUtils.getInstanceMethod( clazz$BonemealableBlock, boolean.class, clazz$LevelReader, clazz$BlockPos, clazz$BlockState, boolean.class ) ); diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/UpdateOption.java b/core/src/main/java/net/momirealms/craftengine/core/block/UpdateOption.java index 98286d2ea..ae1c652ad 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/block/UpdateOption.java +++ b/core/src/main/java/net/momirealms/craftengine/core/block/UpdateOption.java @@ -14,6 +14,10 @@ public class UpdateOption { return flags; } + public static Builder builder() { + return new Builder(); + } + public static class Builder { private int flags; diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/ReflectionUtils.java b/core/src/main/java/net/momirealms/craftengine/core/util/ReflectionUtils.java index f83302bab..04a9d4baf 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/util/ReflectionUtils.java +++ b/core/src/main/java/net/momirealms/craftengine/core/util/ReflectionUtils.java @@ -246,6 +246,27 @@ public class ReflectionUtils { return null; } + @Nullable + public static Method getInstanceMethod(final Class clazz, Class returnType, final Class... parameterTypes) { + outer: + for (Method method : clazz.getMethods()) { + if (method.getParameterCount() != parameterTypes.length) { + continue; + } + if (Modifier.isStatic(method.getModifiers())) { + continue; + } + Class[] types = method.getParameterTypes(); + for (int i = 0; i < types.length; i++) { + if (types[i] != parameterTypes[i]) { + continue outer; + } + } + if (returnType.isAssignableFrom(method.getReturnType())) return method; + } + return null; + } + @Nullable public static Method getDeclaredMethod(final Class clazz, Class returnType, final String[] possibleMethodNames, final Class... parameterTypes) { outer: From c13f01c1592055f60ce669fa1d49be2c8ab5f34c Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Wed, 7 May 2025 20:45:28 +0800 Subject: [PATCH 49/51] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E8=AF=AD=E8=A8=80?= =?UTF-8?q?=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bukkit/loader/src/main/resources/translations/en.yml | 7 +++---- bukkit/loader/src/main/resources/translations/tr.yml | 8 ++------ bukkit/loader/src/main/resources/translations/zh_cn.yml | 9 ++++----- .../core/plugin/context/number/NumberProviders.java | 4 ++-- 4 files changed, 11 insertions(+), 17 deletions(-) diff --git a/bukkit/loader/src/main/resources/translations/en.yml b/bukkit/loader/src/main/resources/translations/en.yml index 2d63d9711..ff18b0826 100644 --- a/bukkit/loader/src/main/resources/translations/en.yml +++ b/bukkit/loader/src/main/resources/translations/en.yml @@ -1,7 +1,6 @@ # Don't change this lang-version: "${lang_version}" -# Commands exception.invalid_syntax: "Invalid syntax. Correct syntax: " exception.invalid_argument: "Invalid argument. Reason: " exception.invalid_sender: " is not allowed to execute that command. Must be of type " @@ -70,6 +69,8 @@ warning.config.type.float: "Issue found in file - Failed to load warning.config.type.double: "Issue found in file - Failed to load '': Cannot cast '' to double type for option ''." warning.config.type.quaternionf: "Issue found in file - Failed to load '': Cannot cast '' to Quaternionf type for option ''." warning.config.type.vector3f: "Issue found in file - Failed to load '': Cannot cast '' to Vector3f type for option ''." +warning.config.number.missing_type: "Issue found in file - The config '' is missing the required 'type' argument for number argument." +warning.config.number.invalid_type: "Issue found in file - The config '' is using an invalid number argument type ''." warning.config.number.missing_argument: "Issue found in file - The config '' is missing the argument for 'number'." warning.config.number.invalid_format: "Issue found in file - The config '' is using an invalid number format ''." warning.config.number.fixed.missing_value: "Issue found in file - The config '' is missing the required 'value' argument for 'constant' number." @@ -223,7 +224,7 @@ warning.config.block.behavior.sapling.missing_stage: "Issue found in fil warning.config.block.behavior.sapling.missing_feature: "Issue found in file - The block '' is missing the required 'feature' argument for 'sapling_block' behavior." warning.config.block.behavior.strippable.missing_stripped: "Issue found in file - The block '' is missing the required 'stripped' argument for 'strippable_block' behavior." warning.config.block.event.condition.missing_type: "Issue found in file - The block '' is missing the required 'type' argument for event condition." -warning.config.block.event.condition.invalid_type: "Issue found in file - The block '' is using an invalid 'type' argument for event condition." +warning.config.block.event.condition.invalid_type: "Issue found in file - The block '' is using an invalid 'type' argument '' for event condition." warning.config.model.generation.missing_parent: "Issue found in file - The config '' is missing the required 'parent' argument in 'generation' section." warning.config.model.generation.conflict: "Issue found in file - Failed to generate model for '' as two or more configurations attempt to generate different json models with the same path: ''." warning.config.model.generation.texture.invalid: "Issue found in file - The config '' has a texture '' with path '' that contains illegal characters. Please read https://minecraft.wiki/w/Resource_location#Legal_characters." @@ -249,8 +250,6 @@ warning.config.loot_table.entry.exp.missing_count: "Issue found in file warning.config.loot_table.entry.item.missing_item: "Issue found in file - '' has a misconfigured loot table, entry 'item' is missing the required 'item' argument." warning.config.loot_table.condition.missing_type: "Issue found in file - '' has a misconfigured loot table, one of the conditions is missing the required 'type' argument." warning.config.loot_table.condition.invalid_type: "Issue found in file - '' has a misconfigured loot table, one of the conditions is using an invalid condition type ''." -warning.config.loot_table.number.missing_type: "Issue found in file - '' has a misconfigured loot table, one of the numbers is missing the required 'type' argument." -warning.config.loot_table.number.invalid_type: "Issue found in file - '' has a misconfigured loot table, one of the numbers is using an invalid number type ''." warning.config.host.missing_type: "Issue found in config.yml at 'resource-pack.delivery.hosting' - Missing required 'type' argument for host." warning.config.host.invalid_type: "Issue found in config.yml at 'resource-pack.delivery.hosting' - Host type '' is invalid. Please read https://mo-mi.gitbook.io/xiaomomi-plugins/craftengine/plugin-wiki/craftengine/resource-pack/host." warning.config.host.external.missing_url: "Issue found in config.yml at 'resource-pack.delivery.hosting' - Missing required 'url' argument for external host." diff --git a/bukkit/loader/src/main/resources/translations/tr.yml b/bukkit/loader/src/main/resources/translations/tr.yml index 7eadf3d06..def783519 100644 --- a/bukkit/loader/src/main/resources/translations/tr.yml +++ b/bukkit/loader/src/main/resources/translations/tr.yml @@ -1,6 +1,6 @@ # Don't change this lang-version: "${lang_version}" -# Commands + exception.invalid_syntax: "Geçersiz sözdizimi. Doğru kullanım: " exception.invalid_argument: "Geçersiz argüman. Neden: " exception.invalid_sender: " bu komutu çalıştırmaya yetkili değil. türünde olmalı" @@ -226,10 +226,6 @@ warning.config.loot_table.entry.exp.missing_count: " dosyasında warning.config.loot_table.entry.item.missing_item: " dosyasında sorun bulundu - '', yanlış yapılandırılmış bir ganimet tablosuna sahip, 'item' girişi için gerekli 'item' argümanı eksik." warning.config.loot_table.condition.missing_type: " dosyasında sorun bulundu - '', yanlış yapılandırılmış bir ganimet tablosuna sahip, koşullardan biri için gerekli 'type' argümanı eksik." warning.config.loot_table.condition.invalid_type: " dosyasında sorun bulundu - '', yanlış yapılandırılmış bir ganimet tablosuna sahip, koşullardan biri geçersiz bir koşul türü '' kullanıyor." -warning.config.loot_table.condition.table_bonus.missing_enchantment: " dosyasında sorun bulundu - '', yanlış yapılandırılmış bir ganimet tablosuna sahip, 'table_bonus' koşulu için gerekli 'enchantment' argümanı eksik." -warning.config.loot_table.condition.table_bonus.missing_chances: " dosyasında sorun bulundu - '', yanlış yapılandırılmış bir ganimet tablosuna sahip, 'table_bonus' koşulu için gerekli 'chances' argümanı eksik." -warning.config.loot_table.number.missing_type: " dosyasında sorun bulundu - '', yanlış yapılandırılmış bir ganimet tablosuna sahip, sayılardan biri için gerekli 'type' argümanı eksik." -warning.config.loot_table.number.invalid_type: " dosyasında sorun bulundu - '', yanlış yapılandırılmış bir ganimet tablosuna sahip, sayılardan biri geçersiz bir sayı türü '' kullanıyor." warning.config.host.missing_type: "config.yml dosyasında 'resource-pack.delivery.hosting' bölümünde sorun bulundu - Host için gerekli 'type' argümanı eksik." warning.config.host.invalid_type: "config.yml dosyasında 'resource-pack.delivery.hosting' bölümünde sorun bulundu - Host türü '' geçersiz. Lütfen https://mo-mi.gitbook.io/xiaomomi-plugins/craftengine/plugin-wiki/craftengine/resource-pack/host sayfasını okuyun." warning.config.host.external.missing_url: "config.yml dosyasında 'resource-pack.delivery.hosting' bölümünde sorun bulundu - Harici host için gerekli 'url' argümanı eksik." @@ -272,4 +268,4 @@ warning.config.conflict_matcher.inverted.missing_term: "config.yml dosya warning.config.conflict_matcher.all_of.missing_terms: "config.yml dosyasında 'resource-pack.duplicated-files-handler' bölümünde sorun bulundu - 'all_of' eşleştiricisi için gerekli 'terms' argümanı eksik." warning.config.conflict_matcher.any_of.missing_terms: "config.yml dosyasında 'resource-pack.duplicated-files-handler' bölümünde sorun bulundu - 'any_of' eşleştiricisi için gerekli 'terms' argümanı eksik." warning.config.conflict_resolution.missing_type: "config.yml dosyasında 'resource-pack.duplicated-files-handler' bölümünde sorun bulundu - Çözümlerden biri için gerekli 'type' argümanı eksik." -warning.config.conflict_resolution.invalid_type: "config.yml dosyasında 'resource-pack.duplicated-files-handler' bölümünde sorun bulundu - Çözümlerden biri geçersiz bir tür '' kullanıyor." +warning.config.conflict_resolution.invalid_type: "config.yml dosyasında 'resource-pack.duplicated-files-handler' bölümünde sorun bulundu - Çözümlerden biri geçersiz bir tür '' kullanıyor." \ No newline at end of file diff --git a/bukkit/loader/src/main/resources/translations/zh_cn.yml b/bukkit/loader/src/main/resources/translations/zh_cn.yml index f191e0076..d2e6ed5f9 100644 --- a/bukkit/loader/src/main/resources/translations/zh_cn.yml +++ b/bukkit/loader/src/main/resources/translations/zh_cn.yml @@ -1,7 +1,6 @@ # 别动这个 lang-version: "${lang_version}" -# 命令 exception.invalid_syntax: "无效语法. 正确语法: " exception.invalid_argument: "无效参数. 原因: " exception.invalid_sender: " 不允许执行该命令. 执行者必须是 " @@ -70,6 +69,8 @@ warning.config.type.float: "在文件 发现问题 - 无法加 warning.config.type.double: "在文件 发现问题 - 无法加载 '': 无法将 '' 转换为双精度类型 (选项 '')" warning.config.type.quaternionf: "在文件 发现问题 - 无法加载 '': 无法将 '' 转换为四元数类型 (选项 '')" warning.config.type.vector3f: "在文件 发现问题 - 无法加载 '': 无法将 '' 转换为三维向量类型 (选项 '')" +warning.config.number.missing_type: "在文件 发现问题 - 配置项 '' 缺少数字类型所需的 'type' 参数" +warning.config.number.invalid_type: "在文件 发现问题 - 配置项 '' 使用了无效的数字类型 ''" warning.config.number.missing_argument: "在文件 发现问题 - 配置项 '' 缺少数字参数" warning.config.number.invalid_format: "在文件 发现问题 - 配置项 '' 使用了无效的数字格式 ''" warning.config.number.fixed.missing_value: "在文件 发现问题 - 配置项 '' 缺少 'constant' 数字类型所需的 'value' 参数" @@ -222,6 +223,8 @@ warning.config.block.behavior.leaves.missing_distance: "在文件 在文件 发现问题 - 方块 '' 的 'sapling_block' 行为缺少必需的 'stage' 属性" warning.config.block.behavior.sapling.missing_feature: "在文件 发现问题 - 方块 '' 的 'sapling_block' 行为缺少必需的 'feature' 参数" warning.config.block.behavior.strippable.missing_stripped: "在文件 发现问题 - 方块 '' 的 'strippable_block' 行为缺少必需的 'stripped' 参数" +warning.config.block.event.condition.missing_type: "在文件 - 方块 '' 的事件条件缺少 'type' 参数" +warning.config.block.event.condition.invalid_type: "在文件 - 方块 '' 使用了无效的事件条件类型 ''" warning.config.model.generation.missing_parent: "在文件 发现问题 - 配置项 '' 的 'generation' 段落缺少必需的 'parent' 参数" warning.config.model.generation.conflict: "在文件 发现问题 - 无法为 '' 生成模型 存在多个配置尝试使用相同路径 '' 生成不同的 JSON 模型" warning.config.model.generation.texture.invalid: "在文件 发现问题 - 配置项 '' 的纹理 '' 路径 '' 包含非法字符 请参考 https://zh.minecraft.wiki/w/%E5%91%BD%E5%90%8D%E7%A9%BA%E9%97%B4ID#%E5%90%88%E6%B3%95%E5%AD%97%E7%AC%A6" @@ -247,10 +250,6 @@ warning.config.loot_table.entry.exp.missing_count: "在文件 warning.config.loot_table.entry.item.missing_item: "在文件 发现问题 - '' 的战利品表配置错误 'item' 条目缺少必需的 'item' 参数" warning.config.loot_table.condition.missing_type: "在文件 发现问题 - '' 的战利品表配置错误 某个条件缺少必需的 'type' 参数" warning.config.loot_table.condition.invalid_type: "在文件 发现问题 - '' 的战利品表配置错误 某个条件使用了无效的条件类型 ''" -warning.config.loot_table.condition.table_bonus.missing_enchantment: "在文件 发现问题 - '' 的战利品表配置错误 'table_bonus' 条件缺少必需的 'enchantment' 参数" -warning.config.loot_table.condition.table_bonus.missing_chances: "在文件 发现问题 - '' 的战利品表配置错误 'table_bonus' 条件缺少必需的 'chances' 参数" -warning.config.loot_table.number.missing_type: "在文件 发现问题 - '' 的战利品表配置错误 某个数值缺少必需的 'type' 参数" -warning.config.loot_table.number.invalid_type: "在文件 发现问题 - '' 的战利品表配置错误 某个数值使用了无效的数值类型 ''" warning.config.host.missing_type: "在 config.yml 的 'resource-pack.delivery.hosting' 处发现问题 - 缺少必需的 'type' 参数" warning.config.host.invalid_type: "在 config.yml 的 'resource-pack.delivery.hosting' 处发现问题 - 无效的托管类型 '' 请参考 https://mo-mi.gitbook.io/xiaomomi-plugins/craftengine/plugin-wiki/craftengine/resource-pack/host" warning.config.host.external.missing_url: "在 config.yml 的 'resource-pack.delivery.hosting' 处发现问题 - 外部托管缺少必需的 'url' 参数" diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/number/NumberProviders.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/number/NumberProviders.java index 2d73ce359..5d5d609a4 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/number/NumberProviders.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/number/NumberProviders.java @@ -43,11 +43,11 @@ public class NumberProviders { } public static NumberProvider fromMap(Map map) { - String type = ResourceConfigUtils.requireNonEmptyStringOrThrow(map.get("type"), "warning.config.loot_table.number.missing_type"); + String type = ResourceConfigUtils.requireNonEmptyStringOrThrow(map.get("type"), "warning.config.number.missing_type"); Key key = Key.withDefaultNamespace(type, Key.DEFAULT_NAMESPACE); Factory factory = BuiltInRegistries.NUMBER_PROVIDER_FACTORY.getValue(key); if (factory == null) { - throw new LocalizedResourceConfigException("warning.config.loot_table.number.invalid_type", type); + throw new LocalizedResourceConfigException("warning.config.number.invalid_type", type); } return factory.create(map); } From d49e466158a400620e90ae1ea729fa5cb09e17ba Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Wed, 7 May 2025 21:08:05 +0800 Subject: [PATCH 50/51] =?UTF-8?q?=E4=BF=AE=E5=A4=8D1.21.5=E4=B8=AD?= =?UTF-8?q?=E9=94=AEpick=E7=89=A9=E5=93=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bukkit/plugin/network/PacketConsumers.java | 17 ++++++++++++----- .../craftengine/bukkit/util/Reflections.java | 4 ++++ 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java index 1651cf099..a5cb326fc 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java @@ -54,6 +54,7 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.PlayerInventory; import org.bukkit.util.RayTraceResult; import org.bukkit.util.Vector; +import org.jetbrains.annotations.Nullable; import java.lang.reflect.InvocationTargetException; import java.nio.charset.StandardCharsets; @@ -1479,7 +1480,7 @@ public class PacketConsumers { if (state == null) return; Key itemId = state.settings().itemId(); if (itemId == null) return; - pickItem(player, itemId); + pickItem(player, itemId, pos, null); } // 1.21.4+ @@ -1518,18 +1519,24 @@ public class PacketConsumers { private static void handlePickItemFromEntityOnMainThread(Player player, LoadedFurniture furniture) throws Exception { Key itemId = furniture.config().settings().itemId(); if (itemId == null) return; - pickItem(player, itemId); + pickItem(player, itemId, null, FastNMS.INSTANCE.method$CraftEntity$getHandle(furniture.baseEntity())); } - private static void pickItem(Player player, Key itemId) throws IllegalAccessException, InvocationTargetException { + private static void pickItem(Player player, Key itemId, @Nullable Object blockPos, @Nullable Object entity) throws IllegalAccessException, InvocationTargetException { ItemStack itemStack = BukkitCraftEngine.instance().itemManager().buildCustomItemStack(itemId, BukkitCraftEngine.instance().adapt(player)); if (itemStack == null) { CraftEngine.instance().logger().warn("Item: " + itemId + " is not a valid item"); return; } assert Reflections.method$ServerGamePacketListenerImpl$tryPickItem != null; - Reflections.method$ServerGamePacketListenerImpl$tryPickItem.invoke( - Reflections.field$ServerPlayer$connection.get(FastNMS.INSTANCE.method$CraftPlayer$getHandle(player)), FastNMS.INSTANCE.method$CraftItemStack$asNMSCopy(itemStack)); + if (VersionHelper.isOrAbove1_21_5()) { + Reflections.method$ServerGamePacketListenerImpl$tryPickItem.invoke( + Reflections.field$ServerPlayer$connection.get(FastNMS.INSTANCE.method$CraftPlayer$getHandle(player)), + FastNMS.INSTANCE.method$CraftItemStack$asNMSCopy(itemStack), blockPos, entity, true); + } else { + Reflections.method$ServerGamePacketListenerImpl$tryPickItem.invoke( + Reflections.field$ServerPlayer$connection.get(FastNMS.INSTANCE.method$CraftPlayer$getHandle(player)), FastNMS.INSTANCE.method$CraftItemStack$asNMSCopy(itemStack)); + } } public static final BiConsumer ADD_ENTITY_BYTEBUFFER = (user, event) -> { diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java index 87c8dfcd5..3ffed4d5b 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java @@ -5029,6 +5029,10 @@ public class Reflections { ); public static final Method method$ServerGamePacketListenerImpl$tryPickItem = + VersionHelper.isOrAbove1_21_5() ? + ReflectionUtils.getDeclaredMethod( + clazz$ServerGamePacketListenerImpl, void.class, clazz$ItemStack, clazz$BlockPos, clazz$Entity, boolean.class + ) : ReflectionUtils.getDeclaredMethod( clazz$ServerGamePacketListenerImpl, void.class, clazz$ItemStack ); From 1858383ec8ae87befc29c0eea321795d92d2929e Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Wed, 7 May 2025 21:17:05 +0800 Subject: [PATCH 51/51] =?UTF-8?q?=E4=BF=AE=E5=A4=8DFAWE=20//cp=20//cut?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../compatibility/worldedit/FastAsyncWorldEditDelegate.java | 6 ++++-- gradle.properties | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java index 8d7ee7e7e..fc51538cf 100644 --- a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java @@ -31,6 +31,7 @@ import net.momirealms.craftengine.core.world.SectionPos; import net.momirealms.craftengine.core.world.chunk.CEChunk; import net.momirealms.craftengine.core.world.chunk.CESection; import org.bukkit.Bukkit; +import org.jetbrains.annotations.Nullable; import java.io.IOException; import java.lang.reflect.Method; @@ -143,7 +144,8 @@ public class FastAsyncWorldEditDelegate extends AbstractDelegateExtent { } @Override - protected Operation commitBefore() { + public @Nullable Operation commit() { + Operation operation = super.commit(); saveAllChunks(); List chunks = new ArrayList<>(this.brokenChunks); this.brokenChunks.clear(); @@ -155,7 +157,7 @@ public class FastAsyncWorldEditDelegate extends AbstractDelegateExtent { if (loaded == null) continue; injectLevelChunk(chunkSource, loaded); } - return super.commitBefore(); + return operation; } private void processBlocks(Iterable region, Pattern pattern) { diff --git a/gradle.properties b/gradle.properties index cb3c9ca19..f57da2123 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,7 +2,7 @@ org.gradle.jvmargs=-Xmx1G # Project settings # Rule: [major update].[feature update].[bug fix] -project_version=0.0.53-beta.7 +project_version=0.0.53 config_version=32 lang_version=12 project_group=net.momirealms