ソースを参照

seasons base, status display

Kajetan Johannes Hammerle 7 年 前
コミット
4a1a068d17
33 ファイル変更387 行追加14 行削除
  1. 11 0
      src/main/java/me/km/ClientEvents.java
  2. 6 0
      src/main/java/me/km/ClientProxy.java
  3. 6 1
      src/main/java/me/km/KajetansMod.java
  4. 7 1
      src/main/java/me/km/networking/ModPacketHandler.java
  5. 7 7
      src/main/java/me/km/networking/PlayerDisplay.java
  6. 61 0
      src/main/java/me/km/networking/SeasonUpdate.java
  7. 78 0
      src/main/java/me/km/networking/StatusDisplay.java
  8. 144 0
      src/main/java/me/km/networking/StatusDisplayGui.java
  9. 5 5
      src/main/java/me/km/snuviscript/MinecraftFunctions.java
  10. 62 0
      src/main/java/me/km/utils/ReflectionUtils.java
  11. BIN
      src/main/resources/assets/km/textures/colormap/foliage.png
  12. BIN
      src/main/resources/assets/km/textures/colormap/grass.png
  13. BIN
      src/main/resources/assets/km/textures/items/battleaxe/bronze_battleaxe.png
  14. BIN
      src/main/resources/assets/km/textures/items/battleaxe/copper_battleaxe.png
  15. BIN
      src/main/resources/assets/km/textures/items/battleaxe/diamond_battleaxe.png
  16. BIN
      src/main/resources/assets/km/textures/items/battleaxe/gold_battleaxe.png
  17. BIN
      src/main/resources/assets/km/textures/items/battleaxe/iron_battleaxe.png
  18. BIN
      src/main/resources/assets/km/textures/items/battleaxe/stone_battleaxe.png
  19. BIN
      src/main/resources/assets/km/textures/items/battleaxe/wood_battleaxe.png
  20. BIN
      src/main/resources/assets/km/textures/items/greatsword/bronze_greatsword.png
  21. BIN
      src/main/resources/assets/km/textures/items/greatsword/copper_greatsword.png
  22. BIN
      src/main/resources/assets/km/textures/items/greatsword/diamond_greatsword.png
  23. BIN
      src/main/resources/assets/km/textures/items/greatsword/gold_greatsword
  24. BIN
      src/main/resources/assets/km/textures/items/greatsword/iron_greatsword.png
  25. BIN
      src/main/resources/assets/km/textures/items/greatsword/stone_greatsword.png
  26. BIN
      src/main/resources/assets/km/textures/items/greatsword/wood_greatsword.png
  27. BIN
      src/main/resources/assets/km/textures/items/spear/bronze_spear.png
  28. BIN
      src/main/resources/assets/km/textures/items/spear/copper_spear.png
  29. BIN
      src/main/resources/assets/km/textures/items/spear/diamond_spear.png
  30. BIN
      src/main/resources/assets/km/textures/items/spear/gold_spear.png
  31. BIN
      src/main/resources/assets/km/textures/items/spear/iron_spear.png
  32. BIN
      src/main/resources/assets/km/textures/items/spear/stone_spear.png
  33. BIN
      src/main/resources/assets/km/textures/items/spear/wood_spear.png

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

@@ -3,6 +3,7 @@ package me.km;
 import java.util.List;
 import me.km.api.GlobalText;
 import me.km.networking.PlayerDisplayGui;
+import me.km.networking.StatusDisplayGui;
 import net.minecraft.item.Item;
 import net.minecraft.item.ItemArmor;
 import net.minecraft.item.ItemStack;
@@ -36,12 +37,22 @@ public class ClientEvents
         }
     }
 
+    @SubscribeEvent
+    public void onRenderGui(RenderGameOverlayEvent.Pre e)
+    {
+        if(e.getType() == RenderGameOverlayEvent.ElementType.POTION_ICONS)
+        {
+            e.setCanceled(true);
+        }
+    }
+    
     @SubscribeEvent
     public void onRenderGui(RenderGameOverlayEvent.Post e)
     {
         if(e.getType() == RenderGameOverlayEvent.ElementType.EXPERIENCE)
         {
             PlayerDisplayGui.INSTANCE.paint();
+            StatusDisplayGui.INSTANCE.paint();
         }
     }
     

+ 6 - 0
src/main/java/me/km/ClientProxy.java

@@ -21,11 +21,14 @@ import net.minecraft.client.renderer.color.ItemColors;
 import net.minecraft.client.renderer.color.IBlockColor;
 import net.minecraft.client.renderer.entity.Render;
 import net.minecraft.entity.Entity;
+import net.minecraft.init.Blocks;
 import net.minecraft.item.Item;
 import net.minecraft.item.ItemStack;
 import net.minecraft.server.MinecraftServer;
 import net.minecraft.util.math.BlockPos;
+import net.minecraft.world.ColorizerFoliage;
 import net.minecraft.world.IBlockAccess;
+import net.minecraft.world.biome.BiomeColorHelper;
 import net.minecraftforge.client.model.ModelLoader;
 import net.minecraftforge.common.MinecraftForge;
 import net.minecraftforge.fluids.IFluidBlock;
@@ -96,6 +99,9 @@ public class ClientProxy extends CommonProxy
         bColors.registerBlockColorHandler(colorer, ModBlocks.cauldronJungle);
         bColors.registerBlockColorHandler(colorer, ModBlocks.cauldronSpruce);
         
+        bColors.registerBlockColorHandler((IBlockState state, IBlockAccess w, BlockPos pos, int tintIndex) -> 
+                w != null && pos != null ? BiomeColorHelper.getFoliageColorAtPos(w, pos) : ColorizerFoliage.getFoliageColorBasic(), Blocks.LEAVES);
+        
         ItemColors iColors = Minecraft.getMinecraft().getItemColors();
         iColors.registerItemColorHandler((ItemStack stack, int tintIndex) -> 
         {

+ 6 - 1
src/main/java/me/km/KajetansMod.java

@@ -12,7 +12,6 @@ import me.km.databank.DataBank;
 import me.km.dimensions.ModWorldGeneration;
 import me.km.dimensions.WorldData;
 import me.km.effects.EffectUtils;
-import me.km.items.ModItems;
 import me.km.jobsystem.JobAPI;
 import me.km.networking.ModPacketHandler;
 import me.km.permissions.PermissionManager;
@@ -107,6 +106,12 @@ public class KajetansMod
                         String[] parts = e.getMessage().split(" ");
                         switch(parts[0])
                         {
+                            case "s0":
+                                ModPacketHandler.sendSeasonUpdate(p, (byte) 0);
+                                break;
+                            case "s1":
+                                ModPacketHandler.sendSeasonUpdate(p, (byte) 1);
+                                break;
                             case "color":
                                 ((me.km.blocks.TileEntityCauldron) p.world.getTileEntity(pos))
                                     .setColor(Integer.parseInt(parts[1]), Integer.parseInt(parts[2]), Integer.parseInt(parts[3]));

+ 7 - 1
src/main/java/me/km/networking/ModPacketHandler.java

@@ -22,9 +22,10 @@ public class ModPacketHandler
         INSTANCE.registerMessage(HumanScaleUpdate.Handler.class, HumanScaleUpdate.class, id++, Side.CLIENT);
         INSTANCE.registerMessage(CustomInventory.Handler.class, CustomInventory.class, id++, Side.CLIENT);
         INSTANCE.registerMessage(CampFireInventory.Handler.class, CampFireInventory.class, id++, Side.CLIENT);
+        INSTANCE.registerMessage(SeasonUpdate.Handler.class, SeasonUpdate.class, id++, Side.CLIENT);
     }
     
-    public static void sendStats(EntityPlayerMP p, int action, int index, String text)
+    public static void sendStats(EntityPlayerMP p, byte action, byte index, String text)
     {
         INSTANCE.sendTo(new PlayerDisplay(action, index, text), p);
     }
@@ -60,4 +61,9 @@ public class ModPacketHandler
     {
         INSTANCE.sendTo(new CampFireInventory(id, name), p);
     }
+    
+    public static void sendSeasonUpdate(EntityPlayerMP p, byte season)
+    {
+        INSTANCE.sendTo(new SeasonUpdate(season), p);
+    }
 }

+ 7 - 7
src/main/java/me/km/networking/PlayerDisplay.java

@@ -11,8 +11,8 @@ public class PlayerDisplay implements IMessage
     // 1 - add - index, text
     // 2 - remove - index
     // 3 - clear
-    private int action;
-    private int index;
+    private byte action;
+    private byte index;
     private String text;
     
     public PlayerDisplay() 
@@ -22,7 +22,7 @@ public class PlayerDisplay implements IMessage
         text = "";
     }
     
