📄 monster.cpp
字号:
// Monster.cpp: implementation of the CMonster class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Monster.h"
#include "CharMove.h"
#include "PackedData.h"
#include "GridSystem.h"
#include "Player.h"
#include "UserTable.h"
#include "RegenNpc.h"
#include "ObjectStateManager.h"
#include "AISystem.h"
#include "SkillManager_server.h"
#include "MHError.h"
#include "HelpRequestManager.h"
#include "TileManager.h"
#include "PathManager.h"
#include "..\[CC]Header\GameResourceManager.h"
#include "RegenPrototype.h"
#include "AIManager.h"
#include "RegenManager.h"
#include "Battle.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CMonster::CMonster()
{
m_pSInfo = NULL;
}
CMonster::~CMonster()
{
m_pSInfo = NULL;
}
BOOL CMonster::Init(EObjectKind kind,DWORD AgentNum, BASEOBJECT_INFO* pBaseObjectInfo)
{
CObject::Init(kind, AgentNum, pBaseObjectInfo);
//m_MonsterState = new CStateNPC;
m_pTObject = NULL;
m_DropItemId = 0;
m_dwDropItemRatio = 100;
m_bEventMob = FALSE;
return TRUE;
}
void CMonster::Release()
{
SetTObject(NULL);
if(m_bEventMob)
{
g_pAISystem->ReleaseMonsterID(GetSubID());
g_pAISystem->ReleaseMonsterID(GetID());
m_BaseObjectInfo.dwObjectID = 0;
SetSubID(0);
m_bEventMob = FALSE;
}
m_Distributer.Release();
CObject::Release();
}
void CMonster::InitMonster(MONSTER_TOTALINFO* pTotalInfo)
{
m_KillerPlayer = 0;
memcpy(&m_MonsterInfo,pTotalInfo,sizeof(MONSTER_TOTALINFO));
// 阁胶磐 胶泡 沥焊 涝仿
GAMERESRCMNGR->GetMonsterStats(GetMonsterKind(), &m_mon_stats);
//m_pState = new CStateMachine;
//m_pState->InitMachine(this);
//m_pAIBase = new CAIBase((CObject*)this);
//m_pAIBase->Init(GAMERESRCMNGR->GetMonsterInfo(GetMonsterKind()));
//if( GetObjectKind() == eObjectKind_SpecialMonster || GetObjectKind() == eObjectKind_BossMonster)
{
m_pSInfo = GAMERESRCMNGR->GetMonsterListInfo(GetMonsterKind());
}
m_stateParam.SetState(m_BaseObjectInfo.ObjectState);
GSTATEMACHINE.SetState( this, eMA_STAND );
//m_aiParam.Init(GAMERESRCMNGR->GetMonsterListInfo(GetMonsterKind()));
m_aiParam.Init();
m_MoveInfo.KyungGongIdx = eMA_STAND;
}
void CMonster::GetMonsterTotalInfo(MONSTER_TOTALINFO* pRtInfo)
{
memcpy(pRtInfo,&m_MonsterInfo,sizeof(MONSTER_TOTALINFO));
}
void CMonster::SetAddMsg(char* pAddMsg,WORD* pMsgLen,DWORD dwReceiverID,BOOL bLogin)
{
SEND_MONSTER_TOTALINFO* pMsg = (SEND_MONSTER_TOTALINFO*)pAddMsg;
pMsg->AddableInfo.Init();
pMsg->Category = MP_USERCONN;
pMsg->Protocol = MP_USERCONN_MONSTER_ADD;
pMsg->dwObjectID = dwReceiverID;
GetSendMoveInfo(&pMsg->MoveInfo,&pMsg->AddableInfo);
GetBaseObjectInfo(&pMsg->BaseObjectInfo);
GetMonsterTotalInfo(&pMsg->TotalInfo);
pMsg->bLogin = bLogin;
*pMsgLen = pMsg->GetMsgLength();
}
DWORD CMonster::GetCurAttackIndex()
{
return m_pSInfo->AttackIndex[m_aiParam.GetCurAttackKind()];
}
void CMonster::MoveStop()
{
if(CCharMove::IsMoving(this) == FALSE)
return;
VECTOR3* pos = CCharMove::GetPosition(this);
CCharMove::EndMove(this,gCurTime,pos);
MOVE_POS msg;
msg.Category = MP_MOVE;
msg.Protocol = MP_MOVE_STOP;
msg.dwMoverID = GetID();
msg.cpos.Compress(pos);
PACKEDDATA_OBJ->QuickSend(this,&msg,sizeof(msg));
}
// 单固瘤 涝腮 按眉 包府 //////////////////////////////
void CMonster::AddDamageObject(CPlayer* pPlayer, DWORD damage, DWORD plusdamage)
{
m_Distributer.AddDamageObject(pPlayer, damage, plusdamage);
}
/*
void CMonster::SetPeaceRestTime(DWORD dwMaxTime)
{
m_dwRestTime = rand()%dwMaxTime;
}
void CMonster::SetAttackRestTime(DWORD dwRestTime)
{
m_dwRestTime = dwRestTime;
}
*/
/*
BOOL CMonster::Rest(DWORD dwTickTime)
{
if(m_dwRestTime == 0)
return TRUE;
if(m_dwRestTime < dwTickTime)
{
m_dwRestTime = 0;
return TRUE;
}
else
{
m_dwRestTime -= dwTickTime;
return FALSE;
}
}*/
void CMonster::AddChat(char * str)
{
TESTMSG pmsg;
pmsg.Category = MP_CHAT;
pmsg.Protocol = MP_CHAT_FROMMONSTER_ALL;
pmsg.dwObjectID = GetID();
//strcpy(pmsg.Msg, str);
SafeStrCpy( pmsg.Msg, str, MAX_CHAT_LENGTH+1 );
//g_Console.LOG(4, pmsg->Msg);
//CPlayer* pPlayer = (CPlayer*)g_pUserTable->FindUser(pmsg->dwObjectID);
//if(!pPlayer) return;
//PACKEDDATA_OBJ->QuickSend(this,&pmsg,sizeof(pmsg));
PACKEDDATA_OBJ->QuickSend(this,&pmsg,pmsg.GetMsgLength()); //CHATMSG 040324
}
void CMonster::OnStartObjectState(BYTE State,DWORD dwParam)
{
switch(State)
{
case eObjectState_Die:
m_KillerPlayer = dwParam;
break;
case eObjectState_TiedUp_CanSkill: // 捞悼 搬冠
case eObjectState_TiedUp: // 捞悼,傍拜 葛滴 搬冠
OnStop();
break;
}
}
void CMonster::OnEndObjectState(BYTE State)
{
switch(State)
{
case eObjectState_Die:
g_pServerSystem->RemoveMonster(GetID());
break;
}
}
float CMonster::GetRadius()
{
return (float)m_pSInfo->MonsterRadius;
}
void CMonster::StateProcess()
{
switch(GetState())
{
case eObjectState_Die:
{
DWORD RemainTime;
if(m_ObjectState.State_End_Time >= gCurTime)
RemainTime = m_ObjectState.State_End_Time - gCurTime;
else
RemainTime = 0;
if(m_KillerPlayer && RemainTime < MONSTERREMOVE_TIME - 1500 )
{
CObject* pKiller = g_pUserTable->FindUser(m_KillerPlayer);
if(pKiller)
GetBattle()->OnMonsterDistribute(this,pKiller);
m_KillerPlayer = 0;
}
}
break;
}
}
int CMonster::GetObjectTileSize()
{
float radius = GetRadius();
if(radius < 50)
return 0;
else if(radius < 150)
return 1;
else if(radius < 250)
return 2;
else
return 2;
}
void CMonster::SetTObject( CPlayer * pNewTPlayer )
{
if(pNewTPlayer)
{
ASSERT(pNewTPlayer->GetGridID() == GetGridID());
}
CPlayer * m_pOldTPlayer = (CPlayer * )m_pTObject;
if(pNewTPlayer == m_pOldTPlayer) return;
if(pNewTPlayer)
{
// 单固瘤 罐酒 货肺款 眠利磊 汲沥
// 八祸等 阁胶磐啊 蜡历 眠利
if((m_pOldTPlayer && !m_pOldTPlayer->GetInited() )|| (m_pOldTPlayer && m_pOldTPlayer->GetState() == eObjectState_Die) )
{
MHERROR->OutputFile("Debug.txt",
MHERROR->GetStringArg("SetTObject old mID:%d,pID:%d,mstate:%d,pstate:%d,mG:%d,pG:%d",
GetID(),
m_pOldTPlayer->GetID(),
GetState(),
m_pOldTPlayer->GetState(),
GetGravity(),
m_pOldTPlayer->GetGravity()));
return;
}
if( !pNewTPlayer->GetInited() || pNewTPlayer->GetState() == eObjectState_Die )
{
MHERROR->OutputFile("Debug.txt",
MHERROR->GetStringArg("SetTObject new mID:%d,pID:%d,mstate:%d,pstate:%d,mG:%d,pG:%d",
GetID(),
pNewTPlayer->GetID(),
GetState(),
pNewTPlayer->GetState(),
GetGravity(),
pNewTPlayer->GetGravity()));
return;
}
if(pNewTPlayer->GetGravity() + GetGravity() > 100)
pNewTPlayer->RemoveFollowAsFarAs(GetGravity());
if(m_pOldTPlayer)
{
m_pOldTPlayer->RemoveFollowList(GetID());
}
pNewTPlayer->AddFollowList(this);
}
else
{
// pNewTPlayer == NULL
// 阁胶磐啊 眠利 器扁(rest, walkaround, stand) => 眠利 敲饭捞绢 临烙
// 阁胶磐 磷菌阑锭 => 眠利 敲饭捞绢 临烙
if(m_pOldTPlayer)
{
m_pOldTPlayer->RemoveFollowList(GetID());
}
}
m_pTObject = pNewTPlayer;
}
void CMonster::DoDamage(CObject* pAttacker,RESULTINFO* pDamageInfo,DWORD beforeLife)
{
if( pAttacker->GetGridID() != GetGridID() )
{
// ASSERT(0);
return;
}
DWORD plusdamage = 0;
if(beforeLife == GetSMonsterList()->Life)
{
plusdamage = (DWORD)(GetSMonsterList()->Life*0.2f);
}
if(pDamageInfo->RealDamage > beforeLife)
pDamageInfo->RealDamage = (WORD)beforeLife;
AddDamageObject((CPlayer*)pAttacker, pDamageInfo->RealDamage, plusdamage);
if( m_stateParam.stateCur == eMA_REST || m_stateParam.stateCur == eMA_RUNAWAY) return ;
// 档噶?
WORD RunawayType = 0;
if(CAIManager::IsRunawayStateChange(this, (CPlayer *)pAttacker))
{
GSTATEMACHINE.SetState(this, eMA_RUNAWAY);
return;
}
// 档框 夸没
// YH 秋橇 罐栏搁 肚 秋橇窍绊 肚 秋橇 窍绊 窍绰 版快啊 惯积
// 秋橇甫 罐疽阑锭唱 固胶(傍拜芭府)锭绰 芹橇夸没 救窃
if(pDamageInfo->RealDamage != 0)
CHelpRequestManager::MonsterRequestProcess(this);
if(CAIManager::IsTargetChange((CPlayer *)pAttacker, this))
{
SetTObject((CPlayer *)pAttacker);
}
/*if( m_pTObject )
{
if(m_pSInfo->TargetChange)
{
SetTObject((CPlayer *)pAttacker);
}
}
else
{
SetTObject((CPlayer *)pAttacker);
}*/
GSTATEMACHINE.SetState(this, eMA_ATTACK);
}
void CMonster::SetLife(DWORD Life,BOOL bSendMsg)
{
ASSERT(Life <= m_pSInfo->Life);
m_MonsterInfo.Life = Life;
}
void CMonster::SetShield(DWORD Shield,BOOL bSendMsg)
{
ASSERT(Shield <= m_pSInfo->Shield);
m_MonsterInfo.Shield = Shield;
}
void CMonster::DoDie(CObject* pAttacker)
{
DWORD AttackerID;
if(pAttacker == NULL)
AttackerID = 0;
else
AttackerID = pAttacker->GetID();
REGENNPC_OBJ->ReleaseMonsterGroup(((CMonster*)this)->GetMonsterGroupNum());
OBJECTSTATEMGR_OBJ->StartObjectState(this,eObjectState_Die,AttackerID);
OBJECTSTATEMGR_OBJ->EndObjectState(this,eObjectState_Die,MONSTERREMOVE_TIME);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -