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

📄 objectmanager.cpp

📁 墨香最新私服
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// ObjectManager.cpp: implementation of the CObjectManager class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "ObjectManager.h"

#include "Hero.h"
#include "Object.h"


#include "AppearanceManager.h"
#include "MoveManager.h"

#include "ItemManager.h"
#include "MugongManager.h"
#include "StatsCalcManager.h"
#include "ObjectStateManager.h"
#include "PeaceWarModeManager.h"
#include "PartyManager.h"
#include "Effect\EffectManager.h"
#include "AbilityManager.h"

#include "SkillArea.h"
#include "SkillObject_Client.h"
#include "GameIn.h"
#include "ObjectBalloon.h"

#include "MonsterGuageDlg.h"
#include "WantedManager.h"


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

DWORD gHeroID = 0;
DWORD gUserID = 0;
GLOBALTON(CObjectManager);

CObjectManager::CObjectManager()
{
	m_pHero			= NULL;
	m_pCharCalcMgr	= CHARCALCMGR;
	m_ObjectTable.Initialize(1024);
	
	m_PlayerPool.Init(MAX_PLAYEROBJECT_NUM, 50, "CPlayer");
	m_MonsterPool.Init(MAX_MONSTEROBJECT_NUM, 50, "CMonster");
	m_NpcPool.Init(MAX_NPCOBJECT_NUM, 50, "CNpc");
	m_BossMonsterPool.Init(MAX_MONSTEROBJECT_NUM, 50, "CBossMonster");
	m_TacticObjectPool.Init(MAX_TACTICOBJECT_NUM, 50, "CTactic");

	m_SelectedObjectID	= 0;
	m_pDPObjectName		= NULL;

	m_dwOverInfoOption	= eOO_NAME_CLICKEDONLY;
	m_bAllNameShow		= FALSE;

	for(int i = 0 ; i < eBOSSTYPE_MAX ; ++i)
		m_pBoss[i] = NULL;
}

CObjectManager::~CObjectManager()
{
}


void CObjectManager::AddShadow(CObject* pObject)
{
	if(pObject->GetObjectKind() == eObjectKind_Player)
	{
		if(((CPlayer*)pObject)->m_CharacterInfo.bVisible == FALSE)
		{
			RemoveShadow(pObject);
			return;
		}
	}

	BYTE bShadow = GAMERESRCMNGR->m_GameDesc.bShadow;
	if(bShadow == MHSHADOW_CIRCLE || bShadow == MHSHADOW_DETAIL)
	{		
		if(pObject == HERO && bShadow == MHSHADOW_DETAIL)
			pObject->GetEngineObject()->EnableShadow(TRUE);
		else
		{
			pObject->GetEngineObject()->EnableShadow(FALSE);
			pObject->m_ShadowObj.Init("sh.mod",NULL,eEngineObjectType_Effect,0,-1);
			pObject->m_ShadowObj.ApplyHeightField(TRUE);
		}
	}
	else
	{
		pObject->GetEngineObject()->EnableShadow(FALSE);
	}
}

void CObjectManager::RemoveShadow(CObject* pObject)
{
	if(pObject->m_ShadowObj.IsInited())
	{
		pObject->m_ShadowObj.Release();
	}
	pObject->GetEngineObject()->EnableShadow(FALSE);
}

