Browse Source

implemented a player head display, scaleable anywhere at the screen

Kajetan Johannes Hammerle 6 years ago
parent
commit
ab9cdc95de

+ 2 - 0
src/main/java/me/km/ClientEvents.java

@@ -2,6 +2,7 @@ package me.km;
 
 import java.util.List;
 import me.km.networking.PlayerDisplayGui;
+import me.km.networking.PlayerHeadGui;
 import me.km.networking.StatusDisplayGui;
 import net.minecraft.item.Item;
 import net.minecraft.item.ItemArmor;
@@ -59,6 +60,7 @@ public class ClientEvents
         {
             PlayerDisplayGui.INSTANCE.paint();
             StatusDisplayGui.INSTANCE.paint();
+            PlayerHeadGui.INSTANCE.paint();
         }
     }
     

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

@@ -11,8 +11,6 @@ import me.km.data.DataManager;
 import me.km.databank.DataBank;
 import me.km.dimensions.ModWorldGeneration;
 import me.km.dimensions.WorldData;
-import me.km.inventory.InventoryBase;
-import me.km.items.ModItems;
 import me.km.jobsystem.JobAPI;
 import me.km.networking.ModPacketHandler;
 import me.km.permissions.PermissionManager;
@@ -23,7 +21,6 @@ import me.km.scoreboard.ScoreboardAPI;
 import me.km.skills.SkillManager;
 import me.km.snuviscript.ScriptModule;
 import me.km.snuviscript.ScriptBank;
-import net.minecraft.item.ItemStack;
 import net.minecraft.server.MinecraftServer;
 import net.minecraft.util.text.TextFormatting;
 import net.minecraftforge.fluids.FluidRegistry;
@@ -106,10 +103,20 @@ public class KajetansMod
                     {
                         net.minecraft.entity.player.EntityPlayerMP p = e.getPlayer();
                         String[] parts = e.getMessage().split(" ");
-                        int color = (Integer.parseInt(parts[0]) << 16) | (Integer.parseInt(parts[1]) << 8) | Integer.parseInt(parts[2]);
+                        /*int color = (Integer.parseInt(parts[0]) << 16) | (Integer.parseInt(parts[1]) << 8) | Integer.parseInt(parts[2]);
                         ItemStack stack = new ItemStack(ModItems.jewel);
                         ModItems.jewel.setColor(stack, color);
-                        p.addItemStackToInventory(stack);
+                        p.addItemStackToInventory(stack);*/
+                        /*switch(parts[0])
+                        {   
+                            case "head":
+                                ModPacketHandler.sendToHead(p, Byte.parseByte(parts[1]), Byte.parseByte(parts[2]), 
+                                        parts[3], Integer.parseInt(parts[4]), Integer.parseInt(parts[5]), Byte.parseByte(parts[6]));
+                                break;
+                            case "t":
+                                ModPacketHandler.sendToDisplay(p, (byte) 1, Byte.parseByte(parts[1]), parts[2]);
+                                break;
+                        }*/
                     }
                     catch(Exception ex)
                     {

+ 5 - 5
src/main/java/me/km/networking/Icon.java

@@ -26,12 +26,12 @@ public enum Icon
     HALF_ENERGY(18, 36, 9, 9),
     EMPTY_ENERGY(27, 36, 9, 9);
         
-    private static Icon[] icons = Icon.values();
+    private static final Icon[] icons = Icon.values();
             
-    private int offsetX;
-    private int offsetY;
-    private int width;
-    private int height;
+    private final int offsetX;
+    private final int offsetY;
+    private final int width;
+    private final int height;
         
     Icon(int offsetX, int offsetY, int width, int height)
     {

+ 6 - 0
src/main/java/me/km/networking/ModPacketHandler.java

@@ -24,6 +24,7 @@ public class ModPacketHandler
         INSTANCE.registerMessage(CampFireInventory.Handler.class, CampFireInventory.class, id++, Side.CLIENT);
         INSTANCE.registerMessage(SeasonUpdate.Handler.class, SeasonUpdate.class, id++, Side.CLIENT);
         INSTANCE.registerMessage(StatusDisplay.Handler.class, StatusDisplay.class, id++, Side.CLIENT);
+        INSTANCE.registerMessage(PlayerHead.Handler.class, PlayerHead.class, id++, Side.CLIENT);
     }
     
     public static void sendToDisplay(EntityPlayerMP p, byte action, byte index, String text)
@@ -87,4 +88,9 @@ public class ModPacketHandler
     {
         INSTANCE.sendTo(new StatusDisplay((byte) 3, (byte) 0, ""), p);
     }
+    
+    public static void sendToHead(EntityPlayerMP p, byte action, byte index, String name, int x, int y, byte scale)
+    {
+        INSTANCE.sendTo(new PlayerHead(action, index, name, x, y, scale), p);
+    }
 }

+ 1 - 0
src/main/java/me/km/networking/PlayerDisplayGui.java

@@ -5,6 +5,7 @@ import java.util.TreeMap;
 import me.km.KajetansMod;
 import net.minecraft.client.Minecraft;
 import net.minecraft.client.gui.Gui;
+import net.minecraft.client.network.NetworkPlayerInfo;
 import net.minecraft.client.renderer.GlStateManager;
 import net.minecraft.util.ResourceLocation;
 import net.minecraftforge.fml.relauncher.Side;

+ 114 - 0
src/main/java/me/km/networking/PlayerHead.java

@@ -0,0 +1,114 @@
+package me.km.networking;
+
+import io.netty.buffer.ByteBuf;
+import java.nio.charset.StandardCharsets;
+import net.minecraft.client.Minecraft;
+import net.minecraftforge.fml.common.network.simpleimpl.IMessage;
+import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler;
+import net.minecraftforge.fml.common.network.simpleimpl.MessageContext;
+
+public class PlayerHead implements IMessage
+{
+    // 1 - add - index, name, x, y, scale
+    // 2 - remove - index
+    // 3 - clear
+    private byte action;
+    private byte index;
+    private String name;
+    private int x;
+    private int y;
+    private byte scale;
+    
+    public PlayerHead() 
+    {
+        action = -1;
+        index = -1;
+        name = "";
+        x = -1;
+        y = -1;
+        scale = -1;
+    }
+    
+    public PlayerHead(byte action, byte index, String name, int x, int y, byte scale) 
+    {
+        this.action = action;
+        this.index = index;
+        if(name.length() > 16)
+        {
+            this.name = name.substring(0, 16);
+        }
+        else
+        {
+            this.name = name;
+        }
+        this.x = x;
+        this.y = y;
+        this.scale = scale;
+    }
+    
+    @Override
+    public void fromBytes(ByteBuf buf) 
+    {
+        action = buf.readByte();
+        switch(action)
+        {
+            case 1:
+                x = buf.readInt();
+                y = buf.readInt();
+                scale = buf.readByte();
+                index = buf.readByte();
+                int length = buf.readInt();
+                name = buf.readBytes(length).toString(StandardCharsets.UTF_8);
+                break;
+            case 2:
+                index = buf.readByte();
+                break;
+        }
+    }
+
+    @Override
+    public void toBytes(ByteBuf buf) 
+    {
+        buf.writeByte(action);
+        switch(action)
+        {
+            case 1:
+                buf.writeInt(x);
+                buf.writeInt(y);
+                buf.writeByte(scale);
+                buf.writeByte(index);
+                byte[] b = name.getBytes(StandardCharsets.UTF_8);
+                buf.writeInt(b.length);
+                buf.writeBytes(b);
+                break;
+            case 2:
+                buf.writeByte(index);
+                break;
+        }
+    }
+
+    public static class Handler implements IMessageHandler<PlayerHead, IMessage>
+    {
+        @Override
+        public IMessage onMessage(PlayerHead message, MessageContext ctx) 
+        {
+            Minecraft mc = net.minecraft.client.Minecraft.getMinecraft();
+            mc.addScheduledTask(() -> 
+            {
+                switch(message.action)
+                {
+                    case 1:
+                        PlayerHeadGui.INSTANCE.add(message.index, message.x, message.y, message.scale, message.name);
+                        break;
+                    case 2:
+                        PlayerHeadGui.INSTANCE.remove(message.index);
+                        break;
+                    case 3: 
+                        PlayerHeadGui.INSTANCE.clear();
+                        break;
+                }
+            });
+            return null;
+        }
+    }
+}

