9
0
mirror of https://github.com/Xiao-MoMi/craft-engine.git synced 2025-12-28 19:39:11 +00:00

改进旧版模型合并

This commit is contained in:
XiaoMoMi
2025-10-08 16:39:58 +08:00
parent 00b95a8b43
commit 0c2b3577fa
5 changed files with 142 additions and 24 deletions

View File

@@ -2108,17 +2108,21 @@ public abstract class AbstractPackManager implements PackManager {
}
originalItemModel = originalItemModel.deepCopy();
}
JsonArray overrides;
TreeSet<LegacyOverridesModel> overridesModels = new TreeSet<>(entry.getValue());
JsonArray newOverrides = new JsonArray();
if (originalItemModel.has("overrides")) {
overrides = originalItemModel.getAsJsonArray("overrides");
} else {
overrides = new JsonArray();
originalItemModel.add("overrides", overrides);
JsonArray overrides = originalItemModel.getAsJsonArray("overrides");
for (JsonElement override : overrides) {
if (override instanceof JsonObject jo) {
overridesModels.add(new LegacyOverridesModel(jo));
}
}
}
Collection<LegacyOverridesModel> legacyOverridesModels = entry.getValue();
for (LegacyOverridesModel model : legacyOverridesModels) {
overrides.add(model.toLegacyPredicateElement());
for (LegacyOverridesModel model : overridesModels) {
newOverrides.add(model.toLegacyPredicateElement());
}
originalItemModel.add("overrides", newOverrides);
try {
Files.createDirectories(overridedItemPath.getParent());
} catch (IOException e) {

View File

@@ -0,0 +1,76 @@
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.pack.model.LegacyOverridesModel;
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.Map;
import java.util.TreeSet;
public class ResolutionMergeLegacyModel implements Resolution {
public static final Factory FACTORY = new Factory();
@Override
public void run(PathContext existing, PathContext conflict) {
try {
JsonObject j1 = GsonHelper.readJsonFile(existing.path()).getAsJsonObject();
JsonObject j2 = GsonHelper.readJsonFile(conflict.path()).getAsJsonObject();
if (!isJsonArray(j2.get("overrides"))) {
return;
}
if (!isJsonArray(j1.get("overrides"))) {
GsonHelper.writeJsonFile(j2, existing.path());
return;
}
JsonArray ja1 = j1.getAsJsonArray("overrides");
JsonArray ja2 = j2.getAsJsonArray("overrides");
TreeSet<LegacyOverridesModel> legacyOverridesModels = new TreeSet<>();
for (JsonElement je : ja1) {
if (je instanceof JsonObject jo) {
legacyOverridesModels.add(new LegacyOverridesModel(jo));
}
}
for (JsonElement je : ja2) {
if (je instanceof JsonObject jo) {
legacyOverridesModels.add(new LegacyOverridesModel(jo));
}
}
JsonArray newOverrides = new JsonArray();
for (LegacyOverridesModel legacyOverridesModel : legacyOverridesModels) {
newOverrides.add(legacyOverridesModel.toLegacyPredicateElement());
}
j2.add("overrides", newOverrides);
GsonHelper.writeJsonFile(j2, existing.path());
} catch (IOException e) {
CraftEngine.instance().logger().severe("Failed to merge json when resolving file conflicts", e);
}
}
private boolean isJsonArray(JsonElement element) {
return element != null && element.isJsonArray();
}
@Override
public Key type() {
return Resolutions.MERGE_LEGACY_MODEL;
}
public static class Factory implements ResolutionFactory {
@Override
public Resolution create(Map<String, Object> arguments) {
return new ResolutionMergeLegacyModel();
}
}
}

View File

@@ -16,6 +16,7 @@ public class Resolutions {
public static final Key MERGE_ATLAS = Key.of("craftengine:merge_atlas");
public static final Key CONDITIONAL = Key.of("craftengine:conditional");
public static final Key MERGE_PACK_MCMETA = Key.of("craftengine:merge_pack_mcmeta");
public static final Key MERGE_LEGACY_MODEL = Key.of("craftengine:merge_legacy_model");
static {
register(RETAIN_MATCHING, RetainMatchingResolution.FACTORY);
@@ -23,6 +24,7 @@ public class Resolutions {
register(CONDITIONAL, ResolutionConditional.FACTORY);
register(MERGE_PACK_MCMETA, ResolutionMergePackMcMeta.FACTORY);
register(MERGE_ATLAS, ResolutionMergeAltas.FACTORY);
register(MERGE_LEGACY_MODEL, ResolutionMergeLegacyModel.FACTORY);
}
public static void register(Key key, ResolutionFactory factory) {

View File

@@ -1,6 +1,9 @@
package net.momirealms.craftengine.core.pack.model;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonPrimitive;
import net.momirealms.craftengine.core.util.ResourceConfigUtils;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -14,7 +17,7 @@ public class LegacyOverridesModel implements Comparable<LegacyOverridesModel> {
private final int customModelData;
public LegacyOverridesModel(@Nullable Map<String, Object> predicate, @NotNull String model, int customModelData) {
this.predicate = predicate == null ? new HashMap<>() : predicate;
this.predicate = predicate == null ? Map.of() : predicate;
this.model = model;
this.customModelData = customModelData;
if (customModelData > 0 && !this.predicate.containsKey("custom_model_data")) {
@@ -22,23 +25,51 @@ public class LegacyOverridesModel implements Comparable<LegacyOverridesModel> {
}
}
public LegacyOverridesModel(JsonObject json) {
this.model = json.get("model").getAsString();
JsonObject predicate = json.getAsJsonObject("predicate");
if (predicate != null) {
this.predicate = new HashMap<>();
for (Map.Entry<String, JsonElement> entry : predicate.entrySet()) {
JsonElement value = entry.getValue();
if (value instanceof JsonPrimitive primitive) {
if (primitive.isBoolean()) {
this.predicate.put(entry.getKey(), primitive.getAsBoolean());
} else if (primitive.isNumber()) {
this.predicate.put(entry.getKey(), primitive.getAsNumber());
} else if (primitive.isString()) {
this.predicate.put(entry.getKey(), primitive.getAsString());
}
}
}
if (this.predicate.containsKey("custom_model_data")) {
this.customModelData = ResourceConfigUtils.getAsInt(this.predicate.get("custom_model_data"), "custom_model_data");
} else {
this.customModelData = 0;
}
} else {
this.predicate = Map.of();
this.customModelData = 0;
}
}
public Map<String, Object> predicate() {
return predicate;
return this.predicate;
}
public boolean hasPredicate() {
return predicate != null && !predicate.isEmpty();
return this.predicate != null && !this.predicate.isEmpty();
}
public String model() {
return model;
return this.model;
}
public JsonObject toLegacyPredicateElement() {
JsonObject json = new JsonObject();
JsonObject predicateJson = new JsonObject();
if (predicate != null && !predicate.isEmpty()) {
for (Map.Entry<String, Object> entry : predicate.entrySet()) {
if (this.predicate != null && !this.predicate.isEmpty()) {
for (Map.Entry<String, Object> entry : this.predicate.entrySet()) {
if (entry.getValue() instanceof Boolean b) {
predicateJson.addProperty(entry.getKey(), b);
} else if (entry.getValue() instanceof Number n) {
@@ -49,12 +80,12 @@ public class LegacyOverridesModel implements Comparable<LegacyOverridesModel> {
}
json.add("predicate", predicateJson);
}
json.addProperty("model", model);
json.addProperty("model", this.model);
return json;
}
public int customModelData() {
return customModelData;
return this.customModelData;
}
@Override
@@ -62,23 +93,23 @@ public class LegacyOverridesModel implements Comparable<LegacyOverridesModel> {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
LegacyOverridesModel that = (LegacyOverridesModel) o;
return customModelData == that.customModelData && Objects.equals(predicate, that.predicate) && Objects.equals(model, that.model);
return this.customModelData == that.customModelData && Objects.equals(predicate, that.predicate) && Objects.equals(model, that.model);
}
@Override
public int hashCode() {
int result = predicate.hashCode();
int result = this.predicate.hashCode();
result = 31 * result + Objects.hashCode(model);
result = 31 * result + customModelData;
result = 31 * result + this.customModelData;
return result;
}
@Override
public String toString() {
return "LegacyOverridesModel{" +
"predicate=" + predicate +
", model='" + model + '\'' +
", custom-model-data=" + customModelData +
"predicate=" + this.predicate +
", model='" + this.model + '\'' +
", custom-model-data=" + this.customModelData +
'}';
}