#include "SunClientPrecompiledHeader.h" #include "CooltimeManager.h" #include "SkillInfoParser.h" #include "ItemInfoParser.h" #include <../ProgramCommon/CoolTimerFactory.h> #include "Hero.h" #ifdef _DEV_VER #include "GlobalFunc.h" #endif cCooltimeManager::cCooltimeManager() { } void cCooltimeManager::Initialize() { m_pSkillCoolTimeHash = new util::SolarHashTable; m_pItemCoolTimeHash = new util::SolarHashTable; } void cCooltimeManager::Release() { ReleaseSkillCooltimeTable(FALSE); ReleaseItemCooltimeTable(FALSE); delete m_pSkillCoolTimeHash; delete m_pItemCoolTimeHash; m_pSkillCoolTimeHash = NULL; m_pItemCoolTimeHash = NULL; } void cCooltimeManager::InitializeCooltimeTable() { InitializeSkillCooltimeTable( FALSE, 0 ); InitializeItemCooltimeTable( FALSE, 0 ); } void cCooltimeManager::SetSkillCoolTime( SLOTCODE SkillCode, WORD wCoolTimeMagin ) { ROOT_SKILLINFO *pRootInfo = SkillInfoParser::Instance()->GetInfo( SkillCode ); if( !pRootInfo ) { if( SkillCode ) SUNLOG( eCRITICAL_LOG, "[SetCoolTime] Skill[%d] doesn't exist \n", SkillCode ); return; } else if( pRootInfo->IsStyle() ) { return; } SkillScriptInfo* pBaseSkillInfo = SkillInfoParser::Instance()->GetSkillInfo( SkillCode ); util::Timer* pTimer = GetSkillCooltime( SkillCode ); if( pTimer ) return; pTimer = CoolTimerFactory::Instance()->Alloc(); pTimer->SetTimer( pBaseSkillInfo->m_dwCoolTime - wCoolTimeMagin ); pTimer->InitCoolTime(); m_pSkillCoolTimeHash->Add( pTimer, SkillCode ); } void cCooltimeManager::FreeSkillCoolTime( SLOTCODE SkillCode ) { util::Timer* pTimer = GetSkillCooltime( SkillCode ); if( pTimer == NULL ) return; CoolTimerFactory::Instance()->Free( pTimer ); m_pSkillCoolTimeHash->Remove( SkillCode ); } void cCooltimeManager::InitializeSkillCooltimeTable( BOOL bPoolUse, WORD wCoolTimeMagin ) { // ÄðŸÀÓ Å¸ÀÌ¸Ó ÇØ½¬ Å×ÀÌºí »ý¼º COOLTIME_MAP* pCoolTimeMap = SkillInfoParser::Instance()->GetSkillCoolTimeMap(); if( pCoolTimeMap == NULL ) { return; } m_pSkillCoolTimeHash->Initialize( (DWORD)pCoolTimeMap->size() ); // ½ºÅ³º°·Î ŸÀ̸Ӹ¦ »ý¼ºÇÑ ÈÄ ÇØ½¬Å×ÀÌºí¿¡ Ãß°¡ÇÑ´Ù. COOLTIME_ITER it; for( it = pCoolTimeMap->begin(); it != pCoolTimeMap->end(); ++it ) { SKILL_COOLTIME_INFO CoolTimeInfo = (SKILL_COOLTIME_INFO)it->second; util::Timer * pTimer = NULL; if( bPoolUse ) { pTimer = CoolTimerFactory::Instance()->Alloc(); } else { pTimer = new util::Timer; } pTimer->SetTimer( CoolTimeInfo.m_dwCoolTime - wCoolTimeMagin ); pTimer->InitCoolTime(); m_pSkillCoolTimeHash->Add( pTimer, CoolTimeInfo.m_SkillCode ); } } void cCooltimeManager::ReleaseSkillCooltimeTable(BOOL pool_used) { // CoolTime Timer »èÁ¦ if (m_pSkillCoolTimeHash) { CoolTimerFactory* timer_factory = CoolTimerFactory::Instance(); m_pSkillCoolTimeHash->SetFirst(); while (util::Timer* timer = m_pSkillCoolTimeHash->GetNext()) { if (pool_used) { timer_factory->Free(timer); } else { SAFE_DELETE(timer); } } m_pSkillCoolTimeHash->RemoveAll(); } } void cCooltimeManager::ResetSkillCooltime( SLOTCODE SkillCode ) { if( util::Timer* pTimer = xGetCooltimeManager()->GetSkillCooltime( SkillCode ) ) { pTimer->InitCoolTime(clock_function::GetTickCount()); } } void cCooltimeManager::ResetSkillCooltime() { if (m_pSkillCoolTimeHash) { m_pSkillCoolTimeHash->SetFirst(); while (util::Timer* timer = m_pSkillCoolTimeHash->GetNext()) { timer->InitCoolTime(); } }; } void cCooltimeManager::InitializeItemCooltimeTable( BOOL bPoolUse, DWORD dwCoolTimeMagin ) { // ÄðŸÀÓ Å¸ÀÌ¸Ó ÇØ½¬ Å×ÀÌºí »ý¼º ITEM_COOLTIME_MAP* pCoolTimeMap = ItemInfoParser::Instance()->GetItemCoolTimeMap(); if( pCoolTimeMap == NULL ) { return; } m_pItemCoolTimeHash->Initialize( (DWORD)pCoolTimeMap->size() ); // ½ºÅ³º°·Î ŸÀ̸Ӹ¦ »ý¼ºÇÑ ÈÄ ÇØ½¬Å×ÀÌºí¿¡ Ãß°¡ÇÑ´Ù. ITEM_COOLTIME_ITER it; for( it = pCoolTimeMap->begin(); it != pCoolTimeMap->end(); ++it ) { ITEM_COOLTIME_INFO CoolTimeInfo = (ITEM_COOLTIME_INFO)it->second; util::Timer * pTimer = NULL; if( bPoolUse ) { pTimer = CoolTimerFactory::Instance()->Alloc(); } else { pTimer = new util::Timer; } pTimer->SetTimer( CoolTimeInfo.m_dwCoolTime - dwCoolTimeMagin ); pTimer->InitCoolTime(); m_pItemCoolTimeHash->Add( pTimer, CoolTimeInfo.m_wCoolTimeType ); } } void cCooltimeManager::ReleaseItemCooltimeTable(BOOL pool_used) { if (m_pItemCoolTimeHash) { CoolTimerFactory* timer_factory = CoolTimerFactory::Instance(); m_pItemCoolTimeHash->SetFirst(); while (util::Timer* timer = m_pItemCoolTimeHash->GetNext()) { if (pool_used) { timer_factory->Free(timer); } else { SAFE_DELETE(timer); } } m_pItemCoolTimeHash->RemoveAll(); } } void cCooltimeManager::ResetItemCooltime() { if (m_pItemCoolTimeHash) { m_pItemCoolTimeHash->SetFirst(); while (util::Timer* timer = m_pItemCoolTimeHash->GetNext()) { timer->InitCoolTime(); } } } void cCooltimeManager::RestoreSkillCooltime(SkillCoolTime& skill_cool_time) { ResetSkillCooltime(); for (int i = 0; i < skill_cool_time.count; ++i) { if( util::Timer* cool_time = GetSkillCooltime(skill_cool_time.info[i].skill_code) ) { cool_time->InitCoolTime(clock_function::GetTickCount() + skill_cool_time.info[i].remain_second); } } } void cCooltimeManager::StartSkillCooltime( SLOTCODE SkillCode, int CooltimeBonus, int CooltimeBonusRatio ) { #ifdef _DEV_VER if( CGeneralGameParam::Instance()->IsEnableAutoCooltimeReset() == true ) { GlobalFunc::SendGMCommand("ÄðŸÀÓ"); return; } #endif #ifdef _NA_000000_20130812_NEW_CHARACTER_HELLROID if( SkillScriptInfo* pSkillInfo = SkillInfoParser::Instance()->GetSkillInfo(SkillCode) ) { #ifdef _NA_008252_20150427_AURASKILL_PACKET_PENDING // Åä±Û ½ºÅ³ ÆÐÅ¶Ææµù if (pSkillInfo->IsToggleEffectSkill() == true || pSkillInfo->IsToggleSkill() == true || pSkillInfo->IsAuraSkill() == true) { g_pHero->ToggleSkill::UnsetPacketPending(); } #endif //_NA_008252_20150427_AURASKILL_PACKET_PENDING // Åä±Û ½ºÅ³Àº ÄðŸÀÓÀ» °øÀ¯ÇÏÁö ¾Ê´Â´Ù. if( pSkillInfo->IsAuraSkill() == true ) { std::vector Array; #ifdef _NA_007514_20140828_NEW_CHARACTER_WITCHBLADE g_pHero->GetToggleSkillCodeArray(Array); #else g_pHero->GetAuraSkillCodeArray(Array); #endif // _NA_007514_20140828_NEW_CHARACTER_WITCHBLADE for( size_t i=0;i!=Array.size();++i) { if( util::Timer* pTimer = GetSkillCooltime(Array[i]) ) { int iSkillCoolTime = pTimer->GetBaseIntervalTime(); if( iSkillCoolTime > 0 ) { int iBonusCoolTime = CooltimeBonus; float fBonusCoolTimeRatio = CooltimeBonusRatio / 100.f; fBonusCoolTimeRatio = max( -1.0f, fBonusCoolTimeRatio ); iSkillCoolTime = iSkillCoolTime + iBonusCoolTime; iSkillCoolTime = max( 0, iSkillCoolTime ); iSkillCoolTime = (int)( iSkillCoolTime * ( 1 + fBonusCoolTimeRatio ) ); int iBonusTime = iSkillCoolTime - pTimer->GetBaseIntervalTime(); pTimer->SetBonusIntervalTime( iBonusTime ); } pTimer->Reset(); } } return; } } #endif //_NA_000000_20130812_NEW_CHARACTER_HELLROID if( util::Timer* pTimer = GetSkillCooltime(SkillCode) ) { int iSkillCoolTime = pTimer->GetBaseIntervalTime(); if( iSkillCoolTime > 0 ) { int iBonusCoolTime = CooltimeBonus; float fBonusCoolTimeRatio = CooltimeBonusRatio / 100.f; fBonusCoolTimeRatio = max( -1.0f, fBonusCoolTimeRatio ); iSkillCoolTime = iSkillCoolTime + iBonusCoolTime; iSkillCoolTime = max( 0, iSkillCoolTime ); iSkillCoolTime = (int)( iSkillCoolTime * ( 1 + fBonusCoolTimeRatio ) ); int iBonusTime = iSkillCoolTime - pTimer->GetBaseIntervalTime(); pTimer->SetBonusIntervalTime( iBonusTime ); } pTimer->Reset(); } } #ifdef _NA_007330_20140620_GUILD_SYSTEM_EXTENSION void cCooltimeManager::StartItemCooltime( WORD wType, int CooltimeBonus, int CooltimeBonusRatio ) { #ifdef _DEV_VER if( CGeneralGameParam::Instance()->IsEnableAutoCooltimeReset() == true ) { GlobalFunc::SendGMCommand("ÄðŸÀÓ"); return; } #endif if( util::Timer* pTimer = GetItemCooltime(wType) ) { int iItemCoolTime = pTimer->GetBaseIntervalTime(); if( iItemCoolTime > 0 ) { int iBonusCoolTime = CooltimeBonus; float fBonusCoolTimeRatio = CooltimeBonusRatio / 100.f; fBonusCoolTimeRatio = max( -1.0f, fBonusCoolTimeRatio ); iItemCoolTime = iItemCoolTime + iBonusCoolTime; iItemCoolTime = max( 0, iItemCoolTime ); iItemCoolTime = (int)( iItemCoolTime * ( 1 + fBonusCoolTimeRatio ) ); int iBonusTime = iItemCoolTime - pTimer->GetBaseIntervalTime(); pTimer->SetBonusIntervalTime( iBonusTime ); } pTimer->Reset(); } } #endif // _NA_007330_20140620_GUILD_SYSTEM_EXTENSION