estou a dias quebrando a cabeça com o comando __try , não consivo imaginar outra forma de fazer isto. #include "CBuffSystem.h"
void CBuffSystem::Initialize()
{
if ( !GlobalVars::GVs()->pSubSystems->bBuffSystem ) { return; }
// Abnormal System Extending
WriteMemoryBYTE(0x850F7B, MAX_ABNORMALS);
WriteMemoryBYTE(0x747B6B, MAX_ABNORMALS);
WriteMemoryBYTE(0x827D54, MAX_ABNORMALS);
WriteMemoryBYTE(0x827D80, MAX_ABNORMALS);
WriteInstruction(0x5057FB, (INT32)CBuffSystem_GetMaxAmmountHook, 5, 0xE9);
// Fixing Packets
WriteInstruction(0x528A0C, (INT32)CBuffSystem_LoadInfectedSkillsHook1, 5, 0xE9);
WriteInstruction(0x52882F, (INT32)CBuffSystem_SaveInfectedSkillsHook1, 0, 0xE9);
WriteInstruction(0x52885A, (INT32)CBuffSystem_SaveInfectedSkillsHook2, 4, 0xE9);
}
INT32 nCBuffSystem_CalculateBuffSlots = 0;
void CBuffSystem::CalculateBuffSlots(CCreature *pCreature, CSkillInfo *pSkillInfo)
{
L2SERVER_SHARED_GUARD(nCBuffSystem_CalculateBuffSlots);
TLS_TRACE_BEGIN;
INT32 nMaxBuffSlots = 20;
if ( pCreature->IsValidCreature() )
{
INT32 nCurrentLevel = pCreature->GetAcquiredSkillLevel(GlobalVars::GVs()->pSubSystems->nBuffSlotSkillID);
if ( nMaxBuffSlots+nCurrentLevel > 20 ) { nMaxBuffSlots += nCurrentLevel; }
}
INT32 nFreeBuffSlots = nMaxBuffSlots;
__try
{
if ( pSkillInfo->debuff == 0 )
{
bool bFoundBuff = false;
INT32 nBuffPos = 0;
for ( int i = 0; i < pCreature->vBuff.size(); i++ )
{
CBuffInfo BuffInfo = pCreature->vBuff[i];
if ( BuffInfo.pSkillInfo->debuff == 0 && nFreeBuffSlots > 0 )
{
if ( !bFoundBuff ) { nBuffPos = i; bFoundBuff = true; }
nFreeBuffSlots -= 1;
if ( nFreeBuffSlots == 0 ) { break; }
}
}
if ( nFreeBuffSlots == 0 && bFoundBuff ) { pCreature->vBuff.erase(pCreature->vBuff.begin()+nBuffPos, pCreature->vBuff.begin()+nBuffPos+1); }
}
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
CLog::AddAnsi(2,"Fatal Error At Function : %ls", __FUNCTIONW__);
}
TLS_TRACE_END;
}
INT32 nCBuffSystem_CalculateDebuffSlots = 0;
void CBuffSystem::CalculateDebuffSlots(CCreature *pCreature, CSkillInfo *pSkillInfo)
{
L2SERVER_SHARED_GUARD(nCBuffSystem_CalculateDebuffSlots);
TLS_TRACE_BEGIN;
INT32 nMaxDebuffSlots = 10;
INT32 nFreeDebuffSlots = nMaxDebuffSlots;
__try
{
if ( pSkillInfo->debuff != 0 )
{
bool bFoundDebuff = false;
INT32 nDebuffPos = 0;
for ( int i = 0; i < pCreature->vBuff.size(); i++ )
{
CBuffInfo BuffInfo = pCreature->vBuff[i];
if ( BuffInfo.pSkillInfo->debuff != 0 && nFreeDebuffSlots > 0 )
{
if ( !bFoundDebuff ) { nDebuffPos = i; bFoundDebuff = true; }
nFreeDebuffSlots -= 1;
if ( nFreeDebuffSlots == 0 ) { break; }
}
}
if ( nFreeDebuffSlots == 0 && bFoundDebuff ) { pCreature->vBuff.erase(pCreature->vBuff.begin()+nDebuffPos, pCreature->vBuff.begin()+nDebuffPos+1); }
}
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
CLog::AddAnsi(2,"Fatal Error At Function : %ls", __FUNCTIONW__);
}
TLS_TRACE_END;
}
/* ASM Wrappers */
void CBuffSystem_CalculateBuffSlots(CCreature *pCreature, CSkillInfo *pSkillInfo)
{ CBuffSystem::CalculateBuffSlots(pCreature, pSkillInfo); }
void CBuffSystem_CalculateDebuffSlots(CCreature *pCreature, CSkillInfo *pSkillInfo)
{ CBuffSystem::CalculateDebuffSlots(pCreature, pSkillInfo); }