Browse Source

Bugfixes PlayerScripts

Kajetan Johannes Hammerle 7 years ago
parent
commit
75a911178f

+ 22 - 0
src/main/java/me/km/plots/ProtectionBank.java

@@ -346,6 +346,28 @@ public class ProtectionBank extends SimpleDataBank
         printError(sender);
     }
     
+    public boolean isPlotOverlapping(int x1, int y1, int z1, int x2, int y2, int z2, World w)
+    {
+        ArrayList<Object> list = this.getFirstColumn(
+            "SELECT id FROM plots WHERE " +
+            "(x1<=" + x1 + " AND x2>=" + x1 + " OR " + 
+            "x1<=" + x2 + " AND x2>=" + x2 + " OR " + 
+            "x1>=" + x1 + " AND x1<=" + x2 + " OR " + 
+            "x2>=" + x1 + " AND x2<=" + x2 + ") AND " + 
+                    
+            "(y1<=" + y1 + " AND y2>=" + y1 + " OR " + 
+            "y1<=" + y2 + " AND y2>=" + y2 + " OR " + 
+            "y1>=" + y1 + " AND y1<=" + y2 + " OR " + 
+            "y2>=" + y1 + " AND y2<=" + y2 + ") AND " + 
+                    
+            "(z1<=" + z1 + " AND z2>=" + z1 + " OR " + 
+            "z1<=" + z2 + " AND z2>=" + z2 + " OR " + 
+            "z1>=" + z1 + " AND z1<=" + z2 + " OR " + 
+            "z2>=" + z1 + " AND z2<=" + z2 + ") AND " + 
+            "world_name='" + ModDimensions.getWorldName(w) + "';");
+        return !list.isEmpty();
+    }
+    
     private ProtectionStatus getProtectionStatus(World w, BlockPos pos, EntityPlayer p)
     {
         ArrayList<Object> list = this.getFirstColumn(

+ 27 - 4
src/main/java/me/km/snuviscript/CommandScript.java

@@ -8,6 +8,8 @@ import java.util.Collection;
 import java.util.List;
 import java.util.Map;
 import me.hammerle.code.Script;
+import me.km.api.Utils;
+import me.km.exception.PlayerNotFoundException;
 import me.km.permissions.Permissions;
 import net.minecraft.command.ICommandSender;
 import net.minecraft.util.text.TextComponentString;
@@ -35,11 +37,24 @@ public class CommandScript extends ModuleCommand
                 case "s":
                 case "start":
                 {
-                    if(arg.length >= 2)
+                    if(arg.length == 2)
                     {
                         KajetansMod.scripts.startScript(cs, arg[1]);
                         return true;
                     }
+                    else if(arg.length > 2)
+                    {
+                        try
+                        {
+                            KajetansMod.scripts.startQuest(cs, arg[1], Utils.getPlayerByName(arg[2]));
+                        }
+                        catch(PlayerNotFoundException ex)
+                        {
+                            m.send(cs, GlobalText.cantFindPlayer(arg[2]));
+                            return true;
+                        }
+                        return true;
+                    }
                     break;
                 }
                 case "v":
@@ -202,9 +217,17 @@ public class CommandScript extends ModuleCommand
                         return true;
                     }
                     m.send(cs, "Folgende Scripts sind aktiv:");
-                    scripts.forEach(data ->
+                    scripts.forEach(sc ->
                     {
-                        m.sendHelpListElement(cs, data.getName(), "(" + data.getId() + ")");
+                        if(sc.getClass() == PlayerScript.class)
+                        {
+                            m.sendHelpListElement(cs, sc.getName(), "(" + sc.getId() + ")");
+                            ((PlayerScript) sc).getPlayers().forEach(p -> m.sendListElement(cs, p.getName()));
+                        }
+                        else
+                        {
+                            m.sendHelpListElement(cs, sc.getName(), "(" + sc.getId() + ")");
+                        }
                     });
                     return true;
                 }
@@ -244,7 +267,7 @@ public class CommandScript extends ModuleCommand
         }
         
         m.send(cs, "/script ...");
-        m.sendHelpListElement(cs, "start <script>", "Startet ein Script");
+        m.sendHelpListElement(cs, "start <script> [player]", "Startet ein Script");
         m.sendHelpListElement(cs, "variable <id> <name>", "Zeigt den Wert einer Variable");       
         m.sendHelpListElement(cs, "printvars <id> [starts]", "Zeigt alle Variablen");
         m.sendHelpListElement(cs, "printlists <id> [starts]", "Zeigt alle Listen");

+ 30 - 14
src/main/java/me/km/snuviscript/MinecraftFunctions.java

