Code:
struct _tagCharacterStatusInfo
{
__int16 nStrength;
__int16 nDexterity;
__int16 nHealth;
__int16 nIntelligence;
__int16 nMentality;
__int16 nQuickness;
int nMeleeAttackForce;
int nMissileAttackForce;
int nMagicAttackForce;
int nPhysicsDefence;
int nMagicDefence;
__int16 nHitRate;
__int16 nEscapeReate;
int nMaxLife;
__int16 nLifeRecovery;
int nMaxMana;
__int16 nManaRecovery;
__int16 nResistance;
__int16 nMoveSpeed;
__int16 nAttackSpeed;
__int16 nMaxWeight;
char nResistanceBlazing;
char nResistanceFrozen;
char nResistanceDarkness;
char nResistanceDivine;
};
new struct
struct _tagCharacterStatusInfo
{
int nStrength;
int nDexterity;
int nHealth;
int nIntelligence;
int nMentality;
int nQuickness;
int nMeleeAttackForce;
int nMissileAttackForce;
int nMagicAttackForce;
int nPhysicsDefence;
int nMagicDefence;
__int16 nHitRate;
__int16 nEscapeReate;
int nMaxLife;
__int16 nLifeRecovery;
int nMaxMana;
__int16 nManaRecovery;
__int16 nResistance;
__int16 nMoveSpeed;
__int16 nAttackSpeed;
__int16 nMaxWeight;
char nResistanceBlazing;
char nResistanceFrozen;
char nResistanceDarkness;
char nResistanceDivine;
};
Code:
original code
void __thiscall CPlayer::GetStatusInfo(CPlayer *this, _tagCharacterStatusInfo *grCharStatusInfo)
{
CPlayer *v2; // ST04_4@1
v2 = this;
grCharStatusInfo->nStrength = CBioticBase::GetAbility((CBioticBase *)&this->vfptr, 0);
grCharStatusInfo->nDexterity = CBioticBase::GetAbility((CBioticBase *)&v2->vfptr, 3);
grCharStatusInfo->nHealth = CBioticBase::GetAbility((CBioticBase *)&v2->vfptr, 1);
grCharStatusInfo->nIntelligence = CBioticBase::GetAbility((CBioticBase *)&v2->vfptr, 2);
grCharStatusInfo->nMentality = CBioticBase::GetAbility((CBioticBase *)&v2->vfptr, 4);
grCharStatusInfo->nQuickness = CBioticBase::GetAbility((CBioticBase *)&v2->vfptr, 5);
grCharStatusInfo->nMeleeAttackForce = CBioticBase::GetAbility((CBioticBase *)&v2->vfptr, 6);
grCharStatusInfo->nMissileAttackForce = CBioticBase::GetAbility((CBioticBase *)&v2->vfptr, 7);
grCharStatusInfo->nMagicAttackForce = CBioticBase::GetAbility((CBioticBase *)&v2->vfptr, 8);
grCharStatusInfo->nPhysicsDefence = CBioticBase::GetAbility((CBioticBase *)&v2->vfptr, 9);
grCharStatusInfo->nMagicDefence = CBioticBase::GetAbility((CBioticBase *)&v2->vfptr, 10);
grCharStatusInfo->nHitRate = CBioticBase::GetAbility((CBioticBase *)&v2->vfptr, 11);
grCharStatusInfo->nEscapeReate = CBioticBase::GetAbility((CBioticBase *)&v2->vfptr, 12);
grCharStatusInfo->nMaxLife = CBioticBase::GetAbility((CBioticBase *)&v2->vfptr, 13);
grCharStatusInfo->nLifeRecovery = CBioticBase::GetAbility((CBioticBase *)&v2->vfptr, 14);
grCharStatusInfo->nMaxMana = CBioticBase::GetAbility((CBioticBase *)&v2->vfptr, 15);
grCharStatusInfo->nManaRecovery = CBioticBase::GetAbility((CBioticBase *)&v2->vfptr, 16);
grCharStatusInfo->nResistance = CBioticBase::GetAbility((CBioticBase *)&v2->vfptr, 17);
grCharStatusInfo->nMoveSpeed = CBioticBase::GetAbility((CBioticBase *)&v2->vfptr, 18);
grCharStatusInfo->nAttackSpeed = CBioticBase::GetAbility((CBioticBase *)&v2->vfptr, 19);
grCharStatusInfo->nMaxWeight = CBioticBase::GetAbility((CBioticBase *)&v2->vfptr, 20);
grCharStatusInfo->nResistanceBlazing = CBioticBase::GetAbility((CBioticBase *)&v2->vfptr, 47);
grCharStatusInfo->nResistanceFrozen = CBioticBase::GetAbility((CBioticBase *)&v2->vfptr, 48);
grCharStatusInfo->nResistanceDarkness = CBioticBase::GetAbility((CBioticBase *)&v2->vfptr, 49);
grCharStatusInfo->nResistanceDivine = CBioticBase::GetAbility((CBioticBase *)&v2->vfptr, 50);
}
Code:
private static void DetouredGetStatusInfo(IntPtr ptrPlayer, IntPtr pInfo)
{
try
{
Data._tagCharacterStatusInfo structure = (Data._tagCharacterStatusInfo)Marshal.PtrToStructure(pInfo, typeof(Data._tagCharacterStatusInfo));
Marshal.Copy(Misc.getBytes(structure), 0, pInfo, Marshal.SizeOf(structure));
.............
Hooks.Manager["CPlayer::GetStatusInfo"].CallOriginal(new object[] { ptrPlayer, pInfo });
}
catch (Exception exception)
{
Log.LogError(exception, "CPlayer::GetStatusInfo");
}
}






