瀏覽代碼

bugfixes, new snuvi script commands

Kajetan Johannes Hammerle 5 年之前
父節點
當前提交
3825d304cf

+ 21 - 19
src/main/java/me/km/KajetansMod.java

@@ -67,7 +67,7 @@ public class KajetansMod
 
     public static final String MODID = "km";
     public static final String NAME = "Kajetans Mod";
-    public static final String VERSION = "0.0.32";
+    public static final String VERSION = "0.0.33";
 
     @Mod.Instance(MODID)
     public static KajetansMod instance;
@@ -100,23 +100,25 @@ public class KajetansMod
                 {
                     try
                     {
-                        String[] parts = e.getMessage().split(" ");
-                        if(parts[0].equals("clear"))
-                        {
-                            ModPacketHandler.clearItemStacks(e.getPlayer());
-                        }
-                        else if(parts[0].equals("active"))
-                        {
-                            ModPacketHandler.setItemStackActive(e.getPlayer(), true);
-                        }
-                        else if(parts[0].equals("inactive"))
-                        {
-                            ModPacketHandler.setItemStackActive(e.getPlayer(), false);
-                        }
-                        else
-                        {
-                            ModPacketHandler.setItemStackIndex(e.getPlayer(), Byte.parseByte(parts[0]), Integer.parseInt(parts[1]), Integer.parseInt(parts[2]));
-                        }
+                        Field f = BlockStateContainer.class.getDeclaredField("storage");
+                        f.setAccessible(true);
+                        
+                        Field bit = BlockStateContainer.class.getDeclaredField("bits");
+                        bit.setAccessible(true);
+                        
+                        Field palette = BlockStateContainer.class.getDeclaredField("palette");
+                        palette.setAccessible(true);
+                        
+                        
+                        Chunk c = e.getPlayer().getServerWorld().getChunkFromBlockCoords(e.getPlayer().getPosition());
+                        System.out.println(c.x + " " + c.z);
+                        ExtendedBlockStorage st = c.getBlockStorageArray()[(int) (e.getPlayer().posY / 16)];
+                        BitArray array = (BitArray) f.get(st.getData());
+
+                        System.out.println(array.getBackingLongArray().length);
+                        System.out.println(array.size());
+                        System.out.println(bit.get(st.getData()));
+                        System.out.println(palette.get(st.getData()));
                     }
                     catch(Exception ex)
                     {
@@ -142,7 +144,7 @@ public class KajetansMod
     @Mod.EventHandler
     public void serverStarting(FMLServerStartingEvent e) 
     {      
-        singlePlayer = e.getServer().isSinglePlayer();
+        singlePlayer = e.getServer().isSinglePlayer();        
         if(singlePlayer)
         {
             return;

+ 0 - 1
src/main/java/me/km/blocks/ModBlocks.java

@@ -17,7 +17,6 @@ import net.minecraft.block.BlockPlanks;
 import net.minecraft.block.SoundType;
 import net.minecraft.block.material.MapColor;
 import net.minecraft.block.material.Material;
-import net.minecraft.creativetab.CreativeTabs;
 import net.minecraft.item.Item;
 import net.minecraft.item.ItemBlock;
 import net.minecraftforge.fml.common.registry.GameRegistry;

+ 1 - 1
src/main/java/me/km/chatmanager/ChatManager.java

@@ -71,7 +71,7 @@ public class ChatManager extends Module
     /** Gets all texts of the players ranks
      *
      * @param p a player
-     * @return rank texts as list, the list will never be empty due to  fallback
+     * @return rank texts as list, the list will never be empty due to fallback
      */
     public ArrayList<String> getRanks(EntityPlayer p)
     {

+ 1 - 1
src/main/java/me/km/commands/CommandBack.java

@@ -28,7 +28,7 @@ public class CommandBack extends ModuleCommand
             this.getModule().send(cs, GlobalText.onlyPlayer());
             return true;
         }
-        EntityPlayer p = (EntityPlayer) cs;    
+        EntityPlayer p = (EntityPlayer) cs;        
         Location l = KajetansMod.playerbank.getLastLocation(p);
         if(l != null)
         {

+ 1 - 1
src/main/java/me/km/commands/CommandCoords.java

@@ -33,7 +33,7 @@ public class CommandCoords extends ModuleCommand
         }
         EntityPlayer p = (EntityPlayer) cs;
         World w = cs.getEntityWorld();
-        BlockPos pos = Utils.getPlayerTarget(p, 8, true);
+        BlockPos pos = Utils.getPlayerTarget(p);
         if(w.isAirBlock(pos))
         {
             this.getModule().send(cs, "Du musst auf einen Block gerichtet sein.");

+ 10 - 19
src/main/java/me/km/events/CustomEventCaller.java

@@ -1,12 +1,10 @@
 package me.km.events;
 
 import java.util.ArrayList;
-import java.util.ConcurrentModificationException;
 import java.util.HashMap;
 import java.util.LinkedList;
 import me.hammerle.snuviscript.code.Script;
 import me.km.KajetansMod;
-import me.km.chatchannel.ChatChannel;
 import me.km.utils.ReflectionUtils;
 import net.minecraft.entity.Entity;
 import net.minecraft.entity.player.EntityPlayer;
@@ -77,6 +75,16 @@ public class CustomEventCaller
                 REMOVE_QUEUE.forEach(i -> MOVE_DATA.remove(i));
                 REMOVE_QUEUE.clear();
             }
+            
+            ARROWS.removeIf(arrow -> 
+            {
+                if(ReflectionUtils.getArrowTimeInGround(arrow) >= 1)
+                {
+                    MinecraftForge.EVENT_BUS.post(new ArrowHitGroundEvent(arrow));
+                    return true;
+                }
+                return false;
+            });
         }
     } 
     
@@ -103,23 +111,6 @@ public class CustomEventCaller
         }
     }
     
-    @SubscribeEvent
-    public void tickServer(TickEvent.ServerTickEvent e) 
-    {       
-        if(e.phase == TickEvent.Phase.END)
-        {
-            ARROWS.removeIf(arrow -> 
-            {
-                if(ReflectionUtils.getArrowTimeInGround(arrow) >= 1)
-                {
-                    MinecraftForge.EVENT_BUS.post(new ArrowHitGroundEvent(arrow));
-                    return true;
-                }
-                return false;
-            });
-        }
-    }
-    
     @SubscribeEvent
     public void onPlayerHurt(LivingHurtEvent e)
     {      

+ 20 - 1
src/main/java/me/km/networking/ItemStackDisplayGui.java

@@ -4,7 +4,6 @@ import java.lang.reflect.Field;
 import java.util.Map;
 import me.km.KajetansMod;
 import me.km.utils.ReflectionUtils;
-import net.minecraft.block.Block;
 import net.minecraft.client.Minecraft;
 import net.minecraft.client.gui.FontRenderer;
 import net.minecraft.client.gui.Gui;
@@ -61,8 +60,28 @@ public class ItemStackDisplayGui extends Gui
     
     private final static Field MAP_BOSS_INFO = ReflectionUtils.getField(GuiBossOverlay.class, "field_184060_g", "mapBossInfos");
     
+    //private final static long[] times = new long[1000];
+    //private static int index2 = 0;
+    //private static long sum = 0;
+    
     public void paint()
     {
+        /*long l = System.nanoTime();
+        
+        for(int i = 0; i < 40; i++)
+        {
+            mc.fontRenderer.drawStringWithShadow(
+                    "§üDas §0i§1s§2t §3e§4i§5n §6F§7a§8r§9b§ae§bn§ct§de§es§ft. Das §0i§1s§2t §3e§4i§5n §6F§7a§8r§9b§ae§bn§ct§de§es§ft.", 
+                    0, i * 9, 234);
+        }
+        
+        l = System.nanoTime() - l;
+        sum -= times[index2];
+        sum += l;
+        times[index2] = l;
+        index2 = (index2 + 1) % times.length;
+        System.out.println(sum / times.length);
+        */
         if(inactive)
         {
             return;

+ 6 - 1
src/main/java/me/km/snuviscript/CommandScript.java

@@ -13,6 +13,7 @@ import me.km.exception.PlayerNotFoundException;
 import me.km.permissions.Permissions;
 import net.minecraft.command.ICommandSender;
 import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.EntityPlayerMP;
 
 public class CommandScript extends ModuleCommand
 {
@@ -234,7 +235,11 @@ public class CommandScript extends ModuleCommand
                     scripts.forEach(sc ->
                     {
                         m.sendHelpListElement(cs, sc.getSimpleName(), "(" + sc.getId() + ")");
-                        KajetansMod.scripts.getPlayerList(sc.getId()).forEach(p -> m.sendListElement(cs, p.getName()));
+                        KajetansMod.scripts.getPlayerList(sc.getId()).forEach(uuid -> 
+                        {
+                            EntityPlayerMP p = KajetansMod.server.getPlayerList().getPlayerByUUID(uuid);
+                            m.sendListElement(cs, p == null ? "null" : p.getName());
+                        });
                     });
                     return true;
                 }

+ 56 - 9
src/main/java/me/km/snuviscript/MinecraftFunctions.java

@@ -78,6 +78,7 @@ import me.km.table.TableAPI;
 import net.minecraft.block.BlockCrops;
 import net.minecraft.entity.item.EntityItem;
 import net.minecraft.item.Item;
+import net.minecraft.server.management.PlayerList;
 import net.minecraft.util.NonNullList;
 import net.minecraft.util.math.MathHelper;
 import net.minecraft.util.text.ITextComponent;
@@ -381,7 +382,7 @@ public class MinecraftFunctions
             doForGroup(in[0].get(sc), sc, p -> ((EntityPlayerMP) p).sendStatusMessage(text, true));
             return Void.TYPE; 
         }); 
-        parser.registerFunction("player.kick", (sc, in) -> KajetansMod.scripts.unregisterPlayer((EntityPlayer) in[0].get(sc)));  
+        parser.registerFunction("player.kick", (sc, in) -> KajetansMod.scripts.unregisterPlayer(sc, (EntityPlayer) in[0].get(sc)));  
         parser.registerFunction("player.playsound", (sc, in) -> 
         { 
             EffectUtils.playSound((EntityPlayerMP) in[0].get(sc), SoundEvent.REGISTRY.getObject(new ResourceLocation(in[1].getString(sc))), SoundCategory.MASTER);
@@ -661,11 +662,14 @@ public class MinecraftFunctions
             ((Location) in[0].get(sc)).setYaw(in[1].getFloat(sc)); 
             return Void.TYPE; 
         });  
+        parser.registerFunction("loc.getyaw", (sc, in) -> (double) ((Location) in[0].get(sc)).getYaw());  
         parser.registerFunction("loc.setpitch", (sc, in) -> 
         { 
             ((Location) in[0].get(sc)).setPitch(in[1].getFloat(sc)); 
             return Void.TYPE;
         });  
+        parser.registerFunction("loc.getpitch", (sc, in) -> (double) ((Location) in[0].get(sc)).getPitch());
+        parser.registerFunction("loc.getworld", (sc, in) -> ((Location) in[0].get(sc)).getWorld());  
         parser.registerFunction("loc.distance", (sc, in) -> ((Location) in[0].get(sc)).getPos().distanceTo(((Location) in[1].get(sc)).getPos()));  
         parser.registerFunction("loc.mod", (sc, in) -> ((Location) in[0].get(sc)).copyAdd(in[1].getDouble(sc), in[2].getDouble(sc), in[3].getDouble(sc)));
         parser.registerFunction("loc.getcoord", (sc, in) -> 
@@ -724,8 +728,9 @@ public class MinecraftFunctions
         });
         parser.registerFunction("block.clone", (sc, in) -> 
         { 
-            Location l = (Location) in[1].get(sc);
-            NBTUtils.cloneBlock(l.getWorld(), ((Location) in[0].get(sc)).getBlockPos(), l.getBlockPos());
+            Location l0 = (Location) in[0].get(sc);
+            Location l1 = (Location) in[1].get(sc);
+            NBTUtils.cloneBlock(l0.getWorld(), l0.getBlockPos(), l1.getWorld(), l1.getBlockPos());
             return Void.TYPE; 
         });
         parser.registerFunction("block.set", (sc, in) -> 
@@ -801,6 +806,33 @@ public class MinecraftFunctions
             }        
             return (double) InventoryUtils.searchInventoryFor((TileEntityChest) te, (ItemStack) in[2].get(sc), in[1].getBoolean(sc));
         });
