diff --git a/src/main/java/ch/njol/skript/classes/data/BukkitClasses.java b/src/main/java/ch/njol/skript/classes/data/BukkitClasses.java index 7089b80c64a..9081353ab21 100644 --- a/src/main/java/ch/njol/skript/classes/data/BukkitClasses.java +++ b/src/main/java/ch/njol/skript/classes/data/BukkitClasses.java @@ -146,80 +146,6 @@ protected boolean canBeInstantiated() { } }).cloner(BlockData::clone)); - Classes.registerClass(new ClassInfo<>(World.class, "world") - .user("worlds?") - .name("World") - .description("One of the server's worlds. Worlds can be put into scripts by surrounding their name with double quotes, e.g. \"world_nether\", " + - "but this might not work reliably as text uses the same syntax.") - .usage("\"world_name\", e.g. \"world\"") - .examples("broadcast \"Hello!\" to the world \"world_nether\"") - .since("1.0, 2.2 (alternate syntax)") - .after("string") - .defaultExpression(new EventValueExpression<>(World.class)) - .parser(new Parser() { - @SuppressWarnings("null") - private final Pattern parsePattern = Pattern.compile("(?:(?:the )?world )?\"(.+)\"", Pattern.CASE_INSENSITIVE); - - @Override - @Nullable - public World parse(final String s, final ParseContext context) { - // REMIND allow shortcuts '[over]world', 'nether' and '[the_]end' (server.properties: 'level-name=world') // inconsistent with 'world is "..."' - if (context == ParseContext.COMMAND || context == ParseContext.PARSE || context == ParseContext.CONFIG) - return Bukkit.getWorld(s); - final Matcher m = parsePattern.matcher(s); - if (m.matches()) - return Bukkit.getWorld(m.group(1)); - return null; - } - - @Override - public String toString(World world, int flags) { - return world.getName(); - } - - @Override - public String toVariableNameString(World world) { - return world.getName(); - } - }).serializer(new Serializer<>() { - @Override - public Fields serialize(World world) { - return Fields.singletonObject("name", world.getName()); - } - - @Override - public boolean canBeInstantiated() { - return false; - } - - @Override - protected World deserialize(Fields fields) throws StreamCorruptedException { - String name = fields.getObject("name", String.class); - assert name != null; - World world = Bukkit.getWorld(name); - if (world == null) - throw new StreamCorruptedException("Missing world " + name); - return world; - } - - // return w.getName(); - @Override - @Nullable - public World deserialize(final String s) { - return Bukkit.getWorld(s); - } - - @Override - public boolean mustSyncDeserialization() { - return true; - } - }) - .property(Property.NAME, - "A world's name, as text. Cannot be changed.", - Skript.instance(), - ExpressionPropertyHandler.of(World::getName, String.class) - )); - Classes.registerClass(new EnumClassInfo<>(InventoryAction.class, "inventoryaction", "inventory actions") .user("inventory ?actions?") .name("Inventory Action") @@ -535,12 +461,6 @@ public String toVariableNameString(FireworkEffect effect) { } })); - Classes.registerClass(new EnumClassInfo<>(Difficulty.class, "difficulty", "difficulties") - .user("difficult(y|ies)") - .name("Difficulty") - .description("The difficulty of a world.") - .since("2.3")); - Classes.registerClass(new EnumClassInfo<>(Status.class, "resourcepackstate", "resource pack states") .user("resource ?pack ?states?") .name("Resource Pack State") @@ -609,19 +529,6 @@ public String[] getPatterns() { "NOTE: Minecraft namespaces are supported, ex: 'minecraft:generic.attack_damage'.") .since("2.5")); - Classes.registerClass(new EnumClassInfo<>(Environment.class, "environment", "environments") - .user("(world ?)?environments?") - .name("World Environment") - .description("Represents the environment of a world.") - .since("2.7")); - - if (Skript.classExists("io.papermc.paper.world.MoonPhase")) - Classes.registerClass(new EnumClassInfo<>(MoonPhase.class, "moonphase", "moon phases") - .user("(lunar|moon) ?phases?") - .name("Moon Phase") - .description("Represents the phase of a moon.") - .since("2.7")); - if (Skript.classExists("org.bukkit.event.player.PlayerQuitEvent$QuitReason")) Classes.registerClass(new EnumClassInfo<>(QuitReason.class, "quitreason", "quit reasons") .user("(quit|disconnect) ?(reason|cause)s?") diff --git a/src/main/java/ch/njol/skript/classes/data/BukkitEventValues.java b/src/main/java/ch/njol/skript/classes/data/BukkitEventValues.java index 8f615650611..e66eec1ce47 100644 --- a/src/main/java/ch/njol/skript/classes/data/BukkitEventValues.java +++ b/src/main/java/ch/njol/skript/classes/data/BukkitEventValues.java @@ -79,8 +79,7 @@ public final class BukkitEventValues { private static final ItemStack AIR_IS = new ItemStack(Material.AIR); public static void register(EventValueRegistry registry) { - // === WorldEvents === - registry.register(EventValue.simple(WorldEvent.class, World.class, WorldEvent::getWorld)); + // StructureGrowEvent - a WorldEvent registry.register(EventValue.simple(StructureGrowEvent.class, Block.class, event -> event.getLocation().getBlock())); @@ -103,10 +102,6 @@ public static void register(EventValueRegistry registry) { .toArray(Block[]::new)) .time(Time.FUTURE) .build()); - // WeatherEvent - not a WorldEvent (wtf ô_Ô) - registry.register(EventValue.simple(WeatherEvent.class, World.class, WeatherEvent::getWorld)); - // ChunkEvents - registry.register(EventValue.simple(ChunkEvent.class, Chunk.class, ChunkEvent::getChunk)); // === BlockEvents === registry.register(EventValue.simple(BlockEvent.class, Block.class, BlockEvent::getBlock)); @@ -301,8 +296,6 @@ public PotionEffectType convert(AreaEffectCloudApplyEvent event) { })); // ItemSpawnEvent registry.register(EventValue.simple(ItemSpawnEvent.class, ItemStack.class, event -> event.getEntity().getItemStack())); - // LightningStrikeEvent - registry.register(EventValue.simple(LightningStrikeEvent.class, Entity.class, LightningStrikeEvent::getLightning)); // EndermanAttackPlayerEvent if (Skript.classExists("com.destroystokyo.paper.event.entity.EndermanAttackPlayerEvent")) { registry.register(EventValue.simple(EndermanAttackPlayerEvent.class, Player.class, EndermanAttackPlayerEvent::getPlayer)); @@ -554,14 +547,7 @@ else if (hand == EquipmentSlot.OFF_HAND) registry.register(EventValue.simple(InventoryPickupItemEvent.class, Inventory.class, InventoryPickupItemEvent::getInventory)); registry.register(EventValue.simple(InventoryPickupItemEvent.class, Item.class, InventoryPickupItemEvent::getItem)); registry.register(EventValue.simple(InventoryPickupItemEvent.class, ItemStack.class, event -> event.getItem().getItemStack())); - //PortalCreateEvent - registry.register(EventValue.simple(PortalCreateEvent.class, World.class, WorldEvent::getWorld)); - registry.register(EventValue.simple(PortalCreateEvent.class, Block[].class, event -> event.getBlocks().stream() - .map(BlockState::getBlock) - .toArray(Block[]::new))); - if (Skript.methodExists(PortalCreateEvent.class, "getEntity")) { // Minecraft 1.14+ - registry.register(EventValue.simple(PortalCreateEvent.class, Entity.class, PortalCreateEvent::getEntity)); - } + //PlayerEditBookEvent registry.register(EventValue.builder(PlayerEditBookEvent.class, ItemStack.class) .getter(event -> { diff --git a/src/main/java/ch/njol/skript/classes/data/DefaultComparators.java b/src/main/java/ch/njol/skript/classes/data/DefaultComparators.java index 9dee9a86b63..30594dd975d 100644 --- a/src/main/java/ch/njol/skript/classes/data/DefaultComparators.java +++ b/src/main/java/ch/njol/skript/classes/data/DefaultComparators.java @@ -367,19 +367,6 @@ public boolean supportsOrdering() { // OfflinePlayer - UUID Comparators.registerComparator(OfflinePlayer.class, UUID.class, (player, uuid) -> Relation.get(player.getUniqueId().equals(uuid))); - // World - String - Comparators.registerComparator(World.class, String.class, new Comparator() { - @Override - public Relation compare(World w, String name) { - return Relation.get(w.getName().equalsIgnoreCase(name)); - } - - @Override - public boolean supportsOrdering() { - return false; - } - }); - // String - String Comparators.registerComparator(String.class, String.class, new Comparator() { @Override diff --git a/src/main/java/ch/njol/skript/conditions/CondPvP.java b/src/main/java/ch/njol/skript/conditions/CondPvP.java index 254b802dbab..0fa0750ebe1 100644 --- a/src/main/java/ch/njol/skript/conditions/CondPvP.java +++ b/src/main/java/ch/njol/skript/conditions/CondPvP.java @@ -14,6 +14,8 @@ import org.bukkit.event.Event; import org.jetbrains.annotations.Nullable; +import static org.skriptlang.skript.lang.script.ScriptWarning.printDeprecationWarning; + @Name("PvP") @Description("Checks the PvP state of a world.") @Example("PvP is enabled") diff --git a/src/main/java/ch/njol/skript/effects/EffPvP.java b/src/main/java/ch/njol/skript/effects/EffPvP.java index d786fbdc854..da55d83b7f7 100644 --- a/src/main/java/ch/njol/skript/effects/EffPvP.java +++ b/src/main/java/ch/njol/skript/effects/EffPvP.java @@ -14,6 +14,8 @@ import org.bukkit.event.Event; import org.jetbrains.annotations.Nullable; +import static org.skriptlang.skript.lang.script.ScriptWarning.printDeprecationWarning; + @Name("PvP") @Description("Set the PvP state for a given world.") @Example("enable PvP #(current world only)") diff --git a/src/main/java/ch/njol/skript/effects/EffWorldLoad.java b/src/main/java/ch/njol/skript/effects/EffWorldLoad.java deleted file mode 100644 index 08078d821aa..00000000000 --- a/src/main/java/ch/njol/skript/effects/EffWorldLoad.java +++ /dev/null @@ -1,80 +0,0 @@ -package ch.njol.skript.effects; - -import ch.njol.skript.Skript; -import ch.njol.skript.doc.Description; -import ch.njol.skript.doc.Example; -import ch.njol.skript.doc.Name; -import ch.njol.skript.doc.Since; -import ch.njol.skript.lang.Effect; -import ch.njol.skript.lang.Expression; -import ch.njol.skript.lang.SkriptParser.ParseResult; -import ch.njol.util.Kleenean; -import org.bukkit.Bukkit; -import org.bukkit.World; -import org.bukkit.World.Environment; -import org.bukkit.WorldCreator; -import org.bukkit.event.Event; -import org.jetbrains.annotations.Nullable; - -@Name("Load World") -@Description({ - "Load your worlds or unload your worlds", - "The load effect will create a new world if world doesn't already exist.", - "When attempting to load a normal vanilla world you must define it's environment i.e \"world_nether\" must be loaded with nether environment" -}) -@Example("load world \"world_nether\" with environment nether") -@Example("load the world \"myCustomWorld\"") -@Example("unload \"world_nether\"") -@Example("unload \"world_the_end\" without saving") -@Example("unload all worlds") -@Since("2.8.0") -public class EffWorldLoad extends Effect { - - static { - Skript.registerEffect(EffWorldLoad.class, - "load [the] world[s] %strings% [with environment %-environment%]", - "unload [[the] world[s]] %worlds% [:without saving]" - ); - } - - private boolean save, load; - private Expression worlds; - @Nullable - private Expression environment; - - @Override - @SuppressWarnings("unchecked") - public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { - worlds = exprs[0]; - load = matchedPattern == 0; - if (load) { - environment = (Expression) exprs[1]; - } else { - save = !parseResult.hasTag("without saving"); - } - return true; - } - - @Override - protected void execute(Event event) { - Environment environment = this.environment != null ? this.environment.getSingle(event) : null; - for (Object world : worlds.getArray(event)) { - if (load && world instanceof String) { - WorldCreator worldCreator = new WorldCreator((String) world); - if (environment != null) - worldCreator.environment(environment); - worldCreator.createWorld(); - } else if (!load && world instanceof World) { - Bukkit.unloadWorld((World) world, save); - } - } - } - - @Override - public String toString(@Nullable Event event, boolean debug) { - if (load) - return "load the world(s) " + worlds.toString(event, debug) + (environment == null ? "" : " with environment " + environment.toString(event, debug)); - return "unload the world(s) " + worlds.toString(event, debug) + " " + (save ? "with saving" : "without saving"); - } - -} diff --git a/src/main/java/ch/njol/skript/events/EvtWeatherChange.java b/src/main/java/ch/njol/skript/events/EvtWeatherChange.java deleted file mode 100644 index e01ac20c1c3..00000000000 --- a/src/main/java/ch/njol/skript/events/EvtWeatherChange.java +++ /dev/null @@ -1,54 +0,0 @@ -package ch.njol.skript.events; - -import ch.njol.skript.Skript; -import ch.njol.skript.lang.Literal; -import ch.njol.skript.lang.SkriptEvent; -import ch.njol.skript.lang.SkriptParser.ParseResult; -import ch.njol.skript.util.WeatherType; -import ch.njol.util.coll.CollectionUtils; -import org.bukkit.event.Event; -import org.bukkit.event.weather.ThunderChangeEvent; -import org.bukkit.event.weather.WeatherChangeEvent; -import org.jetbrains.annotations.Nullable; - -import java.util.function.Predicate; - -/** - * @author Peter Güttinger - */ -@SuppressWarnings("unchecked") -public class EvtWeatherChange extends SkriptEvent { - static { - Skript.registerEvent("Weather Change", EvtWeatherChange.class, CollectionUtils.array(WeatherChangeEvent.class, ThunderChangeEvent.class), "weather change [to %-weathertypes%]") - .description("Called when a world's weather changes.") - .examples("on weather change:", "on weather change to sunny:") - .since("1.0"); - } - - @Nullable - private Literal types; - - @Override - public boolean init(final Literal[] args, final int matchedPattern, final ParseResult parser) { - types = (Literal) args[0]; - return true; - } - - @SuppressWarnings("null") - @Override - public boolean check(final Event e) { - if (types == null) - return true; - if (!(e instanceof WeatherChangeEvent || e instanceof ThunderChangeEvent)) - return false; - final boolean rain = e instanceof WeatherChangeEvent ? ((WeatherChangeEvent) e).toWeatherState() : ((ThunderChangeEvent) e).getWorld().hasStorm(); - final boolean thunder = e instanceof ThunderChangeEvent ? ((ThunderChangeEvent) e).toThunderState() : ((WeatherChangeEvent) e).getWorld().isThundering(); - return types.check(e, t -> t.isWeather(rain, thunder)); - } - - @Override - public String toString(final @Nullable Event e, final boolean debug) { - return "weather change" + (types == null ? "" : " to " + types); - } - -} diff --git a/src/main/java/ch/njol/skript/events/EvtWorld.java b/src/main/java/ch/njol/skript/events/EvtWorld.java deleted file mode 100644 index 82d8bc9a12e..00000000000 --- a/src/main/java/ch/njol/skript/events/EvtWorld.java +++ /dev/null @@ -1,78 +0,0 @@ -package ch.njol.skript.events; - -import ch.njol.skript.Skript; -import ch.njol.skript.lang.Literal; -import ch.njol.skript.lang.LiteralList; -import ch.njol.skript.lang.SkriptEvent; -import ch.njol.skript.lang.SkriptParser.ParseResult; -import org.bukkit.World; -import org.bukkit.event.Event; -import org.bukkit.event.world.WorldInitEvent; -import org.bukkit.event.world.WorldLoadEvent; -import org.bukkit.event.world.WorldSaveEvent; -import org.bukkit.event.world.WorldUnloadEvent; -import org.bukkit.event.world.WorldEvent; -import org.jetbrains.annotations.Nullable; - -public class EvtWorld extends SkriptEvent { - - static { - // World Save Event - Skript.registerEvent("World Save", EvtWorld.class, WorldSaveEvent.class, "world sav(e|ing) [of %-worlds%]") - .description("Called when a world is saved to disk. Usually all worlds are saved simultaneously, but world management plugins could change this.") - .examples( - "on world save of \"world\":", - "\tbroadcast \"The world %event-world% has been saved\"") - .since("1.0, 2.8.0 (defining worlds)"); - - // World Init Event - Skript.registerEvent("World Init", EvtWorld.class, WorldInitEvent.class, "world init[ialization] [of %-worlds%]") - .description("Called when a world is initialized. As all default worlds are initialized before", - "any scripts are loaded, this event is only called for newly created worlds.", - "World management plugins might change the behaviour of this event though.") - .examples("on world init of \"world_the_end\":") - .since("1.0, 2.8.0 (defining worlds)"); - - // World Unload Event - Skript.registerEvent("World Unload", EvtWorld.class, WorldUnloadEvent.class, "world unload[ing] [of %-worlds%]") - .description("Called when a world is unloaded. This event will never be called if you don't have a world management plugin.") - .examples( - "on world unload:", - "\tbroadcast \"the %event-world% has been unloaded!\"") - .since("1.0, 2.8.0 (defining worlds)"); - - // World Load Event - Skript.registerEvent("World Load", EvtWorld.class, WorldLoadEvent.class, "world load[ing] [of %-worlds%]") - .description("Called when a world is loaded. As with the world init event, this event will not be called for the server's default world(s).") - .examples( - "on world load of \"world_nether\":", - "\tbroadcast \"The world %event-world% has been loaded!\"") - .since("1.0, 2.8.0 (defining worlds)"); - } - - private Literal worlds; - - @Override - @SuppressWarnings("unchecked") - public boolean init(Literal[] args, int matchedPattern, ParseResult parseResult) { - worlds = (Literal) args[0]; - if (worlds instanceof LiteralList && worlds.getAnd()) { - ((LiteralList) worlds).invertAnd(); - } - return true; - } - - @Override - public boolean check(Event event) { - if (worlds == null) - return true; - World evtWorld = ((WorldEvent) event).getWorld(); - return worlds.check(event, world -> world.equals(evtWorld)); - } - - @Override - public String toString(@Nullable Event event, boolean debug) { - return "world save/init/unload/load" + (worlds == null ? "" : " of " + worlds.toString(event,debug)); - } - -} diff --git a/src/main/java/ch/njol/skript/events/SimpleEvents.java b/src/main/java/ch/njol/skript/events/SimpleEvents.java index c06ba440459..ab6b17bb3ab 100644 --- a/src/main/java/ch/njol/skript/events/SimpleEvents.java +++ b/src/main/java/ch/njol/skript/events/SimpleEvents.java @@ -87,18 +87,6 @@ public class SimpleEvents { .description("Called when a new block forms as a result of a block that can spread, e.g. water or mushrooms.") .examples("on spread:") .since("1.0"); - Skript.registerEvent("Chunk Load", SimpleEvent.class, ChunkLoadEvent.class, "chunk load[ing]") - .description("Called when a chunk loads. The chunk might or might not contain mobs when it's loaded.") - .examples("on chunk load:") - .since("1.0"); - Skript.registerEvent("Chunk Generate", SimpleEvent.class, ChunkPopulateEvent.class, "chunk (generat|populat)(e|ing)") - .description("Called after a new chunk was generated.") - .examples("on chunk generate:") - .since("1.0"); - Skript.registerEvent("Chunk Unload", SimpleEvent.class, ChunkUnloadEvent.class, "chunk unload[ing]") - .description("Called when a chunk is unloaded due to not being near any player.") - .examples("on chunk unload:") - .since("1.0"); Skript.registerEvent("Creeper Power", SimpleEvent.class, CreeperPowerEvent.class, "creeper power") .description("Called when a creeper is struck by lighting and gets powered. Cancel the event to prevent the creeper from being powered.") .examples("on creeper power:") @@ -137,10 +125,6 @@ public class SimpleEvents { .description("Called when a leaf block decays due to not being connected to a tree.") .examples("on leaves decay:") .since("1.0"); - Skript.registerEvent("Lightning Strike", SimpleEvent.class, LightningStrikeEvent.class, "lightning [strike]") - .description("Called when lightning strikes.") - .examples("on lightning:", "\tspawn a zombie at location of event-entity") - .since("1.0"); Skript.registerEvent("Pig Zap", SimpleEvent.class, PigZapEvent.class, "pig[ ]zap") .description("Called when a pig is stroke by lightning and transformed into a zombie pigman. Cancel the event to prevent the transformation.") .examples("on pig zap:") @@ -221,12 +205,6 @@ public class SimpleEvents { " player is not sprinting", " send \"Run!\"") .since("1.0"); - Skript.registerEvent("Portal Create", SimpleEvent.class, PortalCreateEvent.class, "portal creat(e|ion)") - .description("Called when a portal is created, either by a player or mob lighting an obsidian frame on fire, or by a nether portal creating its teleportation target in the nether/overworld.", - "In Minecraft 1.14+, you can use the player in this event.", "Please note that there may not always be a player (or other entity) in this event.") - .examples("on portal create:") - .requiredPlugins("Minecraft 1.14+ (event-entity support)") - .since("1.0, 2.5.3 (event-entity support)"); Skript.registerEvent("Projectile Hit", SimpleEvent.class, ProjectileHitEvent.class, "projectile hit") .description("Called when a projectile hits an entity or a block.") .examples("on projectile hit:", @@ -251,11 +229,6 @@ public class SimpleEvents { " line 2 is empty", " set line 1 to \"<red>%line 1%\"") .since("1.0"); - Skript.registerEvent("Spawn Change", SimpleEvent.class, SpawnChangeEvent.class, "[world] spawn change") - .description("Called when the spawn point of a world changes.") - .examples("on spawn change:", - "\tbroadcast \"someone changed the spawn!\"") - .since("1.0"); Skript.registerEvent("Vehicle Create", SimpleEvent.class, VehicleCreateEvent.class, "vehicle create", "creat(e|ing|ion of) [a] vehicle") .description("Called when a new vehicle is created, e.g. when a player places a boat or minecart.") .examples("on vehicle create:") diff --git a/src/main/java/ch/njol/skript/expressions/ExprDifficulty.java b/src/main/java/ch/njol/skript/expressions/ExprDifficulty.java deleted file mode 100644 index c7fed7180c3..00000000000 --- a/src/main/java/ch/njol/skript/expressions/ExprDifficulty.java +++ /dev/null @@ -1,63 +0,0 @@ -package ch.njol.skript.expressions; - -import org.bukkit.Difficulty; -import org.bukkit.World; -import org.bukkit.event.Event; -import org.jetbrains.annotations.Nullable; - -import ch.njol.skript.classes.Changer.ChangeMode; -import ch.njol.skript.doc.Description; -import ch.njol.skript.doc.Example; -import ch.njol.skript.doc.Name; -import ch.njol.skript.doc.Since; -import ch.njol.skript.expressions.base.SimplePropertyExpression; -import ch.njol.util.coll.CollectionUtils; - -@Name("Difficulty") -@Description("The difficulty of a world.") -@Example("set the difficulty of \"world\" to hard") -@Since("2.3") -public class ExprDifficulty extends SimplePropertyExpression { - - static { - register(ExprDifficulty.class, Difficulty.class, "difficult(y|ies)", "worlds"); - } - - @Override - @Nullable - public Difficulty convert(World world) { - return world.getDifficulty(); - } - - @Override - @Nullable - public Class[] acceptChange(ChangeMode mode) { - if (mode == ChangeMode.SET) - return CollectionUtils.array(Difficulty.class); - return null; - } - - @Override - public void change(Event e, @Nullable Object[] delta, ChangeMode mode) { - if (delta == null) - return; - - Difficulty difficulty = (Difficulty) delta[0]; - for (World world : getExpr().getArray(e)) { - world.setDifficulty(difficulty); - if (difficulty != Difficulty.PEACEFUL) - world.setSpawnFlags(true, world.getAllowAnimals()); // Force enable spawn monsters as changing difficulty won't change this by itself - } - } - - @Override - protected String getPropertyName() { - return "difficulty"; - } - - @Override - public Class getReturnType() { - return Difficulty.class; - } - -} \ No newline at end of file diff --git a/src/main/java/ch/njol/skript/expressions/ExprSeed.java b/src/main/java/ch/njol/skript/expressions/ExprSeed.java deleted file mode 100644 index 40a7be055ea..00000000000 --- a/src/main/java/ch/njol/skript/expressions/ExprSeed.java +++ /dev/null @@ -1,53 +0,0 @@ -package ch.njol.skript.expressions; - -import ch.njol.skript.Skript; -import ch.njol.skript.doc.Description; -import ch.njol.skript.doc.Example; -import ch.njol.skript.doc.Name; -import ch.njol.skript.doc.Since; -import ch.njol.skript.expressions.base.PropertyExpression; -import ch.njol.skript.lang.Expression; -import ch.njol.skript.lang.ExpressionType; -import ch.njol.skript.lang.SkriptParser.ParseResult; -import ch.njol.skript.registrations.Classes; -import ch.njol.util.Kleenean; -import org.bukkit.World; -import org.bukkit.event.Event; -import org.bukkit.generator.WorldInfo; -import org.jetbrains.annotations.Nullable; - -@Name("World Seed") -@Description("The seed of given world. Note that it will be returned as Minecraft internally treats seeds, not as you specified it in world configuration.") -@Example("broadcast \"Seed: %seed of player's world%\"") -@Since("2.2-dev35") -public class ExprSeed extends PropertyExpression { - - static { - Skript.registerExpression(ExprSeed.class, Long.class, ExpressionType.PROPERTY, "[the] seed[s] (from|of) %worlds%", "%worlds%'[s] seed[s]"); - } - - @SuppressWarnings({"null", "unchecked"}) - @Override - public boolean init(final Expression[] exprs, final int matchedPattern, final Kleenean isDelayed, final ParseResult parser) { - setExpr((Expression) exprs[0]); - return true; - } - - @Override - protected Long[] get(final Event event, final World[] source) { - return get(source, WorldInfo::getSeed); - } - - @Override - public Class getReturnType() { - return Long.class; - } - - @Override - public String toString(final @Nullable Event event, final boolean debug) { - if (event == null) - return "the seed of " + getExpr().toString(event, debug); - return Classes.getDebugMessage(getAll(event)); - } - -} diff --git a/src/main/java/ch/njol/skript/expressions/ExprWorlds.java b/src/main/java/ch/njol/skript/expressions/ExprWorlds.java deleted file mode 100644 index 5130c6beff4..00000000000 --- a/src/main/java/ch/njol/skript/expressions/ExprWorlds.java +++ /dev/null @@ -1,69 +0,0 @@ -package ch.njol.skript.expressions; - -import java.util.Iterator; - -import org.bukkit.Bukkit; -import org.bukkit.World; -import org.bukkit.event.Event; -import org.jetbrains.annotations.Nullable; - -import ch.njol.skript.Skript; -import ch.njol.skript.doc.Description; -import ch.njol.skript.doc.Example; -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.ParseResult; -import ch.njol.skript.lang.util.SimpleExpression; -import ch.njol.util.Kleenean; - -/** - * @author Peter Güttinger - */ -@Name("Worlds") -@Description("All worlds of the server, useful for looping.") -@Example(""" - loop all worlds: - broadcast "You're in %loop-world%" to loop-world - """) -@Since("1.0") -public class ExprWorlds extends SimpleExpression { - - static { - Skript.registerExpression(ExprWorlds.class, World.class, ExpressionType.SIMPLE, "[(all [[of] the]|the)] worlds"); - } - - @Override - public boolean init(final Expression[] exprs, final int matchedPattern, final Kleenean isDelayed, final ParseResult parseResult) { - return true; - } - - @Override - public boolean isSingle() { - return false; - } - - @Override - public Class getReturnType() { - return World.class; - } - - @Override - @Nullable - protected World[] get(final Event e) { - return Bukkit.getWorlds().toArray(new World[0]); - } - - @Override - @Nullable - public Iterator iterator(final Event e) { - return Bukkit.getWorlds().iterator(); - } - - @Override - public String toString(final @Nullable Event e, final boolean debug) { - return "worlds"; - } - -} diff --git a/src/main/java/org/skriptlang/skript/bukkit/BukkitModule.java b/src/main/java/org/skriptlang/skript/bukkit/BukkitModule.java index ffa8d4bab03..dc8d591e25a 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/BukkitModule.java +++ b/src/main/java/org/skriptlang/skript/bukkit/BukkitModule.java @@ -24,7 +24,7 @@ import org.skriptlang.skript.bukkit.tags.TagModule; import org.skriptlang.skript.bukkit.text.TextModule; import org.skriptlang.skript.bukkit.types.*; -import org.skriptlang.skript.bukkit.worldborder.elements.WorldBorderModule; +import org.skriptlang.skript.bukkit.world.WorldModule; import java.util.List; @@ -56,7 +56,7 @@ public Iterable children() { new PotionModule(this), new TagModule(this), new TextModule(this), - new WorldBorderModule(this) + new WorldModule(this) ); } diff --git a/src/main/java/org/skriptlang/skript/bukkit/world/WorldClassInfo.java b/src/main/java/org/skriptlang/skript/bukkit/world/WorldClassInfo.java new file mode 100644 index 00000000000..05736e4a268 --- /dev/null +++ b/src/main/java/org/skriptlang/skript/bukkit/world/WorldClassInfo.java @@ -0,0 +1,112 @@ +package org.skriptlang.skript.bukkit.world; + +import ch.njol.skript.Skript; +import ch.njol.skript.classes.ClassInfo; +import ch.njol.skript.classes.Parser; +import ch.njol.skript.classes.Serializer; +import ch.njol.skript.expressions.base.EventValueExpression; +import ch.njol.skript.lang.ParseContext; +import ch.njol.yggdrasil.Fields; +import org.bukkit.Bukkit; +import org.bukkit.World; +import org.jetbrains.annotations.Nullable; +import org.skriptlang.skript.lang.properties.Property; +import org.skriptlang.skript.lang.properties.handlers.base.ExpressionPropertyHandler; + +import java.io.StreamCorruptedException; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class WorldClassInfo extends ClassInfo { + + public WorldClassInfo() { + super(World.class, "world"); + this.user("worlds?") + .name("World") + .description(""" + One of the server's worlds. Worlds can be put into scripts by surrounding their name with double quotes, e.g.\s + "world_nether" and it will be converted to a world if valid. + """) + .usage(""" + "world_name", e.g. "world" + """) + .examples(""" + broadcast "Hello!" to the world "world_nether" + """) + .since("1.0, 2.2 (alternate syntax)") + .after("string") + .serializer(new WorldSerializer()) + .parser(new WorldParser()) + .supplier(() -> Bukkit.getWorlds().iterator()) + .property(Property.NAME, + "A world's name, as text. Cannot be changed.", + Skript.instance(), + ExpressionPropertyHandler.of(World::getName, String.class) + ) + .defaultExpression(new EventValueExpression<>(World.class)); + } + + private static class WorldParser extends Parser { + // + + private final Pattern parsePattern = Pattern.compile("(?:(?:the )?world )?\"(.+)\"", Pattern.CASE_INSENSITIVE); + + @Override + public @Nullable World parse(String string, ParseContext context) { + // REMIND allow shortcuts '[over]world', 'nether' and '[the_]end' (server.properties: 'level-name=world') // inconsistent with 'world is "..."' + if (context == ParseContext.COMMAND || context == ParseContext.PARSE || context == ParseContext.CONFIG) + return Bukkit.getWorld(string); + Matcher matcher = parsePattern.matcher(string); + if (matcher.matches()) + return Bukkit.getWorld(matcher.group(1)); + return null; + } + + @Override + public String toString(World world, int flags) { + return world.getName(); + } + + @Override + public String toVariableNameString(World world) { + return world.getName(); + } + + // + } + + private static class WorldSerializer extends Serializer { + // + @Override + public Fields serialize(World world) { + return Fields.singletonObject("name", world.getName()); + } + + @Override + public void deserialize(World world, Fields fields) { + assert false; + } + + @Override + protected World deserialize(Fields fields) throws StreamCorruptedException { + String name = fields.getObject("name", String.class); + assert name != null; + World world = Bukkit.getWorld(name); + if (world == null) + throw new StreamCorruptedException("Missing world " + name); + return world; + } + + @Override + public boolean mustSyncDeserialization() { + return true; + } + + @Override + public boolean canBeInstantiated() { + return false; + } + // + } + +} diff --git a/src/main/java/org/skriptlang/skript/bukkit/world/WorldModule.java b/src/main/java/org/skriptlang/skript/bukkit/world/WorldModule.java new file mode 100644 index 00000000000..eec6c2327d2 --- /dev/null +++ b/src/main/java/org/skriptlang/skript/bukkit/world/WorldModule.java @@ -0,0 +1,89 @@ +package org.skriptlang.skript.bukkit.world; + +import ch.njol.skript.classes.EnumClassInfo; +import ch.njol.skript.registrations.Classes; +import io.papermc.paper.world.MoonPhase; +import org.bukkit.Difficulty; +import org.bukkit.World; +import org.skriptlang.skript.addon.AddonModule; +import org.skriptlang.skript.addon.HierarchicalAddonModule; +import org.skriptlang.skript.addon.SkriptAddon; +import org.skriptlang.skript.bukkit.lang.eventvalue.EventValueRegistry; +import org.skriptlang.skript.bukkit.world.elements.effects.EffLoadWorld; +import org.skriptlang.skript.bukkit.world.elements.effects.EffSaveWorld; +import org.skriptlang.skript.bukkit.world.elements.events.*; +import org.skriptlang.skript.bukkit.world.elements.expressions.*; +import org.skriptlang.skript.bukkit.world.worldborder.elements.WorldBorderModule; +import org.skriptlang.skript.lang.comparator.Comparators; +import org.skriptlang.skript.lang.comparator.Relation; +import org.skriptlang.skript.registration.SyntaxRegistry; + +import java.util.List; + +public class WorldModule extends HierarchicalAddonModule { + + public WorldModule(AddonModule parentModule) { + super(parentModule); + } + + public Iterable children() { + return List.of(new WorldBorderModule(this)); + } + + @Override + protected void initSelf(SkriptAddon addon) { + Classes.registerClass(new WorldClassInfo()); + Comparators.registerComparator(World.class, String.class, (world, name) -> Relation.get(world.getName().equalsIgnoreCase(name))); + + Classes.registerClass(new EnumClassInfo<>(World.Environment.class, "environment", "environments") + .user("(world ?)?environments?") + .name("World Environment") + .description("Represents the environment of a world.") + .since("2.7")); + + Classes.registerClass(new EnumClassInfo<>(Difficulty.class, "difficulty", "difficulties") + .user("difficult(y|ies)") + .name("Difficulty") + .description("The difficulty of a world.") + .since("2.3")); + + Classes.registerClass(new EnumClassInfo<>(MoonPhase.class, "moonphase", "moon phases") + .user("(lunar|moon) ?phases?") + .name("Moon Phase") + .description("Represents the phase of a moon in a world.") + .since("2.7")); + } + + @Override + protected void loadSelf(SkriptAddon addon) { + SyntaxRegistry syntaxRegistry = moduleRegistry(addon); + EventValueRegistry eventValueRegistry = addon.registry(EventValueRegistry.class); + + WorldEvents.register(syntaxRegistry, eventValueRegistry); + EvtWeatherChange.register(syntaxRegistry, eventValueRegistry); + + register(addon, + EvtWorldInit::register, + EvtWorldLoad::register, + EvtWorldSave::register, + EvtWorldUnload::register, + EffLoadWorld::register, + EffSaveWorld::register, + ExprDifficulty::register, + ExprGameRule::register, + ExprMoonPhase::register, + ExprSeaLevel::register, + ExprWorld::register, + ExprWorldEnvironment::register, + ExprWorldFromName::register, + ExprWorldSeed::register, + ExprWorldSpawn::register + ); + } + + @Override + public String name() { + return "world"; + } + +} diff --git a/src/main/java/org/skriptlang/skript/bukkit/world/elements/effects/EffLoadWorld.java b/src/main/java/org/skriptlang/skript/bukkit/world/elements/effects/EffLoadWorld.java new file mode 100644 index 00000000000..38687459c96 --- /dev/null +++ b/src/main/java/org/skriptlang/skript/bukkit/world/elements/effects/EffLoadWorld.java @@ -0,0 +1,91 @@ +package org.skriptlang.skript.bukkit.world.elements.effects; + +import ch.njol.skript.doc.Description; +import ch.njol.skript.doc.Example; +import ch.njol.skript.doc.Name; +import ch.njol.skript.doc.Since; +import ch.njol.skript.lang.Effect; +import ch.njol.skript.lang.Expression; +import ch.njol.skript.lang.SkriptParser.ParseResult; +import ch.njol.skript.lang.SyntaxStringBuilder; +import ch.njol.util.Kleenean; +import org.bukkit.Bukkit; +import org.bukkit.World; +import org.bukkit.World.Environment; +import org.bukkit.WorldCreator; +import org.bukkit.event.Event; +import org.jetbrains.annotations.Nullable; +import org.skriptlang.skript.registration.SyntaxInfo; +import org.skriptlang.skript.registration.SyntaxRegistry; + +@Name("Load World") +@Description(""" + Allows you to load or unload a world. + Note that if you use `load` a new world will be created if one does not exist with the provided name. + When attempting to load a normal vanilla world you must define it's environment i.e "world_nether" must be loaded with nether environment. + """) +@Example("load world \"world_nether\" with environment nether") +@Example("load the world \"myCustomWorld\"") +@Example("unload \"world_nether\"") +@Example("unload \"world_the_end\" without saving") +@Example("unload all worlds") +@Since("2.8.0") +public class EffLoadWorld extends Effect { + + public static void register(SyntaxRegistry syntaxRegistry) { + syntaxRegistry.register(SyntaxRegistry.EFFECT, SyntaxInfo.builder(EffLoadWorld.class) + .supplier(EffLoadWorld::new) + .addPatterns( + "load [the] world[s] %strings% [with environment %-environment%]", + "unload [[the] world[s]] %worlds% [:without saving]" + ) + .build()); + } + + private boolean save, load; + private Expression worlds; + private @Nullable Expression environment; + + @Override + @SuppressWarnings("unchecked") + public boolean init(Expression[] expressions, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { + worlds = expressions[0]; + load = matchedPattern == 0; + if (load) { + environment = (Expression) expressions[1]; + } else { + save = !parseResult.hasTag("without saving"); + } + return true; + } + + @Override + protected void execute(Event event) { + Environment environment = null; + if (this.environment != null) + environment = this.environment.getSingle(event); + + for (Object world : worlds.getArray(event)) { + if (load && world instanceof String string) { + WorldCreator worldCreator = new WorldCreator(string); + if (environment != null) + worldCreator.environment(environment); + worldCreator.createWorld(); + } else if (!load && world instanceof World unloadWorld) { + Bukkit.unloadWorld(unloadWorld, save); + } + } + } + + @Override + public String toString(@Nullable Event event, boolean debug) { + return new SyntaxStringBuilder(event, debug) + .append(load ? "load" : "unload") + .append("the world(s)", worlds) + .appendIf(!save, "without saving") + .appendIf(environment != null, "with environment", environment) + .toString(); + } + +} + diff --git a/src/main/java/ch/njol/skript/effects/EffWorldSave.java b/src/main/java/org/skriptlang/skript/bukkit/world/elements/effects/EffSaveWorld.java similarity index 52% rename from src/main/java/ch/njol/skript/effects/EffWorldSave.java rename to src/main/java/org/skriptlang/skript/bukkit/world/elements/effects/EffSaveWorld.java index 88bcefabbfd..72d52a8efb1 100644 --- a/src/main/java/ch/njol/skript/effects/EffWorldSave.java +++ b/src/main/java/org/skriptlang/skript/bukkit/world/elements/effects/EffSaveWorld.java @@ -1,6 +1,5 @@ -package ch.njol.skript.effects; +package org.skriptlang.skript.bukkit.world.elements.effects; -import ch.njol.skript.Skript; import ch.njol.skript.doc.Description; import ch.njol.skript.doc.Example; import ch.njol.skript.doc.Name; @@ -12,27 +11,32 @@ import org.bukkit.World; import org.bukkit.event.Event; import org.jetbrains.annotations.Nullable; +import org.skriptlang.skript.registration.SyntaxInfo; +import org.skriptlang.skript.registration.SyntaxRegistry; @Name("Save World") -@Description({ - "Save all worlds or a given world manually.", - "Note: saving many worlds at once may possibly cause the server to freeze." -}) +@Description(""" + Save all worlds or a given world manually. + Note: saving many worlds at once may possibly cause the server to freeze. + """) @Example("save \"world_nether\"") @Example("save all worlds") @Since("2.8.0") -public class EffWorldSave extends Effect { +public class EffSaveWorld extends Effect { - static { - Skript.registerEffect(EffWorldSave.class, "save [[the] world[s]] %worlds%"); + public static void register(SyntaxRegistry syntaxRegistry) { + syntaxRegistry.register(SyntaxRegistry.EFFECT, SyntaxInfo.builder(EffSaveWorld.class) + .supplier(EffSaveWorld::new) + .addPattern("save [[the] world[s]] %worlds%") + .build()); } private Expression worlds; @Override @SuppressWarnings("unchecked") - public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { - worlds = (Expression) exprs[0]; + public boolean init(Expression[] expressions, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { + worlds = (Expression) expressions[0]; return true; } diff --git a/src/main/java/org/skriptlang/skript/bukkit/world/elements/events/EvtWeatherChange.java b/src/main/java/org/skriptlang/skript/bukkit/world/elements/events/EvtWeatherChange.java new file mode 100644 index 00000000000..affd4cfeac4 --- /dev/null +++ b/src/main/java/org/skriptlang/skript/bukkit/world/elements/events/EvtWeatherChange.java @@ -0,0 +1,95 @@ +package org.skriptlang.skript.bukkit.world.elements.events; + +import ch.njol.skript.lang.Literal; +import ch.njol.skript.lang.LiteralList; +import ch.njol.skript.lang.SkriptEvent; +import ch.njol.skript.lang.SkriptParser.ParseResult; +import ch.njol.skript.lang.SyntaxStringBuilder; +import ch.njol.skript.util.WeatherType; +import ch.njol.util.coll.CollectionUtils; +import org.bukkit.World; +import org.bukkit.event.Event; +import org.bukkit.event.weather.ThunderChangeEvent; +import org.bukkit.event.weather.WeatherChangeEvent; +import org.bukkit.event.weather.WeatherEvent; +import org.jetbrains.annotations.Nullable; +import org.skriptlang.skript.bukkit.lang.eventvalue.EventValue; +import org.skriptlang.skript.bukkit.lang.eventvalue.EventValueRegistry; +import org.skriptlang.skript.bukkit.registration.BukkitSyntaxInfos; +import org.skriptlang.skript.registration.SyntaxRegistry; + +public class EvtWeatherChange extends SkriptEvent { + + public static void register(SyntaxRegistry syntaxRegistry, EventValueRegistry eventValueRegistry) { + syntaxRegistry.register(BukkitSyntaxInfos.Event.KEY, BukkitSyntaxInfos.Event.builder(EvtWeatherChange.class, "Weather Change") + .supplier(EvtWeatherChange::new) + .addEvents(CollectionUtils.array(WeatherChangeEvent.class, ThunderChangeEvent.class)) + .addPatterns("weather change[[d] to %-weathertypes%]") + .addDescription("Called when a world's weather changes.") + .addExample(""" + on weather change to rain in world "example": + broadcast "Its now raining!" to all players in world "example" + """) + .addExample(""" + on weather change to storm: + broadcast "A storm is coming!" + """) + .addSince("1.0") + .build()); + + // Not a world event for some reason + eventValueRegistry.register(EventValue.builder(WeatherEvent.class, World.class) + .getter(WeatherEvent::getWorld) + .build()); + } + + private @Nullable Literal weatherType; + + @Override + @SuppressWarnings("unchecked") + public boolean init(Literal[] args, int matchedPattern, ParseResult parseResult) { + if (args[0] != null) { + weatherType = (Literal) args[0]; + if (weatherType.getAnd() && weatherType instanceof LiteralList list) + list.invertAnd(); + } + return true; + } + + @Override + public boolean check(Event event) { + if (weatherType == null) + return true; + + World world; + + world = switch (event) { + case WeatherChangeEvent weatherEvent -> weatherEvent.getWorld(); + case ThunderChangeEvent thunderEvent -> thunderEvent.getWorld(); + default -> null; + }; + + boolean rain; + boolean thunder; + if (event instanceof WeatherChangeEvent weatherEvent) { + rain = weatherEvent.toWeatherState(); + thunder = world.isThundering(); + } else if (event instanceof ThunderChangeEvent thunderEvent) { + rain = world.hasStorm(); + thunder = thunderEvent.toThunderState(); + } else { + return false; + } + + return weatherType.check(event, weather -> weather.isWeather(rain, thunder)); + } + + @Override + public String toString(@Nullable Event event, boolean debug) { + return new SyntaxStringBuilder(event, debug) + .append("weather change") + .appendIf(weatherType != null,"to", weatherType) + .toString(); + } + +} diff --git a/src/main/java/org/skriptlang/skript/bukkit/world/elements/events/EvtWorldInit.java b/src/main/java/org/skriptlang/skript/bukkit/world/elements/events/EvtWorldInit.java new file mode 100644 index 00000000000..bc647347591 --- /dev/null +++ b/src/main/java/org/skriptlang/skript/bukkit/world/elements/events/EvtWorldInit.java @@ -0,0 +1,72 @@ +package org.skriptlang.skript.bukkit.world.elements.events; + +import ch.njol.skript.lang.Literal; +import ch.njol.skript.lang.LiteralList; +import ch.njol.skript.lang.SkriptEvent; +import ch.njol.skript.lang.SkriptParser.ParseResult; +import ch.njol.skript.lang.SyntaxStringBuilder; +import org.bukkit.World; +import org.bukkit.event.Event; +import org.bukkit.event.world.WorldInitEvent; +import org.jetbrains.annotations.Nullable; +import org.skriptlang.skript.bukkit.registration.BukkitSyntaxInfos; +import org.skriptlang.skript.registration.SyntaxRegistry; + +public class EvtWorldInit extends SkriptEvent { + + public static void register(SyntaxRegistry syntaxRegistry) { + syntaxRegistry.register(BukkitSyntaxInfos.Event.KEY, BukkitSyntaxInfos.Event.builder(EvtWorldInit.class, "World Initialize") + .supplier(EvtWorldInit::new) + .addEvent(WorldInitEvent.class) + .addPatterns("world init[ialization] [of %-worlds%]") + .addDescription(""" + Called when a world is initialized. + As all default worlds are initialized before any scripts are loaded,\s + this event is only called for newly created worlds. + Note that world management plugins might change the behavior of this event. + """) + .addExample(""" + on world init: + broadcast "The world '%event-world%' is being initialized!" + """) + .addExample(""" + on world init of "new_world: + broadcast "World 'new world' was just initialized!" + """) + .addSince("1.0") + .addSince("2.8.0 (defining worlds)") + .build()); + } + + private @Nullable Literal world; + + @Override + @SuppressWarnings("unchecked") + public boolean init(Literal[] args, int matchedPattern, ParseResult parseResult) { + if (args[0] != null) { + world = (Literal) args[0]; + if (world.getAnd() && world instanceof LiteralList list) + list.invertAnd(); + } + return true; + } + + @Override + public boolean check(Event event) { + if (world == null) + return true; + + WorldInitEvent worldEvent = (WorldInitEvent) event; + + return world.check(event, world -> world.equals(worldEvent.getWorld())); + } + + @Override + public String toString(@Nullable Event event, boolean debug) { + return new SyntaxStringBuilder(event, debug) + .append("world initialize") + .appendIf(world != null,"of", world) + .toString(); + } + +} diff --git a/src/main/java/org/skriptlang/skript/bukkit/world/elements/events/EvtWorldLoad.java b/src/main/java/org/skriptlang/skript/bukkit/world/elements/events/EvtWorldLoad.java new file mode 100644 index 00000000000..ba7638e7563 --- /dev/null +++ b/src/main/java/org/skriptlang/skript/bukkit/world/elements/events/EvtWorldLoad.java @@ -0,0 +1,71 @@ +package org.skriptlang.skript.bukkit.world.elements.events; + +import ch.njol.skript.lang.Literal; +import ch.njol.skript.lang.LiteralList; +import ch.njol.skript.lang.SkriptEvent; +import ch.njol.skript.lang.SkriptParser.ParseResult; +import ch.njol.skript.lang.SyntaxStringBuilder; +import org.bukkit.World; +import org.bukkit.event.Event; +import org.bukkit.event.world.WorldLoadEvent; +import org.jetbrains.annotations.Nullable; +import org.skriptlang.skript.bukkit.registration.BukkitSyntaxInfos; +import org.skriptlang.skript.registration.SyntaxRegistry; + +public class EvtWorldLoad extends SkriptEvent { + + public static void register(SyntaxRegistry syntaxRegistry) { + syntaxRegistry.register(BukkitSyntaxInfos.Event.KEY, BukkitSyntaxInfos.Event.builder(EvtWorldLoad.class, "World Load") + .supplier(EvtWorldLoad::new) + .addEvent(WorldLoadEvent.class) + .addPatterns("world load[ing] [of %-worlds%]") + .addDescription(""" + Called when a world is loaded. + As with the world init event, \ + this event will not be called for the server's default world(s). + """) + .addExample(""" + on world load: + broadcast "The world '%event-world%' is being loaded!" + """) + .addExample(""" + on world load of "world": + broadcast "The main world is being loaded!" + """) + .addSince("1.0") + .addSince("2.8.0 (defining worlds)") + .build()); + } + + private @Nullable Literal world; + + @Override + @SuppressWarnings("unchecked") + public boolean init(Literal[] args, int matchedPattern, ParseResult parseResult) { + if (args[0] != null) { + world = (Literal) args[0]; + if (world.getAnd() && world instanceof LiteralList list) + list.invertAnd(); + } + return true; + } + + @Override + public boolean check(Event event) { + if (world == null) + return true; + + WorldLoadEvent worldEvent = (WorldLoadEvent) event; + + return world.check(event, world -> world.equals(worldEvent.getWorld())); + } + + @Override + public String toString(@Nullable Event event, boolean debug) { + return new SyntaxStringBuilder(event, debug) + .append("world load") + .appendIf(world != null,"of", world) + .toString(); + } + +} diff --git a/src/main/java/org/skriptlang/skript/bukkit/world/elements/events/EvtWorldSave.java b/src/main/java/org/skriptlang/skript/bukkit/world/elements/events/EvtWorldSave.java new file mode 100644 index 00000000000..3a4a0d580ed --- /dev/null +++ b/src/main/java/org/skriptlang/skript/bukkit/world/elements/events/EvtWorldSave.java @@ -0,0 +1,71 @@ +package org.skriptlang.skript.bukkit.world.elements.events; + +import ch.njol.skript.lang.Literal; +import ch.njol.skript.lang.LiteralList; +import ch.njol.skript.lang.SkriptEvent; +import ch.njol.skript.lang.SkriptParser.ParseResult; +import ch.njol.skript.lang.SyntaxStringBuilder; +import org.bukkit.World; +import org.bukkit.event.Event; +import org.bukkit.event.world.WorldSaveEvent; +import org.jetbrains.annotations.Nullable; +import org.skriptlang.skript.bukkit.registration.BukkitSyntaxInfos; +import org.skriptlang.skript.registration.SyntaxRegistry; + +public class EvtWorldSave extends SkriptEvent { + + public static void register(SyntaxRegistry syntaxRegistry) { + syntaxRegistry.register(BukkitSyntaxInfos.Event.KEY, BukkitSyntaxInfos.Event.builder(EvtWorldSave.class, "World Save") + .supplier(EvtWorldSave::new) + .addEvent(WorldSaveEvent.class) + .addPatterns("world sav(e|ing) [of %-worlds%]") + .addDescription(""" + Called when a world is saved to disk. + Usually all worlds are saved simultaneously, \ + but world management plugins could change this. + """) + .addExample(""" + on world save: + broadcast "The world '%event-world%' is getting saved!" + """) + .addExample(""" + on world save of "world": + broadcast "The main world is being saved!" + """) + .addSince("1.0") + .addSince("2.8.0 (defining worlds)") + .build()); + } + + private @Nullable Literal world; + + @Override + @SuppressWarnings("unchecked") + public boolean init(Literal[] args, int matchedPattern, ParseResult parseResult) { + if (args[0] != null) { + world = (Literal) args[0]; + if (world.getAnd() && world instanceof LiteralList list) + list.invertAnd(); + } + return true; + } + + @Override + public boolean check(Event event) { + if (world == null) + return true; + + WorldSaveEvent worldEvent = (WorldSaveEvent) event; + + return world.check(event, world -> world.equals(worldEvent.getWorld())); + } + + @Override + public String toString(@Nullable Event event, boolean debug) { + return new SyntaxStringBuilder(event, debug) + .append("world save") + .appendIf(world != null,"of", world) + .toString(); + } + +} diff --git a/src/main/java/org/skriptlang/skript/bukkit/world/elements/events/EvtWorldUnload.java b/src/main/java/org/skriptlang/skript/bukkit/world/elements/events/EvtWorldUnload.java new file mode 100644 index 00000000000..7f490a313af --- /dev/null +++ b/src/main/java/org/skriptlang/skript/bukkit/world/elements/events/EvtWorldUnload.java @@ -0,0 +1,71 @@ +package org.skriptlang.skript.bukkit.world.elements.events; + +import ch.njol.skript.lang.Literal; +import ch.njol.skript.lang.LiteralList; +import ch.njol.skript.lang.SkriptEvent; +import ch.njol.skript.lang.SkriptParser.ParseResult; +import ch.njol.skript.lang.SyntaxStringBuilder; +import org.bukkit.World; +import org.bukkit.event.Event; +import org.bukkit.event.world.WorldUnloadEvent; +import org.jetbrains.annotations.Nullable; +import org.skriptlang.skript.bukkit.registration.BukkitSyntaxInfos; +import org.skriptlang.skript.registration.SyntaxRegistry; + +public class EvtWorldUnload extends SkriptEvent { + + public static void register(SyntaxRegistry syntaxRegistry) { + syntaxRegistry.register(BukkitSyntaxInfos.Event.KEY, BukkitSyntaxInfos.Event.builder(EvtWorldUnload.class, "World Unload") + .supplier(EvtWorldUnload::new) + .addEvent(WorldUnloadEvent.class) + .addPatterns("world unload[ing] [of %-worlds%]") + .addDescription(""" + Called when a world is unloaded. + Note that event will never be called if you don't have something that handles worlds at runtime,\s + e.g. a world management plugin + """) + .addExample(""" + on world unload: + broadcast "The world '%event-world%' is getting unloaded!" + """) + .addExample(""" + on world unload of "world": + broadcast "The main world is being unloaded!" + """) + .addSince("1.0") + .addSince("2.8.0 (defining worlds)") + .build()); + } + + private @Nullable Literal world; + + @Override + @SuppressWarnings("unchecked") + public boolean init(Literal[] args, int matchedPattern, ParseResult parseResult) { + if (args[0] != null) { + world = (Literal) args[0]; + if (world.getAnd() && world instanceof LiteralList list) + list.invertAnd(); + } + return true; + } + + @Override + public boolean check(Event event) { + if (world == null) + return true; + + WorldUnloadEvent worldEvent = (WorldUnloadEvent) event; + + return world.check(event, world -> world.equals(worldEvent.getWorld())); + } + + @Override + public String toString(@Nullable Event event, boolean debug) { + return new SyntaxStringBuilder(event, debug) + .append("world unload") + .appendIf(world != null,"of", world) + .toString(); + } + +} diff --git a/src/main/java/org/skriptlang/skript/bukkit/world/elements/events/WorldEvents.java b/src/main/java/org/skriptlang/skript/bukkit/world/elements/events/WorldEvents.java new file mode 100644 index 00000000000..908163117bd --- /dev/null +++ b/src/main/java/org/skriptlang/skript/bukkit/world/elements/events/WorldEvents.java @@ -0,0 +1,144 @@ +package org.skriptlang.skript.bukkit.world.elements.events; + +import ch.njol.skript.lang.util.SimpleEvent; +import org.bukkit.Chunk; +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.block.BlockState; +import org.bukkit.entity.Entity; +import org.bukkit.event.weather.LightningStrikeEvent; +import org.bukkit.event.world.*; +import org.skriptlang.skript.bukkit.lang.eventvalue.EventValue; +import org.skriptlang.skript.bukkit.lang.eventvalue.EventValueRegistry; +import org.skriptlang.skript.bukkit.registration.BukkitSyntaxInfos; +import org.skriptlang.skript.registration.SyntaxRegistry; + +public class WorldEvents { + + public static void register(SyntaxRegistry syntaxRegistry, EventValueRegistry eventValueRegistry) { + + // World Event Values + eventValueRegistry.register(EventValue.builder(WorldEvent.class, World.class) + .getter(WorldEvent::getWorld) + .build()); + + eventValueRegistry.register(EventValue.builder(ChunkEvent.class, Chunk.class) + .getter(ChunkEvent::getChunk) + .build()); + + syntaxRegistry.register( + BukkitSyntaxInfos.Event.KEY, + BukkitSyntaxInfos.Event.builder(SimpleEvent.class, "Chunk Load") + .addEvent(ChunkLoadEvent.class) + .addPatterns("chunk load[ing]") + .addDescription(""" + Called when a chunk loads. + Note that the chunk may have entities in it. + """) + .addExample(""" + on chunk load: + broadcast "A chunk has loaded!" + """) + .addSince("1.0") + .supplier(() -> new SimpleEvent("chunk load")) + .build() + ); + + syntaxRegistry.register( + BukkitSyntaxInfos.Event.KEY, + BukkitSyntaxInfos.Event.builder(SimpleEvent.class, "Chunk Unload") + .addEvent(ChunkUnloadEvent.class) + .addPatterns("chunk unload[ing]") + .addDescription("Called when a chunk is unloaded due to not being near any player.") + .addExample(""" + on chunk unload: + broadcast "A chunk is being unloaded!" + """) + .addSince("1.0") + .supplier(() -> new SimpleEvent("chunk unload")) + .build() + ); + + syntaxRegistry.register( + BukkitSyntaxInfos.Event.KEY, + BukkitSyntaxInfos.Event.builder(SimpleEvent.class, "Chunk Generate") + .addEvent(ChunkPopulateEvent.class) + .addPatterns("[on] chunk (generat|populat)(e|ing)") + .addDescription("Called after a chunk has been generated for first time.") + .addExample(""" + on chunk generate: + broadcast "A chunk has been newly generated!" + """) + .addSince("1.0") + .supplier(() -> new SimpleEvent("chunk generate")) + .build() + ); + + syntaxRegistry.register( + BukkitSyntaxInfos.Event.KEY, + BukkitSyntaxInfos.Event.builder(SimpleEvent.class, "World Spawn Change") + .addEvent(SpawnChangeEvent.class) + .addPatterns("[world] spawn change") + .addDescription("Called when the spawn point of a world changes.") + .addExample(""" + on world spawn change: + broadcast "Someone changed the world spawn!" + """) + .addSince("1.0") + .supplier(() -> new SimpleEvent("world spawn change")) + .build() + ); + + syntaxRegistry.register( + BukkitSyntaxInfos.Event.KEY, + BukkitSyntaxInfos.Event.builder(SimpleEvent.class, "Lightning Strike") + .addEvent(LightningStrikeEvent.class) + .addPatterns("lightning [strik(e|ing)]") + .addDescription("Called when lightning strikes in a world.") + .addExample(""" + on lightning strike: + spawn a zombie at event-entity + """) + .addSince("1.0") + .addSince("INSERT VERSION (pattern change)") + .supplier(() -> new SimpleEvent("lightning strike")) + .build() + ); + + eventValueRegistry.register(EventValue.builder(LightningStrikeEvent.class, Entity.class) + .getter(LightningStrikeEvent::getLightning) + .build()); + + syntaxRegistry.register( + BukkitSyntaxInfos.Event.KEY, + BukkitSyntaxInfos.Event.builder(SimpleEvent.class, "Portal Create") + .addEvent(PortalCreateEvent.class) + .addPattern("portal creat(e|ion)") + .addDescription(""" + Called when a portal is created,\s + either by a player or mob lighting an obsidian frame on fire,\s + or by a nether portal creating its teleportation target in the nether/overworld. + See the player for how to get the player in this event. + Note that there may not always be a player (or other entity) in this event. + """) + .addExample(""" + on portal create: + broadcast "A portal is being created!" + """) + .addSince("1.0") + .addSince("2.5.3 (event-entity support)") + .supplier(() -> new SimpleEvent("portal create")) + .build() + ); + + eventValueRegistry.register(EventValue.builder(PortalCreateEvent.class, Block[].class) + .getter(event -> event.getBlocks().stream() + .map(BlockState::getBlock) + .toArray(Block[]::new)) + .build()); + + eventValueRegistry.register(EventValue.builder(PortalCreateEvent.class, Entity.class) + .getter(PortalCreateEvent::getEntity) + .build()); + } +} diff --git a/src/main/java/org/skriptlang/skript/bukkit/world/elements/expressions/ExprDifficulty.java b/src/main/java/org/skriptlang/skript/bukkit/world/elements/expressions/ExprDifficulty.java new file mode 100644 index 00000000000..2c097489c98 --- /dev/null +++ b/src/main/java/org/skriptlang/skript/bukkit/world/elements/expressions/ExprDifficulty.java @@ -0,0 +1,85 @@ +package org.skriptlang.skript.bukkit.world.elements.expressions; + +import ch.njol.skript.Skript; +import org.bukkit.Difficulty; +import org.bukkit.World; +import org.bukkit.event.Event; +import org.jetbrains.annotations.Nullable; + +import ch.njol.skript.classes.Changer.ChangeMode; +import ch.njol.skript.doc.Description; +import ch.njol.skript.doc.Example; +import ch.njol.skript.doc.Name; +import ch.njol.skript.doc.Since; +import ch.njol.skript.expressions.base.SimplePropertyExpression; +import ch.njol.util.coll.CollectionUtils; +import org.skriptlang.skript.registration.SyntaxRegistry; + +@Name("Difficulty") +@Description("The difficulty of a world.") +@Example("set the difficulty of \"world\" to hard") +@Since("2.3") +public class ExprDifficulty extends SimplePropertyExpression { + + final static boolean HAS_NEW_METHOD = Skript.methodExists(World.class, "setAllowMonsterSpawning", boolean.class); + + public static void register(SyntaxRegistry syntaxRegistry) { + syntaxRegistry.register( + SyntaxRegistry.EXPRESSION, + infoBuilder( + ExprDifficulty.class, + Difficulty.class, + "difficult(y|ies)", + "worlds", + false + ) + .supplier(ExprDifficulty::new) + .build() + ); + } + + @Override + public @Nullable Difficulty convert(World world) { + return world.getDifficulty(); + } + + @Override + public Class @Nullable [] acceptChange(ChangeMode mode) { + if (mode == ChangeMode.SET) + return CollectionUtils.array(Difficulty.class); + return null; + } + + @Override + public void change(Event event, Object @Nullable [] delta, ChangeMode mode) { + if (delta == null) + return; + + Difficulty difficulty = (Difficulty) delta[0]; + if (difficulty == null) + return; + + for (World world : getExpr().getArray(event)) { + world.setDifficulty(difficulty); + if (difficulty != Difficulty.PEACEFUL) { + if (HAS_NEW_METHOD) { + world.setAllowMonsterSpawning(true); + } else { + // seems that on 26.2 setAllowMonsterSpawning doesn't exist + world.setSpawnFlags(true, world.getAllowAnimals()); + } + } + } + } + + @Override + protected String getPropertyName() { + return "difficulty"; + } + + @Override + public Class getReturnType() { + return Difficulty.class; + } + +} diff --git a/src/main/java/ch/njol/skript/expressions/ExprGameRule.java b/src/main/java/org/skriptlang/skript/bukkit/world/elements/expressions/ExprGameRule.java similarity index 54% rename from src/main/java/ch/njol/skript/expressions/ExprGameRule.java rename to src/main/java/org/skriptlang/skript/bukkit/world/elements/expressions/ExprGameRule.java index f32b00b5552..a4bda7c7589 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprGameRule.java +++ b/src/main/java/org/skriptlang/skript/bukkit/world/elements/expressions/ExprGameRule.java @@ -1,64 +1,81 @@ -package ch.njol.skript.expressions; +package org.skriptlang.skript.bukkit.world.elements.expressions; -import ch.njol.skript.registrations.Classes; -import ch.njol.skript.util.Utils; -import org.bukkit.GameRule; -import org.bukkit.World; -import org.bukkit.event.Event; -import org.jetbrains.annotations.Nullable; -import ch.njol.skript.Skript; import ch.njol.skript.classes.Changer.ChangeMode; import ch.njol.skript.doc.Description; import ch.njol.skript.doc.Example; 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.ParseResult; +import ch.njol.skript.lang.SyntaxStringBuilder; import ch.njol.skript.lang.util.SimpleExpression; +import ch.njol.skript.registrations.Classes; import ch.njol.skript.util.GameruleValue; +import ch.njol.skript.util.Utils; import ch.njol.util.Kleenean; +import org.bukkit.GameRule; +import org.bukkit.World; +import org.bukkit.event.Event; +import org.jetbrains.annotations.Nullable; +import org.skriptlang.skript.registration.SyntaxRegistry; + +import java.util.Arrays; + +import static ch.njol.skript.expressions.base.PropertyExpression.infoBuilder; @Name("Gamerule Value") @Description("The gamerule value of a world.") @Example("set the gamerule commandBlockOutput of world \"world\" to false") @Since("2.5") +@SuppressWarnings("rawtypes") public class ExprGameRule extends SimpleExpression { - - static { - Skript.registerExpression(ExprGameRule.class, GameruleValue.class, ExpressionType.COMBINED, "[the] gamerule %gamerule% of %worlds%"); + + public static void register(SyntaxRegistry syntaxRegistry) { + syntaxRegistry.register( + SyntaxRegistry.EXPRESSION, + infoBuilder( + ExprGameRule.class, + GameruleValue.class, + "gamerule %gamerule%", + "worlds", + false + ) + .supplier(ExprGameRule::new) + .build() + ); } private Expression> gamerule; private Expression worlds; - + @Override - public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { - // noinspection unchecked - gamerule = (Expression>) exprs[0]; - // noinspection unchecked - worlds = (Expression) exprs[1]; + @SuppressWarnings("unchecked") + public boolean init(Expression[] expressions, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { + if (matchedPattern == 0) { + gamerule = (Expression>) expressions[0]; + worlds = (Expression) expressions[1]; + } else { + gamerule = (Expression>) expressions[1]; + worlds = (Expression) expressions[0]; + } + return true; } @Override protected GameruleValue @Nullable [] get(Event event) { GameRule gamerule = this.gamerule.getSingle(event); - if (gamerule == null) { - return null; - } + if (gamerule == null) + return new GameruleValue[0]; World[] worlds = this.worlds.getArray(event); - GameruleValue[] gameruleValues = new GameruleValue[worlds.length]; + if (worlds == null) + return new GameruleValue[0]; - for (int i = 0; i < worlds.length; i++) { - Object gameruleValue = worlds[i].getGameRuleValue(gamerule); - assert gameruleValue != null; - gameruleValues[i] = new GameruleValue<>(gameruleValue); - } - - return gameruleValues; + return Arrays.stream(worlds) + .map(world -> new GameruleValue<>(world.getGameRuleValue(gamerule))) + .toArray(GameruleValue[]::new); } @Override @@ -70,18 +87,19 @@ public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelaye } @Override + @SuppressWarnings("unchecked") public void change(Event event, Object @Nullable [] delta, ChangeMode mode) { - if (mode != ChangeMode.SET) { + if (mode != ChangeMode.SET) return; - } - GameRule gamerule = this.gamerule.getSingle(event); - if (gamerule == null) { + GameRule gamerule = this.gamerule.getSingle(event); + if (gamerule == null) return; - } - assert delta != null; + if (delta == null) + return; Object value = delta[0]; + if (!gamerule.getType().isAssignableFrom(value.getClass())) { String currentClassName = Classes.toString(Classes.getSuperClassInfo(value.getClass())); currentClassName = Utils.a(currentClassName); @@ -89,28 +107,29 @@ public void change(Event event, Object @Nullable [] delta, ChangeMode mode) { String targetClassName = Classes.toString(Classes.getSuperClassInfo(gamerule.getType())); targetClassName = Utils.a(targetClassName); - error("The " + gamerule.getName() + " gamerule can only be set to " + targetClassName + ", not " + currentClassName + "."); + error("The " + gamerule.getKey() + " gamerule can only be set to " + targetClassName + ", not " + currentClassName + "."); return; } - for (World gameruleWorld : worlds.getArray(event)) { - gameruleWorld.setGameRule(gamerule, value); - } + for (World world : worlds.getArray(event)) + world.setGameRule((GameRule) gamerule, value); } @Override public boolean isSingle() { return worlds.isSingle(); } - + @Override public Class getReturnType() { return GameruleValue.class; } - + @Override public String toString(@Nullable Event event, boolean debug) { - return "the gamerule " + gamerule.toString(event, debug) + " of " + worlds.toString(event, debug); + return new SyntaxStringBuilder(event, debug) + .append("the gamerule ", gamerule, " of ", worlds) + .toString(); } } diff --git a/src/main/java/ch/njol/skript/expressions/ExprMoonPhase.java b/src/main/java/org/skriptlang/skript/bukkit/world/elements/expressions/ExprMoonPhase.java similarity index 63% rename from src/main/java/ch/njol/skript/expressions/ExprMoonPhase.java rename to src/main/java/org/skriptlang/skript/bukkit/world/elements/expressions/ExprMoonPhase.java index 4ad212b0de9..9e81f2b399c 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprMoonPhase.java +++ b/src/main/java/org/skriptlang/skript/bukkit/world/elements/expressions/ExprMoonPhase.java @@ -1,6 +1,5 @@ -package ch.njol.skript.expressions; +package org.skriptlang.skript.bukkit.world.elements.expressions; -import ch.njol.skript.Skript; import ch.njol.skript.doc.Description; import ch.njol.skript.doc.Example; import ch.njol.skript.doc.Name; @@ -9,6 +8,7 @@ import io.papermc.paper.world.MoonPhase; import org.bukkit.World; import org.jetbrains.annotations.Nullable; +import org.skriptlang.skript.registration.SyntaxRegistry; @Name("Moon Phase") @Description("The current moon phase of a world.") @@ -19,15 +19,23 @@ @Since("2.7") public class ExprMoonPhase extends SimplePropertyExpression { - static { - // TODO - remove this when Spigot support is dropped - if (Skript.classExists("io.papermc.paper.world.MoonPhase")) - register(ExprMoonPhase.class, MoonPhase.class, "(lunar|moon) phase[s]", "worlds"); + public static void register(SyntaxRegistry syntaxRegistry) { + syntaxRegistry.register( + SyntaxRegistry.EXPRESSION, + infoBuilder( + ExprMoonPhase.class, + MoonPhase.class, + "(lunar|moon) phase[s]", + "worlds", + false + ) + .supplier(ExprMoonPhase::new) + .build() + ); } @Override - @Nullable - public MoonPhase convert(World world) { + public @Nullable MoonPhase convert(World world) { return world.getMoonPhase(); } diff --git a/src/main/java/ch/njol/skript/expressions/ExprSeaLevel.java b/src/main/java/org/skriptlang/skript/bukkit/world/elements/expressions/ExprSeaLevel.java similarity index 64% rename from src/main/java/ch/njol/skript/expressions/ExprSeaLevel.java rename to src/main/java/org/skriptlang/skript/bukkit/world/elements/expressions/ExprSeaLevel.java index 5f6d5ba8019..ace4a2a6d21 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprSeaLevel.java +++ b/src/main/java/org/skriptlang/skript/bukkit/world/elements/expressions/ExprSeaLevel.java @@ -1,33 +1,44 @@ -package ch.njol.skript.expressions; - -import org.bukkit.World; +package org.skriptlang.skript.bukkit.world.elements.expressions; import ch.njol.skript.doc.Description; import ch.njol.skript.doc.Example; import ch.njol.skript.doc.Name; import ch.njol.skript.doc.Since; import ch.njol.skript.expressions.base.SimplePropertyExpression; +import org.bukkit.World; +import org.skriptlang.skript.registration.SyntaxRegistry; @Name("Sea Level") @Description("Gets the sea level of a world.") @Example("send \"The sea level in your world is %sea level in player's world%\"") @Since("2.5.1") public class ExprSeaLevel extends SimplePropertyExpression { - - static { - register(ExprSeaLevel.class, Long.class, "sea level", "worlds"); + + public static void register(SyntaxRegistry syntaxRegistry) { + syntaxRegistry.register( + SyntaxRegistry.EXPRESSION, + infoBuilder( + ExprSeaLevel.class, + Long.class, + "sea level", + "worlds", + false + ) + .supplier(ExprSeaLevel::new) + .build() + ); } - + @Override public Long convert(World world) { return (long) world.getSeaLevel(); } - + @Override public Class getReturnType() { return Long.class; } - + @Override protected String getPropertyName() { return "sea level"; diff --git a/src/main/java/ch/njol/skript/expressions/ExprWorld.java b/src/main/java/org/skriptlang/skript/bukkit/world/elements/expressions/ExprWorld.java similarity index 58% rename from src/main/java/ch/njol/skript/expressions/ExprWorld.java rename to src/main/java/org/skriptlang/skript/bukkit/world/elements/expressions/ExprWorld.java index 7ddcf1b6a5e..9ad9e0f6c36 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprWorld.java +++ b/src/main/java/org/skriptlang/skript/bukkit/world/elements/expressions/ExprWorld.java @@ -1,6 +1,5 @@ -package ch.njol.skript.expressions; +package org.skriptlang.skript.bukkit.world.elements.expressions; -import ch.njol.skript.Skript; import ch.njol.skript.classes.Changer.ChangeMode; import ch.njol.skript.doc.Description; import ch.njol.skript.doc.Example; @@ -8,10 +7,10 @@ import ch.njol.skript.doc.Since; import ch.njol.skript.expressions.base.PropertyExpression; import ch.njol.skript.lang.Expression; -import ch.njol.skript.lang.ExpressionType; import ch.njol.skript.lang.SkriptParser.ParseResult; import ch.njol.util.Kleenean; import ch.njol.util.coll.CollectionUtils; +import org.bukkit.Bukkit; import org.bukkit.Chunk; import org.bukkit.Location; import org.bukkit.World; @@ -19,55 +18,63 @@ import org.bukkit.event.Event; import org.bukkit.event.player.PlayerTeleportEvent; import org.jetbrains.annotations.Nullable; - -import static ch.njol.skript.registrations.EventValues.TIME_FUTURE; -import static ch.njol.skript.registrations.EventValues.TIME_PAST; +import org.skriptlang.skript.registration.SyntaxRegistry; @Name("World") -@Description("The world the event occurred in.") -@Example("world is \"world_nether\"") +@Description("The world of something.") +@Example(""" + if world is "world_nether": + broadcast "We're in another dimension!" + """) @Example("teleport the player to the world's spawn") @Example("set the weather in the player's world to rain") @Example("set {_world} to world of event-chunk") @Since("1.0") public class ExprWorld extends PropertyExpression { - static { - Skript.registerExpression(ExprWorld.class, World.class, ExpressionType.PROPERTY, "[the] world [of %locations/entities/chunk%]", "%locations/entities/chunk%'[s] world"); + // TODO: turn this into a type property + public static void register(SyntaxRegistry syntaxRegistry) { + syntaxRegistry.register( + SyntaxRegistry.EXPRESSION, + infoBuilder( + ExprWorld.class, + World.class, + "world", + "locations/entities/chunk", + true + ) + .supplier(ExprWorld::new) + .build() + ); } - + @Override - public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parser) { - setExpr(exprs[0]); + public boolean init(Expression[] expressions, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { + setExpr(expressions[0]); return true; } - + @Override protected World[] get(Event event, Object[] source) { - return get(source, objInWorld -> { + return get(source, object -> { // if getTime is not 0, we know: // - Not delayed // - In a PlayerTeleportEvent // - the source expr was the event-value // check the event anyway since it casts for us - if (event instanceof PlayerTeleportEvent playerTeleportEvent) { - if (getTime() == TIME_FUTURE) { - // future - return playerTeleportEvent.getTo().getWorld(); - } else if (getTime() == TIME_PAST) { - // past - return playerTeleportEvent.getFrom().getWorld(); + if (event instanceof PlayerTeleportEvent playerEvent) { + if (getTime() == 1) { + return playerEvent.getTo().getWorld(); + } else if (getTime() == -1) { + return playerEvent.getFrom().getWorld(); } } - if (objInWorld instanceof Entity entity) { - return entity.getWorld(); - } else if (objInWorld instanceof Location location) { - return location.getWorld(); - } else if (objInWorld instanceof Chunk chunk) { - return chunk.getWorld(); - } - assert false : objInWorld; - return null; + return switch (object) { + case Entity entity -> entity.getWorld(); + case Location location -> location.getWorld(); + case Chunk chunk -> chunk.getWorld(); + default -> Bukkit.getWorld("world"); + }; }); } @@ -83,11 +90,12 @@ public void change(Event event, Object @Nullable [] delta, ChangeMode mode) { if (delta == null) return; + World world = (World) delta[0]; + // TODO: this is suspicious - test if it works in all cases + whether we should have a Location changer instead. for (Object object : getExpr().getArray(event)) { - if (object instanceof Location location) { - location.setWorld((World) delta[0]); - } + if (object instanceof Location location) + location.setWorld(world); } } @@ -103,7 +111,7 @@ public Class getReturnType() { @Override public String toString(@Nullable Event event, boolean debug) { - return "the world" + (getExpr().isDefault() ? "" : " of " + getExpr().toString(event, debug)); + return "the world of" + getExpr().toString(event, debug); } } diff --git a/src/main/java/ch/njol/skript/expressions/ExprWorldEnvironment.java b/src/main/java/org/skriptlang/skript/bukkit/world/elements/expressions/ExprWorldEnvironment.java similarity index 59% rename from src/main/java/ch/njol/skript/expressions/ExprWorldEnvironment.java rename to src/main/java/org/skriptlang/skript/bukkit/world/elements/expressions/ExprWorldEnvironment.java index 7191842bf50..d992384a75d 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprWorldEnvironment.java +++ b/src/main/java/org/skriptlang/skript/bukkit/world/elements/expressions/ExprWorldEnvironment.java @@ -1,4 +1,4 @@ -package ch.njol.skript.expressions; +package org.skriptlang.skript.bukkit.world.elements.expressions; import ch.njol.skript.doc.Description; import ch.njol.skript.doc.Example; @@ -8,9 +8,10 @@ import org.bukkit.World; import org.bukkit.World.Environment; import org.jetbrains.annotations.Nullable; +import org.skriptlang.skript.registration.SyntaxRegistry; @Name("World Environment") -@Description("The environment of a world") +@Description("The environment of a world.") @Example(""" if environment of player's world is nether: apply fire resistance to player for 10 minutes @@ -18,13 +19,23 @@ @Since("2.7") public class ExprWorldEnvironment extends SimplePropertyExpression { - static { - register(ExprWorldEnvironment.class, Environment.class, "[world] environment", "worlds"); + public static void register(SyntaxRegistry syntaxRegistry) { + syntaxRegistry.register( + SyntaxRegistry.EXPRESSION, + infoBuilder( + ExprWorldEnvironment.class, + Environment.class, + "[world] environment", + "worlds", + false + ) + .supplier(ExprWorldEnvironment::new) + .build() + ); } @Override - @Nullable - public Environment convert(World world) { + public @Nullable Environment convert(World world) { return world.getEnvironment(); } diff --git a/src/main/java/ch/njol/skript/expressions/ExprWorldFromName.java b/src/main/java/org/skriptlang/skript/bukkit/world/elements/expressions/ExprWorldFromName.java similarity index 51% rename from src/main/java/ch/njol/skript/expressions/ExprWorldFromName.java rename to src/main/java/org/skriptlang/skript/bukkit/world/elements/expressions/ExprWorldFromName.java index e7e2f9a28ab..d00ace10f2f 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprWorldFromName.java +++ b/src/main/java/org/skriptlang/skript/bukkit/world/elements/expressions/ExprWorldFromName.java @@ -1,12 +1,10 @@ -package ch.njol.skript.expressions; +package org.skriptlang.skript.bukkit.world.elements.expressions; -import ch.njol.skript.Skript; import ch.njol.skript.doc.Description; import ch.njol.skript.doc.Example; 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.ParseResult; import ch.njol.skript.lang.util.SimpleExpression; import ch.njol.util.Kleenean; @@ -14,6 +12,8 @@ import org.bukkit.World; import org.bukkit.event.Event; import org.jetbrains.annotations.Nullable; +import org.skriptlang.skript.registration.SyntaxInfo; +import org.skriptlang.skript.registration.SyntaxRegistry; @Name("World from Name") @Description("Returns the world from a string.") @@ -22,31 +22,36 @@ @Since("2.6.1") public class ExprWorldFromName extends SimpleExpression { - static { - Skript.registerExpression(ExprWorldFromName.class, World.class, ExpressionType.SIMPLE, "[the] world [(named|with name)] %string%"); + public static void register(SyntaxRegistry syntaxRegistry) { + syntaxRegistry.register( + SyntaxRegistry.EXPRESSION, + SyntaxInfo.Expression.builder(ExprWorldFromName.class, World.class) + .addPatterns("world [(named|with name)] %string%") + .supplier(ExprWorldFromName::new) + .build() + ); } - @SuppressWarnings("NotNullFieldNotInitialized") private Expression worldName; @Override @SuppressWarnings("unchecked") - public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { - worldName = (Expression) exprs[0]; + public boolean init(Expression[] expressions, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { + worldName = (Expression) expressions[0]; return true; } @Override - @Nullable - protected World[] get(Event e) { - String worldName = this.worldName.getSingle(e); + protected World @Nullable [] get(Event event) { + String worldName = this.worldName.getSingle(event); if (worldName == null) - return null; + return new World[0]; + World world = Bukkit.getWorld(worldName); if (world == null) - return null; + return new World[0]; - return new World[] {world}; + return new World[]{world}; } @Override @@ -60,8 +65,8 @@ public Class getReturnType() { } @Override - public String toString(@Nullable Event e, boolean debug) { - return "the world with name " + worldName.toString(e, debug); + public String toString(@Nullable Event event, boolean debug) { + return "the world with name " + worldName.toString(event, debug); } } diff --git a/src/main/java/org/skriptlang/skript/bukkit/world/elements/expressions/ExprWorldSeed.java b/src/main/java/org/skriptlang/skript/bukkit/world/elements/expressions/ExprWorldSeed.java new file mode 100644 index 00000000000..6fbaa3e0d8f --- /dev/null +++ b/src/main/java/org/skriptlang/skript/bukkit/world/elements/expressions/ExprWorldSeed.java @@ -0,0 +1,65 @@ +package org.skriptlang.skript.bukkit.world.elements.expressions; + +import ch.njol.skript.doc.Description; +import ch.njol.skript.doc.Example; +import ch.njol.skript.doc.Name; +import ch.njol.skript.doc.Since; +import ch.njol.skript.expressions.base.PropertyExpression; +import ch.njol.skript.lang.Expression; +import ch.njol.skript.lang.SkriptParser.ParseResult; +import ch.njol.util.Kleenean; +import org.bukkit.World; +import org.bukkit.event.Event; +import org.bukkit.generator.WorldInfo; +import org.jetbrains.annotations.Nullable; +import org.skriptlang.skript.registration.SyntaxRegistry; + +@Name("World Seed") +@Description(""" + The seed of given world. + Note that it will be returned as Minecraft internally treats seeds,\s + not as you specified it in world configuration. + """) +@Example("broadcast \"Seed: %seed of player's world%\"") +@Since({"2.2-dev35", "INSERT VERSION (updated pattern)"}) +public class ExprWorldSeed extends PropertyExpression { + + // TODO: turn this into a type property + public static void register(SyntaxRegistry syntaxRegistry) { + syntaxRegistry.register( + SyntaxRegistry.EXPRESSION, + infoBuilder( + ExprWorldSeed.class, + Long.class, + "[world] seed[s]", + "worlds", + false + ) + .supplier(ExprWorldSeed::new) + .build() + ); + } + + @Override + @SuppressWarnings("unchecked") + public boolean init(Expression[] expressions, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { + setExpr((Expression) expressions[0]); + return true; + } + + @Override + protected Long[] get(Event event, World[] source) { + return get(source, WorldInfo::getSeed); + } + + @Override + public Class getReturnType() { + return Long.class; + } + + @Override + public String toString(@Nullable Event event, boolean debug) { + return "the world seed of" + getExpr().toString(event, debug); + } + +} diff --git a/src/main/java/ch/njol/skript/expressions/ExprSpawn.java b/src/main/java/org/skriptlang/skript/bukkit/world/elements/expressions/ExprWorldSpawn.java similarity index 59% rename from src/main/java/ch/njol/skript/expressions/ExprSpawn.java rename to src/main/java/org/skriptlang/skript/bukkit/world/elements/expressions/ExprWorldSpawn.java index c0c86faccff..47880fe0b1d 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprSpawn.java +++ b/src/main/java/org/skriptlang/skript/bukkit/world/elements/expressions/ExprWorldSpawn.java @@ -1,6 +1,5 @@ -package ch.njol.skript.expressions; +package org.skriptlang.skript.bukkit.world.elements.expressions; -import ch.njol.skript.Skript; import ch.njol.skript.classes.Changer.ChangeMode; import ch.njol.skript.doc.Description; import ch.njol.skript.doc.Example; @@ -9,7 +8,6 @@ import ch.njol.skript.effects.Delay; import ch.njol.skript.expressions.base.PropertyExpression; import ch.njol.skript.lang.Expression; -import ch.njol.skript.lang.ExpressionType; import ch.njol.skript.lang.SkriptParser.ParseResult; import ch.njol.util.Kleenean; import ch.njol.util.coll.CollectionUtils; @@ -18,65 +16,73 @@ import org.bukkit.event.Event; import org.bukkit.event.world.SpawnChangeEvent; import org.jetbrains.annotations.Nullable; +import org.skriptlang.skript.registration.SyntaxRegistry; -@Name("Spawn") +@Name("World Spawn") @Description("The spawn point of a world.") @Example("teleport all players to spawn") @Example("set the spawn point of \"world\" to the player's location") @Since("1.4.2") -public class ExprSpawn extends PropertyExpression { +public class ExprWorldSpawn extends PropertyExpression { - static { - Skript.registerExpression(ExprSpawn.class, Location.class, ExpressionType.PROPERTY, - "[the] spawn[s] [(point|location)[s]] [of %worlds%]", - "%worlds%'[s] spawn[s] [(point|location)[s]]" + public static void register(SyntaxRegistry syntaxRegistry) { + syntaxRegistry.register( + SyntaxRegistry.EXPRESSION, + infoBuilder( + ExprWorldSpawn.class, + Location.class, + "spawn[s] [(point|location)[s]]", + "worlds", + false + ) + .supplier(ExprWorldSpawn::new) + .build() ); } @Override @SuppressWarnings("unchecked") - public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { - setExpr((Expression) exprs[0]); + public boolean init(Expression[] expressions, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { + setExpr((Expression) expressions[0]); return true; } @Override protected Location[] get(Event event, World[] source) { - if (getTime() == -1 && event instanceof SpawnChangeEvent && !Delay.isDelayed(event)) - return new Location[] {((SpawnChangeEvent) event).getPreviousLocation()}; + if (getTime() == -1 && event instanceof SpawnChangeEvent worldEvent && !Delay.isDelayed(event)) + return new Location[]{worldEvent.getPreviousLocation()}; return get(source, World::getSpawnLocation); } @Override - @Nullable - public Class[] acceptChange(ChangeMode mode) { + public Class @Nullable [] acceptChange(ChangeMode mode) { if (mode == ChangeMode.SET) return CollectionUtils.array(Location.class); return null; } @Override - public void change(Event event, @Nullable Object[] delta, ChangeMode mode) { - //noinspection ConstantConditions + public void change(Event event, Object @Nullable [] delta, ChangeMode mode) { if (delta == null) return; Location originalLocation = (Location) delta[0]; - assert originalLocation != null; + if (originalLocation == null) + return; + for (World world : getExpr().getArray(event)) { Location location = originalLocation.clone(); World locationWorld = location.getWorld(); - if (locationWorld == null) { - location.setWorld(world); - world.setSpawnLocation(location); - } else if (locationWorld.equals(world)) { - world.setSpawnLocation(location); - } + + if (locationWorld != null && !locationWorld.equals(world)) + continue; + + location.setWorld(world); + world.setSpawnLocation(location); } } @Override - @SuppressWarnings("unchecked") public boolean setTime(int time) { return super.setTime(time, getExpr(), SpawnChangeEvent.class); } diff --git a/src/main/java/org/skriptlang/skript/bukkit/worldborder/elements/WorldBorderModule.java b/src/main/java/org/skriptlang/skript/bukkit/world/worldborder/elements/WorldBorderEvents.java similarity index 66% rename from src/main/java/org/skriptlang/skript/bukkit/worldborder/elements/WorldBorderModule.java rename to src/main/java/org/skriptlang/skript/bukkit/world/worldborder/elements/WorldBorderEvents.java index d52ba3da1b7..bbdab7f3bcf 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/worldborder/elements/WorldBorderModule.java +++ b/src/main/java/org/skriptlang/skript/bukkit/world/worldborder/elements/WorldBorderEvents.java @@ -1,66 +1,21 @@ -package org.skriptlang.skript.bukkit.worldborder.elements; +package org.skriptlang.skript.bukkit.world.worldborder.elements; -import ch.njol.skript.classes.ClassInfo; -import ch.njol.skript.classes.Parser; -import ch.njol.skript.expressions.base.EventValueExpression; -import ch.njol.skript.lang.ParseContext; import ch.njol.skript.lang.util.SimpleEvent; -import ch.njol.skript.registrations.Classes; import ch.njol.skript.util.Timespan; import io.papermc.paper.event.world.border.WorldBorderBoundsChangeEvent; import io.papermc.paper.event.world.border.WorldBorderBoundsChangeFinishEvent; import io.papermc.paper.event.world.border.WorldBorderCenterChangeEvent; import org.bukkit.Location; import org.bukkit.WorldBorder; -import org.skriptlang.skript.addon.AddonModule; -import org.skriptlang.skript.addon.HierarchicalAddonModule; -import org.skriptlang.skript.addon.SkriptAddon; import org.skriptlang.skript.bukkit.lang.eventvalue.EventValue; +import org.skriptlang.skript.bukkit.lang.eventvalue.EventValue.Time; import org.skriptlang.skript.bukkit.lang.eventvalue.EventValueRegistry; import org.skriptlang.skript.bukkit.registration.BukkitSyntaxInfos; -import org.skriptlang.skript.bukkit.worldborder.elements.effects.EffWorldBorderExpand; -import org.skriptlang.skript.bukkit.worldborder.elements.expressions.*; import org.skriptlang.skript.registration.SyntaxRegistry; -public class WorldBorderModule extends HierarchicalAddonModule { - - public WorldBorderModule(AddonModule parentModule) { - super(parentModule); - } - - @Override - protected void initSelf(SkriptAddon addon) { - Classes.registerClass(new ClassInfo<>(WorldBorder.class, "worldborder") - .user("world ?borders?") - .name("World Border") - .description("Represents the border of a world or player.") - .since("2.11") - .parser(new Parser<>() { - @Override - public boolean canParse(ParseContext context) { - return false; - } - - @Override - public String toString(WorldBorder border, int flags) { - if (border.getWorld() == null) - return "virtual world border"; - return "world border of world named '" + border.getWorld().getName() + "'"; - } - - @Override - public String toVariableNameString(WorldBorder border) { - return toString(border, 0); - } - }) - .defaultExpression(new EventValueExpression<>(WorldBorder.class))); - } - - @Override - protected void loadSelf(SkriptAddon addon) { - EventValueRegistry eventValueRegistry = addon.registry(EventValueRegistry.class); - SyntaxRegistry syntaxRegistry = moduleRegistry(addon); +public class WorldBorderEvents { + public static void register(SyntaxRegistry syntaxRegistry, EventValueRegistry eventValueRegistry) { syntaxRegistry.register( BukkitSyntaxInfos.Event.KEY, BukkitSyntaxInfos.Event.builder(SimpleEvent.class, "World Border Bounds Change") @@ -75,21 +30,25 @@ protected void loadSelf(SkriptAddon addon) { broadcast "The diameter of %event-worldborder% is changing from %past event-number% to %event-number% over the next %event-timespan% """) .addSince("2.11") + .supplier(() -> new SimpleEvent("world border bounds change")) .build() ); eventValueRegistry.register(EventValue.builder(WorldBorderBoundsChangeEvent.class, WorldBorder.class) .getter(WorldBorderBoundsChangeEvent::getWorldBorder) .build()); + eventValueRegistry.register(EventValue.builder(WorldBorderBoundsChangeEvent.class, Number.class) .getter(WorldBorderBoundsChangeEvent::getNewSize) .build()); + eventValueRegistry.register(EventValue.builder(WorldBorderBoundsChangeEvent.class, Timespan.class) .getter(event -> new Timespan(event.getDurationTicks())) .build()); + eventValueRegistry.register(EventValue.builder(WorldBorderBoundsChangeEvent.class, Number.class) .getter(WorldBorderBoundsChangeEvent::getOldSize) - .time(EventValue.Time.PAST) + .time(Time.PAST) .build()); syntaxRegistry.register( @@ -106,19 +65,22 @@ protected void loadSelf(SkriptAddon addon) { broadcast "Over the past %event-timespan%, the diameter of %event-worldborder% went from %past event-number% to %event-number%" """) .addSince("2.11") + .supplier(() -> new SimpleEvent("world border bounds finish change")) .build() ); eventValueRegistry.register(EventValue.builder(WorldBorderBoundsChangeFinishEvent.class, WorldBorder.class) .getter(WorldBorderBoundsChangeFinishEvent::getWorldBorder) .build()); + eventValueRegistry.register(EventValue.builder(WorldBorderBoundsChangeFinishEvent.class, Number.class) .getter(WorldBorderBoundsChangeFinishEvent::getNewSize) .build()); eventValueRegistry.register(EventValue.builder(WorldBorderBoundsChangeFinishEvent.class, Number.class) .getter(WorldBorderBoundsChangeFinishEvent::getOldSize) - .time(EventValue.Time.PAST) + .time(Time.PAST) .build()); + eventValueRegistry.register(EventValue.builder(WorldBorderBoundsChangeFinishEvent.class, Timespan.class) .getter(event -> new Timespan((long) event.getDuration())) .build()); @@ -137,36 +99,23 @@ protected void loadSelf(SkriptAddon addon) { broadcast "The center of %event-worldborder% has moved from %past event-location% to %event-location% """) .addSince("2.11") + .supplier(() -> new SimpleEvent("world border center change")) .build() ); eventValueRegistry.register(EventValue.builder(WorldBorderCenterChangeEvent.class, WorldBorder.class) .getter(WorldBorderCenterChangeEvent::getWorldBorder) .build()); + eventValueRegistry.register(EventValue.builder(WorldBorderCenterChangeEvent.class, Location.class) .getter(WorldBorderCenterChangeEvent::getNewCenter) .build()); + eventValueRegistry.register(EventValue.builder(WorldBorderCenterChangeEvent.class, Location.class) .getter(WorldBorderCenterChangeEvent::getOldCenter) - .time(EventValue.Time.PAST) + .time(Time.PAST) .build()); - register(addon, - a -> ExprSecCreateWorldBorder.register(a, eventValueRegistry), - EffWorldBorderExpand::register, - ExprWorldBorder::register, - ExprWorldBorderCenter::register, - ExprWorldBorderDamageAmount::register, - ExprWorldBorderDamageBuffer::register, - ExprWorldBorderSize::register, - ExprWorldBorderWarningDistance::register, - ExprWorldBorderWarningTime::register - ); - } - - @Override - public String name() { - return "worldborder"; } } diff --git a/src/main/java/org/skriptlang/skript/bukkit/world/worldborder/elements/WorldBorderModule.java b/src/main/java/org/skriptlang/skript/bukkit/world/worldborder/elements/WorldBorderModule.java new file mode 100644 index 00000000000..01f9568fce2 --- /dev/null +++ b/src/main/java/org/skriptlang/skript/bukkit/world/worldborder/elements/WorldBorderModule.java @@ -0,0 +1,74 @@ +package org.skriptlang.skript.bukkit.world.worldborder.elements; + +import ch.njol.skript.classes.ClassInfo; +import ch.njol.skript.classes.Parser; +import ch.njol.skript.expressions.base.EventValueExpression; +import ch.njol.skript.lang.ParseContext; +import ch.njol.skript.registrations.Classes; +import org.bukkit.WorldBorder; +import org.skriptlang.skript.addon.AddonModule; +import org.skriptlang.skript.addon.HierarchicalAddonModule; +import org.skriptlang.skript.addon.SkriptAddon; +import org.skriptlang.skript.bukkit.lang.eventvalue.EventValueRegistry; +import org.skriptlang.skript.bukkit.world.worldborder.elements.effects.EffWorldBorderExpand; +import org.skriptlang.skript.bukkit.world.worldborder.elements.expressions.*; + +public class WorldBorderModule extends HierarchicalAddonModule { + + public WorldBorderModule(AddonModule parentModule) { + super(parentModule); + } + + @Override + protected void initSelf(SkriptAddon addon) { + Classes.registerClass(new ClassInfo<>(WorldBorder.class, "worldborder") + .user("world ?borders?") + .name("World Border") + .description("Represents the border of a world or player.") + .since("2.11") + .parser(new Parser<>() { + @Override + public boolean canParse(ParseContext context) { + return false; + } + + @Override + public String toString(WorldBorder border, int flags) { + if (border.getWorld() == null) + return "virtual world border"; + return "world border of world named '" + border.getWorld().getName() + "'"; + } + + @Override + public String toVariableNameString(WorldBorder border) { + return toString(border, 0); + } + }) + .defaultExpression(new EventValueExpression<>(WorldBorder.class))); + } + + @Override + protected void loadSelf(SkriptAddon addon) { + EventValueRegistry eventValueRegistry = addon.registry(EventValueRegistry.class); + + WorldBorderEvents.register(moduleRegistry(addon), eventValueRegistry); + + register(addon, + syntaxRegistry -> ExprSecCreateWorldBorder.register(syntaxRegistry, eventValueRegistry), + EffWorldBorderExpand::register, + ExprWorldBorder::register, + ExprWorldBorderCenter::register, + ExprWorldBorderDamageAmount::register, + ExprWorldBorderDamageBuffer::register, + ExprWorldBorderSize::register, + ExprWorldBorderWarningDistance::register, + ExprWorldBorderWarningTime::register + ); + } + + @Override + public String name() { + return "worldborder"; + } + +} diff --git a/src/main/java/org/skriptlang/skript/bukkit/worldborder/elements/effects/EffWorldBorderExpand.java b/src/main/java/org/skriptlang/skript/bukkit/world/worldborder/elements/effects/EffWorldBorderExpand.java similarity index 78% rename from src/main/java/org/skriptlang/skript/bukkit/worldborder/elements/effects/EffWorldBorderExpand.java rename to src/main/java/org/skriptlang/skript/bukkit/world/worldborder/elements/effects/EffWorldBorderExpand.java index 66578761903..4c8587e8395 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/worldborder/elements/effects/EffWorldBorderExpand.java +++ b/src/main/java/org/skriptlang/skript/bukkit/world/worldborder/elements/effects/EffWorldBorderExpand.java @@ -1,4 +1,4 @@ -package org.skriptlang.skript.bukkit.worldborder.elements.effects; +package org.skriptlang.skript.bukkit.world.worldborder.elements.effects; import ch.njol.skript.Skript; import ch.njol.skript.doc.Description; @@ -20,11 +20,11 @@ import org.skriptlang.skript.registration.SyntaxRegistry; @Name("Expand/Shrink World Border") -@Description({ - "Expand or shrink the size of a world border.", - "Using `by` adds/subtracts from the current size of the world border.", - "Using `to` sets to the specified size." -}) +@Description(""" + Expand or shrink the size of a world border. + Using `by` adds/subtracts from the current size of the world border. + Using `to` sets to the specified size. + """) @Example("expand world border of player by 100 over 5 seconds") @Example("shrink world border of world \"world\" to 100 over 10 seconds") @Since("2.11") @@ -47,17 +47,17 @@ public static void register(SyntaxRegistry syntaxRegistry) { private boolean radius; private boolean to; private Expression worldBorders; - private Expression numberExpr; + private Expression number; private @Nullable Expression timespan; private static final double MAX_WORLDBORDER_SIZE = 59999968; private static final boolean USE_DEPRECATED = !Skript.methodExists(WorldBorder.class, "changeSize"); @Override @SuppressWarnings("unchecked") - public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { - worldBorders = (Expression) exprs[0]; - numberExpr = (Expression) exprs[1]; - timespan = (Expression) exprs[2]; + public boolean init(Expression[] expressions, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { + worldBorders = (Expression) expressions[0]; + number = (Expression) expressions[1]; + timespan = (Expression) expressions[2]; shrink = matchedPattern > 1; radius = parseResult.hasTag("radius"); to = parseResult.hasTag("to"); @@ -66,7 +66,7 @@ public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelaye @Override protected void execute(Event event) { - Number number = numberExpr.getSingle(event); + Number number = this.number.getSingle(event); if (number == null) return; double input = number.doubleValue(); @@ -113,15 +113,14 @@ protected void execute(Event event) { @Override public String toString(@Nullable Event event, boolean debug) { - SyntaxStringBuilder builder = new SyntaxStringBuilder(event, debug); - builder.append(shrink ? "shrink" : "expand"); - builder.append(radius ? "radius" : "diameter"); - builder.append("of", worldBorders); - builder.append(to ? "to" : "by"); - builder.append(numberExpr); - if (timespan != null) - builder.append("over", timespan); - return builder.toString(); + return new SyntaxStringBuilder(event, debug) + .append(shrink ? "shrink" : "expand") + .append(radius ? "radius" : "diameter") + .append("of", worldBorders) + .append(to ? "to" : "by") + .append(number) + .appendIf(timespan != null, "over", timespan) + .toString(); } } diff --git a/src/main/java/org/skriptlang/skript/bukkit/worldborder/elements/expressions/ExprSecCreateWorldBorder.java b/src/main/java/org/skriptlang/skript/bukkit/world/worldborder/elements/expressions/ExprSecCreateWorldBorder.java similarity index 87% rename from src/main/java/org/skriptlang/skript/bukkit/worldborder/elements/expressions/ExprSecCreateWorldBorder.java rename to src/main/java/org/skriptlang/skript/bukkit/world/worldborder/elements/expressions/ExprSecCreateWorldBorder.java index 9b5a735416b..1a330efb149 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/worldborder/elements/expressions/ExprSecCreateWorldBorder.java +++ b/src/main/java/org/skriptlang/skript/bukkit/world/worldborder/elements/expressions/ExprSecCreateWorldBorder.java @@ -1,4 +1,4 @@ -package org.skriptlang.skript.bukkit.worldborder.elements.expressions; +package org.skriptlang.skript.bukkit.world.worldborder.elements.expressions; import ch.njol.skript.config.SectionNode; import ch.njol.skript.doc.Description; @@ -27,11 +27,11 @@ import java.util.List; @Name("Create WorldBorder") -@Description({ - "Creates a new, unused world border. World borders can be assigned to either worlds or specific players.", - "Borders assigned to worlds apply to all players in that world.", - "Borders assigned to players apply only to those players, and different players can have different borders." -}) +@Description(""" + Creates a new, unused world border. World borders can be assigned to either worlds or specific players. + Borders assigned to worlds apply to all players in that world. + Borders assigned to players apply only to those players, and different players can have different borders. + """) @Example(""" on join: set {_location} to location of player @@ -56,6 +56,7 @@ public static void register(SyntaxRegistry syntaxRegistry, EventValueRegistry ev .addPattern("a [virtual] world[ ]border") .build() ); + eventValueRegistry.register(EventValue.builder(CreateWorldborderEvent.class, WorldBorder.class) .getter(CreateWorldborderEvent::getWorldBorder) .build()); @@ -64,7 +65,7 @@ public static void register(SyntaxRegistry syntaxRegistry, EventValueRegistry ev private Trigger trigger = null; @Override - public boolean init(Expression[] expressions, int pattern, Kleenean delayed, ParseResult result, @Nullable SectionNode node, @Nullable List triggerItems) { + public boolean init(Expression[] expressions, int pattern, Kleenean delayed, ParseResult parseResult, @Nullable SectionNode node, @Nullable List triggerItems) { if (node != null) { trigger = SectionUtils.loadLinkedCode("create worldborder", (beforeLoading, afterLoading) -> loadCode(node, "create worldborder", beforeLoading, afterLoading, CreateWorldborderEvent.class)); diff --git a/src/main/java/org/skriptlang/skript/bukkit/worldborder/elements/expressions/ExprWorldBorder.java b/src/main/java/org/skriptlang/skript/bukkit/world/worldborder/elements/expressions/ExprWorldBorder.java similarity index 81% rename from src/main/java/org/skriptlang/skript/bukkit/worldborder/elements/expressions/ExprWorldBorder.java rename to src/main/java/org/skriptlang/skript/bukkit/world/worldborder/elements/expressions/ExprWorldBorder.java index 7a998db6eb7..46537aab4f2 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/worldborder/elements/expressions/ExprWorldBorder.java +++ b/src/main/java/org/skriptlang/skript/bukkit/world/worldborder/elements/expressions/ExprWorldBorder.java @@ -1,4 +1,4 @@ -package org.skriptlang.skript.bukkit.worldborder.elements.expressions; +package org.skriptlang.skript.bukkit.world.worldborder.elements.expressions; import ch.njol.skript.Skript; import ch.njol.skript.classes.Changer.ChangeMode; @@ -8,27 +8,37 @@ import ch.njol.skript.doc.Since; import ch.njol.skript.expressions.base.SimplePropertyExpression; import ch.njol.util.coll.CollectionUtils; +import org.bukkit.Difficulty; import org.bukkit.World; import org.bukkit.WorldBorder; import org.bukkit.entity.Player; import org.bukkit.event.Event; import org.jetbrains.annotations.Nullable; +import org.skriptlang.skript.bukkit.world.elements.expressions.ExprDifficulty; import org.skriptlang.skript.registration.SyntaxRegistry; @Name("World Border") -@Description({ - "Get the border of a world or a player.", - "A player's world border is not persistent. Restarts, quitting, death or changing worlds will reset the border." -}) +@Description(""" + Get the border of a world or a player. + A player's world border is not persistent. Restarts, quitting, death or changing worlds will reset the border. + """) @Example("set {_border} to world border of player's world") @Since("2.11") public class ExprWorldBorder extends SimplePropertyExpression { public static void register(SyntaxRegistry syntaxRegistry) { - syntaxRegistry.register(SyntaxRegistry.EXPRESSION, - infoBuilder(ExprWorldBorder.class, WorldBorder.class, "world[ ]border", "worlds/players", true) + syntaxRegistry.register( + SyntaxRegistry.EXPRESSION, + infoBuilder( + ExprWorldBorder.class, + WorldBorder.class, + "world[ ]border", + "worlds/players", + true + ) .supplier(ExprWorldBorder::new) - .build()); + .build() + ); } private static final boolean USE_DEPRECATED = !Skript.methodExists(WorldBorder.class, "getWarningTimeTicks"); @@ -61,6 +71,8 @@ public void change(Event event, Object @Nullable [] delta, ChangeMode mode) { } return; } + if (delta == null) + return; WorldBorder to = (WorldBorder) delta[0]; assert to != null; for (Object object : objects) { diff --git a/src/main/java/org/skriptlang/skript/bukkit/worldborder/elements/expressions/ExprWorldBorderCenter.java b/src/main/java/org/skriptlang/skript/bukkit/world/worldborder/elements/expressions/ExprWorldBorderCenter.java similarity index 88% rename from src/main/java/org/skriptlang/skript/bukkit/worldborder/elements/expressions/ExprWorldBorderCenter.java rename to src/main/java/org/skriptlang/skript/bukkit/world/worldborder/elements/expressions/ExprWorldBorderCenter.java index a8ce24b43ec..cf7334998f0 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/worldborder/elements/expressions/ExprWorldBorderCenter.java +++ b/src/main/java/org/skriptlang/skript/bukkit/world/worldborder/elements/expressions/ExprWorldBorderCenter.java @@ -1,4 +1,4 @@ -package org.skriptlang.skript.bukkit.worldborder.elements.expressions; +package org.skriptlang.skript.bukkit.world.worldborder.elements.expressions; import ch.njol.skript.classes.Changer.ChangeMode; import ch.njol.skript.doc.Description; @@ -20,10 +20,18 @@ public class ExprWorldBorderCenter extends SimplePropertyExpression { public static void register(SyntaxRegistry syntaxRegistry) { - syntaxRegistry.register(SyntaxRegistry.EXPRESSION, - infoBuilder(ExprWorldBorderCenter.class, Location.class, "world[ ]border (center|middle)", "worldborders", true) + syntaxRegistry.register( + SyntaxRegistry.EXPRESSION, + infoBuilder( + ExprWorldBorderCenter.class, + Location.class, + "world[ ]border (center|middle)", + "worldborders", + true + ) .supplier(ExprWorldBorderCenter::new) - .build()); + .build() + ); } @Override diff --git a/src/main/java/org/skriptlang/skript/bukkit/worldborder/elements/expressions/ExprWorldBorderDamageAmount.java b/src/main/java/org/skriptlang/skript/bukkit/world/worldborder/elements/expressions/ExprWorldBorderDamageAmount.java similarity index 78% rename from src/main/java/org/skriptlang/skript/bukkit/worldborder/elements/expressions/ExprWorldBorderDamageAmount.java rename to src/main/java/org/skriptlang/skript/bukkit/world/worldborder/elements/expressions/ExprWorldBorderDamageAmount.java index 52c3a1a5316..29862970e8f 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/worldborder/elements/expressions/ExprWorldBorderDamageAmount.java +++ b/src/main/java/org/skriptlang/skript/bukkit/world/worldborder/elements/expressions/ExprWorldBorderDamageAmount.java @@ -1,4 +1,4 @@ -package org.skriptlang.skript.bukkit.worldborder.elements.expressions; +package org.skriptlang.skript.bukkit.world.worldborder.elements.expressions; import ch.njol.skript.classes.Changer.ChangeMode; import ch.njol.skript.doc.Description; @@ -13,20 +13,28 @@ import org.skriptlang.skript.registration.SyntaxRegistry; @Name("Damage Amount of World Border") -@Description({ - "The amount of damage a player takes per second for each block they are outside the border plus the border buffer.", - "Players only take damage when outside of the world's world border, and the damage value cannot be less than 0.", -}) +@Description(""" + The amount of damage a player takes per second for each block they are outside the border plus the border buffer. + Players only take damage when outside of the world's world border, and the damage value cannot be less than 0. + """) @Example("set world border damage amount of {_worldborder} to 1") @Since("2.11") public class ExprWorldBorderDamageAmount extends SimplePropertyExpression { public static void register(SyntaxRegistry syntaxRegistry) { - syntaxRegistry.register(SyntaxRegistry.EXPRESSION, - infoBuilder(ExprWorldBorderDamageAmount.class, Double.class, "world[ ]border damage amount", "worldborders", true) + syntaxRegistry.register( + SyntaxRegistry.EXPRESSION, + infoBuilder( + ExprWorldBorderDamageAmount.class, + Double.class, + "world[ ]border damage amount", + "worldborders", + true + ) .supplier(ExprWorldBorderDamageAmount::new) - .build()); - } + .build() + ); + } @Override public @Nullable Double convert(WorldBorder worldBorder) { diff --git a/src/main/java/org/skriptlang/skript/bukkit/worldborder/elements/expressions/ExprWorldBorderDamageBuffer.java b/src/main/java/org/skriptlang/skript/bukkit/world/worldborder/elements/expressions/ExprWorldBorderDamageBuffer.java similarity index 78% rename from src/main/java/org/skriptlang/skript/bukkit/worldborder/elements/expressions/ExprWorldBorderDamageBuffer.java rename to src/main/java/org/skriptlang/skript/bukkit/world/worldborder/elements/expressions/ExprWorldBorderDamageBuffer.java index f0c2f3230f8..f35c3d7da73 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/worldborder/elements/expressions/ExprWorldBorderDamageBuffer.java +++ b/src/main/java/org/skriptlang/skript/bukkit/world/worldborder/elements/expressions/ExprWorldBorderDamageBuffer.java @@ -1,4 +1,4 @@ -package org.skriptlang.skript.bukkit.worldborder.elements.expressions; +package org.skriptlang.skript.bukkit.world.worldborder.elements.expressions; import ch.njol.skript.classes.Changer.ChangeMode; import ch.njol.skript.doc.Description; @@ -13,20 +13,28 @@ import org.skriptlang.skript.registration.SyntaxRegistry; @Name("Damage Buffer of World Border") -@Description({ - "The amount of blocks a player may safely be outside the border before taking damage.", - "Players only take damage when outside of the world's world border, and the damage buffer distance cannot be less than 0." -}) +@Description(""" + The amount of blocks a player may safely be outside the border before taking damage. + Players only take damage when outside of the world's world border, and the damage buffer distance cannot be less than 0. + """) @Example("set world border damage buffer of {_worldborder} to 10") @Since("2.11") public class ExprWorldBorderDamageBuffer extends SimplePropertyExpression { public static void register(SyntaxRegistry syntaxRegistry) { - syntaxRegistry.register(SyntaxRegistry.EXPRESSION, - infoBuilder(ExprWorldBorderDamageBuffer.class, Double.class, "world[ ]border damage buffer", "worldborders", true) + syntaxRegistry.register( + SyntaxRegistry.EXPRESSION, + infoBuilder( + ExprWorldBorderDamageBuffer.class, + Double.class, + "world[ ]border damage buffer", + "worldborders", + true + ) .supplier(ExprWorldBorderDamageBuffer::new) - .build()); - } + .build() + ); + } @Override public @Nullable Double convert(WorldBorder worldBorder) { diff --git a/src/main/java/org/skriptlang/skript/bukkit/worldborder/elements/expressions/ExprWorldBorderSize.java b/src/main/java/org/skriptlang/skript/bukkit/world/worldborder/elements/expressions/ExprWorldBorderSize.java similarity index 80% rename from src/main/java/org/skriptlang/skript/bukkit/worldborder/elements/expressions/ExprWorldBorderSize.java rename to src/main/java/org/skriptlang/skript/bukkit/world/worldborder/elements/expressions/ExprWorldBorderSize.java index e8780d16820..5f8421a564a 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/worldborder/elements/expressions/ExprWorldBorderSize.java +++ b/src/main/java/org/skriptlang/skript/bukkit/world/worldborder/elements/expressions/ExprWorldBorderSize.java @@ -1,4 +1,4 @@ -package org.skriptlang.skript.bukkit.worldborder.elements.expressions; +package org.skriptlang.skript.bukkit.world.worldborder.elements.expressions; import ch.njol.skript.doc.Description; import ch.njol.skript.doc.Example; @@ -18,28 +18,36 @@ import org.skriptlang.skript.registration.SyntaxRegistry; @Name("Size of World Border") -@Description({ - "The size of a world border.", - "The size can not be smaller than 1." -}) +@Description(""" + The size of a world border. + The size can not be smaller than 1. + """) @Example("set world border radius of {_worldborder} to 10") @Since("2.11") public class ExprWorldBorderSize extends SimplePropertyExpression { public static void register(SyntaxRegistry syntaxRegistry) { - syntaxRegistry.register(SyntaxRegistry.EXPRESSION, - infoBuilder(ExprWorldBorderSize.class, Double.class, "world[ ]border (size|diameter|:radius)", "worldborders", true) + syntaxRegistry.register( + SyntaxRegistry.EXPRESSION, + infoBuilder( + ExprWorldBorderSize.class, + Double.class, + "world[ ]border (size|diameter|:radius)", + "worldborders", + true + ) .supplier(ExprWorldBorderSize::new) - .build()); + .build() + ); } private boolean radius; private static final double MAX_WORLDBORDER_SIZE = 59999968; @Override - public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { + public boolean init(Expression[] expressions, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { radius = parseResult.hasTag("radius"); - return super.init(exprs, matchedPattern, isDelayed, parseResult); + return super.init(expressions, matchedPattern, isDelayed, parseResult); } @Override diff --git a/src/main/java/org/skriptlang/skript/bukkit/worldborder/elements/expressions/ExprWorldBorderWarningDistance.java b/src/main/java/org/skriptlang/skript/bukkit/world/worldborder/elements/expressions/ExprWorldBorderWarningDistance.java similarity index 81% rename from src/main/java/org/skriptlang/skript/bukkit/worldborder/elements/expressions/ExprWorldBorderWarningDistance.java rename to src/main/java/org/skriptlang/skript/bukkit/world/worldborder/elements/expressions/ExprWorldBorderWarningDistance.java index b2fd1702d0b..439c54aa3cc 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/worldborder/elements/expressions/ExprWorldBorderWarningDistance.java +++ b/src/main/java/org/skriptlang/skript/bukkit/world/worldborder/elements/expressions/ExprWorldBorderWarningDistance.java @@ -1,6 +1,5 @@ -package org.skriptlang.skript.bukkit.worldborder.elements.expressions; +package org.skriptlang.skript.bukkit.world.worldborder.elements.expressions; -import ch.njol.skript.Skript; import ch.njol.skript.classes.Changer.ChangeMode; import ch.njol.skript.doc.Description; import ch.njol.skript.doc.Example; @@ -14,19 +13,27 @@ import org.skriptlang.skript.registration.SyntaxRegistry; @Name("Warning Distance of World Border") -@Description({ - "The warning distance of a world border. The player's screen will be tinted red when they are within this distance of the border.", - "Players only see a red tint when approaching a world's worldborder and the warning distance has to be an integer greater than or equal to 0." -}) +@Description(""" + The warning distance of a world border. The player's screen will be tinted red when they are within this distance of the border. + Players only see a red tint when approaching a world's worldborder and the warning distance has to be an integer greater than or equal to 0. + """) @Example("set world border warning distance of {_worldborder} to 1") @Since("2.11") public class ExprWorldBorderWarningDistance extends SimplePropertyExpression { public static void register(SyntaxRegistry syntaxRegistry) { - syntaxRegistry.register(SyntaxRegistry.EXPRESSION, - infoBuilder(ExprWorldBorderWarningDistance.class, Integer.class, "world[ ]border warning distance", "worldborders", true) + syntaxRegistry.register( + SyntaxRegistry.EXPRESSION, + infoBuilder( + ExprWorldBorderWarningDistance.class, + Integer.class, + "world[ ]border warning distance", + "worldborders", + true + ) .supplier(ExprWorldBorderWarningDistance::new) - .build()); + .build() + ); } @Override diff --git a/src/main/java/org/skriptlang/skript/bukkit/worldborder/elements/expressions/ExprWorldBorderWarningTime.java b/src/main/java/org/skriptlang/skript/bukkit/world/worldborder/elements/expressions/ExprWorldBorderWarningTime.java similarity index 91% rename from src/main/java/org/skriptlang/skript/bukkit/worldborder/elements/expressions/ExprWorldBorderWarningTime.java rename to src/main/java/org/skriptlang/skript/bukkit/world/worldborder/elements/expressions/ExprWorldBorderWarningTime.java index 96fd77d9fb7..9f42bb12030 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/worldborder/elements/expressions/ExprWorldBorderWarningTime.java +++ b/src/main/java/org/skriptlang/skript/bukkit/world/worldborder/elements/expressions/ExprWorldBorderWarningTime.java @@ -1,4 +1,4 @@ -package org.skriptlang.skript.bukkit.worldborder.elements.expressions; +package org.skriptlang.skript.bukkit.world.worldborder.elements.expressions; import ch.njol.skript.Skript; import ch.njol.skript.classes.Changer.ChangeMode; @@ -23,10 +23,18 @@ public class ExprWorldBorderWarningTime extends SimplePropertyExpression { public static void register(SyntaxRegistry syntaxRegistry) { - syntaxRegistry.register(SyntaxRegistry.EXPRESSION, - infoBuilder(ExprWorldBorderWarningTime.class, Timespan.class, "world[ ]border warning time", "worldborders", true) + syntaxRegistry.register( + SyntaxRegistry.EXPRESSION, + infoBuilder( + ExprWorldBorderWarningTime.class, + Timespan.class, + "world[ ]border warning time", + "worldborders", + true + ) .supplier(ExprWorldBorderWarningTime::new) - .build()); + .build() + ); } private static final boolean USE_DEPRECATED = !Skript.methodExists(org.bukkit.WorldBorder.class,"getWarningTimeTicks"); diff --git a/src/test/java/ch/njol/skript/patterns/PatternConflictsTest.java b/src/test/java/ch/njol/skript/patterns/PatternConflictsTest.java index 8730f79eee8..9feaa611f7f 100644 --- a/src/test/java/ch/njol/skript/patterns/PatternConflictsTest.java +++ b/src/test/java/ch/njol/skript/patterns/PatternConflictsTest.java @@ -4,7 +4,6 @@ import ch.njol.skript.SkriptAPIException; import ch.njol.skript.conditions.*; import ch.njol.skript.effects.EffScriptFile; -import ch.njol.skript.effects.EffWorldLoad; import ch.njol.skript.expressions.*; import ch.njol.skript.lang.Expression; import ch.njol.skript.lang.Section; @@ -16,6 +15,7 @@ import org.junit.Test; import org.skriptlang.skript.bukkit.text.elements.expressions.ExprColored; import org.skriptlang.skript.bukkit.potion.elements.conditions.CondHasPotion; +import org.skriptlang.skript.bukkit.world.elements.effects.EffLoadWorld; import org.skriptlang.skript.common.properties.elements.conditions.PropCondContains; import org.skriptlang.skript.lang.structure.Structure; import org.skriptlang.skript.registration.SyntaxInfo; @@ -417,7 +417,7 @@ private boolean exclude(List combinations) { // Exclusions by amount of conflicts // 1 conflict EXCLUSIONS.add(new Exclusion("formatted %*%", ExprFormatDate.class, ExprColored.class)); - EXCLUSIONS.add(new Exclusion("unload %*%", EffScriptFile.class, EffWorldLoad.class)); + EXCLUSIONS.add(new Exclusion("unload %*%", EffScriptFile.class, EffLoadWorld.class)); EXCLUSIONS.add(new Exclusion("the %*% of %*%", ExprArmorSlot.class, ExprEntities.class)); EXCLUSIONS.add(new Exclusion("%*% of %*%", ExprArmorSlot.class, ExprEntities.class, ExprXOf.class)); diff --git a/src/test/skript/tests/bukkit/world/World.sk b/src/test/skript/tests/bukkit/world/World.sk new file mode 100644 index 00000000000..e47e8ce2d4c --- /dev/null +++ b/src/test/skript/tests/bukkit/world/World.sk @@ -0,0 +1,25 @@ + +# Tests for more basic world expressions/effects +test "world": + set {_world} to test-world + assert all worlds contains {_world} with "Failed to get all worlds" + set {_difficulty} to difficulty of {_world} + set {_world}'s difficulty to hard + assert {_world}'s difficulty is hard with "Failed to set difficulty of world" + set {_world}'s difficulty to {_difficulty} + parse if running minecraft "1.21.11": + set {_world}'s gamerule fall_damage to true + set {_falldamage} to whether gamerule fall_damage of {_world} is true + assert {_falldamage} is true with "Failed to set gamerule 'fall_damage' of world" + parse if running below minecraft "1.21.9": + set {_world}'s gamerule fallDamage to true + set {_falldamage} to whether gamerule fallDamage of {_world} is true + assert {_falldamage} is true with "Failed to set gamerule 'fallDamage' of world" + assert moon phase of {_world} is set with "Failed to get moon phase of world" + assert sea level of {_world} is set with "Failed to get sea level of world" + assert environment of {_world} is normal with "Failed to get environment of world" + assert world named "world" is set with "Failed to get world from string" + set {_oldloc} to spawn of {_world} + set spawn of {_world} to location(5, 7, 14, {_world}) + assert spawn of {_world} is location(5, 7, 14, {_world}) with "Failed to set spawn of world" + set spawn of {_world} to {_oldloc}