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

📄 skillmanager_client.cpp

📁 墨香最新私服
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 捞亥飘 勤甸 窃荐甸
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 + -