ok..the proper offset should be:
I should point out, for prosperity's sake, that DoAbilityList-0x08 is the MeleeAttack type, and DoAbilityList-0x04 is the RangeAttack type (though, if you have something that is not an 'attack' type item in either of these slots, you get a weird result here (ie, I have a Valorian Insignia in my range and got an "8" value there..shrug)
Also, VOID DoAbility should be modified as follows. I put in a few qualifiers that should help with crashes in the future when offsets are incorrect. If you're wondering 0x77FFFFFF would be 119, which is the highest skill # listed in skills.h at this point. (Note: New code is in
bold)
Code: Select all
// ***************************************************************************
// Function: DoAbility
// Description: Our '/doability' command
// Selects the closest spawn
// Usage: /doability [list|ability|#]
// ***************************************************************************
VOID DoAbility(PSPAWNINFO pChar, PCHAR szLine)
{
if (!cmdDoAbility) return;
if (szLine[0]==0 || atoi(szLine) || !EQADDR_DOABILITYLIST) {
cmdDoAbility(pChar,szLine);
return;
}
DWORD Index, DoIndex = 0xFFFFFFFF;
CHAR szBuffer[MAX_STRING] = {0};
GetArg(szBuffer,szLine,1);
if (!stricmp(szBuffer,"list")) {
WriteChatColor("Abilities:",USERCOLOR_DEFAULT);
for (Index=4;Index<10;Index++) {
[b]if (EQADDR_DOABILITYLIST[Index] > 0x77FFFFFF) {
sprintf(szBuffer,"%d. **MQ ERROR: DoAbilityList offset most likely incorrect.**", Index-3 );
} else[/b] if (EQADDR_DOABILITYLIST[Index]==0xFFFFFFFF) {
sprintf(szBuffer,"%d. <Empty>",Index-3);
} else if (szSkills[EQADDR_DOABILITYLIST[Index]]) {
sprintf(szBuffer,"%d. %s",Index-3,szSkills[EQADDR_DOABILITYLIST[Index]]);
} else {
sprintf(szBuffer,"%d. *Unknown%d",Index-3,EQADDR_DOABILITYLIST[Index]);
}
WriteChatColor(szBuffer,USERCOLOR_DEFAULT);
}
WriteChatColor("Combat Skills:",USERCOLOR_DEFAULT);
for (Index=0;Index<4;Index++) {
[b]if (EQADDR_DOABILITYLIST[Index] > 0x77FFFFFF) {
sprintf(szBuffer,"%d. **MQ ERROR: DoAbilityList offset most likely incorrect.**", Index+7 );
} else [/b]if (EQADDR_DOABILITYLIST[Index]==0xFFFFFFFF) {
sprintf(szBuffer,"%d. <Empty>",Index+7);
} else if (szSkills[EQADDR_DOABILITYLIST[Index]]) {
sprintf(szBuffer,"%d. %s",Index+7,szSkills[EQADDR_DOABILITYLIST[Index]]);
} else {
sprintf(szBuffer,"%d. *Unknown%d",Index+7,EQADDR_DOABILITYLIST[Index]);
}
WriteChatColor(szBuffer,USERCOLOR_DEFAULT);
}
return;
}
for (Index=0;Index<10;Index++) {
if (EQADDR_DOABILITYLIST[Index]!= 0xFFFFFFFF [b]&& EQADDR_DOABILITYLIST[Index] <= 0x77FFFFFF[/b]) {
if (!strnicmp(szBuffer,szSkills[EQADDR_DOABILITYLIST[Index]],strlen(szSkills[EQADDR_DOABILITYLIST[Index]]))) {
if (Index<4) {
DoIndex = Index+7; // 0-3 = Combat abilities (7-10)
} else {
DoIndex = Index-3; // 4-9 = Abilities (1-6)
}
}
}
}
if (DoIndex!=0xFFFFFFFF [b]&& DoIndex <= 0x77FFFFFF[/b]) {
cmdDoAbility(pChar,itoa(DoIndex,szBuffer,10));
} else {
WriteChatBuffer("You do not seem to have that ability on a /doability button",USERCOLOR_DEFAULT);
}
}
DKAA: please indicate you got this last bit of code. I'll send patches of eqgame.ini and MQ.h eventually, but you don't want to see a patch of my EQLib.cpp ..haha
OK! ..what's next? :)