📄 object.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 + -