#include "gamesrv.h" #include "stdafx.h" #include "InfluenceObject.h" #include "SkillManager.h" #include "SkillScript.h" #include "StatusCalc_Server.h" #include "ObjectManager.h" #include "Protocol.h" #include "Skill_Common.h" #include "Player.h" #include "Totem.h" #include "DamageCalc.h" #include "DuelManager.h" #include "Party.h" #include "PartyManager.h" #include "GridManager.h" #include "PartyUnion.h" #include "PartyUnionManager.h" #include "AppTimer.h" cInfluenceObject::cInfluenceObject() { mTime1 = 0; mTime2 = 0; mSkillIdx = 0; mSwitchType = eSWITCHTYPE_NORMAL; mParentIdx = 0; mCopyRange = 0; mCopyApplyType = eAPPLYTYPE_SELF; mAttriButeType = eATTRIBUTETYPE_PHYSICAL; mCopyCheckTime = 0; mInfluenceValue1 = 0; mInfluenceValue2 = 0; mProcessStart = true; mSendDelMsg = true; mDelStatusCalc = true; mGuardType = eINFGUARDTYPE_NONE; mLeftGuardCnt = 0; mLeftGuardValue = 0; // mIsTotem = false; mIsDelReady = false; mDistressPoint = 0; // mDieDelete = true; //mCalcTempValue1 = 0; //mCalcTempValue2 = 0; //mSkillRangeType = eRANGETYPE_CLOSE; mDotTotalTime = 0; mInfGameRestTime = 0; mInfRealEndTime = TIMER->GetRealTime(); mDotTotalTime = 0; mParentIdx = 0; mAttackerLv = 0; mAttackerDamageMin = 0; mAttackerDamageMax = 0; mHeal = 0; mDotValueAcuumTime = 0; mGuardType = eINFGUARDTYPE_NONE; } cInfluenceObject::~cInfluenceObject() { SKILLMANAGER->DelInfluenceUniqueIdx( mUniqueIdx ); } void* cInfluenceObject::operator new( size_t n ) { if( n != sizeof(cInfluenceObject) ) { assert(0); return NULL; } return SKILLMANAGER->AllocInfluenceObject(); } void cInfluenceObject::operator delete( void* ptr, size_t n ) { /// NULL Æ÷ÀÎÅÍ °Ë»ç if( ptr == 0 ) { assert(0); return; } if( n != sizeof(cInfluenceObject) ) { assert(0); return; } SKILLMANAGER->FreeInfluenceObject( static_cast(ptr) ); return; } bool cInfluenceObject::Init( sObject attacker, sObject target, unsigned long uniqueIdx, unsigned long infClassIdx, unsigned long skillClassIdx, eSWITCH_TYPE infType, unsigned long parentIdx, unsigned long dotTotalTime, unsigned long* pPlusTime ) { /// È¿°ú ½ºÅ©¸³Æ® Á¤º¸ Àоî¿È sInfluenceScript* pInfluence = SKILLSCRIPT->GetInfluenceInfo( infClassIdx ); if( !pInfluence ) { NETWORK2->PostServerEvent( "influence init - GetInfluenceInfo(%d)", infClassIdx ); return false; } cBaseObject* pTarget = OBJECTMANAGER->GetObject( target.type, target.index ); if( pTarget == NULL ) { NETWORK2->PostServerEvent( "cInfluenceObject::Init - pTarget == NULL", infClassIdx ); return false; } mUniqueIdx = uniqueIdx; mDBIdx = 0; mInfluenceClassIdx = infClassIdx; mTarget = target; mAttacker = attacker; mInfluenceCreationTime = NETWORK2->GetAccumTime(); mSkillIdx = skillClassIdx; mIsSleep = false; mGuardType = eINFGUARDTYPE_NONE; mLeftGuardCnt = 0; mLeftGuardValue = 0; mIsRealTime = pInfluence->mTimeType == eINFTIMETYPE_REAL; mInfRealEndTime = TIMER->GetRealTime(); mDotTotalTime = 0; mDotValueAcuumTime = NETWORK2->GetAccumTime() + AURAMP_CHECK_TIME;; if( pInfluence->mStatusPlusIdx1 == eSTATUSPLUS_SLEEP ) mIsSleep = true; if( pInfluence->mStatusPlusIdx2 == eSTATUSPLUS_SLEEP ) mIsSleep = true; if( pInfluence->mStatusPlusIdx3 == eSTATUSPLUS_SLEEP ) mIsSleep = true; bool timeDelay = mIsSleep; if( pInfluence->mStatusPlusIdx1 == eSTATUSPLUS_STUN ) timeDelay = true; if( pInfluence->mStatusPlusIdx2 == eSTATUSPLUS_STUN ) timeDelay = true; if( pInfluence->mStatusPlusIdx3 == eSTATUSPLUS_STUN ) timeDelay = true; /// ½ºÅ©¸³Æ®¿¡¼­ Áߺ¹À¸·Î ¼³Á¤Çß´ÂÁö üũ mGuardType = eINFGUARDTYPE_NONE; mChangeMPType = eINFCHANGEMPTYPE_NONE; mChangeMPValue = 100; unsigned short statusIdx[3] = { pInfluence->mStatusPlusIdx1, pInfluence->mStatusPlusIdx2, pInfluence->mStatusPlusIdx3 }; unsigned long statusValue[3] = { pInfluence->mValue1, pInfluence->mValue2, pInfluence->mValue3 }; for( int i = 0 ; i < 3 ; ++i ) { switch( statusIdx[i] ) { case eSTATUSPLUS_GUARDCNT_PHY: { if( mGuardType != eINFGUARDTYPE_NONE && mGuardType != eINFGUARDTYPE_PHY ) { NETWORK2->PostServerEvent("cInfluenceObject::Init mGuardType ERROR1 %d", infClassIdx ); return false; } mGuardType = eINFGUARDTYPE_PHY; mLeftGuardCnt = mLeftGuardCnt + (unsigned char)statusValue[i]; } break; case eSTATUSPLUS_GUARDVALUE_PHY: { if( mGuardType != eINFGUARDTYPE_NONE && mGuardType != eINFGUARDTYPE_PHY ) { NETWORK2->PostServerEvent("cInfluenceObject::Init mGuardType ERROR2 %d", infClassIdx ); return false; } mGuardType = eINFGUARDTYPE_PHY; mLeftGuardValue = mLeftGuardValue + (unsigned short)statusValue[i]; } break; case eSTATUSPLUS_GUARDCNT_MAG: { if( mGuardType != eINFGUARDTYPE_NONE && mGuardType != eINFGUARDTYPE_MAG ) { NETWORK2->PostServerEvent("cInfluenceObject::Init mGuardType ERROR3 %d", infClassIdx ); return false; } mGuardType = eINFGUARDTYPE_MAG; mLeftGuardCnt = mLeftGuardCnt + (unsigned char)statusValue[i]; } break; case eSTATUSPLUS_GUARDVALUE_MAG: { if( mGuardType != eINFGUARDTYPE_NONE && mGuardType != eINFGUARDTYPE_MAG ) { NETWORK2->PostServerEvent("cInfluenceObject::Init mGuardType ERROR4 %d", infClassIdx ); return false; } mGuardType = eINFGUARDTYPE_MAG; mLeftGuardValue = mLeftGuardValue + (unsigned short)statusValue[i]; } break; case eSTATUSPLUS_GUARDCNT_ALL: { if( mGuardType != eINFGUARDTYPE_NONE && mGuardType != eINFGUARDTYPE_ALL ) { NETWORK2->PostServerEvent("cInfluenceObject::Init mGuardType ERROR5 %d", infClassIdx ); return false; } mGuardType = eINFGUARDTYPE_ALL; mLeftGuardCnt = mLeftGuardCnt + (unsigned char)statusValue[i]; } break; case eSTATUSPLUS_GUARDVALUE_ALL: { if( mGuardType != eINFGUARDTYPE_NONE && mGuardType != eINFGUARDTYPE_ALL ) { NETWORK2->PostServerEvent("cInfluenceObject::Init mGuardType ERROR6 %d", infClassIdx ); return false; } mGuardType = eINFGUARDTYPE_ALL; mLeftGuardValue = mLeftGuardValue + (unsigned short)statusValue[i]; } break; case eSTATUSPLUS_GUARDMP_PHY: { mChangeMPType = eINFCHANGEMPTYPE_PHY; mChangeMPValue = (unsigned char)statusValue[i]; } break; case eSTATUSPLUS_GUARDMP_MAG: { mChangeMPType = eINFCHANGEMPTYPE_MAG; mChangeMPValue = (unsigned char)statusValue[i]; } break; case eSTATUSPLUS_GUARDMP_ALL: { mChangeMPType = eINFCHANGEMPTYPE_ALL; mChangeMPValue = (unsigned char)statusValue[i]; } break; } } for( int i = 0 ; i < 3 ; ++i ) { switch( statusIdx[i] ) { case eSTATUSPLUS_CASHEXPGUARDCNT: { if( mGuardType != eINFGUARDTYPE_NONE || mChangeMPType != eINFCHANGEMPTYPE_NONE ) { NETWORK2->PostServerEvent("cInfluenceObject::Init eSTATUSPLUS_CASHEXPGUARDCNT %d", infClassIdx ); return false; } mGuardType = eINFGUARDTYPE_CASHEXP; mLeftGuardCnt = (unsigned char)statusValue[i]; } } } switch( mGuardType ) { case eINFGUARDTYPE_CASHEXP: if( mLeftGuardCnt == 0 ) { NETWORK2->PostServerEvent("cInfluenceObject::Init %d != eINFGUARDTYPE_NONE && ( %d == 0 || %d == 0 ) %d", mGuardType, mLeftGuardCnt, mLeftGuardValue, infClassIdx ); return false; } break; case eINFGUARDTYPE_NONE: break; default: if( mLeftGuardCnt == 0 || mLeftGuardValue == 0 ) { NETWORK2->PostServerEvent("cInfluenceObject::Init %d != eINFGUARDTYPE_NONE && ( %d == 0 || %d == 0 ) %d", mGuardType, mLeftGuardCnt, mLeftGuardValue, infClassIdx ); return false; } break; } mSwitchType = infType; switch( mSwitchType ) { case eSWITCHTYPE_NORMAL: { /// È¿°ú ½Ã°£ÀÌ -1ÀÌ¸é ¿À¶óÈ¿°ú´Ù if( pInfluence->mContinuanceTime == -1 ) { mSwitchType = eSWITCHTYPE_PARENT; } else /// ÀÏ¹Ý È¿°ú ¼³Á¤ { if( mIsRealTime == true ) { mInfRealEndTime = TIMER->GetRealPlusTime( pInfluence->mContinuanceTime ); } else { mInfRealEndTime = TIMER->GetRealTime(); /// plusTimeÀ» Àû¿ë½Ã۰í Àû¿ëµÈ °ªÀ»¸®ÅÏÇØ ±×°ª¸¸Å­ Ŭ¶óÀÌ¾ðÆ®¿¡°Ô ¾Ë·Á Áö¿¬½ÃŲ´Ù. long plusTime = 0; if( pPlusTime != NULL ) { if( timeDelay == true ) plusTime = *pPlusTime; else *pPlusTime = 0; } mInfGameRestTime = pInfluence->mContinuanceTime + plusTime; } mDotTotalTime = pInfluence->mContinuanceTime; } } break; case eSWITCHTYPE_PARENT: { /// ½ºÅ³ ½ºÅ©¸³Æ®¿¡¼­ ÇÊ¿äÇÑ ¼öÄ¡¸¦ ¾ò¾î ±â·ÏÇÑ´Ù. sPlayerSkillBaseInfo* pSkillInfo = SKILLSCRIPT->GetPlayerSkillInfo( mSkillIdx ); if( pSkillInfo != NULL ) { cHaveSkillObject* pPlayerHaveSkill = SKILLMANAGER->GetPlayerHaveSkill( mAttacker.index, mSkillIdx ); if( pPlayerHaveSkill ) { unsigned char skillStep = pPlayerHaveSkill->GetSkillStep(); if( skillStep < pSkillInfo->mStepCount ) { sPlayerSkillStepInfo* pStepInfo = &pSkillInfo->mpSetpInfoArray[skillStep]; mCopyRange = pStepInfo->mBoundDist1; mCopyApplyType = pSkillInfo->mApplyType; } } else { sPlayerSkillStepInfo* pStepInfo = &pSkillInfo->mpSetpInfoArray[0]; mCopyRange = pStepInfo->mBoundDist1; mCopyApplyType = pSkillInfo->mApplyType; } } } break; case eSWITCHTYPE_CHILD: { mParentIdx = parentIdx; /// ½ºÅ³ ½ºÅ©¸³Æ®¿¡¼­ ÇÊ¿äÇÑ ¼öÄ¡¸¦ ¾ò¾î ±â·ÏÇÑ´Ù. sPlayerSkillBaseInfo* pSkillInfo = SKILLSCRIPT->GetPlayerSkillInfo( mSkillIdx ); if( pSkillInfo != NULL ) { mCopyApplyType = pSkillInfo->mApplyType; } } break; case eSWITCHTYPE_TOTEM: { mDotTotalTime = dotTotalTime; mParentIdx = parentIdx; } break; } bool isCalcDamage = false; bool isCalcHeal = false; if( pInfluence->mTime1 != 0 ) { /// Áö¼Ó ÀûÀ¸·Î È¿°úÀû¿ë(µ¥¹ÌÁö) Àΰæ¿ì ´ÙÀ½ Àû¿ë ½Ã°£ °è»ê mTime1 = mInfluenceCreationTime + pInfluence->mTime1; /// °ø°ÝÀÚÀÇ µ¥¹ÌÁö/Èú °è»êÀÌ ÇÊ¿äÇÑ ±âº»Ç׸ñÀ» ÀúÀåÇØµÑÁö üũÇÑ´Ù. mInfluenceValue1 = pInfluence->mValue1; /// °è»ê½ÄÀ» »ç¿ëÇÏ´Â Ç׸ñ¸¸ mInfluenceValue1°ªÀ» ´Ù½Ã ¼³Á¤ ÇØÁØ´Ù. switch( pInfluence->mStatusPlusIdx1 ) { case eSTATUSPLUS_DOT_HPCHANGE_CALC_PLUS: /// Áö¼Ó HP Èú/µ¥¹ÌÁö (°è»ê½Ä»ç¿ë) { /// ¿À¶ó½ºÅ³ »ç¿ë ºÒ°¡ if( mDotTotalTime == -1 ) { NETWORK2->PostServerEvent("cInfluenceObject::Init mGuardType mDotTotalTime1 == -1 %d", infClassIdx ); return false; } if( pInfluence->mValue1 > 0 ) { isCalcHeal = true; //mCalcTempValue1 = DAMAGECALC->HealDotCalc( attacker, target, pInfluence->mValue1, true, mDotTotalTime / pInfluence->mValue1); } else if( pInfluence->mValue1 < 0 ) { isCalcDamage = true; /*mCalcTempValue1 = DAMAGECALC->DamageDotCalc( attacker, target, pInfluence->mValue1 * -1, skillClassIdx, mAttriButeType, mSkillRangeType, mDotTotalTime / pInfluence->mValue1 ); mCalcTempValue1 = mCalcTempValue1 * -1;*/ } } break; case eSTATUSPLUS_DOT_MPCHANGE_CALC_PLUS: /// Áö¼Ó MP Èú/µ¥¹ÌÁö (°è»ê½Ä»ç¿ë) { /// ¿À¶ó½ºÅ³ »ç¿ë ºÒ°¡ if( mDotTotalTime == -1 ) { NETWORK2->PostServerEvent("cInfluenceObject::Init mGuardType mDotTotalTime2 == -1 %d", infClassIdx ); return false; } if( pInfluence->mValue1 > 0 ) { isCalcHeal = true; //mCalcTempValue1 = DAMAGECALC->HealDotCalc( attacker, target, pInfluence->mValue1, false, mDotTotalTime / pInfluence->mValue1 ); } else if( pInfluence->mValue1 < 0 ) { isCalcDamage = true; //mCalcTempValue1 = DAMAGECALC->DamageDotCalc( attacker, target, pInfluence->mValue1 * -1, skillClassIdx, // mAttriButeType, mSkillRangeType, mDotTotalTime / pInfluence->mValue1 ); //mCalcTempValue1 = mCalcTempValue1 * -1; } } break; case eSTATUSPLUS_DOT_HPCHANGE_PER: mInfluenceValue1 = FloatToInt( (float)pTarget->GetMaxHP() * pInfluence->mValue1 * 0.01f ); break; case eSTATUSPLUS_DOT_MPCHANGE_PER: mInfluenceValue1 = FloatToInt( (float)pTarget->GetMaxMP() * pInfluence->mValue1 * 0.01f ); break; } } /// Áö¼Ó ÀûÀ¸·Î È¿°úÀû¿ë(µ¥¹ÌÁö) Àΰæ¿ì ´ÙÀ½ Àû¿ë ½Ã°£ °è»ê if( pInfluence->mTime2 != 0 ) { mTime2 = mInfluenceCreationTime + pInfluence->mTime2; /// È¿°ú ¹øÈ£¿¡ Èúµ¥¹ÌÁö °è»ê °ø½ÄÀÌ ÀÖÀ¸¸é ¹Ì¸® °è»êÇØ¼­ °á°ú¸¸ °¡Áö°í Àִ´٠/// ¡Ø Àû¿ë´ç½Ã °ø°ÝÀÚ °´Ã¼°¡ »ç¶óÁ® °è»êÀÌ ºÒ°¡´ÉÇÏ°Ô µÇ´Â °æ¿ì¸¦ ¸·À½ mInfluenceValue2 = pInfluence->mValue2; /// °è»ê½ÄÀ» »ç¿ëÇÏ´Â Ç׸ñ¸¸ mInfluenceValue2°ªÀ» ´Ù½Ã ¼³Á¤ ÇØÁØ´Ù. switch( pInfluence->mStatusPlusIdx2 ) { case eSTATUSPLUS_DOT_HPCHANGE_CALC_PLUS: /// Áö¼Ó HP Èú/µ¥¹ÌÁö (°è»ê½Ä»ç¿ë) { /// ¿À¶ó½ºÅ³ »ç¿ë ºÒ°¡ if( mDotTotalTime == -1 ) { NETWORK2->PostServerEvent("cInfluenceObject::Init mGuardType mDotTotalTime3 == -1 %d", infClassIdx ); return false; } if( pInfluence->mValue2 > 0 ) { isCalcHeal = true; //mCalcTempValue2 = DAMAGECALC->HealDotCalc( attacker, target, pInfluence->mValue2, true, mDotTotalTime / pInfluence->mValue2 ); } else if( pInfluence->mValue2 < 0 ) { isCalcDamage = true; //mCalcTempValue2 = DAMAGECALC->DamageDotCalc( attacker, target, pInfluence->mValue2 * -1, skillClassIdx, // mAttriButeType, mSkillRangeType, mDotTotalTime / pInfluence->mValue2 ); //mCalcTempValue2 = mCalcTempValue2 * -1; } } break; case eSTATUSPLUS_DOT_MPCHANGE_CALC_PLUS: /// Áö¼Ó MP Èú/µ¥¹ÌÁö (°è»ê½Ä»ç¿ë) { /// ¿À¶ó½ºÅ³ »ç¿ë ºÒ°¡ if( mDotTotalTime == -1 ) { NETWORK2->PostServerEvent("cInfluenceObject::Init mGuardType mDotTotalTime4 == -1 %d", infClassIdx ); return false; } if( pInfluence->mValue2 > 0 ) { isCalcHeal = true; //mCalcTempValue2 = DAMAGECALC->HealDotCalc( attacker, target, pInfluence->mValue2, false, mDotTotalTime / pInfluence->mValue2 ); } else if( pInfluence->mValue2 < 0 ) { isCalcDamage = true; //mCalcTempValue2 = DAMAGECALC->DamageDotCalc( attacker, target, pInfluence->mValue2 * -1, skillClassIdx, // mAttriButeType, mSkillRangeType, mDotTotalTime / pInfluence->mValue2 ); //mCalcTempValue2 = mCalcTempValue2 * -1; } } break; case eSTATUSPLUS_DOT_HPCHANGE_PER: mInfluenceValue2 = FloatToInt( (float)pTarget->GetMaxHP() * pInfluence->mValue2 * 0.01f ); break; case eSTATUSPLUS_DOT_MPCHANGE_PER: mInfluenceValue2 = FloatToInt( (float)pTarget->GetMaxMP() * pInfluence->mValue2 * 0.01f ); break; } } /// °ø°ÝÀÚÀÇ °ø°Ý·ÂÀ» °è»êÇØ¼­ ÀúÀåÇØµÐ´Ù. if( isCalcDamage == true ) { switch( attacker.type ) { case eOBJECTTYPE_PLAYER: { /// ½ºÅ³ ½ºÅ©¸³Æ®¿¡¼­ ÇÊ¿äÇÑ ¼öÄ¡¸¦ ¾ò¾î ±â·ÏÇÑ´Ù. sPlayerSkillBaseInfo* pSkillInfo = SKILLSCRIPT->GetPlayerSkillInfo( mSkillIdx ); if( pSkillInfo != NULL ) { cHaveSkillObject* pPlayerHaveSkill = SKILLMANAGER->GetPlayerHaveSkill( mAttacker.index, mSkillIdx ); if( pPlayerHaveSkill ) { unsigned char skillStep = pPlayerHaveSkill->GetSkillStep(); if( skillStep < pSkillInfo->mStepCount ) { sPlayerSkillStepInfo* pStepInfo = &pSkillInfo->mpSetpInfoArray[skillStep]; /// ½ºÅ³ ¾î±×·Î ¼öÄ¡ mDistressPoint = pStepInfo->mDistressValue; //mAttriButeType = pSkillInfo->mAttributeType; //skillRangeType = pSkillInfo->mRangeType; } } else { sPlayerSkillStepInfo* pStepInfo = &pSkillInfo->mpSetpInfoArray[0]; if( pStepInfo == NULL ) { assert(0); NETWORK2->PostServerEvent("cInfluenceObject::Init pStepInfo == NULL [%d,%d]", mAttacker.index, mSkillIdx ); mDistressPoint = 0; } else { /// ½ºÅ³ ¾î±×·Î ¼öÄ¡ mDistressPoint = pStepInfo->mDistressValue; //mAttriButeType = pSkillInfo->mAttributeType; //skillRangeType = pSkillInfo->mRangeType; } } } cPlayer* pAttacker = OBJECTMANAGER->GetPlayer( attacker.index ); if( pAttacker == NULL ) { NETWORK2->PostServerEvent("cInfluenceObject::Init eOBJECTTYPE_PLAYER pAttacker == NULL [%d,%d,%d]", infClassIdx, skillClassIdx, infType ); return false; } mAttackerLv = pAttacker->GetLevel(); switch( pInfluence->mDotType ) { case eDOTTYPE_PHYSICALCLOSE: { mAttackerDamageMin = FloatToInt( pAttacker->GetStatus2()->mPhysicMinAttack ); mAttackerDamageMax = FloatToInt( pAttacker->GetStatus2()->mPhysicMaxAttack ); } break; case eDOTTYPE_PHYSICALRANGE: { mAttackerDamageMin = FloatToInt( pAttacker->GetStatus2()->mPhysicMinRangeAttack ); mAttackerDamageMax = FloatToInt( pAttacker->GetStatus2()->mPhysicMaxRangeAttack ); } break; case eDOTTYPE_MAGIC: { mAttackerDamageMin = FloatToInt( pAttacker->GetStatus2()->mMagicMinAttack ); mAttackerDamageMax = FloatToInt( pAttacker->GetStatus2()->mMagicMaxAttack ); } break; default: NETWORK2->PostServerEvent("cInfluenceObject::Init eOBJECTTYPE_PLAYER pInfluence->mDotType ERROR [%d,%d,%d,%d]", infClassIdx, skillClassIdx, infType, pInfluence->mDotType ); return false; } } break; case eOBJECTTYPE_MONSTER: { cMonster* pAttacker = OBJECTMANAGER->GetMonster( attacker.index ); if( pAttacker == NULL ) { NETWORK2->PostServerEvent("cInfluenceObject::Init eOBJECTTYPE_MONSTER pAttacker == NULL [%d,%d,%d]", infClassIdx, skillClassIdx, infType ); return false; } mAttackerLv = pAttacker->GetLevel(); sMonsterSkillScript* pSkillInfo = SKILLSCRIPT->GetMonsterSkillInfo( pAttacker->GetRaceGender(), (eMONSTERATTACK_TYPE)skillClassIdx ); if( pSkillInfo == NULL ) { NETWORK2->PostServerEvent("cInfluenceObject::Init eOBJECTTYPE_MONSTER pSkillInfo == NULL [%d,%d,%d]", infClassIdx, skillClassIdx, infType ); return false; } switch( pInfluence->mDotType ) { case eDOTTYPE_PHYSICALCLOSE: { mAttackerDamageMin = pAttacker->CalcPhysicAttack( pSkillInfo->mMinAttackValue ); mAttackerDamageMax = pAttacker->CalcPhysicAttack( pSkillInfo->mMaxAttackValue ); } break; case eDOTTYPE_PHYSICALRANGE: { mAttackerDamageMin = pAttacker->CalcPhysicRangeAttack( pSkillInfo->mMinAttackValue ); mAttackerDamageMax = pAttacker->CalcPhysicRangeAttack( pSkillInfo->mMaxAttackValue ); } break; case eDOTTYPE_MAGIC: { mAttackerDamageMin = pAttacker->CalcMagicAttack( pSkillInfo->mMinAttackValue ); mAttackerDamageMax = pAttacker->CalcMagicAttack( pSkillInfo->mMaxAttackValue ); } break; default: NETWORK2->PostServerEvent("cInfluenceObject::Init eOBJECTTYPE_MONSTER pInfluence->mDotType ERROR [%d,%d,%d,%d]", infClassIdx, skillClassIdx, infType, pInfluence->mDotType ); return false; } } break; default: NETWORK2->PostServerEvent("cInfluenceObject::Init isCalcDamage == true attacker.type ERROR [%d,%d,%d,%d]", attacker.type, infClassIdx, skillClassIdx, infType ); return false; } } /// °ø°ÝÀÚÀÇ Èú¼öÄ¡¸¦ °è»êÇØ¼­ ÀúÀåÇØµÐ´Ù. if( isCalcHeal == true ) { if( attacker.type == eOBJECTTYPE_PLAYER && target.type == eOBJECTTYPE_PLAYER ) { cPlayer* pAttacker = OBJECTMANAGER->GetPlayer( attacker.index ); if( pAttacker == NULL ) { NETWORK2->PostServerEvent("cInfluenceObject::Init isCalcHeal == true eOBJECTTYPE_PLAYER pAttacker == NULL [%d,%d,%d]", infClassIdx, skillClassIdx, infType ); return false; } mAttackerLv = pAttacker->GetLevel(); mHeal = FloatToInt( pAttacker->GetStatus2()->mHeal ); } else { NETWORK2->PostServerEvent("cInfluenceObject::Init isCalcHeal == true attacker.type ERROR [%d,%d,%d,%d]", attacker.type, infClassIdx, skillClassIdx, infType ); return false; } } return true; } bool cInfluenceObject::RestorePlayerInfluence( unsigned long playerIdx, unsigned long uniqueidx, sInfluence* pInfluence ) { mUniqueIdx = uniqueidx; mDBIdx = pInfluence->mDbIdx; mInfluenceClassIdx = pInfluence->mInfluenceClassIdx; /// ¿À¶ó´Â DB¿¡ ÀúÀå µÇ¾îÀÖÁö ¾ÊÀ½ mSkillIdx = 0; sInfluenceScript* pPlayerInfluence = SKILLSCRIPT->GetInfluenceInfo( mInfluenceClassIdx ); if( !pPlayerInfluence ) { assert(NULL); NETWORK2->PostServerEvent("cInfluenceObject::RestorePlayerInfluence - pPlayer[%d]Influence[%d] == NULL", playerIdx, mInfluenceClassIdx ); return false; } mTarget.index = playerIdx; mTarget.type = eOBJECTTYPE_PLAYER; mAttacker = pInfluence->mAttacker; /// DB¿¡¼­ Àоî¿Â È¿°ú´Â Ŭ¶óÀÌ¾ðÆ® gamein ¸Þ¼¼Áö°¡ ¿À´Â ½ÃÁ¡ÀÌ È¿°ú »ý¼º ½ÃÁ¡ÀÌ´Ù. mInfluenceCreationTime = NETWORK2->GetAccumTime(); mIsRealTime = pInfluence->mIsRealTime; mInfRealEndTime = pInfluence->mEndDate; mTime1 = 0; mTime2 = 0; if( pPlayerInfluence->mContinuanceTime == -1 ) { mInfGameRestTime = 0; mSwitchType = eSWITCHTYPE_PARENT; } else { mInfGameRestTime = pInfluence->mRestTime;// * SECOND_THOUSAND; } /// Áö¼Ó ÀûÀ¸·Î È¿°úÀû¿ë(µ¥¹ÌÁö) Àΰæ¿ì ´ÙÀ½ Àû¿ë ½Ã°£ °è»ê if( pInfluence->mTime1 != 0 ) { mTime1 = mInfluenceCreationTime + pInfluence->mTime1; mInfluenceValue1 = pInfluence->mInfluenceValue1; } /// Áö¼Ó ÀûÀ¸·Î È¿°úÀû¿ë(µ¥¹ÌÁö) Àΰæ¿ì ´ÙÀ½ Àû¿ë ½Ã°£ °è»ê if( pInfluence->mTime2 != 0 ) { mTime2 = mInfluenceCreationTime + pInfluence->mTime2; mInfluenceValue2 = pInfluence->mInfluenceValue2; } mDotTotalTime = pPlayerInfluence->mContinuanceTime; mParentIdx = 0; mCopyRange = 0; mCopyCheckTime = 0; mCopyApplyType = eAPPLYTYPE_SELF; mSkillIdx = 0; mIsSleep = false; if( pPlayerInfluence->mStatusPlusIdx1 == eSTATUSPLUS_SLEEP ) mIsSleep = true; if( pPlayerInfluence->mStatusPlusIdx2 == eSTATUSPLUS_SLEEP ) mIsSleep = true; if( pPlayerInfluence->mStatusPlusIdx3 == eSTATUSPLUS_SLEEP ) mIsSleep = true; mAttackerLv = pInfluence->mAttackerLv; mAttackerDamageMin = pInfluence->mAttackerDamageMin; mAttackerDamageMax = pInfluence->mAttackerDamageMax; mHeal = pInfluence->mHeal; mLeftGuardCnt = pInfluence->mLeftGuardCnt; mLeftGuardValue = pInfluence->mLeftGuardValue; /// ½ºÅ©¸³Æ®¿¡¼­ Áߺ¹À¸·Î ¼³Á¤Çß´ÂÁö üũ mGuardType = eINFGUARDTYPE_NONE; mChangeMPType = eINFCHANGEMPTYPE_NONE; unsigned short statusIdx[3] = { pPlayerInfluence->mStatusPlusIdx1, pPlayerInfluence->mStatusPlusIdx2, pPlayerInfluence->mStatusPlusIdx3 }; for( int i = 0 ; i < 3 ; ++i ) { switch( statusIdx[i] ) { case eSTATUSPLUS_GUARDCNT_PHY: { if( mGuardType != eINFGUARDTYPE_NONE && mGuardType != eINFGUARDTYPE_PHY ) return false; mGuardType = eINFGUARDTYPE_PHY; } break; case eSTATUSPLUS_GUARDVALUE_PHY: { if( mGuardType != eINFGUARDTYPE_NONE && mGuardType != eINFGUARDTYPE_PHY ) return false; mGuardType = eINFGUARDTYPE_PHY; } break; case eSTATUSPLUS_GUARDCNT_MAG: { if( mGuardType != eINFGUARDTYPE_NONE && mGuardType != eINFGUARDTYPE_MAG ) return false; mGuardType = eINFGUARDTYPE_MAG; } break; case eSTATUSPLUS_GUARDVALUE_MAG: { if( mGuardType != eINFGUARDTYPE_NONE && mGuardType != eINFGUARDTYPE_MAG ) return false; mGuardType = eINFGUARDTYPE_MAG; } break; case eSTATUSPLUS_GUARDCNT_ALL: { if( mGuardType != eINFGUARDTYPE_NONE && mGuardType != eINFGUARDTYPE_ALL ) return false; mGuardType = eINFGUARDTYPE_ALL; } break; case eSTATUSPLUS_GUARDVALUE_ALL: { if( mGuardType != eINFGUARDTYPE_NONE && mGuardType != eINFGUARDTYPE_ALL ) return false; mGuardType = eINFGUARDTYPE_ALL; } break; case eSTATUSPLUS_CASHEXPGUARDCNT: { if( mGuardType != eINFGUARDTYPE_NONE && mGuardType != eINFGUARDTYPE_ALL ) return false; mGuardType = eINFGUARDTYPE_CASHEXP; } break; case eSTATUSPLUS_GUARDMP_PHY: { mChangeMPType = eINFCHANGEMPTYPE_PHY; } break; case eSTATUSPLUS_GUARDMP_MAG: { mChangeMPType = eINFCHANGEMPTYPE_MAG; } break; case eSTATUSPLUS_GUARDMP_ALL: { mChangeMPType = eINFCHANGEMPTYPE_ALL; } break; } } switch( mGuardType ) { case eINFGUARDTYPE_CASHEXP: if( mLeftGuardCnt == 0 ) return false; break; case eINFGUARDTYPE_NONE: break; default: if( mLeftGuardCnt == 0 || mLeftGuardValue == 0 ) return false; break; } /// db¿¡¼­ ÀоîµéÀÎ ÀÚ·á´Â gamein ¸Þ¼¼Áö°¡ ¿À±âÀü±îÁö ÇÁ·Î¼¼½º¸¦ ÇÏÁö ¾Ê´Â´Ù. ProcessStop(); return true; } void cInfluenceObject::ProcessStart() { mInfluenceCreationTime = NETWORK2->GetAccumTime(); mProcessStart = true; sInfluenceScript* pInfluence = SKILLSCRIPT->GetInfluenceInfo( mInfluenceClassIdx ); if( pInfluence != NULL ) { if( pInfluence->mTime1 != 0 ) mTime1 = mInfluenceCreationTime + pInfluence->mTime1; if( pInfluence->mTime2 != 0 ) mTime2 = mInfluenceCreationTime + pInfluence->mTime2; } } void cInfluenceObject::ProcessStop() { if( mSwitchType == eSWITCHTYPE_NORMAL ) { unsigned long accum = NETWORK2->GetAccumTime(); if( mIsRealTime == false ) { if( accum - mInfluenceCreationTime >= mInfGameRestTime ) mInfGameRestTime = 0; else mInfGameRestTime = mInfGameRestTime - (accum - mInfluenceCreationTime); } } mProcessStart = false; } bool cInfluenceObject::SetAllocDbIdx( unsigned long dbIdx ) { if( mDBIdx != 0 ) return false; mDBIdx = dbIdx; return true; } unsigned char cInfluenceObject::GetDeleteType() { sInfluenceScript* pInf = SKILLSCRIPT->GetInfluenceInfo( mInfluenceClassIdx ); if( pInf == NULL ) { NETWORK2->PostServerEvent( "cInfluenceObject::GetDieDelete pInf[%d] == NULL", mInfluenceClassIdx ); return true; } return pInf->mDeleteType; } bool cInfluenceObject::IsSavePlayerInfluence( bool onlyCash ) { /// pc¹æ ¹öÇÁ ÀúÀå¾ÈÇÔ sInfluenceScript* pScript = SKILLSCRIPT->GetInfluenceInfo( mInfluenceClassIdx ); if( pScript == NULL ) return false; if( pScript->mType == eINFLUENCETYPE_PC ) return false; if( onlyCash == true ) { if( pScript->mType == eINFLUENCETYPE_CASH && mDBIdx != 0 ) return true; else return false; } /// ¼öÀåÈ¿°ú if( PVP_DM_LEADER_INFLUENCE == mInfluenceClassIdx ) return false; if( PVP_DM_LEADER_INFLUENCE2 == mInfluenceClassIdx ) return false; if( PVP_DM2_FLAG_INFLUENCE == mInfluenceClassIdx ) return false; if( PVP_DM_NODAMAGE_INFLUENCE == mInfluenceClassIdx ) return false; if( PVP_DM_WAIT_NODAMAGE_INFLUENCE == mInfluenceClassIdx ) return false; /// ¿À¶óÈ¿°ú, ¿À¶ó¿¡ º¹»çµÈ È¿°ú - ij½Ã¹öÇÁ´Â ÀúÀå if( mSwitchType != eSWITCHTYPE_NORMAL && pScript->mType != eINFLUENCETYPE_CASH ) return false; if( pScript->mType == eINFLUENCETYPE_CASH ) return true; if( mDBIdx != 0 ) return true; /// »èÁ¦ ´ë±â»óÅ ȿ°ú if( mIsDelReady == true ) return false; return true; } void cInfluenceObject::SavePlayerInfluence( sInfluence* pInfluence ) { sInfluenceScript* pPlayerInfluence = SKILLSCRIPT->GetInfluenceInfo( mInfluenceClassIdx ); if( !pPlayerInfluence ) { assert(NULL); NETWORK2->PostServerEvent( "db Influence save - GetInfluenceInfo( %d )", mInfluenceClassIdx ); return; } unsigned long currenttime = NETWORK2->GetAccumTime(); pInfluence->mDbIdx = mDBIdx; pInfluence->mUniqueIdx = mUniqueIdx; pInfluence->mInfluenceClassIdx = mInfluenceClassIdx; pInfluence->mAttacker = mAttacker; pInfluence->mIsRealTime = mIsRealTime; if( mProcessStart == false ) { pInfluence->mRestTime = mInfGameRestTime; } else { if( pPlayerInfluence->mType == eINFLUENCETYPE_CASH && mSwitchType != eSWITCHTYPE_NORMAL ) { pInfluence->mRestTime = 0; if( pPlayerInfluence->mContinuanceTime > 0 ) { if( currenttime - mInfluenceCreationTime >= mInfGameRestTime ) { pInfluence->mRestTime = 0; if( currenttime >= mInfluenceCreationTime + mInfGameRestTime ) { } else { pInfluence->mRestTime = mInfluenceCreationTime + mInfGameRestTime - currenttime; } } else pInfluence->mRestTime = mInfGameRestTime - (currenttime-mInfluenceCreationTime); } } else if( currenttime - mInfluenceCreationTime >= mInfGameRestTime ) { pInfluence->mRestTime = 0; if( currenttime >= mInfluenceCreationTime + mInfGameRestTime ) { } else { pInfluence->mRestTime = mInfluenceCreationTime + mInfGameRestTime - currenttime; } } else pInfluence->mRestTime = mInfGameRestTime - (currenttime-mInfluenceCreationTime); } pInfluence->mEndDate = mInfRealEndTime; if( pPlayerInfluence->mTime1 != 0.0f ) pInfluence->mTime1 = mTime1 - currenttime; else pInfluence->mTime1 = 0; if( pPlayerInfluence->mTime2 != 0.0f ) pInfluence->mTime2 = mTime2 - currenttime; else pInfluence->mTime2 = 0; pInfluence->mInfluenceValue1 = mInfluenceValue1; pInfluence->mInfluenceValue2 = mInfluenceValue2; pInfluence->mAttriButeType = (unsigned char)mAttriButeType; pInfluence->mAttackerLv = mAttackerLv; pInfluence->mAttackerDamageMin = mAttackerDamageMin; pInfluence->mAttackerDamageMax = mAttackerDamageMax; pInfluence->mHeal = mHeal; pInfluence->mLeftGuardCnt = mLeftGuardCnt; pInfluence->mLeftGuardValue = mLeftGuardValue; } bool cInfluenceObject::Process( unsigned long /*elapsedTime*/, unsigned long accumTime ) { if( mIsDelReady == true ) return true; if( !mProcessStart ) return true; sInfluenceScript* pInfluence = SKILLSCRIPT->GetInfluenceInfo( mInfluenceClassIdx ); if( pInfluence == NULL ) return false; cBaseObject* pTarget = OBJECTMANAGER->GetObject( mTarget.type, mTarget.index ); if( pTarget == NULL || ( pTarget->GetStateDie() == true && pInfluence->mDeleteType != eDELETETYPE_NODELETE_PLAYER_DIE ) ) return false; unsigned long scriptTime1 = pInfluence->mTime1; unsigned long scriptTime2 = pInfluence->mTime2; /// ÀÚ½ÅÀÌ °Ç¿À¶ó°¡ Àڽſ¡°Ô´Â Àû¿ë ¾ÈµÇ´Â °æ¿ì üũ if( ( mSwitchType == eSWITCHTYPE_PARENT && mCopyApplyType == eAPPLYTYPE_ENEMY ) == false ) { if( mTime1 != 0 && mTime1 <= accumTime ) { mTime1 = mTime1 + scriptTime1; /// Áö¼Ó È¿°ú ó¸® DotInfluence( (eSTATUS_PLUS)pInfluence->mStatusPlusIdx1, mInfluenceValue1, mDotTotalTime, scriptTime1 ); } if( mTime2 != 0 && mTime2 <= accumTime ) { mTime2 = mTime2 + scriptTime2; /// Áö¼Ó È¿°ú ó¸® DotInfluence( (eSTATUS_PLUS)pInfluence->mStatusPlusIdx2, mInfluenceValue2, mDotTotalTime, scriptTime2 ); } } /// È¿°ú »ýÁ¸½Ã°£ ³¡³­ °æ¿ì if( mIsRealTime == false && mSwitchType == eSWITCHTYPE_NORMAL && mInfluenceCreationTime + mInfGameRestTime <= accumTime ) return false; if( mIsRealTime == true && mSwitchType == eSWITCHTYPE_NORMAL && TIMER->DiffRealTime( mInfRealEndTime ) <= 0 ) return false; /// È¿°ú°¡ ¿À¶ó Àΰæ¿ì ¹üÀ§¾È¿¡ µé¾î¿Â Ÿ°Ù¿¡°Ô È¿°ú º¹»ç if( mSwitchType == eSWITCHTYPE_PARENT ) { if( mCopyCheckTime <= accumTime ) { CopyAuraInfluence(); mCopyCheckTime = accumTime + AURA_CHECK_TIME; } // ÀÏÁ¤ ½Ã°£¸¶´Ù üũ if( mDotValueAcuumTime <= accumTime ) { switch( pInfluence->mDotType ) { case eDOTTYPE_MPPLUS: /// Áö¼Ó MP¼Ò¸ð(+) { pTarget->MPUse( pInfluence->mDotValue, true ); if( pTarget->GetMP() <= 0 ) return false; } break; case eDOTTYPE_MPPER: /// Áö¼Ó MP¼Ò¸ð(%) { long dotValue = (long)(pTarget->GetOriMPMax() * pInfluence->mDotValue / 100); pTarget->MPUse( dotValue, true ); if( pTarget->GetMP() <= 0 ) return false; } break; case eDOTTYPE_HPPLUS: /// Áö¼Ó HP¼Ò¸ð(+) { pTarget->HPUse( pInfluence->mDotValue, true ); if( pTarget->GetHP() <= 0 ) return false; } break; case eDOTTYPE_HPPER: /// Áö¼Ó HP¼Ò¸ð(%) { long dotValue = (long)(pTarget->GetOriHPMax() * pInfluence->mDotValue / 100); pTarget->HPUse( dotValue, true ); if( pTarget->GetHP() <= 0 ) return false; } break; } mDotValueAcuumTime = accumTime + AURAMP_CHECK_TIME; } } /// ÀÚ½Ä È¿°ú Àΰæ¿ì È¿°ú Á¦°Å üũ else if ( mSwitchType == eSWITCHTYPE_TOTEM ) { /// ºÎ¸ðÈ¿°úÀ¯¹«¿Í °Å¸® üũ if( mCopyCheckTime <= accumTime ) { cBaseObject* pTarget = OBJECTMANAGER->GetObject( mTarget.type, mTarget.index ); if( pTarget == NULL ) { CheckTotemInfluence(); return false; } if( CheckTotemInfluence() == true ) return false; mCopyCheckTime = accumTime + AURA_CHECK_TIME; } } else if ( mSwitchType == eSWITCHTYPE_CHILD ) { /// ºÎ¸ðÈ¿°úÀ¯¹«¿Í °Å¸® üũ if( mCopyCheckTime <= accumTime ) { cBaseObject* pTarget = OBJECTMANAGER->GetObject( mTarget.type, mTarget.index ); if( pTarget == NULL || pTarget->GetStateDie() == true ) { /// È¿°ú Á¦°Å DeleteChildAuraInfluence(); return false; } if( DeleteChildAuraInfluence() == true ) return false; mCopyCheckTime = accumTime + AURA_CHECK_TIME; } } return true; } void cInfluenceObject::AddModeType( unsigned char applyType, unsigned short range ) { mCopyApplyType = (eAPPLYTYPE)applyType; mCopyRange = range; } void cInfluenceObject::DotInfluence( eSTATUS_PLUS statusPlusIdx, long infValue, unsigned long totalTime, unsigned long dotTime ) { long influenceValue = infValue; cBaseObject* pTargetObject = OBJECTMANAGER->GetObject( mTarget.type, mTarget.index ); if( pTargetObject == NULL || pTargetObject->GetStateDie() == true ) return; sInfluenceScript* pInf = SKILLSCRIPT->GetInfluenceInfo( mInfluenceClassIdx ); if( pInf == NULL ) { NETWORK2->PostServerEvent("cInfluenceObject::DotInfluence pInf[%d] == NULL", mInfluenceClassIdx ); return; } bool isDamage = true; /// µ¥¹ÌÁö(true), Èú(false) ±¸ºÐ if( influenceValue > 0 ) isDamage = false; bool isHP = true; /// hpÀû¿ë(true), mpÀû¿ë(false) ±¸ºÐ switch( statusPlusIdx ) { case eSTATUSPLUS_DOT_HPCHANGE_CALC_PLUS: /// Áö¼Ó HP Èú/µ¥¹ÌÁö(°è»ê½Ä»ç¿ë) { isHP = true; influenceValue = 0; if( infValue > 0 ) { influenceValue = pTargetObject->DotHealCalc( mTarget, infValue, 0, mHeal, totalTime, dotTime ); } else if( infValue < 0 ) { influenceValue = pTargetObject->DotDamageCalc( mAttacker.type, mAttackerLv, mAttackerDamageMin, mAttackerDamageMax, pInf->mDotType, -infValue, 0, totalTime, dotTime ); influenceValue = influenceValue * -1; } //if( influenceValue == 0 ) // influenceValue = mCalcTempValue1; } break; case eSTATUSPLUS_DOT_HPCHANGE_CALC_PER: { isHP = true; influenceValue = 0; if( infValue > 0 ) { influenceValue = pTargetObject->DotHealCalc( mTarget, 0, infValue, mHeal, totalTime, dotTime ); } else if( infValue < 0 ) { influenceValue = pTargetObject->DotDamageCalc( mAttacker.type, mAttackerLv, mAttackerDamageMin, mAttackerDamageMax, pInf->mDotType, 0, -infValue, totalTime, dotTime ); influenceValue = influenceValue * -1; } //if( influenceValue == 0 ) // influenceValue = mCalcTempValue1; } break; case eSTATUSPLUS_DOT_HPCHANGE_PLUS: /// (È¿°ú) Áö¼Ó HP + case eSTATUSPLUS_DOT_HPCHANGE_PER: /// Áö¼Ó HP % isHP = true; break; case eSTATUSPLUS_DOT_MPCHANGE_CALC_PLUS: /// Áö¼Ó MP Èú(°è»ê½Ä»ç¿ë) { isHP = false; influenceValue = 0; if( infValue > 0 ) { influenceValue = pTargetObject->DotHealCalc( mTarget, infValue, 0, mHeal, totalTime, dotTime ); } else if( infValue < 0 ) { influenceValue = pTargetObject->DotDamageCalc( mAttacker.type, mAttackerLv, mAttackerDamageMin, mAttackerDamageMax, pInf->mDotType, -infValue, 0, totalTime, dotTime ); influenceValue = influenceValue * -1; } //if( influenceValue == 0 ) // influenceValue = mCalcTempValue1; } break; case eSTATUSPLUS_DOT_MPCHANGE_CALC_PER: { isHP = false; influenceValue = 0; if( infValue > 0 ) { influenceValue = pTargetObject->DotHealCalc( mTarget, 0, infValue, mHeal, totalTime, dotTime ); } else if( infValue < 0 ) { influenceValue = pTargetObject->DotDamageCalc( mAttacker.type, mAttackerLv, mAttackerDamageMin, mAttackerDamageMax, pInf->mDotType, 0, -infValue, totalTime, dotTime ); influenceValue = influenceValue * -1; } //if( influenceValue == 0 ) // influenceValue = mCalcTempValue1; } break; case eSTATUSPLUS_DOT_MPCHANGE_PLUS: /// Áö¼Ó MP + case eSTATUSPLUS_DOT_MPCHANGE_PER: /// Áö¼Ó MP % isHP = false; break; } bool die = false; if( isDamage == false ) /// Èúó¸® { if( isHP == true ) /// hp Èúó¸® { pTargetObject->HPHeal( influenceValue, false, mAttacker, mDistressPoint, eTAKEDAMAGETYPE_HEAL ); MSG_SYN_SKILL_INFLUENCE_HPCHANGE msg; msg.Category = NM_SKILL; msg.Protocol = NM_SKILL_INFLUENCE_HPCHAGNE_SYN; msg.mInfluenceIdx = mUniqueIdx; msg.mTarget = mTarget; msg.mChangeValue = (short)influenceValue; MSG_SYN_SKILL_INFLUENCE_HPCHANGE aroundMsg; aroundMsg.Category = NM_SKILL; aroundMsg.Protocol = NM_SKILL_INFLUENCE_HPCHAGNE_AROUND_SYN; aroundMsg.mInfluenceIdx = mUniqueIdx; aroundMsg.mTarget = mTarget; aroundMsg.mChangeValue = (short)influenceValue; SKILLMANAGER->SendHPMPInf( pTargetObject, mAttacker, (char*)&msg, sizeof(msg), (char*)&aroundMsg, sizeof(aroundMsg) ); } else { pTargetObject->MPHeal( influenceValue, false ); MSG_SYN_SKILL_INFLUENCE_MPCHANGE msg; msg.Category = NM_SKILL; msg.Protocol = NM_SKILL_INFLUENCE_MPCHAGNE_SYN; msg.mInfluenceIdx = mUniqueIdx; msg.mTarget = mTarget; msg.mChangeValue = (short)influenceValue; MSG_SYN_SKILL_INFLUENCE_MPCHANGE aroundMsg; aroundMsg.Category = NM_SKILL; aroundMsg.Protocol = NM_SKILL_INFLUENCE_MPCHAGNE_AROUND_SYN; aroundMsg.mInfluenceIdx = mUniqueIdx; aroundMsg.mTarget = mTarget; aroundMsg.mChangeValue = (short)influenceValue; SKILLMANAGER->SendHPMPInf( pTargetObject, mAttacker, (char*)&msg, sizeof(msg), (char*)&aroundMsg, sizeof(aroundMsg) ); } SKILLMANAGER->InsertChangeSet( pTargetObject, mAttacker, eDAMAGE_NORMAL ); } else /// µ¥¹ÌÁö ó¸® { unsigned long baseDamage = abs(influenceValue); /// µ¥¹ÌÁö ¼öÄ¡ ¾ç¼öÈ­ /// µ¥¹ÌÁö Èí¼ö - µ¥¹ÌÁöÀÇ °ªÀ» °¨¼Ò½ÃŲ´Ù. long absorbPhyPer = pTargetObject->GetStateOddity( eODDITYTYPE_DAMAGE_ABSORB_PHY ); long absorbMagPer = pTargetObject->GetStateOddity( eODDITYTYPE_DAMAGE_ABSORB_MAG ); long absorbPhyRangePer = pTargetObject->GetStateOddity( eODDITYTYPE_DAMAGE_ABSORB_PHY_RANGE ); if( absorbPhyPer != 0 && ( pInf->mDotType == eDOTTYPE_PHYSICALCLOSE || pInf->mDotType == eDOTTYPE_PHYSICALRANGE ) ) { if( absorbPhyRangePer != 0 && pInf->mDotType == eDOTTYPE_PHYSICALRANGE ) absorbPhyRangePer += absorbPhyPer; if( absorbPhyPer < 0 ) absorbPhyPer = 0; if( absorbPhyPer > 100 ) absorbPhyPer = 100; baseDamage = FloatToInt( baseDamage * ( 100 - absorbPhyPer ) * 0.01f ); } else if( absorbMagPer != 0 && pInf->mDotType == eDOTTYPE_MAGIC ) { if( absorbMagPer < 0 ) absorbMagPer = 0; if( absorbMagPer > 100 ) absorbMagPer = 100; baseDamage = FloatToInt( baseDamage * ( 100 - absorbMagPer ) * 0.01f ); } if( baseDamage == 0 ) baseDamage = 1; /// ¹«Àû ó¸® - µ¥¹ÌÁö¸¦ ¾ø¿¡ ¹ö¸°´Ù. if( ( pTargetObject->GetStateOddity( eODDITYTYPE_INVINCIBILITY_PHY ) != 0 && ( pInf->mDotType == eDOTTYPE_PHYSICALCLOSE || pInf->mDotType == eDOTTYPE_PHYSICALRANGE ) ) ) baseDamage = 0; else if( pTargetObject->GetStateOddity( eODDITYTYPE_INVINCIBILITY_MAG ) != 0 && pInf->mDotType == eDOTTYPE_MAGIC ) baseDamage = 0; /// µ¥¹ÌÁö ¹Ý»ç - µ¥¹ÌÁö·®À» ÁÙÀÌ°í °ø°ÝÀÚ¿¡°Ô µ¹·ÁÁØ´Ù. long reflectionPhyPer = pTargetObject->GetStateOddity( eODDITYTYPE_DAMAGE_REFLECTION_PHY ); long reflectionMagPer = pTargetObject->GetStateOddity( eODDITYTYPE_DAMAGE_REFLECTION_MAG ); long reflectionDamage = 0; if( reflectionPhyPer != 0 && ( pInf->mDotType == eDOTTYPE_PHYSICALCLOSE || pInf->mDotType == eDOTTYPE_PHYSICALRANGE ) ) { if( reflectionPhyPer < 0 ) reflectionPhyPer = 0; if( reflectionPhyPer > 100 ) reflectionPhyPer = 100; reflectionDamage = FloatToInt( baseDamage * reflectionPhyPer * 0.01f ); baseDamage = baseDamage - reflectionDamage; } else if( reflectionMagPer != 0 && pInf->mDotType == eDOTTYPE_MAGIC ) { if( reflectionMagPer < 0 ) reflectionMagPer = 0; if( reflectionMagPer > 100 ) reflectionMagPer = 100; reflectionDamage = FloatToInt( baseDamage * reflectionMagPer * 0.01f ); baseDamage = baseDamage - reflectionDamage; } /// ½ÇÁ¦·Î Àû¿ëµÈ µ¥¹ÌÁö unsigned long applyDamage = 0; /// Ÿ°Ù °á°ú ó¸® if( isHP == true ) { /// hp µ¥¹ÌÁö 󸮺Πif( DUELMANAGER->DuelLastAttack( mAttacker, mTarget, baseDamage, false, &applyDamage ) == false ) { applyDamage = pTargetObject->HPDamage( mAttacker, baseDamage, &die, false ); } /// ¹ÞÀº µ¥¹ÌÁö ó¸® pTargetObject->AddTakeDamage( mAttacker, applyDamage, mDistressPoint, eTAKEDAMAGETYPE_DAMAGE ); /// Ÿ°ÙÀÌ ¹ÞÀº µ¥¹ÌÁö ¹ß¼Û MSG_SYN_SKILL_INFLUENCE_HPCHANGE msg; msg.Category = NM_SKILL; msg.Protocol = NM_SKILL_INFLUENCE_HPCHAGNE_SYN; msg.mInfluenceIdx = mUniqueIdx; msg.mTarget = mTarget; msg.mChangeValue = (short)(applyDamage * -1); /// Ÿ°ÙÀÌ ¹ÞÀº µ¥¹ÌÁö ¹ß¼Û MSG_SYN_SKILL_INFLUENCE_HPCHANGE aroundMsg; aroundMsg.Category = NM_SKILL; aroundMsg.Protocol = NM_SKILL_INFLUENCE_HPCHAGNE_AROUND_SYN; aroundMsg.mInfluenceIdx = mUniqueIdx; aroundMsg.mTarget = mTarget; aroundMsg.mChangeValue = (short)(applyDamage * -1); SKILLMANAGER->SendHPMPInf( pTargetObject, mAttacker, (char*)&msg, sizeof(msg), (char*)&aroundMsg, sizeof(aroundMsg) ); } else { applyDamage = baseDamage; /// mp µ¥¹ÌÁö 󸮺ΠpTargetObject->MPDamage( baseDamage, false ); /// ¹ÞÀº µ¥¹ÌÁö ó¸® pTargetObject->AddTakeDamage( mAttacker, applyDamage, mDistressPoint, eTAKEDAMAGETYPE_DAMAGE ); /// Ÿ°ÙÀÌ ¹ÞÀº µ¥¹ÌÁö ¹ß¼Û MSG_SYN_SKILL_INFLUENCE_MPCHANGE msg; msg.Category = NM_SKILL; msg.Protocol = NM_SKILL_INFLUENCE_MPCHAGNE_SYN; msg.mInfluenceIdx = mUniqueIdx; msg.mTarget = mTarget; msg.mChangeValue = (short)(applyDamage * -1); MSG_SYN_SKILL_INFLUENCE_MPCHANGE aroundMsg; aroundMsg.Category = NM_SKILL; aroundMsg.Protocol = NM_SKILL_INFLUENCE_MPCHAGNE_AROUND_SYN; aroundMsg.mInfluenceIdx = mUniqueIdx; aroundMsg.mTarget = mTarget; aroundMsg.mChangeValue = (short)(applyDamage * -1); SKILLMANAGER->SendHPMPInf( pTargetObject, mAttacker, (char*)&msg, sizeof(msg), (char*)&aroundMsg, sizeof(aroundMsg) ); } SKILLMANAGER->InsertChangeSet( pTargetObject, mAttacker, eDAMAGE_NORMAL ); /// °ø°ÝÀÚ°¡ µ¥¹ÌÁö Èí¼ö && ¹Ý»çµÈ µ¥¹ÌÁö ó¸® cBaseObject* pAttacker = OBJECTMANAGER->GetObject( mAttacker.type, mAttacker.index ); if( pAttacker != NULL && pAttacker->GetStateDie() == false ) { ////////////////////////////////////////////////////////////////////////// /// °ø°ÝÀÚ°¡ hpÈí¼ö long attackerBaseHeal = 0; if( isHP == true ) /// µ¥¹ÌÁö ¹Ý»çµÈ ·®ÀÌ hpÀ̸é Èí¼ö°ª¿¡ ÇÕ»ê attackerBaseHeal -= reflectionDamage; /// °ø°ÝÀÚ HPÈí¼ö °ªÀÌ ÀÖ´Â °æ¿ì °è»ê unsigned long attkAbsorbHPPer = pAttacker->GetStateOddity( eODDITYTYPE_HP_ABSORB ); if( attkAbsorbHPPer != 0 ) { /// °ø°ÝÀÚ µ¥¹ÌÁö hpÈí¼ö if( attkAbsorbHPPer < 0 ) attkAbsorbHPPer = 0; if( attkAbsorbHPPer > 100 ) attkAbsorbHPPer = 100; unsigned long attkAbsorbHP = FloatToInt( applyDamage * attkAbsorbHPPer * 0.01f ); /// Èí¼ö·®°ú ¹Ý»çµÇ µ¹¾Æ¿Â µ¥¹ÌÁö ÇÕ»ê attackerBaseHeal = attkAbsorbHP + attackerBaseHeal; } /// ½ÇÁ¦·Î Àû¿ëµÈ µ¥¹ÌÁö long attackerApplyDamage = 0; /// Ÿ°Ù °á°ú ó¸® if( attackerBaseHeal > 0 ) /// ÇÕ»êµÈ °ø°ÝÀÚ µ¥¹ÌÁö°¡ ¾ç¼ö¸é Èí¼ö·®ÀÌ ´õ¸¹À½ - heal { /// Èú ó¸® attackerApplyDamage = attackerBaseHeal; pAttacker->HPHeal( attackerApplyDamage, false, pAttacker->GetObject(), 0, eTAKEDAMAGETYPE_NONE ); } else if( attackerBaseHeal < 0 ) /// ÇÕ»êµÈ °ø°ÝÀÚ µ¥¹ÌÁö°¡ À½¼ö¸é Èí¼ö·®º¸´Ù µ¥¹ÌÁö·®ÀÌ ´õ ¸¹À½ - µ¥¹ÌÁö { unsigned long tempDamage = 0; /// hp µ¥¹ÌÁö 󸮺Πif( DUELMANAGER->DuelLastAttack( mTarget, mAttacker, attackerBaseHeal * -1, eDAMAGE_NORMAL, &tempDamage ) == false ) tempDamage = pAttacker->HPDamage( mTarget, attackerBaseHeal* -1, &die, false, eDAMAGE_NORMAL ); /// ¹ÞÀº µ¥¹ÌÁö ó¸® pAttacker->AddTakeDamage( mTarget, tempDamage, mDistressPoint, eTAKEDAMAGETYPE_DAMAGE ); /// µ¥¹ÌÁö´Â À½¼ö°ªÀ¸·Î º¯È¯ attackerApplyDamage = tempDamage * -1; } /// Èí¼ö&µ¥¹ÌÁö ¹Ý»ç ³»¿ëÀÌ ÀÖ´Â °æ¿ì ¹ß¼Û if( attackerApplyDamage != 0 ) { /// °ø°ÝÀÚ hp µ¥¹ÌÁö/Èú Àû¿ë ¸Þ¼¼Áö ¹ß¼Û MSG_SYN_SKILL_NONSKILL_HPCHANGE msg; msg.Category = NM_SKILL; msg.Protocol = NM_SKILL_NONSKILL_HPCHANGE_SYN; msg.mInfluenceClassIdx = 0; msg.mTarget = mAttacker; msg.mChangeValue = (short)attackerApplyDamage; MSG_SYN_SKILL_NONSKILL_HPCHANGE aroundMsg; aroundMsg.Category = NM_SKILL; aroundMsg.Protocol = NM_SKILL_NONSKILL_HPCHANGE_AROUND_SYN; aroundMsg.mInfluenceClassIdx = 0; aroundMsg.mTarget = mAttacker; aroundMsg.mChangeValue = (short)attackerApplyDamage; SKILLMANAGER->SendHPMPInf( pTargetObject, mAttacker, (char*)&msg, sizeof(msg), (char*)&aroundMsg, sizeof(aroundMsg) ); SKILLMANAGER->InsertChangeSet( pAttacker, mTarget, eDAMAGE_NORMAL ); } ////////////////////////////////////////////////////////////////////////// /// °ø°ÝÀÚ°¡ mpÈí¼ö attackerBaseHeal = 0; if( isHP == false ) /// µ¥¹ÌÁö ¹Ý»çµÈ ·®ÀÌ mpÀ̸é Èí¼ö°ª¿¡ ÇÕ»ê attackerBaseHeal -= reflectionDamage; /// °ø°ÝÀÚ µ¥¹ÌÁö mpÈí¼ö unsigned long attkAbsorbMPPer = pAttacker->GetStateOddity( eODDITYTYPE_MP_ABSORB ); /// °ø°ÝÀÚ MPÈí¼ö ºñÀ² if( attkAbsorbMPPer != 0 ) { if( attkAbsorbMPPer < 0 ) attkAbsorbMPPer = 0; if( attkAbsorbMPPer > 100 ) attkAbsorbMPPer = 100; unsigned long attkAbsorbMP = FloatToInt( applyDamage * attkAbsorbMPPer * 0.01f ); /// Èí¼ö·®°ú ¹Ý»çµÇ µ¹¾Æ¿Â µ¥¹ÌÁö ÇÕ»ê attackerBaseHeal = attkAbsorbMP + attackerBaseHeal; } /// ½ÇÁ¦·Î Àû¿ëµÈ µ¥¹ÌÁö attackerApplyDamage = 0; /// Ÿ°Ù °á°ú ó¸® if( attackerBaseHeal > 0 ) /// ÇÕ»êµÈ °ø°ÝÀÚ µ¥¹ÌÁö°¡ ¾ç¼ö¸é Èí¼ö·®ÀÌ ´õ¸¹À½ - heal { /// Èú ó¸® attackerApplyDamage = attackerBaseHeal; pAttacker->MPHeal( attackerApplyDamage, false ); } else if( attackerBaseHeal < 0 ) /// ÇÕ»êµÈ °ø°ÝÀÚ µ¥¹ÌÁö°¡ À½¼ö¸é Èí¼ö·®º¸´Ù µ¥¹ÌÁö·®ÀÌ ´õ ¸¹À½ - µ¥¹ÌÁö { attackerApplyDamage = attackerBaseHeal; pAttacker->MPDamage( attackerApplyDamage * -1, false ); pAttacker->AddTakeDamage( mTarget, attackerApplyDamage * -1, mDistressPoint, eTAKEDAMAGETYPE_DAMAGE ); /// µ¥¹ÌÁö´Â À½¼ö°ªÀ¸·Î º¯È¯ attackerApplyDamage = attackerApplyDamage * -1; } /// Èí¼ö&µ¥¹ÌÁö ¹Ý»ç ³»¿ëÀÌ ÀÖ´Â °æ¿ì ¹ß¼Û if( attackerApplyDamage != 0 ) { MSG_SYN_SKILL_NONSKILL_MPCHANGE msg; msg.Category = NM_SKILL; msg.Protocol = NM_SKILL_NONSKILL_MPCHANGE_SYN; msg.mInfluenceClassIdx = 0; msg.mTarget = mAttacker; msg.mChangeValue = (short)attackerApplyDamage; MSG_SYN_SKILL_NONSKILL_MPCHANGE aroundMsg; aroundMsg.Category = NM_SKILL; aroundMsg.Protocol = NM_SKILL_NONSKILL_MPCHANGE_AROUND_SYN; aroundMsg.mInfluenceClassIdx = 0; aroundMsg.mTarget = mAttacker; aroundMsg.mChangeValue = (short)attackerApplyDamage; SKILLMANAGER->SendHPMPInf( pTargetObject, mAttacker, (char*)&msg, sizeof(msg), (char*)&aroundMsg, sizeof(aroundMsg) ); SKILLMANAGER->InsertChangeSet( pAttacker, mTarget, eDAMAGE_NORMAL ); } } } } /// ¿À¶óÀÎ È¿°ú¿¡¼­ ¹üÀ§ ¾È¿¡ ÇØ´çµÇ´Â object¿¡°Ô ¿À¶ó¸¦ º¹»çÇØÁÜ void cInfluenceObject::CopyAuraInfluence() { /// ¿À¶óÀÇ È¿°ú°¡ ¹üÀ§°Å¸®°¡ ¾øÀ¸¸é ¾ÈµÈ´Ù. if( mCopyRange == 0.0f ) return; if( mTarget.type == eOBJECTTYPE_PLAYER ) { /// ¿À¶ó È¿°úÀÇ ºÎ¸ð°´Ã¼ cPlayer* pParentObejct = OBJECTMANAGER->GetPlayer( mTarget.index ); if( pParentObejct == NULL ) return; /// ºÎ¸ð°´Ã¼ÀÇ À§Ä¡¿Í Ÿ°ÙÀÇ À§Ä¡ NiPoint3 parentPos( pParentObejct->GetXPos(), pParentObejct->GetYPos(), pParentObejct->Height() ); mRangeCheck.SetRadius( mCopyRange ); switch( mCopyApplyType ) { case eAPPLYTYPE_PARTY: { /// ÆÄƼ Á¤º¸¸¦ Àоî¿È cParty* pParty = PARTYMAN->GetParty( ((cPlayer*)pParentObejct)->GetPartyIndex() ); if( pParty != NULL ) { unsigned long* userArr = pParty->GetUserArr(); unsigned int partyCount = pParty->GetCount(); for( unsigned int i = 0 ; i < partyCount ; ++i ) { /// ÀÚ½ÅÀº Åë°ú if( userArr[i] == pParentObejct->GetObjectID() ) continue; /// ÆÄƼ¿øÀ» Àоî¿È cPlayer* pChild = OBJECTMANAGER->GetPlayer( userArr[i] ); if( pChild == NULL ) continue; if( pChild->GetStateDie() == true ) continue; if( pChild->GetGameIn() == false ) continue; /// °Å¸®¾È¿¡ µé¾î¿À´Â °æ¿ì NiPoint3 childPos( pChild->GetXPos(), pChild->GetYPos(), pChild->Height() ); if( mRangeCheck.IsRange( childPos, parentPos ) ) { /// °°Àº ¿À¶ó È¿°ú°¡ º¹»çµÇ´Â°Í ¹æÁö if( pChild->IsParentEqual( mUniqueIdx ) == true ) continue; SKILLMANAGER->AddInfChildAura( mTarget, pChild->GetObject(), mInfluenceClassIdx, mSkillIdx, mUniqueIdx, true ); } } } else { /// ÆÄƼ¿¬ÇÕÀ¸·ÎºÎÅÍ Á¤º¸ ÀÐÀ½ cPartyUnion* partyUnion = PARTYUNIONMAN->GetUnion( ((cPlayer*)pParentObejct)->GetPartyUnionIndex() ); if( partyUnion != NULL ) { unsigned long* userArr = partyUnion->GetGroupArr( pParentObejct->GetObjectID() ); for( unsigned int i = 0; i < MAX_PARTYUSER; ++i ) { if( userArr[i] == pParentObejct->GetObjectID() ) continue; /// ÆÄƼ¿øÀ» Àоî¿È cPlayer* pChild = OBJECTMANAGER->GetPlayer( userArr[i] ); if( pChild == NULL ) continue; if( pChild->GetStateDie() == true ) continue; if( pChild->GetGameIn() == false ) continue; /// °Å¸®¾È¿¡ µé¾î¿À´Â °æ¿ì NiPoint3 childPos( pChild->GetXPos(), pChild->GetYPos(), pChild->Height() ); if( mRangeCheck.IsRange( childPos, parentPos ) ) { /// °°Àº ¿À¶ó È¿°ú°¡ º¹»çµÇ´Â°Í ¹æÁö if( pChild->IsParentEqual( mUniqueIdx ) == true ) continue; SKILLMANAGER->AddInfChildAura( mTarget, pChild->GetObject(), mInfluenceClassIdx, mSkillIdx, mUniqueIdx, true ); } } } } } break; case eAPPLYTYPE_BUDDY: { cPlayer* pChild = GRIDMANAGER->FindFirstPlayer( pParentObejct ); while( pChild != NULL ) { /// ÀÚ½ÅÀº Åë°ú if( pChild->GetObjectID() == mTarget.index && pChild->GetObjectType() == mTarget.type ) { pChild = GRIDMANAGER->FindNextPlayer(); continue; } if( pChild->GetStateDie() == true || pChild->IsAttack( mTarget.index ) == true ) { pChild = GRIDMANAGER->FindNextPlayer(); continue; } NiPoint3 childPos( pChild->GetXPos(), pChild->GetYPos(), pChild->Height() ); if( mRangeCheck.IsRange( childPos, parentPos ) ) { /// °°Àº ¿À¶ó È¿°ú°¡ º¹»çµÇ´Â°Í ¹æÁö if( pChild->IsParentEqual( mUniqueIdx ) == true ) { pChild = GRIDMANAGER->FindNextPlayer(); continue; } SKILLMANAGER->AddInfChildAura( mTarget, pChild->GetObject(), mInfluenceClassIdx, mSkillIdx, mUniqueIdx, true ); } pChild = GRIDMANAGER->FindNextPlayer(); } } break; case eAPPLYTYPE_SELF: break; case eAPPLYTYPE_ENEMY: { /// Ç÷¹À̾î cPlayer* pPlayer = GRIDMANAGER->FindFirstPlayer( pParentObejct ); while( pPlayer != NULL ) { /// ÀÚ½ÅÀº Åë°ú if( pPlayer->GetObjectID() == mTarget.index && pPlayer->GetObjectType() == mTarget.type ) { pPlayer = GRIDMANAGER->FindNextPlayer(); continue; } if( pPlayer->GetStateDie() == true || pPlayer->IsAttack( mTarget.index ) == true ) { pPlayer = GRIDMANAGER->FindNextPlayer(); continue; } NiPoint3 childPos( pPlayer->GetXPos(), pPlayer->GetYPos(), pPlayer->Height() ); if( mRangeCheck.IsRange( childPos, parentPos ) ) { /// °°Àº ¿À¶ó È¿°ú°¡ º¹»çµÇ´Â°Í ¹æÁö if( pPlayer->IsParentEqual( mUniqueIdx ) == true ) { pPlayer = GRIDMANAGER->FindNextPlayer(); continue; } SKILLMANAGER->AddInfChildAura( mTarget, pPlayer->GetObject(), mInfluenceClassIdx, mSkillIdx, mUniqueIdx, true ); } pPlayer = GRIDMANAGER->FindNextPlayer(); } /// ¸ó½ºÅÍ cMonster* pMonster = GRIDMANAGER->FindFirstMonster( pParentObejct ); while( pMonster != NULL ) { if( pMonster->GetStateDie() == true ) { pMonster = GRIDMANAGER->FindNextMonster(); continue; } NiPoint3 childPos( pMonster->GetXPos(), pMonster->GetYPos(), pMonster->Height() ); if( mRangeCheck.IsRange( childPos, parentPos ) ) { /// °°Àº ¿À¶ó È¿°ú°¡ º¹»çµÇ´Â°Í ¹æÁö if( pMonster->IsParentEqual( mUniqueIdx ) == true ) { pMonster = GRIDMANAGER->FindNextMonster(); continue; } SKILLMANAGER->AddInfChildAura( mTarget, pMonster->GetObject(), mInfluenceClassIdx, mSkillIdx, mUniqueIdx, true ); } pMonster = GRIDMANAGER->FindNextMonster(); } } break; default: NETWORK2->PostServerEvent("cSkillManager::CopyAuraInfluence mAuraCopyType[%d,%d,%d,%d] ERROR ", mCopyApplyType, pParentObejct->GetObjectID(), pParentObejct->GetState(), pParentObejct->GetStateStop() ); } } else if( mTarget.type == eOBJECTTYPE_MONSTER ) { /// ¿À¶ó È¿°úÀÇ ºÎ¸ð°´Ã¼ cMonster* pParentObejct = OBJECTMANAGER->GetMonster( mTarget.index ); if( pParentObejct == NULL ) return; /// ºÎ¸ð°´Ã¼ÀÇ À§Ä¡¿Í Ÿ°ÙÀÇ À§Ä¡ NiPoint3 parentPos( pParentObejct->GetXPos(), pParentObejct->GetYPos(), pParentObejct->Height() ); mRangeCheck.SetRadius( mCopyRange ); switch( mCopyApplyType ) { case eAPPLYTYPE_PARTY: { NETWORK2->PostServerEvent("cInfluenceObject::CopyAuraInfluence() eOBJECTTYPE_MONSTER eAPPLYTYPE_PARTY [%d,%d]", pParentObejct->GetRaceGender(), mInfluenceClassIdx ); } break; case eAPPLYTYPE_SELF: { NETWORK2->PostServerEvent("cInfluenceObject::CopyAuraInfluence() eOBJECTTYPE_MONSTER eAPPLYTYPE_SELF [%d,%d]", pParentObejct->GetRaceGender(), mInfluenceClassIdx ); } break; case eAPPLYTYPE_BUDDY: { /// ¸ó½ºÅÍ cMonster* pMonster = GRIDMANAGER->FindFirstMonster( pParentObejct ); while( pMonster != NULL ) { /// ÀÚ½ÅÀº Åë°ú if( pMonster->GetObjectID() == mTarget.index && pMonster->GetObjectType() == mTarget.type ) { pMonster = GRIDMANAGER->FindNextMonster(); continue; } if( pMonster->GetStateDie() == true ) { pMonster = GRIDMANAGER->FindNextMonster(); continue; } NiPoint3 childPos( pMonster->GetXPos(), pMonster->GetYPos(), pMonster->Height() ); if( mRangeCheck.IsRange( childPos, parentPos ) ) { /// °°Àº ¿À¶ó È¿°ú°¡ º¹»çµÇ´Â°Í ¹æÁö if( pMonster->IsParentEqual( mUniqueIdx ) == true ) { pMonster = GRIDMANAGER->FindNextMonster(); continue; } SKILLMANAGER->AddInfChildAura( mTarget, pMonster->GetObject(), mInfluenceClassIdx, mSkillIdx, mUniqueIdx, true ); } pMonster = GRIDMANAGER->FindNextMonster(); } } break; case eAPPLYTYPE_ENEMY: { /// Ç÷¹À̾î cPlayer* pPlayer = GRIDMANAGER->FindFirstPlayer( pParentObejct ); while( pPlayer != NULL ) { if( pPlayer->GetStateDie() == true ) { pPlayer = GRIDMANAGER->FindNextPlayer(); continue; } NiPoint3 childPos( pPlayer->GetXPos(), pPlayer->GetYPos(), pPlayer->Height() ); if( mRangeCheck.IsRange( childPos, parentPos ) ) { /// °°Àº ¿À¶ó È¿°ú°¡ º¹»çµÇ´Â°Í ¹æÁö if( pPlayer->IsParentEqual( mUniqueIdx ) == true ) { pPlayer = GRIDMANAGER->FindNextPlayer(); continue; } SKILLMANAGER->AddInfChildAura( mTarget, pPlayer->GetObject(), mInfluenceClassIdx, mSkillIdx, mUniqueIdx, true ); } pPlayer = GRIDMANAGER->FindNextPlayer(); } } break; default: NETWORK2->PostServerEvent("cSkillManager::CopyAuraInfluence eOBJECTTYPE_MONSTER default[%d,%d] ", mCopyApplyType, pParentObejct->GetObjectID() ); } } } bool cInfluenceObject::DeleteChildAuraInfluence() { cInfluenceObject* pInfluenceObject = SKILLMANAGER->GetInfluence( mParentIdx ); if( pInfluenceObject == NULL ) return true; cBaseObject* pParent = OBJECTMANAGER->GetObject( mAttacker.type, mAttacker.index ); if( pParent == NULL || pParent->GetStateDie() == true ) return true; cBaseObject* pChild = OBJECTMANAGER->GetObject( mTarget.type, mTarget.index ); if( pChild == NULL || pChild->GetStateDie() == true ) return true; if( pParent->GetMapNumber() != pChild->GetMapNumber() ) return true; /// ºÎ¸ð°¡ ÆÄƼ¿øµé¿¡°Ô º¹»çÇØÁÖ´Â È¿°ú¶ó¸é ÆÄƼ Á¸Àç¿©ºÎ¸¦ üũÇÑ´Ù. if( mCopyApplyType == eAPPLYTYPE_PARTY ) { if( pParent->GetObjectType() == eOBJECTTYPE_PLAYER && pChild->GetObjectType() == eOBJECTTYPE_PLAYER ) { if( ((cPlayer*)pParent)->GetPartyIndex() == 0 && ((cPlayer*)pParent)->GetPartyUnionIndex() == 0 ) return true; if( ((cPlayer*)pParent)->GetPartyIndex() > 0 ) { if( ((cPlayer*)pParent)->GetPartyIndex() != ((cPlayer*)pChild)->GetPartyIndex() ) return true; } else if( ((cPlayer*)pParent)->GetPartyUnionIndex() > 0 ) { unsigned long partyUnionIndex = ((cPlayer*)pParent)->GetPartyUnionIndex(); cPartyUnion* partyUnion = PARTYUNIONMAN->GetUnion( partyUnionIndex ); if( partyUnion != NULL ) { // ÆÄƼ¿¬ÇÕ¿¡¼­ µ¿ÀÏ ÆÄƼ±ºÀÌ ¾Æ´Ï¸é È¿°ú »©ÁÖ±â if( partyUnion->IsUser( pParent->GetObjectID(), pChild->GetObjectID() ) == false ) return true; } else { assert(0); } } } } NiPoint3 parentPos( pParent->GetXPos(), pParent->GetYPos(), pParent->Height() ); NiPoint3 childPos( pChild->GetXPos(), pChild->GetYPos(), pChild->Height() ); cRangeCheck rangeCheck( pInfluenceObject->GetRange() ); return rangeCheck.IsNotRange( parentPos, childPos ); } bool cInfluenceObject::CheckTotemInfluence() { /// ºÎ¸ð ÅäÅÛ °´Ã¼ È®ÀÎ cTotem* pTotemObject = OBJECTMANAGER->GetTotem( mParentIdx ); if( pTotemObject == NULL ) return true; cBaseObject* pTarget = OBJECTMANAGER->GetObject( mTarget.type, mTarget.index ); if( pTarget == NULL ) { pTotemObject->EraseTarget( mTarget ); /// ºÎ¸ð ÅäÅÛ¿¡¼­ Ÿ°Ù ¸ñ·Ï Á¦°Å return true; } /// ºÎ¸ð ¿Í È¿°ú(Ÿ°Ù) °Å¸® °è»ê NiPoint3 parentPos( pTotemObject->GetXPos(), pTotemObject->GetYPos(), pTotemObject->Height() ); NiPoint3 childPos( pTarget->GetXPos(), pTarget->GetYPos(), pTarget->Height() ); cRangeCheck rangeCheck( pTotemObject->GetRange() ); if( rangeCheck.IsNotRange( parentPos, childPos ) == true ) { pTotemObject->EraseTarget( mTarget ); /// ºÎ¸ð ÅäÅÛ¿¡¼­ Ÿ°Ù ¸ñ·Ï Á¦°Å return true; } return false; } bool cInfluenceObject::CalcLeftGuard( unsigned char attributeType, unsigned long* damage ) { if( damage == NULL ) return false; if( mGuardType == eINFGUARDTYPE_NONE || mGuardType == eINFGUARDTYPE_CASHEXP ) return false; /// ¼Ó¼ºÈ®ÀÎ if( attributeType == eATTRIBUTETYPE_PHYSICAL ) { if( mGuardType == eINFGUARDTYPE_PHY || mGuardType == eINFGUARDTYPE_ALL ) { /// Ä«¿îÆ® °¨¼Ò --mLeftGuardCnt; /// µ¥¹ÌÁö ¾ç¸¸Å­ °¨¼Ò if( mLeftGuardValue > *damage ) { mLeftGuardValue = mLeftGuardValue - (unsigned short)*damage; *damage = 0; } else { *damage = *damage - mLeftGuardValue; mLeftGuardValue = 0; } return true; } else return false; } else if( attributeType == eATTRIBUTETYPE_MAGIC ) { if( mGuardType == eINFGUARDTYPE_MAG || mGuardType == eINFGUARDTYPE_ALL ) { --mLeftGuardCnt; if( mLeftGuardValue > *damage ) { mLeftGuardValue = mLeftGuardValue - (unsigned short)*damage; *damage = 0; } else { *damage = *damage - mLeftGuardValue; mLeftGuardValue = 0; } return true; } else return false; } else return false; } bool cInfluenceObject::CalcCashExpGuard() { if( mGuardType == eINFGUARDTYPE_CASHEXP ) { /// Ä«¿îÆ® °¨¼Ò --mLeftGuardCnt; return true; } else return false; } void cInfluenceObject::TotemSetEraseTarget() { /// ºÎ¸ð ÅäÅÛ °´Ã¼ È®ÀÎ cTotem* pTotemObject = OBJECTMANAGER->GetTotem( mParentIdx ); if( pTotemObject != NULL ) pTotemObject->EraseTarget( mTarget ); }