You could use this same logic to create functions for the other databases that are stored in memory (ie, zones, etc..)
In mqext.def..add (under the EXPORTS heading)
Code: Select all
exportallspells
Code: Select all
// This routine exports all spell information in the game (stored
// in memory) into a tilde delimited format which works well with
// Microsoft Excel.
// Note: Add "Levels"
DECLARE_API ( exportallspells )
{
SPELLLIST *p, *pnull=NULL, ci, *r;
DWORD *q, cb;
CHAR Name[MAX_STRING] = {0};
CHAR Target[MAX_STRING] = {0};
CHAR CastOnYou[MAX_STRING] = {0};
CHAR CastOnAnother[MAX_STRING] = {0};
CHAR WearOff[MAX_STRING] = {0};
int i=1;
int j=0;
int k=0;
dprintf("ID~Name~Range~CastTime~FizzleTime~RecastTime~DurationType~DurationValue1~Mana~");
dprintf("Target~CastOnYou~CastOnAnother~WearOff~");
dprintf("BookIcon~GemIcon~SpellIcon~");
dprintf("CastingAnim~SpellAnim~");
for (k=0;k<4;k++) dprintf("ReagentID%d~ReagentCount%d~",k+1,k+1);
for (k=0;k<12;k++) dprintf("Base%d~",k+1);
for (k=0;k<12;k++) dprintf("Max%d~",k+1);
for (k=0;k<12;k++) dprintf("Calc%d~",k+1);
for (k=0;k<12;k++) dprintf("Attrib%d~",k+1);
dprintf("DescNum~FizzLeadj\n");
while( i <= (TOTAL_SPELL_COUNT+2) )
{
q = (DWORD*) GetExpression(args)+j;
ReadMemory((PARAM1)q, &r, sizeof(r), &cb);
p = (SPELLLIST * )r;
ReadMemory((PARAM1)p,&ci,sizeof(ci),&cb);
//Read some memory locations into buffers
ReadMemory((PARAM1)ci.Name,Name,256,&cb);
ReadMemory((PARAM1)ci.Target,Target,256,&cb);
ReadMemory((PARAM1)ci.CastOnYou,CastOnYou,256,&cb);
ReadMemory((PARAM1)ci.CastOnAnother,CastOnAnother,256,&cb);
ReadMemory((PARAM1)ci.WearOff,WearOff,256,&cb);
//
dprintf("%d~%s~%2f~%d~%d~%d~%d~%d~%d~", ci.ID, Name, ci.Range, ci.CastTime, ci.FizzleTime, ci.RecastTime, ci.DurationType, ci.DurationValue1, ci.Mana );
dprintf("%s~%s~Someone%s~%s~", Target, CastOnYou, CastOnAnother, WearOff );
dprintf("%d~%d~%d~", ci.BookIcon, ci.GemIcon, ci.SpellIcon );
dprintf("%d~%d~", ci.CastingAnim, ci.SpellAnim );
for (k=0;k<4;k++) dprintf("%d~%d~", ci.ReagentId[k], ci.ReagentCount[k] );
for (k=0;k<12;k++) dprintf("%d~", ci.Base[k]);
for (k=0;k<12;k++) dprintf("%d~", ci.Max[k]);
for (k=0;k<12;k++) dprintf("%d~", ci.Calc[k]);
for (k=0;k<12;k++) dprintf("%d~", ci.Attrib[k]);
dprintf("%d~%d\n", ci.descnum, ci.FizzLeadj );
//Clean up (always better to be safe than sorry)
Name[0] = Target[0] = CastOnYou[0] = CastOnAnother[0] = WearOff[0] = '\0';
i++;
j++;
}
}
Syntax (in windbg):
> dd SPELLLIST_OFFSET
> !mqext.exportallspells <value given from command above>+0x24
(I think that's right..I havn't used it in a while ..hehe)


donations for this month's patches.