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

📄 skillmanager_client.cpp

📁 墨香最新私服
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// SkillManager.cpp: implementation of the CSkillManager class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"

#ifdef _MHCLIENT_

#include "SkillManager_client.h"
#include "ActionTarget.h"

#include "Hero.h"
#include "MoveManager.h"
#include "QuickManager.h"
#include "Gamein.h"
#include "QuickItem.h"
#include "ObjectStateManager.h"
#include "ObjectManager.h"
#include "TacticManager.h"

#include "ChatManager.h"
#include "ExchangeManager.h"

#include "GameResourceManager.h"
#include "QuickDialog.h"

#include "PKManager.h"
#include "ObjectActionManager.h"
#include "BattleSystem_Client.h"

#include "PeaceWarModeManager.h"

#include "MAINGAME.h"


//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
GLOBALTON(CSkillManager);
CSkillManager::CSkillManager()
{
	g_PoolSTLIST.Init(100,50,"g_PoolSTLIST");
}

CSkillManager::~CSkillManager()
{
	Release();
	g_PoolSTLIST.Release();
}

void CSkillManager::Init()
{
	m_SkillInfoTable.Initialize(64);
	m_DummySkillInfoTable.Initialize(64);
	m_SkillObjectTable.Initialize(64);
	LoadSkillInfoList();

	m_SkillAreaMgr.LoadSkillAreaList();
}
void CSkillManager::Release()
{
	void* p;

	m_SkillInfoTable.SetPositionHead();
	while(p = m_SkillInfoTable.GetData())
	{
		delete p;
	}
	m_SkillInfoTable.RemoveAll();
	
	m_DummySkillInfoTable.SetPositionHead();
	while(p = m_DummySkillInfoTable.GetData())
	{
		delete p;
	}
	m_DummySkillInfoTable.RemoveAll();
	
	m_SkillObjectTable.SetPositionHead();
	while(p = m_SkillObjectTable.GetData())
	{
		OBJECTMGR->AddGarbageObject((CObject*)p);
		delete p;
	}
	m_SkillObjectTable.RemoveAll();

	m_SkillAreaMgr.Release();
}

void CSkillManager::LoadSkillInfoList()
{
	CMHFile file;
#ifdef _FILE_BIN_
	file.Init("Resource/SkillList.bin","rb");
#else
	file.Init("Resource/SkillList.txt","rt");
#endif
	if(file.IsInited() == FALSE)
	{
		//ASSERTMSG(0,"SkillList甫 肺靛窍瘤 给沁嚼聪促.");
		return;
	}

	while(1)
	{
		if(file.IsEOF() != FALSE)
			break;

		CSkillInfo* pInfo = new CSkillInfo;
		CSkillInfo* pDummyInfo = new CSkillInfo;
		pInfo->InitSkillInfo(&file);
		pDummyInfo->InitDummySkillInfo(pInfo);

		ASSERT(m_SkillInfoTable.GetData(pInfo->GetSkillIndex()) == NULL);
		m_SkillInfoTable.Add(pInfo,pInfo->GetSkillIndex());
		m_DummySkillInfoTable.Add(pDummyInfo,pInfo->GetSkillIndex());
	}
	
	file.Release();
}

CSkillInfo*	CSkillManager::GetSkillInfo(WORD SkillInfoIdx)
{
	return (CSkillInfo*)m_SkillInfoTable.GetData(SkillInfoIdx);
}
CSkillInfo*	CSkillManager::GetDummySkillInfo(WORD SkillInfoIdx)
{
	return (CSkillInfo*)m_DummySkillInfoTable.GetData(SkillInfoIdx);
}

