The server you are missing opcodes when u read the data as for the client stacks u probs have errors being suppressed somewhere so them client errors dont rlly help us. add me on discord and ill help u out, or run the client on debug and it will break where it happensIm getting this error on a constant loop. I have added a modelLoader class and adjusted it all to link with my model class. I have added the new Model(int modelId) into my model.java, i have added all the readvalues to the correct classes objdef, itemdef and npcdef. I have updated the collisionmap, I have added the readSmart() and the readUnsignedIntSmartShortCompat(). I have loaded 207.4 data, loc.dat, npc.dat, obj.dat etc. and i made sure i did the mapIndex BOTH client/Server side aswell as loc.dat and loc.idx. I have repacked the cache index1,2,4 that came with the 207.4 data. As i said above i get this error down below and i can log into the game and i can move but all graphics are just not there, so no minimap, world, npc etc. I am also getting opcode error messages server side which is also pasted below. Im not sure where to go with this info. I believe i haven't missed anything in the snippets above. I followed the guide posted by Mark.
Spoiler for Client stack:Code:java.lang.ArrayIndexOutOfBoundsException java.lang.ArrayIndexOutOfBoundsException java.lang.ArrayIndexOutOfBoundsException java.lang.ArrayIndexOutOfBoundsException java.lang.ArrayIndexOutOfBoundsException java.lang.ArrayIndexOutOfBoundsException java.lang.ArrayIndexOutOfBoundsException java.lang.ArrayIndexOutOfBoundsException java.lang.ArrayIndexOutOfBoundsException java.lang.ArrayIndexOutOfBoundsException java.lang.ArrayIndexOutOfBoundsException java.lang.ArrayIndexOutOfBoundsException java.lang.ArrayIndexOutOfBoundsException java.lang.ArrayIndexOutOfBoundsException java.lang.ArrayIndexOutOfBoundsException java.lang.ArrayIndexOutOfBoundsException java.lang.ArrayIndexOutOfBoundsException java.lang.ArrayIndexOutOfBoundsException java.lang.ArrayIndexOutOfBoundsException java.lang.ArrayIndexOutOfBoundsException java.lang.ArrayIndexOutOfBoundsException java.lang.ArrayIndexOutOfBoundsException java.lang.ArrayIndexOutOfBoundsException java.lang.ArrayIndexOutOfBoundsException java.lang.ArrayIndexOutOfBoundsException
Spoiler for Server stack:Code:Sept 24, 2022 8:15:11 PM com.elvarg.game.definition.loader.DefinitionLoader run INFO: Loaded definitions for: ./data/definitions/object_spawns.json. It took 199 milliseconds. Sept 24, 2022 8:15:11 PM com.elvarg.game.definition.loader.DefinitionLoader run INFO: Loaded definitions for: ./data/definitions/items.json. It took 251 milliseconds. Sept 24, 2022 8:15:11 PM com.elvarg.game.definition.loader.DefinitionLoader run INFO: Loaded definitions for: ./data/definitions/shops.json. It took 8 milliseconds. Sept 24, 2022 8:15:11 PM com.elvarg.game.definition.loader.DefinitionLoader run INFO: Loaded definitions for: ./data/definitions/npc_defs.json. It took 56 milliseconds. Sept 24, 2022 8:15:11 PM com.elvarg.game.definition.loader.DefinitionLoader run INFO: Loaded definitions for: ./data/definitions/npc_drops.json. It took 36 milliseconds. Sept 24, 2022 8:15:11 PM com.elvarg.game.definition.loader.DefinitionLoader run INFO: Loaded definitions for: ./data/definitions/npc_spawns.json. It took 62 milliseconds. invalid opcode: 61 invalid opcode: 3 invalid opcode: 129 invalid opcode: 61 invalid opcode: 6 invalid opcode: 148 invalid opcode: 61 invalid opcode: 6 invalid opcode: 148 invalid opcode: 61 invalid opcode: 6 invalid opcode: 148 invalid opcode: 61 invalid opcode: 3 invalid opcode: 192 Sept 24, 2022 8:15:11 PM com.elvarg.game.definition.loader.DefinitionLoader run INFO: Loaded definitions for: ./data/definitions/global_presets.json. It took 30 milliseconds. Sept 24, 2022 8:15:12 PM com.elvarg.Server main INFO: RuneScape is now online! invalid opcode: 61 invalid opcode: 3 invalid opcode: 4 invalid opcode: 61 invalid opcode: 3 invalid opcode: 192 invalid opcode: 61 invalid opcode: 61 invalid opcode: 6 invalid opcode: 148 invalid opcode: 61 invalid opcode: 6 invalid opcode: 148 invalid opcode: 61 invalid opcode: 6 invalid opcode: 148 invalid opcode: 61 invalid opcode: 3 invalid opcode: 192 invalid opcode: 61 invalid opcode: 61 invalid opcode: 61 invalid opcode: 61 invalid opcode: 61 invalid opcode: 61 invalid opcode: 61 [World] Registering player - [username, host] : [Florrey, 127.0.0.1] invalid opcode: 61 invalid opcode: 61 invalid opcode: 61 invalid opcode: 61 invalid opcode: 61 invalid opcode: 61 invalid opcode: 3 invalid opcode: 129 [World] Deregistering player - [username, host] : [Florrey, 127.0.0.1]
Spoiler for model.java:Code:private Model(int modelId) { byte[] is = modelHeader[modelId].aByteArray368; if (is[is.length - 1] == -3 && is[is.length - 2] == -1) { ModelLoader.decodeType3(this, is); } else if (is[is.length - 1] == -2 && is[is.length - 2] == -1) { ModelLoader.decodeType2(this, is); } else if (is[is.length - 1] == -1 && is[is.length - 2] == -1) { ModelLoader.decodeType1(this, is); } else { ModelLoader.decodeOldFormat(this, is); } }
Spoiler for modelLoader.java:Code:package com.runescape.entity.model; import com.runescape.io.Buffer; public class ModelLoader { public static void decodeType3(Model def, byte[] var1) { Buffer var2 = new Buffer(var1); Buffer var3 = new Buffer(var1); Buffer var4 = new Buffer(var1); Buffer var5 = new Buffer(var1); Buffer var6 = new Buffer(var1); Buffer var7 = new Buffer(var1); Buffer var8 = new Buffer(var1); var2.setOffset(var1.length - 26); int var9 = var2.readUShort(); int var10 = var2.readUShort(); int var11 = var2.readUnsignedByte(); int var12 = var2.readUnsignedByte(); int var13 = var2.readUnsignedByte(); int var14 = var2.readUnsignedByte(); int var15 = var2.readUnsignedByte(); int var16 = var2.readUnsignedByte(); int var17 = var2.readUnsignedByte(); int var18 = var2.readUnsignedByte(); int var19 = var2.readUShort(); int var20 = var2.readUShort(); int var21 = var2.readUShort(); int var22 = var2.readUShort(); int var23 = var2.readUShort(); int var24 = var2.readUShort(); int var25 = 0; int var26 = 0; int var27 = 0; int var28; if (var11 > 0) { def.texture_type = new byte[var11]; var2.setOffset(0); for (var28 = 0; var28 < var11; ++var28) { byte var29 = def.texture_type[var28] = var2.readByteS(); if (var29 == 0) { ++var25; } if (var29 >= 1 && var29 <= 3) { ++var26; } if (var29 == 2) { ++var27; } } } var28 = var11 + var9; int var58 = var28; if (var12 == 1) { var28 += var10; } int var30 = var28; var28 += var10; int var31 = var28; if (var13 == 255) { var28 += var10; } int var32 = var28; if (var15 == 1) { var28 += var10; } int var33 = var28; var28 += var24; int var34 = var28; if (var14 == 1) { var28 += var10; } int var35 = var28; var28 += var22; int var36 = var28; if (var16 == 1) { var28 += var10 * 2; } int var37 = var28; var28 += var23; int var38 = var28; var28 += var10 * 2; int var39 = var28; var28 += var19; int var40 = var28; var28 += var20; int var41 = var28; var28 += var21; int var42 = var28; var28 += var25 * 6; int var43 = var28; var28 += var26 * 6; int var44 = var28; var28 += var26 * 6; int var45 = var28; var28 += var26 * 2; int var46 = var28; var28 += var26; int var47 = var28; var28 = var28 + var26 * 2 + var27 * 2; def.numVertices = var9; def.numTriangles = var10; def.numberOfTexturesFaces = var11; def.vertexX = new int[var9]; def.vertexY = new int[var9]; def.vertexZ = new int[var9]; def.facePointA = new int[var10]; def.facePointB = new int[var10]; def.facePointC = new int[var10]; if (var17 == 1) { def.vertexVSkin = new int[var9]; } if (var12 == 1) { def.faceDrawType = new int[var10]; } if (var13 == 255) { def.face_render_priorities = new byte[var10]; } else { def.face_priority = (byte) var13; } if (var14 == 1) { def.face_alpha = new int[var10]; } if (var15 == 1) { def.triangleTSkin = new int[var10]; } if (var16 == 1) { def.materials = new short[var10]; } if (var16 == 1 && var11 > 0) { def.texture_type = new byte[var10]; } if (var18 == 1) { def.animayaGroups = new int[var9][]; def.animayaScales = new int[var9][]; } def.triangleColours = new short[var10]; if (var11 > 0) { def.textures_face_a = new short[var11]; def.textures_face_b = new short[var11]; def.textures_face_c = new short[var11]; } var2.setOffset(var11); var3.setOffset(var39); var4.setOffset(var40); var5.setOffset(var41); var6.setOffset(var33); int var48 = 0; int var49 = 0; int var50 = 0; int var51; int var52; int var53; int var54; int var55; for (var51 = 0; var51 < var9; ++var51) { var52 = var2.readUnsignedByte(); var53 = 0; if ((var52 & 1) != 0) { var53 = var3.readSmart(); } var54 = 0; if ((var52 & 2) != 0) { var54 = var4.readSmart(); } var55 = 0; if ((var52 & 4) != 0) { var55 = var5.readSmart(); } def.vertexX[var51] = var48 + var53; def.vertexY[var51] = var49 + var54; def.vertexZ[var51] = var50 + var55; var48 = def.vertexX[var51]; var49 = def.vertexY[var51]; var50 = def.vertexZ[var51]; if (var17 == 1) { def.vertexVSkin[var51] = var6.readUnsignedByte(); } } if (var18 == 1) { for (var51 = 0; var51 < var9; ++var51) { var52 = var6.readUnsignedByte(); def.animayaGroups[var51] = new int[var52]; def.animayaScales[var51] = new int[var52]; for (var53 = 0; var53 < var52; ++var53) { def.animayaGroups[var51][var53] = var6.readUnsignedByte(); def.animayaScales[var51][var53] = var6.readUnsignedByte(); } } } var2.setOffset(var38); var3.setOffset(var58); var4.setOffset(var31); var5.setOffset(var34); var6.setOffset(var32); var7.setOffset(var36); var8.setOffset(var37); for (var51 = 0; var51 < var10; ++var51) { def.triangleColours[var51] = (short) var2.readUShort(); if (var12 == 1) { def.faceDrawType[var51] = var3.readByteS(); } if (var13 == 255) { def.face_render_priorities[var51] = var4.readByteS(); } if (var14 == 1) { def.face_alpha[var51] = var5.readByteS(); if (def.face_alpha[var51] < 0) { def.face_alpha[var51] = (256 + def.face_alpha[var51]); } } if (var15 == 1) { def.triangleTSkin[var51] = var6.readUnsignedByte(); } if (var16 == 1) { def.materials[var51] = (short) (var7.readUShort() - 1); } if (def.texture != null && def.materials[var51] != -1) { def.texture[var51] = (byte) (var8.readUnsignedByte() - 1); } } var2.setOffset(var35); var3.setOffset(var30); var51 = 0; var52 = 0; var53 = 0; var54 = 0; int var56; for (var55 = 0; var55 < var10; ++var55) { var56 = var3.readUnsignedByte(); if (var56 == 1) { var51 = var2.readSmart() + var54; var52 = var2.readSmart() + var51; var53 = var2.readSmart() + var52; var54 = var53; def.facePointA[var55] = var51; def.facePointB[var55] = var52; def.facePointC[var55] = var53; } if (var56 == 2) { var52 = var53; var53 = var2.readSmart() + var54; var54 = var53; def.facePointA[var55] = var51; def.facePointB[var55] = var52; def.facePointC[var55] = var53; } if (var56 == 3) { var51 = var53; var53 = var2.readSmart() + var54; var54 = var53; def.facePointA[var55] = var51; def.facePointB[var55] = var52; def.facePointC[var55] = var53; } if (var56 == 4) { int var57 = var51; var51 = var52; var52 = var57; var53 = var2.readSmart() + var54; var54 = var53; def.facePointA[var55] = var51; def.facePointB[var55] = var57; def.facePointC[var55] = var53; } } var2.setOffset(var42); var3.setOffset(var43); var4.setOffset(var44); var5.setOffset(var45); var6.setOffset(var46); var7.setOffset(var47); for (var55 = 0; var55 < var11; ++var55) { var56 = def.texture_type[var55] & 255; if (var56 == 0) { def.textures_face_a[var55] = (short) var2.readUShort(); def.textures_face_b[var55] = (short) var2.readUShort(); def.textures_face_c[var55] = (short) var2.readUShort(); } } var2.setOffset(var28); var55 = var2.readUnsignedByte(); if (var55 != 0) { var2.readUShort(); var2.readUShort(); var2.readUShort(); var2.readInt(); } } public static void decodeType2(Model def, byte[] var1) { boolean var2 = false; boolean var3 = false; Buffer var4 = new Buffer(var1); Buffer var5 = new Buffer(var1); Buffer var6 = new Buffer(var1); Buffer var7 = new Buffer(var1); Buffer var8 = new Buffer(var1); var4.setOffset(var1.length - 23); int var9 = var4.readUShort(); int var10 = var4.readUShort(); int var11 = var4.readUnsignedByte(); int var12 = var4.readUnsignedByte(); int var13 = var4.readUnsignedByte(); int var14 = var4.readUnsignedByte(); int var15 = var4.readUnsignedByte(); int var16 = var4.readUnsignedByte(); int var17 = var4.readUnsignedByte(); int var18 = var4.readUShort(); int var19 = var4.readUShort(); int var20 = var4.readUShort(); int var21 = var4.readUShort(); int var22 = var4.readUShort(); byte var23 = 0; int var24 = var23 + var9; int var25 = var24; var24 += var10; int var26 = var24; if (var13 == 255) { var24 += var10; } int var27 = var24; if (var15 == 1) { var24 += var10; } int var28 = var24; if (var12 == 1) { var24 += var10; } int var29 = var24; var24 += var22; int var30 = var24; if (var14 == 1) { var24 += var10; } int var31 = var24; var24 += var21; int var32 = var24; var24 += var10 * 2; int var33 = var24; var24 += var11 * 6; int var34 = var24; var24 += var18; int var35 = var24; var24 += var19; int var10000 = var24 + var20; def.numVertices = var9; def.numTriangles = var10; def.numberOfTexturesFaces = var11; def.vertexX = new int[var9]; def.vertexY = new int[var9]; def.vertexZ = new int[var9]; def.facePointA = new int[var10]; def.facePointB = new int[var10]; def.facePointC = new int[var10]; if (var11 > 0) { def.texture_type = new byte[var11]; def.textures_face_a = new short[var11]; def.textures_face_b = new short[var11]; def.textures_face_c = new short[var11]; } if (var16 == 1) { def.vertexVSkin = new int[var9]; } if (var12 == 1) { def.faceDrawType = new int[var10]; def.texture_type = new byte[var10]; def.materials = new short[var10]; } if (var13 == 255) { def.face_render_priorities = new byte[var10]; } else { def.face_priority = (byte) var13; } if (var14 == 1) { def.face_alpha = new int[var10]; } if (var15 == 1) { def.triangleTSkin = new int[var10]; } if (var17 == 1) { def.animayaGroups = new int[var9][]; def.animayaScales = new int[var9][]; } def.triangleColours = new short[var10]; var4.setOffset(var23); var5.setOffset(var34); var6.setOffset(var35); var7.setOffset(var24); var8.setOffset(var29); int var37 = 0; int var38 = 0; int var39 = 0; int var40; int var41; int var42; int var43; int var44; for (var40 = 0; var40 < var9; ++var40) { var41 = var4.readUnsignedByte(); var42 = 0; if ((var41 & 1) != 0) { var42 = var5.readSmart(); } var43 = 0; if ((var41 & 2) != 0) { var43 = var6.readSmart(); } var44 = 0; if ((var41 & 4) != 0) { var44 = var7.readSmart(); } def.vertexX[var40] = var37 + var42; def.vertexY[var40] = var38 + var43; def.vertexZ[var40] = var39 + var44; var37 = def.vertexX[var40]; var38 = def.vertexY[var40]; var39 = def.vertexZ[var40]; if (var16 == 1) { def.vertexVSkin[var40] = var8.readUnsignedByte(); } } if (var17 == 1) { for (var40 = 0; var40 < var9; ++var40) { var41 = var8.readUnsignedByte(); def.animayaGroups[var40] = new int[var41]; def.animayaScales[var40] = new int[var41]; for (var42 = 0; var42 < var41; ++var42) { def.animayaGroups[var40][var42] = var8.readUnsignedByte(); def.animayaScales[var40][var42] = var8.readUnsignedByte(); } } } var4.setOffset(var32); var5.setOffset(var28); var6.setOffset(var26); var7.setOffset(var30); var8.setOffset(var27); for (var40 = 0; var40 < var10; ++var40) { def.triangleColours[var40] = (short) var4.readUShort(); if (var12 == 1) { var41 = var5.readUnsignedByte(); if ((var41 & 1) == 1) { def.faceDrawType[var40] = 1; var2 = true; } else { def.faceDrawType[var40] = 0; } if ((var41 & 2) == 2) { def.texture[var40] = (byte) (var41 >> 2); def.materials[var40] = def.triangleColours[var40]; def.triangleColours[var40] = 127; if (def.materials[var40] != -1) { var3 = true; } } else { def.texture[var40] = -1; def.materials[var40] = -1; } } if (var13 == 255) { def.face_render_priorities[var40] = var6.readByteS(); } if (var14 == 1) { def.face_alpha[var40] = var7.readByteS(); if (def.face_alpha[var40] < 0) { def.face_alpha[var40] = (256 + def.face_alpha[var40]); } } if (var15 == 1) { def.triangleTSkin[var40] = var8.readUnsignedByte(); } } var4.setOffset(var31); var5.setOffset(var25); var40 = 0; var41 = 0; var42 = 0; var43 = 0; int var45; int var46; for (var44 = 0; var44 < var10; ++var44) { var45 = var5.readUnsignedByte(); if (var45 == 1) { var40 = var4.readSmart() + var43; var41 = var4.readSmart() + var40; var42 = var4.readSmart() + var41; var43 = var42; def.facePointA[var44] = var40; def.facePointB[var44] = var41; def.facePointC[var44] = var42; } if (var45 == 2) { var41 = var42; var42 = var4.readSmart() + var43; var43 = var42; def.facePointA[var44] = var40; def.facePointB[var44] = var41; def.facePointC[var44] = var42; } if (var45 == 3) { var40 = var42; var42 = var4.readSmart() + var43; var43 = var42; def.facePointA[var44] = var40; def.facePointB[var44] = var41; def.facePointC[var44] = var42; } if (var45 == 4) { var46 = var40; var40 = var41; var41 = var46; var42 = var4.readSmart() + var43; var43 = var42; def.facePointA[var44] = var40; def.facePointB[var44] = var46; def.facePointC[var44] = var42; } } var4.setOffset(var33); for (var44 = 0; var44 < var11; ++var44) { def.texture_type[var44] = 0; def.textures_face_a[var44] = (short) var4.readUShort(); def.textures_face_b[var44] = (short) var4.readUShort(); def.textures_face_c[var44] = (short) var4.readUShort(); } if (def.texture != null) { boolean var47 = false; for (var45 = 0; var45 < var10; ++var45) { var46 = def.texture[var45] & 255; if (var46 != 255) { if (def.facePointA[var45] == (def.textures_face_a[var46] & '\uffff') && def.facePointB[var45] == (def.textures_face_b[var46] & '\uffff') && def.facePointC[var45] == (def.textures_face_c[var46] & '\uffff')) { def.texture[var45] = -1; } else { var47 = true; } } } if (!var47) { def.texture = null; } } if (!var3) { def.materials = null; } if (!var2) { def.faceDrawType = null; } } public static void decodeType1(Model def, byte[] var1) { Buffer var2 = new Buffer(var1); Buffer var3 = new Buffer(var1); Buffer var4 = new Buffer(var1); Buffer var5 = new Buffer(var1); Buffer var6 = new Buffer(var1); Buffer var7 = new Buffer(var1); Buffer var8 = new Buffer(var1); var2.setOffset(var1.length - 23); int var9 = var2.readUShort(); int var10 = var2.readUShort(); int var11 = var2.readUnsignedByte(); int var12 = var2.readUnsignedByte(); int var13 = var2.readUnsignedByte(); int var14 = var2.readUnsignedByte(); int var15 = var2.readUnsignedByte(); int var16 = var2.readUnsignedByte(); int var17 = var2.readUnsignedByte(); int var18 = var2.readUShort(); int var19 = var2.readUShort(); int var20 = var2.readUShort(); int var21 = var2.readUShort(); int var22 = var2.readUShort(); int var23 = 0; int var24 = 0; int var25 = 0; int var26; if (var11 > 0) { def.texture_type = new byte[var11]; var2.setOffset(0); for (var26 = 0; var26 < var11; ++var26) { byte var27 = def.texture_type[var26] = var2.readByteS(); if (var27 == 0) { ++var23; } if (var27 >= 1 && var27 <= 3) { ++var24; } if (var27 == 2) { ++var25; } } } var26 = var11 + var9; int var56 = var26; if (var12 == 1) { var26 += var10; } int var28 = var26; var26 += var10; int var29 = var26; if (var13 == 255) { var26 += var10; } int var30 = var26; if (var15 == 1) { var26 += var10; } int var31 = var26; if (var17 == 1) { var26 += var9; } int var32 = var26; if (var14 == 1) { var26 += var10; } int var33 = var26; var26 += var21; int var34 = var26; if (var16 == 1) { var26 += var10 * 2; } int var35 = var26; var26 += var22; int var36 = var26; var26 += var10 * 2; int var37 = var26; var26 += var18; int var38 = var26; var26 += var19; int var39 = var26; var26 += var20; int var40 = var26; var26 += var23 * 6; int var41 = var26; var26 += var24 * 6; int var42 = var26; var26 += var24 * 6; int var43 = var26; var26 += var24 * 2; int var44 = var26; var26 += var24; int var45 = var26; var26 = var26 + var24 * 2 + var25 * 2; def.numVertices = var9; def.numTriangles = var10; def.numberOfTexturesFaces = var11; def.vertexX = new int[var9]; def.vertexY = new int[var9]; def.vertexZ = new int[var9]; def.facePointA = new int[var10]; def.facePointB = new int[var10]; def.facePointC = new int[var10]; if (var17 == 1) { def.vertexVSkin = new int[var9]; } if (var12 == 1) { def.faceDrawType = new int[var10]; } if (var13 == 255) { def.face_render_priorities = new byte[var10]; } else { def.face_priority = (byte) var13; } if (var14 == 1) { def.face_alpha = new int[var10]; } if (var15 == 1) { def.triangleTSkin = new int[var10]; } if (var16 == 1) { def.materials = new short[var10]; } if (var16 == 1 && var11 > 0) { def.texture_type = new byte[var10]; } def.triangleColours = new short[var10]; if (var11 > 0) { def.textures_face_a = new short[var11]; def.textures_face_b = new short[var11]; def.textures_face_c = new short[var11]; } var2.setOffset(var11); var3.setOffset(var37); var4.setOffset(var38); var5.setOffset(var39); var6.setOffset(var31); int var46 = 0; int var47 = 0; int var48 = 0; int var49; int var50; int var51; int var52; int var53; for (var49 = 0; var49 < var9; ++var49) { var50 = var2.readUnsignedByte(); var51 = 0; if ((var50 & 1) != 0) { var51 = var3.readSmart(); } var52 = 0; if ((var50 & 2) != 0) { var52 = var4.readSmart(); } var53 = 0; if ((var50 & 4) != 0) { var53 = var5.readSmart(); } def.vertexX[var49] = var46 + var51; def.vertexY[var49] = var47 + var52; def.vertexZ[var49] = var48 + var53; var46 = def.vertexX[var49]; var47 = def.vertexY[var49]; var48 = def.vertexZ[var49]; if (var17 == 1) { def.vertexVSkin[var49] = var6.readUnsignedByte(); } } var2.setOffset(var36); var3.setOffset(var56); var4.setOffset(var29); var5.setOffset(var32); var6.setOffset(var30); var7.setOffset(var34); var8.setOffset(var35); for (var49 = 0; var49 < var10; ++var49) { def.triangleColours[var49] = (short) var2.readUShort(); if (var12 == 1) { def.faceDrawType[var49] = var3.readByteS(); } if (var13 == 255) { def.face_render_priorities[var49] = var4.readByteS(); } if (var14 == 1) { def.face_alpha[var49] = var5.readByteS(); if (def.face_alpha[var49] < 0) { def.face_alpha[var49] = (256 + def.face_alpha[var40]); } } if (var15 == 1) { def.triangleTSkin[var49] = var6.readUnsignedByte(); } if (var16 == 1) { def.materials[var49] = (short) (var7.readUShort() - 1); } if (def.texture != null && def.materials[var49] != -1) { def.texture[var49] = (byte) (var8.readUnsignedByte() - 1); } } var2.setOffset(var33); var3.setOffset(var28); var49 = 0; var50 = 0; var51 = 0; var52 = 0; int var54; for (var53 = 0; var53 < var10; ++var53) { var54 = var3.readUnsignedByte(); if (var54 == 1) { var49 = var2.readSmart() + var52; var50 = var2.readSmart() + var49; var51 = var2.readSmart() + var50; var52 = var51; def.facePointA[var53] = var49; def.facePointB[var53] = var50; def.facePointC[var53] = var51; } if (var54 == 2) { var50 = var51; var51 = var2.readSmart() + var52; var52 = var51; def.facePointA[var53] = var49; def.facePointB[var53] = var50; def.facePointC[var53] = var51; } if (var54 == 3) { var49 = var51; var51 = var2.readSmart() + var52; var52 = var51; def.facePointA[var53] = var49; def.facePointB[var53] = var50; def.facePointC[var53] = var51; } if (var54 == 4) { int var55 = var49; var49 = var50; var50 = var55; var51 = var2.readSmart() + var52; var52 = var51; def.facePointA[var53] = var49; def.facePointB[var53] = var55; def.facePointC[var53] = var51; } } var2.setOffset(var40); var3.setOffset(var41); var4.setOffset(var42); var5.setOffset(var43); var6.setOffset(var44); var7.setOffset(var45); for (var53 = 0; var53 < var11; ++var53) { var54 = def.texture_type[var53] & 255; if (var54 == 0) { def.textures_face_a[var53] = (short) var2.readUShort(); def.textures_face_b[var53] = (short) var2.readUShort(); def.textures_face_c[var53] = (short) var2.readUShort(); } } var2.setOffset(var26); var53 = var2.readUnsignedByte(); if (var53 != 0) { var2.readUShort(); var2.readUShort(); var2.readUShort(); var2.readInt(); } } public static void decodeOldFormat(Model def, byte[] var1) { boolean var2 = false; boolean var3 = false; Buffer var4 = new Buffer(var1); Buffer var5 = new Buffer(var1); Buffer var6 = new Buffer(var1); Buffer var7 = new Buffer(var1); Buffer var8 = new Buffer(var1); var4.setOffset(var1.length - 18); int var9 = var4.readUShort(); int var10 = var4.readUShort(); int var11 = var4.readUnsignedByte(); int var12 = var4.readUnsignedByte(); int var13 = var4.readUnsignedByte(); int var14 = var4.readUnsignedByte(); int var15 = var4.readUnsignedByte(); int var16 = var4.readUnsignedByte(); int var17 = var4.readUShort(); int var18 = var4.readUShort(); int var19 = var4.readUShort(); int var20 = var4.readUShort(); byte var21 = 0; int var22 = var21 + var9; int var23 = var22; var22 += var10; int var24 = var22; if (var13 == 255) { var22 += var10; } int var25 = var22; if (var15 == 1) { var22 += var10; } int var26 = var22; if (var12 == 1) { var22 += var10; } int var27 = var22; if (var16 == 1) { var22 += var9; } int var28 = var22; if (var14 == 1) { var22 += var10; } int var29 = var22; var22 += var20; int var30 = var22; var22 += var10 * 2; int var31 = var22; var22 += var11 * 6; int var32 = var22; var22 += var17; int var33 = var22; var22 += var18; int var10000 = var22 + var19; def.numVertices = var9; def.numTriangles = var10; def.numberOfTexturesFaces = var11; def.vertexX = new int[var9]; def.vertexY = new int[var9]; def.vertexZ = new int[var9]; def.facePointA = new int[var10]; def.facePointB = new int[var10]; def.facePointC = new int[var10]; if (var11 > 0) { def.texture_type = new byte[var11]; def.textures_face_a = new short[var11]; def.textures_face_b = new short[var11]; def.textures_face_c = new short[var11]; } if (var16 == 1) { def.vertexVSkin = new int[var9]; } if (var12 == 1) { def.faceDrawType = new int[var10]; def.texture_type = new byte[var10]; def.materials = new short[var10]; } if (var13 == 255) { def.face_render_priorities = new byte[var10]; } else { def.face_priority = (byte) var13; } if (var14 == 1) { def.face_alpha = new int[var10]; } if (var15 == 1) { def.triangleTSkin = new int[var10]; } def.triangleColours = new short[var10]; var4.setOffset(var21); var5.setOffset(var32); var6.setOffset(var33); var7.setOffset(var22); var8.setOffset(var27); int var35 = 0; int var36 = 0; int var37 = 0; int var38; int var39; int var40; int var41; int var42; for (var38 = 0; var38 < var9; ++var38) { var39 = var4.readUnsignedByte(); var40 = 0; if ((var39 & 1) != 0) { var40 = var5.readSmart(); } var41 = 0; if ((var39 & 2) != 0) { var41 = var6.readSmart(); } var42 = 0; if ((var39 & 4) != 0) { var42 = var7.readSmart(); } def.vertexX[var38] = var35 + var40; def.vertexY[var38] = var36 + var41; def.vertexZ[var38] = var37 + var42; var35 = def.vertexX[var38]; var36 = def.vertexY[var38]; var37 = def.vertexZ[var38]; if (var16 == 1) { def.vertexVSkin[var38] = var8.readUnsignedByte(); } } var4.setOffset(var30); var5.setOffset(var26); var6.setOffset(var24); var7.setOffset(var28); var8.setOffset(var25); for (var38 = 0; var38 < var10; ++var38) { def.triangleColours[var38] = (short) var4.readUShort(); if (var12 == 1) { var39 = var5.readUnsignedByte(); if ((var39 & 1) == 1) { def.faceDrawType[var38] = 1; var2 = true; } else { def.faceDrawType[var38] = 0; } if ((var39 & 2) == 2) { def.texture[var38] = (byte) (var39 >> 2); def.materials[var38] = def.triangleColours[var38]; def.triangleColours[var38] = 127; if (def.materials[var38] != -1) { var3 = true; } } else { def.texture[var38] = -1; def.materials[var38] = -1; } } if (var13 == 255) { def.face_render_priorities[var38] = var6.readByteS(); } if (var14 == 1) { def.face_alpha[var38] = var7.readByteS(); if (def.face_alpha[var38] < 0) { def.face_alpha[var38] = (256 + def.face_alpha[var38]); } } if (var15 == 1) { def.triangleTSkin[var38] = var8.readUnsignedByte(); } } var4.setOffset(var29); var5.setOffset(var23); var38 = 0; var39 = 0; var40 = 0; var41 = 0; int var43; int var44; for (var42 = 0; var42 < var10; ++var42) { var43 = var5.readUnsignedByte(); if (var43 == 1) { var38 = var4.readSmart() + var41; var39 = var4.readSmart() + var38; var40 = var4.readSmart() + var39; var41 = var40; def.facePointA[var42] = var38; def.facePointB[var42] = var39; def.facePointC[var42] = var40; } if (var43 == 2) { var39 = var40; var40 = var4.readSmart() + var41; var41 = var40; def.facePointA[var42] = var38; def.facePointB[var42] = var39; def.facePointC[var42] = var40; } if (var43 == 3) { var38 = var40; var40 = var4.readSmart() + var41; var41 = var40; def.facePointA[var42] = var38; def.facePointB[var42] = var39; def.facePointC[var42] = var40; } if (var43 == 4) { var44 = var38; var38 = var39; var39 = var44; var40 = var4.readSmart() + var41; var41 = var40; def.facePointA[var42] = var38; def.facePointB[var42] = var44; def.facePointC[var42] = var40; } } var4.setOffset(var31); for (var42 = 0; var42 < var11; ++var42) { def.texture_type[var42] = 0; def.textures_face_a[var42] = (short) var4.readUShort(); def.textures_face_b[var42] = (short) var4.readUShort(); def.textures_face_c[var42] = (short) var4.readUShort(); } if (def.texture != null) { boolean var45 = false; for (var43 = 0; var43 < var10; ++var43) { var44 = def.texture[var43] & 255; if (var44 != 255) { if (def.facePointA[var43] == (def.textures_face_a[var44] & '\uffff') && def.facePointB[var43] == (def.textures_face_b[var44] & '\uffff') && def.facePointC[var43] == (def.textures_face_c[var44] & '\uffff')) { def.texture[var43] = -1; } else { var45 = true; } } } if (!var45) { def.texture = null; } } if (!var3) { def.materials = null; } if (!var2) { def.faceDrawType = null; } } }
Spoiler for readvalues:Code:objDef private void readValues(Buffer buffer) { while (true) { int opcode = buffer.readUnsignedByte(); if (opcode == 0) break; if (opcode == 1) { int len = buffer.readUnsignedByte(); if (len > 0) { if (modelIds == null) { modelTypes = new int[len]; modelIds = new int[len]; for (int i = 0; i < len; i++) { modelIds[i] = buffer.readUShort(); modelTypes[i] = buffer.readUnsignedByte(); } } else { buffer.currentPosition += len * 3; } } } else if (opcode == 2) name = buffer.readString(); else if (opcode == 3) description = buffer.readString(); else if (opcode == 5) { int len = buffer.readUnsignedByte(); if (len > 0) { if (modelIds == null) { modelTypes = null; modelIds = new int[len]; for (int i = 0; i < len; i++) { modelIds[i] = buffer.readUShort(); } } else { buffer.currentPosition += len * 3; } } } else if (opcode == 14) objectSizeX = buffer.readUnsignedByte(); else if (opcode == 15) objectSizeY = buffer.readUnsignedByte(); else if (opcode == 17) { solid = false; impenetrable = false; } else if (opcode == 18) impenetrable = false; else if (opcode == 19) isInteractive = (buffer.readUnsignedByte() == 1); else if (opcode == 21) contouredGround = true; else if (opcode == 22) delayShading = true; else if (opcode == 23) occludes = true; else if (opcode == 24) { // Object Animations animation = buffer.readUShort(); if (animation == 65535) animation = -1; } else if (opcode == 28) decorDisplacement = buffer.readUnsignedByte(); else if (opcode == 29) ambientLighting = buffer.readSignedByte(); else if (opcode == 39) lightDiffusion = buffer.readSignedByte(); else if (opcode >= 30 && opcode < 35) { if (interactions == null) interactions = new String[10]; interactions[opcode - 30] = buffer.readString(); if (interactions[opcode - 30].equalsIgnoreCase("hidden")) interactions[opcode - 30] = null; } else if (opcode == 40) { int len = buffer.readUnsignedByte(); modifiedModelColors = new int[len]; originalModelColors = new int[len]; for (int i = 0; i < len; i++) { modifiedModelColors[i] = buffer.readUShort(); originalModelColors[i] = buffer.readUShort(); } } else if (opcode == 41) { int len = buffer.readUnsignedByte(); modifiedTexture = new short[len]; originalTexture = new short[len]; for (int i = 0; i < len; i++) { modifiedTexture[i] = (short) buffer.readUShort(); originalTexture[i] = (short) buffer.readUShort(); } } else if (opcode == 61) { category = buffer.readUShort(); } else if (opcode == 62) inverted = true; else if (opcode == 64) castsShadow = false; else if (opcode == 65) scaleX = buffer.readUShort(); else if (opcode == 66) scaleY = buffer.readUShort(); else if (opcode == 67) scaleZ = buffer.readUShort(); else if (opcode == 68) mapscene = buffer.readUShort(); else if (opcode == 69) surroundings = buffer.readUnsignedByte(); else if (opcode == 70) translateX = buffer.readShort(); else if (opcode == 71) translateY = buffer.readShort(); else if (opcode == 72) translateZ = buffer.readShort(); else if (opcode == 73) obstructsGround = true; else if (opcode == 74) hollow = true; else if (opcode == 75) supportItems = buffer.readUnsignedByte(); else if (opcode == 77 || opcode == 92) { varbit = buffer.readUShort(); if (varp == 0xFFFF) { varp = -1; } varp = buffer.readUShort(); if (varbit == 0xFFFF) { varbit = -1; } int value = -1; if (opcode == 92) { value = buffer.readUShort(); if (value == 0xFFFF) { value = -1; } } int len = buffer.readUnsignedByte(); childrenIDs = new int[len + 2]; for (int i = 0; i <= len; ++i) { childrenIDs[i] = buffer.readUShort(); if (childrenIDs[i] == 0xFFFF) { childrenIDs[i] = -1; } } childrenIDs[len + 1] = value; } else if (opcode == 78) { ambientSoundId = buffer.readUShort(); anInt2083 = buffer.readUnsignedByte(); } else if (opcode == 79) { anInt2112 = buffer.readUShort(); anInt2113 = buffer.readUShort(); anInt2083 = buffer.readUShort(); int length = buffer.readUnsignedByte(); int[] anims = new int[length]; for (int index = 0; index < length; ++index) { anims[index] = buffer.readUShort(); } ambientSoundIds = anims; } else if (opcode == 81) { contouredGround = buffer.readUnsignedByte() == 1; } else if (opcode == 82) { minimapFunction = buffer.readUShort();//AreaType } else if (opcode == 89) { randomAnimStart = false; } else if (opcode == 249) { int length = buffer.readUnsignedByte(); Map<Integer, Object> params = new HashMap<>(length); for (int i = 0; i < length; i++) { boolean isString = buffer.readUnsignedByte() == 1; int key = buffer.read24Int(); Object value; if (isString) { value = buffer.readString(); System.out.println(value); } else { value = buffer.readInt(); } params.put(key, value); } this.params = params; } else { //System.err.printf("Error unrecognised {Objects} opcode: %d%n%n", opcode); } } post(); } private void post() { }Code:npcDEF public void readValues(Buffer buffer) { while (true) { int opcode = buffer.readUnsignedByte(); if (opcode == 0) return; if (opcode == 1) { int j = buffer.readUnsignedByte(); modelId = new int[j]; for (int j1 = 0; j1 < j; j1++) { modelId[j1] = buffer.readUShort(); } } else if (opcode == 2) name = buffer.readString(); else if (opcode == 3) description = buffer.readBytes(); else if (opcode == 12) size = buffer.readSignedByte(); else if (opcode == 13) standAnim = buffer.readUShort(); else if (opcode == 14) walkAnim = buffer.readUShort(); else if (opcode == 15) { rotateLeftAnimation = buffer.readUShort(); } else if (opcode == 16) { rotateRightAnimation = buffer.readUShort(); } else if (opcode == 17) { walkAnim = buffer.readUShort(); turn180AnimIndex = buffer.readUShort(); turn90CWAnimIndex = buffer.readUShort(); turn90CCWAnimIndex = buffer.readUShort(); if (turn180AnimIndex == 65535) { turn180AnimIndex = -1; } if (turn90CWAnimIndex == 65535) { turn90CWAnimIndex = -1; } if (turn90CCWAnimIndex == 65535) { turn90CCWAnimIndex = -1; } } else if (opcode == 18) { category = buffer.readUShort(); } else if (opcode >= 30 && opcode < 40) { if (actions == null) actions = new String[10]; actions[opcode - 30] = buffer.readString(); if (actions[opcode - 30].equalsIgnoreCase("hidden")) actions[opcode - 30] = null; } else if (opcode == 40) { int k = buffer.readUnsignedByte(); recolourOriginal = new int[k]; recolourTarget = new int[k]; for (int k1 = 0; k1 < k; k1++) { recolourOriginal[k1] = buffer.readUShort(); recolourTarget[k1] = buffer.readUShort(); } } else if (opcode == 41) { int length = buffer.readUnsignedByte(); src_texture = new short[length]; dst_texture = new short[length]; for (int index = 0; index < length; index++) { src_texture[index] = (short) buffer.readUShort(); dst_texture[index] = (short) buffer.readUShort(); } } else if (opcode == 60) { int l = buffer.readUnsignedByte(); aditionalModels = new int[l]; for (int l1 = 0; l1 < l; l1++) { aditionalModels[l1] = buffer.readUShort(); } } else if (opcode == 93) drawMinimapDot = false; else if (opcode == 95) combatLevel = buffer.readUShort(); else if (opcode == 97) scaleXZ = buffer.readUShort(); else if (opcode == 98) scaleY = buffer.readUShort(); else if (opcode == 99) priorityRender = true; else if (opcode == 100) lightModifier = buffer.readSignedByte(); else if (opcode == 101) shadowModifier = buffer.readSignedByte(); else if (opcode == 102) headIcon = buffer.readUShort(); else if (opcode == 103) degreesToTurn = buffer.readUShort(); else if (opcode == 109) { rotationFlag = false; } else if (opcode == 111) { isPet = true; } else if (opcode == 106 || opcode == 118) { varBitID = buffer.readUShort(); if (varBitID == 65535) varBitID = -1; settingId = buffer.readUShort(); if (settingId == 65535) settingId = -1; int var3 = -1; if (opcode == 118) { var3 = buffer.readUShort(); } int i1 = buffer.readUnsignedByte(); childrenIDs = new int[i1 + 2]; for (int i2 = 0; i2 <= i1; i2++) { childrenIDs[i2] = buffer.readUShort(); if (childrenIDs[i2] == 65535) childrenIDs[i2] = -1; } childrenIDs[i1 + 1] = var3; } else if (opcode == 107) clickable = false; else if (opcode == 249) { int length = buffer.readUnsignedByte(); params = new HashMap<>(length); for (int i = 0; i < length; i++) { boolean isString = buffer.readUnsignedByte() == 1; int key = buffer.read24Int(); Object value; if (isString) { value = buffer.readString(); } else { value = buffer.readInt(); } params.put(key, value); } } else { System.err.printf("Error unrecognised {NPC} opcode: %d%n%n", opcode); continue; } } }Code:itemDEF public void readValues(Buffer buffer) { while (true) { int opcode = buffer.readUnsignedByte(); if (opcode == 0) return; if (opcode == 1) inventory_model = buffer.readUShort(); else if (opcode == 2) name = buffer.readString(); else if (opcode == 3) description = buffer.readString(); else if (opcode == 4) zoom2d = buffer.readUShort(); else if (opcode == 5) xan2d = buffer.readUShort(); else if (opcode == 6) yan2d = buffer.readUShort(); else if (opcode == 7) { xOffset2d = buffer.readUShort(); if (xOffset2d > 32767) xOffset2d -= 0x10000; } else if (opcode == 8) { yOffset2d = buffer.readUShort(); if (yOffset2d > 32767) yOffset2d -= 0x10000; } else if (opcode == 11) stackable = true; else if (opcode == 12) value = buffer.readInt(); else if (opcode == 16) membership_required = true; else if (opcode == 23) { male_equip_main = buffer.readUShort(); male_equip_translate_y = buffer.readSignedByte(); } else if (opcode == 24) male_equip_attachment = buffer.readUShort(); else if (opcode == 25) { female_equip_main = buffer.readUShort(); female_equip_attachment = buffer.readSignedByte(); } else if (opcode == 26) female_equip_attachment = buffer.readUShort(); else if (opcode >= 30 && opcode < 35) { if (scene_actions == null) scene_actions = new String[5]; scene_actions[opcode - 30] = buffer.readString(); if (scene_actions[opcode - 30].equalsIgnoreCase("hidden")) scene_actions[opcode - 30] = null; } else if (opcode >= 35 && opcode < 40) { if (widget_actions == null) widget_actions = new String[5]; widget_actions[opcode - 35] = buffer.readString(); } else if (opcode == 40) { int length = buffer.readUnsignedByte(); src_color = new int[length]; dst_color = new int[length]; for (int index = 0; index < length; index++) { dst_color[index] = buffer.readUShort(); src_color[index] = buffer.readUShort(); } } else if (opcode == 41) { int length = buffer.readUnsignedByte(); src_texture = new short[length]; dst_texture = new short[length]; for (int index = 0; index < length; index++) { src_texture[index] = (short) buffer.readUShort(); dst_texture[index] = (short) buffer.readUShort(); } } else if (opcode == 42) { shiftClickIndex = buffer.readUnsignedByte(); } else if (opcode == 65) { tradeable = true; } else if (opcode == 78) male_equip_emblem = buffer.readUShort(); else if (opcode == 79) female_equip_emblem = buffer.readUShort(); else if (opcode == 90) male_dialogue_head = buffer.readUShort(); else if (opcode == 91) female_dialogue_head = buffer.readUShort(); else if (opcode == 92) male_dialogue_headgear = buffer.readUShort(); else if (opcode == 93) female_dialogue_headgear = buffer.readUShort(); else if (opcode == 94) category = buffer.readUShort(); else if (opcode == 95) zan2d = buffer.readUShort(); else if (opcode == 97) unnoted_item_id = buffer.readUShort(); else if (opcode == 98) noted_item_id = buffer.readUShort(); else if (opcode >= 100 && opcode < 110) { if (stack_variant_id == null) { stack_variant_id = new int[10]; stack_variant_size = new int[10]; } stack_variant_id[opcode - 100] = buffer.readUShort(); stack_variant_size[opcode - 100] = buffer.readUShort(); } else if (opcode == 110) resizeX = buffer.readUShort(); else if (opcode == 111) resizeY = buffer.readUShort(); else if (opcode == 112) resizeZ = buffer.readUShort(); else if (opcode == 113) ambient = buffer.readSignedByte(); else if (opcode == 114) contrast = buffer.readSignedByte() * 5; else if (opcode == 115) team_id = buffer.readUnsignedByte(); else if (opcode == 139) bought_id = buffer.readUShort(); else if (opcode == 140) bought_template_id = buffer.readUShort(); else if (opcode == 148) placeholder_id = buffer.readUShort(); else if (opcode == 149) { placeholder_template_id = buffer.readUShort(); } else if (opcode == 249) { int length = buffer.readUnsignedByte(); params = new HashMap<>(length); for (int i = 0; i < length; i++) { boolean isString = buffer.readUnsignedByte() == 1; int key = buffer.read24Int(); Object value; if (isString) { value = buffer.readString(); } else { value = buffer.readInt(); } params.put(key, value); } } else { System.err.printf("Error unrecognised {Items} opcode: %d%n%n", opcode); } } }
Spoiler for collisionMap.java:
Code:public void load(int block_x, CollisionMap[] map, int block_y, SceneGraph scene, byte[] data) { load: { Buffer buffer = new Buffer(data); int object_id = -1; do { int id_offset = buffer.readUnsignedIntSmartShortCompat(); if (id_offset == 0) break load; object_id += id_offset; int pos = 0; do { int pos_offset = buffer.readUSmart(); if (pos_offset == 0) break; pos += pos_offset - 1; int tile_y = pos & 0x3F; int tile_x = pos >> 6 & 0x3F; int plane = pos >> 12 & 0x3; int hash = buffer.readUnsignedByte(); int type = hash >> 2; int orientation = hash & 3; int x = tile_x + block_x; int y = tile_y + block_y; if (x > 0 && y > 0 && x < 103 && y < 103 && plane >= 0 && plane < 4) { int marking_plane = plane; if ((tile_flags[1][x][y] & 2) == 2) marking_plane--; CollisionMap collision = null; if (marking_plane >= 0/* && marking_plane < 4*/)//added for higher revisions collision = map[marking_plane]; render(y, scene, collision, type, plane, x, object_id, orientation); } } while (true); } while (true); } } private void render(int y, SceneGraph scene, CollisionMap collision, int type, int plane, int x, int object_id, int orientation) { }
Spoiler for buffer.java:Code:public int readUnsignedIntSmartShortCompat() { int var1 = 0; int var2; for (var2 = this.readUSmart(); var2 == 32767; var2 = this.readUSmart()) { var1 += 32767; } var1 += var2; return var1; } public int readUSmart() { int peek = payload[currentPosition] & 0xFF; return peek < 128 ? this.readUnsignedByte() : this.readUShort() - 0x8000; } public void encodeRSA(BigInteger exponent, BigInteger modulus) { int length = currentPosition; currentPosition = 0; byte buffer[] = new byte[length]; readBytes(length, 0, buffer); byte rsa[] = buffer; if (Configuration.ENABLE_RSA) { rsa = new BigInteger(buffer).modPow(exponent, modulus) .toByteArray(); } currentPosition = 0; writeByte(rsa.length); writeBytes(rsa, rsa.length, 0); }
Spoiler for Image: