Server/Client/src/main/java/org/runite/client/CacheIndex.java
2021-03-24 15:51:22 -04:00

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 + ')');
}
}
}