Code:
void *__thiscall CPlayerSkill__ShieldOffense(void *SkillPointer, void *PlayerPointer, char *PacketPointer, char *PositionPointer)
{
void *result; // eax@1
int Playerid; // eax@8
DWORD TickCount; // esi@11
int Hit; // ST28_4@14
int ExplosiveBlowDamage; // ST24_4@14
int Damage; // ST20_4@14
int SkillGrade; // ST1C_4@14
int targeId; // ST14_4@14
int playerId; // eax@14
int PlayerID; // eax@16
void *SkillP; // [sp+8h] [bp-28h]@1
int hit; // [sp+Ch] [bp-24h]@11
int ExplosiveBlowdamage; // [sp+10h] [bp-20h]@11
int DamagaPointer; // [sp+14h] [bp-1Ch]@11
int v18; // [sp+18h] [bp-18h]@11
int v19; // [sp+1Ch] [bp-14h]@11
int TickCountValue; // [sp+20h] [bp-10h]@11
int TargetPointer; // [sp+24h] [bp-Ch]@1
char Type; // [sp+2Bh] [bp-5h]@1
void *targetpointer; // [sp+2Ch] [bp-4h]@1
SkillP = SkillPointer;
result = ScanPacket(PacketPointer, (unsigned int)PositionPointer, (unsigned int)"bd", &Type, &TargetPointer);
targetpointer = 0;
if ( Type )
{
if ( Type == 1 )
{
result = (void *)CMonster__FindMonster(TargetPointer);
targetpointer = result;
}
}
else
{
result = (void *)FindPlayer(TargetPointer);
targetpointer = result;
}
if ( targetpointer )
{
if ( (**(int (__thiscall ***)(void *, void *, void *))SkillP)(SkillP, PlayerPointer, targetpointer) )
{
// its used for explosive blow as random percentage chance
TickCountValue = CalculateTickCount(SkillP, (int)PlayerPointer);
TickCount = GetTickCount();
*((_DWORD *)PlayerPointer + 362) = CChar__GetASpeed(PlayerPointer) + TickCount;
CChar__SetDirection(
*((_DWORD *)targetpointer + 83) - *((_DWORD *)PlayerPointer + 83),
*((_DWORD *)targetpointer + 84) - *((_DWORD *)PlayerPointer + 84));
DamagaPointer = 0;
ExplosiveBlowdamage = 0;
hit = 0;
v19 = 0;
v18 = 0;
// cmonster maguni damage
v18 = (*(int (__thiscall **)(void *, void *))(*(_DWORD *)targetpointer + 0x94))(targetpointer, PlayerPointer);
if ( !v18 )
{
// CPlayerSkill__CalcDamage
v19 = (*(int (__thiscall **)(void *, void *, void *, int, int *, int *, int *))(*(_DWORD *)SkillP + 0x50))(
SkillP,
PlayerPointer,
targetpointer,
TickCountValue,
&DamagaPointer,
&hit,
&ExplosiveBlowdamage);
if ( !v19 )
// CMonsterReal__Defense
(*(void (__thiscall **)(void *, void *))(*(_DWORD *)targetpointer + 0x50))(targetpointer, PlayerPointer);
}
// CChar__Index
(*(void (__thiscall **)(void *, void *))(*(_DWORD *)SkillP + 0x38))(SkillP, PlayerPointer);
Hit = v19 | 2 * hit | 4 * v18;
ExplosiveBlowDamage = ExplosiveBlowdamage;
Damage = DamagaPointer;
SkillGrade = *((_DWORD *)SkillP + 2);
targeId = CBase__Id(targetpointer);
playerId = CBase__Id(PlayerPointer);
// Send Damage Update to Client
CChar__WriteInSight(
(int)PlayerPointer,
63,
(unsigned int)"bddbbwwb",
*((_DWORD *)SkillP + 1), // skillid
playerId,
targeId,
1,
SkillGrade,
Damage,
ExplosiveBlowDamage,
Hit);
}
else
{
if ( *((_DWORD *)SkillP + 10) )
{
PlayerID = CBase__Id(PlayerPointer);
CChar__WriteInSight((int)PlayerPointer, 61, (unsigned int)"db", PlayerID, 0);
}
}
result = (void *)CIOObject__ReleaseX(targetpointer, (LONG)((char *)targetpointer + 352));
}
else
{
if ( *((_DWORD *)SkillP + 10) )
{
Playerid = CBase__Id(PlayerPointer);
result = (void *)CChar__WriteInSight((int)PlayerPointer, 61, (unsigned int)"db", Playerid, 0);
}
}
return result;
}