#pragma once #include "EtMatrixEx.h" #include "DnItem.h" #include "DnSkill.h" class CDnActor; class CDnProjectile; class MASkillUser { public: MASkillUser(); virtual ~MASkillUser(); protected: LOCAL_TIME m_LocalTime; DnSkillHandle m_hProcessSkill; DnSkillHandle m_hCanceledSkill; DnSkillHandle m_hToggleSkill; //À̳༮Àº ´õÀÌ»ó »ç¿ëµÇÁö ¾ÊÀ½..¿©±âÀú±â ÄÚµå ÈçÀûÀÌ ³²¾Æ À־ º¯¼ö¸¸ »ì·Á ³õÀ½.. DnSkillHandle m_hAuraSkill; DnSkillHandle m_hItemSkill; #ifndef PRE_FIX_SKILLLIST DNVector(DnSkillHandle) m_vlhSkillList; vector m_vbSelfAllocList; #else struct S_SKILL_OBJECT { DnSkillHandle hSkill; bool bSelfAlloc; S_SKILL_OBJECT( void ) : bSelfAlloc( false ) {}; S_SKILL_OBJECT( DnSkillHandle _hSkill, bool _bSelfAlloc ) { hSkill = _hSkill; bSelfAlloc = _bSelfAlloc; }; }; #endif // #ifndef PRE_FIX_SKILLLIST // ¾ÆÀÌÅÛ¿¡ ºÙÀº Áö¼Ó½Ã°£ ÀÖ´Â ½ºÅ³, Ä® ´øÁö±â°°Àº ½ºÅ³ ·çƾ ±×´ë·Î µû·ç´Â °ÍµéÀº µû·Î ¸ð¾ÆÁØ´Ù. deque m_dqhItemSkillList; DnActorHandle m_hSkillTarget; EtVector3 m_vSkillTargetPos; // Åä±Û, ¿À¶ó ½ºÅ³À» ¸ð¾ÆµÐ´Ù. DNVector(DnSkillHandle) m_vlhToggleSkills; DNVector(DnSkillHandle) m_vlhAuraSkills; // ÆÄ¿ö ¸¶½ºÅ͸® °°Àº, ´É·ÂÄ¡¸¦ ¿µ±¸È÷ ´Ã·ÁÁÖ´Â ½ºÅ³µéÀº µû·Î ¸ð¾Æ¼­ °®°í ÀÖ´Ù°¡ È¿°ú Àû¿ë, »èÁ¦ ŸÀ̹ÖÀ» Á¦¾îÇÑ´Ù. DNVector(DnSkillHandle) m_vlhSelfPassiveBlowSkill; CDnActor *m_pActor; bool m_bIsValidActor; #ifdef _GAMESERVER // Åä±Û ½ºÅ³ÀÌ ÄÑÁú ´ç½Ã¿¡ Àû¿ëµÇ¾î¾ß ÇÒ »óŸ¦ ÀúÀåÇØµÒ. (ÇÁ·ÎÁ§Å¸ÀÏ¿¡ ½Ç¾î¼­ ³¯·ÁÁÖ±â À§ÇÔ) CDnState m_ActorStateSnapshotForToggleProjectile; #endif // Á¾·á ½Ãų ½ºÅ³ ¸®½ºÆ®. MASkillUser::Process ¿¡¼­ ó¸®ÇÑ´Ù. DNVector(DnSkillHandle) m_vlhReservedFinishSkill; // ÄðŸÀÓ »óÅÂÈ¿°ú Á¶Àý °ª¿¡ ¿µÇâ¹Þ´Â ºñÀ² º¯¼ö. //float m_fAdjustCoolTime; #ifdef _GAMESERVER // cheat bool m_bIgnoreCoolTime; list m_listAutoPassiveSkills; list m_listProcessAutoPassiveSkills; // ¾ÆÀÌÅÛ¿¡ µé¾îÀÖ´Â.. ÆòŸ·Î ÇÇ°ÝµÈ ´ë»ó¿¡°Ô ÀÏÁ¤ È®·ü·Î ½ºÅ³ÀÇ Target À¸·Î ÁöÁ¤µÈ »óÅÂÈ¿°úµéÀ» // ºÎ¿©ÇÏ´Â ¹ßÇöŸÀÔÀÇ ¸ðÀÓ. DNVector(IDnSkillProcessor*) m_vlpApplySEWhenNormalHitProcessor; #else bool m_bSkillExecutedThisFrame; // ½ºÅ³ »ç¿ë Çã¿ë ½Ã±×³ÎÀÌ µé¾î¿Â ¼ø°£ Äü½½·Ô ¿©·¯°³ ´­·¯¼­ µ¿½Ã¿¡ ½ºÅ³ »ç¿ëµÇ´Â °ÍÀ» ¸·´Â´Ù. (#9886) // º¸À¯Çϰí ÀÖ´Â ½ºÅ³¿¡¼­ »ç¿ëÁßÀÎ ¾×¼ÇÀ̸§µéÀÇ ¸ðÀ½ set m_setUseActionNames; #endif // ÄðŸÀÓ Á¶Àý »óÅÂÈ¿°ú ±¸ÇöÀÌ ¹Ù²î¾úÀ½. ÇöÀç ÄðŸÀÓ °è»ê½Ã È¿°ú½Ã°£µ¿¾È ÄðŸÀÓÀÇ µ¨Å¸°ª¿¡ ¿µÇâÀ» ÁØ´Ù. (#21146) float m_fCoolTimeDeltaAdjustValue; private: #ifdef PRE_FIX_SKILLLIST vector m_vlSkillObjects; #endif // #ifdef PRE_FIX_SKILLLIST protected: bool IsValidActor(); CDnSkill::UsingResult CanExecuteSkill( DnSkillHandle hSkill ); // Process virtual void OnSkillProcess( LOCAL_TIME LocalTime, float fDelta ); // ½ºÅ³ »ç¿ë // °ÔÀÓ¼­¹ö¿¡¼­ ½ÃÀ۵Ǵ ¿ÀÅä ÆÐ½Ãºê ½ºÅ³ Ç÷¡±×´Â Ŭ¶óÀÌ¾ðÆ®¿¡¼­¸¸ ÇÔ¼ö ÀÎÀÚ·Î ¹Þ½À´Ï´Ù. #ifdef _GAMESERVER virtual bool ExecuteSkill( DnSkillHandle hSkill, LOCAL_TIME LocalTime, float fDelta ); #else virtual bool ExecuteSkill( DnSkillHandle hSkill, LOCAL_TIME LocalTime, float fDelta, bool bCheckValid = true, bool bAutoUsedFromServer = false, bool bSendPacketToServer = true ); #endif // Åä±ÛÀÌ °É·ÁÀÖÀ»¶§ ÇÁ·ÎÁ§Å¸ÀÏÀÌ ¹ß»çµÇ¸é Åä±ÛµÈ ½ºÅ³°ú ÇÁ·ÎÁ§Å¸ÀÏ Æ÷ÀÎÅÍ¿Í ÇÔ²² ºÒ·ÁÁø´Ù. virtual void OnSkillToggleProjectile( DnSkillHandle hSkill, CDnProjectile *pProjectile ); public: // Åä±Û ½ºÅ³ÀÌ »ç¿ëµÉ ¶§ ºÒ·ÁÁø´Ù. virtual void OnSkillToggle( DnSkillHandle hSkill, bool bEnable ); // ¿À¶ó ½ºÅ³ÀÌ »ç¿ëµÉ ¶§ ºÒ·ÁÁø´Ù. virtual void OnSkillAura( DnSkillHandle hSkill, bool bEnable ); // ÇÁ·ÎÁ§Å¸ÀÏ virtual void OnSkillProjectile( CDnProjectile *pProjectile ); virtual void OnAddSkill( DnSkillHandle hSkill, bool isInitialize = false ); virtual void OnRemoveSkill( DnSkillHandle hSkill ); virtual void OnReplacementSkill( DnSkillHandle hLegacySkill, DnSkillHandle hNewSkill ) {}; public: DnSkillHandle FindSkill( int nSkillTableID ); virtual bool CanAddSkill( int nSkillTableID, int nLevel = 1 ){ return true; } virtual bool AddSkill( int nSkillTableID, int nLevel = 1, int iSkillLevelApplyType = CDnSkill::PVE ); #ifndef PRE_FIX_SKILLLIST // ÃßÈÄ °Ë»öÀÇ ÆíÀǼºÀ» À§Çؼ­. #else virtual void AddSkillObject( S_SKILL_OBJECT& SkillObject ) { m_vlSkillObjects.push_back( SkillObject ); }; #endif // #ifdef PRE_FIX_SKILLIST // °×¼­¹ö¿¡¼­´Â ¸ó½ºÅÍ¿¡¼­¸¸ »ç¿ëÇÔ. // Ç÷¹ÀÌ¾î ¾×ÅÍ´Â ½ºÅ³Æ®¸® °ü¸®°¡ Áß°£¿¡ µé¾î°¡±â ¶§¹®¿¡ ¼­¹ö¿¡¼­ ÀÌ ÇÔ¼ö »ç¿ëÇÏ¸é ¾ÈµË´Ï´Ù. bool AddSkill( DnSkillHandle hSkill ); bool RemoveSkill( int nSkillTableID ); bool RemoveSkillAll(); bool EndStateEffectSkill(int nSkillTableID); // ÇöÀç Ŭ¶ó¿¡¼­¸¸ ¾²À̰í ÀÖÀ½. #ifndef _GAMESERVER bool ReplacementSkill( int nSkillTableID, int nLevel = 1 ); // °×¼­¹ö¿¡¼­ »ç¿ë ½ºÅ³ °´Ã¼ self allocation bool ReplacementSkill( DnSkillHandle hNewSkill ); #endif virtual bool ApplyPassiveSkill( DnSkillHandle hSkill, bool isInitialize = false ); virtual void OnApplyPassiveSkillBlow( int iBlowID ) {}; void ApplyPassiveSkills( void ); // ºÎȰ ÇÒ ¶§ ¸ðµÎ »ç¶óÁø »óÅÂÈ¿°ú¸¦ ´Ù½Ã Àû¿ë½Ãų ¶§ È£ÃâÇÔ bool bIsPassiveSkill( DnBlowHandle hBlow ); bool IsExistSkill( int nSkillTableID, int nLevel = -1 ); void SetSkillLevel( int nSkillTableID, int nValue ); bool IsSelfAllocSkill( int nSkillTableID ); virtual CDnSkill::UsingResult UseSkill( int nSkillTableID, bool bCheckValid = true, bool bAutoUseFromServer = false, int nLuaSkillIndex=-1 ); // LuaSkillIndex ¸ó½ºÅÍAI ¿¡¼­ ÇÊ¿äÇØ¼­ Ãß°¡ÇÔ. bool IsProcessSkill(); void ResetToggleSkill(); void ResetAuraSkill(); bool IsEnabledToggleSkill() { //m_hToggleSkillº¯¼ö ÂüÁ¶´Â ´õ ÀÌ»ó ¾øµµ·Ï.. return false; }; bool IsEnabledAuraSkill() { return (m_hAuraSkill != NULL); }; DnSkillHandle GetProcessSkill(); DnSkillHandle GetEnabledToggleSkill() { return m_hToggleSkill; }; DnSkillHandle GetEnabledAuraSkill() { return m_hAuraSkill; }; DnActorHandle GetSkillTarget() { return m_hSkillTarget; } EtVector3 *GetSkillTargetPos() { return &m_vSkillTargetPos; } DWORD GetSkillCount(); DnSkillHandle GetSkillFromIndex( DWORD dwIndex ); bool UseItemSkill( int nSkillTableID, int nSkillLevelTableID, CDnItem::ItemSkillApplyType ItemSkillApplyType, int nItemID = -1 ); bool IsUsingItemSkill( void ) { return m_hItemSkill ? true : false; } void ResetSkillCoolTime( void ); void ResetPvPSkillCoolTime(); void ResetLadderSkillCoolTime(); #ifdef _GAMESERVER void IgnoreSkillCoolTime( void ); bool IsIgnoreSkillCoolTime( void ) { return m_bIgnoreCoolTime; }; #endif #ifndef _GAMESERVER bool IsUsingSkillAction( const char *szAction ); #endif void ReserveFinishSkill( DnSkillHandle hSkill ); // ÇöÀç »ç¿ëÁßÀÎ ½ºÅ³ »ç¿ë Áß´Ü. void CancelUsingSkill( void ); #ifdef _GAMESERVER // for Fire/Ice Shield void UseAutoPassiveSkill( LOCAL_TIME LocalTime, float fDelta ); bool IsProcessingAutoPassive( int iSkillID ); void EndAutoPassiveSkill( LOCAL_TIME LocalTime, float fDelta ); //const CDnState *GetActorStateSnapshotForProjectile( void ) { return &m_ActorStateSnapshotForToggleProjectile; }; #endif //rlkt_mastery bool HavePassiveSkill(int iSkillID); //void AddCoolTimeAdjustValue( float fCoolTimeAdjustValue ) //{ // _ASSERT( 0.0f < fCoolTimeAdjustValue+fCoolTimeAdjustValue && fCoolTimeAdjustValue+fCoolTimeAdjustValue < 1.0f ); // m_fAdjustCoolTime += fCoolTimeAdjustValue; //}; //float GetCoolTimeAdjustValue( void ) { return m_fAdjustCoolTime; }; // ¹«±â°¡ º¯°æµÊ. ÆÐ½Ãºê·Î ƯÁ¤ ¹«±â »ç°Å¸® º¯°æ »óÅÂÈ¿°ú µîÀÌ ÀÖÀ¸¹Ç·Î Å×ÀÌºí¿¡ Á¤ÀÇµÈ ½ºÅ³ »ç¿ë°¡´É ¹«±âÀÎÁö üũ ÇÊ¿ä. void OnAttachWeapon( DnWeaponHandle hWeapon, int iAttachedWeaponIndex ); void OnDetachWeapon( DnWeaponHandle hWeapon, int iDetachedWeaponIndex ); float GetCoolTimeDeltaAdjustValue( void ) { return m_fCoolTimeDeltaAdjustValue; }; #ifdef _GAMESERVER void SelectSkillLevelDataType( int iLevelDataType, bool bPlayerSummonedMonster = false ); int GetSelectedSkillLevelDataType( void ); #endif protected: std::map m_vlStateBlowIDToRemove; // [2010/12/15 semozz]ÇØ´ç »óÅÂÈ¿°ú IDÁߺ¹ ¹æÁö¸¦ À§ÇØ mapÀ¸·Î º¯°æ public: void AddStateBlowIDToRemove(int blowID); //Á¦°ÅÇØ¾ßÇÒ »óÅÂÈ¿°ú IDµî·Ï void InitStateBlowIDToRemove(); //Á¦°ÅÇØ¾ßÇÒ »óÅÂÈ¿°ú ID¸®½ºÆ® ÃʱâÈ­ virtual void RemoveResetStateBlow() {}; //Á¦°ÅÇØ¾ßÇÒ »óÅÂÈ¿°ú Á¦°Å #ifdef _GAMESERVER void AddApplySEWhenTargetNormalHitProcessor( IDnSkillProcessor* pProcessor ) { m_vlpApplySEWhenNormalHitProcessor.push_back( pProcessor ); }; void RemoveApplySEWhenTargetNormalHitProcessor( IDnSkillProcessor* pProcessor ); #endif #if defined(_GAMESERVER) protected: //½½·Ôº° ½ºÅ³ Á¤º¸ ÀúÀå¿ë. struct PREFIX_SYSTEM_SKILLINFO { int slotIndex; //ÇØ´ç ½½·Ô Index float fRatio; //½ºÅ³ È®·ü DnSkillHandle hSkill; //½ºÅ³ ÇÚµé }; typedef std::vector PRESIX_SYSTEM_SKILLS; //Á¢µÎ¾î ½ºÅ³ Á¤º¸ ¸®½ºÆ® typedef std::map PREFIX_SYSTEM_SKILL_COLLECTION; //½ºÅ³ IDº° ±×·ìÇÎ/¿ì¼±¼øÀ§º° ±×·ìÇÎ¿ë ¸®½ºÆ® typedef std::map PREFIX_SYSTEM_SKILL_LIST; //Á¢µÎ¾î ½Ã½ºÅÛ¿ë ½½·Ôº° ½ºÅ³ Á¤º¸ ¸®½ºÆ® PREFIX_SYSTEM_SKILL_LIST m_prefixSystemDefenceSkills; //Á¢µÎ¾î ½Ã½ºÅÛÀÇ ¹æ¾î¿ë ½ºÅ³µé PREFIX_SYSTEM_SKILL_COLLECTION m_PrefixSystemCandiateDefenceSkills; PREFIX_SYSTEM_SKILL_LIST m_prefixSystemOffenceSkills; //Á¢µÎ¾î ½Ã½ºÅÛÀÇ °ø°Ý¿ë ½ºÅ³µé PREFIX_SYSTEM_SKILL_COLLECTION m_PrefixSystemCandiateOffenceSkills; list m_listProcessPreFixDefenceSkills; list m_listProcessPreFixOffenceSkills; void RefreshPrefixDefenceSkills(); //Àåºñ Àå/Å»Âø½Ã Á¢µÎ¾î ½Ã½ºÅÛ ¹æ¾î¿ë ½ºÅ³ Á¤º¸ °»½Å.(½ºÅ³ »ç¿ë½ÃÁ¡¿¡ ¸Å¹ø ÇÏ´Â°Í º¸´Ù Àåºñ Àå/Å»Âø½Ã Çѹø ÇØ ³õ´Â°Ô È¿À²ÀûÀϵí..) void RefreshPrefixOffenceSkills(float fHitDamageProb = 1.0f); //Àåºñ Àå/Å»Âø½Ã Á¢µÎ¾î ½Ã½ºÅÛ °ø°Ý¿ë ½ºÅ³ Á¤º¸ °»½Å. //Á¢µÎ¾î¿ë ½ºÅ³ ÄðŸÀÓ °ü¸® CoolTimeManager m_PrefixSkillCoolTimeManager; public: void EndPrefixSystemSkill( LOCAL_TIME LocalTime, float fDelta ); bool AddPreFixSystemDefenceSkill(int slotIndex, DnSkillHandle hSkill); void RemovePreFixSystemDefenceSkill(int slotIndex); void RemoveProcessPrefixDefenceSkill(DnSkillHandle hSkill); bool AddPreFixSystemOffenceSkill(int slotIndex, DnSkillHandle hSkill); void RemovePreFixSystemOffenceSkill(int slotIndex); void RemoveProcessPrefixOffenceSkill(DnSkillHandle hSkill); // °°Àº ½ºÅ³ ¾ÆÀ̵𸦠°¡Áø ½ºÅ³µéÀ» ¼öÁýÇÑ´Ù. void GroupingPrefixDefenceSkillsBySameSkillID(PREFIX_SYSTEM_SKILL_LIST &skillList, PREFIX_SYSTEM_SKILL_COLLECTION &sameSkillList); // ¼öÁýµÈ °°Àº ½ºÅ³ ¾ÆÀ̵ðÀÇ ½ºÅ³µé ¹ßµ¿ È®·üÀ» Á¶Á¤(+)ÇØ¼­ Èĺ¸ ½ºÅ³À» µî·ÏÇÑ´Ù. void CalculateProbabilitySkill(PREFIX_SYSTEM_SKILL_LIST &candidateSkills, PREFIX_SYSTEM_SKILL_COLLECTION &sameSkillList); // °°Àº ½ºÅ³IDÀÇ ½ºÅ³µéÁß¿¡ ÃÖÁ¾ ¼±ÅÃµÈ ½ºÅ³µéÀ» ¿ì¼±¼øÀ§º°·Î ±×·ìÇÎÀ» ÇÑ´Ù. void GroupingSkillByPriority(PREFIX_SYSTEM_SKILL_COLLECTION& prefixSystemSkills, PREFIX_SYSTEM_SKILL_LIST& tempCandiateSkills, float fHitDamageProb = 1.0f); void ProcessPrefixDefenceSkill(DnActorHandle hHitter); //Á¢µÎ¾î ½Ã½ºÅÛÁß ¹æ¾î¿ë ½ºÅ³ ¹ßµ¿ // Àڽſ¡°Ô¸¸ Àû¿ë µÉ »óÅÂÈ¿°ú¸¸ Àû¿ë ½ÃŲ´Ù. void ProcessPrefixOffenceSkill(float fHitDamageProb); //Á¢µÎ¾î ½Ã½ºÅÛÁß °ø°Ý¿ë ½ºÅ³ ¹ßµ¿ void ApplyPrefixOffenceSkillToTarget(DnActorHandle hTarget);//Á¢µÎ¾î ½Ã½ºÅÛÁß °ø°Ý¿ë ½ºÅ³¿¡¼­ »ó´ë¹æ¿¡°Ô Àû¿ë ½Ãų »óÅÂÈ¿°úµé Àû¿ë // Á¢µÎ¾î ½Ã½ºÅÛ °ø°Ý¿ë ½ºÅ³ Àû¿ëÀÌ ³¡³ª°í ÃʱâÈ­. void InitPrefixOffenceSkills(); bool IsPrefixTriggerSkill(); bool IsApplyPrefixOffenceSkill() { return !m_listProcessPreFixOffenceSkills.empty(); } #endif // _GAMESERVER protected: struct SkillLevelUpInfo { int nSkillID; int nLevelUp; }; std::map m_SkillLevelUpInfoList; std::map m_SkillLevelUpInfo; void UpdateSkillLevelUpInfo(); void SkillLevelUp(int nSkillID, int nLevelUp); public: void AddSkillLevelUpInfo(int nSlotIndex, int nSkillID, int nLevelUp); void RemoveSkillLevelUpInfo(int nSlotIndex); int GetSkillLevelUpValue(int nSkillID); bool ExistSkillLevelUpValue(); void ApplySkillLevelUp( int nSkillTableID, int nValue ); //SetSkillLevelÇÔ¼öÀÇ Ã¹¹øÂ° Á¶°Ç ¹®Á¦·Î ÇÔ¼ö Ãß°¡ÇÔ //Ŭ¶óÀ̾ðÆ®ÀÇ LocalPlayerÀÇ ±¸ºÐ 󸮸¦ À§ÇØ °¡»ó ÇÔ¼ö ¼±¾ð(Ŭ¶óÀÌ¾ðÆ®¿¡¼­ LocalPlayerActor¿¡´Â SkillTask¸¦ ÅëÇØ ½ºÅ³ º¯°æ) //Ŭ¶óÀ̾ðÆ®ÀÇ LocalPlayer°¡ ¾Æ´Ñ ´Ù¸¥ ij¸¯ÅÍ¿Í ¼­¹ö´ÜÀÇ PlayerActor´Â MaSkillUser¿¡¼­ ó¸®µÊ virtual void ChangeSkillLevelUp(int nSkillID, int nSkillLevel); protected: std::map m_CashSkillLevelUpInfoList; std::map m_CashSkillLevelUpInfo; void UpdateSkillLevelUpInfoByCashItem(); public: void AddSkillLevelUpInfoByCashItem(int nSlotIndex, int nSkillID, int nLevelUp); void RemoveSkillLevelUpInfoByCashItem(int nSlotIndex); #if defined(PRE_ADD_PREFIX_SYSTE_RENEW) #if defined(_GAMESERVER) protected: typedef std::map PREFIX_SKILL_INFO; PREFIX_SKILL_INFO m_PrefixDefenceSkills; PREFIX_SKILL_INFO m_PrefixOffenceSkills; std::list m_ProcessPrefixOffenceSkills; public: void AddPrefixDefenceSkill(DnSkillHandle hSkill); void RemovePrefixDefenceSkill(DnSkillHandle hSkill); void ProcessPrefixDefenceSkill_New(DnActorHandle hHitter); void AddPrefixOffenceSkill(DnSkillHandle hSkill); void RemovePrefixOffenceSkill(DnSkillHandle hSkill); void RemoveProcessPrefixOffenceSkill(CDnPrefixSkill* pRemovePrefixSkill); void ProcessPrefixOffenceSkill_New(); void ApplyPrefixOffenceSkillToTarget_New(DnActorHandle hTarget); #endif // _GAMESERVER #endif // PRE_ADD_PREFIX_SYSTE_RENEW protected: typedef std::map TOGGLESKILLLIST; TOGGLESKILLLIST m_ToggleOnSkillList; //Åä±ÛOnµÈ ½ºÅ³ ¸®½ºÆ® °ü¸® void SkillToggle(DnSkillHandle hSkill, bool isOn); //½ºÅ³ Åä±Û On/Off public: TOGGLESKILLLIST& GetActiveToggleSkillList() { return m_ToggleOnSkillList; } void SummonOnOffSkillInit(DWORD dwSummonMonsterID); #if defined(PRE_FIX_62052) void ApplyGlobalSkillCoolTime(DnSkillHandle hSkill); #endif // PRE_FIX_62052 #if defined(PRE_ADD_TOTAL_LEVEL_SKILL) public: void UpdateGlobalCoolTime(float fRate); void ResetGlobalCoolTime(float fRate); #endif // PRE_ADD_TOTAL_LEVEL_SKILL };