Browse Source

graphic update of icons, sling and itemstack-icons; left click air
event; itemstack display works with skill icons, multiline editable
entity names including players, bugfixes

Kajetan Johannes Hammerle 4 years ago
parent
commit
5e500f3bac

+ 1 - 1
build.gradle

@@ -27,7 +27,7 @@ minecraft {
             workingDirectory project.file('run')
             property 'forge.logging.markers', 'SCAN,REGISTRIES,REGISTRYDUMP'
             property 'forge.logging.console.level', 'info'
-            args '--username', 'kajetanjohannes'
+            args '--username', 'kajetanjohanne'
         }
 
         server {

+ 47 - 2
src/main/java/me/km/Client.java

@@ -1,5 +1,6 @@
 package me.km;
 
+import com.mojang.blaze3d.platform.GlStateManager;
 import java.awt.Color;
 import java.util.List;
 import me.km.blocks.ModBlocks;
@@ -11,6 +12,7 @@ import me.km.items.ModelCylinder;
 import me.km.items.ModelHat;
 import me.km.networking.ItemStackDisplayGui;
 import me.km.networking.KeyManager;
+import me.km.networking.ModPacketHandler;
 import me.km.networking.PlayerDisplayGui;
 import me.km.networking.PlayerHeadGui;
 import me.km.networking.StatusDisplayGui;
@@ -22,6 +24,8 @@ import net.minecraft.client.gui.screen.Screen;
 import net.minecraft.client.renderer.color.BlockColors;
 import net.minecraft.client.renderer.color.IBlockColor;
 import net.minecraft.client.renderer.color.ItemColors;
+import net.minecraft.client.renderer.entity.LivingRenderer;
+import net.minecraft.entity.LivingEntity;
 import net.minecraft.item.Item;
 import net.minecraft.item.ArmorItem;
 import net.minecraft.item.BlockItem;
@@ -37,21 +41,25 @@ import net.minecraftforge.api.distmarker.Dist;
 import net.minecraftforge.api.distmarker.OnlyIn;
 import net.minecraftforge.client.event.GuiScreenEvent;
 import net.minecraftforge.client.event.RenderGameOverlayEvent;
+import net.minecraftforge.client.event.RenderLivingEvent;
 import net.minecraftforge.common.MinecraftForge;
 import net.minecraftforge.event.entity.player.ItemTooltipEvent;
 import net.minecraftforge.eventbus.api.SubscribeEvent;
 import net.minecraftforge.event.TickEvent;
+import net.minecraftforge.event.entity.player.PlayerInteractEvent;
 
 @OnlyIn(Dist.CLIENT)
 public class Client 
 {   
     public final static ModelCylinder CYLINDER = new ModelCylinder(1.0f);
     public final static ModelHat STRAW_HAT = new ModelHat(1.0f);
+    public static KeyManager keyManager = null;
     
     public static void init() 
     {
         MinecraftForge.EVENT_BUS.register(new Client());
-        MinecraftForge.EVENT_BUS.register(new KeyManager());
+        keyManager = new KeyManager();
+        MinecraftForge.EVENT_BUS.register(keyManager);
         registerColors();
         ClientReflectionUtils.updatePlayerRenderer();
         ClientReflectionUtils.updateFluidRenderer();
@@ -104,6 +112,43 @@ public class Client
         }  
     }
     
+    @SubscribeEvent
+    public void onClientTick(RenderLivingEvent.Specials.Pre e)
+    {
+        e.setCanceled(true);
+        
+        LivingRenderer lr = e.getRenderer();
+        LivingEntity liv = e.getEntity();
+        if(ClientReflectionUtils.canRenderName(lr, liv)) 
+        {
+            double distance = liv.getDistanceSq(lr.getRenderManager().info.getProjectedView());
+            float f = liv.shouldRenderSneaking() ? 32.0F : 64.0F;
+            if (!(distance >= (double)(f * f))) 
+            {
+                ITextComponent text = liv.getCustomName();
+                if(text == null)
+                {
+                    text = liv.getDisplayName();
+                }
+                String s = text.getFormattedText();
+                String[] parts = s.split("\n");
+                GlStateManager.alphaFunc(516, 0.1F);
+                double y = e.getY();
+                for(String p : parts)
+                {
+                    ClientReflectionUtils.renderEntityName(lr, liv, e.getX(), y, e.getZ(), p, distance);
+                    y += 9.0 * 1.15 * 0.025;
+                }
+            }
+        }
+    }
+    
+    @SubscribeEvent
+    public void onEmptyLeftClick(PlayerInteractEvent.LeftClickEmpty e)
+    {
+        ModPacketHandler.sendLeftClickEmpty();
+    }
+    
     @SubscribeEvent
     public void onRenderGui(RenderGameOverlayEvent.Pre e)
     {
@@ -121,7 +166,7 @@ public class Client
             PlayerDisplayGui.INSTANCE.paint();
             StatusDisplayGui.INSTANCE.paint();
             PlayerHeadGui.INSTANCE.paint();
-            ItemStackDisplayGui.INSTANCE.paint();
+            ItemStackDisplayGui.INSTANCE.paint(keyManager);
         }
     }
 

+ 4 - 0
src/main/java/me/km/blocks/BlockLantern.java

@@ -106,6 +106,10 @@ public class BlockLantern extends DirectionalBlock
     public boolean isValidPosition(BlockState state, IWorldReader w, BlockPos pos)
     {
         Direction direction = state.get(FACING);
+        if(direction == Direction.UP)
+        {
+            return func_220055_a(w, pos.down(), Direction.UP);
+        }
         BlockPos blockpos = pos.offset(direction.getOpposite());
         BlockState blockstate = w.getBlockState(blockpos);
         return Block.hasSolidSide(blockstate, w, blockpos, direction);

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

@@ -119,7 +119,11 @@ public enum Icon
     BRONZE_HAMMER(63, 90, 9, 9),
     COPPER_HAMMER(72, 90, 9, 9),
     STONE_HAMMER(81, 90, 9, 9),
-    WOOD_HAMMER(90, 90, 9, 9);
+    WOOD_HAMMER(90, 90, 9, 9),
+    
+    FISHING_ROD(18, 45, 9, 9),
+    SLING(9, 45, 9, 9),
+    CROSS_BOW(0, 45, 9, 9);
         
     private static final Icon[] icons = Icon.values();
             

+ 67 - 21
src/main/java/me/km/networking/ItemStackDisplayGui.java

@@ -17,14 +17,58 @@ public class ItemStackDisplayGui extends AbstractGui
     
     public final static ItemStackDisplayGui INSTANCE = new ItemStackDisplayGui(Minecraft.getInstance());
     
+    private static class Stack
+    {
+        private int x = -1;
+        private int y = 0;
+        private int width = 0;
+        private int height = 0;
+        private String text = "";
+        
+        public void setIcon(int index, int c)
+        {
+            if(index < 0)
+            {
+                clear();
+            }
+            else if(index >= 0 && index < 104)
+            {
+                x = (index % 52) * 16 + 192;
+                y = (index / 52) * 16;
+                width = 16;
+                height = 16;
+                text = (c == 0) ? "" : String.valueOf(c);
+            }
+            else
+            {
+                index -= 104;
+                x = (index % 16) * 64;
+                y = (index / 16) * 64 + 32;
+                width = 64;
+                height = 64;
+                text = null;
+            }
+        }
+        
+        public void clear()
+        {
+            x = -1;
+        }
+    }
+    
     private final Minecraft mc;
-    private final int[] icons = new int[27];
+    
+    private final Stack[] icons = new Stack[9];
     private boolean inactive = true;
     
     public ItemStackDisplayGui(Minecraft mc)
     {
         this.mc = mc;
-        clear();
+        
+        for(int i = 0; i < icons.length; i++)
+        {
+            icons[i] = new Stack();
+        }
     }  
     
     public void setActive(boolean active)
@@ -36,24 +80,19 @@ public class ItemStackDisplayGui extends AbstractGui
     {
         if(index >= 0 && index < 9)
         {
-            index *= 3;
-            icons[index] = i < 8 ? 192 + ((i % 4) << 4) : (((i - 8) & 0xF) << 4);
-            icons[index + 1] = i < 8 ? (i / 4) << 4 : 32 + (((i - 8) >> 4) << 4);
-            icons[index + 2] = count;
+            icons[index].setIcon(i, count);
         }
     }
     
     public final void clear()
     {
-        for(int i = 0; i < 27; i += 3)
+        for(Stack stack : icons)
         {
-            icons[i] = -1;
-            icons[i + 1] = 0;
-            icons[i + 2] = 0;
+            stack.clear();
         }
     }
     
-    public void paint()
+    public void paint(KeyManager km)
     {
         if(inactive)
         {
@@ -73,31 +112,38 @@ public class ItemStackDisplayGui extends AbstractGui
             y += 20;
         }
         
-        blit(screenWidth, y - 3, 0, 0, 182, 22);
+        blit(screenWidth, y - 3, 0, 0, 182, 22, 1024, 1024);
         
         int i = 0;
         for(int x = 3; x < 164; x += 20)
         {
-            if(icons[i] != -1)
+            Stack s = icons[i];
+            if(s.x != -1)
             {
-                blit(screenWidth + x, y, icons[i], icons[i + 1], 16, 16);
+                blit(screenWidth + x, y, 16, 16, s.x, s.y, s.width, s.height, 1024, 1024);
             }
-            i += 3;
+            i++;
         }
         
         GlStateManager.disableBlend();
         
         FontRenderer fr = mc.fontRenderer;
-        String s;
-        i = 2;
+        i = 0;
         for(int x = 20; x < 181; x += 20)
         {
-            if(icons[i] != 0)
+            if(icons[i].x != -1)
             {
-                s = String.valueOf(icons[i]);
-                fr.drawStringWithShadow(s, (float)(screenWidth + x - fr.getStringWidth(s)), y + 9, 16777215);
+                if(icons[i].text == null)
+                {
+                    String s = km.getKeyDescription(i);
+                    fr.drawStringWithShadow(s, (float)(screenWidth + x - fr.getStringWidth(s)), y + 9, 16777215);
+                }
+                else if(!icons[i].text.isEmpty())
+                {
+                    fr.drawStringWithShadow(icons[i].text, (float)(screenWidth + x - fr.getStringWidth(icons[i].text)), y + 9, 16777215);
+                }
             }             
-            i += 3;
+            i++;
         }
     }
 }

