📄 objectmanager.cpp
字号:
// 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 + -