Browse Source

Removed old parser, using SnuviScript library now, Bugfixes

Kajetan Johannes Hammerle 6 years ago
parent
commit
3aaf4d61a9
52 changed files with 2441 additions and 4542 deletions
  1. 1 0
      build.gradle
  2. 3 4
      src/main/java/me/km/KajetansMod.java
  3. 27 24
      src/main/java/me/km/api/CommandOverloader.java
  4. 161 27
      src/main/java/me/km/api/Location.java
  5. 19 60
      src/main/java/me/km/api/MessageSender.java
  6. 1 2
      src/main/java/me/km/api/Module.java
  7. 26 4
      src/main/java/me/km/api/Utils.java
  8. 1 1
      src/main/java/me/km/blocks/BlockBed.java
  9. 2 2
      src/main/java/me/km/databank/SimpleDataBank.java
  10. 5 0
      src/main/java/me/km/dimensions/ModDimensions.java
  11. 2 2
      src/main/java/me/km/dimensions/WorldData.java
  12. 3 1
      src/main/java/me/km/effects/active/NailTrap.java
  13. 3 1
      src/main/java/me/km/effects/active/NetTrap.java
  14. 15 7
      src/main/java/me/km/effects/passive/TrapEffects.java
  15. 0 6
      src/main/java/me/km/exception/CodeTooLongException.java
  16. 0 6
      src/main/java/me/km/exception/EndIfWithoutIfException.java
  17. 0 6
      src/main/java/me/km/exception/GoHigherAtRootTreeException.java
  18. 0 9
      src/main/java/me/km/exception/GotoLabelNotFoundException.java
  19. 0 6
      src/main/java/me/km/exception/HoldCodeException.java
  20. 0 6
      src/main/java/me/km/exception/IfWithoutEndIfException.java
  21. 0 6
      src/main/java/me/km/exception/IfWithoutStatementException.java
  22. 2 0
      src/main/java/me/km/exception/IllegalItemStackStringException.java
  23. 0 16
      src/main/java/me/km/exception/IllegalStringException.java
  24. 5 2
      src/main/java/me/km/exception/IllegalStringLocationException.java
  25. 0 6
      src/main/java/me/km/exception/NoChildTreeException.java
  26. 0 9
      src/main/java/me/km/exception/NoSuchMethodException.java
  27. 2 0
      src/main/java/me/km/exception/PlayerNotFoundException.java
  28. 0 9
      src/main/java/me/km/exception/PrescriptException.java
  29. 5 4
      src/main/java/me/km/nms/NmsUtilities.java
  30. 1 1
      src/main/java/me/km/plots/ProtectionBlockAction.java
  31. 5 2
      src/main/java/me/km/scheduler/SnuviScheduler.java
  32. 0 46
      src/main/java/me/km/snuviscript/BenchmarkClock.java
  33. 0 126
      src/main/java/me/km/snuviscript/CodeFunction.java
  34. 10 15
      src/main/java/me/km/snuviscript/CommandGiveUp.java
  35. 0 255
      src/main/java/me/km/snuviscript/CommandQuest.java
  36. 0 40
      src/main/java/me/km/snuviscript/CommandQuestInfo.java
  37. 39 37
      src/main/java/me/km/snuviscript/CommandScript.java
  38. 1483 0
      src/main/java/me/km/snuviscript/MinecraftFunctions.java
  39. 52 0
      src/main/java/me/km/snuviscript/MinecraftScript.java
  40. 46 0
      src/main/java/me/km/snuviscript/PlayerScript.java
  41. 0 821
      src/main/java/me/km/snuviscript/Script.java
  42. 0 284
      src/main/java/me/km/snuviscript/ScriptAPI.java
  43. 7 6
      src/main/java/me/km/snuviscript/ScriptBank.java
  44. 173 196
      src/main/java/me/km/snuviscript/ScriptEvents.java
  45. 131 0
      src/main/java/me/km/snuviscript/ScriptHelper.java
  46. 2 2
      src/main/java/me/km/snuviscript/ScriptInventoryHolder.java
  47. 197 0
      src/main/java/me/km/snuviscript/ScriptModule.java
  48. 0 302
      src/main/java/me/km/snuviscript/ScriptUtils.java
  49. 12 11
      src/main/java/me/km/snuviscript/ScriptVars.java
  50. 0 1971
      src/main/java/me/km/snuviscript/SnuviParser.java
  51. 0 174
      src/main/java/me/km/snuviscript/Tree.java
  52. 0 27
      src/main/java/me/km/snuviscript/Variable.java

+ 1 - 0
build.gradle

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

+ 3 - 4
src/main/java/me/km/KajetansMod.java

@@ -22,7 +22,7 @@ import me.km.plots.ProtectionBank;
 import me.km.scheduler.SnuviScheduler;
 import me.km.scoreboard.ScoreboardAPI;
 import me.km.skills.SkillManager;
-import me.km.snuviscript.ScriptAPI;
+import me.km.snuviscript.ScriptModule;
 import me.km.snuviscript.ScriptBank;
 import net.minecraft.server.MinecraftServer;
 import net.minecraft.util.text.TextFormatting;
@@ -55,7 +55,7 @@ public class KajetansMod
     public static Module datatools;
     public static WorldData worldManager;
     public static Module environment;
-    public static ScriptAPI scripts;
+    public static ScriptModule scripts;
     public static JobAPI jobs;
     public static EffectUtils effects;
     public static SkillManager skills;
@@ -197,8 +197,7 @@ public class KajetansMod
             worldManager.registerEvents("me.km.dimensions");
 
             // Scriptsystem
-            scripts = new ScriptAPI("Scripts", "Quests", TextFormatting.LIGHT_PURPLE);
-            scripts.registerPrefix("Scripts", TextFormatting.LIGHT_PURPLE);
+            scripts = new ScriptModule("Scripts", "Scripts", TextFormatting.LIGHT_PURPLE);
             scripts.setDataBank(new ScriptBank(scripts, databank.getConnection()));
             scripts.registerCommands(e, "me.km.snuviscript");          
             scripts.registerEvents("me.km.snuviscript");

+ 27 - 24
src/main/java/me/km/api/CommandOverloader.java

@@ -8,35 +8,38 @@ public class CommandOverloader
 {
     public static void overloadCommands(FMLServerStartingEvent e, Module m)
     {
-        KajetansMod.server.commandManager.getCommands().values().stream()
-                // Overload only vanilla commands
-                .filter(command -> !(command instanceof ModuleCommand))
-                // Prevent overloading of already overloaded commands (summon, ...)
-                .filter(command -> m.getCommand(command.getName()) == null) 
-                .forEach(command -> 
+        if(!KajetansMod.debugMode)
         {
-            Permissions perm;
-            try
+            KajetansMod.server.commandManager.getCommands().values().stream()
+                    // Overload only vanilla commands
+                    .filter(command -> !(command instanceof ModuleCommand))
+                    // Prevent overloading of already overloaded commands (summon, ...)
+                    .filter(command -> m.getCommand(command.getName()) == null) 
+                    .forEach(command -> 
             {
-                if(command.getClass().getName().startsWith("com.sk89q."))
+                Permissions perm;
+                try
                 {
-                    m.registerCommand(e, new WorldEditCommand(command, m));
-                    m.sendToConsole(command.getName() + " wurde überschrieben.");
-                    return;
+                    if(command.getClass().getName().startsWith("com.sk89q."))
+                    {
+                        m.registerCommand(e, new WorldEditCommand(command, m));
+                        m.sendToConsole(command.getName() + " wurde überschrieben.");
+                        return;
+                    }
+                    else
+                    {
+                        perm = Permissions.valueOf(command.getName());
+                    }
                 }
-                else
+                catch(IllegalArgumentException ex)
                 {
-                    perm = Permissions.valueOf(command.getName());
+                    m.sendWarningToConsole("Ungültige Permission für Command-Name: " + command.getName());
+                    perm = Permissions.VANILLA;
                 }
-            }
-            catch(IllegalArgumentException ex)
-            {
-                m.sendWarningToConsole("Ungültige Permission für Command-Name: " + command.getName());
-                perm = Permissions.VANILLA;
-            }
-            m.registerCommand(e, new VanillaModuleCommand(command, m, perm));
-            m.sendToConsole(command.getName() + " wurde überschrieben.");
-        });
-        m.sendToConsole("Alle Commands wurden überschrieben.");
+                m.registerCommand(e, new VanillaModuleCommand(command, m, perm));
+                m.sendToConsole(command.getName() + " wurde überschrieben.");
+            });
+            m.sendToConsole("Alle Commands wurden überschrieben.");
+        }
     }
 }

+ 161 - 27
src/main/java/me/km/api/Location.java

@@ -1,28 +1,41 @@
 package me.km.api;
 
 import java.util.Objects;
+import java.util.regex.PatternSyntaxException;
+import me.hammerle.code.Script;
 import me.km.dimensions.ModDimensions;
+import me.km.exception.IllegalStringLocationException;
 import net.minecraft.block.state.IBlockState;
 import net.minecraft.entity.Entity;
 import net.minecraft.util.math.BlockPos;
+import net.minecraft.util.math.MathHelper;
 import net.minecraft.util.math.Vec3d;
 import net.minecraft.world.World;
 
-public class Location 
+public class Location
 {
     private final World w;
-    private Vec3d pos;
+    private double x;
+    private double y;
+    private double z;
     private float yaw;
     private float pitch;
     
-    public Location(World w, Vec3d pos, float yaw, float pitch)
+    public Location(World w, double x, double y, double z, float yaw, float pitch)
     {
         this.w = w;
-        this.pos = pos;
+        this.x = x;
+        this.y = y;
+        this.z = z;
         this.yaw = yaw;
         this.pitch = pitch;
     }
     
+    public Location(World w, Vec3d pos, float yaw, float pitch)
+    {
+        this(w, pos.xCoord, pos.yCoord, pos.zCoord, yaw, pitch);
+    }
+    
     public Location(World w, Vec3d pos)
     {
         this(w, pos, 0, 0);
@@ -30,7 +43,7 @@ public class Location
     
     public Location(World w, BlockPos pos, float yaw, float pitch)
     {
-        this(w, new Vec3d(pos.getX(), pos.getY(), pos.getZ()), yaw, pitch);
+        this(w, pos.getX(), pos.getY(), pos.getZ(), yaw, pitch);
     }
     
     public Location(World w, BlockPos pos)
@@ -40,40 +53,129 @@ public class Location
     
     public Location(Entity ent)
     {
-        this(ent.world, ent.getPositionVector(), ent.rotationYaw, ent.rotationPitch);
+        this(ent.world, ent.posX, ent.posY, ent.posZ, ent.rotationYaw, ent.rotationPitch);
     }
     
-    public static Location rounded(Entity ent)
+    public Location(Script sc, String location) throws IllegalStringLocationException
     {
-        return new Location(ent.world, ent.getPosition());
+        try
+        {
+            String[] parts = location.split(":");
+            if(parts.length >= 6)
+            {
+                this.w = ModDimensions.getWorldFromName(parts[0]);
+                this.x = Double.parseDouble(parts[1]);
+                this.y = Double.parseDouble(parts[2]); 
+                this.z = Double.parseDouble(parts[3]);
+                this.yaw = Float.parseFloat(parts[4]);
+                this.pitch = Float.parseFloat(parts[5]);
+                return;
+            }
+            else if(parts.length >= 4)
+            {
+                this.w = ModDimensions.getWorldFromName(parts[0]);
+                this.x = Double.parseDouble(parts[1]);
+                this.y = Double.parseDouble(parts[2]); 
+                this.z = Double.parseDouble(parts[3]);
+                this.yaw = 0;
+                this.pitch = 0;
+                return;
+            }
+            throw new IllegalStringLocationException(sc, location);
+        }
+        catch(PatternSyntaxException | NumberFormatException ex)
+        {
+            throw new IllegalStringLocationException(sc, location);
+        }
     }
 
     @Override
     public int hashCode() 
     {
-        int hash = 5;
-        hash = 73 * hash + Objects.hashCode(this.w);
-        hash = 73 * hash + Objects.hashCode(this.pos);
-        hash = 73 * hash + Float.floatToIntBits(this.yaw);
-        hash = 73 * hash + Float.floatToIntBits(this.pitch);
+        int hash = 7;
+        hash = 17 * hash + Objects.hashCode(this.w);
+        hash = 17 * hash + (int) (Double.doubleToLongBits(this.x) ^ (Double.doubleToLongBits(this.x) >>> 32));
+        hash = 17 * hash + (int) (Double.doubleToLongBits(this.y) ^ (Double.doubleToLongBits(this.y) >>> 32));
+        hash = 17 * hash + (int) (Double.doubleToLongBits(this.z) ^ (Double.doubleToLongBits(this.z) >>> 32));
+        hash = 17 * hash + Float.floatToIntBits(this.yaw);
+        hash = 17 * hash + Float.floatToIntBits(this.pitch);
         return hash;
     }
-    
+
     @Override
     public boolean equals(Object obj) 
     {
-        if(obj.getClass() == Location.class)
+        if(this == obj) 
+        {
+            return true;
+        }
+        if(obj == null || getClass() != obj.getClass())
         {
-            Location l = (Location) obj;
-            Vec3d v = l.getPos();
-            return l.getWorld().equals(w) && v.equals(pos) && yaw == l.yaw && pitch == l.pitch;
+            return false;
         }
-        return false;
+        final Location other = (Location) obj;
+        return Double.doubleToLongBits(this.x) == Double.doubleToLongBits(other.x) &&
+                Double.doubleToLongBits(this.y) == Double.doubleToLongBits(other.y) &&
+                Double.doubleToLongBits(this.z) == Double.doubleToLongBits(other.z) &&
+                Float.floatToIntBits(this.yaw) == Float.floatToIntBits(other.yaw) &&
+                Float.floatToIntBits(this.pitch) == Float.floatToIntBits(other.pitch) &&
+                Objects.equals(this.w, other.w);
+    }
+
+    public void add(double x, double y, double z)
+    {
+        this.x += x; 
+        this.y += y; 
+        this.z += z; 
+    }
+    
+    public Location copyAdd(double x, double y, double z)
+    {
+        return new Location(w, this.x + x, this.y + y, this.z + z, this.yaw, this.pitch);
+    }
+    
+    public void addX(double x)
+    {
+        this.x += x; 
+    }
+    
+    public void addY(double y)
+    {
+        this.y += y; 
+    }
+    
+    public void addZ(double z)
+    {
+        this.z += z; 
+    }
+    
+    public void set(double x, double y, double z)
+    {
+        this.x = x; 
+        this.y = y; 
+        this.z = z; 
+    }
+
+    public double getX() 
+    {
+        return x;
+    }
+
+    public double getY() 
+    {
+        return y;
+    }
+
+    public double getZ() 
+    {
+        return z;
     }
     
-    public Location add(double x, double y, double z)
+    public void round()
     {
-        return new Location(w, pos.addVector(x, y, z));
+        this.x = MathHelper.floor(this.x);
+        this.y = MathHelper.floor(this.y);
+        this.z = MathHelper.floor(this.z);
     }
 
     public World getWorld() 
@@ -83,12 +185,12 @@ public class Location
 
     public Vec3d getPos() 
     {
-        return pos;
+        return new Vec3d(x, y, z);
     }
     
     public BlockPos getBlockPos() 
     {
-        return new BlockPos(pos.xCoord, pos.yCoord, pos.zCoord);
+        return new BlockPos(x, y, z);
     }
 
     public float getYaw() 
@@ -110,16 +212,48 @@ public class Location
     {
         this.yaw = yaw;
     }
+
+    public IBlockState getBlockState()
+    {
+        return w.getBlockState(new BlockPos(x, y, z));
+    }
     
-    public static IBlockState getRelativeBlock(World w, BlockPos pos, int x, int y, int z)
+    public IBlockState getRelativeBlockState(int x, int y, int z)
     {
-        return w.getBlockState(pos.add(x, y, z));
+        return w.getBlockState(new BlockPos(this.x + x, this.y + y, this.z + z));
     }
 
     @Override
     public String toString() 
     {
-        return ModDimensions.getWorldName(w) + ":" + pos.xCoord + ":" + pos.yCoord + 
-                ":" + pos.zCoord + ":" + yaw + ":" + pitch;
+        StringBuilder sb = new StringBuilder(ModDimensions.getWorldName(w));
+        sb.append(":");
+        sb.append(x);
+        sb.append(":");
+        sb.append(y);
+        sb.append(":");
+        sb.append(z);
+        sb.append(":");
+        sb.append(yaw);
+        sb.append(":");
+        sb.append(pitch);
+        return sb.toString();
+    }
+   
+    public String toBlockString() 
+    {
+        StringBuilder sb = new StringBuilder(ModDimensions.getWorldName(w));
+        sb.append(":");
+        sb.append(MathHelper.floor(x));
+        sb.append(":");
+        sb.append(MathHelper.floor(y));
+        sb.append(":");
+        sb.append(MathHelper.floor(z));
+        return sb.toString();
+    }
+
+    public Location copy()
+    {
+        return new Location(w, x, y, z, yaw, pitch);
     }
 }

+ 19 - 60
src/main/java/me/km/api/MessageSender.java

@@ -1,6 +1,5 @@
 package me.km.api;
 
-import java.util.ArrayList;
 import me.km.KajetansMod;
 import net.minecraft.command.ICommandSender;
 import net.minecraft.entity.player.EntityPlayer;
@@ -12,49 +11,38 @@ import net.minecraft.world.World;
 
 public class MessageSender 
 {
-    private final ArrayList<ITextComponent> prefixes;
-    private final ArrayList<TextFormatting> colors;
+    private final ITextComponent prefixes;
+    private final TextFormatting colors;
     
-    public MessageSender()
-    {
-        prefixes = new ArrayList<>();
-        colors = new ArrayList<>();
-    }
-    
-    public void registerPrefix(String name, TextFormatting color)
+    public MessageSender(String name, TextFormatting color)
     {
         TextComponentString text = new TextComponentString(name);
         text.getStyle().setColor(color);
-        prefixes.add(new TextComponentString("[").appendSibling(text).appendText("] "));
-        colors.add(color);
+        prefixes = new TextComponentString("[").appendSibling(text).appendText("] ");
+        colors = color;
     }
 
-    public void send(ICommandSender cs, String msg, int id)
+    public void send(ICommandSender cs, String msg)
     {
         if(cs == null)
         {
             return;
         }
-        cs.sendMessage(prefixes.get(id).createCopy().appendText(msg));
+        cs.sendMessage(prefixes.createCopy().appendText(msg));
     }
-    
-    public void send(ICommandSender cs, String msg)
-    {
-        send(cs, msg, 0);
-    }
-    
+
     public void sendToPlayers(World w, Vec3d v, double radius, String msg)
     {
-        ITextComponent s = prefixes.get(0).createCopy().appendText(msg);
+        ITextComponent s = prefixes.createCopy().appendText(msg);
         Utils.getNearbyEntities(w, v, radius, EntityPlayer.class).forEach(p -> ((EntityPlayer) p).sendMessage(s));
     }
     
     public void sendBroadcast(String msg)
     {
-        KajetansMod.server.getPlayerList().sendMessage(prefixes.get(0).createCopy().appendText(msg));
+        KajetansMod.server.getPlayerList().sendMessage(prefixes.createCopy().appendText(msg));
     }
     
-    public void sendListElement(ICommandSender cs, String msg, int id)
+    public void sendListElement(ICommandSender cs, String msg)
     {
         if(cs == null)
         {
@@ -62,17 +50,12 @@ public class MessageSender
         }
         TextComponentString text = new TextComponentString("");
         TextComponentString text2 = new TextComponentString(" - ");
-        text2.getStyle().setColor(colors.get(id));
+        text2.getStyle().setColor(colors);
         text.appendSibling(text2);
         cs.sendMessage(text.appendText(msg));
-    }
+    } 
     
-    public void sendListElement(ICommandSender cs, String msg)
-    {
-        sendListElement(cs, msg, 0);
-    }
-    
-    public void sendHelpListElement(ICommandSender cs, String msg, String msg2, int id)
+    public void sendHelpListElement(ICommandSender cs, String msg, String msg2)
     {
         if(cs == null)
         {
@@ -80,17 +63,12 @@ public class MessageSender
         }
         TextComponentString text = new TextComponentString("");
         TextComponentString text2 = new TextComponentString(" - " + msg + " ");
-        text2.getStyle().setColor(colors.get(id));
+        text2.getStyle().setColor(colors);
         text.appendSibling(text2);
         cs.sendMessage(text.appendText(msg2));
     }
     
-    public void sendHelpListElement(ICommandSender cs, String msg, String msg2)
-    {
-        sendHelpListElement(cs, msg, msg2, 0);
-    }
-    
-    public void sendWarning(ICommandSender cs, String msg, int id)
+    public void sendWarning(ICommandSender cs, String msg)
     {
         if(cs == null)
         {
@@ -98,35 +76,16 @@ public class MessageSender
         }
         TextComponentString text = new TextComponentString(msg);
         text.getStyle().setColor(TextFormatting.RED);
-        cs.sendMessage(prefixes.get(id).createCopy().appendSibling(text));
-    }
-    
-    public void sendWarning(ICommandSender cs, String msg)
-    {
-        if(cs == null)
-        {
-            return;
-        }
-        sendWarning(cs, msg, 0);
+        cs.sendMessage(prefixes.createCopy().appendSibling(text));
     }
    
-    public void sendToConsole(String msg, int id)
-    {
-        send(KajetansMod.server, msg, id);
-    }
-    
     public void sendToConsole(String msg)
     {
-        sendToConsole(msg, 0);
-    }
-    
-    public void sendWarningToConsole(String msg, int id)
-    {
-        sendWarning(KajetansMod.server, msg, id);
+        send(KajetansMod.server, msg);
     }
     
     public void sendWarningToConsole(String msg)
     {
-        sendWarningToConsole(msg, 0);
+        sendWarning(KajetansMod.server, msg);
     }
 }

+ 1 - 2
src/main/java/me/km/api/Module.java

@@ -1,7 +1,6 @@
 package me.km.api;
 
 import java.lang.reflect.InvocationTargetException;
-import java.util.ArrayList;
 import java.util.HashMap;
 import me.km.PackageHelper;
 import me.km.databank.SimpleDataBank;
@@ -19,9 +18,9 @@ public class Module extends MessageSender
     
     public Module(String mname, String prefix, TextFormatting color)
     {
+        super(prefix, color);
         commands = new HashMap<>();
         this.mname = mname;
-        super.registerPrefix(prefix, color);
         events = new HashMap<>();
         bank = null;
         

+ 26 - 4
src/main/java/me/km/api/Utils.java

@@ -13,6 +13,10 @@ import me.km.KajetansMod;
 import me.km.dimensions.ModTeleporter;
 import me.km.entities.EntityItemProjectile;
 import me.km.exception.PlayerNotFoundException;
+import me.km.items.ItemDagger;
+import me.km.items.ItemHammer;
+import me.km.items.ItemStick;
+import me.km.items.ItemWand;
 import net.minecraft.entity.Entity;
 import net.minecraft.entity.player.EntityPlayer;
 import net.minecraft.block.Block;
@@ -128,6 +132,7 @@ public class Utils
     public enum ToolTypes
     {
         PICKAXE, AXE, HOE, SHOVEL, SWORD, MUSKET, DAGGER, HAMMER, STICK, WAND, SPEAR
+        // MUSKET, SPEAR
     }
     
     public static ToolTypes getToolType(ItemStack stack)
@@ -157,6 +162,22 @@ public class Utils
         {
             return ToolTypes.SWORD;
         }
+        else if(item instanceof ItemDagger)
+        {
+            return ToolTypes.DAGGER;
+        }
+        else if(item instanceof ItemHammer)
+        {
+            return ToolTypes.HAMMER;
+        }
+        else if(item instanceof ItemStick)
+        {
+            return ToolTypes.STICK;
+        }
+        else if(item instanceof ItemWand)
+        {
+            return ToolTypes.WAND;
+        }
         return null;
     }
        
@@ -627,19 +648,20 @@ public class Utils
     
     public static BlockPos getSameNearbyBlock(World w, BlockPos pos, Block b)
     {           
-        if(Location.getRelativeBlock(w, pos, 1, 0, 0).getBlock() == b)
+        Location l = new Location(w, pos);
+        if(l.getRelativeBlockState(1, 0, 0).getBlock() == b)
         {
             return pos.add(1, 0, 0);
         }
-        else if(Location.getRelativeBlock(w, pos, -1, 0, 0).getBlock() == b)
+        else if(l.getRelativeBlockState(-1, 0, 0).getBlock() == b)
         {
             return pos.add(-1, 0, 0);
         }
-        else if(Location.getRelativeBlock(w, pos, 0, 0, 1).getBlock() == b)
+        else if(l.getRelativeBlockState(0, 0, 1).getBlock() == b)
         {
             return pos.add(0, 0, 1);
         }
-        else if(Location.getRelativeBlock(w, pos, 0, 0, -1).getBlock() == b)
+        else if(l.getRelativeBlockState(0, 0, -1).getBlock() == b)
         {
             return pos.add(0, 0, -1);
         }

+ 1 - 1
src/main/java/me/km/blocks/BlockBed.java

@@ -106,7 +106,7 @@ public class BlockBed extends net.minecraft.block.BlockBed
                     state = state.withProperty(OCCUPIED, true);
                     // set players real position
                     // subtracting normal bedsize, adding custom
-                    p.setPosition(p.posX, p.posY - 0.6875f + getLayingHigh(), p.posZ);
+                    p.setPosition(p.posX, p.posY - 0.4375f + getLayingHigh(), p.posZ);
                     // this is for evil servers which render the position wrong
                     if(p instanceof EntityPlayerMP)
                     {

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

@@ -5,8 +5,8 @@ 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.snuviscript.ScriptUtils;
 import me.km.table.Table;
 
 public abstract class SimpleDataBank 
@@ -276,7 +276,7 @@ public abstract class SimpleDataBank
             ResultSet rs = stmt.executeQuery(query);
             while(rs.next())
             {
-                table.addRow(new Object[] {rs.getString(1), ScriptUtils.convertInput(rs.getString(2))});
+                table.addRow(new Object[] {rs.getString(1), Code.convertInput(rs.getString(2), false)});
             }
             return table;
         }

+ 5 - 0
src/main/java/me/km/dimensions/ModDimensions.java

@@ -58,6 +58,11 @@ public class ModDimensions
         return ws.getWorldInfo().getWorldName();
     }
     
+    public static String getWorldName(int dim)
+    {
+        return getWorldName(DimensionManager.getWorld(dim));
+    }
+    
     public static WorldServer getWorldFromName(String s)
     {
         WorldServer ws = DimensionManager.getWorld(0);

+ 2 - 2
src/main/java/me/km/dimensions/WorldData.java

@@ -17,13 +17,13 @@ public class WorldData extends Module
     
     public WorldPreferences getWorldPreferences(World w)
     {
-        WorldPreferences wp = worlds.get(w.getWorldType().getWorldTypeID());
+        WorldPreferences wp = worlds.get(w.provider.getDimension());
         if(wp != null)
         {
             return wp;
         }
         wp = new WorldPreferences();
-        worlds.put(w.getWorldType().getWorldTypeID(), wp);
+        worlds.put(w.provider.getDimension(), wp);
         return wp;
     }
 }

+ 3 - 1
src/main/java/me/km/effects/active/NailTrap.java

@@ -11,7 +11,9 @@ public class NailTrap extends ActiveEffectBase
     @Override
     protected boolean executeEffect(EntityPlayerMP p, int power) 
     {
-        KajetansMod.effects.getEvent(TrapEffects.class).addNailTraps(Location.rounded(p), KajetansMod.playerbank.getGuildId(p));
+        Location l = new Location(p);
+        l.round();
+        KajetansMod.effects.getEvent(TrapEffects.class).addNailTraps(l, KajetansMod.playerbank.getGuildId(p));
         KajetansMod.skills.send(p, "Du hast 9 Trittnagelfallen platziert.");
         return true;
     }

+ 3 - 1
src/main/java/me/km/effects/active/NetTrap.java

@@ -11,7 +11,9 @@ public class NetTrap extends ActiveEffectBase
     @Override
     protected boolean executeEffect(EntityPlayerMP p, int power) 
     {
-        KajetansMod.effects.getEvent(TrapEffects.class).addNetTrap(Location.rounded(p), KajetansMod.playerbank.getGuildId(p));
+        Location l = new Location(p);
+        l.round();
+        KajetansMod.effects.getEvent(TrapEffects.class).addNetTrap(l, KajetansMod.playerbank.getGuildId(p));
         KajetansMod.skills.send(p, "Du hast eine Netzfalle platziert.");
         return true;
     }

+ 15 - 7
src/main/java/me/km/effects/passive/TrapEffects.java

@@ -9,7 +9,7 @@ import me.km.api.Utils;
 import me.km.effects.EffectBlockChanger;
 import me.km.effects.EffectUtils;
 import me.km.events.PlayerMoveEvent;
-import me.km.snuviscript.ScriptUtils;
+import me.km.snuviscript.ScriptHelper;
 import net.minecraft.entity.player.EntityPlayer;
 import net.minecraft.init.Blocks;
 import net.minecraft.init.MobEffects;