+ 71 - 0
src/main/java/me/km/networking/PlayerHeadGui.java

@@ -0,0 +1,71 @@
+package me.km.networking;
+
+import java.util.TreeMap;
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.gui.Gui;
+import net.minecraft.client.network.NetworkPlayerInfo;
+import net.minecraft.util.ResourceLocation;
+import net.minecraftforge.fml.relauncher.Side;
+import net.minecraftforge.fml.relauncher.SideOnly;
+
+@SideOnly(Side.CLIENT)
+public class PlayerHeadGui extends Gui
+{
+    public final static PlayerHeadGui INSTANCE = new PlayerHeadGui(Minecraft.getMinecraft());
+
+    private class HeadData
+    {
+        private final int x;
+        private final int y;
+        private final int scale;
+        private final ResourceLocation rl;
+        
+        public HeadData(int x, int y, int scale, ResourceLocation rl)
+        {
+            this.x = x;
+            this.y = y;
+            this.scale = scale;
+            this.rl = rl;
+        }
+        
+        public void paint(Minecraft mc)
+        {
+            mc.getTextureManager().bindTexture(rl);
+            Gui.drawScaledCustomSizeModalRect(x, y, 8, 8, 8, 8, 8 * scale, 8 * scale, 64.0F, 64.0F);
+            Gui.drawScaledCustomSizeModalRect(x, y, 40, 8, 8, 8, 8 * scale, 8 * scale, 64.0F, 64.0F);
+        }
+    }
+    
+    private final TreeMap<Integer, HeadData> data;
+    private final Minecraft mc;
+    
+    public PlayerHeadGui(Minecraft mc)
+    {
+        this.mc = mc;
+        this.data = new TreeMap<>(); 
+    }
+    
+    public void add(int i, int x, int y, int scale, String name)
+    {
+        NetworkPlayerInfo info = this.mc.player.connection.getPlayerInfo(name);
+        if(info != null)
+        {
+            data.put(i, new HeadData(x, y, scale, info.getLocationSkin()));
+        }
+    }
+    
+    public void remove(int i)
+    {
+        data.remove(i);
+    }
+    
+    public void clear()
+    {
+        data.clear();
+    }
+    
+    public void paint()
+    {
+        data.values().forEach(head -> head.paint(mc));
+    }
+}

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

@@ -1537,6 +1537,31 @@ public class MinecraftFunctions
             return Void.TYPE; 
         });
         
+        // ---------------------------------------------------------------------  
+        // Head-Bibliothek   
+        // ---------------------------------------------------------------------  
+        parser.registerFunction("head.add", (sc, in) -> 
+        {  
+            byte id = in[1].getFraction(sc).byteValue();
+            String name = in[2].getString(sc);
+            int x = in[3].getInt(sc);
+            int y = in[4].getInt(sc);
+            byte scale = in[5].getFraction(sc).byteValue();
+            doForGroup(in[0].get(sc), sc, p -> ModPacketHandler.sendToHead((EntityPlayerMP) p, (byte) 1, id, name, x, y, scale));
+            return Void.TYPE; 
+        }); 
+        parser.registerFunction("head.remove", (sc, in) -> 
+        {  
+            byte id = in[1].getFraction(sc).byteValue();
+            doForGroup(in[0].get(sc), sc, p -> ModPacketHandler.sendToHead((EntityPlayerMP) p, (byte) 2, id, "", -1, -1, (byte) -1));
+            return Void.TYPE; 
+        });
+        parser.registerFunction("head.reset", (sc, in) -> 
+        {  
+            doForGroup(in[0].get(sc), sc, p -> ModPacketHandler.sendToHead((EntityPlayerMP) p, (byte) 3, (byte) -1, "", -1, -1, (byte) -1));
+            return Void.TYPE; 
+        });
+        
         // ---------------------------------------------------------------------  
         // Effect-Bibliothek   
         // ---------------------------------------------------------------------