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

添加skript家具方法

This commit is contained in:
XiaoMoMi
2025-04-26 20:35:49 +08:00
parent 9182acbe79
commit f99a98a2eb
9 changed files with 221 additions and 8 deletions

View File

@@ -1,20 +1,28 @@
package net.momirealms.craftengine.bukkit.compatibility.skript;
import net.momirealms.craftengine.bukkit.compatibility.skript.clazz.CraftEngineClasses;
import net.momirealms.craftengine.bukkit.compatibility.skript.condition.CondIsBlockCustomBlock;
import net.momirealms.craftengine.bukkit.compatibility.skript.condition.CondIsCustomBlock;
import net.momirealms.craftengine.bukkit.compatibility.skript.condition.CondIsFurniture;
import net.momirealms.craftengine.bukkit.compatibility.skript.effect.EffPlaceCustomBlock;
import net.momirealms.craftengine.bukkit.compatibility.skript.effect.EffPlaceFurniture;
import net.momirealms.craftengine.bukkit.compatibility.skript.effect.EffRemoveFurniture;
import net.momirealms.craftengine.bukkit.compatibility.skript.event.EvtCustomBlock;
import net.momirealms.craftengine.bukkit.compatibility.skript.expression.ExprBlockCustomBlockID;
import net.momirealms.craftengine.bukkit.compatibility.skript.expression.ExprBlockCustomBlockState;
import net.momirealms.craftengine.bukkit.compatibility.skript.expression.ExprEntityFurnitureID;
public class SkriptHook {
public static void register() {
CraftEngineClasses.register();
EvtCustomBlock.register();
CondIsBlockCustomBlock.register();
CondIsCustomBlock.register();
CondIsFurniture.register();
ExprBlockCustomBlockID.register();
ExprBlockCustomBlockState.register();
ExprEntityFurnitureID.register();
EffPlaceCustomBlock.register();
EffPlaceFurniture.register();
EffRemoveFurniture.register();
}
}

View File

