diff --git a/src/main/java/ch/njol/skript/Skript.java b/src/main/java/ch/njol/skript/Skript.java index 216bc6687d8..ef9e063b60f 100644 --- a/src/main/java/ch/njol/skript/Skript.java +++ b/src/main/java/ch/njol/skript/Skript.java @@ -6,7 +6,6 @@ import ch.njol.skript.classes.data.*; import ch.njol.skript.command.Commands; import ch.njol.skript.doc.Documentation; -import ch.njol.skript.events.EvtSkript; import ch.njol.skript.expressions.arithmetic.ExprArithmetic; import ch.njol.skript.hooks.Hook; import ch.njol.skript.lang.*; @@ -65,6 +64,7 @@ import org.skriptlang.skript.bukkit.SkriptMetrics; import org.skriptlang.skript.bukkit.lang.eventvalue.EventValueRegistry; import org.skriptlang.skript.bukkit.log.runtime.BukkitRuntimeErrorConsumer; +import org.skriptlang.skript.bukkit.misc.elements.events.EvtSkript; import org.skriptlang.skript.bukkit.registration.BukkitSyntaxInfos; import org.skriptlang.skript.bukkit.text.TextComponentParser; import org.skriptlang.skript.common.CommonModule; 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..b182ebcf8fb 100644 --- a/src/main/java/ch/njol/skript/classes/data/BukkitEventValues.java +++ b/src/main/java/ch/njol/skript/classes/data/BukkitEventValues.java @@ -433,14 +433,6 @@ else if (hand == EquipmentSlot.OFF_HAND) registry.register(EventValue.simple(CommandEvent.class, World.class, e -> e.getSender() instanceof Player ? ((Player) e.getSender()).getWorld() : null)); registry.register(EventValue.simple(CommandEvent.class, Block.class, event -> event.getSender() instanceof BlockCommandSender sender ? sender.getBlock() : null)); - // === ServerEvents === - // Script load/unload event - registry.register(EventValue.simple(ScriptEvent.class, CommandSender.class, event -> Bukkit.getConsoleSender())); - // Server load event - registry.register(EventValue.simple(SkriptStartEvent.class, CommandSender.class, event -> Bukkit.getConsoleSender())); - // Server stop event - registry.register(EventValue.simple(SkriptStopEvent.class, CommandSender.class, event -> Bukkit.getConsoleSender())); - // === InventoryEvents === // InventoryClickEvent registry.register(EventValue.simple(InventoryClickEvent.class, Player.class, event -> event.getWhoClicked() instanceof Player player ? player : null)); @@ -499,9 +491,6 @@ else if (hand == EquipmentSlot.OFF_HAND) } return inventories.toArray(new Inventory[0]); })); - // PrepareAnvilEvent - if (Skript.classExists("com.destroystokyo.paper.event.inventory.PrepareResultEvent")) - registry.register(EventValue.simple(PrepareAnvilEvent.class, ItemStack.class, PrepareResultEvent::getResult)); //BlockFertilizeEvent registry.register(EventValue.simple(BlockFertilizeEvent.class, Player.class, BlockFertilizeEvent::getPlayer)); registry.register(EventValue.simple(BlockFertilizeEvent.class, Block[].class, event -> event.getBlocks().stream() @@ -664,17 +653,6 @@ else if (hand == EquipmentSlot.OFF_HAND) } })); } - //PrepareItemEnchantEvent - registry.register(EventValue.simple(PrepareItemEnchantEvent.class, Player.class, PrepareItemEnchantEvent::getEnchanter)); - registry.register(EventValue.simple(PrepareItemEnchantEvent.class, ItemStack.class, PrepareItemEnchantEvent::getItem)); - registry.register(EventValue.simple(PrepareItemEnchantEvent.class, Block.class, PrepareItemEnchantEvent::getEnchantBlock)); - //EnchantItemEvent - registry.register(EventValue.simple(EnchantItemEvent.class, Player.class, EnchantItemEvent::getEnchanter)); - registry.register(EventValue.simple(EnchantItemEvent.class, ItemStack.class, EnchantItemEvent::getItem)); - registry.register(EventValue.simple(EnchantItemEvent.class, EnchantmentType[].class, event -> event.getEnchantsToAdd().entrySet().stream() - .map(entry -> new EnchantmentType(entry.getKey(), entry.getValue())) - .toArray(EnchantmentType[]::new))); - registry.register(EventValue.simple(EnchantItemEvent.class, Block.class, EnchantItemEvent::getEnchantBlock)); registry.register(EventValue.simple(HorseJumpEvent.class, Entity.class, HorseJumpEvent::getEntity)); // PlayerTradeEvent if (Skript.classExists("io.papermc.paper.event.player.PlayerTradeEvent")) { diff --git a/src/main/java/ch/njol/skript/events/EvtPeriodical.java b/src/main/java/ch/njol/skript/events/EvtPeriodical.java deleted file mode 100644 index 82dc65756da..00000000000 --- a/src/main/java/ch/njol/skript/events/EvtPeriodical.java +++ /dev/null @@ -1,108 +0,0 @@ -package ch.njol.skript.events; - -import ch.njol.skript.Skript; -import ch.njol.skript.SkriptEventHandler; -import ch.njol.skript.events.bukkit.ScheduledEvent; -import ch.njol.skript.events.bukkit.ScheduledNoWorldEvent; -import ch.njol.skript.lang.Literal; -import ch.njol.skript.lang.SkriptEvent; -import ch.njol.skript.lang.SkriptParser.ParseResult; -import ch.njol.skript.util.Timespan; -import org.bukkit.Bukkit; -import org.bukkit.World; -import org.bukkit.event.Event; -import org.jetbrains.annotations.Nullable; - -public class EvtPeriodical extends SkriptEvent { - - static { - Skript.registerEvent("*Periodical", EvtPeriodical.class, ScheduledNoWorldEvent.class, "every %timespan%") - .description("An event that is called periodically.") - .examples( - "every 2 seconds:", - "every minecraft hour:", - "every tick: # can cause lag depending on the code inside the event", - "every minecraft days:" - ).since("1.0"); - Skript.registerEvent("*Periodical", EvtPeriodical.class, ScheduledEvent.class, "every %timespan% in [world[s]] %worlds%") - .description("An event that is called periodically.") - .examples( - "every 2 seconds in \"world\":", - "every minecraft hour in \"flatworld\":", - "every tick in \"world\": # can cause lag depending on the code inside the event", - "every minecraft days in \"plots\":" - ).since("1.0") - .documentationID("eventperiodical"); - } - - @SuppressWarnings("NotNullFieldNotInitialized") - private Timespan period; - - @SuppressWarnings("NotNullFieldNotInitialized") - private int[] taskIDs; - - private World @Nullable [] worlds; - - @Override - @SuppressWarnings("unchecked") - public boolean init(Literal[] args, int matchedPattern, ParseResult parseResult) { - period = ((Literal) args[0]).getSingle(); - if (args.length > 1 && args[1] != null) - worlds = ((Literal) args[1]).getArray(); - return true; - } - - @Override - public boolean postLoad() { - long ticks = period.getAs(Timespan.TimePeriod.TICK); - - if (worlds == null) { - taskIDs = new int[]{ - Bukkit.getScheduler().scheduleSyncRepeatingTask( - Skript.getInstance(), () -> execute(null), ticks, ticks - ) - }; - } else { - taskIDs = new int[worlds.length]; - for (int i = 0; i < worlds.length; i++) { - World world = worlds[i]; - taskIDs[i] = Bukkit.getScheduler().scheduleSyncRepeatingTask( - Skript.getInstance(), () -> execute(world), ticks - (world.getFullTime() % ticks), ticks - ); - } - } - - return true; - } - - @Override - public void unload() { - for (int taskID : taskIDs) - Bukkit.getScheduler().cancelTask(taskID); - } - - @Override - public boolean check(Event event) { - throw new UnsupportedOperationException(); - } - - @Override - public boolean isEventPrioritySupported() { - return false; - } - - @Override - public String toString(@Nullable Event event, boolean debug) { - return "every " + period; - } - - private void execute(@Nullable World world) { - ScheduledEvent event = world == null ? new ScheduledNoWorldEvent() : new ScheduledEvent(world); - SkriptEventHandler.logEventStart(event); - SkriptEventHandler.logTriggerStart(trigger); - trigger.execute(event); - SkriptEventHandler.logTriggerEnd(trigger); - SkriptEventHandler.logEventEnd(); - } - -} diff --git a/src/main/java/ch/njol/skript/events/SimpleEvents.java b/src/main/java/ch/njol/skript/events/SimpleEvents.java index c06ba440459..c771d8c466d 100644 --- a/src/main/java/ch/njol/skript/events/SimpleEvents.java +++ b/src/main/java/ch/njol/skript/events/SimpleEvents.java @@ -390,22 +390,6 @@ public class SimpleEvents { " cancel event") .since("2.3"); - Class serverListPingEventClass = (Skript.classExists("com.destroystokyo.paper.event.server.PaperServerListPingEvent") - ? PaperServerListPingEvent.class : ServerListPingEvent.class); - Skript.registerEvent("Server List Ping", SimpleEvent.class, serverListPingEventClass, "server [list] ping") - .description("Called when a server list ping is coming in, generally when a Minecraft client pings the server to show its information in the server list.", - "The IP expression can be used to get the IP adress of the pinger.", - "This event can be cancelled on PaperSpigot 1.12.2+ only and this means the player will see the server as offline (but still can join).", - "", - "Also you can use MOTD, Max Players, " + - "Online Players Count, Protocol Version, " + - "Version String, Hover List and Server Icon " + - "expressions, and Player Info Visibility and Hide Player from Server List effects to modify the server list.") - .examples("on server list ping:", - " set the motd to \"Welcome %{player-by-IP::%ip%}%! Join now!\" if {player-by-IP::%ip%} is set, else \"Join now!\"", - " set the fake max players count to (online players count + 1)", - " set the shown icon to a random server icon out of {server-icons::*}") - .since("2.3"); Skript.registerEvent("Swim Toggle", SimpleEvent.class, EntityToggleSwimEvent.class, "[entity] toggl(e|ing) swim", "[entity] swim toggl(e|ing)") .description("Called when an entity swims or stops swimming.") @@ -427,20 +411,7 @@ public class SimpleEvents { "\tloop absorbed blocks:", "\t\tbroadcast \"%loop-block% was absorbed by a sponge\"!") .since("2.5"); - Skript.registerEvent("Enchant Prepare", SimpleEvent.class, PrepareItemEnchantEvent.class, "[item] enchant prepare") - .description("Called when a player puts an item into enchantment table. This event may be called multiple times.", - " To get the enchant item, see the enchant item expression") - .examples("on enchant prepare:", - "\tset enchant offer 1 to sharpness 1", - "\tset the cost of enchant offer 1 to 10 levels") - .since("2.5"); - Skript.registerEvent("Enchant", SimpleEvent.class, EnchantItemEvent.class, "[item] enchant") - .description("Called when a player successfully enchants an item.", - " To get the enchanted item, see the enchant item expression") - .examples("on enchant:", - "\tif the clicked button is 1: # offer 1", - "\t\tset the applied enchantments to sharpness 10 and unbreaking 10") - .since("2.5"); + Skript.registerEvent("Inventory Pickup", SimpleEvent.class, InventoryPickupItemEvent.class, "inventory pick[ ]up") .description("Called when an inventory (a hopper, a hopper minecart, etc.) picks up an item") .examples("on inventory pickup:") @@ -469,14 +440,7 @@ public class SimpleEvents { "\t\tcancel the event", "\t\tsend \"Oops! Mending failed!\" to player") .since("2.5.1"); - Skript.registerEvent("Anvil Prepare", SimpleEvent.class, PrepareAnvilEvent.class, "anvil prepar(e|ing)") - .description("Called when an item is put in a slot for repair by an anvil. Please note that this event is called multiple times in a single item slot move.") - .examples("on anvil prepare:", - "\tevent-item is set # result item", - "\tchance of 5%:", - "\t\tset repair cost to repair cost * 50%", - "\t\tsend \"You're LUCKY! You got 50% discount.\" to player") - .since("2.7"); + if (Skript.classExists("io.papermc.paper.event.player.PlayerTradeEvent")) { Skript.registerEvent("Player Trade", SimpleEvent.class, PlayerTradeEvent.class, "player trad(e|ing)") .description("Called when a player has traded with a villager.") @@ -629,14 +593,6 @@ public class SimpleEvents { .since("2.10"); } - Skript.registerEvent("Broadcast", SimpleEvent.class, BroadcastMessageEvent.class, "broadcast") - .description("Called when a message is broadcasted.") - .examples( - "on broadcast:", - "\tset broadcast-message to \"&c[BROADCAST] %broadcasted message%\"" - ) - .since("2.10"); - Skript.registerEvent("Experience Cooldown Change", SimpleEvent.class, PlayerExpCooldownChangeEvent.class, "player (experience|[e]xp) cooldown change") .description( "Called when a player's experience cooldown changes.", diff --git a/src/main/java/ch/njol/skript/events/bukkit/ScheduledEvent.java b/src/main/java/ch/njol/skript/events/bukkit/ScheduledEvent.java index a4c0fb21ac7..cb42f367ce4 100644 --- a/src/main/java/ch/njol/skript/events/bukkit/ScheduledEvent.java +++ b/src/main/java/ch/njol/skript/events/bukkit/ScheduledEvent.java @@ -1,6 +1,5 @@ package ch.njol.skript.events.bukkit; -import ch.njol.skript.registrations.EventValues; import org.bukkit.World; import org.bukkit.event.Event; import org.bukkit.event.HandlerList; @@ -10,12 +9,6 @@ * @author Peter Güttinger */ public class ScheduledEvent extends Event { - - static { - EventValues.registerEventValue(ScheduledEvent.class, World.class, ScheduledEvent::getWorld, EventValues.TIME_NOW, - "There's no world in a periodic event if no world is given in the event (e.g. like 'every hour in \"world\"')", - ScheduledNoWorldEvent.class); - } @Nullable private final World world; diff --git a/src/main/java/org/skriptlang/skript/bukkit/enchantments/EnchantmentModule.java b/src/main/java/org/skriptlang/skript/bukkit/enchantments/EnchantmentModule.java index ab55563a0e4..a2a8209370f 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/enchantments/EnchantmentModule.java +++ b/src/main/java/org/skriptlang/skript/bukkit/enchantments/EnchantmentModule.java @@ -8,6 +8,7 @@ import org.skriptlang.skript.addon.AddonModule; import org.skriptlang.skript.addon.HierarchicalAddonModule; import org.skriptlang.skript.addon.SkriptAddon; +import org.skriptlang.skript.bukkit.enchantments.elements.EnchantmentEvents; import org.skriptlang.skript.bukkit.enchantments.elements.conditions.CondIsEnchanted; import org.skriptlang.skript.bukkit.enchantments.elements.conditions.CondItemEnchantmentGlint; import org.skriptlang.skript.bukkit.enchantments.elements.effects.EffEnchant; @@ -16,6 +17,7 @@ import org.skriptlang.skript.bukkit.enchantments.types.EnchantmentClassInfo; import org.skriptlang.skript.bukkit.enchantments.types.EnchantmentOfferClassInfo; import org.skriptlang.skript.bukkit.enchantments.types.EnchantmentTypeClassInfo; +import org.skriptlang.skript.bukkit.lang.eventvalue.EventValueRegistry; import org.skriptlang.skript.lang.comparator.Comparators; import org.skriptlang.skript.lang.comparator.Relation; import org.skriptlang.skript.lang.converter.Converters; @@ -55,6 +57,8 @@ private void initConverters() { @Override protected void loadSelf(SkriptAddon addon) { + EnchantmentEvents.register(moduleRegistry(addon), addon.registry(EventValueRegistry.class)); + register(addon, CondIsEnchanted::register, CondItemEnchantmentGlint::register, diff --git a/src/main/java/org/skriptlang/skript/bukkit/enchantments/elements/EnchantmentEvents.java b/src/main/java/org/skriptlang/skript/bukkit/enchantments/elements/EnchantmentEvents.java new file mode 100644 index 00000000000..589fe5aceb3 --- /dev/null +++ b/src/main/java/org/skriptlang/skript/bukkit/enchantments/elements/EnchantmentEvents.java @@ -0,0 +1,82 @@ +package org.skriptlang.skript.bukkit.enchantments.elements; + +import ch.njol.skript.lang.util.SimpleEvent; +import ch.njol.skript.util.EnchantmentType; +import org.bukkit.block.Block; +import org.bukkit.entity.Player; +import org.bukkit.event.enchantment.EnchantItemEvent; +import org.bukkit.event.enchantment.PrepareItemEnchantEvent; +import org.bukkit.inventory.ItemStack; +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 EnchantmentEvents { + + public static void register(SyntaxRegistry syntaxRegistry, EventValueRegistry eventValueRegistry) { + syntaxRegistry.register(BukkitSyntaxInfos.Event.KEY, BukkitSyntaxInfos.Event.builder(SimpleEvent.class, "Enchant Prepare") + .addEvent(PrepareItemEnchantEvent.class) + .addPatterns("[item] enchant prepare") + .addDescription(""" + Called when a player puts an item into an enchantment table. + This event may be called multiple times. + See enchant item expression on how to get the enchant item. + """) + .addExample(""" + on item enchant prepare: + set enchant offer 1 to sharpness 1 + set the cost of enchantment offer 1 to 10 levels + """) + .addSince("2.5") + .supplier(() -> new SimpleEvent("item enchant prepare")) + .build()); + + eventValueRegistry.register(EventValue.builder(PrepareItemEnchantEvent.class, Player.class) + .getter(PrepareItemEnchantEvent::getEnchanter) + .build()); + + eventValueRegistry.register(EventValue.builder(PrepareItemEnchantEvent.class, ItemStack.class) + .getter(PrepareItemEnchantEvent::getItem) + .build()); + + eventValueRegistry.register(EventValue.builder(PrepareItemEnchantEvent.class, Block.class) + .getter(PrepareItemEnchantEvent::getEnchantBlock) + .build()); + + syntaxRegistry.register(BukkitSyntaxInfos.Event.KEY, BukkitSyntaxInfos.Event.builder(SimpleEvent.class, "Item Enchant") + .addEvent(EnchantItemEvent.class) + .addPatterns("[item] enchant") + .addDescription(""" + Called when a player successfully enchants an item. + See enchant item expression on how to get the enchanted item. + """) + .addExample(""" + on enchant: + if the clicked button is 1: + set the applied enchantments to (sharpness 10 and unbreaking 10) + """) + .addSince("2.5") + .supplier(() -> new SimpleEvent("item enchant")) + .build()); + + eventValueRegistry.register(EventValue.builder(EnchantItemEvent.class, Player.class) + .getter(EnchantItemEvent::getEnchanter) + .build()); + + eventValueRegistry.register(EventValue.builder(EnchantItemEvent.class, ItemStack.class) + .getter(EnchantItemEvent::getItem) + .build()); + + eventValueRegistry.register(EventValue.builder(EnchantItemEvent.class, EnchantmentType[].class) + .getter(event -> event.getEnchantsToAdd().entrySet().stream() + .map(entry -> new EnchantmentType(entry.getKey(), entry.getValue())) + .toArray(EnchantmentType[]::new)) + .build()); + + eventValueRegistry.register(EventValue.builder(EnchantItemEvent.class, Block.class) + .getter(EnchantItemEvent::getEnchantBlock) + .build()); + } + +} diff --git a/src/main/java/org/skriptlang/skript/bukkit/misc/MiscModule.java b/src/main/java/org/skriptlang/skript/bukkit/misc/MiscModule.java index 8557a4c9d69..ed6aac598d7 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/misc/MiscModule.java +++ b/src/main/java/org/skriptlang/skript/bukkit/misc/MiscModule.java @@ -3,7 +3,9 @@ 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.misc.elements.effects.EffRotate; +import org.skriptlang.skript.bukkit.misc.elements.events.*; import org.skriptlang.skript.bukkit.misc.elements.expressions.*; public class MiscModule extends HierarchicalAddonModule { @@ -14,7 +16,16 @@ public MiscModule(AddonModule parentModule) { @Override protected void loadSelf(SkriptAddon addon) { + EventValueRegistry eventValueRegistry = addon.registry(EventValueRegistry.class); + + MiscEvents.register(moduleRegistry(addon), eventValueRegistry); + register(addon, + EvtAtTime::register, + syntaxRegistry -> EvtPeriodical.register(syntaxRegistry, eventValueRegistry), + EvtRealTime::register, + syntaxRegistry -> EvtScript.register(syntaxRegistry, eventValueRegistry), + syntaxRegistry -> EvtSkript.register(syntaxRegistry, eventValueRegistry), EffRotate::register, ExprBroadcastMessage::register, ExprColorOf::register, diff --git a/src/main/java/ch/njol/skript/events/EvtAtTime.java b/src/main/java/org/skriptlang/skript/bukkit/misc/elements/events/EvtAtTime.java similarity index 82% rename from src/main/java/ch/njol/skript/events/EvtAtTime.java rename to src/main/java/org/skriptlang/skript/bukkit/misc/elements/events/EvtAtTime.java index ff7024926f3..2af913d07ef 100644 --- a/src/main/java/ch/njol/skript/events/EvtAtTime.java +++ b/src/main/java/org/skriptlang/skript/bukkit/misc/elements/events/EvtAtTime.java @@ -1,4 +1,4 @@ -package ch.njol.skript.events; +package org.skriptlang.skript.bukkit.misc.elements.events; import ch.njol.skript.Skript; import ch.njol.skript.SkriptEventHandler; @@ -13,27 +13,40 @@ import org.bukkit.World; import org.bukkit.event.Event; import org.jetbrains.annotations.Nullable; +import org.skriptlang.skript.bukkit.registration.BukkitSyntaxInfos; +import org.skriptlang.skript.registration.SyntaxRegistry; import java.util.Iterator; import java.util.Map; -import java.util.Map.Entry; import java.util.PriorityQueue; import java.util.concurrent.ConcurrentHashMap; public class EvtAtTime extends SkriptEvent implements Comparable { - static { - Skript.registerEvent("*At Time", EvtAtTime.class, ScheduledEvent.class, "at %time% [in %worlds%]") - .description("An event that occurs at a given minecraft time in every world or only in specific worlds.") - .examples("at 18:00", "at 7am in \"world\"") - .since("1.3.4"); + public static void register(SyntaxRegistry syntaxRegistry) { + syntaxRegistry.register(BukkitSyntaxInfos.Event.KEY, BukkitSyntaxInfos.Event.builder(EvtAtTime.class, "At Time") + .supplier(EvtAtTime::new) + .addEvent(ScheduledEvent.class) + .addPattern("at %time% [in %-worlds%]") + .addDescription("An event that occurs at a given minecraft time in every world or only in specific worlds.") + .addExample(""" + at 7am in "world": + broadcast "Rise and shine!" in "world" + """) + .addExample(""" + at 9pm: + broadcast "Time to get some sleep.." + """) + .addSince("1.3.4") + .build()); } - + private static final int CHECK_PERIOD = 10; private static final Map TRIGGERS = new ConcurrentHashMap<>(); private static final class EvtAtInfo { + /** * Stores the last world time that this object's instances were checked. */ @@ -48,14 +61,17 @@ private static final class EvtAtInfo { private int time; - @SuppressWarnings("NotNullFieldNotInitialized") private World[] worlds; @Override @SuppressWarnings("unchecked") public boolean init(Literal[] args, int matchedPattern, ParseResult parseResult) { time = ((Literal