@@ -182,7 +182,7 @@ public class MinecraftFunctions implements ISnuviLogger
         parser.registerConsumer("player.settag", (args, qd) -> 
                 setTag(args));
         parser.registerFunction("player.gettag", (args, qd) -> 
-                getTag(args));
+                (double) getTag(args));
         parser.registerConsumer("player.dropinventory", (args, qd) -> 
                 dropInventory(args));
         parser.registerFunction("player.gettarget", (args, qd) -> 
@@ -369,13 +369,13 @@ public class MinecraftFunctions implements ISnuviLogger
         // Job-Bibliothek 
         // -------------------------------------------------------------  
         parser.registerFunction("job.getlevel", (args, qd) -> 
-                KajetansMod.jobs.getLevel((EntityPlayer) args[0], ScriptUtils.getByte(args[1])));
+                (double) KajetansMod.jobs.getLevel((EntityPlayer) args[0], ScriptUtils.getByte(args[1])));
         parser.registerConsumer("job.addlevel", (args, qd) -> 
                 KajetansMod.jobs.addLevel((EntityPlayer) args[0], ScriptUtils.getByte(args[1]), ScriptUtils.getByte(args[2])));
         parser.registerConsumer("job.setlevel", (args, qd) -> 
                 KajetansMod.jobs.setLevel((EntityPlayer) args[0], ScriptUtils.getByte(args[1]), ScriptUtils.getByte(args[2])));
         parser.registerFunction("job.getxp", (args, qd) -> 
-                KajetansMod.jobs.getXP((EntityPlayer) args[0], ScriptUtils.getByte(args[1])));
+                (double) KajetansMod.jobs.getXP((EntityPlayer) args[0], ScriptUtils.getByte(args[1])));
         parser.registerConsumer("job.addxp", (args, qd) -> 
                 KajetansMod.jobs.addXP((EntityPlayer) args[0], ScriptUtils.getByte(args[1]), ScriptUtils.getByte(args[2])));
         parser.registerConsumer("job.setxp", (args, qd) -> 
@@ -389,17 +389,17 @@ public class MinecraftFunctions implements ISnuviLogger
         parser.registerConsumer("job.registerskill", (args, qd) -> 
                 KajetansMod.jobs.registerSkill(ScriptUtils.getByte(args[0]), KajetansMod.skills.getSkill(ScriptUtils.getInt(args[1])), ScriptUtils.getByte(args[2]), ScriptUtils.getByte(args[3])));
         parser.registerFunction("job.getamount", (args, qd) -> 
-                KajetansMod.jobs.getNumberOfJobs());
+                (double) KajetansMod.jobs.getNumberOfJobs());
         parser.registerFunction("job.getname", (args, qd) -> 
                 KajetansMod.jobs.getJobName(ScriptUtils.getByte(args[0])));
         parser.registerFunction("job.geteffectlevel", (args, qd) -> 
-                EffectUtils.getEffectLevel((EntityPlayer) args[0], me.km.effects.Effect.valueOf(args[1].toString())));
+                (double) EffectUtils.getEffectLevel((EntityPlayer) args[0], me.km.effects.Effect.valueOf(args[1].toString())));
         parser.registerFunction("job.hasjob", (args, qd) -> 
                 KajetansMod.jobs.hasJob((EntityPlayer) args[0], ScriptUtils.getByte(args[1])));
         parser.registerFunction("job.hasrecipe", (args, qd) -> 
                 KajetansMod.jobs.hasRecipe((EntityPlayer) args[0], ScriptHelper.getItem(args[1].toString())));
         parser.registerConsumer("job.getjobs", (args, qd) -> 
-                qd.setVar(args[0].toString(), KajetansMod.jobs.getJobs((EntityPlayer) args[1])));
+                qd.setVar(args[0].toString(), KajetansMod.jobs.getJobs((EntityPlayer) args[1]).stream().map(b -> (double) b).collect(Collectors.toList())));
         parser.registerFunction("job.isregmaterial", (args, qd) -> 
                 KajetansMod.jobs.isPreferedMaterial((EntityPlayer) args[0],Block.getBlockFromName(args[1].toString())));
         parser.registerConsumer("job.setjob", (args, qd) -> 
@@ -564,7 +564,9 @@ public class MinecraftFunctions implements ISnuviLogger
                 KajetansMod.plots.getDataBank(ProtectionBank.class).canBuild(((Location) args[0]).getWorld(), ((Location) args[0]).getBlockPos(), (EntityPlayer) args[1]));
         parser.registerFunction("plot.getname", (args, qd) ->    
                 KajetansMod.plots.getDataBank(ProtectionBank.class).getFirstRegionName(((Location) args[0]).getWorld(), ((Location) args[0]).getBlockPos()));
