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:
@@ -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");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user