#include "stdafx.h" #include "Player_Common.h" #include "ObjectManager.h" #include "SkillManager.h" #include "BaseObject.h" #include "DamageCalc.h" #include "Protocol.h" #include "Player.h" #include "Monster.h" #include "gamesrv.h" #include "Drop.h" #include "StatusCalc_Server.h" #include "AIManager.h" #include "Party.h" #include "PartyManager.h" #include "GridManager.h" #include "PartyUnion.h" #include "PartyUnionManager.h" cPlayerSkillObject::cPlayerSkillObject() { mSkillIdx = 0; mSkillStep = 0; } cPlayerSkillObject::~cPlayerSkillObject() { } void* cPlayerSkillObject::operator new( size_t n ) { if( n != sizeof(cPlayerSkillObject) ) { assert(0); return NULL; } return SKILLMANAGER->AllocPlayerSkillObject(); } void cPlayerSkillObject::operator delete( void* ptr, size_t n ) { /// NULL Æ÷ÀÎÅÍ °Ë»ç if( ptr == 0 ) { assert(0); return; } if( n != sizeof(cPlayerSkillObject) ) { assert(0); return; } SKILLMANAGER->FreePlayerSkillObject( static_cast(ptr) ); return; } unsigned char cPlayerSkillObject::InitPlayerNormalAttack( unsigned long playerIdx, sObject target, unsigned long skillIdx, unsigned char skillStep, unsigned long uniqueIdx ) { cPlayer* pPlayer = OBJECTMANAGER->GetPlayer( playerIdx ); if( pPlayer == NULL ) { assert(NULL); NETWORK2->PostServerEvent("InitPlayerNormalAttack, playerIdx error [%d]", playerIdx ); return 1; } /// skill pcÁ¤º¸ Àоî¿È sPlayerSkillBaseInfo* pSkillInfo = SKILLSCRIPT->GetPlayerSkillInfo( skillIdx ); if( pSkillInfo == NULL ) { assert(NULL); NETWORK2->PostServerEvent("InitPlayerNormalAttack - GetPlayerSkillInfo(%d)", skillIdx ); return 2; } /// °ø°ÝÀÚÀÇ º¸À¯½ºÅ³ÀÎÁö üũ cHaveSkillObject* pPlayerHaveSkill = SKILLMANAGER->GetPlayerHaveSkill( playerIdx, skillIdx ); if( !pPlayerHaveSkill ) { assert(NULL); NETWORK2->PostServerEvent("InitPlayerNormalAttack - GetPlayerHaveSkill(%d,%d)", playerIdx, skillIdx ); return 3; } /// ½ºÅ³ ½ºÅÜÁ¤º¸ Àоî¿È unsigned char haveStep = pPlayerHaveSkill->GetSkillStep(); if( haveStep >= pSkillInfo->mStepCount ) { assert(NULL); NETWORK2->PostServerEvent("InitPlayerNormalAttack - mSkillStep(%d)", haveStep ); return 4; } if( haveStep < skillStep ) { NETWORK2->PostServerEvent("InitPlayerNormalAttack - haveStep < skillStep(%d,%d)", haveStep, skillStep ); return 5; } /// ¿¬Ãâ ½ºÅ©¸³Æ® ÆÄÀÏ¿¡¼­ ½Ã°£ °ªÀ» Àоî¿È cDramaturgyInfo* pDramaInfo = DRAMATURGYMAN->GetPlayerDramaturgyInfo( skillIdx, (unsigned short)pPlayer->GetWeaponState(), pPlayer->GetRace(), pPlayer->GetGender(), &mDramaKey ); if( pDramaInfo == NULL ) { assert(NULL); NETWORK2->PostServerEvent("InitPlayerNormalAttack, pDramaInfo error [%d,%d,%d,%d,%d]", playerIdx, skillIdx, (unsigned short)pPlayer->GetWeaponState(), pPlayer->GetRace(), pPlayer->GetGender() ); return 6; } sDramaState* pDramaState = pDramaInfo->GetDramaState(); if( pDramaState == NULL ) { assert(NULL); NETWORK2->PostServerEvent("InitPlayerSkill, GetDramaState error [%d,%d,%d,%d,%d]", playerIdx, skillIdx, (unsigned short)pPlayer->GetWeaponState(), pPlayer->GetRace(), pPlayer->GetGender() ); return 7; } /// °ø°ÝÀÚ ¼ÂÆÃ mAttacker.index = playerIdx; mAttacker.type = eOBJECTTYPE_PLAYER; /// ½ºÅ³idxÀÇ °ªÀ» ¼ÂÆÃ. mSkillIdx = skillIdx; mSkillStep = skillStep; sPlayerSkillStepInfo* pStepInfo = &pSkillInfo->mpSetpInfoArray[mSkillStep]; mDetailCnt = pDramaState->GetDamageCount(); mpDetailBegin = (sDramaAction*)pDramaState->GetDamageBegin(); mpDetailEnd = (sDramaAction*)pDramaState->GetDamageEnd(); /// ½ºÅ©¸³Æ® °Ë»ç if( mDetailCnt >= 10 ) return 8; if( mDetailCnt > 1 ) { if( pStepInfo->mApplyValueType1 == eSTATUSPLUS_AROUND_PUSH ) return 9; if( pStepInfo->mApplyValueType1 == eSTATUSPLUS_AROUND_PULL ) return 10; if( pStepInfo->mApplyValueType2 == eSTATUSPLUS_AROUND_PUSH ) return 11; if( pStepInfo->mApplyValueType2 == eSTATUSPLUS_AROUND_PULL ) return 12; if( pStepInfo->mApplyValueType2 == eSTATUSPLUS_TARGET_PUSH ) return 13; } /// ¹ß»çü À¯¹« mIsProjectile = pDramaInfo->IsBullet(); /// ¹ß»çü ¼Óµµ mProjectileSpeed = pDramaInfo->GetBulletSpeed(); /// ¹ßµ¿ Á¾·á½Ã°£ mActivityTime = pDramaInfo->GetActivityEndTime(); /// °íÀ¯ idx ¼ÂÆÃ mUniqueIdx = uniqueIdx; /// °ø°Ý¼Óµµ ( ¾ÆÀÌÅÛ, ¹öÇÁ Æ÷ÇÔ ) float attackSpeed = pPlayer->GetStatus2()->mAttackSpeed; if( attackSpeed <= 0.0f || attackSpeed > 2.0f ) attackSpeed = 1.0f; mSpeedFactor = attackSpeed; // mMapNumber = pPlayer->GetMapNumber(); /// Ÿ°Ù ¼ÂÆÃ mCenterTarget = target; /// ½ºÅ³ ¿ÀºêÁ§Æ® »ý¼º ½Ã°£ mCreationTime = NETWORK2->GetAccumTime(); /// °ø°Ý ½ÃÀÛÀ§Ä¡ = ¹ß»ç¹° ½ÃÀÛÀ§Ä¡ mProjectilePos = pPlayer->GetPos(); /// ¹ß»ç¹° Ÿ°ÙÀ§Ä¡¸¦ ½ÃÀüÀÚ ±âÁØ ¹üÀ§·Î ¹ß»ç¹° ó¸®ÇÒ´ë ¸ñÀûÁöÁ¡À» ¹Ù²Û´Ù. mCenterPos.x = pPlayer->GetXPos(); mCenterPos.y = pPlayer->GetYPos(); mCenterPos.z = pPlayer->Height(); mSkillState = eSKILLPROCESS_ACTIVITY; mCastingTime = 0; mDistressPoint = pStepInfo->mDistressValue; mAttributeType = pSkillInfo->mAttributeType; /// °ø°ÝÀÚ ±×¸®µå¿¡ ÇØ´çÇÏ´Â Ç÷¹À̾ ¸ðµÎ ÀÐ¾î µ¥¹ÌÁö ¹ß¼ÛÀÚ ¸í´Ü¿¡ ³Ö´Â´Ù. cPlayer* pMsgTarget = GRIDMANAGER->FindFirstPlayer( pPlayer, true ); while( pMsgTarget != NULL ) { mSendAroundSet.Insert( pMsgTarget->GetObjectID() ); pMsgTarget = GRIDMANAGER->FindNextPlayer( true ); } /// ÄðŸÀÓ °»½Å SKILLMANAGER->UpdateSkillCoolTime( mAttacker, mSkillIdx, mSkillStep, NETWORK2->GetAccumTime(), mSpeedFactor ); return 0; } bool cPlayerSkillObject::InitPlayerSkill( unsigned long skillIdx, unsigned char skillStep, unsigned long uniqueIdx, cPlayer* pAttacker, cBaseObject* pTarget, unsigned long castingTime ) { if( pAttacker == 0 ) return false; /// °ø°ÝÀÚ ¼ÂÆÃ mAttacker.index = pAttacker->GetObjectID(); mAttacker.type = eOBJECTTYPE_PLAYER; /// skill pcÁ¤º¸ Àоî¿È sPlayerSkillBaseInfo* pSkillInfo = SKILLSCRIPT->GetPlayerSkillInfo( skillIdx ); if( pSkillInfo == NULL ) { assert(NULL); NETWORK2->PostServerEvent("InitPlayerSkill - GetPlayerSkillInfo(%d)", skillIdx ); return false; } /// °ø°ÝÀÚÀÇ º¸À¯½ºÅ³ÀÎÁö üũ cHaveSkillObject* pPlayerHaveSkill = SKILLMANAGER->GetPlayerHaveSkill( mAttacker.index, skillIdx ); if( !pPlayerHaveSkill ) { assert(NULL); NETWORK2->PostServerEvent("InitPlayerSkill - GetPlayerHaveSkill(%d,%d)", mAttacker.index, skillIdx ); return false; } /// ½ºÅ³ ½ºÅÜÁ¤º¸ Àоî¿È unsigned char haveStep = pPlayerHaveSkill->GetSkillStep(); if( haveStep >= pSkillInfo->mStepCount ) { assert(NULL); NETWORK2->PostServerEvent("InitPlayerSkill - mSkillStep(%d)", haveStep ); return false; } if( haveStep < skillStep ) { NETWORK2->PostServerEvent("InitPlayerSkill - haveStep < skillStep(%d,%d)", haveStep, skillStep ); return false; } /// ¿¬Ãâ ½ºÅ©¸³Æ® ÆÄÀÏ¿¡¼­ ½Ã°£ °ªÀ» Àоî¿È cDramaturgyInfo* pDramaInfo = DRAMATURGYMAN->GetPlayerDramaturgyInfo( skillIdx, (unsigned short)pAttacker->GetWeaponState(), pAttacker->GetRace(), pAttacker->GetGender(), &mDramaKey ); if( pDramaInfo == NULL ) { assert(NULL); NETWORK2->PostServerEvent( "InitPlayerSkill - pDramaInfo error[%d,%d,%d,%d]", skillIdx, (unsigned short)pAttacker->GetWeaponState(), pAttacker->GetRace(), pAttacker->GetGender() ); return false; } sDramaState* pDramaState = pDramaInfo->GetDramaState(); if( pDramaState == NULL ) { assert(NULL); NETWORK2->PostServerEvent("InitPlayerSkill, GetDramaState error [%d,%d,%d,%d,%d]", mAttacker.index, skillIdx, (unsigned short)pAttacker->GetWeaponState(), pAttacker->GetRace(), pAttacker->GetGender() ); return false; } /// °íÀ¯ idx ¼ÂÆÃ mUniqueIdx = uniqueIdx; /// ½ºÅ³idxÀÇ °ªÀ» ¼ÂÆÃ. mSkillIdx = skillIdx; mSkillStep = skillStep; sPlayerSkillStepInfo* pStepInfo = &pSkillInfo->mpSetpInfoArray[mSkillStep]; /// Ÿ°Ù ¼ÂÆÃ if( pTarget ) { mCenterTarget.index = pTarget->GetObjectID(); mCenterTarget.type = pTarget->GetObjectType(); } else { mCenterTarget.index = 0; mCenterTarget.type = eOBJECTTYPE_NONE; } /// °ø°Ý¼Óµµ ( ¾ÆÀÌÅÛ, ¹öÇÁ Æ÷ÇÔ ) float attackSpeed = pAttacker->GetStatus2()->mAttackSpeed; if( attackSpeed <= 0.0f || attackSpeed > 2.0f ) attackSpeed = 1.0f; mSpeedFactor = attackSpeed; // mMapNumber = pAttacker->GetMapNumber(); /// ½ºÅ³ ¿ÀºêÁ§Æ® »ý¼º ½Ã°£ mCreationTime = NETWORK2->GetAccumTime(); mDetailCnt = pDramaState->GetDamageCount(); mpDetailBegin = (sDramaAction*)pDramaState->GetDamageBegin(); mpDetailEnd = (sDramaAction*)pDramaState->GetDamageEnd(); /// ½ºÅ©¸³Æ® °Ë»ç if( mDetailCnt >= 10 ) return false; if( mDetailCnt > 1 ) { if( pStepInfo->mApplyValueType1 == eSTATUSPLUS_AROUND_PUSH ) return false; if( pStepInfo->mApplyValueType1 == eSTATUSPLUS_AROUND_PULL ) return false; if( pStepInfo->mApplyValueType2 == eSTATUSPLUS_AROUND_PUSH ) return false; if( pStepInfo->mApplyValueType2 == eSTATUSPLUS_AROUND_PULL ) return false; if( pStepInfo->mApplyValueType2 == eSTATUSPLUS_TARGET_PUSH ) return false; } /// ¹ß»çü À¯¹« mIsProjectile = pDramaInfo->IsBullet(); /// ¹ß»çü ¼Óµµ mProjectileSpeed = pDramaInfo->GetBulletSpeed(); /// ¹ßµ¿ Á¾·á½Ã°£ mActivityTime = pDramaInfo->GetActivityEndTime(); /// °ø°Ý ½ÃÀÛÀ§Ä¡ = ¹ß»ç¹° ½ÃÀÛÀ§Ä¡ mProjectilePos = pAttacker->GetPos(); /// ¹ß»ç¹° Ÿ°ÙÀ§Ä¡¸¦ ½ÃÀüÀÚ ±âÁØ ¹üÀ§·Î ¹ß»ç¹° ó¸®ÇÒ´ë ¸ñÀûÁöÁ¡À» ¹Ù²Û´Ù. mCenterPos.x = pAttacker->GetXPos(); mCenterPos.y = pAttacker->GetYPos(); mCenterPos.z = pAttacker->Height(); mDistressPoint = pStepInfo->mDistressValue; mAttributeType = pSkillInfo->mAttributeType; /// Ÿ°Ù ÇØÁ¦ ½ºÅ³ if( pStepInfo->mApplyValueType1 == eSTATUSPLUS_DELETE_TARGETING || pStepInfo->mApplyValueType2 == eSTATUSPLUS_DELETE_TARGETING) mCreateType = eSKILLCREATETYPE_DELTARGET; else if( pStepInfo->mApplyValueType1 == eSTATUSPLUS_INSTANT_CLEAR_SKILL_COOLTIME || pStepInfo->mApplyValueType2 == eSTATUSPLUS_INSTANT_CLEAR_SKILL_COOLTIME ) mCreateType = eSKILLCREATETYPE_CLEAR_COOLTIME; /// °ø°ÝÀÚ ±×¸®µå¿¡ ÇØ´çÇÏ´Â Ç÷¹À̾ ¸ðµÎ ÀÐ¾î µ¥¹ÌÁö ¹ß¼ÛÀÚ ¸í´Ü¿¡ ³Ö´Â´Ù. cPlayer* pMsgTarget = GRIDMANAGER->FindFirstPlayer( pAttacker, true ); while( pMsgTarget != NULL ) { mSendAroundSet.Insert( pMsgTarget->GetObjectID() ); pMsgTarget = GRIDMANAGER->FindNextPlayer( true ); } if( pTarget ) { /// Ÿ°Ù ±×¸®µå¿¡ ÇØ´çÇÏ´Â Ç÷¹À̾ ¸ðµÎ ÀÐ¾î µ¥¹ÌÁö ¹ß¼ÛÀÚ ¸í´Ü¿¡ ³Ö´Â´Ù. pMsgTarget = GRIDMANAGER->FindFirstPlayer( pTarget, true ); while( pMsgTarget != NULL ) { mSendAroundSet.Insert( pMsgTarget->GetObjectID() ); pMsgTarget = GRIDMANAGER->FindNextPlayer( true ); } } mCastingTime = pAttacker->CalcCastingExt( castingTime ); if( mCastingTime != 0 ) { mSkillState = eSKILLPROCESS_CASTING; } else { mSkillState = eSKILLPROCESS_ACTIVITY; /// ÄðŸÀÓ °»½Å SKILLMANAGER->UpdateSkillCoolTime( mAttacker, mSkillIdx, mSkillStep, NETWORK2->GetAccumTime(), mSpeedFactor ); } return true; } bool cPlayerSkillObject::InitPlayerSkillPosition( unsigned long playerIdx, float targetXPos, float targetYPos, unsigned long skillIdx, unsigned char skillStep, unsigned long uniqueIdx, bool casting ) { cPlayer* pPlayer = OBJECTMANAGER->GetPlayer( playerIdx ); if( pPlayer == NULL ) { assert(NULL); NETWORK2->PostServerEvent("InitPlayerSkillPosition - playerIdx[%d]", playerIdx ); return false; } /// °ø°ÝÀÚ ¼ÂÆÃ mAttacker.index = playerIdx; mAttacker.type = eOBJECTTYPE_PLAYER; /// skill pcÁ¤º¸ Àоî¿È sPlayerSkillBaseInfo* pSkillInfo = SKILLSCRIPT->GetPlayerSkillInfo( skillIdx ); if( pSkillInfo == NULL ) { assert(NULL); NETWORK2->PostServerEvent("InitPlayerSkillPosition - GetPlayerSkillInfo(%d)", skillIdx ); return false; } /// °ø°ÝÀÚÀÇ º¸À¯½ºÅ³ÀÎÁö üũ cHaveSkillObject* pPlayerHaveSkill = SKILLMANAGER->GetPlayerHaveSkill( mAttacker.index, skillIdx ); if( !pPlayerHaveSkill ) { assert(NULL); NETWORK2->PostServerEvent("InitPlayerSkillPosition - GetPlayerHaveSkill(%d,%d)", mAttacker.index, skillIdx ); return false; } /// ½ºÅ³ ½ºÅÜÁ¤º¸ Àоî¿È unsigned char haveStep = pPlayerHaveSkill->GetSkillStep(); if( haveStep >= pSkillInfo->mStepCount ) { assert(NULL); NETWORK2->PostServerEvent("InitPlayerSkillPosition - mSkillStep(%d)", haveStep ); return false; } if( haveStep < skillStep ) { NETWORK2->PostServerEvent("InitPlayerSkillPosition - haveStep < skillStep(%d,%d)", haveStep, skillStep ); return false; } /// ¿¬Ãâ ½ºÅ©¸³Æ® ÆÄÀÏ¿¡¼­ ½Ã°£ °ªÀ» Àоî¿È cDramaturgyInfo* pDramaInfo = DRAMATURGYMAN->GetPlayerDramaturgyInfo( skillIdx, (unsigned short)pPlayer->GetWeaponState(), pPlayer->GetRace(), pPlayer->GetGender() ,&mDramaKey ); if( pDramaInfo == NULL ) { assert(NULL); NETWORK2->PostServerEvent("InitPlayerSkillPosition - pDramaInfo[%d,%d,%d,%d]", skillIdx, (unsigned short)pPlayer->GetWeaponState(), pPlayer->GetRace(), pPlayer->GetGender() ); return false; } sDramaState* pDramaState = pDramaInfo->GetDramaState(); if( pDramaState == NULL ) { assert(NULL); NETWORK2->PostServerEvent("InitPlayerSkill, GetDramaState error [%d,%d,%d,%d,%d]", playerIdx, skillIdx, (unsigned short)pPlayer->GetWeaponState(), pPlayer->GetRace(), pPlayer->GetGender() ); return false; } /// °íÀ¯ idx ¼ÂÆÃ mUniqueIdx = uniqueIdx; /// ½ºÅ³idxÀÇ °ªÀ» ¼ÂÆÃ. mSkillIdx = skillIdx; mSkillStep = skillStep; sPlayerSkillStepInfo* pStepInfo = &pSkillInfo->mpSetpInfoArray[mSkillStep]; /// °ø°Ý¼Óµµ ( ¾ÆÀÌÅÛ, ¹öÇÁ Æ÷ÇÔ ) float attackSpeed = pPlayer->GetStatus2()->mAttackSpeed; if( attackSpeed <= 0.0f || attackSpeed > 2.0f ) attackSpeed = 1.0f; mSpeedFactor = attackSpeed; mMapNumber = pPlayer->GetMapNumber(); /// Ÿ°Ù¿ÀºêÁ§Æ®´Â ¾ø´Ù. mCenterTarget.index = 0; mCenterTarget.type = eOBJECTTYPE_NONE; /// ½ºÅ³ ¿ÀºêÁ§Æ® »ý¼º ½Ã°£ mCreationTime = NETWORK2->GetAccumTime(); mDetailCnt = pDramaState->GetDamageCount(); mpDetailBegin = (sDramaAction*)pDramaState->GetDamageBegin(); mpDetailEnd = (sDramaAction*)pDramaState->GetDamageEnd(); /// ½ºÅ©¸³Æ® °Ë»ç if( mDetailCnt >= 10 ) return false; if( mDetailCnt > 1 ) { if( pStepInfo->mApplyValueType1 == eSTATUSPLUS_AROUND_PUSH ) return false; if( pStepInfo->mApplyValueType1 == eSTATUSPLUS_AROUND_PULL ) return false; if( pStepInfo->mApplyValueType2 == eSTATUSPLUS_AROUND_PUSH ) return false; if( pStepInfo->mApplyValueType2 == eSTATUSPLUS_AROUND_PULL ) return false; if( pStepInfo->mApplyValueType2 == eSTATUSPLUS_TARGET_PUSH ) return false; } /// ¹ß»çü À¯¹« mIsProjectile = pDramaInfo->IsBullet(); /// ¹ß»çü ¼Óµµ mProjectileSpeed = pDramaInfo->GetBulletSpeed(); /// ¹ßµ¿ Á¾·á½Ã°£ mActivityTime = pDramaInfo->GetActivityEndTime(); /// °ø°Ý ½ÃÀÛÀ§Ä¡ = ¹ß»ç¹° ½ÃÀÛÀ§Ä¡ mProjectilePos = pPlayer->GetPos(); /// ±âÁØÁÂÇ¥ ¼ÂÆÃ mCenterPos.x = targetXPos; mCenterPos.y = targetYPos; AIMANAGER->CalcHeight( pPlayer->GetMapNumber(), &mCenterPos.z, mCenterPos.x, mCenterPos.y ); mDistressPoint = pStepInfo->mDistressValue; mAttributeType = pSkillInfo->mAttributeType; if( pSkillInfo->mShotType == eSHOTTYPE_CASTING ) { mCastingTime = pPlayer->CalcCastingExt( pStepInfo->mCastingTime ); } else mCastingTime = 0; if( casting == true ) mSkillState = eSKILLPROCESS_CASTING; else { mSkillState = eSKILLPROCESS_ACTIVITY; /// ÄðŸÀÓ °»½Å SKILLMANAGER->UpdateSkillCoolTime( mAttacker, mSkillIdx, mSkillStep, NETWORK2->GetAccumTime(), mSpeedFactor ); } if( pSkillInfo->mShotType == eSHOTTYPE_CHANNELING ) { mIsChanneling = true; mpChannelDramaState = pDramaState; mChannelingTime = pStepInfo->mCastingTime + mCreationTime; } return true; } bool cPlayerSkillObject::InitPlayerMapChange( unsigned long skillIdx, unsigned long uniqueIdx, cPlayer* pAttacker, unsigned long useItemDBIdx, unsigned long castingTime ) { if( pAttacker == 0 ) return false; /// °íÀ¯ idx ¼ÂÆÃ mUniqueIdx = uniqueIdx; /// ½ºÅ³idxÀÇ °ªÀ» ¼ÂÆÃ. mSkillIdx = skillIdx; mMapNumber = pAttacker->GetMapNumber(); /// °ø°ÝÀÚ ¼ÂÆÃ mAttacker.index = pAttacker->GetObjectID(); mAttacker.type = eOBJECTTYPE_PLAYER; /// Ÿ°Ù ¼ÂÆÃ //sMultiTarget multiTarget; //multiTarget.mTarget.type = eOBJECTTYPE_PLAYER; //multiTarget.mTarget.index = pAttacker->GetObjectID(); ////multiTarget.mApplyHP = true; //mTargetAry.PushBack( multiTarget ); sObject object = { eOBJECTTYPE_PLAYER, pAttacker->GetObjectID() }; SKILLTARGETPOOL->AddSkillTarget( &mTargetRoot, object ); /// ½ºÅ³ ¿ÀºêÁ§Æ® »ý¼º ½Ã°£ mCreationTime = NETWORK2->GetAccumTime(); if( useItemDBIdx == 0 ) return false; mCreateType = eSKILLCREATETYPE_MAPCHANGE; mUseItemIdx = useItemDBIdx; cDramaturgyInfo* pDramaInfo; /// ¿¬Ãâ ½ºÅ©¸³Æ® ÆÄÀÏ¿¡¼­ ½Ã°£ °ªÀ» Àоî¿È pDramaInfo = DRAMATURGYMAN->GetPlayerDramaturgyInfo( skillIdx, (unsigned short)eWEAPON_STATE_NONE, pAttacker->GetRace(), pAttacker->GetGender(), &mDramaKey ); if( pDramaInfo == NULL ) { assert(NULL); NETWORK2->PostServerEvent( "InitPlayerMapchange - pDramaInfo error[%d,%d,%d,%d]", skillIdx, (unsigned short)eWEAPON_STATE_NONE, pAttacker->GetRace(), pAttacker->GetGender() ); return false; } sDramaState* pDramaState = pDramaInfo->GetDramaState(); if( pDramaState == NULL ) { assert(NULL); NETWORK2->PostServerEvent("InitPlayerMapchange, GetDramaState error [%d,%d,%d,%d,%d]", mAttacker.index, skillIdx, (unsigned short)eWEAPON_STATE_NONE, pAttacker->GetRace(), pAttacker->GetGender() ); return false; } mDetailCnt = 0; mpDetailBegin = 0; mpDetailEnd = 0; /// ¹ß»çü À¯¹« mIsProjectile = false; /// ¹ß»çü ¼Óµµ mProjectileSpeed = 0; /// ¹ßµ¿ Á¾·á½Ã°£ mActivityTime = pDramaInfo->GetActivityEndTime(); /// °ø°Ý ½ÃÀÛÀ§Ä¡ = ¹ß»ç¹° ½ÃÀÛÀ§Ä¡ mProjectilePos = pAttacker->GetPos(); /// skill pcÁ¤º¸ Àоî¿È mCastingTime = castingTime; if( mCastingTime != 0 ) mSkillState = eSKILLPROCESS_CASTING; else mSkillState = eSKILLPROCESS_ACTIVITY; /// °ø°ÝÀÚ ±×¸®µå¿¡ ÇØ´çÇÏ´Â Ç÷¹À̾ ¸ðµÎ ÀÐ¾î µ¥¹ÌÁö ¹ß¼ÛÀÚ ¸í´Ü¿¡ ³Ö´Â´Ù. cPlayer* pMsgTarget = GRIDMANAGER->FindFirstPlayer( pAttacker, true ); while( pMsgTarget != NULL ) { mSendAroundSet.Insert( pMsgTarget->GetObjectID() ); pMsgTarget = GRIDMANAGER->FindNextPlayer( true ); } return true; } bool cPlayerSkillObject::InitPlayerVehicle( unsigned long skillIdx, unsigned long uniqueIdx, cPlayer* pAttacker, unsigned long useItemIdx, unsigned long castingTime ) { if( pAttacker == 0 ) return false; /// °íÀ¯ idx ¼ÂÆÃ mUniqueIdx = uniqueIdx; /// ½ºÅ³idxÀÇ °ªÀ» ¼ÂÆÃ. mSkillIdx = skillIdx; mMapNumber = pAttacker->GetMapNumber(); /// °ø°ÝÀÚ ¼ÂÆÃ mAttacker.index = pAttacker->GetObjectID(); mAttacker.type = eOBJECTTYPE_PLAYER; /// Ÿ°Ù ¼ÂÆÃ //sMultiTarget multiTarget; //multiTarget.mTarget.type = eOBJECTTYPE_PLAYER; //multiTarget.mTarget.index = pAttacker->GetObjectID(); ////multiTarget.mApplyHP = true; //mTargetAry.PushBack( multiTarget ); sObject object = { eOBJECTTYPE_PLAYER, pAttacker->GetObjectID() }; SKILLTARGETPOOL->AddSkillTarget( &mTargetRoot, object ); /// ½ºÅ³ ¿ÀºêÁ§Æ® »ý¼º ½Ã°£ mCreationTime = NETWORK2->GetAccumTime(); if( useItemIdx == 0 ) return false; mCreateType = eSKILLCREATETYPE_VEHICLE; mUseItemIdx = useItemIdx; cDramaturgyInfo* pDramaInfo; /// ¿¬Ãâ ½ºÅ©¸³Æ® ÆÄÀÏ¿¡¼­ ½Ã°£ °ªÀ» Àоî¿È pDramaInfo = DRAMATURGYMAN->GetPlayerDramaturgyInfo( skillIdx, (unsigned short)eWEAPON_STATE_NONE, pAttacker->GetRace(), pAttacker->GetGender(), &mDramaKey ); if( pDramaInfo == NULL ) { assert(NULL); NETWORK2->PostServerEvent( "InitPlayerVehicle - pDramaInfo error[%d,%d,%d,%d]", skillIdx, (unsigned short)eWEAPON_STATE_NONE, pAttacker->GetRace(), pAttacker->GetGender() ); return false; } sDramaState* pDramaState = pDramaInfo->GetDramaState(); if( pDramaState == NULL ) { assert(NULL); NETWORK2->PostServerEvent("InitPlayerVehicle, GetDramaState error [%d,%d,%d,%d,%d]", mAttacker.index, skillIdx, (unsigned short)eWEAPON_STATE_NONE, pAttacker->GetRace(), pAttacker->GetGender() ); return false; } mDetailCnt = 0; mpDetailBegin = 0; mpDetailEnd = 0; /// ¹ß»çü À¯¹« mIsProjectile = false; /// ¹ß»çü ¼Óµµ mProjectileSpeed = 0; /// ¹ßµ¿ Á¾·á½Ã°£ mActivityTime = pDramaInfo->GetActivityEndTime(); /// °ø°Ý ½ÃÀÛÀ§Ä¡ = ¹ß»ç¹° ½ÃÀÛÀ§Ä¡ mProjectilePos = pAttacker->GetPos(); /// skill pcÁ¤º¸ Àоî¿È mCastingTime = castingTime; if( mCastingTime != 0 ) mSkillState = eSKILLPROCESS_CASTING; else mSkillState = eSKILLPROCESS_ACTIVITY; /// °ø°ÝÀÚ ±×¸®µå¿¡ ÇØ´çÇÏ´Â Ç÷¹À̾ ¸ðµÎ ÀÐ¾î µ¥¹ÌÁö ¹ß¼ÛÀÚ ¸í´Ü¿¡ ³Ö´Â´Ù. cPlayer* pMsgTarget = GRIDMANAGER->FindFirstPlayer( pAttacker, true ); while( pMsgTarget != NULL ) { mSendAroundSet.Insert( pMsgTarget->GetObjectID() ); pMsgTarget = GRIDMANAGER->FindNextPlayer( true ); } return true; } bool cPlayerSkillObject::InitPlayerBlink( unsigned long skillIdx, unsigned long uniqueIdx, cPlayer* pAttacker, NiPoint2 targetPos ) { if( pAttacker == 0 ) return false; /// °íÀ¯ idx ¼ÂÆÃ mUniqueIdx = uniqueIdx; /// ½ºÅ³idxÀÇ °ªÀ» ¼ÂÆÃ. mSkillIdx = skillIdx; mMapNumber = pAttacker->GetMapNumber(); /// °ø°ÝÀÚ ¼ÂÆÃ mAttacker.index = pAttacker->GetObjectID(); mAttacker.type = eOBJECTTYPE_PLAYER; /// Ÿ°Ù ¼ÂÆÃ //sMultiTarget multiTarget; //multiTarget.mTarget.type = eOBJECTTYPE_PLAYER; //multiTarget.mTarget.index = pAttacker->GetObjectID(); ////multiTarget.mApplyHP = true; //mTargetAry.PushBack( multiTarget ); sObject object = { eOBJECTTYPE_PLAYER, pAttacker->GetObjectID() }; SKILLTARGETPOOL->AddSkillTarget( &mTargetRoot, object ); /// ½ºÅ³ ¿ÀºêÁ§Æ® »ý¼º ½Ã°£ mCreationTime = NETWORK2->GetAccumTime(); mCreateType = eSKILLCREATETYPE_BLINK; mCenterPos.x = targetPos.x; mCenterPos.y = targetPos.y; AIMANAGER->CalcHeight( pAttacker->GetMapNumber(), &mCenterPos.z, mCenterPos.x, mCenterPos.y ); cDramaturgyInfo* pDramaInfo; /// ¿¬Ãâ ½ºÅ©¸³Æ® ÆÄÀÏ¿¡¼­ ½Ã°£ °ªÀ» Àоî¿È pDramaInfo = DRAMATURGYMAN->GetPlayerDramaturgyInfo( skillIdx, (unsigned short)pAttacker->GetWeaponState(), pAttacker->GetRace(), pAttacker->GetGender(), &mDramaKey ); if( pDramaInfo == NULL ) { assert(NULL); NETWORK2->PostServerEvent( "InitPlayerVehicle - pDramaInfo error[%d,%d,%d,%d]", skillIdx, (unsigned short)pAttacker->GetWeaponState(), pAttacker->GetRace(), pAttacker->GetGender() ); return false; } sDramaState* pDramaState = pDramaInfo->GetDramaState(); if( pDramaState == NULL ) { assert(NULL); NETWORK2->PostServerEvent("InitPlayerVehicle, GetDramaState error [%d,%d,%d,%d,%d]", mAttacker.index, skillIdx, (unsigned short)eWEAPON_STATE_NONE, pAttacker->GetRace(), pAttacker->GetGender() ); return false; } mDetailCnt = 0; mpDetailBegin = 0; mpDetailEnd = 0; /// ¹ß»çü À¯¹« mIsProjectile = false; /// ¹ß»çü ¼Óµµ mProjectileSpeed = 0; /// ¹ßµ¿ Á¾·á½Ã°£ mActivityTime = pDramaInfo->GetActivityEndTime(); /// °ø°Ý ½ÃÀÛÀ§Ä¡ = ¹ß»ç¹° ½ÃÀÛÀ§Ä¡ mProjectilePos = pAttacker->GetPos(); /// skill pcÁ¤º¸ Àоî¿È mCastingTime = 0; mSkillState = eSKILLPROCESS_ACTIVITY; /// °ø°ÝÀÚ ±×¸®µå¿¡ ÇØ´çÇÏ´Â Ç÷¹À̾ ¸ðµÎ ÀÐ¾î µ¥¹ÌÁö ¹ß¼ÛÀÚ ¸í´Ü¿¡ ³Ö´Â´Ù. cPlayer* pMsgTarget = GRIDMANAGER->FindFirstPlayer( pAttacker, true ); while( pMsgTarget != NULL ) { mSendAroundSet.Insert( pMsgTarget->GetObjectID() ); pMsgTarget = GRIDMANAGER->FindNextPlayer( true ); } return true; } bool cPlayerSkillObject::InitCashMapChange( unsigned long skillIdx, unsigned long uniqueIdx, cPlayer* pAttacker, unsigned long castingTime, unsigned short mapNum, float x, float y, unsigned long useItemIdx ) { if( pAttacker == 0 ) return false; mCashMapNum = mapNum; mCashX = x; mCashY = y; /// °íÀ¯ idx ¼ÂÆÃ mUniqueIdx = uniqueIdx; /// ½ºÅ³idxÀÇ °ªÀ» ¼ÂÆÃ. mSkillIdx = skillIdx; mMapNumber = pAttacker->GetMapNumber(); /// °ø°ÝÀÚ ¼ÂÆÃ mAttacker.index = pAttacker->GetObjectID(); mAttacker.type = eOBJECTTYPE_PLAYER; mUseItemIdx = useItemIdx; /// Ÿ°Ù ¼ÂÆÃ //sMultiTarget multiTarget; //multiTarget.mTarget.type = eOBJECTTYPE_PLAYER; //multiTarget.mTarget.index = pAttacker->GetObjectID(); ////multiTarget.mApplyHP = true; //mTargetAry.PushBack( multiTarget ); sObject object = { eOBJECTTYPE_PLAYER, pAttacker->GetObjectID() }; SKILLTARGETPOOL->AddSkillTarget( &mTargetRoot, object ); /// ½ºÅ³ ¿ÀºêÁ§Æ® »ý¼º ½Ã°£ mCreationTime = NETWORK2->GetAccumTime(); mCreateType = eSKILLCREATETYPE_CASHMAPCHANGE; cDramaturgyInfo* pDramaInfo; /// ¿¬Ãâ ½ºÅ©¸³Æ® ÆÄÀÏ¿¡¼­ ½Ã°£ °ªÀ» Àоî¿È pDramaInfo = DRAMATURGYMAN->GetPlayerDramaturgyInfo( skillIdx, (unsigned short)eWEAPON_STATE_NONE, pAttacker->GetRace(), pAttacker->GetGender(), &mDramaKey ); if( pDramaInfo == NULL ) { assert(NULL); NETWORK2->PostServerEvent( "InitPlayerMapchange - pDramaInfo error[%d,%d,%d,%d]", skillIdx, (unsigned short)eWEAPON_STATE_NONE, pAttacker->GetRace(), pAttacker->GetGender() ); return false; } sDramaState* pDramaState = pDramaInfo->GetDramaState(); if( pDramaState == NULL ) { assert(NULL); NETWORK2->PostServerEvent("InitPlayerMapchange, GetDramaState error [%d,%d,%d,%d,%d]", mAttacker.index, skillIdx, (unsigned short)eWEAPON_STATE_NONE, pAttacker->GetRace(), pAttacker->GetGender() ); return false; } mDetailCnt = 0; mpDetailBegin = 0; mpDetailEnd = 0; /// ¹ß»çü À¯¹« mIsProjectile = false; /// ¹ß»çü ¼Óµµ mProjectileSpeed = 0; /// ¹ßµ¿ Á¾·á½Ã°£ mActivityTime = pDramaInfo->GetActivityEndTime(); /// °ø°Ý ½ÃÀÛÀ§Ä¡ = ¹ß»ç¹° ½ÃÀÛÀ§Ä¡ mProjectilePos = pAttacker->GetPos(); /// skill pcÁ¤º¸ Àоî¿È mCastingTime = castingTime; if( mCastingTime != 0 ) mSkillState = eSKILLPROCESS_CASTING; else mSkillState = eSKILLPROCESS_ACTIVITY; /// °ø°ÝÀÚ ±×¸®µå¿¡ ÇØ´çÇÏ´Â Ç÷¹À̾ ¸ðµÎ ÀÐ¾î µ¥¹ÌÁö ¹ß¼ÛÀÚ ¸í´Ü¿¡ ³Ö´Â´Ù. cPlayer* pMsgTarget = GRIDMANAGER->FindFirstPlayer( pAttacker, true ); while( pMsgTarget != NULL ) { mSendAroundSet.Insert( pMsgTarget->GetObjectID() ); pMsgTarget = GRIDMANAGER->FindNextPlayer( true ); } return true; } bool cPlayerSkillObject::InitRushAfterSkill( unsigned long skillIdx, unsigned char skillStep, unsigned long uniqueIdx, cPlayer* pAttacker, cBaseObject* pTarget, unsigned long castingTime ) { if( pAttacker == 0 ) return false; /// °ø°ÝÀÚ ¼ÂÆÃ mAttacker.index = pAttacker->GetObjectID(); mAttacker.type = eOBJECTTYPE_PLAYER; /// skill pcÁ¤º¸ Àоî¿È sPlayerSkillBaseInfo* pSkillInfo = SKILLSCRIPT->GetPlayerSkillInfo( skillIdx ); if( pSkillInfo == NULL ) { assert(NULL); NETWORK2->PostServerEvent("InitPlayerSkill - GetPlayerSkillInfo(%d)", skillIdx ); return false; } /// ½ºÅ³ ½ºÅÜÁ¤º¸ Àоî¿È if( skillStep >= pSkillInfo->mStepCount ) { assert(NULL); NETWORK2->PostServerEvent("InitPlayerSkill - mSkillStep(%d)", skillStep ); return false; } /// ¿¬Ãâ ½ºÅ©¸³Æ® ÆÄÀÏ¿¡¼­ ½Ã°£ °ªÀ» Àоî¿È cDramaturgyInfo* pDramaInfo = DRAMATURGYMAN->GetPlayerDramaturgyInfo( skillIdx, (unsigned short)pAttacker->GetWeaponState(), pAttacker->GetRace(), pAttacker->GetGender(), &mDramaKey ); if( pDramaInfo == NULL ) { assert(NULL); NETWORK2->PostServerEvent( "InitPlayerSkill - pDramaInfo error[%d,%d,%d,%d]", skillIdx, (unsigned short)pAttacker->GetWeaponState(), pAttacker->GetRace(), pAttacker->GetGender() ); return false; } sDramaState* pDramaState = pDramaInfo->GetDramaState(); if( pDramaState == NULL ) { assert(NULL); NETWORK2->PostServerEvent("InitPlayerSkill, GetDramaState error [%d,%d,%d,%d,%d]", mAttacker.index, skillIdx, (unsigned short)pAttacker->GetWeaponState(), pAttacker->GetRace(), pAttacker->GetGender() ); return false; } /// °íÀ¯ idx ¼ÂÆÃ mUniqueIdx = uniqueIdx; /// ½ºÅ³idxÀÇ °ªÀ» ¼ÂÆÃ. mSkillIdx = skillIdx; mSkillStep = skillStep; sPlayerSkillStepInfo* pStepInfo = &pSkillInfo->mpSetpInfoArray[mSkillStep]; /// Ÿ°Ù ¼ÂÆÃ if( pTarget ) { mCenterTarget.index = pTarget->GetObjectID(); mCenterTarget.type = pTarget->GetObjectType(); } else { mCenterTarget.index = 0; mCenterTarget.type = eOBJECTTYPE_NONE; } mMapNumber = pAttacker->GetMapNumber(); /// ½ºÅ³ ¿ÀºêÁ§Æ® »ý¼º ½Ã°£ mCreationTime = NETWORK2->GetAccumTime(); mDetailCnt = pDramaState->GetDamageCount(); mpDetailBegin = (sDramaAction*)pDramaState->GetDamageBegin(); mpDetailEnd = (sDramaAction*)pDramaState->GetDamageEnd(); /// ½ºÅ©¸³Æ® °Ë»ç if( mDetailCnt >= 10 ) return false; if( mDetailCnt > 1 ) { if( pStepInfo->mApplyValueType1 == eSTATUSPLUS_AROUND_PUSH ) return false; if( pStepInfo->mApplyValueType1 == eSTATUSPLUS_AROUND_PULL ) return false; if( pStepInfo->mApplyValueType2 == eSTATUSPLUS_AROUND_PUSH ) return false; if( pStepInfo->mApplyValueType2 == eSTATUSPLUS_AROUND_PULL ) return false; if( pStepInfo->mApplyValueType2 == eSTATUSPLUS_TARGET_PUSH ) return false; } /// ¹ß»çü À¯¹« mIsProjectile = pDramaInfo->IsBullet(); /// ¹ß»çü ¼Óµµ mProjectileSpeed = pDramaInfo->GetBulletSpeed(); /// ¹ßµ¿ Á¾·á½Ã°£ mActivityTime = pDramaInfo->GetActivityEndTime(); /// °ø°Ý ½ÃÀÛÀ§Ä¡ = ¹ß»ç¹° ½ÃÀÛÀ§Ä¡ mProjectilePos = pAttacker->GetPos(); /// ¹ß»ç¹° Ÿ°ÙÀ§Ä¡¸¦ ½ÃÀüÀÚ ±âÁØ ¹üÀ§·Î ¹ß»ç¹° ó¸®ÇÒ´ë ¸ñÀûÁöÁ¡À» ¹Ù²Û´Ù. mCenterPos.x = pAttacker->GetXPos(); mCenterPos.y = pAttacker->GetYPos(); mCenterPos.z = pAttacker->Height(); mDistressPoint = pStepInfo->mDistressValue; mAttributeType = pSkillInfo->mAttributeType; /// Ÿ°Ù ÇØÁ¦ ½ºÅ³ if( pStepInfo->mApplyValueType1 == eSTATUSPLUS_DELETE_TARGETING || pStepInfo->mApplyValueType2 == eSTATUSPLUS_DELETE_TARGETING) mCreateType = eSKILLCREATETYPE_DELTARGET; /// °ø°ÝÀÚ ±×¸®µå¿¡ ÇØ´çÇÏ´Â Ç÷¹À̾ ¸ðµÎ ÀÐ¾î µ¥¹ÌÁö ¹ß¼ÛÀÚ ¸í´Ü¿¡ ³Ö´Â´Ù. cPlayer* pMsgTarget = GRIDMANAGER->FindFirstPlayer( pAttacker, true ); while( pMsgTarget != NULL ) { mSendAroundSet.Insert( pMsgTarget->GetObjectID() ); pMsgTarget = GRIDMANAGER->FindNextPlayer( true ); } if( pTarget ) { /// Ÿ°Ù ±×¸®µå¿¡ ÇØ´çÇÏ´Â Ç÷¹À̾ ¸ðµÎ ÀÐ¾î µ¥¹ÌÁö ¹ß¼ÛÀÚ ¸í´Ü¿¡ ³Ö´Â´Ù. pMsgTarget = GRIDMANAGER->FindFirstPlayer( pTarget, true ); while( pMsgTarget != NULL ) { mSendAroundSet.Insert( pMsgTarget->GetObjectID() ); pMsgTarget = GRIDMANAGER->FindNextPlayer( true ); } } mCastingTime = castingTime; if( mCastingTime != 0 ) { mSkillState = eSKILLPROCESS_CASTING; } else { mSkillState = eSKILLPROCESS_ACTIVITY; } return true; } bool cPlayerSkillObject::CastingObjectCheck( cBaseObject* pAttacker ) { unsigned char errorCode = FAIL_SKILL_CASTING_DONT_TARGET; /// »ýÁ¸ ¿©ºÎ È®ÀÎ if( pAttacker->GetStateDie() == false ) { sPlayerSkillBaseInfo* pSkillInfo = SKILLSCRIPT->GetPlayerSkillInfo( mSkillIdx ); if( pSkillInfo != NULL ) { if( ((cPlayer*)pAttacker)->IsCantSkill( pSkillInfo->mAttributeType ) == false ) { /// ¹üÀ§ ¹æ½Ä¿¡ µû¸¥ Ÿ°Ù °´Ã¼ È®ÀÎ ¿©ºÎ switch( pSkillInfo->mBoundType ) { case eBOUNDTYPE_SELF_NOTARGET: case eBOUNDTYPE_FIELD: case eBOUNDTYPE_AUTOFIELD: return true; case eBOUNDTYPE_NONE: /// ¹üÀ§ ¾øÀ½ case eBOUNDTYPE_TARGET: /// Ÿ°Ù ±âÁعüÀ§ case eBOUNDTYPE_SELF_TARGET: /// ½ÃÀüÀÚ(ÀÚ½Å) ±âÁعüÀ§ - ¹ßµ¿½Ã Ÿ°Ù Á¸Àç { /// ÀÚ½ÅÀÌ Àû¿ë ´ë»óÀÌ¸é ¸®ÅÏ if( pSkillInfo->mApplyType == eAPPLYTYPE_SELF || pSkillInfo->mApplyType == eAPPLYTYPE_BUFF_SELF || pSkillInfo->mApplyType == eAPPLYTYPE_DEBUFF_SELF ) return true; } } /// Ÿ°Ù °´Ã¼ üũ cBaseObject* pTarget = OBJECTMANAGER->GetObject( mCenterTarget.type, mCenterTarget.index ); if( pTarget != NULL ) { /// ºÎȰ ½ºÅ³ÀÎÁö üũ bool isResurrection = false; if( pSkillInfo->mApplyType == eAPPLYTYPE_DIEBUDDY ) isResurrection = true; /// »ýÁ¸ À¯¹« üũ if( pTarget->GetStateDie() == false && isResurrection == false ) return true; /// ºÎȰ ½ºÅ³ Á¶°Ç ¸¸Á· if( pTarget->GetStateDie() == true && isResurrection == true ) return true; } } else { errorCode = FAIL_SKILL_CASTING_DONT_OBSTACLE; } } else { NETWORK2->PostServerEvent("cPlayerSkillObject[%d]::CastingObjectCheck pSkillInfo[%d] == NULL", pAttacker->GetObjectID(), mSkillIdx ); errorCode = FAIL_SKILL_CASTING_DONT_SCRIPT; } } else errorCode = FAIL_SKILL_CASTING_DONT_ATTACKER; /// ij½ºÆÃ ¹ßµ¿ ½ÇÆÐ ¸Þ¼¼Áö Àü¼Û MSG_SYN_SKILL_CAST_ACTIVITY_FAIL failMsg; failMsg.Category = NM_SKILL; failMsg.Protocol = NM_SKILL_CAST_ACTIVITY_FAIL_SYN; failMsg.mAttacker = mAttacker; failMsg.mSkillIndex = mUniqueIdx; failMsg.mFailCode = errorCode; NETWORK2->QuickSend( pAttacker, (char*)&failMsg, sizeof(failMsg) ); /// Á¶°ÇÀÌ ¸¸Á·ÇÏ´Â °æ¿ì »ó´Ü¿¡ return true·Î ºüÁ®³ª°¨ ¿©±â±îÁö ¿Â°æ¿ì Á¶°ÇÀ» ¸¸Á· ¸øÇÏ´Â °æ¿ìÀÓ return false; } /// ÁÖÀÇ : ij½ºÆÃ ÇÏ´Â °æ¿ì¸¸ ÀÌÇÔ¼ö·Î µé¾î¿È bool cPlayerSkillObject::RequireValue( cBaseObject* pAttacker ) { /// skill pcÁ¤º¸ ½ºÅÜÁ¤º¸ Àоî¿È sPlayerSkillBaseInfo* pSkillInfo = SKILLSCRIPT->GetPlayerSkillInfo( mSkillIdx ); if( pSkillInfo == NULL ) { assert(NULL); NETWORK2->PostServerEvent("cPlayerSkillObject[%d]::RequireValue pSkillInfo[%d] == NULL", pAttacker->GetObjectID(), mSkillIdx ); SKILLMANAGER->InsertDeleteSkillObject( mAttacker, mUniqueIdx ); return false; } if( mSkillStep > pSkillInfo->mStepCount ) { assert(NULL); NETWORK2->PostServerEvent("cPlayerSkillObject[%d]::RequireValue mSkillStep[%d] > pSkillInfo->mStepCount", pAttacker->GetObjectID(), mSkillStep ); SKILLMANAGER->InsertDeleteSkillObject( mAttacker, mUniqueIdx ); return false; } sPlayerSkillStepInfo* pStepInfo = &pSkillInfo->mpSetpInfoArray[mSkillStep]; /// ¼Ò¸ð üũ switch( mCreateType ) { case eSKILLCREATETYPE_NORMAL: { /// °ø°ÝÀÚ°¡ Á¢¼Ó Á¾·áÁß ÀÌ¸é »ç¿ëºÒ°¡¸¦ ¾Ë¸² if( ((cPlayer*)pAttacker)->GetGameIn() == false ) { /// ij½ºÆÃ ¹ßµ¿ ½ÇÆÐ ¸Þ¼¼Áö Àü¼Û MSG_SYN_SKILL_CAST_ACTIVITY_FAIL failMsg; failMsg.Category = NM_SKILL; failMsg.Protocol = NM_SKILL_CAST_ACTIVITY_FAIL_SYN; failMsg.mAttacker = mAttacker; failMsg.mSkillIndex = mUniqueIdx; failMsg.mFailCode = FAIL_SKILL_CASTING_DONT_OBSTACLE; NETWORK2->QuickSend( pAttacker, (char*)&failMsg, sizeof(failMsg) ); return false; } unsigned long useMP = pStepInfo->mUseMP; if( pStepInfo->mUseMPPer != 0 ) useMP += ((cPlayer*)pAttacker)->GetOriMPMax() * pStepInfo->mUseMPPer / 100; /// ¼Ò¸ð üũ if( pAttacker && pAttacker->GetObjectType() == eOBJECTTYPE_PLAYER ) { useMP = ((cPlayer*)pAttacker)->CalcUseMPExt( useMP ); } if( pAttacker->GetHP() <= pStepInfo->mUseHP || pAttacker->GetMP() < useMP || ( pSkillInfo->mUseItem != 0 && ((cPlayer*)pAttacker)->IsItemUse( pSkillInfo->mUseItem, pStepInfo->mUseItemCount ) == false ) ) { /// ij½ºÆÃ ¹ßµ¿ ½ÇÆÐ ¸Þ¼¼Áö Àü¼Û MSG_SYN_SKILL_CAST_ACTIVITY_FAIL failMsg; failMsg.Category = NM_SKILL; failMsg.Protocol = NM_SKILL_CAST_ACTIVITY_FAIL_SYN; failMsg.mAttacker = mAttacker; failMsg.mSkillIndex = mUniqueIdx; failMsg.mFailCode = FAIL_SKILL_CASTING_MP_EMPTY; NETWORK2->QuickSend( pAttacker, (char*)&failMsg, sizeof(failMsg) ); return false; } if( pStepInfo->mUseItemCount != 0 ) ((cPlayer*)pAttacker)->ItemUse( pSkillInfo->mUseItem, pStepInfo->mUseItemCount ); /// MP¸¦ ¼Ò¸ð ÇÏ´Â ½ºÅ³ if( useMP != 0 ) pAttacker->MPUse( useMP, false ); /// HP¸¦ ¼Ò¸ð ÇÏ´Â ½ºÅ³ if( pStepInfo->mUseHP != 0 ) { /// HP ¼Ò¸ð & ¸Þ¼¼Áö ¹ß¼Û pAttacker->HPUse( pStepInfo->mUseHP, true ); } /// ÄðŸÀÓ °»½Å SKILLMANAGER->UpdateSkillCoolTime( mAttacker, mSkillIdx, mSkillStep, NETWORK2->GetAccumTime(), mSpeedFactor ); } break; case eSKILLCREATETYPE_MAPCHANGE: { /// itemÀ» À¯¹« È®ÀÎ if( ((cPlayer*)pAttacker)->IsItemIdx( mUseItemIdx ) == false ) { /// ij½ºÆÃ ¹ßµ¿ ½ÇÆÐ ¸Þ¼¼Áö Àü¼Û MSG_SYN_SKILL_CAST_ACTIVITY_FAIL failMsg; failMsg.Category = NM_SKILL; failMsg.Protocol = NM_SKILL_CAST_ACTIVITY_FAIL_SYN; failMsg.mAttacker = mAttacker; failMsg.mSkillIndex = mUniqueIdx; failMsg.mFailCode = FAIL_SKILL_CASTING_DONT_MAPCHANGE; NETWORK2->QuickSend( pAttacker, (char*)&failMsg, sizeof(failMsg) ); return false; } } break; case eSKILLCREATETYPE_VEHICLE: { /// itemÀ» À¯¹« È®ÀÎ if( ((cPlayer*)pAttacker)->IsItem( mUseItemIdx ) == false ) { /// ij½ºÆÃ ¹ßµ¿ ½ÇÆÐ ¸Þ¼¼Áö Àü¼Û MSG_SYN_SKILL_CAST_ACTIVITY_FAIL failMsg; failMsg.Category = NM_SKILL; failMsg.Protocol = NM_SKILL_CAST_ACTIVITY_FAIL_SYN; failMsg.mAttacker = mAttacker; failMsg.mSkillIndex = mUniqueIdx; failMsg.mFailCode = FAIL_SKILL_CASTING_DONT_VEHICLE; NETWORK2->QuickSend( pAttacker, (char*)&failMsg, sizeof(failMsg) ); return false; } } break; } /// ij½ºÆÃ ½ºÅ³ ¹ßµ¿½Ã mp¼Ò¸ð¿Í ¹ßµ¿À» ¾Ë¸®´Â ½ÌÅ© Àü¼Û MSG_SYN_SKILL_CAST_ACTIVE msgEtc; msgEtc.Category = NM_SKILL; if( pSkillInfo->mBoundType == eBOUNDTYPE_FIELD || pSkillInfo->mBoundType == eBOUNDTYPE_AUTOFIELD) msgEtc.Protocol = NM_SKILL_POS_CAST_ACTIVE_SYN; else msgEtc.Protocol = NM_SKILL_CAST_ACTIVE_SYN; msgEtc.mSkillIndex = mUniqueIdx; msgEtc.mAttacker = mAttacker; msgEtc.mAttackerPosX = pAttacker->GetXPos(); msgEtc.mAttackerPosY = pAttacker->GetYPos(); msgEtc.mObjectMP = pAttacker->GetMP(); msgEtc.mObjectMaxMp = pAttacker->GetMaxMP(); NETWORK2->QuickSend( pAttacker, (char*)&msgEtc, sizeof(msgEtc) ); ///¹ßµ¿ üũ cBaseObject* pTarget = OBJECTMANAGER->GetObject( mCenterTarget.type, mCenterTarget.index ); if( pTarget ) { switch( pSkillInfo->mType ) { case eSKILLTYPE_DAMAGE: case eSKILLTYPE_MPDAMAGE: SKILLMANAGER->CheckActInfluence( eACTSTATUS_ACTIVESKILL, pAttacker, pTarget ); break; case eSKILLTYPE_HEAL: SKILLMANAGER->CheckActInfluence( eACTSTATUS_HEALSKILL, pAttacker, pTarget ); break; } /// ½ºÅ³ ¹ßµ¿ È¿°ú if( pStepInfo && pStepInfo->mActiveIdx != 0 ) SKILLMANAGER->CheckSkillActInfluence( pStepInfo->mActiveIdx, pAttacker, pTarget ); } return true; } bool cPlayerSkillObject::SetCenterPos() { /// skill pcÁ¤º¸ ½ºÅÜÁ¤º¸ Àоî¿È sPlayerSkillBaseInfo* pSkillInfo = SKILLSCRIPT->GetPlayerSkillInfo( mSkillIdx ); if( pSkillInfo == NULL ) { assert(NULL); NETWORK2->PostServerEvent("cPlayerSkillObject::SetCenterPos pSkillInfo[%d] == NULL", mSkillIdx ); SKILLMANAGER->InsertDeleteSkillObject( mAttacker, mUniqueIdx ); return false; } /// µ¥¹ÌÁö Àû¿ë½Ã ±âÁØÀÌ µÉ À§Ä¡ÁÂÇ¥ »êÃâ switch( pSkillInfo->mBoundType ) { case eBOUNDTYPE_NONE: /// ¹üÀ§ °ø°ÝÀÌ ¾Æ´Ô case eBOUNDTYPE_TARGET: /// Ÿ°Ù ±âÁعüÀ§ { /// »ç°Å¸® üũ ´ë»óÀÌ ½ÃÀüÀÚÀΰæ¿ì ÇÊ¿ä ¾øÀ½ if( pSkillInfo->mApplyType != eAPPLYTYPE_SELF && pSkillInfo->mApplyType != eAPPLYTYPE_BUFF_SELF && pSkillInfo->mApplyType != eAPPLYTYPE_DEBUFF_SELF ) { cBaseObject* pObject = OBJECTMANAGER->GetObject( mCenterTarget.type, mCenterTarget.index ); /// ¹ßµ¿ Àü¿¡ Ÿ°ÙÀÌ »ç¶óÁø°æ¿ì µ¥¹ÌÁö ¹Ì½º if( pObject == NULL || pObject->GetMapNumber() != mMapNumber ) return false; mCenterPos.x = pObject->GetXPos(); mCenterPos.y = pObject->GetYPos(); mCenterPos.z = pObject->Height(); } }break; } return true; } void cPlayerSkillObject::TargetSelect( cBaseObject* pAttacker ) { /// skill pcÁ¤º¸ ½ºÅÜÁ¤º¸ Àоî¿È sPlayerSkillBaseInfo* pSkillInfo = SKILLSCRIPT->GetPlayerSkillInfo( mSkillIdx ); if( pSkillInfo == NULL ) { assert(NULL); NETWORK2->PostServerEvent("cPlayerSkillObject[%d]::TargetSelect pSkillInfo[%d] == NULL", pAttacker->GetObjectID(), mSkillIdx ); SKILLMANAGER->InsertDeleteSkillObject( mAttacker, mUniqueIdx ); return; } if( mSkillStep > pSkillInfo->mStepCount ) { assert(NULL); NETWORK2->PostServerEvent("cPlayerSkillObject[%d]::TargetSelect mSkillStep[%d] > pSkillInfo->mStepCount", pAttacker->GetObjectID(), mSkillStep ); SKILLMANAGER->InsertDeleteSkillObject( mAttacker, mUniqueIdx ); return; } sPlayerSkillStepInfo* pStepInfo = &pSkillInfo->mpSetpInfoArray[mSkillStep]; bool applyHP = pSkillInfo->mType == eSKILLTYPE_MPDAMAGE ? false : true; /// ¹ß»çüÁß Å¸°ÙÀ» ÇâÇØ ³¯¾Æ °¡´Ù Ÿ°ÙÀÌ »ç¶óÁø°æ¿ì µ¥¹ÌÁö ¹Ì½ºÃ³¸® ¿©ºÎ if( mNoTargetNoDamage == true ) return; unsigned char targetMaxCnt = pStepInfo->mApplyCnt; if( targetMaxCnt == 0 || targetMaxCnt > TARGET_CNT_MAX ) targetMaxCnt = TARGET_CNT_MAX; else { /// Àû¿ë ÀοøÀÌ Á¦ÇÑµÈ °æ¿ì °ø°ÝÀÚ°¡ ¹üÀ§ ½ºÅ³ Àû¿ë Àοø Áõ°¡ È¿°ú¿¡ °É·ÁÀÖ´ÂÁö üũ ÇÏ¿© ³Ö±â if( pAttacker->GetObjectType() == eOBJECTTYPE_PLAYER || pAttacker->GetObjectType() == eOBJECTTYPE_MONSTER ) { long addApplyCnt = (long)pAttacker->GetStateOddity( eODDITYTYPE_ADD_APPLY_CNT ); if( addApplyCnt > 0 ) { if( (addApplyCnt + targetMaxCnt) > UCHAR_MAX ) { assert(0); targetMaxCnt = TARGET_CNT_MAX; } else { targetMaxCnt = targetMaxCnt + (unsigned char)addApplyCnt; if ( targetMaxCnt > TARGET_CNT_MAX ) { assert(0); targetMaxCnt = TARGET_CNT_MAX; } } } } } /// Ÿ°Ù ¼±Á¤ if( pSkillInfo->mBoundType != eBOUNDTYPE_NONE ) { switch( pSkillInfo->mApplyType ) { case eAPPLYTYPE_SELF: case eAPPLYTYPE_BUFF_SELF: case eAPPLYTYPE_DEBUFF_SELF: { //sMultiTarget multiTarget; //multiTarget.mTarget.type = eOBJECTTYPE_PLAYER; //multiTarget.mTarget.index = pAttacker->GetObjectID(); ////multiTarget.mApplyHP = applyHP; //mTargetAry.PushBack( multiTarget ); sObject object = { eOBJECTTYPE_PLAYER, pAttacker->GetObjectID() }; SKILLTARGETPOOL->AddSkillTarget( &mTargetRoot, object ); } break; case eAPPLYTYPE_BUDDY: { //mTargetAry.Clear(); unsigned char targetCnt = 0; SelectPlayerTarget( pAttacker, mCenterPos, pStepInfo->mBoundDist1, pStepInfo->mBoundDist2, &targetCnt, targetMaxCnt, applyHP, false, pSkillInfo->mBoundType ); //OBJECTMANAGER->PlayerInCenterPoint( pAttacker->GetMapNumber(), mCenterPos, tempRange, &mTargetAry, applyHP, targetMaxCnt ); } break; case eAPPLYTYPE_PARTY: case eAPPLYTYPE_BUFF_PARTY: case eAPPLYTYPE_DEBUFF_PARTY: { //mTargetAry.Clear(); /// °ø°ÝÀÚ ÀڽŸÕÀú üũ float tempRange = OBJECTMANAGER->ObjectSizeRange( NULL, pAttacker, pStepInfo->mBoundDist1 ); mRangeCheck.SetRadius( tempRange ); NiPoint2 centerPos( mCenterPos.x, mCenterPos.y ); if( mRangeCheck.IsRange( centerPos, pAttacker->GetPos() ) == true ) { sObject targetObject; targetObject.index = pAttacker->GetObjectID(); targetObject.type = eOBJECTTYPE_PLAYER; SKILLTARGETPOOL->AddSkillTarget( &mTargetRoot, targetObject ); } unsigned long* userArr = NULL; unsigned int partyCount = 0; /// ÆÄƼ¿ø °Ë»ö cParty* pParty = PARTYMAN->GetParty( ((cPlayer*)pAttacker)->GetPartyIndex() ); if( pParty != NULL ) { userArr = pParty->GetUserArr(); partyCount = pParty->GetCount(); } else { cPartyUnion* partyUnion = PARTYUNIONMAN->GetUnion( ((cPlayer*)pAttacker)->GetPartyUnionIndex() ); if( partyUnion != NULL ) { userArr = partyUnion->GetGroupArr( pAttacker->GetObjectID() ); partyCount = MAX_PARTYUSER; } } /// ÆÄƼ³ª À¯´Ï¿ÂÀÌ ÀÖ´Â °æ¿ì if( userArr != NULL ) { unsigned char targetCnt = 0; for( unsigned int i = 0 ; i < partyCount ; ++i ) { /// ÆÄƼ°¡ ¾ø´Â °æ¿ì »ç¿ë½Ã¸¦ ó¸®ÇϱâÀ§ÇØ ÀÚ½ÅÀº À§¿¡¼­ ¸ÕÀú ³Ö¾úÀ½ if( pAttacker->GetObjectID() == userArr[i] ) continue; /// Ÿ°Ù °´Ã¼ È®ÀÎ cPlayer* partyUser = OBJECTMANAGER->GetPlayer( userArr[i] ); if( partyUser == NULL ) continue; float tempRange = OBJECTMANAGER->ObjectSizeRange( pAttacker, partyUser, pStepInfo->mBoundDist1 ); /// °Å¸® È®ÀÎ mRangeCheck.SetRadius( tempRange ); if( mRangeCheck.IsRange( centerPos, partyUser->GetPos() ) == true ) { /// Ÿ°Ù¿¡ Ãß°¡ sObject targetObject; targetObject.type = eOBJECTTYPE_PLAYER; targetObject.index = userArr[i]; SKILLTARGETPOOL->AddSkillTarget( &mTargetRoot, targetObject ); ++targetCnt; if( targetCnt >= targetMaxCnt ) break; } } } } break; case eAPPLYTYPE_ENEMY: case eAPPLYTYPE_BUFF_ENEMY: case eAPPLYTYPE_DEBUFF_ENEMY: { //mTargetAry.Clear(); unsigned char targetCnt = 0; if( mCreateType == eSKILLCREATETYPE_DELTARGET ) { float tempRange = OBJECTMANAGER->ObjectSizeRange( pAttacker, NULL, pStepInfo->mBoundDist1 ); mTempDelTargetAry.Clear(); ((cPlayer*)pAttacker)->MonsterInTargeting( &mTempDelTargetAry, tempRange ); for( unsigned long jj = 0 ; jj < mTempDelTargetAry.GetSize() ; ++jj ) { sObject pObject = mTempDelTargetAry[jj]; SKILLTARGETPOOL->AddSkillTarget( &mTargetRoot, pObject ); } mTempDelTargetAry.Clear(); } else { SelectPlayerTarget( pAttacker, mCenterPos, pStepInfo->mBoundDist1, pStepInfo->mBoundDist2, &targetCnt, targetMaxCnt, applyHP, true, pSkillInfo->mBoundType ); SelectMonsterTarget( pAttacker, mCenterPos, pStepInfo->mBoundDist1, pStepInfo->mBoundDist2, &targetCnt, targetMaxCnt, applyHP, pSkillInfo->mBoundType ); //OBJECTMANAGER->MonsterInCenterPoint( pAttacker->GetMapNumber(), mCenterPos, tempRange, &mTargetAry, applyHP, targetMaxCnt ); } //OBJECTMANAGER->PlayerInCenterPoint( pAttacker->GetMapNumber(), mCenterPos, tempRange, &mTargetAry, // pAttacker->GetObjectID(), applyHP, targetMaxCnt ); } break; } } else { //sMultiTarget multiTarget; //multiTarget.mTarget = mCenterTarget; ////multiTarget.mApplyHP = applyHP; //mTargetAry.PushBack( multiTarget ); SKILLTARGETPOOL->AddSkillTarget( &mTargetRoot, mCenterTarget ); // ¿ÀÅä´õ¹Ì °ø°Ý if( mCenterTarget.type == eOBJECTTYPE_MONSTER ) { cMonster* mon = OBJECTMANAGER->GetMonster( mCenterTarget.index ); if( mon != NULL ) { mon->AttackDummy( pAttacker->GetObject() ); } else NETWORK2->PostServerEvent("cPlayerSkillObject[%d]::TargetSelect Monster null", pAttacker->GetObjectID(), mCenterTarget.index ); } } } void cPlayerSkillObject::ApplyDamage( cBaseObject* pAttacker ) { /// ÀÚµ¿»ç³É ½Å°í °ü·Ã if ( pAttacker != NULL && pAttacker->GetObjectType() == eOBJECTTYPE_PLAYER ) { cPlayer* pHero = (cPlayer*)pAttacker; if ( pHero ) { pHero->SetLastAttackTime( NETWORK2->GetAccumTime() ); } else { NETWORK2->PostServerEvent("cPlayerSkillObject[%d]::ApplyDamage [LastAttackTime] pHero == NULL", pAttacker->GetObjectID() ); } } /// skill pcÁ¤º¸ ½ºÅÜÁ¤º¸ Àоî¿È sPlayerSkillBaseInfo* pSkillInfo = SKILLSCRIPT->GetPlayerSkillInfo( mSkillIdx ); if( pSkillInfo == NULL ) { assert(NULL); NETWORK2->PostServerEvent("cPlayerSkillObject[%d]::ApplyDamage pSkillInfo[%d] == NULL", pAttacker->GetObjectID(), mSkillIdx ); SKILLMANAGER->InsertDeleteSkillObject( mAttacker, mUniqueIdx ); return; } if( mSkillStep > pSkillInfo->mStepCount ) { assert(NULL); NETWORK2->PostServerEvent("cPlayerSkillObject[%d]::ApplyDamage mSkillStep[%d] > pSkillInfo->mStepCount", pAttacker->GetObjectID(), mSkillStep ); SKILLMANAGER->InsertDeleteSkillObject( mAttacker, mUniqueIdx ); return; } sPlayerSkillStepInfo* pStepInfo = &pSkillInfo->mpSetpInfoArray[mSkillStep]; /// ŸÀÔº° µ¥¹ÌÁö ó¸® switch( pSkillInfo->mType ) { case eSKILLTYPE_DAMAGE: { SendDamage( pAttacker, pSkillInfo->mShotType, pSkillInfo->mAttributeType, pSkillInfo->mRangeType, pStepInfo->mApplyValueType1, pStepInfo->mApplyValueType2, pStepInfo->mApplyValue1, pStepInfo->mApplyValue2, pStepInfo->mInfulenceIdx, pStepInfo->mAccuracyValue, pStepInfo->mCriticalValue, true ); } break; case eSKILLTYPE_HEAL: { SendHeal( pAttacker, pSkillInfo->mShotType, pStepInfo->mApplyValueType1, pStepInfo->mApplyValueType2, pStepInfo->mApplyValue1, pStepInfo->mApplyValue2, pStepInfo->mInfulenceIdx ); } break; case eSKILLTYPE_NONACTIVE: { if( eSKILLCREATETYPE_DELTARGET == mCreateType ) { SendDelTarget( pAttacker, pStepInfo->mAccuracyValue ); } else if( eSKILLCREATETYPE_BLINK == mCreateType ) { ApplyBlink( pAttacker ); } else if( eSKILLCREATETYPE_CLEAR_COOLTIME == mCreateType ) { if( pAttacker && pAttacker->GetObjectType() == eOBJECTTYPE_PLAYER ) { SKILLMANAGER->ClearPlayerHaveSkillCoolTime( pAttacker->GetObjectID(), mSkillIdx ); PerIoContext* perIoContext = NETWORK2->GetIoContext( IOCP_REQUEST_WRITE ); MSG_SYN_SKILL_CLEAR_COOLTIME* synMsg = NULL; /// Àû¿ë ¸Þ¼¼Áö synMsg = (MSG_SYN_SKILL_CLEAR_COOLTIME*)perIoContext->buffer; synMsg->Category = NM_SKILL; synMsg->Protocol = NM_SKILL_CLEAR_COOLTIME; synMsg->mExceptSKillIdx = mSkillIdx; synMsg->mCharacterIdx = pAttacker->GetObjectID(); NETWORK2->SendToUser( ((cPlayer*)pAttacker)->GetConnectionIdx(), (char*)synMsg, sizeof( MSG_SYN_SKILL_CLEAR_COOLTIME ) ); perIoContext->offset = sizeof( MSG_SYN_SKILL_CLEAR_COOLTIME ); NETWORK2->ReleaseIoContext( perIoContext ); } } else { SendApply( pAttacker, pSkillInfo->mShotType, pSkillInfo->mAttributeType, pStepInfo->mAccuracyValue, pStepInfo->mApplyValueType1, pStepInfo->mApplyValueType2, pStepInfo->mApplyValue1, pStepInfo->mApplyValue2, pStepInfo->mInfulenceIdx ); } } break; case eSKILLTYPE_MPDAMAGE: { SendDamage( pAttacker, pSkillInfo->mShotType, pSkillInfo->mAttributeType, pSkillInfo->mRangeType, pStepInfo->mApplyValueType1, pStepInfo->mApplyValueType2, pStepInfo->mApplyValue1, pStepInfo->mApplyValue2, pStepInfo->mInfulenceIdx, pStepInfo->mAccuracyValue, pStepInfo->mCriticalValue, false ); } break; case eSKILLTYPE_TOTEM: { unsigned char targetMaxCnt = pStepInfo->mApplyCnt; if( targetMaxCnt == 0 || targetMaxCnt > TARGET_CNT_MAX ) targetMaxCnt = TARGET_CNT_MAX; else { /// Àû¿ë ÀοøÀÌ Á¦ÇÑµÈ °æ¿ì °ø°ÝÀÚ°¡ ¹üÀ§ ½ºÅ³ Àû¿ë Àοø Áõ°¡ È¿°ú¿¡ °É·ÁÀÖ´ÂÁö üũ ÇÏ¿© ³Ö±â if( pAttacker->GetObjectType() == eOBJECTTYPE_PLAYER || pAttacker->GetObjectType() == eOBJECTTYPE_MONSTER ) { long addApplyCnt = (long)pAttacker->GetStateOddity( eODDITYTYPE_ADD_APPLY_CNT ); if( addApplyCnt > 0 ) { if( (addApplyCnt + targetMaxCnt) > UCHAR_MAX ) { assert(0); targetMaxCnt = TARGET_CNT_MAX; } else { targetMaxCnt = targetMaxCnt + (unsigned char)addApplyCnt; if ( targetMaxCnt > TARGET_CNT_MAX ) { assert(0); targetMaxCnt = TARGET_CNT_MAX; } } } } } AddTotem( pAttacker, ((cPlayer*)pAttacker)->GetPartyIndex(), ((cPlayer*)pAttacker)->GetPartyUnionIndex(), pSkillInfo->mApplyType, pSkillInfo->mAttributeType, pStepInfo->mInfulenceIdx, targetMaxCnt ); } break; case eSKILLTYPE_PORTAL: { AddPortal( pAttacker, pStepInfo->mInfulenceIdx ); } break; } }