9
0
mirror of https://github.com/Xiao-MoMi/craft-engine.git synced 2026-01-06 15:52:03 +00:00

Merge branch 'Xiao-MoMi:dev' into dev

This commit is contained in:
jhqwqmc
2025-09-08 05:50:37 +08:00
committed by GitHub
20 changed files with 79 additions and 44 deletions

View File

@@ -20,7 +20,6 @@ import net.momirealms.craftengine.core.world.BlockPos;
import net.momirealms.craftengine.core.world.Vec3d; import net.momirealms.craftengine.core.world.Vec3d;
import net.momirealms.sparrow.nbt.CompoundTag; import net.momirealms.sparrow.nbt.CompoundTag;
import net.momirealms.sparrow.nbt.ListTag; import net.momirealms.sparrow.nbt.ListTag;
import net.momirealms.sparrow.nbt.Tag;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.GameEvent; import org.bukkit.GameEvent;
import org.bukkit.GameMode; import org.bukkit.GameMode;
@@ -31,7 +30,6 @@ import org.bukkit.util.Vector;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.Optional; import java.util.Optional;
public class SimpleStorageBlockEntity extends BlockEntity { public class SimpleStorageBlockEntity extends BlockEntity {

View File

@@ -15,7 +15,6 @@ import net.momirealms.craftengine.core.entity.furniture.*;
import net.momirealms.craftengine.core.plugin.config.Config; import net.momirealms.craftengine.core.plugin.config.Config;
import net.momirealms.craftengine.core.sound.SoundData; import net.momirealms.craftengine.core.sound.SoundData;
import net.momirealms.craftengine.core.util.Key; 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.ResourceConfigUtils;
import net.momirealms.craftengine.core.util.VersionHelper; import net.momirealms.craftengine.core.util.VersionHelper;
import net.momirealms.craftengine.core.world.WorldPosition; import net.momirealms.craftengine.core.world.WorldPosition;

View File

@@ -8,7 +8,6 @@ import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.NetworkRefl
import net.momirealms.craftengine.core.entity.furniture.*; import net.momirealms.craftengine.core.entity.furniture.*;
import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException;
import net.momirealms.craftengine.core.util.Key; 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.ResourceConfigUtils;
import net.momirealms.craftengine.core.util.VersionHelper; import net.momirealms.craftengine.core.util.VersionHelper;
import net.momirealms.craftengine.core.world.WorldPosition; import net.momirealms.craftengine.core.world.WorldPosition;

View File

@@ -9,7 +9,6 @@ import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.MEntityType
import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.NetworkReflections; import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.NetworkReflections;
import net.momirealms.craftengine.core.entity.furniture.*; import net.momirealms.craftengine.core.entity.furniture.*;
import net.momirealms.craftengine.core.util.Key; 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.ResourceConfigUtils;
import net.momirealms.craftengine.core.util.VersionHelper; import net.momirealms.craftengine.core.util.VersionHelper;
import net.momirealms.craftengine.core.world.World; import net.momirealms.craftengine.core.world.World;

View File

@@ -7,7 +7,6 @@ import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.CoreReflect
import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.MEntityTypes; import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.MEntityTypes;
import net.momirealms.craftengine.core.entity.furniture.*; import net.momirealms.craftengine.core.entity.furniture.*;
import net.momirealms.craftengine.core.util.Key; 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.ResourceConfigUtils;
import net.momirealms.craftengine.core.world.Vec3d; import net.momirealms.craftengine.core.world.Vec3d;
import net.momirealms.craftengine.core.world.WorldPosition; import net.momirealms.craftengine.core.world.WorldPosition;

View File

@@ -190,7 +190,6 @@ public class UniversalItemFactory extends BukkitItemFactory<LegacyItemWrapper> {
@Override @Override
protected void maxDamage(LegacyItemWrapper item, Integer damage) { protected void maxDamage(LegacyItemWrapper item, Integer damage) {
throw new UnsupportedOperationException("This feature is only available on 1.20.5+");
} }
@Override @Override

View File

@@ -261,7 +261,6 @@ public class RecipeEventListener implements Listener {
@EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST) @EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST)
public void onAnvilEvent(PrepareAnvilEvent event) { public void onAnvilEvent(PrepareAnvilEvent event) {
if (event.getResult() == null) return;
preProcess(event); preProcess(event);
processRepairable(event); processRepairable(event);
processRename(event); processRename(event);
@@ -271,6 +270,7 @@ public class RecipeEventListener implements Listener {
预处理会阻止一些不合理的原版材质造成的合并问题 预处理会阻止一些不合理的原版材质造成的合并问题
*/ */
private void preProcess(PrepareAnvilEvent event) { private void preProcess(PrepareAnvilEvent event) {
if (event.getResult() == null) return;
AnvilInventory inventory = event.getInventory(); AnvilInventory inventory = event.getInventory();
ItemStack first = inventory.getFirstItem(); ItemStack first = inventory.getFirstItem();
ItemStack second = inventory.getSecondItem(); ItemStack second = inventory.getSecondItem();
@@ -318,10 +318,9 @@ public class RecipeEventListener implements Listener {
return; return;
} }
if (firstCustom.isPresent()) { if (firstCustom.isPresent()) {
CustomItem<ItemStack> firstCustomItem = firstCustom.get(); CustomItem<ItemStack> firstCustomItem = firstCustom.get();
if (firstCustomItem.settings().canRepair() == Tristate.FALSE) { if (firstCustomItem.settings().repairable().anvilCombine() == Tristate.FALSE) {
event.setResult(null); event.setResult(null);
return; return;
} }
@@ -373,7 +372,7 @@ public class RecipeEventListener implements Listener {
Key firstId = wrappedFirst.id(); Key firstId = wrappedFirst.id();
Optional<CustomItem<ItemStack>> optionalCustomTool = wrappedFirst.getCustomItem(); Optional<CustomItem<ItemStack>> optionalCustomTool = wrappedFirst.getCustomItem();
// 物品无法被修复 // 物品无法被修复
if (optionalCustomTool.isPresent() && optionalCustomTool.get().settings().canRepair() == Tristate.FALSE) { if (optionalCustomTool.isPresent() && optionalCustomTool.get().settings().repairable().anvilRepair() == Tristate.FALSE) {
return; return;
} }
@@ -494,6 +493,7 @@ public class RecipeEventListener implements Listener {
*/ */
@SuppressWarnings("UnstableApiUsage") @SuppressWarnings("UnstableApiUsage")
private void processRename(PrepareAnvilEvent event) { private void processRename(PrepareAnvilEvent event) {
if (event.getResult() == null) return;
AnvilInventory inventory = event.getInventory(); AnvilInventory inventory = event.getInventory();
ItemStack first = inventory.getFirstItem(); ItemStack first = inventory.getFirstItem();
if (ItemStackUtils.isEmpty(first)) { if (ItemStackUtils.isEmpty(first)) {

View File

@@ -89,11 +89,13 @@ public class BukkitCraftEngine extends CraftEngine {
super.logger = logger; super.logger = logger;
super.platform = new BukkitPlatform(); super.platform = new BukkitPlatform();
super.scheduler = new BukkitSchedulerAdapter(this); super.scheduler = new BukkitSchedulerAdapter(this);
Class<?> compatibilityClass = Objects.requireNonNull(ReflectionUtils.getClazz(COMPATIBILITY_CLASS), "Compatibility class not found"); Class<?> compatibilityClass = ReflectionUtils.getClazz(COMPATIBILITY_CLASS);
try { if (compatibilityClass != null) {
super.compatibilityManager = (CompatibilityManager) Objects.requireNonNull(ReflectionUtils.getConstructor(compatibilityClass, 0)).newInstance(this); try {
} catch (ReflectiveOperationException e) { super.compatibilityManager = (CompatibilityManager) Objects.requireNonNull(ReflectionUtils.getConstructor(compatibilityClass, 0)).newInstance(this);
logger().warn("Compatibility class could not be instantiated: " + compatibilityClass.getName()); } catch (ReflectiveOperationException e) {
logger().warn("Compatibility class could not be instantiated: " + compatibilityClass.getName());
}
} }
} }

View File

@@ -240,7 +240,7 @@ public final class RecipeInjector {
if (input2.count() != 1 || !isDamageableItem(input2)) return false; if (input2.count() != 1 || !isDamageableItem(input2)) return false;
if (!input1.id().equals(input2.id())) return false; if (!input1.id().equals(input2.id())) return false;
Optional<CustomItem<ItemStack>> customItem = input1.getCustomItem(); Optional<CustomItem<ItemStack>> customItem = input1.getCustomItem();
return customItem.isEmpty() || customItem.get().settings().canRepair() != Tristate.FALSE; return customItem.isEmpty() || customItem.get().settings().repairable().craftingTable() != Tristate.FALSE;
} }
private static boolean isDamageableItem(Item<ItemStack> item) { private static boolean isDamageableItem(Item<ItemStack> item) {

View File

@@ -3142,7 +3142,7 @@ templates#recipes:
category: building category: building
group: planks group: planks
ingredients: ingredients:
A: '#default:${wood_type}_logs' - '#default:${wood_type}_logs'
result: result:
id: default:${wood_type}_planks id: default:${wood_type}_planks
count: 4 count: 4

View File

@@ -5,7 +5,6 @@ import com.google.gson.JsonObject;
import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap; import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
import net.momirealms.craftengine.core.block.entity.render.BlockEntityElement; import net.momirealms.craftengine.core.block.entity.render.BlockEntityElement;
import net.momirealms.craftengine.core.block.entity.render.BlockEntityRenderer;
import net.momirealms.craftengine.core.block.entity.render.BlockEntityRendererConfig; import net.momirealms.craftengine.core.block.entity.render.BlockEntityRendererConfig;
import net.momirealms.craftengine.core.block.properties.Properties; import net.momirealms.craftengine.core.block.properties.Properties;
import net.momirealms.craftengine.core.block.properties.Property; import net.momirealms.craftengine.core.block.properties.Property;

View File

@@ -1,6 +1,5 @@
package net.momirealms.craftengine.core.entity.furniture; package net.momirealms.craftengine.core.entity.furniture;
import net.momirealms.craftengine.core.util.MiscUtils;
import net.momirealms.craftengine.core.util.ResourceConfigUtils; import net.momirealms.craftengine.core.util.ResourceConfigUtils;
import java.util.List; import java.util.List;

View File

@@ -25,7 +25,7 @@ import java.util.stream.Collectors;
public class ItemSettings { public class ItemSettings {
int fuelTime; int fuelTime;
Set<Key> tags = Set.of(); Set<Key> tags = Set.of();
Tristate canRepair = Tristate.UNDEFINED; Repairable repairable = Repairable.UNDEFINED;
List<AnvilRepairItem> anvilRepairItems = List.of(); List<AnvilRepairItem> anvilRepairItems = List.of();
boolean renameable = true; boolean renameable = true;
boolean canPlaceRelatedVanillaBlock = false; boolean canPlaceRelatedVanillaBlock = false;
@@ -89,7 +89,7 @@ public class ItemSettings {
newSettings.fuelTime = settings.fuelTime; newSettings.fuelTime = settings.fuelTime;
newSettings.tags = settings.tags; newSettings.tags = settings.tags;
newSettings.equipment = settings.equipment; newSettings.equipment = settings.equipment;
newSettings.canRepair = settings.canRepair; newSettings.repairable = settings.repairable;
newSettings.anvilRepairItems = settings.anvilRepairItems; newSettings.anvilRepairItems = settings.anvilRepairItems;
newSettings.renameable = settings.renameable; newSettings.renameable = settings.renameable;
newSettings.canPlaceRelatedVanillaBlock = settings.canPlaceRelatedVanillaBlock; newSettings.canPlaceRelatedVanillaBlock = settings.canPlaceRelatedVanillaBlock;
@@ -128,8 +128,8 @@ public class ItemSettings {
return canPlaceRelatedVanillaBlock; return canPlaceRelatedVanillaBlock;
} }
public Tristate canRepair() { public Repairable repairable() {
return canRepair; return repairable;
} }
public int fuelTime() { public int fuelTime() {
@@ -233,8 +233,8 @@ public class ItemSettings {
return this; return this;
} }
public ItemSettings canRepair(Tristate canRepair) { public ItemSettings repairable(Repairable repairable) {
this.canRepair = canRepair; this.repairable = repairable;
return this; return this;
} }
@@ -315,8 +315,14 @@ public class ItemSettings {
static { static {
registerFactory("repairable", (value -> { registerFactory("repairable", (value -> {
boolean bool = ResourceConfigUtils.getAsBoolean(value, "repairable"); if (value instanceof Map<?,?> mapValue) {
return settings -> settings.canRepair(bool ? Tristate.TRUE : Tristate.FALSE); Map<String, Object> repairableData = ResourceConfigUtils.getAsMap(mapValue, "repairable");
Repairable repairable = Repairable.fromMap(repairableData);
return settings -> settings.repairable(repairable);
} else {
boolean bool = ResourceConfigUtils.getAsBoolean(value, "repairable");
return settings -> settings.repairable(bool ? Repairable.TRUE : Repairable.FALSE);
}
})); }));
registerFactory("enchantable", (value -> { registerFactory("enchantable", (value -> {
boolean bool = ResourceConfigUtils.getAsBoolean(value, "enchantable"); boolean bool = ResourceConfigUtils.getAsBoolean(value, "enchantable");

View File

@@ -6,7 +6,6 @@ import net.momirealms.craftengine.core.item.ItemBuildContext;
import net.momirealms.craftengine.core.item.ItemDataModifierFactory; import net.momirealms.craftengine.core.item.ItemDataModifierFactory;
import net.momirealms.craftengine.core.util.Color; import net.momirealms.craftengine.core.util.Color;
import net.momirealms.craftengine.core.util.Key; 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.ResourceConfigUtils;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.joml.Vector3f; import org.joml.Vector3f;

View File

@@ -0,0 +1,20 @@
package net.momirealms.craftengine.core.item.setting;
import net.momirealms.craftengine.core.util.ResourceConfigUtils;
import net.momirealms.craftengine.core.util.Tristate;
import java.util.Map;
public record Repairable(Tristate craftingTable, Tristate anvilRepair, Tristate anvilCombine) {
public static final Repairable UNDEFINED = new Repairable(Tristate.UNDEFINED, Tristate.UNDEFINED, Tristate.UNDEFINED);
public static final Repairable TRUE = new Repairable(Tristate.TRUE, Tristate.TRUE, Tristate.TRUE);
public static final Repairable FALSE = new Repairable(Tristate.FALSE, Tristate.FALSE, Tristate.FALSE);
public static Repairable fromMap(Map<String, Object> map) {
Tristate craftingTable = map.containsKey("crafting-table") ? Tristate.of(ResourceConfigUtils.getAsBoolean(map.get("crafting-table"), "crafting-table")) : Tristate.UNDEFINED;
Tristate anvilRepair = map.containsKey("anvil-repair") ? Tristate.of(ResourceConfigUtils.getAsBoolean(map.get("anvil-repair"), "anvil-repair")) : Tristate.UNDEFINED;
Tristate anvilCombine = map.containsKey("anvil-combine") ? Tristate.of(ResourceConfigUtils.getAsBoolean(map.get("anvil-combine"), "anvil-combine")) : Tristate.UNDEFINED;
return new Repairable(craftingTable, anvilRepair, anvilCombine);
}
}

View File

@@ -1855,9 +1855,13 @@ public abstract class AbstractPackManager implements PackManager {
} }
JsonArray overrides = new JsonArray(); JsonArray overrides = new JsonArray();
for (LegacyOverridesModel legacyOverridesModel : legacyOverridesModels) { for (LegacyOverridesModel legacyOverridesModel : legacyOverridesModels) {
overrides.add(legacyOverridesModel.toLegacyPredicateElement()); if (legacyOverridesModel.hasPredicate()) {
overrides.add(legacyOverridesModel.toLegacyPredicateElement());
}
}
if (!overrides.isEmpty()) {
itemJson.add("overrides", overrides);
} }
itemJson.add("overrides", overrides);
} catch (IOException e) { } catch (IOException e) {
this.plugin.logger().warn("Failed to read item json " + itemPath.toAbsolutePath()); this.plugin.logger().warn("Failed to read item json " + itemPath.toAbsolutePath());
continue; continue;
@@ -1865,13 +1869,31 @@ public abstract class AbstractPackManager implements PackManager {
} else { } else {
// 如果路径不存在则需要我们创建一个json对象并对接model的路径 // 如果路径不存在则需要我们创建一个json对象并对接model的路径
itemJson = new JsonObject(); itemJson = new JsonObject();
LegacyOverridesModel firstModel = legacyOverridesModels.getFirst();
itemJson.addProperty("parent", firstModel.model()); LegacyOverridesModel firstBaseModel = null;
JsonArray overrides = new JsonArray(); List<JsonObject> overrideJsons = new ArrayList<>();
for (LegacyOverridesModel legacyOverridesModel : legacyOverridesModels) { for (LegacyOverridesModel legacyOverridesModel : legacyOverridesModels) {
overrides.add(legacyOverridesModel.toLegacyPredicateElement()); if (!legacyOverridesModel.hasPredicate()) {
if (firstBaseModel == null) {
firstBaseModel = legacyOverridesModel;
}
} else {
JsonObject legacyPredicateElement = legacyOverridesModel.toLegacyPredicateElement();
overrideJsons.add(legacyPredicateElement);
}
}
if (firstBaseModel == null) {
firstBaseModel = legacyOverridesModels.getFirst();
}
itemJson.addProperty("parent", firstBaseModel.model());
if (!overrideJsons.isEmpty()) {
JsonArray overrides = new JsonArray();
for (JsonObject override : overrideJsons) {
overrides.add(override);
}
itemJson.add("overrides", overrides);
} }
itemJson.add("overrides", overrides);
} }
try { try {
Files.createDirectories(itemPath.getParent()); Files.createDirectories(itemPath.getParent());

View File

@@ -27,7 +27,7 @@ public class LegacyOverridesModel implements Comparable<LegacyOverridesModel> {
} }
public boolean hasPredicate() { public boolean hasPredicate() {
return !predicate.isEmpty(); return predicate != null && !predicate.isEmpty();
} }
public String model() { public String model() {

View File

@@ -1,6 +1,5 @@
package net.momirealms.craftengine.core.pack.model.generation.display; package net.momirealms.craftengine.core.pack.model.generation.display;
import net.momirealms.craftengine.core.util.MiscUtils;
import net.momirealms.craftengine.core.util.ResourceConfigUtils; import net.momirealms.craftengine.core.util.ResourceConfigUtils;
import org.joml.Vector3f; import org.joml.Vector3f;

View File

@@ -1,9 +1,5 @@
package net.momirealms.craftengine.core.util; package net.momirealms.craftengine.core.util;
import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException;
import org.joml.Quaternionf;
import org.joml.Vector3f;
import java.util.*; import java.util.*;
public class MiscUtils { public class MiscUtils {

View File

@@ -2,7 +2,7 @@ org.gradle.jvmargs=-Xmx1G
# Project settings # Project settings
# Rule: [major update].[feature update].[bug fix] # Rule: [major update].[feature update].[bug fix]
project_version=0.0.62.15 project_version=0.0.62.16
config_version=45 config_version=45
lang_version=25 lang_version=25
project_group=net.momirealms project_group=net.momirealms
@@ -50,7 +50,7 @@ byte_buddy_version=1.17.5
ahocorasick_version=0.6.3 ahocorasick_version=0.6.3
snake_yaml_version=2.5 snake_yaml_version=2.5
anti_grief_version=0.20 anti_grief_version=0.20
nms_helper_version=1.0.77 nms_helper_version=1.0.80
evalex_version=3.5.0 evalex_version=3.5.0
reactive_streams_version=1.0.4 reactive_streams_version=1.0.4
amazon_awssdk_version=2.33.1 amazon_awssdk_version=2.33.1