+ 5 - 0
src/main/java/me/km/networking/KeyManager.java

@@ -27,6 +27,11 @@ public class KeyManager
         functionKeys[8] = register(9, GLFW.GLFW_KEY_COMMA);
     }
     
+    public String getKeyDescription(int index)
+    {
+        return functionKeys[index].getLocalizedName();
+    }
+    
     private KeyBinding register(int id, int key)
     {
         KeyBinding keyBind =  new KeyBinding("key.function." + id, key, "key.km.function");

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

@@ -1,11 +1,9 @@
 package me.km.networking;
 
 import me.km.KajetansMod;
-import me.km.entities.EntityHuman;
 import me.km.inventory.ModInventory;
 import net.minecraft.entity.player.ServerPlayerEntity;
 import net.minecraft.util.ResourceLocation;
-import net.minecraft.util.text.ITextComponent;
 import net.minecraftforge.fml.network.NetworkRegistry;
 import net.minecraftforge.fml.network.PacketDistributor;
 import net.minecraftforge.fml.network.simple.SimpleChannel;
@@ -31,6 +29,7 @@ public class ModPacketHandler
         INSTANCE.registerMessage(id++, PlayerHead.class, PlayerHead::writeBytes, PlayerHead::fromBytes, PlayerHead::handle);
         INSTANCE.registerMessage(id++, ItemStackDisplay.class, ItemStackDisplay::writeBytes, ItemStackDisplay::fromBytes, ItemStackDisplay::handle);
         INSTANCE.registerMessage(id++, DimensionSync.class, DimensionSync::writeBytes, DimensionSync::fromBytes, DimensionSync::handle);
+        INSTANCE.registerMessage(id++, PlayerLeftClickEmpty.class, PlayerLeftClickEmpty::writeBytes, PlayerLeftClickEmpty::fromBytes, PlayerLeftClickEmpty::handle);
     }
     
     private static void sendToPlayer(ServerPlayerEntity p, Object msg)
@@ -98,6 +97,11 @@ public class ModPacketHandler
         sendToPlayer(p, new PlayerHead(action, index, name, x, y, scale));
     }
     
+    public static void sendLeftClickEmpty()
+    {
+        sendToServer(new PlayerLeftClickEmpty());
+    }
+    
     //--------------------------------------------------------------------------
     // item stack display
     //--------------------------------------------------------------------------

+ 1 - 8
src/main/java/me/km/networking/PlayerDisplay.java

@@ -25,14 +25,7 @@ public class PlayerDisplay
     {
         this.action = action;
         this.index = index;
-        if(text.length() > 32)
-        {
-            this.text = text.substring(0, 32);
-        }
-        else
-        {
-            this.text = text;
-        }
+        this.text = text;
     }
     
     public static void writeBytes(PlayerDisplay pd, PacketBuffer buf)

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

@@ -135,7 +135,7 @@ public class PlayerDisplayGui extends AbstractGui
         for(LineData data : strings.values())
         {
             x = 2;
-            for(int i = 0; i < data.list.size(); i ++)
+            for(int i = 0; i < data.list.size(); i++)
             {
                 s = data.list.get(i);
                 mc.fontRenderer.drawString(s, x, y + 1, 0xFFFFFF);

+ 27 - 0
src/main/java/me/km/networking/PlayerLeftClickEmpty.java

@@ -0,0 +1,27 @@
+package me.km.networking;
+
+import java.util.function.Supplier;
+import me.km.Server;
+import net.minecraft.network.PacketBuffer;
+import net.minecraftforge.fml.network.NetworkEvent;
+
+public class PlayerLeftClickEmpty
+{
+    public static void writeBytes(PlayerLeftClickEmpty pd, PacketBuffer buf)
+    {
+    }
+    
+    public static PlayerLeftClickEmpty fromBytes(PacketBuffer buf)
+    {
+        return new PlayerLeftClickEmpty();
+    }
+    
+    public static void handle(PlayerLeftClickEmpty pd, Supplier<NetworkEvent.Context> context)
+    {
+        context.get().enqueueWork(() -> 
+        {
+            Server.scriptEvents.onEmptyLeftClick(context.get().getSender());
+        });
+        context.get().setPacketHandled(true);
+    }
+}

+ 3 - 3
src/main/java/me/km/overrides/ModEntityPlayerMP.java

@@ -17,7 +17,7 @@ public class ModEntityPlayerMP extends ServerPlayerEntity
     private int id = -1;
     private final HashMap<String, Integer> timedData;
     private final HashMap<String, Object> data;
-    private StringTextComponent displayName = null;
+    private StringTextComponent tabDisplayName = null;
     
     public ModEntityPlayerMP(MinecraftServer ms, ServerWorld w, GameProfile gp, PlayerInteractionManager pim)
     {
@@ -51,7 +51,7 @@ public class ModEntityPlayerMP extends ServerPlayerEntity
     
     public void setTabListDisplayName(String name)
     {
-        displayName = new StringTextComponent(name);
+        tabDisplayName = new StringTextComponent(name);
         server.getPlayerList().sendPacketToAllPlayers(
                 new SPlayerListItemPacket(SPlayerListItemPacket.Action.UPDATE_DISPLAY_NAME, this));
     }
@@ -59,7 +59,7 @@ public class ModEntityPlayerMP extends ServerPlayerEntity
     @Override
     public ITextComponent getTabListDisplayName()
     {
-        return displayName;
+        return tabDisplayName;
     }
     
     public void setId(int id)

+ 2 - 7
src/main/java/me/km/snuviscript/MinecraftFunctions.java

@@ -1300,12 +1300,7 @@ public class MinecraftFunctions
         { 
             Entity ent = (Entity) in[0].get(sc);
             ent.setMotion(in[1].getDouble(sc), in[2].getDouble(sc), in[3].getDouble(sc));
-            if(ent instanceof ServerPlayerEntity)
-            {
-                ServerPlayerEntity p = (ServerPlayerEntity) ent;
-                SEntityVelocityPacket packet = new SEntityVelocityPacket(p);
-                p.connection.sendPacket(packet);
-            }
+            ent.velocityChanged = true;
             return Void.TYPE; 
         });
         sm.registerFunction("entity.teleport", (sc, in) -> 
@@ -2029,7 +2024,7 @@ public class MinecraftFunctions
             {
                 throw new IllegalArgumentException("index must be beetween 0 and 8, given: " + index);
             }
-            doForGroup(server, scripts, perms, in[0].get(sc), sc, p -> ModPacketHandler.setItemStackIndex((ServerPlayerEntity) p, index, 0, 0));
+            doForGroup(server, scripts, perms, in[0].get(sc), sc, p -> ModPacketHandler.setItemStackIndex((ServerPlayerEntity) p, index, -1, 0));
             return Void.TYPE; 
         }); 
         sm.registerFunction("stacks.clear", (sc, in) -> 

+ 15 - 16
src/main/java/me/km/snuviscript/ScriptEvents.java

@@ -606,16 +606,10 @@ public class ScriptEvents
         }
     }
     
-    @SubscribeEvent
-    public void onFishing(ItemFishedEvent e)
+    public void onEmptyLeftClick(PlayerEntity p)
     {
-        handleEvent(e.getPlayer(), "fishing", (sc) -> 
-        {
-            sc.setVar("drops", e.getDrops());
-            sc.setVar("cancel", e.isCanceled()); 
-        }, (sc) -> 
+        handleEvent(p, "left_click_air", (sc) -> 
         {
-            simpleCancel(sc, e, "fishing");
         });
     }
     
@@ -633,14 +627,6 @@ public class ScriptEvents
         });
     }
     
