Browse Source

update to snuvi script recoded

Kajetan Johannes Hammerle 6 years ago
parent
commit
8a39bac702
25 changed files with 2154 additions and 2305 deletions
  1. 1 1
      build.gradle
  2. 2 2
      src/main/java/me/km/KajetansMod.java
  3. 2 2
      src/main/java/me/km/api/Location.java
  4. 10 0
      src/main/java/me/km/api/MessageSender.java
  5. 22 20
      src/main/java/me/km/api/SimpleConfig.java
  6. 2 3
      src/main/java/me/km/databank/SimpleDataBank.java
  7. 0 2
      src/main/java/me/km/exception/IllegalItemStackStringException.java
  8. 0 2
      src/main/java/me/km/exception/IllegalLocationStringException.java
  9. 9 0
      src/main/java/me/km/exception/IllegalStringException.java
  10. 0 2
      src/main/java/me/km/exception/PlayerNotFoundException.java
  11. 1 2
      src/main/java/me/km/scheduler/SnuviScheduler.java
  12. 5 7
      src/main/java/me/km/snuviscript/CommandGiveUp.java
  13. 35 35
      src/main/java/me/km/snuviscript/CommandScript.java
  14. 1597 1539
      src/main/java/me/km/snuviscript/MinecraftFunctions.java
  15. 0 50
      src/main/java/me/km/snuviscript/MinecraftScript.java
  16. 0 55
      src/main/java/me/km/snuviscript/PlayerScript.java
  17. 7 7
      src/main/java/me/km/snuviscript/ScriptBank.java
  18. 265 317
      src/main/java/me/km/snuviscript/ScriptEvents.java
  19. 0 131
      src/main/java/me/km/snuviscript/ScriptHelper.java
  20. 6 5
      src/main/java/me/km/snuviscript/ScriptInventoryHolder.java
  21. 102 102
      src/main/java/me/km/snuviscript/ScriptModule.java
  22. 9 9
      src/main/java/me/km/snuviscript/ScriptVars.java
  23. 50 0
      src/main/java/me/km/snuviscript/SnuviLogger.java
  24. 16 0
      src/main/java/me/km/utils/ItemStackUtils.java
  25. 13 12
      src/main/java/me/km/utils/NBTUtils.java

+ 1 - 1
build.gradle

@@ -55,7 +55,7 @@ dependencies {
     // http://www.gradle.org/docs/current/userguide/artifact_dependencies_tutorial.html
     // http://www.gradle.org/docs/current/userguide/dependency_management.html
     compile 'mysql:mysql-connector-java:5.1.42'
-    compile files('./../../SnuviScript/dist/SnuviScript.jar')
+    compile files('./../../SnuviScriptRecoded/dist/SnuviScriptRecoded.jar')
 }
 
 processResources {

+ 2 - 2
src/main/java/me/km/KajetansMod.java

@@ -282,7 +282,7 @@ public class KajetansMod
         perms = new PermissionManager("Permissions", "Perms", TextFormatting.DARK_PURPLE);
         perms.registerEvents("me.km.permissions");
 
-        scripts.startScript(server, "startscript");
+        scripts.startScript("startscript");
     }
     
     @Mod.EventHandler
@@ -307,7 +307,7 @@ public class KajetansMod
         {
             return;
         }
-        scripts.startScript(server, "endscript");
+        scripts.startScript("endscript");
         databank.closeDataBankConnection();
     }
 

+ 2 - 2
src/main/java/me/km/api/Location.java

@@ -2,7 +2,7 @@ package me.km.api;
 
 import java.util.Objects;
 import java.util.regex.PatternSyntaxException;
-import me.hammerle.code.Script;
+import me.hammerle.snuviscript.code.Script;
 import me.km.dimensions.ModDimensions;
 import me.km.exception.IllegalLocationStringException;
 import net.minecraft.block.state.IBlockState;
@@ -56,7 +56,7 @@ public class Location
         this(ent.world, ent.posX, ent.posY, ent.posZ, ent.rotationYaw, ent.rotationPitch);
     }
     