WORD CSkillManager::GetSkillTooltipInfo(WORD SkillInfoIdx)
{
	SKILLINFO* skInfo = ((CSkillInfo*)m_SkillInfoTable.GetData(SkillInfoIdx))->GetSkillInfo();
	if(!skInfo)
		return 0;
	return skInfo->SkillTooltipIdx;
}
CSkillObject* CSkillManager::GetSkillObject(DWORD SkillObjectID)
{
	return (CSkillObject*)m_SkillObjectTable.GetData(SkillObjectID);
}
WORD CSkillManager::GetComboSkillIdx(CHero* pHero)
{
	WORD SkillNum = 0;
	int WeaponEquipType = pHero->GetWeaponEquipType();
	int CurComboNum = pHero->GetCurComboNum();
	if( CurComboNum == SKILL_COMBO_NUM || 
		CurComboNum == MAX_COMBO_NUM )
		CurComboNum = 0;

	// 泅犁 霓焊+1 锅狼 霓焊狼 绢琶锅龋甫 掘绢客具 窍瘤父
	// SkillNum = COMBO_???_MIN + 霓焊锅龋 - 1 = COMBO_???_MIN + CurComboNum +1 -1
	// so... COMBO_???_MIN + CurComboNum 捞促.
	switch(WeaponEquipType)
	{
	case WP_GUM:
		SkillNum = COMBO_GUM_MIN + CurComboNum;
		break;
	case WP_GWUN:
		SkillNum = COMBO_GWUN_MIN + CurComboNum;
		break;
	case WP_DO:
		SkillNum = COMBO_DO_MIN + CurComboNum;
		break;
	case WP_CHANG:
		SkillNum = COMBO_CHANG_MIN + CurComboNum;
		break;
	case WP_GUNG:
		SkillNum = COMBO_GUNG_MIN + CurComboNum;
		break;
	case WP_AMGI:
		SkillNum = COMBO_AMGI_MIN + CurComboNum;
		break;
	}
	return SkillNum;
}
WORD CSkillManager::GetMugongSkillIdx(CHero* pHero)
{	
	WORD SkillNum = 0;
#ifdef _TESTCLIENT_
	SkillNum = GAMERESRCMNGR->m_TestClientInfo.MugongIdx;
#else
	int abspos = QUICKMGR->GetSelectedQuickAbsPos();
	CQuickItem* pQuickItem;
	pQuickItem = GAMEIN->GetQuickDialog()->GetQuickItem(abspos);
	if(pQuickItem == NULL)
		return FALSE;
	SkillNum = pQuickItem->GetSrcIdx();
#endif
	return SkillNum;
}

