Browse Source

additional information for scheduler tasks

Kajetan Johannes Hammerle 2 years ago
parent
commit
db423d50f9

+ 4 - 4
src/main/java/me/km/Server.java

@@ -85,7 +85,7 @@ public class Server {
                             data[i] = (byte) in.read();
                         }
                         String[] s = decrypt(data, privateKey).split("\n");
-                        scheduler.scheduleTask(() -> {
+                        scheduler.scheduleTask("onVote", () -> {
                             scriptEvents.onVote(s);
                         });
                     } catch(Exception ex) {
@@ -153,9 +153,9 @@ public class Server {
 
         // protections
         plotMap = new WorldPlotMap();
-        scheduler.scheduleTask(() -> plotMap.read(server, logger));
+        scheduler.scheduleTask("plotMap.read", () -> plotMap.read(server, logger));
         long time = 20 * 60 * 30; // all 30 minutes
-        scheduler.scheduleRepeatingTask(() -> plotMap.save(), time, time);
+        scheduler.scheduleRepeatingTask("plotMap.save", () -> plotMap.save(), time, time);
 
         // block protections / player manager
         IPlayerBank playerBank;
@@ -176,7 +176,7 @@ public class Server {
         MinecraftFunctions.registerFunctions(scripts.getScriptManager(), scripts, perms, scheduler,
                 server, playerBank, customEventCaller, databank, plotMap, commands);
 
-        scheduler.scheduleTask(() -> scripts.startScript(null, "startscript"));
+        scheduler.scheduleTask("startscript", () -> scripts.startScript(null, "startscript"));
         startVotifier(conf.getString(null, "pkey"));
     }
 

+ 1 - 1
src/main/java/me/km/databank/DataBank.java

@@ -92,7 +92,7 @@ public class DataBank {
         if(c == null) {
             return;
         }
-        scheduler.scheduleRepeatingTask(() -> {
+        scheduler.scheduleRepeatingTask("startReconnecting", () -> {
             try(java.sql.Statement stmt = c.createStatement()) {
                 // pointless query just for reconnecting
                 stmt.executeUpdate("SHOW TABLES IN minecraft");

+ 3 - 3
src/main/java/me/km/overrides/ModEntityPlayerMP.java

@@ -63,7 +63,7 @@ public class ModEntityPlayerMP extends ServerPlayerEntity {
 
     public void setTabListDisplayName(String name, ISnuviScheduler scheduler) {
         tabDisplayName = new StringTextComponent(name);
-        scheduler.scheduleTask(() -> {
+        scheduler.scheduleTask("setTabListDisplayName", () -> {
             server.getPlayerList().sendPacketToAllPlayers(new SPlayerListItemPacket(
                     SPlayerListItemPacket.Action.UPDATE_DISPLAY_NAME, this));
         }, 5);
@@ -108,7 +108,7 @@ public class ModEntityPlayerMP extends ServerPlayerEntity {
 
     public void setTimer(String varname, int time, ISnuviScheduler scheduler) {
         if(isIterating) {
-            scheduler.scheduleTask(() -> timedData.put(varname, time));
+            scheduler.scheduleTask("setTimer", () -> timedData.put(varname, time));
         } else {
             timedData.put(varname, time);
         }
@@ -120,7 +120,7 @@ public class ModEntityPlayerMP extends ServerPlayerEntity {
 
     public void clearData(ISnuviScheduler scheduler) {
         if(isIterating) {
-            scheduler.scheduleTask(() -> timedData.clear());
+            scheduler.scheduleTask("clearData", () -> timedData.clear());
         } else {
             timedData.clear();
         }

+ 2 - 2
src/main/java/me/km/permissions/ModCommandManager.java

@@ -40,7 +40,7 @@ public class ModCommandManager extends Commands {
         getDispatcher().getRoot().getChildren().forEach(c -> {
             otherCommands.add(c.getName());
         });
-        scheduler.scheduleTask(() -> {
+        scheduler.scheduleTask("ModCommandManager", () -> {
             getDispatcher().getRoot().getChildren().forEach(c -> {
                 if(otherCommands.add(c.getName())) {
                     perms.addOtherGroupPermission(c.getName());
@@ -98,7 +98,7 @@ public class ModCommandManager extends Commands {
         ArrayList<String> list = new ArrayList<>();
         while(pos < rawCommand.length()) {
             char c = rawCommand.charAt(pos);
-            switch (c) {
+            switch(c) {
                 case ' ':
                     if(pos - old > 0) {
                         list.add(rawCommand.substring(old, pos));

+ 16 - 4
src/main/java/me/km/scheduler/SnuviScheduler.java

@@ -19,6 +19,13 @@ public class SnuviScheduler implements ISnuviScheduler {
         worker.start();
     }
 
+    public void kill() {
+        for(SnuviTask task : tasks) {
+            System.out.println(task.getName() + " " + task.isKillable());
+        }
+        tasks.removeIf(task -> task.isKillable());
+    }
+
     public void stop() {
         noAdding = true;
         long endTime = System.nanoTime() + 60_000_000_000l;
@@ -37,16 +44,21 @@ public class SnuviScheduler implements ISnuviScheduler {
         logger.print("the scheduler is now stopped");
     }
 
-    public void scheduleRepeatingTask(Runnable r, long ticks, long rtimer) {
+    public void scheduleRepeatingTask(String name, boolean killable, Runnable r, long ticks,
+            long rtimer) {
         if(noAdding) {
             return;
         }
-        tasks.add(new SnuviTask(r, ticks, rtimer));
+        tasks.add(new SnuviTask(name, killable, r, ticks, rtimer));
+    }
+
+    public void scheduleRepeatingTask(String name, Runnable r, long ticks, long rtimer) {
+        scheduleRepeatingTask(name, false, r, ticks, rtimer);
     }
 
     @Override
-    public void scheduleTask(Runnable r, long delay) {
-        scheduleRepeatingTask(r, delay, 0);
+    public void scheduleTask(String name, Runnable r, long delay) {
+        scheduleRepeatingTask(name, true, r, delay, 0);
     }
 
     public void tick() {

+ 13 - 1
src/main/java/me/km/scheduler/SnuviTask.java

@@ -4,8 +4,12 @@ public class SnuviTask {
     private final long rtimer;
     private final Runnable r;
     private long timer;
+    private String name;
+    private boolean killable;
 
-    public SnuviTask(Runnable r, long delay, long rtimer) {
+    public SnuviTask(String name, boolean killable, Runnable r, long delay, long rtimer) {
+        this.killable = killable;
+        this.name = name;
         this.rtimer = rtimer;
         this.timer = delay;
         this.r = r;
@@ -19,6 +23,14 @@ public class SnuviTask {
         return rtimer > 0;
     }
 
+    public String getName() {
+        return name;
+    }
+
+    public boolean isKillable() {
+        return killable;
+    }
+
     public boolean tick(int ticks, boolean noRepeat) {
         timer -= ticks;
         if(timer <= 0) {

+ 12 - 3
src/main/java/me/km/snuviscript/CommandScript.java

@@ -6,6 +6,7 @@ import java.util.Collection;
 import me.hammerle.snuviscript.code.Script;
 import me.km.permissions.Command;
 import net.minecraft.command.ICommandSource;
+import me.km.Server;
 
 public class CommandScript extends Command {
     private final Scripts scripts;
@@ -29,7 +30,7 @@ public class CommandScript extends Command {
     @Override
     public void execute(ICommandSource cs, String[] arg) {
         if(arg.length >= 1) {
-            switch (arg[0].toLowerCase()) {
+            switch(arg[0].toLowerCase()) {
                 case "s":
                 case "start": {
                     if(arg.length >= 2) {
@@ -68,9 +69,9 @@ public class CommandScript extends Command {
                             } else {
                                 sendMessage(cs, String.format("Script id '%d' is not valid.", id));
                             }
-                        } catch (NumberFormatException ex) {
+                        } catch(NumberFormatException ex) {
                             sendMessage(cs, String.format("'%s' is not a valid id.", arg[1]));
-                        } catch (Exception ex) {
+                        } catch(Exception ex) {
                             sendMessage(cs, "An exception on script termination was thrown.");
                             ex.printStackTrace();
                         }
@@ -78,6 +79,13 @@ public class CommandScript extends Command {
                     }
                     break;
                 }
+                case "kill": {
+                    scripts.getScriptManager().removeScripts();
+                    Server.scheduler.kill();
+                    sendMessage(cs, "All active scripts were terminated.");
+                    sendMessage(cs, "All scheduled tasks were killed.");
+                    return;
+                }
             }
         }
 
@@ -85,5 +93,6 @@ public class CommandScript extends Command {
         sendListMessage(cs, "start <scripts...>", "starts a script");
         sendListMessage(cs, "see", "shows active scripts");
         sendListMessage(cs, "term <id/all>", "terminates a script");
+        sendListMessage(cs, "kill", "kills all scripts and the scheduler");
     }
 }

+ 3 - 2
src/main/java/me/km/snuviscript/ScriptEvents.java

@@ -673,8 +673,9 @@ public class ScriptEvents implements BlockHarvest, Craft, ContainerClick {
     public void onEntityJoinWorld(EntityJoinWorldEvent e) {
         Entity ent = e.getEntity();
         BlockPos pos = ent.getPosition();
-        Server.scheduler.scheduleTask(() -> {
-            if(ent.getEntityWorld().getBlockState(ent.getPosition())
+        Server.scheduler.scheduleTask("onEntityJoinWorld", () -> {
+            World w = ent.getEntityWorld();
+            if(w.isAreaLoaded(pos, 1) && ent.getEntityWorld().getBlockState(ent.getPosition())
                     .getBlock() == Blocks.NETHER_PORTAL) {
                 ent.setLocationAndAngles(pos.getX(), pos.getY() + 10, pos.getZ(), ent.rotationYaw,
                         ent.rotationPitch);

+ 1 - 1
src/main/java/me/km/snuviscript/commands/Commands.java

@@ -30,7 +30,7 @@ public class Commands {
         sm.registerConsumer("command", (sc, in) -> {
             final String s = SnuviUtils.connect(sc, in, 0);
             StackTrace trace = sc.getStackTrace();
-            scheduler.scheduleTask(() -> {
+            scheduler.scheduleTask("command", () -> {
                 try {
                     commands.handleCommand(server.getCommandSource(), s);
                 } catch(Exception ex) {

+ 20 - 11
src/main/java/me/km/snuviscript/commands/DatabankCommands.java

@@ -9,7 +9,8 @@ import me.km.databank.DataBank;
 import me.km.scheduler.SnuviScheduler;
 
 public class DatabankCommands {
-    public static void registerFunctions(ScriptManager sm, SnuviScheduler scheduler, DataBank dataBank) {
+    public static void registerFunctions(ScriptManager sm, SnuviScheduler scheduler,
+            DataBank dataBank) {
         sm.registerFunction("databank.prepare", (sc, in) -> {
             PreparedStatement p = dataBank.prepareUnsafeStatement(in[0].getString(sc));
             if(in.length <= 1 || in[1].getBoolean(sc)) {
@@ -32,12 +33,18 @@ public class DatabankCommands {
         sm.registerConsumer("databank.setbool", (sc, in) -> {
             ((PreparedStatement) in[0].get(sc)).setBoolean(in[1].getInt(sc), in[2].getBoolean(sc));
         });
-        sm.registerFunction("databank.getint", (sc, in) -> (double) ((ResultSet) in[0].get(sc)).getInt(in[1].getInt(sc)));
-        sm.registerFunction("databank.getlong", (sc, in) -> (double) ((ResultSet) in[0].get(sc)).getLong(in[1].getInt(sc)));
-        sm.registerFunction("databank.getdouble", (sc, in) -> ((ResultSet) in[0].get(sc)).getDouble(in[1].getInt(sc)));
-        sm.registerFunction("databank.getstring", (sc, in) -> ((ResultSet) in[0].get(sc)).getString(in[1].getInt(sc)));
-        sm.registerFunction("databank.getbool", (sc, in) -> ((ResultSet) in[0].get(sc)).getBoolean(in[1].getInt(sc)));
-        sm.registerFunction("databank.execute", (sc, in) -> ((PreparedStatement) in[0].get(sc)).executeQuery());
+        sm.registerFunction("databank.getint",
+                (sc, in) -> (double) ((ResultSet) in[0].get(sc)).getInt(in[1].getInt(sc)));
+        sm.registerFunction("databank.getlong",
+                (sc, in) -> (double) ((ResultSet) in[0].get(sc)).getLong(in[1].getInt(sc)));
+        sm.registerFunction("databank.getdouble",
+                (sc, in) -> ((ResultSet) in[0].get(sc)).getDouble(in[1].getInt(sc)));
+        sm.registerFunction("databank.getstring",
+                (sc, in) -> ((ResultSet) in[0].get(sc)).getString(in[1].getInt(sc)));
+        sm.registerFunction("databank.getbool",
+                (sc, in) -> ((ResultSet) in[0].get(sc)).getBoolean(in[1].getInt(sc)));
+        sm.registerFunction("databank.execute",
+                (sc, in) -> ((PreparedStatement) in[0].get(sc)).executeQuery());
         sm.registerConsumer("databank.workerexecute", (sc, in) -> {
             final PreparedStatement p = (PreparedStatement) in[0].get(sc);
             StackTrace lines = sc.getStackTrace();
@@ -46,16 +53,18 @@ public class DatabankCommands {
                 try {
                     p.execute();
                 } catch(SQLException ex) {
-                    scheduler.scheduleTask(() -> {
-                        sc.getScriptManager().getLogger().print("Worker error", ex, function, sc.getName(), sc, lines);
+                    scheduler.scheduleTask("worker execute 1", () -> {
+                        sc.getScriptManager().getLogger().print("Worker error", ex, function,
+                                sc.getName(), sc, lines);
                     });
                 }
                 sc.removeCloseable(p);
                 try {
                     p.close();
                 } catch(SQLException ex) {
-                    scheduler.scheduleTask(() -> {
-                        sc.getScriptManager().getLogger().print("Worker error", ex, function, sc.getName(), sc, lines);
+                    scheduler.scheduleTask("worker execute 2", () -> {
+                        sc.getScriptManager().getLogger().print("Worker error", ex, function,
+                                sc.getName(), sc, lines);
                     });
                 }
             });

+ 2 - 2
src/main/java/me/km/snuviscript/commands/LivingCommands.java

@@ -99,7 +99,7 @@ public class LivingCommands {
             DamageSource damageSource =
                     (in.length >= 3) ? (DamageSource) in[2].get(sc) : DamageSource.GENERIC;
             StackTrace trace = sc.getStackTrace();
-            scheduler.scheduleTask(() -> {
+            scheduler.scheduleTask("living.damage", () -> {
                 try {
                     liv.attackEntityFrom(damageSource, damage);
                 } catch(Exception ex) {
@@ -112,7 +112,7 @@ public class LivingCommands {
             LivingEntity liv = (LivingEntity) in[0].get(sc);
             float heal = in[1].getFloat(sc);
             StackTrace trace = sc.getStackTrace();
-            scheduler.scheduleTask(() -> {
+            scheduler.scheduleTask("living.heal", () -> {
                 try {
                     liv.heal(heal);
                 } catch(Exception ex) {

+ 1 - 1
src/main/java/me/km/snuviscript/commands/PlayerCommands.java

@@ -63,7 +63,7 @@ public class PlayerCommands {
         });
         sm.registerConsumer("player.respawn", (sc, in) -> {
             final ServerPlayerEntity p = ((ServerPlayerEntity) in[0].get(sc));
-            scheduler.scheduleTask(() -> {
+            scheduler.scheduleTask("player.respawn", () -> {
                 try {
                     p.connection.processClientStatus(
                             new CClientStatusPacket(CClientStatusPacket.State.PERFORM_RESPAWN));