@@ -11,10 +11,10 @@ import org.bukkit.block.Block;
import org.bukkit.event.Event;
import org.jetbrains.annotations.Nullable;
public class CondIsBlockCustomBlock extends Condition {
public class CondIsCustomBlock extends Condition {
public static void register() {
Skript.registerCondition(CondIsBlockCustomBlock.class,
Skript.registerCondition(CondIsCustomBlock.class,
"%blocks% (is|are) custom block(s)",
"%blocks% (is|are)(n't| not) custom block(s)");
}
@@ -36,6 +36,6 @@ public class CondIsBlockCustomBlock extends Condition {
public boolean init(Expression<?>[] expressions, int matchedPattern, Kleenean isDelayed, SkriptParser.ParseResult parseResult) {
blocks = (Expression<Block>) expressions[0];
setNegated(matchedPattern > 1);
return false;
return true;
}
}

View File

@@ -0,0 +1,41 @@
package net.momirealms.craftengine.bukkit.compatibility.skript.condition;
import ch.njol.skript.Skript;
import ch.njol.skript.conditions.base.PropertyCondition;
import ch.njol.skript.lang.Condition;
import ch.njol.skript.lang.Expression;
import ch.njol.skript.lang.SkriptParser;
import ch.njol.util.Kleenean;
import net.momirealms.craftengine.bukkit.api.CraftEngineFurniture;
import org.bukkit.entity.Entity;
import org.bukkit.event.Event;
import org.jetbrains.annotations.Nullable;
public class CondIsFurniture extends Condition {
public static void register() {
Skript.registerCondition(CondIsFurniture.class,
"%entities% (is|are) furniture",
"%entities% (is|are)(n't| not) furniture");
}
private Expression<Entity> entities;
@Override
public boolean check(Event event) {
return entities.check(event, CraftEngineFurniture::isFurniture, isNegated());
}
@Override
public String toString(@Nullable Event event, boolean debug) {
return PropertyCondition.toString(this, PropertyCondition.PropertyType.BE, event, debug, entities, "furniture");
}
@SuppressWarnings("unchecked")
@Override
public boolean init(Expression<?>[] expressions, int matchedPattern, Kleenean isDelayed, SkriptParser.ParseResult parseResult) {
entities = (Expression<Entity>) expressions[0];
setNegated(matchedPattern > 1);
return true;
}
}

View File

@@ -33,7 +33,7 @@ public class EffPlaceCustomBlock extends Effect {
@Override
public String toString(@Nullable Event event, boolean debug) {
return "place " + blocks.toString(event, debug) + " " + locations.toString(event, debug);
return "place custom block " + blocks.toString(event, debug) + " " + locations.toString(event, debug);
}
@SuppressWarnings("unchecked")

View File

@@ -0,0 +1,46 @@
package net.momirealms.craftengine.bukkit.compatibility.skript.effect;
import ch.njol.skript.Skript;
import ch.njol.skript.lang.Effect;
import ch.njol.skript.lang.Expression;
import ch.njol.skript.lang.SkriptParser;
import ch.njol.skript.util.Direction;
import ch.njol.util.Kleenean;
import net.momirealms.craftengine.bukkit.api.CraftEngineFurniture;
import net.momirealms.craftengine.core.util.Key;
import org.bukkit.Location;
import org.bukkit.event.Event;
import org.jetbrains.annotations.Nullable;
public class EffPlaceFurniture extends Effect {
public static void register() {
Skript.registerEffect(EffPlaceFurniture.class, "place furniture %strings% [%directions% %locations%]");
}
private Expression<String> furniture;
private Expression<Location> locations;
@Override
protected void execute(Event e) {
String[] os = furniture.getArray(e);
for (Location l : locations.getArray(e)) {
for (String o : os) {
CraftEngineFurniture.place(l, Key.of(o));
}
}
}
@Override
public String toString(@Nullable Event event, boolean debug) {
return "place furniture " + furniture.toString(event, debug) + " " + locations.toString(event, debug);
}
@SuppressWarnings("unchecked")
@Override
public boolean init(Expression<?>[] expressions, int matchedPattern, Kleenean isDelayed, SkriptParser.ParseResult parseResult) {
furniture = (Expression<String>) expressions[0];
locations = Direction.combine((Expression<? extends Direction>) expressions[1], (Expression<? extends Location>) expressions[2]);
return true;
}
}

View File

@@ -0,0 +1,48 @@
package net.momirealms.craftengine.bukkit.compatibility.skript.effect;
import ch.njol.skript.Skript;
import ch.njol.skript.lang.Effect;
import ch.njol.skript.lang.Expression;
import ch.njol.skript.lang.SkriptParser;
import ch.njol.skript.util.Direction;
import ch.njol.util.Kleenean;
import net.momirealms.craftengine.bukkit.api.CraftEngineFurniture;
import net.momirealms.craftengine.bukkit.entity.furniture.LoadedFurniture;
import net.momirealms.craftengine.core.util.Key;
import org.bukkit.Location;
import org.bukkit.entity.Entity;
import org.bukkit.event.Event;
import org.jetbrains.annotations.Nullable;
public class EffRemoveFurniture extends Effect {
public static void register() {
Skript.registerEffect(EffRemoveFurniture.class, "remove furniture %entities%");
}
private Expression<Entity> entities;
@Override
protected void execute(Event e) {
for (Entity entity : entities.getArray(e)) {
if (CraftEngineFurniture.isFurniture(entity)) {
LoadedFurniture loadedFurniture = CraftEngineFurniture.getLoadedFurnitureByBaseEntity(entity);
if (loadedFurniture != null) {
loadedFurniture.destroy();
}
}
}
}
@Override
public String toString(@Nullable Event event, boolean debug) {
return "remove furniture " + entities.toString(event, debug);
}
@SuppressWarnings("unchecked")
@Override
public boolean init(Expression<?>[] expressions, int matchedPattern, Kleenean isDelayed, SkriptParser.ParseResult parseResult) {
this.entities = (Expression<Entity>) expressions[0];
return true;
}
}

View File

@@ -0,0 +1,38 @@
package net.momirealms.craftengine.bukkit.compatibility.skript.expression;
import ch.njol.skript.expressions.base.SimplePropertyExpression;
import net.momirealms.craftengine.bukkit.api.CraftEngineBlocks;
import net.momirealms.craftengine.bukkit.api.CraftEngineFurniture;
import net.momirealms.craftengine.core.block.CustomBlock;
import net.momirealms.craftengine.core.block.ImmutableBlockState;
import org.bukkit.block.Block;
import org.bukkit.block.data.BlockData;
import org.bukkit.entity.Entity;
import org.jetbrains.annotations.Nullable;
import java.util.Objects;
import java.util.Optional;
public class ExprEntityFurnitureID extends SimplePropertyExpression<Object, String> {
public static void register() {
register(ExprEntityFurnitureID.class, String.class, "entity[ ]furniture id", "entities");
}
@Override
public @Nullable String convert(Object object) {
if (object instanceof Entity entity && CraftEngineFurniture.isFurniture(entity))
return Objects.requireNonNull(CraftEngineFurniture.getLoadedFurnitureByBaseEntity(entity)).id().toString();
return null;
}
@Override
protected String getPropertyName() {
return "furniture id";
}
@Override
public Class<? extends String> getReturnType() {
return String.class;
}
}

View File

@@ -25,7 +25,7 @@ public class WorldEditBlockRegister {
private final boolean isFAWE;
public WorldEditBlockRegister(AbstractBlockManager manager, boolean isFAWE) {
field$BlockType$blockMaterial = ReflectionUtils.getDeclaredField(BlockType.class, "blockMaterial");
this.field$BlockType$blockMaterial = ReflectionUtils.getDeclaredField(BlockType.class, "blockMaterial");
this.manager = manager;
this.isFAWE = isFAWE;
CEBlockParser blockParser = new CEBlockParser(WorldEdit.getInstance());
@@ -34,7 +34,7 @@ public class WorldEditBlockRegister {
public void register(Key id) throws ReflectiveOperationException {
BlockType blockType = new BlockType(id.toString(), blockState -> blockState);
field$BlockType$blockMaterial.set(blockType, LazyReference.from(() -> new BukkitBlockRegistry.BukkitBlockMaterial(null, Material.STONE)));
this.field$BlockType$blockMaterial.set(blockType, LazyReference.from(() -> new BukkitBlockRegistry.BukkitBlockMaterial(null, Material.STONE)));
BlockType.REGISTRY.register(id.toString(), blockType);
}

View File

@@ -0,0 +1,32 @@
package net.momirealms.craftengine.bukkit.api;
import net.momirealms.craftengine.bukkit.entity.BukkitEntity;
import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine;
import net.momirealms.craftengine.bukkit.plugin.user.BukkitServerPlayer;
import net.momirealms.craftengine.bukkit.world.BukkitWorld;
import net.momirealms.craftengine.bukkit.world.BukkitWorldBlock;
import org.bukkit.World;
import org.bukkit.block.Block;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
public final class BukkitAdaptors {
private BukkitAdaptors() {}
public static BukkitServerPlayer adapt(final Player player) {
return BukkitCraftEngine.instance().adapt(player);
}
public static BukkitWorld adapt(final World world) {
return new BukkitWorld(world);
}
public static BukkitEntity adapt(final Entity entity) {
return new BukkitEntity(entity);
}
public static BukkitWorldBlock adapt(final Block block) {
return new BukkitWorldBlock(block);
}
}