+        parser.registerFunction("block.getsecchest", (sc, in) -> 
+        { 
+            Location l = (Location) in[0].get(sc);
+            TileEntity te = l.getWorld().getTileEntity(l.getBlockPos());
+            if(te == null || !(te instanceof TileEntityChest))
+            {
+                return null;
+            }        
+            TileEntityChest chest = (TileEntityChest) te;
+            if(chest.adjacentChestXNeg != null)
+            {
+                return chest.adjacentChestXNeg.getPos();
+            }
+            if(chest.adjacentChestXPos != null)
+            {
+                return chest.adjacentChestXPos.getPos();
+            }
+            if(chest.adjacentChestZNeg != null)
+            {
+                return chest.adjacentChestZNeg.getPos();
+            }
+            if(chest.adjacentChestZPos != null)
+            {
+                return chest.adjacentChestZPos.getPos();
+            }
+            return null;
+        });
         parser.registerFunction("block.additem", (sc, in) -> 
         { 
             Location l = (Location) in[0].get(sc);
@@ -869,7 +901,7 @@ public class MinecraftFunctions
         // ---------------------------------------------------------------------    
         // Event-Bibliothek 
         // ---------------------------------------------------------------------  
-        parser.registerFunction("event.addmovedata", (sc, in) -> CustomEventCaller.registerMoveData(new PlayerMoveData(
+        parser.registerFunction("event.addmovedata", (sc, in) -> (double) CustomEventCaller.registerMoveData(new PlayerMoveData(
                 sc, (Location) in[0].get(sc), (Location) in[1].get(sc), in[2].getInt(sc), in[3].getInt(sc))));
         parser.registerFunction("event.removemovedata", (sc, in) -> 
         { 
@@ -1339,7 +1371,14 @@ public class MinecraftFunctions
         // ---------------------------------------------------------------------  
         parser.registerFunction("gdmap.removeall", (sc, in) -> 
         {    
-            KajetansMod.scripts.getDataBank(ScriptBank.class).removeDualMap(in[0].getString(sc)); 
+            if(in.length >= 2)
+            {
+                KajetansMod.scripts.getDataBank(ScriptBank.class).removeDualMapElement(in[0].getString(sc), in[1].getString(sc)); 
+            }
+            else
+            {
+                KajetansMod.scripts.getDataBank(ScriptBank.class).removeDualMap(in[0].getString(sc)); 
+            }
             return Void.TYPE; 
         });
         parser.registerFunction("gdmap.add", (sc, in) -> 
@@ -1528,15 +1567,15 @@ public class MinecraftFunctions
         });
         parser.registerFunction("script.get", (sc, in) -> KajetansMod.scripts.getScript(in[0].getString(sc)));
         parser.registerFunction("script.join", (sc, in) -> KajetansMod.scripts.registerPlayer((Script) in[0].get(sc), (EntityPlayer) in[1].get(sc)));
-        parser.registerFunction("script.kick", (sc, in) -> KajetansMod.scripts.unregisterPlayer((EntityPlayer) in[0].get(sc)));
+        parser.registerFunction("script.kick", (sc, in) -> KajetansMod.scripts.unregisterPlayer(sc, (EntityPlayer) in[0].get(sc)));
         parser.registerFunction("script.getleader", (sc, in) -> 
         { 
-            List<EntityPlayer> players = KajetansMod.scripts.getPlayerList(sc.getId());
+            List<UUID> players = KajetansMod.scripts.getPlayerList(sc.getId());
             if(players.isEmpty())
             {
                 return null;
             }
-            return players.get(0);
+            return KajetansMod.server.getPlayerList().getPlayerByUUID(players.get(0));
         });
 
         // ---------------------------------------------------------------------  
@@ -1913,7 +1952,15 @@ public class MinecraftFunctions
             switch(group.toString()) 
             {
                 case "all":
-                    KajetansMod.scripts.getPlayerList(sc.getId()).forEach(p -> c.accept(p));
+                    PlayerList list = KajetansMod.server.getPlayerList();
+                    KajetansMod.scripts.getPlayerList(sc.getId()).forEach(uuid -> 
+                    {
+                        EntityPlayerMP p = list.getPlayerByUUID(uuid);
+                        if(p != null)
+                        {
+                            c.accept(p);
+                        }
+                    });
                     break;
                 case "online":
                     KajetansMod.server.getPlayerList().getPlayers().forEach(p -> c.accept(p));

+ 9 - 2
src/main/java/me/km/snuviscript/ScriptBank.java

@@ -145,12 +145,19 @@ public class ScriptBank extends SimpleDataBank
                 + "ON DUPLICATE KEY UPDATE value='" + value + "';", false);
     }
     
+    public void removeDualMapElement(String map, String key)
+    {
+        this.update("DELETE FROM questdualmaps WHERE "
+                + "map = '" + map + "' AND "
+                + "keyname = '" + key + "';", false);
+    }
+    
     public void removeDualMapElement(String map, String key, String key2)
     {
         this.update("DELETE FROM questdualmaps WHERE "
                 + "map = '" + map + "' AND "
-                + "seckeyname= '" + key + "' AND "
-                + "keyname = '" + key2 + "';", false);
+                + "seckeyname= '" + key2 + "' AND "
+                + "keyname = '" + key + "';", false);
     }
     
     public void removeDualMap(String map)

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

@@ -110,7 +110,7 @@ public class ScriptEvents extends ModuleListener
     {      
         handleEvent(p, "player_move", sc -> 
         {
-            sc.setVar("id", id);
+            sc.setVar("id", (double) id);
         });
     }
     

+ 14 - 10
src/main/java/me/km/snuviscript/ScriptModule.java

@@ -22,7 +22,7 @@ public class ScriptModule extends Module
     private final SnuviParser parser;
     protected final SnuviLogger logger;
     private final HashMap<UUID, Integer> playerScript;   
-    private final HashMap<Integer, List<EntityPlayer>> registeredPlayers; 
+    private final HashMap<Integer, List<UUID>> registeredPlayers; 
     private final HashSet<String> scriptCommands;
     
     public ScriptModule(String mname, String prefix, TextFormatting color) 
@@ -72,14 +72,14 @@ public class ScriptModule extends Module
     // player script
     // -------------------------------------------------------------------------
 
-    public List<EntityPlayer> getPlayerList(int id)
+    public List<UUID> getPlayerList(int id)
     {
         return registeredPlayers.getOrDefault(id, Collections.EMPTY_LIST);
     }
     
-    private List<EntityPlayer> getOrCreatePlayerList(int id)
+    private List<UUID> getOrCreatePlayerList(int id)
     {
-        List<EntityPlayer> list = registeredPlayers.get(id);
+        List<UUID> list = registeredPlayers.get(id);
         if(list == null)
         {
             list = new ArrayList<>();
@@ -94,7 +94,7 @@ public class ScriptModule extends Module
         {
             return false;
         }       
-        getOrCreatePlayerList(sc.getId()).add(p);
+        getOrCreatePlayerList(sc.getId()).add(p.getUniqueID());
         ScriptVars.setPlayerVars(sc, p); 
         parser.callEvent("player_join", sc, null, null);
         return true;
@@ -137,19 +137,19 @@ public class ScriptModule extends Module
         return sc;
     }
     
-    public boolean unregisterPlayer(EntityPlayer p)
+    public boolean unregisterPlayer(Script callingScript, EntityPlayer p)
     {
         Integer id = playerScript.remove(p.getUniqueID());
         if(id == null)
         {
             return false;
         }
-        List<EntityPlayer> list = registeredPlayers.get(id);
+        List<UUID> list = registeredPlayers.get(id);
         if(list == null)
         {
             return false;
         }
-        boolean b = list.remove(p);
+        boolean b = list.remove(p.getUniqueID());
         if(list.isEmpty())
         {
             Script sc = parser.getScript(id);
@@ -158,6 +158,10 @@ public class ScriptModule extends Module
                 ChatChannel.getDevChannel().sendWarning("Das ungültige Script von '" + p.getName() + "' wurde entfernt. (2)");
                 return true;
             }
+            if(sc != callingScript)
+            {
+                parser.callEvent("player_kicked", sc, (innerSc) -> ScriptVars.setPlayerVars(innerSc, p), null);
+            }
             parser.termSafe(sc);
         }
         return b;
@@ -184,10 +188,10 @@ public class ScriptModule extends Module
         {
             int id = sc.getId();
             playerScript.put(p.getUniqueID(), id);
-            getOrCreatePlayerList(id).add(p);
+            getOrCreatePlayerList(id).add(p.getUniqueID());
         }, sc -> 
         {
-            getPlayerList(sc.getId()).forEach(pl -> playerScript.remove(pl.getUniqueID()));
+            getPlayerList(sc.getId()).forEach(uuid -> playerScript.remove(uuid));
             registeredPlayers.remove(sc.getId());
             
             CustomEventCaller.removeScriptData(sc);

+ 3 - 3
src/main/java/me/km/utils/NBTUtils.java

@@ -126,7 +126,7 @@ public class NBTUtils
     }
     
     @SuppressWarnings(value = {"unchecked", "deprecation"})
-    public static void cloneBlock(World w, BlockPos oldPos, BlockPos newPos)
+    public static void cloneBlock(World w, BlockPos oldPos, World newW, BlockPos newPos)
     {
         if(oldPos.equals(newPos))
         {
@@ -144,10 +144,10 @@ public class NBTUtils
             }
         }
 
-        w.setBlockState(newPos, state);
+        newW.setBlockState(newPos, state);
         if(nbt != null)
         {
-            TileEntity te = w.getTileEntity(newPos);
+            TileEntity te = newW.getTileEntity(newPos);
             if(te != null)
             {
                 nbt.setInteger("x", newPos.getX());

二進制
src/main/resources/assets/km/textures/gui/icons.png