-
+        parser.registerFunction("plot.doesintersect", (args, qd) ->    
+                doesIntersect(args));
+        
         // -------------------------------------------------------------  
         // Quest-Bibliothek   
         // -------------------------------------------------------------    
@@ -1094,7 +1096,7 @@ public class MinecraftFunctions implements ISnuviLogger
     private static boolean isSolid(Object[] args)
     {
         IBlockState state = getBlockState((Location) args[0]);
-        return !state.isTranslucent() && state.isFullBlock() && state.isOpaqueCube();
+        return state.isFullBlock() && state.isOpaqueCube();
     }
 
     private static void spawnItemFrame(Object[] args) throws IllegalStringLocationException, IllegalItemStackStringException
@@ -1178,14 +1180,28 @@ public class MinecraftFunctions implements ISnuviLogger
         ((EntityLivingBase) args[0]).attackEntityFrom(DamageSource.GENERIC, ScriptUtils.getFloat(args[1]));
     }
     
+    private static boolean doesIntersect(Object[] args)
+    {
+        Location l1 = (Location) args[0];
+        Location l2 = (Location) args[1];
+        int x1 = (int) Math.min(l1.getX(), l2.getX());
+        int x2 = (int) Math.max(l1.getX(), l2.getX());
+        int y1 = (int) Math.min(l1.getY(), l2.getY());
+        int y2 = (int) Math.max(l1.getY(), l2.getY());
+        int z1 = (int) Math.min(l1.getZ(), l2.getZ());
+        int z2 = (int) Math.max(l1.getZ(), l2.getZ());
+        return KajetansMod.plots.getDataBank(ProtectionBank.class)
+                .isPlotOverlapping(x1, y1, z1, x2, y2, z2, l1.getWorld());
+    }
+    
     private static boolean isBetween(Object[] args)
     {
-        Vec3d l1 = ((Location) args[0]).getPos();
-        Vec3d l2 = ((Location) args[1]).getPos();
-        Vec3d l3 = ((Location) args[2]).getPos();
-        return l1.x >= Math.min(l2.x, l3.x) && l1.x <= Math.max(l2.x, l3.x) &&
-                l1.y >= Math.min(l2.y, l3.y) && l1.y <= Math.max(l2.y, l3.y) &&
-                l1.z >= Math.min(l2.z, l3.z) && l1.z <= Math.max(l2.z, l3.z);
+        Location l1 = ((Location) args[0]);
+        Location l2 = ((Location) args[1]);
+        Location l3 = ((Location) args[2]);
+        return l1.getX() >= Math.min(l2.getX(), l3.getX()) && l1.getX() <= Math.max(l2.getX(), l3.getX()) &&
+                l1.getY() >= Math.min(l2.getY(), l3.getY()) && l1.getY() <= Math.max(l2.getY(), l3.getY()) &&
+                l1.getZ() >= Math.min(l2.getZ(), l3.getZ()) && l1.getZ() <= Math.max(l2.getZ(), l3.getZ());
     }
 
     private static void addPlot(Object[] args)

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

@@ -4,6 +4,7 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.stream.Collectors;
 import me.hammerle.code.SnuviParser;
+import me.km.KajetansMod;
 import net.minecraft.entity.player.EntityPlayer;
 
 public class PlayerScript extends MinecraftScript
@@ -16,6 +17,14 @@ public class PlayerScript extends MinecraftScript
         players = new ArrayList<>();
     }
 
+    @Override
+    public void onTerm() 
+    {
+        ScriptModule scm = KajetansMod.scripts;
+        this.setInvalid();
+        players.forEach(p -> scm.removePlayerFromScript(p, this));
+    }
+
     @Override
     protected void initExpansion(Object... o) 
     {

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

@@ -147,7 +147,7 @@ public class ScriptModule extends Module
         {
             return;
         }
-        if(qd.removePlayer(p))
+        if(qd.isValid() && qd.removePlayer(p))
         {
             parser.termSafe(qd);
         }       
@@ -180,7 +180,8 @@ public class ScriptModule extends Module
             addPlayerToQuest(p, other);
             return;
         }
-        parser.startScript(PlayerScript.class, name, ScriptUtils.readCode("scripts/" + name, ".txt"), false, p);
+        PlayerScript ps = parser.startScript(PlayerScript.class, name, ScriptUtils.readCode("scripts/" + name, ".txt"), false, p);
+        playerScript.put(p.getUniqueID(), ps.getId());
     }
     
     public void startScript(ICommandSender sender, String name)