private final void parseNPCPacket(Stream stream, int i) { playerIdsIDX = 0; anInt893 = 0; readNPCWalkingData(stream, i); readNPCPositionData(i, stream); readNPCUpdateData(i, stream, true); for(int k = 0; k < playerIdsIDX; k++) { int l = playerIDs[k]; if(((AnimableObject) (npcs[l])).anInt1537 != loopCycle) { npcs[l].myData = null; npcs[l] = null; } } if(stream.streamPos != i) { signlink.reporterror(aString1173 + " size mismatch in getnpcpos - pos:" + stream.streamPos + " psize:" + i); throw new RuntimeException("eek"); } for(int i1 = 0; i1 < npcCount; i1++) if(npcs[npcServerIndex[i1]] == null) { signlink.reporterror(aString1173 + " null entry in npc list - pos:" + i1 + " size:" + npcCount); throw new RuntimeException("eek"); } } private final void readNPCWalkingData(Stream stream, int j) { stream.initBitAccess(); int k = stream.readBits(8, 0); if(k < npcCount) { for(int l = k; l < npcCount; l++) playerIDs[playerIdsIDX++] = npcServerIndex[l]; } if(k > npcCount) { signlink.reporterror(aString1173 + " Too many npcs"); throw new RuntimeException("eek"); } npcCount = 0; for(int i1 = 0; i1 < k; i1++) { int j1 = npcServerIndex[i1]; NPC WalkingObject_sub1 = npcs[j1]; int k1 = stream.readBits(1, 0); if(k1 == 0) { npcServerIndex[npcCount++] = j1; WalkingObject_sub1.anInt1537 = loopCycle; } else { int l1 = stream.readBits(2, 0); if(l1 == 0) { npcServerIndex[npcCount++] = j1; WalkingObject_sub1.anInt1537 = loopCycle; anIntArray894[anInt893++] = j1; } else if(l1 == 1) { npcServerIndex[npcCount++] = j1; WalkingObject_sub1.anInt1537 = loopCycle; int i2 = stream.readBits(3, 0); WalkingObject_sub1.method448(false, (byte)20, i2); int k2 = stream.readBits(1, 0); if(k2 == 1) anIntArray894[anInt893++] = j1; } else if(l1 == 2) { npcServerIndex[npcCount++] = j1; WalkingObject_sub1.anInt1537 = loopCycle; int j2 = stream.readBits(3, 0); WalkingObject_sub1.method448(true, (byte)20, j2); int l2 = stream.readBits(3, 0); WalkingObject_sub1.method448(true, (byte)20, l2); int i3 = stream.readBits(1, 0); if(i3 == 1) anIntArray894[anInt893++] = j1; } else if(l1 == 3) playerIDs[playerIdsIDX++] = j1; } } } private final void readNPCPositionData(int i, Stream stream) { while(stream.bitPos + 21 < i * 8) { int k = stream.readBits(14, 0); if(k == 16383) break; if(npcs[k] == null) npcs[k] = new NPC(); NPC class30_sub2_sub4_sub1_sub1 = npcs[k]; npcServerIndex[npcCount++] = k; class30_sub2_sub4_sub1_sub1.anInt1537 = loopCycle; int l = stream.readBits(5, 0); if(l > 15) l -= 32; int i1 = stream.readBits(5, 0); if(i1 > 15) i1 -= 32; int j1 = stream.readBits(1, 0); int npcid = stream.readBits(13, 0); class30_sub2_sub4_sub1_sub1.myData = NPCData.loadFromCache(npcid); int k1 = stream.readBits(1, 0); if(k1 == 1) anIntArray894[anInt893++] = k; class30_sub2_sub4_sub1_sub1.anInt1540 = class30_sub2_sub4_sub1_sub1.myData.aByte68; class30_sub2_sub4_sub1_sub1.anInt1504 = class30_sub2_sub4_sub1_sub1.myData.anInt79; class30_sub2_sub4_sub1_sub1.walkAnimID = class30_sub2_sub4_sub1_sub1.myData.walkAnimID; class30_sub2_sub4_sub1_sub1.turn180AnimID = class30_sub2_sub4_sub1_sub1.myData.turn180AnimID; class30_sub2_sub4_sub1_sub1.turn90CWAnimID = class30_sub2_sub4_sub1_sub1.myData.cwAnimID; class30_sub2_sub4_sub1_sub1.turn90CCWAnimID = class30_sub2_sub4_sub1_sub1.myData.ccwAnimID; class30_sub2_sub4_sub1_sub1.standAnimID = class30_sub2_sub4_sub1_sub1.myData.standAnimID; class30_sub2_sub4_sub1_sub1.method445(((AnimableObject) (playerMe)).posX[0] + i1, ((AnimableObject) (playerMe)).posY[0] + l, j1 == 1, false); } stream.finishBitAccess(true); } private final void readNPCUpdateData(int i, Stream stream, boolean flag) { for(int j = 0; j < anInt893; j++) { int k = anIntArray894[j]; NPC class30_sub2_sub4_sub1_sub1 = npcs[k]; int l = stream.readUnsignedByte(); if((l & 0x10) != 0) { int i1 = stream.readUnsignedWordBigEndian(); if(i1 == 65535) i1 = -1; int i2 = stream.readUnsignedByte(); if(i1 == ((AnimableObject) (class30_sub2_sub4_sub1_sub1)).animationIdx && i1 != -1) { int l2 = AnimSeqData.animSeqCache[i1].anInt365; if(l2 == 1) { class30_sub2_sub4_sub1_sub1.anInt1527 = 0; class30_sub2_sub4_sub1_sub1.anInt1528 = 0; class30_sub2_sub4_sub1_sub1.animationDelay = i2; class30_sub2_sub4_sub1_sub1.anInt1530 = 0; } if(l2 == 2) class30_sub2_sub4_sub1_sub1.anInt1530 = 0; } else if(i1 == -1 || ((AnimableObject) (class30_sub2_sub4_sub1_sub1)).animationIdx == -1 || AnimSeqData.animSeqCache[i1].anInt359 >= AnimSeqData.animSeqCache[((AnimableObject) (class30_sub2_sub4_sub1_sub1)).animationIdx].anInt359) { class30_sub2_sub4_sub1_sub1.animationIdx = i1; class30_sub2_sub4_sub1_sub1.anInt1527 = 0; class30_sub2_sub4_sub1_sub1.anInt1528 = 0; class30_sub2_sub4_sub1_sub1.animationDelay = i2; class30_sub2_sub4_sub1_sub1.anInt1530 = 0; class30_sub2_sub4_sub1_sub1.anInt1542 = ((AnimableObject) (class30_sub2_sub4_sub1_sub1)).anInt1525; } } if((l & 8) != 0) { int j1 = stream.readUnsignedByteA(); int j2 = stream.readUnsignedByteC(); class30_sub2_sub4_sub1_sub1.method447(-35698, j2, j1, loopCycle); class30_sub2_sub4_sub1_sub1.hpBarVisEnd = loopCycle + 300; class30_sub2_sub4_sub1_sub1.currentHits = stream.readUnsignedByteA(); class30_sub2_sub4_sub1_sub1.maxHits = stream.readUnsignedByte(); } if((l & 0x80) != 0) { class30_sub2_sub4_sub1_sub1.anInt1520 = stream.readUnsignedWord(); int k1 = stream.readDWord(); class30_sub2_sub4_sub1_sub1.anInt1524 = k1 >> 16; class30_sub2_sub4_sub1_sub1.anInt1523 = loopCycle + (k1 & 0xffff); class30_sub2_sub4_sub1_sub1.anInt1521 = 0; class30_sub2_sub4_sub1_sub1.anInt1522 = 0; if(((AnimableObject) (class30_sub2_sub4_sub1_sub1)).anInt1523 > loopCycle) class30_sub2_sub4_sub1_sub1.anInt1521 = -1; if(((AnimableObject) (class30_sub2_sub4_sub1_sub1)).anInt1520 == 65535) class30_sub2_sub4_sub1_sub1.anInt1520 = -1; } if((l & 0x20) != 0) { class30_sub2_sub4_sub1_sub1.serverPosition = stream.readUnsignedWord(); if(((AnimableObject) (class30_sub2_sub4_sub1_sub1)).serverPosition == 65535) class30_sub2_sub4_sub1_sub1.serverPosition = -1; } if((l & 1) != 0) { class30_sub2_sub4_sub1_sub1.chatString = stream.readString(); class30_sub2_sub4_sub1_sub1.chatVisLen = 100; } if((l & 0x40) != 0) { int l1 = stream.readUnsignedByteC(); int k2 = stream.readUnsignedByteS(); class30_sub2_sub4_sub1_sub1.method447(-35698, k2, l1, loopCycle); class30_sub2_sub4_sub1_sub1.hpBarVisEnd = loopCycle + 300; class30_sub2_sub4_sub1_sub1.currentHits = stream.readUnsignedByteS(); class30_sub2_sub4_sub1_sub1.maxHits = stream.readUnsignedByteC(); } if((l & 2) != 0) { class30_sub2_sub4_sub1_sub1.myData = NPCData.loadFromCache(stream.readUnsignedWordBigEndianA()); class30_sub2_sub4_sub1_sub1.anInt1540 = class30_sub2_sub4_sub1_sub1.myData.aByte68; class30_sub2_sub4_sub1_sub1.anInt1504 = class30_sub2_sub4_sub1_sub1.myData.anInt79; class30_sub2_sub4_sub1_sub1.walkAnimID = class30_sub2_sub4_sub1_sub1.myData.walkAnimID; class30_sub2_sub4_sub1_sub1.turn180AnimID = class30_sub2_sub4_sub1_sub1.myData.turn180AnimID; class30_sub2_sub4_sub1_sub1.turn90CWAnimID = class30_sub2_sub4_sub1_sub1.myData.cwAnimID; class30_sub2_sub4_sub1_sub1.turn90CCWAnimID = class30_sub2_sub4_sub1_sub1.myData.ccwAnimID; class30_sub2_sub4_sub1_sub1.standAnimID = class30_sub2_sub4_sub1_sub1.myData.standAnimID; } if((l & 4) != 0) { class30_sub2_sub4_sub1_sub1.anInt1538 = stream.readUnsignedWordBigEndian(); class30_sub2_sub4_sub1_sub1.anInt1539 = stream.readUnsignedWordBigEndian(); } } }