Files
Sun1602/Server/GameServer/CancelStatusAbility.cpp
T
2022-10-26 12:25:11 +08:00

134 lines
4.2 KiB
C++

#include "StdAfx.h"
#include ".\cancelstatusability.h"
#include "StatusManager.h"
#include "StateInfoParser.h"
// implmented by __NA_S00015_20080828_NEW_HOPE_SHADOW
CancelStatusAbility::CancelStatusAbility(void)
{
}
CancelStatusAbility::~CancelStatusAbility(void)
{
}
bool CancelStatusAbility::Execute(Character* target, BYTE* pMsg, WORD& wMsgSize)
{
// base_ability_info_->m_iOption1
// 0. 개별상태지정
// 1. 모든상태이상클리어
// 2. 모든상태약화클리어
// 3. 모든상태강화클리어
// 4. 모든특수상태클리어
// 5. 상태이상클리어(1개만)
// 6. 상태약화클리어(1개만)
// 7. 상태강화클리어(1개만)
// 8. 특수상태클리어(1개만)
// 9. 2개상태클리어(상태이상, 상태약화)
Ability::Execute(target, pMsg, wMsgSize);
eSTATE_TYPE eStateType;
BYTE byStopCount = 0;
const BASE_ABILITYINFO* const ability_info = GetBaseAbilityInfo();
if (ability_info->m_iOption1 == 0)
{
BaseStatus* pStatus = NULL;
if (ability_info->m_iOption2 != 0)
{
pStatus = target->GetStatusManager()->FindStatus((eCHAR_STATE_TYPE)ability_info->m_iOption2);
if (pStatus)
{
BASE_STATEINFO* pInfo = StateInfoParser::Instance()->GetStateInfo(pStatus->GetStateID());
if (pInfo && pInfo->m_byIconKind != 2)
pStatus->StopStatus();
}
}
if (ability_info->m_iParam[0] != 0)
{
pStatus = target->GetStatusManager()->FindStatus((eCHAR_STATE_TYPE)ability_info->m_iParam[0]);
if (pStatus)
{
BASE_STATEINFO* pInfo = StateInfoParser::Instance()->GetStateInfo(pStatus->GetStateID());
if (pInfo && pInfo->m_byIconKind != 2)
pStatus->StopStatus();
}
}
if (ability_info->m_iParam[1] != 0)
{
pStatus = target->GetStatusManager()->FindStatus((eCHAR_STATE_TYPE)ability_info->m_iParam[1]);
if (pStatus)
{
BASE_STATEINFO* pInfo = StateInfoParser::Instance()->GetStateInfo(pStatus->GetStateID());
if (pInfo && pInfo->m_byIconKind != 2)
pStatus->StopStatus();
}
}
return true;
}
else if (ability_info->m_iOption1 <= 4)
{
if (ability_info->m_iOption1 == 1)
eStateType = eSTATE_TYPE_ABNORMAL;
else if (ability_info->m_iOption1 == 2)
eStateType = eSTATE_TYPE_WEAKENING;
else if (ability_info->m_iOption1 == 3)
eStateType = eSTATE_TYPE_STRENGTHENING;
else if (ability_info->m_iOption1 == 4)
eStateType = eSTATE_TYPE_SPECIALITY;
byStopCount = 0;
target->GetStatusManager()->StopStatusByStateType(eStateType, byStopCount);
}
else if (ability_info->m_iOption1 <= 8)
{
if (ability_info->m_iOption1 == 5)
eStateType = eSTATE_TYPE_ABNORMAL;
else if (ability_info->m_iOption1 == 6)
eStateType = eSTATE_TYPE_WEAKENING;
else if (ability_info->m_iOption1 == 7)
eStateType = eSTATE_TYPE_STRENGTHENING;
else if (ability_info->m_iOption1 == 8)
eStateType = eSTATE_TYPE_SPECIALITY;
byStopCount = 1;
target->GetStatusManager()->StopStatusByStateType(eStateType, byStopCount);
}
else if (ability_info->m_iOption1 == 9)
{
// 상태이상, 상태약화 중 1개만 클리어
if (target->GetStatusManager()->StopStatusByStateType(eSTATE_TYPE_ABNORMAL, 1) > 0)
return true;
if (target->GetStatusManager()->StopStatusByStateType(eSTATE_TYPE_WEAKENING, 1) > 0)
return true;
}
//_NA_20100503_MAGIC_SKILL_SAINTAID_CANCLE_STAT_IS_CHANGE
else if (ability_info->m_iOption1 == 10)
{
//모든 상태이상과 모든 상태 약화를 제거 한다.
byStopCount = 0;
target->GetStatusManager()->StopStatusByStateType(eSTATE_TYPE_ABNORMAL, byStopCount);
target->GetStatusManager()->StopStatusByStateType(eSTATE_TYPE_WEAKENING, byStopCount);
}
else
{
SUNLOG(eCRITICAL_LOG, "[CancelStatusAbility::Execute] Invalid Option1 = %d", ability_info->m_iOption1);
return false;
}
return true;
}