9
0
mirror of https://github.com/Xiao-MoMi/craft-engine.git synced 2026-01-03 14:22:25 +00:00

重写Skript处理Custom Item的相关语句

This commit is contained in:
Catnies
2025-08-08 12:33:26 +08:00
parent 0c0301ef8f
commit 307724077a
3 changed files with 122 additions and 57 deletions

View File

@@ -1,41 +1,65 @@
package net.momirealms.craftengine.bukkit.compatibility.skript.condition;
import ch.njol.skript.Skript;
import ch.njol.skript.aliases.ItemType;
import ch.njol.skript.conditions.base.PropertyCondition;
import ch.njol.skript.doc.Description;
import ch.njol.skript.doc.Name;
import ch.njol.skript.doc.Since;
import ch.njol.skript.lang.Condition;
import ch.njol.skript.lang.Expression;
import ch.njol.skript.lang.SkriptParser;
import ch.njol.skript.util.slot.Slot;
import ch.njol.util.Kleenean;
import net.momirealms.craftengine.bukkit.api.CraftEngineItems;
import org.bukkit.event.Event;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.Nullable;
@Name("Is CraftEngine Item")
@Description({"Checks if the Item is CraftEngine item."})
@Since("1.0")
public class CondIsCustomItem extends Condition {
public static void register() {
Skript.registerCondition(CondIsCustomItem.class,
"%itemstacks% (is|are) custom item(s)",
"%itemstacks% (is|are)(n't| not) custom item(s)");
"%itemstack/itemtype/slot% (is [a[n]]|are) (custom|ce|craft-engine) item[s]",
"%itemstack/itemtype/slot% (isn't|is not|aren't|are not) [a[n]] (custom|ce|craft-engine) item[s]"
);
}
private Expression<ItemStack> items;
@Override
public boolean check(Event event) {
return items.check(event, CraftEngineItems::isCustomItem, isNegated());
}
@Override
public String toString(@Nullable Event event, boolean debug) {
return PropertyCondition.toString(this, PropertyCondition.PropertyType.BE, event, debug, items, "itemstack");
}
private Expression<?> item;
@SuppressWarnings("unchecked")
@Override
public boolean init(Expression<?>[] expressions, int matchedPattern, Kleenean isDelayed, SkriptParser.ParseResult parseResult) {
items = (Expression<ItemStack>) expressions[0];
setNegated(matchedPattern > 1);
item = expressions[0];
setNegated(matchedPattern == 1);
return true;
}
@Override
public boolean check(Event event) {
Object single = item.getSingle(event);
ItemStack checkItemStack = null;
if (single instanceof ItemType itemType) {
checkItemStack = itemType.getTypes().getFirst().getStack();
} else if (single instanceof ItemStack itemStack) {
checkItemStack = itemStack;
} else if (single instanceof Slot slot) {
checkItemStack = slot.getItem();
}
if (checkItemStack == null) return isNegated() ? true : false;
boolean exists = CraftEngineItems.isCustomItem(checkItemStack);
if (!exists) return isNegated() ? true : false;
return isNegated() ? false : true;
}
@Override
public String toString(@Nullable Event event, boolean debug) {
return PropertyCondition.toString(this, PropertyCondition.PropertyType.BE, event, debug, item, "itemtypes");
}
}

View File