void CObjectManager::RegisterHero(SEND_HERO_TOTALINFO * sendHeroTotalInfo)
{
	m_pHero = new CHero;
	m_pHero->Init(eObjectKind_Player, &sendHeroTotalInfo->BaseObjectInfo);
	m_pHero->InitPlayer(&sendHeroTotalInfo->ChrTotalInfo);
	m_pHero->InitHero(&sendHeroTotalInfo->HeroTotalInfo);
	gHeroID = m_pHero->GetID();
	m_pHero->InitObjectBalloon(ObjectBalloon_Name | ObjectBalloon_Chat | ObjectBalloon_Title | ObjectBalloon_MunpaMark );

	
	ABILITYMGR->InitAbility(m_pHero,&sendHeroTotalInfo->AbilityInfo,m_pHero->GetAbilityGroup());
	ABILITYMGR->InitAbilityExp(m_pHero->GetAbilityGroup(),sendHeroTotalInfo->HeroTotalInfo.AbilityExp);
	PEACEWARMGR->InitPeace_WarMode(m_pHero);
	APPEARANCEMGR->InitAppearance(m_pHero);
	
	
	BASEMOVE_INFO moveInfo;
	moveInfo.SetFrom(&sendHeroTotalInfo->SendMoveInfo);	
	
	MOVEMGR->InitMove(m_pHero,&moveInfo);
	OBJECTSTATEMGR->InitObjectState(m_pHero);
	
	//ITEMMGR->InitOwnItem(&sendHeroTotalInfo->ItemTotalInfo);
	ITEMMGR->InitItemOption(sendHeroTotalInfo->OptionInfo, sendHeroTotalInfo->OptionNum);
	ITEMMGR->NetworkMsgParse(MP_ITEM_TOTALINFO_LOCAL, &sendHeroTotalInfo->ItemTotalInfo);
	MUGONGMGR->NetworkMsgParse(MP_MUGONG_TOTALINFO_LOCAL, &sendHeroTotalInfo->MugongTotalInfo);
	

	m_ObjectTable.Add(m_pHero,m_pHero->GetID());


	// 牢磐其捞胶俊 利侩
	m_pHero->ApplyInterface();
	ABILITYMGR->UpdateAbilityState(ABILITYUPDATE_ABILITYLEVEL_CHANGED,0,m_pHero->GetAbilityGroup());

	ApplyOverInfoOption( m_pHero );
	ApplyShadowOption( m_pHero );

//KES 040117
	m_pHero->GetEngineObject()->DisablePick();
	
/*
	//////////////////////////////////////////////////////////////////////////
	// 烙矫 内靛 -0- YH
	if(m_pHero->GetBattleID() != 0)
	{
		if(m_pHero->GetBattleTeam() == 0)
		{
			OBJECTEFFECTDESC desc(761);
			m_pHero->AddObjectEffect( BATTLE_TEAMEFFECT_ID, &desc, 1 );
		}
		else
		{
			OBJECTEFFECTDESC desc(764);
			m_pHero->AddObjectEffect( BATTLE_TEAMEFFECT_ID, &desc, 1 );
		}
	}
	//////////////////////////////////////////////////////////////////////////
*/	
	STATSMGR->CalcItemStats(HERO);

	return;
}
CPlayer* CObjectManager::AddPlayer(BASEOBJECT_INFO* pBaseObjectInfo,BASEMOVE_INFO* pMoveInfo,CHARACTER_TOTALINFO* pTotalInfo)
{
	CObject* pPreObj = GetObject(pBaseObjectInfo->dwObjectID);
	ASSERT(pPreObj == NULL);
	if(pPreObj)
	{
		RemoveObject(&pPreObj);
	}

	CPlayer* pPlayer = m_PlayerPool.Alloc();
	

	pPlayer->Init(eObjectKind_Player,pBaseObjectInfo);
	pPlayer->InitPlayer(pTotalInfo);
	pPlayer->InitObjectBalloon(ObjectBalloon_Name | ObjectBalloon_Chat | ObjectBalloon_Title | ObjectBalloon_MunpaMark );

	PEACEWARMGR->InitPeace_WarMode(pPlayer);
	APPEARANCEMGR->InitAppearance(pPlayer);

	MOVEMGR->InitMove(pPlayer,pMoveInfo);	
	OBJECTSTATEMGR->InitObjectState(pPlayer);

	m_ObjectTable.Add(pPlayer,pPlayer->GetID());

	ApplyOverInfoOption( pPlayer );
	ApplyShadowOption( pPlayer );

	return pPlayer;
}
CMonster* CObjectManager::AddMonster(BASEOBJECT_INFO* pBaseObjectInfo,BASEMOVE_INFO* pMoveInfo,MONSTER_TOTALINFO* pTotalInfo)
{
//	LOGFILE("MP_USERCONN_MONSTER_ADD\t%d\t%s",pBaseObjectInfo->dwObjectID,pBaseObjectInfo->ObjectName);

	CObject* pPreObj = GetObject(pBaseObjectInfo->dwObjectID);
	ASSERT(pPreObj == NULL);
	if(pPreObj)
	{
//		LOGFILE("Overlapped\t%s",OBJECTLOG(pPreObj));
		RemoveObject(&pPreObj);
	}
	ASSERT(pTotalInfo->MonsterKind != 0);

	CMonster* pMonster = m_MonsterPool.Alloc();
	pMonster->Init(eObjectKind_Monster,pBaseObjectInfo);
	pMonster->InitMonster(pTotalInfo);
	pMonster->InitObjectBalloon(ObjectBalloon_Name | ObjectBalloon_Chat);

	APPEARANCEMGR->InitAppearance(pMonster);

	MOVEMGR->InitMove(pMonster,pMoveInfo);

	OBJECTSTATEMGR->InitObjectState(pMonster);

	m_ObjectTable.Add(pMonster,pMonster->GetID());

	ApplyOverInfoOption( pMonster );
	ApplyShadowOption( pMonster );

	return pMonster;
}
CBossMonster* CObjectManager::AddBossMonster(BASEOBJECT_INFO* pBaseObjectInfo,BASEMOVE_INFO* pMoveInfo,MONSTER_TOTALINFO* pTotalInfo)
{
	CBossMonster * pBoss = NULL;
	CObject* pPreObj = GetObject(pBaseObjectInfo->dwObjectID);
	ASSERT(pPreObj == NULL);
	if(pPreObj)
	{
		RemoveObject(&pPreObj);
	}
	switch(pTotalInfo->MonsterKind)
	{
	case eBOSSKIND_GENERAL:
		{
			pBoss = m_pBoss[eBOSSTYPE_GENERAL] = m_BossMonsterPool.Alloc();
		}
		break;
	case eBOSSTYPE_YUKJI:
		{
			pBoss = m_pBoss[eBOSSTYPE_YUKJI] = m_BossMonsterPool.Alloc();
		}
		break;
	}
	
	pBoss->Init(eObjectKind_BossMonster, pBaseObjectInfo);
	pBoss->InitMonster(pTotalInfo);
	pBoss->InitObjectBalloon(ObjectBalloon_Name | ObjectBalloon_Chat);

	APPEARANCEMGR->InitAppearance(pBoss);
	MOVEMGR->InitMove(pBoss,pMoveInfo);
	
	OBJECTSTATEMGR->InitObjectState(pBoss);

	m_ObjectTable.Add(pBoss,pBoss->GetID());

	ApplyOverInfoOption( pBoss );
	ApplyShadowOption( pBoss );	
	
	return pBoss;
}
CNpc* CObjectManager::AddNpc(BASEOBJECT_INFO* pBaseObjectInfo,BASEMOVE_INFO* pMoveInfo,NPC_TOTALINFO* pTotalInfo)
{
	CNpc* pNpc = m_NpcPool.Alloc();
	pNpc->Init(eObjectKind_Npc,pBaseObjectInfo);
	pNpc->InitNpc(pTotalInfo);
	pNpc->InitObjectBalloon(ObjectBalloon_Name);
	pNpc->m_MoveInfo.CurPosition.x = 0;
	pNpc->m_MoveInfo.CurPosition.y = 0;
	pNpc->m_MoveInfo.CurPosition.z = 0;

	APPEARANCEMGR->InitAppearance(pNpc);
	MOVEMGR->InitMove(pNpc,pMoveInfo);

	OBJECTSTATEMGR->InitObjectState(pNpc);
	
	m_ObjectTable.Add(pNpc,pNpc->GetID());

	ApplyOverInfoOption( pNpc );
	ApplyShadowOption( pNpc );

	return pNpc;
}
CTacticObject* CObjectManager::AddTacticObject(BASEOBJECT_INFO* pBaseObjectInfo,TACTIC_TOTALINFO* pTotalInfo)
{
	CObject* pPreObj = GetObject(pBaseObjectInfo->dwObjectID);
	ASSERT(pPreObj == NULL);

	CTacticObject* pTObj = m_TacticObjectPool.Alloc();
	pTObj->Init(eObjectKind_Tactic,pBaseObjectInfo);
	pTObj->InitTacticObject(pTotalInfo);
	
	BASEMOVE_INFO moveinfo;
	moveinfo.bMoving = FALSE;
	moveinfo.CurPosition.x = pTotalInfo->Pos.x;
	moveinfo.CurPosition.y = pTotalInfo->Pos.y;
	moveinfo.CurPosition.z = pTotalInfo->Pos.z;
	MOVEMGR->InitMove(pTObj,&moveinfo,DIRTODEG(pTotalInfo->Direction));

	OBJECTSTATEMGR->InitObjectState(pTObj);
	
	m_ObjectTable.Add(pTObj,pTObj->GetID());

	return pTObj;
}

