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

📄 monster.cpp

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