@@ -1,6 +1,10 @@
package net.momirealms.craftengine.bukkit.compatibility.skript.expression;
import ch.njol.skript.Skript;
import ch.njol.skript.aliases.ItemType;
import ch.njol.skript.doc.Description;
import ch.njol.skript.doc.Name;
import ch.njol.skript.doc.Since;
import ch.njol.skript.lang.Expression;
import ch.njol.skript.lang.ExpressionType;
import ch.njol.skript.lang.SkriptParser;
@@ -14,29 +18,44 @@ import org.bukkit.event.Event;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.Nullable;
public class ExprCustomItem extends SimpleExpression<ItemStack> {
import java.util.ArrayList;
import java.util.List;
@Name("CraftEngine Item")
@Description({"Get CraftEngine items."})
@Since("1.0")
public class ExprCustomItem extends SimpleExpression<ItemType> {
public static void register() {
Skript.registerExpression(ExprCustomItem.class, ItemStack.class, ExpressionType.SIMPLE, "[(the|a)] custom item [with id] %string%");
Skript.registerExpression(ExprCustomItem.class, ItemType.class, ExpressionType.SIMPLE, "[(the|a)] (custom|ce|craft-engine) item [with [namespace] id] %strings%");
}
private Expression<String> itemId;
private Expression<?> itemIds;
@Override
@SuppressWarnings("unchecked")
public boolean init(Expression<?>[] exprs, int matchedPattern, Kleenean isDelayed, SkriptParser.ParseResult parseResult) {
itemId = (Expression<String>) exprs[0];
itemIds = exprs[0];
return true;
}
@Override
@Nullable
protected ItemStack[] get(Event e) {
String itemId = this.itemId.getSingle(e);
if (itemId == null)
return null;
CustomItem<ItemStack> customItem = CraftEngineItems.byId(Key.of(itemId));
return customItem == null ? null : new ItemStack[] {customItem.buildItemStack(ItemBuildContext.EMPTY)};
protected ItemType[] get(Event event) {
Object[] objects = itemIds.getArray(event);
List<ItemType> items = new ArrayList<>();
for (Object object : objects) {
if (object instanceof String string) {
CustomItem<ItemStack> customItem = CraftEngineItems.byId(Key.of(string));
if (customItem != null) {
ItemType itemType = new ItemType(customItem.buildItemStack(ItemBuildContext.EMPTY));
items.add(itemType);
}
}
}
return items.toArray(new ItemType[0]);
}
@Override
@@ -45,12 +64,12 @@ public class ExprCustomItem extends SimpleExpression<ItemStack> {
}
@Override
public Class<ItemStack> getReturnType() {
return ItemStack.class;
public Class<ItemType> getReturnType() {
return ItemType.class;
}
@Override
public String toString(@Nullable Event e, boolean debug) {
return "the custom item with id " + itemId.toString(e, debug);
return "craft-engine item with id " + itemIds.toString(e, debug);
}
}

View File

@@ -1,12 +1,18 @@
package net.momirealms.craftengine.bukkit.compatibility.skript.expression;
import ch.njol.skript.Skript;
import ch.njol.skript.aliases.ItemType;
import ch.njol.skript.classes.Changer;
import ch.njol.skript.expressions.base.SimplePropertyExpression;
import ch.njol.util.coll.CollectionUtils;
import ch.njol.skript.doc.Description;
import ch.njol.skript.doc.Name;
import ch.njol.skript.doc.Since;
import ch.njol.skript.lang.Expression;
import ch.njol.skript.lang.ExpressionType;
import ch.njol.skript.lang.SkriptParser;
import ch.njol.skript.lang.util.SimpleExpression;
import ch.njol.skript.util.slot.Slot;
import ch.njol.util.Kleenean;
import net.momirealms.craftengine.bukkit.api.CraftEngineItems;
import net.momirealms.craftengine.bukkit.item.BukkitItemManager;
import net.momirealms.craftengine.core.item.Item;
import net.momirealms.craftengine.core.util.Key;
import org.bukkit.event.Event;
import org.bukkit.inventory.ItemStack;
@@ -14,27 +20,52 @@ import org.jetbrains.annotations.Nullable;
import java.util.Optional;
public class ExprItemCustomItemID extends SimplePropertyExpression<Object, String> {
@Name("CraftEngine Item ID")
@Description({"Get CraftEngine item id."})
@Since("1.0")
public class ExprItemCustomItemID extends SimpleExpression<String> {
public static void register() {
register(ExprItemCustomItemID.class, String.class, "custom item id", "itemstacks/itemtypes");
Skript.registerExpression(ExprItemCustomItemID.class, String.class, ExpressionType.PROPERTY,
"(custom|ce|craft-engine) item [namespace] id of %itemstack/itemtype/slot%",
"%itemstack/itemtype/slot%'[s] (custom|ce|craft-engine) item [namespace] id"
);
}
private Expression<?> itemStackExpr;
@Override
public boolean init(Expression<?>[] exprs, int matchedPattern, Kleenean isDelayed, SkriptParser.ParseResult parseResult) {
itemStackExpr = exprs[0];
return true;
}
@Override
public @Nullable String convert(Object object) {
if (object instanceof ItemStack itemStack)
return Optional.ofNullable(CraftEngineItems.byItemStack(itemStack)).map(it -> it.id().toString()).orElse(null);
if (object instanceof ItemType itemType) {
ItemStack itemStack = new ItemStack(itemType.getMaterial());
itemStack.setItemMeta(itemType.getItemMeta());
return Optional.ofNullable(CraftEngineItems.byItemStack(itemStack)).map(it -> it.id().toString()).orElse(null);
protected String[] get(Event event) {
Object single = itemStackExpr.getSingle(event);
String result = null;
if (single instanceof ItemStack itemStack) {
result = Optional.of(itemStack).map(this::getCraftEngineItemId).orElse(null);
} else if (single instanceof ItemType itemType) {
result = Optional.ofNullable(itemType.getTypes().getFirst().getStack()).map(this::getCraftEngineItemId).orElse(null);
} else if (single instanceof Slot slot) {
result = Optional.ofNullable(slot.getItem()).map(this::getCraftEngineItemId).orElse(null);
}
return null;
return new String[] {result};
}
private String getCraftEngineItemId(ItemStack itemStack) {
return Optional.ofNullable(CraftEngineItems.getCustomItemId(itemStack))
.map(Key::asString)
.orElse(null);
}
@Override
protected String getPropertyName() {
return "custom item id";
public boolean isSingle() {
return itemStackExpr.isSingle();
}
@Override
@@ -42,23 +73,14 @@ public class ExprItemCustomItemID extends SimplePropertyExpression<Object, Strin
return String.class;
}
// 不需要处理 add, delete 等修改操作
@Override
public Class<?>[] acceptChange(Changer.ChangeMode mode) {
return CollectionUtils.array(String.class);
return null;
}
@Override
public void change(Event e, @Nullable Object[] delta, Changer.ChangeMode mode) {
Key id = Key.of((String) delta[0]);
for (Object item : getExpr().getArray(e)) {
if (item instanceof ItemStack itemStack) {
Item<ItemStack> item1 = BukkitItemManager.instance().wrap(itemStack);
Item<ItemStack> item2 = BukkitItemManager.instance().createWrappedItem(id, null);
item1.merge(item2);
} else if (item instanceof ItemType itemType) {
Item<ItemStack> item2 = BukkitItemManager.instance().createWrappedItem(id, null);
itemType.setItemMeta(item2.getItem().getItemMeta());
}
}
public String toString(@Nullable Event event, boolean debug) {
return "craft-engine item ID of " + itemStackExpr.toString(event, debug);
}
}