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

📄 object.cpp

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

#include "stdafx.h"
#include "Object.h"
#include "CharMove.h"
//#include "ServerSystem.h"
#include "ObjectStateManager.h"
#include "BattleSystem_Server.h"
#include "PackedData.h"
#include "Network.h"
#include "..\[CC]Header\CommonCalcFunc.h"
#include "StunState.h"
#include "AmplifiedPower.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CObject::CObject()
{
	m_pSpecialState[eSpecialState_Stun] = new CStunState(this);
	m_pSpecialState[eSpecialState_AmplifiedPowerPhy] = new CAmplifiedPowerPhy(this);
	m_pSpecialState[eSpecialState_AmplifiedPowerAtt] = new CAmplifiedPowerAtt(this);
	m_bInited = FALSE;
	m_GridID = 0;
//	m_MapNum = 0;
//	m_tempMapNum = 0;
}

CObject::~CObject()
{
	for(int n=0;n<eSpecialState_Max;++n)
		delete m_pSpecialState[n];
}

BOOL CObject::Init(EObjectKind kind,DWORD AgentNum, BASEOBJECT_INFO* pBaseObjectInfo)
{
	for(int n=0;n<eSpecialState_Max;++n)
		m_pSpecialState[n]->Init();
	SetBattle(pBaseObjectInfo->BattleID,0);
	
	m_AgentNum = AgentNum;
	m_ObjectKind = kind;
	m_dwSkillDelayStartTime = 0;

	if(pBaseObjectInfo)
		memcpy(&m_BaseObjectInfo,pBaseObjectInfo,sizeof(m_BaseObjectInfo));
	else
		memset(&m_BaseObjectInfo,0,sizeof(BASEOBJECT_INFO));

	OBJECTSTATEMGR_OBJ->InitObjectState(this);

	return TRUE;
}

void CObject::Release()
{
	for(int n=0;n<eSpecialState_Max;++n)
		m_pSpecialState[n]->EndState();
	
	m_ObjectKind = 0;
	m_bInited = FALSE;
	m_StatusList.RemoveAll();
	m_bGridInited = FALSE;
}

void CObject::GetBaseObjectInfo(BASEOBJECT_INFO* pRtInfo)
{
	memcpy(pRtInfo,&m_BaseObjectInfo,sizeof(BASEOBJECT_INFO));
}

void CObject::GetSendMoveInfo(SEND_MOVEINFO* pRtInfo,CAddableInfoList* pAddInfoList)
{
	pRtInfo->CurPos.Compress(CCharMove::GetPosition(this));
	pRtInfo->KyungGongIdx = m_MoveInfo.KyungGongIdx;
	pRtInfo->MoveMode = m_MoveInfo.MoveMode;

	if(CCharMove::IsMoving(this))
	{
		if(pAddInfoList == NULL)
		{
			char temp[256];
			sprintf(temp,"Object %s,  Invalid Move State (Not Inited But Moving)");
			ASSERTMSG(0,temp);
			for(int i=0;i<m_MoveInfo.GetMaxTargetPosIdx();++i)
			{
				VECTOR3* pPos = m_MoveInfo.GetTargetPosition(i);
				sprintf(temp,"tpos %d,   (%4.2f,  %4.2f)",i,pPos->x,pPos->z);
				ASSERTMSG(0,temp);
			}
			return;
		}

		COMPRESSEDTARGETPOS tpos;
		tpos.Init();
		for(int i=0;i<m_MoveInfo.GetMaxTargetPosIdx();++i)
			tpos.AddTargetPos(m_MoveInfo.GetTargetPosition(i));
		pAddInfoList->AddInfo(CAddableInfoList::MoveInfo,tpos.GetSize(),&tpos);
	}
}
/*
VECTOR3 * CObject::GetCurTargetPosition()
{
	return &m_MoveInfo.TargetPositions[m_MoveInfo.CurTargetPositionIdx];
}*/
void CObject::SetRemoveMsg(char* pRemoveMsg,WORD* pMsgLen,DWORD dwReceiverID)
{
	MSG_DWORD* pMsg = (MSG_DWORD*)pRemoveMsg;
	pMsg->Category = MP_USERCONN;
	pMsg->Protocol = MP_USERCONN_OBJECT_REMOVE;
	pMsg->dwObjectID = dwReceiverID;
	pMsg->dwData = GetID();
	
	*pMsgLen = sizeof(MSG_DWORD);
}