-    public void onArmSwing(PlayerEntity p, Hand hand)
-    {        
-        handleEvent(p, "arm_swing", (sc) -> 
-        {
-            sc.setVar("hand", hand);
-        });
-    }
-    
     @SubscribeEvent
     public void onItemUseStart(LivingEntityUseItemEvent.Start e)
     {        
@@ -679,6 +665,19 @@ public class ScriptEvents
         });
     }
     
+    @SubscribeEvent
+    public void onFishing(ItemFishedEvent e)
+    {
+        handleEvent(e.getPlayer(), "fishing", (sc) -> 
+        {
+            sc.setVar("drops", e.getDrops());
+            sc.setVar("cancel", e.isCanceled()); 
+        }, (sc) -> 
+        {
+            simpleCancel(sc, e, "fishing");
+        });
+    }
+    
     @SubscribeEvent
     public void onCrafting(PlayerEvent.ItemCraftedEvent e)
     {  

+ 35 - 3
src/main/java/me/km/utils/ClientReflectionUtils.java

@@ -1,24 +1,56 @@
 package me.km.utils;
 
 import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
 import java.util.Map;
 import me.km.overrides.ModFluidBlockRenderer;
 import me.km.overrides.ModPlayerRenderer;
 import static me.km.utils.ReflectionUtils.getField;
+import static me.km.utils.ReflectionUtils.getMethod;
 import net.minecraft.client.Minecraft;
 import net.minecraft.client.gui.overlay.BossOverlayGui;
 import net.minecraft.client.renderer.BlockRendererDispatcher;
+import net.minecraft.client.renderer.entity.EntityRenderer;
 import net.minecraft.client.renderer.entity.EntityRendererManager;
+import net.minecraft.client.renderer.entity.LivingRenderer;
 import net.minecraft.client.renderer.entity.PlayerRenderer;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.LivingEntity;
 import net.minecraftforge.api.distmarker.Dist;
 import net.minecraftforge.api.distmarker.OnlyIn;
+import org.apache.logging.log4j.LogManager;
 
 @OnlyIn(Dist.CLIENT)
 public class ClientReflectionUtils
 {
-    // -----------------------------------------------------------------------------------
-    // BossOverlayGui
-    // -----------------------------------------------------------------------------------
+    private final static Method CAN_RENDER_NAME = getMethod(LivingRenderer.class, "func_177070_b", LivingEntity.class);
+    private final static Method RENDER_ENTITY_NAME = getMethod(EntityRenderer.class, "func_188296_a", Entity.class, double.class, double.class, double.class, String.class, double.class);
+    
+    public static boolean canRenderName(LivingRenderer lr, LivingEntity liv)
+    {
+        try
+        {
+            return (boolean) CAN_RENDER_NAME.invoke(lr, liv);
+        }
+        catch(Exception ex)
+        {
+            LogManager.getLogger().warn("canRenderName - " + ex);
+            return false;
+        }
+    }
+    
+    public static void renderEntityName(LivingRenderer lr, LivingEntity liv, double x, double y, double z, String name, double distanceSq)
+    {
+        try
+        {
+            RENDER_ENTITY_NAME.invoke(lr, liv, x, y, z, name, distanceSq);
+        }
+        catch(Exception ex)
+        {
+            LogManager.getLogger().warn("renderEntityName - " + ex);
+        }
+    }
     
     private final static Field BOSS_BAR_MAP = getField(BossOverlayGui.class, "field_184060_g");
 

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

@@ -32,7 +32,7 @@ public class ReflectionUtils
     // helper stuff
     // -----------------------------------------------------------------------------------
     
-    private static Method getMethod(Class c, String name, Class... pars)
+    public static Method getMethod(Class c, String name, Class... pars)
     {
         try
         {

BIN
src/main/resources/assets/km/textures/gui/icons.png


BIN
src/main/resources/assets/km/textures/gui/itemstacks.png


BIN
src/main/resources/assets/km/textures/item/sling/sling_pulling_0.png


BIN
src/main/resources/assets/km/textures/item/sling/sling_pulling_1.png


BIN
src/main/resources/assets/km/textures/item/sling/sling_pulling_2.png


BIN
src/main/resources/assets/km/textures/item/sling/sling_standby.png