diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/skript/SkriptHook.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/skript/SkriptHook.java index f227347e1..4318e2f29 100644 --- a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/skript/SkriptHook.java +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/skript/SkriptHook.java @@ -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(); } } diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/skript/condition/CondIsBlockCustomBlock.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/skript/condition/CondIsCustomBlock.java similarity index 90% rename from bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/skript/condition/CondIsBlockCustomBlock.java rename to bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/skript/condition/CondIsCustomBlock.java index c26bfabb9..1f40970fa 100644 --- a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/skript/condition/CondIsBlockCustomBlock.java +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/skript/condition/CondIsCustomBlock.java @@ -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) expressions[0]; setNegated(matchedPattern > 1); - return false; + return true; } } diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/skript/condition/CondIsFurniture.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/skript/condition/CondIsFurniture.java new file mode 100644 index 000000000..00f3f7ad6 --- /dev/null +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/skript/condition/CondIsFurniture.java @@ -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 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) expressions[0]; + setNegated(matchedPattern > 1); + return true; + } +} diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/skript/effect/EffPlaceCustomBlock.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/skript/effect/EffPlaceCustomBlock.java index 2594ffb55..70f6df975 100644 --- a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/skript/effect/EffPlaceCustomBlock.java +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/skript/effect/EffPlaceCustomBlock.java @@ -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") diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/skript/effect/EffPlaceFurniture.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/skript/effect/EffPlaceFurniture.java new file mode 100644 index 000000000..5972298e8 --- /dev/null +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/skript/effect/EffPlaceFurniture.java @@ -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 furniture; + private Expression 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) expressions[0]; + locations = Direction.combine((Expression) expressions[1], (Expression) expressions[2]); + return true; + } +} diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/skript/effect/EffRemoveFurniture.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/skript/effect/EffRemoveFurniture.java new file mode 100644 index 000000000..7458e21c8 --- /dev/null +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/skript/effect/EffRemoveFurniture.java @@ -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 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) expressions[0]; + return true; + } +} diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/skript/expression/ExprEntityFurnitureID.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/skript/expression/ExprEntityFurnitureID.java new file mode 100644 index 000000000..cae8fea3f --- /dev/null +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/skript/expression/ExprEntityFurnitureID.java @@ -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 { + + 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 getReturnType() { + return String.class; + } +} diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/WorldEditBlockRegister.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/WorldEditBlockRegister.java index 94c28ebea..2066c2bc1 100644 --- a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/WorldEditBlockRegister.java +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/WorldEditBlockRegister.java @@ -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); } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/BukkitAdaptors.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/BukkitAdaptors.java new file mode 100644 index 000000000..d49ca44c8 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/BukkitAdaptors.java @@ -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); + } +}