Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
8e25528
Merge remote-tracking branch 'upstream/dev/patch' into dev/feature
Absolutionism Sep 28, 2025
4190cf1
Merge branch 'dev/feature' of https://github.com/SkriptLang/Skript in…
Absolutionism Oct 1, 2025
018f2ef
Merge branch 'dev/feature' of https://github.com/SkriptLang/Skript in…
Absolutionism Oct 2, 2025
ae0e74a
Merge branch 'dev/feature' of https://github.com/SkriptLang/Skript in…
Absolutionism Oct 15, 2025
acd6b90
Merge branch 'dev/feature' of https://github.com/SkriptLang/Skript in…
Absolutionism Oct 15, 2025
c511c86
Merge branch 'dev/feature' of https://github.com/SkriptLang/Skript in…
Absolutionism Oct 18, 2025
7dea880
Merge branch 'dev/feature' of https://github.com/SkriptLang/Skript in…
Absolutionism Nov 2, 2025
827e4ae
Merge branch 'dev/feature' of https://github.com/SkriptLang/Skript in…
Absolutionism Nov 11, 2025
6c1f214
Merge branch 'dev/feature' of https://github.com/SkriptLang/Skript in…
Absolutionism Dec 4, 2025
6225fcf
Merge branch 'dev/feature' of https://github.com/SkriptLang/Skript in…
Absolutionism Jan 1, 2026
b7f914e
Merge branch 'dev/feature' of https://github.com/SkriptLang/Skript in…
Absolutionism Jan 10, 2026
7adb18e
Merge branch 'dev/feature' of https://github.com/SkriptLang/Skript in…
Absolutionism Jan 11, 2026
fdfa443
Merge branch 'dev/feature' of https://github.com/SkriptLang/Skript in…
Absolutionism Feb 10, 2026
bbc11cc
Merge branch 'dev/feature' of https://github.com/SkriptLang/Skript in…
Absolutionism Apr 16, 2026
9918e16
Merge branch 'dev/feature' of https://github.com/SkriptLang/Skript in…
Absolutionism May 5, 2026
7133b0e
Merge branch 'dev/feature' of https://github.com/SkriptLang/Skript in…
Absolutionism Jun 4, 2026
f570eab
Merge branch 'dev/feature' of https://github.com/SkriptLang/Skript in…
Absolutionism Jun 28, 2026
09dcac6
Update gradlew.bat
Absolutionism Jun 28, 2026
fac5947
Merge branch 'dev/feature' of https://github.com/SkriptLang/Skript in…
Absolutionism Jun 30, 2026
988517a
Merge branch 'dev/feature' of https://github.com/SkriptLang/Skript in…
Absolutionism Jul 5, 2026
2ad6a50
Initial Commit
Absolutionism Jul 6, 2026
9d9f7b7
Sync gradlew.bat line endings with upstream
Absolutionism Jul 7, 2026
b398656
Dialog Effect Command
Absolutionism Jul 7, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions src/main/java/ch/njol/skript/SkriptConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import ch.njol.skript.update.ReleaseChannel;
import ch.njol.skript.util.FileUtils;
import ch.njol.skript.util.Timespan;
import ch.njol.skript.util.Timespan.TimePeriod;
import ch.njol.skript.util.Version;
import ch.njol.skript.variables.FlatFileStorage;
import ch.njol.skript.variables.Variables;
Expand Down Expand Up @@ -138,6 +139,9 @@ public static EventRegistry<Event> eventRegistry() {
public static final Option<Boolean> enableEffectCommands = new Option<>("enable effect commands", false);
public static final Option<String> effectCommandToken = new Option<>("effect command token", "!");
public static final Option<Boolean> allowOpsToUseEffectCommands = new Option<>("allow ops to use effect commands", false);
public static final Option<String> multilineEffectCommandToken = new Option<>("multiline effect command token", "!-");
public static final Option<String> multilineEffectTabToken = new Option<>("multiline effect command tab token", "\\t");
public static final Option<Timespan> multilineEffectTimeout = new Option<>("multiline effect command timeout", new Timespan(TimePeriod.MINUTE, 1));

public static final Option<Boolean> logEffectCommands = new Option<>("log effect commands", false);

Expand Down
67 changes: 5 additions & 62 deletions src/main/java/ch/njol/skript/command/Commands.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,20 +3,13 @@
import ch.njol.skript.ScriptLoader;
import ch.njol.skript.Skript;
import ch.njol.skript.SkriptConfig;
import ch.njol.skript.lang.Effect;
import ch.njol.skript.lang.TriggerItem;
import ch.njol.skript.lang.parser.ParserInstance;
import ch.njol.skript.localization.ArgsMessage;
import ch.njol.skript.localization.Message;
import ch.njol.skript.log.RetainingLogHandler;
import ch.njol.skript.log.SkriptLogger;
import ch.njol.skript.variables.Variables;
import com.google.common.base.Preconditions;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.command.ConsoleCommandSender;
import org.bukkit.command.SimpleCommandMap;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
Expand All @@ -29,7 +22,6 @@
import org.bukkit.plugin.SimplePluginManager;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.annotations.NotNull;
import org.skriptlang.skript.bukkit.text.TextComponentParser;
import org.skriptlang.skript.lang.script.Script;

import java.io.File;
Expand Down Expand Up @@ -158,62 +150,13 @@ public void onPlayerCommand(PlayerCommandPreprocessEvent event) {
public void onServerCommand(ServerCommandEvent event) {
if (event.getCommand().isEmpty() || event.isCancelled())
return;
if ((Skript.testing() || SkriptConfig.enableEffectCommands.value()) && event.getCommand().startsWith(SkriptConfig.effectCommandToken.value())) {
if (handleEffectCommand(event.getSender(), event.getCommand()))
if (EffectCommandUtils.canUse(event.getCommand())) {
if (EffectCommandUtils.handleEffectCommand(event.getSender(), event.getCommand()))
event.setCancelled(true);
}
}
};

static boolean handleEffectCommand(CommandSender sender, String command) {
if (!(Skript.testing() || sender instanceof ConsoleCommandSender || sender.hasPermission("skript.effectcommands") || SkriptConfig.allowOpsToUseEffectCommands.value() && sender.isOp()))
return false;
try {
command = "" + command.substring(SkriptConfig.effectCommandToken.value().length()).trim();
RetainingLogHandler log = SkriptLogger.startRetainingLog();
try {
// Call the event on the Bukkit API for addon developers.
EffectCommandEvent effectCommand = new EffectCommandEvent(sender, command);
Bukkit.getPluginManager().callEvent(effectCommand);
command = effectCommand.getCommand();
ParserInstance parserInstance = ParserInstance.get();
parserInstance.setCurrentEvent("effect command", EffectCommandEvent.class);
Effect effect = Effect.parse(command, null);
parserInstance.deleteCurrentEvent();

TextComponentParser textParser = TextComponentParser.instance();
if (effect != null) {
log.clear(); // ignore warnings and stuff
log.printLog();
if (!effectCommand.isCancelled()) {
sender.sendMessage(textParser.parse("<gray>Executing '" + textParser.escape(command) + "'"));
if (SkriptConfig.logEffectCommands.value() && !(sender instanceof ConsoleCommandSender))
Skript.info(sender.getName() + " issued effect command: " + textParser.escape(command));
TriggerItem.walk(effect, effectCommand);
Variables.removeLocals(effectCommand);
} else {
sender.sendMessage(textParser.parse("<red>Your effect command '" + textParser.escape(command) + "' was cancelled."));
}
} else {
if (sender == Bukkit.getConsoleSender()) // log as SEVERE instead of INFO like printErrors below
// No need to escape command here, logger will do it
SkriptLogger.LOGGER.severe("Error in: " + command);
else
sender.sendMessage(textParser.parse("<red>Error in: <gray>" + textParser.escape(command)));
// TODO errors likely need to be escaped too
log.printErrors(sender, "(No specific information is available)");
}
} finally {
log.stop();
}
return true;
} catch (Exception e) {
Skript.exception(e, "Unexpected error while executing effect command '" + TextComponentParser.instance().escape(command) + "' by '" + sender.getName() + "'");
sender.sendRichMessage("<red>An internal error occurred while executing this effect. Please refer to the server log for details.");
return true;
}
}

@Nullable
public static ScriptCommand getScriptCommand(String key) {
return commands.get(key);
Expand Down Expand Up @@ -284,13 +227,13 @@ public static void registerListeners() {
Bukkit.getPluginManager().registerEvents(new Listener() {
@EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true)
public void onPlayerChat(AsyncPlayerChatEvent event) {
if ((!SkriptConfig.enableEffectCommands.value() && !Skript.testing()) || !event.getMessage().startsWith(SkriptConfig.effectCommandToken.value()))
if (!EffectCommandUtils.canUse(event.getMessage()))
return;
if (!event.isAsynchronous()) {
if (handleEffectCommand(event.getPlayer(), event.getMessage()))
if (EffectCommandUtils.handleEffectCommand(event.getPlayer(), event.getMessage()))
event.setCancelled(true);
} else {
Future<Boolean> f = Bukkit.getScheduler().callSyncMethod(Skript.getInstance(), () -> handleEffectCommand(event.getPlayer(), event.getMessage()));
Future<Boolean> f = Bukkit.getScheduler().callSyncMethod(Skript.getInstance(), () -> EffectCommandUtils.handleEffectCommand(event.getPlayer(), event.getMessage()));
try {
while (true) {
try {
Expand Down
Loading