#pragma once #include "DnActor.h" #include "DnPlayerState.h" // include Method #include "MAPartsBody.h" #include "MAWalkMovement.h" #include "MACP.h" #include "MACP_Renewal.h" #include "DNGameRoom.h" #include "DnSkillTreeSystem.h" #if defined(_WORK) || defined(_KRAZ) #include "DnPlayerTestFlag.h" #endif #include "DnDropItem.h" #include "DnActionSpecificInfo.h" #include "MAPlateUser.h" #if defined(PRE_ADD_TALISMAN_SYSTEM) #include "MATalismanUser.h" #endif #include "DnVehicleActor.h" #include "DnActorClassDefine.h" #include "DnObservable.h" #ifdef PRE_FIX_GAMESERVER_PERFOMANCE #include "FrameSync.h" #endif // #ifdef PRE_FIX_GAMESERVER_PERFOMANCE #ifdef PRE_FIX_MEMOPT_SIGNALH #include "DnCommonUtil.h" #endif namespace BubbleSystem { class CDnBubbleSystem; } // ÇöÀç ¹«±â °¹¼ö´Â ÁÖ¹«±â/º¸Á¶¹«±â 2°³ÀÓ. const int NUM_WEAPON = 2; class CDNUserSession; class IDnPlayerChecker; class CDnVehicleActor; #if defined(PRE_ADD_TOTAL_LEVEL_SKILL) class CDnTotalLevelSkillSystem; #endif // PRE_ADD_TOTAL_LEVEL_SKILL class CDnPlayerActor : public CDnActor, #if defined( PRE_ADD_CP_RENEWAL ) public MACP_Renewal, #else // #if defined( PRE_ADD_CP_RENEWAL ) public MACP, #endif // #if defined( PRE_ADD_CP_RENEWAL ) public CDnPlayerState, #if defined(_WORK) || defined(_KRAZ) public CDnPlayerTestFlag, #endif virtual public MAPartsBody, public CDnObservable, virtual public MAPlateUser #if defined(PRE_ADD_TALISMAN_SYSTEM) , virtual public MATalismanUser #endif { public: CDnPlayerActor( CMultiRoom *pRoom, int nClassID ); virtual ~CDnPlayerActor(); virtual MAMovementBase* CreateMovement(); private: DWORD m_dwSyncDatumTick; DWORD m_dwSyncDatumSendTick; UINT m_nVoiceChannelID; IDnPlayerChecker* m_pPlayerSpeedHackChecker; IDnPlayerChecker* m_pPlayerDoNotEnterChecker; IDnPlayerChecker* m_pPlayerPickupChecker; IDnPlayerChecker* m_pPlayerSkillChecker; IDnPlayerChecker* m_pPlayerActionChecker; //rlkt_mastery int m_nLastUsedSkill; #ifdef _USE_VOICECHAT int m_nVoiceRotate; #endif bool _bIsMasterSystemDurabilityReward(); protected: std::string m_szMaintenanceBoneName; std::string m_szActionBoneName; char m_cMovePushKeyFlag; bool m_bBattleMode; int m_nWorldLevel; int m_nComboDelay; int m_nComboCount; int m_nTotalComboCount; float m_fRecoverySPDelta; static float s_fRecoverySPTime; LOCAL_TIME m_nFatigueTick; CDNUserSession * m_pSession; CDNGameRoom::PartyStruct *m_pPartyData; bool m_bCompleteCutScene; bool m_bCheckCompleteCutScene; bool m_bSkipCutScene; bool m_bGhost; UINT m_uiStateBlowProcessAfterBit; DnWeaponHandle m_hCashWeapon[2]; bool m_bCashSelfDeleteWeapon[2]; bool m_bWeaponViewOrder[2]; // ¹«±â ½ºÅ³ ÃÑ °¹¼ö´Â ÆÄÃ÷ ŸÀÔ °¹¼ö+¹«±â °¹¼öÀÓ. // ij½¬ÅÛÀº ¼­¹ö DB ¿¡ ÀúÀå°ø°£ÀÌ ´õ ÇÊ¿äÇϹǷΠÃßÈÄ¿¡ ÇÊ¿äÇÏ°Ô µÇ¸é ¿äûÇÒ ¿¹Á¤. // ÇöÀç´Â ¹®À常 Àåºñ ½ºÅ³ »ç¿ëÇÔ. float m_afLastEquipItemSkillDelayTime; float m_afLastEquipItemSkillRemainTime; DnSkillHandle m_ahEquipSkill; // ¹öºíÂÊ¿¡¼­ °­È­¿ëÀ¸·Î Ãß°¡Çϴµ¥ »ç¿ëÇÒ ½ºÅ³µéÀº Ç÷¹À̾ Á÷Á¢ »ý¼ºÇؼ­ ³Ö¾îÁÖ¾î¾ß ÇÑ´Ù. map m_mapEnchantSkillFromBubble; // ½ºÅ³ Æ®¸® °ü·Ã. ½ÇÁ¦·Î ·¹º§ 1ÀÌ µÇ¾î ȹµæÇÑ ½ºÅ³¸¸ MASkillUser ÂÊÀ¸·Î ³Ö¾îÁØ´Ù. // (Ŭ¶óÀÌ¾ðÆ®¿¡¼­´Â SkillTask ¿¡¼­ °³ÀÎÀÇ ½ºÅ³ Æ®¸®/¸ñ·Ï °ü·Ã 󸮸¦ ÀüºÎ ÇÕ´Ï´Ù.) vector m_vlUnlockZeroLevelSkills; // ¾ð¶ô¸¸ µÈ ·¹º§ 0»óÅÂÀÎ ½ºÅ³. vector m_vlPossessedSkill; // OnChangeAction() ¿¡¼­ ÇÙüũ¿ë ¹ß»çü/¾×¼Ç Á¤º¸¸¦ ¾÷µ¥ÀÌÆ® ÇØÁÖÁö¸¸ ÆÐŶÀÌ ¹Ð¸®°Å³ª ¼­¹öÇÁ·¹ÀÓÀÌ ¹Ð·Á¼­ // CS_CMDACTION ÆÐŶ°ú ¹ß»çü ÆÐŶÀÌ µ¿½Ã¿¡ 󸮵Ǿî OnChangeAction() ÀÌ È£ÃâµÇ¾î Á¤º¸°¡ ¾÷µ¥ÀÌÆ® µÇ±â Àü¿¡ // ¹ß»çü¸¦ ½î°Ô µÉ °æ¿ì ¼­¹ö¿¡¼­ Ç٠ó¸® µÇ¹Ç·Î ¿ì¼± CS_CMDACTION ÆÐŶÀÌ ¿ÀÀÚ¸¶ÀÚ ¾÷µ¥ÀÌÆ® ÇØÁÖ°í ÀÌ Ç÷¡±×¸¦ // ÄÑÁÝ´Ï´Ù. OnChangeAction() ÂÊ¿¡¼­´Â ÀÌ Ç÷¡±×°¡ ²¨Á®ÀÖÀ» °æ¿ì¿¡¸¸ ¾÷µ¥ÀÌÆ®¸¦ ¼öÇàÇÕ´Ï´Ù. // °°Àº ¾×¼Ç¿¡¼­ Çѹø¸¸ ¾÷µ¥ÀÌÆ® µÇ´Â °ÍÀÌ ¿øÄ¢ÀÔ´Ï´Ù. (#21773) bool m_bUpdatedProjectileInfoFromCmdAction; int m_iNowMaxProjectileCount; // ÇöÀç ¾×¼Ç¿¡¼­ ÃÖ´ëÇÑ ¹ß»çÇÒ ¼ö ÀÖ´Â ¹ß»çü °¹¼ö. ¾×¼ÇÀÌ ¹Ù²î¸é ÇØ´ç ¾×¼ÇÀÇ °ªÀ¸·Î ¸®¼ÂµÈ´Ù. int m_iReservedProjectileCount; // ¾×¼Ç º¯°æ°ú °ü°è ¾øÀÌ È®º¸µÈ ¹ß»çü °¹¼ö. (¹ß»çü¿¡¼­ ¹ß»çü ½î´Â °æ¿ì) multiset m_setWeaponIDUsingProjectileSignal; // ¹ß»çü ½Ã±×³Î¿¡¼­ »ç¿ëÇÏ´Â ¹«±â À妽ºµéÀÇ ¸ðÀ½. ¹«±â¿¡¼­ ¹ß»çµÇ´Â ¹ß»çü±îÁö Æ÷ÇÔ. deque m_dqProjectileSignalOffset; // ÇöÀç Ç÷¹ÀÌ¾î ¾×ÅͰ¡ ÃëÇϰí ÀÖ´Â ¾×¼Ç¿¡¼­ ¹ß»çü ½Ã±×³ÎÀÌ ¹ÚÇôÀÖ´Â ÇÁ·¹ÀÓÀ» ¹Þ¾ÆµÒ. DWORD m_dwLastBasicShootActionTime; // ¸¶Áö¸·À¸·Î ÀÏ¹Ý °ø°Ý ½¸ ¾×¼ÇÀ» ÇÑ ½Ã°£. DWORD m_dwLastBasicShootCoolTime; // ¸¶Áö¸·À¸·Î ¾÷µ¥ÀÌÆ®µÈ ÀÏ¹Ý °ø°Ý ½¸ ¾×¼ÇÀÇ ÄðŸÀÓ. float m_fFrameSpeed; // ÇöÀç ¾Ö´Ï¸ÞÀÌ¼Ç ÇÁ·¹ÀÓ Àç»ý ¼Óµµ. 1.0ÀÌ µðÆúÆ® °ª. ¾×¼Ç ÄðŸÀÓÀ» °¨¾ÈÇÒ ¶§ »ç¿ëÇÑ´Ù. // ¹ß»çü ¹ß»ç ÅÒÀ» üũÇÑ´Ù. ÀϹÝÀûÀÎ °æ¿ì¿¡¼± true ÀÌÁö¸¸ Ç÷¹À̰Ű¡ Çǰݽà ½´ÆÛ¾Æ¸Ó ¶§¹®¿¡ ÇÁ·¹ÀÓÀÌ ¼ø°£ÀûÀ¸·Î ¸î ¹ø Á¤ÁöÇϸé // ¼­¹ö¿Í ÇÁ·¹ÀÓ µ¿±â°¡ ÀÏÁ¤ °ª ÀÌ»ó ¹þ¾î³ª´Â °æ¿ì°¡ ÀÖ¾î Term üũ¿¡¼­ °É¸®¹Ç·Î ÀÌ·± °æ¿ì¿£ üũ¸¦ ÇÏÁö ¾Êµµ·Ï ÇÑ´Ù. (#21133) bool m_bCheckProjectileSignalTerm; // Tumble_ ÀÌ ºÙ´Â ÆÐ½Ãºê ½ºÅ³ ¹ßµ¿À» À§Çؼ­´Â ij¸¯ÅͰ¡ Move_ ·ù ¾×¼ÇÀ» ÁøÇàÁßÀ̾î¾ß Çϴµ¥ // °×¼­¹ö¿¡¼­´Â CmdStop() 󸮵ǰí Stand °¡ µÈ ³­ Èİ¡ µÇ¾î¹ö¸®¹Ç·Î ¾ÈµÈ´Ù. µû¶ó¼­ ¿©±â¼­ Á÷Á¢ ¾×¼Ç À妽º¸¦ À̾îÁÖµµ·Ï ÇÑ´Ù. // Tumble_Front °¡ ¿ÔÀ¸¸é Move_Front ¾×¼ÇÀ» Çϰí ÀÖ¾î¾ß ÇϹǷΠ¾×¼Ç À妽º¸¦ ¸ð¾ÆµÒ. map m_mapTumbleHelper; DWORD m_dwLastChargeShootTime; // Â÷Áö¼¦Àº ±âÁ¸ ¾×¼Ç ½Ã½ºÅÛ°ú ´Ù¸£°Ô µ¹¾Æ°£´Ù. Â÷Áö¼¦ÀÇ ¾×¼Ç ÄðŸÀÓÀ» µû·Î ÃøÁ¤ÇÑ´Ù. bool m_bPlayerCannonMode; DnActorHandle m_hCannonMonsterActor; int m_nSwapSingleSkinActorID; int m_nMonsterMutationTableID; EtAniObjectHandle m_hSwapOriginalHandle; CDnActionBase *m_pSwapOriginalAction; LOCAL_TIME m_LastEscapeTime; int m_nDeathCount; // °¢ ½ºÅ×ÀÌÁöº° Á×ÀºÈ½¼ö..À̵¿½Ã ÃʱâÈ­ BubbleSystem::CDnBubbleSystem* m_pBubbleSystem; map m_mapIcyFractionHitted; // #26902 Àӽ÷Π½ºÅ³ Ãß°¡µÈ »óÅ ¹× Àӽ÷ΠÃß°¡µÈ Á÷¾÷ ID. bool m_bTempSkillAdded; int m_iTempChangedJob; ////////////////////////////////////////////////////////////////////////// bool m_bForceEnableRideByTrigger; UINT m_nVehicleEffectIndex; bool m_bVehicleMode; DnActorHandle m_hVehicleActor; std::vector m_vecEventEffectList; bool m_bDeletedPetSkill[Pet::Skill::Max]; int m_nAllowedSkill; bool m_bRefreshTransformMode; bool m_bTransformMode; bool m_bShootMode; std::vector m_vecTransformSkillList; // Ãß°¡µÈ ¸ó½ºÅͺ¯½Å¿ë ½ºÅ³¸®½ºÆ® std::string m_strTransformEndAction; #ifdef PRE_ADD_MONSTER_CATCH DnActorHandle m_hCatcherMonster; // ³¯ Àâ°í ÀÖ´Â ¸ó½ºÅÍ. #endif // #ifdef PRE_ADD_MONSTER_CATCH int m_nInvalidPlayerCheckCounter; // #32426 ¼Òȯü ÄÁÆ®·Ñ ±â´É - ½ºÅ×ÀÌÁö À̵¿ ȤÀº Á¸ À̵¿(CmdWarp)¸¦ ÇÒ ¶§ µû¶ó°¡¾ß µÇ´Â // ÀÌ Ç÷¹À̾ ¼ÒȯÇÑ ¸ó½ºÅÍ °´Ã¼µé. struct S_FOLLOWSTAGE_SUMMONED_MONSTER_INFO { // ½ºÅ×ÀÌÁö À̵¿À» ÇÏ¸é ¸ó½ºÅÍ °´Ã¼°¡ »èÁ¦µÇ¹Ç·Î µû·Î µ¥ÀÌÅ͸¦ º¹»çÇØ¼­ °®°í ÀÖ´Ù°¡ // »õ·Î¿î ½ºÅ×ÀÌÁö·Î À̵¿ÇÏ¸é ´Ù½Ã °´Ã¼¸¦ »ý¼ºÇϰí State ¸¦ º¹»çÇØÁØ ´ÙÀ½¿¡ °´Ã¼ ÇÚµéÀ» // »õ·Î »ý¼ºµÈ ¸ó½ºÅÍ °´Ã¼·Î ¹°·ÁÁ༭ µ¥ÀÌÅÍÀÇ À¯È¿¼ºÀ» À¯Áö½ÃŲ´Ù. DnMonsterActorHandle hMonster; DWORD dwMonsterClassID; SummonMonsterStruct SummonMonsterSignalData; LOCAL_TIME iRemainDestroyTime; // ½ºÅ×ÀÌÁö À̵¿À¸·Î Àç »ý¼º 󸮰¡ ³¡³­ ¸ó½ºÅÍ´Â Ç÷¡±× ¹Ú¾ÆµÖ¼­ °°Àº MonsterClassID °¡ Àç »ý¼º ¿äûÀÌ µé¾î¿Íµµ // ÀÌ Ç÷¡±×¿Í °°ÀÌ ºñ±³Çؼ­ 󸮰¡ ³¡³­ ¸ó½ºÅÍ °´Ã¼¸¦ ±¸ºÐÇÑ´Ù. bool bReCreatedFollowStageMonster; S_FOLLOWSTAGE_SUMMONED_MONSTER_INFO( void ) : iRemainDestroyTime( 0 ), dwMonsterClassID( 0 ), bReCreatedFollowStageMonster( false ) {}; #ifdef PRE_FIX_MEMOPT_SIGNALH S_FOLLOWSTAGE_SUMMONED_MONSTER_INFO( const S_FOLLOWSTAGE_SUMMONED_MONSTER_INFO& rhs ) { hMonster = rhs.hMonster; dwMonsterClassID = rhs.dwMonsterClassID; CopyShallow_SummonMonsterStruct(SummonMonsterSignalData, &rhs.SummonMonsterSignalData); iRemainDestroyTime = rhs.iRemainDestroyTime; } #endif }; std::list m_listSummonedMonstersFollowStageInfos; LOCAL_TIME m_MixedActionTimeStamp; #ifdef PRE_FIX_GAMESERVER_PERFOMANCE // °ÔÀÓ¼­¹ö ÆÛÆ÷¸Õ½º ¶§¹®¿¡ Ç÷¹À̾îÀÇ ½ºÅ³ ¸®½ºÆ®º°·Î CDnSkill::Process() È£ÃâÇÏ´Â °ÍÀ» 20ÇÁ·¹ÀÓ ¸Å¹ø È£ÃâÇÏÁö ¾Êµµ·Ï Á¦ÇÑ. CFrameSkip m_FrameSkipCallSkillProcess; #endif // #ifdef PRE_FIX_GAMESERVER_PERFOMANCE #ifdef PRE_ADD_COSTUME_SKILL int m_nCostumeSkillID; #endif protected: // Movement Message virtual void OnDrop( float fCurVelocity ); virtual void OnStop( EtVector3 &vPosition ); virtual void OnFall( float fCurVelocity ); // Actor Message virtual void OnStateBlowProcessAfter(); virtual void OnAddStateBlowProcessAfterType( eStateBlowAfterProcessType Type ); virtual void OnDie( DnActorHandle hHitter ); virtual void ProcessDie( LOCAL_TIME LocalTime, float fDelta ); virtual void OnHitSuccess( LOCAL_TIME LocalTime, DnActorHandle hActor, HitStruct *pStruct ); virtual void OnHitFinish( LOCAL_TIME LocalTime, HitStruct *pStruct ); virtual void OnComboFinish( int nCombo ); virtual void OnHitProjectile( LOCAL_TIME LocalTime, DnActorHandle hHittedTarget, const CDnDamageBase::SHitParam& HitParam ); virtual void OnBreakSkillSuperAmmor( int nIndex, int nOriginalSupperAmmor, int nDescreaseSupperAmmor ); virtual void OnAirCombo( int nComboCount ); virtual int OnGetJobClassID(){ return CDnPlayerState::GetJobClassID(); } virtual void PushSummonMonster( DnMonsterActorHandle hMonster, const SummonMonsterStruct* pSummonMonsterStruct, bool bReCreateFollowStageMonster = false ); // CDnActorState virtual void OnLevelUp( int nLevel, int nLevelUpAmount ); virtual void OnAddExperience( int nAddExperience, int nLogCode, INT64 biFKey ); // -> nLogCode¿¡ µû¶ó biFKey°ªµµ ³Ö¾îÁØ´Ù (eCharacterExpChangeCodeÂüÁ¶) // MASkillUser virtual bool ExecuteSkill( DnSkillHandle hSkill, LOCAL_TIME LocalTime, float fDelta ); void ProcessCombo( LOCAL_TIME LocalTime, float fDelta ); void ProcessRecoverySP( LOCAL_TIME LocalTime, float fDelta ); void OnFinishProcessDie(); void OnChangeAction( const char* szPrevAction ); void RefreshWeaponViewOrder( int nEquipIndex ); void LinkCashWeapon( int nEquipIndex ); virtual float PreCalcDamage( CDnDamageBase *pHitter, SHitParam &HitParam, const float fDefenseRate=1.f, float fStateEffectAttackM = -1.0f ); // CP virtual void OnEventCP( CPTypeEnum Type, int nResult ); void UpdateAttackedCPPoint( CDnDamageBase *pHitter , CDnWeapon::HitTypeEnum eHitType ); void _UpdateMaxProjectileCount( int nActionIndex, bool bUpdateReservedCount = false ); void _CheckActionWithProcessPassiveActionSkill( const char* szPrevAction ); void _CheckProcessSkillActioncChange( const char* pAction ); public: virtual bool Initialize(); // Actor Message virtual bool SetActionQueue( const char *szActionName, int nLoopCount = 0, float fBlendFrame = 3.f, float fStartFrame = 0.f, bool bCheck = true, bool bCheckStateEffect = true ); virtual void Process( LOCAL_TIME LocalTime, float fDelta ); virtual void OnSignal( SignalTypeEnum Type, void *pPtr, LOCAL_TIME LocalTime, LOCAL_TIME SignalStartTime, LOCAL_TIME SignalEndTime, int nSignalIndex ); void OrderUseSkillToMySummonedMonster( OrderMySummonedMonsterStruct* pStruct ); virtual void OnDamage( CDnDamageBase *pHitter, SHitParam &HitParam, HitStruct *pHitStruct ); virtual void SyncClassTime( LOCAL_TIME LocalTime ); virtual void ResetActor(); virtual void GetBoundingSphere( SSphere &Sphere, bool bActorSize = false ); virtual void OnBeginStateBlow( DnBlowHandle hBlow ); // Quest Callback Message virtual void OnKillMonster(DnActorHandle hMonster); //MAPlateUser virtual bool AttachGlyph( DnGlyphHandle hGlyph, CDnGlyph::GlyphSlotEnum Index, bool bDelete = false ); virtual bool DetachGlyph( CDnGlyph::GlyphSlotEnum Index ); // Actor Command virtual void CmdMove( EtVector3 &vPos, const char *szActionName, int nLoopCount = 0, float fBlendFrame = 3.f ); virtual void CmdStop( const char *szActionName, int nLoopCount = 0, float fBlendFrame = 3.f, float fStartFrame = 0.f ); virtual void CmdPassiveSkillAction( int nSkillID, const char *szActionName, int nLoopCount = 0, float fBlendFrame = 3.f, float fStartFrame = 0.0f, bool bChargeKey = false, bool bCheckOverlapAction = true, bool bOnlyCheck = false ); virtual int CmdAddStateEffect( const CDnSkill::SkillInfo* pParentSkill, STATE_BLOW::emBLOW_INDEX emBlowIndex, int nDurationTime, const char *szParam, bool bOnPlayerInit = false, bool bCheckCanBegin = true, bool bEternity = false ); virtual void CmdRemoveStateEffect( STATE_BLOW::emBLOW_INDEX emBlowIndex, bool bRemoveFromServerToo = true ); virtual void SendRemoveStateEffect( STATE_BLOW::emBLOW_INDEX emBlowIndex ); virtual void SendRemoveStateEffectGraphic( STATE_BLOW::emBLOW_INDEX emBlowIndex ); virtual void CmdToggleBattle( bool bBattleMode ); bool CheckSkillAction( const char *szActionName ); virtual void CmdAddExperience( TExpData &ExpData, int nLogCode, INT64 biFKey ); // -> nLogCode¿¡ µû¶ó biFKey°ªµµ ³Ö¾îÁØ´Ù (eCharacterExpChangeCodeÂüÁ¶) virtual void CmdAddCoin( INT64 nCoin, int nLogCode, int nFKey, bool bSync = true ); virtual void CmdToggleWeaponViewOrder( int nEquipIndex, bool bShowCash ); virtual void CmdTogglePartsViewOrder( int nEquipIndex, bool bShowCash ); virtual void CmdToggleHideHelmet( bool bHideHelmet ); virtual void CmdChangeJob( int nJobID ); virtual void CmdPickupItem( PickupItemStruct* pStruct, DnDropItemHandle hDropItem=CDnDropItem::Identity() ); virtual void CmdEscape( EtVector3 &vPos ); virtual void CmdWarp( EtVector3 &vPos, EtVector2 &vLook, CDNUserSession* pGameSession=NULL, bool bCheckPlayerFollowSummonedMonster=false ); int GetLevelUpSkillPoint( int nPrevLevel, int nCurLevel ); // TransAction Message virtual void OnDispatchMessage( CDNUserSession *pSession, DWORD dwActorProtocol, BYTE *pPacket ); // MASkillUser Message // ȹµæÇÏÁö ¾ÊÀº.. ¾ð¶ô¸¸ µÈ ½ºÅ³Àº ½ÇÁ¦·Î MASkillUser ¿¡°Ô ³Ö¾îÁÖÁö ¾Ê°í Áß°£¿¡¼­ Áã°í ÀÖ½À´Ï´Ù. // MASkillUser::AddSkill ÀÇ °¡»óÇÔ¼ö »ó¼ÓÀ» À¯ÁöÇϱâ À§ÇØ iSkillLevelApplyType ±îÁö ¼±¾ðÇØ³õ¾ÒÁö¸¸ ½ÇÁ¦ °ªÀÌ Á¤ÇØÁö´Â °ÍÀº // ÀÌ Å¬·¡½º¿¡¼­ ¿À¹ö¶óÀ̵åÇÑ AddSkill ¿¡¼­ pvp/pve ¸¦ Á¤Çؼ­ MASkillUser::AddSkill() À» È£ÃâÇØÁÝ´Ï´Ù. virtual bool CanAddSkill( int nSkillTableID, int nLevel = 1 ); virtual bool AddSkill( int nSkillTableID, int nLevel = 1, int iSkillLevelApplyType = CDnSkill::PVE ); virtual void OnAddSkill( DnSkillHandle hSkill, bool isInitialize = false ); virtual void OnRemoveSkill( DnSkillHandle hSkill ); virtual void OnApplyPassiveSkillBlow( int iBlowID ); void CheckAndRegisterObserverStateBlow( DnBlowHandle hBlow ); void SaveUserData(TUserData &UserData); void SetUserSession(CDNUserSession * pSession); CDNUserSession * GetUserSession() { return m_pSession; } CDNGameRoom::PartyStruct *GetPartyData() { return m_pPartyData; } bool IsLocalActor() { return false; } virtual bool IsDie(); void SetBattleMode( bool bEnable ); bool IsBattleMode() { return m_bBattleMode; } bool IsCanBattleMode(); void OnBattleToggle( bool bBattle ); virtual bool IsPlayerActor() { return true; } virtual bool IsGMTrace() const; virtual UINT GetSessionID(); virtual int GetMoveSpeed(); INT64 GetCharacterDBID(); int GetComboCount() { return m_nComboCount; } int GetComboDelay() { return m_nComboDelay; } int GetTotalComboCount() { return m_nTotalComboCount; } void ResetTotalComboCount() { m_nTotalComboCount = 0; } void OnRepairEquipDurability( bool bDBSave, INT64 nPriceCoin ); void OnDecreaseEquipDurability( int nValue, bool bDBSave ); void OnDecreaseEquipDurability( float fValue, bool bDBSave ); void OnDecreaseInvenDurability( int nValue, bool bDBSave ); void OnDecreaseInvenDurability( float fValue, bool bDBSave ); bool OnStageGiveUp(); bool IsPenaltyStageGiveUp(); bool IsCompleteCutScene() { return m_bCompleteCutScene; } void SetCompleteCutScene( bool bValue ) { m_bCompleteCutScene = bValue; } void SetCheckCompleteCutScene( bool bValue ){ m_bCheckCompleteCutScene = bValue; } bool IsCheckCompleteCutScene(){ return m_bCheckCompleteCutScene; } bool IsSkipCutScene() { return m_bSkipCutScene; } void SetSkipCutScene( bool bValue ) { m_bSkipCutScene = bValue; } void ToggleGhostMode( bool bGhost ); bool IsGhost() { return m_bGhost; } void SwapSingleSkin( int nChangeActorTableID); bool IsSwapSingleSkin(){ return ( m_nSwapSingleSkinActorID == -1 ) ? false : true; } int GetSwapSingleSkinActorID() { return m_nSwapSingleSkinActorID; } int GetMonsterMutationTableID() { return m_nMonsterMutationTableID; } void RecvPartyRefreshGateInfo( const EtVector3& Pos ); //rlkt_mastery int GetLastUsedSkill(void) { return m_nLastUsedSkill; } virtual DnWeaponHandle GetActiveWeapon( int nEquipIndex ); // ¹«±â/¾Ç¼¼»ç¸®¿¡ ½ºÅ³ÀÌ ´Þ·Á ÀÖ´Â °æ¿ì ½ºÅ³ Ãß°¡. ºüÁö´Â °æ¿ì¿£ ½ºÅ³ Á¦°Å. virtual bool AttachParts( DnPartsHandle hParts, CDnParts::PartsTypeEnum Index, bool bDelete = false ); virtual bool DetachParts( CDnParts::PartsTypeEnum Index ); virtual bool AttachCashParts( DnPartsHandle hParts, CDnParts::PartsTypeEnum Index, bool bDelete = false ); virtual bool DetachCashParts( CDnParts::PartsTypeEnum Index ); virtual void AttachWeapon( DnWeaponHandle hWeapon, int nEquipIndex = 0, bool bDelete = false ); virtual void DetachWeapon( int nEquipIndex = 0 ); // ¿ä°Ç ·ÎÄò¨. virtual void AttachCashWeapon( DnWeaponHandle hWeapon, int nEquipIndex = 0, bool bDelete = false ); virtual void DetachCashWeapon( int nEquipIndex = 0 ); virtual DnWeaponHandle GetCashWeapon( int nEquipIndex = 0 ) { return m_hCashWeapon[nEquipIndex]; } void ShowCashWeapon( int nEquipIndex, bool bShow ); void SetWeaponViewOrder( int nEquipIndex, bool bShowCash ); // ½ºÇÙ°ü·Ã void SetSyncDatumTick(){ m_dwSyncDatumTick = GetTickCount(); } void SetSyncDatumSendTick(){ m_dwSyncDatumSendTick = GetTickCount(); } DWORD GetSyncDatumGap() const { return GetTickCount()-m_dwSyncDatumTick; } DWORD GetSyncDatumSendTick() const { return m_dwSyncDatumSendTick; } // ½ºÅ³ Æ®¸® °ü·Ã vector& GetPossessedSkillInfo( void ) { return m_vlPossessedSkill; }; void UnLockSkill( int nSkillID, INT64 nUnlockPrice=0 ); // ½ºÅ³ºÏÀ¸·Î ¾ð¶ô ¹× ȹµæ±îÁö Àϰý·Î 󸮵ǵµ·Ï º¯°æµÇ¾ú±â ¶§¹®¿¡ ¾ð¶ôµÈ´Ù¸é // ½ºÅ³À» ȹµæÇÒ ¼ö ÀÖ´Â Á¶°ÇÀÌ µÇ´ÂÁö üũ. ½ÇÁ¦·Î ¾ð¶ôµÇ±â Àü¿¡ È£ÃâµÇ¾î ¾ð¶ôÀÌ µÈ´Ù¸é ȹµæ±îÁö °¡´ÉÇÑÁö È®ÀÎÇÑ´Ù. int CanAcquireSkillIfUnlock( int nSkillID ); int AcquireSkill( int nSkillID ); void AddNowMaxProjectileCount( int nAddCount ) { m_iNowMaxProjectileCount += nAddCount; }; IDnPlayerChecker* GetPlayerSpeedHackChecker( void ) { return m_pPlayerSpeedHackChecker; }; bool IsInvalidPlayerChecker(); virtual void OnInvalidPlayerChecker( int nValue ); // ¹ß»çü ÇÙ°ü·Ã °¹¼ö üũ ½Ã¸®Áî. void AddReservedProjectileCount( void ) { ++m_iReservedProjectileCount; }; bool UseAndCheckAvailProjectileCount( void ); ////////////////////////////////////////////////////////////////////////// // ¹ß»çü ½Ã±×³Î¿¡¼­ »ç¿ëÇÏ´Â ¹«±â Å×À̺í ID üũ. bool CheckAndEraseWeaponIDUsingProjectileSignal( int iWeaponTableID ) { bool bResult = false; if( false == m_setWeaponIDUsingProjectileSignal.empty() ) { multiset::iterator iter = m_setWeaponIDUsingProjectileSignal.find( iWeaponTableID ); if( m_setWeaponIDUsingProjectileSignal.end() != iter ) { // °ªÀ¸·Î erase ¸¦ È£ÃâÇÏ¸é °°Àº °ª ´Ù Áö¿öÁö¹Ç·Î Çϳª¸¸ Áö¿ì±â. m_setWeaponIDUsingProjectileSignal.erase( iter ); bResult = true; } } return bResult; } void OnChangePlaySpeed( DWORD dwFrame, float fSpeed ); bool CheckProjectileSignalFrameTerm( void ) { // ÇöÀç ¹ß»çü ÆÐŶÀÌ µé¾î¿Â ½ÃÁ¡¿¡ ij¸¯ÅÍÀÇ ¹ß»ç ¾×¼Ç¿¡¼­ ½÷Áö´Â ¹ß»çüÀÇ ÇÁ·¹ÀÓ°ú // ÇöÀç °ÔÀÓ¼­¹ö¿¡¼­ ÇØ´ç ij¸¯ÅͰ¡ ÃëÇϰí ÀÖ´Â ¾×¼ÇÀÇ ÇÁ·¹ÀÓÀ» ºñ±³ÇÕ´Ï´Ù. // ij¸¯ÅÍÀÇ ÇÁ·¹ÀÓº¸´Ù ÀÛÀº ¹ß»çü ½Ã±×³Î ÇÁ·¹ÀÓÀÌ Çϳªµµ ¾ø´Ù¸é ÇÙÀ¸·Î °£ÁÖÇÕ´Ï´Ù. // ½ºÅ³¾×¼ÇÀ» Á¦¿ÜÇÑ ÀÏ¹Ý °ø°Ý ¾×¼Ç¸¸ Ã¼Å©ÇØµµ µË´Ï´Ù.. if( m_dqProjectileSignalOffset.empty() ) return false; // »óÇÏü ºÐ¸®¾×¼Ç ÁßÀ̶ó¸é float fCurrentFrame = 0.0f; if( IsCustomAction() ) { fCurrentFrame = GetCustomActionCurrentFrame(); } else { fCurrentFrame = CDnActionBase::m_fFrame; } // °°°Å³ª ÀÛÀº ÇÁ·¹ÀÓÀÌ Çϳªµµ ¾øÀ¸¸é ÇöÀç ÇÁ·¹ÀÓ¿¡ ¿Ã ¼ö ¾ø´Â ¹ß»çü ÆÐŶÀÓ. // Á¤·ÄµÇ¾îÀÖÀ¸¹Ç·Î ¸Ç ¾ÕÀÇ °Í¸¸ ºñ±³ÇÏ¸é µÈ´Ù. // ¼­¹ö´Â 20ÇÁ·¹ÀÓÀ¸·Î µµ¹Ç·Î +6 ÇÁ·¹ÀÓÀÇ °ü¿ëµµ °ªÀ» Çã¿ëÇÑ´Ù. int iSignalOffset = int((float)m_dqProjectileSignalOffset.front()/* / m_fFrameSpeed*/); // ÇÁ·¹ÀÓ ±âÁØÀ̹ǷΠ´À·ÁÁö¸é ´À·ÁÁö´Â´ë·Î ÇÁ·¹ÀÓµµ ´Ê°Ô ´Ã¾î³ª¹Ç·Î ±×³É ºñ±³ÇÑ´Ù. if( m_bCheckProjectileSignalTerm ) { // ÇÁ·¹ÀÓ ½ºÇǵ尡 »¡¶óÁö¸é ¿ÀÂ÷°¡ ´õ Ä¿Áú ¼ö ÀÖÀ¸¹Ç·Î °¨¾È. if( fCurrentFrame+(8.0f*m_fFrameSpeed) < iSignalOffset ) { // TODO: ÇÙÀÌ´Ù! Á¢¼Ó ²÷¾î¹ö·ÈÀ¸¸é ÁÁ°Ú´Âµ¥.. return false; } } // ¹ß»ç ó¸® µÇ¾úÀ¸¹Ç·Î ÇÑ¹ß »©ÁÖ°í. m_dqProjectileSignalOffset.pop_front(); return true; } bool CheckSkipAirCondition(int iSkill); // ÇöÀç°¡ AirÀΰæ¿ì ¼­¹ö¿Í Ŭ¶ó°£ ÀνÄÂ÷ÀÌÀÇ °¸À¸·Î GroundMovable üũ¿¡¼­ ½ÇÆÐÇÏ´Â °æ¿ì°¡ÀÖ´Ù. void ReplacementGlyph( DnSkillHandle hNewSkill ); bool IsExclusiveSkill( int iSkillID, int iExclusiveID ); int GetAvailSkillPointByJob( int iSkillID ); int GetUsedSkillPointInThisJob( const int nJobID ); // Ŭ¶óÀÌ¾ðÆ®¿¡°Ô ÄðŸÀÓ ÆÐ¸µÀÌ ¼º°øÇßÀ½À» ¾Ë·ÁÁÜ. void RequestCooltimeParrySuccess( int iSkillID ); // ÆòŸ ¸Â¾ÒÀ» ¶§ ½ÇÇàµÇ¾î¾ß ÇÒ ¾ÆÀÌÅÛ Á¢µÎ¾î ½ºÅ³ °ü·Ã ó¸®ÇÒ °ÍÀÌ ÀÖÀ¸¸é ó¸®. void CheckNormalHitSEProcessor( DnActorHandle hHittedTarget, const CDnDamageBase::SHitParam& HitParam ); void AddStageDeathCount() { ++m_nDeathCount; }; void ClearStageDeathCount() { m_nDeathCount = 0;}; int GetStageDeathCount() { return m_nDeathCount;}; void InitializeEnchantPassiveSkills( void ); // from MASkillUser virtual void OnReplacementSkill( DnSkillHandle hLegacySkill, DnSkillHandle hNewSkill ); // ÇØ´ç ½ºÅ³ ID ¿¡ ¸Â´Â °­È­ ½ºÅ³À» °®°í ÀÖ´ÂÁö Ã¼Å©ÇØ¼­ °®°í ÀÖ´Ù¸é Àû¿ë½ÃÄÑ ÁØ´Ù. void CheckAndApplyEnchantPassiveSkill( DnSkillHandle hBaseSkill ); // ÇöÀç ¿¤¸®¸àÅ»·ÎµåÀÇ ¾ÆÀ̽à ÇÁ·¢¼Ç¿¡¼­¸¸ ¿¹¿ÜÀûÀ¸·Î 2°¡ÁöÀÇ »óÅÂÈ¿°ú ÇÊÅ͸µÀ» °É°í Àִµ¥ // µÑ Áß¿¡ Çϳª¸¸ hit µÇ±æ ¿øÇϱ⠶§¹®¿¡ ¸ÕÀú üũµÈ °ÍÀº ´ÙÀ½ ÇÊÅ͸µ¿¡ °É¸®Áö ¾Êµµ·Ï ÇÑ´Ù. #28747 // CDnPlayerActor ¿¡¼­ »ó¼Ó ¹ÞÀ½. virtual void OnHitSignalStateEffectFilterException( DWORD dwTargetActorUniqueID, int iBlowIndex ); virtual bool CheckHitSignalStateEffectFilterException( DWORD dwTargetActorUniqueID, int iBlowIndex ); virtual bool IsMyRelicMonster( DnActorHandle hActor ); BubbleSystem::CDnBubbleSystem* GetBubbleSystem( void ) { return m_pBubbleSystem; }; void RemoveAllBubbles( bool bRemoveEvent ); // #26902 // 2Â÷ ÀüÁ÷ ½ºÅ³À» Àӽ÷Π»ç¿ëÇØº¼ ¼ö ÀÖ´Â »óÅ·Π¸¸µé¾îÁÖ±â À§ÇØ Äù½ºÆ®¿¡¼­ »ç¿ëµÇ´Â api ¿¡¼­ È£ÃâµÇ´Â ÇÔ¼ö. // »ç¿ë °¡´É Á÷¾÷ ¹× »ç¿ë °¡´É ·¹º§À» ÇöÀç ij¸¯ÅÍÀÇ ·¹º§·Î ¸ÂÃçÁØ´Ù. // Ŭ¶óÀÌ¾ðÆ® ÂÊ¿¡¼­¸¸ ½ºÅ³ Æ®¸®¸¦ º¸¿©ÁÖ±â À§ÇØ Àӽ÷ΠÀüÁ÷À» ½ÃÄÑÁØ´Ù. bool IsTempSkillAdded( void ) { return m_bTempSkillAdded; }; bool CanChangeJob( int iJobID ); void SendTempJobChange( int iJobID ); void EndAddTempSkillAndSendRestoreTempJobChange( void ); void AddTempSkill( int iSkillID ); void RemoveAllTempSkill( void ); bool IsCannonMode( void ) { return (m_hCannonMonsterActor && m_bPlayerCannonMode); }; void OnCannonMonsterDie(void ); void EndCannonMode(); // Å»°Í ÀÌÆåÆ® ÀÚü°¡ ½ºÅÝÀ» °¡Áö°Å³ª °ÔÀÓ¿¡ ¿µÇâÀ» ³¢Ä¡´Â°æ¿ì¿¡´Â Ãß°¡¸¦ ÇØÁà¾ß ÇϰÙÁö¸¸ ÀÏ´Ü ±×·²°æ¿ì°¡ ÇöÀç´Â ¾ø±â¶§¹®¿¡ ÀÏ´Ü ¾ÆÀÌÅÛ À妽º¸¸ °¡Áö°í ÀÖµµ·Ï ÇϰڽÀ´Ï´Ù. void SetVehicleEffectIndex(UINT nIndex){m_nVehicleEffectIndex = nIndex;} bool IsCanVehicleMode(); bool IsCanPetMode(); void RideVehicle(TVehicle *pInfo); void UnRideVehicle(bool bForce=true); void ForceUnRideVehicle(); bool IsVehicleMode(){return m_bVehicleMode;} void SetVehicleMode(bool bVehicle){m_bVehicleMode = bVehicle;} CDnVehicleActor *GetMyVehicleActor(); void SetMyVehicleActor(DnActorHandle hVehicleActor){m_hVehicleActor = hVehicleActor;} void RemoveVehicleStateEffectImmediately(int nBlowIndex ); void SetForceEnableRide( const bool bForceEnableRide ); // Pet / VehicleÀ» À§Çؼ­ ¼­¹ö¿¡¼­ Processµ¹·Á¾ß ÇÏ´Â °æ¿ì´Â ÀÌ ÇÔ¼ö ³»ºÎ¿¡ Ãß°¡ÇØÁݽôÙ. // Ŭ¶óÀÌ¾ðÆ®´Â Task·Î °ü¸®µÊ. void ProcessCompanion( LOCAL_TIME LocalTime, float fDelta ); void ApplyEventStateBlow(); void RemoveEventStateBlow(); void CheckPetSatietyPercent(); bool IsTransformMode(){return m_bTransformMode;} bool IsTransformSkill( int nSkillID ); virtual void RefreshTransformMode(); virtual void ToggleTransformMode(bool bTrue, int nMonsterMutationTableID=-1, bool bForce = false, const char* strEndAction = "Stand" ); virtual void CmdShootMode(bool bTrue); virtual const char *GetChangeShootActionName(const char *szActionName); virtual void ProcessNonLocalShootModeAction(); bool IsSpectatorMode(); virtual bool OnApplySpectator(bool bEnable); #ifdef PRE_ADD_MONSTER_CATCH void SetCatcherMonsterActor( DnActorHandle hActor ) { m_hCatcherMonster = hActor; }; void ReleaseCatcherMonsterActor( void ) { m_hCatcherMonster.Identity(); }; bool IsCatchedByMonster( void ) { return m_hCatcherMonster ? true : false; }; #endif // #ifdef PRE_ADD_MONSTER_CATCH void OnInitializeNextStageFinished( void ); void OnDieSummonedMonster( DnMonsterActorHandle hSummonedMonster ); void OnBeforeDestroyStageMonsters( void ); bool HasSameGlobalIDSkill( int iSkillID ); #ifdef PRE_FIX_GAMESERVER_PERFOMANCE virtual bool IsAllowCallSkillProcess( float fDelta ); #endif // #ifdef PRE_FIX_GAMESERVER_PERFOMANCE void UpdateMissionByMonsterKillCount(int nCount); void ApplyEnchantSkillOnceFromBubble( int iTargetSkillID, int iEnchantSkillID ); //#45680 //½ºÅ³Æ®¸®Ã¢¿¡¼­ÀÇ ·¹º§¾÷Àº DnSkillTask¿¡¼­ µ¿ÀÛ µÇ°í ÀÖÀ¸³ª //¼­¹öÂÊ¿¡¼­ ½ºÅ³ ·¹º§¾÷ ¾ÆÀÌÅÛ Àå/Å»Âø½Ã ¹®Àå È¿°ú Àû¿ë ºÎºÐ ´©¶ôµÇ¾î ÀÖÀ½. virtual void ChangeSkillLevelUp(int nSkillID, int nOrigLevel); void MakeEquipAndPassiveState( CDnState &State ); #ifdef PRE_ADD_COSTUME_SKILL void RefreshCostumeSkill( int nSkillIndex , int nSkilllevel); #endif #ifdef PRE_ADD_VEHICLE_SPECIAL_ACTION void ReportInvalidAction(); #endif #if defined(PRE_ADD_TOTAL_LEVEL_SKILL) protected: CDnTotalLevelSkillSystem* m_pTotalLevelSkillSystem; public: CDnTotalLevelSkillSystem* GetTotalLevelSkillSystem() { return m_pTotalLevelSkillSystem; } virtual void UpdateTotalLevel(int nLevel); virtual void UpdateTotalLevelByCharLevel(); virtual void AddTotalLevelSkill(int nSlotIndex, int nSkillID, bool isInitialize = false); virtual void RemoveTotalLevelSkill(int nSlotIndex); virtual void ActivateTotalLevelSkillSlot(int nSlotIndex, bool bActivate); virtual void ActivateTotalLevelSkillCashSlot(int nSlotIndex, bool bActivate, __time64_t tExpireDate); virtual void RequestAddTotalLevelSkill(int nSlotIndex, int nSkillID) {}; virtual void RequestRemoveTotalLevelSkill(int nSlotIndex) {}; virtual void OnLevelChange(); #endif // PRE_ADD_TOTAL_LEVEL_SKILL };