void CObjectManager::AddSkillObject(CSkillObject* pSObj)
{
	CObject* pPreObj = GetObject(pSObj->GetID());
	ASSERT(pPreObj == NULL);
	if(pPreObj)
	{
		RemoveObject(&pPreObj);
	}

	m_ObjectTable.Add(pSObj,pSObj->GetID());
}

void CObjectManager::RemoveAllObject()
{
	m_ObjectTable.SetPositionHead();
	CObject* pObject;
	while(pObject = m_ObjectTable.GetData())
	{
		RemoveObject(&pObject);
	}
	m_ObjectTable.RemoveAll();
	
	m_SelectedObjectID	= 0;
	m_bAllNameShow		= FALSE;
	//
}

void CObjectManager::RemoveObject(CObject** ppObject)
{
	if(*ppObject)
	{
//		LOGFILE("RemoveObject\t%s",OBJECTLOG(*ppObject));

		m_ObjectTable.Remove((*ppObject)->GetID());

//		if(*ppObject == GetDPObject())
//			SetDPObject(NULL);

		if(m_SelectedObjectID == (*ppObject)->GetID() )
		{
			m_SelectedObjectID = 0;
			if(GAMEIN->GetMonsterGuageDlg())
				GAMEIN->GetMonsterGuageDlg()->SetActive(FALSE);
		}

		int kind = (*ppObject)->GetObjectKind();
		(*ppObject)->Release();
		if((*ppObject) == HERO)
		{
			delete (*ppObject);
			m_pHero = NULL;
		}
		else
		{
			switch(kind)
			{
			case eObjectKind_Player:
				m_PlayerPool.Free((CPlayer*)*ppObject);
				break;
			case eObjectKind_Monster:
				m_MonsterPool.Free((CMonster*)*ppObject);
				break;
			case eObjectKind_Npc:
				m_NpcPool.Free((CNpc*)*ppObject);
				break;
			case eObjectKind_Tactic:
				m_TacticObjectPool.Free((CTacticObject*)*ppObject);
				break;
			case eObjectKind_SkillObject:
				// DO Nothing
				break;
				
			case eObjectKind_BossMonster:
				m_BossMonsterPool.Free((CBossMonster*)*ppObject);
				break;
			default:
				{
				ASSERT(0);
				}
			}
		}
		*ppObject = NULL;		
	}
}

void CObjectManager::AddGarbageObject(CObject* pObject)
{
	RemoveObject(&pObject);
/*	m_ObjectTable.Remove(pObject->GetID());

	if(pObject->GetObjectKind() == eObjectKind_SkillObject)
	{
		RemoveObject(&pObject);
	}
	else
	{
		m_GarbageObjectList.AddTail(pObject);
	}
*/
}

void CObjectManager::ProcessGarbage()
{
	CObject* pObject;
	while(pObject = (CObject*)m_GarbageObjectList.RemoveTail())
	{
		RemoveObject(&pObject);
	}
}

CObject* CObjectManager::GetObject(DWORD dwObjectID)
{
	return m_ObjectTable.GetData(dwObjectID);
}

void CObjectManager::GetTargetInRange(VECTOR3* pPivotPos,float Radius,ObjectArray<LPOBJECT>* pObjectArray,BOOL bPK)
{
	pObjectArray->Init();
	m_ObjectTable.SetPositionHead();
	CObject* pObject;
	VECTOR3 ObjectPos;
	float dist;
	float dx,dz;
	while(pObject = m_ObjectTable.GetData())
	{
		if( pObject->GetObjectKind() == eObjectKind_Npc ||
			pObject->GetObjectKind() == eObjectKind_Tactic )
			continue;

		if(pObject->IsDied() == TRUE)
			continue;
		
		if(pObject->GetObjectKind() == eObjectKind_SkillObject)
		{
			if(((CSkillObject*)pObject)->IsLifeObject() == FALSE)
				continue;
		}

		pObject->GetPosition(&ObjectPos); 
		dx = (pPivotPos->x - ObjectPos.x);
		dz = (pPivotPos->z - ObjectPos.z);
		dist = sqrtf(dx*dx + dz*dz) - pObject->GetRadius();
		if(dist <= Radius)
			pObjectArray->AddObject(pObject);
	}
}

void CObjectManager::GetTargetInArea(CHero* pHero,CSkillArea* pSkillArea,ObjectArray<LPOBJECT>* pObjectArray,BOOL bPK)
{
	CObject* pObject;
	VECTOR3 ObjectPos;
	
	pObjectArray->Init();
	m_ObjectTable.SetPositionHead();

	while(pObject = m_ObjectTable.GetData())
	{
		if( pObject->GetObjectKind() == eObjectKind_Npc ||
			pObject->GetObjectKind() == eObjectKind_Tactic )
			continue;

⌨️ 快捷键说明

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