-    public Location(Script sc, String location) throws IllegalLocationStringException
+    public Location(String location) throws IllegalLocationStringException
     {
         try
         {

+ 10 - 0
src/main/java/me/km/api/MessageSender.java

@@ -83,6 +83,16 @@ public class MessageSender
         send(KajetansMod.server, msg);
     }
     
+    public void sendListElementToConsole(String msg)
+    {
+        sendListElement(KajetansMod.server, msg);
+    }
+    
+    public void sendHelpListElementToConsole(String msg, String msg2)
+    {
+        sendHelpListElement(KajetansMod.server, msg, msg2);
+    }
+    
     public void sendWarningToConsole(String msg)
     {
         sendWarning(KajetansMod.server, msg);

+ 22 - 20
src/main/java/me/km/api/SimpleConfig.java

@@ -1,9 +1,8 @@
 package me.km.api;
 
 import java.io.File;
-import me.hammerle.code.ISnuviLogger;
-import me.hammerle.code.Script;
-import me.hammerle.config.SnuviConfig;
+import me.hammerle.snuviscript.code.Script;
+import me.hammerle.snuviscript.config.SnuviConfig;
 import me.km.dimensions.ModDimensions;
 import me.km.exception.IllegalItemStackStringException;
 import me.km.utils.ItemStackUtils;
@@ -13,32 +12,26 @@ public class SimpleConfig extends SnuviConfig
 {                   
     public SimpleConfig(Module m, String path, String name, boolean load)
     {    
-        super(new ISnuviLogger() 
+        super((String message, Exception ex, String function, String scriptname, Script sc, int line) -> 
         {
-            @Override
-            public void printException(Exception ex, String function, Script sc, int line)
+            m.sendToConsole("error in config '" + name + "'");
+            if(message != null)
             {
-                // should not happen
+                m.sendListElementToConsole(message);
             }
-
-            @Override
-            public void printException(Exception ex, String function, String s, int line) 
+            if(ex != null)
             {
-                 // should not happen
+                m.sendListElementToConsole(ex.getClass().getSimpleName());
             }
-
-            @Override
-            public void printWarning(String s) 
+            if(function != null)
             {
-                m.sendWarningToConsole(s);
+                m.sendHelpListElementToConsole("function", function);
             }
-
-            @Override
-            public void printInfo(String s) 
+            if(line != -1)
             {
-                m.sendToConsole(s);
+                m.sendHelpListElementToConsole("line", function);
             }
-        }, path, name, "snuvi");
+        }, path, name);
        
         if(load && exists())
         {
@@ -46,6 +39,15 @@ public class SimpleConfig extends SnuviConfig
         }
     }   
     
+    public SimpleConfig(Module m, Script sc, String path, String name, boolean load)
+    {
+        super(sc, path, name);
+        if(load && exists())
+        {
+            load();
+        }
+    }
+    
     public static File[] getFiles(String path)
     {
         return new File("./" + path).listFiles();

+ 2 - 3
src/main/java/me/km/databank/SimpleDataBank.java

@@ -1,13 +1,12 @@
 package me.km.databank;
 
-import java.sql.Connection;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.sql.Statement;
 import java.util.ArrayList;
-import me.hammerle.code.Code;
 import me.km.api.Module;
 import me.km.table.Table;
+import me.hammerle.snuviscript.code.Compiler;
 
 public abstract class SimpleDataBank 
 {
@@ -276,7 +275,7 @@ public abstract class SimpleDataBank
             ResultSet rs = stmt.executeQuery(query);
             while(rs.next())
             {
-                table.addRow(new Object[] {rs.getString(1), Code.convertInput(null, rs.getString(2), false)});
+                table.addRow(new Object[] {rs.getString(1), Compiler.convert(rs.getString(2))});
             }
             return table;
         }

+ 0 - 2
src/main/java/me/km/exception/IllegalItemStackStringException.java

@@ -1,7 +1,5 @@
 package me.km.exception;
 
-import me.hammerle.exceptions.IllegalStringException;
-
 public class IllegalItemStackStringException extends IllegalStringException
 {
     public IllegalItemStackStringException(String s) 

+ 0 - 2
src/main/java/me/km/exception/IllegalLocationStringException.java

@@ -1,7 +1,5 @@
 package me.km.exception;
 
-import me.hammerle.exceptions.IllegalStringException;
-
 public class IllegalLocationStringException extends IllegalStringException
 {
     public IllegalLocationStringException(String s) 

+ 9 - 0
src/main/java/me/km/exception/IllegalStringException.java

@@ -0,0 +1,9 @@
+package me.km.exception;
+
+public class IllegalStringException extends RuntimeException
+{
+    public IllegalStringException(String s)
+    {
+        super("invalid string: " + s);
+    }
+}

+ 0 - 2
src/main/java/me/km/exception/PlayerNotFoundException.java

@@ -1,7 +1,5 @@
 package me.km.exception;
 
-import me.hammerle.exceptions.IllegalStringException;
-
 public class PlayerNotFoundException extends IllegalStringException
 {    
     public PlayerNotFoundException(String s) 

+ 1 - 2
src/main/java/me/km/scheduler/SnuviScheduler.java

@@ -1,13 +1,12 @@
 package me.km.scheduler;
 
-import java.util.ArrayList;
 import java.util.ConcurrentModificationException;
 import java.util.HashMap;
 import java.util.LinkedList;
 import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
-import me.hammerle.code.ISnuviScheduler;
+import me.hammerle.snuviscript.code.ISnuviScheduler;
 import me.km.api.Module;
 import net.minecraft.util.text.TextFormatting;
 import net.minecraftforge.fml.relauncher.Side;

+ 5 - 7
src/main/java/me/km/snuviscript/CommandGiveUp.java

@@ -1,5 +1,6 @@
 package me.km.snuviscript;
 
+import me.hammerle.snuviscript.code.Script;
 import me.km.KajetansMod;
 import me.km.api.GlobalText;
 import me.km.api.Module;
@@ -32,16 +33,13 @@ public class CommandGiveUp extends ModuleCommand
             return true;
         }
         EntityPlayer p = (EntityPlayer) cs;
-        PlayerScript qd = KajetansMod.scripts.getScript(p);
-        if(qd == null)
+        Script script = KajetansMod.scripts.getScript(p);
+        if(script == null)
         {
-            this.getModule().send(cs, "Du hast gerade keine Quest.");
+            this.getModule().send(cs, "Du hast kein Script an dich gebunden.");
             return true;
         }
-        if(!KajetansMod.scripts.getSnuviParser().callEvent("player_giveup", qd, (sc) -> ScriptVars.setPlayerVars(qd, p), null))
-        {
-            KajetansMod.scripts.removePlayerFromScript(p, qd);
-        }
+        KajetansMod.scripts.getSnuviParser().callEvent("player_giveup", script, (sc) -> ScriptVars.setPlayerVars(sc, p), null);
         return true;
     }
 }

+ 35 - 35
src/main/java/me/km/snuviscript/CommandScript.java

@@ -1,18 +1,17 @@
 package me.km.snuviscript;
 
+import java.util.Arrays;
 import me.km.KajetansMod;
-import me.km.api.GlobalText;
 import me.km.api.Module;
 import me.km.api.ModuleCommand;
 import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-import me.hammerle.code.Script;
+import me.hammerle.snuviscript.code.Script;
+import me.km.api.GlobalText;
 import me.km.api.Utils;
 import me.km.exception.PlayerNotFoundException;
 import me.km.permissions.Permissions;
 import net.minecraft.command.ICommandSender;
-import net.minecraft.util.text.TextComponentString;
+import net.minecraft.entity.player.EntityPlayer;
 
 public class CommandScript extends ModuleCommand
 {
@@ -37,21 +36,27 @@ public class CommandScript extends ModuleCommand
                 case "s":
                 case "start":
                 {
-                    if(arg.length == 2)
+                    if(arg.length >= 2)
                     {
-                        KajetansMod.scripts.startScript(cs, arg[1]);
+                        String[] pars = Arrays.copyOfRange(arg, 1, arg.length);
+                        KajetansMod.scripts.startScript(pars);
                         return true;
                     }
-                    else if(arg.length > 2)
+                    break;
+                }
+                case "startp":
+                {
+                    if(arg.length >= 3)
                     {
                         try
                         {
-                            KajetansMod.scripts.startQuest(cs, arg[1], Utils.getPlayerByName(arg[2]));
+                            EntityPlayer p = Utils.getPlayerByName(arg[1]);
+                            String[] pars = Arrays.copyOfRange(arg, 2, arg.length);
+                            KajetansMod.scripts.startPlayerScript(p, pars);
                         }
                         catch(PlayerNotFoundException ex)
                         {
-                            m.send(cs, GlobalText.cantFindPlayer(arg[2]));
-                            return true;
+                            m.send(cs, GlobalText.cantFindPlayer(arg[1]));
                         }
                         return true;
                     }
@@ -64,12 +69,12 @@ public class CommandScript extends ModuleCommand
                     {
                         try
                         {
-                            Script qd = KajetansMod.scripts.getSnuviParser().getScript(Integer.parseInt(arg[1]));
-                            if(qd == null)
+                            Script sc = KajetansMod.scripts.getSnuviParser().getScript(Integer.parseInt(arg[1]));
+                            if(sc == null)
                             {
                                 throw new NumberFormatException();
                             }
-                            m.send(cs, arg[2] + " = " + qd.getVar(arg[2]));
+                            m.send(cs, arg[2] + " = " + sc.getVar(arg[2]).get(sc));
                         }
                         catch(NumberFormatException ex)
                         {
@@ -86,12 +91,12 @@ public class CommandScript extends ModuleCommand
                     {
                         try
                         {
-                            Script qd = KajetansMod.scripts.getSnuviParser().getScript(Integer.parseInt(arg[1]));
-                            if(qd == null)
+                            Script sc = KajetansMod.scripts.getSnuviParser().getScript(Integer.parseInt(arg[1]));
+                            if(sc == null)
                             {
                                 throw new NumberFormatException();
                             }
-                            qd.runCode();
+                            sc.run();
                         }
                         catch(NumberFormatException ex)
                         {
@@ -123,7 +128,7 @@ public class CommandScript extends ModuleCommand
                     }
                     break;
                 }*/
-                case "p":
+                /*case "p":
                 case "printvars":
                 {
                     if(arg.length >= 2)
@@ -149,8 +154,8 @@ public class CommandScript extends ModuleCommand
                         return true;
                     }
                     break;
-                }
-                case "pl":
+                }*/
+                /*case "pl":
                 case "printlists":
                 {
                     if(arg.length >= 2)
@@ -178,8 +183,8 @@ public class CommandScript extends ModuleCommand
                         return true;
                     }
                     break;
-                }
-                case "pm":
+                }*/
+                /*case "pm":
                 case "printmaps":
                 {
                     if(arg.length >= 2)
@@ -207,7 +212,7 @@ public class CommandScript extends ModuleCommand
                         return true;
                     }
                     break;
-                }
+                }*/
                 case "see":
                 {
                     Collection<Script> scripts = KajetansMod.scripts.getSnuviParser().getScripts();
@@ -219,15 +224,8 @@ public class CommandScript extends ModuleCommand
                     m.send(cs, "Folgende Scripts sind aktiv:");
                     scripts.forEach(sc ->
                     {
-                        if(sc.getClass() == PlayerScript.class)
-                        {
-                            m.sendHelpListElement(cs, sc.getName(), "(" + sc.getId() + ")");
-                            ((PlayerScript) sc).getPlayers().forEach(p -> m.sendListElement(cs, p.getName()));
-                        }
-                        else
-                        {
-                            m.sendHelpListElement(cs, sc.getName(), "(" + sc.getId() + ")");
-                        }
+                        m.sendHelpListElement(cs, sc.getName(), "(" + sc.getId() + ")");
+                        KajetansMod.scripts.getPlayerList(sc.getId()).forEach(p -> m.sendListElement(cs, p.getName()));
                     });
                     return true;
                 }
@@ -239,6 +237,7 @@ public class CommandScript extends ModuleCommand
                         {
                             if(arg[1].equals("all"))
                             {
+                                KajetansMod.scripts.clearPlayerRegistry();
                                 KajetansMod.scripts.getSnuviParser().termAllUnsafe();
                                 m.send(cs, "Alle aktiven Scripts wurden beendet.");
                                 return true;
@@ -267,11 +266,12 @@ public class CommandScript extends ModuleCommand
         }
         
         m.send(cs, "/script ...");
-        m.sendHelpListElement(cs, "start <script> [player]", "Startet ein Script");
+        m.sendHelpListElement(cs, "start <scripts...>", "Startet ein Script");
+        m.sendHelpListElement(cs, "startp <player> <scripts...>", "Startet ein Script");
         m.sendHelpListElement(cs, "variable <id> <name>", "Zeigt den Wert einer Variable");       
         m.sendHelpListElement(cs, "printvars <id> [starts]", "Zeigt alle Variablen");
-        m.sendHelpListElement(cs, "printlists <id> [starts]", "Zeigt alle Listen");
-        m.sendHelpListElement(cs, "printmaps <id> [starts]", "Zeigt alle Maps");
+        //m.sendHelpListElement(cs, "printlists <id> [starts]", "Zeigt alle Listen");
+        //m.sendHelpListElement(cs, "printmaps <id> [starts]", "Zeigt alle Maps");
         m.sendHelpListElement(cs, "next <id>", "Springt in die nächste Codezeile");
         //m.sendHelpListElement(cs, "code <id> <code", "Führt den angegebenen Code aus");
         m.sendHelpListElement(cs, "see", "Gibt alle aktiven Scripts aus");

File diff suppressed because it is too large
+ 1597 - 1539
src/main/java/me/km/snuviscript/MinecraftFunctions.java


+ 0 - 50
src/main/java/me/km/snuviscript/MinecraftScript.java

@@ -1,50 +0,0 @@
-package me.km.snuviscript;
-
-import java.util.HashSet;
-import me.hammerle.code.Script;
-import me.hammerle.code.SnuviParser;
-import me.km.api.Location;
-
-public class MinecraftScript extends Script
-{  
-    private final HashSet<Location> loadedLocations;
-    private int invCounter;
-    
-    public MinecraftScript(SnuviParser parser, int id, String name, String code, boolean receiveEventBroadcast)
-    {       
-        super(parser, id, name, code, receiveEventBroadcast);
-        loadedLocations = new HashSet<>();   
-        invCounter = 0;
-    }
-
-    // -------------------------------------------------------------------------
-    // Location Handling für Wait-For-Location
-    // -------------------------------------------------------------------------
-    
-    public void addLocation(Location l)
-    {
-        l = l.copy();
-        l.round();
-        loadedLocations.add(l);
-    }
-    
-    public boolean removeLocation(Location l)
-    {
-        return loadedLocations.remove(l);
-    }
-    
-    public void clearLocations()
-    {
-        loadedLocations.clear();
-    }
-    
-    // -------------------------------------------------------------------------
-    // Für Inventar-IDs
-    // -------------------------------------------------------------------------
-    
-    public int getNewId()
-    {
-        invCounter++;
-        return invCounter;
-    }
-}

+ 0 - 55
src/main/java/me/km/snuviscript/PlayerScript.java

@@ -1,55 +0,0 @@
-package me.km.snuviscript;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.stream.Collectors;
-import me.hammerle.code.SnuviParser;
-import me.km.KajetansMod;
-import net.minecraft.entity.player.EntityPlayer;
-
-public class PlayerScript extends MinecraftScript
-{
-    private final ArrayList<EntityPlayer> players;  
-    
-    public PlayerScript(SnuviParser parser, int id, String name, String code, boolean receiveEventBroadcast)
-    {       
-        super(parser, id, name, code, receiveEventBroadcast);
-        players = new ArrayList<>();
-    }
-
-    @Override
-    public void onTerm() 
-    {
-        ScriptModule scm = KajetansMod.scripts;
-        this.setInvalid();
-        players.forEach(p -> scm.removePlayerFromScript(p, this));
-    }
-
-    @Override
-    protected void initExpansion(Object... o) 
-    {
-        players.add((EntityPlayer) o[0]);
-        ScriptVars.setPlayerVars(this, (EntityPlayer) o[0]); 
-    }
-    
-    public void addPlayer(EntityPlayer p)
-    {
-        players.add(p);
-    }
-    
-    public boolean removePlayer(EntityPlayer p)
-    {
-        players.remove(p);
-        return players.isEmpty();
-    }
-    
-    public List<EntityPlayer> getPlayers()
-    {      
-        return players;
-    }
-    
-    public List<String> getPlayerNames()
-    {
-        return getPlayers().stream().map(p -> p.getName()).collect(Collectors.toList());
-    }
-}

+ 7 - 7
src/main/java/me/km/snuviscript/ScriptBank.java

@@ -2,9 +2,9 @@ package me.km.snuviscript;
 
 import me.km.api.Module;
 import me.km.databank.SimpleDataBank;
-import me.hammerle.code.Code;
 import me.km.databank.DataBank;
 import me.km.table.Table;
+import me.hammerle.snuviscript.code.Compiler;
 
 public class ScriptBank extends SimpleDataBank
 {   
@@ -95,10 +95,10 @@ public class ScriptBank extends SimpleDataBank
     
     public Object getVar(String var, String uuid, Object error)
     {
-        Object o = Code.convertInput(null, this.getFirst("SELECT value from questdata "
+        Object o = Compiler.convert(this.getFirst("SELECT value from questdata "
                 + "LEFT JOIN players ON players.id = questdata.player_id "
                 + "WHERE players.uuid = '" + uuid + "' AND "
-                + "questdata.var='" + var + "';", String.class), false);
+                + "questdata.var='" + var + "';", String.class));
         if(o == null)
         {
             return error;
@@ -137,9 +137,9 @@ public class ScriptBank extends SimpleDataBank
 
     public Object getMapValue(String map, String key)
     {
-        return Code.convertInput(null, this.getFirst("SELECT value from questmaps "
+        return Compiler.convert(this.getFirst("SELECT value from questmaps "
                 + "WHERE map = '" + map + "' AND "
-                + "keyname='" + key + "';", String.class), false);
+                + "keyname='" + key + "';", String.class));
     }  
     
     public void addDualMapElement(String map, String key, String key2, String value)
@@ -169,9 +169,9 @@ public class ScriptBank extends SimpleDataBank
 
     public Object getDualMapValue(String map, String key, String key2)
     {
-        return Code.convertInput(null, this.getFirst("SELECT value from questdualmaps "
+        return Compiler.convert(this.getFirst("SELECT value from questdualmaps "
                 + "WHERE map = '" + map + "' AND "
                 + "keyname = '" + key + "' AND "
-                + "seckeyname='" + key2 + "';", String.class), false);
+                + "seckeyname='" + key2 + "';", String.class));
     } 
 }

+ 265 - 317
src/main/java/me/km/snuviscript/ScriptEvents.java

@@ -7,11 +7,10 @@ import java.util.List;
 import java.util.UUID;
 import java.util.function.Consumer;
 import java.util.stream.Collectors;
-import me.hammerle.code.Code;
-import me.hammerle.code.Script;
-import me.hammerle.code.ScriptUtils;
-import me.hammerle.code.SnuviParser;
-import me.hammerle.math.Fraction;
+import me.hammerle.snuviscript.code.Compiler;
+import me.hammerle.snuviscript.code.Script;
+import me.hammerle.snuviscript.code.SnuviParser;
+import me.hammerle.snuviscript.math.Fraction;
 import me.km.KajetansMod;
 import me.km.api.Location;
 import me.km.api.ModuleListener;
@@ -24,7 +23,6 @@ import me.km.entities.EntityItemProjectile;
 import me.km.events.PlayerHurtEvent;
 import me.km.events.PlayerJoinMessageEvent;
 import me.km.events.PlayerLeaveMessageEvent;
-import me.km.events.PlayerMoveEvent;
 import me.km.events.PlayerRespawnAtEvent;
 import net.minecraft.entity.Entity;
 import net.minecraft.entity.EntityLivingBase;
@@ -50,6 +48,7 @@ import net.minecraftforge.event.entity.player.ItemFishedEvent;
 import net.minecraftforge.event.entity.player.PlayerDropsEvent;
 import net.minecraftforge.event.entity.player.PlayerInteractEvent;
 import net.minecraftforge.event.world.BlockEvent;
+import net.minecraftforge.fml.common.eventhandler.Event;
 import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
 import net.minecraftforge.fml.common.gameevent.PlayerEvent;
 
@@ -66,7 +65,7 @@ public class ScriptEvents extends ModuleListener
     }  
     
     // -------------------------------------------------------------------------
-    // Basics
+    // basics
     // -------------------------------------------------------------------------
     
     private void handleEvent(EntityPlayer p, String event, Consumer<Script> before, Consumer<Script> after)
@@ -98,45 +97,24 @@ public class ScriptEvents extends ModuleListener
     {      
         handleEvent(p, event, before, null);
     }
-         
-    // -------------------------------------------------------------------------
-    // Questevents
-    // -------------------------------------------------------------------------
     
-    @SubscribeEvent
-    public void onOtherScriptJoin(PlayerInteractEvent.EntityInteract e)
-    {              
-        if(e.getHand() == EnumHand.OFF_HAND || !(e.getTarget() instanceof EntityPlayer))
-        {
-            return;
-        }
-        EntityPlayer p = e.getEntityPlayer();   
-        EntityPlayer affectedPlayer = (EntityPlayer) e.getTarget();
-        if(KajetansMod.scripts.hasScript(p) && !KajetansMod.scripts.hasScript(affectedPlayer))
+    private void simpleCancel(Script sc, Event e, String name)
+    {
+        try
         {
-            if(questJoin.get(affectedPlayer.getUniqueID()) != null)
-            {
-                if(questJoin.get(affectedPlayer.getUniqueID()).equals(p.getUniqueID()))
-                {
-                    return;
-                }
-            }           
-            questJoin.put(affectedPlayer.getUniqueID(), p.getUniqueID());
-            this.getModule().send(affectedPlayer, p.getName() + " fragt dich, ob du seiner Quest beitreten willst.");
-            this.getModule().send(p, affectedPlayer.getName() + " wurde eine Anfrage gesendet.");
-            return;
+            e.setCanceled(sc.getVar("cancel").getBoolean(sc)); 
         }
-        if(!KajetansMod.scripts.hasScript(p) && questJoin.get(p.getUniqueID()) != null && KajetansMod.scripts.hasScript(affectedPlayer))
+        catch(Exception ex)
         {
-            if(questJoin.get(p.getUniqueID()).equals(affectedPlayer.getUniqueID()))
-            {
-                questJoin.remove(p.getUniqueID());
-                KajetansMod.scripts.addPlayerToPlayer(p, affectedPlayer);
-            }
+            KajetansMod.scripts.logger.print("invalid var in '" + name + "' event", ex, null, sc.getName(), sc, sc.getActiveRealLine());
         }
     }
+         
+    // -------------------------------------------------------------------------
+    // events
+    // -------------------------------------------------------------------------
 
-    @SubscribeEvent
+    /*@SubscribeEvent
     public void onPlayerMove(PlayerMoveEvent e)
     {      
         EntityPlayer p = e.getEntityPlayer();
@@ -153,29 +131,29 @@ public class ScriptEvents extends ModuleListener
                 ScriptVars.setPlayerVars(sc, p); 
             }, null, data.removeLocation(l));
         }
-    } 
+    } */
     
-    public boolean onInventoryClick(Script qd, SnuviInventory inv, int slot, ClickType click, EntityPlayer p)
+    public boolean onInventoryClick(Script script, SnuviInventory inv, int slot, ClickType click, EntityPlayer p)
     {
-        parser.callEvent("inv_click", qd, sc -> 
-        {
-            ScriptVars.setPlayerVars(qd, p); 
-            qd.setEventVar("inv_id", new Fraction(inv.getId()));
-            qd.setEventVar("inv_name", inv.getName());
-            qd.setEventVar("inv_slot", new Fraction(slot));
-            ScriptVars.setItemVars(qd, inv.getStackInSlot(slot));
-            qd.setVar("cancel", false); 
+        parser.callEvent("inv_click", script, sc -> 
+        {
+            ScriptVars.setPlayerVars(sc, p); 
+            sc.setVar("inv_id", new Fraction(inv.getId()));
+            sc.setVar("inv_name", inv.getName());
+            sc.setVar("inv_slot", new Fraction(slot));
+            ScriptVars.setItemVars(sc, inv.getStackInSlot(slot));
+            sc.setVar("cancel", false); 
         }, null);
-        return qd.getBooleanVar("cancel");
+        return script.getVar("cancel").getBoolean(script);
     }
 
-    public void onInventoryClose(Script qd, SnuviInventory inv, EntityPlayer p)
+    public void onInventoryClose(Script script, SnuviInventory inv, EntityPlayer p)
     {
-        parser.callEvent("inv_close", qd, sc -> 
+        parser.callEvent("inv_close", script, sc -> 
         {
-            ScriptVars.setPlayerVars(qd, p); 
-            qd.setEventVar("inv_id", new Fraction(inv.getId()));
-            qd.setEventVar("inv_name", inv.getName());
+            ScriptVars.setPlayerVars(sc, p); 
+            sc.setVar("inv_id", new Fraction(inv.getId()));
+            sc.setVar("inv_name", inv.getName());
         }, null);
     }
     
@@ -187,22 +165,22 @@ public class ScriptEvents extends ModuleListener
     @SubscribeEvent
     public void onPlayerRespawn(PlayerRespawnAtEvent e)
     {
-        handleEvent(e.getEntityPlayer(), "player_respawn", (qd) -> 
+        handleEvent(e.getEntityPlayer(), "player_respawn", (sc) -> 
         {
-            qd.setEventVar("keep_inventory", e.isInventoryKeepingForced());
-            qd.setEventVar("respawn_loc", new Location(e.getWorld(), e.getRespawnLoc()));
-        }, (qd) -> 
+            sc.setVar("keep_inventory", e.isInventoryKeepingForced());
+            sc.setVar("respawn_loc", new Location(e.getWorld(), e.getRespawnLoc()));
+        }, (sc) -> 
         {
             try 
             {
-                e.setForcedInventoryKeeping(qd.getBooleanVar("keep_inventory"));
-                Location l = (Location) qd.getVar("respawn_loc");
+                e.setForcedInventoryKeeping(sc.getVar("keep_inventory").getBoolean(sc));
+                Location l = (Location) sc.getVar("respawn_loc").get(sc);
                 e.setRespawnLoc(l.getPos());
                 e.setWorld((WorldServer) l.getWorld());
             } 
             catch(ClassCastException | NullPointerException ex) 
             {
-                KajetansMod.scripts.logger.printException(ex, "player_respawn", qd, qd.getActiveRealCodeLine());
+                KajetansMod.scripts.logger.print("invalid var in 'player_respawn' event", ex, null, sc.getName(), sc, sc.getActiveRealLine());
             }
         });
     }
@@ -211,40 +189,40 @@ public class ScriptEvents extends ModuleListener
     public void onPlayerDamage(PlayerHurtEvent e)
     {        
         EntityPlayer p = e.getEntityPlayer();  
-        handleEvent(p, "player_hurt", (qd) -> 
+        handleEvent(p, "player_hurt", (sc) -> 
         {
             if(p.getHealth() <= e.getAmount())
             {
-                qd.setEventVar("player_killed", true);   
+                sc.setVar("player_killed", true);   
             }  
             else
             {
-                qd.setEventVar("player_killed", false); 
+                sc.setVar("player_killed", false); 
             }
-            qd.setEventVar("player_damage", Fraction.fromDouble(e.getAmount()));   
-            qd.setEventVar("player_damage_cause", e.getSource().getDamageType());
+            sc.setVar("player_damage", Fraction.fromDouble(e.getAmount()));   
+            sc.setVar("player_damage_cause", e.getSource().getDamageType());
             EntityPlayer ent = Utils.getDamager(e.getSource());
             if(ent != null)
             {
-                qd.setEventVar("player_involved", true);
-                ScriptVars.setSecPlayer(qd, ent);
+                sc.setVar("player_involved", true);
+                ScriptVars.setSecPlayer(sc, ent);
             }
             else
             {
-                qd.setEventVar("player_involved", false);
+                sc.setVar("player_involved", false);
             }
-            qd.setVar("cancel", e.isCanceled()); 
-        }, (qd) -> 
+            sc.setVar("cancel", e.isCanceled()); 
+        }, (sc) -> 
         {
             try
             {
-                e.setAmount(ScriptUtils.getFloat(qd.getVar("player_damage")));
+                e.setAmount(sc.getVar("player_damage").getFraction(sc).floatValue());
+                e.setCanceled(sc.getVar("cancel").getBoolean(sc)); 
             }
             catch(Exception ex)
             {
-                KajetansMod.scripts.logger.printException(ex, "player_hurt", qd, qd.getActiveRealCodeLine());
+                KajetansMod.scripts.logger.print("invalid var in 'player_hurt' event", ex, null, sc.getName(), sc, sc.getActiveRealLine());
             }
-            e.setCanceled(qd.getBooleanVar("cancel")); 
         });
     } 
     
@@ -253,21 +231,21 @@ public class ScriptEvents extends ModuleListener
     {        
         if(e.getEntityLiving() instanceof EntityPlayer)
         {
-            handleEvent((EntityPlayer) e.getEntityLiving(), "player_heal", (qd) -> 
+            handleEvent((EntityPlayer) e.getEntityLiving(), "player_heal", (sc) -> 
             {
-                qd.setEventVar("heal", Fraction.fromDouble(e.getAmount()));
-                qd.setVar("cancel", e.isCanceled()); 
-            }, (qd) -> 
+                sc.setVar("heal", Fraction.fromDouble(e.getAmount()));
+                sc.setVar("cancel", e.isCanceled()); 
+            }, (sc) -> 
             {
                 try
                 {
-                    e.setAmount(ScriptUtils.getFloat(qd.getVar("heal")));
+                    e.setAmount(sc.getVar("heal").getFraction(sc).floatValue());
+                    e.setCanceled(sc.getVar("cancel").getBoolean(sc)); 
                 }
                 catch(Exception ex)
                 {
-                    KajetansMod.scripts.logger.printException(ex, "player_heal", qd, qd.getActiveRealCodeLine());
+                    KajetansMod.scripts.logger.print("invalid var in 'player_heal' event", ex, null, sc.getName(), sc, sc.getActiveRealLine());
                 }
-                e.setCanceled(qd.getBooleanVar("cancel")); 
             });
         }
     } 
@@ -277,44 +255,51 @@ public class ScriptEvents extends ModuleListener
     {        
         if(!(e.getEntityLiving() instanceof EntityPlayer))
         {
-            handleEvent(null, "entity_death", (qd) -> 
+            handleEvent(null, "entity_death", (sc) -> 
             {
                 EntityLivingBase ent = e.getEntityLiving();
-                ScriptVars.setEntityVars(qd, ent);
+                ScriptVars.setEntityVars(sc, ent);
                 EntityPlayer p = Utils.getDamager(e.getSource());
                 if(p != null)
                 {
-                    qd.setEventVar("player_involved", true);
-                    ScriptVars.setPlayerVars(qd, p);
+                    sc.setVar("player_involved", true);
+                    ScriptVars.setPlayerVars(sc, p);
                 }  
                 else
                 {
-                    qd.setEventVar("player_involved", false);
+                    sc.setVar("player_involved", false);
                 }
-                qd.setVar("cancel", e.isCanceled()); 
-            }, (qd) -> 
+                sc.setVar("cancel", e.isCanceled()); 
+            }, (sc) -> 
             {
-                e.setCanceled(qd.getBooleanVar("cancel")); 
+                simpleCancel(sc, e, "entity_death");
             });
             return;
         }
         EntityPlayer p = (EntityPlayer) e.getEntity();    
-        handleEvent(p, "player_death", (qd) -> 
+        handleEvent(p, "player_death", (sc) -> 
         {
-            qd.setEventVar("clear", false);
+            sc.setVar("clear", false);
             EntityPlayer ent = Utils.getDamager(e.getSource());
             if(ent != null)
             {
-                ScriptVars.setSecPlayer(qd, ent);
+                ScriptVars.setSecPlayer(sc, ent);
             }
-            qd.setVar("cancel", e.isCanceled()); 
-        }, (qd) -> 
+            sc.setVar("cancel", e.isCanceled()); 
+        }, (sc) -> 
         {
-            if(qd.getBooleanVar("clear"))
+            try
             {
-                p.inventory.clear();
-            } 
-            e.setCanceled(qd.getBooleanVar("cancel")); 
+                if(sc.getVar("clear").getBoolean(sc))
+                {
+                    p.inventory.clear();
+                }
+                e.setCanceled(sc.getVar("cancel").getBoolean(sc)); 
+            }
+            catch(Exception ex)
+            {
+                KajetansMod.scripts.logger.print("invalid var in 'player_death' event", ex, null, sc.getName(), sc, sc.getActiveRealLine());
+            }
         });
     } 
        
@@ -326,24 +311,24 @@ public class ScriptEvents extends ModuleListener
         {
             return;
         }
-        handleEvent(p, "entity_hurt", (qd) -> 
+        handleEvent(p, "entity_hurt", (sc) -> 
         {
-            qd.setEventVar("entity_killed", e.getEntityLiving().getHealth() <= e.getAmount());        
-            ScriptVars.setEntityVars(qd, e.getEntity()); 
-            qd.setEventVar("entity_damage", Fraction.fromDouble(e.getAmount()));   
-            qd.setEventVar("entity_damage_cause", e.getSource().getDamageType());
-            qd.setVar("cancel", e.isCanceled());   
-        }, (qd) -> 
+            sc.setVar("entity_killed", e.getEntityLiving().getHealth() <= e.getAmount());        
+            ScriptVars.setEntityVars(sc, e.getEntity()); 
+            sc.setVar("entity_damage", Fraction.fromDouble(e.getAmount()));   
+            sc.setVar("entity_damage_cause", e.getSource().getDamageType());
+            sc.setVar("cancel", e.isCanceled());   
+        }, (sc) -> 
         {
             try
             {
-                e.setAmount(ScriptUtils.getFloat(qd.getVar("entity_damage")));
+                e.setAmount(sc.getVar("entity_damage").getFraction(sc).floatValue());
+                e.setCanceled(sc.getVar("cancel").getBoolean(sc)); 
             }
             catch(Exception ex)
             {
-                KajetansMod.scripts.logger.printException(ex, "entity_hurt", qd, qd.getActiveRealCodeLine());
+                KajetansMod.scripts.logger.print("invalid var in 'entity_hurt' event", ex, null, sc.getName(), sc, sc.getActiveRealLine());
             }
-            e.setCanceled(qd.getBooleanVar("cancel"));
         });
     }
     
@@ -352,24 +337,24 @@ public class ScriptEvents extends ModuleListener
     {             
         try
         {
-            handleEvent(null, "entity_drop", (qd) -> 
+            handleEvent(null, "entity_drop", (sc) -> 
             {
-                qd.setEventVar("drops", e.getDrops());
-                ScriptVars.setEntityVars(qd, e.getEntityLiving());
+                sc.setVar("drops", e.getDrops());
+                ScriptVars.setEntityVars(sc, e.getEntityLiving());
                 EntityPlayer p = Utils.getDamager(e.getSource());
                 if(p != null)
                 {
-                    qd.setEventVar("player_involved", true);
-                    ScriptVars.setPlayerVars(qd, p);
+                    sc.setVar("player_involved", true);
+                    ScriptVars.setPlayerVars(sc, p);
                 }  
                 else
                 {
-                    qd.setEventVar("player_involved", false);
+                    sc.setVar("player_involved", false);
                 }
-                qd.setVar("cancel", e.isCanceled()); 
-            }, (qd) -> 
+                sc.setVar("cancel", e.isCanceled()); 
+            }, (sc) -> 
             {
-                e.setCanceled(qd.getBooleanVar("cancel"));
+                simpleCancel(sc, e, "entity_drop");
             });
         }
         catch(NullPointerException ex)
@@ -381,12 +366,12 @@ public class ScriptEvents extends ModuleListener
     @SubscribeEvent
     public void onPlayerDrop(PlayerDropsEvent e)
     {             
-        handleEvent(e.getEntityPlayer(), "player_drop", (qd) -> 
+        handleEvent(e.getEntityPlayer(), "player_drop", (sc) -> 
         {
-            qd.setVar("cancel", e.isCanceled()); 
-        }, (qd) -> 
+            sc.setVar("cancel", e.isCanceled()); 
+        }, (sc) -> 
         {
-            e.setCanceled(qd.getBooleanVar("cancel"));
+            simpleCancel(sc, e, "player_drop");
         });
     } 
     
@@ -396,29 +381,29 @@ public class ScriptEvents extends ModuleListener
         EntityPlayer p = Utils.getPlayerFromProjectile(e.getEntityThrowable());
         if(p != null)
         {
-            handleEvent(p, "throw_hit", (qd) -> 
+            handleEvent(p, "throw_hit", (sc) -> 
             {
                 if(e.getRayTraceResult().entityHit != null)
                 {
-                    qd.setEventVar("is_entity_hit", true);
-                    qd.setEventVar("entity_hit", e.getRayTraceResult().entityHit);
+                    sc.setVar("is_entity_hit", true);
+                    sc.setVar("entity_hit", e.getRayTraceResult().entityHit);
                 }
                 else
                 {
-                    qd.setEventVar("is_entity_hit", false);
+                    sc.setVar("is_entity_hit", false);
                 }
-                ScriptVars.setEntityVars(qd, e.getEntityThrowable());
+                ScriptVars.setEntityVars(sc, e.getEntityThrowable());
             });
         }           
     }
     
     public void onEntityItemProjectileHit(EntityItemProjectile ent, EntityPlayer p, ItemStack stack, List<Entity> ents)
     {        
-        handleEvent(p, "item_hit", (qd) -> 
+        handleEvent(p, "item_hit", (sc) -> 
         {
-            ScriptVars.setEntityVars(qd, ent);
-            ScriptVars.setItemVars(qd, stack);
-            qd.setEventVar("entities", ents);
+            ScriptVars.setEntityVars(sc, ent);
+            ScriptVars.setItemVars(sc, stack);
+            sc.setVar("entities", ents);
         });      
     }
     
@@ -435,29 +420,36 @@ public class ScriptEvents extends ModuleListener
             return;
         }
         EntitySheep sheep = (EntitySheep) e.getTarget();
-        handleEvent(p, "entity_shear", (qd) -> 
+        handleEvent(p, "entity_shear", (sc) -> 
         {
-            ScriptVars.setEntityVars(qd, sheep);
-            qd.setEventVar("entity_sheared", sheep.getSheared());
-            qd.setEventVar("entity_color", sheep.getFleeceColor().toString());
-            qd.setVar("cancel", e.isCanceled()); 
-        }, (qd) -> 
+            ScriptVars.setEntityVars(sc, sheep);
+            sc.setVar("entity_sheared", sheep.getSheared());
+            sc.setVar("entity_color", sheep.getFleeceColor().toString());
+            sc.setVar("cancel", e.isCanceled()); 
+        }, (sc) -> 
         {
-            e.setCanceled(qd.getBooleanVar("cancel")); 
-            sheep.setSheared(qd.getBooleanVar("entity_sheared"));
+            try
+            {
+                sheep.setSheared(sc.getVar("entity_sheared").getBoolean(sc));
+                e.setCanceled(sc.getVar("cancel").getBoolean(sc)); 
+            }
+            catch(Exception ex)
+            {
+                KajetansMod.scripts.logger.print("invalid var in 'entity_shear' event", ex, null, sc.getName(), sc, sc.getActiveRealLine());
+            }
         });
     }
        
     @SubscribeEvent
     public void onBlockBreak(BlockEvent.BreakEvent e)
     {        
-        handleEvent(e.getPlayer(), "block_break", (qd) -> 
+        handleEvent(e.getPlayer(), "block_break", (sc) -> 
         {
-            ScriptVars.setBlockVars(qd, e.getWorld(), e.getPos());
-            qd.setVar("cancel", e.isCanceled()); 
-        }, (qd) -> 
+            ScriptVars.setBlockVars(sc, e.getWorld(), e.getPos());
+            sc.setVar("cancel", e.isCanceled()); 
+        }, (sc) -> 
         {
-            e.setCanceled(qd.getBooleanVar("cancel")); 
+            simpleCancel(sc, e, "block_break");
         });
     }
     
@@ -469,12 +461,12 @@ public class ScriptEvents extends ModuleListener
         {
             return;
         }
-        handleEvent(p, "player_login", (qd) -> 
+        handleEvent(p, "player_login", (sc) -> 
         {       
-            qd.setEventVar("first_join", Utils.hasPlayedBefore(p));
+            sc.setVar("first_join", Utils.hasPlayedBefore(p));
             PlayerList list = KajetansMod.server.getPlayerList();
-            qd.setEventVar("is_banned", list.getBannedPlayers().isBanned(p.getGameProfile()));
-            qd.setEventVar("is_whitelisted", list.getWhitelistedPlayers().isWhitelisted(p.getGameProfile()));
+            sc.setVar("is_banned", list.getBannedPlayers().isBanned(p.getGameProfile()));
+            sc.setVar("is_whitelisted", list.getWhitelistedPlayers().isWhitelisted(p.getGameProfile()));
         });
     }
     
@@ -482,15 +474,22 @@ public class ScriptEvents extends ModuleListener
     public void onPlayerJoin(PlayerJoinMessageEvent e)
     {    
         EntityPlayer p = e.getEntityPlayer();
-        handleEvent(p, "player_join_server", (qd) -> 
+        handleEvent(p, "player_join_server", (sc) -> 
         {       
-            qd.setEventVar("message", e.getMessage());
-            qd.setEventVar("changed_name", e.hasNameChanged());
-            qd.setVar("cancel", e.isCanceled()); 
-        }, (qd) -> 
+            sc.setVar("message", e.getMessage());
+            sc.setVar("changed_name", e.hasNameChanged());
+            sc.setVar("cancel", e.isCanceled()); 
+        }, (sc) -> 
         {
-            e.setMessage(String.valueOf(qd.getVar("message"))); 
-            e.setCanceled(qd.getBooleanVar("cancel")); 
+            try
+            {
+                e.setMessage(sc.getVar("message").getString(sc)); 
+                e.setCanceled(sc.getVar("cancel").getBoolean(sc)); 
+            }
+            catch(Exception ex)
+            {
+                KajetansMod.scripts.logger.print("invalid var in 'player_join_server' event", ex, null, sc.getName(), sc, sc.getActiveRealLine());
+            }
         });
     }
     
@@ -498,21 +497,28 @@ public class ScriptEvents extends ModuleListener
     public void onPlayerLeave(PlayerLeaveMessageEvent e)
     {      
         EntityPlayer p = e.getEntityPlayer();
-        handleEvent(p, "player_leave", (qd) -> 
+        handleEvent(p, "player_leave", (sc) -> 
         {       
-            qd.setEventVar("message", e.getMessage());
-            qd.setVar("cancel", e.isCanceled()); 
-        }, (qd) -> 
+            sc.setVar("message", e.getMessage());
+            sc.setVar("cancel", e.isCanceled()); 
+        }, (sc) -> 
         {
-            e.setMessage(String.valueOf(qd.getVar("message"))); 
-            e.setCanceled(qd.getBooleanVar("cancel")); 
+            try
+            {
+                e.setMessage(sc.getVar("message").getString(sc)); 
+                e.setCanceled(sc.getVar("cancel").getBoolean(sc)); 
+            }
+            catch(Exception ex)
+            {
+                KajetansMod.scripts.logger.print("invalid var in 'player_leave' event", ex, null, sc.getName(), sc, sc.getActiveRealLine());
+            }
         });
     }
     
     @SubscribeEvent
     public void onBucketFill(FillBucketEvent e)
     {      
-        handleEvent(e.getEntityPlayer(), "bucket_fill", (qd) -> 
+        handleEvent(e.getEntityPlayer(), "bucket_fill", (sc) -> 
         {
             RayTraceResult ray = e.getTarget();
             if(ray != null)
@@ -520,36 +526,36 @@ public class ScriptEvents extends ModuleListener
                 BlockPos pos = ray.getBlockPos();
                 if(pos != null)
                 {
-                    qd.setEventVar("has_block", true); 
-                    ScriptVars.setBlockVars(qd, e.getWorld(), pos);
+                    sc.setVar("has_block", true); 
+                    ScriptVars.setBlockVars(sc, e.getWorld(), pos);
                 }
                 else
                 {
-                    qd.setEventVar("has_block", false); 
+                    sc.setVar("has_block", false); 
                 }
             }
             else
             {
-                qd.setEventVar("has_block", false); 
+                sc.setVar("has_block", false); 
             }
-            qd.setVar("cancel", e.isCanceled()); 
-        }, (qd) -> 
+            sc.setVar("cancel", e.isCanceled()); 
+        }, (sc) -> 
         {
-            e.setCanceled(qd.getBooleanVar("cancel")); 
+            simpleCancel(sc, e, "bucket_fill");
         });
     } 
        
     @SubscribeEvent
     public void onBlockPlace(BlockEvent.PlaceEvent e)
     {
-        handleEvent(e.getPlayer(), "block_place", (qd) -> 
+        handleEvent(e.getPlayer(), "block_place", (sc) -> 
         {
-            qd.setEventVar("block_type_after", e.getPlacedBlock().getBlock().getRegistryName());
-            ScriptVars.setBlockVars(qd, e.getWorld(), e.getPos());
-            qd.setVar("cancel", e.isCanceled()); 
-        }, (qd) -> 
+            sc.setVar("block_type_after", e.getPlacedBlock().getBlock().getRegistryName());
+            ScriptVars.setBlockVars(sc, e.getWorld(), e.getPos());
+            sc.setVar("cancel", e.isCanceled()); 
+        }, (sc) -> 
         {
-            e.setCanceled(qd.getBooleanVar("cancel")); 
+            simpleCancel(sc, e, "block_place");
         });
     }    
     
@@ -560,14 +566,14 @@ public class ScriptEvents extends ModuleListener
         {
             return;
         }
-        handleEvent(e.getEntityPlayer(), "block_click", (qd) -> 
+        handleEvent(e.getEntityPlayer(), "block_click", (sc) -> 
         {
-            qd.setEventVar("action", "right");
-            ScriptVars.setBlockVars(qd, e.getWorld(), e.getPos());
-            qd.setVar("cancel", e.isCanceled()); 
-        }, (qd) -> 
+            sc.setVar("action", "right");
+            ScriptVars.setBlockVars(sc, e.getWorld(), e.getPos());
+            sc.setVar("cancel", e.isCanceled()); 
+        }, (sc) -> 
         {
-            e.setCanceled(qd.getBooleanVar("cancel")); 
+            simpleCancel(sc, e, "block_click");
         });       
     }
     
@@ -578,14 +584,14 @@ public class ScriptEvents extends ModuleListener
         {
             return;
         }
-        handleEvent(e.getEntityPlayer(), "block_click", (qd) -> 
+        handleEvent(e.getEntityPlayer(), "block_click", (sc) -> 
         {
-            qd.setEventVar("action", "left");
-            ScriptVars.setBlockVars(qd, e.getWorld(), e.getPos());
-            qd.setVar("cancel", e.isCanceled()); 
-        }, (qd) -> 
+            sc.setVar("action", "left");
+            ScriptVars.setBlockVars(sc, e.getWorld(), e.getPos());
+            sc.setVar("cancel", e.isCanceled()); 
+        }, (sc) -> 
         {
-            e.setCanceled(qd.getBooleanVar("cancel")); 
+            simpleCancel(sc, e, "block_click");
         });       
     }
     
@@ -594,13 +600,13 @@ public class ScriptEvents extends ModuleListener
     {
         if(e.getHand() != EnumHand.OFF_HAND)
         {
-            handleEvent(e.getEntityPlayer(), "entity_click", (qd) -> 
+            handleEvent(e.getEntityPlayer(), "entity_click", (sc) -> 
             {
-                ScriptVars.setEntityVars(qd, e.getTarget());
-                qd.setVar("cancel", e.isCanceled()); 
-            }, (qd) -> 
+                ScriptVars.setEntityVars(sc, e.getTarget());
+                sc.setVar("cancel", e.isCanceled()); 
+            }, (sc) -> 
             {
-                e.setCanceled(qd.getBooleanVar("cancel")); 
+                simpleCancel(sc, e, "entity_click");
             });
         }
     }
@@ -608,35 +614,35 @@ public class ScriptEvents extends ModuleListener
     @SubscribeEvent
     public void onFishing(ItemFishedEvent e)
     {
-        handleEvent(e.getEntityPlayer(), "fishing", (qd) -> 
+        handleEvent(e.getEntityPlayer(), "fishing", (sc) -> 
         {
-            qd.setEventVar("drops", e.getDrops());
-            qd.setVar("cancel", e.isCanceled()); 
-        }, (qd) -> 
+            sc.setVar("drops", e.getDrops());
+            sc.setVar("cancel", e.isCanceled()); 
+        }, (sc) -> 
         {
-            e.setCanceled(qd.getBooleanVar("cancel")); 
+            simpleCancel(sc, e, "fishing");
         });
     }
     
     @SubscribeEvent
     public void onItemClick(PlayerInteractEvent.RightClickItem e)
     {        
-        handleEvent(e.getEntityPlayer(), "item_air_click", (qd) -> 
+        handleEvent(e.getEntityPlayer(), "item_air_click", (sc) -> 
         {
-            ScriptVars.setItemVars(qd, e.getItemStack());
-            qd.setEventVar("hand", e.getHand().toString());
-            qd.setVar("cancel", e.isCanceled());  
-        }, (qd) -> 
+            ScriptVars.setItemVars(sc, e.getItemStack());
+            sc.setVar("hand", e.getHand().toString());
+            sc.setVar("cancel", e.isCanceled());  
+        }, (sc) -> 
         {
-            e.setCanceled(qd.getBooleanVar("cancel"));
+            simpleCancel(sc, e, "item_air_click");
         });
     }
     
     public void onArmSwing(EntityPlayer p, EnumHand hand)
     {        
-        handleEvent(p, "arm_swing", (qd) -> 
+        handleEvent(p, "arm_swing", (sc) -> 
         {
-            qd.setEventVar("hand", hand);
+            sc.setVar("hand", hand);
         });
     }
     
@@ -647,20 +653,20 @@ public class ScriptEvents extends ModuleListener
         {
             return;
         }
-        handleEvent((EntityPlayer) e.getEntityLiving(), "item_use_start", (qd) -> 
+        handleEvent((EntityPlayer) e.getEntityLiving(), "item_use_start", (sc) -> 
         {
-            qd.setEventVar("duration", new Fraction(e.getDuration()));
-            qd.setVar("cancel", e.isCanceled());  
-        }, (qd) -> 
+            sc.setVar("duration", new Fraction(e.getDuration()));
+            sc.setVar("cancel", e.isCanceled());  
+        }, (sc) -> 
         {
-            e.setCanceled(qd.getBooleanVar("cancel"));
             try
             {
-                e.setDuration(ScriptUtils.getInt(qd.getVar("duration")));
+                e.setDuration(sc.getVar("duration").getInt(sc));
+                e.setCanceled(sc.getVar("cancel").getBoolean(sc)); 
             }
             catch(Exception ex)
             {
-                KajetansMod.scripts.logger.printException(ex, "item_use_start", qd, qd.getActiveRealCodeLine());
+                KajetansMod.scripts.logger.print("invalid var in 'item_use_start' event", ex, null, sc.getName(), sc, sc.getActiveRealLine());
             }
         });
     }
@@ -672,45 +678,45 @@ public class ScriptEvents extends ModuleListener
         {
             return;
         }
-        handleEvent((EntityPlayer) e.getEntityLiving(), "item_use_finish", (qd) -> 
+        handleEvent((EntityPlayer) e.getEntityLiving(), "item_use_finish", (sc) -> 
         {
-            qd.setEventVar("result_stack", e.getResultStack());  
+            sc.setVar("result_stack", e.getResultStack());  
         });
     }
     
     @SubscribeEvent
     public void onCrafting(PlayerEvent.ItemCraftedEvent e)
     {  
-        handleEvent(e.player, "craft", (qd) -> 
+        handleEvent(e.player, "craft", (sc) -> 
         {
-            ScriptVars.setItemVars(qd, e.crafting);
+            ScriptVars.setItemVars(sc, e.crafting);
         });   
     } 
     
     @SubscribeEvent
     public void onItemDrop(ItemTossEvent e)
     {
-        handleEvent(e.getPlayer(), "player_toss", (qd) -> 
+        handleEvent(e.getPlayer(), "player_toss", (sc) -> 
         {
-            ScriptVars.setItemVars(qd, e.getEntityItem().getItem());   
-            qd.setVar("cancel", e.isCanceled()); 
-        }, (qd) -> 
+            ScriptVars.setItemVars(sc, e.getEntityItem().getItem());   
+            sc.setVar("cancel", e.isCanceled()); 
+        }, (sc) -> 
         {
-            e.setCanceled(qd.getBooleanVar("cancel")); 
+            simpleCancel(sc, e, "player_toss");
         });
     }
     
     @SubscribeEvent
     public void onItemPickup(EntityItemPickupEvent e)
     {
-        handleEvent(e.getEntityPlayer(), "player_pickup", (qd) -> 
+        handleEvent(e.getEntityPlayer(), "player_pickup", (sc) -> 
         {
-            ScriptVars.setEntityVars(qd, e.getItem()); 
-            ScriptVars.setItemVars(qd, e.getItem().getItem());  
-            qd.setVar("cancel", e.isCanceled()); 
-        }, (qd) -> 
+            ScriptVars.setEntityVars(sc, e.getItem()); 
+            ScriptVars.setItemVars(sc, e.getItem().getItem());  
+            sc.setVar("cancel", e.isCanceled()); 
+        }, (sc) -> 
         {
-            e.setCanceled(qd.getBooleanVar("cancel")); 
+            simpleCancel(sc, e, "player_pickup");
         });
     }
     
@@ -722,24 +728,24 @@ public class ScriptEvents extends ModuleListener
             return;
         }
         EntityPlayer p = (EntityPlayer) e.getEntityMounting();
-        handleEvent(p, "entity_mount", (qd) -> 
+        handleEvent(p, "entity_mount", (sc) -> 
         {
-            qd.setEventVar("mounting", e.isMounting()); 
-            ScriptVars.setEntityVars(qd, e.getEntityBeingMounted()); 
-            qd.setVar("cancel", e.isCanceled()); 
-        }, (qd) -> 
+            sc.setVar("mounting", e.isMounting()); 
+            ScriptVars.setEntityVars(sc, e.getEntityBeingMounted()); 
+            sc.setVar("cancel", e.isCanceled()); 
+        }, (sc) -> 
         {
-            e.setCanceled(qd.getBooleanVar("cancel")); 
+            simpleCancel(sc, e, "entity_mount");
         });
     }
     
     @SubscribeEvent
     public void onPlayerUsePortal(PlayerEvent.PlayerChangedDimensionEvent e)
     {
-        handleEvent(e.player, "portal", (qd) -> 
+        handleEvent(e.player, "portal", (sc) -> 
         {
-            qd.setEventVar("from", ModDimensions.getWorldName(e.fromDim));
-            qd.setEventVar("to", ModDimensions.getWorldName(e.toDim));
+            sc.setVar("from", ModDimensions.getWorldName(e.fromDim));
+            sc.setVar("to", ModDimensions.getWorldName(e.toDim));
         });
     }
     
@@ -748,119 +754,61 @@ public class ScriptEvents extends ModuleListener
     {
         if(e.getSender() instanceof EntityPlayer)
         {
-            handleEvent((EntityPlayer) e.getSender(), "command", (qd) -> 
+            handleEvent((EntityPlayer) e.getSender(), "command", (sc) -> 
             {
-                qd.setEventVar("command", e.getCommand().getName()); 
-                qd.setEventVar("args", Arrays.stream(e.getParameters()).map(s -> Code.convertInput(null, s, false)).collect(Collectors.toList()));
-                qd.setVar("cancel", e.isCanceled()); 
-            }, (qd) -> 
+                sc.setVar("command", e.getCommand().getName()); 
+                sc.setVar("args", Arrays.stream(e.getParameters()).map(s -> Compiler.convert(s)).collect(Collectors.toList()));
+                sc.setVar("cancel", e.isCanceled()); 
+            }, (sc) -> 
             {
-                e.setCanceled(qd.getBooleanVar("cancel")); 
+                simpleCancel(sc, e, "command");
             });
         }
     }
     
     public void onCustomCommand(EntityPlayer p, String command, String args)
     {
-        handleEvent(p, "custom_command", (qd) -> 
+        handleEvent(p, "custom_command", (sc) -> 
         {
-            qd.setEventVar("command", command);
+            sc.setVar("command", command);
             if(args.length() == 0)
             {
-                qd.setEventVar("args", new ArrayList<>());
+                sc.setVar("args", new ArrayList<>());
                 return;
             }
-            qd.setEventVar("args", Arrays.stream(args.trim().split(" ")).map(s -> Code.convertInput(null, s, false)).collect(Collectors.toList()));
+            sc.setVar("args", Arrays.stream(args.trim().split(" ")).map(s -> Compiler.convert(s)).collect(Collectors.toList()));
         });
     }
       
     public void onEffectUse(PlayerUsesEffectEvent e)
     {    
-        handleEvent(e.getPlayer(), "player_use_effect", (qd) -> 
+        handleEvent(e.getPlayer(), "player_use_effect", (sc) -> 
         {       
-            qd.setEventVar("power", new Fraction(e.getPower()));
-            qd.setEventVar("mana_cost", new Fraction(e.getMana()));
-            qd.setEventVar("cause", e.getCause().toString());
-            qd.setEventVar("effect", e.getEffect());
-            qd.setVar("cancel", e.isCanceled());
-        }, (qd) -> 
+            sc.setVar("power", new Fraction(e.getPower()));
+            sc.setVar("mana_cost", new Fraction(e.getMana()));
+            sc.setVar("cause", e.getCause().toString());
+            sc.setVar("effect", e.getEffect());
+            sc.setVar("cancel", e.isCanceled());
+        }, (sc) -> 
         {
             try
             {
-                int power = ScriptUtils.getInt(qd.getVar("power"));
-                if(power < 1 || power > 20)
-                {
-                    throw new IllegalArgumentException();
-                }
-                e.setPower(power);
+                e.setPower(Math.min(20, Math.max(1, sc.getVar("power").getInt(sc))));
+                e.setMana(Math.max(0, sc.getVar("mana_cost").getInt(sc)));
+                e.setCanceled(sc.getVar("cancel").getBoolean(sc)); 
             }
             catch(Exception ex)
             {
-                KajetansMod.scripts.logger.printException(ex, "player_use_effect", qd, qd.getActiveRealCodeLine());
-            }
-            try
-            {
-                int mana = ScriptUtils.getInt(qd.getVar("mana_cost"));
-                if(mana < 0)
-                {
-                    throw new IllegalArgumentException();
-                }
-                e.setMana(mana);
-            }
-            catch(Exception ex)
-            {  
-                KajetansMod.scripts.logger.printException(ex, "player_use_effect", qd, qd.getActiveRealCodeLine());
+                KajetansMod.scripts.logger.print("invalid var in 'player_use_effect' event", ex, null, sc.getName(), sc, sc.getActiveRealLine());
             }
-            e.setCanceled(qd.getBooleanVar("cancel")); 
         });
     }
     
     public void onFunctionKey(EntityPlayerMP p, int key)
     {        
-        handleEvent(p, "function_key", (qd) -> 
+        handleEvent(p, "function_key", (sc) -> 
         {
-            qd.setEventVar("key", new Fraction(key));
+            sc.setVar("key", new Fraction(key));
         });      
     }
-    
-    /*@SubscribeEvent
-    public void QuestVillagerPickUpItem(ItemTossEvent e)
-    {             
-        EntityPlayer p = e.getPlayer();  
-        PlayerScript qd = KajetansMod.scripts.getScript(p);
-        if(qd == null || !qd.isLoadedEvent("villager_give"))
-        {
-            return;
-        }
-        final EntityItem itemEnt = e.getEntityItem();
-        KajetansMod.scheduler.scheduleTask(() -> 
-        {
-            if(itemEnt.isDead)
-            {
-                return;
-            }
-            EntityVillager v = Utils.getNearestEntity(p.world, itemEnt.getPositionVector(), 2, EntityVillager.class);
-            if(v == null)
-            {
-                return;
-            }
-            Script data = KajetansMod.scripts.getScript(p);
-            if(data == null || !data.isLoadedEvent("villager_give"))
-            {
-                return;
-            }
-            data.setVar("event", "villager_give");
-            ScriptVars.setPlayerVars(data, p); 
-            ScriptVars.setItemVars(data, itemEnt.getItem());
-            data.setEventVar("villager_loc", new Location(v));                    
-            data.setEventVar("villager_prof", v.getProfessionForge().getRegistryName());
-            data.setVar("cancel", e.isCanceled()); 
-            data.runCode();
-            if(data.getBooleanVar("cancel"))
-            {
-                return;
-            }                  
-            itemEnt.setDead();                
-        }, 40);                    
-    }*/
 }

+ 0 - 131
src/main/java/me/km/snuviscript/ScriptHelper.java

@@ -1,131 +0,0 @@
-package me.km.snuviscript;
-
-import me.km.exception.IllegalItemStackStringException;
-import me.hammerle.code.ScriptUtils;
-import me.km.utils.ItemStackUtils;
-import net.minecraft.block.Block;
-import net.minecraft.item.Item;
-import net.minecraft.item.ItemStack;
-
-public class ScriptHelper 
-{       
-    public static Item getItem(String stack) throws IllegalItemStackStringException
-    {
-        Item item = Item.getByNameOrId(stack);
-        if(item == null)
-        {
-            Block b = Block.getBlockFromName(stack);
-            if(b == null)
-            {
-                throw new IllegalItemStackStringException(stack);
-            }
-            return Item.getItemFromBlock(b);
-        }
-        return item;
-    }
-    
-    /** Gibt einen ItemStack zurück
-    * @param stack ein ItemStack-String im Format "Material", "Material:DV" oder "Material:DV:Amount"
-    * @throws IllegalItemStackStringException wenn das Format nicht erfüllt ist
-    * @return den ItemStack
-    */
-    private static ItemStack getSimpleItemStack(String stack) throws IllegalItemStackStringException
-    {
-        String[] parts = stack.split(":");
-        if(parts[0].equals("km") || parts[0].equals("minecraft"))
-        {
-            if(parts.length <= 1)
-            {
-                throw new IllegalItemStackStringException(stack);
-            }
-            String[] newParts = new String[parts.length - 1];
-            newParts[0] = parts[0].toLowerCase() + ":" + parts[1].toLowerCase();
-            for(int i = 1; i < newParts.length; i++)
-            {
-                newParts[i] = parts[i + 1].toLowerCase();
-            }
-            parts = newParts;
-        }
-        else
-        {
-            parts[0] = "minecraft:" + parts[0].toLowerCase();
-        }
-        int amount = 1;
-        int data = 0;
-        if(parts.length >= 2)
-        {
-            try
-            {   
-                data = Integer.parseInt(parts[1]);
-                if(data < 0)
-                {
-                    throw new IllegalItemStackStringException(stack);
-                }
-            }
-            catch(NumberFormatException ex)
-            {
-                throw new IllegalItemStackStringException(stack);
-            }
-            if(parts.length >= 3)
-            {
-                try
-                {   
-                    amount = Integer.parseInt(parts[2]);
-                    if(amount < 1)
-                    {
-                        throw new IllegalItemStackStringException(stack);
-                    }
-                }
-                catch(NumberFormatException ex)
-                {
-                    throw new IllegalItemStackStringException(stack);
-                }
-            }
-        }
-        return new ItemStack(getItem(parts[0]), amount, data);
-    }
-    
-    /** Gibt einen ItemStack zurück
-    * @param args ein Array der mindestens einen gültigen ItemStack-String enthalten muss.
-    * Weiters kann auch ein Name und eine Lore mitgegeben werden, andernfalls muss der
-    * Array vorher an seiner Grenze sein oder null verwendet werden.
-    * @param start die Stelle, an der der ItemStack beginnt
-    * @throws IllegalItemStackStringException wenn das Format des ItemStack-Strings nicht erfüllt ist
-    * @return den ItemStack
-    */
-    public static ItemStack getItemStack(Object[] args, int start) throws IllegalItemStackStringException
-    {
-        if(args[start].toString().startsWith("{"))
-        {
-            return ItemStackUtils.getStackFromNbtString(ScriptUtils.connect(args, " ", start).replace('\'', '"'));
-        }
-        ItemStack stack = getSimpleItemStack(args[start].toString());
-        if(args.length >= start + 2)
-        {
-            if(!(args[start + 1] == null))
-            {
-                stack.setStackDisplayName(args[start + 1].toString());
-            }
-        }
-        if(args.length >= start + 3)
-        {
-            if(!(args[start + 2] == null))
-            { 
-                for(int i = start + 2; i < args.length; i++)
-                {
-                    ItemStackUtils.addLore(stack, args[i].toString());
-                }
-            } 
-        }
-        return stack;
-    }
-    
-    /** Gibt einen ItemStack-String zurück
-    * @param stack ein ItemStack
-    * @return den ItemStack-String im Format "Material:DV:Amount"
-    */
-    public static String getItemStackString(ItemStack stack)
-    {
-        return ItemStackUtils.getNbtString(stack);
-    }   
-}

+ 6 - 5
src/main/java/me/km/snuviscript/ScriptInventoryHolder.java

@@ -1,5 +1,6 @@
 package me.km.snuviscript;
 
+import me.hammerle.snuviscript.code.Script;
 import me.km.KajetansMod;
 import me.km.inventory.CustomContainer;
 import net.minecraft.entity.player.EntityPlayer;
@@ -8,26 +9,26 @@ import net.minecraft.inventory.ClickType;
 
 public class ScriptInventoryHolder extends CustomContainer
 {
-    private final MinecraftScript qd;
+    private final Script sc;
     private final ScriptEvents e;
 
-    public ScriptInventoryHolder(SnuviInventory inv, EntityPlayerMP p, MinecraftScript qd) 
+    public ScriptInventoryHolder(SnuviInventory inv, EntityPlayerMP p, Script qd) 
     {
         super(inv, p);
-        this.qd = qd;
+        this.sc = qd;
         this.e = KajetansMod.scripts.getEvent(ScriptEvents.class);
     }
 
     @Override
     public boolean onButtonClick(int slot, int dragType, ClickType click, EntityPlayerMP p)
     {
-        return e.onInventoryClick(qd, (SnuviInventory) inv, slot, click, p);
+        return e.onInventoryClick(sc, (SnuviInventory) inv, slot, click, p);
     }
 
     @Override
     public void onContainerClosed(EntityPlayer p) 
     {
-        e.onInventoryClose(qd, (SnuviInventory) inv, p);
+        e.onInventoryClose(sc, (SnuviInventory) inv, p);
         super.onContainerClosed(p);
     }
 }

+ 102 - 102
src/main/java/me/km/snuviscript/ScriptModule.java

@@ -1,32 +1,39 @@
 package me.km.snuviscript;
 
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
 import me.km.KajetansMod;
 import me.km.api.Module;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.List;
 import java.util.UUID;
-import me.hammerle.code.SnuviParser;
-import me.hammerle.code.ScriptUtils;
-import me.hammerle.exceptions.PreScriptException;
-import net.minecraft.command.ICommandSender;
+import me.hammerle.snuviscript.code.Script;
+import me.hammerle.snuviscript.code.SnuviParser;
 import net.minecraft.entity.player.EntityPlayer;
 import net.minecraft.util.text.TextFormatting;
 
 public class ScriptModule extends Module
 {
     private final SnuviParser parser;
-    protected final MinecraftFunctions logger;
+    protected final SnuviLogger logger;
     private final HashMap<UUID, Integer> playerScript;   
+    private final HashMap<Integer, List<EntityPlayer>> registeredPlayers; 
     private final HashSet<String> scriptCommands;
     
     public ScriptModule(String mname, String prefix, TextFormatting color) 
     {
         super(mname, prefix, color);
-        logger = new MinecraftFunctions();
+        
+        logger = new SnuviLogger();
         parser = new SnuviParser(logger, KajetansMod.scheduler);
+        
         MinecraftFunctions.registerFunctions(parser);
         
         playerScript = new HashMap<>();
+        registeredPlayers = new HashMap<>();
         scriptCommands = new HashSet<>();
     }
     
@@ -60,139 +67,132 @@ public class ScriptModule extends Module
     }
     
     // -------------------------------------------------------------------------
-    // Quest - Control
+    // player script
     // -------------------------------------------------------------------------
 
-    private void addPlayerToScript(EntityPlayer p, EntityPlayer p2, PlayerScript qd)
-    {             
-        if(hasScript(p))
-        {
-            this.send(p, "Du hast bereits eine Quest.");
-            return;
-        }       
-        if(qd == null)
-        {
-            if(p2 != null)
-            {
-                this.send(p, p2.getName() + " hat keine aktive Quest.");
-            }
-            return;
-        }
-        if(qd.getBooleanVar("no_join"))
-        {
-            this.send(p, "Du darfst dieser Quest nicht beitreten.");
-            return;
-        }
-        playerScript.put(p.getUniqueID(), qd.getId());
-        qd.addPlayer(p);
-        if(!qd.getBooleanVar("no_quest_msg"))
+    public List<EntityPlayer> getPlayerList(int id)
+    {
+        return registeredPlayers.getOrDefault(id, Collections.EMPTY_LIST);
+    }
+    
+    private List<EntityPlayer> getOrCreatePlayerList(int id)
+    {
+        List<EntityPlayer> list = registeredPlayers.get(id);
+        if(list == null)
         {
-            MinecraftFunctions.sendMessageWithSuffix(qd, p.getName() + " ist deiner Quest beigetreten.");
-            if(p2 != null)
-            {
-                this.send(p, "Du bist nun in der Quest von " + p2.getName() + ".");
-            }
-            else
-            {
-                this.send(p, "Du bist einer bereits laufenden Quest beigetreten.");
-            }
+            list = new ArrayList<>();
+            registeredPlayers.put(id, list);
         }
-        qd.setVar("event", "player_join");
-        ScriptVars.setPlayerVars(qd, p); 
-        qd.runCode();
-    } 
-    
-    public void addPlayerToPlayer(EntityPlayer p, EntityPlayer p2)
-    {             
-        addPlayerToScript(p, p2, getScript(p2)); 
-    } 
+        return list;
+    }
     
-    public void addPlayerToQuest(EntityPlayer p, PlayerScript qd)
+    public boolean registerPlayer(Script sc, EntityPlayer p)
     {             
-        addPlayerToScript(p, null, qd);  
+        if(playerScript.putIfAbsent(p.getUniqueID(), sc.getId()) != null)
+        {
+            return false;
+        }       
+        getOrCreatePlayerList(sc.getId()).add(p);
+        parser.callEvent("player_join", sc, null, null);
+        return true;
     } 
-    
-    public boolean hasScript(EntityPlayer p)
+        
+    public boolean isRegistered(EntityPlayer p)
     {
         return playerScript.containsKey(p.getUniqueID());
     }
     
-    public PlayerScript getScript(EntityPlayer p)
+    public Script getScript(String name)
     {
+        Collection<Script> scripts = parser.getScripts();
+        for(Script sc : scripts)
+        {
+            if(sc.getName().equals(name))
+            {
+                return sc;
+            }
+        }
+        return null;
+    }
+    
+    public Script getScript(EntityPlayer p)
+    {
+        // check if the player is mapped to a script
         Integer id = playerScript.get(p.getUniqueID());
         if(id == null)
         {
             return null;
         }
-        try
-        {
-            PlayerScript qd = (PlayerScript) parser.getScript(id);
-            if(qd == null)
-            {
-                playerScript.remove(p.getUniqueID());
-                MinecraftFunctions.sendWarningToAllDevs("Die ungültige Quest von '" + p.getName() + "' wurde entfernt.");
-                return null;
-            }
-            return qd;
-        }
-        catch(ClassCastException ex)
+        // player mapping does not necessary mean the script is valid
+        Script sc = parser.getScript(id);
+        if(sc == null)
         {
+            playerScript.remove(p.getUniqueID());
+            // TODO - print warning for devs
             return null;
         }
+        return sc;
     }
     
-    public void removePlayerFromScript(EntityPlayer p, PlayerScript qd)
+    public boolean unregisterPlayer(EntityPlayer p)
     {
-        if(qd == null)
+        Integer id = playerScript.remove(p.getUniqueID());
+        if(id == null)
         {
-            return;
+            return false;
         }
-        if(qd.isValid() && qd.removePlayer(p))
+        List<EntityPlayer> list = registeredPlayers.get(id);
+        if(list == null)
         {
-            parser.termSafe(qd);
-        }       
-        playerScript.remove(p.getUniqueID());
+            return false;
+        }
+        boolean b = list.remove(p);
+        if(list.isEmpty())
+        {
+            Script sc = parser.getScript(id);
+            if(sc == null)
+            {
+                // TODO - print warning for devs
+                return true;
+            }
+            parser.termSafe(sc);
+        }
+        return b;
     }
     
-    public boolean isActive(String name)
+    public void clearPlayerRegistry()
     {
-        return parser.getScripts().stream().anyMatch(sc -> sc.getName().equals(name));
+        playerScript.clear();
+        registeredPlayers.clear();
     }
 
-    // -----------------------
-    // Quests / Scripts loading and starting
-    // -----------------------
+    // -------------------------------------------------------------------------
+    // script starting
+    // -------------------------------------------------------------------------
     
-    public void startQuest(ICommandSender sender, String name, EntityPlayer p)
+    public boolean startPlayerScript(EntityPlayer p, String... names)
     {
-        if(hasScript(p))
+        if(isRegistered(p))
         {
-            this.send(sender, "Du hast bereits eine Quest.");
-            return;
-        }
-        PlayerScript other = (PlayerScript) parser.getScripts().stream()
-                .filter(qd -> qd.getClass() == PlayerScript.class)
-                .filter(qd -> qd.getVar("add_if_name") != null)
-                .filter(qd -> qd.getVar("add_if_name").equals(name))
-                .findAny().orElse(null);
-        if(other != null)
-        {            
-            addPlayerToQuest(p, other);
-            return;
+            return false;
         }
-        PlayerScript ps = parser.startScript(PlayerScript.class, name, ScriptUtils.readCode("scripts/" + name, ".txt"), false, p);
-        playerScript.put(p.getUniqueID(), ps.getId());
+        Arrays.setAll(names, i -> "scripts/" + names[i]);
+        parser.startScript(false, sc -> 
+        {
+            int id = sc.getId();
+            playerScript.put(p.getUniqueID(), id);
+            getOrCreatePlayerList(id).add(p);
+        }, sc -> 
+        {
+            getPlayerList(sc.getId()).forEach(pl -> playerScript.remove(pl.getUniqueID()));
+            registeredPlayers.remove(sc.getId());
+        }, ".txt", names);
+        return true;
     }
     
-    public void startScript(ICommandSender sender, String name)
+    public void startScript(String... names)
     {
-        try
-        {
-            parser.startScript(MinecraftScript.class, name, ScriptUtils.readCode("scripts/" + name, ".txt"), true);
-        }
-        catch(PreScriptException ex)
-        {
-            logger.printException(ex, null, name, ex.getLine());
-        }
+        Arrays.setAll(names, i -> "scripts/" + names[i]);
+        parser.startScript(true, ".txt", names);
     }
 }

+ 9 - 9
src/main/java/me/km/snuviscript/ScriptVars.java

@@ -1,7 +1,7 @@
 package me.km.snuviscript;
 
-import me.hammerle.code.Script;
-import me.hammerle.math.Fraction;
+import me.hammerle.snuviscript.code.Script;
+import me.hammerle.snuviscript.math.Fraction;
 import me.km.api.Location;
 import net.minecraft.block.state.IBlockState;
 import net.minecraft.entity.Entity;
@@ -16,9 +16,9 @@ public class ScriptVars
     public static void setBlockVars(Script qd, World w, BlockPos pos)
     {               
         IBlockState state = w.getBlockState(pos);
-        qd.setEventVar("block_loc", new Location(w, pos));
-        qd.setEventVar("block_type", state.getBlock().getRegistryName().toString());
-        qd.setEventVar("block_data", new Fraction(state.getBlock().getMetaFromState(state)));
+        qd.setVar("block_loc", new Location(w, pos));
+        qd.setVar("block_type", state.getBlock().getRegistryName().toString());
+        qd.setVar("block_data", new Fraction(state.getBlock().getMetaFromState(state)));
     }
     
     public static void setPlayerVars(Script qd, EntityPlayer p)
@@ -31,18 +31,18 @@ public class ScriptVars
     {
         if(p != null)
         {
-            qd.setEventVar("sec_player", p);
-            qd.setEventVar("sec_player_name", p.getName());
+            qd.setVar("sec_player", p);
+            qd.setVar("sec_player_name", p.getName());
         }
     }
 
     public static void setEntityVars(Script qd, Entity ent)
     {
-        qd.setEventVar("entity", ent);          
+        qd.setVar("entity", ent);          
     }
 
     public static void setItemVars(Script qd, ItemStack stack)
     {
-        qd.setEventVar("item", stack);
+        qd.setVar("item", stack);
     }   
 }

+ 50 - 0
src/main/java/me/km/snuviscript/SnuviLogger.java

@@ -0,0 +1,50 @@
+package me.km.snuviscript;
+
+import me.hammerle.snuviscript.code.ISnuviLogger;
+import me.hammerle.snuviscript.code.Script;
+import me.km.KajetansMod;
+import me.km.api.Module;
+
+public class SnuviLogger implements ISnuviLogger
+{
+    @Override
+    public void print(String message, Exception ex, String function, String scriptname, Script sc, int line) 
+    {
+        if(KajetansMod.debugMode || (sc != null && sc.isStackTracePrinted()))
+        {
+            Module m = KajetansMod.scripts;
+            if(scriptname != null)
+            {
+                m.sendWarningToConsole("error in '" + scriptname + "'");
+            }
+            if(message != null)
+            {
+                m.sendHelpListElementToConsole("message", message);
+            }
+            if(ex != null)
+            {
+                m.sendHelpListElementToConsole("exception", ex.getClass().getSimpleName());
+            }
+            if(function != null)
+            {
+                m.sendHelpListElementToConsole("function", function);
+            }
+            if(line != -1)
+            {
+                m.sendHelpListElementToConsole("Zeile", String.valueOf(line));
+            }
+        }
+        
+        // TODO after chat channels are made
+        /*sendToDevsWithSuffix("§cError in '" + s + "'");
+        if(line != -1)
+        {
+            sendToDevsWithHelpList("§cZeile:", String.valueOf(line));
+        }
+        sendToDevsWithHelpList("§cFehler:", ex.getClass().getSimpleName() + " - " + ex.getLocalizedMessage());
+        if(function != null)
+        {
+            sendToDevsWithHelpList("§cFunktion: ", function);
+        }*/
+    }
+}

+ 16 - 0
src/main/java/me/km/utils/ItemStackUtils.java

@@ -6,6 +6,7 @@ import me.km.exception.IllegalItemStackStringException;
 import net.minecraft.block.Block;
 import net.minecraft.entity.ai.attributes.AttributeModifier;
 import net.minecraft.inventory.EntityEquipmentSlot;
+import net.minecraft.item.Item;
 import net.minecraft.item.ItemStack;
 import net.minecraft.nbt.JsonToNBT;
 import net.minecraft.nbt.NBTException;
@@ -236,4 +237,19 @@ public class ItemStackUtils
     {
         Block.spawnAsEntity(w, pos, stack);
     }
+    
+    public static Item getItem(String stack) throws IllegalItemStackStringException
+    {
+        Item item = Item.getByNameOrId(stack);
+        if(item == null)
+        {
+            Block b = Block.getBlockFromName(stack);
+            if(b == null)
+            {
+                throw new IllegalItemStackStringException(stack);
+            }
+            return Item.getItemFromBlock(b);
+        }
+        return item;
+    }
 }

+ 13 - 12
src/main/java/me/km/utils/NBTUtils.java

@@ -1,9 +1,9 @@
 package me.km.utils;
 
-import me.hammerle.code.Script;
-import me.hammerle.exceptions.HoldCodeException;
-import me.hammerle.exceptions.IllegalStringException;
+import me.hammerle.snuviscript.code.InputProvider;
+import me.hammerle.snuviscript.code.Script;
 import me.km.api.Location;
+import me.km.exception.IllegalStringException;
 import net.minecraft.block.Block;
 import net.minecraft.block.state.IBlockState;
 import net.minecraft.entity.Entity;
@@ -39,7 +39,7 @@ public class NBTUtils
         return tag.toString();
     }
     
-    public static Entity fromString(Script sc, String s, Location l)
+    public static Entity fromString(String s, Location l)
     {
         try 
         {
@@ -62,8 +62,7 @@ public class NBTUtils
         }
         catch(NBTException ex)
         {
-            sc.getLogger().printException(new IllegalStringException(s), "read.item", sc, sc.getActiveRealCodeLine());
-            throw new HoldCodeException();
+            throw new IllegalStringException("illegal entity string '" + s + "'");
         }
     }
     
@@ -266,25 +265,27 @@ public class NBTUtils
         return text;
     }
     
-    public static ITextComponent concat(int start, String pre, Object... ob)
+    public static ITextComponent concat(Script sc, int start, String pre, InputProvider... ob)
     {
         TextComponentString text = new TextComponentString(pre);
+        Object o;
         for(int i = start; i < ob.length; i++)
         {
-            if(ob[i] instanceof ITextComponent)
+            o = ob[i].get(sc);
+            if(o instanceof ITextComponent)
             {
-                text.appendSibling((ITextComponent) ob[i]);
+                text.appendSibling((ITextComponent) o);
             }
             else
             {
-                text.appendText(String.valueOf(ob[i]));
+                text.appendText(String.valueOf(o));
             }
         }
         return text;
     }
     
-    public static ITextComponent concat(int start, Object... ob)
+    public static ITextComponent concat(Script sc, int start, InputProvider... ob)
     {
-        return concat(start, "", ob);
+        return concat(sc, start, "", ob);
     }
 }

Some files were not shown because too many files changed in this diff