@@ -33,36 +33,44 @@ public class TrapEffects extends ModuleListener
     
     public void addNailTraps(Location l, int id)
     {
-        l = ScriptUtils.roundLocation(l);
+        l = l.copy();
+        l.round();
         for(int x = -1; x <= 1; x++)
         {
             for(int y = -1; y <= 1; y++)
             {
-                nailTraps.put(l.add(x, 0, y), id);
+                nailTraps.put(l.copyAdd(x, 0, y), id);
             }
         }
     }
     
     public void addNetTrap(Location l, int id)
     {
-        netTraps.put(ScriptUtils.roundLocation(l), id);
+        l = l.copy();
+        l.round();
+        netTraps.put(l, id);
     }
     
     public void addVineTrap(Location l, int id)
     {
-        vineTraps.put(ScriptUtils.roundLocation(l), id);
+        l = l.copy();
+        l.round();
+        vineTraps.put(l, id);
     }
     
     public void removeVineTrap(Location l)
     {
-        vineTraps.remove(ScriptUtils.roundLocation(l));
+        l = l.copy();
+        l.round();
+        vineTraps.remove(l);
     }
     
     @SubscribeEvent
     public void executeTrap(PlayerMoveEvent e)
     {       
         EntityPlayer p = e.getEntityPlayer();
-        Location l = Location.rounded(p);
+        Location l = new Location(p);
+        l.round();
         if(netTraps.containsKey(l))
         {
             Integer i = netTraps.get(l);

+ 0 - 6
src/main/java/me/km/exception/CodeTooLongException.java

@@ -1,6 +0,0 @@
-package me.km.exception;
-
-public class CodeTooLongException extends RuntimeException
-{
-    
-}

+ 0 - 6
src/main/java/me/km/exception/EndIfWithoutIfException.java

@@ -1,6 +0,0 @@
-package me.km.exception;
-
-public class EndIfWithoutIfException extends RuntimeException
-{
-    
-}

+ 0 - 6
src/main/java/me/km/exception/GoHigherAtRootTreeException.java

@@ -1,6 +0,0 @@
-package me.km.exception;
-
-public class GoHigherAtRootTreeException extends Exception
-{
-    
-}

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

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

+ 0 - 6
src/main/java/me/km/exception/HoldCodeException.java

@@ -1,6 +0,0 @@
-package me.km.exception;
-
-public class HoldCodeException extends RuntimeException
-{
-    
-}

+ 0 - 6
src/main/java/me/km/exception/IfWithoutEndIfException.java

@@ -1,6 +0,0 @@
-package me.km.exception;
-
-public class IfWithoutEndIfException extends RuntimeException
-{
-    
-}

+ 0 - 6
src/main/java/me/km/exception/IfWithoutStatementException.java

@@ -1,6 +0,0 @@
-package me.km.exception;
-
-public class IfWithoutStatementException extends RuntimeException
-{
-    
-}

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

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

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

@@ -1,16 +0,0 @@
-package me.km.exception;
-
-public class IllegalStringException extends RuntimeException
-{
-    private final String s;
-    
-    public IllegalStringException(String s)
-    {
-        this.s = s;
-    }
-    
-    public String getBadString()
-    {
-        return s;
-    }
-}

+ 5 - 2
src/main/java/me/km/exception/IllegalStringLocationException.java

@@ -1,9 +1,12 @@
 package me.km.exception;
 
+import me.hammerle.code.Script;
+import me.hammerle.exceptions.IllegalStringException;
+
 public class IllegalStringLocationException extends IllegalStringException
 {
-    public IllegalStringLocationException(String s) 
+    public IllegalStringLocationException(Script sc, String s) 
     {
-        super(s);
+        super(sc, s);
     }
 }

+ 0 - 6
src/main/java/me/km/exception/NoChildTreeException.java

@@ -1,6 +0,0 @@
-package me.km.exception;
-
-public class NoChildTreeException extends RuntimeException
-{
-    
-}

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

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

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

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

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

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

+ 5 - 4
src/main/java/me/km/nms/NmsUtilities.java

@@ -1,8 +1,9 @@
 package me.km.nms;
 
 import java.util.List;
+import me.hammerle.code.Script;
+import me.hammerle.exceptions.IllegalStringException;
 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;
@@ -58,9 +59,9 @@ public class NmsUtilities
         return tag.toString();
     }
     
-    public static Entity getEntityFromNbtString(String s, Location l)
+    public static Entity getEntityFromNbtString(Script sc, String s, Location l)
     {
-        try
+        try 
         {
             NBTTagCompound nbt = JsonToNBT.getTagFromJson(s);
             Vec3d v = l.getPos();
@@ -81,7 +82,7 @@ public class NmsUtilities
         }
         catch(NBTException ex)
         {
-            throw new IllegalStringException(s);
+            throw new IllegalStringException(sc, s);
         }
     }
     

+ 1 - 1
src/main/java/me/km/plots/ProtectionBlockAction.java

@@ -66,7 +66,7 @@ public class ProtectionBlockAction extends Protection
             }
             else if(b == Blocks.REEDS)
             {
-                if(Location.getRelativeBlock(w, pos, 0, -1, 0).getBlock() == Blocks.REEDS)
+                if(w.getBlockState(pos.down()).getBlock() == Blocks.REEDS)
                 {
                     if(this.getProtectionBank().hasTag(w, pos, "farm"))
                     {

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

@@ -6,10 +6,11 @@ import java.util.HashMap;
 import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
+import me.hammerle.code.ISnuviScheduler;
 import me.km.api.Module;
 import net.minecraft.util.text.TextFormatting;
 
-public class SnuviScheduler extends Module
+public class SnuviScheduler extends Module implements ISnuviScheduler
 {
     private boolean checker;
     private int counter;
@@ -38,11 +39,13 @@ public class SnuviScheduler extends Module
         return counter;
     }
     
-    public int scheduleTask(Runnable r, int delay)
+    @Override
+    public int scheduleTask(Runnable r, long delay)
     { 
         return scheduleRepeatingTask(r, delay, 0);
     }
     
+    @Override
     public int scheduleTask(Runnable r)
     { 
         return scheduleTask(r, 0);

+ 0 - 46
src/main/java/me/km/snuviscript/BenchmarkClock.java

@@ -1,46 +0,0 @@
-package me.km.snuviscript;
-
-public class BenchmarkClock 
-{
-    private long sum;
-    private long l;
-    private boolean b;
-    
-    public BenchmarkClock()
-    {
-        sum = 0;
-        l = 0;
-        b = false;
-    }
-    
-    public void pushTime(boolean bo)
-    {
-        if(!bo)
-        {
-            return;
-        }
-        if(b)
-        {
-            sum += (System.nanoTime() - l) / 1000;
-            b = false;
-            return;
-        }
-        b = true;
-        l = System.nanoTime();
-    }
-    
-    public long getSummedTime()
-    {
-        return sum / 1000;
-    }
-    
-    public long getSummedTimeExact()
-    {
-        return sum;
-    }
-    
-    public void clear()
-    {
-        l = 0;
-    }
-}

+ 0 - 126
src/main/java/me/km/snuviscript/CodeFunction.java

@@ -1,126 +0,0 @@
-package me.km.snuviscript;
-
-import me.km.KajetansMod;
-import me.km.exception.PrescriptException;
-import me.km.exception.NoSuchMethodException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.stream.Collectors;
-
-public class CodeFunction 
-{
-    private int function;
-    private Object[] pars;
-    
-    public CodeFunction(String code)
-    {
-        function = 0;
-        findFunction(code);
-    }
-    
-    private void findFunction(String c)
-    {
-        //System.out.println(c);
-        if(c.equals("")) // Springt in { } ohne Kopf
-        {
-            function = KajetansMod.scripts.getQuestParser().translateMethod("godeeper");
-            pars = new Object[0];
-            return;
-        }
-        int pos = c.indexOf("(");
-        if(pos == -1)
-        {
-            throw new PrescriptException("Falsche Syntax bei: "  + c);
-        }
-        try
-        {
-            function = KajetansMod.scripts.getQuestParser().translateMethod(c.substring(0, pos).trim().toLowerCase());
-        }
-        catch(NullPointerException ex)
-        {
-            throw new NoSuchMethodException(c.substring(0, pos).trim());
-        }
-        pos++;
-        
-        ArrayList<Object> pars = new ArrayList<>();
-        int last = pos;
-        int counter = 1;
-        boolean string = false;
-        while(pos < c.length())
-        {
-            if(string)
-            {              
-                if(c.charAt(pos) == '"')
-                {
-                    string = !string;
-                }
-                pos++;
-                continue;
-            }
-            switch(c.charAt(pos))
-            {
-                case '"':
-                    string = !string;
-                    break;
-                case ',':
-                    if(last != pos)
-                    {
-                        pars.add(ScriptUtils.convertInput(c.substring(last, pos).trim()));
-                    }
-                    last = pos + 1;
-                    break;
-                case ')':
-                    if(counter <= 0)
-                    {
-                        throw new PrescriptException(") ohne (");
-                    }
-                    if(last != pos)
-                    {
-                        pars.add(ScriptUtils.convertInput(c.substring(last, pos).trim()));
-                    }
-                    break;
-                case '(':
-                    counter++;
-                    pos++;
-                    while(counter != 1 && pos < c.length())
-                    {
-                        switch(c.charAt(pos))
-                        {
-                            case '(':
-                                counter++;
-                                break;
-                            case ')':
-                                counter--;
-                                break;    
-                        }
-                        pos++;
-                    }
-                    pars.add(new CodeFunction(c.substring(last, pos).trim())); 
-                    while(pos < c.length() && c.charAt(pos) != ',' && c.charAt(pos) != ')')
-                    {
-                        pos++;
-                    }
-                    last = pos + 1;
-                    break;
-            }  
-            pos++;
-        }   
-        this.pars = pars.toArray(new Object[pars.size()]);
-    }
-    
-    public int getFunction()
-    {
-        return function;
-    }
-    
-    public Object[] getParameters()
-    {
-        return pars;
-    }
-
-    @Override
-    public String toString() 
-    {
-        return function + "(" + Arrays.asList(pars).stream().map(o -> String.valueOf(o)).collect(Collectors.joining(", ")) + ")";
-    }
-}

+ 10 - 15
src/main/java/me/km/snuviscript/CommandGiveUp.java

@@ -4,8 +4,6 @@ import me.km.KajetansMod;
 import me.km.api.GlobalText;
 import me.km.api.Module;
 import me.km.api.ModuleCommand;
-import me.km.exception.GotoLabelNotFoundException;
-import me.km.exception.NoChildTreeException;
 import me.km.permissions.Permissions;
 import net.minecraft.command.ICommandSender;
 import net.minecraft.entity.player.EntityPlayer;
@@ -34,27 +32,24 @@ public class CommandGiveUp extends ModuleCommand
             return true;
         }
         EntityPlayer p = (EntityPlayer) cs;
-        Script qd = KajetansMod.scripts.getQuestData(p);
+        PlayerScript qd = KajetansMod.scripts.getScript(p);
         if(qd == null)
         {
             this.getModule().send(cs, "Du hast gerade keine Quest.");
             return true;
         }
-        try
+        if(!KajetansMod.scripts.getSnuviParser().callEvent("player_giveup", qd, (sc) -> 
+            {
+                ScriptVars.setPlayerVars(qd, p); 
+            }, (sc) -> 
+            {
+                this.getModule().send(cs, "Du hast deine Quest aufgegeben.");
+            }))
         {
-            qd.gotoLabel("giveup");
-            qd.setVar("event", "player-leave");
-            ScriptVars.setPlayerVars(qd, p); 
-            qd.runCode();
+            KajetansMod.scripts.removePlayerFromScript(p, qd);
             this.getModule().send(cs, "Du hast deine Quest aufgegeben.");
-            return true;
-        }
-        catch(GotoLabelNotFoundException | NoChildTreeException ex)
-        {
-            KajetansMod.scripts.removePlayerFromQuest(p, qd);
-            this.getModule().send(cs, "Du hast deine Quest aufgegeben.");
-            return true;
         }
+        return true;
     }
 }
 

+ 0 - 255
src/main/java/me/km/snuviscript/CommandQuest.java

@@ -1,255 +0,0 @@
-package me.km.snuviscript;
-
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-import me.km.KajetansMod;
-import me.km.api.GlobalText;
-import me.km.api.Module;
-import me.km.api.ModuleCommand;
-import me.km.api.Utils;
-import me.km.chatmanager.ChatManager;
-import me.km.exception.PlayerNotFoundException;
-import me.km.permissions.Permissions;
-import net.minecraft.command.ICommandSender;
-import net.minecraft.entity.player.EntityPlayer;
-import net.minecraft.util.text.TextComponentString;
-
-public class CommandQuest extends ModuleCommand
-{
-    public CommandQuest(Module m) 
-    {
-        super("quest", m);
-        super.setDescription("Zeigt alles über Quests");
-        super.setUsage("/quest für die Hilfe");
-        super.setPermission(Permissions.QUEST);
-        super.addAlias("q");
-    }
-
-    @SuppressWarnings("unchecked")
-    @Override
-    public boolean execute(ICommandSender cs, String[] arg) 
-    {
-        Module m = this.getModule();
-        if(arg.length >= 1)
-        {
-            final EntityPlayer p;
-            if(cs instanceof EntityPlayer)
-            {
-                p = (EntityPlayer) cs;
-            }
-            else
-            {
-                p = null;
-            }
-            
-            // Abkürzungen
-            switch(arg[0].toLowerCase())
-            {
-                case "s":
-                case "start":
-                {
-                    if(arg.length >= 3)
-                    {
-                        EntityPlayer affectedPlayer;
-                        try
-                        {
-                            affectedPlayer = Utils.getPlayerByName(arg[1]);                   
-                        }
-                        catch(PlayerNotFoundException ex)
-                        {
-                            m.send(cs, GlobalText.cantFindPlayer(arg[1]));
-                            return true;
-                        }                           
-                        KajetansMod.scripts.startQuest(cs, arg[Utils.randomInt(2, arg.length-1)], affectedPlayer, null, null);
-                        return true;
-                    }
-                    break;
-                }
-                case "v":
-                case "variable":    
-                {
-                    if(arg.length >= 2 && p != null)
-                    {
-                        Script qd = KajetansMod.scripts.getQuestData(p);
-                        if(qd == null)
-                        {
-                            m.send(cs, "Du hast gerade keine Quest.");
-                            return true;
-                        }
-                        m.send(cs, arg[1] + " = " + qd.getVar(arg[1]));
-                        return true; 
-                    }
-                    break;
-                }
-                case "n":
-                case "next":
-                {
-                    if(p != null)
-                    {
-                        Script qd = KajetansMod.scripts.getQuestData(p);
-                        if(qd == null)
-                        {
-                            m.send(cs, "Du hast gerade keine Quest.");
-                            return true;
-                        }
-                        qd.setIsWaiting(false);
-                        qd.runCode();
-                        return true;
-                    }
-                    break;
-                }
-                case "c":
-                case "code":
-                {
-                    if(arg.length >= 2 && p != null)
-                    {
-                        Script qd = KajetansMod.scripts.getQuestData(p);
-                        if(qd == null)
-                        {
-                            m.send(cs, "Du hast gerade keine Quest.");
-                            return true;
-                        }
-                        qd.runCodeLine(ChatManager.colorMessage(Utils.connectSpaces(arg, 1), p), cs);
-                        return true;
-                    }
-                    break;
-                }
-                case "p":
-                case "printvars":
-                {
-                    if(p != null)
-                    {
-                        Script qd = KajetansMod.scripts.getQuestData(p);
-                        if(qd == null)
-                        {
-                            m.send(cs, "Du hast gerade keine Quest.");
-                            return true;
-                        }
-                        cs.sendMessage(new TextComponentString(GlobalText.Spacer()));
-                        qd.getVars().entrySet().stream().filter(e -> arg.length < 2 || 
-                                (e.getKey().startsWith(arg[1]))).forEach(e -> 
-                        {
-                            m.send(cs, e.getKey() + " = " + e.getValue());
-                        });                   
-                        return true; 
-                    }
-                    break;
-                }
-                case "pl":
-                case "printlists":
-                {
-                    if(p != null)
-                    {
-                        Script qd = KajetansMod.scripts.getQuestData(p);
-                        if(qd == null)
-                        {
-                            m.send(cs, "Du hast gerade keine Quest.");
-                            return true;
-                        }
-                        cs.sendMessage(new TextComponentString(GlobalText.Spacer()));
-                        qd.getVars().entrySet().stream()
-                                .filter(e -> e.getValue() instanceof List)
-                                .filter(e -> arg.length < 2 || (e.getKey().startsWith(arg[1])))
-                                .forEach(e -> 
-                        {
-                            m.send(cs, e.getKey());
-                            ((List<Object>) e.getValue()).forEach(l -> m.sendListElement(cs, l.toString()));
-                        });                   
-                        return true; 
-                    }
-                    break;
-                }
-                case "pm":
-                case "printmaps":
-                {
-                    if(p != null)
-                    {
-                        Script qd = KajetansMod.scripts.getQuestData(p);
-                        if(qd == null)
-                        {
-                            m.send(cs, "Du hast gerade keine Quest.");
-                            return true;
-                        }
-                        cs.sendMessage(new TextComponentString(GlobalText.Spacer()));
-                        qd.getVars().entrySet().stream()
-                                .filter(e -> e.getValue() instanceof Map)
-                                .filter(e -> arg.length < 2 || (e.getKey().startsWith(arg[1]))).forEach(e -> 
-                        {
-                            m.send(cs, e.getKey());
-                            ((Map) e.getValue()).forEach((k, v) -> m.sendListElement(cs, k + " | " + v));
-                        });                   
-                        return true; 
-                    }
-                    break;
-                }
-                case "see":
-                {
-                    Collection<Script> quests = KajetansMod.scripts.getQuests();
-                    if(quests.isEmpty())
-                    {
-                        m.send(cs, "Momentan sind keine Quests aktiv.");
-                        return true;
-                    }
-                    m.send(cs, "Folgende Quests sind aktiv:");
-                    quests.forEach(data ->
-                    {
-                        m.sendHelpListElement(cs, data.getName() + " (" + data.getId() + ")", String.join(", ", data.getPlayerNames()));
-                    });
-                    return true;
-                }
-                case "get":
-                {
-                    if(p != null && arg.length >= 2)
-                    {
-                        EntityPlayer affectedPlayer;
-                        try
-                        {
-                            affectedPlayer = Utils.getPlayerByName(arg[1]);                   
-                        }
-                        catch(PlayerNotFoundException ex)
-                        {
-                            m.send(cs, GlobalText.cantFindPlayer(arg[1]));
-                            return true;
-                        }
-                        KajetansMod.scripts.addPlayerToPlayer(p, affectedPlayer); 
-                        return true;
-                    }
-                    break;
-                }
-                case "term":
-                {
-                    KajetansMod.scripts.removeQuests();
-                    m.send(cs, "Alle aktiven Quests wurden beendet.");
-                    return true;
-                }
-                case "stack":
-                {
-                    KajetansMod.scripts.getQuestParser().printStack = !KajetansMod.scripts.getQuestParser().printStack;
-                    if(KajetansMod.scripts.getQuestParser().printStack)
-                    {
-                        m.send(cs, "Exceptions werden nun angezeigt.");
-                        return true;
-                    }
-                    m.send(cs, "Exceptions werden nicht mehr angezeigt.");
-                    return true;
-                }
-            }
-        }
-        
-        m.send(cs, "/quest ...");
-        m.sendHelpListElement(cs, "start <pname> <qn1> [qn2] ...", "Startet eine Quest");
-        m.sendHelpListElement(cs, "variable <name>", "Zeigt den Wert einer Variable");
-        m.sendHelpListElement(cs, "printvars [starts]", "Zeigt alle Variablen");
-        m.sendHelpListElement(cs, "printlists [starts]", "Zeigt alle Listen");
-        m.sendHelpListElement(cs, "printmaps [starts]", "Zeigt alle Maps");
-        m.sendHelpListElement(cs, "next", "Springt in die nächste Codezeile");
-        m.sendHelpListElement(cs, "code <code>", "Führt den angegebenen Code aus");
-        m.sendHelpListElement(cs, "see", "Gibt alle aktiven Quests aus");
-        m.sendHelpListElement(cs, "get <pname>", "Fügt dich der Quest hinzu");
-        m.sendHelpListElement(cs, "term", "Entfernt alle Quests aus dem RAM");
-        m.sendHelpListElement(cs, "stack", "Zeigt Exceptions auf der Konsole");
-        return true;
-    }
-}
-

+ 0 - 40
src/main/java/me/km/snuviscript/CommandQuestInfo.java

@@ -1,40 +0,0 @@
-package me.km.snuviscript;
-
-import me.km.KajetansMod;
-import me.km.api.GlobalText;
-import me.km.api.Module;
-import me.km.api.ModuleCommand;
-import me.km.permissions.Permissions;
-import net.minecraft.command.ICommandSender;
-import net.minecraft.entity.player.EntityPlayer;
-
-public class CommandQuestInfo extends ModuleCommand
-{
-    public CommandQuestInfo(Module m) 
-    {
-        super("questinfo", m);
-        super.setDescription("Gibt dir Information über deine Quest");
-        super.setUsage("/questinfo");
-        super.setPermission(Permissions.QUESTINFO);
-    }
-
-    @Override
-    public boolean execute(ICommandSender cs, String[] arg) 
-    {
-        if(!(cs instanceof EntityPlayer))
-        {
-            this.getModule().send(cs, GlobalText.onlyPlayer());
-            return true;
-        }
-        EntityPlayer p = (EntityPlayer) cs;
-        Script data = KajetansMod.scripts.getQuestData(p);
-        if(data == null)
-        {
-            this.getModule().send(cs, "Du hast gerade keine Quest.");
-            return true;
-        }
-        this.getModule().send(cs, data.getInfo());
-        return true;
-    }
-}
-

+ 39 - 37
src/main/java/me/km/snuviscript/CommandScript.java

@@ -4,11 +4,10 @@ import me.km.KajetansMod;
 import me.km.api.GlobalText;
 import me.km.api.Module;
 import me.km.api.ModuleCommand;
-import me.km.api.Utils;
-import me.km.chatmanager.ChatManager;
 import java.util.Collection;
 import java.util.List;
 import java.util.Map;
+import me.hammerle.code.Script;
 import me.km.permissions.Permissions;
 import net.minecraft.command.ICommandSender;
 import net.minecraft.util.text.TextComponentString;
@@ -50,16 +49,16 @@ public class CommandScript extends ModuleCommand
                     {
                         try
                         {
-                            Script qd = KajetansMod.scripts.getScript(Integer.parseInt(arg[1]));
+                            Script qd = KajetansMod.scripts.getSnuviParser().getScript(Integer.parseInt(arg[1]));
                             if(qd == null)
                             {
                                 throw new NumberFormatException();
                             }
-                            m.send(cs, arg[2] + " = " + qd.getVar(arg[2]), 1);
+                            m.send(cs, arg[2] + " = " + qd.getVar(arg[2]));
                         }
                         catch(NumberFormatException ex)
                         {
-                            m.send(cs, "'" + arg[1] + "' ist keine gültige ID.", 1);
+                            m.send(cs, "'" + arg[1] + "' ist keine gültige ID.");
                         }
                         return true;
                     }
@@ -72,30 +71,29 @@ public class CommandScript extends ModuleCommand
                     {
                         try
                         {
-                            Script qd = KajetansMod.scripts.getScript(Integer.parseInt(arg[1]));
+                            Script qd = KajetansMod.scripts.getSnuviParser().getScript(Integer.parseInt(arg[1]));
                             if(qd == null)
                             {
                                 throw new NumberFormatException();
                             }
-                            qd.setIsWaiting(false);
                             qd.runCode();
                         }
                         catch(NumberFormatException ex)
                         {
-                            m.send(cs, "'" + arg[1] + "' ist keine gültige ID.", 1);
+                            m.send(cs, "'" + arg[1] + "' ist keine gültige ID.");
                         } 
                         return true;
                     }
                     break;
                 }
-                case "c":
+                /*case "c":
                 case "code":
                 {
                     if(arg.length >= 3)
                     {
                         try
                         {
-                            Script qd = KajetansMod.scripts.getScript(Integer.parseInt(arg[1]));
+                            Script qd = KajetansMod.scripts.getSnuviParser().getScript(Integer.parseInt(arg[1]));
                             if(qd == null)
                             {
                                 throw new NumberFormatException();
@@ -104,12 +102,12 @@ public class CommandScript extends ModuleCommand
                         }
                         catch(NumberFormatException ex)
                         {
-                            m.send(cs, "'" + arg[1] + "' ist keine gültige ID.", 1);
+                            m.send(cs, "'" + arg[1] + "' ist keine gültige ID.");
                         } 
                         return true;
                     }
                     break;
-                }
+                }*/
                 case "p":
                 case "printvars":
                 {
@@ -117,7 +115,7 @@ public class CommandScript extends ModuleCommand
                     {
                         try
                         {
-                            Script qd = KajetansMod.scripts.getScript(Integer.parseInt(arg[1]));
+                            Script qd = KajetansMod.scripts.getSnuviParser().getScript(Integer.parseInt(arg[1]));
                             if(qd == null)
                             {
                                 throw new NumberFormatException();
@@ -126,12 +124,12 @@ public class CommandScript extends ModuleCommand
                             qd.getVars().entrySet().stream().filter(e -> arg.length < 3 || 
                                 (e.getKey().startsWith(arg[2]))).forEach(e -> 
                             {
-                                m.send(cs, e.getKey() + " = " + e.getValue(), 1);
+                                m.send(cs, e.getKey() + " = " + e.getValue());
                             }); 
                         }
                         catch(NumberFormatException ex)
                         {
-                            m.send(cs, "'" + arg[1] + "' ist keine gültige ID.", 1);
+                            m.send(cs, "'" + arg[1] + "' ist keine gültige ID.");
                         } 
                         return true;
                     }
@@ -144,7 +142,7 @@ public class CommandScript extends ModuleCommand
                     {
                         try
                         {
-                            Script qd = KajetansMod.scripts.getScript(Integer.parseInt(arg[1]));
+                            Script qd = KajetansMod.scripts.getSnuviParser().getScript(Integer.parseInt(arg[1]));
                             if(qd == null)
                             {
                                 throw new NumberFormatException();
@@ -160,7 +158,7 @@ public class CommandScript extends ModuleCommand
                         }
                         catch(NumberFormatException ex)
                         {
-                            m.send(cs, "'" + arg[1] + "' ist keine gültige ID.", 1);
+                            m.send(cs, "'" + arg[1] + "' ist keine gültige ID.");
                         }
                         return true;
                     }
@@ -173,7 +171,7 @@ public class CommandScript extends ModuleCommand
                     {
                         try
                         {
-                            Script qd = KajetansMod.scripts.getScript(Integer.parseInt(arg[1]));
+                            Script qd = KajetansMod.scripts.getSnuviParser().getScript(Integer.parseInt(arg[1]));
                             if(qd == null)
                             {
                                 throw new NumberFormatException();
@@ -189,7 +187,7 @@ public class CommandScript extends ModuleCommand
                         }
                         catch(NumberFormatException ex)
                         {
-                            m.send(cs, "'" + arg[1] + "' ist keine gültige ID.", 1);
+                            m.send(cs, "'" + arg[1] + "' ist keine gültige ID.");
                         }
                         return true;
                     }
@@ -197,16 +195,16 @@ public class CommandScript extends ModuleCommand
                 }
                 case "see":
                 {
-                    Collection<Script> scripts = KajetansMod.scripts.getScripts();
+                    Collection<Script> scripts = KajetansMod.scripts.getSnuviParser().getScripts();
                     if(scripts.isEmpty())
                     {
-                        m.send(cs, "Momentan sind keine Scripts aktiv.", 1);
+                        m.send(cs, "Momentan sind keine Scripts aktiv.");
                         return true;
                     }
-                    m.send(cs, "Folgende Scripts sind aktiv:", 1);
+                    m.send(cs, "Folgende Scripts sind aktiv:");
                     scripts.forEach(data ->
                     {
-                        m.sendHelpListElement(cs, data.getName(), "(" + data.getId() + ")", 1);
+                        m.sendHelpListElement(cs, data.getName(), "(" + data.getId() + ")");
                     });
                     return true;
                 }
@@ -218,20 +216,24 @@ public class CommandScript extends ModuleCommand
                         {
                             if(arg[1].equals("all"))
                             {
-                                KajetansMod.scripts.removeScripts();
-                                m.send(cs, "Alle aktiven Scripts wurden beendet.", 1);
+                                KajetansMod.scripts.getSnuviParser().termAllUnsafe();
+                                m.send(cs, "Alle aktiven Scripts wurden beendet.");
                                 return true;
                             }
-                            Script qd = KajetansMod.scripts.getScript(Integer.parseInt(arg[1]));
-                            if(!KajetansMod.scripts.term(qd))
+                            Script qd = KajetansMod.scripts.getSnuviParser().getScript(Integer.parseInt(arg[1]));
+                            if(!KajetansMod.scripts.getSnuviParser().termUnsafe(qd))
                             {
                                 throw new NumberFormatException();
                             }
-                            m.send(cs, "Das Script '" + qd.getName() + "' wurde beendet.", 1);
+                            m.send(cs, "Das Script '" + qd.getName() + "' wurde beendet.");
                         }
                         catch(NumberFormatException ex)
                         {
-                            m.send(cs, "'" + arg[1] + "' ist keine gültige ID.", 1);
+                            m.send(cs, "'" + arg[1] + "' ist keine gültige ID.");
+                        } 
+                        catch(Exception ex)
+                        {
+                            m.send(cs, "Beim unsicheren Beenden eines Scripts trat ein Fehler auf.");
                         } 
                         return true;
                     }
@@ -240,16 +242,16 @@ public class CommandScript extends ModuleCommand
             }
         }
         
-        m.send(cs, "/script ...", 1);
-        m.sendHelpListElement(cs, "start <script>", "Startet ein Script", 1);
-        m.sendHelpListElement(cs, "variable <id> <name>", "Zeigt den Wert einer Variable", 1);       
-        m.sendHelpListElement(cs, "printvars <id> [starts]", "Zeigt alle Variablen", 1);
+        m.send(cs, "/script ...");
+        m.sendHelpListElement(cs, "start <script>", "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, "next <id>", "Springt in die nächste Codezeile", 1);
-        m.sendHelpListElement(cs, "code <id> <code", "Führt den angegebenen Code aus", 1);
-        m.sendHelpListElement(cs, "see", "Gibt alle aktiven Scripts aus", 1);
-        m.sendHelpListElement(cs, "term <id/all>", "Entfernt Scripts aus dem RAM", 1);
+        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");
+        m.sendHelpListElement(cs, "term <id/all>", "Entfernt Scripts aus dem RAM");
         return true;
     }
 }

+ 1483 - 0
src/main/java/me/km/snuviscript/MinecraftFunctions.java

