⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 abilitymanager.cpp

📁 墨香最新私服
💻 CPP
字号:
// AbilityManager.cpp: implementation of the CAbilityManager class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "AbilityManager.h"
#include "MHFile.h"
#include "AbilityGroup.h"
#include "AbilityUpdater.h"
#include "Player.h"
#ifdef _MHCLIENT_
#include "ChatManager.h"
#else
#include "MapDBMsgParser.h"
#endif

GLOBALTON(CAbilityManager);

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CAbilityManager::CAbilityManager()
{
	m_InfoTable.Initialize(8);
	m_pPool = new CMemoryPoolTempl<CAbility>;
#ifdef _MHCLIENT_
	m_pPool->Init(50,10,"ABILITY");
#else
	m_pPool->Init(1000,100,"ABILITY");
#endif
}

CAbilityManager::~CAbilityManager()
{
	delete m_pPool;
	Release();
}

void CAbilityManager::Init()
{
	CMHFile file;
#ifdef _FILE_BIN_
	if(!file.Init("./Resource/AbilityBaseInfo.bin", "rb"))
		return;
#else
	if(!file.Init("./Resource/AbilityBaseInfo.txt", "rt"))
		return;
#endif

	while(1)
	{
		if(file.IsEOF())
			break;

		CAbilityInfo* pInfo = new CAbilityInfo(&file);
		m_InfoTable.Add(pInfo,pInfo->GetIdx());
	}

	file.Release();
}
void CAbilityManager::Release()
{
	CAbilityInfo* pInfo;
	m_InfoTable.SetPositionHead();
	while(pInfo = m_InfoTable.GetData())
	{
		delete pInfo;
	}
	m_InfoTable.RemoveAll();

	//Singleton栏肺 父惦 皋葛府 秦力 鞘夸绝澜
	//PTRLISTSEARCHSTART(m_UpdaterList,CAbilityUpdater*,pUpdater)
	//	delete pUpdater;
	//PTRLISTSEARCHEND

	m_UpdaterList.RemoveAll();
}

void CAbilityManager::AddUpdater(CAbilityUpdater* pUpdater)
{
	m_UpdaterList.AddTail(pUpdater);
}

void CAbilityManager::InitAbility(CPlayer* pObject,ABILITY_TOTALINFO* pTotalInfo,CAbilityGroup* pAbilityGroup)
{
	pAbilityGroup->Init(pTotalInfo);
	
	// update
	UpdateAbilityState(ABILITYUPDATE_ABILITYINITED,0,pAbilityGroup);
}

void CAbilityManager::InitAbilityExp(CAbilityGroup* pAbilityGroup,DWORD AbilityExp)
{
	pAbilityGroup->SetAbilityExp(AbilityExp);
}

CAbilityInfo* CAbilityManager::GetAbilityInfo(WORD AbilityIndex)
{
	CAbilityInfo* pInfo = m_InfoTable.GetData(AbilityIndex);
//	ASSERT(pInfo);
	return pInfo;	
}

int CAbilityManager::GetState(CAbilityGroup* pGroup,CAbilityInfo* pAbilityInfo)
{
	if(pGroup->GetAbility(pAbilityInfo->GetIdx()) != NULL)
		return eAIS_Usable;
	
	// 焊捞绰瘤 八荤
	if( pAbilityInfo->GetInfo()->Ability_AcquireKind == eAAK_CharacterLevel )
	{
		ASSERT(pGroup->GetOwenerObject()->GetObjectKind() & eObjectKind_Player);
		LEVELTYPE level = ((CPlayer*)pGroup->GetOwenerObject())->GetLevel();
		LEVELTYPE needlevel = pAbilityInfo->GetInfo()->Ability_AcquireParam1;
		if( level >= needlevel )
			return eAIS_OnlyVisible;
	}

	return eAIS_NotAvailable;
}

