SRL Archive - Unofficial Development

[07] Zimbabwe National Updater


n3ss3s

2013-09-20 23:28:01

Here's my updater, now you can stop pestering me.

Comments: The updater was started when I knew absolutely nothing, and I haven't bothered to go back and rewrite things in smarter ways etc etc. Some of it will give you cancer just by looking at it, some is semi decent.

It'll give you both a textual output (not easy to parse) and serialized objects that encapsulate hook info (not useful when reading with pascal). Someone will have to modify the printing if they plan on actively using it. DO NOT post your own topic of this with your printer edit, or I will make stew out of your balls. Instead, write a printer that'll produce a reasonable config file for a reflection include.

The jar is attached below, source is at https://bitbucket.org/Kneesause/znu/src/ , the hooks themselves are pretty solid but I wouldn't consult it for structural decisions, I've been pretty inconsistent with where to make it efficient etc etc. Should've abstracted all the way down to a single field searcher than just a whole class analyzer.

OSRS #21

***************************************************
********** ZIMBABWE NATIONAL UPDATER 1.0 **********
***************************************************
NodeAnalyzer ran in 4 ms.
CacheableNodeAnalyzer ran in 11 ms.
StreamAnalyzer ran in 5 ms.
RenderableAnalyzer ran in 5 ms.
CharacterAnalyzer ran in 10 ms.
CacheableNodeQueueAnalyzer ran in 3 ms.
NodeHashTableAnalyzer ran in 0 ms.
NodeQueueAnalyzer ran in 1 ms.
NodeCacheAnalyzer ran in 17 ms.
ModelAnalyzer ran in 10 ms.
StringStorageAnalyzer ran in 2 ms.
ItemDefinitionAnalyzer ran in 5 ms.
ItemAnalyzer ran in 3 ms.
ObjectDefinitionAnalyzer ran in 4 ms.
NPCDefinitionAnalyzer ran in 13 ms.
NPCAnalyzer ran in 2 ms.
PlayerDefinitionAnalyzer ran in 1 ms.
PlayerAnalyzer ran in 2 ms.
RegionAnalyzer ran in 17 ms.
SceneTileAnalyzer ran in 11 ms.
GameObjectAnalyzer ran in 11 ms.
WidgetAnalyzer ran in 19 ms.
MouseAnalyzer ran in 2 ms.
KeyboardAnalyzer ran in 2 ms.
ClientAnalyzer ran in 20 ms.

[ Node ] -> fk extends Object
F getPrev ::: df fk
F getID ::: du J
F getNext ::: eb fk

[ CacheableNode ] -> fd extends fk
F getNext ::: ch fd
F getPrev ::: ci fd

[ Stream ] -> dn extends fk
M getUnsignedByte(I)I ::: au
M getUnsignedLEShort(B)I ::: ab
M getShort(I)I ::: aj
M getString(I)Ljava/lang/String; ::: an

[ Renderable ] -> cv extends fd
F getHeight ::: br * 1745582025 I

[ Character ] -> az extends cv
F getHitDamages ::: ao I[]
F getText ::: ar String
F getPathX ::: by I[]
F getPathY ::: bl I[]
F getLocalX ::: s * 92987285 I
F getLocalY ::: t * -235871715 I
F getAnimation ::: ad * -417459509 I
F getInteracting ::: af * -760299985 I
F getMaxHealth ::: au * 1163810669 I
F getHealth ::: av * -1472068590 I

[ CacheableNodeQueue ] -> fe extends Object
F getHead ::: i fd

[ NodeHashTable ] -> fm extends Object
F getNodes ::: p fk[]
F getSize ::: q I

[ NodeQueue ] -> fx extends Object
F getHead ::: i fk
F getCurrent ::: p fk

[ NodeCache ] -> fb extends Object
F getHashTable ::: l fm
F getCacheableNode ::: i fd
F getQueue ::: q fe
F getRemaining ::: a I
F getSize ::: l fm

[ Model ] -> dc extends cv
F getTrianglesX ::: v I[]
F getTrianglesY ::: j I[]
F getTrianglesZ ::: f I[]
F getVerticesX ::: b I[]
F getVerticesY ::: u I[]
F getVerticesZ ::: d I[]

[ StringStorage ] -> ex extends Object
(Truncated strings

[ ItemDefinition ] -> ah extends fd
F getGroundActions ::: x String[]
F getInventoryActions ::: n String[]
F isMembers ::: a Z
F isMembers ::: w Z
F getName ::: v String

[ Item ] -> y extends cv
F getID ::: i * 1958746787 I
F getStackSize ::: p * -863047449 I

[ ObjectDefinition ] -> ai extends fd
F getName ::: f String
F getActions ::: aq String[]

[ NPCDefinition ] -> aa extends fd
F getActions ::: t String[]
F getName ::: b String
F getID ::: q * -2007014387 I
F getLevel ::: w * -99142993 I

[ NPC ] -> n extends az
F getDefinition ::: i aa

[ PlayerDefinition ] -> fs extends Object
F getAppearanceIndices ::: j I[]
F getAppearance ::: i I[]

[ Player ] -> a extends az
F getModel ::: h dc
F getName ::: i String
F getDefinition ::: p fs
F getLevel ::: q * 676971579 I

[ Region ] -> cl extends Object
F getSceneObjects ::: m ck[]
F getSceneTiles ::: b cw[][][]

[ SceneTile ] -> cw extends fk
F getTilePlane ::: i * 1367449299 I
F getSceneObjects ::: f ck[]

[ GameObject ] -> ck extends Object
F getRenderable ::: q cv
F getHash ::: h * -1512848797 I
F getLocalX ::: a * 1897507503 I
F getLocalY ::: l * -901302631 I
F getHeight ::: p * 1989504467 I

[ Widget ] -> fj extends fk
F getRelativeX ::: g * 1189477275 I
F getRelativeY ::: e * 1398335543 I

[ Mouse ] -> bj extends Object
F lastPressedState ::: v I
F getX ::: l * -2024098985 I
F getY ::: q * -1070281815 I

[ Keyboard ] -> bo extends Object

[ Client ] -> client extends by
F getBaseX ::: g.cx * 1094864529 I
F getBaseY ::: r.cu * -1695938473 I
F getMenuCount ::: client.ip * 164584831 I
F getMenuOptions ::: cb.k String[]
F getMenuActions ::: d.y String[]
F getMenuX ::: hq * -1042895341 I
F getMenuY ::: hj * 1882830667 I
F getMenuWidth ::: hk * -516104225 I
F getMenuHeight ::: ir * 1352814499 I
F isMenuOpen ::: hy Z
F getWidgets ::: fj.i fj[][]
F getLocalPlayer ::: bl.hw a
F getCompassAngle ::: df * -496201329 I
F getMapOffset ::: ea * 765311969 I
F getMapScale ::: fq * 1389421701 I
F getCamPitch ::: aw.fs * -792252477 I
F getCamYaw ::: m.ft * -1329716993 I
F getCamPosX ::: dx.fo * 2089328449 I
F getCamPosY ::: cx.fl * 952487425 I
F getCamPosZ ::: dw.fu * -354738449 I
F getCurrentLevels ::: hi I[]
F getMaxLevels ::: hg I[]
F getExperiences ::: hz I[]
F getEnergy ::: jo * -666833949 I
F getWeight ::: jt * 2128463673 I
F getLocalPlayers ::: gb a[]
F getLocalNpcs ::: by n[]

***************************************************
Time: 300 milliseconds.
***************************************************
187 analyzedClasses analyzed!
25 analyzedClasses identified!
Hooked total 97 fields/methods!
***************************************************

Process finished with exit code 0

rj

2013-09-20 23:32:53

woot woot ty

Brandon

2013-09-21 01:20:39

Parsing your output is pretty easy actually. Can even be done in Simba pretty efficiently.


Input:

[ Node ] -> fk extends Object
F getPrev ::: df fk
F getID ::: du J
F getNext ::: eb fk

[ CacheableNode ] -> fd extends fk
F getNext ::: ch fd
F getPrev ::: ci fd

[ Stream ] -> dn extends fk
M getUnsignedByte(I)I ::: au
M getUnsignedLEShort(B)I ::: ab
M getShort(I)I ::: aj
M getString(I)Ljava/lang/String; ::: an

[ Renderable ] -> cv extends fd
F getHeight ::: br * 1745582025 I

[ Character ] -> az extends cv
F getHitDamages ::: ao I[]
F getText ::: ar String
F getPathX ::: by I[]
F getPathY ::: bl I[]
F getLocalX ::: s * 92987285 I
F getLocalY ::: t * -235871715 I
F getAnimation ::: ad * -417459509 I
F getInteracting ::: af * -760299985 I
F getMaxHealth ::: au * 1163810669 I
F getHealth ::: av * -1472068590 I

[ CacheableNodeQueue ] -> fe extends Object
F getHead ::: i fd

[ NodeHashTable ] -> fm extends Object
F getNodes ::: p fk[]
F getSize ::: q I

[ NodeQueue ] -> fx extends Object
F getHead ::: i fk
F getCurrent ::: p fk

[ NodeCache ] -> fb extends Object
F getHashTable ::: l fm
F getCacheableNode ::: i fd
F getQueue ::: q fe
F getRemaining ::: a I
F getSize ::: l fm

[ Model ] -> dc extends cv
F getTrianglesX ::: v I[]
F getTrianglesY ::: j I[]
F getTrianglesZ ::: f I[]
F getVerticesX ::: b I[]
F getVerticesY ::: u I[]
F getVerticesZ ::: d I[]

[ StringStorage ] -> ex extends Object
(Truncated strings

[ ItemDefinition ] -> ah extends fd
F getGroundActions ::: x String[]
F getInventoryActions ::: n String[]
F isMembers ::: a Z
F isMembers ::: w Z
F getName ::: v String

[ Item ] -> y extends cv
F getID ::: i * 1958746787 I
F getStackSize ::: p * -863047449 I

[ ObjectDefinition ] -> ai extends fd
F getName ::: f String
F getActions ::: aq String[]

[ NPCDefinition ] -> aa extends fd
F getActions ::: t String[]
F getName ::: b String
F getID ::: q * -2007014387 I
F getLevel ::: w * -99142993 I

[ NPC ] -> n extends az
F getDefinition ::: i aa

[ PlayerDefinition ] -> fs extends Object
F getAppearanceIndices ::: j I[]
F getAppearance ::: i I[]

[ Player ] -> a extends az
F getModel ::: h dc
F getName ::: i String
F getDefinition ::: p fs
F getLevel ::: q * 676971579 I

[ Region ] -> cl extends Object
F getSceneObjects ::: m ck[]
F getSceneTiles ::: b cw[][][]

[ SceneTile ] -> cw extends fk
F getTilePlane ::: i * 1367449299 I
F getSceneObjects ::: f ck[]

[ GameObject ] -> ck extends Object
F getRenderable ::: q cv
F getHash ::: h * -1512848797 I
F getLocalX ::: a * 1897507503 I
F getLocalY ::: l * -901302631 I
F getHeight ::: p * 1989504467 I

[ Widget ] -> fj extends fk
F getRelativeX ::: g * 1189477275 I
F getRelativeY ::: e * 1398335543 I

[ Mouse ] -> bj extends Object
F lastPressedState ::: v I
F getX ::: l * -2024098985 I
F getY ::: q * -1070281815 I

[ Keyboard ] -> bo extends Object

[ Client ] -> client extends by
F getBaseX ::: g.cx * 1094864529 I
F getBaseY ::: r.cu * -1695938473 I
F getMenuCount ::: client.ip * 164584831 I
F getMenuOptions ::: cb.k String[]
F getMenuActions ::: d.y String[]
F getMenuX ::: hq * -1042895341 I
F getMenuY ::: hj * 1882830667 I
F getMenuWidth ::: hk * -516104225 I
F getMenuHeight ::: ir * 1352814499 I
F isMenuOpen ::: hy Z
F getWidgets ::: fj.i fj[][]
F getLocalPlayer ::: bl.hw a
F getCompassAngle ::: df * -496201329 I
F getMapOffset ::: ea * 765311969 I
F getMapScale ::: fq * 1389421701 I
F getCamPitch ::: aw.fs * -792252477 I
F getCamYaw ::: m.ft * -1329716993 I
F getCamPosX ::: dx.fo * 2089328449 I
F getCamPosY ::: cx.fl * 952487425 I
F getCamPosZ ::: dw.fu * -354738449 I
F getCurrentLevels ::: hi I[]
F getMaxLevels ::: hg I[]
F getExperiences ::: hz I[]
F getEnergy ::: jo * -666833949 I
F getWeight ::: jt * 2128463673 I
F getLocalPlayers ::: gb a[]
F getLocalNpcs ::: by n[]


Parser:

type ESA = record
Size: Integer;
Data: TStringArray;
Capacity: Integer;
end;

Function ESA.Push_Back(Str: String): ESA;
Begin
Case Self.Size Of
0:
begin
Self.Capacity := 1;
SetLength(Self.Data, Self.Capacity);
end;

Self.Capacity:
begin
Self.Capacity := Self.Size * 2;
SetLength(Self.Data, Self.Capacity);
end;
end;
Self.Data[Self.Size] := Str;
Self.Size := Self.Size + 1;
Result := Self;
End;

Function ESA.Remove(Index: Cardinal): ESA;
var
I: Cardinal;
Begin
If (Index >= Size) Then
Begin
Result := Self;
Exit;
End;

For I := Index To Self.Size Do
Begin
Self.Data[I] := Self.Data[I + 1];
End;

Self.Size := Self.Size - 1;
Self.Data[I] := '';
Result := Self;
End;

Function ESA.Resize(Size: Cardinal): ESA;
Begin
SetLength(Self.Data, Self.Size);
If (Self.Size > Self.Capacity) Then
Self.Capacity := Self.Size;

Result := Self;
End;

Function ESA.Clear: ESA;
Begin
SetLength(Self.Data, 0);
Self.Size := 0;
End;

Function ESA.Shrink_To_Fit: ESA;
Begin
Self.Capacity := Self.Size;
SetLength(Self.Data, Self.Size);
End;

Function Load(Path: String): String;
var
Ptr: Integer;
Size: Integer;
Begin
if (Not FileExists(Path)) Then
Exit;

Ptr := OpenFile(Path, False);
If (Ptr <> -1) Then
Begin
Size := FileSize(Ptr);
ReadFileString(Ptr, Result, Size);
CloseFile(Ptr);
End;
End;

Function Parse(var Str: String): Array of ESA;
var
T: String;
I, J: Integer;
ClassData: ESA;
ClassChunks: Array Of ESA;
Chunks, Info: TStringArray;
Begin
Chunks := Explode(#13#10#13#10, Str);
For I := 0 To High(Chunks) Do
Begin
ClassData.Push_Back(Between('[ ', ' ]', Chunks[I]));
ClassData.Push_Back(Between('extends ', #13#10, Chunks[I]));
ClassData.Push_Back(Between('-> ', ' extends', Chunks[I]));
Info := Explode(#13#10, Chunks[I]);

For J := 1 To High(Info) Do
Begin
T := Copy(Info[J], 0, 1);
if (T = 'F') Then
ClassData.Push_Back('FIELD_' + Between(' ', ' :::', Info[J]) + ' = ' + Between('::: ', ' ', Info[J]))
else if (T = 'M') Then
ClassData.Push_Back('METHOD_' + Between(' ', ' :::', Info[J]))
else
ClassData.Push_Back('UNKNOWN_' + Between(' ', ' :::', Info[J]) + ' = ' + Between('::: ', ' ', Info[J]));
End;

SetLength(Result, Length(Result) + 1);
Result[High(Result)] := ClassData;
ClassData.Clear();
End;
End;

Procedure PrintClassAESA(var ClassData: Array Of ESA);
var
I, J: Integer;
Begin
For I := 0 To High(ClassData) Do
Begin
writeln('Class: ' + ClassData[I].Data[0] + ';');
writeln('Super: ' + ClassData[I].Data[1] + ';');
writeln('Name : ' + ClassData[I].Data[2] + ';');

For J := 3 To ClassData[I].Size - 1 Do
writeln(ClassData[I].Data[J] + ';');

writeln();
End;
End;

var
Str: String;
Data: Array Of ESA;
begin
Str := Load('C:/Users/Brandon/Desktop/Hooks.txt');
Data := Parse(Str);
PrintClassAESA(Data);
end.


Output:

Class: Node;
Super: Object;
Name : fk;
FIELD_getPrev = df;
FIELD_getID = du;
FIELD_getNext = eb;

Class: CacheableNode;
Super: fk;
Name : fd;
FIELD_getNext = ch;
FIELD_getPrev = ci;

Class: Stream;
Super: fk;
Name : dn;
METHOD_getUnsignedByte(I)I;
METHOD_getUnsignedLEShort(B)I;
METHOD_getShort(I)I;
METHOD_getString(I)Ljava/lang/String;;

Class: Renderable;
Super: fd;
Name : cv;
FIELD_getHeight = br;

Class: Character;
Super: cv;
Name : az;
FIELD_getHitDamages = ao;
FIELD_getText = ar;
FIELD_getPathX = by;
FIELD_getPathY = bl;
FIELD_getLocalX = s;
FIELD_getLocalY = t;
FIELD_getAnimation = ad;
FIELD_getInteracting = af;
FIELD_getMaxHealth = au;
FIELD_getHealth = av;

Class: CacheableNodeQueue;
Super: Object;
Name : fe;
FIELD_getHead = i;

Class: NodeHashTable;
Super: Object;
Name : fm;
FIELD_getNodes = p;
FIELD_getSize = q;

Class: NodeQueue;
Super: Object;
Name : fx;
FIELD_getHead = i;
FIELD_getCurrent = p;

Class: NodeCache;
Super: Object;
Name : fb;
FIELD_getHashTable = l;
FIELD_getCacheableNode = i;
FIELD_getQueue = q;
FIELD_getRemaining = a;
FIELD_getSize = l;

Class: Model;
Super: cv;
Name : dc;
FIELD_getTrianglesX = v;
FIELD_getTrianglesY = j;
FIELD_getTrianglesZ = f;
FIELD_getVerticesX = b;
FIELD_getVerticesY = u;
FIELD_getVerticesZ = d;

Class: StringStorage;
Super: Object;
Name : ex;
UNKNOWN_ = ;

Class: ItemDefinition;
Super: fd;
Name : ah;
FIELD_getGroundActions = x;
FIELD_getInventoryActions = n;
FIELD_isMembers = a;
FIELD_isMembers = w;
FIELD_getName = v;

Class: Item;
Super: cv;
Name : y;
FIELD_getID = i;
FIELD_getStackSize = p;

Class: ObjectDefinition;
Super: fd;
Name : ai;
FIELD_getName = f;
FIELD_getActions = aq;

Class: NPCDefinition;
Super: fd;
Name : aa;
FIELD_getActions = t;
FIELD_getName = b;
FIELD_getID = q;
FIELD_getLevel = w;

Class: NPC;
Super: az;
Name : n;
FIELD_getDefinition = i;

Class: PlayerDefinition;
Super: Object;
Name : fs;
FIELD_getAppearanceIndices = j;
FIELD_getAppearance = i;

Class: Player;
Super: az;
Name : a;
FIELD_getModel = h;
FIELD_getName = i;
FIELD_getDefinition = p;
FIELD_getLevel = q;

Class: Region;
Super: Object;
Name : cl;
FIELD_getSceneObjects = m;
FIELD_getSceneTiles = b;

Class: SceneTile;
Super: fk;
Name : cw;
FIELD_getTilePlane = i;
FIELD_getSceneObjects = f;

Class: GameObject;
Super: Object;
Name : ck;
FIELD_getRenderable = q;
FIELD_getHash = h;
FIELD_getLocalX = a;
FIELD_getLocalY = l;
FIELD_getHeight = p;

Class: Widget;
Super: fk;
Name : fj;
FIELD_getRelativeX = g;
FIELD_getRelativeY = e;

Class: Mouse;
Super: Object;
Name : bj;
FIELD_lastPressedState = v;
FIELD_getX = l;
FIELD_getY = q;

Class: Keyboard;
Super: ;
Name : bo;

Class: Client;
Super: by;
Name : client;
FIELD_getBaseX = g.cx;
FIELD_getBaseY = r.cu;
FIELD_getMenuCount = client.ip;
FIELD_getMenuOptions = cb.k;
FIELD_getMenuActions = d.y;
FIELD_getMenuX = hq;
FIELD_getMenuY = hj;
FIELD_getMenuWidth = hk;
FIELD_getMenuHeight = ir;
FIELD_isMenuOpen = hy;
FIELD_getWidgets = fj.i;
FIELD_getLocalPlayer = bl.hw;
FIELD_getCompassAngle = df;
FIELD_getMapOffset = ea;
FIELD_getMapScale = fq;
FIELD_getCamPitch = aw.fs;
FIELD_getCamYaw = m.ft;
FIELD_getCamPosX = dx.fo;
FIELD_getCamPosY = cx.fl;
FIELD_getCamPosZ = dw.fu;
FIELD_getCurrentLevels = hi;
FIELD_getMaxLevels = hg;
FIELD_getExperiences = hz;
FIELD_getEnergy = jo;
FIELD_getWeight = jt;
FIELD_getLocalPlayers = gb;
FIELD_getLocalNpcs = by;

Can just customize it to spit out a file Simba can just include.

n3ss3s

2013-09-21 02:17:58

Ooh nice :D

Mark

2013-09-21 05:11:34

From: n3ss3s
……..

nice work fella.
how did you come up with the name :D

From: Brandon
…..

thanks for this also.

Hoodz

2013-09-21 05:18:48

Thank you so much!! Rep+

Cheddy

2013-09-21 05:26:40

Ingenious! I'll start working on reflection based random detection. I seem to get plenty of random events!

Cheddy

2013-09-21 05:32:15

Can Simba run external programs such as this? If so, we could implement it into all reflection includes along with the parser so that the hooks are always up to date, making reflection functions flawless

samerdl

2013-09-21 05:49:29

Wow thanks for this man!!!

edit: never mind lol, gave up.

Good luck hoodz.

Cheddy

2013-09-21 07:12:10

The one problem I found with the parser you posted was that it didn't include the multipliers =( Apart from that, its great!

Brandon

2013-09-21 11:26:55

From: fish1328
The one problem I found with the parser you posted was that it didn't include the multipliers =( Apart from that, its great!


Well fine..

You got the perfectionist/ocd side of me going crazy.. It has to be PERFECT! :frusty:

Using the Same input, different script:


type Obj = packed record
__NONE__: Uint8;
end;

type Cls = packed record(Obj)
Name: String;
Super: String;
CType: String;
end;

type Field = packed record(Obj)
Name: String;
Desc: String;
Multiplier: Integer;
end;

type Method = packed record(Obj)
Name: String;
Desc: String;
CType: String;
Return: String;
end;

type ClassMap = packed record(Obj)
ClassHeader: Cls;
ClassField: Field;
ClassMethod: Method;
MemberType: String;
end;

type Vector = packed record
Size: Integer;
Data: Array Of ClassMap;
Capacity: Integer;
end;

Function Vector.Push_Back(O: ClassMap): Vector;
Begin
Case Self.Size Of
0:
begin
Self.Capacity := 1;
SetLength(Self.Data, Self.Capacity);
end;

Self.Capacity:
begin
Self.Capacity := Self.Size * 2;
SetLength(Self.Data, Self.Capacity);
end;
end;
Self.Data[Self.Size] := O;
Self.Size := Self.Size + 1;
Result := Self;
End;

Function Vector.Erase(Index: Cardinal): Vector;
var
I: Cardinal;
T: ClassMap;
Begin
If (Index >= Size) Then
Begin
Result := Self;
Exit;
End;

For I := Index To Self.Size Do
Begin
Self.Data[I] := Self.Data[I + 1];
End;

Self.Size := Self.Size - 1;
Self.Data[I] := T;
Result := Self;
End;

Function Vector.Resize(Size: Cardinal): Vector;
Begin
SetLength(Self.Data, Self.Size);
If (Self.Size > Self.Capacity) Then
Self.Capacity := Self.Size;

Result := Self;
End;

Function Vector.Clear: Vector;
Begin
SetLength(Self.Data, 0);
Self.Size := 0;
End;

Function Vector.Shrink_To_Fit: Vector;
Begin
Self.Capacity := Self.Size;
SetLength(Self.Data, Self.Size);
End;

Function Vector.At(Index: Cardinal): ClassMap;
Begin
Result := Self.Data[Index];
End;

Function Create(_Name, _Desc: String; _Multiplier: Integer = 0): Field;
Begin
Result.Name := _Name;
Result.Desc := _Desc;
Result.Multiplier := _Multiplier;
End;

Function Create(_Name, _Desc, _Return, _CType: String): Method; overload;
Begin
Result.Name := _Name;
Result.Desc := _Desc;
Result.CType := _CType;
Result.Return := _Return;
End;

Function Create(_CHeader: Cls; _CData: Field): ClassMap; overload;
Begin
Result.ClassHeader := _CHeader;
Result.ClassField := _CData;
Result.MemberType := 'F';
End;

Function Create(_CHeader: Cls; _CData: Method): ClassMap; overload;
Begin
Result.ClassHeader := _CHeader;
Result.ClassMethod := _CData;
Result.MemberType := 'M';
End;

Function Load(Path: String): String;
var
Ptr: Integer;
Size: Integer;
Begin
if (Not FileExists(Path)) Then
Exit;

Ptr := OpenFile(Path, False);
If (Ptr <> -1) Then
Begin
Size := FileSize(Ptr);
ReadFileString(Ptr, Result, Size);
CloseFile(Ptr);
End;
End;

Function Parse(var Str: String): Array Of Vector;
var
T: String;
I, J: Integer;
CF: Field;
CM: Method;
ClassData: Cls;
CMap: ClassMap;
ClassInfo: Vector;
Chunks, Info: TStringArray;
Begin
Chunks := Explode(#13#10#13#10, Str);
For I := 0 To High(Chunks) Do
Begin
ClassData.CType := Between('[ ', ' ]', Chunks[I]);
ClassData.Super := Between('extends ', #13#10, Chunks[I]);
ClassData.Name := Between('-> ', ' extends', Chunks[I]);

Info := Explode(#13#10, Chunks[I]);

For J := 1 To High(Info) Do
Begin
T := Copy(Info[J], 0, 1);
If (T = 'F') Then
CMap := Create(ClassData, Create(Between('::: ', ' ', Info[J]), Between(' ', ' :::', Info[J]), StrToIntDef(Between('* ', ' ', Info[J]), 0)))
Else If (T = 'M') Then
CMap := Create(ClassData, Create(Copy(Info[J], PosEx('::: ', Info[J], 5) + 4, Length(Info[J])), Between(' ', ' :::', Info[J]), Between(')', ' :::', Info[J]), Between(' ', '(', Info[J])))
Else
CMap := Create(ClassData, Create('', '', '', ''));
ClassInfo.Push_Back(CMap);
End;

SetLength(Result, Length(Result) + 1);
Result[High(Result)] := ClassInfo;
ClassInfo.Clear();
End;
End;


Procedure PrintVector(var V: Array Of Vector; Version: String);
var
I, J: Integer;
ClassSection: String;
Begin
writeln(' {** Generated By: Brandon''s Zimbabwe Parser. **}', #13#10#13#10);
writeln('const', #13#10, ' HOOKS_VERSION = ', Version, ';');

For I := 0 To High(V) Do
Begin
For J := 0 To V[I].Size - 1 Do
Begin
If (V[I].Data[J].ClassHeader.CType <> ClassSection) Then
Begin
ClassSection := V[I].Data[J].ClassHeader.CType;
writeln(#13#10, ' {', V[I].Data[J].ClassHeader.CType, '}', #13#10);
writeln('Class_', V[I].Data[J].ClassHeader.CType, ' = ''', V[I].Data[J].ClassHeader.Name + ''';');
End;

If (V[I].Data[J].MemberType = 'F') Then
Begin
writeln(' Field_', V[I].Data[J].ClassField.Desc, ' = ''', V[I].Data[J].ClassField.Name, ''';');
If (V[I].Data[J].ClassField.Multiplier <> 0) Then
writeln(' Multiplier_', V[I].Data[J].ClassField.Desc, ' = ', V[I].Data[J].ClassField.Multiplier, ';');
End Else If (V[I].Data[J].MemberType = 'M') Then
Begin
writeln(' Method_', V[I].Data[J].ClassMethod.CType, ' = ''', V[I].Data[J].ClassMethod.Name, ''';');
End;
End;
Writeln();
End;
End;

var
Str: String;
V: Array Of Vector;
begin
ClearDebug;
Str := Load('C:/Users/Brandon/Desktop/Hooks.txt');
V := Parse(Str);
PrintVector(V, '0.1');
end.


Results:

{** Generated By: Brandon's Zimbabwe Parser. **}


const
HOOKS_VERSION = 0.1;

{Node}

Class_Node = 'fk';
Field_getPrev = 'df';
Field_getID = 'du';
Field_getNext = 'eb';


{CacheableNode}

Class_CacheableNode = 'fd';
Field_getNext = 'ch';
Field_getPrev = 'ci';


{Stream}

Class_Stream = 'dn';
Method_getUnsignedByte = 'au';
Method_getUnsignedLEShort = 'ab';
Method_getShort = 'aj';
Method_getString = 'an';


{Renderable}

Class_Renderable = 'cv';
Field_getHeight = 'br';
Multiplier_getHeight = 1745582025;


{Character}

Class_Character = 'az';
Field_getHitDamages = 'ao';
Field_getText = 'ar';
Field_getPathX = 'by';
Field_getPathY = 'bl';
Field_getLocalX = 's';
Multiplier_getLocalX = 92987285;
Field_getLocalY = 't';
Multiplier_getLocalY = -235871715;
Field_getAnimation = 'ad';
Multiplier_getAnimation = -417459509;
Field_getInteracting = 'af';
Multiplier_getInteracting = -760299985;
Field_getMaxHealth = 'au';
Multiplier_getMaxHealth = 1163810669;
Field_getHealth = 'av';
Multiplier_getHealth = -1472068590;


{CacheableNodeQueue}

Class_CacheableNodeQueue = 'fe';
Field_getHead = 'i';


{NodeHashTable}

Class_NodeHashTable = 'fm';
Field_getNodes = 'p';
Field_getSize = 'q';


{NodeQueue}

Class_NodeQueue = 'fx';
Field_getHead = 'i';
Field_getCurrent = 'p';


{NodeCache}

Class_NodeCache = 'fb';
Field_getHashTable = 'l';
Field_getCacheableNode = 'i';
Field_getQueue = 'q';
Field_getRemaining = 'a';
Field_getSize = 'l';


{Model}

Class_Model = 'dc';
Field_getTrianglesX = 'v';
Field_getTrianglesY = 'j';
Field_getTrianglesZ = 'f';
Field_getVerticesX = 'b';
Field_getVerticesY = 'u';
Field_getVerticesZ = 'd';


{StringStorage}

Class_StringStorage = 'ex';
Method_ = '';


{ItemDefinition}

Class_ItemDefinition = 'ah';
Field_getGroundActions = 'x';
Field_getInventoryActions = 'n';
Field_isMembers = 'a';
Field_isMembers = 'w';
Field_getName = 'v';


{Item}

Class_Item = 'y';
Field_getID = 'i';
Multiplier_getID = 1958746787;
Field_getStackSize = 'p';
Multiplier_getStackSize = -863047449;


{ObjectDefinition}

Class_ObjectDefinition = 'ai';
Field_getName = 'f';
Field_getActions = 'aq';


{NPCDefinition}

Class_NPCDefinition = 'aa';
Field_getActions = 't';
Field_getName = 'b';
Field_getID = 'q';
Multiplier_getID = -2007014387;
Field_getLevel = 'w';
Multiplier_getLevel = -99142993;


{NPC}

Class_NPC = 'n';
Field_getDefinition = 'i';


{PlayerDefinition}

Class_PlayerDefinition = 'fs';
Field_getAppearanceIndices = 'j';
Field_getAppearance = 'i';


{Player}

Class_Player = 'a';
Field_getModel = 'h';
Field_getName = 'i';
Field_getDefinition = 'p';
Field_getLevel = 'q';
Multiplier_getLevel = 676971579;


{Region}

Class_Region = 'cl';
Field_getSceneObjects = 'm';
Field_getSceneTiles = 'b';


{SceneTile}

Class_SceneTile = 'cw';
Field_getTilePlane = 'i';
Multiplier_getTilePlane = 1367449299;
Field_getSceneObjects = 'f';


{GameObject}

Class_GameObject = 'ck';
Field_getRenderable = 'q';
Field_getHash = 'h';
Multiplier_getHash = -1512848797;
Field_getLocalX = 'a';
Multiplier_getLocalX = 1897507503;
Field_getLocalY = 'l';
Multiplier_getLocalY = -901302631;
Field_getHeight = 'p';
Multiplier_getHeight = 1989504467;


{Widget}

Class_Widget = 'fj';
Field_getRelativeX = 'g';
Multiplier_getRelativeX = 1189477275;
Field_getRelativeY = 'e';
Multiplier_getRelativeY = 1398335543;


{Mouse}

Class_Mouse = 'bj';
Field_lastPressedState = 'v';
Field_getX = 'l';
Multiplier_getX = -2024098985;
Field_getY = 'q';
Multiplier_getY = -1070281815;



{Client}

Class_Client = 'client';
Field_getBaseX = 'g.cx';
Multiplier_getBaseX = 1094864529;
Field_getBaseY = 'r.cu';
Multiplier_getBaseY = -1695938473;
Field_getMenuCount = 'client.ip';
Multiplier_getMenuCount = 164584831;
Field_getMenuOptions = 'cb.k';
Field_getMenuActions = 'd.y';
Field_getMenuX = 'hq';
Multiplier_getMenuX = -1042895341;
Field_getMenuY = 'hj';
Multiplier_getMenuY = 1882830667;
Field_getMenuWidth = 'hk';
Multiplier_getMenuWidth = -516104225;
Field_getMenuHeight = 'ir';
Multiplier_getMenuHeight = 1352814499;
Field_isMenuOpen = 'hy';
Field_getWidgets = 'fj.i';
Field_getLocalPlayer = 'bl.hw';
Field_getCompassAngle = 'df';
Multiplier_getCompassAngle = -496201329;
Field_getMapOffset = 'ea';
Multiplier_getMapOffset = 765311969;
Field_getMapScale = 'fq';
Multiplier_getMapScale = 1389421701;
Field_getCamPitch = 'aw.fs';
Multiplier_getCamPitch = -792252477;
Field_getCamYaw = 'm.ft';
Multiplier_getCamYaw = -1329716993;
Field_getCamPosX = 'dx.fo';
Multiplier_getCamPosX = 2089328449;
Field_getCamPosY = 'cx.fl';
Multiplier_getCamPosY = 952487425;
Field_getCamPosZ = 'dw.fu';
Multiplier_getCamPosZ = -354738449;
Field_getCurrentLevels = 'hi';
Field_getMaxLevels = 'hg';
Field_getExperiences = 'hz';
Field_getEnergy = 'jo';
Multiplier_getEnergy = -666833949;
Field_getWeight = 'jt';
Multiplier_getWeight = 2128463673;
Field_getLocalPlayers = 'gb';
Field_getLocalNpcs = 'by';

Cheddy

2013-09-21 13:48:47

From: Brandon
Well fine..

You got the perfectionist/ocd side of me going crazy.. It has to be PERFECT! :frusty:

Using the Same input, different script:


type Obj = packed record
__NONE__: Uint8;
end;

type Cls = packed record(Obj)
Name: String;
Super: String;
CType: String;
end;

type Field = packed record(Obj)
Name: String;
Desc: String;
Multiplier: Integer;
end;

type Method = packed record(Obj)
Name: String;
Desc: String;
CType: String;
Return: String;
end;

type ClassMap = packed record(Obj)
ClassHeader: Cls;
ClassField: Field;
ClassMethod: Method;
MemberType: String;
end;

type Vector = packed record
Size: Integer;
Data: Array Of ClassMap;
Capacity: Integer;
end;

Function Vector.Push_Back(O: ClassMap): Vector;
Begin
Case Self.Size Of
0:
begin
Self.Capacity := 1;
SetLength(Self.Data, Self.Capacity);
end;

Self.Capacity:
begin
Self.Capacity := Self.Size * 2;
SetLength(Self.Data, Self.Capacity);
end;
end;
Self.Data[Self.Size] := O;
Self.Size := Self.Size + 1;
Result := Self;
End;

Function Vector.Erase(Index: Cardinal): Vector;
var
I: Cardinal;
T: ClassMap;
Begin
If (Index >= Size) Then
Begin
Result := Self;
Exit;
End;

For I := Index To Self.Size Do
Begin
Self.Data[I] := Self.Data[I + 1];
End;

Self.Size := Self.Size - 1;
Self.Data[I] := T;
Result := Self;
End;

Function Vector.Resize(Size: Cardinal): Vector;
Begin
SetLength(Self.Data, Self.Size);
If (Self.Size > Self.Capacity) Then
Self.Capacity := Self.Size;

Result := Self;
End;

Function Vector.Clear: Vector;
Begin
SetLength(Self.Data, 0);
Self.Size := 0;
End;

Function Vector.Shrink_To_Fit: Vector;
Begin
Self.Capacity := Self.Size;
SetLength(Self.Data, Self.Size);
End;

Function Vector.At(Index: Cardinal): ClassMap;
Begin
Result := Self.Data[Index];
End;

Function Create(_Name, _Desc: String; _Multiplier: Integer = 0): Field;
Begin
Result.Name := _Name;
Result.Desc := _Desc;
Result.Multiplier := _Multiplier;
End;

Function Create(_Name, _Desc, _Return, _CType: String): Method; overload;
Begin
Result.Name := _Name;
Result.Desc := _Desc;
Result.CType := _CType;
Result.Return := _Return;
End;

Function Create(_CHeader: Cls; _CData: Field): ClassMap; overload;
Begin
Result.ClassHeader := _CHeader;
Result.ClassField := _CData;
Result.MemberType := 'F';
End;

Function Create(_CHeader: Cls; _CData: Method): ClassMap; overload;
Begin
Result.ClassHeader := _CHeader;
Result.ClassMethod := _CData;
Result.MemberType := 'M';
End;

Function Load(Path: String): String;
var
Ptr: Integer;
Size: Integer;
Begin
if (Not FileExists(Path)) Then
Exit;

Ptr := OpenFile(Path, False);
If (Ptr <> -1) Then
Begin
Size := FileSize(Ptr);
ReadFileString(Ptr, Result, Size);
CloseFile(Ptr);
End;
End;

Function Parse(var Str: String): Array Of Vector;
var
T: String;
I, J: Integer;
CF: Field;
CM: Method;
ClassData: Cls;
CMap: ClassMap;
ClassInfo: Vector;
Chunks, Info: TStringArray;
Begin
Chunks := Explode(#13#10#13#10, Str);
For I := 0 To High(Chunks) Do
Begin
ClassData.CType := Between('[ ', ' ]', Chunks[I]);
ClassData.Super := Between('extends ', #13#10, Chunks[I]);
ClassData.Name := Between('-> ', ' extends', Chunks[I]);

Info := Explode(#13#10, Chunks[I]);

For J := 1 To High(Info) Do
Begin
T := Copy(Info[J], 0, 1);
If (T = 'F') Then
CMap := Create(ClassData, Create(Between('::: ', ' ', Info[J]), Between(' ', ' :::', Info[J]), StrToIntDef(Between('* ', ' ', Info[J]), 0)))
Else If (T = 'M') Then
CMap := Create(ClassData, Create(Copy(Info[J], PosEx('::: ', Info[J], 5) + 4, Length(Info[J])), Between(' ', ' :::', Info[J]), Between(')', ' :::', Info[J]), Between(' ', '(', Info[J])))
Else
CMap := Create(ClassData, Create('', '', '', ''));
ClassInfo.Push_Back(CMap);
End;

SetLength(Result, Length(Result) + 1);
Result[High(Result)] := ClassInfo;
ClassInfo.Clear();
End;
End;


Procedure PrintVector(var V: Array Of Vector; Version: String);
var
I, J: Integer;
ClassSection: String;
Begin
writeln(' {** Generated By: Brandon''s Zimbabwe Parser. **}', #13#10#13#10);
writeln('const', #13#10, ' HOOKS_VERSION = ', Version, ';');

For I := 0 To High(V) Do
Begin
For J := 0 To V[I].Size - 1 Do
Begin
If (V[I].Data[J].ClassHeader.CType <> ClassSection) Then
Begin
ClassSection := V[I].Data[J].ClassHeader.CType;
writeln(#13#10, ' {', V[I].Data[J].ClassHeader.CType, '}', #13#10);
writeln('Class_', V[I].Data[J].ClassHeader.CType, ' = ', V[I].Data[J].ClassHeader.Name + ';');
End;

If (V[I].Data[J].MemberType = 'F') Then
Begin
writeln(' Field_', V[I].Data[J].ClassField.Desc, ' = ', V[I].Data[J].ClassField.Name, ';');
If (V[I].Data[J].ClassField.Multiplier <> 0) Then
writeln(' Multiplier_', V[I].Data[J].ClassField.Desc, ' = ', V[I].Data[J].ClassField.Multiplier, ';');
End Else If (V[I].Data[J].MemberType = 'M') Then
Begin
writeln(' Method_', V[I].Data[J].ClassMethod.CType, ' = ', V[I].Data[J].ClassMethod.Name, ';');
End;
End;
Writeln();
End;
End;

var
Str: String;
V: Array Of Vector;
begin
ClearDebug;
Str := Load('C:/Users/Brandon/Desktop/Hooks.txt');
V := Parse(Str);
PrintVector(V, '0.1');
end.


Results:

{** Generated By: Brandon's Zimbabwe Parser. **}


const
HOOKS_VERSION = 0.1;

{Node}

Class_Node = fk;
Field_getPrev = df;
Field_getID = du;
Field_getNext = eb;


{CacheableNode}

Class_CacheableNode = fd;
Field_getNext = ch;
Field_getPrev = ci;


{Stream}

Class_Stream = dn;
Method_getUnsignedByte = au;
Method_getUnsignedLEShort = ab;
Method_getShort = aj;
Method_getString = an;


{Renderable}

Class_Renderable = cv;
Field_getHeight = br;
Multiplier_getHeight = 1745582025;


{Character}

Class_Character = az;
Field_getHitDamages = ao;
Field_getText = ar;
Field_getPathX = by;
Field_getPathY = bl;
Field_getLocalX = s;
Multiplier_getLocalX = 92987285;
Field_getLocalY = t;
Multiplier_getLocalY = -235871715;
Field_getAnimation = ad;
Multiplier_getAnimation = -417459509;
Field_getInteracting = af;
Multiplier_getInteracting = -760299985;
Field_getMaxHealth = au;
Multiplier_getMaxHealth = 1163810669;
Field_getHealth = av;
Multiplier_getHealth = -1472068590;


{CacheableNodeQueue}

Class_CacheableNodeQueue = fe;
Field_getHead = i;


{NodeHashTable}

Class_NodeHashTable = fm;
Field_getNodes = p;
Field_getSize = q;


{NodeQueue}

Class_NodeQueue = fx;
Field_getHead = i;
Field_getCurrent = p;


{NodeCache}

Class_NodeCache = fb;
Field_getHashTable = l;
Field_getCacheableNode = i;
Field_getQueue = q;
Field_getRemaining = a;
Field_getSize = l;


{Model}

Class_Model = dc;
Field_getTrianglesX = v;
Field_getTrianglesY = j;
Field_getTrianglesZ = f;
Field_getVerticesX = b;
Field_getVerticesY = u;
Field_getVerticesZ = d;


{StringStorage}

Class_StringStorage = ex;
Method_ = ;


{ItemDefinition}

Class_ItemDefinition = ah;
Field_getGroundActions = x;
Field_getInventoryActions = n;
Field_isMembers = a;
Field_isMembers = w;
Field_getName = v;


{Item}

Class_Item = y;
Field_getID = i;
Multiplier_getID = 1958746787;
Field_getStackSize = p;
Multiplier_getStackSize = -863047449;


{ObjectDefinition}

Class_ObjectDefinition = ai;
Field_getName = f;
Field_getActions = aq;


{NPCDefinition}

Class_NPCDefinition = aa;
Field_getActions = t;
Field_getName = b;
Field_getID = q;
Multiplier_getID = -2007014387;
Field_getLevel = w;
Multiplier_getLevel = -99142993;


{NPC}

Class_NPC = n;
Field_getDefinition = i;


{PlayerDefinition}

Class_PlayerDefinition = fs;
Field_getAppearanceIndices = j;
Field_getAppearance = i;


{Player}

Class_Player = a;
Field_getModel = h;
Field_getName = i;
Field_getDefinition = p;
Field_getLevel = q;
Multiplier_getLevel = 676971579;


{Region}

Class_Region = cl;
Field_getSceneObjects = m;
Field_getSceneTiles = b;


{SceneTile}

Class_SceneTile = cw;
Field_getTilePlane = i;
Multiplier_getTilePlane = 1367449299;
Field_getSceneObjects = f;


{GameObject}

Class_GameObject = ck;
Field_getRenderable = q;
Field_getHash = h;
Multiplier_getHash = -1512848797;
Field_getLocalX = a;
Multiplier_getLocalX = 1897507503;
Field_getLocalY = l;
Multiplier_getLocalY = -901302631;
Field_getHeight = p;
Multiplier_getHeight = 1989504467;


{Widget}

Class_Widget = fj;
Field_getRelativeX = g;
Multiplier_getRelativeX = 1189477275;
Field_getRelativeY = e;
Multiplier_getRelativeY = 1398335543;


{Mouse}

Class_Mouse = bj;
Field_lastPressedState = v;
Field_getX = l;
Multiplier_getX = -2024098985;
Field_getY = q;
Multiplier_getY = -1070281815;



{Client}

Class_Client = client;
Field_getBaseX = g.cx;
Multiplier_getBaseX = 1094864529;
Field_getBaseY = r.cu;
Multiplier_getBaseY = -1695938473;
Field_getMenuCount = client.ip;
Multiplier_getMenuCount = 164584831;
Field_getMenuOptions = cb.k;
Field_getMenuActions = d.y;
Field_getMenuX = hq;
Multiplier_getMenuX = -1042895341;
Field_getMenuY = hj;
Multiplier_getMenuY = 1882830667;
Field_getMenuWidth = hk;
Multiplier_getMenuWidth = -516104225;
Field_getMenuHeight = ir;
Multiplier_getMenuHeight = 1352814499;
Field_isMenuOpen = hy;
Field_getWidgets = fj.i;
Field_getLocalPlayer = bl.hw;
Field_getCompassAngle = df;
Multiplier_getCompassAngle = -496201329;
Field_getMapOffset = ea;
Multiplier_getMapOffset = 765311969;
Field_getMapScale = fq;
Multiplier_getMapScale = 1389421701;
Field_getCamPitch = aw.fs;
Multiplier_getCamPitch = -792252477;
Field_getCamYaw = m.ft;
Multiplier_getCamYaw = -1329716993;
Field_getCamPosX = dx.fo;
Multiplier_getCamPosX = 2089328449;
Field_getCamPosY = cx.fl;
Multiplier_getCamPosY = 952487425;
Field_getCamPosZ = dw.fu;
Multiplier_getCamPosZ = -354738449;
Field_getCurrentLevels = hi;
Field_getMaxLevels = hg;
Field_getExperiences = hz;
Field_getEnergy = jo;
Multiplier_getEnergy = -666833949;
Field_getWeight = jt;
Multiplier_getWeight = 2128463673;
Field_getLocalPlayers = gb;
Field_getLocalNpcs = by;


Woot, That was almost good enough for me to copy and paste for use as the hooks (Just needs to put the field hooks in '' as they are strings; Also there was a problem with duplicate identifiers but apart from that no complaining!) How do you run the parser,it says that a packed record isn't a type for me :L

Cheddy

2013-09-21 13:53:32

Also, The hooks must be wrong for the x/y coordinates…. It's returning me some random value

Cheddy

2013-09-21 13:55:29

-16774488,3493 Are the coordinates for Seers bank it gave me :/

Cheddy

2013-09-21 13:56:41

16774472,3448 for the flax field :/

Brandon

2013-09-21 16:00:15

Well I updated the previous post so it should now do the quotes properly..

A packed record is a record with byte-alignment matching that of the contents of the structure. Aka no structural padding/byte padding.

You can just remove the "Packed" from it and it'd still work. However, the other functions still require Lape anyway so yeah. To use that parser means your interpreter should be set to Lape.

As for the values you are getting.. I have no clue since I haven't looked at the hooks. I assume they are right because n3ss3s is good at this stuff. You might just be using them wrong I guess?

Also, try not to double post. Just use the edit button.

Cheddy

2013-09-21 18:37:48

ooh no, the hooks were wrong =) I've got the right ones now for the baseX baseY, but still need compass angle before I release. And thanks Brandon =) I've never used LAPE before =)

n3ss3s

2013-09-21 19:07:27

For character coords, you need to do

GlobalX := BaseX + (CharX shr 7 and 255);

Cheddy

2013-09-21 19:27:03

Thanks @N3ss3s. Got that fixed =)

n3ss3s

2013-09-21 20:43:14

The compass angle is fine, you need to do CompassAngle + (MapScale and 2047) to get values between 0 and 2048

Cheddy

2013-09-21 20:55:56

Ahh. Solved. Thanks. Will release the hooks file tomorrow :-) And I'll maybe make some functions

Ian

2013-09-21 20:59:51

From: fish1328
Ahh. Solved. Thanks. Will release the hooks file tomorrow :-) And I'll maybe make some functions


Check out hoodz's little include, maybe you guys could work together :) http://villavu.com/forum/showthread.php?t=105736

Cheddy

2013-09-21 21:15:24

From: BMWxi
Check out hoodz's little include, maybe you guys could work together :) http://villavu.com/forum/showthread.php?t=105736


We pretty much are already lol :-D

Flight

2013-09-29 22:19:34

N3ss3s, do you happen to have hooks for on-screen Interfaces?

Hoodz

2013-09-30 01:34:02

From: Flight
N3ss3s, do you happen to have hooks for on-screen Interfaces?


Are you working on randoms?

n3ss3s

2013-10-01 02:51:10

From: Flight
N3ss3s, do you happen to have hooks for on-screen Interfaces?


Do you mean the current open interface, like bank? There's a field but I'm not sure how consistent it is, I'm gonna look into it.

For the actual widget content all I have is

[ Widget ] -> fk extends fo
F getRelativeX ::: b * 434510407 I
F getRelativeY ::: x * 431106607 I
F getActions ::: bz String[]
F getID ::: a * -2125932301 I
F getText ::: bi String
F getItems ::: dz I[]
F getStackSizes ::: dh I[]


I'll probably be adding texture id etc so it's usable

Flight

2013-10-01 05:13:42

From: n3ss3s
Do you mean the current open interface, like bank? There's a field but I'm not sure how consistent it is, I'm gonna look into it.

For the actual widget content all I have is



I'll probably be adding texture id etc so it's usable


I was wondering if it was Widget or not because I have no idea what that was referring to. And yes indeed the current interface being shown on screen, like bank & shop. Texture would be nice as I assume that's what's required for solving a few random events, like the certer, mordaut, strange box, and so on…

Yes hoodz I'd only like to know some specific hooks for the sake of building some random-solvers. Honestly this should have been the top priority when reflection became available to us.

Hoodz

2013-10-01 05:21:06

From: Flight
I was wondering if it was Widget or not because I have no idea what that was referring to. And yes indeed the current interface being shown on screen, like bank & shop. Texture would be nice as I assume that's what's required for solving a few random events, like the certer, mordaut, strange box, and so on…

Yes hoodz I'd only like to know some specific hooks for the sake of building some random-solvers. Honestly this should have been the top priority when reflection became available to us.

ill try to get something to work too, if i get something ill let you know.

Cheddy

2013-10-05 12:24:42

From: Flight
I was wondering if it was Widget or not because I have no idea what that was referring to. And yes indeed the current interface being shown on screen, like bank & shop. Texture would be nice as I assume that's what's required for solving a few random events, like the certer, mordaut, strange box, and so on…

Yes hoodz I'd only like to know some specific hooks for the sake of building some random-solvers. Honestly this should have been the top priority when reflection became available to us.

Yes but we first need an include before we can make solvers. I.E. We will have to develop the functions used in the solvers; I am looking into that (I just don't have much time atm) =)

rj

2013-10-06 00:20:00

From: fish1328
Yes but we first need an include before we can make solvers. I.E. We will have to develop the functions used in the solvers; I am looking into that (I just don't have much time atm) =)


and we need hooks before we can make an include..

Cheddy

2013-10-06 09:55:31

We have most of the hooks needed. Just need the widget ones mainly :( We do have some, courtesy of N3ss3s but we need them all :D

Hoodz

2013-11-01 17:41:53

@n3ss3s did the updater broke?

edit:



C:\simba\HookUpdater by N3ss3s>java -jar ZNU.jar
Downloading jar
***************************************************
********** ZIMBABWE NATIONAL UPDATER 1.0 **********
***************************************************
NodeAnalyzer ran in 16 ms.
CacheableNodeAnalyzer ran in 1 ms.
StreamAnalyzer ran in 5 ms.
RenderableAnalyzer ran in 3 ms.
CharacterAnalyzer ran in 7 ms.
CacheableNodeQueueAnalyzer ran in 1 ms.
NodeHashTableAnalyzer ran in 0 ms.
NodeQueueAnalyzer ran in 1 ms.
NodeCacheAnalyzer ran in 6 ms.
ModelAnalyzer ran in 6 ms.
StringStorageAnalyzer ran in 0 ms.
ItemDefinitionAnalyzer ran in 3 ms.
ItemAnalyzer ran in 1 ms.
ObjectDefinitionAnalyzer ran in 2 ms.
NPCDefinitionAnalyzer ran in 7 ms.
NPCAnalyzer ran in 0 ms.
PlayerDefinitionAnalyzer ran in 1 ms.
PlayerAnalyzer ran in 1 ms.
RegionAnalyzer ran in 7 ms.
SceneTileAnalyzer ran in 3 ms.
GameObjectAnalyzer ran in 1 ms.
WidgetAnalyzer ran in 2 ms.
MouseAnalyzer ran in 0 ms.
KeyboardAnalyzer ran in 2 ms.
Exception in thread "main" java.lang.ClassCastException: org.objectweb.asm.tree.
FieldInsnNode cannot be cast to org.objectweb.asm.tree.LdcInsnNode
at org.znu.analyzers.ClientAnalyzer.hookCam(ClientAnalyzer.java:270)
at org.znu.analyzers.ClientAnalyzer.analyze(ClientAnalyzer.java:370)
at org.znu.core.AbstractAnalyzer.run(AbstractAnalyzer.java:33)
at Updater.analyzeClient(Updater.java:91)
at Updater.main(Updater.java:117)

C:\simba\HookUpdater by N3ss3s>PAUSE
Press any key to continue . . .

NKN

2013-11-01 17:56:11

From: hoodz
@n3ss3s did the updater broke?

edit:



C:\simba\HookUpdater by N3ss3s>java -jar ZNU.jar
Downloading jar
***************************************************
********** ZIMBABWE NATIONAL UPDATER 1.0 **********
***************************************************
NodeAnalyzer ran in 16 ms.
CacheableNodeAnalyzer ran in 1 ms.
StreamAnalyzer ran in 5 ms.
RenderableAnalyzer ran in 3 ms.
CharacterAnalyzer ran in 7 ms.
CacheableNodeQueueAnalyzer ran in 1 ms.
NodeHashTableAnalyzer ran in 0 ms.
NodeQueueAnalyzer ran in 1 ms.
NodeCacheAnalyzer ran in 6 ms.
ModelAnalyzer ran in 6 ms.
StringStorageAnalyzer ran in 0 ms.
ItemDefinitionAnalyzer ran in 3 ms.
ItemAnalyzer ran in 1 ms.
ObjectDefinitionAnalyzer ran in 2 ms.
NPCDefinitionAnalyzer ran in 7 ms.
NPCAnalyzer ran in 0 ms.
PlayerDefinitionAnalyzer ran in 1 ms.
PlayerAnalyzer ran in 1 ms.
RegionAnalyzer ran in 7 ms.
SceneTileAnalyzer ran in 3 ms.
GameObjectAnalyzer ran in 1 ms.
WidgetAnalyzer ran in 2 ms.
MouseAnalyzer ran in 0 ms.
KeyboardAnalyzer ran in 2 ms.
Exception in thread "main" java.lang.ClassCastException: org.objectweb.asm.tree.
FieldInsnNode cannot be cast to org.objectweb.asm.tree.LdcInsnNode
at org.znu.analyzers.ClientAnalyzer.hookCam(ClientAnalyzer.java:270)
at org.znu.analyzers.ClientAnalyzer.analyze(ClientAnalyzer.java:370)
at org.znu.core.AbstractAnalyzer.run(AbstractAnalyzer.java:33)
at Updater.analyzeClient(Updater.java:91)
at Updater.main(Updater.java:117)

C:\simba\HookUpdater by N3ss3s>PAUSE
Press any key to continue . . .


Gonna take a stab and say he's casting field to an ldc.

;)

n3ss3s

2013-11-05 17:22:45

I pushed an update to the bitbucket that along with other things lets it continue after a runtime exception. The current problem with posted above is probably due to some structural changes in the part of the code that it was built to grab from, I currently don't have time/effort/interest to fix it so someone else can take a stab at it.

[ Node ] -> fi extends Object
F getID ::: dw J
F getPrev ::: dl fi
F getNext ::: ei fi

[ CacheableNode ] -> fk extends fi
F getNext ::: cz fk
F getPrev ::: cf fk

[ Stream ] -> dv extends fi
M getUnsignedByte(I)I ::: al
M getShort(B)I ::: af
M getUnsignedLEShort(B)I ::: av
M getString(I)Ljava/lang/String; ::: ab

[ Renderable ] -> ca extends fk
F getHeight ::: bd * 997826471 I

[ Character ] -> as extends ca
F getText ::: an String
F getPathY ::: bc I[]
F getPathX ::: br I[]
F getLocalY ::: t * 554651779 I
F getLocalX ::: h * 1813826637 I
F getAnimation ::: aq * 230112839 I
F getMaxHealth ::: af * 674323769 I
F getHealth ::: av * 1753840346 I
F getInteracting ::: ap * -332434183 I

[ CacheableNodeQueue ] -> ft extends Object
F getHead ::: v fk

[ NodeHashTable ] -> fw extends Object
F getNodes ::: c fi[]
F getSize ::: m I

[ NodeQueue ] -> fd extends Object
F getHead ::: v fi
F getCurrent ::: c fi

[ NodeCache ] -> fb extends Object
F getQueue ::: m ft
F getHashTable ::: i fw
F getCacheableNode ::: v fk
F getRemaining ::: b I
F getSize ::: c I

[ Model ] -> dk extends ca
F getTrianglesX ::: g I[]
F getTrianglesY ::: y I[]
F getTrianglesZ ::: a I[]
F getVerticesX ::: z I[]
F getVerticesY ::: x I[]
F getVerticesZ ::: d I[]

[ StringStorage ] -> eu extends Object
(Truncated strings

[ ItemDefinition ] -> al extends fk
F getInventoryActions ::: n String[]
F getGroundActions ::: l String[]
F getName ::: g String
F isMembers ::: b Z
F isMembers ::: r Z

[ Item ] -> o extends ca
F getID ::: v * 1361609809 I
F getStackSize ::: c * 1398354247 I

[ ObjectDefinition ] -> aa extends fk
F getName ::: a String
F getActions ::: ax String[]

[ NPCDefinition ] -> ah extends fk
F getActions ::: t String[]
F getName ::: z String
F getID ::: m * -853424803 I

[ NPC ] -> n extends as
F getDefinition ::: v ah

[ PlayerDefinition ] -> fa extends Object
F getAppearanceIndices ::: y I[]
F getAppearance ::: v I[]

[ Player ] -> b extends as
F getDefinition ::: c fa
F getName ::: v String
F getModel ::: u dk
F getLevel ::: m * 1226372481 I

[ Region ] -> cw extends Object
F getSceneObjects ::: j cy[]
F getSceneTiles ::: z ck[][][]

[ SceneTile ] -> ck extends fi
F getTilePlane ::: v * 1609058777 I
F getSceneObjects ::: a cy[]

[ GameObject ] -> cy extends Object
F getRenderable ::: z ca
F getHash ::: u * -1670009035 I
F getLocalX ::: b * -1296165315 I
F getLocalY ::: i * 1389028149 I
F getHeight ::: c * -1506742805 I

[ Widget ] -> fu extends fi
F getRelativeX ::: f * -87954445 I
F getRelativeY ::: x * -1050316303 I
F getActions ::: br String[]
F getID ::: k * 976778509 I
F getText ::: bo String
F getItems ::: df I[]
F getStackSizes ::: dc I[]

[ Mouse ] -> bt extends Object
F getX ::: i * -1828091377 I
F getY ::: m * 2132506777 I
F lastPressedState ::: b I

[ Keyboard ] -> be extends Object

[ Client ] -> client extends br
F getNPCIndices ::: client.gt I[]
F getBaseX ::: am.cm * -1462679003 I
F getBaseY ::: bh.cp * 1016146699 I
F getMenuCount ::: client.ib * 940788281 I
F getKeyboard ::: be.v be
F getRegion ::: a.dk cw
F getMenuOptions ::: d.p String[]
F getMenuActions ::: t.o String[]
F getWidgets ::: fu.v fu[][]
F getLocalPlayer ::: es.hu b
F getCamPitch ::: er.fa * -1397185493 I
F getCamYaw ::: ef.fs * 2136828965 I
F getCamPosX ::: client.h * -1607280005 I
F getCurrentLevels ::: hi I[]
F getMaxLevels ::: hl I[]
F getExperiences ::: hr I[]
F getEnergy ::: jg * 1708023801 I
F getWeight ::: jr * 253244699 I
F getMenuX ::: hd * 108649449 I
F getMenuY ::: hg * -1642054603 I
F getMenuWidth ::: he * 1906222353 I
F getMenuHeight ::: iu * 1713986561 I
F isMenuOpen ::: hq Z
F getPacketStream ::: cf di
F getLocalPlayers ::: gp b[]
F getLocalNpcs ::: br n[]

[ Rasterizer2D ] -> cb extends fk
F getPixels ::: u I[]
F getWidth ::: k I
F getHeight ::: e I
F getTopX ::: s I
F getTopY ::: p I
F getBottomX ::: f I
F getBottomY ::: o I
M createRasterizer([III)V ::: cc
M setCoordinates(IIII)V ::: ci
M drawEmptyRect(IIIII)V ::: ce
M fillRectAlpha(IIIIII)V ::: cp

[ Rasterizer3D ] -> ch extends cb

***************************************************
Time: 379 milliseconds.
***************************************************
187 analyzedClasses analyzed!
27 analyzedClasses identified!
Hooked total 110 fields/methods!
***************************************************

Hoodz

2013-11-07 12:59:56

From: n3ss3s
I pushed an update to the bitbucket that along with other things lets it continue after a runtime exception. The current problem with posted above is probably due to some structural changes in the part of the code that it was built to grab from, I currently don't have time/effort/interest to fix it so someone else can take a stab at it.


its working again now!