forked from 2009Scape/Server
653 lines
21 KiB
Java
653 lines
21 KiB
Java
package org.runite.client;
|
|
|
|
import org.rs09.client.config.GameConfig;
|
|
import org.rs09.client.filestore.ReferenceTable;
|
|
import org.rs09.client.filestore.ResourceProvider;
|
|
import org.rs09.client.filestore.compression.Container;
|
|
import org.rs09.client.util.ArrayUtils;
|
|
import org.rs09.client.util.CRC;
|
|
|
|
import java.util.Objects;
|
|
|
|
public final class CacheIndex {
|
|
|
|
/**
|
|
* These Indexes listed below are mostly used for CRC checks
|
|
*/
|
|
public static CacheIndex fontsIndex;
|
|
public static CacheIndex musicIndex;
|
|
public static CacheIndex spritesIndex;
|
|
static CacheIndex skeletonsIndex;
|
|
static CacheIndex skinsIndex;
|
|
static CacheIndex configurationsIndex;
|
|
static CacheIndex interfacesIndex;
|
|
static CacheIndex soundFXIndex;
|
|
static CacheIndex landscapesIndex;
|
|
static CacheIndex modelsIndex;
|
|
static CacheIndex texturesIndex;
|
|
static CacheIndex huffmanEncodingIndex;
|
|
static CacheIndex music2Index;
|
|
static CacheIndex interfaceScriptsIndex;
|
|
static CacheIndex soundFX2Index;
|
|
static CacheIndex soundFX3Index;
|
|
static CacheIndex objectConfigIndex;
|
|
static CacheIndex clientscriptMaskIndex;
|
|
static CacheIndex npcConfigIndex;
|
|
static CacheIndex itemConfigIndex;
|
|
static CacheIndex animationIndex;
|
|
static CacheIndex graphicFXIndex;
|
|
static CacheIndex clientScriptConfigIndex;
|
|
static CacheIndex worldmapIndex;
|
|
static CacheIndex quickchatMessagesIndex;
|
|
static CacheIndex quickchatMenusIndex;
|
|
static CacheIndex materialsIndex;
|
|
static CacheIndex particlesConfigIndex;
|
|
static CacheIndex libIndex;
|
|
/**
|
|
*
|
|
*/
|
|
|
|
|
|
private final boolean discardPacked;
|
|
private final boolean aBoolean1946;
|
|
private final ResourceProvider provider;
|
|
private ReferenceTable referenceTable = null;
|
|
private Object[] packed;
|
|
private Object[][] unpacked;
|
|
|
|
public CacheIndex(ResourceProvider provider, boolean var2, boolean var3) {
|
|
this.provider = provider;
|
|
this.discardPacked = var2;
|
|
this.aBoolean1946 = var3;
|
|
}
|
|
|
|
private static Object wrap(byte[] data) {
|
|
if (data == null) {
|
|
return null;
|
|
}
|
|
|
|
if (data.length > 136 && !GameConfig.CACHE_DEBUG) {
|
|
try {
|
|
Class144 buffer = new Class144_Sub1();
|
|
buffer.setBytes(data);
|
|
return buffer;
|
|
} catch (Throwable var4) {
|
|
GameConfig.CACHE_DEBUG = true;
|
|
}
|
|
}
|
|
|
|
return data;
|
|
}
|
|
|
|
final boolean method2113() {
|
|
try {
|
|
if (this.isReady()) {
|
|
boolean var2 = true;
|
|
|
|
for (int var3 = 0; this.referenceTable.validArchiveIds.length > var3; ++var3) {
|
|
int var4 = this.referenceTable.validArchiveIds[var3];
|
|
if (null == this.packed[var4]) {
|
|
this.load(var4);
|
|
if (null == this.packed[var4]) {
|
|
var2 = false;
|
|
}
|
|
}
|
|
}
|
|
|
|
return var2;
|
|
} else {
|
|
return false;
|
|
}
|
|
} catch (RuntimeException var5) {
|
|
throw ClientErrorException.clientError(var5, "ve.IA()");
|
|
}
|
|
}
|
|
|
|
private int method2114(int var1) {
|
|
if (this.isValidArchive(var1)) {
|
|
return this.packed[var1] != null ? 100 : this.provider.percentComplete(var1);
|
|
} else {
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
final void method2115(int var1, boolean var2) {
|
|
try {
|
|
if (this.isReady()) {
|
|
if (var2) {
|
|
this.referenceTable.archiveNameHash = null;
|
|
this.referenceTable.setALookupTable_949(null);
|
|
}
|
|
|
|
this.referenceTable.setALookupTableArray962(null);
|
|
this.referenceTable.setFileNameHashes(null);
|
|
|
|
}
|
|
} catch (RuntimeException var5) {
|
|
throw ClientErrorException.clientError(var5, "ve.R(" + var1 + ',' + var2 + ',' + true + ')');
|
|
}
|
|
}
|
|
|
|
final int method2116(RSString var2) {
|
|
try {
|
|
if (this.isReady()) {
|
|
var2 = var2.toLowercase();
|
|
int var3 = this.referenceTable.getALookupTable_949().get(var2.method1574());
|
|
return this.method2114(var3);
|
|
} else {
|
|
return 0;
|
|
}
|
|
} catch (RuntimeException var4) {
|
|
throw ClientErrorException.clientError(var4, "ve.P(" + 22813 + ',' + (var2 != null ? "{...}" : "null") + ')');
|
|
}
|
|
}
|
|
|
|
final boolean method2117(int var2) {
|
|
if (this.isValidArchive(var2)) {
|
|
if (null == this.packed[var2]) {
|
|
this.load(var2);
|
|
return null != this.packed[var2];
|
|
} else {
|
|
return true;
|
|
}
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
final int getReferenceTableCrc() {
|
|
if (this.isReady()) {
|
|
return this.referenceTable.getCrc();
|
|
} else {
|
|
throw new IllegalStateException("");
|
|
}
|
|
}
|
|
|
|
public final int getArchiveForName(RSString name) {
|
|
try {
|
|
if (this.isReady()) {
|
|
name = name.toLowercase();
|
|
int var3 = this.referenceTable.getALookupTable_949().get(name.method1574());
|
|
return this.isValidArchive(var3) ? var3 : -1;
|
|
} else {
|
|
return -1;
|
|
}
|
|
} catch (RuntimeException var4) {
|
|
throw ClientErrorException.clientError(var4, "ve.EA(" + (name != null ? "{...}" : "null") + ',' + (byte) -30 + ')');
|
|
}
|
|
}
|
|
|
|
final int method2121() {
|
|
try {
|
|
if (this.isReady()) {
|
|
|
|
return this.referenceTable.archiveLengths.length;
|
|
} else {
|
|
return -1;
|
|
}
|
|
} catch (RuntimeException var3) {
|
|
throw ClientErrorException.clientError(var3, "ve.D(" + 0 + ')');
|
|
}
|
|
}
|
|
|
|
private boolean isReady() {
|
|
if (this.referenceTable == null) {
|
|
this.referenceTable = this.provider.getReferenceTable();
|
|
if (this.referenceTable == null) {
|
|
return false;
|
|
}
|
|
|
|
this.unpacked = new Object[this.referenceTable.getArchiveAmount()][];
|
|
this.packed = new Object[this.referenceTable.getArchiveAmount()];
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
final byte[] method2123(RSString var2, RSString var3) {
|
|
try {
|
|
if (this.isReady()) {
|
|
var3 = var3.toLowercase();
|
|
var2 = var2.toLowercase();
|
|
int var4 = this.referenceTable.getALookupTable_949().get(var3.method1574());
|
|
|
|
if (this.isValidArchive(var4)) {
|
|
int var5 = this.referenceTable.getALookupTableArray962()[var4].get(var2.method1574());
|
|
return this.getFile(var4, var5);
|
|
} else {
|
|
return null;
|
|
}
|
|
} else {
|
|
return null;
|
|
}
|
|
} catch (RuntimeException var6) {
|
|
throw ClientErrorException.clientError(var6, "ve.C(" + 0 + ',' + (var2 != null ? "{...}" : "null") + ',' + (var3 != null ? "{...}" : "null") + ')');
|
|
}
|
|
}
|
|
|
|
final void method2124(int var1, RSString var2) {
|
|
try {
|
|
if (this.isReady()) {
|
|
var2 = var2.toLowercase();
|
|
int var3 = this.referenceTable.getALookupTable_949().get(var2.method1574());
|
|
this.request(var3);
|
|
}
|
|
} catch (RuntimeException var5) {
|
|
throw ClientErrorException.clientError(var5, "ve.V(" + var1 + ',' + (var2 != null ? "{...}" : "null") + ')');
|
|
}
|
|
}
|
|
|
|
final boolean method2125(RSString var1, RSString var3) {
|
|
try {
|
|
if (this.isReady()) {
|
|
var3 = var3.toLowercase();
|
|
var1 = var1.toLowercase();
|
|
int var4 = this.referenceTable.getALookupTable_949().get(var3.method1574());
|
|
if (this.isValidArchive(var4)) {
|
|
int var5 = this.referenceTable.getALookupTableArray962()[var4].get(var1.method1574());
|
|
|
|
return this.method2129((byte) 70, var5, var4);
|
|
} else {
|
|
return false;
|
|
}
|
|
} else {
|
|
return false;
|
|
}
|
|
} catch (RuntimeException var6) {
|
|
throw ClientErrorException.clientError(var6, "ve.DA(" + (var1 != null ? "{...}" : "null") + ',' + (byte) 116 + ',' + (var3 != null ? "{...}" : "null") + ')');
|
|
}
|
|
}
|
|
|
|
final byte[] getFile(int archive, int file, int[] xtea) {
|
|
if (!this.isValidFile(archive, file)) {
|
|
return null;
|
|
}
|
|
|
|
if (this.unpacked[archive] == null || this.unpacked[archive][file] == null) {
|
|
boolean loaded = this.unpack(archive, xtea);
|
|
|
|
if (!loaded) {
|
|
this.load(archive);
|
|
loaded = this.unpack(archive, xtea);
|
|
if (!loaded) {
|
|
return null;
|
|
}
|
|
}
|
|
}
|
|
|
|
byte[] var7 = NPC.method1985(this.unpacked[archive][file], false);
|
|
if (this.aBoolean1946) {
|
|
this.unpacked[archive][file] = null;
|
|
if (this.referenceTable.archiveLengths[archive] == 1) {
|
|
this.unpacked[archive] = null;
|
|
}
|
|
}
|
|
|
|
return var7;
|
|
}
|
|
|
|
final boolean method2127(RSString var2) {
|
|
try {
|
|
if (this.isReady()) {
|
|
var2 = var2.toLowercase();
|
|
int var3 = this.referenceTable.getALookupTable_949().get(var2.method1574());
|
|
return this.method2117(var3);
|
|
} else {
|
|
return false;
|
|
}
|
|
} catch (RuntimeException var4) {
|
|
throw ClientErrorException.clientError(var4, "ve.O(" + (byte) -83 + ',' + (var2 != null ? "{...}" : "null") + ')');
|
|
}
|
|
}
|
|
|
|
final void method2128(int var2) {
|
|
try {
|
|
if (this.isValidArchive(var2)) {
|
|
if (null != this.unpacked) {
|
|
this.unpacked[var2] = null;
|
|
}
|
|
|
|
}
|
|
} catch (RuntimeException var4) {
|
|
throw ClientErrorException.clientError(var4, "ve.B(" + 7561 + ',' + var2 + ')');
|
|
}
|
|
}
|
|
|
|
final boolean method2129(byte var1, int var2, int var3) {
|
|
try {
|
|
if (this.isValidFile(var3, var2)) {
|
|
if (this.unpacked[var3] != null && null != this.unpacked[var3][var2]) {
|
|
return true;
|
|
} else if (this.packed[var3] == null) {
|
|
this.load(var3);
|
|
return this.packed[var3] != null;
|
|
} else {
|
|
return true;
|
|
}
|
|
} else {
|
|
return false;
|
|
}
|
|
} catch (RuntimeException var5) {
|
|
throw ClientErrorException.clientError(var5, "ve.FA(" + var1 + ',' + var2 + ',' + var3 + ')');
|
|
}
|
|
}
|
|
|
|
private boolean isValidArchive(int archiveId) {
|
|
if (!this.isReady()) {
|
|
return false;
|
|
}
|
|
|
|
if (archiveId >= 0
|
|
&& this.referenceTable.archiveLengths.length > archiveId
|
|
&& this.referenceTable.archiveLengths[archiveId] != 0)
|
|
return true;
|
|
|
|
if (GameConfig.CACHE_DEBUG)
|
|
throw new IllegalArgumentException(Integer.toString(archiveId));
|
|
return false;
|
|
}
|
|
|
|
private void request(int archive) {
|
|
this.provider.request(archive);
|
|
}
|
|
|
|
private boolean unpack(int archive, int[] xtea) {
|
|
if (!isValidArchive(archive)) return false;
|
|
if (packed[archive] == null) return false;
|
|
|
|
int count = this.referenceTable.archiveFileLengths[archive];
|
|
int[] indices = this.referenceTable.validFileIds[archive];
|
|
if (this.unpacked[archive] == null) {
|
|
this.unpacked[archive] = new Object[this.referenceTable.archiveLengths[archive]];
|
|
}
|
|
|
|
boolean finished = true;
|
|
Object[] objects = this.unpacked[archive];
|
|
|
|
for (int i = 0; i < count; ++i) {
|
|
int index;
|
|
if (indices == null) {
|
|
index = i;
|
|
} else {
|
|
index = indices[i];
|
|
}
|
|
|
|
if (objects[index] == null) {
|
|
finished = false;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (finished) return true;
|
|
|
|
byte[] decrypted;
|
|
if (xtea != null && (xtea[0] != 0 || xtea[1] != 0 || xtea[2] != 0 || xtea[3] != 0)) {
|
|
decrypted = NPC.method1985(this.packed[archive], true);
|
|
DataBuffer buffer = new DataBuffer(decrypted);
|
|
buffer.method770(xtea, buffer.buffer.length);
|
|
} else {
|
|
decrypted = NPC.method1985(this.packed[archive], false);
|
|
}
|
|
|
|
byte[] data = new byte[0];
|
|
try {
|
|
data = Container.INSTANCE.decode(decrypted);//Class3_Sub28_Sub13.decodeContainer(var21);
|
|
} catch (Throwable e) {
|
|
System.out.println("Tried to go into a null area");
|
|
System.out.println("T3 - " + (xtea != null) + "," + archive + "," + Objects.requireNonNull(decrypted).length + "," + CRC.INSTANCE.crc32(decrypted, decrypted.length) + "," + CRC.INSTANCE.crc32(decrypted, decrypted.length - 2) + "," + this.referenceTable.archiveCRCs[archive] + "," + this.referenceTable.getCrc());
|
|
//throw ClientErrorException.clientError(e, "T3 - " + (xtea != null) + "," + archive + "," + Objects.requireNonNull(decrypted).length + "," + CRC.INSTANCE.crc32(decrypted, decrypted.length) + "," + CRC.INSTANCE.crc32(decrypted, decrypted.length - 2) + "," + this.referenceTable.archiveCRCs[archive] + "," + this.referenceTable.getCrc());
|
|
}
|
|
|
|
if (this.discardPacked) {
|
|
this.packed[archive] = null;
|
|
}
|
|
|
|
int start;
|
|
if (count > 1) {
|
|
start = data.length;
|
|
start--;
|
|
int blockCount = data[start] & 0xff;
|
|
start -= count * blockCount * 4;
|
|
|
|
DataBuffer buffer = new DataBuffer(data);
|
|
buffer.index = start;
|
|
int[] var13 = new int[count];
|
|
|
|
int var15;
|
|
int var16;
|
|
for (int var14 = 0; blockCount > var14; ++var14) {
|
|
var15 = 0;
|
|
|
|
for (var16 = 0; var16 < count; ++var16) {
|
|
var15 += buffer.readInt();
|
|
|
|
var13[var16] += var15;
|
|
}
|
|
}
|
|
|
|
byte[][] var24 = new byte[count][];
|
|
|
|
for (var15 = 0; count > var15; ++var15) {
|
|
var24[var15] = new byte[var13[var15]];
|
|
var13[var15] = 0;
|
|
}
|
|
|
|
buffer.index = start;
|
|
var15 = 0;
|
|
|
|
int var17;
|
|
for (var16 = 0; blockCount > var16; ++var16) {
|
|
var17 = 0;
|
|
|
|
for (int var18 = 0; var18 < count; ++var18) {
|
|
var17 += buffer.readInt();
|
|
ArrayUtils.arraycopy(data, var15, var24[var18], var13[var18], var17);
|
|
var15 += var17;
|
|
var13[var18] += var17;
|
|
}
|
|
}
|
|
|
|
for (var16 = 0; var16 < count; ++var16) {
|
|
if (indices == null) {
|
|
var17 = var16;
|
|
} else {
|
|
var17 = indices[var16];
|
|
}
|
|
|
|
if (this.aBoolean1946) {
|
|
objects[var17] = var24[var16];
|
|
} else {
|
|
objects[var17] = wrap(var24[var16]);
|
|
}
|
|
}
|
|
} else {
|
|
if (null == indices) {
|
|
start = 0;
|
|
} else {
|
|
start = indices[0];
|
|
}
|
|
|
|
if (this.aBoolean1946) {
|
|
objects[start] = data;
|
|
} else {
|
|
objects[start] = wrap(data);
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
public final byte[] getFile(int archive, int file) {
|
|
return this.getFile(archive, file, null);
|
|
}
|
|
|
|
private void load(int archive) {
|
|
if (this.discardPacked) {
|
|
this.packed[archive] = this.provider.get(archive);
|
|
} else {
|
|
this.packed[archive] = wrap(this.provider.get(archive));
|
|
}
|
|
}
|
|
|
|
final boolean method2135(RSString var1) {
|
|
try {
|
|
if (this.isReady()) {
|
|
var1 = var1.toLowercase();
|
|
int var3 = this.referenceTable.getALookupTable_949().get(var1.method1574());
|
|
return var3 >= 0;
|
|
} else {
|
|
return false;
|
|
}
|
|
} catch (RuntimeException var4) {
|
|
throw ClientErrorException.clientError(var4, "ve.S(" + (var1 != null ? "{...}" : "null") + ')');
|
|
}
|
|
}
|
|
|
|
final int method2136(byte var1) {
|
|
try {
|
|
if (var1 > -121) {
|
|
Unsorted.anInt1950 = -3;
|
|
}
|
|
|
|
if (this.isReady()) {
|
|
int var2 = 0;
|
|
int var3 = 0;
|
|
|
|
int var4;
|
|
for (var4 = 0; var4 < this.packed.length; ++var4) {
|
|
if (0 < this.referenceTable.archiveFileLengths[var4]) {
|
|
var2 += 100;
|
|
var3 += this.method2114(var4);
|
|
}
|
|
}
|
|
|
|
if (var2 == 0) {
|
|
return 100;
|
|
} else {
|
|
var4 = var3 * 100 / var2;
|
|
return var4;
|
|
}
|
|
} else {
|
|
return 0;
|
|
}
|
|
} catch (RuntimeException var5) {
|
|
throw ClientErrorException.clientError(var5, "ve.N(" + var1 + ')');
|
|
}
|
|
}
|
|
|
|
final void method2137() {
|
|
try {
|
|
if (this.unpacked != null) {
|
|
for (int var2 = 0; this.unpacked.length > var2; ++var2) {
|
|
this.unpacked[var2] = null;
|
|
}
|
|
}
|
|
|
|
} catch (RuntimeException var3) {
|
|
throw ClientErrorException.clientError(var3, "ve.Q(" + ')');
|
|
}
|
|
}
|
|
|
|
final byte[] method2138(int var1) {
|
|
try {
|
|
if (!this.isReady()) {
|
|
return null;
|
|
} else if (this.referenceTable.archiveLengths.length == 1) {
|
|
return this.getFile(0, var1);
|
|
} else if (!this.isValidArchive(var1)) {
|
|
return null;
|
|
} else if (this.referenceTable.archiveLengths[var1] == 1) {
|
|
return this.getFile(var1, 0);
|
|
} else {
|
|
throw new RuntimeException();
|
|
}
|
|
} catch (RuntimeException var4) {
|
|
throw ClientErrorException.clientError(var4, "ve.HA(" + var1 + ',' + 0 + ')');
|
|
}
|
|
}
|
|
|
|
private boolean isValidFile(int archive, int file) {
|
|
if (!this.isReady()) {
|
|
return false;
|
|
}
|
|
if (0 <= archive
|
|
&& file >= 0 && archive < this.referenceTable.archiveLengths.length
|
|
&& this.referenceTable.archiveLengths[archive] > file)
|
|
return true;
|
|
if (GameConfig.CACHE_DEBUG)
|
|
throw new IllegalArgumentException(archive + "," + file);
|
|
return false;
|
|
}
|
|
|
|
final byte[] method2140(int file, int archive) {
|
|
if (this.isValidFile(archive, file)) {
|
|
if (this.unpacked[archive] == null || null == this.unpacked[archive][file]) {
|
|
boolean var4 = this.unpack(archive, null);
|
|
if (!var4) {
|
|
this.load(archive);
|
|
var4 = this.unpack(archive, null);
|
|
if (!var4) {
|
|
return null;
|
|
}
|
|
}
|
|
}
|
|
|
|
return NPC.method1985(this.unpacked[archive][file], false);
|
|
} else {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
final int[] getFileIds(int archiveId) {
|
|
try {
|
|
|
|
if (this.isValidArchive(archiveId)) {
|
|
int[] var3 = this.referenceTable.validFileIds[archiveId];
|
|
if (null == var3) {
|
|
var3 = new int[this.referenceTable.archiveFileLengths[archiveId]];
|
|
|
|
for (int var4 = 0; var3.length > var4; var3[var4] = var4++) {
|
|
}
|
|
}
|
|
|
|
return var3;
|
|
} else {
|
|
return null;
|
|
}
|
|
} catch (RuntimeException var5) {
|
|
throw ClientErrorException.clientError(var5, "ve.G(" + (byte) -128 + ',' + archiveId + ')');
|
|
}
|
|
}
|
|
|
|
final int getFileAmount(int archiveId) {
|
|
try {
|
|
if (this.isValidArchive(archiveId)) {
|
|
return this.referenceTable.archiveLengths[archiveId];
|
|
} else {
|
|
return 0;
|
|
}
|
|
} catch (RuntimeException var4) {
|
|
throw ClientErrorException.clientError(var4, "ve.H(" + archiveId + ')');
|
|
}
|
|
}
|
|
|
|
public final boolean retrieveSpriteFile(int archiveId) {
|
|
try {
|
|
if (!this.isReady()) {
|
|
return false;
|
|
} else if (this.referenceTable.archiveLengths.length == 1) {
|
|
return this.method2129((byte) 86, archiveId, 0);
|
|
} else if (this.isValidArchive(archiveId)) {
|
|
if (1 == this.referenceTable.archiveLengths[archiveId]) {
|
|
return this.method2129((byte) 109, 0, archiveId);
|
|
} else {
|
|
throw new RuntimeException();
|
|
}
|
|
} else {
|
|
return false;
|
|
}
|
|
} catch (RuntimeException var4) {
|
|
throw ClientErrorException.clientError(var4, "ve.A(" + 0 + ',' + archiveId + ')');
|
|
}
|
|
}
|
|
|
|
}
|