@@ -0,0 +1,1483 @@
+package me.km.snuviscript;
+
+import me.km.KajetansMod;
+import me.km.afk.AfkListener;
+import me.km.api.Module;
+import me.km.api.Utils;
+import me.km.environment.EnvironmentAPI;
+import me.km.exception.EntityNotFoundException;
+import me.km.exception.IllegalItemStackStringException;
+import me.km.exception.IllegalStringLocationException;
+import me.km.exception.PlayerNotFoundException;
+import me.km.nms.NmsUtilities;
+import me.km.plots.ProtectionBank;
+import me.km.table.TableAPI;
+import java.time.ZonedDateTime;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Calendar;
+import java.util.GregorianCalendar;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+import java.util.function.Consumer;
+import java.util.stream.Collectors;
+import me.hammerle.code.ISnuviLogger;
+import me.hammerle.code.Script;
+import me.hammerle.code.ScriptUtils;
+import me.hammerle.exceptions.SnuviException;
+import me.km.api.Location;
+import me.km.api.TitleAPI;
+import me.km.dimensions.ModDimensions;
+import me.km.effects.EffectUtils;
+import me.km.inventory.InventoryUtils;
+import me.km.permissions.Permissions;
+import me.km.table.Table;
+import me.km.utils.ItemStackUtils;
+import me.km.utils.RecipeUtils;
+import me.km.utils.ReflectionUtils;
+import me.km.utils.SpecialBlockUtils;
+import net.minecraft.block.Block;
+import net.minecraft.block.BlockDoor;
+import net.minecraft.block.state.IBlockState;
+import net.minecraft.command.ICommandSender;
+import net.minecraft.enchantment.Enchantment;
+import net.minecraft.enchantment.EnchantmentHelper;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.EntityHanging;
+import net.minecraft.entity.EntityLiving;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.item.EntityArmorStand;
+import net.minecraft.entity.item.EntityItemFrame;
+import net.minecraft.entity.monster.EntityCreeper;
+import net.minecraft.entity.passive.EntityVillager;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.entity.projectile.EntityPotion;
+import net.minecraft.inventory.EntityEquipmentSlot;
+import net.minecraft.inventory.IInventory;
+import net.minecraft.item.ItemStack;
+import net.minecraft.network.ThreadQuickExitException;
+import net.minecraft.network.play.client.CPacketChatMessage;
+import net.minecraft.network.play.client.CPacketClientStatus;
+import net.minecraft.network.play.server.SPacketSpawnPosition;
+import net.minecraft.potion.Potion;
+import net.minecraft.potion.PotionUtils;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.tileentity.TileEntityChest;
+import net.minecraft.tileentity.TileEntitySign;
+import net.minecraft.util.DamageSource;
+import net.minecraft.util.EnumFacing;
+import net.minecraft.util.EnumParticleTypes;
+import net.minecraft.util.ResourceLocation;
+import net.minecraft.util.SoundCategory;
+import net.minecraft.util.SoundEvent;
+import net.minecraft.util.math.BlockPos;
+import net.minecraft.util.math.Vec3d;
+import net.minecraft.util.text.TextComponentString;
+import net.minecraft.world.World;
+import net.minecraft.world.WorldServer;
+import me.hammerle.exceptions.PrescriptException;
+import me.hammerle.exceptions.IllegalStringException;
+import me.hammerle.code.SnuviParser;
+import me.hammerle.exceptions.HoldCodeException;
+import net.minecraft.util.math.MathHelper;
+
+public class MinecraftFunctions implements ISnuviLogger
+{
+    @SuppressWarnings("")
+    public static void registerFunctions(SnuviParser parser)
+    {
+        // -------------------------------------------------------------
+        // Command-Bibliothek  
+        // -------------------------------------------------------------
+        parser.registerConsumer("command.add", (args, qd) -> 
+                KajetansMod.scripts.registerScriptCommand(args[0].toString()));
+        parser.registerConsumer("command.remove", (args, qd) -> 
+                KajetansMod.scripts.unregisterScriptCommand(args[0].toString()));
+        parser.registerFunction("command.exists", (args, qd) -> 
+                KajetansMod.scripts.isRegisteredScriptCommand(args[0].toString()));
+        parser.registerConsumer("command.clear", (args, qd) -> 
+                KajetansMod.scripts.clearScriptCommands());
+        
+        // -------------------------------------------------------------
+        // Permission-Bibliothek  
+        // -------------------------------------------------------------
+        parser.registerConsumer("perm.clear", (args, qd) -> 
+                KajetansMod.perms.clear());
+        parser.registerConsumer("perm.registergroup", (args, qd) -> 
+                KajetansMod.perms.registerGroupPermission(ScriptUtils.getInt(args[0]), args[1].toString()));
+        parser.registerConsumer("perm.registerplayer", (args, qd) -> 
+                KajetansMod.perms.registerPlayerGroup(UUID.fromString(args[0].toString()), ScriptUtils.getInt(args[1])));
+        
+        // -------------------------------------------------------------
+        // Title-Bibliothek  
+        // -------------------------------------------------------------
+        parser.registerConsumer("title.settime", (args, qd) -> 
+                TitleAPI.setTitleTime((EntityPlayerMP) args[0], ScriptUtils.getInt(args[1]), ScriptUtils.getInt(args[2]), ScriptUtils.getInt(args[3])));
+        parser.registerConsumer("title.clear", (args, qd) -> 
+                TitleAPI.clearTitle((EntityPlayerMP) args[0]));
+        parser.registerConsumer("title.reset", (args, qd) -> 
+                TitleAPI.resetTitle((EntityPlayerMP) args[0]));
+        parser.registerConsumer("title.send", (args, qd) -> 
+                TitleAPI.setTitle((EntityPlayerMP) args[0], ScriptUtils.connect(args, 1)));
+        parser.registerConsumer("title.setsub", (args, qd) -> 
+                TitleAPI.setSubTitle((EntityPlayerMP) args[0], ScriptUtils.connect(args, 1)));
+        
+        // -------------------------------------------------------------
+        // Villager-Bibliothek  
+        // -------------------------------------------------------------
+        parser.registerConsumer("villager.showtrades", (args, qd) -> 
+                ((EntityPlayer) args[0]).displayVillagerTradeGui(((EntityVillager) args[1])));
+       
+        // -------------------------------------------------------------    
+        // Player-Bibliothek
+        // -------------------------------------------------------------  
+        parser.registerFunction("player.getitemamount", (args, qd) ->       
+                InventoryUtils.searchInventoryFor(((EntityPlayer) args[0]).inventory, (ItemStack) args[2], (boolean) args[1]));                
+        parser.registerFunction("player.removeitem", (args, qd) -> 
+                removeItem(args));                 
+        parser.registerFunction("player.giveitem", (args, qd) ->       
+                giveItem(args));
+        parser.registerConsumer("player.shootprojectile", (args, qd) -> 
+                EffectUtils.launchProjectile((EntityPlayer) args[0], getClass(args[1].toString()), ScriptUtils.getDouble(args[2]), args[3]));
+        parser.registerConsumer("player.respawn", (args, qd) ->
+                respawnPlayer(args));
+        parser.registerConsumer("player.inventorytolist", (args, qd) -> 
+                qd.setVar(args[0].toString(), ((EntityPlayer) args[1]).inventory.mainInventory));    
+        parser.registerFunction("player.getnearest", (args, qd) ->                            
+                Utils.getNearestPlayer(((Location) args[0]).getWorld(), ((Location) args[0]).getPos())); 
+        parser.registerConsumer("player.say", (args, qd) ->
+                playerSay(args));
+        parser.registerFunction("player.isafk", (args, qd) -> 
+                KajetansMod.afkManager.getEvent(AfkListener.class).isAfk(((EntityPlayer) args[0])));
+        parser.registerConsumer("player.speak", (args, qd) -> 
+                sendMessageToGroup(args[0], qd, "§7[§r" + args[1] + "§7] " + ScriptUtils.connect(args, 2)));
+        parser.registerConsumer("player.setcompass", (args, qd) -> 
+                ((EntityPlayerMP) args[0]).connection.sendPacket(new SPacketSpawnPosition(((Location) args[1]).getBlockPos()))); 
+        parser.registerFunction("player.gethunger", (args, qd) -> 
+                ((EntityPlayer) args[0]).getFoodStats().getFoodLevel());
+        parser.registerConsumer("player.sethunger", (args, qd) -> 
+                ((EntityPlayer) args[0]).getFoodStats().setFoodLevel(ScriptUtils.getInt(args[1])));
+        parser.registerFunction("player.getsaturation", (args, qd) -> 
+                ReflectionUtils.getSaturation(((EntityPlayer) args[0]).getFoodStats()));
+        parser.registerConsumer("player.setsaturation", (args, qd) -> 
+                ReflectionUtils.setSaturation(((EntityPlayer) args[0]).getFoodStats(), ScriptUtils.getFloat(args[1])));
+        parser.registerFunction("player.getname", (args, qd) -> 
+                getName(args));
+        parser.registerFunction("player.getfullname", (args, qd) -> 
+                KajetansMod.chatManager.getFullName((EntityPlayer) args[0]));
+        parser.registerFunction("player.getuuid", (args, qd) -> 
+                getUuid(args));
+        parser.registerFunction("player.getip", (args, qd) -> 
+                ((EntityPlayerMP) args[0]).connection.netManager.getRemoteAddress().toString());
+        parser.registerFunction("player.iscreative", (args, qd) -> 
+                ((EntityPlayer) args[0]).isCreative());
+        parser.registerFunction("player.isspectator", (args, qd) -> 
+                ((EntityPlayer) args[0]).isSpectator());
+        parser.registerFunction("player.issurvival", (args, qd) -> 
+                !((EntityPlayer) args[0]).isCreative() && !((EntityPlayer) args[0]).isSpectator());
+        parser.registerFunction("player.isadventure", (args, qd) -> 
+                !((EntityPlayer) args[0]).capabilities.allowEdit);
+        parser.registerFunction("player.hasfly", (args, qd) -> 
+                ((EntityPlayer) args[0]).capabilities.allowFlying);
+        parser.registerFunction("player.getlastdamager", (args, qd) -> 
+                getLastDamager(args));
+        parser.registerConsumer("player.settag", (args, qd) -> 
+                setTag(args));
+        parser.registerFunction("player.gettag", (args, qd) -> 
+                getTag(args));
+        parser.registerConsumer("player.dropinventory", (args, qd) -> 
+                dropInventory(args));
+        parser.registerFunction("player.gettarget", (args, qd) -> 
+                Utils.getPlayerTarget((EntityPlayer) args[0], ScriptUtils.getInt(args[1])));
+        parser.registerFunction("player.hasquest", (args, qd) ->     
+                KajetansMod.scripts.hasScript((EntityPlayer) args[0]));
+        parser.registerConsumer("player.action", (args, qd) ->     
+                sendToActionBar(args, qd)); 
+        parser.registerConsumer("player.kick", (args, qd) -> 
+                kickPlayerFromQuest(args, qd));  
+        parser.registerConsumer("player.playsound", (args, qd) -> 
+                playSoundPlayer(args));
+        parser.registerFunction("player.getbedspawn", (args, qd) ->  
+                getBedLocation(args));
+        parser.registerConsumer("player.setbedspawn", (args, qd) ->     
+                ((EntityPlayer) args[0]).bedLocation = ((Location) args[1]).getBlockPos());
+        parser.registerConsumer("player.damageitem", (args, qd) ->   
+                ((EntityPlayer) args[0]).getHeldItemMainhand().damageItem(ScriptUtils.getInt(args[1]), (EntityPlayer) args[0]));
+
+        // -------------------------------------------------------------    
+        // Players-Bibliothek
+        // ------------------------------------------------------------- 
+        parser.registerFunction("players.getamount", (args, qd) ->                            
+                KajetansMod.server.getCurrentPlayerCount());
+        parser.registerConsumer("players.tolist", (args, qd) ->     
+                qd.setVar(args[0].toString(), Arrays.asList(KajetansMod.server.getOnlinePlayerNames())));    
+        parser.registerConsumer("players.toworldlist", (args, qd) ->     
+                qd.setVar(args[0].toString(), new ArrayList(ModDimensions.getWorldFromName(args[1].toString()).playerEntities)));
+        parser.registerConsumer("players.near", (args, qd) ->     
+                qd.setVar(args[0].toString(), Utils.getNearbyEntities(((Location) args[1]).getWorld(), ((Location) args[1]).getPos(), ScriptUtils.getDouble(args[2]), EntityPlayer.class).stream().map(p -> p.getName()).collect(Collectors.toList()))); 
+
+        // -------------------------------------------------------------    
+        // Rank-Bibliothek
+        // -------------------------------------------------------------  
+        parser.registerConsumer("rank.get", (args, qd) -> 
+                qd.setVar(args[0].toString(), KajetansMod.chatManager.getRanks((EntityPlayer) args[1])));
+        parser.registerConsumer("rank.register", (args, qd) -> 
+                KajetansMod.chatManager.registerRank(args[0].toString(), ScriptUtils.getInt(args[1]), args[2].toString()));
+        parser.registerConsumer("rank.player", (args, qd) -> 
+                KajetansMod.chatManager.registerPlayerRank(UUID.fromString(args[0].toString()), args[1].toString()));
+        parser.registerConsumer("rank.clear", (args, qd) -> 
+                KajetansMod.chatManager.clearRanks());
+        
+        // -------------------------------------------------------------    
+        // Custom-Bibliothek
+        // -------------------------------------------------------------
+        parser.registerConsumer("custom.registershapelessrecipe", (args, qd) -> 
+                registerShapelessRecipe(args));
+        parser.registerConsumer("custom.registershapedrecipe", (args, qd) -> 
+                registerShapedRecipe(args));
+        parser.registerConsumer("custom.registerfurnacerecipe", (args, qd) ->
+                RecipeUtils.registerFurnaceRecipe((ItemStack) args[0], (ItemStack) args[1]));
+        parser.registerConsumer("custom.clearrecipes", (args, qd) ->
+                RecipeUtils.clearRecipes());
+        
+        
+        // -------------------------------------------------------------    
+        // World-Bibliothek
+        // -------------------------------------------------------------
+        
+        parser.registerAlias("world.getplayers", "players.toworldlist");
+        parser.registerConsumer("world.setskills", (args, qd) ->     
+                KajetansMod.worldManager.getWorldPreferences(ModDimensions.getWorldFromName(args[0].toString())).skills = (boolean) args[1]);
+        parser.registerConsumer("world.setblockprotections", (args, qd) ->     
+                KajetansMod.worldManager.getWorldPreferences(ModDimensions.getWorldFromName(args[0].toString())).blockProtection = (boolean) args[1]);
+        parser.registerConsumer("world.setdefaultenchanting", (args, qd) ->     
+                KajetansMod.worldManager.getWorldPreferences(ModDimensions.getWorldFromName(args[0].toString())).defaultEnchanting = (boolean) args[1]);
+        parser.registerConsumer("world.setpvpprotection", (args, qd) ->     
+                KajetansMod.worldManager.getWorldPreferences(ModDimensions.getWorldFromName(args[0].toString())).pvpProtection = (boolean) args[1]);
+        parser.registerConsumer("world.setstatuseffects", (args, qd) ->     
+                KajetansMod.worldManager.getWorldPreferences(ModDimensions.getWorldFromName(args[0].toString())).statusEffects = (boolean) args[1]);
+        parser.registerConsumer("world.setmanabar", (args, qd) ->     
+                KajetansMod.worldManager.getWorldPreferences(ModDimensions.getWorldFromName(args[0].toString())).manabar = (boolean) args[1]);
+        parser.registerConsumer("world.setscrolls", (args, qd) ->     
+                KajetansMod.worldManager.getWorldPreferences(ModDimensions.getWorldFromName(args[0].toString())).scrolls = (boolean) args[1]);
+        parser.registerConsumer("world.setdefaultproducing", (args, qd) ->     
+                KajetansMod.worldManager.getWorldPreferences(ModDimensions.getWorldFromName(args[0].toString())).defaultProducing = (boolean) args[1]);
+      
+        // -------------------------------------------------------------    
+        // Item-Bibliothek   
+        // -------------------------------------------------------------   
+        parser.registerConsumer("item.drop", (args, qd) ->       
+                dropItem(args));                              
+        parser.registerFunction("item.gettype", (args, qd) ->    
+                ((ItemStack) args[0]).getItem().getRegistryName().toString());
+        parser.registerFunction("item.getdata", (args, qd) ->    
+                ((ItemStack) args[0]).getMetadata());           
+        parser.registerConsumer("item.setdata", (args, qd) ->    
+                ((ItemStack) args[0]).setItemDamage(ScriptUtils.getInt(args[1])));
+        parser.registerFunction("item.getamount", (args, qd) ->    
+                ((ItemStack) args[0]).getCount()); 
+        parser.registerConsumer("item.setamount", (args, qd) ->   
+                ((ItemStack) args[0]).setCount(ScriptUtils.getInt(args[1])));   
+        parser.registerFunction("item.getname", (args, qd) ->    
+                ((ItemStack) args[0]).getDisplayName());
+        parser.registerConsumer("item.setname", (args, qd) ->   
+                ((ItemStack) args[0]).setStackDisplayName(ScriptUtils.connect(args, 1)));
+        parser.registerConsumer("item.getlore", (args, qd) ->    
+                qd.setVar(args[0].toString(), ItemStackUtils.getLore((ItemStack) args[1])));
+        parser.registerConsumer("item.setlore", (args, qd) ->   
+                ItemStackUtils.setLore((ItemStack) args[0], (List<String>) args[1]));
+        parser.registerConsumer("item.addlore", (args, qd) ->   
+                ItemStackUtils.addLore((ItemStack) args[0], ScriptUtils.connect(args, 2), ScriptUtils.getInt(args[1])));
+        parser.registerFunction("item.getenchantlevel", (args, qd) ->   
+                EnchantmentHelper.getEnchantmentLevel(Enchantment.getEnchantmentByLocation(args[1].toString()), (ItemStack) args[0]));
+        parser.registerConsumer("item.setcooldown", (args, qd) ->   
+                ((EntityPlayer) args[0]).getCooldownTracker().setCooldown(((ItemStack) args[1]).getItem(), ScriptUtils.getInt(args[2])));
+        parser.registerFunction("item.gettooltype", (args, qd) ->   
+                Utils.getToolType((ItemStack) args[0]));
+
+        // -------------------------------------------------------------    
+        // Location-Bibliothek
+        // -------------------------------------------------------------  
+        parser.registerFunction("loc.distance", (args, qd) -> 
+                ((Location) args[0]).getPos().distanceTo(((Location) args[1]).getPos()));  
+        parser.registerConsumer("loc.setyaw", (args, qd) -> 
+                ((Location) args[0]).setYaw(ScriptUtils.getFloat(args[1])));  
+        parser.registerConsumer("loc.setpitch", (args, qd) -> 
+                ((Location) args[0]).setPitch(ScriptUtils.getFloat(args[1])));  
+        parser.registerFunction("loc.mod", (args, qd) -> 
+                ((Location) args[0]).copyAdd(ScriptUtils.getDouble(args[1]), ScriptUtils.getDouble(args[2]), ScriptUtils.getDouble(args[3])));
+        parser.registerFunction("loc.getcoord", (args, qd) -> 
+                getCoordOfLocation(args));
+        parser.registerFunction("loc.gettime", (args, qd) -> 
+                ((Long) ((Location) args[0]).getWorld().getWorldTime()).doubleValue());
+        parser.registerFunction("loc.hasstorm", (args, qd) -> 
+                ((Location) args[0]).getWorld().isRaining());
+        parser.registerFunction("loc.isbetween", (args, qd) -> 
+                isBetween(args));
+
+        // -------------------------------------------------------------    
+        // Block-Bibliothek
+        // -------------------------------------------------------------    
+        parser.registerFunction("block.gettype", (args, qd) -> 
+                ((Location) args[0]).getWorld().getBlockState(((Location) args[0]).getBlockPos()).getBlock().getRegistryName().toString());
+        parser.registerFunction("block.getdata", (args, qd) -> 
+                (double) getBlockData((Location) args[0]));
+        parser.registerConsumer("block.clone", (args, qd) -> 
+                cloneBlock(args));
+        parser.registerConsumer("block.set", (args, qd) -> 
+                setBlock(args, qd));
+        parser.registerConsumer("block.set2", (args, qd) -> 
+                setBlockWithData(args, qd));
+        parser.registerConsumer("block.setsign", (args, qd) -> 
+                setSign(args));
+        parser.registerFunction("block.getsign", (args, qd) -> 
+                getSign(args));
+        parser.registerConsumer("block.setdoorstatus", (args, qd) -> 
+                setDoorStatus(args));
+        parser.registerFunction("block.getdoorstatus", (args, qd) -> 
+                getDoorStatus(args));
+        parser.registerFunction("block.isdoor", (args, qd) -> 
+                isDoor(args));
+        parser.registerFunction("block.issolid", (args, qd) -> 
+                isSolid(args));
+        parser.registerFunction("block.tostack", (args, qd) -> 
+                getStackFromBlock((Location) args[0]));
+        parser.registerFunction("block.getitemamount", (args, qd) -> 
+                getItemAmountChest(args));
+        parser.registerFunction("block.additem", (args, qd) -> 
+                addItemAmountChest(args));
+        parser.registerFunction("block.subitem", (args, qd) -> 
+                removeItemAmountChest(args));  
+
+        // -------------------------------------------------------------    
+        // Event-Bibliothek 
+        // -------------------------------------------------------------  
+        parser.registerConsumer("event.addloc", (args, qd) -> 
+                ((MinecraftScript) qd).addLocation((Location) args[0]));
+        parser.registerConsumer("event.removeloc", (args, qd) -> 
+                ((MinecraftScript) qd).removeLocation((Location) args[0]));
+        parser.registerConsumer("event.clearlocs", (args, qd) -> 
+                ((MinecraftScript) qd).clearLocations());
+
+        // -------------------------------------------------------------    
+        // Skill-Bibliothek 
+        // ------------------------------------------------------------- 
+        parser.registerConsumer("skill.register", (args, qd) -> 
+                KajetansMod.skills.registerSkill(ScriptUtils.getInt(args[0]), (ItemStack) args[1], me.km.effects.Effect.valueOf(args[2].toString()), args[3].toString(), args[4].toString()));
+        parser.registerConsumer("skill.clear", (args, qd) -> 
+                KajetansMod.skills.clearSkills());
+        
+        // -------------------------------------------------------------    
+        // Job-Bibliothek 
+        // -------------------------------------------------------------  
+        parser.registerFunction("job.getlevel", (args, qd) -> 
+                KajetansMod.jobs.getLevel((EntityPlayer) args[0], ScriptUtils.getByte(args[1])));
+        parser.registerConsumer("job.addlevel", (args, qd) -> 
+                KajetansMod.jobs.addLevel((EntityPlayer) args[0], ScriptUtils.getByte(args[1]), ScriptUtils.getByte(args[2])));
+        parser.registerConsumer("job.setlevel", (args, qd) -> 
+                KajetansMod.jobs.setLevel((EntityPlayer) args[0], ScriptUtils.getByte(args[1]), ScriptUtils.getByte(args[2])));
+        parser.registerFunction("job.getxp", (args, qd) -> 
+                KajetansMod.jobs.getXP((EntityPlayer) args[0], ScriptUtils.getByte(args[1])));
+        parser.registerConsumer("job.addxp", (args, qd) -> 
+                KajetansMod.jobs.addXP((EntityPlayer) args[0], ScriptUtils.getByte(args[1]), ScriptUtils.getByte(args[2])));
+        parser.registerConsumer("job.setxp", (args, qd) -> 
+                KajetansMod.jobs.setXP((EntityPlayer) args[0], ScriptUtils.getByte(args[1]), ScriptUtils.getByte(args[2])));
+        parser.registerConsumer("job.registerjob", (args, qd) -> 
+                KajetansMod.jobs.registerJob(ScriptUtils.getByte(args[0]), ScriptUtils.connect(args, 1)));
+        parser.registerConsumer("job.registerrecipe", (args, qd) -> 
+                KajetansMod.jobs.registerRecipe(ScriptUtils.getByte(args[0]), ScriptHelper.getItem(args[1].toString()), ScriptUtils.getByte(args[2])));
+        parser.registerConsumer("job.registermaterial", (args, qd) -> 
+                KajetansMod.jobs.registerPreferedBlock(ScriptUtils.getByte(args[0]), Block.getBlockFromName(args[1].toString())));
+        parser.registerConsumer("job.registerskill", (args, qd) -> 
+                KajetansMod.jobs.registerSkill(ScriptUtils.getByte(args[0]), KajetansMod.skills.getSkill(ScriptUtils.getInt(args[1])), ScriptUtils.getByte(args[2]), ScriptUtils.getByte(args[3])));
+        parser.registerFunction("job.getamount", (args, qd) -> 
+                KajetansMod.jobs.getNumberOfJobs());
+        parser.registerFunction("job.getname", (args, qd) -> 
+                KajetansMod.jobs.getJobName(ScriptUtils.getByte(args[0])));
+        parser.registerFunction("job.geteffectlevel", (args, qd) -> 
+                EffectUtils.getEffectLevel((EntityPlayer) args[0], me.km.effects.Effect.valueOf(args[1].toString())));
+        parser.registerFunction("job.hasjob", (args, qd) -> 
+                KajetansMod.jobs.hasJob((EntityPlayer) args[0], ScriptUtils.getByte(args[1])));
+        parser.registerFunction("job.hasrecipe", (args, qd) -> 
+                KajetansMod.jobs.hasRecipe((EntityPlayer) args[0], ScriptHelper.getItem(args[1].toString())));
+        parser.registerConsumer("job.getjobs", (args, qd) -> 
+                qd.setVar(args[0].toString(), KajetansMod.jobs.getJobs((EntityPlayer) args[1])));
+        parser.registerFunction("job.isregmaterial", (args, qd) -> 
+                KajetansMod.jobs.isPreferedMaterial((EntityPlayer) args[0],Block.getBlockFromName(args[1].toString())));
+        parser.registerConsumer("job.setjob", (args, qd) -> 
+                KajetansMod.jobs.setJob((EntityPlayer) args[0], ScriptUtils.getByte(args[1]), (boolean) args[2])); 
+        parser.registerConsumer("job.reset", (args, qd) -> 
+                KajetansMod.jobs.resetAll());  
+
+        // -------------------------------------------------------------    
+        // Entity - Befehle
+        // -------------------------------------------------------------  
+        parser.registerFunction("entity.getlocation", (args, qd) -> 
+                new Location(((Entity) args[0])));   
+        parser.registerConsumer("entity.damage", (args, qd) -> 
+                damageEntity(args));  
+        parser.registerFunction("entity.gethealth", (args, qd) -> 
+                ((EntityLivingBase) args[0]).getHealth());     
+        parser.registerConsumer("entity.sethealth", (args, qd) -> 
+                ((EntityLivingBase) args[0]).setHealth(ScriptUtils.getFloat(args[1])));  
+        parser.registerConsumer("entity.setname", (args, qd) -> 
+                nameEntity(args)); 
+        parser.registerConsumer("entity.throw", (args, qd) -> 
+                Utils.setVelocity((Entity) args[0], ScriptUtils.getDouble(args[1]), ScriptUtils.getDouble(args[2]), ScriptUtils.getDouble(args[3])));
+        parser.registerConsumer("entity.teleport", (args, qd) -> 
+                Utils.teleportEntity((Entity) args[0], (Location) args[1]));  
+        parser.registerConsumer("entity.setequip", (args, qd) -> 
+                setEntityEquip(args)); 
+        parser.registerFunction("entity.getequip", (args, qd) -> 
+                getEntityEquip(args));
+        parser.registerConsumer("entity.removeall", (args, qd) -> 
+                removeEntities(args));
+        parser.registerConsumer("entity.remove", (args, qd) -> 
+                ((Entity) args[0]).setDead());
+        parser.registerConsumer("entity.setinvulnerable", (args, qd) -> 
+                ((Entity) args[0]).setEntityInvulnerable((boolean) args[1]));
+        parser.registerConsumer("entity.setsilent", (args, qd) -> 
+                ((Entity) args[0]).setSilent((boolean) args[1]));
+        parser.registerConsumer("entity.hide", (args, qd) -> 
+                ((Entity) args[0]).setInvisible(true));
+        parser.registerConsumer("entity.show", (args, qd) -> 
+                ((Entity) args[0]).setInvisible(false));
+        parser.registerConsumer("entity.ride", (args, qd) -> 
+                ((Entity) args[0]).startRiding(((Entity) args[1])));
+        parser.registerConsumer("entity.setvars", (args, qd) -> 
+                ScriptVars.setEntityVars(qd, Utils.getNearestEntity(((Location) args[0]).getWorld(), ((Location) args[0]).getPos(), 3, (Class<? extends Entity>) getClass("net.minecraft.entity." + args[1]))));
+        parser.registerConsumer("entity.addeffect", (args, qd) -> 
+                EffectUtils.addPotionTo((EntityLivingBase) args[0], Potion.getPotionFromResourceLocation(args[1].toString()), ScriptUtils.getInt(args[2]), ScriptUtils.getInt(args[3])));
+        parser.registerFunction("entity.haseffect", (args, qd) -> 
+                ((EntityLivingBase) args[0]).isPotionActive(Potion.getPotionFromResourceLocation(args[1].toString())));
+        parser.registerConsumer("entity.goto", (args, qd) ->
+                NmsUtilities.walkTo((EntityLiving) args[0], ((Location) args[1]).getPos(), ScriptUtils.getDouble(args[2])));
+        parser.registerConsumer("entity.explode", (args, qd) -> 
+                ((EntityCreeper) args[0]).ignite());
+        parser.registerConsumer("entity.spawnitemframe", (args, qd) -> 
+                spawnItemFrame(args));
+        parser.registerFunction("entity.getitemframe", (args, qd) -> 
+                Utils.getNearestEntity(((Location) args[0]).getWorld(), ((Location) args[0]).getPos().addVector(0.5, 0, 0.5), 1, EntityItemFrame.class).getDisplayedItem());
+        parser.registerFunction("entity.getpotiontype", (args, qd) -> 
+                getPotionType(args));
+        parser.registerConsumer("entity.setgravity", (args, qd) -> 
+                ((Entity) args[0]).setNoGravity(!(boolean) args[1]));
+
+        // -------------------------------------------------------------
+        // Status-Bibliothek
+        // -------------------------------------------------------------  
+        parser.registerFunction("status.getmana", (args, qd) -> 
+                (double) EnvironmentAPI.getMana(((EntityPlayer) args[0])));
+        parser.registerFunction("status.getcold", (args, qd) -> 
+                (double) EnvironmentAPI.getCold(((EntityPlayer) args[0])));
+        parser.registerFunction("status.getenergy", (args, qd) -> 
+                (double) EnvironmentAPI.getEnergy(((EntityPlayer) args[0])));
+        parser.registerFunction("status.getthirst", (args, qd) -> 
+                (double) EnvironmentAPI.getThirst(((EntityPlayer) args[0])));
+        parser.registerConsumer("status.changemange", (args, qd) -> 
+                EnvironmentAPI.changeMana(((EntityPlayer) args[0]), ScriptUtils.getInt(args[1])));
+        parser.registerConsumer("status.changecold", (args, qd) -> 
+                EnvironmentAPI.changeCold(((EntityPlayer) args[0]), ScriptUtils.getInt(args[1])));
+        parser.registerConsumer("status.changeenergie", (args, qd) -> 
+                EnvironmentAPI.changeEnergy(((EntityPlayer) args[0]), ScriptUtils.getInt(args[1])));
+        parser.registerConsumer("status.changethirst", (args, qd) -> 
+                EnvironmentAPI.changeThirst(((EntityPlayer) args[0]), ScriptUtils.getInt(args[1])));
+        parser.registerConsumer("status.resetmana", (args, qd) -> 
+                EnvironmentAPI.resetMana(((EntityPlayer) args[0])));
+        parser.registerConsumer("status.resetcold", (args, qd) -> 
+                EnvironmentAPI.resetCold(((EntityPlayer) args[0])));
+        parser.registerConsumer("status.resetenergy", (args, qd) -> 
+                EnvironmentAPI.resetEnergy(((EntityPlayer) args[0])));
+        parser.registerConsumer("status.resetthirst", (args, qd) -> 
+                EnvironmentAPI.resetThirst(((EntityPlayer) args[0])));
+        parser.registerFunction("status.gettemperature", (args, qd) -> 
+                (double) EnvironmentAPI.getTemperature(((Location) args[0]).getWorld(), ((Location) args[0]).getBlockPos()));    
+
+        // -------------------------------------------------------------  
+        // GMap-Bibliothek   
+        // -------------------------------------------------------------  
+        parser.registerConsumer("gmap.removeall", (args, qd) ->    
+                KajetansMod.scripts.getDataBank(ScriptBank.class).removeMap(args[0].toString()));
+        parser.registerConsumer("gmap.add", (args, qd) ->    
+                KajetansMod.scripts.getDataBank(ScriptBank.class).addMapElement(args[0].toString(), args[1].toString(), args[2].toString()));
+        parser.registerConsumer("gmap.remove", (args, qd) ->    
+                KajetansMod.scripts.getDataBank(ScriptBank.class).removeMapElement(args[0].toString(), args[1].toString()));
+        parser.registerConsumer("gmap.totable", (args, qd) ->    
+                qd.setVar(args[0].toString(), KajetansMod.scripts.getDataBank(ScriptBank.class).getGlobalMapAsTable(args[1].toString())));
+        parser.registerFunction("gmap.get", (args, qd) ->    
+                KajetansMod.scripts.getDataBank(ScriptBank.class).getMapValue(args[0].toString(), args[1].toString()));
+        
+        // -------------------------------------------------------------  
+        // GDMap-Bibliothek   
+        // -------------------------------------------------------------  
+        parser.registerConsumer("gdmap.removeall", (args, qd) ->    
+                KajetansMod.scripts.getDataBank(ScriptBank.class).removeDualMap(args[0].toString()));
+        parser.registerConsumer("gdmap.add", (args, qd) ->    
+                KajetansMod.scripts.getDataBank(ScriptBank.class).addDualMapElement(args[0].toString(), args[1].toString(), args[2].toString(), args[3].toString()));
+        parser.registerConsumer("gdmap.remove", (args, qd) ->    
+                KajetansMod.scripts.getDataBank(ScriptBank.class).removeDualMapElement(args[0].toString(), args[1].toString(), args[2].toString()));
+        parser.registerConsumer("gdmap.totable", (args, qd) ->    
+                qd.setVar(args[0].toString(), KajetansMod.scripts.getDataBank(ScriptBank.class).getGlobalDualMapAsTable(args[1].toString(), args[2].toString())));
+        parser.registerFunction("gdmap.get", (args, qd) ->    
+                KajetansMod.scripts.getDataBank(ScriptBank.class).getDualMapValue(args[0].toString(), args[1].toString(), args[2].toString()));
+
+        // -------------------------------------------------------------  
+        // Table-Bibliothek   
+        // -------------------------------------------------------------  
+        parser.registerConsumer("table.print", (args, qd) ->   
+                printTable(args, qd));
+        parser.registerConsumer("table.new", (args, qd) -> 
+                qd.setVar(args[0].toString(), new Table(ScriptUtils.getInt(args[1]))));
+        parser.registerConsumer("table.frommap", (args, qd) -> 
+                qd.setVar(args[0].toString(), new Table((Map<Object, Object>) args[1])));
+        parser.registerConsumer("table.sort", (args, qd) -> 
+                ((Table) args[0]).sort());
+        parser.registerConsumer("table.reverse", (args, qd) -> 
+                ((Table) args[0]).reverse());
+        parser.registerConsumer("table.shuffle", (args, qd) -> 
+                ((Table) args[0]).shuffle());
+        parser.registerConsumer("table.clear", (args, qd) -> 
+                ((Table) args[0]).clear());
+        parser.registerConsumer("table.addrow", (args, qd) -> 
+                ((Table) args[0]).addRow(Arrays.copyOfRange(args, 1, args.length)));
+        parser.registerConsumer("table.removerow", (args, qd) -> 
+                ((Table) args[0]).removeRow(ScriptUtils.getInt(args[1])));
+        parser.registerFunction("table.get", (args, qd) -> 
+                ((Table) args[0]).getElement(ScriptUtils.getInt(args[1]), ScriptUtils.getInt(args[2])));
+        parser.registerFunction("table.getindexof", (args, qd) -> 
+                (double) ((Table) args[0]).getIndexOf(args[1]));
+        parser.registerConsumer("table.setsortcolumn", (args, qd) -> 
+                ((Table) args[0]).setSortColumn(ScriptUtils.getInt(args[1])));
+        parser.registerFunction("table.getsize", (args, qd) -> 
+                (double) ((Table) args[0]).getSize());
+
+        // -------------------------------------------------------------  
+        // Plot-Bibliothek   
+        // -------------------------------------------------------------  
+        parser.registerFunction("plot.hastag", (args, qd) ->    
+                KajetansMod.plots.getDataBank(ProtectionBank.class).hasTag(((Location) args[0]).getWorld(), ((Location) args[0]).getBlockPos(), args[1].toString())); 
+        parser.registerConsumer("plot.add", (args, qd) ->    
+                addPlot(args));
+        parser.registerFunction("plot.getid", (args, qd) ->    
+                KajetansMod.plots.getDataBank(ProtectionBank.class).getFirstRegionId(((Location) args[0]).getWorld(), ((Location) args[0]).getBlockPos()));
+        parser.registerFunction("plot.canbuild", (args, qd) ->    
+                KajetansMod.plots.getDataBank(ProtectionBank.class).canBuild(((Location) args[0]).getWorld(), ((Location) args[0]).getBlockPos(), (EntityPlayer) args[1]));
+        parser.registerFunction("plot.getname", (args, qd) ->    
+                KajetansMod.plots.getDataBank(ProtectionBank.class).getFirstRegionName(((Location) args[0]).getWorld(), ((Location) args[0]).getBlockPos()));
+
+        // -------------------------------------------------------------  
+        // Quest-Bibliothek   
+        // -------------------------------------------------------------    
+        parser.registerConsumer("quest.end", (args, qd) -> 
+                endPlayerScript(args, qd));
+        parser.registerConsumer("quest.playerstolist", (args, qd) ->  
+                qd.setVar(args[0].toString(), new ArrayList<>(((PlayerScript) qd).getPlayers()))); 
+        parser.registerFunction("quest.getplayeramount", (args, qd) ->      
+                ((PlayerScript) qd).getPlayers().size()); 
+        parser.registerConsumer("quest.start", (args, qd) ->  
+                startPlayerScript(args, qd));
+        parser.registerFunction("quest.isactive", (args, qd) ->  
+                KajetansMod.scripts.isActive(args[0].toString()));
+        parser.registerFunction("quest.getleader", (args, qd) -> 
+                getPlayerScriptLeader(qd));
+
+        // -------------------------------------------------------------  
+        // Scoreboard-Bibliothek   
+        // -------------------------------------------------------------  
+        parser.registerConsumer("sb.add", (args, qd) ->  
+                addToScoreBoard(args, qd));
+        parser.registerConsumer("sb.remove", (args, qd) ->  
+                removeFromScoreBoard(args, qd));
+        parser.registerConsumer("sb.reset", (args, qd) ->  
+                doForGroup(args[0], qd, p -> KajetansMod.scoreboard.resetScoreboard((EntityPlayerMP) p)));
+
+        // -------------------------------------------------------------  
+        // Effect-Bibliothek   
+        // ------------------------------------------------------------- 
+        parser.registerConsumer("effect.playsound", (args, qd) -> 
+                playSound(args));
+        parser.registerConsumer("effect.play", (args, qd) -> 
+                playParticle(args));
+
+        // -------------------------------------------------------------  
+        // Inventory-Bibliothek   
+        // -------------------------------------------------------------
+        parser.registerConsumer("inv.new", (args, qd) -> 
+                qd.setVar(args[0].toString(), new SnuviInventory(args[2].toString(), ScriptUtils.getInt(args[1]), ((MinecraftScript) qd).getNewId())));   
+        parser.registerConsumer("inv.loadblock", (args, qd) -> 
+                qd.setVar(args[0].toString(), newInventory((Location) args[1], (MinecraftScript) qd, args[2].toString())));
+        parser.registerConsumer("inv.setitem", (args, qd) -> 
+                ((IInventory) args[0]).setInventorySlotContents(ScriptUtils.getInt(args[1]), (ItemStack) args[2]));
+        parser.registerFunction("inv.getitem", (args, qd) -> 
+                ((IInventory) args[0]).getStackInSlot(ScriptUtils.getInt(args[1])));
+        parser.registerConsumer("inv.open", (args, qd) -> 
+                new ScriptInventoryHolder((SnuviInventory) args[0], (EntityPlayerMP) args[1], (MinecraftScript) qd).openForPlayer((EntityPlayerMP) args[1]));
+        parser.registerConsumer("inv.close", (args, qd) -> 
+                ((EntityPlayer) args[0]).closeScreen());                 
+
+        // -------------------------------------------------------------  
+        // Read-Bibliothek   
+        // -------------------------------------------------------------
+        parser.registerFunction("read.player", (args, qd) -> 
+                Utils.getPlayerByName(args[0].toString()));
+        parser.registerFunction("read.location", (args, qd) -> 
+                new Location(qd, args[0].toString()));
+        parser.registerFunction("read.item", (args, qd) -> 
+                ScriptHelper.getItemStack(args, 0));
+        parser.registerFunction("read.spawnmob", (args, qd) -> 
+                NmsUtilities.getEntityFromNbtString(qd, ScriptUtils.connect(args," ", 1).replace("'", "\""), (Location) args[0]));
+
+        // -------------------------------------------------------------  
+        // Text-Bibliothek   
+        // -------------------------------------------------------------
+        parser.registerFunction("text.location", (args, qd) -> 
+                ((Location) args[0]).toString());
+        parser.registerFunction("text.locationblock", (args, qd) -> 
+                ((Location) args[0]).toBlockString());
+        parser.registerFunction("text.item", (args, qd) -> 
+                ScriptHelper.getItemStackString((ItemStack) args[0]));
+
+        // -------------------------------------------------------------    
+        // Ohne Bibliothek
+        // -------------------------------------------------------------   
+        parser.registerConsumer("overload", (args, qd) -> 
+                qd.overload(ScriptUtils.readCode("scripts/" + args[0].toString(), ".txt")));
+        parser.registerFunction("getglobalvar", (args, qd) ->                    
+                getGlobalVar(args));
+        parser.registerAlias("ggv", "getglobalvar");
+        parser.registerConsumer("setglobalvar", (args, qd) -> 
+                setGlobalVar(args));                          
+        parser.registerAlias("sgv", "setglobalvar");
+        parser.registerConsumer("msg", (args, qd) -> 
+                sendMessageToGroup(args[0], qd, ScriptUtils.connect(args, 1)));       
+        parser.registerFunction("removeformat", (args, qd) -> 
+                ScriptUtils.connect(args, 0).replaceAll("§.", ""));           
+        parser.registerFunction("concatspace", (args, qd) ->                            
+                ScriptUtils.connect(args, " ", 0));     
+        parser.registerFunction("onlyletters", (args, qd) ->                            
+                onlyLetters(ScriptUtils.connect(args, 0)));
+        parser.registerConsumer("command", (args, qd) -> 
+                KajetansMod.server.commandManager.executeCommand(KajetansMod.server, ScriptUtils.connect(args, 0)));
+    }
+    
+    @Override
+    public void printException(SnuviException ex)
+    {
+        if(KajetansMod.debugMode || KajetansMod.scripts.getSnuviParser().printStack)
+        {
+            printConsoleException(ex);
+        }
+        sendToDevsWithSuffix("§cError in '" + ex.getScriptName() + "'");
+        if(ex.getCode() != null)
+        {
+            ArrayList<String> list = ex.getWholeCode();
+            for(int i = 1; i <= list.size(); i++)
+            {
+                sendToDevsWithHelpList("§cZeile " + i + ":", list.get(i - 1));
+            }
+        }
+        if(ex.getLine() != -1)
+        {
+            sendToDevsWithHelpList("§cZeilennummer:", String.valueOf(ex.getLine()));
+        }
+        
+        if(ex.getOriginalException() != null)
+        {
+            Exception another = ex.getOriginalException();
+            if(another.getLocalizedMessage() == null)
+            {
+                sendToDevsWithHelpList("§cFehler:", another.getClass().getSimpleName());
+            }
+            else
+            {
+                sendToDevsWithHelpList("§cFehler:", another.getClass().getSimpleName() + " - " + another.getLocalizedMessage());
+            }
+        }
+        else
+        {
+            sendToDevsWithHelpList("§cFehler:", ex.getClass().getSimpleName());
+            if(ex instanceof PrescriptException)
+            {
+                sendToDevsWithList("§c" + ((PrescriptException) ex).getException());
+                return;
+            }
+        }
+        if(ex instanceof IllegalStringException)
+        {
+            sendToDevsWithHelpList("§cUngültiger Wert:", ((IllegalStringException) ex).getBadString());
+        }
+    }
+    
+    public void printConsoleException(SnuviException ex)
+    {
+        Module m = KajetansMod.scripts;
+        m.sendWarningToConsole("Error in '" + ex.getScriptName() + "'");
+        if(ex.getCode() != null)
+        {
+            ArrayList<String> list = ex.getWholeCode();
+            for(int i = 1; i <= list.size(); i++)
+            {
+                m.sendWarningToConsole("Zeile " + i + ": " + list.get(i - 1));
+            }
+        }
+        if(ex.getLine() != -1)
+        {
+            m.sendWarningToConsole("Zeilennummer: " + ex.getLine());
+        }
+        
+        if(ex.getOriginalException() != null)
+        {
+            Exception another = ex.getOriginalException();
+            if(another.getLocalizedMessage() == null)
+            {
+                m.sendWarningToConsole("Fehler: " + another.getClass().getSimpleName());
+            }
+            else
+            {
+                m.sendWarningToConsole("Fehler: " + another.getClass().getSimpleName() + " - " + another.getLocalizedMessage());
+            }
+        }
+        else
+        {
+            m.sendWarningToConsole("Fehler: " + ex.getClass().getSimpleName());
+            if(ex instanceof PrescriptException)
+            {
+                m.sendWarningToConsole(((PrescriptException) ex).getException());
+                return;
+            }
+        }
+        if(ex instanceof IllegalStringException)
+        {
+            m.sendWarningToConsole("Ungültiger Wert: " + ((IllegalStringException) ex).getBadString());
+        }
+    }
+    
+    private static void printTable(Object[] args, Script sc)
+    {
+        Table t = (Table) args[1];
+        if(t.getSize() >= 60)
+        {
+            throw new IllegalArgumentException("table is too big");
+        }
+        TableAPI.getTable(t, ScriptUtils.getInt(args[2]), args[3].toString(), 
+                args.length >= 5 ? (boolean) args[4] : false)
+                .forEach(s -> sendMessageToGroup(args[0], sc, s));
+    }
+    
+    private static Location getBedLocation(Object[] args)
+    {
+        WorldServer ws = ModDimensions.getWorldFromName(args[1].toString());
+        return new Location(ws, ((EntityPlayer) args[0]).getBedLocation(ws.provider.getDimension()));
+    }
+    
+    private static boolean isDoor(Object[] args)
+    {
+        Location l = (Location) args[0];
+        return l.getWorld().getBlockState(l.getBlockPos()).getBlock() instanceof BlockDoor;
+    }
+    
+    private static boolean getDoorStatus(Object[] args)
+    {
+        Location l = (Location) args[0];
+        return BlockDoor.isOpen(l.getWorld(), l.getBlockPos());
+    }
+    
+    private static void setDoorStatus(Object[] args)
+    {
+        Location l = (Location) args[0];
+        BlockPos pos = l.getBlockPos();
+        ((BlockDoor) l.getWorld().getBlockState(pos).getBlock()).toggleDoor(l.getWorld(), pos, (boolean) args[1]);
+    }
+    
+    private static void playerSay(Object[] args)
+    {
+        try
+        {
+            ((EntityPlayerMP) args[0]).connection.processChatMessage(new CPacketChatMessage(ScriptUtils.connect(args, 1)));
+        }
+        catch(ThreadQuickExitException ex)
+        {
+            // Minecraft needs this for canceling and queueing into main thread
+        }
+    }
+    
+    private static void respawnPlayer(Object[] args)
+    {
+        try
+        {
+            ((EntityPlayerMP) args[0]).connection.processClientStatus(new CPacketClientStatus(CPacketClientStatus.State.PERFORM_RESPAWN));
+        }
+        catch(ThreadQuickExitException ex)
+        {
+            // Minecraft needs this for canceling and queueing into main thread
+        }
+    }
+    
+    private static Class getClass(String s)
+    {
+        try
+        {
+            return Class.forName(s);
+        }
+        catch(ClassNotFoundException ex)
+        {
+            throw new IllegalStringException(s);
+        }
+    }
+    
+    private static int getItemAmountChest(Object[] args) throws IllegalStringLocationException, IllegalItemStackStringException
+    {       
+        Location l = (Location) args[0];
+        TileEntity te = l.getWorld().getTileEntity(l.getBlockPos());
+        if(te == null || !(te instanceof TileEntityChest))
+        {
+            return 0;
+        }        
+        return InventoryUtils.searchInventoryFor(((TileEntityChest) te), (ItemStack) args[2], (boolean) args[1]);
+    }
+    
+    private static ItemStack addItemAmountChest(Object[] args) throws IllegalStringLocationException, IllegalItemStackStringException
+    {       
+        Location l = (Location) args[0];
+        ItemStack stack = ((ItemStack) args[1]);
+        TileEntity te = l.getWorld().getTileEntity(l.getBlockPos());
+        if(te == null || !(te instanceof TileEntityChest))
+        {
+            return stack;
+        }        
+        stack.setCount(InventoryUtils.addToInventory((TileEntityChest) te, stack));  
+        return stack;
+    }
+    
+    private static ItemStack removeItemAmountChest(Object[] args) throws IllegalStringLocationException, IllegalItemStackStringException
+    {       
+        Location l = (Location) args[0];
+        ItemStack stack = ((ItemStack) args[1]);
+        TileEntity te = l.getWorld().getTileEntity(l.getBlockPos());
+        if(te == null || !(te instanceof TileEntityChest))
+        {
+            return stack;
+        }        
+        stack.setCount(InventoryUtils.removeFromInventory((TileEntityChest) te, stack));  
+        return stack;
+    }
+    
+    private static Object getCoordOfLocation(Object[] args) throws IllegalStringLocationException
+    {
+        Location l = (Location) args[0];
+        switch(args[1].toString())
+        {
+            case "x":
+                return l.getX();
+            case "y":
+                return l.getY();
+            case "z":
+                return l.getZ();
+            case "bx":
+                return (double) MathHelper.floor(l.getX());
+            case "by":
+                return (double) MathHelper.floor(l.getY());
+            case "bz":
+                return (double) MathHelper.floor(l.getZ());
+            case "w":
+                return ModDimensions.getWorldName(l.getWorld());
+            default:
+                return null;
+        }
+    }
+    
+    private static void cloneBlock(Object[] args) throws IllegalStringLocationException
+    {
+        Location l = (Location) args[1];
+        IBlockState state = getBlockState((Location) args[0]);
+        l.getWorld().setBlockState(l.getBlockPos(), state);
+    }
+    
+    private static ItemStack removeItem(Object[] args) throws PlayerNotFoundException, IllegalItemStackStringException
+    {       
+        ItemStack stack = ((ItemStack) args[1]).copy();
+        stack.setCount(InventoryUtils.removeFromInventory(((EntityPlayer) args[0]).inventory, stack));
+        return stack;
+    }
+    
+    private static void dropItem(Object[] args) throws IllegalStringLocationException, IllegalItemStackStringException
+    {
+        Location l = (Location) args[0];
+        World w = l.getWorld();
+        BlockPos pos = l.getBlockPos();
+        ItemStack stack = ((ItemStack) args[1]).copy();
+        int amount = stack.getCount();
+        while(amount > stack.getMaxStackSize())
+        {            
+            stack.setCount(stack.getMaxStackSize());
+            amount -= stack.getMaxStackSize();
+            ItemStackUtils.drop(w, pos, stack.copy());
+        }
+        if(amount > 0)
+        {
+            stack.setCount(amount);
+            ItemStackUtils.drop(w, pos, stack);
+        }
+    }
+    
+    private static ItemStack giveItem(Object[] args) throws PlayerNotFoundException, IllegalItemStackStringException
+    {      
+        ItemStack stack = ((ItemStack) args[1]).copy();
+        stack.setCount(InventoryUtils.addToInventory(((EntityPlayer) args[0]).inventory, stack));
+        return stack;
+    }
+    
+    private static void endPlayerScript(Object[] args, Script qd) throws NumberFormatException, UnsupportedOperationException
+    {           
+        if(qd.getClass() == MinecraftScript.class)
+        {
+            throw new UnsupportedOperationException();
+        }
+        ((PlayerScript) qd).getPlayers().stream().forEach((p) -> 
+        {
+            KajetansMod.scripts.send(p, "Du hast die Quest geschafft!");
+        });
+        KajetansMod.scripts.getSnuviParser().termSafe(qd);
+        throw new HoldCodeException();
+    }
+    
+    private static void setBlock(Object[] args, Script qd) throws IllegalStringLocationException, IllegalItemStackStringException
+    {           
+        Location l = (Location) args[0];
+        ItemStack stack = (ItemStack) args[1];
+        l.getWorld().setBlockState(l.getBlockPos(), Block.getBlockFromItem(stack.getItem()).getStateFromMeta(stack.getMetadata()));
+        qd.incLoopCounter();
+    }
+    
+    private static void setBlockWithData(Object[] args, Script qd) throws IllegalStringLocationException
+    {           
+        Location l = (Location) args[0];
+        if(args.length >= 4)
+        {
+            NmsUtilities.setBlockWithData(l.getWorld(), l.getBlockPos(), ScriptUtils.getInt(args[2]), Block.getBlockFromName(args[1].toString()), ScriptUtils.connect(args, 3));
+        }
+        else
+        {
+            NmsUtilities.setBlockWithData(l.getWorld(), l.getBlockPos(), ScriptUtils.getInt(args[2]), Block.getBlockFromName(args[1].toString()), null);
+        }
+        qd.incLoopCounter();
+    }
+    
+    private static void dropInventory(Object[] args)
+    {
+        ((EntityPlayer) args[0]).inventory.dropAllItems();
+    }
+    
+    private static void playSound(Object[] args) throws IllegalStringLocationException
+    {
+        Location l = ((Location) args[0]);
+        Vec3d v = l.getPos();
+        EffectUtils.playSound((WorldServer) l.getWorld(), SoundEvent.REGISTRY.getObject(new ResourceLocation(args[1].toString())), SoundCategory.MASTER, v.xCoord, v.yCoord, v.zCoord);
+    }
+    
+    private static void playSoundPlayer(Object[] args) throws IllegalStringLocationException
+    {
+        EffectUtils.playSound((EntityPlayerMP) args[0], SoundEvent.REGISTRY.getObject(new ResourceLocation(args[1].toString())), SoundCategory.MASTER);
+    }
+    
+    private static void playParticle(Object[] args) throws IllegalStringLocationException
+    {
+        Location l = ((Location) args[0]).copyAdd(0.5, 0.5, 0.5);
+        EffectUtils.spawnParticle((WorldServer) l.getWorld(), EnumParticleTypes.getByName(args[1].toString()), l.getPos(), ScriptUtils.getInt(args[2]));
+    }
+    
+    private static void setEntityEquip(Object[] args) throws IllegalStringLocationException, EntityNotFoundException, IllegalItemStackStringException
+    {
+        EntityLivingBase liv = (EntityLivingBase) args[0];  
+        ItemStack stack = ((ItemStack) args[2]).copy();
+        switch(args[1].toString())
+        {
+            case "hand":
+                liv.setItemStackToSlot(EntityEquipmentSlot.MAINHAND, stack);
+                return;
+            case "head":
+                liv.setItemStackToSlot(EntityEquipmentSlot.HEAD, stack);
+                return;
+            case "chest":
+                liv.setItemStackToSlot(EntityEquipmentSlot.CHEST, stack);
+                return;
+            case "legs":
+                liv.setItemStackToSlot(EntityEquipmentSlot.LEGS, stack);
+                return;
+            case "feet":
+                liv.setItemStackToSlot(EntityEquipmentSlot.FEET, stack);
+                return;
+            case "offhand":
+                liv.setItemStackToSlot(EntityEquipmentSlot.OFFHAND, stack);
+        }
+    }  
+    
+    private static ItemStack getEntityEquip(Object[] args) throws IllegalStringLocationException, EntityNotFoundException
+    {
+        EntityLivingBase liv = (EntityLivingBase) args[0];        
+        switch(args[1].toString())
+        {
+            case "hand":
+                return liv.getItemStackFromSlot(EntityEquipmentSlot.MAINHAND);
+            case "head":
+                return liv.getItemStackFromSlot(EntityEquipmentSlot.HEAD);
+            case "chest":
+                return liv.getItemStackFromSlot(EntityEquipmentSlot.CHEST);
+            case "legs":
+                return liv.getItemStackFromSlot(EntityEquipmentSlot.LEGS);
+            case "feet":
+                return liv.getItemStackFromSlot(EntityEquipmentSlot.FEET);
+            case "offhand":
+                return liv.getItemStackFromSlot(EntityEquipmentSlot.OFFHAND);
+        }
+        return ItemStack.EMPTY;
+    } 
+    
+    @SuppressWarnings("unchecked")
+    private static void removeEntities(Object[] args) throws IllegalStringLocationException
+    {
+        Class<? extends Entity> c = (Class<? extends Entity>) getClass(args[0].toString());
+        if(c == Entity.class || c == EntityVillager.class || c == EntityArmorStand.class || c == EntityItemFrame.class || c == EntityHanging.class)
+        {
+            return;
+        }
+        Location l = (Location) args[1];
+        Utils.getNearbyEntities(l.getWorld(), l.getPos(), ScriptUtils.getDouble(args[2]), c).stream().forEach(ent -> 
+        {
+            ent.setDead();
+        });
+    } 
+    
+    private static void setSign(Object[] args) throws IllegalStringLocationException
+    {
+        Location l = (Location) args[0];
+        TileEntitySign sign = (TileEntitySign) l.getWorld().getTileEntity(l.getBlockPos());
+        SpecialBlockUtils.setSignLine(sign, ScriptUtils.getInt(args[1]), ScriptUtils.connect(args, 2));
+    }
+    
+    @SuppressWarnings("")
+    private static String getSign(Object[] args) throws IllegalStringLocationException
+    {
+        Location l = (Location) args[0];
+        TileEntitySign sign = (TileEntitySign) l.getWorld().getTileEntity(l.getBlockPos());
+        return sign.signText[ScriptUtils.getInt(args[1])].getUnformattedText();
+    }
+    
+    private static boolean isSolid(Object[] args)
+    {
+        IBlockState state = getBlockState((Location) args[0]);
+        return !state.isTranslucent() && state.isFullBlock() && state.isOpaqueCube();
+    }
+
+    private static void spawnItemFrame(Object[] args) throws IllegalStringLocationException, IllegalItemStackStringException
+    {
+        Location l = ((Location) args[0]);
+        EntityItemFrame frame = new EntityItemFrame(l.getWorld(), l.getBlockPos(), EnumFacing.byName(args[1].toString()));
+        frame.setDisplayedItem(((ItemStack) args[2]).copy());
+    }
+                   
+    private static void nameEntity(Object[] args) throws EntityNotFoundException
+    {
+        Entity ent = (Entity) args[0];
+        ent.setCustomNameTag(ScriptUtils.connect(args, 1));
+        if(args.length >= 3)
+        {
+            ent.setAlwaysRenderNameTag((boolean) args[2]);   
+            return;
+        }
+        ent.setAlwaysRenderNameTag(true);  
+    }
+    
+    private static EntityPlayer getPlayerScriptLeader(Script qd) throws PlayerNotFoundException
+    {
+        if(qd.getClass() == PlayerScript.class)
+        {
+            return((PlayerScript) qd).getPlayers().get(0);
+        }
+        throw new UnsupportedOperationException();
+    }
+
+    private static void startPlayerScript(Object[] args, Script qd) throws PlayerNotFoundException
+    {
+        if(qd.getClass() == MinecraftScript.class)
+        {
+            EntityPlayer p = ((EntityPlayer) args[0]);
+            if(!KajetansMod.scripts.hasScript(p))
+            {
+                KajetansMod.scripts.startQuest(KajetansMod.server, args[1].toString(), p);
+            }
+            return;
+        }
+        throw new UnsupportedOperationException();
+    }
+               
+    private static void addToScoreBoard(Object[] args, Script qd) throws PlayerNotFoundException
+    {
+        int id = ScriptUtils.getInt(args[1]);
+        String message = ScriptUtils.connect(args, 2);
+        doForGroup(args[0], qd, p -> KajetansMod.scoreboard.getScoreboard((EntityPlayerMP) p).addText(id, message));
+    }
+    
+    private static void removeFromScoreBoard(Object[] args, Script qd) throws PlayerNotFoundException
+    {
+        int id = ScriptUtils.getInt(args[1]);
+        doForGroup(args[0], qd, p -> KajetansMod.scoreboard.getScoreboard((EntityPlayerMP) p).removeText(id));
+    }
+
+    private static void sendToActionBar(Object[] args, Script qd) throws PlayerNotFoundException
+    {
+        String text = ScriptUtils.connect(args, 1);
+        doForGroup(args[0], qd, p -> NmsUtilities.sendActionBar((EntityPlayerMP) p, text));
+    }
+
+    private static void kickPlayerFromQuest(Object[] args, Script qd) throws PlayerNotFoundException, UnsupportedOperationException
+    {
+        if(qd.getClass() == PlayerScript.class)
+        {
+            KajetansMod.scripts.removePlayerFromScript((EntityPlayer) args[0], (PlayerScript) qd);
+            return;
+        }
+        throw new UnsupportedOperationException();
+    }
+
+    private static void damageEntity(Object[] args)
+    {
+        if(args.length >= 4)
+        {
+            ((EntityLivingBase) args[0]).attackEntityFrom(DamageSource.causeMobDamage((EntityLivingBase) args[2]), ScriptUtils.getFloat(args[1]));
+            return;
+        }
+        ((EntityLivingBase) args[0]).attackEntityFrom(DamageSource.GENERIC, ScriptUtils.getFloat(args[1]));
+    }
+    
+    private static boolean isBetween(Object[] args)
+    {
+        Vec3d l1 = ((Location) args[0]).getPos();
+        Vec3d l2 = ((Location) args[1]).getPos();
+        Vec3d l3 = ((Location) args[2]).getPos();
+        return l1.xCoord >= Math.min(l2.xCoord, l3.xCoord) &&
+                l1.xCoord <= Math.max(l2.xCoord, l3.xCoord) &&
+                l1.yCoord >= Math.min(l2.yCoord, l3.yCoord) &&
+                l1.yCoord <= Math.max(l2.yCoord, l3.yCoord) &&
+                l1.zCoord >= Math.min(l2.zCoord, l3.zCoord) &&
+                l1.zCoord <= Math.max(l2.zCoord, l3.zCoord);
+    }
+
+    private static void addPlot(Object[] args)
+    {
+        Location l1 = (Location) args[0];
+        Location l2 = (Location) args[1];
+        BlockPos pos1 = l1.getBlockPos();
+        BlockPos pos2 = l2.getBlockPos();
+        KajetansMod.plots.getDataBank(ProtectionBank.class).addPlot(Math.min(pos1.getX(), pos2.getX()),
+                    Math.min(pos1.getY(), pos2.getY()),
+                    Math.min(pos1.getZ(), pos2.getZ()),
+                    Math.max(pos1.getX(), pos2.getX()),
+                    Math.max(pos1.getY(), pos2.getY()),
+                    Math.max(pos1.getZ(), pos2.getZ()),
+                    ModDimensions.getWorldName(l1.getWorld()), null, args[2].toString()); 
+    }
+  
+    private static Entity getLastDamager(Object[] args)
+    {
+        DamageSource ds = ((EntityPlayer) args[0]).getLastDamageSource();
+        if(ds == null)
+        {
+            return null;
+        }
+        return ds.getSourceOfDamage();
+    }
+    
+    @SuppressWarnings("")
+    private static SnuviInventory newInventory(Location l, MinecraftScript qd, String s)
+    {
+        TileEntityChest chest = (TileEntityChest) l.getWorld().getTileEntity(l.getBlockPos());
+        int size = chest.getSizeInventory();
+        if(size % 9 != 0)
+        {
+            size /= 9;
+            size++;
+            size *= 9;
+        }
+        SnuviInventory inv = new SnuviInventory(s, size, qd.getNewId()); 
+        for(int i = 0; i < chest.getSizeInventory(); i++)
+        {
+            inv.setInventorySlotContents(i, chest.getStackInSlot(i).copy());
+        }
+        return inv;
+    }   
+    
+    private static boolean onlyLetters(String s)
+    {
+        for(char c : s.toCharArray())
+        {
+            if(!Character.isLetter(c))
+            {
+                return false;
+            }
+        }
+        return true;
+    }
+    
+    private static String getName(Object[] args)
+    {
+        Object o = args[0];
+        if(o instanceof EntityPlayer)
+        {
+            return ((EntityPlayer) o).getName();
+        }
+        return KajetansMod.playerbank.getDataBank().getName(o.toString());
+    }
+    
+    private static String getUuid(Object[] args)
+    {
+        Object o = args[0];
+        if(o instanceof EntityPlayer)
+        {
+            return ((EntityPlayer) o).getUniqueID().toString();
+        }
+        return KajetansMod.playerbank.getDataBank().getUUID(o.toString());
+    }
+    
+    @SuppressWarnings("")
+    private static String getPotionType(Object[] args)
+    {
+        return PotionUtils.getPotionFromItem(((EntityPotion) args[0]).getPotion()).getRegistryName().toString();
+    }
+    
+    private static void setTag(Object[] args)
+    {
+        if(args[0] instanceof EntityPlayer)
+        {
+            KajetansMod.playerbank.getDataBank().setTag((EntityPlayer) args[0], args[1].toString(), ScriptUtils.getInt(args[2]));
+            return;
+        }
+        KajetansMod.playerbank.getDataBank().setTag(KajetansMod.playerbank.getDataBank().getUUID(args[0].toString()), args[1].toString(), ScriptUtils.getInt(args[2]));
+    }
+    
+    private static int getTag(Object[] args)
+    {
+        if(args[0] instanceof EntityPlayer)
+        {
+            return KajetansMod.playerbank.getDataBank().getTag((EntityPlayer) args[0], args[1].toString());
+        }
+        return KajetansMod.playerbank.getDataBank().getTag(KajetansMod.playerbank.getDataBank().getUUID(args[0].toString()), args[1].toString());
+    }
+    
+    private static void setGlobalVar(Object[] args)
+    {
+        if(args[0] instanceof EntityPlayer)
+        {
+            KajetansMod.scripts.getDataBank(ScriptBank.class).setVar(args[2].toString(), args[1].toString(), ((EntityPlayer) args[0]).getUniqueID().toString());
+            return;
+        }
+        KajetansMod.scripts.getDataBank(ScriptBank.class).setVar(args[2].toString(), args[1].toString(), KajetansMod.playerbank.getDataBank().getUUID(args[0].toString()));
+    }
+    
+    private static Object getGlobalVar(Object[] args)
+    {
+        if(args[0] instanceof EntityPlayer)
+        {
+            return KajetansMod.scripts.getDataBank(ScriptBank.class).getVar(args[1].toString(), ((EntityPlayer) args[0]).getUniqueID().toString());
+        }
+        return KajetansMod.scripts.getDataBank(ScriptBank.class).getVar(args[1].toString(), KajetansMod.playerbank.getDataBank().getUUID(args[0].toString()));
+    }
+
+    // -------------------------------------------------------------------------    
+    // Block
+    // ------------------------------------------------------------------------- 
+    
+    private static int getBlockData(Location l)
+    {
+        IBlockState state = l.getWorld().getBlockState(l.getBlockPos());
+        return state.getBlock().getMetaFromState(state);
+    }
+    
+    private static IBlockState getBlockState(Location l)
+    {
+        return l.getWorld().getBlockState(l.getBlockPos());
+    }
+    
+    private static ItemStack getStackFromBlock(Location l)
+    {
+        World w = l.getWorld();
+        BlockPos pos = l.getBlockPos();
+        IBlockState state = w.getBlockState(pos);
+        return state.getBlock().getItem(w, pos, state);
+    }
+    
+    // -------------------------------------------------------------------------    
+    // Custom-Handler
+    // ------------------------------------------------------------------------- 
+    
+    private static void registerShapelessRecipe(Object[] args)
+    {
+        ItemStack[] stacks = new ItemStack[args.length - 1];
+        for(int i = 0; i < stacks.length; i++)
+        {
+            stacks[i] = (ItemStack) args[i + 1];
+        }
+        RecipeUtils.registerShapelessRecipe((ItemStack) args[0], stacks);
+    }
+    
+    private static void registerShapedRecipe(Object[] args)
+    {
+        int counter = 0;
+        while(args[counter + 1].getClass() == String.class)
+        {
+            counter++;
+        }
+        String[] s = new String[counter];
+        for(int i = 0; i < s.length; i++)
+        {
+            s[i] = args[i + 1].toString();
+        }
+        
+        ItemStack[] stacks = new ItemStack[args.length - 1 - s.length];
+        for(int i = 0; i < stacks.length; i++)
+        {
+            stacks[i] = (ItemStack) args[i + 1 + counter];
+        }
+        RecipeUtils.registerShapedRecipe((ItemStack) args[0], s, stacks);
+    }
+    
+    // -------------------------------------------------------------------------    
+    // Zeit-Handler
+    // ------------------------------------------------------------------------- 
+    
+    private static long getNextDay(Object[] args)       
+    {
+        GregorianCalendar cal = GregorianCalendar.from(ZonedDateTime.now());
+        cal.setTimeInMillis((long) args[0]);
+        cal.add(Calendar.DAY_OF_YEAR, 1);
+        cal.set(Calendar.HOUR, 0);
+        cal.set(Calendar.SECOND, 0);
+        cal.set(Calendar.MINUTE, 0);
+        cal.set(Calendar.MILLISECOND, 0);
+        return cal.getTimeInMillis();   
+    } 
+    
+    private static int getYear(Object[] args)       
+    {
+        GregorianCalendar cal = GregorianCalendar.from(ZonedDateTime.now());
+        cal.setTimeInMillis((long) args[0]);
+        return cal.get(Calendar.YEAR);   
+    }
+    
+    private static int getMonth(Object[] args)       
+    {
+        GregorianCalendar cal = GregorianCalendar.from(ZonedDateTime.now());
+        cal.setTimeInMillis((long) args[0]);
+        return cal.get(Calendar.MONTH) + 1;   
+    }
+    
+    private static int getDay(Object[] args)       
+    {
+        GregorianCalendar cal = GregorianCalendar.from(ZonedDateTime.now());
+        cal.setTimeInMillis((long) args[0]);
+        return cal.get(Calendar.DAY_OF_MONTH);   
+    }
+    
+    private static int getHour(Object[] args)       
+    {
+        GregorianCalendar cal = GregorianCalendar.from(ZonedDateTime.now());
+        cal.setTimeInMillis((long) args[0]);
+        return cal.get(Calendar.HOUR_OF_DAY);   
+    }
+    
+    private static int getMinute(Object[] args)       
+    {
+        GregorianCalendar cal = GregorianCalendar.from(ZonedDateTime.now());
+        cal.setTimeInMillis((long) args[0]);
+        return cal.get(Calendar.MINUTE);   
+    }
+    
+    private static int getSecond(Object[] args)       
+    {
+        GregorianCalendar cal = GregorianCalendar.from(ZonedDateTime.now());
+        cal.setTimeInMillis((long) args[0]);
+        return cal.get(Calendar.SECOND);   
+    }
+    
+    // -------------------------------------------------------------------------    
+    // Gruppen-Handler
+    // ------------------------------------------------------------------------- 
+    
+    private static void doForGroup(Object group, Script qd, Consumer<ICommandSender> c) throws UnsupportedOperationException, PlayerNotFoundException
+    {
+        if(group instanceof String)
+        {
+            switch(group.toString()) 
+            {
+                case "all":
+                    if(qd.getClass() == MinecraftScript.class)
+                    {
+                        throw new UnsupportedOperationException();
+                    }
+                    ((PlayerScript) qd).getPlayers().forEach(p -> c.accept(p));
+                    break;
+                case "online":
+                    KajetansMod.server.getPlayerList().getPlayers().forEach(p -> c.accept(p));
+                    break;
+                case "dev":
+                    if(qd != null && qd.getClass() == PlayerScript.class)
+                    {
+                        ((PlayerScript) qd).getPlayers().stream().filter(p ->  KajetansMod.perms.has(p, Permissions.SCRIPT_ERROR)).forEach(p -> c.accept(p));
+                        return;
+                    }
+                    KajetansMod.server.getPlayerList().getPlayers().stream().filter(p -> KajetansMod.perms.has(p, Permissions.SCRIPT_ERROR)).forEach(p -> c.accept(p));
+                    break;
+                case "server":
+                    c.accept(KajetansMod.server);
+                    break;
+                default:
+                    c.accept(Utils.getPlayerByName(group.toString()));
+                    break;
+            }
+            return;
+        }
+        c.accept((EntityPlayer) group);
+    } 
+    
+    private static void sendMessageToGroup(Object group, Script sc, String message)
+    {
+        TextComponentString comp = new TextComponentString(message);
+        doForGroup(group, sc, p -> 
+        {
+            p.sendMessage(comp);
+        });
+    }
+    
+    public static void sendMessageWithSuffix(Script sc, String message)
+    {
+        Module m = KajetansMod.scripts;
+        doForGroup("all", sc, p -> m.send(p, message));
+    }
+    
+    private static void sendToDevsWithSuffix(String message)
+    {
+        Module m = KajetansMod.scripts;
+        doForGroup("dev", null, p -> m.send(p, message));
+    }
+    
+    public static void sendWarningToAllDevs(String message)
+    {
+        Module m = KajetansMod.scripts;
+        String warnMessage = "§4" + message;
+        doForGroup("dev", null, p -> m.send(p, warnMessage));
+    }
+    
+    private static void sendToDevsWithList(String message)
+    {
+        Module m = KajetansMod.scripts;
+        doForGroup("dev", null, p -> m.sendListElement(p, message));
+    }
+    
+    private static void sendToDevsWithHelpList(String message, String message2)
+    {
+        Module m = KajetansMod.scripts;
+        doForGroup("dev", null, p -> m.sendHelpListElement(p, message, message2));
+    }   
+}

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

