Thread: [Any RuneLite/Kronos] Adding Your Own Chat Crowns via Cache

Results 1 to 4 of 4
  1. #1 [Any RuneLite/Kronos] Adding Your Own Chat Crowns via Cache 
    RuneCasino


    Join Date
    Jul 2007
    Posts
    1,647
    Thanks given
    175
    Thanks received
    257
    Rep Power
    358
    ONLY USE THIS IF you're using mobile client. If not using mobile client use this tutorial instead: https://www.rune-server.ee/runescape...-runelite.html

    People might use this.. I prefer the other way (resource folder)

    Sort of pointless to use if you plan on using client update launcher. But this should work on any RuneLite client.

    This is to edit sprites via cache instead of reading them from RuneLite resources.
    (Stops the hassle of updating client version for all players if not using a launcher)

    If you do wish to use RuneLite resource images instead see my other thread: https://www.rune-server.ee/runescape...-runelite.html

    The ModIconManager file should work on any runelite client.

    First of all create a new class called ModIconManager.java in net.runelite.client.game

    Attached image

    Attached image

    ModIconManager.java:

    Code:
    /*
     * Copyright (c) 2018, Adam <[email protected]>
     * All rights reserved.
     *
     * Redistribution and use in source and binary forms, with or without
     * modification, are permitted provided that the following conditions are met:
     *
     * 1. Redistributions of source code must retain the above copyright notice, this
     *    list of conditions and the following disclaimer.
     * 2. Redistributions in binary form must reproduce the above copyright notice,
     *    this list of conditions and the following disclaimer in the documentation
     *    and/or other materials provided with the distribution.
     *
     * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
     * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
     * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
     * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
     * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
     * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
     * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
     * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
     * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     */
    package net.runelite.client.game;
    
    import java.awt.image.BufferedImage;
    import java.util.Arrays;
    import java.util.concurrent.TimeUnit;
    import javax.inject.Inject;
    import javax.inject.Singleton;
    
    import com.google.common.cache.Cache;
    import com.google.common.cache.CacheBuilder;
    import net.runelite.api.Client;
    import net.runelite.api.GameState;
    import net.runelite.api.IndexedSprite;
    import net.runelite.api.events.GameStateChanged;
    import net.runelite.client.eventbus.EventBus;
    import net.runelite.client.util.ImageUtil;
    
                 @Singleton
    public class ModIconManager
    {
    
        private final Client client;
        private final SpriteManager spriteManager;
    
        private int offset;
    
        final private int modIconSpriteAmount = 100; // Max amount of child sprite ids being read from the main ID
        final private int modIconSprite =  2157; // The main sprite id
    
                    @Inject
        private ModIconManager(
                final Client client,
                final SpriteManager spriteManager,
                final EventBus eventbus
        )
        {
            this.client = client;
            this.spriteManager = spriteManager;
    
            eventbus.subscribe(GameStateChanged.class, this, this::onGameStateChanged);
        }
    
    
        private void onGameStateChanged(GameStateChanged gameStateChanged)
        {
            if (gameStateChanged.getGameState() == GameState.LOGIN_SCREEN && offset == 0) {
                loadModIcons();
            }
        }
    
        private void loadModIcons()
        {
            {
                IndexedSprite[] modIcons = client.getModIcons();
                offset = modIcons.length;
    
                IndexedSprite blank = ImageUtil.getImageIndexedSprite(
                        new BufferedImage(13, 13, BufferedImage.TYPE_INT_ARGB),
                        client);
    
                modIcons = Arrays.copyOf(modIcons, offset + modIconSpriteAmount);
                Arrays.fill(modIcons, offset, modIcons.length, blank);
    
                client.setModIcons(modIcons);
            }
    
            for (int i = 0; i < modIconSpriteAmount; i++) {
                final int fi = i;
                try {
                    BufferedImage img = spriteManager.getSprite(modIconSprite, i);
                } catch(Exception e) {
                    return;
                }
                spriteManager.getSpriteAsync(modIconSprite, i, sprite ->
                {
                    IndexedSprite[] modIcons = client.getModIcons();
                    modIcons[offset + fi] = ImageUtil.getImageIndexedSprite(modIconImageFromSprite(sprite), client);
                });
            }
        }
    
        private static BufferedImage modIconImageFromSprite(final BufferedImage modIconSprite)
        {
            final BufferedImage modIconCanvas = ImageUtil.resizeCanvas(modIconSprite,13, 13);
            return modIconCanvas;
        }
    }
    Now add this import to package net.runelite.client > RuneLite.java

    Code:
    import net.runelite.client.game.ModIconManager;
    While still in RuneLite.java, find this

    Code:
                 @Inject
    	private Provider<ChatMessageManager> chatMessageManager;
    Under that add this:

    Code:
                 @Inject
    	private Provider<ModIconManager> modIconManager;
    Find:

    Code:
    chatMessageManager.get().loadColors();
    Add this under that:

    Code:
    modIconManager.get();
    Now all you need to do is use any sprite editor and add child images to the sprite ID 2157

    2157 is the default jmod/admin crown where the child ids will be read from

    Example of adding sprite child ids:

    Valkyr Cache Suite:

    Attached image

    Displee Interface/Sprite Editor:

    Attached image

    Leanbow's Sprite Editor

    Attached image

    So now if you haven't edited any sprites before, the first id should be <img=35> for jmod crown, then any numbers after that will be the child ids.

    Example:

    Attached image

    Bugs to fix (Dcing when typing something)
    THESE BUG FIXES ALSO FIXES CLIENT RANK IDS AND IMAGE IDS BEING DIFFERENT, now they will be the same.

    For example: in the server files (io.ruin.model.entity.player > PlayerGroup.java)

    You see these usergroups:

    Code:
       OWNER(100, 38, 38, 100),
        DEVELOPER(3, 16, 16, 100),
        COMMUNITY_MANAGER(8, 17, 17, "Server Manager"),
    The layout is RANK(id, clientId, clientImageId, title/dropChance)

    So if it's <img=38> you want for the chat icon (Private message, clan chat, public chat)

    OWNER(100, 38, 38, 100),

    Normal chat message error:
    Code:
    java.lang.NullPointerException
    	at net.runelite.standalone.WorldMapManager.method630(WorldMapManager.java:688)
    	at net.runelite.standalone.Client.parsePacket(Client.java:7964)
    	at net.runelite.standalone.Client.method1654(Client.java:5680)
    	at net.runelite.standalone.Client.vmethod1937(Client.java:1677)
    	at net.runelite.standalone.GameShell.method976(GameShell.java:320)
    	at net.runelite.standalone.GameShell.run(GameShell.java:785)
    	at java.lang.Thread.run(Thread.java:748)
    Go to net.runelite.standalone > WorldMapManager.java

    Find
    Code:
    if((var6 & 128) != 0) {
    Replace that whole if statement with:

    Code:
     if((var6 & 128) != 0) {
                            var8 = var0.readUnsignedShort();
                            int rank = var0.readUnsignedByte();
                            PlayerType playerType = (PlayerType) NetSocket.getEnumeratedTypeIndex(class210.getPlayerTypes(), rank);
                            boolean var18 = var0.method5525() == 1;
                            var11 = var0.method5525();
                            var12 = var0.offset;
                            if(var16.username != null && var16.appearance != null) {
                               boolean var13 = false;
                               if(playerType != null) {
                                  if (playerType.isUser && Tiles.friendSystem.method897(var16.username)) {
                                     var13 = true;
                                  }
                               }
    
                               if(!var13 && Client.field842 == 0 && !var16.isHidden) {
                                  Players.field1202.offset = 0;
                                  var0.method5547(Players.field1202.array, 0, var11);
                                  Players.field1202.offset = 0;
                                  String var14 = AbstractFont.method5328(NetSocket.method3456(class65.method1308(Players.field1202)));
                                  var16.overheadText = var14.trim();
                                  var16.overheadTextChanged(-1);
                                  var16.overheadTextColor = var8 >> 8;
                                  var16.overheadTextEffect = var8 & 255;
                                  var16.overheadTextCyclesRemaining = 150;
                                  var16.isAutoChatting = var18;
                                  if (playerType != null) {
                                     var16.field682 = var16 != class215.localPlayer && playerType.isUser && "" != Client.field1115 && var14.toLowerCase().indexOf(Client.field1115) == -1;
                                  }
                                  if(playerType != null) {
                                     if (playerType.isPrivileged) {
                                        var15 = var18 ? 91 : 1;
                                     } else {
                                        var15 = var18 ? 90 : 2;
                                     }
                                  } else {
                                     var15 = var18 ? 90 : 2;
                                  }
    
                                  //if(playerType.modIcon != -1) {
                                  if(rank != 0) {
                                     class217.sendGameMessage(var15, class256.method4655(rank) + var16.username.method5001(), var14);
                                  } else {
                                     class217.sendGameMessage(var15, var16.username.method5001(), var14);
                                  }
                               }
                            }
    
                            var0.offset = var11 + var12;
                         }
    Clan chat message error:
    Code:
    java.lang.NullPointerException
    	at net.runelite.standalone.Client.parsePacket(Client.java:6954)
    	at net.runelite.standalone.Client.method1654(Client.java:5680)
    	at net.runelite.standalone.Client.vmethod1937(Client.java:1677)
    	at net.runelite.standalone.GameShell.method976(GameShell.java:320)
    	at net.runelite.standalone.GameShell.run(GameShell.java:785)
    	at java.lang.Thread.run(Thread.java:748)
    Go to net.runelite.standalone > Client.java

    Find
    Code:
    if(ServerPacket.field2280 == var1.serverPacket) {
    Replace that whole if statement with this:


    Code:
                if(ServerPacket.field2280 == var1.serverPacket) {
                   var36 = var3.readString();
                   String clanName = var3.readString();
                   //var21 = var3.method5502();
                   var23 = (long)var3.readUnsignedShort();
                   var9 = (long)var3.method5500();
    
                   int perm = var3.readUnsignedByte();
    
                   System.out.println(perm);
    
                   PlayerType var11 = (PlayerType)NetSocket.getEnumeratedTypeIndex(class210.getPlayerTypes(), perm);
                   var12 = var9 + (var23 << 32);
                   boolean var44 = false;
    
                   for(int var15 = 0; var15 < 100; ++var15) {
                      if(field1097[var15] == var12) {
                         var44 = true;
                         break;
                      }
                   }
                   if(var11 != null) {
                      if (var11.isUser && Tiles.friendSystem.method897(new Username(var36, WorldMapSection1.loginType))) {
                         var44 = true;
                      }
                   }
    
                   if(!var44 && field842 == 0) {
                      field1097[field1064] = var12;
                      field1064 = (field1064 + 1) % 100;
                      String var25 = AbstractFont.method5328(NetSocket.method3456(class65.method1308(var3)));
                      //if(var11.modIcon != -1) {
                      if(perm != -1) {
                         WorldMapData_1.method514(9, class256.method4655(perm) + var36, var25, clanName);
                      } else {
                         WorldMapData_1.method514(9, var36, var25, clanName);
                      }
                   }
    
                   var1.serverPacket = null;
                   var10000 = true;
                   return var10000;
                }
    Private chat error:

    Code:
    java.lang.NullPointerException
    	at net.runelite.standalone.Client.parsePacket(Client.java:7116)
    	at net.runelite.standalone.Client.method1654(Client.java:5680)
    	at net.runelite.standalone.Client.vmethod1937(Client.java:1677)
    	at net.runelite.standalone.GameShell.method976(GameShell.java:320)
    	at net.runelite.standalone.GameShell.run(GameShell.java:785)
    	at java.lang.Thread.run(Thread.java:748)
    Go to net.runelite.standalone > Client.java

    Find

    Code:
    if(ServerPacket.field2270 == var1.serverPacket) {
    Replace whole if statement:

    Code:
     if(ServerPacket.field2270 == var1.serverPacket) {
                   var36 = var3.readString();
                   var21 = (long)var3.readUnsignedShort();
                   var23 = (long)var3.method5500();
                   int rank = var3.readUnsignedByte();
                   PlayerType var26 = (PlayerType)NetSocket.getEnumeratedTypeIndex(class210.getPlayerTypes(), rank);
                   long var27 = (var21 << 32) + var23;
                   boolean var29 = false;
    
                   for(int var13 = 0; var13 < 100; ++var13) {
                      if(field1097[var13] == var27) {
                         var29 = true;
                         break;
                      }
                   }
    
                   if(Tiles.friendSystem.method897(new Username(var36, WorldMapSection1.loginType))) {
                      var29 = true;
                   }
    
                   if(!var29 && field842 == 0) {
                      field1097[field1064] = var27;
                      field1064 = (field1064 + 1) % 100;
                      String var30 = AbstractFont.method5328(NetSocket.method3456(class65.method1308(var3)));
                      byte var14;
                      if(var26 != null) {
                         if (var26.isPrivileged) {
                            var14 = 7;
                         } else {
                            var14 = 3;
                         }
                      } else {
                         var14 = 3;
                      }
    
                    //  if(var26.modIcon != -1) {
                      if(rank != -1) {
                         class217.sendGameMessage(var14, class256.method4655(rank) + var36, var30);
                      } else {
                         class217.sendGameMessage(var14, var36, var30);
                      }
                   }
    
                   var1.serverPacket = null;
                   var10000 = true;
                   return var10000;
                }
    Reply With Quote  
     

  2. Thankful users:


  3. #2  
    WVWVWVWVWVWVWVW

    _jordan's Avatar
    Join Date
    Nov 2012
    Posts
    3,046
    Thanks given
    111
    Thanks received
    1,848
    Rep Power
    5000
    You forgot to include mobile
    Attached image
    Attached image
    Reply With Quote  
     

  4. #3  
    🖤Runic Developer🖤
    Castiel's Avatar
    Join Date
    Apr 2013
    Posts
    1,752
    Thanks given
    564
    Thanks received
    288
    Rep Power
    609
    love the tut man always 100% good

    Quote Originally Posted by _jordan View Post
    You forgot to include mobile
    there is no kronos mobile
    Attached image
    Attached image
    Reply With Quote  
     

  5. #4  
    Registered Member
    Join Date
    Dec 2020
    Posts
    3
    Thanks given
    0
    Thanks received
    0
    Rep Power
    0
    I'm trying to add Group ironman icon, followed the guide for kronos using Valkyr and the icon will not even save using the tool, reply to me on discord ASAP Armo
    Reply With Quote  
     


Thread Information
Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)


User Tag List

Similar Threads

  1. [OSRS] [Kronos] Adding Your Own Chat Crowns via RuneLite
    By Armo in forum Snippets
    Replies: 9
    Last Post: 02-12-2021, 04:49 AM
  2. [PI] adding your own stalls.
    By hontiris1 in forum Tutorials
    Replies: 25
    Last Post: 08-20-2013, 06:16 PM
  3. Replies: 0
    Last Post: 07-01-2010, 06:39 AM
  4. How do i add custom crowns via cache?
    By Mergim in forum Help
    Replies: 0
    Last Post: 08-30-2009, 12:10 PM
  5. Replies: 11
    Last Post: 12-02-2007, 04:38 AM
Posting Permissions
  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •