From 9b8375e5dbf7fa7cb366c06dc41f1cfebcbdc6fe Mon Sep 17 00:00:00 2001 From: XiaoMoMi <972454774@qq.com> Date: Thu, 23 Oct 2025 03:51:18 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=B1=95=E7=A4=BA=E6=9E=B6re?= =?UTF-8?q?vision?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/pack/model/SelectItemModel.java | 29 +++++++++- .../select/DisplayContextSelectProperty.java | 58 +++++++++++++++++++ .../pack/model/select/SelectProperties.java | 4 +- .../pack/model/select/SelectProperty.java | 15 +++++ 4 files changed, 101 insertions(+), 5 deletions(-) create mode 100644 core/src/main/java/net/momirealms/craftengine/core/pack/model/select/DisplayContextSelectProperty.java diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/SelectItemModel.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/SelectItemModel.java index 26bfb395b..5b71450e1 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/model/SelectItemModel.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/SelectItemModel.java @@ -60,14 +60,26 @@ public class SelectItemModel implements ItemModel { item.add("model", itemModel.apply(version)); Either> either = entry.getKey(); if (either.primary().isPresent()) { - item.add("when", either.primary().get()); + JsonElement remap = this.property.remap(either.primary().get(), version); + if (remap != null) { + item.add("when", remap); + } else { + continue; + } } else { List list = either.fallback().get(); JsonArray whens = new JsonArray(); for (JsonElement e : list) { - whens.add(e); + JsonElement remap = this.property.remap(e, version); + if (remap != null) { + whens.add(remap); + } + } + if (!whens.isEmpty()) { + item.add("when", whens); + } else { + continue; } - item.add("when", whens); } array.add(item); } @@ -85,6 +97,17 @@ public class SelectItemModel implements ItemModel { @Override public List revisions() { List versions = new ArrayList<>(); + for (Map.Entry>, ItemModel> entry : this.whenMap.entrySet()) { + Either> when = entry.getKey(); + if (when.primary().isPresent()) { + versions.addAll(this.property.revisions(when.primary().get())); + } else { + List list = when.fallback().get(); + for (JsonElement e : list) { + versions.addAll(this.property.revisions(e)); + } + } + } if (this.fallBack != null) { versions.addAll(this.fallBack.revisions()); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/select/DisplayContextSelectProperty.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/select/DisplayContextSelectProperty.java new file mode 100644 index 000000000..37e112d07 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/select/DisplayContextSelectProperty.java @@ -0,0 +1,58 @@ +package net.momirealms.craftengine.core.pack.model.select; + +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonPrimitive; +import net.momirealms.craftengine.core.pack.revision.Revision; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.MinecraftVersion; +import net.momirealms.craftengine.core.util.MinecraftVersions; +import org.jetbrains.annotations.Nullable; + +import java.util.List; +import java.util.Map; + +public class DisplayContextSelectProperty implements SelectProperty { + public static final DisplayContextSelectProperty INSTANCE = new DisplayContextSelectProperty(); + public static final SimpleSelectProperty.Factory FACTORY = new SimpleSelectProperty.Factory(); + public static final SimpleSelectProperty.Reader READER = new SimpleSelectProperty.Reader(); + + @Override + public Key type() { + return SelectProperties.DISPLAY_CONTEXT; + } + + @Override + public void accept(JsonObject jsonObject) { + jsonObject.addProperty("property", type().toString()); + } + + @Override + public List revisions(JsonElement element) { + return SelectProperty.super.revisions(element); + } + + @Override + public @Nullable JsonElement remap(JsonElement element, MinecraftVersion version) { + if (version.isBelow(MinecraftVersions.V1_21_9) && element instanceof JsonPrimitive primitive && primitive.isString()) { + if (primitive.getAsString().equals("on_shelf")) { + return null; + } + } + return element; + } + + public static class Factory implements SelectPropertyFactory { + @Override + public SelectProperty create(Map arguments) { + return INSTANCE; + } + } + + public static class Reader implements SelectPropertyReader { + @Override + public SelectProperty read(JsonObject json) { + return INSTANCE; + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/select/SelectProperties.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/select/SelectProperties.java index 3027db6ca..e6f5b46e0 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/model/select/SelectProperties.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/select/SelectProperties.java @@ -30,8 +30,8 @@ public class SelectProperties { registerReader(CONTEXT_DIMENSION, SimpleSelectProperty.READER); registerFactory(CONTEXT_ENTITY_TYPE, SimpleSelectProperty.FACTORY); registerReader(CONTEXT_ENTITY_TYPE, SimpleSelectProperty.READER); - registerFactory(DISPLAY_CONTEXT, SimpleSelectProperty.FACTORY); - registerReader(DISPLAY_CONTEXT, SimpleSelectProperty.READER); + registerFactory(DISPLAY_CONTEXT, DisplayContextSelectProperty.FACTORY); + registerReader(DISPLAY_CONTEXT, DisplayContextSelectProperty.READER); registerFactory(MAIN_HAND, MainHandSelectProperty.FACTORY); registerReader(MAIN_HAND, MainHandSelectProperty.READER); registerFactory(TRIM_MATERIAL, TrimMaterialSelectProperty.FACTORY); diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/select/SelectProperty.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/select/SelectProperty.java index 7e236d0b5..4b33b96cb 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/model/select/SelectProperty.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/select/SelectProperty.java @@ -1,11 +1,26 @@ package net.momirealms.craftengine.core.pack.model.select; +import com.google.gson.JsonElement; import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.pack.revision.Revision; import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.MinecraftVersion; +import javax.annotation.Nullable; +import java.util.Collections; +import java.util.List; import java.util.function.Consumer; public interface SelectProperty extends Consumer { Key type(); + + default List revisions(JsonElement element) { + return Collections.emptyList(); + } + + @Nullable + default JsonElement remap(JsonElement element, MinecraftVersion version) { + return element; + } }