@@ -0,0 +1,52 @@
+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)
+    {
+        l = l.copy();
+        l.round();
+        return loadedLocations.remove(l);
+    }
+    
+    public void clearLocations()
+    {
+        loadedLocations.clear();
+    }
+    
+    // -------------------------------------------------------------------------
+    // Für Inventar-IDs
+    // -------------------------------------------------------------------------
+    
+    public int getNewId()
+    {
+        invCounter++;
+        return invCounter;
+    }
+}

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

@@ -0,0 +1,46 @@
+package me.km.snuviscript;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+import me.hammerle.code.SnuviParser;
+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
+    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());
+    }
+}

+ 0 - 821
src/main/java/me/km/snuviscript/Script.java

@@ -1,821 +0,0 @@
-package me.km.snuviscript;
-
-import me.km.KajetansMod;
-import me.km.api.GlobalText;
-import me.km.api.Module;
-import me.km.exception.CodeTooLongException;
-import me.km.exception.GoHigherAtRootTreeException;
-import me.km.exception.GotoLabelNotFoundException;
-import me.km.exception.HoldCodeException;
-import me.km.exception.IllegalStringException;
-import me.km.exception.NoChildTreeException;
-import me.km.exception.PrescriptException;
-import java.io.File;
-import java.io.IOException;
-import java.nio.file.Files;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.EmptyStackException;
-import java.util.List;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Stack;
-import java.util.stream.Collectors;
-import me.km.api.Location;
-import net.minecraft.command.ICommandSender;
-import net.minecraft.entity.player.EntityPlayer;
-import net.minecraft.util.text.TextComponentString;
-
-public class Script 
-{
-    private final SnuviParser parser;
-    
-    private final BenchmarkClock treeClock;
-    public final BenchmarkClock exeClock;
-    private boolean benchmark;
-    
-    private final Tree<CodeFunction> code;
-    private CodeFunction currentCode;
-
-    private final HashMap<String, Object> variables;    
-    private final HashMap<String, Integer[]> gotos;
-    private final Stack<Integer[]> stack;
-    private final HashSet<String> events;
-    private final HashSet<Location> loadedLocations;
-    
-    private boolean isWaiting;
-    private boolean isTrying;
-    private boolean tryFailed;
-    private boolean shouldDoElse;
-    private boolean isValid;
-    private final Stack<Boolean> whileStack;
-    private int overflowProtection;
-    
-    private String info;  
-    private String name; 
-    private final int id;
-    private final boolean script;
-    private int idCounter;
- 
-    private final ArrayList<EntityPlayer> quester;  
-    
-    public Script(int id, EntityPlayer p, String filename, ICommandSender cs)
-    {       
-        parser = KajetansMod.scripts.getQuestParser();
-        treeClock = new BenchmarkClock();
-        exeClock = new BenchmarkClock();
-        benchmark = false;
-        
-        this.id = id;     
-        
-        code = new Tree<>();
-        idCounter = 0;
-        
-        variables = new HashMap<>();
-        gotos = new HashMap<>();
-        stack = new Stack<>();
-        events = new HashSet<>();
-        loadedLocations = new HashSet<>();
-        whileStack = new Stack<>();
-        
-        name = filename;
-
-        isWaiting = false;
-        isValid = true;
-        overflowProtection = 0;
-        isTrying = false;
-        
-        quester = new ArrayList<>();
-        
-        info = "Keine Info wurde gesetzt.";
-        
-        if(p != null)
-        {
-            quester.add(p);
-            script = false;
-        }
-        else
-        {
-            script = true;
-        }
-        
-        readCode(filename, cs);
-        setVar("quote", "\"");
-    }
-    
-    // -------------------------------------------------------------------------
-    // Überladen
-    // -------------------------------------------------------------------------
-    
-    public void loadNewCode(String filename, ICommandSender cs)
-    {
-        code.clear();
-        
-        gotos.clear();
-        stack.clear();
-        whileStack.clear();
-        
-        name = filename;
-        
-        readCode(filename, cs);
-
-        isWaiting = false;
-        isValid = true;
-    }
-    
-    // -------------------------------------------------------------------------
-    // Flow-Control
-    // -------------------------------------------------------------------------
-    
-    public void goDeeper(boolean b) throws NoChildTreeException
-    {
-        code.goDeeper();
-        addWhileMode(b);
-    }
-    
-    public void goHigher()
-    {
-        try
-        {
-            code.goHigher();
-        }
-        catch(GoHigherAtRootTreeException ex)
-        {
-        }
-    }
-    
-    public String getTreePath()
-    {
-        return Arrays.asList(code.getCurrentPosition()).stream().map(i -> i.toString()).collect(Collectors.joining(", "));
-    }
-    
-    private void readCode(String filename, ICommandSender cs)
-    {
-        int line = 0;
-        StringBuilder codeLine = new StringBuilder();
-        try
-        {
-            File file = new File("./quests/" + filename + ".txt");   
-            List<String> lines;
-            if(file.exists())
-            {
-                try 
-                {
-                    lines = Files.readAllLines(file.toPath());
-                } 
-                catch (IOException ex) 
-                {
-                    throw new PrescriptException("Die Datei '" + filename + "' kann nicht gelesen werden.");
-                }
-            }
-            else
-            {
-                //System.out.println("Die Datei '" + filename + "' wurde nicht gefunden.");
-                throw new PrescriptException("Die Datei '" + filename + "' wurde nicht gefunden.");
-            }
-
-            int i = 0;
-            int old = 0;
-            int bracket = 0;
-            boolean text = false;
-            boolean bracketEnd = false;
-            int bracketEndPos = 0;
-            boolean oneLineChild = false;
-            boolean comment = false;       
-            int commentPos = 0;
-            while(line < lines.size())
-            {
-                if(old >= codeLine.length() && !comment)
-                {
-                    codeLine = new StringBuilder(lines.get(line).trim());
-                    i = 0;
-                    old = 0;
-                    //System.out.println("NEU");
-                }
-                else
-                {
-                    codeLine.append(lines.get(line).trim());
-                    //System.out.println("APPEND");
-                }
-
-                //System.out.println(codeLine);
-
-                while(i < codeLine.length())
-                {
-                    switch(codeLine.charAt(i))
-                    {
-                        case '"':
-                            if(!comment)
-                            {
-                                text = !text;
-                            }
-                            break;
-                        case '@':
-                            if(comment || text)
-                            {
-                                break;
-                            }
-                            old = i;
-                            while(i < codeLine.length() && codeLine.charAt(i) != ' ')
-                            {
-                                i++;
-                            }
-                            try
-                            {
-                                code.selectLastChild(); // Nur für richtige Position
-                            }
-                            catch(NoChildTreeException ex)
-                            {
-                            }
-                            String s = codeLine.substring(old + 1, i);
-                            if(gotos.put(s, code.getCurrentPosition()) != null)
-                            {
-                                throw new PrescriptException("Doppeltes Goto: " + s + " - " + (line + 1));
-                            }
-                            codeLine.delete(old, i + 1);
-                            i = old - 1;
-                            break;
-                        case '/':
-                            if(text)
-                            {
-                                break;
-                            }
-                            if(!comment && i + 1 < codeLine.length() && codeLine.charAt(i + 1) == '*')
-                            {
-                                comment = true;
-                                commentPos = i;
-                            }
-                            if(!comment && i + 1 < codeLine.length() && codeLine.charAt(i + 1) == '/')
-                            {
-                                codeLine.delete(i, codeLine.length());
-                                old = codeLine.length() + 1;
-                            }
-                            break;
-                        case '*':
-                            if(text)
-                            {
-                                break;
-                            }
-                            if(comment && i + 1 < codeLine.length() && codeLine.charAt(i + 1) == '/')
-                            {
-                                comment = false;
-                                codeLine.delete(commentPos, i + 2);
-                                i = commentPos;
-                            }
-                            break;
-                        case ';':
-                            if(comment || text)
-                            {
-                                break;
-                            }
-                            if(bracket != 0)
-                            {
-                                //System.out.println(bracket);
-                                throw new PrescriptException("; aber Klammern ungültig - " + (line + 1));
-                            }
-                            bracketEnd = false;
-                            code.addChild(new CodeFunction(codeLine.substring(old, i)), line);
-                            old = i + 1;
-                            if(oneLineChild)
-                            {
-                                oneLineChild = false;
-                                try
-                                {
-                                    code.goHigher();
-                                }
-                                catch(GoHigherAtRootTreeException ex)
-                                {
-                                    throw new PrescriptException("Das sollte nicht passieren - " + (line + 1));
-                                }
-                            }
-                            bracket = 0;
-                            break;
-                        case '(':
-                            if(!comment && !text)
-                            {
-                                bracket++;
-                                if(bracketEnd && !oneLineChild)
-                                {
-                                    bracketEnd = false;
-                                    oneLineChild = true;
-                                    code.addChild(new CodeFunction(codeLine.substring(old, bracketEndPos)), line);
-                                    old = bracketEndPos;
-                                    try
-                                    {
-                                        code.selectLastChild();
-                                        code.goDeeper();
-                                    }
-                                    catch(NoChildTreeException ex)
-                                    {
-                                        throw new PrescriptException("Das sollte nicht passieren - " + (line + 1));
-                                    }
-                                }
-                            }
-                            break;
-                        case ')':
-                            if(comment || text)
-                            {
-                                break;
-                            }
-                            bracket--;
-                            if(oneLineChild)
-                            {
-                                break;
-                            }
-                            if(bracket < 0)
-                            {
-                                throw new PrescriptException(") ohne ( - " + (line + 1));
-                            }
-                            if(bracket == 0)
-                            {
-                                bracketEnd = true;   
-                                bracketEndPos = i + 1;
-                            }
-                            break;
-                        case '{':
-                            if(comment || text)
-                            {
-                                break;
-                            }
-                            bracketEnd = false;
-                            code.addChild(new CodeFunction(codeLine.substring(old, i)), line);
-                            old = i + 1;
-                            try
-                            {
-                                code.selectLastChild();
-                                code.goDeeper();
-                            }
-                            catch(NoChildTreeException ex)
-                            {
-                                throw new PrescriptException("Das sollte nicht passieren - " + (line + 1));
-                            }
-                            break;
-                        case '}':
-                            if(comment || text)
-                            {
-                                break;
-                            }
-                            old = i + 1;
-                            try
-                            {
-                                code.goHigher();
-                            }
-                            catch(GoHigherAtRootTreeException ex)
-                            {
-                                throw new PrescriptException("} ohne { - " + (line + 1));
-                            }
-                            break;
-                    }
-                    i++;
-                } 
-                line++;
-            }
-            code.goToRoot();
-        }
-        catch(Exception ex)
-        {
-            if(parser.printStack)
-            {
-                ex.printStackTrace();
-            }
-            resetOverflowProtection();
-            Module m = KajetansMod.scripts;
-            int id = script ? 1 : 0;
-            m.send(cs, "§cError in", id);
-            m.sendHelpListElement(cs, "§cScript", getName(), id);
-            m.sendHelpListElement(cs, "§cZeile", codeLine.toString(), id);
-            m.sendHelpListElement(cs, "§cZeilennummer", String.valueOf(line + 1), id);
-            if(ex.getLocalizedMessage() == null)
-            {
-                m.sendHelpListElement(cs, "§cException", ex.getClass().getSimpleName(), id);
-            }
-            else
-            {
-                m.sendHelpListElement(cs, "§cException", ex.getClass().getSimpleName() + " - " + ex.getLocalizedMessage(), id);
-            }
-            if(ex instanceof IllegalStringException)
-            {
-                m.sendHelpListElement(cs, "§cUngültiger Wert", ((IllegalStringException) ex).getBadString(), id);
-            }
-            KajetansMod.scripts.term(this);
-        }
-    }
-    
-    public void runCode()
-    {
-        try
-        { 
-            while(!isWaiting)
-            {
-                treeClock.pushTime(benchmark);
-                try
-                {
-                    //System.out.println("NEXT");
-                    code.selectNextChild();
-                }
-                catch(NoChildTreeException ex)
-                {
-                    //System.out.println("NACH OBEN!");
-                    code.goHigher();
-                    setTryMode(false);
-                    setElseMode(false);
-                    if(removeWhileMode())
-                    {
-                        increaseOverflowProtection();
-                        code.selectPreviousChild();
-                    }
-                    treeClock.pushTime(benchmark);
-                    continue;
-                }
-                currentCode = code.getCurrentChildData();
-                treeClock.pushTime(benchmark);
-                //System.out.println(currentCode.getFunction());
-                //System.out.println(currentCode);
-                //System.out.println("AUFRUF");
-                //findFunction(currentCode, 0, currentCode.length() - 1);
-                doFunction(currentCode);
-            }
-        }
-        catch(NoChildTreeException | GoHigherAtRootTreeException ex)
-        {
-            KajetansMod.scripts.term(this);
-        }
-        catch(HoldCodeException ex2)
-        {
-        }
-        catch(CodeTooLongException | PrescriptException ex3)
-        {
-            parser.printQuestException(this, ex3, currentCode.toString());
-        }
-    }
-    
-    public void runCodeLine(String c, ICommandSender cs)
-    {
-        try
-        {
-            doFunction(new CodeFunction(c));
-        }
-        catch(HoldCodeException ex)
-        {
-        }
-        catch(Exception ex)
-        {
-            if(ex instanceof IllegalStringException)
-            {
-                KajetansMod.scripts.send(cs, ((IllegalStringException) ex).getBadString(), script ? 1 : 0);
-            }
-            else
-            {
-                KajetansMod.scripts.send(cs, ex.getClass().getSimpleName(), script ? 1 : 0);
-            }
-        }
-    }   
-    
-    private Object doFunction(CodeFunction cf)
-    {
-        Object[] old = cf.getParameters();
-        Object[] newPars = new Object[old.length];
-        for(int i = 0; i < old.length; i++)
-        {
-            if(old[i] != null && old[i].getClass() == CodeFunction.class)
-            {
-                newPars[i] = readParameter(doFunction((CodeFunction) old[i]));
-                continue;
-            }
-            newPars[i] = readParameter(old[i]);
-        }
-        return parser.parseFunction(this, cf.getFunction(), newPars);
-    }  
-    
-    private Object readParameter(Object o)
-    {
-        if(o != null && o.getClass() == Variable.class)
-        {
-            return getVar(o.toString());
-        }
-        return o;
-    }
-    
-    public int getActualCodeLine()
-    {
-        return code.getActualCodeLine();
-    }
-
-    // -------------------------------------------------------------------------
-    // Quest / Scriptdaten
-    // -------------------------------------------------------------------------
-    
-    public boolean isScript() 
-    {
-        return script; 
-    }
-    
-    public int getId() 
-    {
-        return id;
-    }
-    
-    public String getInfo() 
-    {
-        return info;
-    }
-    
-    public void setInfo(String t) 
-    {
-        info = t;
-    }
-
-    public String getName() 
-    {
-        return name;
-    }
-    
-    // -------------------------------------------------------------------------
-    // Wait für Zeitutils
-    // -------------------------------------------------------------------------
-    
-    public boolean isWaiting()
-    {
-        return isWaiting;
-    }
-    
-    public void setIsWaiting(boolean b) 
-    {
-        isWaiting = b;
-    }
-    
-    // -------------------------------------------------------------------------
-    // Valid
-    // -------------------------------------------------------------------------
-    
-    public boolean isValid() 
-    {
-        return isValid;
-    }
-    
-    public void setIsValid(Boolean bool) 
-    {
-        isValid = bool;
-    }
-    
-    // -------------------------------------------------------------------------
-    // Variablen
-    // -------------------------------------------------------------------------
-
-    public void setVar(String var, Object value)
-    {
-        variables.put(var, value);   
-    }
-    
-    public void setVar(Object var, Object value)
-    {
-        setVar(var.toString(), value);
-    }
-    
-    public HashMap<String, Object> getVars()
-    {
-        return variables;
-    }
-    
-    public Object getVar(String var)
-    {
-        return variables.get(var);
-    }
-    
-    public Object getVar(Object var)
-    {
-        return getVar(var.toString());
-    }
-    
-    public boolean getBoolean(String var)
-    {
-        try
-        {
-            return (boolean) getVar(var);
-        }
-        catch(ClassCastException | NullPointerException ex)
-        {
-            return false;
-        }
-    }
-    
-    public void removeVar(String var)
-    {
-        variables.remove(var);
-    }
-    
-    // -------------------------------------------------------------------------
-    // Goto
-    // -------------------------------------------------------------------------
-    
-    public void gotoLabel(String label) throws NoChildTreeException, CodeTooLongException
-    {
-        Integer[] i = gotos.get(label);
-        if(i == null)
-        {
-            throw new GotoLabelNotFoundException(label);
-        }
-        increaseOverflowProtection();
-        resetWhileMode();
-        setTryMode(false);
-        code.goToPosition(i);
-    }  
-    
-    public void gotoLabelWithReturn(String label) throws NoChildTreeException, CodeTooLongException
-    {
-        stack.push(code.getCurrentPosition());
-        gotoLabel(label);
-    }
-    
-    public void doReturn() throws NoChildTreeException
-    {
-        code.goToPosition(stack.pop()); 
-        /*try
-        {
-            code.selectNextChild();
-        }
-        catch(NoChildTreeException ex)
-        {
-            code.goHigher();
-        }*/
-    }
-    
-    public void resetOverflowProtection()
-    {
-        overflowProtection = 0;
-    }
-    
-    public void increaseOverflowProtection() throws CodeTooLongException
-    {
-        overflowProtection++;
-        if(overflowProtection > 1000)
-        {
-            overflowProtection = 0;
-            throw new CodeTooLongException();
-        }
-    }
-    
-    // -------------------------------------------------------------------------
-    // Event Handling
-    // -------------------------------------------------------------------------
-    
-    public void loadEvent(String event)
-    {
-        events.add(event);
-    }
-    
-    public void unloadEvent(String event)
-    {
-        events.remove(event);
-    }
-    
-    public boolean isEventLoaded(String event)
-    {
-        return events.contains(event);
-    }
-    
-    // -------------------------------------------------------------------------
-    // Player Handling
-    // -------------------------------------------------------------------------
-    
-    public void addPlayer(EntityPlayer p)
-    {
-        quester.add(p);
-    }
-    
-    public boolean removePlayer(EntityPlayer p)
-    {
-        quester.remove(p);
-        return quester.isEmpty();
-    }
-    
-    public List<EntityPlayer> getPlayers()
-    {      
-        return quester;
-    }
-    
-    public List<String> getPlayerNames()
-    {
-        return getPlayers().stream().map(p -> p.getName()).collect(Collectors.toList());
-    }
-    
-    // -------------------------------------------------------------------------
-    // Location Handling für Wait-For-Location
-    // -------------------------------------------------------------------------
-    
-    public void addLocation(Location l)
-    {
-        loadedLocations.add(l);
-    }
-    
-    public boolean removeLocation(Location l)
-    {
-        return loadedLocations.remove(l);
-    }
-    
-    public void clearLocations()
-    {
-        loadedLocations.clear();
-    }
-    
-    // -------------------------------------------------------------------------
-    // Try-Catch Handler
-    // -------------------------------------------------------------------------
-    
-    public void setTryMode(boolean b)
-    {
-        isTrying = b;
-    }
-    
-    public boolean getTryMode()
-    {
-        return isTrying;
-    }
-    
-    public void setTryFail(boolean b)
-    {
-        tryFailed = b;
-    }
-    
-    public boolean getTryFail()
-    {
-        return tryFailed;
-    }
-    
-    // -------------------------------------------------------------------------
-    // While Handler
-    // -------------------------------------------------------------------------
-    
-    private void addWhileMode(boolean b)
-    {
-        whileStack.push(b);
-    }
-    
-    public boolean removeWhileMode()
-    {
-        try
-        {
-            return whileStack.pop();
-        }
-        catch(EmptyStackException ex)
-        {
-            return false;
-        }
-    }
-    
-    public void resetWhileMode()
-    {
-        whileStack.clear();
-    }
-    
-    // -------------------------------------------------------------------------
-    // Else Handler
-    // -------------------------------------------------------------------------
-    
-    public void setElseMode(boolean b)
-    {
-        shouldDoElse = b;
-    }
-    
-    public boolean getElseMode()
-    {
-        return shouldDoElse;
-    }
-    
-    // -------------------------------------------------------------------------
-    // Für Inventar-IDs
-    // -------------------------------------------------------------------------
-    
-    public int getNewId()
-    {
-        idCounter++;
-        return idCounter;
-    }
-    
-    // -------------------------------------------------------------------------
-    // Für Benchmarks
-    // -------------------------------------------------------------------------
-    
-    public void clearBenchmark()
-    {
-        exeClock.clear();
-        treeClock.clear();
-    }
-    
-    public boolean isBenchmarking()
-    {
-        return benchmark;
-    }
-    
-    public void toggleBenchmark()
-    {
-        benchmark = !benchmark;
-    }
-    
-    public void printBenchmarks(ICommandSender cs)
-    {
-        cs.sendMessage(new TextComponentString(GlobalText.Spacer()));
-        cs.sendMessage(new TextComponentString("Ausführung: " + exeClock.getSummedTime() + " ms"));
-        cs.sendMessage(new TextComponentString("Baum: " + treeClock.getSummedTime() + " ms"));
-    }
-}

+ 0 - 284
src/main/java/me/km/snuviscript/ScriptAPI.java

