📄 skillmanager_client.cpp
字号:
// 捞亥飘 勤甸 窃荐甸
BOOL CSkillManager::OnSkillCommand(CHero* pHero,CActionTarget* pTarget,BOOL bMugong)
{
//////////////////////////////////////////////////////////////////////////
// 磷篮 荤恩篮 傍拜且荐 绝澜
if(pTarget->GetTargetID() != 0)
{
CObject* pTObj = OBJECTMGR->GetObject(pTarget->GetTargetID());
if(pTObj == NULL)
return FALSE;
if(pTObj->IsDied() == TRUE)
return FALSE;
}
//////////////////////////////////////////////////////////////////////////
if( pHero->GetState() == eObjectState_SkillSyn ||
pHero->GetState() == eObjectState_SkillUsing)
SetNextComboSkill(pHero,pTarget,bMugong);
else
ExcuteSkillSYN(pHero,pTarget,bMugong); //return FALSE 贸府....绝促.. 宝满阑鳖?
return TRUE;
}
DWORD GetComboDelayTime(WORD WeaponKind)
{
DWORD time = 0;
ySWITCH(WeaponKind)
yCASE(WP_GUM) time = 120;
yCASE(WP_GWUN) time = 150;
yCASE(WP_DO) time = 150;
yCASE(WP_CHANG) time = 150;
yCASE(WP_GUNG) time = 50;
yCASE(WP_AMGI) time = 80;
yENDSWITCH
return time;
}
void CSkillManager::OnComboTurningPoint(CHero* pHero)
{
if(pHero->GetNextAction()->HasAction())
{
if(pHero->GetNextAction()->GetActionKind() != eActionKind_Skill)
pHero->SetCurComboNum(0);
pHero->GetNextAction()->ExcuteAction(pHero);
pHero->GetNextAction()->Clear();
}
else
{
if(pHero->IsAutoAttacking())
{
if(pHero->GetCurComboNum() < 2) // 磊悼傍拜篮 霓焊 2鳖瘤父 12/3老 雀狼 搬苞 3俊辑 2肺 官柴
{
if(SKILLMGR->OnSkillCommand(pHero,pHero->GetAutoAttackTarget(),FALSE) == FALSE)
pHero->DisableAutoAttack();
}
else
{
OBJECTSTATEMGR->StartObjectState(pHero,eObjectState_SkillDelay);
OBJECTSTATEMGR->EndObjectState(pHero,eObjectState_SkillDelay,GetComboDelayTime(pHero->GetWeaponEquipType()));
pHero->SetCurComboNum(0);
}
}
}
}
void CSkillManager::OnExcuteSkillNACKed(SKILLOBJECT_INFO* pInfo)
{
//ASSERT(0);
}
// SkillObject 殿废 棺 秦力
void CSkillManager::DoCreateSkillObject(CSkillObject* pSObj,SKILLOBJECT_INFO* pSOInfo,CTargetList* pTList)
{
pSObj->Init(pSOInfo,pTList);
CSkillObject* pPreObj = m_SkillObjectTable.GetData(pSObj->GetID());
//ASSERT(pPreObj == NULL);
if(pPreObj != NULL)
{
ReleaseSkillObject(pPreObj);
}
m_SkillObjectTable.Add(pSObj,pSObj->GetID());
OBJECTMGR->AddSkillObject(pSObj);
}
CSkillObject* CSkillManager::CreateSkillObject(MSG_SKILLOBJECT_ADD* pSkillObjectAddInfo)
{
CObject* pOperator = OBJECTMGR->GetObject(pSkillObjectAddInfo->SkillObjectInfo.Operator);
if(pOperator == NULL)
{
OBJECTACTIONMGR->ApplyTargetList(pOperator,&pSkillObjectAddInfo->TargetList,eDamageKind_Front);
return NULL;
}
if(pOperator->GetObjectKind() & eObjectKind_Monster)
{
VECTOR3 MainTargetPos;
GetMainTargetPos(&pSkillObjectAddInfo->SkillObjectInfo.MainTarget,&MainTargetPos,NULL);
MOVEMGR->SetLookatPos(pOperator,&MainTargetPos,0,gCurTime);
}
else
MOVEMGR->SetAngle(pOperator,DIRTODEG(pSkillObjectAddInfo->SkillObjectInfo.Direction),0);
WORD SkillIdx = pSkillObjectAddInfo->SkillObjectInfo.SkillIdx;
CSkillInfo* pSkillInfo = GetSkillInfo(SkillIdx);
CSkillObject* pSObj = pSkillInfo->GetSkillObject();
DoCreateSkillObject(pSObj,&pSkillObjectAddInfo->SkillObjectInfo,
&pSkillObjectAddInfo->TargetList);
return pSObj;
}
CSkillObject* CSkillManager::CreateTempSkillObject(CSkillInfo* pSkillInfo,CHero* pHero,CActionTarget* pTarget)
{
CSkillObject* pSObj = pSkillInfo->GetSkillObject();
SKILLOBJECT_INFO sinfo;
sinfo.SkillIdx = pSkillInfo->GetSkillIndex();
sinfo.SkillObjectIdx = TEMP_SKILLOBJECT_ID;
sinfo.Direction = DEGTODIR(pHero->GetAngleDeg());
pTarget->GetMainTarget(&sinfo.MainTarget);
sinfo.Operator = pHero->GetID();
VECTOR3* pHeroPos = &pHero->GetCurPosition();
VECTOR3* pTargetPos = pTarget->GetTargetPosition();
if(pTargetPos == NULL)
return NULL;
sinfo.Pos = *(pSkillInfo->GetTargetAreaPivotPos(pHeroPos,pTargetPos));
sinfo.StartTime = gCurTime;
CTargetList tlist;
pTarget->GetTargetArray(&tlist);
DoCreateSkillObject(pSObj,&sinfo,&tlist);
// for debug
return pSObj;
}
void CSkillManager::ChangeTempObjToRealObj(MSG_SKILLOBJECT_ADD* pSkillObjectAddInfo)
{
CSkillObject* pTempObj = GetSkillObject(TEMP_SKILLOBJECT_ID);
// //ASSERT(pTempObj);
if(pTempObj == NULL)
{
return;
}
m_SkillObjectTable.Remove(pTempObj->GetID());
OBJECTMGR->AddGarbageObject(pTempObj);
DoCreateSkillObject(pTempObj,&pSkillObjectAddInfo->SkillObjectInfo,
&pSkillObjectAddInfo->TargetList);
}
void CSkillManager::ReleaseSkillObject(CSkillObject* pSkillObject)
{
CSkillInfo* pSInfo = GetSkillInfo(pSkillObject->GetSkillIdx());
if(pSInfo == NULL)
{
char temp[256];
sprintf(temp,"skillkind:%d SkillName:%s oper:%d",
pSkillObject->GetSkillIdx(),
pSkillObject->GetSkillInfo()->GetSkillName(),
pSkillObject->GetOperator() ? pSkillObject->GetOperator()->GetID() : 0);
ASSERTMSG(0,temp);
return;
}
//ASSERT(pSInfo);
m_SkillObjectTable.Remove(pSkillObject->GetID());
OBJECTMGR->AddGarbageObject(pSkillObject);
pSkillObject->ReleaseSkillObject();
pSInfo->ReleaseSkillObject(pSkillObject,0);
}
void CSkillManager::OnReceiveSkillObjectAdd(MSG_SKILLOBJECT_ADD* pmsg)
{
if(pmsg->SkillObjectInfo.Operator == HEROID)
ChangeTempObjToRealObj(pmsg);
else
CreateSkillObject(pmsg);
}
void CSkillManager::OnReceiveSkillObjectRemove(MSG_DWORD* pmsg)
{
CSkillObject* pSObj = GetSkillObject(pmsg->dwData);
if(pSObj == NULL)
{
//ASSERTMSG(0,"SkillObject Remove Failed");
return;
}
ReleaseSkillObject(pSObj);
}
void CSkillManager::OnReceiveSkillStartNack()
{
HERO->SetCurComboNum(0);
CSkillObject* pSObj = GetSkillObject(TEMP_SKILLOBJECT_ID);
//ASSERT(pSObj);
if(pSObj == NULL)
return;
pSObj->SetMissed();
ReleaseSkillObject(pSObj);
}
void CSkillManager::OnReceiveSkillSingleResult(MSG_SKILL_SINGLE_RESULT* pmsg)
{
CSkillObject* pSObj = GetSkillObject(pmsg->SkillObjectID);
if(pSObj == NULL)
{
//ASSERTMSG(0,"SkillObject Single Unit Result Failed");
return;
}
pSObj->OnReceiveSkillSingleResult(pmsg);
}
void CSkillManager::OnReceiveSkillObjectTargetListAdd(DWORD SkillObjectID,DWORD AddedObjectID,BYTE bTargetKind)
{
CSkillObject* pSObj = GetSkillObject(SkillObjectID);
//ASSERT(pSObj);
if(pSObj == NULL)
{
//ASSERTMSG(0,"SkillObject Target Add Failed(No SObj)");
return;
}
CObject* pObject = OBJECTMGR->GetObject(AddedObjectID);
if(pObject == NULL)
{
//ASSERTMSG(0,"SkillObject Target Add Failed(No Target)");
return;
}
pSObj->AddTargetObject(pObject,bTargetKind);
}
void CSkillManager::OnReceiveSkillObjectTargetListRemove(DWORD SkillObjectID,DWORD RemovedObjectID)
{
CSkillObject* pSObj = GetSkillObject(SkillObjectID);
//ASSERT(pSObj);
if(pSObj == NULL)
{
//ASSERTMSG(0,"SkillObject Target Remove Failed");
return;
}
pSObj->RemoveTargetObject(RemovedObjectID);
}
void CSkillManager::OnReceiveSkillStartEffect(DWORD SkillOperator,DWORD SkillIdx)
{
CObject* pOperator = OBJECTMGR->GetObject(SkillOperator);
if(pOperator == NULL)
{
//ASSERTMSG(0,"SkillObject StartEffect Failed(No Operator)");
return;
}
CSkillInfo* pSkillInfo = GetSkillInfo((WORD)SkillIdx);
if(pSkillInfo == NULL)
{
//ASSERTMSG(0,"SkillObject StartEffect Failed(No SkillInfo)");
return;
}
SkillStartEffect(pOperator,pSkillInfo);
}
void CSkillManager::OnReceiveSkillObjectOperate(MSG_SKILL_OPERATE* pmsg)
{
CSkillObject* pSObj = GetSkillObject(pmsg->SkillObjectID);
//ASSERT(pSObj);
if(pSObj == NULL)
{
//ASSERTMSG(0,"SkillObject Operate Failed(No SObj)");
return;
}
CObject* pReqObj = OBJECTMGR->GetObject(pmsg->RequestorID);
pSObj->Operate(pReqObj,&pmsg->MainTarget,&pmsg->TargetList);
}
void CSkillManager::NetworkMsgParse(BYTE Protocol,void* pMsg)
{
switch(Protocol)
{
case MP_SKILL_SKILLOBJECT_ADD:
{
MSG_SKILLOBJECT_ADD* pmsg = (MSG_SKILLOBJECT_ADD*)pMsg;
OnReceiveSkillObjectAdd(pmsg);
}
break;
case MP_SKILL_SKILLOBJECT_REMOVE:
{
MSG_DWORD* pmsg = (MSG_DWORD*)pMsg;
OnReceiveSkillObjectRemove(pmsg);
}
break;
case MP_SKILL_START_NACK:
{
OnReceiveSkillStartNack();
}
break;
case MP_SKILL_SKILL_SINGLE_RESULT:
{
MSG_SKILL_SINGLE_RESULT* pmsg = (MSG_SKILL_SINGLE_RESULT*)pMsg;
OnReceiveSkillSingleResult(pmsg);
}
break;
// TargetList Update
case MP_SKILL_ADDOBJECT_TO_SKILLOBJECTAREA_ACK:
{
MSG_DWORD2BYTE* pmsg = (MSG_DWORD2BYTE*)pMsg;
OnReceiveSkillObjectTargetListAdd(pmsg->dwData1,pmsg->dwData2,pmsg->bData);
}
break;
case MP_SKILL_REMOVEOBJECT_FROM_SKILLOBJECTAREA_ACK:
{
MSG_DWORD2* pmsg = (MSG_DWORD2*)pMsg;
OnReceiveSkillObjectTargetListRemove(pmsg->dwData1,pmsg->dwData2);
}
break;
case MP_SKILL_STARTEFFECT:
{
MSG_DWORD2* pmsg = (MSG_DWORD2*)pMsg;
OnReceiveSkillStartEffect(pmsg->dwData1,pmsg->dwData2);
}
break;
case MP_SKILL_OPERATE_ACK:
{
MSG_SKILL_OPERATE* pmsg = (MSG_SKILL_OPERATE*)pMsg;
OnReceiveSkillObjectOperate(pmsg);
}
break;
}
}
CSkillArea* CSkillManager::GetSkillArea(CObject* pObject, CActionTarget* pTarget, CSkillInfo* pSkillInfo)
{
CSkillArea* pArea = GetSkillArea(pObject->GetDirectionIndex(),pSkillInfo->GetSkillAreaIndex());
// Area狼 吝缴谅钎鳖瘤 悸泼登绢廉 柯促.
VECTOR3* pPos;
pPos = pSkillInfo->GetTargetAreaPivotPos(&pObject->GetCurPosition(),pTarget->GetTargetPosition());
pArea->SetCenterPos(pPos);
return pArea;
}
CSkillArea* CSkillManager::GetSkillArea(DIRINDEX dir,WORD SkillAreaIndex)
{
CSkillArea* pArea = m_SkillAreaMgr.GetSkillArea(SkillAreaIndex,dir);
return pArea;
}
void CSkillManager::ReleaseSkillArea(CSkillArea* pSkillArea)
{
m_SkillAreaMgr.ReleaseSkillArea(pSkillArea);
}
void CSkillManager::UpdateSkillObjectTargetList(CObject* pObject)
{
CSkillObject* pSObj;
DWORD rtCode;
m_SkillObjectTable.SetPositionHead();
while(pSObj = m_SkillObjectTable.GetData())
{
rtCode = pSObj->Update(); // 磊扁啊 静绊 乐绰 胶懦甸俊 措茄 阁胶磐狼 诀单捞飘
pSObj->UpdateTargetList(pObject); // 林牢傍 诀单捞飘
#ifdef _TESTCLIENT_
if(rtCode == SO_DESTROYOBJECT)
{
m_SkillObjectTable.Remove(pSObj->GetID());
ReleaseSkillObject(pSObj);
}
#endif
}
}
void CSkillManager::RemoveTarget(CObject* pObject,BYTE bTargetKind)
{
CSkillObject* pSObj;
m_SkillObjectTable.SetPositionHead();
while(pSObj = m_SkillObjectTable.GetData())
{
pSObj->RemoveTarget(pObject,bTargetKind);
}
}
void CSkillManager::SkillStartEffect(CObject* pObject,CSkillInfo* pSkillInfo)
{
TARGETSET set;
set.pTarget = pObject;
DWORD flag = 0;
if(pObject->GetID() == HEROID)
flag |= EFFECT_FLAG_HEROATTACK;
EFFECTMGR->StartEffectProcess(pSkillInfo->GetSkillInfo()->EffectStart,pObject,
&set,1,pObject->GetID(),flag);
}
BOOL CSkillManager::HeroSkillStartEffect(CHero* pHero,CActionTarget* pTarget,CSkillInfo* pSkillInfo)
{
SkillStartEffect(pHero,pSkillInfo);
OBJECTSTATEMGR->StartObjectState(pHero,eObjectState_SkillStart);
OBJECTSTATEMGR->EndObjectState(pHero,eObjectState_SkillStart,pSkillInfo->GetSkillInfo()->EffectStartTime);
CAction act;
act.InitSkillActionRealExecute(pSkillInfo,pTarget);
pHero->SetSkillStartAction(&act);
// 辑滚俊 皋技瘤 焊辰促.
MSG_DWORD2 msg;
msg.Category = MP_SKILL;
msg.Protocol = MP_SKILL_STARTEFFECT;
msg.dwData1 = pHero->GetID();
msg.dwData2 = pSkillInfo->GetSkillIndex();
NETWORK->Send(&msg,sizeof(msg));
return TRUE;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -