RuneScape 2 Development > RS Client Hacking

Colour conversion for the 317 client

Pages: <<< (2/3) >>>

sini:

^ I like this idea.

RandQm:

Looking how you guys having difficulties with this I'm probably thinking about something else but when I need colors.
But this always worked for me where I used it, replacing # by 0x

e.g. I wanted my sky to be blue, skyblue is in hex: #91FDFF
In my pixels drawing method I put 0x91FDFF and It will give me blue sky.

sk8rdude461:


--- Quote from: RandQm on January 25, 2015, 12:04:59 PM ---Looking how you guys having difficulties with this I'm probably thinking about something else but when I need colors.
But this always worked for me where I used it, replacing # by 0x

e.g. I wanted my sky to be blue, skyblue is in hex: #91FDFF
In my pixels drawing method I put 0x91FDFF and It will give me blue sky.

--- End quote ---
Your thinking right, but you're just in the wrong area :P
We're talking about the colors you would use for a model, not the colors you use when drawing the game screen/etc.
For example, you can see where the Model class reads the triangle colors here:

--- Code: Java ---                for (int i12 = 0; i12 < numTriangles; i12++) {                        triangleColours2[i12] = nc1.readUnsignedWord();                        if (l1 == 1) {                                anIntArray1637[i12] = nc2.readSignedByte();                                if (anIntArray1637[i12] == 2)                                        triangleColours2[i12] = 65535;                                anIntArray1637[i12] = 0;                        }                        if (i2 == 255) {                                anIntArray1638[i12] = nc3.readSignedByte();                        }                        if (j2 == 1) {                                anIntArray1639[i12] = nc4.readSignedByte();                                if (anIntArray1639[i12] < 0)                                        anIntArray1639[i12] = (256 + anIntArray1639[i12]);                        }                        if (k2 == 1)                                anIntArray1656[i12] = nc5.readUnsignedByte();                        if (l2 == 1)                                D[i12] = (short) (nc6.readUnsignedWord() - 1);                        if (x != null)                                if (D[i12] != -1)                                        x[i12] = (byte) (nc7.readUnsignedByte() - 1);                                else                                        x[i12] = -1;                }It's not the same as just using a hex value, sadly.

ohokay:


--- Quote from: Miss Silabsoft on January 20, 2015, 07:06:40 PM ---you could bruteforce it, take the color array compare your value to find the color that's closest to the value and return.



--- Code: ---public class BruteForceColorFinder {

    private int[] palette;

    public void createPalette() {
        palette = new int[0x10000];
        int hsl = 0;
        for (int k = 0; k < 512; k++) {
            double d1 = k / 8 / 64D + 0.0078125D;
            double d2 = (k & 7) / 8D + 0.0625D;
            for (int k1 = 0; k1 < 128; k1++) {
                double d3 = k1 / 128D;
                double r = d3;
                double g = d3;
                double b = d3;
                if (d2 != 0.0D) {
                    double d7;
                    if (d3 < 0.5D) {
                        d7 = d3 * (1.0D + d2);
                    } else {
                        d7 = (d3 + d2) - d3 * d2;
                    }
                    double d8 = 2D * d3 - d7;
                    double d9 = d1 + 0.33333333333333331D;
                    if (d9 > 1.0D) {
                        d9--;
                    }
                    double d10 = d1;
                    double d11 = d1 - 0.33333333333333331D;
                    if (d11 < 0.0D) {
                        d11++;
                    }
                    if (6D * d9 < 1.0D) {
                        r = d8 + (d7 - d8) * 6D * d9;
                    } else if (2D * d9 < 1.0D) {
                        r = d7;
                    } else if (3D * d9 < 2D) {
                        r = d8 + (d7 - d8) * (0.66666666666666663D - d9) * 6D;
                    } else {
                        r = d8;
                    }
                    if (6D * d10 < 1.0D) {
                        g = d8 + (d7 - d8) * 6D * d10;
                    } else if (2D * d10 < 1.0D) {
                        g = d7;
                    } else if (3D * d10 < 2D) {
                        g = d8 + (d7 - d8) * (0.66666666666666663D - d10) * 6D;
                    } else {
                        g = d8;
                    }
                    if (6D * d11 < 1.0D) {
                        b = d8 + (d7 - d8) * 6D * d11;
                    } else if (2D * d11 < 1.0D) {
                        b = d7;
                    } else if (3D * d11 < 2D) {
                        b = d8 + (d7 - d8) * (0.66666666666666663D - d11) * 6D;
                    } else {
                        b = d8;
                    }
                }
                int byteR = (int) (r * 256D);
                int byteG = (int) (g * 256D);
                int byteB = (int) (b * 256D);
                int rgb = (byteR << 16) + (byteG << 8) + byteB;
                if (rgb == 0) {
                    rgb = 1;
                }
                palette[hsl++] = rgb;
            }
        }
    }

    public BruteForceColorFinder() {
        this.createPalette();
    }

    public static void main(String args[]) {
        BruteForceColorFinder bfc = new BruteForceColorFinder();
        Color color = Color.BLACK;
        System.out.println(bfc.findBestMatch(color.getRGB()));
        color = hex2Rgb("#efefef");
        System.out.println(bfc.findBestMatch(color.getRGB()));
    }

    public int findBestMatch(int color) {
        int r = (color >> 16) & 0xFF;
        int g = (color >> 8) & 0xFF;
        int b = color & 0xFF;
        int rgb = (r << 16) + (g << 8) + b;
        int best = 0;
        int idx = 0;
        for (int c = 1; c < palette.length; c++) {
            int temp = Math.abs(palette[c] - rgb);
            if (temp == 0) {
                return palette[c];
            }
            if (best == 0 || best > temp) {
                idx = c;
                best = temp;
            }
        }
        return palette[idx];
    }

    public static Color hex2Rgb(String colorStr) {
        return new Color(
                Integer.valueOf(colorStr.substring(1, 3), 16),
                Integer.valueOf(colorStr.substring(3, 5), 16),
                Integer.valueOf(colorStr.substring(5, 7), 16));
    }
}



