#include "stdafx.h" #include "statuscalc_Server.h" #include "GameSrv.h" #include "Player.h" #include "Monster.h" #include "ObjectManager.h" #include "StatusScript.h" #include "Skill_Common.h" #include "HaveSkillObject.h" #include "InfluenceObject.h" #include "SkillManager.h" #include "SkillScript.h" #include "MonsterScript.h" cStatusCalc_Server* cStatusCalc_Server::mpStatusCalc = NULL; cStatusCalc_Server::cStatusCalc_Server(void) { if( !mpStatusCalc ) { mpStatusCalc = this; } } cStatusCalc_Server::~cStatusCalc_Server(void) { } void cStatusCalc_Server::CalcPlayerStatusItemSkillAddDetail( cPlayer* pPlayer, eSTATUS_PLUS statusType, float value ) { unsigned long arrayNum = 0; if( eSTATUSPLUS_STR_PLUS <= statusType && statusType < eSTATUSPLUS_BASE_MAX ) { arrayNum = statusType - eSTATUSPLUS_STR_PLUS; mBaseStatusPlus[arrayNum] = mBaseStatusPlus[arrayNum] + value; } else if( eSTATUSPLUS_STR_PERCENT <= statusType && statusType < eSTATUSPLUS_BASE_PERCENT_MAX ) { arrayNum = statusType - eSTATUSPLUS_STR_PERCENT; mBaseStatusPer[arrayNum] = mBaseStatusPer[arrayNum] + value; } else if( eSTATUSPLUS_ATK_PLUS <= statusType && statusType <= eSTATUSPLUS_EXT_PLUS_MAX ) { arrayNum = statusType - eSTATUSPLUS_ATK_PLUS; mExtStatusPlus[arrayNum] = mExtStatusPlus[arrayNum] + value; } else if( eSTATUSPLUS_ATK_PER <= statusType && statusType <= eSTATUSPLUS_EXT_PER_MAX ) { arrayNum = statusType - eSTATUSPLUS_ATK_PER; mExtStatusPer[arrayNum] = mExtStatusPer[arrayNum] + value; if( mExtStatusPer[arrayNum] <= -100 ) mExtStatusPer[arrayNum] = -99; } else if( eSTATUSPLUS_EXPADDPER <= statusType && statusType < eSTATUSPLUS_BUFF_ETC_MAX ) { arrayNum = statusType - eSTATUSPLUS_EXPADDPER; mExtAddStatus[arrayNum] = mExtAddStatus[arrayNum] + value; if( statusType == eSTATUSPLUS_EXPADDPER || statusType == eSTATUSPLUS_SXPADDPER || statusType == eSTATUSPLUS_MONEYPER || statusType == eSTATUSPLUS_PVPPOINTPER ) { if( mExtAddStatus[arrayNum] <= -100 ) mExtAddStatus[arrayNum] = -99; } } else if( eSTATUSPLUS_CHAR_SIZE == statusType ) { mSizePer = mSizePer + (short)FloatToInt(value); } /// ±âº»½ºÅÝ 5°³ Àüü¸¦ º¯°æ else if( eSTATUSPLUS_BASEALL_PLUS == statusType ) { for( int i = ePLAYER_STATUS_STR ; i < ePLAYER_STATUS_LEVEL ; ++i ) { mBaseStatusPlus[i] = mBaseStatusPlus[i] + value; } } else if( eSTATUSPLUS_BASEALL_PERCENT == statusType ) { for( int i = ePLAYER_STATUS_STR ; i < ePLAYER_STATUS_LEVEL ; ++i ) { mBaseStatusPer[i] = mBaseStatusPer[i] + value; } } /// °ø°Ý·Â Àüü¸¦ º¯°æ+ else if( eSTATUSPLUS_ATKTOTAL_PLUS == statusType ) { mExtStatusPlus[ePLAYER_STATUS_EXT_ATK] += value; mExtStatusPlus[ePLAYER_STATUS_EXT_RATK] += value; mExtStatusPlus[ePLAYER_STATUS_EXT_MATK] += value; } /// ¹æ¾î·Â Àüü¸¦ º¯°æ+ else if( eSTATUSPLUS_DEFTOTAL_PLUS == statusType ) { mExtStatusPlus[ePLAYER_STATUS_EXT_DEF] += value; mExtStatusPlus[ePLAYER_STATUS_EXT_MDEF] += value; } /// °ø°Ý·Â Àüü¸¦ º¯°æ% else if( eSTATUSPLUS_ATKTOTAL_PER == statusType ) { mExtStatusPer[ePLAYER_STATUS_EXT_ATK] += value; mExtStatusPer[ePLAYER_STATUS_EXT_RATK] += value; mExtStatusPer[ePLAYER_STATUS_EXT_MATK] += value; if( mExtStatusPer[ePLAYER_STATUS_EXT_ATK] <= -100 ) mExtStatusPer[ePLAYER_STATUS_EXT_ATK] = -99; if( mExtStatusPer[ePLAYER_STATUS_EXT_RATK] <= -100 ) mExtStatusPer[ePLAYER_STATUS_EXT_RATK] = -99; if( mExtStatusPer[ePLAYER_STATUS_EXT_MATK] <= -100 ) mExtStatusPer[ePLAYER_STATUS_EXT_MATK] = -99; } /// ¹æ¾î·Â Àüü¸¦ º¯°æ% else if( eSTATUSPLUS_DEFTOTAL_PER == statusType ) { mExtStatusPer[ePLAYER_STATUS_EXT_DEF] += value; mExtStatusPer[ePLAYER_STATUS_EXT_MDEF] += value; if( mExtStatusPer[ePLAYER_STATUS_EXT_DEF] <= -100 ) mExtStatusPer[ePLAYER_STATUS_EXT_DEF] = -99; if( mExtStatusPer[ePLAYER_STATUS_EXT_MDEF] <= -100 ) mExtStatusPer[ePLAYER_STATUS_EXT_MDEF] = -99; } else { if( pPlayer == NULL ) { NETWORK2->PostServerEvent( "cStatusCalc_Server::CalcPlayerStatusItemSkillAddDetail pPlayer == NULL" ); return; } switch( statusType ) { case eSTATUSPLUS_STOPMOVE: mOddity[eODDITYTYPE_CANTMOVE] += 1; break; case eSTATUSPLUS_STOPSKILL_PHY: mOddity[eODDITYTYPE_CANTSKILL_PHY] += 1; break; case eSTATUSPLUS_STOPSKILL_MAG: mOddity[eODDITYTYPE_CANTSKILL_MAG] += 1; break; case eSTATUSPLUS_SLEEP: mOddity[eODDITYTYPE_SLEEP] += 1; break; case eSTATUSPLUS_STUN: mOddity[eODDITYTYPE_STUN] += 1; break; case eSTATUSPLUS_INVINCIBILITY_PHY: mOddity[eODDITYTYPE_INVINCIBILITY_PHY] += 1; break; case eSTATUSPLUS_INVINCIBILITY_MAG: mOddity[eODDITYTYPE_INVINCIBILITY_MAG] += 1; break; case eSTATUSPLUS_HP_ABSORB_LONG: mOddity[eODDITYTYPE_HP_ABSORB] += (long)value; break; case eSTATUSPLUS_MP_ABSORB_LONG: mOddity[eODDITYTYPE_MP_ABSORB] += (long)value; break; case eSTATUSPLUS_STOPITEM_KIND: mOddity[eODDITYTYPE_STOPITEM_KIND] += (long)value; break; case eSTATUSPLUS_STOPITEM_IDX: mOddity[eODDITYTYPE_STOPITEM_IDX] += (long)value; break; case eSTATUSPLUS_DAMAGE_ABSORB_PHY: mOddity[eODDITYTYPE_DAMAGE_ABSORB_PHY] += (long)value; break; case eSTATUSPLUS_DAMAGE_ABSORB_PHY_RANGE: mOddity[eODDITYTYPE_DAMAGE_ABSORB_PHY_RANGE] += (long)value; break; case eSTATUSPLUS_DAMAGE_ABSORB_MAG: mOddity[eODDITYTYPE_DAMAGE_ABSORB_MAG] += (long)value; break; case eSTATUSPLUS_DAMAGE_REFLECT_PHY: mOddity[eODDITYTYPE_DAMAGE_REFLECTION_PHY] += (long)value; break; case eSTATUSPLUS_DAMAGE_REFLECT_MAG: mOddity[eODDITYTYPE_DAMAGE_REFLECTION_MAG] += (long)value; break; case eSTATUSPLUS_IGNORE_DEFENCE_PHY: mOddity[eODDITYTYPE_IGNORE_DEFENCE_PHY] += 1; break; case eSTATUSPLUS_IGNORE_DEFENCE_MAG: mOddity[eODDITYTYPE_IGNORE_DEFENCE_MAG] += 1; break; case eSTATUSPLUS_AVOID_MON_LOOK: mOddity[eODDITYTYPE_AVOID_MON_LOOK] += 1; break; case eSTATUSPLUS_ADD_APPLYCNT: mOddity[eODDITYTYPE_ADD_APPLY_CNT] += (long)value; break; case eSTATUSPLUS_STOPSKILL: { mOddity[eODDITYTYPE_CANTSKILL_PHY] += 1; mOddity[eODDITYTYPE_CANTSKILL_MAG] += 1; } break; case eSTATUSPLUS_IMMUNE_KIND: pPlayer->AddImmuneKind( (unsigned long)value ); break; case eSTATUSPLUS_IMMUNEDEBUFF_APPLYTYPE: pPlayer->AddImmuneApplyType( eINFLUENCETYPE_DEBUF, (unsigned short)value ); break; case eSTATUSPLUS_IMMUNEBUFF_APPLYTYPE: pPlayer->AddImmuneApplyType( eINFLUENCETYPE_BUF, (unsigned short)value ); break; } } } void cStatusCalc_Server::CalcPlayerBaseOnly( cPlayer* pPlayer ) { if( pPlayer == NULL ) return; /// »óÅÂÀÌ»ó °ü·Ã memset( mOddity, 0, sizeof(mOddity) ); /// ±âº» ½ºÅÝ ÃʱâÈ­ for( unsigned char i = ePLAYER_STATUS_STR ; ePLAYER_STATUS_LEVEL > i ; ++i ) mBaseStatus[i] = 0.0f; /// ½ºÅ©¸³Æ®¿¡¼­ ÀоîµéÀÎ ¼ø¼öÇÑ ±âº» ½ºÅݰª °è»ê CalcPlayerStatus( pPlayer ); /// ±âº» ½ºÅÝ °á°ú¸¦ Ç÷¹À̾ ±â·Ï for( unsigned char i = ePLAYER_STATUS_STR ; i < ePLAYER_STATUS_LEVEL ; ++i ) pPlayer->SetStatus1( (ePLAYER_STATUS)i, mBaseStatus[i] ); } void cStatusCalc_Server::CalcPlayerExtensionOnly( cPlayer* pPlayer ) { if( pPlayer == NULL ) return; /// ½ºÅÝ1 + ÃʱâÈ­ memset( mBaseStatusPlus, 0, sizeof(mBaseStatusPlus) ); memset( mBaseStatusPer, 0, sizeof(mBaseStatusPer) ); /// ½ºÅÝ2 + ÃʱâÈ­ memset( mExtStatusPlus, 0, sizeof(mExtStatusPlus) ); /// ½ºÅÝ2 % ÃʱâÈ­ memset( mExtStatusPer, 0, sizeof(mExtStatusPer) ); /// °æÇèÄ¡ °ü·Ã memset( mExtAddStatus, 0, sizeof(mExtAddStatus) ); /// »óÅÂÀÌ»ó °ü·Ã memset( mOddity, 0, sizeof(mOddity) ); /// ½ºÅ³È¿°ú, ½ºÅ³ÆÐ½Ãºê, ¾ÆÀÌÅÛ µ¥ÀÌŸ¸¦ Àоî¿Í ½ºÅÝ ¼öÄ¡ Àû¿ë CalcPlayerStatusSkillInfluenceAdd( pPlayer ); CalcPlayerStatusSkillPassiveAdd( pPlayer ); CalcPlayerStatusItemAdd( pPlayer ); /// È®Àå °á°ú¸¦ Ç÷¹À̾ ±â·Ï memcpy( pPlayer->GetPointerStatus2Plus(), mExtStatusPlus, sizeof(pPlayer->GetPointerStatus2Plus()) * ePLAYER_STATUS_EXT_MAX ); memcpy( pPlayer->GetPointerStatus2Per(), mExtStatusPer, sizeof(pPlayer->GetPointerStatus2Per()) * ePLAYER_STATUS_EXT_MAX ); for( unsigned char i = ePLAYER_STATUS_STR ; i < ePLAYER_STATUS_LEVEL ; ++i ) { pPlayer->SetStatus1Plus( (ePLAYER_STATUS)i, mBaseStatusPlus[i] ); pPlayer->SetStatus1Per( (ePLAYER_STATUS)i, mBaseStatusPer[i] ); } for( unsigned char i = ePLAYER_STATUS_EXT_ADD_EXPADDPER ; i < ePLAYER_STATUS_EXT_ADD_MAX ; ++i ) pPlayer->SetStatusEtc( (ePLAYER_STATUS_EXT_ADD)i, mExtAddStatus[i] ); } unsigned long cStatusCalc_Server::GetParantJob( unsigned long job, unsigned int jobPos ) { unsigned long jobCode; /// ÇöÀç Á÷¾÷ÀÇ ºÎ¸ð Á÷¾÷µéÀ» ¹è¿­·Î ¹Þ¾Æ¿Â´Ù. tArray* pParentJob = NULL; /// »óÀ§ Á÷¾÷ Äڵ带 Àоî¿Å pParentJob = STATUSSCRIPT->GetParentJob( job ); /// µ¥ÀÌÅͰ¡ ¾ø´Ù - ÇöÀç Á÷¾÷ÀÌ ±âº» Á÷¾÷ ÀÌ´Ù. if( pParentJob == NULL ) return NULL; /// »çÀÌÁ´Ù Å©´Ù - ÇöÀç Á÷¾÷ÀÌ ÃÖÁ¾ Á÷¾÷ÀÌ´Ù. if( jobPos > pParentJob->GetSize() - 1 ) return NULL; /// ÀüÁ÷ Â÷¼ö¿¡ ÇØ´çÇÏ´Â Á÷¾÷ÀÇ ÄÚµåµå¸¦ Àо´Ù. pParentJob->GetAt( &jobCode, jobPos ); return jobCode; } void cStatusCalc_Server::CalcPlayerStatusSkillInfluenceAdd( cPlayer* pPlayer ) { if( pPlayer == NULL ) return; cHashSet::cIterator iter; /// ¼­¹ö¿¡¼­ÀÇ È¿°ú Áõ°¡Ä¡ °è»ê cHashSet* influenceSet = pPlayer->GetInfluenceSet(); if( influenceSet == NULL ) return; pPlayer->ClearImmune(); cInfluenceObject* pInfluence = NULL; sInfluenceScript* pInfluenceScript = NULL; unsigned long infIdx = 0; for( iter = influenceSet->Begin() ; iter != influenceSet->End() ; ++iter ) { infIdx = *iter; pInfluence = SKILLMANAGER->GetInfluence( infIdx ); if( pInfluence == NULL ) { assert(NULL); NETWORK2->PostServerEvent("cStatusCalc_Server::CalcPlayerStatusSkillInfluenceAdd pInfluence[%d]==NULL", *iter); //-/-//SKILLMANAGER->InsertDeleteInfluenceObject( pInfluence ); /// °´Ã¼ »èÁ¦ ´ë±â¿­¿¡ ³Ö´Â´Ù. continue; } pInfluenceScript = SKILLSCRIPT->GetInfluenceInfo( pInfluence->GetInfluenceClassIdx() ); if( pInfluenceScript == NULL ) { NETWORK2->PostServerEvent("cStatusCalc_Server::CalcPlayerStatusSkillInfluenceAdd pInfluenceScript[%d] == NULL", pInfluence->GetInfluenceClassIdx()); continue; } if( pInfluence->IsTargetNoApply() == true ) continue; /// Áö¼Ó(µ¥¹ÌÁö) ÀûÀÎ È¿°ú°¡ ¾Æ´Ñ°æ¿ì¸¸ if( pInfluenceScript->mTime1 == 0 ) { if( pInfluenceScript->mStatusPlusIdx1 != 0 ) { CalcPlayerStatusItemSkillAddDetail( pPlayer, (eSTATUS_PLUS)(pInfluenceScript->mStatusPlusIdx1), (float)(pInfluenceScript->mValue1) ); } } if( pInfluenceScript->mTime2 == 0 ) { if( pInfluenceScript->mStatusPlusIdx2 != 0 ) { CalcPlayerStatusItemSkillAddDetail( pPlayer, (eSTATUS_PLUS)(pInfluenceScript->mStatusPlusIdx2), (float)(pInfluenceScript->mValue2) ); } } if( pInfluenceScript->mStatusPlusIdx3 != 0 ) { CalcPlayerStatusItemSkillAddDetail( pPlayer, (eSTATUS_PLUS)(pInfluenceScript->mStatusPlusIdx3), (float)(pInfluenceScript->mValue3) ); } } } void cStatusCalc_Server::CalcPlayerStatusSkillPassiveAdd( cPlayer* pPlayer ) { if( pPlayer == NULL ) return; /// ¼­¹ö¿¡¼­ÀÇ È¿°ú Áõ°¡Ä¡ °è»ê cPointerHashMap::cIterator iter; cPointerHashMap* pHaveMap = (cPointerHashMap*)SKILLMANAGER->GetPlayerHaveSkill( pPlayer->GetObjectID() ); if( pHaveMap == NULL ) return; cHaveSkillObject* pSkillObject = NULL; sPlayerSkillBaseInfo* pSkillInfo = NULL; sPlayerSkillStepInfo* pSkillStep = NULL; for( iter = pHaveMap->Begin() ; iter != pHaveMap->End() ; ++iter ) { pSkillObject = (cHaveSkillObject*)((*iter).mSecond); if( pSkillObject == NULL ) { assert(NULL); NETWORK2->PostServerEvent("cStatusCalc_Server::CalcPlayerStatusSkillPassiveAdd pSkillObject == NULL [%d]", pPlayer->GetObjectID()); continue; } pSkillInfo = SKILLSCRIPT->GetPlayerSkillInfo( pSkillObject->GetSkillIdx() ); if( pSkillInfo == NULL ) { assert(NULL); NETWORK2->PostServerEvent("cStatusCalc_Server::CalcPlayerStatusSkillPassiveAdd pSkillInfo == NULL [%d,%d]", pPlayer->GetObjectID(), pSkillObject->GetSkillIdx() ); continue; } if( pSkillInfo->mType != eSKILLTYPE_PASSIVE ) continue; pSkillStep = &pSkillInfo->mpSetpInfoArray[pSkillObject->GetSkillStep()]; if( pSkillStep == NULL ) { assert(NULL); NETWORK2->PostServerEvent("cStatusCalc_Server::CalcPlayerStatusSkillPassiveAdd pSkillStep == NULL[%d,%d]", pPlayer->GetObjectID(), pSkillObject->GetSkillIdx() ); continue; } /// ³» Àåºñ°¡ ¸Â´ÂÁö üũ bool IsEquipment = true; if( pSkillInfo->mUseEquipment ) { eWEAPON_STATE weaponState = pPlayer->GetWeaponState(); /// Âø¿ë Àåºñ üũ switch( pSkillInfo->mUseEquipment ) { case eEQUIPTYPE_SWORD: if( weaponState != eWEAPON_STATE_SWORD && weaponState != eWEAPON_STATE_SWORD_SHEILD ) IsEquipment = false; break; case eEQUIPTYPE_LONGSWORD: if( weaponState != eWEAPON_STATE_LONGSWORD ) IsEquipment = false; break; case eEQUIPTYPE_DOUBLESWORD: if( weaponState != eWEAPON_STATE_DOUBLESWORD ) IsEquipment = false; break; case eEQUIPTYPE_SHORTSWORD: if( weaponState != eWEAPON_STATE_SHORTSWORD ) IsEquipment = false; break; case eEQUIPTYPE_GUN: if( weaponState != eWEAPON_STATE_GUN ) IsEquipment = false; break; case eEQUIPTYPE_STAFF: if( weaponState != eWEAPON_STATE_STAFF ) IsEquipment = false; break; case eEQUIPTYPE_SHIELD: if( weaponState != eWEAPON_STATE_SHEILD && weaponState != eWEAPON_STATE_SWORD_SHEILD ) IsEquipment = false; break; case eEQUIPTYPE_SWORD_LONGSWORD: if( weaponState != eWEAPON_STATE_SWORD && weaponState != eWEAPON_STATE_SWORD_SHEILD && weaponState != eWEAPON_STATE_LONGSWORD ) IsEquipment = false; break; case eEQUIPTYPE_SWORD_DOUBLESWORD: if( weaponState != eWEAPON_STATE_SWORD && weaponState != eWEAPON_STATE_SWORD_SHEILD && weaponState != eWEAPON_STATE_DOUBLESWORD ) IsEquipment = false; break; case eEQUIPTYPE_LONGSWORD_DOUBLESWORD: if( weaponState != eWEAPON_STATE_LONGSWORD && weaponState != eWEAPON_STATE_DOUBLESWORD ) IsEquipment = false; break; case eEQUIPTYPE_SWORD_LONGSWORD_DOUBLESWORD: if( weaponState != eWEAPON_STATE_SWORD && weaponState != eWEAPON_STATE_SWORD_SHEILD && weaponState != eWEAPON_STATE_LONGSWORD && weaponState != eWEAPON_STATE_DOUBLESWORD ) IsEquipment = false; break; case eEQUIPTYPE_SHORTSWORD_GUN: if( weaponState != eWEAPON_STATE_SHORTSWORD && weaponState != eWEAPON_STATE_GUN ) IsEquipment = false; break; case eEQUIPTYPE_CLOTH: if( pPlayer->GetArmorSets() != ARMOR_SETS_ROBES ) IsEquipment = false; break; case eEQUIPTYPE_LIGHTARMOR: if( pPlayer->GetArmorSets() != ARMOR_SETS_LIGHT ) IsEquipment = false; break; case eEQUIPTYPE_HEAVYARMOR: if( pPlayer->GetArmorSets() != ARMOR_SETS_HEAVY ) IsEquipment = false; break; } } /// Àåºñ°¡ ¸Â´Â °æ¿ì¸¸ °è»ê if( IsEquipment == true ) { if( pSkillStep->mApplyValueType1 != 0 ) { CalcPlayerStatusItemSkillAddDetail( pPlayer, (eSTATUS_PLUS)(pSkillStep->mApplyValueType1), (float)(pSkillStep->mApplyValue1) ); } if( pSkillStep->mApplyValueType2 != 0 ) { CalcPlayerStatusItemSkillAddDetail( pPlayer, (eSTATUS_PLUS)(pSkillStep->mApplyValueType2), (float)(pSkillStep->mApplyValue2) ); } } } } void cStatusCalc_Server::CalcPlayerStatusItemAdd( cPlayer* pPlayer ) { if( pPlayer == NULL ) return; sEquipAbility* pEquipAbility = pPlayer->GetEquipAbility(); if( pEquipAbility == NULL ) return; /// ½ºÅÝ °è»ê ¸¶Áö¸· ½ÃÁ¡¿¡ °è»êµÇ´Â Ç׸ñÀº Á¦¿Ü if( pEquipAbility->mOptStr != 0 ) /// Áõ°¡:Èû(+) { CalcPlayerStatusItemSkillAddDetail( pPlayer, eSTATUSPLUS_STR_PLUS, (float)pEquipAbility->mOptStr ); } if( pEquipAbility->mOptDex != 0 ) /// Áõ°¡:¹Îø(+) { CalcPlayerStatusItemSkillAddDetail( pPlayer, eSTATUSPLUS_DEX_PLUS, (float)pEquipAbility->mOptDex ); } if( pEquipAbility->mOptCon != 0 ) /// Áõ°¡:ü·Â(+) { CalcPlayerStatusItemSkillAddDetail( pPlayer, eSTATUSPLUS_CON_PLUS, (float)pEquipAbility->mOptCon ); } if( pEquipAbility->mOptInt != 0 ) /// Áõ°¡:Áö´É(+) { CalcPlayerStatusItemSkillAddDetail( pPlayer, eSTATUSPLUS_INT_PLUS, (float)pEquipAbility->mOptInt ); } if( pEquipAbility->mOptWis != 0 ) /// Áõ°¡:ÁöÇý(+) { CalcPlayerStatusItemSkillAddDetail( pPlayer, eSTATUSPLUS_WIS_PLUS, (float)pEquipAbility->mOptWis ); } /* // ¾ÆÀÌÅÛ ¿É¼ÇÀÌ ¾ÆÁ÷ Àû¿ë ¾ÈµÇ´Â ½ÃÁ¡ÀÓ. [7/13/2010 JO_CLIENT] // if( pEquipAbility->mOptPercentStr != 0 ) /// Áõ°¡:Èû(%) { CalcPlayerStatusItemSkillAddDetail( pPlayer, eSTATUSPLUS_STR_PERCENT, (float)pEquipAbility->mOptPercentStr ); } if( pEquipAbility->mOptPercentDex != 0 ) /// Áõ°¡:¹Îø(%) { CalcPlayerStatusItemSkillAddDetail( pPlayer, eSTATUSPLUS_DEX_PERCENT, (float)pEquipAbility->mOptPercentDex ); } if( pEquipAbility->mOptPercentCon != 0 ) /// Áõ°¡:ü·Â(%) { CalcPlayerStatusItemSkillAddDetail( pPlayer, eSTATUSPLUS_CON_PERCENT, (float)pEquipAbility->mOptPercentCon ); } if( pEquipAbility->mOptPercentInt != 0 ) /// Áõ°¡:Áö´É(%) { CalcPlayerStatusItemSkillAddDetail( pPlayer, eSTATUSPLUS_INT_PERCENT, (float)pEquipAbility->mOptPercentInt ); } if( pEquipAbility->mOptPercentWis != 0 ) /// Áõ°¡:ÁöÇý(%) { CalcPlayerStatusItemSkillAddDetail( pPlayer, eSTATUSPLUS_WIS_PERCENT, (float)pEquipAbility->mOptPercentWis ); } */ //if( pEquipAbility->mOptPlusWei != 0 ) /// Áõ°¡:¹«°Ô //{ // CalcPlayerStatusItemSkillAddDetail( eSTATUSPLUS_WEIGHT_PLUS, (float)pEquipAbility->mOptPlusWei ); //} //if( pEquipAbility->mOptPlusMov != 0 ) /// Áõ°¡:À̵¿¼Óµµ //{ // CalcPlayerStatusItemSkillAddDetail( eSTATUSPLUS_SPD_PLUS, (float)pEquipAbility->mOptPlusMov ); //} //if( pEquipAbility->mOptPlusMaxHp != 0 ) /// Áõ°¡:ÃÖ´ëHP //{ // CalcPlayerStatusItemSkillAddDetail( eSTATUSPLUS_HP_PLUS, (float)pEquipAbility->mOptPlusMaxHp ); //} //if( pEquipAbility->mOptPlusMaxMp != 0 ) /// Áõ°¡:ÃÖ´ëMP //{ // CalcPlayerStatusItemSkillAddDetail( eSTATUSPLUS_MP_PLUS, (float)pEquipAbility->mOptPlusMaxMp ); //} if( pEquipAbility->mOptPercentDrainHp != 0 ) // HP Èí¼ö { CalcPlayerStatusItemSkillAddDetail( pPlayer, eSTATUSPLUS_HP_ABSORB_LONG, (float)pEquipAbility->mOptPercentDrainHp ); } if( pEquipAbility->mOptPercentDrainMp != 0 ) // MP Èí¼ö { CalcPlayerStatusItemSkillAddDetail( pPlayer, eSTATUSPLUS_MP_ABSORB_LONG, (float)pEquipAbility->mOptPercentDrainMp ); } if( pEquipAbility->mOptPercentDamageDec != 0 ) // µ¥¹ÌÁö Èí¼ö/°¨¼Ò { CalcPlayerStatusItemSkillAddDetail( pPlayer, eSTATUSPLUS_DAMAGE_ABSORB_PHY, (float)pEquipAbility->mOptPercentDamageDec ); CalcPlayerStatusItemSkillAddDetail( pPlayer, eSTATUSPLUS_DAMAGE_ABSORB_MAG, (float)pEquipAbility->mOptPercentDamageDec ); } if( pEquipAbility->mOptPercentDamageRef != 0 ) // µ¥¹ÌÁö ¹Ý»ç { CalcPlayerStatusItemSkillAddDetail( pPlayer, eSTATUSPLUS_DAMAGE_REFLECT_PHY, (float)pEquipAbility->mOptPercentDamageRef ); CalcPlayerStatusItemSkillAddDetail( pPlayer, eSTATUSPLUS_DAMAGE_REFLECT_MAG, (float)pEquipAbility->mOptPercentDamageRef ); } } void cStatusCalc_Server::CalcStatusPlusDetailMonster( unsigned long monsterIdx, eSTATUS_PLUS statusType, float value ) { /// ¸ó½ºÅÍ Á¤º¸¸¦ °¡Á®¿È cMonster* pMonster = OBJECTMANAGER->GetMonster( monsterIdx ); if( pMonster == NULL ) { assert(NULL); NETWORK2->PostServerEvent("cStatusCalc_Server::CalcStatusPlusDetailMonster pMonster == NULL"); return; } switch( statusType ) { /// plus case eSTATUSPLUS_ATK_PLUS: { pMonster->GetStatusPlus()->mPhysicAttack += value; }break; case eSTATUSPLUS_RATK_PLUS: { pMonster->GetStatusPlus()->mPhysicRangeAttack += value; }break; case eSTATUSPLUS_DEF_PLUS: { pMonster->GetStatusPlus()->mPhysicDefense += value; }break; case eSTATUSPLUS_MATK_PLUS: { pMonster->GetStatusPlus()->mMagicAttack += value; }break; case eSTATUSPLUS_MDEF_PLUS: { pMonster->GetStatusPlus()->mMagicDefense += value; }break; case eSTATUSPLUS_CRI_PLUS: { pMonster->GetStatusPlus()->mPhysicCritical += value; }break; case eSTATUSPLUS_MCRI_PLUS: { pMonster->GetStatusPlus()->mMagicCritical += value; }break; case eSTATUSPLUS_HP_PLUS: { pMonster->GetStatusPlus()->mMaxHP += value; } break; case eSTATUSPLUS_MP_PLUS: { pMonster->GetStatusPlus()->mMaxMP += value; } break; case eSTATUSPLUS_HIT_PLUS: { pMonster->GetStatusPlus()->mPhysicAttackRate += value; }break; case eSTATUSPLUS_MHIT_PLUS: { pMonster->GetStatusPlus()->mMagicAttackRate += value; }break; case eSTATUSPLUS_AVOID_PLUS: { pMonster->GetStatusPlus()->mPhysicAvoid += value; }break; case eSTATUSPLUS_ASPD_PLUS: { pMonster->GetStatusPlus()->mAttackSpeed += value; }break; case eSTATUSPLUS_COOLTIME_PLUS: { pMonster->GetStatusPlus()->mCooltime += value; }break; case eSTATUSPLUS_RANGE_PLUS: { pMonster->GetStatusPlus()->mInRange += value; }break; case eSTATUSPLUS_RRANGE_PLUS: { pMonster->GetStatusPlus()->mOutRange += value; }break; case eSTATUSPLUS_SPD_PLUS: { pMonster->GetStatusPlus()->mMoveSpeed += value; }break; case eSTATUSPLUS_MAVOID_PLUS: { pMonster->GetStatusPlus()->mMagicAvoid += value; }break; case eSTATUSPLUS_CRIDEF_PLUS: { pMonster->GetStatusPlus()->mPhysicCriticalDef += value; }break; case eSTATUSPLUS_MCRIDEF_PLUS: { pMonster->GetStatusPlus()->mMagicCriticalDef += value; }break; case eSTATUSPLUS_ATKTOTAL_PLUS: { pMonster->GetStatusPlus()->mPhysicAttack += value; pMonster->GetStatusPlus()->mPhysicRangeAttack += value; pMonster->GetStatusPlus()->mMagicAttack += value; } break; case eSTATUSPLUS_DEFTOTAL_PLUS: { pMonster->GetStatusPlus()->mPhysicDefense += value; pMonster->GetStatusPlus()->mMagicDefense += value; } break; /// percent case eSTATUSPLUS_ATK_PER: { pMonster->GetStatusPer()->mPhysicAttack += value; }break; case eSTATUSPLUS_RATK_PER: { pMonster->GetStatusPer()->mPhysicRangeAttack += value; }break; case eSTATUSPLUS_DEF_PER: { pMonster->GetStatusPer()->mPhysicDefense += value; }break; case eSTATUSPLUS_MATK_PER: { pMonster->GetStatusPer()->mMagicAttack += value; }break; case eSTATUSPLUS_MDEF_PER: { pMonster->GetStatusPer()->mMagicDefense += value; }break; case eSTATUSPLUS_CRI_PER: { pMonster->GetStatusPer()->mPhysicCritical += value; }break; case eSTATUSPLUS_MCRI_PER: { pMonster->GetStatusPer()->mMagicCritical += value; }break; case eSTATUSPLUS_HP_PER: { pMonster->GetStatusPer()->mMaxHP += value; } break; case eSTATUSPLUS_MP_PER: { pMonster->GetStatusPer()->mMaxMP += value; } break; case eSTATUSPLUS_HIT_PER: { pMonster->GetStatusPer()->mPhysicAttackRate += value; }break; case eSTATUSPLUS_MHIT_PER: { pMonster->GetStatusPer()->mMagicAttackRate += value; }break; case eSTATUSPLUS_AVOID_PER: { pMonster->GetStatusPer()->mPhysicAvoid += value; }break; case eSTATUSPLUS_ASPD_PER: { pMonster->GetStatusPer()->mAttackSpeed += value; }break; case eSTATUSPLUS_COOLTIME_PER: { pMonster->GetStatusPer()->mCooltime += value; }break; case eSTATUSPLUS_RANGE_PER: { pMonster->GetStatusPer()->mInRange += value; }break; case eSTATUSPLUS_RRANGE_PER: { pMonster->GetStatusPer()->mOutRange += value; }break; case eSTATUSPLUS_SPD_PER: { pMonster->GetStatusPer()->mMoveSpeed += value; }break; case eSTATUSPLUS_MAVOID_PER: { pMonster->GetStatusPer()->mMagicAvoid += value; }break; case eSTATUSPLUS_CRIDEF_PER: { pMonster->GetStatusPer()->mPhysicCriticalDef += value; }break; case eSTATUSPLUS_MCRIDEF_PER: { pMonster->GetStatusPer()->mMagicCriticalDef += value; }break; case eSTATUSPLUS_ATKTOTAL_PER: { pMonster->GetStatusPer()->mPhysicAttack += value; pMonster->GetStatusPer()->mPhysicRangeAttack += value; pMonster->GetStatusPer()->mMagicAttack += value; } break; case eSTATUSPLUS_DEFTOTAL_PER: { pMonster->GetStatusPer()->mPhysicDefense += value; pMonster->GetStatusPer()->mMagicDefense += value; } break; /// »óÅ ÀÌ»ó case eSTATUSPLUS_STOPMOVE: mOddity[eODDITYTYPE_CANTMOVE] += 1; break; case eSTATUSPLUS_STOPSKILL_PHY: mOddity[eODDITYTYPE_CANTSKILL_PHY] += 1; break; case eSTATUSPLUS_STOPSKILL_MAG: mOddity[eODDITYTYPE_CANTSKILL_MAG] += 1; break; case eSTATUSPLUS_SLEEP: mOddity[eODDITYTYPE_SLEEP] += 1; break; case eSTATUSPLUS_STUN: mOddity[eODDITYTYPE_STUN] += 1; break; case eSTATUSPLUS_INVINCIBILITY_PHY: mOddity[eODDITYTYPE_INVINCIBILITY_PHY] += 1; break; case eSTATUSPLUS_INVINCIBILITY_MAG: mOddity[eODDITYTYPE_INVINCIBILITY_MAG] += 1; break; case eSTATUSPLUS_HP_ABSORB_LONG: mOddity[eODDITYTYPE_HP_ABSORB] += (long)value; break; case eSTATUSPLUS_MP_ABSORB_LONG: mOddity[eODDITYTYPE_MP_ABSORB] += (long)value; break; case eSTATUSPLUS_STOPITEM_KIND: mOddity[eODDITYTYPE_STOPITEM_KIND] += (long)value; break; case eSTATUSPLUS_STOPITEM_IDX: mOddity[eODDITYTYPE_STOPITEM_IDX] += (long)value; break; case eSTATUSPLUS_DAMAGE_ABSORB_PHY: mOddity[eODDITYTYPE_DAMAGE_ABSORB_PHY] += (long)value; break; case eSTATUSPLUS_DAMAGE_ABSORB_MAG: mOddity[eODDITYTYPE_DAMAGE_ABSORB_MAG] += (long)value; break; case eSTATUSPLUS_DAMAGE_ABSORB_PHY_RANGE: mOddity[eODDITYTYPE_DAMAGE_ABSORB_PHY_RANGE] += (long)value; break; case eSTATUSPLUS_DAMAGE_REFLECT_PHY: mOddity[eODDITYTYPE_DAMAGE_REFLECTION_PHY] += (long)value; break; case eSTATUSPLUS_DAMAGE_REFLECT_MAG: mOddity[eODDITYTYPE_DAMAGE_REFLECTION_MAG] += (long)value; break; case eSTATUSPLUS_IGNORE_DEFENCE_PHY: mOddity[eODDITYTYPE_IGNORE_DEFENCE_PHY] += 1; break; case eSTATUSPLUS_IGNORE_DEFENCE_MAG: mOddity[eODDITYTYPE_IGNORE_DEFENCE_MAG] += 1; break; case eSTATUSPLUS_AVOID_MON_LOOK: mOddity[eODDITYTYPE_AVOID_MON_LOOK] += 1; break; case eSTATUSPLUS_ADD_APPLYCNT: mOddity[eODDITYTYPE_ADD_APPLY_CNT] += (long)value; break; case eSTATUSPLUS_STOPSKILL: { mOddity[eODDITYTYPE_CANTSKILL_PHY] += 1; mOddity[eODDITYTYPE_CANTSKILL_MAG] += 1; } break; case eSTATUSPLUS_IMMUNE_KIND: pMonster->AddImmuneKind( (unsigned long)value ); break; case eSTATUSPLUS_IMMUNEDEBUFF_APPLYTYPE: pMonster->AddImmuneApplyType( eINFLUENCETYPE_DEBUF, (unsigned short)value ); break; case eSTATUSPLUS_IMMUNEBUFF_APPLYTYPE: pMonster->AddImmuneApplyType( eINFLUENCETYPE_BUF, (unsigned short)value ); break; case eSTATUSPLUS_CHAR_SIZE: { mSizePer = mSizePer + (short)FloatToInt(value); } break; } } void cStatusCalc_Server::CalcMonster( unsigned long monsterIdx ) { cMonster* pMonster = OBJECTMANAGER->GetMonster( monsterIdx ); if( pMonster == NULL ) { NETWORK2->PostServerEvent("cStatusCalc_Server::CalcMonster pMonster[%d] == NULL", monsterIdx ); return; } mMoveSpeed = pMonster->GetMoveSpeed(); /// ¸ó½ºÅÍ¿¡ °É¸° È¿°ú Á¤º¸¸¦ Àоî¿È cHashSet* influenceSet = pMonster->GetInfluenceSet(); if( influenceSet == NULL ) return; sMonsterStatus* pStatusPlus = pMonster->GetStatusPlus(); if( pStatusPlus == NULL ) { assert(NULL); NETWORK2->PostServerEvent("cStatusCalc_Server::CalcMonster pStatusPlus == NULL" ); return; } sMonsterStatus* pStatusPer = pMonster->GetStatusPer(); if( pStatusPer == NULL ) { assert(NULL); NETWORK2->PostServerEvent("cStatusCalc_Server::CalcMonster pStatusPer == NULL" ); return; } memset( pStatusPlus, 0, sizeof(sMonsterStatus) ); memset( pStatusPer, 0, sizeof(sMonsterStatus) ); memset( mOddity, 0, sizeof(mOddity) ); pMonster->ClearImmune(); cInfluenceObject* pInfluence = NULL; sInfluenceScript* pInfluenceScript = NULL; cHashSet::cIterator iter = influenceSet->Begin(); cHashSet::cIterator end = influenceSet->End(); mSizePer = 0; /// ij¸¯ÅÍ Å©±âº¯È­ mFixedObjectSize = pMonster->GetFixedObjectSize(); while( iter != end ) { pInfluence = SKILLMANAGER->GetInfluence( *iter++ ); if( pInfluence == NULL ) { assert(NULL); NETWORK2->PostServerEvent("cStatusCalc_Server::CalcMonster pInfluence == NULL" ); //-/-//SKILLMANAGER->InsertDeleteInfluenceObject( pInfluence ); /// °´Ã¼ »èÁ¦ ´ë±â¿­¿¡ ³Ö´Â´Ù. continue; } pInfluenceScript = SKILLSCRIPT->GetInfluenceInfo( pInfluence->GetInfluenceClassIdx() ); /// Áö¼Ó(µ¥¹ÌÁö) ÀûÀÎ È¿°ú°¡ ¾Æ´Ñ°æ¿ì¸¸ if( pInfluenceScript->mTime1 == 0 ) { if( pInfluenceScript->mStatusPlusIdx1 != 0 ) { CalcStatusPlusDetailMonster( monsterIdx, (eSTATUS_PLUS)(pInfluenceScript->mStatusPlusIdx1), (float)(pInfluenceScript->mValue1) ); } } if( pInfluenceScript->mStatusPlusIdx2 != 0 ) { CalcStatusPlusDetailMonster( monsterIdx, (eSTATUS_PLUS)(pInfluenceScript->mStatusPlusIdx2), (float)(pInfluenceScript->mValue2) ); } if( pInfluenceScript->mStatusPlusIdx3 != 0 ) { CalcStatusPlusDetailMonster( monsterIdx, (eSTATUS_PLUS)(pInfluenceScript->mStatusPlusIdx3), (float)(pInfluenceScript->mValue3) ); } } pMonster->SetStateOddity( mOddity ); /// À̵¿ ¼Óµµ°¡ º¯ÇѰæ¿ì Ŭ¶óÀÌ¾ðÆ®¿¡ Àü¼Û if( pMonster->GetMoveSpeed() != mMoveSpeed ) { pMonster->SendMoveSpeed(); } /// Å©±â °è»êÈÄ º¯ÇßÀ¸¸é Ŭ¶óÀÌ¾ðÆ®¿¡µµ ¾Ë¸² pMonster->SetFixedObjectSizePer( (short)mSizePer ); if( mFixedObjectSize != pMonster->GetFixedObjectSize() ) pMonster->SendMonsterSize(); } void cStatusCalc_Server::CalcPlayerStatus( cPlayer* pPlayer ) { if( pPlayer == NULL ) return; unsigned char level = pPlayer->GetLevel(); ePLAYER_JOB job = pPlayer->GetJob(); /// ÀüÁ÷Ŭ·¡½º1 ±âÁØ ·¹º§ unsigned char class1 = 30; /// ÀüÁ÷Ŭ·¡½º2 ±âÁØ ·¹º§ unsigned char class2 = 70; sStatusBaseScript* pStatusBase = NULL; /// ÀÚ±â Àڽſ¡ ÇØ´çÇÏ´Â Á÷¾÷ÀÇ statusbase Á¤º¸¸¦ °¡Á®¿È pStatusBase = STATUSSCRIPT->GetStatusBaseInfo( job ); /// Àڽſ¡ ÇØ´çÇÏ´Â Á÷¾÷ÀÌ ¾øÀ¸¸é »óÀ§ Á÷¾÷À» Àоî¿Í¼­ ó¸®ÇÑ´Ù. if( pStatusBase == NULL ) { /// »óÀ§ Á÷¾÷ ¹è¿­À» Àоî¿Â´Ù. tArray* playerJobParent = STATUSSCRIPT->GetParentJob( job ); if( playerJobParent == NULL ) { /// ÀÚ½ÅÀÇ Á÷¾÷µµ ¾ø´Âµ¥ ºÎ¸ðÀÇ Á÷¾÷µµ ¾øÀ¸¸é ¿À·ù assert(NULL); NETWORK2->PostServerEvent("cStatusCalc_Server::CalcPlayerStatus parantJob[%d] == NULL", job ); return; } else { /// »óÀ§ Á÷¾÷ÀÌ ÀÖÀ¸¸é for( int i = playerJobParent->GetSize() - 1 ; 0 <= i ; --i ) { /// »óÀ§ Á÷¾÷ÄÚµå·Î ½ºÅ©¸³Æ® °ªÀ» Àоî¿È pStatusBase = STATUSSCRIPT->GetStatusBaseInfo( (*playerJobParent)[i] ); if( pStatusBase != NULL ) { break; } } assert(NULL); NETWORK2->PostServerEvent("cStatusCalc_Server::CalcPlayerStatus playerJobParentAry == NULL" ); } } /// ÀÔ·Â °ª ±âº» ½ºÅÝ ¼öÄ¡·Î Àû¿ë for( unsigned char i = ePLAYER_STATUS_STR ; i < ePLAYER_STATUS_LEVEL ; ++i ) { mBaseStatus[i] = pStatusBase->mBaseStatus[i]; } /// ÀüÁ÷ Â÷¼ö¿Í ·¹º§¿¡ µû¸¥ ½ÇÁ¦ Àû¿ë ¹Þ¾Æ¾ßÇÒ Á÷¾÷ÄÚµå unsigned long fixjob = job; sStatusMultiplScript* pStatusMultipl; /// ÇöÀç ·¹º§¿¡¼­ 1·¹º§±îÁö ½ºÅÝ °è»ê ( 0·¹º§Àº ±âº»°ª 1·¹º§ºÎÅÍ Áõ°¡Ä¡ ) //for( unsigned char j = 1 ; j <= level ; ++j ) for( unsigned char j = 1 ; j < level ; ++j ) { /// 1·¹º§¿¡¼­ 1Â÷ÀüÁ÷·¹º§(30)Àü±îÁö ±âº»Á÷¾÷ ÄÚµå·Î ½ºÅÝ °è»ê if( ( 1 <= j ) && ( j < class1 ) ) { /// »óÀ§ Á÷¾÷ ¸®½ºÆ®¿¡¼­ 1Â÷ÀüÁ÷ Á÷¾÷À» °¡Á®¿È fixjob = GetParantJob( job, 0 ); /// ¾ø´Â °æ¿ì ÇöÀç Á÷¾÷ÀÌ ±âº» Á÷¾÷À̶ó ºÎ¸ð°¡ ¾ø´Â °æ¿ìÀÓ if( fixjob == NULL ) { /// ÇöÀç Á÷¾÷À» ½ºÅÝ °è»ê ±âÁØ ÄÚµå·Î µî·Ï fixjob = job; } } /// 1Â÷ÀüÁ÷·¹º§(30)¿¡¼­ 2Â÷ÀüÁ÷·¹º§(70)±îÁö 1Â÷ÀüÁ÷ else if( ( class1 <= j ) && ( j < class2 ) ) { /// »óÀ§ Á÷¾÷ ¸®½ºÆ®¿¡¼­ 1Â÷ÀüÁ÷ Á÷¾÷À» °¡Á®¿È fixjob = GetParantJob( job, 1 ); /// ¾ø´Â °æ¿ì ÇöÀç Á÷¾÷ÀÌ 1Â÷ Á÷¾÷ÀÓ if( fixjob == NULL ) { fixjob = job; } } /// 2Â÷ÀüÁ÷·¹º§(30)¿¡¼­ ·¹º§ ÇѰèÁ¡ ±îÁö else if( class2 <= j ) { /// »óÀ§ Á÷¾÷ ¸®½ºÆ®¿¡¼­ 2Â÷ÀüÁ÷ Á÷¾÷À» °¡Á®¿È fixjob = GetParantJob( job, 2 ); /// ¾ø´Â °æ¿ì ÇöÀç Á÷¾÷ÀÌ 2Â÷ Á÷¾÷ÀÓ if( fixjob == NULL ) { fixjob = job; } } /// ÇöÀç ·¹º§¿¡ ¸Â´Â Á÷¾÷ ÄÚµå·Î ½ºÅÝ Áõ°¡Ä¡¸¦ ¾ò¾î¿È pStatusMultipl = STATUSSCRIPT->GetStatusMultiplInfo( fixjob ); if( pStatusMultipl == NULL ) { assert(NULL); NETWORK2->PostServerEvent("cStatusCalc_Server::CalcPlayerStatus pStatusMultipl[%d] == NULL", fixjob); return; } for( unsigned char i = ePLAYER_STATUS_STR ; i < ePLAYER_STATUS_LEVEL ; ++i ) { /// Ŭ·¡½º±âÁØ¿¡ µû¸¥ Áõ°¡Ä¡ ¸¸Å­ Áõ°¡ mBaseStatus[i] = mBaseStatus[i] + pStatusMultipl->mBaseStatus[i]; } } } void cStatusCalc_Server::CalcPlayerExtStatus( cPlayer* pPlayer, ePLAYER_STATUS_EXT statusExt ) { if( pPlayer == NULL ) return; ePLAYER_JOB job = pPlayer->GetJob(); /// Ç÷¹À̾îÀÇ ½ºÅÝ1 ÃÖÁ¾°ªÀ» Àоî¿È + ·¹º§°ª±îÁö float baseStatus[ePLAYER_STATUS_LEVEL_MAX]; unsigned char i = ePLAYER_STATUS_STR; for( ; i < ePLAYER_STATUS_LEVEL ; ++i ) { baseStatus[i] = (mBaseStatus[i] + mBaseStatusPlus[i]); if( mBaseStatusPer[i] != 0 ) baseStatus[i] += (mBaseStatus[i] + mBaseStatusPlus[i]) * (mBaseStatusPer[i] * 0.01f); if( baseStatus[i] < 0.0f ) baseStatus[i] = 0.0f; } baseStatus[i] = pPlayer->GetLevel(); /// ½ºÅÝÀÇ °è»ê °á°ú °ª float statusValue = 0.0f; /// ÀÚ¿¬È¸º¹HP/MP ±âº»°ªÀº [ij¸¯ÅͽºÅÈȸº¹¼öÄ¡]¿¡ ´õÇÏÁö ¾Ê°í ÀÚ¿¬È¸º¹°è»ê½Ã »ç¿ëÇÑ´Ù. if( statusExt == ePLAYER_STATUS_EXT_RECOVHP || statusExt == ePLAYER_STATUS_EXT_RECOVMP ) { statusValue = 0.0f; } else { /// ÀÚ½ÅÀÇ Á÷¾÷°ú ½ºÅÝ ±¸ºÐÀ̶û °°Àº °ÍÀÌ ÀÖ´ÂÁö üũ statusValue = STATUSSCRIPT->GetStatusExtBaseInfo( statusExt, job ); //if( FloatToInt(statusValue) == 0 ) //{ // if( playerJobParent != 0 ) // { // /// »óÀ§ Á÷¾÷ÀÌ ÀÖÀ¸¸é // for( int i = playerJobParent->GetSize() - 1 ; 0 <= i ; --i ) // { // /// »óÀ§ Á÷¾÷ÄÚµå·Î ½ºÅ©¸³Æ® °ªÀ» Àоî¿È // statusValue = STATUSSCRIPT->GetStatusExtBaseInfo( statusExt, (*playerJobParent)[i] ); // if( FloatToInt(statusValue) != 0 ) // { // break; // } // } // } // else // { // statusValue = 0.0f; // } //} } /// Ç÷¹À̾îÀÇ ÃÖ»óÀ§(1Â÷) Á÷¾÷ ±â·Ï tArray* playerJobParent = STATUSSCRIPT->GetParentJob( job ); unsigned long firstJob = job; if( playerJobParent != NULL ) firstJob = (*playerJobParent)[0]; /// 1Â÷ Á÷¾÷¿¡ µû¶ó °ø°Ý·Â ½ºÅÝ ºñÁßÄ¡ Àоî¿Ã Ç׸ñ°ª ¼³Á¤ unsigned long plusStatus = 0; switch( firstJob ) { case ePLAYER_FIGHTER: /// ÆÄÀÌÅÍ case ePLAYER_ARMSMAN: /// ¿ö¸®¾î plusStatus = 0; break; case ePLAYER_WANDERER: /// ·¹ÀÎÁ® case ePLAYER_RANGER: /// ·Î±× plusStatus = 1; break; case ePLAYER_MAGE: /// ¸ÞÀÌÁö case ePLAYER_WARLOCK: /// »þ¸Õ plusStatus = 2; break; } float oriMaxHP = statusValue; float oriMaxMP = statusValue; float importance = 0.0f; for( unsigned char i = ePLAYER_STATUS_STR ; i < ePLAYER_STATUS_LEVEL_MAX ; ++i ) { eEXT_MULTIPL chgStatusExt = eEXT_MULTIPL_MAX; switch( statusExt ) { case ePLAYER_STATUS_EXT_ATK: chgStatusExt = (eEXT_MULTIPL)( eEXT_MULTIPL_ATK_FIGHTER + plusStatus ); /// ±Ù°Å¸®, ¿ø°Å¸®, ¸¶¹ý Á÷¾÷¿¡ µû¸¥ °ø°Ý·Â Ç׸ñ ¼³Á¤ break; case ePLAYER_STATUS_EXT_RATK: chgStatusExt = (eEXT_MULTIPL)( eEXT_MULTIPL_RATK_FIGHTER + plusStatus ); break; case ePLAYER_STATUS_EXT_MATK: chgStatusExt = (eEXT_MULTIPL)( eEXT_MULTIPL_MATK_FIGHTER + plusStatus ); break; case ePLAYER_STATUS_EXT_DEF: chgStatusExt = eEXT_MULTIPL_DEF; break; /// ¹°¸® ¹æ¾î·Â case ePLAYER_STATUS_EXT_MDEF: chgStatusExt = eEXT_MULTIPL_MDEF; break; /// ¸¶¹ý ¹æ¾î·Â case ePLAYER_STATUS_EXT_CRI: chgStatusExt = eEXT_MULTIPL_CRI; break; /// ¹°¸® Å©¸®Æ¼Äà ¼öÄ¡ case ePLAYER_STATUS_EXT_MCRI: chgStatusExt = eEXT_MULTIPL_MCRI; break; /// ¸¶¹ý Å©¸®Æ¼Äà ¼öÄ¡ case ePLAYER_STATUS_EXT_MAXHP: /// HP { chgStatusExt = eEXT_MULTIPL_MAXHP; /// º£À̽º ½ºÅÝÀ» ºñÁß°ú °öÇÑ´Ù. importance = STATUSSCRIPT->GetStatusExtMultiplInfo( chgStatusExt, (ePLAYER_STATUS)i ); oriMaxHP += mBaseStatus[i] * importance; } break; case ePLAYER_STATUS_EXT_MAXMP: /// MP { chgStatusExt = eEXT_MULTIPL_MAXMP; /// º£À̽º ½ºÅÝÀ» ºñÁß°ú °öÇÑ´Ù. importance = STATUSSCRIPT->GetStatusExtMultiplInfo( chgStatusExt, (ePLAYER_STATUS)i ); oriMaxMP += mBaseStatus[i] * importance; } break; case ePLAYER_STATUS_EXT_RECOVHP: chgStatusExt = eEXT_MULTIPL_RECOVHP; break; /// HP ȸº¹ ¼Óµµ case ePLAYER_STATUS_EXT_RECOVMP: chgStatusExt = eEXT_MULTIPL_RECOVMP; break; /// MP ȸº¹ ¼Óµµ case ePLAYER_STATUS_EXT_HIT: chgStatusExt = eEXT_MULTIPL_HIT; break; /// ¸íÁß ¼öÄ¡ case ePLAYER_STATUS_EXT_MHIT: chgStatusExt = eEXT_MULTIPL_MHIT; break; /// ¸¶¹ý ¸íÁß case ePLAYER_STATUS_EXT_AVOID: chgStatusExt = eEXT_MULTIPL_AVOID; break; /// ȸÇÇ ¼öÄ¡ case ePLAYER_STATUS_EXT_WEIGHT: chgStatusExt = eEXT_MULTIPL_WEIGHT; break; /// ¹«°Ô case ePLAYER_STATUS_EXT_RANGE: chgStatusExt = eEXT_MULTIPL_RANGE; break; /// »çÁ¤°Å¸® case ePLAYER_STATUS_EXT_RRANGE: chgStatusExt = eEXT_MULTIPL_RRANGE; break; /// ¹æÃâÇ÷»çÁ¤°Å¸® case ePLAYER_STATUS_EXT_COOLTIME: chgStatusExt = eEXT_MULTIPL_COOLTIME; break; /// ÄðŸÀÓ case ePLAYER_STATUS_EXT_SPD: chgStatusExt = eEXT_MULTIPL_SPD; break; /// À̵¿¼Óµµ case ePLAYER_STATUS_EXT_ASPD: chgStatusExt = eEXT_MULTIPL_ASPD; break; /// °ø°Ý ¼Óµµ case ePLAYER_STATUS_EXT_MAVOID: chgStatusExt = eEXT_MULTIPL_MAVOID; break; /// ¸¶¹ýȸÇÇ(ÀúÇ×·Â) case ePLAYER_STATUS_EXT_HEAL: chgStatusExt = eEXT_MULTIPL_HEAL; break; /// Èúȸº¹·® case ePLAYER_STATUS_EXT_CRIDEF: chgStatusExt = eEXT_MULTIPL_CRIDEF; break; /// ¹°¸® Å©¸®Æ¼Äà °¨¼Ò(¹æÈ£) case ePLAYER_STATUS_EXT_MCRIDEF: chgStatusExt = eEXT_MULTIPL_MCRIDEF; break; /// ¸¶¹ý Å©¸®Æ¼Äà °¨¼Ò(¹æÈ£) } /// º£À̽º ½ºÅÝÀ» ºñÁß°ú °öÇÑ´Ù. importance = STATUSSCRIPT->GetStatusExtMultiplInfo( chgStatusExt, (ePLAYER_STATUS)i ); statusValue += baseStatus[i] * importance; } if( statusExt == ePLAYER_STATUS_EXT_MAXHP ) pPlayer->SetOriHPMax( FloatToInt( oriMaxMP ) ); if( statusExt == ePLAYER_STATUS_EXT_MAXMP ) pPlayer->SetOriMPMax( FloatToInt( oriMaxMP ) ); /// ±âÁØ À̵¿ ¼Óµµ°¡ ÀÌ¹Ì ¼³Á¤µÅÀÖ´Â °æ¿ì(¸ó½ºÅͺ¯½Å) ó¸® if( statusExt == ePLAYER_STATUS_EXT_SPD && pPlayer->GetMoveSpeed() != 0 ) { mExtStatus[statusExt] = (float)pPlayer->GetMoveSpeed(); } else if ( statusExt == ePLAYER_STATUS_EXT_WEIGHT ) { mExtStatus[statusExt] = mExtStatus[statusExt] + statusValue; switch ( pPlayer->GetBagEnd() ) { case INVENTORY_BAG1_END : mExtStatus[statusExt] += ADD_BAG1_WEIGHT; break; case INVENTORY_BAG2_END : mExtStatus[statusExt] += ADD_BAG2_WEIGHT; break; case INVENTORY_BAG3_END : mExtStatus[statusExt] += ADD_BAG3_WEIGHT; break; } } else /// °á°ú °ªÀ» ±â·Ï mExtStatus[statusExt] = mExtStatus[statusExt] + statusValue; if( mExtStatus[statusExt] < 0.0f ) mExtStatus[statusExt] = 0.0f; } void cStatusCalc_Server::CalcPlayerInit( sObject object ) { cPlayer* pPlayer = OBJECTMANAGER->GetPlayer( object.index ); if( pPlayer != NULL ) { mMoveSpeed = pPlayer->GetMoveSpeed(); mAttackSpeed = pPlayer->GetStatus2()->mAttackSpeed; mFixedObjectSize = pPlayer->GetFixedObjectSize(); mSizePer = 0; mMaxHP = pPlayer->GetMaxHP(); mMaxMP = pPlayer->GetMaxMP(); pPlayer->InitStatus2(); CalcPlayerBaseOnly( pPlayer ); CalcPlayerExtensionOnly( pPlayer ); CalcPlayerGlobal( pPlayer ); } } void cStatusCalc_Server::CalcPlayerBaseGlobal( sObject object ) { cPlayer* pPlayer = OBJECTMANAGER->GetPlayer( object.index ); if( pPlayer != NULL ) { mMoveSpeed = pPlayer->GetMoveSpeed(); mAttackSpeed = pPlayer->GetStatus2()->mAttackSpeed; mFixedObjectSize = 0; mSizePer = 0; mMaxHP = pPlayer->GetMaxHP(); mMaxMP = pPlayer->GetMaxMP(); pPlayer->InitStatus2(); mBaseStatusPlus[ePLAYER_STATUS_STR] = (float)pPlayer->GetStatus1Plus()->mStr; mBaseStatusPlus[ePLAYER_STATUS_DEX] = (float)pPlayer->GetStatus1Plus()->mDex; mBaseStatusPlus[ePLAYER_STATUS_CON] = (float)pPlayer->GetStatus1Plus()->mCon; mBaseStatusPlus[ePLAYER_STATUS_INT] = (float)pPlayer->GetStatus1Plus()->mInt; mBaseStatusPlus[ePLAYER_STATUS_WIS] = (float)pPlayer->GetStatus1Plus()->mWis; mBaseStatusPer[ePLAYER_STATUS_STR] = (float)pPlayer->GetStatus1Per()->mStr; mBaseStatusPer[ePLAYER_STATUS_DEX] = (float)pPlayer->GetStatus1Per()->mDex; mBaseStatusPer[ePLAYER_STATUS_CON] = (float)pPlayer->GetStatus1Per()->mCon; mBaseStatusPer[ePLAYER_STATUS_INT] = (float)pPlayer->GetStatus1Per()->mInt; mBaseStatusPer[ePLAYER_STATUS_WIS] = (float)pPlayer->GetStatus1Per()->mWis; memcpy( mExtStatusPlus, pPlayer->GetPointerStatus2Plus(), sizeof(mExtStatusPlus) ); memcpy( mExtStatusPer, pPlayer->GetPointerStatus2Per(), sizeof(mExtStatusPer) ); mExtAddStatus[ePLAYER_STATUS_EXT_ADD_EXPADDPER] = (float)pPlayer->GetStatusEtc()->mExpAddPer; mExtAddStatus[ePLAYER_STATUS_EXT_ADD_EXPADDPLUS] = (float)pPlayer->GetStatusEtc()->mExpAddPlus; mExtAddStatus[ePLAYER_STATUS_EXT_ADD_SXPADDPER] = (float)pPlayer->GetStatusEtc()->mSxpAddPer; mExtAddStatus[ePLAYER_STATUS_EXT_ADD_SXPADDPLUS] = (float)pPlayer->GetStatusEtc()->mSxpAddPlus; mExtAddStatus[ePLAYER_STATUS_EXT_ADD_MONEYPER] = (float)pPlayer->GetStatusEtc()->mMoneyAddPer; mExtAddStatus[ePLAYER_STATUS_EXT_ADD_PVPPOINTPER] = (float)pPlayer->GetStatusEtc()->mPvPPointAddPer; CalcPlayerBaseOnly( pPlayer ); CalcPlayerGlobal( pPlayer ); } } void cStatusCalc_Server::CalcPlayerExtensionGlobal( sObject object ) { cPlayer* pPlayer = OBJECTMANAGER->GetPlayer( object.index ); if( pPlayer != NULL ) { mMoveSpeed = pPlayer->GetMoveSpeed(); mAttackSpeed = pPlayer->GetStatus2()->mAttackSpeed; mFixedObjectSize = pPlayer->GetFixedObjectSize(); mSizePer = 0; mMaxHP = pPlayer->GetMaxHP(); mMaxMP = pPlayer->GetMaxMP(); pPlayer->InitStatus2(); mBaseStatus[ePLAYER_STATUS_STR] = (float)pPlayer->GetStatus1()->mStr; mBaseStatus[ePLAYER_STATUS_DEX] = (float)pPlayer->GetStatus1()->mDex; mBaseStatus[ePLAYER_STATUS_CON] = (float)pPlayer->GetStatus1()->mCon; mBaseStatus[ePLAYER_STATUS_INT] = (float)pPlayer->GetStatus1()->mInt; mBaseStatus[ePLAYER_STATUS_WIS] = (float)pPlayer->GetStatus1()->mWis; CalcPlayerExtensionOnly( pPlayer ); CalcPlayerGlobal( pPlayer ); } } void cStatusCalc_Server::CalcPlayerGlobal( cPlayer* pPlayer ) { if( pPlayer == NULL ) return; /// ½ºÅÝ2 º£À̽º ÃʱâÈ­ for( int i = ePLAYER_STATUS_EXT_ATK ; ePLAYER_STATUS_EXT_MAX > i ; ++i ) { mExtStatus[i] = 0; } /// ½ºÅÝ2 ÃÖÁ¾°ª for( int i = ePLAYER_STATUS_EXT_ATK ; ePLAYER_STATUS_EXT_MAX > i ; ++i ) { mExtStatusLast[i] = 0; } sEquipAbility* pItem = pPlayer->GetEquipAbility(); for( unsigned char i = ePLAYER_STATUS_EXT_ATK ; i < ePLAYER_STATUS_EXT_MAX ; ++i ) { /// ½ºÅ©¸³Æ®¿¡¼­ ÀоîµéÀÎ ¼ø¼öÇÑ ½ºÅÝ2 °ª °è»ê CalcPlayerExtStatus( pPlayer , (ePLAYER_STATUS_EXT)i ); /// ÃÖÁ¾ ½ºÅÝ °è»êÀü °¡°¨»ê ÇÒ Ç׸ñ Àû¿ë switch( (ePLAYER_STATUS_EXT)i ) { /// ±Ù°Å¸® ¹°¸® °ø°Ý case ePLAYER_STATUS_EXT_ATK: { float num301 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 301 ); // °ø°Ý·Â(±Ù°Å¸®) // A = ij¸¯ÅÍ ½ºÅÈ ±Ù°Å¸® °ø°Ý·Â // B = ¾ÆÀÌÅÛ ¹°¸® °ø°Ý·Â + ( [ij¸¯ÅÍ] Lv * {num301} ) // C = ((100 + ¹öÇÁ¼º ±Ù°Å¸® °ø°Ý·Â[%]°ª + ¾ÆÀÌÅÛ ¹°¸® °ø°Ý·Â[%]°ª) / 100) // D = ((A + B ) * C) + ¹öÇÁ¼º ±Ù°Å¸® °ø°Ý·Â[+-]°ª + ¾ÆÀÌÅÛ ¹°¸® °ø°Ý·Â[+-]°ª float valueA = mExtStatus[i]; float valueB = pItem->mPhysicMinAttack + ( pPlayer->GetLevel() * num301 ); float valueC = (( 100.0f + mExtStatusPer[i] + pItem->mOptPercentPhysicAttack ) / 100.0f ); mExtStatusLast[i] = (( valueA + valueB ) * valueC ) + mExtStatusPlus[i] + pItem->mOptPlusPhysicAttack; if( mExtStatusLast[i] < 0.0f ) mExtStatusLast[i] = 0.0f; pPlayer->SetStatus2( ePLAYER_STATUS_EXT_ATKMin, mExtStatusLast[i] ); valueB = pItem->mPhysicMaxAttack + ( pPlayer->GetLevel() * num301 ); valueC = (( 100.0f + mExtStatusPer[i] + pItem->mOptPercentPhysicAttack ) / 100.0f ); mExtStatusLast[i] = (( valueA + valueB ) * valueC ) + mExtStatusPlus[i] + pItem->mOptPlusPhysicAttack; if( mExtStatusLast[i] < 0.0f ) mExtStatusLast[i] = 0.0f; pPlayer->SetStatus2( ePLAYER_STATUS_EXT_ATKMax, mExtStatusLast[i] ); mExtStatusLast[i] = 0.0f; } break; /// ¿ø°Å¸® ¹°¸® °ø°Ý case ePLAYER_STATUS_EXT_RATK: { float num331 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 331 ); // °ø°Ý·Â(¿ø°Å¸®) // A = ij¸¯ÅÍ ½ºÅÈ ¿ø°Å¸® °ø°Ý·Â // B = ¾ÆÀÌÅÛ ¹°¸® °ø°Ý·Â + ( [ij¸¯ÅÍ] Lv * {num331} ) // C = ((100 + ¹öÇÁ¼º ¿ø°Å¸® °ø°Ý·Â[%]°ª + ¾ÆÀÌÅÛ ¹°¸® °ø°Ý·Â[%]°ª) / 100) // D = (A + B ) * C + ¹öÇÁ¼º ¿ø°Å¸® °ø°Ý·Â[+-]°ª + ¾ÆÀÌÅÛ ¹°¸® °ø°Ý·Â[+-]°ª float valueA = mExtStatus[i]; float valueB = pItem->mPhysicMinAttack + ( pPlayer->GetLevel() * num331 ); float valueC = (( 100.0f + mExtStatusPer[i] + pItem->mOptPercentPhysicAttack ) / 100.0f ); mExtStatusLast[i] = (( valueA + valueB ) * valueC ) + mExtStatusPlus[i] + pItem->mOptPlusPhysicAttack; if( mExtStatusLast[i] < 0.0f ) mExtStatusLast[i] = 0.0f; pPlayer->SetStatus2( ePLAYER_STATUS_EXT_RATKMin, mExtStatusLast[i] ); valueB = pItem->mPhysicMaxAttack + ( pPlayer->GetLevel() * num331 ); valueC = (( 100.0f + mExtStatusPer[i] + pItem->mOptPercentPhysicAttack ) / 100.0f ); mExtStatusLast[i] = (( valueA + valueB ) * valueC ) + mExtStatusPlus[i] + pItem->mOptPlusPhysicAttack; if( mExtStatusLast[i] < 0.0f ) mExtStatusLast[i] = 0.0f; pPlayer->SetStatus2( ePLAYER_STATUS_EXT_RATKMax, mExtStatusLast[i] ); mExtStatusLast[i] = 0.0f; } break; /// ¹°¸® ¹æ¾î·Â case ePLAYER_STATUS_EXT_DEF: { float num401 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 401 ); float num402 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 402 ); // ¹æ¾î·Â(¹°¸®) // A = ij¸¯ÅÍ ½ºÅȹ°¸® ¹æ¾î·Â // B = ¾ÆÀÌÅÛ ¹°¸® ¹æ¾î·Â // C = ((100 + ¹öÇÁ¼º ¹°¸® ¹æ¾î·Â[%]°ª + ¾ÆÀÌÅÛ ¹°¸® ¹æ¾î·Â[%]°ª) / 100) // D = ((A / {num401} + B / {num402} ) * C) + ¹öÇÁ¼º ¹°¸® ¹æ¾î·Â[+-]°ª + ¾ÆÀÌÅÛ ¹°¸® ¹æ¾î·Â[+-]°ª float valueA = mExtStatus[i]; float valueB = pItem->mPhysicDefense; float valueC = (( 100.0f + ( mExtStatusPer[i] + pItem->mOptPercentPhysicDefense ) ) / 100.0f ); mExtStatusLast[i] = (( valueA / num401 + valueB / num402 ) * valueC ) + mExtStatusPlus[i] + pItem->mOptPlusPhysicDefense; if( mExtStatusLast[i] < 0.0f ) mExtStatusLast[i] = 0.0f; pPlayer->SetStatus2( (ePLAYER_STATUS_EXT)i, mExtStatusLast[i] ); } break; /// ¸¶¹ý °ø°Ý case ePLAYER_STATUS_EXT_MATK: { float num361 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 361 ); float num362 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 362 ); // °ø°Ý·Â(¸¶¹ý) // A = ij¸¯ÅÍ ½ºÅÈ ¸¶¹ý °ø°Ý·Â / {num361} // B = ¾ÆÀÌÅÛ ¸¶¹ý °ø°Ý·Â + ( [ij¸¯ÅÍ] Lv * {num362} ) // C = ((100 + ¹öÇÁ¼º ¸¶¹ý °ø°Ý·Â[%]°ª + ¾ÆÀÌÅÛ ¸¶¹ý °ø°Ý·Â[%]°ª) / 100) // D = (A + B ) * C + ¹öÇÁ¼º ¸¶¹ý °ø°Ý·Â[+-]°ª + ¾ÆÀÌÅÛ ¸¶¹ý °ø°Ý·Â[+-]°ª float valueA = mExtStatus[i] / num361; float valueB = pItem->mMagicMinAttack + ( pPlayer->GetLevel() * num362 ); float valueC = (( 100.0f + ( mExtStatusPer[i] + pItem->mOptPercentMagicAttack ) ) / 100.0f ); mExtStatusLast[i] = (( valueA + valueB ) * valueC ) + mExtStatusPlus[i] + pItem->mOptPlusMagicAttack; if( mExtStatusLast[i] < 0.0f ) mExtStatusLast[i] = 0.0f; pPlayer->SetStatus2( ePLAYER_STATUS_EXT_MATKMin, mExtStatusLast[i] ); valueB = pItem->mMagicMaxAttack + ( pPlayer->GetLevel() * num362 ); valueC = (( 100 + ( mExtStatusPer[i] + pItem->mOptPercentMagicAttack ) ) / 100 ); mExtStatusLast[i] = (( valueA + valueB ) * valueC ) + mExtStatusPlus[i] + pItem->mOptPlusMagicAttack; if( mExtStatusLast[i] < 0.0f ) mExtStatusLast[i] = 0.0f; pPlayer->SetStatus2( ePLAYER_STATUS_EXT_MATKMax, mExtStatusLast[i] ); mExtStatusLast[i] = 0.0f; } break; /// ¸¶¹ý ¹æ¾î·Â case ePLAYER_STATUS_EXT_MDEF: { float num431 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 431 ); float num432 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 432 ); // ¹æ¾î·Â(¸¶¹ý) // A = ij¸¯ÅÍ ½ºÅȸ¶¹ý ¹æ¾î·Â // B = ¾ÆÀÌÅÛ ¸¶¹ý ¹æ¾î·Â // C = ((100 + ¹öÇÁ¼º ¸¶¹ý ¹æ¾î·Â[%]°ª + ¾ÆÀÌÅÛ ¸¶¹ý ¹æ¾î·Â[%]°ª) / 100) // D = ((A /{num431} + B / {num432} ) * C) + ¹öÇÁ¼º ¹°¸® ¹æ¾î·Â[+-]°ª + ¾ÆÀÌÅÛ ¸¶¹ý ¹æ¾î·Â[+-]°ª float valueA = mExtStatus[i]; float valueB = pItem->mMagicDefense; float valueC = (( 100.0f + ( mExtStatusPer[i] + pItem->mOptPercentMagicDefense ) ) / 100.0f ); mExtStatusLast[i] = (( valueA / num431 + valueB / num432 ) * valueC ) + mExtStatusPlus[i] + pItem->mOptPlusMagicDefense; if( mExtStatusLast[i] < 0.0f ) mExtStatusLast[i] = 0.0f; pPlayer->SetStatus2( (ePLAYER_STATUS_EXT)i, mExtStatusLast[i] ); } break; /// ¹°¸® °ø°Ý Å©¸® case ePLAYER_STATUS_EXT_CRI: { /// ¹æ¾îÀÚ Ç׸ñ°ú °°ÀÌ °è»êÇÏ´Â ºÎºÐ¶§¹®¿¡ ¼­¹ö¿¡¼± A Ç׸ñ±îÁö¸¸ °è»êÇØµÒ!!! mExtStatusLast[i] = mExtStatus[i]; pPlayer->SetStatus2( (ePLAYER_STATUS_EXT)i, mExtStatusLast[i] ); //float num201 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 201 ); //float num202 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 202 ); //// Å©¸®Æ¼Äà ¹ß»ý È®·ü(¹°¸®) ////A = [°ø°ÝÀÚ] ij¸¯ÅÍ ½ºÅÈ ¹°¸® Å©¸®Æ¼Äà ¼öÄ¡ + [°ø°ÝÀÚ]¾ÆÀÌÅÛ ¹°¸® Å©¸®Æ¼Äà ¼öÄ¡[+-]°ª ////[B] = (A * {num201}) * ((100 + [°ø°ÝÀÚ]¹öÇÁ¼º ¹°¸® Å©¸®Æ¼Äà [%]°ª) + [°ø°ÝÀÚ]¾ÆÀÌÅÛ ¹°¸® Å©¸®Æ¼ÄÃ[%]°ª) / 100) + ( [°ø°ÝÀÚ]¹öÇÁ¼º ¹°¸® Å©¸®Æ¼Äà ¼öÄ¡[+-]°ª * {num202} ) //float valueA = mExtStatus[i] + pItem->mOptPlusPhysicCritical; //float valueB = ( valueA * num201 ) * ( ( 100 + mExtStatusPer[i]) / 100 ) + ( mExtStatusPlus[i] * num202 ); //mExtStatusLast[i] = valueB; //if( mExtStatusLast[i] < 0.0f ) // mExtStatusLast[i] = 0.0f; //pPlayer->SetStatus2( (ePLAYER_STATUS_EXT)i, mExtStatusLast[i] ); }break; /// ¸¶¹ý °ø°Ý Å©¸® case ePLAYER_STATUS_EXT_MCRI: { /// ¹æ¾îÀÚ Ç׸ñ°ú °°ÀÌ °è»êÇÏ´Â ºÎºÐ¶§¹®¿¡ ¼­¹ö¿¡¼± A Ç׸ñ±îÁö¸¸ °è»êÇØµÒ!!! mExtStatusLast[i] = mExtStatus[i]; pPlayer->SetStatus2( (ePLAYER_STATUS_EXT)i, mExtStatusLast[i] ); //float num231 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 231 ); //float num232 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 232 ); //// Å©¸®Æ¼Äà ¹ß»ý È®·ü(¸¶¹ý) ////A = [°ø°ÝÀÚ] ij¸¯ÅÍ ½ºÅÈ ¸¶¹ý Å©¸®Æ¼Äà ¼öÄ¡ + [°ø°ÝÀÚ]¾ÆÀÌÅÛ ¸¶¹ý Å©¸®Æ¼Äà ¼öÄ¡[+-]°ª ////B = (A * {num231}) * ((100 + [°ø°ÝÀÚ]¹öÇÁ¼º ¸¶¹ý Å©¸®Æ¼Äà [%]°ª) + [°ø°ÝÀÚ]¾ÆÀÌÅÛ ¸¶¹ý Å©¸®Æ¼ÄÃ[%]°ª) / 100) + ( [°ø°ÝÀÚ]¹öÇÁ¼º ¸¶¹ý Å©¸®Æ¼Äà ¼öÄ¡[+-]°ª * {num232} ) //float valueA = mExtStatus[i] + pItem->mOptPlusMagicCritical; //float valueB = ( valueA * num231 ) * ( ( 100 + mExtStatusPer[i]) / 100 ) + ( mExtStatusPlus[i] * num232 ); //mExtStatusLast[i] = valueB; //if( mExtStatusLast[i] < 0.0f ) // mExtStatusLast[i] = 0.0f; //pPlayer->SetStatus2( (ePLAYER_STATUS_EXT)i, mExtStatusLast[i] ); }break; /// ÃÖ´ë HP case ePLAYER_STATUS_EXT_MAXHP: { float num20 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 20 ); /// ±âº» hp·® + ( ·¹º§ * num1 ) mExtStatus[i] = mExtStatus[i] + ( pPlayer->GetLevel() * num20 ); mExtStatusLast[i] = mExtStatus[i] * ( ( 100.0f + ( mExtStatusPer[i] + pItem->mOptPercentMaxHp ) ) / 100.0f ) + mExtStatusPlus[i] + pItem->mOptPlusMaxHp; if( mExtStatusLast[i] < 0.0f ) mExtStatusLast[i] = 0.0f; pPlayer->SetStatus2( (ePLAYER_STATUS_EXT)i, mExtStatusLast[i] ); } break; /// ÃÖ´ë MP case ePLAYER_STATUS_EXT_MAXMP: { mExtStatusLast[i] = mExtStatus[i] * ( ( 100.0f + ( mExtStatusPer[i] + pItem->mOptPercentMaxMp ) ) / 100.0f ) + mExtStatusPlus[i] + pItem->mOptPlusMaxMp; if( mExtStatusLast[i] < 1.0f ) mExtStatusLast[i] = 1.0f; pPlayer->SetStatus2( (ePLAYER_STATUS_EXT)i, mExtStatusLast[i] ); } break; /// HP ÀÚ¿¬ ȸº¹·® case ePLAYER_STATUS_EXT_RECOVHP: { float num1001 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 1001 ); float defaultValueHP = STATUSSCRIPT->GetStatusExtBaseInfo( (ePLAYER_STATUS_EXT)i, pPlayer->GetJob() ); // ij¸¯ÅÍ È¸º¹ - HP ȸº¹ // A = Ŭ·¡½º ±âº»°ª // B = ( ij¸¯ÅÍ ½ºÅÈ È¸º¹ ¼öÄ¡ * {num1001} ) * ((100 + ¾ÆÀÌÅÛ HPȸº¹ [%]°ª+ ¹öÇÁ¼º HPȸº¹ [%]°ª) / 100) + ¾ÆÀÌÅÛ HPȸº¹ [+-]°ª // A + B + ¹öÇÁ¼º HPȸº¹ [+-]°ª float valueA = defaultValueHP; float valueB = ( mExtStatus[i] * num1001 ) * (( 100.0f + pItem->mOptPercentHp + mExtStatusPer[i] ) / 100.0f ) + pItem->mOptPlusHp; mExtStatusLast[i] = valueA + valueB + mExtStatusPlus[i]; if( mExtStatusLast[i] < 0.0f ) mExtStatusLast[i] = 0.0f; pPlayer->SetStatus2( (ePLAYER_STATUS_EXT)i, mExtStatusLast[i] ); } break; /// MP ÀÚ¿¬ ȸº¹·® case ePLAYER_STATUS_EXT_RECOVMP: { float num1101 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 1101 ); float defaultValueMP = STATUSSCRIPT->GetStatusExtBaseInfo( (ePLAYER_STATUS_EXT)i, pPlayer->GetJob() ); // ij¸¯ÅÍ È¸º¹ - MP ȸº¹ // A = Ŭ·¡½º ±âº»°ª // B = ( ij¸¯ÅÍ ½ºÅÈ È¸º¹ ¼öÄ¡ * {num1101} ) * ((100 + ¾ÆÀÌÅÛ MPȸº¹ [%]°ª + ¹öÇÁ¼º MPȸº¹ [%]°ª) / 100) + ¾ÆÀÌÅÛ MPȸº¹ [+-]°ª // A + B + ¹öÇÁ¼º MPȸº¹ [+-]°ª float valueA = defaultValueMP; float valueB = ( mExtStatus[i] * num1101 ) * ( ( 100.0f + pItem->mOptPercentMp + mExtStatusPer[i] ) / 100.0f ) + pItem->mOptPlusMp; mExtStatusLast[i] = valueA + valueB + mExtStatusPlus[i]; if( mExtStatusLast[i] < 0.0f ) mExtStatusLast[i] = 0.0f; pPlayer->SetStatus2( (ePLAYER_STATUS_EXT)i, mExtStatusLast[i] ); } break; /// ¹°¸® °ø°Ý ¼º°ø case ePLAYER_STATUS_EXT_HIT: { float num101 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 101 ); float num102 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 102 ); // °ø°Ý ¼º°ø È®·ü(¹°¸®) // A = {num101} + (( [°ø°ÝÀÚ] ij¸¯ÅÍ ½ºÅÈ ¸íÁß ¼öÄ¡) * ((100 + [°ø°ÝÀÚ]¾ÆÀÌÅÛ ¸íÁß ¼öÄ¡[%]°ª + [°ø°ÝÀÚ]¹öÇÁ¼º ¸íÁß ¼öÄ¡[%]°ª) / 100) + [°ø°ÝÀÚ]¾ÆÀÌÅÛ ¸íÁß ¼öÄ¡[+-]°ª + [°ø°ÝÀÚ]¹öÇÁ¼º ¸íÁß ¼öÄ¡[+-]°ª ) * {num102} float valueA = num101 + (( mExtStatus[i] ) * (( 100.0f + pItem->mOptPercentPhysicAttackRate + mExtStatusPer[i]) / 100.0f ) + pItem->mOptPlusPhysicAttackRate + mExtStatusPlus[i] ) * num102; mExtStatusLast[i] = valueA; if( mExtStatusLast[i] < 0.0f ) mExtStatusLast[i] = 0.0f; pPlayer->SetStatus2( (ePLAYER_STATUS_EXT)i, mExtStatusLast[i] ); } break; /// ¸¶¹ý °ø°Ý ¼º°ø case ePLAYER_STATUS_EXT_MHIT: { float num131 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 131 ); float num132 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 132 ); // °ø°Ý ¼º°ø È®·ü(¸¶¹ý) // A = {num131} + (( [°ø°ÝÀÚ] ij¸¯ÅÍ ½ºÅÈ ¸¶¹ý ¸íÁß ¼öÄ¡) * ((100 + [°ø°ÝÀÚ]¾ÆÀÌÅÛ ¸¶¹ý ¸íÁß ¼öÄ¡[%]°ª + [°ø°ÝÀÚ]¹öÇÁ¼º ¸¶¹ý ¸íÁß ¼öÄ¡[%]°ª) / 100) + [°ø°ÝÀÚ]¾ÆÀÌÅÛ ¸¶¹ý ¸íÁß ¼öÄ¡[+-]°ª + [°ø°ÝÀÚ]¹öÇÁ¼º ¸¶¹ý ¸íÁß ¼öÄ¡[+-]°ª ) * {num132} float valueA = num131 + (( mExtStatus[i] ) * (( 100.0f + pItem->mOptPercentMagicAttackRate + mExtStatusPer[i] ) / 100.0f ) + pItem->mOptPlusMagicAttackRate + mExtStatusPlus[i] ) * num132; mExtStatusLast[i] = valueA; if( mExtStatusLast[i] < 0.0f ) mExtStatusLast[i] = 0.0f; pPlayer->SetStatus2( (ePLAYER_STATUS_EXT)i, mExtStatusLast[i] ); } break; /// ȸÇÇÀ² case ePLAYER_STATUS_EXT_AVOID: { float num103 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 102 ); // C = (( [¹æ¾îÀÚ] ij¸¯ÅÍ ½ºÅÈ È¸ÇÇ ¼öÄ¡) * ((100 + [¹æ¾îÀÚ]¾ÆÀÌÅÛ È¸ÇÇ ¼öÄ¡[%]°ª + [¹æ¾îÀÚ]¹öÇÁ¼º ȸÇÇ ¼öÄ¡[%]°ª ) / 100) + [¹æ¾îÀÚ]¾ÆÀÌÅÛ È¸ÇÇ ¼öÄ¡[+-]°ª + [¹æ¾îÀÚ]¹öÇÁ¼º ȸÇÇ ¼öÄ¡[+-]°ª ) * {num103} float valueC = (( mExtStatus[i] ) * (( 100.0f + pItem->mOptPercentDod + mExtStatusPer[i] ) / 100.0f ) + pItem->mOptPlusDod + mExtStatusPlus[i] ) * num103; mExtStatusLast[i] = valueC; if( mExtStatusLast[i] < 0.0f ) mExtStatusLast[i] = 0.0f; pPlayer->SetStatus2( (ePLAYER_STATUS_EXT)i, mExtStatusLast[i] ); } break; /// ¹«°Ô case ePLAYER_STATUS_EXT_WEIGHT: { mExtStatusLast[i] = mExtStatus[i] * ( ( 100.0f + ( mExtStatusPer[i] + pItem->mOptPercentWei ) ) / 100.0f ) + mExtStatusPlus[i] + pItem->mOptPlusWei; if( mExtStatusLast[i] < 0.0f ) mExtStatusLast[i] = 0.0f; pPlayer->SetStatus2( (ePLAYER_STATUS_EXT)i, mExtStatusLast[i] ); } break; /// ÀϹݰø°Ý ¼Óµµ case ePLAYER_STATUS_EXT_ASPD: { mExtStatusLast[i] = ( 100.0f + pItem->mAttackSpeed + mExtStatusPer[i] + pItem->mOptPercentAttackSpeed ) / 100.0f; if( mExtStatusLast[i] <= 0.0f ) mExtStatusLast[i] = 0.1f; if( mExtStatusLast[i] >= 2.0f ) mExtStatusLast[i] = 1.9f; pPlayer->SetStatus2( (ePLAYER_STATUS_EXT)i, mExtStatusLast[i] ); }break; /// À̵¿ ¼Óµµ °è»ê case ePLAYER_STATUS_EXT_SPD: { /// ¸ó½ºÅÍ º¯½ÅÁßÀÏ °æ¿ì À̵¿¼Óµµ ±âº»°ªÀ» ¸ó½ºÅÍ¿¡¼­ Àоî¿Â´Ù. if( pPlayer->GetChgMonsterIdx() != 0 ) { sMonsterScript* pMScript = MONSTERSCRIPT->GetMonsterListInfo( pPlayer->GetChgMonsterIdx() ); if( pMScript != NULL ) mExtStatus[i] = (float)pMScript->mActionRunSpd; mExtStatusLast[i] = mExtStatus[i] * ( ( 100.0f + mExtStatusPer[i] + pItem->mOptPercentMov ) / 100 ) + mExtStatusPlus[i] + pItem->mOptPlusMov; if( mExtStatusLast[i] < 0.0f ) mExtStatusLast[i] = 0.0f; pPlayer->SetStatus2( (ePLAYER_STATUS_EXT)i, mExtStatusLast[i] ); } else { mExtStatusLast[i] = mExtStatus[i] * ( ( 100.0f + mExtStatusPer[i] + pItem->mOptPercentMov ) / 100 ) + mExtStatusPlus[i] + pItem->mOptPlusMov; if( mExtStatusLast[i] < 0.0f ) mExtStatusLast[i] = 0.0f; pPlayer->SetStatus2( (ePLAYER_STATUS_EXT)i, mExtStatusLast[i] ); } } break; /// Èú ȸº¹·® case ePLAYER_STATUS_EXT_HEAL: { // Èú ȸº¹·® // A = ((ij¸¯ÅÍ ½ºÅÈ Èúȸº¹·® + ¾ÆÀÌÅÛ ±âº» Èú ȸº¹·®) * ((100 + ¹öÇÁ¼º Èú ȸº¹·® [%]°ª + ¾ÆÀÌÅÛ Èú ȸº¹·® [%]°ª) / 100) // + ¾ÆÀÌÅÛ Èú ȸº¹·®[+-]°ª + ¹öÇÁ¼º Èú ȸº¹·® [+-]°ª) float valueA = (( mExtStatus[ePLAYER_STATUS_EXT_HEAL] + pItem->mHealValue ) * (( 100 + mExtStatusPer[ePLAYER_STATUS_EXT_HEAL] + pItem->mOptPercentHeal ) / 100 ) + pItem->mOptPlusHeal + mExtStatusPlus[ePLAYER_STATUS_EXT_HEAL] ); mExtStatusLast[i] = valueA; if( mExtStatusLast[i] < 0.0f ) mExtStatusLast[i] = 0.0f; pPlayer->SetStatus2( ePLAYER_STATUS_EXT_HEAL, mExtStatusLast[i] ); } break; /// ¸¶¹ý ȸÇÇÀ²(ÀúÇ×·Â) case ePLAYER_STATUS_EXT_MAVOID: { float num133 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 133 ); // C = (( [¹æ¾îÀÚ] ij¸¯ÅÍ ½ºÅÈ ÀúÇ×·Â ¼öÄ¡ ) * ((100 + [¹æ¾îÀÚ]¾ÆÀÌÅÛ ÀúÇ×·Â ¼öÄ¡[%]°ª + [¹æ¾îÀÚ]¹öÇÁ¼º ÀúÇ×·Â ¼öÄ¡[%]°ª) / 100) + [¹æ¾îÀÚ]¾ÆÀÌÅÛ ÀúÇ×·Â ¼öÄ¡[+-]°ª + [¹æ¾îÀÚ]¹öÇÁ¼º ÀúÇ×·Â ¼öÄ¡[+-]°ª ) * {num133} float valueC = (( mExtStatus[i] ) * (( 100.0f + pItem->mOptPercentResistance + mExtStatusPer[i] ) / 100.0f ) + pItem->mOptPlusResistance + mExtStatusPlus[i] ) * num133; mExtStatusLast[i] = valueC; if( mExtStatusLast[i] < 0.0f ) mExtStatusLast[i] = 0.0f; pPlayer->SetStatus2( (ePLAYER_STATUS_EXT)i, mExtStatusLast[i] ); } break; /// ¹°¸® °ø°Ý Å©¸® °¨¼Ò case ePLAYER_STATUS_EXT_CRIDEF: { float num203 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 203 ); float num204 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 204 ); //D = [¹æ¾îÀÚ] ij¸¯ÅÍ ½ºÅÈ ¹°¸® ¹æÈ£ ¼öÄ¡ * {num203} //E = D * ((100 + [¹æ¾îÀÚ]¾ÆÀÌÅÛ ¹°¸® ¹æÈ£[%]°ª + [¹æ¾îÀÚ]¹öÇÁ¼º ¹°¸® ¹æÈ£ [%]°ª) / 100) // + ( ([¹æ¾îÀÚ]¾ÆÀÌÅÛ ¹°¸® ¹æÈ£ ¼öÄ¡[+-]°ª + [¹æ¾îÀÚ]¹öÇÁ¼º ¹°¸® ¹æÈ£ ¼öÄ¡[+-]°ª) * {num204} ) float valueD = mExtStatus[i] * num203; float valueE = valueD * (( 100.0f + pItem->mOptPercentPhysicCriticalDec + mExtStatusPer[i] ) / 100 ) + ( ( pItem->mOptPlusPhysicCriticalDec + mExtStatusPlus[i] ) * num204 ); mExtStatusLast[i] = valueE; if( mExtStatusLast[i] < 0.0f ) mExtStatusLast[i] = 0.0f; pPlayer->SetStatus2( (ePLAYER_STATUS_EXT)i, mExtStatusLast[i] ); } break; /// ¸¶¹ý °ø°Ý Å©¸® °¨¼Ò case ePLAYER_STATUS_EXT_MCRIDEF: { float num233 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 233 ); float num234 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 234 ); //D = [¹æ¾îÀÚ] ij¸¯ÅÍ ½ºÅÈ ¸¶¹ý ¹æÈ£ ¼öÄ¡ * {num233} //E = D * ((100 + [¹æ¾îÀÚ]¾ÆÀÌÅÛ ¸¶¹ý ¹æÈ£[%]°ª + [¹æ¾îÀÚ]¹öÇÁ¼º ¸¶¹ý ¹æÈ£ [%]°ª) / 100) // + ( ([¹æ¾îÀÚ]¾ÆÀÌÅÛ ¸¶¹ý ¹æÈ£ ¼öÄ¡[+-]°ª + [¹æ¾îÀÚ]¹öÇÁ¼º ¸¶¹ý ¹æÈ£ ¼öÄ¡[+-]°ª) * {num234} ) float valueD = mExtStatus[i] * num233; float valueE = valueD * (( 100.0f + pItem->mOptPercentMagicCriticalDec + mExtStatusPer[i] ) / 100 ) + ( ( pItem->mOptPlusMagicCriticalDec + mExtStatusPlus[i] ) * num234 ); mExtStatusLast[i] = valueE; if( mExtStatusLast[i] < 0.0f ) mExtStatusLast[i] = 0.0f; pPlayer->SetStatus2( (ePLAYER_STATUS_EXT)i, mExtStatusLast[i] ); } break; case ePLAYER_STATUS_EXT_DISTRESS: /// ¾î±×·Î Ãß°¡/°¨¼Ò case ePLAYER_STATUS_EXT_USE_MP: /// MP¼Ò¸ð·® Ãß°¡/°¨¼Ò case ePLAYER_STATUS_EXT_CASTING: /// ij½ºÆÃ ½Ã°£ Ãß°¡/°¨¼Ò case ePLAYER_STATUS_EXT_HUMAN_ATK: /// Àΰ£Çü °ø°Ý·Â case ePLAYER_STATUS_EXT_ANIMAL_ATK: /// µ¿¹°Çü °ø°Ý·Â case ePLAYER_STATUS_EXT_PLANT_ATK: /// ½Ä¹°Çü °ø°Ý·Â case ePLAYER_STATUS_EXT_BUG_ATK: /// °ïÃæÇü °ø°Ý·Â case ePLAYER_STATUS_EXT_SOUL_ATK: /// Á¤·ÉÇü °ø°Ý·Â case ePLAYER_STATUS_EXT_UNDEAD_ATK: /// ¾ðµ¥µåÇü °ø°Ý·Â case ePLAYER_STATUS_EXT_GIANT_ATK: /// °ÅÀÎÇü °ø°Ý·Â case ePLAYER_STATUS_EXT_DRAGON_ATK: /// ¿ëÇü °ø°Ý·Â case ePLAYER_STATUS_EXT_NORMAL_ATK: /// ÀÏ¹Ý ¸ó½ºÅÍ °ø°Ý·Â case ePLAYER_STATUS_EXT_VETERAN_ATK: /// Á¤¿¹ ¸ó½ºÅÍ °ø°Ý·Â case ePLAYER_STATUS_EXT_ELITE_ATK: /// ¿¤¸®Æ® ¸ó½ºÅÍ °ø°Ý·Â case ePLAYER_STATUS_EXT_BOSS_ATK: /// º¸½º ¸ó½ºÅÍ °ø°Ý·Â case ePLAYER_STATUS_EXT_CHARACTER_ATK: break; default: { mExtStatusLast[i] = mExtStatus[i] * ( ( 100.0f + mExtStatusPer[i] ) / 100.0f ) + mExtStatusPlus[i]; if( mExtStatusLast[i] < 0.0f ) mExtStatusLast[i] = 0.0f; pPlayer->SetStatus2( (ePLAYER_STATUS_EXT)i, mExtStatusLast[i] ); } break; } } if( pPlayer->GetGameIn() == true ) { pPlayer->SetStateOddity( mOddity ); /// hp¼öÄ¡¸¦ hpÃÖ´ëÄ¡·Î ³Ñ¾î°¡Áö ¾Ê°Ô ¼ÂÆÃ if( pPlayer->GetHP() > pPlayer->GetMaxHP() ) pPlayer->HPHeal( 0, true, pPlayer->GetObject(), 0, eTAKEDAMAGETYPE_NONE ); /// mp¼öÄ¡¸¦ mpÃÖ´ëÄ¡·Î ³Ñ¾î°¡Áö ¾Ê°Ô ¼ÂÆÃ if( pPlayer->GetMP() > pPlayer->GetMaxMP() ) pPlayer->MPHeal( 0, true ); if( pPlayer->GetStateDie() != true ) { if( mMaxHP != pPlayer->GetMaxHP() ) pPlayer->SendHPHeal(); if( mMaxMP != pPlayer->GetMaxMP() ) pPlayer->SendMPHeal(); } else { if( mMaxHP != pPlayer->GetMaxHP() ) pPlayer->SendMaxHP(); if( mMaxMP != pPlayer->GetMaxMP() ) pPlayer->SendMaxMP(); } /// ġƮ À̵¿¼Óµµ Áõ°¡ pPlayer->CalcCheatSpeedUp(); /// °ø°Ý¼Óµµ º¯°æ½Ã ¹ß¼Û if( pPlayer->GetStatus2()->mAttackSpeed != mAttackSpeed ) pPlayer->SendAttackSpeed(); /// À̵¿ ¼Óµµ°¡ º¯ÇѰæ¿ì Ŭ¶óÀÌ¾ðÆ®¿¡ Àü¼Û if( pPlayer->GetMoveSpeed() != mMoveSpeed ) pPlayer->SendMoveSpeed(); /// Å©±â °è»êÈÄ º¯ÇßÀ¸¸é Ŭ¶óÀÌ¾ðÆ®¿¡µµ ¾Ë¸² if( mFixedObjectSize != 0 ) { pPlayer->CalcFixedObjectSize( (short)mSizePer ); if( mFixedObjectSize != pPlayer->GetFixedObjectSize() ) pPlayer->SendPlayerSize(); } } }