CPIban teve a postagem no tópico VL em Grupo como a melhor resposta
Em SkillSub.cpp remove isso da skill da sacer !lpCharSelPlayer &&
case SKILL_VIRTUAL_LIFE:
if (GetAssaUseEffect(lpCurPlayer, SKILL_VIRTUAL_LIFE) == FALSE && lpSkill->Skill_Info.FuncPointer() == TRUE) {
lpCurPlayer->AttackSkil = SKILL_PLAY_VIRTUAL_LIFE;
lpCurPlayer->AttackSkil |= (lpSkill->Point << 8);
lpCurPlayer->BeginSkill(lpCurPlayer->AttackSkil, 0, 0, 0, 0, 0);
lpCurPlayer->SetMotionFromCode(CHRMOTION_STATE_SKILL);
SendProcessSKillToServer(SKILL_PLAY_VIRTUAL_LIFE, lpSkill->Point, 0, 0);
cSkill.SetVirtualLife(Virtual_Life_Time[lpSkill->Point - 1], lpSkill->Point);
lpCurPlayer->chrAttackTarget = 0;
return TRUE;
}
return TRUE;
No onServer.cpp no server
case SKILL_PLAY_VIRTUAL_LIFE:
{
if(lpPlayInfo->smCharInfo.JOB_CODE == JOBCODE_PRIESTESS)
{
// Range fixo. Se quiser depois podemos adicionar no Sacer.ini.
const int VirtualLifeRange = 350;
const int VirtualLifeRangeSize = VirtualLifeRange * VirtualLifeRange;
if(lpPlayInfo->dwSkill_VirtualLife_Time <= dwPlayServTime ||
lpPlayInfo->dwSkill_VirtualLife_Param <= Virtual_Life_Percent[point])
{
lpPlayInfo->dwSkill_VirtualLife_Time = dwPlayServTime + Virtual_Life_Time[point] * 1000;
lpPlayInfo->dwSkill_VirtualLife_Param = Virtual_Life_Percent[point];
}
if(lpPlayInfo->dwPartyInfo && lpPlayInfo->lpPartyMaster)
{
rsPLAYINFO *lpPartyMaster = lpPlayInfo->lpPartyMaster;
for(cnt = 0; cnt < PARTY_PLAYER_MAX; cnt++)
{
lpPlayInfo2 = lpPartyMaster->lpPartyPlayers[cnt];
if(!lpPlayInfo2 || !lpPlayInfo2->lpsmSock)
continue;
if(lpPlayInfo2 == lpPlayInfo)
continue;
if(lpPlayInfo2->Position.Area != lpPlayInfo->Position.Area)
continue;
x = (lpPlayInfo->Position.x - lpPlayInfo2->Position.x) >> FLOATNS;
y = (lpPlayInfo->Position.y - lpPlayInfo2->Position.y) >> FLOATNS;
z = (lpPlayInfo->Position.z - lpPlayInfo2->Position.z) >> FLOATNS;
dist = x * x + z * z;
if(dist < VirtualLifeRangeSize && abs(y) < 80)
{
if(lpPlayInfo2->dwSkill_VirtualLife_Time > dwPlayServTime &&
lpPlayInfo2->dwSkill_VirtualLife_Param > Virtual_Life_Percent[point])
{
continue;
}
lpPlayInfo2->dwSkill_VirtualLife_Time = dwPlayServTime + Virtual_Life_Time[point] * 1000;
lpPlayInfo2->dwSkill_VirtualLife_Param = Virtual_Life_Percent[point];
// Envia para o membro da party aplicar o buff no client dele.
lpPlayInfo2->lpsmSock->Send2((char *)lpTransCommand, lpTransCommand->size, TRUE);
}
}
}
}
break;
}