void CObject::SetInited()
{
	DoSetInited();
	if(GetObjectKind() != eObjectKind_Player)
	{
		/*
		if(GridPos.x == -1 ||
			GridPos.z == -1 ||
			GridPos.LastX == -1 ||
			GridPos.LastZ == -1)
		{
			ASSERT(0);
		}
		*/
	}

	m_bInited = TRUE;
}

void CObject::SetNotInited()
{
	m_bInited = FALSE;
}

void CObject::GetPosition(VECTOR3* pos)
{
	*pos = *CCharMove::GetPosition(this);
}

void CObject::SetState(BYTE state)
{
	m_ObjectState.BeforeState	= m_BaseObjectInfo.ObjectState;
	m_BaseObjectInfo.ObjectState		= state;
	m_ObjectState.State_Start_Time = gCurTime;
	m_ObjectState.bEndState		= FALSE;
}

int CObject::GetObjectTileSize()
{
	return 0;
}

void CObject::CalcCounterDamage(WORD Attrib,WORD AttrDamage,WORD PhyDamage,RESULTINFO* pDamageInfo)
{
	DWORD CounterDamage = 0;
	PTRLISTSEARCHSTART(m_StatusList,CStatus*,pSL)
		pSL->GetCounterAttackDamage(Attrib,AttrDamage,PhyDamage,pDamageInfo,CounterDamage);
	PTRLISTSEARCHEND;
	pDamageInfo->CounterDamage = (WORD)CounterDamage;
}

void CObject::CalcVampiric(RESULTINFO* pDamageInfo)
{
	float VampiricLifeRate = 0;
	float VampiricNaeryukRate = 0;
	PTRLISTSEARCHSTART(m_StatusList,CStatus*,pSL)
		pSL->GetVampiricLife(VampiricLifeRate);
		pSL->GetVampiricNaeryuk(VampiricNaeryukRate);
	PTRLISTSEARCHEND;
	pDamageInfo->Vampiric_Life = pDamageInfo->RealDamage * VampiricLifeRate;
	pDamageInfo->Vampiric_Naeryuk = pDamageInfo->RealDamage * VampiricNaeryukRate;

	if(pDamageInfo->Vampiric_Life)
	{
		DWORD CurLife = GetLife();
		DWORD MaxLife = GetMaxLife();
		ASSERT(CurLife <= MaxLife);
		if(CurLife + pDamageInfo->Vampiric_Life > MaxLife)
		{
			pDamageInfo->Vampiric_Life = MaxLife - CurLife;
		}
		SetLife(CurLife+pDamageInfo->Vampiric_Life,FALSE);
	}
	
	if(pDamageInfo->Vampiric_Naeryuk)
	{
		DWORD CurNaeryuk = GetNaeRyuk();
		DWORD MaxNaeryuk = GetMaxNaeRyuk();
		ASSERT(CurNaeryuk <= MaxNaeryuk);
		if(CurNaeryuk + pDamageInfo->Vampiric_Naeryuk > MaxNaeryuk)
		{
			pDamageInfo->Vampiric_Naeryuk = MaxNaeryuk - CurNaeryuk;
		}
		SetNaeRyuk(CurNaeryuk+pDamageInfo->Vampiric_Naeryuk,FALSE);
	}
}

void CObject::CalcRealDamage(CObject* pOperator,WORD PhyDamage,WORD AttrDamage,RESULTINFO* pDamageInfo)
{
	// 款扁炼侥吝老 版快俊绰 单固瘤甫 50% 眠啊茄促.
	if(GetState() == eObjectState_Ungijosik)
	{
		PhyDamage = (WORD)(PhyDamage*1.5f);
		AttrDamage = (WORD)(AttrDamage*1.5f);		
	}
	
	DWORD Ori = PhyDamage + AttrDamage;
	DWORD Up = 0,Down = 0;
	PTRLISTSEARCHSTART(m_StatusList,CStatus*,pSL)
		pSL->GetDamage(Ori,Up,Down);
	PTRLISTSEARCHEND;

	float fDodgeRate = GetDodgeRate();
	if(fDodgeRate != 0)
	{
		if(CheckRandom(fDodgeRate,GetLevel(),pOperator->GetLevel()) == TRUE)
		{
			pDamageInfo->bDodge = TRUE;
			pDamageInfo->RealDamage = 0;
			return;
		}
	}

	pDamageInfo->RealDamage = (WORD)STATUSCALC(Ori,Up,Down);
}

DWORD CObject::CalcShieldDamage(DWORD ShieldDamage)
{
	DWORD Shield = GetShield();
	if(Shield < ShieldDamage)
	{
		SetShield(0,FALSE);
		return (WORD)Shield;
	}
	else
	{
		SetShield(Shield-ShieldDamage,FALSE);
		return ShieldDamage;
	}
}

void CObject::Die(CObject* pAttacker)
{
	m_StatusList.RemoveAll();

	// 泅犁 加秦 乐绰 Battle俊辑 贸府秦焊绊 贸府窍瘤 给沁促搁(return FALSE),
	// 阿 努贰胶甸俊霸 贸府甫 该变促.
	DWORD AttackerID;
	if(pAttacker == NULL)
		AttackerID = 0;
	else 
		AttackerID = pAttacker->GetID();
	if(m_pBattle->OnTeamMemberDie(GetBattleTeam(),GetID(),AttackerID) == FALSE)
		DoDie(pAttacker);
		
	for(int n=0;n<eSpecialState_Max;++n)
		m_pSpecialState[n]->EndState();
}

//林狼: CPlayer::Damage甫 父甸菌促. 荐沥荤亲捞 乐促搁 CPlayer::Damage档 荐沥窍档废 窍矫坷. KES
DWORD CObject::Damage(CObject* pAttacker,RESULTINFO* pDamageInfo)
{
	DWORD life = GetLife();
	DWORD beforelife = life;
	if(life > pDamageInfo->RealDamage)
		life -= pDamageInfo->RealDamage;
	else
		life = 0;
	
	SetLife(life,FALSE);

	DoDamage(pAttacker,pDamageInfo,beforelife);

	return life;
}

void CObject::AddLife(DWORD val,DWORD* realAddLife,BOOL bSendMsg)
{	
	DWORD life = GetLife();
	DWORD maxlife = GetMaxLife();
	
	if(life+val > maxlife)
	{
		val = maxlife - life;
	}
	SetLife(life+val,bSendMsg);

	if(realAddLife)
		*realAddLife = val;
}
void CObject::AddNaeRyuk(DWORD val,DWORD* realAddNaeRyuk)
{
	DWORD naeryuk = GetNaeRyuk();
	DWORD maxnaeryuk = GetMaxNaeRyuk();
	
	if(naeryuk+val > maxnaeryuk)
	{
		val = maxnaeryuk - naeryuk;
	}
	SetNaeRyuk(naeryuk+val);

	if(realAddNaeRyuk)
		*realAddNaeRyuk = val;
}

void CObject::ReduceNaeRyuk(DWORD val)
{
	if(GetNaeRyuk() < val)
		SetNaeRyuk(0);
	else
		SetNaeRyuk(GetNaeRyuk()-val);
}

void CObject::CheckLifeValid()
{
	DWORD MaxLife = GetMaxLife();
	if(GetLife() > MaxLife)
		SetLife(MaxLife);
}
void CObject::CheckNaeRyukValid()
{
	DWORD MaxNaeRyuk = GetMaxNaeRyuk();
	if(GetNaeRyuk() > MaxNaeRyuk)
		SetNaeRyuk(MaxNaeRyuk);
}
void CObject::CheckShieldValid()
{
	DWORD maxShield = GetMaxShield();
	if(GetShield() > maxShield)
		SetShield(maxShield);
}

//////////////////////////////////////////////////////////////////////////
// Status
void CObject::AddStatus(CStatus* pStatus)
{
	m_StatusList.AddTail(pStatus);

	CheckLifeValid();
	CheckNaeRyukValid();
	CheckShieldValid();
}
void CObject::RemoveStatus(CStatus* pStatus)
{
	BOOL rt = m_StatusList.Remove(pStatus);

	CheckLifeValid();
	CheckNaeRyukValid();
	CheckShieldValid();
}


float CObject::GetAttDefense(WORD Attrib)
{
	if(Attrib == ATTR_NOATTR)		// 公加己篮 加己规绢仿捞 0捞促.
		return 0;

	float Ori = DoGetAttDefense(Attrib);
	float Up = 0,Down = 0;
	PTRLISTSEARCHSTART(m_StatusList,CStatus*,pSL)
		pSL->GetAttDefense(Attrib,Ori,Up,Down);
	PTRLISTSEARCHEND;
	float res = STATUSCALC(Ori,Up,Down);
	if(res > 1)
		res = 1;	
	return res;
}

//////////////////////////////////////////////////////////////////////////
// battle
void CObject::SetBattle(DWORD BattleID,BYTE Team)
{
	m_BaseObjectInfo.BattleID = BattleID;
	m_BaseObjectInfo.BattleTeam = Team;
	m_pBattle = BATTLESYSTEM->GetBattle(BattleID);
	
	if(m_pBattle == NULL)
	{
		ASSERT(0);
		return;
	}

	if(m_bInited == FALSE)
		return;

	MSG_DWORD3 msg;
	msg.Category	= MP_BATTLE;
	msg.Protocol	= MP_BATTLE_CHANGE_OBJECTBATTLE;
	msg.dwObjectID	= GetID();
	msg.dwData1		= BattleID;
	msg.dwData2		= Team;
	msg.dwData3		= m_pBattle->GetBattleKind();

	PACKEDDATA_OBJ->QuickSend(this,&msg,sizeof(msg));
}


void CObject::SendMsg(MSGBASE* pMsg,int MsgLen)
{
	pMsg->dwObjectID = GetID();
	g_Network.Send2Server(GetAgentNum(),(char*)pMsg,MsgLen);
}


void CObject::StartSpecialState(DWORD SpecialStateKind,DWORD Time,
								WORD wParam1,WORD wParam2,float fParam3,
								WORD EffectNum,WORD StateIcon)
{
	m_pSpecialState[SpecialStateKind]->StartState(Time,wParam1,wParam2,fParam3,EffectNum,StateIcon);
}
void CObject::EndSpecialState(DWORD SpecialStateKind)
{
	m_pSpecialState[SpecialStateKind]->EndState();
}
BOOL CObject::IsInSpecialState(DWORD SpecialStateKind)
{
	return m_pSpecialState[SpecialStateKind]->IsInState();
}
void CObject::SpecialStateProcess(DWORD TickTime)
{
	for(int n=0;n<eSpecialState_Max;++n)
	{
		m_pSpecialState[n]->Process(TickTime);
	}
}
WORD CObject::GetSpecialStateParam1(DWORD SpecialStateKind)
{
	return m_pSpecialState[SpecialStateKind]->GetParam1();
}
WORD CObject::GetSpecialStateParam2(DWORD SpecialStateKind)
{
	return m_pSpecialState[SpecialStateKind]->GetParam2();
}
float CObject::GetSpecialStateParam3(DWORD SpecialStateKind)
{
	return m_pSpecialState[SpecialStateKind]->GetParam3();
}

⌨️ 快捷键说明

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