// 胶懦阑 荤侩
BOOL CSkillManager::ExcuteSkillSYN(CHero* pHero,CActionTarget* pTarget,BOOL bMugong)
{
	WORD SkillNum;
	if(bMugong == FALSE)
		SkillNum = GetComboSkillIdx(pHero);
	else
		SkillNum = GetMugongSkillIdx(pHero);

	CSkillInfo* pSkillInfo = GetSkillInfo(SkillNum);
	//ASSERT(pSkillInfo);
	if(pSkillInfo == NULL)
		return FALSE;

	return ExcuteSkillSYN(pHero,pTarget,pSkillInfo);
}
BOOL CSkillManager::ExcuteSkillSYN(CHero* pHero,CActionTarget* pTarget,CSkillInfo* pSkillInfo)
{
	CActionTarget target;
	target.CopyFrom(pTarget);

	//ASSERT(pSkillInfo);
	if(pSkillInfo == NULL)
		return FALSE;
	
	// 柳过 荤侩捞搁 柳过 皋聪廉 率栏肺 倒赴促.
	if(pSkillInfo->GetSkillKind() == SKILLKIND_JINBUB)
	{
		// 柳过Start锅龋客 柳过Skill锅龋绰 鞍促.
		TACTICMGR->HeroTacticStart(pSkillInfo->GetSkillIndex());
		return FALSE;
	}
	
	int SkillLevel = pHero->GetMugongLevel(pSkillInfo->GetSkillIndex());

	if(pSkillInfo->IsExcutableSkillState(pHero,SkillLevel) == FALSE)
	{
		pHero->SetCurComboNum(0);
		//"傍拜给秦!"
		return FALSE;
	}
	if(pSkillInfo->ComboTest(pHero) == FALSE)
	{
		return FALSE;
	}
	
	if(pSkillInfo->ConvertTargetToSkill(pHero,&target) == FALSE)
	{
		return FALSE;
	}

	if(pSkillInfo->IsValidTarget(pHero, &target) == FALSE)
		return FALSE;

//KES 040308

	if(PEACEWARMGR->IsPeaceMode(pHero) == TRUE)		//KES颗辫
		PEACEWARMGR->ToggleHeroPeace_WarMode();
	
//
	VECTOR3* pTargetPos = target.GetTargetPosition();
	if(pTargetPos == NULL)
		return FALSE;
	
	if(pSkillInfo->IsInSkillRange(pHero,&target) == TRUE)
	{	// 己傍		
		MOVEMGR->HeroMoveStop();
		MOVEMGR->SetLookatPos(pHero,pTargetPos,0,gCurTime);
		
		pHero->SetMovingAction(NULL);
		
		if( pSkillInfo->GetSkillInfo()->EffectStart != 0 &&
			pSkillInfo->GetSkillInfo()->EffectStartTime != 0)	// 矫傈楷免捞 乐阑 版快
		{
			return HeroSkillStartEffect(pHero,&target,pSkillInfo);
		}
		else
		{
			return RealExcuteSkillSYN(pHero,&target,pSkillInfo);
		}
	}
	else
	{	// 角菩
		pHero->SetCurComboNum(0);
		CAction MoveAction;
		if(pSkillInfo->IsMugong() == FALSE)
		{
			pSkillInfo = GetSkillInfo(GetComboSkillIdx(pHero));
		}
		MoveAction.InitSkillAction(pSkillInfo,&target);
		MOVEMGR->SetHeroActionMove(&target,&MoveAction);
		return FALSE;
	}
	

	return TRUE;
}

BOOL CSkillManager::ExcuteTacticSkillSYN(CHero* pHero,TACTIC_TOTALINFO* pTInfo,BYTE OperNum)
{
	CActionTarget target;
	target.InitActionTarget(&pTInfo->Pos,NULL);

	CSkillInfo* pSkillInfo = GetSkillInfo(pTInfo->TacticId);
	//ASSERT(pSkillInfo);
	if(pSkillInfo == NULL)
		return FALSE;

	return RealExcuteSkillSYN(pHero,&target,pSkillInfo);
}

void CSkillManager::GetMultiTargetList(CSkillInfo* pSkillInfo,CHero* pHero,CActionTarget* pTarget)
{
	WORD Radius = pSkillInfo->GetSkillInfo()->TargetRange;
	WORD AreaNum = pSkillInfo->GetSkillInfo()->TargetAreaIdx;
	if(AreaNum != 0)
	{
		CSkillArea* pSkillArea = GetSkillArea(pHero,pTarget,pSkillInfo);	// Area狼 吝缴谅钎鳖瘤 悸泼登绢廉 柯促.
		pTarget->SetTargetObjectsInArea(pHero,pSkillArea);
	}
	else if(Radius != 0)
	{
		pTarget->SetTargetObjectsInRange(pSkillInfo->GetTargetAreaPivotPos(&pHero->GetCurPosition(),pTarget->GetTargetPosition()),Radius);
	}
}

BOOL CSkillManager::RealExcuteSkillSYN(CHero* pHero,CActionTarget* pTarget,CSkillInfo* pSkillInfo)
{
	CSkillInfo* pDummyInfo = GetDummySkillInfo(pSkillInfo->GetSkillIndex());
	if(pDummyInfo->CheckOriginal(pSkillInfo) == FALSE)
	{
		MSGBASE msg;
		SetProtocol(&msg,MP_USERCONN,MP_USERCONN_CHEAT_USING);
		msg.dwObjectID = HEROID;
		NETWORK->Send(&msg,sizeof(msg));

		MAINGAME->SetGameState(eGAMESTATE_END);
		
		return FALSE;
	}

	// 柳过矫 郴仿何练
	if(pHero->GetNaeRyuk() < pSkillInfo->GetNeedNaeRyuk(1))
	{
		CHATMGR->AddMsg( CTC_SYSMSG, CHATMGR->GetChatMsg(401) );		
		return FALSE;
	}

	//傍拜窍搁 pk瘤加矫埃阑 楷厘茄促.
	if( HERO->IsPKMode() )
	{
		CObject* pObject = OBJECTMGR->GetObject(pTarget->GetTargetID());
		if( pObject )
		if( pObject->GetObjectKind() == eObjectKind_Player )
		{
			PKMGR->SetPKStartTimeReset();
		}
	}

	HERO->SetNextAction(NULL);

	if(pSkillInfo->IsMultipleTargetSkill() == TRUE)
	{
		pTarget->ConvertMainTargetToPosition(pHero,pSkillInfo->GetSkillRange());
		GetMultiTargetList(pSkillInfo,pHero,pTarget);
	}

	CSkillObject* pSObj = CreateTempSkillObject(pSkillInfo,pHero,pTarget);
	if(pSObj == NULL)
		return FALSE;
	
	pSkillInfo->SendMsgToServer(pHero,pTarget);
	
	pHero->SetSkillCoolTime(pSkillInfo->GetSkillInfo()->DelayTime);
	pHero->GetDelayGroup()->AddDelay(
		CDelayGroup::eDK_Skill,pSkillInfo->GetSkillIndex(),
		pSkillInfo->GetSkillInfo()->DelayTime);

	pHero->SetCurComboNum(pSkillInfo->GetSkillInfo()->ComboNum);

	

#ifdef _TESTCLIENT_
	static IDDDD = 0;
	MSG_SKILLOBJECT_ADD msg;
	SKILLOBJECT_INFO info;
	memcpy(&info,pSObj->GetSkillObjectInfo(),sizeof(SKILLOBJECT_INFO));
	info.SkillObjectIdx = SKILLOBJECT_ID_START+IDDDD++;
	info.StartTime = gCurTime;
	info.SkillLevel = 5;
	msg.InitMsg(&info,TRUE);
	CTargetListIterator iter(&msg.TargetList);
	pTarget->SetPositionFirstTargetObject();
	CBattle* pBattle = BATTLESYSTEM->GetBattle(HERO);
	while(CObject* pObject = pTarget->GetNextTargetObject())
	{
		RESULTINFO dinfo;
		dinfo.Clear();
		if(pBattle->IsEnemy(pHero,pObject) == TRUE)
		{
			dinfo.bCritical = 1;//rand()%5 ? FALSE : TRUE;
			dinfo.RealDamage = rand() % 50;
			dinfo.ShieldDamage = rand() % 30;
			dinfo.CounterDamage = 0;
			dinfo.StunTime = 1000;//(rand() % 30 == 0) ? 2000 : 0;
			iter.AddTargetWithResultInfo(pObject->GetID(),SKILLRESULTKIND_NEGATIVE,&dinfo);
		}
		else
		{
			iter.AddTargetWithResultInfo(pObject->GetID(),SKILLRESULTKIND_POSITIVE,&dinfo);
		}

		
	}

	iter.Release();

	NetworkMsgParse(MP_SKILL_SKILLOBJECT_ADD,&msg);
#endif

	return TRUE;
}

// 促澜 霓焊 胶懦阑 瘤沥
void CSkillManager::SetNextComboSkill(CHero* pHero,CActionTarget* pTarget,BOOL bMugong)
{
	CSkillInfo* pNextSkill;
	WORD NextSkillIdx;
	if(bMugong)
		NextSkillIdx = GetMugongSkillIdx(pHero);
	else
		NextSkillIdx = GetComboSkillIdx(pHero);
	pNextSkill = GetSkillInfo(NextSkillIdx);
	if(pNextSkill == NULL)
		return;
	CAction act;
	act.InitSkillAction(pNextSkill,pTarget);
	pHero->SetNextAction(&act);
}

⌨️ 快捷键说明

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