778 lines
18 KiB
C++
778 lines
18 KiB
C++
#include "StdAfx.h"
|
||
#include "FuBenManager.h"
|
||
#include "../base/Container.hpp"
|
||
|
||
CFuBenHandleMgr* CFuBenManager::m_FuBenMgr; //
|
||
SceneHandleMgr* CFuBenManager::m_SceneMgr;
|
||
CFuBenManager::RefreshPara CFuBenManager::m_RefreshPara;
|
||
EntityVector* CFuBenManager::m_pVisibleList;
|
||
//FubenHandleList::LinkNodeMgr* FubenHandleList::g_LinkNodeMgr;
|
||
|
||
CFuBenManager::CFuBenManager(void)
|
||
{
|
||
ZeroMemory(m_anFubenCount, sizeof(m_anFubenCount));
|
||
m_vMuiltyFbMap.clear();
|
||
}
|
||
|
||
VOID CFuBenManager::Destroy()
|
||
{
|
||
// 删除动态FB场景
|
||
#ifdef _USE_TRY_CATCH
|
||
#ifdef WIN32
|
||
__try
|
||
#endif
|
||
#endif
|
||
{
|
||
CLinkedNode<CFuBen*> *pNode;
|
||
CLinkedListIterator<CFuBen*> it(m_vAllFbList);
|
||
for (pNode = it.first(); pNode; pNode = it.next())
|
||
{
|
||
CFuBen* pFb = pNode->m_Data;
|
||
if (pFb)
|
||
{
|
||
pFb->ExitAllActor();
|
||
m_FuBenMgr->Release(pFb->GetHandle());//关闭副本,所有玩家会先退出副本
|
||
it.remove(pNode);
|
||
}
|
||
}
|
||
|
||
// 删除静态FB场景
|
||
for(int i = 0; i < m_vStaticFbList.count(); i++)
|
||
{
|
||
CFuBen* pFb = m_vStaticFbList[i];
|
||
if (pFb)
|
||
{
|
||
m_FuBenMgr->Release(pFb->GetHandle());//里面会执行副本的析构函数
|
||
}
|
||
}
|
||
m_vStaticFbList.clear();
|
||
|
||
// 删除预创建的动态FB(暂时还未用到的动态副本)
|
||
for (INT_PTR i = 0; i < m_FreeFbList.count(); i++)
|
||
{
|
||
FUBENVECTOR* pFbList = m_FreeFbList[i];
|
||
if (pFbList)
|
||
{
|
||
for(int j = 0; j < pFbList->count(); j++)
|
||
{
|
||
CFuBen* pFb = (*pFbList)[j];
|
||
if (pFb)
|
||
{
|
||
m_FuBenMgr->Release(pFb->GetHandle());//里面会执行副本的析构函数
|
||
}
|
||
}
|
||
pFbList->clear();
|
||
delete pFbList;
|
||
}
|
||
}
|
||
m_FreeFbList.clear();
|
||
|
||
// 删除地图数据
|
||
for(int i = 0; i < m_vMapDataList.count(); i++)
|
||
{
|
||
MAPDATA* md = m_vMapDataList[i];
|
||
if(md) {
|
||
delete md->pMapData;
|
||
delete md;
|
||
}
|
||
|
||
}
|
||
m_vMapDataList.clear();
|
||
|
||
}
|
||
|
||
#ifdef _USE_TRY_CATCH
|
||
#ifdef WIN32
|
||
__except(CustomExceptHandler(GetExceptionInformation()))
|
||
{
|
||
}
|
||
#endif
|
||
#endif
|
||
}
|
||
|
||
CFuBenManager::~CFuBenManager(void)
|
||
{
|
||
Destroy();
|
||
}
|
||
|
||
CFuBen* CFuBenManager::CreateFuBen(int nFbId)
|
||
{
|
||
// 验证FBId的有效性
|
||
if ((nFbId < 0) || (nFbId >= m_vStaticFbList.count()))
|
||
{
|
||
return NULL;
|
||
}
|
||
|
||
// 若为多人副本,则先看看是否已生成
|
||
if (m_vStaticFbList[nFbId]->GetConfig()->nFbEnterType == 2)
|
||
{
|
||
if(m_vMuiltyFbMap.find(nFbId) != m_vMuiltyFbMap.end())
|
||
return m_vMuiltyFbMap[nFbId];
|
||
}
|
||
|
||
CFuBen* newFb = NULL;
|
||
#ifndef REUSEFB
|
||
newFb = AllocNewFb(nFbId);
|
||
#else
|
||
// 看是否有空闲的副本
|
||
FUBENVECTOR* pList = m_FreeFbList[nFbId];
|
||
if (pList && pList->count() > 0)
|
||
{
|
||
newFb = (*pList)[pList->count()-1];
|
||
pList->remove(pList->count()-1);
|
||
newFb->OnReuse();
|
||
newFb->SetFreeFlag(false);
|
||
}else
|
||
{
|
||
// 没有空闲副本,创建一个新的Fb
|
||
newFb = AllocNewFb(nFbId);
|
||
}
|
||
#endif
|
||
m_vAllFbList.linkAtLast(newFb);
|
||
|
||
if(newFb)
|
||
{
|
||
if(GetLogicServer()->GetLocalClient())
|
||
{
|
||
}
|
||
|
||
// 若为多人副本,则记录
|
||
if (newFb->GetConfig()->nFbEnterType == 2)
|
||
{
|
||
m_vMuiltyFbMap[nFbId] = newFb;
|
||
}
|
||
|
||
// 创建副本事件
|
||
CScriptValueList paramList;
|
||
paramList << (int)CFubenSystem::enOnCreate;
|
||
paramList << (int)newFb->GetConfig()->nFbConfType;
|
||
paramList << (int)newFb->GetFbId();
|
||
paramList << (int)newFb->GetConfig()->nFbEnterType;
|
||
paramList << newFb;
|
||
if(!GetGlobalLogicEngine()->GetGlobalNpc()->GetScript().CallModule("FubenDispatcher","OnEvent", paramList, paramList, 1))
|
||
{
|
||
OutputMsg(rmError,"[FubenSystem] OnEvent OnCreate 错误,副本ID=%d,副本类型=%d !",newFb->GetFbId(),newFb->GetConfig()->nFbConfType);
|
||
}
|
||
}
|
||
return newFb;
|
||
}
|
||
|
||
VOID CFuBenManager::ReleaseFuBen(CFuBen* pFuBen)
|
||
{
|
||
// 常规副本不能这里关闭
|
||
if (!pFuBen->IsFb())
|
||
return;
|
||
|
||
// 动态副本关闭 -- 这里怎么没有加入到自由副本列表中,而是直接删除了??
|
||
CLinkedNode<CFuBen*> *pNode;
|
||
CLinkedListIterator<CFuBen*> it(m_vAllFbList);
|
||
for (pNode = it.first(); pNode; pNode = it.next())
|
||
{
|
||
CFuBen* pFbInList = pNode->m_Data;
|
||
if (pFbInList == pFuBen)
|
||
{
|
||
// 若为多人副本,则取消记录
|
||
if (pFuBen->GetConfig()->nFbEnterType == 2)
|
||
{
|
||
int nFbId = pFuBen->GetFbId();
|
||
if(m_vMuiltyFbMap.find(nFbId) != m_vMuiltyFbMap.end())
|
||
{
|
||
pFuBen->ExitAllActor();
|
||
m_vMuiltyFbMap.erase(m_vMuiltyFbMap.find(nFbId));
|
||
return;
|
||
}
|
||
|
||
}
|
||
|
||
//把所有玩家退出副本先
|
||
pFuBen->ExitAllActor();
|
||
m_FuBenMgr->Release(pFbInList->GetHandle());//里面会执行副本的析构函数
|
||
it.remove(pNode);
|
||
|
||
break;
|
||
}
|
||
}
|
||
|
||
}
|
||
|
||
INT_PTR CFuBenManager::ReloadNpcScript(LPCTSTR szSceneName,LPCTSTR szNpcName)
|
||
{
|
||
INT_PTR result = 0;
|
||
INT_PTR nCount = m_vStaticFbList.count();
|
||
if (m_vStaticFbList.count() > 0)
|
||
{
|
||
CFuBen* pFuBen = m_vStaticFbList[0];
|
||
if (pFuBen)
|
||
{
|
||
result += pFuBen->ReloadNpcScript(szSceneName,szNpcName);
|
||
}
|
||
}
|
||
|
||
CLinkedNode<CFuBen*> *pNode;
|
||
CLinkedListIterator<CFuBen*> it(m_vAllFbList);
|
||
for (pNode = it.first(); pNode; pNode = it.next())
|
||
{
|
||
CFuBen* pFuBen = pNode->m_Data;
|
||
if (pFuBen)
|
||
{
|
||
result += pFuBen->ReloadNpcScript(szSceneName,szNpcName);
|
||
}
|
||
}
|
||
//空闲的副本npc也要重置
|
||
for (INT_PTR i = 0; i < m_FreeFbList.count(); i++)
|
||
{
|
||
FUBENVECTOR* pFbList = m_FreeFbList[i];
|
||
if (pFbList)
|
||
{
|
||
for(int j = 0; j < pFbList->count(); j++)
|
||
{
|
||
CFuBen* pFuBen = (*pFbList)[j];
|
||
if (pFuBen)
|
||
{
|
||
result += pFuBen->ReloadNpcScript(szSceneName,szNpcName);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
return result;
|
||
}
|
||
|
||
void CFuBenManager::ResetFbRefresh()
|
||
{
|
||
m_RefreshPara.setFB(NULL);
|
||
m_RefTimer.SetNextHitTime(0);
|
||
}
|
||
|
||
void CFuBenManager::TraceRefreshPos()
|
||
{
|
||
char * pFbName="static";
|
||
int nFbId= -1;
|
||
if(CFuBenManager::m_RefreshPara.pFuben && CFuBenManager::m_RefreshPara.pFuben->GetConfig())
|
||
{
|
||
pFbName= "Fuben";
|
||
nFbId = (int)CFuBenManager::m_RefreshPara.pFuben->GetFbId();
|
||
}
|
||
TICKCOUNT nCurrentTick = _getTickCount(); //
|
||
TICKCOUNT nNextTick =m_RefTimer.GetNextTime();
|
||
|
||
int nDis =(int)( nNextTick - nCurrentTick);
|
||
|
||
if(nDis <0)
|
||
{
|
||
nDis =0;
|
||
}
|
||
int nScenePos = m_RefreshPara.nScenePos;
|
||
int nMonsterPos = m_RefreshPara.nRefreshPos;
|
||
OutputMsg(rmNormal,"Current Fb=%s,fbid=%d,dis= %d,scenePos=%d,monsterPos=%d",pFbName,nFbId,nDis,nScenePos,nMonsterPos);
|
||
}
|
||
|
||
//调试场景的信息
|
||
void CFuBenManager::Trace()
|
||
{
|
||
INT_PTR nCount = m_vStaticFbList.count();
|
||
CFuBen* pFuBen = m_vStaticFbList[0];
|
||
|
||
|
||
TraceRefreshPos();
|
||
|
||
for(INT_PTR i=0; i<m_vStaticFbList.count(); i++ )
|
||
{
|
||
CFuBen* pFuBen = m_vStaticFbList[i];
|
||
if(pFuBen)
|
||
{
|
||
pFuBen->Trace();
|
||
}
|
||
}
|
||
|
||
CLinkedNode<CFuBen*> *pNode;
|
||
CLinkedListIterator<CFuBen*> it(m_vAllFbList);
|
||
for (pNode = it.first(); pNode; pNode = it.next())
|
||
{
|
||
CFuBen* pFuBen = pNode->m_Data;
|
||
if(pFuBen)
|
||
{
|
||
pFuBen->Trace();
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
VOID CFuBenManager::RunOne()
|
||
{
|
||
DECLARE_TIME_PROF("CFuBenManager::RunOne");
|
||
SF_TIME_CHECK(); //检测性能
|
||
|
||
//执行每个副本的runone
|
||
TICKCOUNT nStartTick = _getTickCount(); //自行开始
|
||
if (!m_RefTimer.CheckAndSet(nStartTick))
|
||
return;
|
||
|
||
TICKCOUNT nLoopLimit = GetLoopTickLimit();
|
||
|
||
INT_PTR nCount = m_vStaticFbList.count();
|
||
if (nCount > 0)
|
||
{
|
||
CFuBen* pFuBen = m_vStaticFbList[0];
|
||
//找到上次执行到的副本
|
||
if ( pFuBen->RunOne() )
|
||
{
|
||
//SetLoopTickCount(_getTickCount() -nStartTick);
|
||
return;
|
||
}
|
||
}
|
||
|
||
//暂时屏蔽,外网可能有问题
|
||
/*
|
||
if(m_FreeFbTimer.CheckAndSet(nStartTick))
|
||
{
|
||
// 定时释放多余的空闲副本
|
||
for (INT_PTR i = 0; i < m_FreeFbList.count(); i++)
|
||
{
|
||
FUBENVECTOR* pFbList = m_FreeFbList[i];
|
||
if (pFbList && pFbList->count() > 2)
|
||
{
|
||
for(int j = pFbList->count() - 1; j >1 ; j--)
|
||
{
|
||
CFuBen* pFb = (*pFbList)[j];
|
||
if (pFb)
|
||
{
|
||
m_FuBenMgr->Release(pFb->GetHandle());//里面会执行副本的析构函数
|
||
pFbList->remove(j);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
*/
|
||
|
||
// 处理动态副本的更新
|
||
CLinkedNode<CFuBen*> *pNode;
|
||
CLinkedListIterator<CFuBen*> it(m_vAllFbList);
|
||
for (pNode = it.first(); pNode; pNode = it.next())
|
||
{
|
||
CFuBen* pFuBen = pNode->m_Data;
|
||
int ret = pFuBen->RunOne();
|
||
if (ret == 2)
|
||
{
|
||
OutputMsg(rmTip,_T("release fuben!fubenid=%d,fhandle=%lld,freeFbCount=%d"),pFuBen->GetFbId(),pFuBen->GetHandle(),m_FreeFbList.count());
|
||
pFuBen->ExitAllActor();
|
||
#ifndef REUSEFB
|
||
m_FuBenMgr->Release(pFuBen->GetHandle());
|
||
#else
|
||
//放到空闲列表
|
||
bool boAdd = false;
|
||
if (m_FreeFbList.count() > pFuBen->GetFbId())
|
||
{
|
||
FUBENVECTOR* pList = m_FreeFbList[pFuBen->GetFbId()];
|
||
if (pList)
|
||
{
|
||
pList->add(pFuBen);
|
||
pFuBen->Reset();
|
||
pFuBen->SetFreeFlag(true);
|
||
boAdd = true;
|
||
if(m_vMuiltyFbMap.find(pFuBen->GetFbId()) != m_vMuiltyFbMap.end()) {
|
||
m_vMuiltyFbMap.erase(m_vMuiltyFbMap.find(pFuBen->GetFbId()));
|
||
return;
|
||
}
|
||
|
||
}
|
||
}
|
||
if (!boAdd)
|
||
{
|
||
m_FuBenMgr->Release(pFuBen->GetHandle());
|
||
}
|
||
#endif
|
||
it.remove(pNode);
|
||
}
|
||
else if (ret == 1 || _getTickCount() - nStartTick > nLoopLimit )
|
||
{
|
||
//SetLoopTickCount(_getTickCount() -nStartTick);
|
||
return;
|
||
}
|
||
}
|
||
m_RefreshPara.setFB(NULL);
|
||
//SetLoopTickCount(_getTickCount() -nStartTick);
|
||
}
|
||
|
||
bool CFuBenManager::EnterFuBen(CEntity * pEntity,CFuBen* pFuBen ,INT_PTR nScenceID,INT_PTR nPosX, INT_PTR nPosY,int nType, int nValue, int nParam )
|
||
{
|
||
if(pEntity ==NULL) return false;
|
||
if(pFuBen ==NULL)
|
||
{
|
||
pFuBen = m_vStaticFbList[0];
|
||
}
|
||
if(pFuBen ==NULL)
|
||
{
|
||
OutputMsg(rmWaning,_T("Enter fb fail for no such fb,nScenceID=%d"),nScenceID);
|
||
return false;
|
||
}
|
||
|
||
CFuBen* pDyFb = NULL;
|
||
CScene* pScene = NULL;
|
||
if(pEntity->GetType() == enActor)
|
||
{
|
||
pDyFb = ((CActor*)pEntity)->GetFuBen();
|
||
pScene = ((CActor*)pEntity)->GetScene();
|
||
}
|
||
|
||
return pFuBen->Enter(pEntity,nScenceID,nPosX,nPosY,0,0,nType, nValue, nParam,pScene, pDyFb);
|
||
|
||
//return pFuBen->Enter(pEntity,nScenceID,nPosX,nPosY,0,0,nType, nValue, nParam);
|
||
}
|
||
|
||
|
||
bool CFuBenManager::GetFbPtrBySceneName(LPCTSTR sName, CFuBen *& pRetFb, CScene *& pRetScene)
|
||
{
|
||
CScene * pScene =NULL;
|
||
pRetFb =NULL;
|
||
pRetScene =NULL;
|
||
for(INT_PTR i =0 ; i< m_vStaticFbList.count(); i++)
|
||
{
|
||
CFuBen *pFb = m_vStaticFbList[i];
|
||
if(pFb )
|
||
{
|
||
pScene = pFb->GetSceneByName(sName);
|
||
if(pScene)
|
||
{
|
||
pRetFb = m_vStaticFbList[i];
|
||
pRetScene = pScene;
|
||
return true;
|
||
}
|
||
}
|
||
}
|
||
return false;
|
||
}
|
||
|
||
bool CFuBenManager::GetFbPtrBySceneId( unsigned int nSceneID, CFuBen *& pRetFb, CScene *& pRetScene)
|
||
{
|
||
CScene * pScene =NULL;
|
||
pRetFb =NULL;
|
||
pRetScene =NULL;
|
||
for(INT_PTR i =0 ; i< m_vStaticFbList.count(); i++)
|
||
{
|
||
CFuBen *pFb = m_vStaticFbList[i];
|
||
if(pFb )
|
||
{
|
||
pScene = pFb->GetScene(nSceneID);
|
||
if(!pScene)
|
||
{
|
||
continue;
|
||
}
|
||
pRetFb = m_vStaticFbList[i];
|
||
pRetScene = pScene;
|
||
return true;
|
||
}
|
||
}
|
||
return false;
|
||
}
|
||
|
||
|
||
VOID CFuBenManager::AddStaticFuBen(CFuBen* pFb)
|
||
{
|
||
//Assert(pFb);
|
||
m_vStaticFbList.add(pFb);
|
||
}
|
||
|
||
|
||
bool CFuBenManager::GetFbPtrBySceneId( unsigned int nFbId, int nSceneID, CFuBen *& pRetFb, CScene *& pRetScene)
|
||
{
|
||
CScene * pScene =NULL;
|
||
pRetFb =NULL;
|
||
pRetScene =NULL;
|
||
CFuBen *pFb = NULL;
|
||
|
||
// 验证FBId的有效性
|
||
if (nFbId >= m_vStaticFbList.count())
|
||
{
|
||
return false;
|
||
}
|
||
|
||
if (m_vStaticFbList[nFbId]->GetConfig()->nFbEnterType == 2)
|
||
{
|
||
if(m_vMuiltyFbMap.find(nFbId) != m_vMuiltyFbMap.end())
|
||
{
|
||
pFb = m_vMuiltyFbMap[nFbId];
|
||
pScene = pFb->GetScene(nSceneID);
|
||
}
|
||
}
|
||
if(!pFb)
|
||
{
|
||
for(INT_PTR i =0 ; i< m_vStaticFbList.count(); i++)
|
||
{
|
||
pFb = m_vStaticFbList[i];
|
||
if(pFb) {
|
||
pScene = pFb->GetScene(nSceneID);
|
||
if(pScene)
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
if(!pFb && !pScene ) return false;
|
||
pRetFb = pFb;
|
||
pRetScene = pScene;
|
||
return true;
|
||
|
||
}
|
||
|
||
CAbstractMap* CFuBenManager::GetMapData(const char* szFileName)
|
||
{
|
||
MAPDATA* data = NULL;
|
||
for(int i = 0; i < m_vMapDataList.count(); i++)
|
||
{
|
||
data = m_vMapDataList[i];
|
||
if (data && strcmp(szFileName,data->szFileName) == 0)
|
||
{
|
||
return data->pMapData;
|
||
}
|
||
}
|
||
//暂时没有数据,读入
|
||
data = new MAPDATA();
|
||
_asncpytA(data->szFileName,szFileName);
|
||
data->pMapData = new CAbstractMap();
|
||
data->pMapData->LoadFromFile(szFileName);
|
||
m_vMapDataList.add(data);
|
||
return data->pMapData;
|
||
}
|
||
|
||
bool CFuBenManager::GetVisibleList(CEntity * pEntity,EntityVector& vVisibleList,int nLeft,int nRight,int nUp,int nDown)
|
||
{
|
||
//根据实体的场景handle取得场景
|
||
//const ENTITYPOS& Pos = pEntity->GetPosInfo();
|
||
//CScene* pScene = Pos.pScene;//m_SceneMgr->GetDataPtr(Pos.nSceneHandler);
|
||
CScene* pScene = pEntity->GetScene();
|
||
if (pScene != NULL)
|
||
{
|
||
return pScene->GetVisibleList(pEntity,vVisibleList,nLeft,nRight,nUp,nDown);
|
||
}
|
||
return false;
|
||
}
|
||
|
||
bool CFuBenManager::GetVisibleList(CEntity * pEntity,CObserverEntityList& vVisibleList,int nLeft,int nRight,int nUp,int nDown, bool *pbActorInVisibleList)
|
||
{
|
||
//根据实体的场景handle取得场景
|
||
const ENTITYPOS& Pos = pEntity->GetPosInfo();
|
||
CScene* pScene = Pos.pScene;//m_SceneMgr->GetDataPtr(Pos.nSceneHandler);
|
||
if (pScene != NULL)
|
||
{
|
||
int nPosX,nPosY;
|
||
pEntity->GetPosition(nPosX,nPosY);
|
||
return pScene->GetVisibleList(nPosX, nPosY,vVisibleList,nLeft,nRight,nUp,nDown,pbActorInVisibleList);
|
||
}
|
||
return false;
|
||
}
|
||
|
||
bool CFuBenManager::GetSeqVisibleList(CEntity * pEntity, SequenceEntityList& visibleList,int nLeft,int nRight,int nUp,int nDown)
|
||
{
|
||
if (!pEntity)
|
||
return false;
|
||
int nPosX,nPosY;
|
||
pEntity->GetPosition(nPosX,nPosY);
|
||
//根据实体的场景handle取得场景
|
||
const ENTITYPOS& Pos = pEntity->GetPosInfo();
|
||
CScene* pScene = Pos.pScene;//m_SceneMgr->GetDataPtr(Pos.nSceneHandler);
|
||
if (pScene != NULL)
|
||
{
|
||
return pScene->GetSeqVisibleList(nPosX, nPosY, visibleList, nLeft,nRight,nUp,nDown);
|
||
}
|
||
return false;
|
||
}
|
||
|
||
COMMONFUBENCONFIG* CFuBenManager::GetConfig(int nFbid)
|
||
{
|
||
if ((nFbid >= 0) && (nFbid < m_vStaticFbList.count()))
|
||
{
|
||
CFuBen *pFb = m_vStaticFbList[nFbid];
|
||
if(pFb )
|
||
{
|
||
return pFb->GetConfig();
|
||
}
|
||
}
|
||
return NULL;
|
||
}
|
||
|
||
int CFuBenManager::GetFbCountFromId( UINT nFbid,UINT* pList,size_t nBufSize )
|
||
{
|
||
int ret = 0;
|
||
CLinkedNode<CFuBen*> *pNode;
|
||
CLinkedListIterator<CFuBen*> it(m_vAllFbList);
|
||
for (pNode = it.first(); pNode; pNode = it.next())
|
||
{
|
||
CFuBen* pFbInList = pNode->m_Data;
|
||
if (pFbInList->GetConfig()->nFbId == nFbid)
|
||
{
|
||
pList[ret++] = pFbInList->GetHandle();
|
||
}
|
||
}
|
||
return ret;
|
||
}
|
||
|
||
|
||
void CFuBenManager::RefreshMonster()
|
||
{
|
||
for (INT_PTR i = 0; i < m_vStaticFbList.count(); i++)
|
||
{
|
||
CFuBen* pFB = m_vStaticFbList[i];
|
||
if(pFB) {
|
||
pFB->RefreshMonster();
|
||
}
|
||
}
|
||
}
|
||
|
||
unsigned int CFuBenManager::TotalAllSceneMonsterCount()
|
||
{
|
||
unsigned int nTotalCount = 0;
|
||
for (INT_PTR i = 0; i < m_vStaticFbList.count(); i++)
|
||
{
|
||
CFuBen* pFB = m_vStaticFbList[i];
|
||
if(pFB) {
|
||
nTotalCount += pFB->TotalSceneMonsterCount();
|
||
}
|
||
}
|
||
return nTotalCount;
|
||
}
|
||
|
||
CFuBen* CFuBenManager::AllocNewFb( int nFbId,bool boRun )
|
||
{
|
||
// 验证FBId的有效性
|
||
if ((nFbId < 0) || (nFbId >= m_vStaticFbList.count()))
|
||
{
|
||
return NULL;
|
||
}
|
||
|
||
CFuBen* newFb = NULL;
|
||
CFuBen* fuben = m_vStaticFbList[nFbId];
|
||
//从内存管理中获取一个新的CFuBen
|
||
CFuBenHandle hHandle;
|
||
newFb = m_FuBenMgr->Acquire(hHandle);
|
||
fuben->Clone(*newFb,boRun);
|
||
newFb->SetHandle( hHandle );
|
||
if (nFbId < ArrayCount(m_anFubenCount))
|
||
m_anFubenCount[nFbId]++;
|
||
return newFb;
|
||
}
|
||
|
||
void CFuBenManager::Dump()
|
||
{
|
||
OutputMsg(rmNormal, _T("-------------------Dump Fuben Info-------------------"));
|
||
INT_PTR nCount = ArrayCount(m_anFubenCount);
|
||
for (INT_PTR i = 0; i < nCount; i++)
|
||
{
|
||
if (m_anFubenCount[i] > 0)
|
||
OutputMsg(rmNormal, _T("Fuben[%-2d] count:%-4d"), (int)i, m_anFubenCount[i]);
|
||
}
|
||
OutputMsg(rmNormal, _T("-------------------Dump Fuben Info-------------------"));
|
||
}
|
||
|
||
void CFuBenManager::DumpFbDataAlloc(wylib::stream::CBaseStream& stream)
|
||
{
|
||
if(m_SceneMgr)
|
||
{
|
||
TCHAR szBuff[MAX_PATH] = {0};
|
||
int FuBenSize = m_SceneMgr->GetUserDataSize();
|
||
_stprintf(szBuff, _T("m_SceneMgr:%d\r\n"),FuBenSize);
|
||
CBuffAllocStatHelper::WriteStrToStream(stream, szBuff);
|
||
|
||
}
|
||
if(m_FuBenMgr)
|
||
{
|
||
TCHAR szBuff[MAX_PATH] = {0};
|
||
int FuBenSize = m_FuBenMgr->GetUserDataSize();
|
||
_stprintf(szBuff, _T("m_FuBenMgr:%d\r\n"),FuBenSize);
|
||
CBuffAllocStatHelper::WriteStrToStream(stream, szBuff);
|
||
}
|
||
}
|
||
|
||
bool CFuBenManager::IsNeedShowFubenForm(int nFbId)
|
||
{
|
||
INT_PTR nCount = GetLogicServer()->GetDataProvider()->GetVocationConfig()->nDefualtFb.count();
|
||
if(nCount > 0)
|
||
{
|
||
for(INT_PTR i=0;i<nCount;i++)
|
||
{
|
||
CRESTEDEFAULTFb &tmpDefaultFb = GetLogicServer()->GetDataProvider()->GetVocationConfig()->nDefualtFb[i];
|
||
if(tmpDefaultFb.nFbId == nFbId)
|
||
{
|
||
return false;
|
||
}
|
||
}
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
void CFuBenManager::GetRandomCreatePos(int nToken,int& nScenceID,int& nPosX,int& nPosY)
|
||
{
|
||
INT_PTR nCount = GetLogicServer()->GetDataProvider()->GetVocationConfig()->nDefualtFb.count();
|
||
if(nCount <= 0)
|
||
{
|
||
return;
|
||
}
|
||
|
||
for(INT_PTR i=0;i<nCount;i++)
|
||
{
|
||
CRESTEDEFAULTFb &tmpDefaultFb = GetLogicServer()->GetDataProvider()->GetVocationConfig()->nDefualtFb[i];
|
||
if(tmpDefaultFb.nToken == nToken)
|
||
{
|
||
if(tmpDefaultFb.nPosCount > 0)
|
||
{
|
||
int nRandIndex = wrandvalue() % tmpDefaultFb.nPosCount;
|
||
if(nRandIndex >= 0 && nRandIndex < tmpDefaultFb.nPosCount && tmpDefaultFb.nCreatePos[nRandIndex].nScenceID > 0)
|
||
{
|
||
nScenceID = tmpDefaultFb.nCreatePos[nRandIndex].nScenceID;
|
||
nPosX = tmpDefaultFb.nCreatePos[nRandIndex].nPosX;
|
||
nPosY = tmpDefaultFb.nCreatePos[nRandIndex].nPosY;
|
||
}
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
void CFuBenManager::CreateFreeFb()
|
||
{
|
||
#ifdef REUSEFB
|
||
m_FreeFbList.add(NULL);
|
||
for (INT_PTR i = 1; i < m_vStaticFbList.count(); i++)
|
||
{
|
||
CFuBen* pFb = m_vStaticFbList[i];//fb的id必须是连续的
|
||
if (pFb)
|
||
{
|
||
FUBENVECTOR* pList = new FUBENVECTOR();
|
||
m_FreeFbList.add(pList);
|
||
for (INT_PTR j = 0; j < 2; j++)
|
||
{
|
||
CFuBen* pFree = AllocNewFb(pFb->GetFbId(),false);
|
||
pList->add(pFree);
|
||
pFree->SetFreeFlag(true);
|
||
}
|
||
}
|
||
}
|
||
#endif
|
||
}
|
||
|
||
CFuBen* CFuBenHandleMgr::GetDataPtr( CFuBenHandle handle )
|
||
{
|
||
CFuBen* pfb = Inherited::GetDataPtr(handle);
|
||
if (pfb && !pfb->IsFree())
|
||
{
|
||
return pfb;
|
||
}
|
||
return NULL;
|
||
}
|
||
|
||
const CFuBen* CFuBenHandleMgr::GetDataPtr( CFuBenHandle handle ) const
|
||
{
|
||
const CFuBen* pfb = Inherited::GetDataPtr(handle);
|
||
if (pfb && !((CFuBen*)pfb)->IsFree())
|
||
{
|
||
return pfb;
|
||
}
|
||
return NULL;
|
||
}
|
||
|
||
CFuBenHandleMgr::CFuBenHandleMgr(LPCTSTR lpszDesc):Inherited(lpszDesc)
|
||
{
|
||
}
|
||
|