-    public PlayerDisplay(int action, int index, String text) 
+    public PlayerDisplay(byte action, byte index, String text) 
     {
         this.action = action;
         this.index = index;
@@ -39,8 +39,8 @@ public class PlayerDisplay implements IMessage
     @Override
     public void fromBytes(ByteBuf buf) 
     {
-        action = buf.readInt();
-        index = buf.readInt();
+        action = buf.readByte();
+        index = buf.readByte();
         int length = buf.readInt();
         text = buf.readBytes(length).toString(StandardCharsets.UTF_8);
     }
@@ -48,8 +48,8 @@ public class PlayerDisplay implements IMessage
     @Override
     public void toBytes(ByteBuf buf) 
     {
-        buf.writeInt(action);
-        buf.writeInt(index);
+        buf.writeByte(action);
+        buf.writeByte(index);
         byte[] b = text.getBytes(StandardCharsets.UTF_8);
         buf.writeInt(b.length);
         buf.writeBytes(b);

+ 61 - 0
src/main/java/me/km/networking/SeasonUpdate.java

@@ -0,0 +1,61 @@
+package me.km.networking;
+
+import io.netty.buffer.ByteBuf;
+import me.km.KajetansMod;
+import me.km.utils.ReflectionUtils;
+import net.minecraft.client.Minecraft;
+import net.minecraft.util.ResourceLocation;
+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 SeasonUpdate implements IMessage
+{
+    private byte season;
+    
+    public SeasonUpdate() 
+    {
+        season = -1;
+    }
+    
+    public SeasonUpdate(byte season) 
+    {
+        this.season = season;
+    }
+    
+    @Override
+    public void fromBytes(ByteBuf buf) 
+    {
+        season = buf.readByte();
+    }
+
+    @Override
+    public void toBytes(ByteBuf buf) 
+    {
+        buf.writeByte(season);
+    }
+
+    public static class Handler implements IMessageHandler<SeasonUpdate, IMessage>
+    {
+        @Override
+        public IMessage onMessage(SeasonUpdate message, MessageContext ctx) 
+        {
+            switch(message.season)
+            {
+                case 0:
+                    ReflectionUtils.setFoliage(new ResourceLocation("textures/colormap/foliage.png"));
+                    ReflectionUtils.setGrass(new ResourceLocation("textures/colormap/grass.png"));
+                    break;
+                case 1:
+                    ReflectionUtils.setFoliage(new ResourceLocation(KajetansMod.MODID, "textures/colormap/foliage.png"));
+                    ReflectionUtils.setGrass(new ResourceLocation(KajetansMod.MODID, "textures/colormap/grass.png"));
+                    break;
+            }
+            Minecraft.getMinecraft().addScheduledTask(() -> 
+            {
+                Minecraft.getMinecraft().refreshResources();
+            });
+            return null;
+        }
+    }
+}

+ 78 - 0
src/main/java/me/km/networking/StatusDisplay.java

@@ -0,0 +1,78 @@
+package me.km.networking;
+
+import io.netty.buffer.ByteBuf;
+import java.nio.charset.StandardCharsets;
+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 StatusDisplay implements IMessage
+{
+    // 1 - add - index, text
+    // 2 - remove - index
+    // 3 - clear
+    private byte action;
+    private byte index;
+    private String text;
+    
+    public StatusDisplay() 
+    {
+        action = -1;
+        index = -1;
+        text = "";
+    }
+    
+    public StatusDisplay(byte action, byte index, String text) 
+    {
+        this.action = action;
+        this.index = index;
+        if(text.length() > 32)
+        {
+            this.text = text.substring(0, 32);
+        }
+        else
+        {
+            this.text = text;
+        }
+    }
+    
+    @Override
+    public void fromBytes(ByteBuf buf) 
+    {
+        action = buf.readByte();
+        index = buf.readByte();
+        int length = buf.readInt();
+        text = buf.readBytes(length).toString(StandardCharsets.UTF_8);
+    }
+
+    @Override
+    public void toBytes(ByteBuf buf) 
+    {
+        buf.writeByte(action);
+        buf.writeByte(index);
+        byte[] b = text.getBytes(StandardCharsets.UTF_8);
+        buf.writeInt(b.length);
+        buf.writeBytes(b);
+    }
+
+    public static class Handler implements IMessageHandler<StatusDisplay, IMessage>
+    {
+        @Override
+        public IMessage onMessage(StatusDisplay message, MessageContext ctx) 
+        {
+            switch(message.action)
+            {
+                case 1:
+                    StatusDisplayGui.INSTANCE.add(message.index, message.text);
+                    break;
+                case 2:
+                    StatusDisplayGui.INSTANCE.remove(message.index);
+                    break;
+                case 3: 
+                    StatusDisplayGui.INSTANCE.clear();
+                    break;
+            }
+            return null;
+        }
+    }
+}

+ 144 - 0
src/main/java/me/km/networking/StatusDisplayGui.java

@@ -0,0 +1,144 @@
+package me.km.networking;
+
+import java.util.Collection;
+import java.util.LinkedList;
+import java.util.TreeMap;
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.gui.Gui;
+import net.minecraft.client.gui.ScaledResolution;
+import net.minecraft.potion.PotionEffect;
+import net.minecraft.util.text.TextFormatting;
+import net.minecraft.util.text.translation.I18n;
+import net.minecraftforge.fml.relauncher.Side;
+import net.minecraftforge.fml.relauncher.SideOnly;
+
+@SideOnly(Side.CLIENT)
+public class StatusDisplayGui extends Gui
+{
+    public final static StatusDisplayGui INSTANCE = new StatusDisplayGui(Minecraft.getMinecraft());
+
+    private class LineData implements Comparable<LineData>
+    {
+        private int time;
+        private String text;
+        
+        public LineData(int time, String text)
+        {
+            this.time = time;
+            this.text = text;
+        }
+        
+        public LineData(String text)
+        {
+            this.time = Integer.MAX_VALUE;
+            this.text = text;
+        }
+        
+        public String getText()
+        {
+            return text;
+        }
+        
+        public String getTimeText()
+        {
+            return String.valueOf(time / 20);
+        }
+        
+        public int getTimeWidth()
+        {
+            return time == Integer.MAX_VALUE ? 0 : mc.fontRenderer.getStringWidth(getTimeText());
+        }
+        
+        public int getTextWidth()
+        {
+            return mc.fontRenderer.getStringWidth(text);
+        }
+
+        @Override
+        public int compareTo(LineData o) 
+        {
+            return -Integer.compare(time, o.time);
+        }
+    }
+    
+    private TreeMap<Integer, LineData> strings;
+    private Minecraft mc;
+    
+    public StatusDisplayGui(Minecraft mc)
+    {
+        this.mc = mc;
+        this.strings = new TreeMap<>(); 
+    }
+    
+    public void add(int i, String s)
+    {
+        strings.put(i, new LineData(s));
+    }
+    
+    public void remove(int i)
+    {
+        strings.remove(i);
+    }
+    
+    public void clear()
+    {
+        strings.clear();
+    }
+
+    public void paint()
+    {
+        Collection<PotionEffect> collection = this.mc.player.getActivePotionEffects();
+        if(strings.isEmpty() && collection.isEmpty())
+        {
+            return;
+        }
+        // getting data
+        LinkedList<LineData> list = new LinkedList<>(strings.values());
+        collection.forEach(effect -> 
+        {
+            StringBuilder sb = new StringBuilder("s ");
+            if(effect.getPotion().isBadEffect())
+            {
+                sb.append(TextFormatting.RED);
+            }
+            else
+            {
+                sb.append(TextFormatting.GREEN);
+            }
+            sb.append(I18n.translateToLocal(effect.getEffectName()));
+            list.add(new LineData(effect.getDuration(), sb.toString()));
+        });
+        // sorting by time
+        list.sort(null);
+        
+        int lineHeight = mc.fontRenderer.FONT_HEIGHT;
+        int height = 4 + lineHeight * (strings.size() + collection.size());
+        
+        int maxTextWidth = 0;
+        int maxTimeWidth = 0;
+        
+        for(LineData data : list)
+        {
+            maxTextWidth = Math.max(data.getTextWidth(), maxTextWidth);
+            maxTimeWidth = Math.max(data.getTimeWidth(), maxTimeWidth);
+        }
+        
+        ScaledResolution scaledresolution = new ScaledResolution(mc);
+        int screenWidth = scaledresolution.getScaledWidth();
+        
+        int x = screenWidth - maxTextWidth - maxTimeWidth - 4;
+        int y = 2;
+        
+        drawRect(x, 0, screenWidth, height, 1342177280);
+        
+        x += 2;
+        String time;
+
+        for(LineData data : list)
+        {
+            time = data.getTimeText();
+            mc.fontRenderer.drawString(time + data.getText(), x + maxTimeWidth - mc.fontRenderer.getStringWidth(time), y + 1, 0xFFFFFF);
+            y += lineHeight;
+        }
+    }
+}

+ 5 - 5
src/main/java/me/km/snuviscript/MinecraftFunctions.java

@@ -631,7 +631,7 @@ public class MinecraftFunctions implements ISnuviLogger
         parser.registerConsumer("display.remove", (args, qd) ->  
                 removeFromDisplay(args, qd));
         parser.registerConsumer("display.reset", (args, qd) ->  
-                doForGroup(args[0], qd, p -> ModPacketHandler.sendStats((EntityPlayerMP) p, 3, -1, "")));
+                doForGroup(args[0], qd, p -> ModPacketHandler.sendStats((EntityPlayerMP) p, (byte) 3, (byte) -1, "")));
 
         // -------------------------------------------------------------  
         // Effect-Bibliothek   
@@ -1176,15 +1176,15 @@ public class MinecraftFunctions implements ISnuviLogger
     
     private static void addToDisplay(Object[] args, Script qd) throws PlayerNotFoundException
     {
-        int id = ScriptUtils.getInt(args[1]);
+        byte id = (byte) ScriptUtils.getInt(args[1]);
         String message = ScriptUtils.connect(args, 2);
-        doForGroup(args[0], qd, p -> ModPacketHandler.sendStats((EntityPlayerMP) p, 1, id, message));
+        doForGroup(args[0], qd, p -> ModPacketHandler.sendStats((EntityPlayerMP) p, (byte) 1, id, message));
     }
     
     private static void removeFromDisplay(Object[] args, Script qd) throws PlayerNotFoundException
     {
-        int id = ScriptUtils.getInt(args[1]);
-        doForGroup(args[0], qd, p -> ModPacketHandler.sendStats((EntityPlayerMP) p, 2, id, ""));
+        byte id = (byte) ScriptUtils.getInt(args[1]);
+        doForGroup(args[0], qd, p -> ModPacketHandler.sendStats((EntityPlayerMP) p, (byte) 2, id, ""));
     }
 
     private static void sendToActionBar(Object[] args, Script qd) throws PlayerNotFoundException

+ 62 - 0
src/main/java/me/km/utils/ReflectionUtils.java

@@ -3,11 +3,14 @@ package me.km.utils;
 import java.lang.reflect.Field;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
 import java.util.Map;
 import java.util.Random;
 import java.util.UUID;
 import net.minecraft.block.Block;
 import net.minecraft.block.material.Material;
+import net.minecraft.client.resources.FoliageColorReloadListener;
+import net.minecraft.client.resources.GrassColorReloadListener;
 import net.minecraft.entity.Entity;
 import net.minecraft.entity.EntityLivingBase;
 import net.minecraft.entity.item.EntityItem;
@@ -18,8 +21,11 @@ import net.minecraft.entity.projectile.EntityArrow;
 import net.minecraft.server.management.PlayerList;
 import net.minecraft.util.DamageSource;
 import net.minecraft.util.FoodStats;
+import net.minecraft.util.ResourceLocation;
 import net.minecraft.world.Explosion;
 import net.minecraftforge.fml.relauncher.ReflectionHelper;
+import net.minecraftforge.fml.relauncher.Side;
+import net.minecraftforge.fml.relauncher.SideOnly;
 
 public class ReflectionUtils 
 {    
@@ -53,6 +59,28 @@ public class ReflectionUtils
         return null;
     }
     
+    private static Field getFinalStaticField(Class c, String... field)
+    {
+        try
+        {
+            Field f = ReflectionHelper.findField(c, field);
+            
+            Field modifiersField = Field.class.getDeclaredField("modifiers");
+            modifiersField.setAccessible(true);
+            modifiersField.setInt(f, f.getModifiers() & ~Modifier.FINAL);
+            
+            return f;
+        }
+        catch(SecurityException | ReflectionHelper.UnableToFindFieldException | 
+                IllegalArgumentException | IllegalAccessException | NoSuchFieldException ex)
+        {
+            System.out.println(String.join(", ", field) + " - " + ex);
+        }
+        return null;
+    }
+    
+    
+    
     private static <T> void setInt(T t, Field f, int i)
     {
         try
@@ -129,6 +157,18 @@ public class ReflectionUtils
         }
     }
     
+    private static void setFieldValue(Object o, Field f, Object value)
+    {
+        try
+        {
+            f.set(o, value);
+        }
+        catch(SecurityException | IllegalAccessException | IllegalArgumentException ex)
+        {
+            System.out.println(f + " - " + ex);
+        }
+    }
+    
     // -----------------------------------------------------------------------------------
     // villager stuff
     // -----------------------------------------------------------------------------------
@@ -299,4 +339,26 @@ public class ReflectionUtils
         {
         }
     }
+    
+    // -------------------------------------------------------------------------
+    // rendering stuff
+    // -------------------------------------------------------------------------
+    
+    @SideOnly(Side.CLIENT)
+    private final static Field LOC_FOLIAGE_PNG = getFinalStaticField(FoliageColorReloadListener.class, "field_130079_a", "LOC_FOLIAGE_PNG");   
+    
+    @SideOnly(Side.CLIENT)
+    public static void setFoliage(ResourceLocation loc)
+    {
+        setFieldValue(null, LOC_FOLIAGE_PNG, loc);
+    }
+    
+    @SideOnly(Side.CLIENT)
+    private final static Field LOC_GRASS_PNG = getFinalStaticField(GrassColorReloadListener.class, "field_130078_a", "LOC_GRASS_PNG");   
+    
+    @SideOnly(Side.CLIENT)
+    public static void setGrass(ResourceLocation loc)
+    {
+        setFieldValue(null, LOC_GRASS_PNG, loc);
+    }
 }

BIN
src/main/resources/assets/km/textures/colormap/foliage.png


BIN
src/main/resources/assets/km/textures/colormap/grass.png


BIN
src/main/resources/assets/km/textures/items/battleaxe/bronze_battleaxe.png


BIN
src/main/resources/assets/km/textures/items/battleaxe/copper_battleaxe.png


BIN
src/main/resources/assets/km/textures/items/battleaxe/diamond_battleaxe.png


BIN
src/main/resources/assets/km/textures/items/battleaxe/gold_battleaxe.png


BIN
src/main/resources/assets/km/textures/items/battleaxe/iron_battleaxe.png


BIN
src/main/resources/assets/km/textures/items/battleaxe/stone_battleaxe.png


BIN
src/main/resources/assets/km/textures/items/battleaxe/wood_battleaxe.png


BIN
src/main/resources/assets/km/textures/items/greatsword/bronze_greatsword.png


BIN
src/main/resources/assets/km/textures/items/greatsword/copper_greatsword.png


BIN
src/main/resources/assets/km/textures/items/greatsword/diamond_greatsword.png


BIN
src/main/resources/assets/km/textures/items/greatsword/gold_greatsword


BIN
src/main/resources/assets/km/textures/items/greatsword/iron_greatsword.png


BIN
src/main/resources/assets/km/textures/items/greatsword/stone_greatsword.png


BIN
src/main/resources/assets/km/textures/items/greatsword/wood_greatsword.png


BIN
src/main/resources/assets/km/textures/items/spear/bronze_spear.png


BIN
src/main/resources/assets/km/textures/items/spear/copper_spear.png


BIN
src/main/resources/assets/km/textures/items/spear/diamond_spear.png


BIN
src/main/resources/assets/km/textures/items/spear/gold_spear.png


BIN
src/main/resources/assets/km/textures/items/spear/iron_spear.png


BIN
src/main/resources/assets/km/textures/items/spear/stone_spear.png


BIN
src/main/resources/assets/km/textures/items/spear/wood_spear.png