--- End code ---

--- End quote ---

From what I've tested, this seems to do the trick, thank you  :)

RuneAgent:


--- Quote from: ohokay on January 25, 2015, 08:59:41 PM ---
--- Quote from: Miss Silabsoft on January 20, 2015, 07:06:40 PM ---you could bruteforce it, take the color array compare your value to find the color that's closest to the value and return.



--- Code: ---public class BruteForceColorFinder {

    private int[] palette;

    public void createPalette() {
        palette = new int[0x10000];
        int hsl = 0;
        for (int k = 0; k < 512; k++) {
            double d1 = k / 8 / 64D + 0.0078125D;
            double d2 = (k & 7) / 8D + 0.0625D;
            for (int k1 = 0; k1 < 128; k1++) {
                double d3 = k1 / 128D;
                double r = d3;
                double g = d3;
                double b = d3;
                if (d2 != 0.0D) {
                    double d7;
                    if (d3 < 0.5D) {
                        d7 = d3 * (1.0D + d2);
                    } else {
                        d7 = (d3 + d2) - d3 * d2;
                    }
                    double d8 = 2D * d3 - d7;
                    double d9 = d1 + 0.33333333333333331D;
                    if (d9 > 1.0D) {
                        d9--;
                    }
                    double d10 = d1;
                    double d11 = d1 - 0.33333333333333331D;
                    if (d11 < 0.0D) {
                        d11++;
                    }
                    if (6D * d9 < 1.0D) {
                        r = d8 + (d7 - d8) * 6D * d9;
                    } else if (2D * d9 < 1.0D) {
                        r = d7;
                    } else if (3D * d9 < 2D) {
                        r = d8 + (d7 - d8) * (0.66666666666666663D - d9) * 6D;
                    } else {
                        r = d8;
                    }
                    if (6D * d10 < 1.0D) {
                        g = d8 + (d7 - d8) * 6D * d10;
                    } else if (2D * d10 < 1.0D) {
                        g = d7;
                    } else if (3D * d10 < 2D) {
                        g = d8 + (d7 - d8) * (0.66666666666666663D - d10) * 6D;
                    } else {
                        g = d8;
                    }
                    if (6D * d11 < 1.0D) {
                        b = d8 + (d7 - d8) * 6D * d11;
                    } else if (2D * d11 < 1.0D) {
                        b = d7;
                    } else if (3D * d11 < 2D) {
                        b = d8 + (d7 - d8) * (0.66666666666666663D - d11) * 6D;
                    } else {
                        b = d8;
                    }
                }
                int byteR = (int) (r * 256D);
                int byteG = (int) (g * 256D);
                int byteB = (int) (b * 256D);
                int rgb = (byteR << 16) + (byteG << 8) + byteB;
                if (rgb == 0) {
                    rgb = 1;
                }
                palette[hsl++] = rgb;
            }
        }
    }

    public BruteForceColorFinder() {
        this.createPalette();
    }

    public static void main(String args[]) {
        BruteForceColorFinder bfc = new BruteForceColorFinder();
        Color color = Color.BLACK;
        System.out.println(bfc.findBestMatch(color.getRGB()));
        color = hex2Rgb("#efefef");
        System.out.println(bfc.findBestMatch(color.getRGB()));
    }

    public int findBestMatch(int color) {
        int r = (color >> 16) & 0xFF;
        int g = (color >> 8) & 0xFF;
        int b = color & 0xFF;
        int rgb = (r << 16) + (g << 8) + b;
        int best = 0;
        int idx = 0;
        for (int c = 1; c < palette.length; c++) {
            int temp = Math.abs(palette[c] - rgb);
            if (temp == 0) {
                return palette[c];
            }
            if (best == 0 || best > temp) {
                idx = c;
                best = temp;
            }
        }
        return palette[idx];
    }

    public static Color hex2Rgb(String colorStr) {
        return new Color(
                Integer.valueOf(colorStr.substring(1, 3), 16),
                Integer.valueOf(colorStr.substring(3, 5), 16),
                Integer.valueOf(colorStr.substring(5, 7), 16));
    }
}



--- End code ---

--- End quote ---

From what I've tested, this seems to do the trick, thank you  :)

--- End quote ---

That's cool if you ever find a better method feel free to post it here.

Pages: <<< (2/3) >>>

Go to full version