I'm basically quitting rsps for good so I can keep focused on PokeNation. While I clean my hard drive from this crap I'm releasing shit that I think it's cool
The last unpacker updated was npcs, the other I don't know if still work. If you need them updated post and I'll see if I have some time to update them.
I'm not releasing it open-source and no-one is allowed to distribute modified versions of it.
Current Features:
Cache Loading
Support for all new engine revisions
Support for larger range of files
Checks if cache folder has revision number on it else
you can set manually
Animation Def.
Support for all new engine revisions
Packs seq.dat
Customizable dumps
Graphics Def.
Support for all new engine revisions
Packs spotanim.dat
Customizable dumps
Preview available
Save all gfx models
NPC Def.
Support for all new engine revisions
Packs npc.dat/.idx
Customizable dumps
Preview available
Save all npc models
Button to check possible anims used by npc
Item Def.
Objects Def.
Anim. Files
Support for all new engine revisions
Options to pack single files
Options to pack all frames, all skins or all files already combined
private void readValues(Stream stream) {
do {
int i = stream.readUnsignedByte();
if (i == 0)
return;
if (i == 1)
anInt405 = stream.readInt();
else if (i == 2) {
anInt406 = stream.readInt();
if (Animation.anims != null)
aAnimation_407 = Animation.anims[anInt406];
} else if (i == 4)
anInt410 = stream.readUnsignedWord();
else if (i == 5)
anInt411 = stream.readUnsignedWord();
else if (i == 6)
anInt412 = stream.readUnsignedWord();
else if (i == 7)
anInt413 = stream.readUnsignedByte();
else if (i == 8)
anInt414 = stream.readUnsignedByte();
else if (i == 40) {
int j = stream.readUnsignedByte();
for (int k = 0; k < j; k++) {
anIntArray408[k] = stream.readUnsignedWord();
anIntArray409[k] = stream.readUnsignedWord();
}
} else
System.out.println("Error unrecognised spotanim config code: "
+ i);
} while (true);
}
yes that's for 700+, older caches use getUShort on opcode 1 and 2
Spoiler for AnimFrame / Class36 / anim files:
Didn't test this, got from another thread that somneone posted. In red is the part that you may need to modify depending on your cache.
Code:
public static void load(int file){
try {
Stream stream = new Stream(FileOperations.ReadFile(signlink.findcachedir() + "/Data/Animation/frames/"+file+".dat"));
Class18 class18 = new Class18(stream, 0);
int k1 = stream.readUnsignedWord();
animationlist[file] = new Class36[(int)(k1*1.5)];
int ai[] = new int[500];
int ai1[] = new int[500];
int ai2[] = new int[500];
int ai3[] = new int[500];
for(int l1 = 0; l1 < k1; l1++)
{
int i2 = stream.readUnsignedWord();
Class36 class36 = animationlist[file][i2] = new Class36();
class36.aClass18_637 = class18;
int j2 = stream.readUnsignedByte();
int l2 = 0;
int k2 = -1;
for(int i3 = 0; i3 < j2; i3++)
{
int j3 = stream.readUnsignedByte();
if(j3 > 0)
{
if(class18.anIntArray342[i3] != 0)
{
for(int l3 = i3 - 1; l3 > k2; l3--)
{
if(class18.anIntArray342[l3] != 0)
continue;
ai[l2] = l3;
ai1[l2] = 0;
ai2[l2] = 0;
ai3[l2] = 0;
l2++;
break;
}
}
ai[l2] = i3;
short c = 0;
if(class18.anIntArray342[i3] == 3)
c = (short)128;
if((j3 & 1) != 0)
ai1[l2] = (short)stream.readShort2();
else
ai1[l2] = c;
if((j3 & 2) != 0)
ai2[l2] = stream.readShort2();
else
ai2[l2] = c;
if((j3 & 4) != 0)
ai3[l2] = stream.readShort2();
else
ai3[l2] = c;
k2 = i3;
l2++;
}
}
class36.anInt638 = l2;
class36.anIntArray639 = new int[l2];
class36.anIntArray640 = new int[l2];
class36.anIntArray641 = new int[l2];
class36.anIntArray642 = new int[l2];
for(int k3 = 0; k3 < l2; k3++)
{
class36.anIntArray639[k3] = ai[k3];
class36.anIntArray640[k3] = ai1[k3];
class36.anIntArray641[k3] = ai2[k3];
class36.anIntArray642[k3] = ai3[k3];
}
}
}catch(Exception exception) { }
}