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 extends World> 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