mirror of
				https://github.com/IntellectualSites/PlotSquared.git
				synced 2025-10-31 09:33:43 +01:00 
			
		
		
		
	Remove scripting-related stuff (#2947)
* Remove scripting-related stuff * Cleanup Co-authored-by: NotMyFault <mc.cache@web.de>
This commit is contained in:
		| @@ -228,14 +228,6 @@ public class PlotSquared { | |||||||
|             this.plotListener = new PlotListener(this.eventDispatcher); |             this.plotListener = new PlotListener(this.eventDispatcher); | ||||||
|  |  | ||||||
|             // Copy files |             // Copy files | ||||||
|             copyFile("addplots.js", Settings.Paths.SCRIPTS); |  | ||||||
|             copyFile("addsigns.js", Settings.Paths.SCRIPTS); |  | ||||||
|             copyFile("automerge.js", Settings.Paths.SCRIPTS); |  | ||||||
|             copyFile("fixborders.js", Settings.Paths.SCRIPTS); |  | ||||||
|             copyFile("furthest.js", Settings.Paths.SCRIPTS); |  | ||||||
|             copyFile("mycommand.js", Settings.Paths.SCRIPTS); |  | ||||||
|             copyFile("setbiomes.js", Settings.Paths.SCRIPTS); |  | ||||||
|             copyFile("start.js", Settings.Paths.SCRIPTS); |  | ||||||
|             copyFile("town.template", Settings.Paths.TEMPLATES); |             copyFile("town.template", Settings.Paths.TEMPLATES); | ||||||
|             copyFile("bridge.template", Settings.Paths.TEMPLATES); |             copyFile("bridge.template", Settings.Paths.TEMPLATES); | ||||||
|             copyFile("skyblock.template", Settings.Paths.TEMPLATES); |             copyFile("skyblock.template", Settings.Paths.TEMPLATES); | ||||||
|   | |||||||
| @@ -25,67 +25,32 @@ | |||||||
|  */ |  */ | ||||||
| package com.plotsquared.core.command; | package com.plotsquared.core.command; | ||||||
|  |  | ||||||
| import com.google.common.io.Files; |  | ||||||
| import com.google.inject.Inject; | import com.google.inject.Inject; | ||||||
| import com.plotsquared.core.PlotSquared; |  | ||||||
| import com.plotsquared.core.configuration.Settings; |  | ||||||
| import com.plotsquared.core.configuration.caption.CaptionHolder; |  | ||||||
| import com.plotsquared.core.configuration.caption.StaticCaption; | import com.plotsquared.core.configuration.caption.StaticCaption; | ||||||
| import com.plotsquared.core.configuration.caption.TranslatableCaption; | import com.plotsquared.core.configuration.caption.TranslatableCaption; | ||||||
| import com.plotsquared.core.database.DBFunc; |  | ||||||
| import com.plotsquared.core.events.PlotFlagRemoveEvent; | import com.plotsquared.core.events.PlotFlagRemoveEvent; | ||||||
| import com.plotsquared.core.events.Result; | import com.plotsquared.core.events.Result; | ||||||
| import com.plotsquared.core.generator.HybridUtils; | import com.plotsquared.core.generator.HybridUtils; | ||||||
| import com.plotsquared.core.location.Location; |  | ||||||
| import com.plotsquared.core.permissions.Permission; |  | ||||||
| import com.plotsquared.core.player.ConsolePlayer; |  | ||||||
| import com.plotsquared.core.player.PlotPlayer; | import com.plotsquared.core.player.PlotPlayer; | ||||||
| import com.plotsquared.core.plot.Plot; | import com.plotsquared.core.plot.Plot; | ||||||
| import com.plotsquared.core.plot.PlotArea; | import com.plotsquared.core.plot.PlotArea; | ||||||
| import com.plotsquared.core.plot.PlotId; |  | ||||||
| import com.plotsquared.core.plot.expiration.ExpireManager; | import com.plotsquared.core.plot.expiration.ExpireManager; | ||||||
| import com.plotsquared.core.plot.expiration.PlotAnalysis; | import com.plotsquared.core.plot.expiration.PlotAnalysis; | ||||||
| import com.plotsquared.core.plot.flag.GlobalFlagContainer; | import com.plotsquared.core.plot.flag.GlobalFlagContainer; | ||||||
| import com.plotsquared.core.plot.flag.PlotFlag; | import com.plotsquared.core.plot.flag.PlotFlag; | ||||||
| import com.plotsquared.core.plot.world.PlotAreaManager; | import com.plotsquared.core.plot.world.PlotAreaManager; | ||||||
| import com.plotsquared.core.queue.GlobalBlockQueue; |  | ||||||
| import com.plotsquared.core.util.ChunkManager; |  | ||||||
| import com.plotsquared.core.util.EconHandler; |  | ||||||
| import com.plotsquared.core.util.EventDispatcher; | import com.plotsquared.core.util.EventDispatcher; | ||||||
| import com.plotsquared.core.util.FileUtils; |  | ||||||
| import com.plotsquared.core.util.MathMan; |  | ||||||
| import com.plotsquared.core.util.SchematicHandler; |  | ||||||
| import com.plotsquared.core.util.SetupUtils; |  | ||||||
| import com.plotsquared.core.util.StringMan; | import com.plotsquared.core.util.StringMan; | ||||||
| import com.plotsquared.core.util.WEManager; |  | ||||||
| import com.plotsquared.core.util.WorldUtil; |  | ||||||
| import com.plotsquared.core.util.query.PlotQuery; | import com.plotsquared.core.util.query.PlotQuery; | ||||||
| import com.plotsquared.core.util.task.RunnableVal; | import com.plotsquared.core.util.task.RunnableVal; | ||||||
| import com.plotsquared.core.util.task.RunnableVal2; |  | ||||||
| import com.plotsquared.core.util.task.RunnableVal3; |  | ||||||
| import com.plotsquared.core.util.task.TaskManager; |  | ||||||
| import com.sk89q.worldedit.WorldEdit; |  | ||||||
| import com.sk89q.worldedit.world.block.BlockState; |  | ||||||
| import net.kyori.adventure.text.minimessage.Template; | import net.kyori.adventure.text.minimessage.Template; | ||||||
| import org.checkerframework.checker.nullness.qual.NonNull; | import org.checkerframework.checker.nullness.qual.NonNull; | ||||||
| import org.checkerframework.checker.nullness.qual.Nullable; |  | ||||||
| import org.slf4j.Logger; | import org.slf4j.Logger; | ||||||
| import org.slf4j.LoggerFactory; | import org.slf4j.LoggerFactory; | ||||||
|  |  | ||||||
| import javax.script.Bindings; |  | ||||||
| import javax.script.ScriptContext; |  | ||||||
| import javax.script.ScriptEngine; |  | ||||||
| import javax.script.ScriptEngineManager; |  | ||||||
| import javax.script.ScriptException; |  | ||||||
| import javax.script.SimpleScriptContext; |  | ||||||
| import java.io.File; |  | ||||||
| import java.io.IOException; |  | ||||||
| import java.nio.charset.StandardCharsets; |  | ||||||
| import java.util.Arrays; | import java.util.Arrays; | ||||||
| import java.util.HashMap; |  | ||||||
| import java.util.HashSet; | import java.util.HashSet; | ||||||
| import java.util.List; | import java.util.List; | ||||||
| import java.util.concurrent.CompletableFuture; |  | ||||||
|  |  | ||||||
| @CommandDeclaration(command = "debugexec", | @CommandDeclaration(command = "debugexec", | ||||||
|         permission = "plots.admin", |         permission = "plots.admin", | ||||||
| @@ -97,125 +62,34 @@ public class DebugExec extends SubCommand { | |||||||
|  |  | ||||||
|     private final PlotAreaManager plotAreaManager; |     private final PlotAreaManager plotAreaManager; | ||||||
|     private final EventDispatcher eventDispatcher; |     private final EventDispatcher eventDispatcher; | ||||||
|     private final WorldEdit worldEdit; |  | ||||||
|     private final GlobalBlockQueue blockQueue; |  | ||||||
|     private final SchematicHandler schematicHandler; |  | ||||||
|     private final EconHandler econHandler; |  | ||||||
|     private final ChunkManager chunkManager; |  | ||||||
|     private final WorldUtil worldUtil; |  | ||||||
|     private final SetupUtils setupUtils; |  | ||||||
|     private final HybridUtils hybridUtils; |     private final HybridUtils hybridUtils; | ||||||
|  |  | ||||||
|     private ScriptEngine engine; |  | ||||||
|     private Bindings scope; |  | ||||||
|  |  | ||||||
|     @Inject |     @Inject | ||||||
|     public DebugExec( |     public DebugExec( | ||||||
|             final @NonNull PlotAreaManager plotAreaManager, |             final @NonNull PlotAreaManager plotAreaManager, | ||||||
|             final @NonNull EventDispatcher eventDispatcher, |             final @NonNull EventDispatcher eventDispatcher, | ||||||
|             final @Nullable WorldEdit worldEdit, |  | ||||||
|             final @NonNull GlobalBlockQueue blockQueue, |  | ||||||
|             final @NonNull SchematicHandler schematicHandler, |  | ||||||
|             final @NonNull EconHandler econHandler, |  | ||||||
|             final @NonNull ChunkManager chunkManager, |  | ||||||
|             final @NonNull WorldUtil worldUtil, |  | ||||||
|             final @NonNull SetupUtils setupUtils, |  | ||||||
|             final @NonNull HybridUtils hybridUtils |             final @NonNull HybridUtils hybridUtils | ||||||
|     ) { |     ) { | ||||||
|         this.plotAreaManager = plotAreaManager; |         this.plotAreaManager = plotAreaManager; | ||||||
|         this.eventDispatcher = eventDispatcher; |         this.eventDispatcher = eventDispatcher; | ||||||
|         this.worldEdit = worldEdit; |  | ||||||
|         this.blockQueue = blockQueue; |  | ||||||
|         this.schematicHandler = schematicHandler; |  | ||||||
|         this.econHandler = econHandler; |  | ||||||
|         this.chunkManager = chunkManager; |  | ||||||
|         this.worldUtil = worldUtil; |  | ||||||
|         this.setupUtils = setupUtils; |  | ||||||
|         this.hybridUtils = hybridUtils; |         this.hybridUtils = hybridUtils; | ||||||
|  |  | ||||||
|         init(); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     public ScriptEngine getEngine() { |  | ||||||
|         if (this.engine == null) { |  | ||||||
|             init(); |  | ||||||
|         } |  | ||||||
|         return this.engine; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     public Bindings getScope() { |  | ||||||
|         return this.scope; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     public void init() { |  | ||||||
|         if (this.engine != null) { |  | ||||||
|             return; |  | ||||||
|         } |  | ||||||
|         //create script engine manager |  | ||||||
|         ScriptEngineManager scriptEngineManager = new ScriptEngineManager(); |  | ||||||
|         //create nashorn engine |  | ||||||
|         this.engine = scriptEngineManager.getEngineByName("nashorn"); |  | ||||||
|         try { |  | ||||||
|             engine.eval("print('PlotSquared scripting engine started');"); |  | ||||||
|         } catch (ScriptException e) { |  | ||||||
|             e.printStackTrace(); |  | ||||||
|         } |  | ||||||
|         if (this.engine == null) { |  | ||||||
|             this.engine = new ScriptEngineManager(null).getEngineByName("JavaScript"); |  | ||||||
|         } |  | ||||||
|         ScriptContext context = new SimpleScriptContext(); |  | ||||||
|         this.scope = context.getBindings(ScriptContext.ENGINE_SCOPE); |  | ||||||
|  |  | ||||||
|         // stuff |  | ||||||
|         this.scope.put("Settings", new Settings()); |  | ||||||
|         this.scope.put("StringMan", new StringMan()); |  | ||||||
|         this.scope.put("MathMan", new MathMan()); |  | ||||||
|  |  | ||||||
|         // Classes |  | ||||||
|         this.scope.put("Location", Location.class); |  | ||||||
|         this.scope.put("BlockState", BlockState.class); |  | ||||||
|         this.scope.put("Plot", Plot.class); |  | ||||||
|         this.scope.put("PlotId", PlotId.class); |  | ||||||
|         this.scope.put("Runnable", Runnable.class); |  | ||||||
|         this.scope.put("RunnableVal", RunnableVal.class); |  | ||||||
|  |  | ||||||
|         // Instances |  | ||||||
|         this.scope.put("PS", PlotSquared.get()); |  | ||||||
|         this.scope.put("GlobalBlockQueue", this.blockQueue); |  | ||||||
|         this.scope.put("ExpireManager", ExpireManager.IMP); |  | ||||||
|         if (this.worldEdit != null) { |  | ||||||
|             this.scope.put("WEManager", new WEManager()); |  | ||||||
|         } |  | ||||||
|         this.scope.put("TaskManager", TaskManager.getPlatformImplementation()); |  | ||||||
|         this.scope.put("ConsolePlayer", ConsolePlayer.getConsole()); |  | ||||||
|         this.scope.put("SchematicHandler", this.schematicHandler); |  | ||||||
|         this.scope.put("ChunkManager", this.chunkManager); |  | ||||||
|         this.scope.put("BlockManager", this.worldUtil); |  | ||||||
|         this.scope.put("SetupUtils", this.setupUtils); |  | ||||||
|         this.scope.put("EventUtil", this.eventDispatcher); |  | ||||||
|         this.scope.put("EconHandler", this.econHandler); |  | ||||||
|         this.scope.put("DBFunc", DBFunc.dbManager); |  | ||||||
|         this.scope.put("HybridUtils", this.hybridUtils); |  | ||||||
|         this.scope.put("IMP", PlotSquared.platform()); |  | ||||||
|         this.scope.put("MainCommand", MainCommand.getInstance()); |  | ||||||
|  |  | ||||||
|         // enums |  | ||||||
|         for (Enum<?> value : Permission.values()) { |  | ||||||
|             this.scope.put("C_" + value.name(), value); |  | ||||||
|         } |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|     public boolean onCommand(final PlotPlayer<?> player, String[] args) { |     public boolean onCommand(final PlotPlayer<?> player, String[] args) { | ||||||
|         List<String> allowed_params = Arrays |         List<String> allowedParams = Arrays | ||||||
|                 .asList("analyze", "calibrate-analysis", "remove-flag", "stop-expire", "start-expire", |                 .asList("analyze", | ||||||
|                         "seen", "list-scripts", "start-rgar", "stop-rgar", "help", "addcmd", "runasync", |                         "calibrate-analysis", | ||||||
|                         "run", "allcmd", "all" |                         "start-expire", | ||||||
|  |                         "stop-expire", | ||||||
|  |                         "remove-flag", | ||||||
|  |                         "start-rgar", | ||||||
|  |                         "stop-rgar" | ||||||
|                 ); |                 ); | ||||||
|         if (args.length > 0) { |         if (args.length > 0) { | ||||||
|             String arg = args[0].toLowerCase(); |             String arg = args[0].toLowerCase(); | ||||||
|             String script; |  | ||||||
|             boolean async = false; |  | ||||||
|             switch (arg) { |             switch (arg) { | ||||||
|                 case "analyze": { |                 case "analyze": { | ||||||
|                     Plot plot = player.getCurrentPlot(); |                     Plot plot = player.getCurrentPlot(); | ||||||
| @@ -268,6 +142,16 @@ public class DebugExec extends SubCommand { | |||||||
|                             threshold |                             threshold | ||||||
|                     ); |                     ); | ||||||
|                     return true; |                     return true; | ||||||
|  |                 case "start-expire": | ||||||
|  |                     if (ExpireManager.IMP == null) { | ||||||
|  |                         ExpireManager.IMP = new ExpireManager(this.eventDispatcher); | ||||||
|  |                     } | ||||||
|  |                     if (ExpireManager.IMP.runAutomatedTask()) { | ||||||
|  |                         player.sendMessage(TranslatableCaption.of("debugexec.expiry_started")); | ||||||
|  |                     } else { | ||||||
|  |                         player.sendMessage(TranslatableCaption.of("debugexec.expiry_already_started")); | ||||||
|  |                     } | ||||||
|  |                     return true; | ||||||
|                 case "stop-expire": |                 case "stop-expire": | ||||||
|                     if (ExpireManager.IMP == null || !ExpireManager.IMP.cancelTask()) { |                     if (ExpireManager.IMP == null || !ExpireManager.IMP.cancelTask()) { | ||||||
|                         player.sendMessage(TranslatableCaption.of("debugexec.task_halted")); |                         player.sendMessage(TranslatableCaption.of("debugexec.task_halted")); | ||||||
| @@ -297,6 +181,7 @@ public class DebugExec extends SubCommand { | |||||||
|                             TranslatableCaption.of("debugexec.cleared_flag"), |                             TranslatableCaption.of("debugexec.cleared_flag"), | ||||||
|                             Template.of("value", flag) |                             Template.of("value", flag) | ||||||
|                     ); |                     ); | ||||||
|  |                     return true; | ||||||
|                 case "start-rgar": { |                 case "start-rgar": { | ||||||
|                     if (args.length != 2) { |                     if (args.length != 2) { | ||||||
|                         player.sendMessage( |                         player.sendMessage( | ||||||
| @@ -333,166 +218,10 @@ public class DebugExec extends SubCommand { | |||||||
|                     HybridUtils.UPDATE = false; |                     HybridUtils.UPDATE = false; | ||||||
|                     player.sendMessage(TranslatableCaption.of("debugexec.task_cancelled")); |                     player.sendMessage(TranslatableCaption.of("debugexec.task_cancelled")); | ||||||
|                     return true; |                     return true; | ||||||
|                 case "start-expire": |  | ||||||
|                     if (ExpireManager.IMP == null) { |  | ||||||
|                         ExpireManager.IMP = new ExpireManager(this.eventDispatcher); |  | ||||||
|                     } |  | ||||||
|                     if (ExpireManager.IMP.runAutomatedTask()) { |  | ||||||
|                         player.sendMessage(TranslatableCaption.of("debugexec.expiry_started")); |  | ||||||
|                     } else { |  | ||||||
|                         player.sendMessage(TranslatableCaption.of("debugexec.expiry_already_started")); |  | ||||||
|                     } |  | ||||||
|                 case "?": |  | ||||||
|                 case "help": |  | ||||||
|                     player.sendMessage(StaticCaption.of("<prefix><gold>Possible sub commands: </gray>/plot debugexec <" + StringMan |  | ||||||
|                             .join(allowed_params, " | ") + "></gray>")); |  | ||||||
|                     return false; |  | ||||||
|                 case "addcmd": |  | ||||||
|                     try { |  | ||||||
|                         final String cmd = StringMan.join( |  | ||||||
|                                 Files.readLines(FileUtils.getFile(new File( |  | ||||||
|                                         PlotSquared.platform().getDirectory() + File.separator |  | ||||||
|                                                 + Settings.Paths.SCRIPTS), args[1]), StandardCharsets.UTF_8), |  | ||||||
|                                 System.getProperty("line.separator") |  | ||||||
|                         ); |  | ||||||
|                         new Command(MainCommand.getInstance(), true, args[1].split("\\.")[0], null, |  | ||||||
|                                 RequiredType.NONE, CommandCategory.DEBUG |  | ||||||
|                         ) { |  | ||||||
|                             @Override |  | ||||||
|                             public CompletableFuture<Boolean> execute( |  | ||||||
|                                     PlotPlayer<?> player, |  | ||||||
|                                     String[] args, RunnableVal3<Command, Runnable, Runnable> confirm, |  | ||||||
|                                     RunnableVal2<Command, CommandResult> whenDone |  | ||||||
|                             ) { |  | ||||||
|                                 try { |  | ||||||
|                                     DebugExec.this.scope.put("PlotPlayer", player); |  | ||||||
|                                     DebugExec.this.scope.put("args", args); |  | ||||||
|                                     DebugExec.this.engine.eval(cmd, DebugExec.this.scope); |  | ||||||
|                                 } catch (ScriptException e) { |  | ||||||
|                                     e.printStackTrace(); |  | ||||||
|                                     player.sendMessage(TranslatableCaption.of("error.command_went_wrong")); |  | ||||||
|                                 } |  | ||||||
|                                 return CompletableFuture.completedFuture(true); |  | ||||||
|                             } |  | ||||||
|                         }; |  | ||||||
|                         return true; |  | ||||||
|                     } catch (IOException e) { |  | ||||||
|                         e.printStackTrace(); |  | ||||||
|                         player.sendMessage( |  | ||||||
|                                 TranslatableCaption.of("commandconfig.command_syntax"), |  | ||||||
|                                 Template.of("value", "/plot debugexec addcmd <file>") |  | ||||||
|                         ); |  | ||||||
|                         return false; |  | ||||||
|                     } |  | ||||||
|                 case "runasync": |  | ||||||
|                     async = true; |  | ||||||
|                 case "run": |  | ||||||
|                     try { |  | ||||||
|                         script = StringMan.join( |  | ||||||
|                                 Files.readLines(FileUtils.getFile(new File( |  | ||||||
|                                         PlotSquared.platform().getDirectory() + File.separator |  | ||||||
|                                                 + Settings.Paths.SCRIPTS), args[1]), StandardCharsets.UTF_8), |  | ||||||
|                                 System.getProperty("line.separator") |  | ||||||
|                         ); |  | ||||||
|                         if (args.length > 2) { |  | ||||||
|                             HashMap<String, String> replacements = new HashMap<>(); |  | ||||||
|                             for (int i = 2; i < args.length; i++) { |  | ||||||
|                                 replacements.put("%s" + (i - 2), args[i]); |  | ||||||
|                             } |  | ||||||
|                             script = StringMan.replaceFromMap(script, replacements); |  | ||||||
|                         } |  | ||||||
|                     } catch (IOException e) { |  | ||||||
|                         e.printStackTrace(); |  | ||||||
|                         return false; |  | ||||||
|                     } |  | ||||||
|                     break; |  | ||||||
|                 case "list-scripts": |  | ||||||
|                     String path = PlotSquared.platform().getDirectory() + File.separator |  | ||||||
|                             + Settings.Paths.SCRIPTS; |  | ||||||
|                     File folder = new File(path); |  | ||||||
|                     File[] filesArray = folder.listFiles(); |  | ||||||
|  |  | ||||||
|                     int page; |  | ||||||
|                     switch (args.length) { |  | ||||||
|                         case 1: |  | ||||||
|                             page = 0; |  | ||||||
|                             break; |  | ||||||
|                         case 2: |  | ||||||
|                             if (MathMan.isInteger(args[1])) { |  | ||||||
|                                 page = Integer.parseInt(args[1]) - 1; |  | ||||||
|                                 break; |  | ||||||
|                             } |  | ||||||
|                         default: |  | ||||||
|                             player.sendMessage( |  | ||||||
|                                     TranslatableCaption.of("commandconfig.command_syntax"), |  | ||||||
|                                     Template.of("value", "/plot debugexec list-scripts [#]") |  | ||||||
|                             ); |  | ||||||
|                             return false; |  | ||||||
|                     } |  | ||||||
|  |  | ||||||
|                     List<File> allFiles = Arrays.asList(filesArray); |  | ||||||
|                     paginate(player, allFiles, 8, page, new RunnableVal3<Integer, File, CaptionHolder>() { |  | ||||||
|                         @Override |  | ||||||
|                         public void run(Integer i, File file, CaptionHolder message) { |  | ||||||
|                             String name = file.getName(); |  | ||||||
|                             Template numTemplate = Template.of("number", String.valueOf(i)); |  | ||||||
|                             Template nameTemplate = Template.of("name", name); |  | ||||||
|                             message.set(StaticCaption.of(MINI_MESSAGE.serialize(MINI_MESSAGE |  | ||||||
|                                     .parse( |  | ||||||
|                                             TranslatableCaption.of("debugexec.script_list_item").getComponent(player), |  | ||||||
|                                             numTemplate, |  | ||||||
|                                             nameTemplate |  | ||||||
|                                     )))); |  | ||||||
|                         } |  | ||||||
|                     }, "/plot debugexec list-scripts", TranslatableCaption.of("scripts.script_list")); |  | ||||||
|                     return true; |  | ||||||
|                 case "all": |  | ||||||
|                     if (args.length < 3) { |  | ||||||
|                         player.sendMessage( |  | ||||||
|                                 TranslatableCaption.of("commandconfig.command_syntax"), |  | ||||||
|                                 Template.of("value", "/plot debugexec all <condition> <code>") |  | ||||||
|                         ); |  | ||||||
|                         return false; |  | ||||||
|                     } |  | ||||||
|                     script = |  | ||||||
|                             "_1=PS.getBasePlots().iterator();while(_1.hasNext()){plot=_1.next();if(" |  | ||||||
|                                     + args[1] + "){" + StringMan |  | ||||||
|                                     .join(Arrays.copyOfRange(args, 2, args.length), " ") + "}}"; |  | ||||||
|  |  | ||||||
|                     break; |  | ||||||
|                 default: |  | ||||||
|                     script = StringMan.join(args, " "); |  | ||||||
|             } |  | ||||||
|             if (!(player instanceof ConsolePlayer)) { |  | ||||||
|                 player.sendMessage(TranslatableCaption.of("console.not_console")); |  | ||||||
|                 return false; |  | ||||||
|             } |  | ||||||
|             init(); |  | ||||||
|             this.scope.put("PlotPlayer", player); |  | ||||||
|             try { |  | ||||||
|                 if (async) { |  | ||||||
|                     final String toExec = script; |  | ||||||
|                     TaskManager.runTaskAsync(() -> { |  | ||||||
|                         long start = System.currentTimeMillis(); |  | ||||||
|                         Object result = null; |  | ||||||
|                         try { |  | ||||||
|                             result = DebugExec.this.engine.eval(toExec, DebugExec.this.scope); |  | ||||||
|                         } catch (ScriptException e) { |  | ||||||
|                             e.printStackTrace(); |  | ||||||
|                         } |  | ||||||
|                         logger.info("{}ms -> {}", System.currentTimeMillis() - start, result); |  | ||||||
|                     }); |  | ||||||
|                 } else { |  | ||||||
|                     long start = System.currentTimeMillis(); |  | ||||||
|                     Object result = this.engine.eval(script, this.scope); |  | ||||||
|                     logger.info("{}ms -> {}", System.currentTimeMillis() - start, result); |  | ||||||
|                 } |  | ||||||
|                 return true; |  | ||||||
|             } catch (ScriptException e) { |  | ||||||
|                 e.printStackTrace(); |  | ||||||
|                 return false; |  | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |         player.sendMessage(StaticCaption.of("<prefix><gold>Possible sub commands: </gray>/plot debugexec <" | ||||||
|  |                 + StringMan.join(allowedParams, " | ") + "></gray>")); | ||||||
|         return false; |         return false; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -439,7 +439,6 @@ public class Settings extends Config { | |||||||
|     public static final class Paths { |     public static final class Paths { | ||||||
|  |  | ||||||
|         public static String SCHEMATICS = "schematics"; |         public static String SCHEMATICS = "schematics"; | ||||||
|         public static String SCRIPTS = "scripts"; |  | ||||||
|         public static String TEMPLATES = "templates"; |         public static String TEMPLATES = "templates"; | ||||||
|  |  | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -1,41 +0,0 @@ | |||||||
| /* |  | ||||||
|  *       _____  _       _    _____                                _ |  | ||||||
|  *      |  __ \| |     | |  / ____|                              | | |  | ||||||
|  *      | |__) | | ___ | |_| (___   __ _ _   _  __ _ _ __ ___  __| | |  | ||||||
|  *      |  ___/| |/ _ \| __|\___ \ / _` | | | |/ _` | '__/ _ \/ _` | |  | ||||||
|  *      | |    | | (_) | |_ ____) | (_| | |_| | (_| | | |  __/ (_| | |  | ||||||
|  *      |_|    |_|\___/ \__|_____/ \__, |\__,_|\__,_|_|  \___|\__,_| |  | ||||||
|  *                                    | | |  | ||||||
|  *                                    |_| |  | ||||||
|  *            PlotSquared plot management system for Minecraft |  | ||||||
|  *                  Copyright (C) 2020 IntellectualSites |  | ||||||
|  * |  | ||||||
|  *     This program 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. |  | ||||||
|  * |  | ||||||
|  *     This program 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 this program.  If not, see <https://www.gnu.org/licenses/>. |  | ||||||
|  */ |  | ||||||
| /* |  | ||||||
| This will increase a player's allowed plots by the provided value |  | ||||||
| /plot debugexec runasync addplots.js <player> <amount> |  | ||||||
| */ |  | ||||||
| var uuid = UUIDHandler.getUUID('%s0', null); |  | ||||||
| if (uuid === null) { |  | ||||||
|     C_INVALID_PLAYER.send(PlotPlayer, '%s0'); |  | ||||||
| } else if (!MathMan.class.static.isInteger('%s1')) { |  | ||||||
|     C_NOT_VALID_NUMBER.send(PlotPlayer, '(0, ' + Settings.MAX_PLOTS + ')'); |  | ||||||
| } else { |  | ||||||
|     var amount = parseInt('%s1'); |  | ||||||
|     var pp = IMP.wrapPlayer(UUIDHandler.getUUIDWrapper().getOfflinePlayer(uuid).player); |  | ||||||
|     var allowed = pp.getAllowedPlots(); |  | ||||||
|     MainUtil.class.static.sendMessage(PlotPlayer, '$4Setting permission: plots.plot.' + (allowed + amount) + ' for %s0'); |  | ||||||
|     IMP.getEconomyHandler().setPermission("", pp.getName(), 'plots.plot.' + (allowed + amount), true); |  | ||||||
| } |  | ||||||
| @@ -1,37 +0,0 @@ | |||||||
| /* |  | ||||||
|  *       _____  _       _    _____                                _ |  | ||||||
|  *      |  __ \| |     | |  / ____|                              | | |  | ||||||
|  *      | |__) | | ___ | |_| (___   __ _ _   _  __ _ _ __ ___  __| | |  | ||||||
|  *      |  ___/| |/ _ \| __|\___ \ / _` | | | |/ _` | '__/ _ \/ _` | |  | ||||||
|  *      | |    | | (_) | |_ ____) | (_| | |_| | (_| | | |  __/ (_| | |  | ||||||
|  *      |_|    |_|\___/ \__|_____/ \__, |\__,_|\__,_|_|  \___|\__,_| |  | ||||||
|  *                                    | | |  | ||||||
|  *                                    |_| |  | ||||||
|  *            PlotSquared plot management system for Minecraft |  | ||||||
|  *                  Copyright (C) 2020 IntellectualSites |  | ||||||
|  * |  | ||||||
|  *     This program 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. |  | ||||||
|  * |  | ||||||
|  *     This program 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 this program.  If not, see <https://www.gnu.org/licenses/>. |  | ||||||
|  */ |  | ||||||
| /* |  | ||||||
| This script will fix all signs in the world. |  | ||||||
| */ |  | ||||||
| var plots = PS.sortPlotsByTemp(PS.getPlots()); |  | ||||||
| for (var i = 0; i < plots.size(); i++) { |  | ||||||
|     var plot = plots.get(i); |  | ||||||
|     if (plot.isBasePlot()) { |  | ||||||
|         plot.setSign(); |  | ||||||
|         PS.class.static.log('&cSetting sign for: ' + plot); |  | ||||||
|     } |  | ||||||
|     java.lang.Thread.sleep(10); |  | ||||||
| } |  | ||||||
| @@ -1,45 +0,0 @@ | |||||||
| /* |  | ||||||
|  *       _____  _       _    _____                                _ |  | ||||||
|  *      |  __ \| |     | |  / ____|                              | | |  | ||||||
|  *      | |__) | | ___ | |_| (___   __ _ _   _  __ _ _ __ ___  __| | |  | ||||||
|  *      |  ___/| |/ _ \| __|\___ \ / _` | | | |/ _` | '__/ _ \/ _` | |  | ||||||
|  *      | |    | | (_) | |_ ____) | (_| | |_| | (_| | | |  __/ (_| | |  | ||||||
|  *      |_|    |_|\___/ \__|_____/ \__, |\__,_|\__,_|_|  \___|\__,_| |  | ||||||
|  *                                    | | |  | ||||||
|  *                                    |_| |  | ||||||
|  *            PlotSquared plot management system for Minecraft |  | ||||||
|  *                  Copyright (C) 2020 IntellectualSites |  | ||||||
|  * |  | ||||||
|  *     This program 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. |  | ||||||
|  * |  | ||||||
|  *     This program 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 this program.  If not, see <https://www.gnu.org/licenses/>. |  | ||||||
|  */ |  | ||||||
| /* |  | ||||||
| This is an example script that will auto merge all plots |  | ||||||
| /plot debugexec runasync automerge.js <removeroads> |  | ||||||
| */ |  | ||||||
| var plots = PS.sortPlotsByTemp(PS.getPlots()); |  | ||||||
| PS.class.static.log("Attempting to auto merge " + plots.size() + " plots"); |  | ||||||
| if ("%s0" === "true") { |  | ||||||
|     for (var i = 0; i < plots.size(); i++) { |  | ||||||
|         var plot = plots.get(i); |  | ||||||
|         plot.autoMerge(-1, 250000, plot.owner, true); |  | ||||||
|     } |  | ||||||
| } else if ("%s0" === "false") { |  | ||||||
|     for (var i = 0; i < plots.size(); i++) { |  | ||||||
|         var plot = plots.get(i); |  | ||||||
|         plot.autoMerge(-1, 250000, plot.owner, false); |  | ||||||
|     } |  | ||||||
| } else { |  | ||||||
|     C_COMMAND_SYNTAX.send(PlotPlayer, "/plot debugexec automerge.js <removeroads>"); |  | ||||||
|     MainUtil.class.static.sendMessage(PlotPlayer, "$1<removeroads> is true or false if you want to remove roads when auto merging"); |  | ||||||
| } |  | ||||||
| @@ -1,35 +0,0 @@ | |||||||
| /* |  | ||||||
|  *       _____  _       _    _____                                _ |  | ||||||
|  *      |  __ \| |     | |  / ____|                              | | |  | ||||||
|  *      | |__) | | ___ | |_| (___   __ _ _   _  __ _ _ __ ___  __| | |  | ||||||
|  *      |  ___/| |/ _ \| __|\___ \ / _` | | | |/ _` | '__/ _ \/ _` | |  | ||||||
|  *      | |    | | (_) | |_ ____) | (_| | |_| | (_| | | |  __/ (_| | |  | ||||||
|  *      |_|    |_|\___/ \__|_____/ \__, |\__,_|\__,_|_|  \___|\__,_| |  | ||||||
|  *                                    | | |  | ||||||
|  *                                    |_| |  | ||||||
|  *            PlotSquared plot management system for Minecraft |  | ||||||
|  *                  Copyright (C) 2020 IntellectualSites |  | ||||||
|  * |  | ||||||
|  *     This program 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. |  | ||||||
|  * |  | ||||||
|  *     This program 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 this program.  If not, see <https://www.gnu.org/licenses/>. |  | ||||||
|  */ |  | ||||||
| /* |  | ||||||
| Fixes border around plots |  | ||||||
| /plot debugexec runasync fixborder.js <Plot ID> |  | ||||||
| */ |  | ||||||
| var plots = PS.sortPlotsByTemp(PS.getPlots()); |  | ||||||
| PS.class.static.log("Attempting to fix border for " + plots.size() + " plots"); |  | ||||||
| for (var i = 0; i < plots.size(); i++) { |  | ||||||
|     var plot = plots.get(i); |  | ||||||
|     plot.setComponent("border", "%s0"); |  | ||||||
| } |  | ||||||
| @@ -1,57 +0,0 @@ | |||||||
| /* |  | ||||||
|  *       _____  _       _    _____                                _ |  | ||||||
|  *      |  __ \| |     | |  / ____|                              | | |  | ||||||
|  *      | |__) | | ___ | |_| (___   __ _ _   _  __ _ _ __ ___  __| | |  | ||||||
|  *      |  ___/| |/ _ \| __|\___ \ / _` | | | |/ _` | '__/ _ \/ _` | |  | ||||||
|  *      | |    | | (_) | |_ ____) | (_| | |_| | (_| | | |  __/ (_| | |  | ||||||
|  *      |_|    |_|\___/ \__|_____/ \__, |\__,_|\__,_|_|  \___|\__,_| |  | ||||||
|  *                                    | | |  | ||||||
|  *                                    |_| |  | ||||||
|  *            PlotSquared plot management system for Minecraft |  | ||||||
|  *                  Copyright (C) 2020 IntellectualSites |  | ||||||
|  * |  | ||||||
|  *     This program 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. |  | ||||||
|  * |  | ||||||
|  *     This program 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 this program.  If not, see <https://www.gnu.org/licenses/>. |  | ||||||
|  */ |  | ||||||
| /* |  | ||||||
| * Script to find the furthest plot from origin in a world: |  | ||||||
| *  - /plot debugexec runasync furthest.js <plotworld> |  | ||||||
| */ |  | ||||||
|  |  | ||||||
| if (PS.hasPlotArea("%s0")) { |  | ||||||
|     var plots = PS.getAllPlotsRaw().get("%s0").values().toArray(); |  | ||||||
|     var max = 0; |  | ||||||
|     var maxplot; |  | ||||||
|     for (var i in plots) { |  | ||||||
|         var plot = plots[i]; |  | ||||||
|         if (plot.getX() > max) { |  | ||||||
|             max = plot.getX(); |  | ||||||
|             maxplot = plot; |  | ||||||
|         } |  | ||||||
|         if (plot.getY() > max) { |  | ||||||
|             max = plot.getY(); |  | ||||||
|             maxplot = plot; |  | ||||||
|         } |  | ||||||
|         if (-plot.getX() > max) { |  | ||||||
|             max = -plot.getX(); |  | ||||||
|             maxplot = plot; |  | ||||||
|         } |  | ||||||
|         if (-plot.getY() > max) { |  | ||||||
|             max = -plot.getY(); |  | ||||||
|             maxplot = plot; |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|     PS.class.static.log(plot); |  | ||||||
| } else { |  | ||||||
|     PlotPlayer.sendMessage("Usage: /plot debugexec runasync furthest.js <plotworld>"); |  | ||||||
| } |  | ||||||
| @@ -309,7 +309,6 @@ | |||||||
|   "unsafe.debugallowunsafe_off": "<prefix><gray>Unsafe actions disabled.</gray>", |   "unsafe.debugallowunsafe_off": "<prefix><gray>Unsafe actions disabled.</gray>", | ||||||
|   "need.need_block": "<prefix><red>You've got to specify a block.</red>", |   "need.need_block": "<prefix><red>You've got to specify a block.</red>", | ||||||
|   "near.plot_near": "<prefix><gold>Players: <gray><list></gray></gold>", |   "near.plot_near": "<prefix><gold>Players: <gray><list></gray></gold>", | ||||||
|   "scripts.script_list": "<dark_gray><strikethrough>--------- <reset><gold>SCRIPTS </gold><dark_gray><strikethrough>---------</dark_gray><reset>", |  | ||||||
|   "info.none": "<gray>None</gray>", |   "info.none": "<gray>None</gray>", | ||||||
|   "info.now": "<gray>Now</gray>", |   "info.now": "<gray>Now</gray>", | ||||||
|   "info.never": "<gray>Never</gray>", |   "info.never": "<gray>Never</gray>", | ||||||
|   | |||||||
| @@ -1,27 +0,0 @@ | |||||||
| /* |  | ||||||
|  *       _____  _       _    _____                                _ |  | ||||||
|  *      |  __ \| |     | |  / ____|                              | | |  | ||||||
|  *      | |__) | | ___ | |_| (___   __ _ _   _  __ _ _ __ ___  __| | |  | ||||||
|  *      |  ___/| |/ _ \| __|\___ \ / _` | | | |/ _` | '__/ _ \/ _` | |  | ||||||
|  *      | |    | | (_) | |_ ____) | (_| | |_| | (_| | | |  __/ (_| | |  | ||||||
|  *      |_|    |_|\___/ \__|_____/ \__, |\__,_|\__,_|_|  \___|\__,_| |  | ||||||
|  *                                    | | |  | ||||||
|  *                                    |_| |  | ||||||
|  *            PlotSquared plot management system for Minecraft |  | ||||||
|  *                  Copyright (C) 2020 IntellectualSites |  | ||||||
|  * |  | ||||||
|  *     This program 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. |  | ||||||
|  * |  | ||||||
|  *     This program 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 this program.  If not, see <https://www.gnu.org/licenses/>. |  | ||||||
|  */ |  | ||||||
| // This command is registered from the start.js file which is run during startup |  | ||||||
| PlotPlayer.sendMessage("Hello World!"); |  | ||||||
| @@ -1,37 +0,0 @@ | |||||||
| /* |  | ||||||
|  *       _____  _       _    _____                                _ |  | ||||||
|  *      |  __ \| |     | |  / ____|                              | | |  | ||||||
|  *      | |__) | | ___ | |_| (___   __ _ _   _  __ _ _ __ ___  __| | |  | ||||||
|  *      |  ___/| |/ _ \| __|\___ \ / _` | | | |/ _` | '__/ _ \/ _` | |  | ||||||
|  *      | |    | | (_) | |_ ____) | (_| | |_| | (_| | | |  __/ (_| | |  | ||||||
|  *      |_|    |_|\___/ \__|_____/ \__, |\__,_|\__,_|_|  \___|\__,_| |  | ||||||
|  *                                    | | |  | ||||||
|  *                                    |_| |  | ||||||
|  *            PlotSquared plot management system for Minecraft |  | ||||||
|  *                  Copyright (C) 2020 IntellectualSites |  | ||||||
|  * |  | ||||||
|  *     This program 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. |  | ||||||
|  * |  | ||||||
|  *     This program 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 this program.  If not, see <https://www.gnu.org/licenses/>. |  | ||||||
|  */ |  | ||||||
| /* |  | ||||||
| This script will reset all biomes in claimed plots |  | ||||||
| */ |  | ||||||
| var plots = PS.sortPlotsByTemp(PS.getPlots()); |  | ||||||
| for (var i = 0; i < plots.size(); i++) { |  | ||||||
|     var plot = plots.get(i); |  | ||||||
|     if (!plot.isMerged() || !plot.getMerged(0)) { |  | ||||||
|         plot.setBiome("%s0", null); |  | ||||||
|         PS.class.static.log('&cSetting biome for: ' + plot); |  | ||||||
|     } |  | ||||||
|     java.lang.Thread.sleep(1000); |  | ||||||
| } |  | ||||||
| @@ -1,32 +0,0 @@ | |||||||
| /* |  | ||||||
|  *       _____  _       _    _____                                _ |  | ||||||
|  *      |  __ \| |     | |  / ____|                              | | |  | ||||||
|  *      | |__) | | ___ | |_| (___   __ _ _   _  __ _ _ __ ___  __| | |  | ||||||
|  *      |  ___/| |/ _ \| __|\___ \ / _` | | | |/ _` | '__/ _ \/ _` | |  | ||||||
|  *      | |    | | (_) | |_ ____) | (_| | |_| | (_| | | |  __/ (_| | |  | ||||||
|  *      |_|    |_|\___/ \__|_____/ \__, |\__,_|\__,_|_|  \___|\__,_| |  | ||||||
|  *                                    | | |  | ||||||
|  *                                    |_| |  | ||||||
|  *            PlotSquared plot management system for Minecraft |  | ||||||
|  *                  Copyright (C) 2020 IntellectualSites |  | ||||||
|  * |  | ||||||
|  *     This program 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. |  | ||||||
|  * |  | ||||||
|  *     This program 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 this program.  If not, see <https://www.gnu.org/licenses/>. |  | ||||||
|  */ |  | ||||||
| // Add your commands to this list |  | ||||||
| var commands = ["mycommand"]; |  | ||||||
|  |  | ||||||
| // Command registration: |  | ||||||
| for (var i in commands) { |  | ||||||
|     MainCommand.class.static.onCommand(PlotPlayer, "plot", "debugexec", "addcmd", commands[i] + ".js"); |  | ||||||
| } |  | ||||||
		Reference in New Issue
	
	Block a user
	 Hannes Greule
					Hannes Greule