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

📄 skillobject_mine.cpp

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

#include "stdafx.h"
#include "SkillObject_Mine.h"

#ifdef _MHCLIENT_
#include "ObjectManager.h"
#include "EFFECT/EffectManager.h"
#include "SkillObjectFirstUnit.h"
#include "ObjectActionManager.h"
#else
#include "UserTable.h"
#include "SkillManager_server.h"
#include "AttackManager.h"
#include "PackedData.h"
#endif

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

CSkillObject_Mine::CSkillObject_Mine(CSkillInfo* pSkillInfo,
				CSkillObjectTerminator* pTerminator,
				CSkillObjectTargetList* pTargetList,
				CSkillObjectFirstUnit* pFirstUnit)
:	CSkillObject(pSkillInfo,pTerminator,pTargetList,pFirstUnit)
{

}

CSkillObject_Mine::~CSkillObject_Mine()
{

}

void CSkillObject_Mine::Init(SKILLOBJECT_INFO* pInfo,CTargetList* pTList)
{
	CSkillObject::Init(pInfo,pTList);
	m_bOperate = FALSE;
}

void CSkillObject_Mine::UpdateTargetList(CObject* pObject)
{
	CSkillObject::UpdateTargetList(pObject);

#ifdef _MHCLIENT_
	CheckOperate(pObject);
#endif
}

DWORD CSkillObject_Mine::Update()
{
#ifdef _MAPSERVER_
	if(m_pOperator->GetObjectKind() & eObjectKind_Monster)
	{
		m_pTargetList->SetPositionHead();
		CObject* pObject;
		BYTE bTargetKind;
		while(m_pTargetList->GetNextNegativeTarget(&pObject,&bTargetKind))
		{
			if(CheckOperate(pObject) == TRUE)
				break;
		}
	}
#endif

	// 泅犁绰 抛胶飘 滚怜烙 粱歹 磊技洒 焊绊 沥府且巴烙. LBS
	DWORD rt = CSkillObject::Update();

	if( rt == SO_DESTROYOBJECT )
	{
		VECTOR3 pos;
		GetPosition(&pos);
		m_bOperate = TRUE;

#ifdef _MAPSERVER_
		MAINTARGET mt(&pos);
		CTargetList tlist;
		CTargetListIterator iter(&tlist);

		m_pTargetList->SetPositionHead();
		STLIST* pList;
		while(pList = m_pTargetList->GetNextTargetList())
		{
			iter.AddTargetWithNoData(pList->pObject->GetID(),pList->bTargetKind);
		}
		iter.Release();
		Operate(NULL,&mt,&tlist);
#else
		ObjectArray<LPOBJECT> objarray;
		OBJECTMGR->GetTargetInRange(&pos,GetSkillInfo()->GetSkillRange(),&objarray,FALSE);

		LPOBJECT pObj;
		MAINTARGET mt(&pos);
		MSG_SKILL_OPERATE msg;
		msg.InitMsg(MP_SKILL_OPERATE_SYN,&mt);
		msg.RequestorID = HEROID;
		msg.SkillObjectID = GetID();
		CTargetListIterator iter(&msg.TargetList);

		objarray.SetPositionHead();
		while(pObj = objarray.GetNextObject())
		{
			iter.AddTargetWithNoData(pObj->GetID(),0);
		}
		iter.Release();

		NETWORK->Send(&msg,msg.GetMsgLength());

	#ifdef _TESTCLIENT_
		Operate(HERO,&mt,&msg.TargetList);
	#endif		
#endif
	}

	return rt;
}


