#include "stdafx.h" #include "BaseObject.h" #include "Player.h" #include "Monster.h" #include "ObjectManager.h" #include "ActiveSkillObject.h" #include "SkillManager.h" #include "AppTimer.h" #include "Protocol.h" #include "BaseObject_Common.h" #include "Monster_Common.h" #include "PackedData.h" #include "StatusCalc.h" cActiveSkillObject::cActiveSkillObject() { mGroundSkillRange = 0.0f; } cActiveSkillObject::~cActiveSkillObject() { } void* cActiveSkillObject::operator new( size_t n ) { if(n != sizeof(cActiveSkillObject) ) { assert(0); return NULL; } return SKILLMANAGER->AllocSkillObject(); } void cActiveSkillObject::operator delete( void* ptr, size_t n ) { /// NULL Æ÷ÀÎÅÍ °Ë»ç if( ptr == 0) { assert(0); return; } if(n != sizeof(cActiveSkillObject) ) { assert(0); return; } SKILLMANAGER->FreeSkillObject( static_cast(ptr) ); return; } void cActiveSkillObject::CastingProcess() { } void cActiveSkillObject::SkillActProcess() { } void cActiveSkillObject::SkillDamageProcess() { } void cActiveSkillObject::Process() { ///// ij½ºÆÃ ½Ã°£À» ¸ÕÀú °Ë»çÇÑ´Ù. //if( mCastingTime != 0.0f && mWhereIs == WHEREIS_USER ) //{ // /// ij½ºÆÃ ½Ã°£À» ³Ñ¾î ¼­¸é - ½ºÅ³À» À¯Àú ½ºÅ³ ¸Þ¼¼ÁöÅ¥¿¡ ³Ö´Â´Ù. // /// ¡Ø eSKILL_CASTING_END_SKILLACT_START ¸Þ¼¼Áö¸¦ user °ü·Ã Å¥¿¡ ±â·Ï // /// ÇöÀç process´Â Á¾·áµÇ°í user process¿¡¼­ eSKILL_CASTING_END_SKILLACT_START ó¸® // /// ÇÏ°í³ª¸é ÇöÀç process ÀÇ Ä³½ºÆÃ ´ÙÀ½ ·çƾÀ» Àû¿ëÇÑ´Ù. // if( ( TIMER->GetCurrentTime() - mCurrentActTime ) > mCastingTime ) // { // /// ½ºÅ³ ¹ßµ¿½Ã°£Àº ij½ºÆÃÀÌ ³¡³­ ÇöÀç ½Ã°£ // mCurrentActTime = TIMER->GetCurrentTime(); // /// µ¥¹ÌÁö °Ô»êÀÌ ÀÌ·ç¾îÁö´Â ½Ã°£ // mDamageCalcuTime = mActLifeTime*(mDamagePersent*0.01f); // /// userÀÇ Å¥¿¡ ij½ºÆÃ³¡ ½ºÅ³ ½ÃÀÛ ¸Þ¼¼Áö¸¦ ³Ö¾îÁÜ // mpUser->SetSkillMessage( this, eSKILL_CASTING_END_SKILLACT_START ); // /// ij½ºÆÃÀº ³¡³² // mCastingTime = 0.0f; // return; // } // else // { // return; // } //} //cBaseObject* pUser = OBJECTMANAGER->GetObject( GetAttacker().type, GetAttacker().index ); ///// °ø°ÝÀÚÀÇ Æ÷ÀÎÅ͸¦ È®ÀÎ //if( pUser == NULL ) //{ // CONSOLE->WriteLog("ASSERT-070612-ActiveSkillObject ERROR"); // assert(NULL); // return; //} ///// ½ºÅ³ÀÇ µ¥¹ÌÁö°¡ Àû¿ëµÉ ŸÀÌ¹Ö °Ë»ç - »ç¿ëÀÚÀÏ °æ¿ì¸¸ Àû¿ëµÈ´Ù. switch( mTarget.type ) { case eOBJECTTYPE_HERO: case eOBJECTTYPE_PLAYER: case eOBJECTTYPE_MONSTER: { ///// ½ºÅ³ÀÌ ÇöÀç À¯Àú¿¡ ÀÖ°í µ¥¹ÌÁö Àû¿ë½ÃÁ¡±îÁö °¡Áö ¾ÊÀº »óÅ //if( !mbDamageSend ) //{ // /// µ¥¹ÌÁö Àû¿ë½Ã°£ ±îÁö µµ´Þ ÇÏÁö ¾ÊÀº°æ¿ì ÇÁ·Î¼¼½º Åë°ú // if( ( TIMER->GetCurrentTime() - mCurrentActTime ) < mDamageCalcuTime ) { break; } // /// ½ºÅ³ÀÌ »ç¿ëµÉ¶§ ÇÊ¿äÇÑ ¿ä±¸Á¶°ÇÀ» Àû¿ëÇÑ´Ù. // if( SKILLMANAGER->AdjustRequireValue( pUser->GetObjectType(), pUser->GetObjectID(), mSkillIdx ) == false ) // { // mbSkillLife = false; // return; // } // cBaseObject* pTarget = pUser->GetTarget(); // /// °ø°ÝÀÚ°¡ ÁöÁ¤ÇÑ Å¸°ÙÀÇ Æ÷ÀÎÅ͸¦ È®ÀÎ // if( pTarget != NULL ) // { // /// µ¥¹ÌÁö Àû¿ë°ú ÇÔ²² °ø°ÝÀÚ°¡ ´©±¸ÀÎÁö ¾Ë¸°´Ù. // pTarget->SetSkillMessage( this, eSKILL_CONFIRM , pUser->GetObjectID(), pUser->GetObjectType() ); // mbDamageSend = true; // } // //} }break; case eOBJECTTYPE_NONE: { ///// ½ºÅ³ ¹ßµ¿ ½ÃÁ¡¿¡ Ÿ°ÙÀÌ ¾øÀ» ¼ø ¾ø´Ù. - ½ºÅ³À» ¹Þ´Â °æ¿ì´Â Ÿ°ÙÀÌ ¾ø´Ù. //if(mWhereIs == WHEREIS_USER) //{ // assert(0); //} }break; //case eOBJECTTYPE_GROUND: // { // /// µ¥¹ÌÁö°¡ Àû¿ëµÉ Ÿ°ÙµéÀ» ¼±º°ÇÑ´Ù. // cMonster* pMonster; // tPointerHashMap::cConstIterator i = OBJECTMANAGER->GetMonsterMap()->Begin(); // tPointerHashMap::cConstIterator end = OBJECTMANAGER->GetMonsterMap()->End(); // for( ; i != end; ++i ) // { // pMonster = (*i).mSecond; // if(pMonster->GetStateDie() == true) continue; // cRangeCheck rangecheck; // rangecheck.SetRadius(mGroundSkillRange); // if(rangecheck.IsRange(mGroundSkillPos, NiPoint3(pMonster->GetXPos() , pMonster->GetYPos(), 0.0f)) == true) // { // /// ½ºÅ³ÀÌ »ç¿ëµÉ¶§ ÇÊ¿äÇÑ ¿ä±¸Á¶°ÇÀ» Àû¿ëÇÑ´Ù. // /// ¿ä±¸Á¶°Ç ¾Ë¾Æ¿À±â // /// µ¥¹ÌÁö Àû¿ë°ú ÇÔ²² °ø°ÝÀÚ°¡ ´©±¸ÀÎÁö ¾Ë¸°´Ù. // pMonster->SetSkillMessage(this, eSKILL_CONFIRM , mpUser->GetObjectID(), mUserKind); // } // } // /// ¸ó½ºÅ͵éÀÇ À§Ä¡¸¦ ¾Ë¾Æ³½´Ù. // /// ½Ç½Ã°£À¸·Î üũÇÏ¿© ¸ðµÎ¿¡°Ô µ¥¹ÌÁö¸¦ ÁØ´Ù. // } // break; //case eOBJECTTYPE_MULTY: break; } ///// ½ºÅ³ÀÇ È°¼º½Ã°£ °Ë»ç //float t = TIMER->GetCurrentTime() - mCurrentActTime; //if( t > mActLifeTime ) //{ // if(!mbSkillLife) assert(0); // if(t > mCoolTime) // mbSkillLife = false; //} ///// ½ºÅ³ÀÌ »ý¸í ÁֱⰡ ³¡³­°æ¿ì //if( false == GetSkillLife() ) //{ // /// Àú°ÅÇ׸ñ¹è¿­ÀúÀå // SKILLMANAGER->InsertDeletSkillObject( this ); // ///// ½ºÅ³ »ç¿ëÀÚ¿¡°Ô¼­ »ý¸íÁֱⰡ ³¡³­ °æ¿ì Ÿ°Ù¿¡°Ô ½ºÅ³À» Àüµµ // //if( GetWhereIs() == WHEREIS_USER ) // //{ // /// À¯Àú°¡ »ì¾Æ ÀÖ´ÂÁö üũ // if( !(pUser->GetStateDie()) ) // { // /// »ç¿ëÀÚÀÇ Å¥¿¡ ½ºÅ³ Á¾·á ¸Þ¼¼Áö¸¦ Àü´ÞÇÔ // ( pUser )->SetSkillMessage( this, eSKILL_END_USING ); // ///// »ç¿ëÇÑ °æ¿ì // //switch( SKILLMANAGER->GetSkillShape( GetUserKind(), GetSkillInfoIndex()) ) // //{ // //case SKILLSHAPE_BUFF: // // { // // if( GetTarget().kind == eOBJECTTYPE_HERO ) // // { // // ( pUser )->SetSkillMessage( this, eSKILL_END_BUFF); // // } // // } // // break; // //default: // // { // // ( pUser )->SetSkillMessage( this, eSKILL_END_USING); // // } // // break; // //} // cBaseObject* pTarget = pUser->GetTarget(); // /// °ø°ÝÀÚ°¡ ÁöÁ¤ÇÑ Å¸°ÙÀÇ Æ÷ÀÎÅ͸¦ È®ÀÎ // if( pTarget == NULL ) // { // CONSOLE->WriteLog("ASSERT-070612-ActiveSkillObject ERROR"); // assert(NULL); // return; // } // /// ½ºÅ³ »ç¿ë´ë»óÀÌ ÀÚ±â ÀڽŠÀΰæ¿ì Ÿ°Ù¿¡¼­ ½ºÅ³À» ³Ñ±âÁö ¾ÊÀ½ // if( pTarget->GetObjectType() != eOBJECTTYPE_HERO ) // { // /// Ÿ°ÙÀÌ »ì¾Æ ÀÖ´ÂÁö üũ // if( !( pTarget->GetStateDie() ) ) // { // /// ½ºÅ³ÀÇ ÀÚµ¿ Ãß°¡ - »õ·Î¿î °´Ã¼°¡ ¾ò¾îÁø´Ù. // /// °ø°ÝÀÚÀÇ Å¸°ÙÁ¤º¸¸¦ »ç¿ëÇϱâ À§ÇØ °ø°ÝÀÚ Æ÷ÀÎÅ͸¦ ³Ñ±ä´Ù. // cSkillObject* pTargetSkill = SKILLMANAGER->SkillTransferTarget( GetSkillIdx(), pUser ); // if(!pTargetSkill) // { // CONSOLE->WriteLog("ASSERT-070612-SkillTransferTarget ERROR"); // assert(NULL); // return; // } // /// °´Ã¼¿¡°Ô ½ºÅ³À» Ãß°¡ÇØ ´Þ¶ó°í ¸Þ½ÃÁö¸¦ ³¯¸°´Ù. // ( pTarget )->SetSkillMessage( pTargetSkill, eSKILL_REGIST_BY_OTHER_OBJECT ); // } // } // } //} //else /// °´Ã¼¿¡°Ô ½ºÅ³À» Á¦°Å ÇØ ´Þ¶ó°í ¸Þ½ÃÁö¸¦ ³¯¸°´Ù. //{ // /// À¯Àú°¡ »ì¾Æ ÀÖ´ÂÁö üũ // /// Monster Q·Î Á¦°Å ¸Þ½ÃÁö º¸³½´Ù. // /// ¹ÞÀº °æ¿ì // //switch( SKILLMANAGER->GetSkillShape( GetUserKind(), GetSkillInfoIndex()) ) // //{ // //case SKILLSHAPE_BUFF: // // { // // ( pUser )->SetSkillMessage( this, eSKILL_END_OTHER_LONGTIME ); // // } // // break; // //default: // // { // ( pUser )->SetSkillMessage( this, eSKILL_END_OTHER_1TIME ); // // } // // break; // //} //} //} } void cActiveSkillObject::NonCastingSkillStart() { //if(mUserKind == eOBJECTTYPE_PLAYER) //{ // ///¹öÇÁ¶ó¸é Ŭ¶óÀÌ¾ðÆ®¿¡ Á¤º¸¸¦ ¾Ë¸°´Ù. // if(SKILLMANAGER->GetSkillShape(mUserKind,mSkillInfoIndex) == SKILLSHAPE_BUFF) // { // MSG_CHAT msg; // msg.Category = NM_CHAT; // msg.Protocol = NM_CHAT_NORMAL_SYN; // msg.CharacterIdx = mpUser->GetObjectID(); // if(mTarget.kind == eOBJECTTYPE_HERO) // { // mpUser->AddSkillList(this); // MSG_PLAYER_SKILL Msg; // Msg.Category = NM_SKILL; // Msg.Protocol = NM_SKILL_START_BY_PLAYER; // Msg.playerid = mpUser->GetObjectID(); // Msg.skillinfonumber = mSkillInfoIndex; // Msg.uniqueindex = mUniqueIndex; // Msg.target = mTarget; // PACKEDDATA->QuickSend( (cBaseObject*)mpUser, (char*)&Msg, sizeof(Msg) ); // /// 070214 PKH ½ºÅÝ Àç°è»ê // STATUSCALC->CalcPlayer( Msg.playerid ); // swprintf( msg.ChatMsg, L"%d - %d¹öÇÁ Àû¿ë",mpUser->GetObjectID(),mSkillInfoIndex ); // } // else // { // swprintf( msg.ChatMsg, L"%d - %d¹öÇÁ ½ÃÀü ½ÃÀÛ",mpUser->GetObjectID(),mSkillInfoIndex ); // } // wcscpy(msg.Name , L"operator"); // NM_CHAT_MsgParserFromServer( 0, ( char * )&msg, msg.GetMsgLength() ); // } // else // { // mpUser->AddSkillList(this); // MSG_PLAYER_SKILL Msg; // Msg.Category = NM_SKILL; // Msg.Protocol = NM_SKILL_START_BY_PLAYER; // Msg.playerid = mpUser->GetObjectID(); // Msg.skillinfonumber = mSkillInfoIndex; // Msg.uniqueindex = mUniqueIndex; // Msg.target = mTarget; // PACKEDDATA->QuickSend( (cBaseObject*)mpUser, (char*)&Msg, sizeof(Msg) ); // /// 070214 PKH ½ºÅÝ Àç°è»ê // STATUSCALC->CalcPlayer( Msg.playerid ); // } // //} //else //{ // /// °ø°ÝÀÚ°¡ Ç÷¹À̾ ¾Æ´Ñ°æ¿ì //} } void cActiveSkillObject::TargetSkillStart() { //switch(SKILLMANAGER->GetSkillShape(mUserKind,mSkillInfoIndex)) //{ //case SKILLSHAPE_BUFF: // { // mpUser->AddSkillList(this); // MSG_PLAYER_SKILL Msg; // Msg.Category = NM_SKILL; // Msg.Protocol = NM_SKILL_START_BY_PLAYER; // Msg.playerid = mpUser->GetObjectID(); // Msg.skillinfonumber = mSkillInfoIndex; // Msg.uniqueindex = mUniqueIndex; // Msg.target = mTarget; // PACKEDDATA->QuickSend( (cBaseObject*)mpUser, (char*)&Msg, sizeof(Msg) ); // /// 070214 PKH ½ºÅÝ Àç°è»ê // STATUSCALC->CalcPlayer( Msg.playerid ); // MSG_CHAT msg; // msg.Category = NM_CHAT; // msg.Protocol = NM_CHAT_NORMAL_SYN; // msg.CharacterIdx = mpUser->GetObjectID(); // swprintf( msg.ChatMsg, L"%d - %d¹öÇÁ Àû¿ë",mpUser->GetObjectID(),mSkillInfoIndex ); // wcscpy(msg.Name , L"operator"); // NM_CHAT_MsgParserFromServer( 0, ( char * )&msg, msg.GetMsgLength() ); // } // break; //} } void cActiveSkillObject::SetSkillActTime( float castingtime, float actlifetime, float cooltime, unsigned int DamagePersent ) { ///// ±âº»°ø°ÝÀÌ ¾Æ´Ï°í ij½ºÆÃ ½Ã°£ ¾ø´Â ½ºÅ³ //if(mSkillInfoIndex > MAXPLAYERBASESKILLINFOIDX && mWhereIs == WHEREIS_USER && castingtime == 0.0f) //{ // NonCastingSkillStart(); //} ///// ±âº» °ø°ÝÀÌ ¾Æ´Ï°í ÇöÀç ½ºÅ³ÀÌ Å¸°Ù¿¡°Ô Àû¿ëµÇ¾úÀ» °æ¿ì //if(mSkillInfoIndex > MAXPLAYERBASESKILLINFOIDX && mWhereIs == WHEREIS_TARGET) //{ // TargetSkillStart(); //} /// ½Ã°£¿¡ ´ëÇÑ Á¤º¸ ¼ÂÆÃ mbSkillLife = true; mCurrentActTime = TIMER->GetCurrentTime(); mCastingTime = castingtime; mActLifeTime = actlifetime; mCoolTime = cooltime; mDamageCalcuTime = mActLifeTime*(DamagePersent*0.01f); mDamagePersent = DamagePersent; mbDamageSend = false; /// °ø°Ý»ý¸íÁֱⰡ ÄðŸÀÓº¸´Ù Ŭ°æ¿ì ÄðŸÀÓÀ» °ø°Ý»ý¸íÁÖ±â¶û °°°ÔÇÔ /// ¡ØÄðŸÀÓÀÌ ÂªÀ» °æ¿ì °ø°ÝÀÌ ´Ù ³¡³ª±â Àü¿¡ ´Ù½Ã °ø°ÝÀ» ÇÒ ¼ö ÀÖ´Ù. if(mActLifeTime > mCoolTime) mCoolTime = mActLifeTime; }