@@ -1,284 +0,0 @@
-package me.km.snuviscript;
-
-import me.km.KajetansMod;
-import me.km.api.Module;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.UUID;
-import net.minecraft.command.ICommandSender;
-import net.minecraft.entity.Entity;
-import net.minecraft.entity.player.EntityPlayer;
-import net.minecraft.util.text.TextFormatting;
-
-public class ScriptAPI extends Module
-{
-    private final SnuviParser qparser;
-    
-    private int idCounter;
-    
-    private final HashMap<Integer, Script> questData;
-    private final HashMap<UUID, Integer> playerQuestID;
-    
-    private final HashMap<Integer, Script> scripts;
-    
-    private final HashSet<String> scriptCommands;
-    
-    public ScriptAPI(String mname, String prefix, TextFormatting color) 
-    {
-        super(mname, prefix, color);
-        
-        questData = new HashMap<>();
-        playerQuestID = new HashMap<>();
-        scripts = new HashMap<>();
-        idCounter = 0;
-        qparser = new SnuviParser();
-        scriptCommands = new HashSet<>();
-    }
-       
-    // -------------------------------------------------------------------------
-    // QuestParser
-    // -------------------------------------------------------------------------
-    
-    public SnuviParser getQuestParser()
-    {
-        return qparser;
-    }
-    
-    // -------------------------------------------------------------------------
-    // custom commands
-    // -------------------------------------------------------------------------
-    
-    public boolean isRegisteredScriptCommand(String s)
-    {
-        return scriptCommands.contains(s);
-    }
-    
-    public void registerScriptCommand(String s)
-    {
-        scriptCommands.add(s);
-    }
-    
-    public void unregisterScriptCommand(String s)
-    {
-        scriptCommands.remove(s);
-    }
-    
-    public void clearScriptCommands()
-    {
-        scriptCommands.clear();
-    }
-    
-    // -------------------------------------------------------------------------
-    // Quest - Control
-    // -------------------------------------------------------------------------
-
-    private void addPlayerToQuest(EntityPlayer p, EntityPlayer p2, Script qd)
-    {             
-        if(hasQuest(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.getBoolean("no-join"))
-        {
-            this.send(p, "Du darfst dieser Quest nicht beitreten.");
-            return;
-        }
-        playerQuestID.put(p.getUniqueID(), qd.getId());
-        qd.addPlayer(p);
-        if(!qd.getBoolean("no-quest-msg"))
-        {
-            qparser.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.");
-            }
-        }
-        qd.setVar("event", "player-join");
-        ScriptVars.setPlayerVars(qd, p); 
-        qd.runCode();
-    } 
-    
-    public void addPlayerToPlayer(EntityPlayer p, EntityPlayer p2)
-    {             
-        addPlayerToQuest(p, p2, getQuestData(p2)); 
-    } 
-    
-    public void addPlayerToQuest(EntityPlayer p, Script qd)
-    {             
-        addPlayerToQuest(p, null, qd);  
-    } 
-    
-    public Collection<Script> getQuests()
-    {
-        return questData.values();
-    }
-    
-    public boolean hasQuest(EntityPlayer p)
-    {
-        return playerQuestID.containsKey(p.getUniqueID());
-    }
-    
-    public Script getQuestData(EntityPlayer p)
-    {
-        Integer id = playerQuestID.get(p.getUniqueID());
-        if(id == null)
-        {
-            return null;
-        }
-        Script qd = questData.get(id);
-        if(qd == null)
-        {
-            qparser.sendWarningToAllDevs("Die ungültige Quest von '" + p.getName() + "' wurde entfernt.");
-            return null;
-        }
-        return qd;
-    }
-    
-    public void removePlayerFromQuest(EntityPlayer p, Script qd)
-    {
-        if(qd == null)
-        {
-            return;
-        }
-        if(qd.removePlayer(p))
-        {
-            qd.setIsValid(false);
-            questData.remove(qd.getId());
-        }       
-        playerQuestID.remove(p.getUniqueID());
-    }
-    
-    public void removeQuests()
-    {
-        questData.values().forEach(qd -> qd.setIsValid(false));
-        questData.clear();
-        playerQuestID.clear();
-    }
-    
-    // -------------------------------------------------------------------------
-    // Script - Control
-    // -------------------------------------------------------------------------
-
-    public Script getScript(int id)
-    {
-        return scripts.get(id);
-    }
-    
-    public void removeScripts()
-    {
-        scripts.values().forEach(qd -> qd.setIsValid(false));
-        scripts.clear();
-    }
-    
-    public Collection<Script> getScripts()
-    {
-        return scripts.values();
-    }
-    
-    // -------------------------------------------------------------------------
-    // Quest / Script - Control
-    // -------------------------------------------------------------------------
-    
-    public void add(Script qd, EntityPlayer p)
-    {
-        if(p != null)
-        {
-            questData.put(idCounter, qd);
-            playerQuestID.put(p.getUniqueID(), qd.getId());
-        }
-        else
-        {
-            scripts.put(idCounter, qd);
-        }
-        idCounter++;
-    }
-    
-    public boolean term(Script qd)
-    {
-        if(qd == null)
-        {
-            return false;
-        }
-        qd.setIsValid(false);
-        int id = qd.getId();
-        if(qd.isScript())
-        {
-            KajetansMod.scheduler.scheduleTask(() -> scripts.remove(id), 0);
-            return scripts.containsKey(id);
-        }
-        qd.getPlayers().stream().forEach((player) -> 
-        {
-            playerQuestID.remove(player.getUniqueID());          
-        });
-        questData.remove(id);
-        return true;
-    }
-
-    // -----------------------
-    // Quests / Scripts loading and starting
-    // -----------------------
-    
-    public void startQuest(ICommandSender sender, String chosenQuest, EntityPlayer p, Entity executor, String forcedQuest)
-    {
-        /*List<String> contents = getQuestCode(sender, chosenQuest, false);
-        if(contents == null)
-        {                       
-            return;
-        }         */   
-        if(hasQuest(p))
-        {
-            this.send(sender, "Du hast bereits eine Quest.");
-            return;
-        }
-        Script other = getQuests().stream()
-                .filter(qd -> qd.getVar("add-if-name") != null)
-                .filter(qd -> qd.getVar("add-if-name").equals(chosenQuest))
-                .findAny().orElse(null);
-        if(other != null)
-        {            
-            addPlayerToQuest(p, other);
-            return;
-        }
-        Script qd = new Script(idCounter, p, chosenQuest, sender);
-        ScriptVars.setPlayerVars(qd, p); 
-        if(executor != null)
-        {
-            ScriptVars.setEntityVars(qd, executor);
-        }
-        if(forcedQuest != null)
-        {
-            qd.setVar("force", forcedQuest);
-        }
-        add(qd, p);
-        qd.runCode();
-    }
-    
-    public void startScript(ICommandSender sender, String chosenQuest)
-    {
-        /*List<String> contents = getQuestCode(sender, chosenQuest, true);
-        if(contents == null)
-        {                       
-            return;
-        }          */  
-        Script qd = new Script(idCounter, null, chosenQuest, sender);
-        add(qd, null);
-        if(qd.isValid())
-        {
-            qd.runCode();
-        }
-    }
-}

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

@@ -3,6 +3,7 @@ package me.km.snuviscript;
 import me.km.api.Module;
 import me.km.databank.SimpleDataBank;
 import java.sql.Connection;
+import me.hammerle.code.Code;
 import me.km.table.Table;
 
 public class ScriptBank extends SimpleDataBank
@@ -87,10 +88,10 @@ public class ScriptBank extends SimpleDataBank
 
     public Object getVar(String var, String uuid)
     {
-        return ScriptUtils.convertInput(this.getFirst("SELECT value from questdata "
+        return Code.convertInput(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));
+                + "questdata.var='" + var + "';", String.class), false);
     }    
     
     public void addMapElement(String map, String key, String value)
@@ -119,9 +120,9 @@ public class ScriptBank extends SimpleDataBank
 
     public Object getMapValue(String map, String key)
     {
-        return ScriptUtils.convertInput(this.getFirst("SELECT value from questmaps "
+        return Code.convertInput(this.getFirst("SELECT value from questmaps "
                 + "WHERE map = '" + map + "' AND "
-                + "keyname='" + key + "';", String.class));
+                + "keyname='" + key + "';", String.class), false);
     }  
     
     public void addDualMapElement(String map, String key, String key2, String value)
@@ -151,9 +152,9 @@ public class ScriptBank extends SimpleDataBank
 
     public Object getDualMapValue(String map, String key, String key2)
     {
-        return ScriptUtils.convertInput(this.getFirst("SELECT value from questdualmaps "
+        return Code.convertInput(this.getFirst("SELECT value from questdualmaps "
                 + "WHERE map = '" + map + "' AND "
                 + "keyname = '" + key + "' AND "
-                + "seckeyname='" + key2 + "';", String.class));
+                + "seckeyname='" + key2 + "';", String.class), false);
     } 
 }

+ 173 - 196
src/main/java/me/km/snuviscript/ScriptEvents.java

@@ -6,13 +6,17 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.UUID;
 import java.util.function.Consumer;
-import java.util.function.Predicate;
 import java.util.stream.Collectors;
+import me.hammerle.code.Code;
+import me.hammerle.code.Script;
+import me.hammerle.code.SnuviParser;
+import me.hammerle.exceptions.SnuviException;
 import me.km.KajetansMod;
 import me.km.api.Location;
 import me.km.api.ModuleListener;
 import me.km.api.Module;
 import me.km.api.Utils;
+import me.km.dimensions.ModDimensions;
 import me.km.effects.PlayerUsesEffectEvent;
 import me.km.events.PlayerHurtEvent;
 import me.km.events.PlayerJoinMessageEvent;
@@ -50,57 +54,44 @@ import net.minecraftforge.fml.common.gameevent.PlayerEvent;
 public class ScriptEvents extends ModuleListener
 {               
     private final HashMap<UUID, UUID> questJoin;
+    private final SnuviParser parser;
                  
     public ScriptEvents(Module m)
     {    
         super(m);
         questJoin = new HashMap<>();
+        parser = KajetansMod.scripts.getSnuviParser();
     }  
     
     // -------------------------------------------------------------------------
     // Basics
     // -------------------------------------------------------------------------
-        
-    private void doInEvent(Script data, EntityPlayer p, String event, Consumer<Script> before, Consumer<Script> after)
-    {
-        data.setVar("event", event);
-        if(p != null)
-        {
-            ScriptVars.setPlayerVars(data, p); 
-        }
-        if(before != null)
-        {
-            before.accept(data);
-        }
-        data.runCode();
-        if(after != null)
-        {
-            after.accept(data);
-        }
-    }
     
-    private void handleEvent(EntityPlayer p, String event, Predicate<? super Script> pre, Consumer<Script> before, Consumer<Script> after)
+    private void handleEvent(EntityPlayer p, String event, Consumer<Script> before, Consumer<Script> after)
     {      
-        KajetansMod.scripts.getScripts().stream().filter(pre).filter(qd -> qd.isEventLoaded(event)).forEach(data -> 
+        parser.callEvent(event, (sc) -> 
         {
-            doInEvent(data, p, event, before, after);
-        });
+            if(p != null)
+            {
+                ScriptVars.setPlayerVars(sc, p); 
+            }
+            before.accept(sc);
+        }, after);
         
-        if(p != null && KajetansMod.scripts.hasQuest(p))
+        if(p != null)
         {
-            Script data = KajetansMod.scripts.getQuestData(p);
-            if(data != null && data.isEventLoaded(event) && pre.test(data))
+            Script data = KajetansMod.scripts.getScript(p);
+            if(data != null)
             {
-                doInEvent(data, p, event, before, after);
+                parser.callEvent(event, data, (sc) -> 
+                {
+                    ScriptVars.setPlayerVars(sc, p); 
+                    before.accept(sc);
+                }, after);
             }
         }      
     }
-    
-    private void handleEvent(EntityPlayer p, String event, Consumer<Script> before, Consumer<Script> after)
-    {      
-        handleEvent(p, event, (qd) -> true, before, after);    
-    }
-    
+
     private void handleEvent(EntityPlayer p, String event, Consumer<Script> before)
     {      
         handleEvent(p, event, before, null);
@@ -119,7 +110,7 @@ public class ScriptEvents extends ModuleListener
         }
         EntityPlayer p = e.getEntityPlayer();   
         EntityPlayer affectedPlayer = (EntityPlayer) e.getTarget();
-        if(KajetansMod.scripts.hasQuest(p) && !KajetansMod.scripts.hasQuest(affectedPlayer))
+        if(KajetansMod.scripts.hasScript(p) && !KajetansMod.scripts.hasScript(affectedPlayer))
         {
             if(questJoin.get(affectedPlayer.getUniqueID()) != null)
             {
@@ -133,7 +124,7 @@ public class ScriptEvents extends ModuleListener
             this.getModule().send(p, affectedPlayer.getName() + " wurde eine Anfrage gesendet.");
             return;
         }
-        if(!KajetansMod.scripts.hasQuest(p) && questJoin.get(p.getUniqueID()) != null && KajetansMod.scripts.hasQuest(affectedPlayer))
+        if(!KajetansMod.scripts.hasScript(p) && questJoin.get(p.getUniqueID()) != null && KajetansMod.scripts.hasScript(affectedPlayer))
         {
             if(questJoin.get(p.getUniqueID()).equals(affectedPlayer.getUniqueID()))
             {
@@ -147,75 +138,68 @@ public class ScriptEvents extends ModuleListener
     public void onPlayerMove(PlayerMoveEvent e)
     {      
         EntityPlayer p = e.getEntityPlayer();
-        KajetansMod.scripts.getScripts().stream().filter(qd -> qd.isEventLoaded("player-move")).forEach(data -> 
+        parser.getScripts().stream().filter(sc -> sc.isLoadedEvent("player_move")).forEach(sc -> 
         {
-            if(data.removeLocation(Location.rounded(p)))
+            if(((MinecraftScript) sc).removeLocation(new Location(p)))
             {
-                doInEvent(data, p, "player-move", null, null);
+                ScriptVars.setPlayerVars(sc, p);   
+                parser.callEvent("player_move", sc, null, null);
             }
         });
 
-        if(KajetansMod.scripts.hasQuest(p))
+        PlayerScript sc = KajetansMod.scripts.getScript(p);
+        if(sc != null && sc.isLoadedEvent("player_move") && sc.removeLocation(new Location(p)))
         {
-            Script data = KajetansMod.scripts.getQuestData(p);
-            if(data != null && data.isEventLoaded("player-move") && data.removeLocation(Location.rounded(p)))
-            {
-                doInEvent(data, p, "player-move", null, null);
-            }
-        }  
+            ScriptVars.setPlayerVars(sc, p); 
+            parser.callEvent("player_move", sc, null, null);
+        }
     } 
     
     public boolean QuestClickInventory(Script qd, SnuviInventory inv, int slot, ClickType click, EntityPlayer p)
     {
-        if(qd.isEventLoaded("inv-click"))
+        parser.callEvent("inv_click", qd, sc -> 
         {
-            qd.setVar("event", "inv-click");
             ScriptVars.setPlayerVars(qd, p); 
-            qd.setVar("inv-id", inv.getId());
-            qd.setVar("inv-name", inv.getName());
-            qd.setVar("inv-slot", slot);
+            qd.setEventVar("inv_id", inv.getId());
+            qd.setEventVar("inv_name", inv.getName());
+            qd.setEventVar("inv_slot", slot);
             ScriptVars.setItemVars(qd, inv.getStackInSlot(slot));
             qd.setVar("cancel", false); 
-            qd.runCode();
-            return qd.getBoolean("cancel");
-        }
-        return false;
+        }, null);
+        return qd.getBooleanVar("cancel");
     }
 
     public boolean QuestCloseInventory(Script qd, SnuviInventory inv, EntityPlayer p)
     {
-        if(qd.isEventLoaded("inv-close"))
+        parser.callEvent("inv_close", qd, sc -> 
         {
-            qd.setVar("event", "inv-close");
             ScriptVars.setPlayerVars(qd, p); 
-            qd.setVar("inv-id", inv.getId());
-            qd.setVar("inv-name", inv.getName());
+            qd.setEventVar("inv_id", inv.getId());
+            qd.setEventVar("inv_name", inv.getName());
             qd.setVar("cancel", false); 
-            qd.runCode();
-            return qd.getBoolean("cancel");
-        }
-        return false;
+        }, null);
+        return qd.getBooleanVar("cancel");
     }
     
     @SubscribeEvent
     public void QuestOnPlayerRespawn(PlayerRespawnAtEvent e)
     {
-        handleEvent(e.getEntityPlayer(), "player-respawn", (qd) -> 
+        handleEvent(e.getEntityPlayer(), "player_respawn", (qd) -> 
         {
-            qd.setVar("keep-inventory", e.isInventoryKeepingForced());
-            qd.setVar("respawn-loc", new Location(e.getWorld(), e.getRespawnLoc()));
+            qd.setVar("keep_inventory", e.isInventoryKeepingForced());
+            qd.setVar("respawn_loc", new Location(e.getWorld(), e.getRespawnLoc()));
         }, (qd) -> 
         {
             try 
             {
-                e.setForcedInventoryKeeping(qd.getBoolean("keep-inventory"));
-                Location l = (Location) qd.getVar("respawn-loc");
+                e.setForcedInventoryKeeping(qd.getBooleanVar("keep_inventory"));
+                Location l = (Location) qd.getVar("respawn_loc");
                 e.setRespawnLoc(l.getPos());
                 e.setWorld((WorldServer) l.getWorld());
             } 
             catch(ClassCastException | NullPointerException ex) 
             {
-                KajetansMod.scripts.getQuestParser().printQuestException(qd, ex, "(respawn-loc)");
+                KajetansMod.scripts.logger.printException(new SnuviException(ex, qd.getName(), "(respawn_loc)"));
             }
         });
     }
@@ -224,32 +208,32 @@ public class ScriptEvents extends ModuleListener
     public void QuestPlayerDamage(PlayerHurtEvent e)
     {        
         EntityPlayer p = e.getEntityPlayer();  
-        handleEvent(p, "player-hurt", (qd) -> 
+        handleEvent(p, "player_hurt", (qd) -> 
         {
             if(p.getHealth() <= e.getAmount())
             {
-                qd.setVar("player-killed", true);   
+                qd.setVar("player_killed", true);   
             }  
             else
             {
-                qd.setVar("player-killed", false); 
+                qd.setVar("player_killed", false); 
             }
-            qd.setVar("player-damage", e.getAmount());   
-            qd.setVar("player-damage-cause", e.getSource().getDamageType());
+            qd.setVar("player_damage", e.getAmount());   
+            qd.setVar("player_damage_cause", e.getSource().getDamageType());
             EntityPlayer ent = Utils.getDamager(e.getSource());
             if(ent != null)
             {
-                qd.setVar("player-involved", true);
+                qd.setVar("player_involved", true);
                 ScriptVars.setSecPlayer(qd, ent);
             }
             else
             {
-                qd.setVar("player-involved", false);
+                qd.setVar("player_involved", false);
             }
             qd.setVar("cancel", e.isCanceled()); 
         }, (qd) -> 
         {
-            e.setCanceled(qd.getBoolean("cancel")); 
+            e.setCanceled(qd.getBooleanVar("cancel")); 
         });
     } 
     
@@ -258,29 +242,29 @@ public class ScriptEvents extends ModuleListener
     {        
         if(!(e.getEntityLiving() instanceof EntityPlayer))
         {
-            handleEvent(null, "entity-death", (qd) -> 
+            handleEvent(null, "entity_death", (qd) -> 
             {
                 EntityLivingBase ent = e.getEntityLiving();
                 ScriptVars.setEntityVars(qd, ent);
                 EntityPlayer p = Utils.getDamager(e.getSource());
                 if(p != null)
                 {
-                    qd.setVar("player-involved", true);
+                    qd.setVar("player_involved", true);
                     ScriptVars.setPlayerVars(qd, p);
                 }  
                 else
                 {
-                    qd.setVar("player-involved", false);
+                    qd.setVar("player_involved", false);
                 }
                 qd.setVar("cancel", e.isCanceled()); 
             }, (qd) -> 
             {
-                e.setCanceled(qd.getBoolean("cancel")); 
+                e.setCanceled(qd.getBooleanVar("cancel")); 
             });
             return;
         }
         EntityPlayer p = (EntityPlayer) e.getEntity();    
-        handleEvent(p, "player-death", (qd) -> 
+        handleEvent(p, "player_death", (qd) -> 
         {
             //qd.setVar("message", e.getDeathMessage());
             qd.setVar("clear", false);
@@ -293,11 +277,11 @@ public class ScriptEvents extends ModuleListener
         }, (qd) -> 
         {
             //e.setDeathMessage(String.valueOf(qd.getVar("message")));
-            if(qd.getBoolean("clear"))
+            if(qd.getBooleanVar("clear"))
             {
                 p.inventory.clear();
             } 
-            e.setCanceled(qd.getBoolean("cancel")); 
+            e.setCanceled(qd.getBooleanVar("cancel")); 
         });
     } 
        
@@ -309,16 +293,16 @@ public class ScriptEvents extends ModuleListener
         {
             return;
         }
-        handleEvent(p, "entity-hurt", (qd) -> 
+        handleEvent(p, "entity_hurt", (qd) -> 
         {
-            qd.setVar("entity-killed", e.getEntityLiving().getHealth() <= e.getAmount());        
+            qd.setVar("entity_killed", e.getEntityLiving().getHealth() <= e.getAmount());        
             ScriptVars.setEntityVars(qd, e.getEntity()); 
-            qd.setVar("entity-damage", e.getAmount());   
-            qd.setVar("entity-damage-cause", e.getSource().getDamageType());
+            qd.setVar("entity_damage", e.getAmount());   
+            qd.setVar("entity_damage_cause", e.getSource().getDamageType());
             qd.setVar("cancel", e.isCanceled());   
         }, (qd) -> 
         {
-            e.setCanceled(qd.getBoolean("cancel"));
+            e.setCanceled(qd.getBooleanVar("cancel"));
         });
     }
     
@@ -327,24 +311,24 @@ public class ScriptEvents extends ModuleListener
     {             
         try
         {
-            handleEvent(null, "entity-drop", (qd) -> 
+            handleEvent(null, "entity_drop", (qd) -> 
             {
                 qd.setVar("drops", e.getDrops());
                 ScriptVars.setEntityVars(qd, e.getEntityLiving());
                 EntityPlayer p = Utils.getDamager(e.getSource());
                 if(p != null)
                 {
-                    qd.setVar("player-involved", true);
+                    qd.setVar("player_involved", true);
                     ScriptVars.setPlayerVars(qd, p);
                 }  
                 else
                 {
-                    qd.setVar("player-involved", false);
+                    qd.setVar("player_involved", false);
                 }
                 qd.setVar("cancel", e.isCanceled()); 
             }, (qd) -> 
             {
-                e.setCanceled(qd.getBoolean("cancel"));
+                e.setCanceled(qd.getBooleanVar("cancel"));
             });
         }
         catch(NullPointerException ex)
@@ -356,12 +340,12 @@ public class ScriptEvents extends ModuleListener
     @SubscribeEvent
     public void QuestPlayerDrop(PlayerDropsEvent e)
     {             
-        handleEvent(e.getEntityPlayer(), "player-drop", (qd) -> 
+        handleEvent(e.getEntityPlayer(), "player_drop", (qd) -> 
         {
             qd.setVar("cancel", e.isCanceled()); 
         }, (qd) -> 
         {
-            e.setCanceled(qd.getBoolean("cancel"));
+            e.setCanceled(qd.getBooleanVar("cancel"));
         });
     } 
     
@@ -371,16 +355,16 @@ public class ScriptEvents extends ModuleListener
         EntityPlayer p = Utils.getPlayerFromProjectile(e.getEntityThrowable());
         if(p != null)
         {
-            handleEvent(p, "throw-hit", (qd) -> 
+            handleEvent(p, "throw_hit", (qd) -> 
             {
                 if(e.getRayTraceResult().entityHit != null)
                 {
-                    qd.setVar("is-entity-hit", true);
-                    qd.setVar("entity-hit", e.getRayTraceResult().entityHit);
+                    qd.setVar("is_entity_hit", true);
+                    qd.setVar("entity_hit", e.getRayTraceResult().entityHit);
                 }
                 else
                 {
-                    qd.setVar("is-entity-hit", false);
+                    qd.setVar("is_entity_hit", false);
                 }
                 ScriptVars.setEntityVars(qd, e.getEntityThrowable());
             });
@@ -389,7 +373,7 @@ public class ScriptEvents extends ModuleListener
     
     public void onEntityItemProjectileHit(EntityPlayer p, ItemStack stack, List<Entity> ents)
     {        
-        handleEvent(p, "item-hit", (qd) -> 
+        handleEvent(p, "item_hit", (qd) -> 
         {
             ScriptVars.setItemVars(qd, stack);
             qd.setVar("entities", ents);
@@ -409,29 +393,29 @@ public class ScriptEvents extends ModuleListener
             return;
         }
         EntitySheep sheep = (EntitySheep) e.getTarget();
-        handleEvent(p, "entity-shear", (qd) -> 
+        handleEvent(p, "entity_shear", (qd) -> 
         {
             ScriptVars.setEntityVars(qd, sheep);
-            qd.setVar("entity-sheared", sheep.getSheared());
-            qd.setVar("entity-color", sheep.getFleeceColor().toString());
+            qd.setVar("entity_sheared", sheep.getSheared());
+            qd.setVar("entity_color", sheep.getFleeceColor().toString());
             qd.setVar("cancel", e.isCanceled()); 
         }, (qd) -> 
         {
-            e.setCanceled(qd.getBoolean("cancel")); 
-            sheep.setSheared(qd.getBoolean("entity-sheared"));
+            e.setCanceled(qd.getBooleanVar("cancel")); 
+            sheep.setSheared(qd.getBooleanVar("entity_sheared"));
         });
     }
        
     @SubscribeEvent
     public void QuestBlockBreak(BlockEvent.BreakEvent e)
     {        
-        handleEvent(e.getPlayer(), "block-break", (qd) -> 
+        handleEvent(e.getPlayer(), "block_break", (qd) -> 
         {
             ScriptVars.setBlockVars(qd, e.getWorld(), e.getPos());
             qd.setVar("cancel", e.isCanceled()); 
         }, (qd) -> 
         {
-            e.setCanceled(qd.getBoolean("cancel")); 
+            e.setCanceled(qd.getBooleanVar("cancel")); 
         });
     }
     
@@ -443,12 +427,12 @@ public class ScriptEvents extends ModuleListener
         {
             return;
         }
-        handleEvent(p, "player-login", (qd) -> 
+        handleEvent(p, "player_login", (qd) -> 
         {       
-            qd.setVar("first-join", Utils.hasPlayedBefore(p));
+            qd.setVar("first_join", Utils.hasPlayedBefore(p));
             PlayerList list = KajetansMod.server.getPlayerList();
-            qd.setVar("is-banned", list.getBannedPlayers().isBanned(p.getGameProfile()));
-            qd.setVar("is-whitelisted", list.getWhitelistedPlayers().isWhitelisted(p.getGameProfile()));
+            qd.setVar("is_banned", list.getBannedPlayers().isBanned(p.getGameProfile()));
+            qd.setVar("is_whitelisted", list.getWhitelistedPlayers().isWhitelisted(p.getGameProfile()));
         });
     }
     
@@ -456,15 +440,15 @@ public class ScriptEvents extends ModuleListener
     public void QuestPlayerJoin(PlayerJoinMessageEvent e)
     {    
         EntityPlayer p = e.getEntityPlayer();
-        handleEvent(p, "player-join-server", (qd) -> 
+        handleEvent(p, "player_join_server", (qd) -> 
         {       
             qd.setVar("message", e.getMessage());
-            qd.setVar("changed-name", e.hasNameChanged());
+            qd.setVar("changed_name", e.hasNameChanged());
             qd.setVar("cancel", e.isCanceled()); 
         }, (qd) -> 
         {
             e.setMessage(String.valueOf(qd.getVar("message"))); 
-            e.setCanceled(qd.getBoolean("cancel")); 
+            e.setCanceled(qd.getBooleanVar("cancel")); 
         });
     }
     
@@ -472,21 +456,21 @@ public class ScriptEvents extends ModuleListener
     public void onPlayerLeave(PlayerLeaveMessageEvent e)
     {      
         EntityPlayer p = e.getEntityPlayer();
-        handleEvent(p, "player-leave", (qd) -> 
+        handleEvent(p, "player_leave", (qd) -> 
         {       
             qd.setVar("message", e.getMessage());
             qd.setVar("cancel", e.isCanceled()); 
         }, (qd) -> 
         {
             e.setMessage(String.valueOf(qd.getVar("message"))); 
-            e.setCanceled(qd.getBoolean("cancel")); 
+            e.setCanceled(qd.getBooleanVar("cancel")); 
         });
     }
     
     @SubscribeEvent
     public void QuestBucketFill(FillBucketEvent e)
     {      
-        handleEvent(e.getEntityPlayer(), "bucket-fill", (qd) -> 
+        handleEvent(e.getEntityPlayer(), "bucket_fill", (qd) -> 
         {
             RayTraceResult ray = e.getTarget();
             if(ray != null)
@@ -494,36 +478,36 @@ public class ScriptEvents extends ModuleListener
                 BlockPos pos = ray.getBlockPos();
                 if(pos != null)
                 {
-                    qd.setVar("has-block", true); 
+                    qd.setVar("has_block", true); 
                     ScriptVars.setBlockVars(qd, e.getWorld(), pos);
                 }
                 else
                 {
-                    qd.setVar("has-block", false); 
+                    qd.setVar("has_block", false); 
                 }
             }
             else
             {
-                qd.setVar("has-block", false); 
+                qd.setVar("has_block", false); 
             }
             qd.setVar("cancel", e.isCanceled()); 
         }, (qd) -> 
         {
-            e.setCanceled(qd.getBoolean("cancel")); 
+            e.setCanceled(qd.getBooleanVar("cancel")); 
         });
     } 
        
     @SubscribeEvent
     public void QuestBlockPlace(BlockEvent.PlaceEvent e)
     {
-        handleEvent(e.getPlayer(), "block-place", (qd) -> 
+        handleEvent(e.getPlayer(), "block_place", (qd) -> 
         {
-            qd.setVar("block-type-after", e.getPlacedBlock().getBlock().getRegistryName());
+            qd.setVar("block_type_after", e.getPlacedBlock().getBlock().getRegistryName());
             ScriptVars.setBlockVars(qd, e.getWorld(), e.getPos());
             qd.setVar("cancel", e.isCanceled()); 
         }, (qd) -> 
         {
-            e.setCanceled(qd.getBoolean("cancel")); 
+            e.setCanceled(qd.getBooleanVar("cancel")); 
         });
     }    
     
@@ -534,14 +518,14 @@ public class ScriptEvents extends ModuleListener
         {
             return;
         }
-        handleEvent(e.getEntityPlayer(), "block-click", (qd) -> 
+        handleEvent(e.getEntityPlayer(), "block_click", (qd) -> 
         {
             qd.setVar("action", "right");
             ScriptVars.setBlockVars(qd, e.getWorld(), e.getPos());
             qd.setVar("cancel", e.isCanceled()); 
         }, (qd) -> 
         {
-            e.setCanceled(qd.getBoolean("cancel")); 
+            e.setCanceled(qd.getBooleanVar("cancel")); 
         });       
     }
     
@@ -552,14 +536,14 @@ public class ScriptEvents extends ModuleListener
         {
             return;
         }
-        handleEvent(e.getEntityPlayer(), "block-click", (qd) -> 
+        handleEvent(e.getEntityPlayer(), "block_click", (qd) -> 
         {
             qd.setVar("action", "left");
             ScriptVars.setBlockVars(qd, e.getWorld(), e.getPos());
             qd.setVar("cancel", e.isCanceled()); 
         }, (qd) -> 
         {
-            e.setCanceled(qd.getBoolean("cancel")); 
+            e.setCanceled(qd.getBooleanVar("cancel")); 
         });       
     }
     
@@ -568,13 +552,13 @@ public class ScriptEvents extends ModuleListener
     {
         if(e.getHand() != EnumHand.OFF_HAND)
         {
-            handleEvent(e.getEntityPlayer(), "entity-click", (qd) -> 
+            handleEvent(e.getEntityPlayer(), "entity_click", (qd) -> 
             {
                 ScriptVars.setEntityVars(qd, e.getTarget());
                 qd.setVar("cancel", e.isCanceled()); 
             }, (qd) -> 
             {
-                e.setCanceled(qd.getBoolean("cancel")); 
+                e.setCanceled(qd.getBooleanVar("cancel")); 
             });
         }
     }
@@ -588,27 +572,27 @@ public class ScriptEvents extends ModuleListener
             qd.setVar("cancel", e.isCanceled()); 
         }, (qd) -> 
         {
-            e.setCanceled(qd.getBoolean("cancel")); 
+            e.setCanceled(qd.getBooleanVar("cancel")); 
         });
     }
     
     @SubscribeEvent
     public void onItemClick(PlayerInteractEvent.RightClickItem e)
     {        
-        handleEvent(e.getEntityPlayer(), "item-air-click", (qd) -> 
+        handleEvent(e.getEntityPlayer(), "item_air_click", (qd) -> 
         {
             ScriptVars.setItemVars(qd, e.getItemStack());
             qd.setVar("hand", e.getHand().toString());
             qd.setVar("cancel", e.isCanceled());  
         }, (qd) -> 
         {
-            e.setCanceled(qd.getBoolean("cancel"));
+            e.setCanceled(qd.getBooleanVar("cancel"));
         });
     }
     
     public void onArmSwing(EntityPlayer p, EnumHand hand)
     {        
-        handleEvent(p, "arm-swing", (qd) -> 
+        handleEvent(p, "arm_swing", (qd) -> 
         {
             qd.setVar("hand", hand);
         });
@@ -621,20 +605,20 @@ public class ScriptEvents extends ModuleListener
         {
             return;
         }
-        handleEvent((EntityPlayer) e.getEntityLiving(), "item-use-start", (qd) -> 
+        handleEvent((EntityPlayer) e.getEntityLiving(), "item_use_start", (qd) -> 
         {
             qd.setVar("duration", e.getDuration());
             qd.setVar("cancel", e.isCanceled());  
         }, (qd) -> 
         {
-            e.setCanceled(qd.getBoolean("cancel"));
+            e.setCanceled(qd.getBooleanVar("cancel"));
             try
             {
                 e.setDuration((int) qd.getVar("duration"));
             }
             catch(Exception ex)
             {
-                KajetansMod.scripts.getQuestParser().printQuestException(qd, ex, "(duration)");           
+                KajetansMod.scripts.logger.printException(new SnuviException(ex, qd.getName(), "(duration)"));
             }
         });
     }
@@ -646,9 +630,9 @@ public class ScriptEvents extends ModuleListener
         {
             return;
         }
-        handleEvent((EntityPlayer) e.getEntityLiving(), "item-use-finish", (qd) -> 
+        handleEvent((EntityPlayer) e.getEntityLiving(), "item_use_finish", (qd) -> 
         {
-            qd.setVar("result-stack", e.getResultStack());  
+            qd.setVar("result_stack", e.getResultStack());  
         });
     }
     
@@ -658,36 +642,32 @@ public class ScriptEvents extends ModuleListener
         handleEvent(e.player, "craft", (qd) -> 
         {
             ScriptVars.setItemVars(qd, e.crafting);
-            qd.setVar("cancel", e.isCanceled()); 
-        }, (qd) -> 
-        {
-            e.setCanceled(qd.getBoolean("cancel")); 
         });   
     } 
     
     @SubscribeEvent
     public void QuestDropItem(ItemTossEvent e)
     {
-        handleEvent(e.getPlayer(), "player-toss", (qd) -> 
+        handleEvent(e.getPlayer(), "player_toss", (qd) -> 
         {
             ScriptVars.setItemVars(qd, e.getEntityItem().getEntityItem());   
             qd.setVar("cancel", e.isCanceled()); 
         }, (qd) -> 
         {
-            e.setCanceled(qd.getBoolean("cancel")); 
+            e.setCanceled(qd.getBooleanVar("cancel")); 
         });
     }
     
     @SubscribeEvent
     public void QuestPickupItem(EntityItemPickupEvent e)
     {
-        handleEvent(e.getEntityPlayer(), "player-pickup", (qd) -> 
+        handleEvent(e.getEntityPlayer(), "player_pickup", (qd) -> 
         {
             ScriptVars.setItemVars(qd, e.getItem().getEntityItem());  
             qd.setVar("cancel", e.isCanceled()); 
         }, (qd) -> 
         {
-            e.setCanceled(qd.getBoolean("cancel")); 
+            e.setCanceled(qd.getBooleanVar("cancel")); 
         });
     }
     
@@ -699,14 +679,14 @@ public class ScriptEvents extends ModuleListener
             return;
         }
         EntityPlayer p = (EntityPlayer) e.getEntityMounting();
-        handleEvent(p, "entity-mount", (qd) -> 
+        handleEvent(p, "entity_mount", (qd) -> 
         {
             qd.setVar("mounting", e.isMounting()); 
             ScriptVars.setEntityVars(qd, e.getEntityBeingMounted()); 
             qd.setVar("cancel", e.isCanceled()); 
         }, (qd) -> 
         {
-            e.setCanceled(qd.getBoolean("cancel")); 
+            e.setCanceled(qd.getBooleanVar("cancel")); 
         });
     }
     
@@ -715,8 +695,8 @@ public class ScriptEvents extends ModuleListener
     {
         handleEvent(e.player, "portal", (qd) -> 
         {
-            qd.setVar("from", e.fromDim);
-            qd.setVar("to", e.toDim);
+            qd.setVar("from", ModDimensions.getWorldName(e.fromDim));
+            qd.setVar("to", ModDimensions.getWorldName(e.toDim));
         });
     }
     
@@ -728,18 +708,18 @@ public class ScriptEvents extends ModuleListener
             handleEvent((EntityPlayer) e.getSender(), "command", (qd) -> 
             {
                 qd.setVar("command", e.getCommand().getName()); 
-                qd.setVar("args", Arrays.stream(e.getParameters()).map(s -> ScriptUtils.convertInput(s)).collect(Collectors.toList()));
+                qd.setVar("args", Arrays.stream(e.getParameters()).map(s -> Code.convertInput(s, false)).collect(Collectors.toList()));
                 qd.setVar("cancel", e.isCanceled()); 
             }, (qd) -> 
             {
-                e.setCanceled(qd.getBoolean("cancel")); 
+                e.setCanceled(qd.getBooleanVar("cancel")); 
             });
         }
     }
     
     public void onCustomCommand(EntityPlayer p, String command, String args)
     {
-        handleEvent(p, "custom-command", (qd) -> 
+        handleEvent(p, "custom_command", (qd) -> 
         {
             qd.setVar("command", command);
             if(args.length() == 0)
@@ -747,16 +727,16 @@ public class ScriptEvents extends ModuleListener
                 qd.setVar("args", new ArrayList<>());
                 return;
             }
-            qd.setVar("args", Arrays.stream(args.trim().split(" ")).map(s -> ScriptUtils.convertInput(s)).collect(Collectors.toList()));
+            qd.setVar("args", Arrays.stream(args.trim().split(" ")).map(s -> Code.convertInput(s, false)).collect(Collectors.toList()));
         });
     }
       
     public void useEffectEvent(PlayerUsesEffectEvent e)
     {    
-        handleEvent(e.getPlayer(), "player-use-effect", (qd) -> 
+        handleEvent(e.getPlayer(), "player_use_effect", (qd) -> 
         {       
             qd.setVar("power", e.getPower());
-            qd.setVar("mana-cost", e.getMana());
+            qd.setVar("mana_cost", e.getMana());
             qd.setVar("cause", e.getCause().toString());
             qd.setVar("effect", e.getEffect());
             qd.setVar("cancel", e.isCanceled());
@@ -773,11 +753,11 @@ public class ScriptEvents extends ModuleListener
             }
             catch(Exception ex)
             {
-                KajetansMod.scripts.getQuestParser().printQuestException(qd, ex, "(power)");           
+                KajetansMod.scripts.logger.printException(new SnuviException(ex, qd.getName(), "(power)"));
             }
             try
             {
-                int mana = (int) qd.getVar("mana-cost");
+                int mana = (int) qd.getVar("mana_cost");
                 if(mana < 0)
                 {
                     throw new IllegalArgumentException();
@@ -785,54 +765,51 @@ public class ScriptEvents extends ModuleListener
                 e.setMana(mana);
             }
             catch(Exception ex)
-            {
-                KajetansMod.scripts.getQuestParser().printQuestException(qd, ex, "(mana-cost)");           
+            {  
+                KajetansMod.scripts.logger.printException(new SnuviException(ex, qd.getName(), "(mana_cost)"));
             }
-            e.setCanceled(qd.getBoolean("cancel")); 
+            e.setCanceled(qd.getBooleanVar("cancel")); 
         });
     }
     
     @SubscribeEvent
     public void QuestVillagerPickUpItem(ItemTossEvent e)
     {             
-        EntityPlayer p = e.getPlayer();
-        if(KajetansMod.scripts.hasQuest(p))
-        {           
-            Script qd = KajetansMod.scripts.getQuestData(p);
-            if(qd == null || !qd.isEventLoaded("villager-give"))
+        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;
             }
-            final EntityItem itemEnt = e.getEntityItem();
-            KajetansMod.scheduler.scheduleTask(() -> 
+            EntityVillager v = Utils.getNearestEntity(p.world, itemEnt.getPositionVector(), 2, EntityVillager.class);
+            if(v == null)
             {
-                if(itemEnt.isDead)
-                {
-                    return;
-                }
-                EntityVillager v = Utils.getNearestEntity(p.world, itemEnt.getPositionVector(), 2, EntityVillager.class);
-                if(v == null)
-                {
-                    return;
-                }
-                Script data = KajetansMod.scripts.getQuestData(p);
-                if(data == null || !data.isEventLoaded("villager-give"))
-                {
-                    return;
-                }
-                data.setVar("event", "villager-give");
-                ScriptVars.setPlayerVars(data, p); 
-                ScriptVars.setItemVars(data, itemEnt.getEntityItem());
-                data.setVar("villager-loc", new Location(v));                    
-                data.setVar("villager-prof", v.getProfessionForge().getRegistryName());
-                data.setVar("cancel", e.isCanceled()); 
-                data.runCode();
-                if(data.getBoolean("cancel"))
-                {
-                    return;
-                }                  
-                itemEnt.setDead();                
-            }, 40);          
-        }               
+                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.getEntityItem());
+            data.setVar("villager_loc", new Location(v));                    
+            data.setVar("villager_prof", v.getProfessionForge().getRegistryName());
+            data.setVar("cancel", e.isCanceled()); 
+            data.runCode();
+            if(data.getBooleanVar("cancel"))
+            {
+                return;
+            }                  
+            itemEnt.setDead();                
+        }, 40);                    
     }
 }

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

@@ -0,0 +1,131 @@
+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);
+    }   
+}

+ 2 - 2
src/main/java/me/km/snuviscript/ScriptInventoryHolder.java

@@ -8,11 +8,11 @@ import net.minecraft.inventory.ClickType;
 
 public class ScriptInventoryHolder extends CustomContainer
 {
-    private final Script qd;
+    private final MinecraftScript qd;
     private final ScriptEvents e;
     private final SnuviInventory inv;
 
-    public ScriptInventoryHolder(SnuviInventory inv, EntityPlayerMP p, Script qd) 
+    public ScriptInventoryHolder(SnuviInventory inv, EntityPlayerMP p, MinecraftScript qd) 
     {
         super(inv, p);
         this.qd = qd;

+ 197 - 0
src/main/java/me/km/snuviscript/ScriptModule.java

@@ -0,0 +1,197 @@
+package me.km.snuviscript;
+
+import me.km.KajetansMod;
+import me.km.api.Module;
+import java.util.HashMap;
+import java.util.HashSet;
+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 net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.util.text.TextFormatting;
+
+public class ScriptModule extends Module
+{
+    private final SnuviParser parser;
+    protected final MinecraftFunctions logger;
+    private final HashMap<UUID, Integer> playerScript;   
+    private final HashSet<String> scriptCommands;
+    
+    public ScriptModule(String mname, String prefix, TextFormatting color) 
+    {
+        super(mname, prefix, color);
+        logger = new MinecraftFunctions();
+        parser = new SnuviParser(logger, KajetansMod.scheduler);
+        MinecraftFunctions.registerFunctions(parser);
+        
+        playerScript = new HashMap<>();
+        scriptCommands = new HashSet<>();
+    }
+    
+    public SnuviParser getSnuviParser()
+    {
+        return parser;
+    }
+    
+    // -------------------------------------------------------------------------
+    // custom commands
+    // -------------------------------------------------------------------------
+    
+    public boolean isRegisteredScriptCommand(String s)
+    {
+        return scriptCommands.contains(s);
+    }
+    
+    public void registerScriptCommand(String s)
+    {
+        scriptCommands.add(s);
+    }
+    
+    public void unregisterScriptCommand(String s)
+    {
+        scriptCommands.remove(s);
+    }
+    
+    public void clearScriptCommands()
+    {
+        scriptCommands.clear();
+    }
+    
+    // -------------------------------------------------------------------------
+    // Quest - Control
+    // -------------------------------------------------------------------------
+
+    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"))
+        {
+            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.");
+            }
+        }
+        qd.setVar("event", "player-join");
+        ScriptVars.setPlayerVars(qd, p); 
+        qd.runCode();
+    } 
+    
+    public void addPlayerToPlayer(EntityPlayer p, EntityPlayer p2)
+    {             
+        addPlayerToScript(p, p2, getScript(p2)); 
+    } 
+    
+    public void addPlayerToQuest(EntityPlayer p, PlayerScript qd)
+    {             
+        addPlayerToScript(p, null, qd);  
+    } 
+    
+    public boolean hasScript(EntityPlayer p)
+    {
+        return playerScript.containsKey(p.getUniqueID());
+    }
+    
+    public PlayerScript getScript(EntityPlayer p)
+    {
+        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)
+        {
+            return null;
+        }
+    }
+    
+    public void removePlayerFromScript(EntityPlayer p, PlayerScript qd)
+    {
+        if(qd == null)
+        {
+            return;
+        }
+        if(qd.removePlayer(p))
+        {
+            parser.termSafe(qd);
+        }       
+        playerScript.remove(p.getUniqueID());
+    }
+    
+    public boolean isActive(String name)
+    {
+        return parser.getScripts().stream().anyMatch(sc -> sc.getName().equals(name));
+    }
+
+    // -----------------------
+    // Quests / Scripts loading and starting
+    // -----------------------
+    
+    public void startQuest(ICommandSender sender, String name, EntityPlayer p)
+    {
+        if(hasScript(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;
+        }
+        parser.startScript(PlayerScript.class, name, ScriptUtils.readCode("scripts/" + name, ".txt"), false, p);
+    }
+    
+    public void startScript(ICommandSender sender, String name)
+    {
+        try
+        {
+            parser.startScript(MinecraftScript.class, name, ScriptUtils.readCode("scripts/" + name, ".txt"), true);
+        }
+        catch(PrescriptException ex)
+        {
+            logger.printException(ex);
+        }
+    }
+}

+ 0 - 302
src/main/java/me/km/snuviscript/ScriptUtils.java

@@ -1,302 +0,0 @@
-package me.km.snuviscript;
-
-import me.km.exception.IllegalStringLocationException;
-import me.km.exception.IllegalItemStackStringException;
-import me.km.api.Location;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.stream.Collectors;
-import me.km.dimensions.ModDimensions;
-import me.km.utils.ItemStackUtils;
-import net.minecraft.block.Block;
-import net.minecraft.item.Item;
-import net.minecraft.item.ItemStack;
-import net.minecraft.util.math.BlockPos;
-import net.minecraft.util.math.Vec3d;
-
-public class ScriptUtils 
-{ 
-    public static Number getNumber(String s)
-    {
-        Double d = Double.parseDouble(s);
-        if(d.intValue() == d)
-        {
-            return d.intValue();
-        }
-        else if(d.longValue() == d)
-        {
-            return d.longValue();
-        }
-        return d;
-    }
-    
-    public static int getInt(Object o)
-    {
-        return ((Number) o).intValue();
-    }
-    
-    public static byte getByte(Object o)
-    {
-        return ((Number) o).byteValue();
-    }
-    
-    public static double getDouble(Object o)
-    {
-        return ((Number) o).doubleValue();
-    }
-    
-    public static float getFloat(Object o)
-    {
-        return ((Number) o).floatValue();
-    }
-    
-    public static String connect(Collection<Object> c, String s, int skip)
-    {
-        return c.stream().skip(skip).map(o -> o.toString()).collect(Collectors.joining(s));
-    }
-    
-    public static String connect(Object[] c, String s, int skip)
-    {
-        return Arrays.stream(c, skip, c.length).map(o -> o.toString()).collect(Collectors.joining(s));
-    }
-    
-    public static String connect(Collection<Object> c, int skip)
-    {
-        return c.stream().skip(skip).map(o -> String.valueOf(o)).collect(Collectors.joining());
-    }
-    
-    public static String connect(Object[] c, int skip)
-    {
-        return Arrays.stream(c, skip, c.length).map(o -> String.valueOf(o)).collect(Collectors.joining());
-    }
-    
-    /** Generiert einen String aus dem gegebenen Double, ein etwaiges <code>.0</code> wird entfernt.
-    * @param d ein Double
-    * @return der generierte String
-    */    
-    public static String doubleToString(double d)
-    {
-        if((int) d == d)
-        {
-            return String.valueOf((int) d);
-        }
-        return String.valueOf(d);
-    }
-    
-    /** Generiert eine Location aus dem gegebenen String.
-    * @param location String-Location
-    * @throws IllegalStringLocationException wenn der String nicht das Format "world-name:x:y:z" oder "..:yaw:pitch" besitzt.
-    * @return die generierte Location
-    */    
-    public static Location getLocation(String location) throws IllegalStringLocationException
-    {
-        String[] parts = location.split(":");
-        try
-        {
-            if(parts.length > 4)
-            {
-                return new Location(ModDimensions.getWorldFromName(parts[0]), new Vec3d(Double.parseDouble(parts[1]), 
-                        Double.parseDouble(parts[2]), Double.parseDouble(parts[3])),
-                        Float.parseFloat(parts[4]), Float.parseFloat(parts[5]));
-            }
-            return new Location(ModDimensions.getWorldFromName(parts[0]), new Vec3d(Double.parseDouble(parts[1]), Double.parseDouble(parts[2]), Double.parseDouble(parts[3])));
-        }
-        catch(Exception ex)
-        {
-            throw new IllegalStringLocationException(location);
-        }
-    }
-    
-    /** Rundet eine Location zu einer Block-Location
-    * @param l Location
-    * @return die generierte Location
-    */    
-    public static Location roundLocation(Location l)
-    {
-        return new Location(l.getWorld(), new BlockPos(l.getPos()));
-    }
-    
-    /** Generiert einen Location-String aus der gegebenen Location.
-    * @param l eine Location
-    * @return Location-String im Format "world-name:x:y:z"
-    */ 
-    public static String getLocationString(Location l)
-    {
-        Vec3d v = l.getPos();
-        return ModDimensions.getWorldName(l.getWorld()) + ":" + v.xCoord + ":" + v.yCoord + ":" + v.zCoord + ":" + l.getYaw()+ ":" + l.getPitch();
-    }
-    
-    /** Generiert einen Block-Location-String aus der gegebenen Location.
-    * @param l eine Location
-    * @return Location-String im Format "world-name:x:y:z"
-    */ 
-    public static String getBlockLocationString(Location l)
-    {
-        Vec3d v = l.getPos();
-        return ModDimensions.getWorldName(l.getWorld()) + ":" + ((int) v.xCoord) + ":" + ((int) v.yCoord) + ":" + ((int) v.zCoord);
-    }
-    
-    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(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);
-    }   
-    
-    /** Konvertiert einen String in die gewünschten Formate (true, false, null, Zahl, ...)
-    * @param s ein String
-    * @return ein konvertiertes Object
-    */
-    public static Object convertInput(String s)
-    {
-        if(s == null)
-        {
-            return null;
-        }
-        else if(s.startsWith("\"") && s.endsWith("\""))
-        {
-            if(s.length() <= 1)
-            {
-                return "\"";
-            }
-            return s.substring(1, s.length() - 1);
-        }
-        else if(s.startsWith("$"))
-        {
-            return new Variable(s);
-        }
-        else if(s.equals("true"))
-        {
-            return true;
-        }
-        else if(s.equals("false"))
-        {
-            return false;
-        }
-        else if(s.equals("null"))
-        {
-            return null;
-        }
-        try
-        {
-            return getNumber(s);
-        }
-        catch(NumberFormatException ex)
-        {
-            return s;
-        }
-    }
-}

+ 12 - 11
src/main/java/me/km/snuviscript/ScriptVars.java

@@ -1,5 +1,6 @@
 package me.km.snuviscript;
 
+import me.hammerle.code.Script;
 import me.km.api.Location;
 import net.minecraft.block.state.IBlockState;
 import net.minecraft.entity.Entity;
@@ -14,35 +15,35 @@ public class ScriptVars
     public static void setBlockVars(Script qd, World w, BlockPos pos)
     {               
         IBlockState state = w.getBlockState(pos);
-        qd.setVar("block-loc", new Location(w, pos));
-        qd.setVar("block-type", state.getBlock().getRegistryName().toString());
-        qd.setVar("block-data", state.getBlock().getMetaFromState(state));
+        qd.setEventVar("block_loc", new Location(w, pos));
+        qd.setEventVar("block_type", state.getBlock().getRegistryName().toString());
+        qd.setEventVar("block_data", state.getBlock().getMetaFromState(state));
     }
     
     public static void setPlayerVars(Script qd, EntityPlayer p)
     {
-        qd.setVar("player", p);
-        qd.setVar("player-name", p.getName());
+        qd.setEventVar("player", p);
+        qd.setEventVar("player_name", p.getName());
     }
     
     public static void setSecPlayer(Script qd, EntityPlayer p)
     {
         if(p != null)
         {
-            qd.setVar("sec-player", p);
-            qd.setVar("sec-player-name", p.getName());
+            qd.setEventVar("sec_player", p);
+            qd.setEventVar("sec_player_name", p.getName());
         }
     }
 
     public static void setEntityVars(Script qd, Entity ent)
     {
-        qd.setVar("entity", ent);
-        qd.setVar("entity-name", ent.getDisplayName().getUnformattedText());
-        qd.setVar("entity-type", ent.getClass().getSimpleName());             
+        qd.setEventVar("entity", ent);
+        qd.setEventVar("entity_name", ent.getDisplayName().getUnformattedText());
+        qd.setEventVar("entity_type", ent.getClass().getSimpleName());             
     }
 
     public static void setItemVars(Script qd, ItemStack stack)
     {
-        qd.setVar("item", stack);
+        qd.setEventVar("item", stack);
     }   
 }

+ 0 - 1971
src/main/java/me/km/snuviscript/SnuviParser.java

@@ -1,1971 +0,0 @@
-package me.km.snuviscript;
-
-import com.google.common.collect.HashBiMap;
-import me.km.KajetansMod;
-import me.km.afk.AfkListener;
-import me.km.api.Module;
-import me.km.api.Utils;
-import me.km.environment.EnvironmentAPI;
-import me.km.exception.CodeTooLongException;
-import me.km.exception.EntityNotFoundException;
-import me.km.exception.GotoLabelNotFoundException;
-import me.km.exception.HoldCodeException;
-import me.km.exception.IfWithoutStatementException;
-import me.km.exception.IllegalItemStackStringException;
-import me.km.exception.IllegalStringException;
-import me.km.exception.IllegalStringLocationException;
-import me.km.exception.NoChildTreeException;
-import me.km.exception.PlayerNotFoundException;
-import me.km.nms.NmsUtilities;
-import me.km.plots.ProtectionBank;
-import me.km.table.TableAPI;
-import java.math.BigDecimal;
-import java.math.RoundingMode;
-import java.time.ZonedDateTime;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Calendar;
-import java.util.Collections;
-import java.util.GregorianCalendar;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.UUID;
-import java.util.function.BiFunction;
-import java.util.function.Consumer;
-import java.util.function.Function;
-import java.util.function.BiConsumer;
-import java.util.stream.Collectors;
-import me.km.api.Location;
-import me.km.api.TitleAPI;
-import me.km.dimensions.ModDimensions;
-import me.km.effects.EffectUtils;
-import me.km.inventory.InventoryUtils;
-import me.km.permissions.Permissions;
-import me.km.table.Table;
-import me.km.utils.ItemStackUtils;
-import me.km.utils.RecipeUtils;
-import me.km.utils.ReflectionUtils;
-import me.km.utils.SpecialBlockUtils;
-import net.minecraft.block.Block;
-import net.minecraft.block.BlockDoor;
-import net.minecraft.block.state.IBlockState;
-import net.minecraft.command.ICommandSender;
-import net.minecraft.enchantment.Enchantment;
-import net.minecraft.enchantment.EnchantmentHelper;
-import net.minecraft.entity.Entity;
-import net.minecraft.entity.EntityHanging;
-import net.minecraft.entity.EntityLiving;
-import net.minecraft.entity.EntityLivingBase;
-import net.minecraft.entity.item.EntityArmorStand;
-import net.minecraft.entity.item.EntityItemFrame;
-import net.minecraft.entity.monster.EntityCreeper;
-import net.minecraft.entity.passive.EntityVillager;
-import net.minecraft.entity.player.EntityPlayer;
-import net.minecraft.entity.player.EntityPlayerMP;
-import net.minecraft.entity.projectile.EntityPotion;
-import net.minecraft.inventory.EntityEquipmentSlot;
-import net.minecraft.inventory.IInventory;
-import net.minecraft.item.ItemStack;
-import net.minecraft.network.ThreadQuickExitException;
-import net.minecraft.network.play.client.CPacketChatMessage;
-import net.minecraft.network.play.client.CPacketClientStatus;
-import net.minecraft.network.play.server.SPacketSpawnPosition;
-import net.minecraft.potion.Potion;
-import net.minecraft.potion.PotionUtils;
-import net.minecraft.tileentity.TileEntity;
-import net.minecraft.tileentity.TileEntityChest;
-import net.minecraft.tileentity.TileEntitySign;
-import net.minecraft.util.DamageSource;
-import net.minecraft.util.EnumFacing;
-import net.minecraft.util.EnumParticleTypes;
-import net.minecraft.util.ResourceLocation;
-import net.minecraft.util.SoundCategory;
-import net.minecraft.util.SoundEvent;
-import net.minecraft.util.math.BlockPos;
-import net.minecraft.util.math.Vec3d;
-import net.minecraft.util.text.TextComponentString;
-import net.minecraft.world.World;
-import net.minecraft.world.WorldServer;
-
-public class SnuviParser 
-{
-    private final BiFunction<Object[], Script, Object>[] methods;
-    private final HashBiMap<String, Integer> translator;
-    
-    public Integer translateMethod(String s)
-    {
-        return translator.get(s);
-    }
-    
-    private void registerFunction(List<BiFunction<Object[], Script, Object>> list, String s, BiFunction<Object[], Script, Object> f)
-    {
-        translator.put(s, list.size());
-        list.add(f);
-    }
-    
-    private void registerConsumer(List<BiFunction<Object[], Script, Object>> list, String s, BiConsumer<Object[], Script> f)
-    {
-        translator.put(s, list.size());
-        list.add((BiFunction<Object[], Script, Object>) (args, qd) -> 
-        {
-            f.accept(args, qd);
-            return 0;
-        });
-    }
-    
-    private void registerAlias(List<BiFunction<Object[], Script, Object>> list, String s, String original)
-    {
-        registerFunction(list, s, list.get(translator.get(original))); 
-    }
-    
-    @SuppressWarnings("")
-    public SnuviParser()
-    {
-        ArrayList<BiFunction<Object[], Script, Object>> list = new ArrayList<>();
-        translator = HashBiMap.create(300);
-        
-        registerFunction(list, "nothing", (args, qd) -> 
-                0);
-        registerConsumer(list, "godeeper", (args, qd) -> 
-                qd.goDeeper(false));
-        registerConsumer(list, "benchmark", (args, qd) -> 
-                qd.printBenchmarks((ICommandSender) args[0]));
-        registerConsumer(list, "togglebenchmark", (args, qd) -> 
-                qd.toggleBenchmark());
-        registerConsumer(list, "clearbenchmark", (args, qd) -> 
-                qd.clearBenchmark());
-
-        // -------------------------------------------------------------
-        // Command-Bibliothek  
-        // -------------------------------------------------------------
-        registerConsumer(list, "command.add", (args, qd) -> 
-                KajetansMod.scripts.registerScriptCommand(args[0].toString()));
-        registerConsumer(list, "command.remove", (args, qd) -> 
-                KajetansMod.scripts.unregisterScriptCommand(args[0].toString()));
-        registerFunction(list, "command.exists", (args, qd) -> 
-                KajetansMod.scripts.isRegisteredScriptCommand(args[0].toString()));
-        registerConsumer(list, "command.clear", (args, qd) -> 
-                KajetansMod.scripts.clearScriptCommands());
-        
-        // -------------------------------------------------------------
-        // Permission-Bibliothek  
-        // -------------------------------------------------------------
-        registerConsumer(list, "perm.clear", (args, qd) -> 
-                KajetansMod.perms.clear());
-        registerConsumer(list, "perm.registergroup", (args, qd) -> 
-                KajetansMod.perms.registerGroupPermission(ScriptUtils.getInt(args[0]), args[1].toString()));
-        registerConsumer(list, "perm.registerplayer", (args, qd) -> 
-                KajetansMod.perms.registerPlayerGroup(UUID.fromString(args[0].toString()), ScriptUtils.getInt(args[1])));
-        
-        // -------------------------------------------------------------
-        // Title-Bibliothek  
-        // -------------------------------------------------------------
-        registerConsumer(list, "title.settime", (args, qd) -> 
-                TitleAPI.setTitleTime((EntityPlayerMP) args[0], ScriptUtils.getInt(args[1]), ScriptUtils.getInt(args[2]), ScriptUtils.getInt(args[3])));
-        registerConsumer(list, "title.clear", (args, qd) -> 
-                TitleAPI.clearTitle((EntityPlayerMP) args[0]));
-        registerConsumer(list, "title.reset", (args, qd) -> 
-                TitleAPI.resetTitle((EntityPlayerMP) args[0]));
-        registerConsumer(list, "title.send", (args, qd) -> 
-                TitleAPI.setTitle((EntityPlayerMP) args[0], ScriptUtils.connect(args, 1)));
-        registerConsumer(list, "title.setsub", (args, qd) -> 
-                TitleAPI.setSubTitle((EntityPlayerMP) args[0], ScriptUtils.connect(args, 1)));
-        
-        // -------------------------------------------------------------
-        // Villager-Bibliothek  
-        // -------------------------------------------------------------
-        registerConsumer(list, "villager.showtrades", (args, qd) -> 
-                ((EntityPlayer) args[0]).displayVillagerTradeGui(((EntityVillager) args[1])));
-        
-        // -------------------------------------------------------------    
-        // Player-Bibliothek
-        // -------------------------------------------------------------  
-        registerFunction(list, "player.getitemamount", (args, qd) ->       
-                InventoryUtils.searchInventoryFor(((EntityPlayer) args[0]).inventory, (ItemStack) args[2], (boolean) args[1]));                
-        registerFunction(list, "player.removeitem", (args, qd) -> 
-                removeItem(args));                 
-        registerFunction(list, "player.giveitem", (args, qd) ->       
-                giveItem(args));
-        registerConsumer(list, "player.shootprojectile", (args, qd) -> 
-                EffectUtils.launchProjectile((EntityPlayer) args[0], getClass(args[1].toString()), ScriptUtils.getDouble(args[2]), args[3]));
-        registerConsumer(list, "player.respawn", (args, qd) ->
-                respawnPlayer(args));
-        registerConsumer(list, "player.inventorytolist", (args, qd) -> 
-                qd.setVar(args[0], ((EntityPlayer) args[1]).inventory.mainInventory));    
-        registerFunction(list, "player.getamount", (args, qd) ->                            
-                KajetansMod.server.getCurrentPlayerCount());
-        registerFunction(list, "player.getnearest", (args, qd) ->                            
-                Utils.getNearestPlayer(((Location) args[0]).getWorld(), ((Location) args[0]).getPos())); 
-        registerConsumer(list, "player.say", (args, qd) ->
-                playerSay(args));
-        registerFunction(list, "player.isafk", (args, qd) -> 
-                KajetansMod.afkManager.getEvent(AfkListener.class).isAfk(((EntityPlayer) args[0])));
-        registerConsumer(list, "player.speak", (args, qd) -> 
-                sendMessageToGroup(args[0], qd, "§7[§r" + args[1] + "§7] " + ScriptUtils.connect(args, 2)));
-        registerFunction(list, "player.getquestleader", (args, qd) -> 
-                getQuestLeader(qd));
-        registerConsumer(list, "player.setcompass", (args, qd) -> 
-                ((EntityPlayerMP) args[0]).connection.sendPacket(new SPacketSpawnPosition(((Location) args[1]).getBlockPos()))); 
-        registerFunction(list, "player.gethunger", (args, qd) -> 
-                ((EntityPlayer) args[0]).getFoodStats().getFoodLevel());
-        registerConsumer(list, "player.sethunger", (args, qd) -> 
-                ((EntityPlayer) args[0]).getFoodStats().setFoodLevel(ScriptUtils.getInt(args[1])));
-        registerFunction(list, "player.getsaturation", (args, qd) -> 
-                ReflectionUtils.getSaturation(((EntityPlayer) args[0]).getFoodStats()));
-        registerConsumer(list, "player.setsaturation", (args, qd) -> 
-                ReflectionUtils.setSaturation(((EntityPlayer) args[0]).getFoodStats(), ScriptUtils.getFloat(args[1])));
-        registerFunction(list, "player.getname", (args, qd) -> 
-                getName(args));
-        registerFunction(list, "player.getfullname", (args, qd) -> 
-                KajetansMod.chatManager.getFullName((EntityPlayer) args[0]));
-        registerFunction(list, "player.getuuid", (args, qd) -> 
-                getUuid(args));
-        registerFunction(list, "player.getip", (args, qd) -> 
-                ((EntityPlayerMP) args[0]).connection.netManager.getRemoteAddress().toString());
-        registerFunction(list, "player.iscreative", (args, qd) -> 
-                ((EntityPlayer) args[0]).isCreative());
-        registerFunction(list, "player.isspectator", (args, qd) -> 
-                ((EntityPlayer) args[0]).isSpectator());
-        registerFunction(list, "player.issurvival", (args, qd) -> 
-                !((EntityPlayer) args[0]).isCreative() && !((EntityPlayer) args[0]).isSpectator());
-        registerFunction(list, "player.isadventure", (args, qd) -> 
-                !((EntityPlayer) args[0]).capabilities.allowEdit);
-        registerFunction(list, "player.hasfly", (args, qd) -> 
-                ((EntityPlayer) args[0]).capabilities.allowFlying);
-        registerFunction(list, "player.getlastdamager", (args, qd) -> 
-                getLastDamager(args));
-        registerConsumer(list, "player.settag", (args, qd) -> 
-                setTag(args));
-        registerFunction(list, "player.gettag", (args, qd) -> 
-                getTag(args));
-        registerConsumer(list, "player.dropinventory", (args, qd) -> 
-                dropInventory(args));
-        registerFunction(list, "player.gettarget", (args, qd) -> 
-                Utils.getPlayerTarget((EntityPlayer) args[0], ScriptUtils.getInt(args[1])));
-        registerFunction(list, "player.hasquest", (args, qd) ->     
-                KajetansMod.scripts.hasQuest((EntityPlayer) args[0]));
-        registerConsumer(list, "player.action", (args, qd) ->     
-                sendToActionBar(args, qd)); 
-        registerConsumer(list, "player.kick", (args, qd) -> 
-                kickPlayerFromQuest(args, qd));  
-        registerConsumer(list, "player.playsound", (args, qd) -> 
-                playSoundPlayer(args));
-        registerFunction(list, "player.getbedspawn", (args, qd) ->     
-                ((EntityPlayer) args[0]).getBedLocation(ScriptUtils.getInt(args[1])));
-        registerConsumer(list, "player.setbedspawn", (args, qd) ->     
-                ((EntityPlayer) args[0]).bedLocation = ((Location) args[1]).getBlockPos());
-        registerConsumer(list, "player.damageitem", (args, qd) ->   
-                ((EntityPlayer) args[0]).getHeldItemMainhand().damageItem(ScriptUtils.getInt(args[1]), (EntityPlayer) args[0]));
-
-        // -------------------------------------------------------------    
-        // Players-Bibliothek
-        // -------------------------------------------------------------   
-        registerConsumer(list, "players.tolist", (args, qd) ->     
-                qd.setVar(args[0].toString(), Arrays.asList(KajetansMod.server.getOnlinePlayerNames())));    
-        registerConsumer(list, "players.toworldlist", (args, qd) ->     
-                qd.setVar(args[0].toString(), new ArrayList(ModDimensions.getWorldFromName(args[1].toString()).playerEntities)));
-        registerConsumer(list, "players.near", (args, qd) ->     
-                qd.setVar(args[0].toString(), Utils.getNearbyEntities(((Location) args[1]).getWorld(), ((Location) args[1]).getPos(), ScriptUtils.getDouble(args[2]), EntityPlayer.class).stream().map(p -> p.getName()).collect(Collectors.toList()))); 
-
-        // -------------------------------------------------------------    
-        // Rank-Bibliothek
-        // -------------------------------------------------------------  
-        registerConsumer(list, "rank.get", (args, qd) -> 
-                qd.setVar(args[0], KajetansMod.chatManager.getRanks((EntityPlayer) args[1])));
-        registerConsumer(list, "rank.register", (args, qd) -> 
-                KajetansMod.chatManager.registerRank(args[0].toString(), ScriptUtils.getInt(args[1]), args[2].toString()));
-        registerConsumer(list, "rank.player", (args, qd) -> 
-                KajetansMod.chatManager.registerPlayerRank(UUID.fromString(args[0].toString()), args[1].toString()));
-        registerConsumer(list, "rank.clear", (args, qd) -> 
-                KajetansMod.chatManager.clearRanks());
-        
-        // -------------------------------------------------------------    
-        // Custom-Bibliothek
-        // -------------------------------------------------------------
-        registerConsumer(list, "custom.registershapelessrecipe", (args, qd) -> 
-                registerShapelessRecipe(args));
-        registerConsumer(list, "custom.registershapedrecipe", (args, qd) -> 
-                registerShapedRecipe(args));
-        registerConsumer(list, "custom.registerfurnacerecipe", (args, qd) ->
-                RecipeUtils.registerFurnaceRecipe((ItemStack) args[0], (ItemStack) args[1]));
-        registerConsumer(list, "custom.clearrecipes", (args, qd) ->
-                RecipeUtils.clearRecipes());
-        
-        
-        // -------------------------------------------------------------    
-        // World-Bibliothek
-        // -------------------------------------------------------------
-        
-        registerAlias(list, "world.getplayers", "players.toworldlist");
-        registerConsumer(list, "world.setskills", (args, qd) ->     
-                KajetansMod.worldManager.getWorldPreferences(ModDimensions.getWorldFromName(args[0].toString())).skills = (boolean) args[1]);
-        registerConsumer(list, "world.setblockprotections", (args, qd) ->     
-                KajetansMod.worldManager.getWorldPreferences(ModDimensions.getWorldFromName(args[0].toString())).blockProtection = (boolean) args[1]);
-        registerConsumer(list, "world.setdefaultenchanting", (args, qd) ->     
-                KajetansMod.worldManager.getWorldPreferences(ModDimensions.getWorldFromName(args[0].toString())).defaultEnchanting = (boolean) args[1]);
-        registerConsumer(list, "world.setpvpprotection", (args, qd) ->     
-                KajetansMod.worldManager.getWorldPreferences(ModDimensions.getWorldFromName(args[0].toString())).pvpProtection = (boolean) args[1]);
-        registerConsumer(list, "world.setstatuseffects", (args, qd) ->     
-                KajetansMod.worldManager.getWorldPreferences(ModDimensions.getWorldFromName(args[0].toString())).statusEffects = (boolean) args[1]);
-        registerConsumer(list, "world.setmanabar", (args, qd) ->     
-                KajetansMod.worldManager.getWorldPreferences(ModDimensions.getWorldFromName(args[0].toString())).manabar = (boolean) args[1]);
-        registerConsumer(list, "world.setscrolls", (args, qd) ->     
-                KajetansMod.worldManager.getWorldPreferences(ModDimensions.getWorldFromName(args[0].toString())).scrolls = (boolean) args[1]);
-        registerConsumer(list, "world.setdefaultproducing", (args, qd) ->     
-                KajetansMod.worldManager.getWorldPreferences(ModDimensions.getWorldFromName(args[0].toString())).defaultProducing = (boolean) args[1]);
-      
-        // -------------------------------------------------------------    
-        // Item-Bibliothek   
-        // -------------------------------------------------------------   
-        registerConsumer(list, "item.drop", (args, qd) ->       
-                dropItem(args));                              
-        registerFunction(list, "item.gettype", (args, qd) ->    
-                ((ItemStack) args[0]).getItem().getRegistryName().toString());
-        registerFunction(list, "item.getdata", (args, qd) ->    
-                ((ItemStack) args[0]).getMetadata());           
-        registerConsumer(list, "item.setdata", (args, qd) ->    
-                ((ItemStack) args[0]).setItemDamage(ScriptUtils.getInt(args[1])));
-        registerFunction(list, "item.getamount", (args, qd) ->    
-                ((ItemStack) args[0]).getCount()); 
-        registerConsumer(list, "item.setamount", (args, qd) ->   
-                ((ItemStack) args[0]).setCount(ScriptUtils.getInt(args[1])));   
-        registerFunction(list, "item.getname", (args, qd) ->    
-                ((ItemStack) args[0]).getDisplayName());
-        registerConsumer(list, "item.setname", (args, qd) ->   
-                ((ItemStack) args[0]).setStackDisplayName(ScriptUtils.connect(args, 1)));
-        registerConsumer(list, "item.getlore", (args, qd) ->    
-                qd.setVar(args[0], ItemStackUtils.getLore((ItemStack) args[1])));
-        registerConsumer(list, "item.setlore", (args, qd) ->   
-                ItemStackUtils.setLore((ItemStack) args[0], (List<String>) args[1]));
-        registerConsumer(list, "item.addlore", (args, qd) ->   
-                ItemStackUtils.addLore((ItemStack) args[0], ScriptUtils.connect(args, 2), ScriptUtils.getInt(args[1])));
-        registerFunction(list, "item.getenchantlevel", (args, qd) ->   
-                EnchantmentHelper.getEnchantmentLevel(Enchantment.getEnchantmentByLocation(args[1].toString()), (ItemStack) args[0]));
-        registerConsumer(list, "item.setcooldown", (args, qd) ->   
-                ((EntityPlayer) args[0]).getCooldownTracker().setCooldown(((ItemStack) args[1]).getItem(), ScriptUtils.getInt(args[2])));
-        registerFunction(list, "item.gettooltype", (args, qd) ->   
-                Utils.getToolType((ItemStack) args[0]));
-
-        // -------------------------------------------------------------    
-        // Location-Bibliothek
-        // -------------------------------------------------------------  
-        registerFunction(list, "loc.distance", (args, qd) -> 
-                ((Location) args[0]).getPos().distanceTo(((Location) args[1]).getPos()));   
-        registerFunction(list, "loc.mod", (args, qd) -> 
-                ((Location) args[0]).add(ScriptUtils.getDouble(args[1]), ScriptUtils.getDouble(args[2]), ScriptUtils.getDouble(args[3])));
-        registerFunction(list, "loc.getcoord", (args, qd) -> 
-                getCoordOfLocation(args));
-        registerFunction(list, "loc.gettime", (args, qd) -> 
-                ((Long) ((Location) args[0]).getWorld().getWorldTime()).intValue());
-        registerFunction(list, "loc.hasstorm", (args, qd) -> 
-                ((Location) args[0]).getWorld().isRaining());
-        registerFunction(list, "loc.isbetween", (args, qd) -> 
-                isBetween(args));
-
-        // -------------------------------------------------------------    
-        // Block-Bibliothek
-        // -------------------------------------------------------------    
-        registerFunction(list, "block.gettype", (args, qd) -> 
-                ((Location) args[0]).getWorld().getBlockState(((Location) args[0]).getBlockPos()).getBlock().getRegistryName().toString());
-        registerFunction(list, "block.getdata", (args, qd) -> 
-                getBlockData((Location) args[0]));
-        registerConsumer(list, "block.clone", (args, qd) -> 
-                cloneBlock(args));
-        registerConsumer(list, "block.set", (args, qd) -> 
-                setBlock(args, qd));
-        registerConsumer(list, "block.set2", (args, qd) -> 
-                setBlockWithData(args, qd));
-        registerConsumer(list, "block.setsign", (args, qd) -> 
-                setSign(args));
-        registerFunction(list, "block.getsign", (args, qd) -> 
-                getSign(args));
-        registerConsumer(list, "block.setdoorstatus", (args, qd) -> 
-                setDoorStatus(args));
-        registerFunction(list, "block.getdoorstatus", (args, qd) -> 
-                getDoorStatus(args));
-        registerFunction(list, "block.isdoor", (args, qd) -> 
-                isDoor(args));
-        registerFunction(list, "block.issolid", (args, qd) -> 
-                isSolid(args));
-        registerFunction(list, "block.tostack", (args, qd) -> 
-                getStackFromBlock((Location) args[0]));
-        registerFunction(list, "block.getitemamount", (args, qd) -> 
-                getItemAmountChest(args));
-        registerFunction(list, "block.additem", (args, qd) -> 
-                addItemAmountChest(args));
-        registerFunction(list, "block.subitem", (args, qd) -> 
-                removeItemAmountChest(args));  
-
-        // -------------------------------------------------------------    
-        // Event-Bibliothek 
-        // -------------------------------------------------------------  
-        registerConsumer(list, "event.addloc", (args, qd) -> 
-                qd.addLocation(ScriptUtils.roundLocation((Location) args[0])));
-        registerConsumer(list, "event.removeloc", (args, qd) -> 
-                qd.removeLocation(ScriptUtils.roundLocation((Location) args[0])));
-        registerConsumer(list, "event.clearlocs", (args, qd) -> 
-                qd.clearLocations());
-        registerConsumer(list, "event.load", (args, qd) -> 
-                qd.loadEvent(args[0].toString())); 
-        registerConsumer(list, "event.unload", (args, qd) -> 
-                qd.unloadEvent(args[0].toString())); 
-
-        // -------------------------------------------------------------    
-        // Skill-Bibliothek 
-        // ------------------------------------------------------------- 
-        registerConsumer(list, "skill.register", (args, qd) -> 
-                KajetansMod.skills.registerSkill(ScriptUtils.getInt(args[0]), (ItemStack) args[1], me.km.effects.Effect.valueOf(args[2].toString()), args[3].toString(), args[4].toString()));
-        registerConsumer(list, "skill.clear", (args, qd) -> 
-                KajetansMod.skills.clearSkills());
-        
-        // -------------------------------------------------------------    
-        // Job-Bibliothek 
-        // -------------------------------------------------------------  
-        registerFunction(list, "job.getlevel", (args, qd) -> 
-                KajetansMod.jobs.getLevel((EntityPlayer) args[0], ScriptUtils.getByte(args[1])));
-        registerConsumer(list, "job.addlevel", (args, qd) -> 
-                KajetansMod.jobs.addLevel((EntityPlayer) args[0], ScriptUtils.getByte(args[1]), ScriptUtils.getByte(args[2])));
-        registerConsumer(list, "job.setlevel", (args, qd) -> 
-                KajetansMod.jobs.setLevel((EntityPlayer) args[0], ScriptUtils.getByte(args[1]), ScriptUtils.getByte(args[2])));
-        registerFunction(list, "job.getxp", (args, qd) -> 
-                KajetansMod.jobs.getXP((EntityPlayer) args[0], ScriptUtils.getByte(args[1])));
-        registerConsumer(list, "job.addxp", (args, qd) -> 
-                KajetansMod.jobs.addXP((EntityPlayer) args[0], ScriptUtils.getByte(args[1]), ScriptUtils.getByte(args[2])));
-        registerConsumer(list, "job.setxp", (args, qd) -> 
-                KajetansMod.jobs.setXP((EntityPlayer) args[0], ScriptUtils.getByte(args[1]), ScriptUtils.getByte(args[2])));
-        registerConsumer(list, "job.registerjob", (args, qd) -> 
-                KajetansMod.jobs.registerJob(ScriptUtils.getByte(args[0]), ScriptUtils.connect(args, 1)));
-        registerConsumer(list, "job.registerrecipe", (args, qd) -> 
-                KajetansMod.jobs.registerRecipe(ScriptUtils.getByte(args[0]), ScriptUtils.getItem(args[1].toString()), ScriptUtils.getByte(args[2])));
-        registerConsumer(list, "job.registermaterial", (args, qd) -> 
-                KajetansMod.jobs.registerPreferedBlock(ScriptUtils.getByte(args[0]), Block.getBlockFromName(args[1].toString())));
-        registerConsumer(list, "job.registerskill", (args, qd) -> 
-                KajetansMod.jobs.registerSkill(ScriptUtils.getByte(args[0]), KajetansMod.skills.getSkill(ScriptUtils.getInt(args[1])), ScriptUtils.getByte(args[2]), ScriptUtils.getByte(args[3])));
-        registerFunction(list, "job.getamount", (args, qd) -> 
-                KajetansMod.jobs.getNumberOfJobs());
-        registerFunction(list, "job.getname", (args, qd) -> 
-                KajetansMod.jobs.getJobName(ScriptUtils.getByte(args[0])));
-        registerFunction(list, "job.geteffectlevel", (args, qd) -> 
-                EffectUtils.getEffectLevel((EntityPlayer) args[0], me.km.effects.Effect.valueOf(args[1].toString())));
-        registerFunction(list, "job.hasjob", (args, qd) -> 
-                KajetansMod.jobs.hasJob((EntityPlayer) args[0], ScriptUtils.getByte(args[1])));
-        registerFunction(list, "job.hasrecipe", (args, qd) -> 
-                KajetansMod.jobs.hasRecipe((EntityPlayer) args[0], ScriptUtils.getItem(args[1].toString())));
-        registerConsumer(list, "job.getjobs", (args, qd) -> 
-                qd.setVar(args[0], KajetansMod.jobs.getJobs((EntityPlayer) args[1])));
-        registerFunction(list, "job.isregmaterial", (args, qd) -> 
-                KajetansMod.jobs.isPreferedMaterial((EntityPlayer) args[0],Block.getBlockFromName(args[1].toString())));
-        registerConsumer(list, "job.setjob", (args, qd) -> 
-                KajetansMod.jobs.setJob((EntityPlayer) args[0], ScriptUtils.getByte(args[1]), (boolean) args[2])); 
-        registerConsumer(list, "job.reset", (args, qd) -> 
-                KajetansMod.jobs.resetAll());  
-
-        // -------------------------------------------------------------    
-        // Bit-Bibliothek 
-        // -------------------------------------------------------------   
-        registerFunction(list, "bit.rightshift", (args, qd) -> 
-                ScriptUtils.getInt(args[0]) >> ScriptUtils.getInt(args[1]));
-        registerFunction(list, "bit.leftshift", (args, qd) -> 
-                ScriptUtils.getInt(args[0]) << ScriptUtils.getInt(args[1]));
-        registerFunction(list, "bit.and", (args, qd) -> 
-                ScriptUtils.getInt(args[0]) & ScriptUtils.getInt(args[1]));
-        registerFunction(list, "bit.or", (args, qd) -> 
-                ScriptUtils.getInt(args[0]) | ScriptUtils.getInt(args[1]));
-        registerFunction(list, "bit.xor", (args, qd) -> 
-                ScriptUtils.getInt(args[0]) ^ ScriptUtils.getInt(args[1]));
-        registerFunction(list, "bit.invert", (args, qd) -> 
-                ~ScriptUtils.getInt(args[0]));
-        registerFunction(list, "bit.set", (args, qd) -> 
-                ScriptUtils.getInt(args[0]) | (1 << ScriptUtils.getInt(args[1])));
-        registerFunction(list, "bit.get", (args, qd) -> 
-                (ScriptUtils.getInt(args[0]) & (1 << ScriptUtils.getInt(args[1]))) != 0);
-
-        // -------------------------------------------------------------    
-        // Mathe-Bibliothek 
-        // -------------------------------------------------------------    
-        registerFunction(list, "math.mod", (args, qd) -> 
-                numberHandler(args[0], args[1], (a, b) -> a % b, (a, b) -> a % b, (a, b) -> a % b));
-        registerFunction(list, "math.abs", (args, qd) -> 
-                numberHandler(args[0], (a) -> Math.abs(a), (a) -> Math.abs(a), (a) -> Math.abs(a)));
-        registerFunction(list, "math.pow", (args, qd) -> 
-                Math.pow(ScriptUtils.getDouble(args[0]), ScriptUtils.getDouble(args[1])));
-        registerFunction(list, "math.root", (args, qd) -> 
-                Math.pow(ScriptUtils.getDouble(args[0]), 1d / ScriptUtils.getDouble(args[1])));
-        registerFunction(list, "math.sin", (args, qd) -> 
-                Math.sin(ScriptUtils.getDouble(args[0])));
-        registerFunction(list, "math.cos", (args, qd) -> 
-                Math.cos(ScriptUtils.getDouble(args[0])));
-        registerFunction(list, "math.e", (args, qd) -> 
-                Math.E);
-        registerFunction(list, "math.pi", (args, qd) -> 
-                Math.PI);
-        registerFunction(list, "math.ln", (args, qd) -> 
-                Math.log(ScriptUtils.getDouble(args[0])));
-        registerFunction(list, "math.log", (args, qd) -> 
-                Math.log10(ScriptUtils.getDouble(args[0])));
-        registerFunction(list, "math.random", (args, qd) -> 
-                Utils.randomInt(ScriptUtils.getInt(args[0]), ScriptUtils.getInt(args[1])));
-        registerFunction(list, "math.round", (args, qd) -> 
-                round(args[0]));
-        registerFunction(list, "math.rounddown", (args, qd) -> 
-                roundDown(args[0]));
-        registerFunction(list, "math.roundup", (args, qd) -> 
-                roundUp(args[0]));
-        registerFunction(list, "math.roundcomma", (args, qd) -> 
-                new BigDecimal(ScriptUtils.getDouble(args[0])).setScale(ScriptUtils.getInt(args[1]), RoundingMode.HALF_UP).doubleValue());
-
-        // -------------------------------------------------------------    
-        // Entity - Befehle
-        // -------------------------------------------------------------  
-        registerFunction(list, "entity.getlocation", (args, qd) -> 
-                new Location(((Entity) args[0])));   
-        registerConsumer(list, "entity.damage", (args, qd) -> 
-                damageEntity(args));  
-        registerFunction(list, "entity.gethealth", (args, qd) -> 
-                ((EntityLivingBase) args[0]).getHealth());     
-        registerConsumer(list, "entity.sethealth", (args, qd) -> 
-                ((EntityLivingBase) args[0]).setHealth(ScriptUtils.getFloat(args[1])));  
-        registerConsumer(list, "entity.setname", (args, qd) -> 
-                nameEntity(args)); 
-        registerConsumer(list, "entity.throw", (args, qd) -> 
-                Utils.setVelocity((Entity) args[0], ScriptUtils.getDouble(args[1]), ScriptUtils.getDouble(args[2]), ScriptUtils.getDouble(args[3])));
-        registerConsumer(list, "entity.teleport", (args, qd) -> 
-                Utils.teleportEntity((Entity) args[0], (Location) args[1]));  
-        registerConsumer(list, "entity.setequip", (args, qd) -> 
-                setEntityEquip(args)); 
-        registerFunction(list, "entity.getequip", (args, qd) -> 
-                getEntityEquip(args));
-        registerConsumer(list, "entity.removeall", (args, qd) -> 
-                removeEntities(args));
-        registerConsumer(list, "entity.remove", (args, qd) -> 
-                ((Entity) args[0]).setDead());
-        registerConsumer(list, "entity.setinvulnerable", (args, qd) -> 
-                ((Entity) args[0]).setEntityInvulnerable((boolean) args[1]));
-        registerConsumer(list, "entity.setsilent", (args, qd) -> 
-                ((Entity) args[0]).setSilent((boolean) args[1]));
-        registerConsumer(list, "entity.hide", (args, qd) -> 
-                ((Entity) args[0]).setInvisible(true));
-        registerConsumer(list, "entity.show", (args, qd) -> 
-                ((Entity) args[0]).setInvisible(false));
-        registerConsumer(list, "entity.ride", (args, qd) -> 
-                ((Entity) args[0]).startRiding(((Entity) args[1])));
-        registerConsumer(list, "entity.setvars", (args, qd) -> 
-                ScriptVars.setEntityVars(qd, Utils.getNearestEntity(((Location) args[0]).getWorld(), ((Location) args[0]).getPos(), 3, (Class<? extends Entity>) getClass("net.minecraft.entity." + args[1]))));
-        registerConsumer(list, "entity.addeffect", (args, qd) -> 
-                EffectUtils.addPotionTo((EntityLivingBase) args[0], Potion.getPotionFromResourceLocation(args[1].toString()), ScriptUtils.getInt(args[2]), ScriptUtils.getInt(args[3])));
-        registerFunction(list, "entity.haseffect", (args, qd) -> 
-                ((EntityLivingBase) args[0]).isPotionActive(Potion.getPotionFromResourceLocation(args[1].toString())));
-        registerConsumer(list, "entity.goto", (args, qd) ->
-                NmsUtilities.walkTo((EntityLiving) args[0], ((Location) args[1]).getPos(), ScriptUtils.getDouble(args[2])));
-        registerConsumer(list, "entity.explode", (args, qd) -> 
-                ((EntityCreeper) args[0]).ignite());
-        registerConsumer(list, "entity.spawnitemframe", (args, qd) -> 
-                spawnItemFrame(args));
-        registerFunction(list, "entity.getitemframe", (args, qd) -> 
-                Utils.getNearestEntity(((Location) args[0]).getWorld(), ((Location) args[0]).getPos().addVector(0.5, 0, 0.5), 1, EntityItemFrame.class).getDisplayedItem());
-        registerFunction(list, "entity.getpotiontype", (args, qd) -> 
-                getPotionType(args));
-        registerConsumer(list, "entity.setgravity", (args, qd) -> 
-                ((Entity) args[0]).setNoGravity(!(boolean) args[1]));
-
-        // -------------------------------------------------------------
-        // Status-Bibliothek
-        // -------------------------------------------------------------  
-        registerFunction(list, "status.getmana", (args, qd) -> 
-                EnvironmentAPI.getMana(((EntityPlayer) args[0])));
-        registerFunction(list, "status.getcold", (args, qd) -> 
-                EnvironmentAPI.getCold(((EntityPlayer) args[0])));
-        registerFunction(list, "status.getenergy", (args, qd) -> 
-                EnvironmentAPI.getEnergy(((EntityPlayer) args[0])));
-        registerFunction(list, "status.getthirst", (args, qd) -> 
-                EnvironmentAPI.getThirst(((EntityPlayer) args[0])));
-        registerConsumer(list, "status.changemange", (args, qd) -> 
-                EnvironmentAPI.changeMana(((EntityPlayer) args[0]), ScriptUtils.getInt(args[1])));
-        registerConsumer(list, "status.changecold", (args, qd) -> 
-                EnvironmentAPI.changeCold(((EntityPlayer) args[0]), ScriptUtils.getInt(args[1])));
-        registerConsumer(list, "status.changeenergie", (args, qd) -> 
-                EnvironmentAPI.changeEnergy(((EntityPlayer) args[0]), ScriptUtils.getInt(args[1])));
-        registerConsumer(list, "status.changethirst", (args, qd) -> 
-                EnvironmentAPI.changeThirst(((EntityPlayer) args[0]), ScriptUtils.getInt(args[1])));
-        registerConsumer(list, "status.resetmana", (args, qd) -> 
-                EnvironmentAPI.resetMana(((EntityPlayer) args[0])));
-        registerConsumer(list, "status.resetcold", (args, qd) -> 
-                EnvironmentAPI.resetCold(((EntityPlayer) args[0])));
-        registerConsumer(list, "status.resetenergy", (args, qd) -> 
-                EnvironmentAPI.resetEnergy(((EntityPlayer) args[0])));
-        registerConsumer(list, "status.resetthirst", (args, qd) -> 
-                EnvironmentAPI.resetThirst(((EntityPlayer) args[0])));
-        registerConsumer(list, "status.gettemperature", (args, qd) -> 
-                EnvironmentAPI.getTemperature(((Location) args[0]).getWorld(), ((Location) args[0]).getBlockPos()));    
-
-        // -------------------------------------------------------------  
-        // Listen-Bibliothek   
-        // -------------------------------------------------------------    
-        registerConsumer(list, "list.new", (args, qd) ->                                                
-                qd.setVar(args[0], new ArrayList<>()));
-        registerFunction(list, "list.exists", (args, qd) ->                                                
-                args[0] instanceof List); 
-        registerConsumer(list, "list.add", (args, qd) ->                            
-                ((List) args[0]).add(args[1]));
-        registerConsumer(list, "list.remove", (args, qd) ->                            
-                ((List) args[0]).remove(args[1]));
-        registerConsumer(list, "list.removeindex", (args, qd) ->                            
-                ((List) args[0]).remove(ScriptUtils.getInt(args[1])));                
-        registerFunction(list, "list.contains", (args, qd) ->                            
-                ((List) args[0]).contains(args[1]));
-        registerFunction(list, "list.getsize", (args, qd) ->                            
-                ((List) args[0]).size());
-        registerFunction(list, "list.getindex", (args, qd) ->                            
-                ((List) args[0]).get(ScriptUtils.getInt(args[1])));
-        registerConsumer(list, "list.setindex", (args, qd) ->                            
-                ((List) args[0]).set(ScriptUtils.getInt(args[1]), args[2]));
-        registerConsumer(list, "list.clear", (args, qd) ->                            
-                ((List) args[0]).clear());
-        registerFunction(list, "list.getindexof", (args, qd) ->                            
-                ((List) args[0]).indexOf(args[1]));  
-        registerConsumer(list, "list.sort", (args, qd) ->  
-                sortList((List<Object>) args[0], qd));
-        registerConsumer(list, "list.reverse", (args, qd) ->                            
-                Collections.reverse((List<Object>) args[0])); 
-        registerConsumer(list, "list.shuffle", (args, qd) ->                            
-                Collections.shuffle((List<Object>) args[0]));
-
-        // -------------------------------------------------------------  
-        // Map-Bibliothek   
-        // ------------------------------------------------------------- 
-        registerConsumer(list, "map.new", (args, qd) ->                                                
-                qd.setVar(args[0], new HashMap<>())); 
-        registerFunction(list, "map.exists", (args, qd) ->                                                
-                args[0] instanceof HashMap);  
-        registerConsumer(list, "map.add", (args, qd) ->                            
-                ((HashMap) args[0]).put(args[1], args[2]));
-        registerConsumer(list, "map.remove", (args, qd) ->                            
-                ((HashMap) args[0]).remove(args[1]));
-        registerFunction(list, "map.contains", (args, qd) ->                            
-                ((HashMap) args[0]).containsKey(args[1]));
-        registerFunction(list, "map.getsize", (args, qd) ->                            
-                ((HashMap) args[0]).size());
-        registerFunction(list, "map.get", (args, qd) ->                            
-                ((HashMap) args[0]).get(args[1]));
-        registerConsumer(list, "map.clear", (args, qd) ->                            
-                ((HashMap) args[0]).clear());
-        
-        // -------------------------------------------------------------  
-        // Set-Bibliothek   
-        // ------------------------------------------------------------- 
-        registerConsumer(list, "set.new", (args, qd) ->                                                
-                qd.setVar(args[0], new HashSet<>())); 
-        registerFunction(list, "set.exists", (args, qd) ->                                                
-                args[0] instanceof HashSet);  
-        registerConsumer(list, "set.add", (args, qd) ->                            
-                ((HashSet) args[0]).add(args[1]));
-        registerConsumer(list, "set.remove", (args, qd) ->                            
-                ((HashSet) args[0]).remove(args[1]));
-        registerFunction(list, "set.contains", (args, qd) ->                            
-                ((HashSet) args[0]).contains(args[1]));
-        registerFunction(list, "set.getsize", (args, qd) ->                            
-                ((HashSet) args[0]).size());
-
-        // -------------------------------------------------------------  
-        // GMap-Bibliothek   
-        // -------------------------------------------------------------  
-        registerConsumer(list, "gmap.removeall", (args, qd) ->    
-                KajetansMod.scripts.getDataBank(ScriptBank.class).removeMap(args[0].toString()));
-        registerConsumer(list, "gmap.add", (args, qd) ->    
-                KajetansMod.scripts.getDataBank(ScriptBank.class).addMapElement(args[0].toString(), args[1].toString(), args[2].toString()));
-        registerConsumer(list, "gmap.remove", (args, qd) ->    
-                KajetansMod.scripts.getDataBank(ScriptBank.class).removeMapElement(args[0].toString(), args[1].toString()));
-        registerConsumer(list, "gmap.totable", (args, qd) ->    
-                qd.setVar(args[0], KajetansMod.scripts.getDataBank(ScriptBank.class).getGlobalMapAsTable(args[1].toString())));
-        registerFunction(list, "gmap.get", (args, qd) ->    
-                KajetansMod.scripts.getDataBank(ScriptBank.class).getMapValue(args[0].toString(), args[1].toString()));
-        
-        // -------------------------------------------------------------  
-        // GDMap-Bibliothek   
-        // -------------------------------------------------------------  
-        registerConsumer(list, "gdmap.removeall", (args, qd) ->    
-                KajetansMod.scripts.getDataBank(ScriptBank.class).removeDualMap(args[0].toString()));
-        registerConsumer(list, "gdmap.add", (args, qd) ->    
-                KajetansMod.scripts.getDataBank(ScriptBank.class).addDualMapElement(args[0].toString(), args[1].toString(), args[2].toString(), args[3].toString()));
-        registerConsumer(list, "gdmap.remove", (args, qd) ->    
-                KajetansMod.scripts.getDataBank(ScriptBank.class).removeDualMapElement(args[0].toString(), args[1].toString(), args[2].toString()));
-        registerConsumer(list, "gdmap.totable", (args, qd) ->    
-                qd.setVar(args[0], KajetansMod.scripts.getDataBank(ScriptBank.class).getGlobalDualMapAsTable(args[1].toString(), args[2].toString())));
-        registerFunction(list, "gdmap.get", (args, qd) ->    
-                KajetansMod.scripts.getDataBank(ScriptBank.class).getDualMapValue(args[0].toString(), args[1].toString(), args[2].toString()));
-
-        // -------------------------------------------------------------  
-        // Table-Bibliothek   
-        // -------------------------------------------------------------  
-        registerConsumer(list, "table.printstart", (args, qd) ->   
-                sendMessageToGroup(args[0], qd, TableAPI.getTableStart(ScriptUtils.getInt(args[1]), ScriptUtils.getInt(args[2]), args[3].toString())));
-        registerConsumer(list, "table.printmiddle", (args, qd) ->   
-                sendMessageToGroup(args[0], qd, TableAPI.getTableMiddle(ScriptUtils.getInt(args[1]), ScriptUtils.getInt(args[2]), args[3].toString())));  
-        registerConsumer(list, "table.print", (args, qd) ->     
-                sendMessageToGroup(args[0], qd, TableAPI.getTable(ScriptUtils.getInt(args[1]), args[2].toString(), Arrays.stream(args, 3, args.length).map(o -> o.toString()).collect(Collectors.toList()))));  
-        registerConsumer(list, "table.printend", (args, qd) ->    
-                sendMessageToGroup(args[0], qd, TableAPI.getTableEnd(ScriptUtils.getInt(args[1]), ScriptUtils.getInt(args[2]), args[3].toString())));  
-        registerConsumer(list, "table.new", (args, qd) -> 
-                qd.setVar(args[0], new Table(ScriptUtils.getInt(args[1]))));
-        registerConsumer(list, "table.frommap", (args, qd) -> 
-                qd.setVar(args[0], new Table((Map<Object, Object>) args[1])));
-        registerConsumer(list, "table.sort", (args, qd) -> 
-                ((Table) args[0]).sort());
-        registerConsumer(list, "table.reverse", (args, qd) -> 
-                ((Table) args[0]).reverse());
-        registerConsumer(list, "table.shuffle", (args, qd) -> 
-                ((Table) args[0]).shuffle());
-        registerConsumer(list, "table.clear", (args, qd) -> 
-                ((Table) args[0]).clear());
-        registerConsumer(list, "table.addrow", (args, qd) -> 
-                ((Table) args[0]).addRow(Arrays.copyOfRange(args, 1, args.length)));
-        registerConsumer(list, "table.removerow", (args, qd) -> 
-                ((Table) args[0]).removeRow(ScriptUtils.getInt(args[1])));
-        registerFunction(list, "table.get", (args, qd) -> 
-                ((Table) args[0]).getElement(ScriptUtils.getInt(args[1]), ScriptUtils.getInt(args[2])));
-        registerFunction(list, "table.getindexof", (args, qd) -> 
-                ((Table) args[0]).getIndexOf(args[1]));
-        registerConsumer(list, "table.setsortcolumn", (args, qd) -> 
-                ((Table) args[0]).setSortColumn(ScriptUtils.getInt(args[1])));
-        registerFunction(list, "table.getsize", (args, qd) -> 
-                ((Table) args[0]).getSize());
-
-        // -------------------------------------------------------------  
-        // Plot-Bibliothek   
-        // -------------------------------------------------------------  
-        registerFunction(list, "plot.hastag", (args, qd) ->    
-                KajetansMod.plots.getDataBank(ProtectionBank.class).hasTag(((Location) args[0]).getWorld(), ((Location) args[0]).getBlockPos(), args[1].toString())); 
-        registerConsumer(list, "plot.add", (args, qd) ->    
-                addPlot(args));
-        registerFunction(list, "plot.getid", (args, qd) ->    
-                KajetansMod.plots.getDataBank(ProtectionBank.class).getFirstRegionId(((Location) args[0]).getWorld(), ((Location) args[0]).getBlockPos()));
-        registerFunction(list, "plot.canbuild", (args, qd) ->    
-                KajetansMod.plots.getDataBank(ProtectionBank.class).canBuild(((Location) args[0]).getWorld(), ((Location) args[0]).getBlockPos(), (EntityPlayer) args[1]));
-        registerFunction(list, "plot.getname", (args, qd) ->    
-                KajetansMod.plots.getDataBank(ProtectionBank.class).getFirstRegionName(((Location) args[0]).getWorld(), ((Location) args[0]).getBlockPos()));
-
-        // -------------------------------------------------------------  
-        // Quest-Bibliothek   
-        // -------------------------------------------------------------    
-        registerConsumer(list, "quest.setinfo", (args, qd) -> 
-                qd.setInfo(ScriptUtils.connect(args, 0)));
-        registerConsumer(list, "quest.end", (args, qd) -> 
-                endQuest(args, qd));
-        registerConsumer(list, "quest.playerstolist", (args, qd) ->  
-                questersToList(args, qd)); 
-        registerFunction(list, "quest.getplayeramount", (args, qd) ->      
-                getNumberOfQuesters(qd));
-        registerConsumer(list, "quest.give", (args, qd) ->  
-                giveQuest(args, qd));
-        registerFunction(list, "quest.isactive", (args, qd) ->  
-                KajetansMod.scripts.getQuests().stream().anyMatch(q -> q.getName().equals(args[0])));
-
-        // -------------------------------------------------------------  
-        // Scoreboard-Bibliothek   
-        // -------------------------------------------------------------  
-        registerConsumer(list, "sb.add", (args, qd) ->  
-                addToScoreBoard(args, qd));
-        registerConsumer(list, "sb.remove", (args, qd) ->  
-                removeFromScoreBoard(args, qd));
-        registerConsumer(list, "sb.reset", (args, qd) ->  
-                doForGroup(args[0], qd, p -> KajetansMod.scoreboard.resetScoreboard((EntityPlayerMP) p)));
-
-        // -------------------------------------------------------------  
-        // Effect-Bibliothek   
-        // ------------------------------------------------------------- 
-        registerConsumer(list, "effect.playsound", (args, qd) -> 
-                playSound(args));
-        registerConsumer(list, "effect.play", (args, qd) -> 
-                playParticle(args));
-
-        // -------------------------------------------------------------  
-        // Inventory-Bibliothek   
-        // -------------------------------------------------------------
-        registerConsumer(list, "inv.new", (args, qd) -> 
-                qd.setVar(args[0], new SnuviInventory(args[2].toString(), ScriptUtils.getInt(args[1]), qd.getNewId())));   
-        registerConsumer(list, "inv.loadblock", (args, qd) -> 
-                qd.setVar(args[0], newInventory((Location) args[1], qd, args[2].toString())));
-        registerConsumer(list, "inv.setitem", (args, qd) -> 
-                ((IInventory) args[0]).setInventorySlotContents(ScriptUtils.getInt(args[1]), (ItemStack) args[2]));
-        registerFunction(list, "inv.getitem", (args, qd) -> 
-                ((IInventory) args[0]).getStackInSlot(ScriptUtils.getInt(args[1])));
-        registerConsumer(list, "inv.open", (args, qd) -> 
-                new ScriptInventoryHolder((SnuviInventory) args[0], (EntityPlayerMP) args[1], qd).openForPlayer((EntityPlayerMP) args[1]));
-        registerConsumer(list, "inv.close", (args, qd) -> 
-                ((EntityPlayer) args[0]).closeScreen()); 
-
-        // -------------------------------------------------------------  
-        // Time-Bibliothek   
-        // -------------------------------------------------------------
-        registerFunction(list, "time.get", (args, qd) ->                            
-                System.currentTimeMillis());
-        registerFunction(list, "time.nextday", (args, qd) ->         
-                getNextDay(args));   
-        registerFunction(list, "time.getyear", (args, qd) ->         
-                getYear(args));   
-        registerFunction(list, "time.getmonth", (args, qd) ->         
-                getMonth(args));   
-        registerFunction(list, "time.getday", (args, qd) ->         
-                getDay(args));   
-        registerFunction(list, "time.gethour", (args, qd) ->         
-                getHour(args));   
-        registerFunction(list, "time.getminute", (args, qd) ->         
-                getMinute(args));   
-        registerFunction(list, "time.getsecond", (args, qd) ->         
-                getSecond(args));                   
-
-        // -------------------------------------------------------------  
-        // Read-Bibliothek   
-        // -------------------------------------------------------------
-        registerFunction(list, "read.player", (args, qd) -> 
-                Utils.getPlayerByName(args[0].toString()));
-        registerFunction(list, "read.location", (args, qd) -> 
-                ScriptUtils.getLocation(args[0].toString()));
-        registerFunction(list, "read.item", (args, qd) -> 
-                ScriptUtils.getItemStack(args, 0));
-        registerFunction(list, "read.spawnmob", (args, qd) -> 
-                NmsUtilities.getEntityFromNbtString(ScriptUtils.connect(args," ", 1).replace("'", "\""), (Location) args[0]));
-
-        // -------------------------------------------------------------  
-        // Text-Bibliothek   
-        // -------------------------------------------------------------
-        registerFunction(list, "text.location", (args, qd) -> 
-                ScriptUtils.getLocationString((Location) args[0]));
-        registerFunction(list, "text.item", (args, qd) -> 
-                ScriptUtils.getItemStackString((ItemStack) args[0]));
-
-        // -------------------------------------------------------------    
-        // Ohne Bibliothek
-        // -------------------------------------------------------------    
-        registerFunction(list, "add", (args, qd) -> 
-                convertDouble(Arrays.stream(args).mapToDouble(s -> ScriptUtils.getDouble(s)).sum()));
-        registerFunction(list, "sub", (args, qd) -> 
-                numberHandler(args[0], args[1], (a, b) -> a - b, (a, b) -> a - b, (a, b) -> a - b));
-        registerFunction(list, "inc", (args, qd) -> 
-                increaseVar(args[0], qd, 1)); 
-        registerFunction(list, "dec", (args, qd) -> 
-                increaseVar(args[0], qd, -1));
-        registerFunction(list, "mul", (args, qd) -> 
-                numberHandler(args[0], args[1], (a, b) -> a * b, (a, b) -> a * b, (a, b) -> a * b));
-        registerFunction(list, "div", (args, qd) -> 
-                ScriptUtils.getDouble(args[0]) / ScriptUtils.getDouble(args[1]));
-        registerFunction(list, "getvar", (args, qd) -> 
-                qd.getVar(args[0].toString()));
-        registerConsumer(list, "setvar", (args, qd) -> 
-                qd.setVar(args[0].toString(), args[1]));
-        registerConsumer(list, "removevar", (args, qd) -> 
-                qd.removeVar(args[0].toString()));
-        registerFunction(list, "getglobalvar", (args, qd) ->                    
-                getGlobalVar(args));
-        registerAlias(list, "ggv", "getglobalvar");
-        registerConsumer(list, "setglobalvar", (args, qd) -> 
-                setGlobalVar(args));                          
-        registerAlias(list, "sgv", "setglobalvar");
-        registerConsumer(list, "msg", (args, qd) -> 
-                sendMessageToGroup(args[0], qd, ScriptUtils.connect(args, 1)));
-        registerConsumer(list, "reset", (args, qd) -> 
-                qd.resetOverflowProtection());
-        registerConsumer(list, "wait", (args, qd) -> 
-                { qd.resetOverflowProtection(); throw new HoldCodeException(); });
-        registerConsumer(list, "term", (args, qd) -> 
-                { KajetansMod.scripts.term(qd); throw new HoldCodeException(); });
-        registerConsumer(list, "goto", (args, qd) -> 
-                qd.gotoLabel(args[0].toString()));
-        registerConsumer(list, "sgoto", (args, qd) -> 
-                scheduleGoto(args, qd));
-        registerConsumer(list, "gosub", (args, qd) -> 
-                qd.gotoLabelWithReturn(args[0].toString()));
-        registerConsumer(list, "return", (args, qd) -> 
-                qd.doReturn());
-        registerConsumer(list, "try", (args, qd) -> 
-                tryFunction(args, qd));                   
-        registerConsumer(list, "catch", (args, qd) -> 
-                catchFunction(qd));
-        registerConsumer(list, "if", (args, qd) -> 
-                ifFunction(args, qd));   
-        registerConsumer(list, "else", (args, qd) -> 
-                elseFunction(args, qd));   
-        registerConsumer(list, "while", (args, qd) -> 
-                whileFunction(args, qd)); 
-        registerFunction(list, "equal", (args, qd) -> 
-                isEqual(args));
-        registerAlias(list, "equals", "equal");
-        registerFunction(list, "less", (args, qd) -> 
-                ScriptUtils.getDouble(args[0]) < ScriptUtils.getDouble(args[1]));
-        registerFunction(list, "greater", (args, qd) -> 
-                ScriptUtils.getDouble(args[0]) > ScriptUtils.getDouble(args[1]));
-        registerFunction(list, "notequal", (args, qd) -> 
-                !isEqual(args));
-        registerFunction(list, "lessequal", (args, qd) -> 
-                ScriptUtils.getDouble(args[0]) <= ScriptUtils.getDouble(args[1]));
-        registerFunction(list, "greaterequal", (args, qd) -> 
-                ScriptUtils.getDouble(args[0]) >= ScriptUtils.getDouble(args[1]));
-        registerFunction(list, "invert", (args, qd) -> 
-                !((boolean) args[0]));
-        registerFunction(list, "and", (args, qd) -> 
-                Arrays.stream(args).allMatch(s -> s.equals(true)));
-        registerFunction(list, "or", (args, qd) -> 
-                Arrays.stream(args).anyMatch(s -> s.equals(true)));
-        registerFunction(list, "removeformat", (args, qd) -> 
-                ScriptUtils.connect(args, 0).replaceAll("§.", ""));
-        registerFunction(list, "concatlist", (args, qd) ->      
-                ((List<Object>) args[0]).stream().limit(ScriptUtils.getInt(args[3]) + 1).skip(ScriptUtils.getInt(args[2])).map(o -> o.toString()).collect(Collectors.joining(args[1].toString())));
-        registerConsumer(list, "split", (args, qd) ->      
-                split(args, qd));             
-        registerFunction(list, "concat", (args, qd) ->                            
-                ScriptUtils.connect(args, 0));
-        registerFunction(list, "tolowercase", (args, qd) ->                            
-                ScriptUtils.connect(args, 0).toLowerCase());
-        registerFunction(list, "touppercase", (args, qd) ->                            
-                ScriptUtils.connect(args, 0).toUpperCase());
-        registerFunction(list, "concatspace", (args, qd) ->                            
-                ScriptUtils.connect(args, " ", 0));     
-        registerFunction(list, "onlyletters", (args, qd) ->                            
-                onlyLetters(ScriptUtils.connect(args, 0)));
-        registerConsumer(list, "command", (args, qd) -> 
-                KajetansMod.server.commandManager.executeCommand(KajetansMod.server, ScriptUtils.connect(args, 0)));
-        registerConsumer(list, "waitfor", (args, qd) ->     
-                waitFor(args, qd));  
-        
-        methods = list.toArray(new BiFunction[list.size()]);
-    }
-    
-    public boolean printStack = false;
-
-    @SuppressWarnings("")
-    public Object parseFunction(Script qd, int function, Object[] args)
-    {
-        try
-        {
-            qd.exeClock.pushTime(qd.isBenchmarking());
-            Object o = methods[function].apply(args, qd);
-            qd.exeClock.pushTime(qd.isBenchmarking());
-            return o;
-        }
-        catch(Exception ex)
-        {
-            if(ex instanceof HoldCodeException)
-            {
-                throw new HoldCodeException();
-            }
-            if(printStack)
-            {
-                ex.printStackTrace();
-            }
-            if(qd.getTryMode())
-            {
-                qd.setTryMode(false);
-                qd.setTryFail(true);
-                qd.setVar("error", ex.getClass().getSimpleName());
-                qd.goHigher();
-                return 0;
-            }
-            printQuestException(qd, ex, translator.inverse().get(function) + "(" + Arrays.stream(args).map(o -> String.valueOf(o)).collect(Collectors.joining(", ")) + ")");     
-            throw new HoldCodeException();
-        }
-    }
-    
-    public void printQuestException(Script qd, Exception ex, String line)
-    {
-        qd.resetOverflowProtection();
-        sendToDevsWithSuffix(qd, "§cError in");
-        if(qd.isScript())
-        {
-            sendToDevsWithHelpList(qd, "§cScript", qd.getName());
-        }
-        else
-        {
-            sendToDevsWithHelpList(qd, "§cQuest", qd.getName());
-        }
-        sendToDevsWithHelpList(qd, "§cZeile", line);
-        sendToDevsWithHelpList(qd, "§cZeilennummer", String.valueOf(qd.getActualCodeLine() + 1));
-        sendToDevsWithHelpList(qd, "§cZeilenpfad", qd.getTreePath());
-        if(ex.getLocalizedMessage() == null)
-        {
-            sendToDevsWithHelpList(qd, "§cException", ex.getClass().getSimpleName());
-        }
-        else
-        {
-            sendToDevsWithHelpList(qd, "§cException", ex.getClass().getSimpleName() + " - " + ex.getLocalizedMessage());
-        }
-        if(ex instanceof IllegalStringException)
-        {
-            sendToDevsWithHelpList(qd, "§cUngültiger Wert", ((IllegalStringException) ex).getBadString());
-        }
-    }
-    
-    // -----------------------
-    // Quest Befehle
-    // -----------------------
-    
-    private boolean isDoor(Object[] args)
-    {
-        Location l = (Location) args[0];
-        return l.getWorld().getBlockState(l.getBlockPos()).getBlock() instanceof BlockDoor;
-    }
-    
-    private boolean getDoorStatus(Object[] args)
-    {
-        Location l = (Location) args[0];
-        return l.getWorld().getBlockState(l.getBlockPos()).getValue(BlockDoor.OPEN);
-    }
-    
-    private void setDoorStatus(Object[] args)
-    {
-        Location l = (Location) args[0];
-        BlockPos pos = l.getBlockPos();
-        ((BlockDoor) l.getWorld().getBlockState(pos).getBlock()).toggleDoor(l.getWorld(), pos, (boolean) args[1]);
-    }
-    
-    private void playerSay(Object[] args)
-    {
-        try
-        {
-            ((EntityPlayerMP) args[0]).connection.processChatMessage(new CPacketChatMessage(ScriptUtils.connect(args, 1)));
-        }
-        catch(ThreadQuickExitException ex)
-        {
-            // Minecraft needs this for canceling and queueing into main thread
-        }
-    }
-    
-    private void respawnPlayer(Object[] args)
-    {
-        try
-        {
-            ((EntityPlayerMP) args[0]).connection.processClientStatus(new CPacketClientStatus(CPacketClientStatus.State.PERFORM_RESPAWN));
-        }
-        catch(ThreadQuickExitException ex)
-        {
-            // Minecraft needs this for canceling and queueing into main thread
-        }
-    }
-    
-    private Class getClass(String s)
-    {
-        try
-        {
-            return Class.forName(s);
-        }
-        catch(ClassNotFoundException ex)
-        {
-            throw new IllegalStringException(s);
-        }
-    }
-    
-    private int getItemAmountChest(Object[] args) throws IllegalStringLocationException, IllegalItemStackStringException
-    {       
-        Location l = (Location) args[0];
-        TileEntity te = l.getWorld().getTileEntity(l.getBlockPos());
-        if(te == null || !(te instanceof TileEntityChest))
-        {
-            return 0;
-        }        
-        return InventoryUtils.searchInventoryFor(((TileEntityChest) te), (ItemStack) args[2], (boolean) args[1]);
-    }
-    
-    private ItemStack addItemAmountChest(Object[] args) throws IllegalStringLocationException, IllegalItemStackStringException
-    {       
-        Location l = (Location) args[0];
-        ItemStack stack = ((ItemStack) args[1]);
-        TileEntity te = l.getWorld().getTileEntity(l.getBlockPos());
-        if(te == null || !(te instanceof TileEntityChest))
-        {
-            return stack;
-        }        
-        stack.setCount(InventoryUtils.addToInventory((TileEntityChest) te, stack));  
-        return stack;
-    }
-    
-    private ItemStack removeItemAmountChest(Object[] args) throws IllegalStringLocationException, IllegalItemStackStringException
-    {       
-        Location l = (Location) args[0];
-        ItemStack stack = ((ItemStack) args[1]);
-        TileEntity te = l.getWorld().getTileEntity(l.getBlockPos());
-        if(te == null || !(te instanceof TileEntityChest))
-        {
-            return stack;
-        }        
-        stack.setCount(InventoryUtils.removeFromInventory((TileEntityChest) te, stack));  
-        return stack;
-    }
-    
-    private Object getCoordOfLocation(Object[] args) throws IllegalStringLocationException
-    {
-        Location l = (Location) args[0];
-        switch(args[1].toString())
-        {
-            case "x":
-                return l.getPos().xCoord;
-            case "y":
-                return l.getPos().yCoord;
-            case "z":
-                return l.getPos().zCoord;
-            case "bx":
-                return (int) l.getPos().xCoord;
-            case "by":
-                return (int) l.getPos().yCoord;
-            case "bz":
-                return (int) l.getPos().zCoord;
-            case "w":
-                return ModDimensions.getWorldName(l.getWorld());
-            default:
-                return null;
-        }
-    }
-    
-    private void cloneBlock(Object[] args) throws IllegalStringLocationException
-    {
-        Location l = (Location) args[1];
-        IBlockState state = getBlockState((Location) args[0]);
-        l.getWorld().setBlockState(l.getBlockPos(), state);
-    }
-    
-    private ItemStack removeItem(Object[] args) throws PlayerNotFoundException, IllegalItemStackStringException
-    {       
-        ItemStack stack = ((ItemStack) args[1]).copy();
-        stack.setCount(InventoryUtils.removeFromInventory(((EntityPlayer) args[0]).inventory, stack));
-        return stack;
-    }
-    
-    private void dropItem(Object[] args) throws IllegalStringLocationException, IllegalItemStackStringException
-    {
-        Location l = (Location) args[0];
-        World w = l.getWorld();
-        BlockPos pos = l.getBlockPos();
-        ItemStack stack = ((ItemStack) args[1]).copy();
-        int amount = stack.getCount();
-        while(amount > stack.getMaxStackSize())
-        {            
-            stack.setCount(stack.getMaxStackSize());
-            amount -= stack.getMaxStackSize();
-            ItemStackUtils.drop(w, pos, stack.copy());
-        }
-        if(amount > 0)
-        {
-            stack.setCount(amount);
-            ItemStackUtils.drop(w, pos, stack);
-        }
-    }
-    
-    private ItemStack giveItem(Object[] args) throws PlayerNotFoundException, IllegalItemStackStringException
-    {      
-        ItemStack stack = ((ItemStack) args[1]).copy();
-        stack.setCount(InventoryUtils.addToInventory(((EntityPlayer) args[0]).inventory, stack));
-        return stack;
-    }
-    
-    private void endQuest(Object[] args, Script qd) throws NumberFormatException, UnsupportedOperationException
-    {           
-        if(qd.isScript())
-        {
-            throw new UnsupportedOperationException();
-        }
-        qd.getPlayers().stream().forEach((p) -> 
-        {
-            KajetansMod.scripts.send(p, "Du hast die Quest geschafft!");
-        });
-        KajetansMod.scripts.term(qd);
-        throw new HoldCodeException();
-    }
-    
-    private void setBlock(Object[] args, Script qd) throws IllegalStringLocationException, IllegalItemStackStringException
-    {           
-        Location l = (Location) args[0];
-        ItemStack stack = (ItemStack) args[1];
-        l.getWorld().setBlockState(l.getBlockPos(), Block.getBlockFromItem(stack.getItem()).getStateFromMeta(stack.getMetadata()));
-        qd.increaseOverflowProtection();
-    }
-    
-    private void setBlockWithData(Object[] args, Script qd) throws IllegalStringLocationException
-    {           
-        Location l = (Location) args[0];
-        if(args.length >= 4)
-        {
-            NmsUtilities.setBlockWithData(l.getWorld(), l.getBlockPos(), ScriptUtils.getInt(args[2]), Block.getBlockFromName(args[1].toString()), ScriptUtils.connect(args, 3));
-        }
-        else
-        {
-            NmsUtilities.setBlockWithData(l.getWorld(), l.getBlockPos(), ScriptUtils.getInt(args[2]), Block.getBlockFromName(args[1].toString()), null);
-        }
-        qd.increaseOverflowProtection();
-    }
-    
-    private void dropInventory(Object[] args)
-    {
-        ((EntityPlayer) args[0]).inventory.dropAllItems();
-    }
-    
-    private void playSound(Object[] args) throws IllegalStringLocationException
-    {
-        Location l = ((Location) args[0]);
-        Vec3d v = l.getPos();
-        EffectUtils.playSound((WorldServer) l.getWorld(), SoundEvent.REGISTRY.getObject(new ResourceLocation(args[1].toString())), SoundCategory.MASTER, v.xCoord, v.yCoord, v.zCoord);
-    }
-    
-    private void playSoundPlayer(Object[] args) throws IllegalStringLocationException
-    {
-        EffectUtils.playSound((EntityPlayerMP) args[0], SoundEvent.REGISTRY.getObject(new ResourceLocation(args[1].toString())), SoundCategory.MASTER);
-    }
-    
-    private void playParticle(Object[] args) throws IllegalStringLocationException
-    {
-        Location l = ((Location) args[0]).add(0.5, 0.5, 0.5);
-        EffectUtils.spawnParticle((WorldServer) l.getWorld(), EnumParticleTypes.getByName(args[1].toString()), l.getPos(), ScriptUtils.getInt(args[2]));
-    }
-    
-    private void setEntityEquip(Object[] args) throws IllegalStringLocationException, EntityNotFoundException, IllegalItemStackStringException
-    {
-        EntityLivingBase liv = (EntityLivingBase) args[0];  
-        ItemStack stack = ((ItemStack) args[2]).copy();
-        switch(args[1].toString())
-        {
-            case "hand":
-                liv.setItemStackToSlot(EntityEquipmentSlot.MAINHAND, stack);
-                return;
-            case "head":
-                liv.setItemStackToSlot(EntityEquipmentSlot.HEAD, stack);
-                return;
-            case "chest":
-                liv.setItemStackToSlot(EntityEquipmentSlot.CHEST, stack);
-                return;
-            case "legs":
-                liv.setItemStackToSlot(EntityEquipmentSlot.LEGS, stack);
-                return;
-            case "feet":
-                liv.setItemStackToSlot(EntityEquipmentSlot.FEET, stack);
-                return;
-            case "offhand":
-                liv.setItemStackToSlot(EntityEquipmentSlot.OFFHAND, stack);
-        }
-    }  
-    
-    private ItemStack getEntityEquip(Object[] args) throws IllegalStringLocationException, EntityNotFoundException
-    {
-        EntityLivingBase liv = (EntityLivingBase) args[0];        
-        switch(args[1].toString())
-        {
-            case "hand":
-                return liv.getItemStackFromSlot(EntityEquipmentSlot.MAINHAND);
-            case "head":
-                return liv.getItemStackFromSlot(EntityEquipmentSlot.HEAD);
-            case "chest":
-                return liv.getItemStackFromSlot(EntityEquipmentSlot.CHEST);
-            case "legs":
-                return liv.getItemStackFromSlot(EntityEquipmentSlot.LEGS);
-            case "feet":
-                return liv.getItemStackFromSlot(EntityEquipmentSlot.FEET);
-            case "offhand":
-                return liv.getItemStackFromSlot(EntityEquipmentSlot.OFFHAND);
-        }
-        return ItemStack.EMPTY;
-    } 
-    
-    @SuppressWarnings("unchecked")
-    private void removeEntities(Object[] args) throws IllegalStringLocationException
-    {
-        Class<? extends Entity> c = (Class<? extends Entity>) getClass("org.bukkit.entity." + args[0]);
-        if(c == Entity.class || c == EntityVillager.class || c == EntityArmorStand.class || c == EntityItemFrame.class || c == EntityHanging.class)
-        {
-            return;
-        }
-        Location l = (Location) args[1];
-        Utils.getNearbyEntities(l.getWorld(), l.getPos(), ScriptUtils.getDouble(args[2]), c).stream().forEach(ent -> 
-        {
-            ent.setDead();
-        });
-    }
-    
-    private void ifFunction(Object[] args, Script qd) throws IfWithoutStatementException, NoChildTreeException
-    {
-        if(Arrays.stream(args).allMatch(s -> s.equals(true)))
-        {
-            qd.goDeeper(false);
-            qd.setElseMode(false);
-            return;
-        }
-        qd.setElseMode(true);
-    }  
-    
-    private void elseFunction(Object[] args, Script qd) throws IfWithoutStatementException, NoChildTreeException
-    {
-        if(qd.getElseMode())
-        {
-            qd.setElseMode(false);
-            qd.goDeeper(false);
-        }
-    } 
-    
-    private void whileFunction(Object[] args, Script qd) throws IfWithoutStatementException, NoChildTreeException
-    {
-        if(Arrays.stream(args).allMatch(s -> s.equals(true)))
-        {
-            qd.goDeeper(true);
-        }
-    } 
-    
-    private void setSign(Object[] args) throws IllegalStringLocationException
-    {
-        Location l = (Location) args[0];
-        TileEntitySign sign = (TileEntitySign) l.getWorld().getTileEntity(l.getBlockPos());
-        SpecialBlockUtils.setSignLine(sign, ScriptUtils.getInt(args[1]), ScriptUtils.connect(args, 2));
-    }
-    
-    @SuppressWarnings("")
-    private String getSign(Object[] args) throws IllegalStringLocationException
-    {
-        Location l = (Location) args[0];
-        TileEntitySign sign = (TileEntitySign) l.getWorld().getTileEntity(l.getBlockPos());
-        return sign.signText[ScriptUtils.getInt(args[1])].getUnformattedText();
-    }
-    
-    private boolean isSolid(Object[] args)
-    {
-        IBlockState state = getBlockState((Location) args[0]);
-        return !state.isTranslucent() && state.isFullBlock() && state.isOpaqueCube();
-    }
-
-    private void spawnItemFrame(Object[] args) throws IllegalStringLocationException, IllegalItemStackStringException
-    {
-        Location l = ((Location) args[0]);
-        EntityItemFrame frame = new EntityItemFrame(l.getWorld(), l.getBlockPos(), EnumFacing.byName(args[1].toString()));
-        frame.setDisplayedItem(((ItemStack) args[2]).copy());
-    }
-                   
-    private void nameEntity(Object[] args) throws EntityNotFoundException
-    {
-        Entity ent = (Entity) args[0];
-        ent.setCustomNameTag(ScriptUtils.connect(args, 1));
-        if(args.length >= 3)
-        {
-            ent.setAlwaysRenderNameTag((boolean) args[2]);   
-            return;
-        }
-        ent.setAlwaysRenderNameTag(true);  
-    }
-    
-    private EntityPlayer getQuestLeader(Script qd) throws PlayerNotFoundException
-    {
-        if(qd.isScript())
-        {
-            throw new UnsupportedOperationException();
-        }
-        return qd.getPlayers().get(0);
-    }
-                  
-    @SuppressWarnings(value = "unchecked")
-    private void sortList(List<Object> args, Script qd) 
-    {
-        Collections.sort(args, (Object o1, Object o2) -> ((Comparable) o1).compareTo(o2));
-    }
-    
-    private void questersToList(Object[] args, Script qd) throws UnsupportedOperationException 
-    {
-        if(qd.isScript())
-        {
-            throw new UnsupportedOperationException();
-        }
-        qd.setVar(args[0], qd.getPlayers());
-    }
-    
-    private int getNumberOfQuesters(Script qd) throws UnsupportedOperationException
-    {
-        if(qd.isScript())
-        {
-            throw new UnsupportedOperationException();
-        }
-        return qd.getPlayers().size();
-    }
-                   
-    private void giveQuest(Object[] args, Script qd) throws PlayerNotFoundException
-    {
-        if(qd.isScript())
-        {
-            EntityPlayer p = ((EntityPlayer) args[0]);
-            if(!KajetansMod.scripts.hasQuest(p))
-            {
-                KajetansMod.scripts.startQuest(KajetansMod.server, args[1].toString(), p, null, null);
-            }
-            return;
-        }
-        EntityPlayer p = qd.getPlayers().get(0);
-        if(KajetansMod.perms.has(p, Permissions.SCRIPT_ERROR))
-        {
-            qd.loadNewCode(args[0].toString(), p);
-            return;
-        }
-        qd.loadNewCode(args[0].toString(), KajetansMod.server);
-    }
-               
-    private void addToScoreBoard(Object[] args, Script qd) throws PlayerNotFoundException
-    {
-        int id = ScriptUtils.getInt(args[1]);
-        String message = ScriptUtils.connect(args, 2);
-        doForGroup(args[0], qd, p -> KajetansMod.scoreboard.getScoreboard((EntityPlayerMP) p).addText(id, message));
-    }
-    
-    private void removeFromScoreBoard(Object[] args, Script qd) throws PlayerNotFoundException
-    {
-        int id = ScriptUtils.getInt(args[1]);
-        doForGroup(args[0], qd, p -> KajetansMod.scoreboard.getScoreboard((EntityPlayerMP) p).removeText(id));
-    }
-
-    private void sendToActionBar(Object[] args, Script qd) throws PlayerNotFoundException
-    {
-        String text = ScriptUtils.connect(args, 1);
-        doForGroup(args[0], qd, p -> NmsUtilities.sendActionBar((EntityPlayerMP) p, text));
-    }
-
-    private void kickPlayerFromQuest(Object[] args, Script qd) throws PlayerNotFoundException, UnsupportedOperationException
-    {
-        if(qd.isScript())
-        {
-            throw new UnsupportedOperationException();
-        }
-        KajetansMod.scripts.removePlayerFromQuest((EntityPlayer) args[0], qd);
-    }
-                   
-    private void scheduleGoto(Object[] args, Script qd)
-    {
-        KajetansMod.scheduler.scheduleTask(() -> 
-        {
-            if(!qd.isValid())
-            {
-                return;
-            }
-            try
-            {
-                qd.gotoLabel(args[1].toString());
-                qd.setIsWaiting(false);
-                qd.runCode();
-            }
-            catch(NoChildTreeException | CodeTooLongException | GotoLabelNotFoundException ex)
-            {
-                printQuestException(qd, ex, "(Scheduled Goto)");
-            }
-        }, ScriptUtils.getInt(args[0]));
-    }
-    
-    @SuppressWarnings("")
-    private void waitFor(Object[] args, Script qd) throws UnsupportedOperationException
-    {           
-        qd.resetOverflowProtection();
-        int i = ScriptUtils.getInt(args[0]);
-        if(i < 1)
-        {
-            throw new UnsupportedOperationException();
-        }
-        qd.setIsWaiting(true);
-        KajetansMod.scheduler.scheduleTask(() -> 
-        {                   
-            if(qd == null || !qd.isValid())
-            {
-                return;
-            }
-            qd.setIsWaiting(false);
-            qd.runCode();
-        }, i); 
-        throw new HoldCodeException();
-    }   
-    
-    private void damageEntity(Object[] args)
-    {
-        if(args.length >= 4)
-        {
-            ((EntityLivingBase) args[0]).attackEntityFrom(DamageSource.causeMobDamage((EntityLivingBase) args[2]), ScriptUtils.getFloat(args[1]));
-            return;
-        }
-        ((EntityLivingBase) args[0]).attackEntityFrom(DamageSource.GENERIC, ScriptUtils.getFloat(args[1]));
-    }
-    
-    private boolean isBetween(Object[] args)
-    {
-        Vec3d l1 = ((Location) args[0]).getPos();
-        Vec3d l2 = ((Location) args[1]).getPos();
-        Vec3d l3 = ((Location) args[2]).getPos();
-        return l1.xCoord >= Math.min(l2.xCoord, l3.xCoord) &&
-                l1.xCoord <= Math.max(l2.xCoord, l3.xCoord) &&
-                l1.yCoord >= Math.min(l2.yCoord, l3.yCoord) &&
-                l1.yCoord <= Math.max(l2.yCoord, l3.yCoord) &&
-                l1.zCoord >= Math.min(l2.zCoord, l3.zCoord) &&
-                l1.zCoord <= Math.max(l2.zCoord, l3.zCoord);
-    }
-    
-    private Number increaseVar(Object var, Script qd, int value)
-    {
-        Number n = numberHandler(qd.getVar(var.toString()), (a) -> a + value, (a) -> a + value, (a) -> a + value);
-        qd.setVar(var.toString(), n);
-        return n;
-    }
-    
-    private void addPlot(Object[] args)
-    {
-        Location l1 = (Location) args[0];
-        Location l2 = (Location) args[1];
-        BlockPos pos1 = l1.getBlockPos();
-        BlockPos pos2 = l2.getBlockPos();
-        KajetansMod.plots.getDataBank(ProtectionBank.class).addPlot(Math.min(pos1.getX(), pos2.getX()),
-                    Math.min(pos1.getY(), pos2.getY()),
-                    Math.min(pos1.getZ(), pos2.getZ()),
-                    Math.max(pos1.getX(), pos2.getX()),
-                    Math.max(pos1.getY(), pos2.getY()),
-                    Math.max(pos1.getZ(), pos2.getZ()),
-                    ModDimensions.getWorldName(l1.getWorld()), null, args[2].toString()); 
-    }
-    
-    private boolean isEqual(Object[] args)
-    {
-        if(args[0] == null)
-        {
-            return args[1] == null;
-        }
-        else if(args[1] == null)
-        {
-            return args[0] == null;
-        }
-        else if(args[1] instanceof ItemStack && args[0] instanceof ItemStack)
-        {
-            return InventoryUtils.stackEqualExact((ItemStack) args[0], (ItemStack) args[1]);
-        }
-        else if(args[1] instanceof Number && args[0] instanceof Number)
-        {
-            return ((Number) args[0]).doubleValue() == ((Number) args[1]).doubleValue();
-        }
-        else if(args[0] instanceof Location && args[1] instanceof Location)
-        {
-            Location l = (Location) args[0];
-            Location l2 = (Location) args[1];
-            return l.getPos().equals(l2.getPos()) && l.getWorld().equals(l2.getWorld());
-        }
-        return args[0].equals(args[1]);
-    }
-    
-    private void tryFunction(Object[] args, Script qd) throws NoChildTreeException
-    {
-        qd.goDeeper(false); 
-        qd.setTryMode(true);
-    }
-    
-    private void catchFunction(Script qd) throws NoChildTreeException
-    {
-        if(qd.getTryFail())
-        {
-            qd.setTryFail(false);
-            qd.goDeeper(false);
-        }
-    }
-    
-    private Entity getLastDamager(Object[] args)
-    {
-        DamageSource ds = ((EntityPlayer) args[0]).getLastDamageSource();
-        if(ds == null)
-        {
-            return null;
-        }
-        return ds.getSourceOfDamage();
-    }
-    
-    @SuppressWarnings("")
-    private SnuviInventory newInventory(Location l, Script qd, String s)
-    {
-        TileEntityChest chest = (TileEntityChest) l.getWorld().getTileEntity(l.getBlockPos());
-        int size = chest.getSizeInventory();
-        if(size % 9 != 0)
-        {
-            size /= 9;
-            size++;
-            size *= 9;
-        }
-        SnuviInventory inv = new SnuviInventory(s, size, qd.getNewId()); 
-        for(int i = 0; i < chest.getSizeInventory(); i++)
-        {
-            inv.setInventorySlotContents(i, chest.getStackInSlot(i).copy());
-        }
-        return inv;
-    }
-    
-    private void split(Object[] args, Script qd)
-    {
-        String[] parts = ScriptUtils.connect(args, 2).split(args[1].toString());
-        ArrayList<Object> list = new ArrayList<>();
-        for(String s : parts)
-        {
-            list.add(ScriptUtils.convertInput(s));
-        }
-        qd.setVar(args[0], list);
-    }
-    
-    private boolean onlyLetters(String s)
-    {
-        for(char c : s.toCharArray())
-        {
-            if(!Character.isLetter(c))
-            {
-                return false;
-            }
-        }
-        return true;
-    }
-    
-    private String getName(Object[] args)
-    {
-        Object o = args[0];
-        if(o instanceof EntityPlayer)
-        {
-            return ((EntityPlayer) o).getName();
-        }
-        return KajetansMod.playerbank.getDataBank().getName(o.toString());
-    }
-    
-    private String getUuid(Object[] args)
-    {
-        Object o = args[0];
-        if(o instanceof EntityPlayer)
-        {
-            return ((EntityPlayer) o).getUniqueID().toString();
-        }
-        return KajetansMod.playerbank.getDataBank().getUUID(o.toString());
-    }
-    
-    @SuppressWarnings("")
-    private String getPotionType(Object[] args)
-    {
-        return PotionUtils.getPotionFromItem(((EntityPotion) args[0]).getPotion()).getRegistryName().toString();
-    }
-    
-    private void setTag(Object[] args)
-    {
-        if(args[0] instanceof EntityPlayer)
-        {
-            KajetansMod.playerbank.getDataBank().setTag((EntityPlayer) args[0], args[1].toString(), ScriptUtils.getInt(args[2]));
-            return;
-        }
-        KajetansMod.playerbank.getDataBank().setTag(KajetansMod.playerbank.getDataBank().getUUID(args[0].toString()), args[1].toString(), ScriptUtils.getInt(args[2]));
-    }
-    
-    private int getTag(Object[] args)
-    {
-        if(args[0] instanceof EntityPlayer)
-        {
-            return KajetansMod.playerbank.getDataBank().getTag((EntityPlayer) args[0], args[1].toString());
-        }
-        return KajetansMod.playerbank.getDataBank().getTag(KajetansMod.playerbank.getDataBank().getUUID(args[0].toString()), args[1].toString());
-    }
-    
-    private void setGlobalVar(Object[] args)
-    {
-        if(args[0] instanceof EntityPlayer)
-        {
-            KajetansMod.scripts.getDataBank(ScriptBank.class).setVar(args[2].toString(), args[1].toString(), ((EntityPlayer) args[0]).getUniqueID().toString());
-            return;
-        }
-        KajetansMod.scripts.getDataBank(ScriptBank.class).setVar(args[2].toString(), args[1].toString(), KajetansMod.playerbank.getDataBank().getUUID(args[0].toString()));
-    }
-    
-    private Object getGlobalVar(Object[] args)
-    {
-        if(args[0] instanceof EntityPlayer)
-        {
-            return KajetansMod.scripts.getDataBank(ScriptBank.class).getVar(args[1].toString(), ((EntityPlayer) args[0]).getUniqueID().toString());
-        }
-        return KajetansMod.scripts.getDataBank(ScriptBank.class).getVar(args[1].toString(), KajetansMod.playerbank.getDataBank().getUUID(args[0].toString()));
-    }
-
-    // -------------------------------------------------------------------------    
-    // Block
-    // ------------------------------------------------------------------------- 
-    
-    private int getBlockData(Location l)
-    {
-        IBlockState state = l.getWorld().getBlockState(l.getBlockPos());
-        return state.getBlock().getMetaFromState(state);
-    }
-    
-    private IBlockState getBlockState(Location l)
-    {
-        return l.getWorld().getBlockState(l.getBlockPos());
-    }
-    
-    private ItemStack getStackFromBlock(Location l)
-    {
-        World w = l.getWorld();
-        BlockPos pos = l.getBlockPos();
-        IBlockState state = w.getBlockState(pos);
-        return state.getBlock().getItem(w, pos, state);
-    }
-    
-    // -------------------------------------------------------------------------    
-    // Custom-Handler
-    // ------------------------------------------------------------------------- 
-    
-    private void registerShapelessRecipe(Object[] args)
-    {
-        ItemStack[] stacks = new ItemStack[args.length - 1];
-        for(int i = 0; i < stacks.length; i++)
-        {
-            stacks[i] = (ItemStack) args[i + 1];
-        }
-        RecipeUtils.registerShapelessRecipe((ItemStack) args[0], stacks);
-    }
-    
-    private void registerShapedRecipe(Object[] args)
-    {
-        int counter = 0;
-        while(args[counter + 1].getClass() == String.class)
-        {
-            counter++;
-        }
-        String[] s = new String[counter];
-        for(int i = 0; i < s.length; i++)
-        {
-            s[i] = args[i + 1].toString();
-        }
-        
-        ItemStack[] stacks = new ItemStack[args.length - 1 - s.length];
-        for(int i = 0; i < stacks.length; i++)
-        {
-            stacks[i] = (ItemStack) args[i + 1 + counter];
-        }
-        RecipeUtils.registerShapedRecipe((ItemStack) args[0], s, stacks);
-    }
-    
-    // -------------------------------------------------------------------------    
-    // Zeit-Handler
-    // ------------------------------------------------------------------------- 
-    
-    private long getNextDay(Object[] args)       
-    {
-        GregorianCalendar cal = GregorianCalendar.from(ZonedDateTime.now());
-        cal.setTimeInMillis((long) args[0]);
-        cal.add(Calendar.DAY_OF_YEAR, 1);
-        cal.set(Calendar.HOUR, 0);
-        cal.set(Calendar.SECOND, 0);
-        cal.set(Calendar.MINUTE, 0);
-        cal.set(Calendar.MILLISECOND, 0);
-        return cal.getTimeInMillis();   
-    } 
-    
-    private int getYear(Object[] args)       
-    {
-        GregorianCalendar cal = GregorianCalendar.from(ZonedDateTime.now());
-        cal.setTimeInMillis((long) args[0]);
-        return cal.get(Calendar.YEAR);   
-    }
-    
-    private int getMonth(Object[] args)       
-    {
-        GregorianCalendar cal = GregorianCalendar.from(ZonedDateTime.now());
-        cal.setTimeInMillis((long) args[0]);
-        return cal.get(Calendar.MONTH) + 1;   
-    }
-    
-    private int getDay(Object[] args)       
-    {
-        GregorianCalendar cal = GregorianCalendar.from(ZonedDateTime.now());
-        cal.setTimeInMillis((long) args[0]);
-        return cal.get(Calendar.DAY_OF_MONTH);   
-    }
-    
-    private int getHour(Object[] args)       
-    {
-        GregorianCalendar cal = GregorianCalendar.from(ZonedDateTime.now());
-        cal.setTimeInMillis((long) args[0]);
-        return cal.get(Calendar.HOUR_OF_DAY);   
-    }
-    
-    private int getMinute(Object[] args)       
-    {
-        GregorianCalendar cal = GregorianCalendar.from(ZonedDateTime.now());
-        cal.setTimeInMillis((long) args[0]);
-        return cal.get(Calendar.MINUTE);   
-    }
-    
-    private int getSecond(Object[] args)       
-    {
-        GregorianCalendar cal = GregorianCalendar.from(ZonedDateTime.now());
-        cal.setTimeInMillis((long) args[0]);
-        return cal.get(Calendar.SECOND);   
-    }
-    
-    // -------------------------------------------------------------------------    
-    // Gruppen-Handler
-    // ------------------------------------------------------------------------- 
-    
-    private void doForGroup(Object group, Script qd, Consumer<ICommandSender> c) throws UnsupportedOperationException, PlayerNotFoundException
-    {
-        if(group instanceof String)
-        {
-            switch(group.toString()) 
-            {
-                case "all":
-                    if(qd.isScript())
-                    {
-                        throw new UnsupportedOperationException();
-                    }
-                    qd.getPlayers().forEach(p -> c.accept(p));
-                    break;
-                case "online":
-                    KajetansMod.server.getPlayerList().getPlayers().forEach(p -> c.accept(p));
-                    break;
-                case "dev":
-                    if(qd.isScript())
-                    {
-                        KajetansMod.server.getPlayerList().getPlayers().stream().filter(p -> KajetansMod.perms.has(p, Permissions.SCRIPT_ERROR)).forEach(p -> c.accept(p));
-                        return;
-                    }
-                    qd.getPlayers().stream().filter(p ->  KajetansMod.perms.has(p, Permissions.SCRIPT_ERROR)).forEach(p -> c.accept(p));
-                    break;
-                case "server":
-                    c.accept(KajetansMod.server);
-                    break;
-                default:
-                    c.accept(Utils.getPlayerByName(group.toString()));
-                    break;
-            }
-            return;
-        }
-        c.accept((EntityPlayer) group);
-    } 
-    
-    private void sendMessageToGroup(Object group, Script qd, String message)
-    {
-        TextComponentString comp = new TextComponentString(message);
-        doForGroup(group, qd, p -> p.sendMessage(comp));
-    }
-    
-    public void sendMessageWithSuffix(Script qd, String message)
-    {
-        Module m = KajetansMod.scripts;
-        int id = qd.isScript() ? 1 : 0;
-        doForGroup("all", qd, p -> m.send(p, message, id));
-    }
-    
-    private void sendToDevsWithSuffix(Script qd, String message)
-    {
-        Module m = KajetansMod.scripts;
-        int id = qd.isScript() ? 1 : 0;
-        doForGroup("dev", qd, p -> m.send(p, message, id));
-    }
-    
-    public void sendWarningToAllDevs(String message)
-    {
-        Module m = KajetansMod.scripts;
-        String warnMessage = "§4" + message;
-        KajetansMod.server.getPlayerList().getPlayers().stream().filter(p -> KajetansMod.perms.has(p, Permissions.SCRIPT_ERROR)).forEach(p -> m.send(p, warnMessage));
-    }
-    
-    private void sendToDevsWithList(Script qd, String message)
-    {
-        Module m = KajetansMod.scripts;
-        int id = qd.isScript() ? 1 : 0;
-        doForGroup("dev", qd, p -> m.sendListElement(p, message, id));
-    }
-    
-    private void sendToDevsWithHelpList(Script qd, String message, String message2)
-    {
-        Module m = KajetansMod.scripts;
-        int id = qd.isScript() ? 1 : 0;
-        doForGroup("dev", qd, p -> m.sendHelpListElement(p, message, message2, id));
-    }   
-        
-    // -------------------------------------------------------------------------    
-    // Integer-Double-Long-Handler
-    // ------------------------------------------------------------------------- 
-    
-    private Number numberHandler(Number a,
-            Function<Integer, Integer> f,
-            Function<Long, Long> f2,
-            Function<Double, Double> f3)
-    {
-        if(a instanceof Integer)
-        {
-            return f.apply(a.intValue());
-        }
-        else if(a instanceof Long)
-        {
-            return f2.apply(a.longValue());
-        }
-        return f3.apply(a.doubleValue());
-    }
-    
-    private Number numberHandler(Object a,
-            Function<Integer, Integer> f,
-            Function<Long, Long> f2,
-            Function<Double, Double> f3)
-    {
-        return numberHandler((Number) a, f, f2, f3);
-    }
-    
-    private Number numberHandler(Number a, Number b, 
-            BiFunction<Integer, Integer, Integer> f,
-            BiFunction<Long, Long, Long> f2,
-            BiFunction<Double, Double, Double> f3)
-    {
-        if(a instanceof Integer && b instanceof Integer)
-        {
-            return f.apply(a.intValue(), b.intValue());
-        }
-        else if((a instanceof Long || a instanceof Integer) && (b instanceof Long || b instanceof Integer))
-        {
-            return f2.apply(a.longValue(), b.longValue());
-        }
-        return f3.apply(a.doubleValue(), b.doubleValue());
-    }
-    
-    private Number numberHandler(Object a, Object b, 
-            BiFunction<Integer, Integer, Integer> f,
-            BiFunction<Long, Long, Long> f2,
-            BiFunction<Double, Double, Double> f3)
-    {
-        return numberHandler((Number) a, (Number) b, f, f2, f3);
-    }
-    
-    private Number convertDouble(Double d)
-    {
-        if(d == d.intValue())
-        {
-            return d.intValue();
-        }
-        else if(d == d.longValue())
-        {
-            return d.longValue();
-        }
-        return d;
-    }
-    
-    // -------------------------------------------------------------------------    
-    // Rundungs-Handler
-    // ------------------------------------------------------------------------- 
-    
-    private Number round(Object o)
-    {
-        Long l = Math.round(ScriptUtils.getDouble(o));
-        if(l == l.intValue())
-        {
-            return l.intValue();
-        }
-        return l;
-    }
-    
-    private Number roundDown(Object o)
-    {
-        Double d = Math.floor(ScriptUtils.getDouble(o));
-        if(d == d.intValue())
-        {
-            return d.intValue();
-        }
-        return d.longValue();
-    }
-    
-    private Number roundUp(Object o)
-    {
-        Double d = Math.ceil(ScriptUtils.getDouble(o));
-        if(d == d.intValue())
-        {
-            return d.intValue();
-        }
-        return d.longValue();
-    }
-}

+ 0 - 174
src/main/java/me/km/snuviscript/Tree.java

@@ -1,174 +0,0 @@
-package me.km.snuviscript;
-
-import me.km.exception.GoHigherAtRootTreeException;
-import me.km.exception.NoChildTreeException;
-import it.unimi.dsi.fastutil.objects.ObjectArrayList;
-import java.util.Stack;
-
-public class Tree<T> 
-{
-    private final Node<T> root;
-    private Node<T> currentNode;
-    private final Stack<Integer> position;
-
-    public Tree() 
-    {
-        root = new Node<>();
-        root.parent = null;
-        root.data = null;
-        root.children = new ObjectArrayList<>();
-        root.selectedChild = -1;
-        
-        currentNode = root;
-        
-        position = new Stack<>();
-    }
-    
-    public void clear()
-    {
-        root.children.clear();
-        currentNode = root;
-        position.clear();
-        root.selectedChild = -1;
-    }
-
-    private static class Node<T> 
-    {
-        private int actualCodeLine;
-        private T data;
-        private Node<T> parent;
-        private ObjectArrayList<Node<T>> children;
-        private int selectedChild;
-    }
-    
-    public void addChild(T child, int actualCodeLine)
-    {
-        Node<T> node = new Node<>();
-        node.data = child;
-        node.parent = currentNode;
-        node.children = new ObjectArrayList<>();    
-        node.selectedChild = -1;
-        node.actualCodeLine = actualCodeLine;
-        currentNode.children.add(node);
-    }
-    
-    public int getActualCodeLine()
-    {
-        return currentNode.children.get(currentNode.selectedChild).actualCodeLine;
-    }
-    
-    public void goHigher() throws GoHigherAtRootTreeException
-    {
-        currentNode.selectedChild = 0;
-        currentNode = currentNode.parent;
-        if(currentNode == null)
-        {
-            currentNode = root;
-            throw new GoHigherAtRootTreeException();
-        }
-        position.pop();
-    }
-    
-    public void goDeeper() throws NoChildTreeException
-    {
-        try
-        {   
-            int i = currentNode.selectedChild;
-            currentNode = currentNode.children.get(i);
-            position.add(i);
-            currentNode.selectedChild = -1;
-        }
-        catch(IndexOutOfBoundsException ex)
-        {
-            throw new NoChildTreeException();
-        }
-    }
-    
-    public void selectChild(int index) throws NoChildTreeException
-    {
-        if(index >= currentNode.children.size())
-        {
-            throw new NoChildTreeException();
-        }
-        currentNode.selectedChild = index;
-    }
-    
-    public void selectNextChild() throws NoChildTreeException
-    {
-        currentNode.selectedChild++;
-        if(currentNode.selectedChild >= currentNode.children.size())
-        {
-            currentNode.selectedChild--;
-            throw new NoChildTreeException();
-        }
-    }
-    
-    public void selectPreviousChild()
-    {
-        currentNode.selectedChild--;
-    }
-    
-    public void selectLastChild() throws NoChildTreeException
-    {
-        currentNode.selectedChild = currentNode.children.size() - 1;
-        if(currentNode.selectedChild == -1)
-        {
-            throw new NoChildTreeException();
-        }
-    }
-    
-    public T getCurrentData()
-    {
-        return currentNode.data;
-    }
-    
-    public T getCurrentChildData() throws NoChildTreeException
-    {
-        try
-        {   
-            return currentNode.children.get(currentNode.selectedChild).data;
-        }
-        catch(IndexOutOfBoundsException ex)
-        {
-            throw new NoChildTreeException();
-        }
-    }
-    
-    public void goToRoot()
-    {
-        try
-        {
-            while(true)
-            {
-                goHigher();
-            }
-        }
-        catch(GoHigherAtRootTreeException ex)
-        {
-            currentNode.selectedChild = -1;
-        }     
-    }
-    
-    public void goToPosition(Integer... i) throws NoChildTreeException
-    {
-        goToRoot();
-        for(int a = 0; a < i.length - 1; a++)
-        {
-            selectChild(i[a]);
-            goDeeper();
-        }
-        selectChild(i[i.length - 1]);
-    }
-    
-    public boolean isRootNodeSelected()
-    {
-        return currentNode.data == null;
-    }
-    
-    public Integer[] getCurrentPosition()
-    {
-        Integer[] i = position.toArray(new Integer[position.size() + 1]);
-        i[position.size()] = currentNode.selectedChild;
-        return i;
-    }
-}

+ 0 - 27
src/main/java/me/km/snuviscript/Variable.java

@@ -1,27 +0,0 @@
-package me.km.snuviscript;
-
-public class Variable 
-{
-    private final String name;
-  
-    public Variable(String name)
-    {
-        if(name.startsWith("$"))
-        {
-            this.name = name.substring(1);
-            return;
-        }
-        this.name = name;
-    }
-    
-    public String getName()
-    {
-        return name;
-    }
-
-    @Override
-    public String toString() 
-    {
-        return name;
-    }  
-}