BOOL CSkillObject_Mine::Operate(CObject* pRequestor,MAINTARGET* pMainTarget,CTargetList* pTList)
{	
#ifdef _MAPSERVER_	
	MSG_SKILL_OPERATE msg;
	msg.InitMsg(MP_SKILL_OPERATE_ACK,pMainTarget);
	msg.SkillObjectID = GetID();
	msg.RequestorID = pRequestor ? pRequestor->GetID() : 0;

	CTargetListIterator riter(pTList);				// 牢磊肺 逞绢柯 格废 府胶飘 iterator
	CTargetListIterator siter(&msg.TargetList);		// 皋技瘤肺 焊尘 单捞磐甫 器窃茄 府胶飘 iterator

	CObject* pTarget;

	int SkillLevel = m_SkillObjectInfo.SkillLevel;
	float phy_rate = m_pSkillInfo->GetFirstPhyAttack(SkillLevel);
	WORD att_min = m_pSkillInfo->GetFirstAttAttackMin(SkillLevel);
	WORD att_max = m_pSkillInfo->GetFirstAttAttackMax(SkillLevel);
	WORD Attrib = m_pSkillInfo->GetAttrib();
	float att_rate = m_pSkillInfo->GetFirstAttAttack(SkillLevel);
	RESULTINFO dinfo;
	while(riter.GetNextTarget())
	{
		pTarget = g_pUserTable->FindUser(riter.GetTargetID());
		if(pTarget == NULL)
			continue;

		if(IsNegativeTarget(pTarget) == FALSE)
			continue;
		
		// 康开眉农 [6/24/2004]
		// 努扼捞攫飘俊辑 焊郴柯 府胶飘 犬牢

		ATTACKMGR->Attack(TRUE, m_pOperator,pTarget,0,phy_rate,
						Attrib,att_min,att_max,att_rate,
						0,&dinfo,FALSE);

		siter.AddTargetWithResultInfo(riter.GetTargetID(),SKILLRESULTKIND_NEGATIVE,&dinfo);
	}
	siter.Release();
	riter.Release();
	
	PACKEDDATA_OBJ->QuickSend(this,&msg,msg.GetMsgLength());

	DoDie(NULL);

	return TRUE;
#else
	MSG_SKILL_OPERATE msg;
	msg.InitMsg(MP_SKILL_OPERATE_ACK,pMainTarget);

	#ifdef _TESTCLIENT_
	CTargetListIterator riter(pTList);				// 牢磊肺 逞绢柯 格废 府胶飘 iterator
	CTargetListIterator siter(&msg.TargetList);		// 皋技瘤肺 焊尘 单捞磐甫 器窃茄 府胶飘 iterator

	CObject* pTarget;

	int SkillLevel = m_SkillObjectInfo.SkillLevel;
	float phy_rate = m_pSkillInfo->GetFirstPhyAttack(SkillLevel);
	WORD att_min = m_pSkillInfo->GetFirstAttAttackMin(SkillLevel);
	WORD att_max = m_pSkillInfo->GetFirstAttAttackMax(SkillLevel);
	WORD Attrib = m_pSkillInfo->GetAttrib();
	
	while(riter.GetNextTarget())
	{
		pTarget = OBJECTMGR->GetObject(riter.GetTargetID());
		if(pTarget == NULL)
			continue;

		if(IsNegativeTarget(pTarget) == FALSE)
			continue;

		RESULTINFO dinfo;
		dinfo.Clear();
		dinfo.bCritical = rand() % 2;
		dinfo.RealDamage = rand() % 30;
		dinfo.ShieldDamage = rand() % 30;
		dinfo.CounterDamage = 0;

		siter.AddTargetWithResultInfo(riter.GetTargetID(),SKILLRESULTKIND_NEGATIVE,&dinfo);
	}
	
	siter.Release();
	riter.Release();

	m_bDieFlag = 1;

	#endif
	
	DWORD flag = 0;
	if(m_pOperator->GetID() == HEROID)
		flag |= EFFECT_FLAG_HEROATTACK;
	if(m_pSkillInfo->GetSkillInfo()->EffectMineOperate)
		EFFECTMGR->StartEffectProcessWithTargetList(m_pSkillInfo->GetSkillInfo()->EffectMineOperate,this,pTList,pMainTarget,flag);	
	else
	{
		CObject* pTarget;
		RESULTINFO rinfo;
		CTargetListIterator iter(pTList);
		while(iter.GetNextTarget())
		{
			pTarget = OBJECTMGR->GetObject(iter.GetTargetID());
			iter.GetTargetData(&rinfo);
			if(pTarget == NULL)
				continue;
			OBJECTACTIONMGR->ApplyResult(pTarget,GetOperator(),&rinfo,eDamageKind_Front);
		}
		iter.Release();		
	}


	return TRUE;
#endif
}

BOOL CSkillObject_Mine::CheckOperate(CObject* pObject)
{
	if(m_bOperate == TRUE)		// 捞固 累悼沁栏搁 return;
		return TRUE;
	if(gCurTime - m_SkillObjectInfo.StartTime < m_pSkillInfo->GetSkillInfo()->MineCheckStartTime)	// 瘤汾绰 累悼 矫埃捞 乐促.
		return TRUE;

	VECTOR3 pos1,pos2;
	pObject->GetPosition(&pos1);
	GetPosition(&pos2);
	pos1.y = pos2.y = 0;
	
	float dist = CalcDistanceXZ(&pos1,&pos2);
	if(dist <= m_pSkillInfo->GetSkillInfo()->MineCheckRange)
	{
		m_bOperate = TRUE;

#ifdef _MAPSERVER_
		MAINTARGET mt(&pos2);
		CTargetList tlist;
		CTargetListIterator iter(&tlist);

		m_pTargetList->SetPositionHead();
		STLIST* pList;
		while(pList = m_pTargetList->GetNextTargetList())
		{
			iter.AddTargetWithNoData(pList->pObject->GetID(),pList->bTargetKind);
		}
		iter.Release();
		Operate(NULL,&mt,&tlist);
#else
		ObjectArray<LPOBJECT> objarray;
		OBJECTMGR->GetTargetInRange(&pos2,GetSkillInfo()->GetSkillRange(),&objarray,FALSE);

		LPOBJECT pObj;
		MAINTARGET mt(&pos2);
		MSG_SKILL_OPERATE msg;
		msg.InitMsg(MP_SKILL_OPERATE_SYN,&mt);
		msg.RequestorID = HEROID;
		msg.SkillObjectID = GetID();
		CTargetListIterator iter(&msg.TargetList);

		objarray.SetPositionHead();
		while(pObj = objarray.GetNextObject())
		{
			iter.AddTargetWithNoData(pObj->GetID(),0);
		}
		iter.Release();

		NETWORK->Send(&msg,msg.GetMsgLength());

	#ifdef _TESTCLIENT_
		Operate(HERO,&mt,&msg.TargetList);
	#endif		
#endif
		return TRUE;
	}
	return FALSE;
}

⌨️ 快捷键说明

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