Browse Source

ItemShooting, Scoreboard, Loren, Debug-Mode über Config

Kajetan Johannes Hammerle 7 years ago
parent
commit
8de3eaccf9
54 changed files with 1013 additions and 602 deletions
  1. 26 11
      src/main/java/me/km/KajetansMod.java
  2. 3 6
      src/main/java/me/km/api/Module.java
  3. 22 3
      src/main/java/me/km/api/SimpleConfig.java
  4. 10 0
      src/main/java/me/km/api/Utils.java
  5. 1 0
      src/main/java/me/km/api/VanillaCommandOverloader.java
  6. 7 12
      src/main/java/me/km/commands/CommandEnchant.java
  7. 3 13
      src/main/java/me/km/commands/CommandTest.java
  8. 2 2
      src/main/java/me/km/databank/SimpleDataBank.java
  9. 6 5
      src/main/java/me/km/datatools/CommandDataTools.java
  10. 2 2
      src/main/java/me/km/effects/ActiveEffectBase.java
  11. 10 14
      src/main/java/me/km/effects/CommandWand.java
  12. 16 1
      src/main/java/me/km/effects/EffectUtils.java
  13. 1 2
      src/main/java/me/km/effects/active/Doomed.java
  14. 7 3
      src/main/java/me/km/effects/active/Musket.java
  15. 1 2
      src/main/java/me/km/effects/active/Silence.java
  16. 9 5
      src/main/java/me/km/effects/active/Stone.java
  17. 6 5
      src/main/java/me/km/effects/passive/EntityDamageEffects.java
  18. 32 18
      src/main/java/me/km/effects/passive/Mugging.java
  19. 5 5
      src/main/java/me/km/effects/passive/TrapEffects.java
  20. 174 0
      src/main/java/me/km/entities/EntityItemProjectile.java
  21. 3 2
      src/main/java/me/km/events/CustomEventCaller.java
  22. 4 4
      src/main/java/me/km/events/PlayerHurtEvent.java
  23. 12 0
      src/main/java/me/km/inventory/InventoryUtils.java
  24. 15 0
      src/main/java/me/km/items/ItemDagger.java
  25. 1 1
      src/main/java/me/km/items/ItemWand.java
  26. 16 12
      src/main/java/me/km/nms/NmsUtilities.java
  27. 48 0
      src/main/java/me/km/nms/PathfinderGoalDestroyBlock.java
  28. 27 0
      src/main/java/me/km/permissions/PermissionListener.java
  29. 9 0
      src/main/java/me/km/permissions/PermissionManager.java
  30. 4 4
      src/main/java/me/km/playerbank/PlayerData.java
  31. 2 1
      src/main/java/me/km/playerbank/PlayerManager.java
  32. 100 0
      src/main/java/me/km/scoreboard/PlayerScoreboard.java
  33. 5 1
      src/main/java/me/km/scoreboard/ScoreBoardLeave.java
  34. 11 11
      src/main/java/me/km/scoreboard/ScoreboardAPI.java
  35. 0 100
      src/main/java/me/km/scoreboard/ScoreboardData.java
  36. 6 4
      src/main/java/me/km/scoreboard/ScoreboardRefresher.java
  37. 0 1
      src/main/java/me/km/skills/Skill.java
  38. 4 4
      src/main/java/me/km/snuviscript/CodeFunction.java
  39. 3 3
      src/main/java/me/km/snuviscript/CommandGiveUp.java
  40. 12 12
      src/main/java/me/km/snuviscript/CommandQuest.java
  41. 1 1
      src/main/java/me/km/snuviscript/CommandQuestInfo.java
  42. 11 11
      src/main/java/me/km/snuviscript/CommandScript.java
  43. 9 9
      src/main/java/me/km/snuviscript/Script.java
  44. 23 23
      src/main/java/me/km/snuviscript/ScriptAPI.java
  45. 5 5
      src/main/java/me/km/snuviscript/ScriptBank.java
  46. 67 54
      src/main/java/me/km/snuviscript/ScriptEvents.java
  47. 5 5
      src/main/java/me/km/snuviscript/ScriptInventoryHolder.java
  48. 1 1
      src/main/java/me/km/snuviscript/ScriptUtils.java
  49. 6 6
      src/main/java/me/km/snuviscript/ScriptVars.java
  50. 180 182
      src/main/java/me/km/snuviscript/SnuviParser.java
  51. 2 2
      src/main/java/me/km/utils/ItemStackBuilder.java
  52. 27 28
      src/main/java/me/km/utils/ItemStackUtils.java
  53. 50 0
      src/main/java/me/km/utils/RecipeUtils.java
  54. 1 6
      src/main/java/me/km/utils/ReflectionUtils.java

+ 26 - 11
src/main/java/me/km/KajetansMod.java

@@ -19,8 +19,8 @@ import me.km.plots.ProtectionBank;
 import me.km.scheduler.SnuviScheduler;
 import me.km.scoreboard.ScoreboardAPI;
 import me.km.skills.SkillManager;
-import me.km.snuviscript.QuestAPI;
-import me.km.snuviscript.QuestBank;
+import me.km.snuviscript.ScriptAPI;
+import me.km.snuviscript.ScriptBank;
 import net.minecraft.server.MinecraftServer;
 import net.minecraft.util.text.TextFormatting;
 import net.minecraftforge.common.MinecraftForge;
@@ -53,7 +53,7 @@ public class KajetansMod
     public static Module datatools;
     public static WorldData worldManager;
     public static Module environment;
-    public static QuestAPI quest;
+    public static ScriptAPI scripts;
     public static JobAPI jobs;
     public static EffectUtils effects;
     public static SkillManager skills;
@@ -72,6 +72,8 @@ public class KajetansMod
     public static KajetansMod instance;
     
     public static MinecraftServer server;
+    
+    public static boolean debugMode;
 
     @Mod.EventHandler
     public void preInit(FMLPreInitializationEvent event) 
@@ -96,6 +98,19 @@ public class KajetansMod
         // Konfiguration und Error-Dummy
         error = new Module("ERROR", "ERROR", TextFormatting.RED);
         conf = new SimpleConfig(error, "config", true);
+        debugMode = conf.getBoolean("debug", false);
+        if(debugMode)
+        {
+            System.out.println("------------------------------------------------");
+            System.out.println("Starting server in debug mode");
+            System.out.println("------------------------------------------------");
+        }
+        else
+        {
+            System.out.println("------------------------------------------------");
+            System.out.println("Starting server without debug mode");
+            System.out.println("------------------------------------------------");
+        }
         
         // Datenbankverbindung
         databank = new DataBank("DataBank", "DataBank", TextFormatting.RED);
@@ -150,12 +165,12 @@ public class KajetansMod
         worldManager.registerCommands(e, "me.km.dimensions");          
         worldManager.registerEvents("me.km.dimensions");
         
-        // Questsystem
-        quest = new QuestAPI("Quests", "Quests", TextFormatting.LIGHT_PURPLE);
-        quest.registerPrefix("Scripts", TextFormatting.LIGHT_PURPLE);
-        quest.setDataBank(new QuestBank(quest, databank.getConnection()));
-        quest.registerCommands(e, "me.km.snuviscript");          
-        quest.registerEvents("me.km.snuviscript");
+        // Scriptsystem
+        scripts = new ScriptAPI("Quests", "Quests", TextFormatting.LIGHT_PURPLE);
+        scripts.registerPrefix("Scripts", TextFormatting.LIGHT_PURPLE);
+        scripts.setDataBank(new ScriptBank(scripts, databank.getConnection()));
+        scripts.registerCommands(e, "me.km.snuviscript");          
+        scripts.registerEvents("me.km.snuviscript");
         
         // Jobsystem
         jobs = new JobAPI("JobSystem", "Jobs", TextFormatting.GREEN);
@@ -189,8 +204,8 @@ public class KajetansMod
         // Permissions
         perms = new PermissionManager("Permissions", "Perms", TextFormatting.DARK_PURPLE);
         perms.registerEvents("me.km.permissions");
-          
-        //quest.startScript(this.getServer().getConsoleSender(), "startscript");
+
+        scripts.startScript(server, "startscript");
     }
     
     @Mod.EventHandler

+ 3 - 6
src/main/java/me/km/api/Module.java

@@ -1,6 +1,7 @@
 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;
@@ -61,11 +62,7 @@ public class Module extends MessageSender
         e.registerServerCommand(command);
         if(commands.put(command.getName(), command) != null) 
         {
-            this.sendWarningToConsole("Der Command '" + command.getName() + "' wurde ein weiteres Mal geladen.");
-        }
-        else
-        {
-           this.sendToConsole("Der Command '" + command.getName() + "' wurde geladen.");
+            this.sendToConsole("Der Command '" + command.getName() + "' wurde ein weiteres Mal geladen.");
         }
     }
     
@@ -81,7 +78,7 @@ public class Module extends MessageSender
             }
             catch(ClassCastException | NoSuchMethodException | SecurityException | InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException ex)
             { 
-                this.sendWarningToConsole("Die Klasse '" + c + "' wurde nicht geladen.");
+                this.sendToConsole("Die Klasse '" + c + "' wurde nicht geladen.");
             }
         });
         this.sendToConsole("Alle Commands wurden geladen.");

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

@@ -6,13 +6,10 @@ import java.nio.charset.Charset;
 import java.nio.charset.MalformedInputException;
 import java.nio.file.Files;
 import java.nio.file.Paths;
-import java.util.Arrays;
-import java.util.List;
 import java.util.TreeMap;
 import java.util.stream.Collectors;
 import me.km.dimensions.ModDimensions;
 import me.km.exception.IllegalItemStackStringException;
-import me.km.nms.NmsUtilities;
 import me.km.utils.ItemStackUtils;
 import net.minecraft.item.ItemStack;
 import net.minecraft.util.math.Vec3d;
@@ -156,6 +153,23 @@ public class SimpleConfig
         }
     }
     
+    public boolean getBoolean(String key, boolean error)
+    {
+        String s = conf.get(key);
+        if(s == null)
+        {
+            return error;
+        }
+        try
+        {
+            return Boolean.valueOf(s);
+        }
+        catch(NumberFormatException ex)
+        {
+            return error;
+        }
+    }
+    
     public Location getLocation(String key)
     {
         return new Location(ModDimensions.getWorldFromName(getString(key + ".world")), 
@@ -204,6 +218,11 @@ public class SimpleConfig
         setString(key, String.valueOf(i));
     }
     
+    public void setBoolean(String key, boolean b)
+    {
+        setString(key, String.valueOf(b));
+    }
+    
     public void setLocation(String key, Location l)
     {
         setString(key + ".world", l.getWorld().getWorldInfo().getWorldName());

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

@@ -11,6 +11,7 @@ import java.util.Random;
 import java.util.stream.Collectors;
 import me.km.KajetansMod;
 import me.km.dimensions.ModTeleporter;
+import me.km.entities.EntityItemProjectile;
 import me.km.exception.PlayerNotFoundException;
 import net.minecraft.entity.Entity;
 import net.minecraft.entity.player.EntityPlayer;
@@ -359,6 +360,15 @@ public class Utils
             }
             return null;
         }
+        else if(ent instanceof EntityItemProjectile)
+        {
+            EntityItemProjectile item = (EntityItemProjectile) ent;
+            if(item.getItemThrower() instanceof EntityPlayer)
+            {
+                return (EntityPlayer) item.getItemThrower();
+            }
+            return null;
+        }
         return null;
     }
     

+ 1 - 0
src/main/java/me/km/api/VanillaCommandOverloader.java

@@ -28,5 +28,6 @@ public class VanillaCommandOverloader
             m.registerCommand(e, new VanillaModuleCommand(command, m, perm));
             m.sendToConsole(command.getName() + " wurde überschrieben.");
         });
+        m.sendToConsole("Alle Commands wurden überschrieben.");
     }
 }

+ 7 - 12
src/main/java/me/km/commands/CommandEnchant.java

@@ -3,9 +3,11 @@ package me.km.commands;
 import me.km.api.GlobalText;
 import me.km.api.Module;
 import java.util.Arrays;
+import java.util.stream.Collectors;
 import me.km.api.ModuleTabCommand;
 import me.km.permissions.Permissions;
 import net.minecraft.command.ICommandSender;
+import net.minecraft.enchantment.Enchantment;
 import net.minecraft.entity.player.EntityPlayer;
 import net.minecraft.item.ItemStack;
 
@@ -13,16 +15,10 @@ public class CommandEnchant extends ModuleTabCommand
 {
     public CommandEnchant(Module m) 
     {
-        super("enchant", m, Arrays.asList(new String[]
-        {
-            "WUSI"
-        }), 0);  
+        super("enchant", m, Enchantment.REGISTRY.getKeys().stream().map(r -> r.getResourcePath()).collect(Collectors.toList()), 0);  
         super.setDescription("Erzeugt Custom-Enchants");
         super.setUsage("/enchant <enchant> <level>");
         super.setPermission(Permissions.ENCHANT);       
-        
-        //m.registerTabCompleter("enchant", new SimpleTabCompleter(
-        //    Arrays.asList(Enchantment.values()).stream().map(n -> n.getName()).collect(Collectors.toList()), 1));
     }
 
     @Override
@@ -44,8 +40,8 @@ public class CommandEnchant extends ModuleTabCommand
         {
             return false;
         }
-        // TODO
-        /*Enchantment ench = Enchantment.getByName(arg[0]);
+        
+        Enchantment ench = Enchantment.getEnchantmentByLocation(arg[0]);
         if(ench == null)
         {
             this.getModule().send(cs, "Das gegebene Enchantment existiert nicht.");
@@ -58,15 +54,14 @@ public class CommandEnchant extends ModuleTabCommand
             {
                 throw new NumberFormatException();
             } 
-            hand.addUnsafeEnchantment(ench, i);
-            p.getInventory().setItemInMainHand(hand);
+            hand.addEnchantment(ench, i);
             this.getModule().send(cs, "Das Enchantment wurde hinzugefügt.");
             return true;
         }
         catch(NumberFormatException ex)
         {
             this.getModule().send(cs, GlobalText.noPositiveNaturalNumber());            
-        }*/
+        }
         return true;
     }
 }

+ 3 - 13
src/main/java/me/km/commands/CommandTest.java

@@ -3,13 +3,11 @@ package me.km.commands;
 import me.km.api.GlobalText;
 import me.km.api.Module;
 import me.km.api.ModuleCommand;
-import me.km.api.Utils;
+import me.km.effects.EffectUtils;
+import me.km.entities.EntityItemProjectile;
 import me.km.permissions.Permissions;
 import net.minecraft.command.ICommandSender;
-import net.minecraft.entity.Entity;
-import net.minecraft.entity.EntityLivingBase;
 import net.minecraft.entity.player.EntityPlayer;
-import net.minecraft.init.Blocks;
 
 public class CommandTest extends ModuleCommand
 {
@@ -30,15 +28,7 @@ public class CommandTest extends ModuleCommand
             return true;
         }
         EntityPlayer p = (EntityPlayer) cs;
-        Entity test = Utils.getTargetedEntity(p, 30, EntityLivingBase.class);
-        if(test == null)
-        {
-            this.getModule().send(cs, "null");
-            return true;
-        }
-        p.getEntityWorld().setBlockState(test.getPosition(), Blocks.REDSTONE_BLOCK.getDefaultState());
-        //p.getEntityWorld().setBlockState(pos, Blocks.REDSTONE_BLOCK.getDefaultState());
-        //this.getModule().send(cs, "Es passiert nichts.");
+        EffectUtils.launchProjectile(p, EntityItemProjectile.class, 1, p.getHeldItemMainhand().copy());
         return true;
     }
 }

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

@@ -6,7 +6,7 @@ import java.sql.SQLException;
 import java.sql.Statement;
 import java.util.ArrayList;
 import me.km.api.Module;
-import me.km.snuviscript.QuestUtils;
+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), QuestUtils.convertInput(rs.getString(2))});
+                table.addRow(new Object[] {rs.getString(1), ScriptUtils.convertInput(rs.getString(2))});
             }
             return table;
         }

+ 6 - 5
src/main/java/me/km/datatools/CommandDataTools.java

@@ -14,6 +14,7 @@ import me.km.permissions.Permissions;
 import me.km.utils.ItemStackUtils;
 import net.minecraft.command.ICommandSender;
 import net.minecraft.entity.Entity;
+import net.minecraft.entity.EntityLiving;
 import net.minecraft.entity.player.EntityPlayerMP;
 import net.minecraft.inventory.EntityEquipmentSlot;
 import net.minecraft.item.ItemStack;
@@ -116,17 +117,17 @@ public class CommandDataTools extends ModuleCommand
                     NmsUtilities.sendCopyableText(p, nbt);
                     return true;
                 }
-                /*case "test":
+                case "test":
                 {
-                    Entity ent = Utils.getTargetedEntity(p, 3, Entity.class);
+                    EntityLiving ent = Utils.getTargetedEntity(p, 3, EntityLiving.class);
                     if(ent == null)
                     {
                         m.send(cs, "Du musst auf ein Objekt gerichtet sein.");
                         return true;
                     }       
-                    NmsUtilities.canDestroyBlocks((LivingEntity) ent);
+                    NmsUtilities.canDestroyBlocks((EntityLiving) ent);
                     return true;
-                }*/
+                }
                 case "flag":
                 {
                     if(arg.length < 2)
@@ -272,7 +273,7 @@ public class CommandDataTools extends ModuleCommand
                         m.send(cs, GlobalText.noNaturalNumber());
                         return true;
                     }            
-                    ItemStackUtils.setLore(hand, ChatManager.colorMessage(Utils.connectSpaces(arg, 2), p), line);
+                    ItemStackUtils.addLore(hand, ChatManager.colorMessage(Utils.connectSpaces(arg, 2), p), line);
                     m.send(cs, "Die neue Lore wurde hinzugefügt.");
                     return true;
             }

+ 2 - 2
src/main/java/me/km/effects/ActiveEffectBase.java

@@ -2,7 +2,7 @@ package me.km.effects;
 
 import me.km.KajetansMod;
 import me.km.environment.EnvironmentAPI;
-import me.km.snuviscript.QuestsEvents;
+import me.km.snuviscript.ScriptEvents;
 import net.minecraft.entity.player.EntityPlayerMP;
 
 public abstract class ActiveEffectBase 
@@ -32,7 +32,7 @@ public abstract class ActiveEffectBase
         int manaCost = getManaCost(manaFactor);
         // Effect-Event-Start
         PlayerUsesEffectEvent e = new PlayerUsesEffectEvent(p, power, manaCost, cause, this.getClass());
-        KajetansMod.quest.getEvent(QuestsEvents.class).useEffectEvent(e);
+        KajetansMod.scripts.getEvent(ScriptEvents.class).useEffectEvent(e);
         if(e.isCanceled())
         {
             return false;

+ 10 - 14
src/main/java/me/km/effects/CommandWand.java

@@ -3,17 +3,19 @@ package me.km.effects;
 import me.km.api.GlobalText;
 import me.km.api.Module;
 import me.km.api.ModuleCommand;
+import me.km.items.ItemWand;
 import me.km.permissions.Permissions;
 import net.minecraft.command.ICommandSender;
 import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
 
 public class CommandWand extends ModuleCommand
 {   
     public CommandWand(Module m) 
     {
         super("wand", m);
-        super.setDescription("Erstellt einen Zauberstab");
-        super.setUsage("/wand <name> <effect>");
+        super.setDescription("Belegt deinen Zauberstab mit einem Effekt");
+        super.setUsage("/wand <effect>");
         super.setPermission(Permissions.WAND);
     }
 
@@ -26,27 +28,21 @@ public class CommandWand extends ModuleCommand
             return true;
         }
         EntityPlayer p = (EntityPlayer) cs;
-        if(arg.length >= 2)
+        if(arg.length >= 1)
         {     
-            // TODO
-            this.getModule().send(cs, GlobalText.notImplementedYet());
-            /*CustomMaterial cm;
-            try
+            ItemStack stack = p.getHeldItemMainhand();
+            if(stack.getItem() instanceof ItemWand)
             {
-                cm = CustomMaterial.valueOf(arg[0]);
-            }
-            catch(IllegalArgumentException ex)
-            {
-                this.getModule().send(cs, "Dieser Zauberstab existiert nicht.");
+                this.getModule().send(cs, "Du musst einen Zauberstab in der Hand halten.");
                 return true;
             }
-            Class<? extends ActiveEffectBase> c = EffectUtils.getEffectClass(arg[1]);
+            Class<? extends ActiveEffectBase> c = EffectUtils.getEffectClass(arg[0]);
             if(c == null)
             { 
                 this.getModule().send(cs, "Dieser aktive Effekt existiert nicht.");
                 return true;
             }
-            p.getWorld().dropItem(p.getLocation(), cm.getItemStack(1, "Effect: " + arg[1]));*/
+            stack.setStackDisplayName("§6" + arg[0]);
             return true;
         } 
         return false;

+ 16 - 1
src/main/java/me/km/effects/EffectUtils.java

@@ -6,6 +6,7 @@ import java.util.stream.Collectors;
 import me.km.KajetansMod;
 import me.km.api.Module;
 import me.km.api.Utils;
+import me.km.entities.EntityItemProjectile;
 import me.km.jobsystem.JobAPI;
 import me.km.plots.ProtectionBank;
 import net.minecraft.entity.Entity;
@@ -283,7 +284,21 @@ public class EffectUtils extends Module
         World w = p.world;
         Entity launch = null;
 
-        if(EntitySnowball.class == projectile) 
+        if(EntityItemProjectile.class == projectile) 
+        {
+            if(data == null)
+            {
+                throw new NullPointerException("Data musn't be null for EntityItemProjectile");
+            }
+            ItemStack stack = (ItemStack) data;
+            if(stack.isEmpty())
+            {
+                throw new IllegalArgumentException("Empty ItemStack not allowed here");
+            }
+            launch = new EntityItemProjectile(p, stack.copy());
+            ((EntityItemProjectile) launch).setHeadingFromThrower(p, p.rotationPitch, p.rotationYaw, 0.0f, 1.5f, 1.0f);
+        } 
+        else if(EntitySnowball.class == projectile) 
         {
             launch = new EntitySnowball(w, p);
             ((EntitySnowball) launch).setHeadingFromThrower(p, p.rotationPitch, p.rotationYaw, 0.0f, 1.5f, 1.0f);

+ 1 - 2
src/main/java/me/km/effects/active/Doomed.java

@@ -3,7 +3,6 @@ package me.km.effects.active;
 import me.km.KajetansMod;
 import me.km.api.Utils;
 import me.km.effects.ActiveEffectBase;
-import net.minecraft.entity.player.EntityPlayer;
 import net.minecraft.entity.player.EntityPlayerMP;
 import net.minecraft.util.DamageSource;
 import net.minecraft.util.math.Vec3d;
@@ -13,7 +12,7 @@ public class Doomed extends ActiveEffectBase
     @Override
     protected boolean executeEffect(EntityPlayerMP p, int power) 
     {
-        EntityPlayer p2 = Utils.getTargetedEntity(p, 8, EntityPlayer.class);
+        EntityPlayerMP p2 = Utils.getTargetedEntity(p, 8, EntityPlayerMP.class);
         if(p2 == null)
         {
             return false;

+ 7 - 3
src/main/java/me/km/effects/active/Musket.java

@@ -2,8 +2,11 @@ package me.km.effects.active;
 
 import me.km.effects.ActiveEffectBase;
 import me.km.effects.EffectUtils;
+import me.km.entities.EntityItemProjectile;
 import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.init.Blocks;
 import net.minecraft.init.SoundEvents;
+import net.minecraft.item.ItemStack;
 
 public class Musket extends ActiveEffectBase
 {
@@ -11,13 +14,14 @@ public class Musket extends ActiveEffectBase
     protected boolean executeEffect(EntityPlayerMP p, int power) 
     {  
         EffectUtils.playSound(p, SoundEvents.ENTITY_FIREWORK_BLAST);
-        double spread = 0.2d - power * 0.01d;
+        float spread = 0.8f - power * 0.04f;
         if(spread < 0)
         {
             spread = 0;
         }
-        // TODO
-        //Utils.shootItem(p, new ItemStack(Material.STONE_BUTTON), 2.5d, power * 2, 0.5d, 0.5d, 0.5d, spread);
+        EntityItemProjectile launch = new EntityItemProjectile(p, new ItemStack(Blocks.STONE_BUTTON), power * 2);
+        launch.setHeadingFromThrower(p, p.rotationPitch, p.rotationYaw, 0, 2.5f, spread);
+        p.world.spawnEntity(launch);
         return true;
     }
     

+ 1 - 2
src/main/java/me/km/effects/active/Silence.java

@@ -3,7 +3,6 @@ package me.km.effects.active;
 import me.km.KajetansMod;
 import me.km.api.Utils;
 import me.km.effects.ActiveEffectBase;
-import net.minecraft.entity.player.EntityPlayer;
 import net.minecraft.entity.player.EntityPlayerMP;
 
 public class Silence extends ActiveEffectBase
@@ -11,7 +10,7 @@ public class Silence extends ActiveEffectBase
     @Override
     protected boolean executeEffect(EntityPlayerMP p, int power) 
     {
-        EntityPlayer affectedPlayer = Utils.getTargetedEntity(p, 4, EntityPlayer.class);
+        EntityPlayerMP affectedPlayer = Utils.getTargetedEntity(p, 4, EntityPlayerMP.class);
         if(affectedPlayer == null)
         {
             return false;

+ 9 - 5
src/main/java/me/km/effects/active/Stone.java

@@ -2,22 +2,26 @@ package me.km.effects.active;
 
 import me.km.effects.ActiveEffectBase;
 import me.km.effects.EffectUtils;
+import me.km.entities.EntityItemProjectile;
 import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.init.Blocks;
 import net.minecraft.init.SoundEvents;
+import net.minecraft.item.ItemStack;
 
 public class Stone extends ActiveEffectBase
 {
     @Override
     protected boolean executeEffect(EntityPlayerMP p, int power) 
     {
-        EffectUtils.playSound(p, SoundEvents.ENTITY_ARROW_SHOOT, null);
-        double spread = 0.3d - power * 0.015d;
+        EffectUtils.playSound(p, SoundEvents.ENTITY_ARROW_SHOOT);
+        float spread = 1.2f - power * 0.06f;
         if(spread < 0)
         {
             spread = 0;
-        }
-        // TODO
-        //Utils.shootItem(p, new ItemStack(Material.COBBLESTONE), 0.9d, power * 2, 0.2d, 0.5d, 0.2d, spread);
+        }      
+        EntityItemProjectile launch = new EntityItemProjectile(p, new ItemStack(Blocks.STONE), power * 2);
+        launch.setHeadingFromThrower(p, p.rotationPitch, p.rotationYaw, 0, 0.9f, spread);
+        p.world.spawnEntity(launch);
         return true;
     }
     

+ 6 - 5
src/main/java/me/km/effects/passive/EntityDamageEffects.java

@@ -10,6 +10,7 @@ import me.km.events.PlayerHurtEvent;
 import me.km.playerbank.PlayerData;
 import net.minecraft.entity.Entity;
 import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.EntityPlayerMP;
 import net.minecraft.init.MobEffects;
 import net.minecraft.util.DamageSource;
 import net.minecraftforge.event.entity.living.LivingHurtEvent;
@@ -25,7 +26,7 @@ public class EntityDamageEffects extends ModuleListener
     @SubscribeEvent(receiveCanceled = false)
     public void damageHandler(PlayerHurtEvent e)
     {          
-        EntityPlayer p = e.getEntityPlayer();
+        EntityPlayerMP p = e.getEntityPlayer();
         if(!KajetansMod.worldManager.getWorldPreferences(p.world).skills)
         {
             return;
@@ -73,11 +74,11 @@ public class EntityDamageEffects extends ModuleListener
             return;
         }  
         Entity ent = e.getSource().getEntity();
-        if(ent == null || !(ent instanceof EntityPlayer))
+        if(ent == null || !(ent instanceof EntityPlayerMP))
         {
             return;
         } 
-        EntityPlayer p = (EntityPlayer) ent;
+        EntityPlayerMP p = (EntityPlayerMP) ent;
         Utils.ToolTypes tt = Utils.getToolType(p.getHeldItemMainhand());
         float damageBonus = 1;
         if(tt != null)
@@ -119,9 +120,9 @@ public class EntityDamageEffects extends ModuleListener
             EffectUtils.addPotionTo(p, MobEffects.INVISIBILITY, 40, 0);
         }
         
-        if(e.getEntity() instanceof EntityPlayer)
+        if(e.getEntity() instanceof EntityPlayerMP)
         {
-            EntityPlayer victim = (EntityPlayer) e.getEntity();
+            EntityPlayerMP victim = (EntityPlayerMP) e.getEntity();
             EntityPlayer damager = KajetansMod.playerbank.getData(victim).getData("doomed", EntityPlayer.class);
             if(damager != null && damager.equals(p))
             {

+ 32 - 18
src/main/java/me/km/effects/passive/Mugging.java

@@ -1,7 +1,20 @@
 package me.km.effects.passive;
 
+import me.km.KajetansMod;
 import me.km.api.Module;
 import me.km.api.ModuleListener;
+import me.km.api.Utils;
+import me.km.effects.Effect;
+import me.km.effects.EffectUtils;
+import me.km.inventory.InventoryUtils;
+import me.km.items.ItemDagger;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.monster.EntityMob;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.init.MobEffects;
+import net.minecraft.util.EnumHand;
+import net.minecraftforge.event.entity.player.PlayerInteractEvent;
+import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
 
 public class Mugging extends ModuleListener
 {
@@ -9,15 +22,16 @@ public class Mugging extends ModuleListener
     {
         super(m);
     }
-    // TODO
-    /*
-    @EventHandler(ignoreCancelled = true)
-    public void mugging(PlayerInteractEntityEvent e)
+
+    @SubscribeEvent(receiveCanceled = false)
+    public void mugging(PlayerInteractEvent.EntityInteract e)
     {
-        Player p = e.getPlayer();
-        if(e.getHand() == EquipmentSlot.OFF_HAND || 
-            !KajetansTools.worldManager.getWorldPreferences(p.getWorld()).skills ||
-            !checkForDagger(p))
+        /*if(e.getHand() == EnumHand.OFF_HAND || !KajetansMod.worldManager.getWorldPreferences(e.getWorld()).skills)
+        {
+            return;
+        }
+        EntityPlayer p = e.getEntityPlayer();
+        if(!(p.getHeldItemMainhand().getItem() instanceof ItemDagger))
         {
             return;
         }
@@ -26,24 +40,24 @@ public class Mugging extends ModuleListener
         {
             return;
         }
-        e.setCancelled(true);
-        Entity ent = e.getRightClicked();          
-        if(ent instanceof Monster)
+        e.setCanceled(true);
+        Entity ent = e.getTarget();          
+        if(ent instanceof EntityMob)
         {
-            if(p.getInventory().firstEmpty() == -1)
+            if(InventoryUtils.getFirstEmptySlot(p.inventory) == -1)
             {
                 this.getModule().send(p, "Dein Inventar ist zu voll für einen Diebstahl.");
                 return;
             }
-            Monster m = (Monster) ent;
+            EntityMob m = (EntityMob) ent;
             if(mugging < Utils.randomInt(1, 5))
             {
                 this.getModule().send(p, "Der Diebstahl hat fehlgeschlagen.");
-                if(!p.hasPotionEffect(PotionEffectType.INVISIBILITY))
+                if(!p.isPotionActive(MobEffects.INVISIBILITY))
                 {
-                    m.setTarget(p);
+                    m.setAttackTarget(p);
                 }
-                CustomItemUtils.lowerDurability(p, 15);
+                //CustomItemUtils.lowerDurability(p, 15);
                 return;
             }
             ArrayList<Integer> loot = new ArrayList<>();
@@ -133,6 +147,6 @@ public class Mugging extends ModuleListener
             loot.add(new ItemStack(Material.BREAD));
             p.getInventory().addItem(loot.get(Utils.randomInt(0, loot.size() - 1)));
             this.getModule().send(p, "Der Diebstahl war erfolgreich.");
-        } 
-    }*/
+        } */
+    }
 }

+ 5 - 5
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.QuestUtils;
+import me.km.snuviscript.ScriptUtils;
 import net.minecraft.entity.player.EntityPlayer;
 import net.minecraft.init.Blocks;
 import net.minecraft.init.MobEffects;
@@ -33,7 +33,7 @@ public class TrapEffects extends ModuleListener
     
     public void addNailTraps(Location l, int id)
     {
-        l = QuestUtils.roundLocation(l);
+        l = ScriptUtils.roundLocation(l);
         for(int x = -1; x <= 1; x++)
         {
             for(int y = -1; y <= 1; y++)
@@ -45,17 +45,17 @@ public class TrapEffects extends ModuleListener
     
     public void addNetTrap(Location l, int id)
     {
-        netTraps.put(QuestUtils.roundLocation(l), id);
+        netTraps.put(ScriptUtils.roundLocation(l), id);
     }
     
     public void addVineTrap(Location l, int id)
     {
-        vineTraps.put(QuestUtils.roundLocation(l), id);
+        vineTraps.put(ScriptUtils.roundLocation(l), id);
     }
     
     public void removeVineTrap(Location l)
     {
-        vineTraps.remove(QuestUtils.roundLocation(l));
+        vineTraps.remove(ScriptUtils.roundLocation(l));
     }
     
     @SubscribeEvent

+ 174 - 0
src/main/java/me/km/entities/EntityItemProjectile.java

@@ -0,0 +1,174 @@
+package me.km.entities;
+
+import java.util.List;
+import me.km.KajetansMod;
+import me.km.snuviscript.ScriptEvents;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.IProjectile;
+import net.minecraft.entity.item.EntityItem;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.DamageSource;
+import net.minecraft.util.math.AxisAlignedBB;
+import net.minecraft.util.math.MathHelper;
+import net.minecraft.util.math.Vec3d;
+
+public class EntityItemProjectile extends EntityItem implements IProjectile
+{
+    private final EntityLivingBase thrower;
+    private boolean noHit;
+    private final float damage;
+
+    public EntityItemProjectile(EntityLivingBase thrower, ItemStack stack, float damage) 
+    {
+        super(thrower.world, thrower.posX, thrower.posY + thrower.getEyeHeight() - 0.1d, thrower.posZ, stack);
+        this.thrower = thrower;
+        this.noHit = true;
+        super.setInfinitePickupDelay();
+        this.damage = damage;
+    }
+    
+    public EntityItemProjectile(EntityLivingBase thrower, ItemStack stack) 
+    {
+        this(thrower, stack, -1);
+    }
+
+    public EntityLivingBase getItemThrower() 
+    {
+        return thrower;
+    }
+
+    public void setHeadingFromThrower(Entity entityThrower, float rotationPitchIn, float rotationYawIn, float pitchOffset, float velocity, float inaccuracy)
+    {
+        float f = -MathHelper.sin(rotationYawIn * 0.017453292F) * MathHelper.cos(rotationPitchIn * 0.017453292F);
+        float f1 = -MathHelper.sin((rotationPitchIn + pitchOffset) * 0.017453292F);
+        float f2 = MathHelper.cos(rotationYawIn * 0.017453292F) * MathHelper.cos(rotationPitchIn * 0.017453292F);
+        this.setThrowableHeading(f, f1, f2, velocity, inaccuracy);
+        this.motionX += entityThrower.motionX;
+        this.motionZ += entityThrower.motionZ;
+
+        if (!entityThrower.onGround)
+        {
+            this.motionY += entityThrower.motionY;
+        }
+    }
+    
+    @Override
+    public void setThrowableHeading(double x, double y, double z, float velocity, float inaccuracy)
+    {
+        float f = MathHelper.sqrt(x * x + y * y + z * z);
+        x = x / (double)f;
+        y = y / (double)f;
+        z = z / (double)f;
+        x = x + this.rand.nextGaussian() * 0.0075d * (double)inaccuracy;
+        y = y + this.rand.nextGaussian() * 0.0075d * (double)inaccuracy;
+        z = z + this.rand.nextGaussian() * 0.0075d * (double)inaccuracy;
+        x = x * (double)velocity;
+        y = y * (double)velocity;
+        z = z * (double)velocity;
+        this.motionX = x;
+        this.motionY = y;
+        this.motionZ = z;
+        float f1 = MathHelper.sqrt(x * x + z * z);
+        this.rotationYaw = (float)(MathHelper.atan2(x, z) * (180D / Math.PI));
+        this.rotationPitch = (float)(MathHelper.atan2(y, (double)f1) * (180D / Math.PI));
+        this.prevRotationYaw = this.rotationYaw;
+        this.prevRotationPitch = this.rotationPitch;
+    }
+
+    @Override
+    public void onUpdate() 
+    {
+        super.onUpdate();
+        if(noHit)
+        {
+            if(this.onGround)
+            {
+                noHit = false;
+                this.setDefaultPickupDelay();
+                return;
+            }
+            
+            float fw = this.width / 2;
+            float fh = this.height / 2;
+            List<Entity> list = this.world.getEntitiesWithinAABBExcludingEntity(this, new AxisAlignedBB(prevPosX, prevPosY, prevPosZ, posX, posY, posZ).expand(fw, fh, fw));
+            if(list.isEmpty())
+            {
+                return;
+            }
+            
+            double oldX = this.prevPosX;
+            double oldY = this.prevPosY;
+            double oldZ = this.prevPosZ;
+            double newX = this.posX;
+            double newY = this.posY;
+            double newZ = this.posZ;
+            
+            if(oldX < newX)
+            {
+                oldX -= fw;
+                newX += fw;
+            }
+            else
+            {
+                oldX += fw;
+                newX -= fw;
+            }
+            
+            if(oldY < newY)
+            {
+                oldY -= fh;
+                newY += fh;
+            }
+            else
+            {
+                oldY += fh;
+                newY -= fh;
+            }
+            
+            if(oldZ < newZ)
+            {
+                oldZ -= fw;
+                newZ += fw;
+            }
+            else
+            {
+                oldZ += fw;
+                newZ -= fw;
+            }
+            
+            Vec3d oldV = new Vec3d(oldX, oldY, oldZ);
+            Vec3d newV = new Vec3d(newX, newY, newZ);
+            list.removeIf(ent -> 
+            {
+                if(ent == thrower && this.getAge() < 5)
+                {
+                    return true;
+                }
+                return ent.getEntityBoundingBox().calculateIntercept(oldV, newV) == null;
+            });
+            if(!list.isEmpty())
+            {
+                noHit = false;
+                this.setDefaultPickupDelay();
+                onImpact(list);
+            }
+        }
+    }
+
+    protected void onImpact(List<Entity> list)
+    {
+        if(damage == -1)
+        {
+            if(thrower instanceof EntityPlayer)
+            {
+                KajetansMod.scripts.getEvent(ScriptEvents.class).onEntityItemProjectileHit((EntityPlayer) thrower, this.getEntityItem(), list);
+            }
+        }
+        else
+        {
+            list.forEach(ent -> ent.attackEntityFrom(DamageSource.causeThrownDamage(this, thrower), damage));
+        }
+    }
+}

+ 3 - 2
src/main/java/me/km/events/CustomEventCaller.java

@@ -4,6 +4,7 @@ import java.util.ArrayList;
 import me.km.utils.ReflectionUtils;
 import net.minecraft.entity.Entity;
 import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.EntityPlayerMP;
 import net.minecraft.entity.projectile.EntityArrow;
 import net.minecraft.entity.projectile.EntityThrowable;
 import net.minecraftforge.common.MinecraftForge;
@@ -71,9 +72,9 @@ public class CustomEventCaller
     @SubscribeEvent
     public void onPlayerHurt(LivingHurtEvent e)
     {      
-        if(e.getEntityLiving() instanceof EntityPlayer)
+        if(e.getEntityLiving() instanceof EntityPlayerMP)
         {
-            PlayerHurtEvent hurt = new PlayerHurtEvent((EntityPlayer) e.getEntityLiving(), e.getSource(), e.getAmount());
+            PlayerHurtEvent hurt = new PlayerHurtEvent((EntityPlayerMP) e.getEntityLiving(), e.getSource(), e.getAmount());
             MinecraftForge.EVENT_BUS.post(hurt);
             e.setAmount(hurt.getAmount());
             e.setCanceled(hurt.isCanceled());

+ 4 - 4
src/main/java/me/km/events/PlayerHurtEvent.java

@@ -1,20 +1,20 @@
 package me.km.events;
 
-import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.EntityPlayerMP;
 import net.minecraft.util.DamageSource;
 import net.minecraftforge.event.entity.living.LivingHurtEvent;
 
 public class PlayerHurtEvent extends LivingHurtEvent
 {
-    private final EntityPlayer p;
+    private final EntityPlayerMP p;
     
-    public PlayerHurtEvent(EntityPlayer p, DamageSource source, float amount) 
+    public PlayerHurtEvent(EntityPlayerMP p, DamageSource source, float amount) 
     {
         super(p, source, amount);
         this.p = p;
     }
 
-    public EntityPlayer getEntityPlayer() 
+    public EntityPlayerMP getEntityPlayer() 
     {
         return p;
     }

+ 12 - 0
src/main/java/me/km/inventory/InventoryUtils.java

@@ -131,4 +131,16 @@ public class InventoryUtils
         }
         return amount;
     }
+    
+    public static int getFirstEmptySlot(IInventory inv)
+    {
+        for(int i = 0; i < inv.getSizeInventory(); i++)
+        {
+            if(inv.getStackInSlot(i).isEmpty())
+            {
+                return i;
+            }
+        }
+        return -1;
+    }
 }

+ 15 - 0
src/main/java/me/km/items/ItemDagger.java

@@ -0,0 +1,15 @@
+package me.km.items;
+
+public class ItemDagger extends ItemSword
+{
+    public ItemDagger(ToolMaterial m, String name, String local) 
+    {
+        super(m, name, local);
+    }
+
+    @Override
+    public float getDamageVsEntity() 
+    {
+        return -2 + super.getDamageVsEntity();
+    }
+}

+ 1 - 1
src/main/java/me/km/items/ItemWand.java

@@ -49,7 +49,7 @@ public class ItemWand extends ItemWeapon
         ItemStack stack = p.getHeldItem(hand);
         try
         {
-            Class<? extends ActiveEffectBase> c = EffectUtils.getEffectClass(stack.getDisplayName());
+            Class<? extends ActiveEffectBase> c = EffectUtils.getEffectClass(stack.getDisplayName().substring(2));
             if(c == null)
             { 
                 throw new Exception();

+ 16 - 12
src/main/java/me/km/nms/NmsUtilities.java

@@ -7,6 +7,7 @@ import net.minecraft.block.Block;
 import net.minecraft.block.state.IBlockState;
 import net.minecraft.entity.Entity;
 import net.minecraft.entity.EntityLiving;
+import net.minecraft.entity.player.EntityPlayer;
 import net.minecraft.entity.player.EntityPlayerMP;
 import net.minecraft.init.Blocks;
 import net.minecraft.inventory.IInventory;
@@ -17,7 +18,10 @@ import net.minecraft.network.play.server.SPacketChat;
 import net.minecraft.tileentity.TileEntity;
 import net.minecraft.util.math.BlockPos;
 import net.minecraft.util.math.Vec3d;
+import net.minecraft.util.text.Style;
 import net.minecraft.util.text.TextComponentString;
+import net.minecraft.util.text.TextFormatting;
+import net.minecraft.util.text.event.ClickEvent;
 import net.minecraft.world.World;
 import net.minecraft.world.chunk.storage.AnvilChunkLoader;
 
@@ -37,17 +41,15 @@ public class NmsUtilities
         return getCollidingEntities(e, 0, 0, 0);
     }   
 
-    /*public static void walkTo(org.bukkit.entity.Entity e, org.bukkit.Location l, double speed, double radius)
+    public static void walkTo(EntityLiving liv, Vec3d v, double speed)
     {
-        EntityCreature el = ((CraftCreature) e).getHandle();
-        el.goalSelector.a(1, new PathfinderGoalWalkToLocation(el, l, speed, radius));
+        liv.getMoveHelper().setMoveTo(v.xCoord, v.yCoord, v.zCoord, speed);
     }
     
-    public static void canDestroyBlocks(org.bukkit.entity.LivingEntity e)
+    public static void canDestroyBlocks(EntityLiving liv)
     {
-        EntityCreature el = ((CraftCreature) e).getHandle();
-        el.goalSelector.a(1, new PathfinderGoalDestroyBlock(el));
-    }*/
+        liv.tasks.addTask(1, new PathfinderGoalDestroyBlock(liv));
+    }
     
     public static String getNbtString(Entity ent)
     {
@@ -225,16 +227,18 @@ public class NmsUtilities
     // Copy Tools
     // -------------------------------------------------------------------------
     
-    public static void sendCopyableText(EntityPlayerMP p, String s)
+    public static void sendCopyableText(EntityPlayer p, String s)
     {
         s = s.replaceAll("\\{", "(");
         s = s.replaceAll("\\}", ")");
         s = s.replaceAll(" ", "%20");
         s = s.replaceAll("\"", "'");
-        SPacketChat packet = new SPacketChat(new TextComponentString(
-                "[{\"text\":\"Hier drücken zum Kopieren.\",\"color\":\"red\",\"bold\":\"true\",\"clickEvent\":" +
-                "{\"action\":\"open_url\",\"value\":\"http://ts.hammerle.me/showtext.php/?text=" + s + "\"}}]"), (byte) 0);
-        p.connection.sendPacket(packet);
+        TextComponentString text = new TextComponentString("Hier drücken zum Kopieren.");
+        Style style = text.getStyle();
+        style.setColor(TextFormatting.RED);
+        style.setBold(true);
+        style.setClickEvent(new ClickEvent(ClickEvent.Action.OPEN_URL, "http://minecraft.hammerle.me/showtext.php/?text=" + s));
+        p.sendMessage(text);
     } 
     
     // -------------------------------------------------------------------------

+ 48 - 0
src/main/java/me/km/nms/PathfinderGoalDestroyBlock.java

@@ -0,0 +1,48 @@
+package me.km.nms;
+
+import java.util.Random;
+import net.minecraft.entity.EntityLiving;
+import net.minecraft.entity.ai.EntityAIBase;
+import net.minecraft.util.math.MathHelper;
+import net.minecraft.world.World;
+import net.minecraft.util.math.BlockPos;
+import net.minecraft.util.math.RayTraceResult;
+import net.minecraft.util.math.Vec3d;
+
+public class PathfinderGoalDestroyBlock extends EntityAIBase
+{
+    private final EntityLiving entity;
+
+    public PathfinderGoalDestroyBlock(EntityLiving liv)
+    {
+        this.entity = liv;
+    }
+
+    @Override
+    public boolean shouldExecute() 
+    {
+        if(!entity.world.getGameRules().getBoolean("mobGriefing"))
+        {
+            return false;
+        }
+        return entity.getRNG().nextInt(5) == 0;
+    }
+
+    @Override
+    public void updateTask()
+    {
+        Random random = entity.getRNG();
+        World world = entity.world;
+        int x = MathHelper.floor(entity.posX - 2.0D + random.nextDouble() * 4.0D);
+        int y = MathHelper.floor(entity.posY + random.nextDouble() * 3.0D);
+        int z = MathHelper.floor(entity.posZ - 2.0D + random.nextDouble() * 4.0D);
+        BlockPos blockpos = new BlockPos(x, y, z);
+        RayTraceResult ray = world.rayTraceBlocks(
+                new Vec3d(MathHelper.floor(entity.posX) + 0.5f, y + 0.5f, MathHelper.floor(entity.posZ) + 0.5F), 
+                new Vec3d(x + 0.5f, y + 0.5F, z + 0.5F), false, true, false);
+        if(ray != null && ray.getBlockPos().equals(blockpos))
+        {
+            world.setBlockToAir(blockpos);
+        }
+    }
+}

+ 27 - 0
src/main/java/me/km/permissions/PermissionListener.java

@@ -0,0 +1,27 @@
+package me.km.permissions;
+
+import me.km.KajetansMod;
+import me.km.api.Module;
+import me.km.api.ModuleCommand;
+import me.km.api.ModuleListener;
+import net.minecraft.command.ICommand;
+import net.minecraftforge.event.CommandEvent;
+import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
+
+public class PermissionListener extends ModuleListener
+{
+    public PermissionListener(Module m) 
+    {
+        super(m);
+    }
+    
+    @SubscribeEvent
+    public void onCommandUse(CommandEvent e)
+    {       
+        ICommand command = e.getCommand();
+        if(!(command instanceof ModuleCommand) && !KajetansMod.perms.has(e.getSender(), command.getName()))
+        {
+            e.setCanceled(true);
+        }
+    }
+}

+ 9 - 0
src/main/java/me/km/permissions/PermissionManager.java

@@ -5,6 +5,7 @@ import java.util.EnumSet;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.UUID;
+import me.km.KajetansMod;
 import me.km.api.Module;
 import net.minecraft.command.ICommandSender;
 import net.minecraft.entity.player.EntityPlayer;
@@ -38,6 +39,10 @@ public class PermissionManager extends Module
     
     public boolean has(ICommandSender cs, Permissions perm)
     {
+        if(KajetansMod.debugMode)
+        {
+            return true;
+        }
         if(cs instanceof EntityPlayer)
         {
             ArrayList<Integer> groups = playerGroups.get(((EntityPlayer) cs).getUniqueID());
@@ -61,6 +66,10 @@ public class PermissionManager extends Module
     
     public boolean has(ICommandSender cs, String perm)
     {
+        if(KajetansMod.debugMode)
+        {
+            return true;
+        }
         if(cs instanceof EntityPlayer)
         {
             ArrayList<Integer> groups = playerGroups.get(((EntityPlayer) cs).getUniqueID());

+ 4 - 4
src/main/java/me/km/playerbank/PlayerData.java

@@ -2,8 +2,8 @@ package me.km.playerbank;
 
 import java.util.HashMap;
 import me.km.KajetansMod;
-import me.km.scoreboard.ScoreboardData;
-import net.minecraft.entity.player.EntityPlayer;
+import me.km.scoreboard.PlayerScoreboard;
+import net.minecraft.entity.player.EntityPlayerMP;
 
 public class PlayerData
 {
@@ -22,9 +22,9 @@ public class PlayerData
     }
     
     private final HashMap<String, DataContainer> data;
-    private final ScoreboardData sb;
+    private final PlayerScoreboard sb;
     
-    public PlayerData(EntityPlayer p)
+    public PlayerData(EntityPlayerMP p)
     {
         data = new HashMap<>();
         sb = KajetansMod.scoreboard.getScoreboard(p);

+ 2 - 1
src/main/java/me/km/playerbank/PlayerManager.java

@@ -5,6 +5,7 @@ import java.util.UUID;
 import me.km.api.Location;
 import me.km.api.Module;
 import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.EntityPlayerMP;
 import net.minecraft.util.text.TextFormatting;
 
 public class PlayerManager extends Module
@@ -34,7 +35,7 @@ public class PlayerManager extends Module
         return back.get(p.getUniqueID());
     }
     
-    public PlayerData getData(EntityPlayer p)
+    public PlayerData getData(EntityPlayerMP p)
     {
         PlayerData pd = data.get(p.getUniqueID());
         if(pd == null)

+ 100 - 0
src/main/java/me/km/scoreboard/PlayerScoreboard.java

@@ -0,0 +1,100 @@
+package me.km.scoreboard;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.network.play.server.SPacketDisplayObjective;
+import net.minecraft.network.play.server.SPacketScoreboardObjective;
+import net.minecraft.network.play.server.SPacketUpdateScore;
+import net.minecraft.scoreboard.IScoreCriteria;
+import net.minecraft.scoreboard.Score;
+import net.minecraft.scoreboard.ScoreObjective;
+import net.minecraft.scoreboard.Scoreboard;
+
+public class PlayerScoreboard 
+{
+    private final HashMap<Integer, String> elements;
+    private final HashSet<Integer> toRemove;
+    private final HashMap<Integer, String> toAdd;
+    
+    private final Scoreboard board;
+    private final ScoreObjective o;
+    private boolean changeNeeded;
+    
+    private final EntityPlayerMP p;
+
+    public PlayerScoreboard(EntityPlayerMP p)
+    {
+        toRemove = new HashSet<>();
+        toAdd = new HashMap<>();
+        elements = new HashMap<>();
+        changeNeeded = true;
+        board = new Scoreboard();
+        o = new ScoreObjective(board, "ScoreBoardAPI", IScoreCriteria.DUMMY);
+        o.setDisplayName("§6---------------");
+        this.p = p;
+        p.connection.sendPacket(new SPacketScoreboardObjective(o, 0));
+    }
+    
+    public void addText(int id, String text)
+    { 
+        String s = elements.get(id);
+        if(s != null && !s.equals(text))
+        {
+            toRemove.add(id);
+            toAdd.put(id, text);
+            changeNeeded = true;
+        }
+        else if(s == null)
+        {
+            toAdd.put(id, text);
+            changeNeeded = true;
+        }
+    }
+    
+    public void removeText(int id)
+    { 
+        if(elements.containsKey(id))
+        {
+            toRemove.add(id);
+            changeNeeded = true;
+        }
+    }
+
+    public void update()
+    {         
+        if(!changeNeeded)
+        {
+            return;
+        }
+        
+        if(!toRemove.isEmpty())
+        {
+            toRemove.forEach(i -> 
+            {
+                String s = elements.remove(i);
+                if(s != null)
+                {
+                    p.connection.sendPacket(new SPacketUpdateScore(s, o));
+                }
+            });
+            toRemove.clear();
+        }
+        
+        if(!toAdd.isEmpty())
+        {
+            toAdd.entrySet().stream().forEach((e) -> 
+            {
+                elements.put(e.getKey(), e.getValue());
+                Score score = new Score(board, o, e.getValue());
+                score.setScorePoints(e.getKey());
+                p.connection.sendPacket(new SPacketUpdateScore(score));
+            });      
+            toAdd.clear();
+        }
+        
+        changeNeeded = false;
+        // displaying objective in sidebar
+        p.connection.sendPacket(new SPacketDisplayObjective(1, o));
+    }
+}

+ 5 - 1
src/main/java/me/km/scoreboard/ScoreBoardLeave.java

@@ -3,6 +3,7 @@ package me.km.scoreboard;
 import me.km.KajetansMod;
 import me.km.api.Module;
 import me.km.api.ModuleListener;
+import net.minecraft.entity.player.EntityPlayerMP;
 import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
 import net.minecraftforge.fml.common.gameevent.PlayerEvent;
 
@@ -16,6 +17,9 @@ public class ScoreBoardLeave extends ModuleListener
     @SubscribeEvent
     public void onPlayerLeaveCleanup(PlayerEvent.PlayerLoggedOutEvent e)
     {      
-        KajetansMod.scoreboard.removeScoreboard(e.player);
+        if(e.player instanceof EntityPlayerMP)
+        {
+            KajetansMod.scoreboard.removeScoreboard((EntityPlayerMP) e.player);
+        }
     }
 }

+ 11 - 11
src/main/java/me/km/scoreboard/ScoreboardAPI.java

@@ -4,12 +4,12 @@ import java.util.HashMap;
 import java.util.UUID;
 import me.km.KajetansMod;
 import me.km.api.Module;
-import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.EntityPlayerMP;
 import net.minecraft.util.text.TextFormatting;
 
 public class ScoreboardAPI extends Module
 {
-    private HashMap<UUID, ScoreboardData> boards;
+    private HashMap<UUID, PlayerScoreboard> boards;
     
     public ScoreboardAPI(String mname, String prefix, TextFormatting color) 
     {
@@ -23,30 +23,30 @@ public class ScoreboardAPI extends Module
         boards = new HashMap<>();
     }
     
-    public void addScoreboard(EntityPlayer p)
+    public void addScoreboard(EntityPlayerMP p)
     {
-        boards.put(p.getUniqueID(), new ScoreboardData());
+        boards.put(p.getUniqueID(), new PlayerScoreboard(p));
     }
     
-    public void removeScoreboard(EntityPlayer p)
+    public void removeScoreboard(EntityPlayerMP p)
     {
-        boards.remove(p.getUniqueID(), new ScoreboardData());
+        boards.remove(p.getUniqueID(), new PlayerScoreboard(p));
     }
     
-    public ScoreboardData getScoreboard(EntityPlayer p)
+    public PlayerScoreboard getScoreboard(EntityPlayerMP p)
     {
-        ScoreboardData data = boards.get(p.getUniqueID());
+        PlayerScoreboard data = boards.get(p.getUniqueID());
         if(data == null)
         {
-            data = new ScoreboardData();
+            data = new PlayerScoreboard(p);
             boards.put(p.getUniqueID(), data);
             return data;
         }
         return boards.get(p.getUniqueID());
     }
     
-    public void resetScoreboard(EntityPlayer p)
+    public void resetScoreboard(EntityPlayerMP p)
     {
-        boards.put(p.getUniqueID(), new ScoreboardData());
+        boards.put(p.getUniqueID(), new PlayerScoreboard(p));
     }
 }

+ 0 - 100
src/main/java/me/km/scoreboard/ScoreboardData.java

@@ -1,100 +0,0 @@
-package me.km.scoreboard;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import net.minecraft.entity.player.EntityPlayer;
-import net.minecraft.scoreboard.IScoreCriteria;
-import net.minecraft.scoreboard.Score;
-import net.minecraft.scoreboard.ScoreObjective;
-import net.minecraft.scoreboard.Scoreboard;
-
-public class ScoreboardData 
-{
-    private final HashMap<Integer, String> elements;
-    private final Scoreboard board;
-    private final ScoreObjective o;
-    private final HashSet<Integer> toRemove;
-    private boolean changeNeeded;
-    
-    public ScoreboardData()
-    {
-        toRemove = new HashSet<>();
-        elements = new HashMap<>();
-        changeNeeded = true;
-        board = new Scoreboard();
-        o = board.addScoreObjective("ScoreBoardAPI", IScoreCriteria.DUMMY);
-        o.setDisplayName("§6---------------");
-        board.setObjectiveInDisplaySlot(1, o);
-    }
-    
-    private void add(String s, int id)
-    {
-        board.getOrCreateScore(s, o).setScorePoints(id);
-    }
-      
-    private void resetScores(String entry)
-    {
-        this.board.getScoreObjectives().stream().forEach((ob) -> 
-        {
-            board.removeObjectiveFromEntity(entry, ob);
-        });
-    }
-    
-    public void update(EntityPlayer p)
-    {         
-        if(!changeNeeded)
-        {
-            return;
-        }
-        
-        if(!toRemove.isEmpty())
-        {
-            ArrayList<String> remove = new ArrayList<>();
-            board.getObjectiveNames().stream().forEach((s) -> 
-            {
-                Score score = board.getOrCreateScore(s, o);
-                if(score != null && toRemove.contains(score.getScorePoints())) 
-                {
-                    remove.add(s);
-                }
-            });
-            remove.forEach(s -> resetScores(s));
-        }
-
-        toRemove.clear();
-        
-        elements.entrySet().stream().forEach((e) -> 
-        {
-            add(e.getValue(), e.getKey());
-        });      
-        
-        changeNeeded = false;
-        //TODO
-        //p.setScoreboard(board);
-    }
-
-    public void addText(int id, String text)
-    { 
-        String s = elements.put(id, text);
-        if(s != null && !s.equals(text))
-        {
-            toRemove.add(id);
-            changeNeeded = true;
-        }
-        else if(s == null)
-        {
-            changeNeeded = true;
-        }
-    }
-    
-    public void removeText(int id)
-    { 
-        if(elements.remove(id) != null)
-        {
-            toRemove.add(id);
-            changeNeeded = true;
-        }
-    }
-}

+ 6 - 4
src/main/java/me/km/scoreboard/ScoreboardRefresher.java

@@ -1,6 +1,8 @@
 package me.km.scoreboard;
 
 import me.km.KajetansMod;
+import me.km.dimensions.WorldPreferences;
+import me.km.environment.EnvironmentAPI;
 import net.minecraft.util.math.BlockPos;
 
 public class ScoreboardRefresher implements Runnable
@@ -17,11 +19,11 @@ public class ScoreboardRefresher implements Runnable
     {
         KajetansMod.server.getPlayerList().getPlayers().stream().forEach(p -> 
         {
-            ScoreboardData data = scoreboard.getScoreboard(p);
+            PlayerScoreboard data = scoreboard.getScoreboard(p);
             BlockPos l =  p.getPosition();
             data.addText(99, "§7LO §r" + l.getX() + "§7:§r" + l.getY() + "§7:§r" + l.getZ());
             data.addText(98, "§7HP §r" + (p.getHealth() * 100 / p.getMaxHealth()) + "§7%");
-            /*WorldPreferences pref = KajetansTools.worldManager.getWorldPreferences(p.getWorld());
+            WorldPreferences pref = KajetansMod.worldManager.getWorldPreferences(p.world);
             if(pref.statusEffects)
             {
                 data.addText(78, new StringBuilder("§7EN §6||||||||||||||||||||").insert(EnvironmentAPI.getEnergy(p) / 500 + 7, "§c").toString());
@@ -41,8 +43,8 @@ public class ScoreboardRefresher implements Runnable
             else
             {              
                 data.removeText(75);
-            }*/
-            data.update(p);
+            }
+            data.update();
         });
     }
 }

+ 0 - 1
src/main/java/me/km/skills/Skill.java

@@ -15,7 +15,6 @@ public class Skill
     public Skill(ItemStack stack, Effect eff, String name, String explanation)
     {
         ItemStackUtils.addItemFlag(stack, ItemFlag.HIDE_ATTRIBUTES, ItemFlag.HIDE_ENCHANTS, ItemFlag.HIDE_POTION_EFFECTS, ItemFlag.HIDE_UNBREAKABLE);
-        ItemStackUtils.setUnbreakable(stack);
         stack.setStackDisplayName("§6" + name);
         ItemStackUtils.setLore(stack, ItemStackBuilder.buildLimitedLore(explanation, 25, "§7"));
         this.stack = stack;

+ 4 - 4
src/main/java/me/km/snuviscript/CodeFunction.java

@@ -23,7 +23,7 @@ public class CodeFunction
         //System.out.println(c);
         if(c.equals("")) // Springt in { } ohne Kopf
         {
-            function = KajetansMod.quest.getQuestParser().translateMethod("godeeper");
+            function = KajetansMod.scripts.getQuestParser().translateMethod("godeeper");
             pars = new Object[0];
             return;
         }
@@ -34,7 +34,7 @@ public class CodeFunction
         }
         try
         {
-            function = KajetansMod.quest.getQuestParser().translateMethod(c.substring(0, pos).trim().toLowerCase());
+            function = KajetansMod.scripts.getQuestParser().translateMethod(c.substring(0, pos).trim().toLowerCase());
         }
         catch(NullPointerException ex)
         {
@@ -65,7 +65,7 @@ public class CodeFunction
                 case ',':
                     if(last != pos)
                     {
-                        pars.add(QuestUtils.convertInput(c.substring(last, pos).trim()));
+                        pars.add(ScriptUtils.convertInput(c.substring(last, pos).trim()));
                     }
                     last = pos + 1;
                     break;
@@ -76,7 +76,7 @@ public class CodeFunction
                     }
                     if(last != pos)
                     {
-                        pars.add(QuestUtils.convertInput(c.substring(last, pos).trim()));
+                        pars.add(ScriptUtils.convertInput(c.substring(last, pos).trim()));
                     }
                     break;
                 case '(':

+ 3 - 3
src/main/java/me/km/snuviscript/CommandGiveUp.java

@@ -33,7 +33,7 @@ public class CommandGiveUp extends ModuleCommand
             return true;
         }
         EntityPlayer p = (EntityPlayer) cs;
-        QuestData qd = KajetansMod.quest.getQuestData(p);
+        Script qd = KajetansMod.scripts.getQuestData(p);
         if(qd == null)
         {
             this.getModule().send(cs, "Du hast gerade keine Quest.");
@@ -43,14 +43,14 @@ public class CommandGiveUp extends ModuleCommand
         {
             qd.gotoLabel("giveup");
             qd.setVar("event", "player-leave");
-            QuestVars.setPlayerVars(qd, p); 
+            ScriptVars.setPlayerVars(qd, p); 
             qd.runCode();
             this.getModule().send(cs, "Du hast deine Quest aufgegeben.");
             return true;
         }
         catch(GotoLabelNotFoundException | NoChildTreeException ex)
         {
-            KajetansMod.quest.removePlayerFromQuest(p, qd);
+            KajetansMod.scripts.removePlayerFromQuest(p, qd);
             this.getModule().send(cs, "Du hast deine Quest aufgegeben.");
             return true;
         }

+ 12 - 12
src/main/java/me/km/snuviscript/CommandQuest.java

@@ -61,7 +61,7 @@ public class CommandQuest extends ModuleCommand
                             m.send(cs, GlobalText.cantFindPlayer(arg[1]));
                             return true;
                         }                           
-                        KajetansMod.quest.startQuest(cs, arg[Utils.randomInt(2, arg.length-1)], affectedPlayer, null, null);
+                        KajetansMod.scripts.startQuest(cs, arg[Utils.randomInt(2, arg.length-1)], affectedPlayer, null, null);
                         return true;
                     }
                     break;
@@ -71,7 +71,7 @@ public class CommandQuest extends ModuleCommand
                 {
                     if(arg.length >= 2 && p != null)
                     {
-                        QuestData qd = KajetansMod.quest.getQuestData(p);
+                        Script qd = KajetansMod.scripts.getQuestData(p);
                         if(qd == null)
                         {
                             m.send(cs, "Du hast gerade keine Quest.");
@@ -87,7 +87,7 @@ public class CommandQuest extends ModuleCommand
                 {
                     if(p != null)
                     {
-                        QuestData qd = KajetansMod.quest.getQuestData(p);
+                        Script qd = KajetansMod.scripts.getQuestData(p);
                         if(qd == null)
                         {
                             m.send(cs, "Du hast gerade keine Quest.");
@@ -104,7 +104,7 @@ public class CommandQuest extends ModuleCommand
                 {
                     if(arg.length >= 2 && p != null)
                     {
-                        QuestData qd = KajetansMod.quest.getQuestData(p);
+                        Script qd = KajetansMod.scripts.getQuestData(p);
                         if(qd == null)
                         {
                             m.send(cs, "Du hast gerade keine Quest.");
@@ -120,7 +120,7 @@ public class CommandQuest extends ModuleCommand
                 {
                     if(p != null)
                     {
-                        QuestData qd = KajetansMod.quest.getQuestData(p);
+                        Script qd = KajetansMod.scripts.getQuestData(p);
                         if(qd == null)
                         {
                             m.send(cs, "Du hast gerade keine Quest.");
@@ -141,7 +141,7 @@ public class CommandQuest extends ModuleCommand
                 {
                     if(p != null)
                     {
-                        QuestData qd = KajetansMod.quest.getQuestData(p);
+                        Script qd = KajetansMod.scripts.getQuestData(p);
                         if(qd == null)
                         {
                             m.send(cs, "Du hast gerade keine Quest.");
@@ -165,7 +165,7 @@ public class CommandQuest extends ModuleCommand
                 {
                     if(p != null)
                     {
-                        QuestData qd = KajetansMod.quest.getQuestData(p);
+                        Script qd = KajetansMod.scripts.getQuestData(p);
                         if(qd == null)
                         {
                             m.send(cs, "Du hast gerade keine Quest.");
@@ -185,7 +185,7 @@ public class CommandQuest extends ModuleCommand
                 }
                 case "see":
                 {
-                    Collection<QuestData> quests = KajetansMod.quest.getQuests();
+                    Collection<Script> quests = KajetansMod.scripts.getQuests();
                     if(quests.isEmpty())
                     {
                         m.send(cs, "Momentan sind keine Quests aktiv.");
@@ -212,21 +212,21 @@ public class CommandQuest extends ModuleCommand
                             m.send(cs, GlobalText.cantFindPlayer(arg[1]));
                             return true;
                         }
-                        KajetansMod.quest.addPlayerToPlayer(p, affectedPlayer); 
+                        KajetansMod.scripts.addPlayerToPlayer(p, affectedPlayer); 
                         return true;
                     }
                     break;
                 }
                 case "term":
                 {
-                    KajetansMod.quest.removeQuests();
+                    KajetansMod.scripts.removeQuests();
                     m.send(cs, "Alle aktiven Quests wurden beendet.");
                     return true;
                 }
                 case "stack":
                 {
-                    KajetansMod.quest.getQuestParser().printStack = !KajetansMod.quest.getQuestParser().printStack;
-                    if(KajetansMod.quest.getQuestParser().printStack)
+                    KajetansMod.scripts.getQuestParser().printStack = !KajetansMod.scripts.getQuestParser().printStack;
+                    if(KajetansMod.scripts.getQuestParser().printStack)
                     {
                         m.send(cs, "Exceptions werden nun angezeigt.");
                         return true;

+ 1 - 1
src/main/java/me/km/snuviscript/CommandQuestInfo.java

@@ -27,7 +27,7 @@ public class CommandQuestInfo extends ModuleCommand
             return true;
         }
         EntityPlayer p = (EntityPlayer) cs;
-        QuestData data = KajetansMod.quest.getQuestData(p);
+        Script data = KajetansMod.scripts.getQuestData(p);
         if(data == null)
         {
             this.getModule().send(cs, "Du hast gerade keine Quest.");

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

@@ -38,7 +38,7 @@ public class CommandScript extends ModuleCommand
                 {
                     if(arg.length >= 2)
                     {
-                        KajetansMod.quest.startScript(cs, arg[1]);
+                        KajetansMod.scripts.startScript(cs, arg[1]);
                         return true;
                     }
                     break;
@@ -50,7 +50,7 @@ public class CommandScript extends ModuleCommand
                     {
                         try
                         {
-                            QuestData qd = KajetansMod.quest.getScript(Integer.parseInt(arg[1]));
+                            Script qd = KajetansMod.scripts.getScript(Integer.parseInt(arg[1]));
                             if(qd == null)
                             {
                                 throw new NumberFormatException();
@@ -72,7 +72,7 @@ public class CommandScript extends ModuleCommand
                     {
                         try
                         {
-                            QuestData qd = KajetansMod.quest.getScript(Integer.parseInt(arg[1]));
+                            Script qd = KajetansMod.scripts.getScript(Integer.parseInt(arg[1]));
                             if(qd == null)
                             {
                                 throw new NumberFormatException();
@@ -95,7 +95,7 @@ public class CommandScript extends ModuleCommand
                     {
                         try
                         {
-                            QuestData qd = KajetansMod.quest.getScript(Integer.parseInt(arg[1]));
+                            Script qd = KajetansMod.scripts.getScript(Integer.parseInt(arg[1]));
                             if(qd == null)
                             {
                                 throw new NumberFormatException();
@@ -117,7 +117,7 @@ public class CommandScript extends ModuleCommand
                     {
                         try
                         {
-                            QuestData qd = KajetansMod.quest.getScript(Integer.parseInt(arg[1]));
+                            Script qd = KajetansMod.scripts.getScript(Integer.parseInt(arg[1]));
                             if(qd == null)
                             {
                                 throw new NumberFormatException();
@@ -144,7 +144,7 @@ public class CommandScript extends ModuleCommand
                     {
                         try
                         {
-                            QuestData qd = KajetansMod.quest.getScript(Integer.parseInt(arg[1]));
+                            Script qd = KajetansMod.scripts.getScript(Integer.parseInt(arg[1]));
                             if(qd == null)
                             {
                                 throw new NumberFormatException();
@@ -173,7 +173,7 @@ public class CommandScript extends ModuleCommand
                     {
                         try
                         {
-                            QuestData qd = KajetansMod.quest.getScript(Integer.parseInt(arg[1]));
+                            Script qd = KajetansMod.scripts.getScript(Integer.parseInt(arg[1]));
                             if(qd == null)
                             {
                                 throw new NumberFormatException();
@@ -197,7 +197,7 @@ public class CommandScript extends ModuleCommand
                 }
                 case "see":
                 {
-                    Collection<QuestData> scripts = KajetansMod.quest.getScripts();
+                    Collection<Script> scripts = KajetansMod.scripts.getScripts();
                     if(scripts.isEmpty())
                     {
                         m.send(cs, "Momentan sind keine Scripts aktiv.", 1);
@@ -218,12 +218,12 @@ public class CommandScript extends ModuleCommand
                         {
                             if(arg[1].equals("all"))
                             {
-                                KajetansMod.quest.removeScripts();
+                                KajetansMod.scripts.removeScripts();
                                 m.send(cs, "Alle aktiven Scripts wurden beendet.", 1);
                                 return true;
                             }
-                            QuestData qd = KajetansMod.quest.getScript(Integer.parseInt(arg[1]));
-                            if(!KajetansMod.quest.term(qd))
+                            Script qd = KajetansMod.scripts.getScript(Integer.parseInt(arg[1]));
+                            if(!KajetansMod.scripts.term(qd))
                             {
                                 throw new NumberFormatException();
                             }

+ 9 - 9
src/main/java/me/km/snuviscript/QuestData.java → src/main/java/me/km/snuviscript/Script.java

@@ -26,9 +26,9 @@ import net.minecraft.command.ICommandSender;
 import net.minecraft.entity.player.EntityPlayer;
 import net.minecraft.util.text.TextComponentString;
 
-public class QuestData 
+public class Script 
 {
-    private final QuestParser parser;
+    private final SnuviParser parser;
     
     private final BenchmarkClock treeClock;
     public final BenchmarkClock exeClock;
@@ -59,9 +59,9 @@ public class QuestData
  
     private final ArrayList<EntityPlayer> quester;  
     
-    public QuestData(int id, EntityPlayer p, String filename, ICommandSender cs)
+    public Script(int id, EntityPlayer p, String filename, ICommandSender cs)
     {       
-        parser = KajetansMod.quest.getQuestParser();
+        parser = KajetansMod.scripts.getQuestParser();
         treeClock = new BenchmarkClock();
         exeClock = new BenchmarkClock();
         benchmark = false;
@@ -379,7 +379,7 @@ public class QuestData
                 ex.printStackTrace();
             }
             resetOverflowProtection();
-            Module m = KajetansMod.quest;
+            Module m = KajetansMod.scripts;
             int id = script ? 1 : 0;
             m.send(cs, "§cError in", id);
             m.sendHelpListElement(cs, "§cScript", getName(), id);
@@ -397,7 +397,7 @@ public class QuestData
             {
                 m.sendHelpListElement(cs, "§cUngültiger Wert", ((IllegalStringException) ex).getBadString(), id);
             }
-            KajetansMod.quest.term(this);
+            KajetansMod.scripts.term(this);
         }
     }
     
@@ -438,7 +438,7 @@ public class QuestData
         }
         catch(NoChildTreeException | GoHigherAtRootTreeException ex)
         {
-            KajetansMod.quest.term(this);
+            KajetansMod.scripts.term(this);
         }
         catch(HoldCodeException ex2)
         {
@@ -462,11 +462,11 @@ public class QuestData
         {
             if(ex instanceof IllegalStringException)
             {
-                KajetansMod.quest.send(cs, ((IllegalStringException) ex).getBadString(), script ? 1 : 0);
+                KajetansMod.scripts.send(cs, ((IllegalStringException) ex).getBadString(), script ? 1 : 0);
             }
             else
             {
-                KajetansMod.quest.send(cs, ex.getClass().getSimpleName(), script ? 1 : 0);
+                KajetansMod.scripts.send(cs, ex.getClass().getSimpleName(), script ? 1 : 0);
             }
         }
     }   

+ 23 - 23
src/main/java/me/km/snuviscript/QuestAPI.java → src/main/java/me/km/snuviscript/ScriptAPI.java

@@ -10,18 +10,18 @@ import net.minecraft.entity.Entity;
 import net.minecraft.entity.player.EntityPlayer;
 import net.minecraft.util.text.TextFormatting;
 
-public class QuestAPI extends Module
+public class ScriptAPI extends Module
 {
-    private final QuestParser qparser;
+    private final SnuviParser qparser;
     
     private int idCounter;
     
-    private final HashMap<Integer, QuestData> questData;
+    private final HashMap<Integer, Script> questData;
     private final HashMap<UUID, Integer> playerQuestID;
     
-    private final HashMap<Integer, QuestData> scripts;
+    private final HashMap<Integer, Script> scripts;
     
-    public QuestAPI(String mname, String prefix, TextFormatting color) 
+    public ScriptAPI(String mname, String prefix, TextFormatting color) 
     {
         super(mname, prefix, color);
         
@@ -29,14 +29,14 @@ public class QuestAPI extends Module
         playerQuestID = new HashMap<>();
         scripts = new HashMap<>();
         idCounter = 0;
-        qparser = new QuestParser();
+        qparser = new SnuviParser();
     }
        
     // -------------------------------------------------------------------------
     // QuestParser
     // -------------------------------------------------------------------------
     
-    public QuestParser getQuestParser()
+    public SnuviParser getQuestParser()
     {
         return qparser;
     }
@@ -45,7 +45,7 @@ public class QuestAPI extends Module
     // Quest - Control
     // -------------------------------------------------------------------------
 
-    private void addPlayerToQuest(EntityPlayer p, EntityPlayer p2, QuestData qd)
+    private void addPlayerToQuest(EntityPlayer p, EntityPlayer p2, Script qd)
     {             
         if(hasQuest(p))
         {
@@ -80,7 +80,7 @@ public class QuestAPI extends Module
             }
         }
         qd.setVar("event", "player-join");
-        QuestVars.setPlayerVars(qd, p); 
+        ScriptVars.setPlayerVars(qd, p); 
         qd.runCode();
     } 
     
@@ -89,12 +89,12 @@ public class QuestAPI extends Module
         addPlayerToQuest(p, p2, getQuestData(p2)); 
     } 
     
-    public void addPlayerToQuest(EntityPlayer p, QuestData qd)
+    public void addPlayerToQuest(EntityPlayer p, Script qd)
     {             
         addPlayerToQuest(p, null, qd);  
     } 
     
-    public Collection<QuestData> getQuests()
+    public Collection<Script> getQuests()
     {
         return questData.values();
     }
@@ -104,14 +104,14 @@ public class QuestAPI extends Module
         return playerQuestID.containsKey(p.getUniqueID());
     }
     
-    public QuestData getQuestData(EntityPlayer p)
+    public Script getQuestData(EntityPlayer p)
     {
         Integer id = playerQuestID.get(p.getUniqueID());
         if(id == null)
         {
             return null;
         }
-        QuestData qd = questData.get(id);
+        Script qd = questData.get(id);
         if(qd == null)
         {
             qparser.sendWarningToAllDevs("Die ungültige Quest von '" + p.getName() + "' wurde entfernt.");
@@ -120,7 +120,7 @@ public class QuestAPI extends Module
         return qd;
     }
     
-    public void removePlayerFromQuest(EntityPlayer p, QuestData qd)
+    public void removePlayerFromQuest(EntityPlayer p, Script qd)
     {
         if(qd == null)
         {
@@ -145,7 +145,7 @@ public class QuestAPI extends Module
     // Script - Control
     // -------------------------------------------------------------------------
 
-    public QuestData getScript(int id)
+    public Script getScript(int id)
     {
         return scripts.get(id);
     }
@@ -156,7 +156,7 @@ public class QuestAPI extends Module
         scripts.clear();
     }
     
-    public Collection<QuestData> getScripts()
+    public Collection<Script> getScripts()
     {
         return scripts.values();
     }
@@ -165,7 +165,7 @@ public class QuestAPI extends Module
     // Quest / Script - Control
     // -------------------------------------------------------------------------
     
-    public void add(QuestData qd, EntityPlayer p)
+    public void add(Script qd, EntityPlayer p)
     {
         if(p != null)
         {
@@ -179,7 +179,7 @@ public class QuestAPI extends Module
         idCounter++;
     }
     
-    public boolean term(QuestData qd)
+    public boolean term(Script qd)
     {
         if(qd == null)
         {
@@ -216,7 +216,7 @@ public class QuestAPI extends Module
             this.send(sender, "Du hast bereits eine Quest.");
             return;
         }
-        QuestData other = getQuests().stream()
+        Script other = getQuests().stream()
                 .filter(qd -> qd.getVar("add-if-name") != null)
                 .filter(qd -> qd.getVar("add-if-name").equals(chosenQuest))
                 .findAny().orElse(null);
@@ -225,11 +225,11 @@ public class QuestAPI extends Module
             addPlayerToQuest(p, other);
             return;
         }
-        QuestData qd = new QuestData(idCounter, p, chosenQuest, sender);
-        QuestVars.setPlayerVars(qd, p); 
+        Script qd = new Script(idCounter, p, chosenQuest, sender);
+        ScriptVars.setPlayerVars(qd, p); 
         if(executor != null)
         {
-            QuestVars.setEntityVars(qd, executor);
+            ScriptVars.setEntityVars(qd, executor);
         }
         if(forcedQuest != null)
         {
@@ -246,7 +246,7 @@ public class QuestAPI extends Module
         {                       
             return;
         }          */  
-        QuestData qd = new QuestData(idCounter, null, chosenQuest, sender);
+        Script qd = new Script(idCounter, null, chosenQuest, sender);
         add(qd, null);
         if(qd.isValid())
         {

+ 5 - 5
src/main/java/me/km/snuviscript/QuestBank.java → src/main/java/me/km/snuviscript/ScriptBank.java

@@ -5,9 +5,9 @@ import me.km.databank.SimpleDataBank;
 import java.sql.Connection;
 import me.km.table.Table;
 
-public class QuestBank extends SimpleDataBank
+public class ScriptBank extends SimpleDataBank
 {   
-    public QuestBank(Module m, Connection c) 
+    public ScriptBank(Module m, Connection c) 
     {
         super(m, c);
     }
@@ -87,7 +87,7 @@ public class QuestBank extends SimpleDataBank
 
     public Object getVar(String var, String uuid)
     {
-        return QuestUtils.convertInput(this.getFirst("SELECT value from questdata "
+        return ScriptUtils.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));
@@ -119,7 +119,7 @@ public class QuestBank extends SimpleDataBank
 
     public Object getMapValue(String map, String key)
     {
-        return QuestUtils.convertInput(this.getFirst("SELECT value from questmaps "
+        return ScriptUtils.convertInput(this.getFirst("SELECT value from questmaps "
                 + "WHERE map = '" + map + "' AND "
                 + "keyname='" + key + "';", String.class));
     }  
@@ -151,7 +151,7 @@ public class QuestBank extends SimpleDataBank
 
     public Object getDualMapValue(String map, String key, String key2)
     {
-        return QuestUtils.convertInput(this.getFirst("SELECT value from questdualmaps "
+        return ScriptUtils.convertInput(this.getFirst("SELECT value from questdualmaps "
                 + "WHERE map = '" + map + "' AND "
                 + "keyname = '" + key + "' AND "
                 + "seckeyname='" + key2 + "';", String.class));

+ 67 - 54
src/main/java/me/km/snuviscript/QuestsEvents.java → src/main/java/me/km/snuviscript/ScriptEvents.java

@@ -2,6 +2,7 @@ package me.km.snuviscript;
 
 import java.util.Arrays;
 import java.util.HashMap;
+import java.util.List;
 import java.util.UUID;
 import java.util.function.Consumer;
 import java.util.function.Predicate;
@@ -16,6 +17,7 @@ import me.km.events.PlayerHurtEvent;
 import me.km.events.PlayerJoinMessageEvent;
 import me.km.events.PlayerLeaveMessageEvent;
 import me.km.events.PlayerMoveEvent;
+import net.minecraft.entity.Entity;
 import net.minecraft.entity.EntityLivingBase;
 import net.minecraft.entity.item.EntityItem;
 import net.minecraft.entity.passive.EntitySheep;
@@ -23,6 +25,7 @@ import net.minecraft.entity.passive.EntityVillager;
 import net.minecraft.entity.player.EntityPlayer;
 import net.minecraft.init.Items;
 import net.minecraft.inventory.ClickType;
+import net.minecraft.item.ItemStack;
 import net.minecraft.server.management.PlayerList;
 import net.minecraft.util.EnumHand;
 import net.minecraft.util.math.BlockPos;
@@ -40,11 +43,11 @@ import net.minecraftforge.event.world.BlockEvent;
 import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
 import net.minecraftforge.fml.common.gameevent.PlayerEvent;
 
-public class QuestsEvents extends ModuleListener
+public class ScriptEvents extends ModuleListener
 {               
     private final HashMap<UUID, UUID> questJoin;
                  
-    public QuestsEvents(Module m)
+    public ScriptEvents(Module m)
     {    
         super(m);
         questJoin = new HashMap<>();
@@ -54,12 +57,12 @@ public class QuestsEvents extends ModuleListener
     // Basics
     // -------------------------------------------------------------------------
         
-    private void doInEvent(QuestData data, EntityPlayer p, String event, Consumer<QuestData> before, Consumer<QuestData> after)
+    private void doInEvent(Script data, EntityPlayer p, String event, Consumer<Script> before, Consumer<Script> after)
     {
         data.setVar("event", event);
         if(p != null)
         {
-            QuestVars.setPlayerVars(data, p); 
+            ScriptVars.setPlayerVars(data, p); 
         }
         if(before != null)
         {
@@ -72,16 +75,16 @@ public class QuestsEvents extends ModuleListener
         }
     }
     
-    private void handleEvent(EntityPlayer p, String event, Predicate<? super QuestData> pre, Consumer<QuestData> before, Consumer<QuestData> after)
+    private void handleEvent(EntityPlayer p, String event, Predicate<? super Script> pre, Consumer<Script> before, Consumer<Script> after)
     {      
-        KajetansMod.quest.getScripts().stream().filter(pre).filter(qd -> qd.isEventLoaded(event)).forEach(data -> 
+        KajetansMod.scripts.getScripts().stream().filter(pre).filter(qd -> qd.isEventLoaded(event)).forEach(data -> 
         {
             doInEvent(data, p, event, before, after);
         });
         
-        if(p != null && KajetansMod.quest.hasQuest(p))
+        if(p != null && KajetansMod.scripts.hasQuest(p))
         {
-            QuestData data = KajetansMod.quest.getQuestData(p);
+            Script data = KajetansMod.scripts.getQuestData(p);
             if(data != null && data.isEventLoaded(event) && pre.test(data))
             {
                 doInEvent(data, p, event, before, after);
@@ -89,12 +92,12 @@ public class QuestsEvents extends ModuleListener
         }      
     }
     
-    private void handleEvent(EntityPlayer p, String event, Consumer<QuestData> before, Consumer<QuestData> 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<QuestData> before)
+    private void handleEvent(EntityPlayer p, String event, Consumer<Script> before)
     {      
         handleEvent(p, event, before, null);
     }
@@ -112,7 +115,7 @@ public class QuestsEvents extends ModuleListener
         }
         EntityPlayer p = e.getEntityPlayer();   
         EntityPlayer affectedPlayer = (EntityPlayer) e.getTarget();
-        if(KajetansMod.quest.hasQuest(p) && !KajetansMod.quest.hasQuest(affectedPlayer))
+        if(KajetansMod.scripts.hasQuest(p) && !KajetansMod.scripts.hasQuest(affectedPlayer))
         {
             if(questJoin.get(affectedPlayer.getUniqueID()) != null)
             {
@@ -126,12 +129,12 @@ public class QuestsEvents extends ModuleListener
             this.getModule().send(p, affectedPlayer.getName() + " wurde eine Anfrage gesendet.");
             return;
         }
-        if(!KajetansMod.quest.hasQuest(p) && questJoin.get(p.getUniqueID()) != null && KajetansMod.quest.hasQuest(affectedPlayer))
+        if(!KajetansMod.scripts.hasQuest(p) && questJoin.get(p.getUniqueID()) != null && KajetansMod.scripts.hasQuest(affectedPlayer))
         {
             if(questJoin.get(p.getUniqueID()).equals(affectedPlayer.getUniqueID()))
             {
                 questJoin.remove(p.getUniqueID());
-                KajetansMod.quest.addPlayerToPlayer(p, affectedPlayer);
+                KajetansMod.scripts.addPlayerToPlayer(p, affectedPlayer);
             }
         }
     }
@@ -140,7 +143,7 @@ public class QuestsEvents extends ModuleListener
     public void onPlayerMove(PlayerMoveEvent e)
     {      
         EntityPlayer p = e.getEntityPlayer();
-        KajetansMod.quest.getScripts().stream().filter(qd -> qd.isEventLoaded("player-move")).forEach(data -> 
+        KajetansMod.scripts.getScripts().stream().filter(qd -> qd.isEventLoaded("player-move")).forEach(data -> 
         {
             if(data.removeLocation(Location.rounded(p)))
             {
@@ -148,9 +151,9 @@ public class QuestsEvents extends ModuleListener
             }
         });
 
-        if(KajetansMod.quest.hasQuest(p))
+        if(KajetansMod.scripts.hasQuest(p))
         {
-            QuestData data = KajetansMod.quest.getQuestData(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);
@@ -158,23 +161,23 @@ public class QuestsEvents extends ModuleListener
         }  
     } 
     
-    public boolean QuestClickInventory(QuestData qd, SnuviInventory inv, int slot, ClickType click, EntityPlayer p)
+    public boolean QuestClickInventory(Script qd, SnuviInventory inv, int slot, ClickType click, EntityPlayer p)
     {
         qd.setVar("event", "inv-click");
-        QuestVars.setPlayerVars(qd, p); 
+        ScriptVars.setPlayerVars(qd, p); 
         qd.setVar("inv-id", inv.getId());
         qd.setVar("inv-name", inv.getName());
         qd.setVar("inv-slot", slot);
-        QuestVars.setItemVars(qd, inv.getStackInSlot(slot));
+        ScriptVars.setItemVars(qd, inv.getStackInSlot(slot));
         qd.setVar("cancel", false); 
         qd.runCode();
         return qd.getBoolean("cancel");
     }
 
-    public boolean QuestCloseInventory(QuestData qd, SnuviInventory inv, EntityPlayer p)
+    public boolean QuestCloseInventory(Script qd, SnuviInventory inv, EntityPlayer p)
     {
         qd.setVar("event", "inv-close");
-        QuestVars.setPlayerVars(qd, p); 
+        ScriptVars.setPlayerVars(qd, p); 
         qd.setVar("inv-id", inv.getId());
         qd.setVar("inv-name", inv.getName());
         qd.setVar("cancel", false); 
@@ -223,7 +226,7 @@ public class QuestsEvents extends ModuleListener
             EntityPlayer ent = Utils.getDamager(e.getSource());
             if(ent != null)
             {
-                QuestVars.setSecPlayer(qd, ent);
+                ScriptVars.setSecPlayer(qd, ent);
             }
             qd.setVar("cancel", e.isCanceled()); 
         }, (qd) -> 
@@ -240,12 +243,12 @@ public class QuestsEvents extends ModuleListener
             handleEvent(null, "entity-death", (qd) -> 
             {
                 EntityLivingBase ent = e.getEntityLiving();
-                QuestVars.setEntityVars(qd, ent);
+                ScriptVars.setEntityVars(qd, ent);
                 EntityPlayer p = Utils.getDamager(e.getSource());
                 if(p != null)
                 {
                     qd.setVar("player-involved", true);
-                    QuestVars.setPlayerVars(qd, p);
+                    ScriptVars.setPlayerVars(qd, p);
                 }  
                 else
                 {
@@ -266,7 +269,7 @@ public class QuestsEvents extends ModuleListener
             EntityPlayer ent = Utils.getDamager(e.getSource());
             if(ent != null)
             {
-                QuestVars.setSecPlayer(qd, ent);
+                ScriptVars.setSecPlayer(qd, ent);
             }
             qd.setVar("cancel", e.isCanceled()); 
         }, (qd) -> 
@@ -291,7 +294,7 @@ public class QuestsEvents extends ModuleListener
         handleEvent(p, "entity-hurt", (qd) -> 
         {
             qd.setVar("entity-killed", e.getEntityLiving().getHealth() <= e.getAmount());        
-            QuestVars.setEntityVars(qd, e.getEntity()); 
+            ScriptVars.setEntityVars(qd, e.getEntity()); 
             qd.setVar("entity-damage", e.getAmount());   
             qd.setVar("entity-damage-cause", e.getSource().getDamageType());
             qd.setVar("cancel", e.isCanceled());   
@@ -309,12 +312,12 @@ public class QuestsEvents extends ModuleListener
             handleEvent(null, "entity-drop", (qd) -> 
             {
                 qd.setVar("drops", e.getDrops());
-                QuestVars.setEntityVars(qd, e.getEntityLiving());
+                ScriptVars.setEntityVars(qd, e.getEntityLiving());
                 EntityPlayer p = Utils.getDamager(e.getSource());
                 if(p != null)
                 {
                     qd.setVar("player-involved", true);
-                    QuestVars.setPlayerVars(qd, p);
+                    ScriptVars.setPlayerVars(qd, p);
                 }  
                 else
                 {
@@ -328,7 +331,7 @@ public class QuestsEvents extends ModuleListener
         }
         catch(NullPointerException ex)
         {
-            KajetansMod.quest.sendWarningToConsole(ex.toString() + "  " + ex.getMessage());
+            KajetansMod.scripts.sendWarningToConsole(ex.toString() + "  " + ex.getMessage());
         }
     } 
             
@@ -361,11 +364,21 @@ public class QuestsEvents extends ModuleListener
                 {
                     qd.setVar("is-entity-hit", false);
                 }
-                QuestVars.setEntityVars(qd, e.getEntityThrowable());
+                ScriptVars.setEntityVars(qd, e.getEntityThrowable());
             });
         }           
     }
     
+    @SubscribeEvent
+    public void onEntityItemProjectileHit(EntityPlayer p, ItemStack stack, List<Entity> ents)
+    {        
+        handleEvent(p, "item-hit", (qd) -> 
+        {
+            ScriptVars.setItemVars(qd, stack);
+            qd.setVar("entities", ents);
+        });      
+    }
+    
     @SubscribeEvent
     public void QuestEntityShear(PlayerInteractEvent.EntityInteract e)
     {              
@@ -381,7 +394,7 @@ public class QuestsEvents extends ModuleListener
         EntitySheep sheep = (EntitySheep) e.getTarget();
         handleEvent(p, "entity-shear", (qd) -> 
         {
-            QuestVars.setEntityVars(qd, sheep);
+            ScriptVars.setEntityVars(qd, sheep);
             qd.setVar("entity-sheared", sheep.getSheared());
             qd.setVar("entity-color", sheep.getFleeceColor().toString());
             qd.setVar("cancel", e.isCanceled()); 
@@ -397,7 +410,7 @@ public class QuestsEvents extends ModuleListener
     {        
         handleEvent(e.getPlayer(), "block-break", (qd) -> 
         {
-            QuestVars.setBlockVars(qd, e.getWorld(), e.getPos());
+            ScriptVars.setBlockVars(qd, e.getWorld(), e.getPos());
             qd.setVar("cancel", e.isCanceled()); 
         }, (qd) -> 
         {
@@ -458,7 +471,7 @@ public class QuestsEvents extends ModuleListener
                 BlockPos pos = ray.getBlockPos();
                 if(pos != null)
                 {
-                    QuestVars.setBlockVars(qd, e.getWorld(), pos);
+                    ScriptVars.setBlockVars(qd, e.getWorld(), pos);
                 }
             }
             qd.setVar("cancel", e.isCanceled()); 
@@ -474,7 +487,7 @@ public class QuestsEvents extends ModuleListener
         handleEvent(e.getPlayer(), "block-place", (qd) -> 
         {
             qd.setVar("block-type-after", e.getPlacedBlock().getBlock().getRegistryName());
-            QuestVars.setBlockVars(qd, e.getWorld(), e.getPos());
+            ScriptVars.setBlockVars(qd, e.getWorld(), e.getPos());
             qd.setVar("cancel", e.isCanceled()); 
         }, (qd) -> 
         {
@@ -488,7 +501,7 @@ public class QuestsEvents extends ModuleListener
         handleEvent(e.getEntityPlayer(), "block-click", (qd) -> 
         {
             qd.setVar("action", "right");
-            QuestVars.setBlockVars(qd, e.getWorld(), e.getPos());
+            ScriptVars.setBlockVars(qd, e.getWorld(), e.getPos());
             qd.setVar("cancel", e.isCanceled()); 
         }, (qd) -> 
         {
@@ -502,7 +515,7 @@ public class QuestsEvents extends ModuleListener
         handleEvent(e.getEntityPlayer(), "block-click", (qd) -> 
         {
             qd.setVar("action", "left");
-            QuestVars.setBlockVars(qd, e.getWorld(), e.getPos());
+            ScriptVars.setBlockVars(qd, e.getWorld(), e.getPos());
             qd.setVar("cancel", e.isCanceled()); 
         }, (qd) -> 
         {
@@ -517,8 +530,8 @@ public class QuestsEvents extends ModuleListener
         {
             handleEvent(e.getEntityPlayer(), "entity-click", (qd) -> 
             {
-                QuestVars.setEntityVars(qd, e.getTarget());
-                QuestVars.setItemVars(qd, e.getItemStack());
+                ScriptVars.setEntityVars(qd, e.getTarget());
+                ScriptVars.setItemVars(qd, e.getItemStack());
                 qd.setVar("cancel", e.isCanceled()); 
             }, (qd) -> 
             {
@@ -550,7 +563,7 @@ public class QuestsEvents extends ModuleListener
         handleEvent((EntityPlayer) e.getEntityLiving(), "item-use-start", (qd) -> 
         {
             qd.setVar("duration", e.getDuration());
-            QuestVars.setItemVars(qd, e.getItem()); 
+            ScriptVars.setItemVars(qd, e.getItem()); 
             qd.setVar("cancel", e.isCanceled());  
         }, (qd) -> 
         {
@@ -561,7 +574,7 @@ public class QuestsEvents extends ModuleListener
             }
             catch(Exception ex)
             {
-                KajetansMod.quest.getQuestParser().printQuestException(qd, ex, "(duration)");           
+                KajetansMod.scripts.getQuestParser().printQuestException(qd, ex, "(duration)");           
             }
         });
     }
@@ -575,7 +588,7 @@ public class QuestsEvents extends ModuleListener
         }
         handleEvent((EntityPlayer) e.getEntityLiving(), "item-use-finish", (qd) -> 
         {
-            QuestVars.setItemVars(qd, e.getItem());
+            ScriptVars.setItemVars(qd, e.getItem());
             qd.setVar("cancel", e.isCanceled()); 
         }, (qd) -> 
         {
@@ -588,7 +601,7 @@ public class QuestsEvents extends ModuleListener
     {  
         handleEvent(e.player, "craft", (qd) -> 
         {
-            QuestVars.setItemVars(qd, e.crafting);
+            ScriptVars.setItemVars(qd, e.crafting);
             qd.setVar("cancel", e.isCanceled()); 
         }, (qd) -> 
         {
@@ -601,7 +614,7 @@ public class QuestsEvents extends ModuleListener
     {
         handleEvent(e.getPlayer(), "player-drop", (qd) -> 
         {
-            QuestVars.setItemVars(qd, e.getEntityItem().getEntityItem());   
+            ScriptVars.setItemVars(qd, e.getEntityItem().getEntityItem());   
             qd.setVar("cancel", e.isCanceled()); 
         }, (qd) -> 
         {
@@ -614,7 +627,7 @@ public class QuestsEvents extends ModuleListener
     {
         handleEvent(e.player, "player-pickup", (qd) -> 
         {
-            QuestVars.setItemVars(qd, e.pickedUp.getEntityItem());  
+            ScriptVars.setItemVars(qd, e.pickedUp.getEntityItem());  
             qd.setVar("cancel", e.isCanceled()); 
         }, (qd) -> 
         {
@@ -633,7 +646,7 @@ public class QuestsEvents extends ModuleListener
         handleEvent(p, "entity-mount", (qd) -> 
         {
             qd.setVar("mounting", e.isMounting()); 
-            QuestVars.setEntityVars(qd, e.getEntityBeingMounted()); 
+            ScriptVars.setEntityVars(qd, e.getEntityBeingMounted()); 
             qd.setVar("cancel", e.isCanceled()); 
         }, (qd) -> 
         {
@@ -658,7 +671,7 @@ public class QuestsEvents extends ModuleListener
         {
             handleEvent(e.getPlayer(), "command", (qd) -> 
             {
-                qd.setVar("args", Arrays.stream(e.getComponent().getFormattedText().substring(1).split(" ")).map(s -> QuestUtils.convertInput(s)).collect(Collectors.toList()));
+                qd.setVar("args", Arrays.stream(e.getComponent().getFormattedText().substring(1).split(" ")).map(s -> ScriptUtils.convertInput(s)).collect(Collectors.toList()));
                 qd.setVar("cancel", e.isCanceled()); 
             }, (qd) -> 
             {
@@ -670,7 +683,7 @@ public class QuestsEvents extends ModuleListener
             e.setCanceled(true);
             handleEvent(e.getPlayer(), "chat", (qd) -> 
             {
-                qd.setVar("args", Arrays.stream(e.getComponent().getFormattedText().substring(1).split(" ")).map(s -> QuestUtils.convertInput(s)).collect(Collectors.toList()));
+                qd.setVar("args", Arrays.stream(e.getComponent().getFormattedText().substring(1).split(" ")).map(s -> ScriptUtils.convertInput(s)).collect(Collectors.toList()));
             });
         }
     }
@@ -697,7 +710,7 @@ public class QuestsEvents extends ModuleListener
             }
             catch(Exception ex)
             {
-                KajetansMod.quest.getQuestParser().printQuestException(qd, ex, "(power)");           
+                KajetansMod.scripts.getQuestParser().printQuestException(qd, ex, "(power)");           
             }
             try
             {
@@ -710,7 +723,7 @@ public class QuestsEvents extends ModuleListener
             }
             catch(Exception ex)
             {
-                KajetansMod.quest.getQuestParser().printQuestException(qd, ex, "(mana-cost)");           
+                KajetansMod.scripts.getQuestParser().printQuestException(qd, ex, "(mana-cost)");           
             }
             e.setCanceled(qd.getBoolean("cancel")); 
         });
@@ -720,9 +733,9 @@ public class QuestsEvents extends ModuleListener
     public void QuestVillagerPickUpItem(ItemTossEvent e)
     {             
         EntityPlayer p = e.getPlayer();
-        if(KajetansMod.quest.hasQuest(p))
+        if(KajetansMod.scripts.hasQuest(p))
         {           
-            QuestData qd = KajetansMod.quest.getQuestData(p);
+            Script qd = KajetansMod.scripts.getQuestData(p);
             if(qd == null || !qd.isEventLoaded("villager-give"))
             {
                 return;
@@ -739,14 +752,14 @@ public class QuestsEvents extends ModuleListener
                 {
                     return;
                 }
-                QuestData data = KajetansMod.quest.getQuestData(p);
+                Script data = KajetansMod.scripts.getQuestData(p);
                 if(data == null || !data.isEventLoaded("villager-give"))
                 {
                     return;
                 }
                 data.setVar("event", "villager-give");
-                QuestVars.setPlayerVars(data, p); 
-                QuestVars.setItemVars(data, itemEnt.getEntityItem());
+                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()); 

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

@@ -6,18 +6,18 @@ import net.minecraft.entity.player.EntityPlayer;
 import net.minecraft.entity.player.EntityPlayerMP;
 import net.minecraft.inventory.ClickType;
 
-public class QuestInventoryHolder extends CustomContainer
+public class ScriptInventoryHolder extends CustomContainer
 {
-    private final QuestData qd;
-    private final QuestsEvents e;
+    private final Script qd;
+    private final ScriptEvents e;
     private final SnuviInventory inv;
 
-    public QuestInventoryHolder(SnuviInventory inv, EntityPlayerMP p, QuestData qd) 
+    public ScriptInventoryHolder(SnuviInventory inv, EntityPlayerMP p, Script qd) 
     {
         super(inv, p);
         this.qd = qd;
         this.inv = inv;
-        this.e = KajetansMod.quest.getEvent(QuestsEvents.class);
+        this.e = KajetansMod.scripts.getEvent(ScriptEvents.class);
     }
 
     @Override

+ 1 - 1
src/main/java/me/km/snuviscript/QuestUtils.java → src/main/java/me/km/snuviscript/ScriptUtils.java

@@ -17,7 +17,7 @@ import net.minecraft.item.ItemStack;
 import net.minecraft.util.math.BlockPos;
 import net.minecraft.util.math.Vec3d;
 
-public class QuestUtils 
+public class ScriptUtils 
 { 
     public static Number getNumber(String s)
     {

+ 6 - 6
src/main/java/me/km/snuviscript/QuestVars.java → src/main/java/me/km/snuviscript/ScriptVars.java

@@ -8,9 +8,9 @@ import net.minecraft.item.ItemStack;
 import net.minecraft.util.math.BlockPos;
 import net.minecraft.world.World;
 
-public class QuestVars 
+public class ScriptVars 
 {  
-    public static void setBlockVars(QuestData qd, World w, BlockPos pos)
+    public static void setBlockVars(Script qd, World w, BlockPos pos)
     {               
         IBlockState state = w.getBlockState(pos);
         qd.setVar("block-loc", new Location(w, pos));
@@ -18,14 +18,14 @@ public class QuestVars
         qd.setVar("block-data", state.getBlock().getMetaFromState(state));
     }
     
-    public static void setPlayerVars(QuestData qd, EntityPlayer p)
+    public static void setPlayerVars(Script qd, EntityPlayer p)
     {
         qd.setVar("player", p);
         qd.setVar("player-name", p.getName());
         qd.setVar("player-loc", new Location(p.world, p.getPositionVector()));
     }
     
-    public static void setSecPlayer(QuestData qd, EntityPlayer p)
+    public static void setSecPlayer(Script qd, EntityPlayer p)
     {
         if(p != null)
         {
@@ -35,7 +35,7 @@ public class QuestVars
         }
     }
 
-    public static void setEntityVars(QuestData qd, Entity ent)
+    public static void setEntityVars(Script qd, Entity ent)
     {
         qd.setVar("entity", ent);
         qd.setVar("entity-name", ent.getDisplayName().getUnformattedText());
@@ -43,7 +43,7 @@ public class QuestVars
         qd.setVar("entity-type", ent.getClass().getSimpleName());             
     }
 
-    public static void setItemVars(QuestData qd, ItemStack stack)
+    public static void setItemVars(Script qd, ItemStack stack)
     {
         qd.setVar("item-type", stack.getItem().getRegistryName());
         qd.setVar("item-data", stack.getMetadata());

File diff suppressed because it is too large
+ 180 - 182
src/main/java/me/km/snuviscript/SnuviParser.java


+ 2 - 2
src/main/java/me/km/utils/ItemStackBuilder.java

@@ -4,6 +4,7 @@ import java.util.ArrayList;
 import me.km.api.Utils;
 import me.km.utils.ItemStackUtils.ItemFlag;
 import net.minecraft.block.Block;
+import net.minecraft.init.Enchantments;
 import net.minecraft.item.Item;
 import net.minecraft.item.ItemStack;
 import net.minecraft.util.math.BlockPos;
@@ -105,8 +106,7 @@ public class ItemStackBuilder
     
     public ItemStackBuilder addGlow()
     {
-        //TODO
-        //stack.addUnsafeEnchantment(Enchantment.LUCK, 1);
+        stack.addEnchantment(Enchantments.PROTECTION, 1);
         return this;
     }
 }

+ 27 - 28
src/main/java/me/km/utils/ItemStackUtils.java

@@ -10,6 +10,8 @@ import net.minecraft.item.ItemStack;
 import net.minecraft.nbt.JsonToNBT;
 import net.minecraft.nbt.NBTException;
 import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.nbt.NBTTagList;
+import net.minecraft.nbt.NBTTagString;
 import net.minecraft.util.math.BlockPos;
 import net.minecraft.world.World;
 
@@ -186,51 +188,48 @@ public class ItemStackUtils
     // -----------------------------------------------------------------------------------
     // Misc
     // -----------------------------------------------------------------------------------
-    
-    public static void setUnbreakable(ItemStack stack) 
-    {
-        // TODO
-    }
-    
-    public static void setLore(ItemStack stack, ArrayList<String> list) 
+
+    public static void setLore(ItemStack stack, List<String> list) 
     {
-        // TODO
+        NBTTagCompound com = stack.getOrCreateSubCompound("display");
+        NBTTagList nbtList = new NBTTagList();
+        list.forEach(s -> nbtList.appendTag(new NBTTagString(s)));
+        com.setTag("Lore", nbtList);
     }
     
     public static void addLore(ItemStack stack, String s) 
     {
-        // TODO
+        NBTTagCompound com = stack.getOrCreateSubCompound("display");
+        NBTTagList nbtList = com.getTagList("Lore", 8);
+        nbtList.appendTag(new NBTTagString(s));
+        com.setTag("Lore", nbtList);
     }
     
     public static List<String> getLore(ItemStack stack)
     {
-        //TODO
-        return new ArrayList<>();
+        NBTTagCompound com = stack.getOrCreateSubCompound("display");
+        NBTTagList nbtList = com.getTagList("Lore", 8);
+        ArrayList<String> list = new ArrayList<>();
+        for(int i = 0; i < nbtList.tagCount(); i++)
+        {
+            list.add(nbtList.getStringTagAt(i));
+        }
+        return list;
     }    
     
-    public static void setLore(ItemStack stack, String s, int i)
+    public static void addLore(ItemStack stack, String s, int i)
     {     
-        //TODO
-        /*ItemMeta meta = stack.getItemMeta();
-        List<String> list;
-        if(meta.hasLore())
-        {
-            list = meta.getLore();
-        }
-        else
-        {
-            list = new ArrayList<>();
-        }                           
-        if(i >= list.size())
+        NBTTagCompound com = stack.getOrCreateSubCompound("display");
+        NBTTagList list = com.getTagList("Lore", 8);                  
+        if(i >= list.tagCount())
         {
-            list.add(s);
+            list.appendTag(new NBTTagString(s));
         }
         else
         {
-            list.set(i, s);
+            list.set(i, new NBTTagString(s));
         }           
-        meta.setLore(list);
-        stack.setItemMeta(meta);*/
+        com.setTag("Lore", list);
     }
     
     public static void drop(World w, BlockPos pos, ItemStack stack)

+ 50 - 0
src/main/java/me/km/utils/RecipeUtils.java

@@ -0,0 +1,50 @@
+package me.km.utils;
+
+import java.util.ArrayList;
+import java.util.List;
+import net.minecraft.item.ItemStack;
+import net.minecraft.item.crafting.CraftingManager;
+import net.minecraft.item.crafting.FurnaceRecipes;
+import net.minecraft.item.crafting.IRecipe;
+
+public class RecipeUtils 
+{
+    private static final ArrayList<IRecipe> RECIPES = new ArrayList<>();
+    
+    private static void pushLastRecipe()
+    {
+        List<IRecipe> list = CraftingManager.getInstance().getRecipeList();
+        RECIPES.add(list.get(list.size() - 1));
+    }
+    
+    public static void registerShapelessRecipe(ItemStack result, ItemStack[] stacks)
+    {
+        CraftingManager.getInstance().addShapelessRecipe(result, (Object[]) stacks);
+        pushLastRecipe();
+    }
+    
+    public static void registerShapedRecipe(ItemStack result, String[] s, ItemStack[] stacks)
+    {
+        int length = s.length;
+        Object[] o = new Object[length + (stacks.length * 2)];
+        System.arraycopy(s, 0, o, 0, length);
+        for(int i = length; i < o.length; i += 2)
+        {
+            o[i] = Character.forDigit(i + 1 - length, 10);
+            o[i + 1] = stacks[i - length];
+        }       
+        CraftingManager.getInstance().addRecipe(result, o);
+        pushLastRecipe();
+    }
+    
+    public static void registerFurnaceRecipe(ItemStack result, ItemStack input)
+    {
+        FurnaceRecipes.instance().addSmeltingRecipe(input, result, 0.1F);
+    }
+    
+    public static void clearRecipes()
+    {
+        CraftingManager.getInstance().getRecipeList().removeAll(RECIPES);
+        RECIPES.clear();
+    }
+}

+ 1 - 6
src/main/java/me/km/utils/ReflectionUtils.java

@@ -132,14 +132,9 @@ public class ReflectionUtils
     }
     
     // -----------------------------------------------------------------------------------
-    // field list gets
+    // field gets
     // -----------------------------------------------------------------------------------
     
-    public static Enchantment getEnchantment(String name)
-    {
-        return getFieldValue(Enchantment.class, Enchantments.class, name);
-    }
-    
     public static SoundEvent getSoundEvent(String name)
     {
         return getFieldValue(SoundEvent.class, SoundEvents.class, name);

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