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 ccf12240d29..5caa14f02e2 100644 --- a/src/main/java/ch/njol/skript/classes/data/BukkitClasses.java +++ b/src/main/java/ch/njol/skript/classes/data/BukkitClasses.java @@ -62,6 +62,7 @@ import org.bukkit.event.inventory.ClickType; import org.bukkit.event.inventory.InventoryAction; import org.bukkit.event.inventory.InventoryType; +import org.bukkit.event.player.PlayerQuitEvent.QuitReason; import org.bukkit.event.player.PlayerResourcePackStatusEvent.Status; import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; import org.bukkit.inventory.Inventory; @@ -1458,29 +1459,29 @@ public String toVariableNameString(GameRule o) { ); Classes.registerClass(new ClassInfo<>(EnchantmentOffer.class, "enchantmentoffer") - .user("enchant[ment][ ]offers?") - .name("Enchantment Offer") - .description("The enchantmentoffer in an enchant prepare event.") - .examples("on enchant prepare:", - "\tset enchant offer 1 to sharpness 1", - "\tset the cost of enchant offer 1 to 10 levels") - .since("2.5") - .parser(new Parser() { - @Override - public boolean canParse(ParseContext context) { - return false; - } - - @Override - public String toString(EnchantmentOffer eo, int flags) { - return EnchantmentType.toString(eo.getEnchantment(), flags) + " " + eo.getEnchantmentLevel(); - } - - @Override - public String toVariableNameString(EnchantmentOffer eo) { - return "offer:" + EnchantmentType.toString(eo.getEnchantment()) + "=" + eo.getEnchantmentLevel(); - } - })); + .user("enchant[ment][ ]offers?") + .name("Enchantment Offer") + .description("The enchantmentoffer in an enchant prepare event.") + .examples("on enchant prepare:", + "\tset enchant offer 1 to sharpness 1", + "\tset the cost of enchant offer 1 to 10 levels") + .since("2.5") + .parser(new Parser() { + @Override + public boolean canParse(ParseContext context) { + return false; + } + + @Override + public String toString(EnchantmentOffer eo, int flags) { + return EnchantmentType.toString(eo.getEnchantment(), flags) + " " + eo.getEnchantmentLevel(); + } + + @Override + public String toVariableNameString(EnchantmentOffer eo) { + return "offer:" + EnchantmentType.toString(eo.getEnchantment()) + "=" + eo.getEnchantmentLevel(); + } + })); Classes.registerClass(new EnumClassInfo<>(Attribute.class, "attributetype", "attribute types") .user("attribute ?types?") @@ -1495,13 +1496,20 @@ public String toVariableNameString(EnchantmentOffer eo) { .description("Represents the environment of a world.") .since("2.7")); - if (Skript.classExists("io.papermc.paper.world.MoonPhase")) { + 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") - .requiredPlugins("Paper 1.16+")); - } + .user("(lunar|moon) ?phases?") + .name("Moon Phase") + .description("Represents the phase of a moon.") + .requiredPlugins("Paper 1.16+") + .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?") + .name("Quit Reason") + .description("Represents a quit reason from a player quit server event.") + .requiredPlugins("Paper 1.16.5+") + .since("INSERT VERSION")); } } 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 b628c56a887..9bf77216c51 100644 --- a/src/main/java/ch/njol/skript/classes/data/BukkitEventValues.java +++ b/src/main/java/ch/njol/skript/classes/data/BukkitEventValues.java @@ -18,40 +18,24 @@ */ package ch.njol.skript.classes.data; -import ch.njol.skript.Skript; -import ch.njol.skript.aliases.Aliases; -import ch.njol.skript.aliases.ItemType; -import ch.njol.skript.command.CommandEvent; -import ch.njol.skript.events.bukkit.ScriptEvent; -import ch.njol.skript.events.bukkit.SkriptStartEvent; -import ch.njol.skript.events.bukkit.SkriptStopEvent; -import ch.njol.skript.registrations.EventValues; -import ch.njol.skript.util.BlockStateBlock; -import ch.njol.skript.util.BlockUtils; -import ch.njol.skript.util.DelayedChangeBlock; -import ch.njol.skript.util.Direction; -import ch.njol.skript.util.EnchantmentType; -import ch.njol.skript.util.Getter; -import ch.njol.skript.util.slot.InventorySlot; -import ch.njol.skript.util.slot.Slot; -import com.destroystokyo.paper.event.block.AnvilDamagedEvent; -import com.destroystokyo.paper.event.entity.ProjectileCollideEvent; -import com.destroystokyo.paper.event.player.PlayerArmorChangeEvent; -import io.papermc.paper.event.entity.EntityMoveEvent; -import io.papermc.paper.event.player.PlayerInventorySlotChangeEvent; -import io.papermc.paper.event.player.PlayerTradeEvent; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + import org.bukkit.Bukkit; import org.bukkit.Chunk; import org.bukkit.FireworkEffect; +import org.bukkit.GameMode; import org.bukkit.Keyed; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.World; -import org.bukkit.GameMode; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.block.BlockState; import org.bukkit.command.CommandSender; +import org.bukkit.entity.AbstractVillager; import org.bukkit.entity.Egg; import org.bukkit.entity.Entity; import org.bukkit.entity.Firework; @@ -62,7 +46,6 @@ import org.bukkit.entity.Player; import org.bukkit.entity.Projectile; import org.bukkit.entity.Vehicle; -import org.bukkit.entity.AbstractVillager; import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.event.block.BlockCanBuildEvent; import org.bukkit.event.block.BlockDamageEvent; @@ -127,6 +110,8 @@ import org.bukkit.event.player.PlayerItemMendEvent; import org.bukkit.event.player.PlayerMoveEvent; import org.bukkit.event.player.PlayerPickupItemEvent; +import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.event.player.PlayerQuitEvent.QuitReason; import org.bukkit.event.player.PlayerRiptideEvent; import org.bukkit.event.player.PlayerShearEntityEvent; import org.bukkit.event.player.PlayerTeleportEvent; @@ -154,10 +139,29 @@ import org.bukkit.potion.PotionEffectType; import org.eclipse.jdt.annotation.Nullable; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; +import com.destroystokyo.paper.event.block.AnvilDamagedEvent; +import com.destroystokyo.paper.event.entity.ProjectileCollideEvent; +import com.destroystokyo.paper.event.player.PlayerArmorChangeEvent; + +import ch.njol.skript.Skript; +import ch.njol.skript.aliases.Aliases; +import ch.njol.skript.aliases.ItemType; +import ch.njol.skript.command.CommandEvent; +import ch.njol.skript.events.bukkit.ScriptEvent; +import ch.njol.skript.events.bukkit.SkriptStartEvent; +import ch.njol.skript.events.bukkit.SkriptStopEvent; +import ch.njol.skript.registrations.EventValues; +import ch.njol.skript.util.BlockStateBlock; +import ch.njol.skript.util.BlockUtils; +import ch.njol.skript.util.DelayedChangeBlock; +import ch.njol.skript.util.Direction; +import ch.njol.skript.util.EnchantmentType; +import ch.njol.skript.util.Getter; +import ch.njol.skript.util.slot.InventorySlot; +import ch.njol.skript.util.slot.Slot; +import io.papermc.paper.event.entity.EntityMoveEvent; +import io.papermc.paper.event.player.PlayerInventorySlotChangeEvent; +import io.papermc.paper.event.player.PlayerTradeEvent; /** * @author Peter Güttinger @@ -1644,5 +1648,15 @@ public Location get(LootGenerateEvent event) { } }, EventValues.TIME_NOW); } + + //PlayerQuitEvent + if (Skript.classExists("org.bukkit.event.player.PlayerQuitEvent$QuitReason")) + EventValues.registerEventValue(PlayerQuitEvent.class, QuitReason.class, new Getter() { + @Override + @Nullable + public QuitReason get(PlayerQuitEvent event) { + return event.getReason(); + } + }, EventValues.TIME_NOW); } } diff --git a/src/main/java/ch/njol/skript/expressions/ExprQuitReason.java b/src/main/java/ch/njol/skript/expressions/ExprQuitReason.java new file mode 100644 index 00000000000..6d5fd5cf751 --- /dev/null +++ b/src/main/java/ch/njol/skript/expressions/ExprQuitReason.java @@ -0,0 +1,69 @@ +/** + * This file is part of Skript. + * + * Skript is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Skript is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Skript. If not, see . + * + * Copyright Peter Güttinger, SkriptLang team and contributors + */ +package ch.njol.skript.expressions; + +import org.bukkit.event.Event; +import org.bukkit.event.player.PlayerQuitEvent.QuitReason; +import org.eclipse.jdt.annotation.Nullable; + +import ch.njol.skript.Skript; +import ch.njol.skript.doc.Description; +import ch.njol.skript.doc.Examples; +import ch.njol.skript.doc.Name; +import ch.njol.skript.doc.RequiredPlugins; +import ch.njol.skript.doc.Since; +import ch.njol.skript.expressions.base.EventValueExpression; +import ch.njol.skript.lang.ExpressionType; +import ch.njol.skript.registrations.EventValues; + +@Name("Quit Reason") +@Description("The quit reason as to why a player disconnected in a quit event.") +@Examples({ + "on quit:", + "\tquit reason was kicked", + "\tplayer is banned", + "\tclear {server::player::%uuid of player%::*}" +}) +@RequiredPlugins("Paper 1.16.5+") +@Since("INSERT VERSION") +public class ExprQuitReason extends EventValueExpression { + + static { + if (Skript.classExists("org.bukkit.event.player.PlayerQuitEvent$QuitReason")) + Skript.registerExpression(ExprQuitReason.class, QuitReason.class, ExpressionType.SIMPLE, "[the] (quit|disconnect) (cause|reason)"); + } + + public ExprQuitReason() { + super(QuitReason.class); + } + + // Allow for 'the quit reason was ...' as that's proper grammar support for this event value. + @Override + public boolean setTime(int time) { + if (time == EventValues.TIME_FUTURE) + return super.setTime(time); + return true; + } + + @Override + public String toString(@Nullable Event event, boolean debug) { + return "quit reason"; + } + +} diff --git a/src/main/resources/lang/default.lang b/src/main/resources/lang/default.lang index e86820ed0c2..02909f887b2 100644 --- a/src/main/resources/lang/default.lang +++ b/src/main/resources/lang/default.lang @@ -1932,6 +1932,13 @@ moon phases: waxing_crescent: waxing crescent waxing_gibbous: waxing gibbous +# -- Quit Reasons -- +quit reasons: + disconnected: disconnected, quit + erroneous_state: erroneous, erroneous state + kicked: kicked + timed_out: timed out + # -- Boolean -- boolean: true: @@ -2000,6 +2007,7 @@ types: resourcepackstate: resource pack state¦s @a gene: panda gene¦s @a gamerulevalue: gamerule value¦s @a + quitreason: quit reason¦s @a # Skript weathertype: weather type¦s @a