void CAbilityManager::UpdateAbilityState(DWORD Flag,DWORD Param,CAbilityGroup* pAbilityGroup)
{
	PTRLISTSEARCHSTART(m_UpdaterList,CAbilityUpdater*,pUpdater)
		pUpdater->Update(Flag,Param,pAbilityGroup,&m_InfoTable);
	PTRLISTSEARCHEND

}

void CAbilityManager::GetAbilityTotalInfo(CAbilityGroup* pGroup,ABILITY_TOTALINFO* pOutAbilityTotalInfo)
{
	CAbility* pAbility;
	for(int n=0;n<eAGK_Max;++n)
	{
		memset(pOutAbilityTotalInfo->AbilityDataArray[n],ABILITYLEVEL_DB_KEY,MAX_ABILITY_NUM_PER_GROUP);
		pOutAbilityTotalInfo->AbilityDataArray[n][MAX_ABILITY_NUM_PER_GROUP] = 0;

		memset(pOutAbilityTotalInfo->AbilityQuickPositionArray[n],ABILITYQUICKPOSITION_NULL,MAX_ABILITY_NUM_PER_GROUP);
		pOutAbilityTotalInfo->AbilityQuickPositionArray[n][MAX_ABILITY_NUM_PER_GROUP] = 0;
	}
	//"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
	
	// to each Ability

	// make Array like.. "DDAAAABAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAA"
	BYTE Kind,Position;
	pGroup->SetPositionHead();
	while(pAbility = pGroup->GetNextAbility(eAGK_Max))
	{
		GetKindPosition_WithAbilityIndex(pAbility->GetIndex(),&Kind,&Position);
		pOutAbilityTotalInfo->AbilityDataArray[Kind][Position] += pAbility->GetLevel();

		if(pAbility->GetQuickPosition())
		{
			pOutAbilityTotalInfo->AbilityQuickPositionArray[Kind][Position] = 
				ABILITYQUICKPOSITION_KEY + pAbility->GetQuickPosition() - TP_QUICK_START;
		}
	}
}

BOOL CAbilityManager::UpgradeAbility(WORD AbilityIndex, CAbilityGroup* pAbilityGroup)
{
	CAbilityInfo* pAbilInfo = GetAbilityInfo(AbilityIndex);
	if(pAbilInfo == NULL)
		return FALSE;
	if(!CanUpgrade(pAbilInfo, pAbilityGroup))
		return FALSE;
	
	//劳洒妨绰 绢呼 饭骇
	BYTE AbilityLevel = 0;
	CAbility* pAbility = pAbilityGroup->GetAbility(AbilityIndex);
	if(pAbility)
		AbilityLevel = pAbility->GetLevel();

	DWORD NeedAbilityExp = pAbilInfo->GetAbilityGradeExp(AbilityLevel+1);
	DWORD FromAbilityExp = pAbilityGroup->GetAbilityExp();
	DWORD ToAbilityExp = FromAbilityExp - NeedAbilityExp;

#ifdef _MAPSERVER_
	if(FromAbilityExp < NeedAbilityExp || ( ToAbilityExp > 1000000 && pAbilityGroup->GetOwenerObject()->GetUserLevel() > eUSERLEVEL_GM ) )
	{
		AbilityLevelupLog(pAbilityGroup->GetOwenerObject(),
			AbilityIndex,(pAbility ? pAbility->GetLevel() : 0) +100,
			FromAbilityExp,ToAbilityExp);

		return FALSE;
	}
#endif
	
	pAbilityGroup->SetAbilityExp(ToAbilityExp);

	BYTE AbilLevel = 0;
	if(pAbility == NULL)
	{
		pAbilityGroup->AddAbility(pAbilInfo,1,0);
		AbilLevel = 1;
	}
	else
	{		
		pAbility->IncreaseLevel();
		AbilLevel = pAbility->GetLevel();
	}

	// update
	UpdateAbilityState(ABILITYUPDATE_ABILITYLEVEL_CHANGED,0,pAbilityGroup);
	
#ifdef _MAPSERVER_
	CharacterHeroInfoUpdate(pAbilityGroup->GetOwenerObject());
	AbilityLevelupLog(pAbilityGroup->GetOwenerObject(),
					AbilityIndex,AbilLevel,
					FromAbilityExp,ToAbilityExp);
#endif
	
	return TRUE;
}

