📄 skillmanager_client.cpp
字号:
// 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 + -