From 55283f5f1887fbd1133130b6ea82ed9e5f5da14a Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Fri, 25 Apr 2025 18:53:14 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=80=E7=82=B9=E5=B0=8F=E6=9B=B4=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../skript/classes/CraftEngineClasses.java | 58 +++++++++++++++++++ .../expression/ExprBlockCustomBlockID.java | 1 - .../bukkit/item/ComponentItemWrapper.java | 4 ++ .../factory/ComponentItemFactory1_20_5.java | 2 +- .../bukkit/plugin/BukkitCraftEngine.java | 1 - .../core/item/AbstractItemManager.java | 4 ++ .../modifier/RemoveComponentModifier.java | 36 ++++++++++++ 7 files changed, 103 insertions(+), 3 deletions(-) create mode 100644 core/src/main/java/net/momirealms/craftengine/core/item/modifier/RemoveComponentModifier.java diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/compatibility/skript/classes/CraftEngineClasses.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/compatibility/skript/classes/CraftEngineClasses.java index 3ede19963..30aa48e4b 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/compatibility/skript/classes/CraftEngineClasses.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/compatibility/skript/classes/CraftEngineClasses.java @@ -2,18 +2,55 @@ package net.momirealms.craftengine.bukkit.compatibility.skript.classes; import ch.njol.skript.classes.ClassInfo; import ch.njol.skript.classes.Parser; +import ch.njol.skript.classes.Serializer; import ch.njol.skript.lang.ParseContext; import ch.njol.skript.registrations.Classes; +import ch.njol.yggdrasil.Fields; import net.momirealms.craftengine.core.block.BlockStateParser; import net.momirealms.craftengine.core.block.ImmutableBlockState; import org.jetbrains.annotations.Nullable; +import java.io.StreamCorruptedException; + public class CraftEngineClasses { public static void register() { Classes.registerClass(new ClassInfo<>(ImmutableBlockState.class, "customblockstate") .user("custom block state") .name("Custom Block State") + .serializer(new Serializer<>() { + @Override + public Fields serialize(ImmutableBlockState o) { + Fields f = new Fields(); + f.putObject("customblockstate", o.toString()); + return f; + } + + @Override + public void deserialize(ImmutableBlockState o, Fields f) { + } + + @Override + public ImmutableBlockState deserialize(Fields f) throws StreamCorruptedException { + String data = f.getObject("customblockstate", String.class); + assert data != null; + try { + return BlockStateParser.deserialize(data); + } catch (IllegalArgumentException ex) { + throw new StreamCorruptedException("Invalid block data: " + data); + } + } + + @Override + public boolean mustSyncDeserialization() { + return true; + } + + @Override + protected boolean canBeInstantiated() { + return false; + } + }) .parser(new Parser<>() { @Override public String toString(ImmutableBlockState o, int flags) { @@ -31,5 +68,26 @@ public class CraftEngineClasses { } }) ); + +// Classes.registerClass(new ClassInfo<>(CustomBlock.class, "customblocks") +// .user("custom block") +// .name("Custom Block") +// .parser(new Parser<>() { +// @Override +// public String toString(CustomBlock o, int flags) { +// return o.id().toString(); +// } +// +// @Override +// public String toVariableNameString(CustomBlock o) { +// return "customblock:" + o.id(); +// } +// +// @Override +// public @Nullable CustomBlock parse(String s, ParseContext context) { +// return BuiltInRegistries.BLOCK.getValue(Key.of(s)); +// } +// }) +// ); } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/compatibility/skript/expression/ExprBlockCustomBlockID.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/compatibility/skript/expression/ExprBlockCustomBlockID.java index 6916df6a5..391318bec 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/compatibility/skript/expression/ExprBlockCustomBlockID.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/compatibility/skript/expression/ExprBlockCustomBlockID.java @@ -18,7 +18,6 @@ public class ExprBlockCustomBlockID extends SimplePropertyExpression { this.item.setAmount(count); } + public void removeComponent(Object type) { + FastNMS.INSTANCE.removeComponent(this.getLiteralObject(), ensureDataComponentType(type)); + } + public void resetComponent(Object type) { FastNMS.INSTANCE.resetComponent(this.getLiteralObject(), ensureDataComponentType(type)); } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/ComponentItemFactory1_20_5.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/ComponentItemFactory1_20_5.java index 205ec55a3..08cc98ec3 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/ComponentItemFactory1_20_5.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/ComponentItemFactory1_20_5.java @@ -93,7 +93,7 @@ public class ComponentItemFactory1_20_5 extends BukkitItemFactory extends AbstractModelGenerator impl Map data = MiscUtils.castToMap(obj, false); return new ComponentModifier<>(data); }, "components", "component"); + registerDataFunction((obj) -> { + List data = MiscUtils.getAsStringList(obj); + return new RemoveComponentModifier<>(data); + }, "remove-components", "remove-component"); } if (VersionHelper.isVersionNewerThan1_21()) { registerDataFunction((obj) -> { diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/RemoveComponentModifier.java b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/RemoveComponentModifier.java new file mode 100644 index 000000000..b44deeca0 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/RemoveComponentModifier.java @@ -0,0 +1,36 @@ +package net.momirealms.craftengine.core.item.modifier; + +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.item.ItemBuildContext; + +import java.util.Collections; +import java.util.List; + +public class RemoveComponentModifier implements ItemDataModifier { + private final List arguments; + + public RemoveComponentModifier(List arguments) { + this.arguments = arguments; + } + + public List arguments() { + return Collections.unmodifiableList(this.arguments); + } + + @Override + public String name() { + return "remove-components"; + } + + @Override + public void apply(Item item, ItemBuildContext context) { + for (String argument : arguments) { + item.removeComponent(argument); + } + } + + @Override + public void remove(Item item) { + // I can't guess + } +}