BOOL CAbilityManager::SetAbilityQuickPosition(WORD AbilityIndex, POSTYPE QuickPosition,CAbilityGroup* pAbilityGroup)
{
	CAbility* pAbility = pAbilityGroup->GetAbility(AbilityIndex);
	if(pAbility == NULL)
		return FALSE;

	pAbility->SetQuickPosition(QuickPosition);

	// update
	UpdateAbilityState(ABILITYUPDATE_ABILITYQUICK_CHANGED,0,pAbilityGroup);
	
	return TRUE;
}

BOOL CAbilityManager::CanUpgrade(CAbilityInfo* pAbilInfo, CAbilityGroup* pAbilityGroup)
{
	//劳洒妨绰 绢呼 饭骇
	BYTE AbilityLevel = 0;
	CAbility* pAbility = pAbilityGroup->GetAbility(pAbilInfo->GetIdx());
	if(pAbility)
		AbilityLevel = pAbility->GetLevel();

	DWORD NeedAbilityExp = pAbilInfo->GetAbilityGradeExp(AbilityLevel+1);
	DWORD CurAbilityExp = pAbilityGroup->GetAbilityExp();
	if(NeedAbilityExp > CurAbilityExp)
	{
#ifdef _MHCLIENT_
		if( NeedAbilityExp != (DWORD)(-1) )
			CHATMGR->AddMsg( CTC_SYSMSG, CHATMGR->GetChatMsg(624) );
#endif
		return FALSE;
	}
	
	return TRUE;
}

BOOL CAbilityManager::CheckAbilityLevel(WORD AbilityIndex,CAbilityGroup* pAbilityGroup,BYTE Level)
{
	BYTE AbilityLevel = 0;
	CAbility* pAbility = pAbilityGroup->GetAbility(AbilityIndex);
	if(pAbility)
		AbilityLevel = pAbility->GetLevel();

	return AbilityLevel >= Level;
}
BYTE CAbilityManager::GetAbilityLevel(WORD AbilityIndex,CAbilityGroup* pAbilityGroup)
{
	BYTE AbilityLevel = 0;
	CAbility* pAbility = pAbilityGroup->GetAbility(AbilityIndex);
	if(pAbility)
		AbilityLevel = pAbility->GetLevel();

	return AbilityLevel;
}
CAbility* CAbilityManager::MakeNewAbility()
{
	return m_pPool->Alloc();
}
void CAbilityManager::ReleaseAbility(CAbility* pAbility)
{
	m_pPool->Free(pAbility);
}







void CAbilityManager::__TranData()
{
	CMHFile file;
	file.Init("src.txt","r");
	FILE* fpout = fopen("out.txt","w");
	ABILITY_TOTALINFO abiltotalinfo;

	char name[20];
	while(1)
	{
		if(file.IsEOF() != FALSE)
			break;

		DWORD PlayerID = file.GetDword();
		file.GetString(name);
		file.GetString(abiltotalinfo.AbilityDataArray[0]);
		file.GetString(abiltotalinfo.AbilityDataArray[1]);
		file.GetString(abiltotalinfo.AbilityDataArray[2]);
		file.GetString(abiltotalinfo.AbilityDataArray[3]);

		CAbilityGroup group;
		group.Init(&abiltotalinfo);
		group.SetPositionHead();
		while(CAbility* pAbility = group.GetNextAbility(eAGK_Max))
		{
			CAbilityInfo* pInfo = pAbility->GetAbilityInfo();
			fprintf(fpout,"%d\t%s\t%d\t%s\n",PlayerID,name,pInfo->GetIdx(),pInfo->GetInfo()->Ability_name);
		}

		group.Release();
	}

	fclose(fpout);
	file.Release();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -