Files
mir_server/server/LogicServer/base/BossManager.cpp
aixianling 5c9f1dae4a init
2025-01-09 17:45:40 +08:00

514 lines
18 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "StdAfx.h"
using namespace jxInterSrvComm::DbServerProto;
CBossManager::CBossManager()
{
m_IsInited = false;
m_nBossReferList.clear();
m_nWaitBossReferList.clear();
}
CBossManager::~CBossManager()
{
}
// 请求DBServer加载数据
VOID CBossManager::Load()
{
// CDataClient* pDbClient = GetLogicServer()->GetDbClient();
// if (pDbClient->connected())
// {
// CDataPacket& dataPacket =pDbClient->allocProtoPacket(jxInterSrvComm::DbServerProto::dcLoadBossInfo);
// int nServerId = GetLogicServer()->GetServerIndex();
// dataPacket << nServerId << nServerId;
// GetLogicServer()->GetDbClient()->flushProtoPacket(dataPacket);
// }
}
// 推送数据到DBServer进行存储
VOID CBossManager::Save()
{
// CDataClient* pDbClient = GetLogicServer()->GetDbClient();
// if (pDbClient->connected())
// {
// CDataPacket& dataPacket = GetLogicServer()->GetDbClient()->allocProtoPacket(jxInterSrvComm::DbServerProto::dcSaveBossInfo);
// int nServerId = GetLogicServer()->GetServerIndex();
// dataPacket << nServerId << nServerId;
// int nCount = 0;
// INT_PTR pos = dataPacket.getPosition();
// dataPacket << nCount;
// // 运行中的活动
// std::map<int, BOSSREFERINFO>::iterator runIter = m_nBossRefers.begin();
// for (;runIter != m_nBossRefers.end(); ++runIter)
// {
// BOSSREFERINFO& boss = (*runIter).second;
// dataPacket.writeBuf(&boss.nBossInfo, sizeof(boss.nBossInfo));
// nCount++;
// }
// int* pCount = (int*)dataPacket.getPositionPtr(pos);
// *pCount = nCount;
// GetLogicServer()->GetDbClient()->flushProtoPacket(dataPacket);
// }
}
// 处理DBServer返回数据
VOID CBossManager::OnDbReturnData(INT_PTR nCmd, char * data, SIZE_T size)
{
// int nRawServerId, nLoginServerId;
// unsigned int nGid = 0;
// CDataPacketReader inPacket(data,size);
// BYTE nErrorCode;
// inPacket >> nRawServerId >> nLoginServerId >> nErrorCode;
// switch(nCmd)
// {
// case dcLoadBossInfo:
// if (nErrorCode == reSucc)
// {
// int nCount = 0;
// inPacket >> nCount;
// // 加载进行中活动列表
// BOSSREFERINFO boss;
// for(int i = 0; i < nCount; ++i)
// {
// inPacket.readBuf(&boss.nBossInfo,sizeof(boss.nBossInfo));
// // if(boss.nBossInfo.nDeath == 0)
// // {
// // boss.nBossInfo.nReferTime = 0;
// // }
// boss.nBossInfo.nDeath = 0;
// boss.bNeedRefer = true;
// boss.nBossInfo.nReferTime = 0;
// SetReferBossBasicInfo(boss);
// m_nBossRefers[boss.nBossInfo.nBossId] = boss;
// m_RunBossRefer.insert(&m_nBossRefers[boss.nBossInfo.nBossId]);
// }
// // 加载等待列表
// std::map<int,BOSSCONFIGINFO>& bossCfg = GetLogicServer()->GetDataProvider()->GetMonsterConfig().GetBossInfoList();
// std::map<int,BOSSCONFIGINFO>::iterator iter = bossCfg.begin();
// for (; iter != bossCfg.end(); iter++)
// {
// BOSSCONFIGINFO& cfg = (*iter).second;
// if(cfg.nTab == 0)
// continue;
// // 已在刷新列表
// if (m_nBossRefers.find(iter->first) != m_nBossRefers.end())
// {
// continue;
// }
// BOSSREFERINFO boss;
// boss.nBossInfo.nBossId = iter->first;
// SetReferBossBasicInfo(boss);
// m_nWaitBossRefer[boss.nBossInfo.nBossId] = boss;
// // 不在刷新列表中并将来会开放的boss则放入等待列表
// }
// // 初始化完成
// m_IsInited = true;
// }
// else
// {
// OutputMsg(rmError,_T("Guild LoadGuildListResult Error!code=%d"),nErrorCode);
// }
// break;
// }
}
bool CBossManager::CheckCondition(int nOpenCircle, int nOpenDay)
{
//转生 和开服天数 都为0 表示直接开启
if(nOpenCircle && !GetGlobalLogicEngine()->GetGlobalVarMgr().GetCountByCircleLevel(nOpenCircle))
return false;
if(nOpenDay && !GetLogicServer()->CheckOpenServer(nOpenDay))
return false;
return true;
}
// 帧处理
VOID CBossManager::RunOne(TICKCOUNT nTickCount)
{
if (IsInited())
{
// UINT nNow = time(NULL);
int nNow = GetGlobalLogicEngine()->getMiniDateTime();
if (m_2sTimer.CheckAndSet(nTickCount))
{
BossIterator waitIter = m_nWaitBossReferList.begin();
for (;waitIter != m_nWaitBossReferList.end();)
{
BOSSREFERINFO& boss = waitIter->second;
BOSSCONFIGINFO* pOneBoss = GetLogicServer()->GetDataProvider()->GetMonsterConfig().GetBossInfoById(boss.nBossId);
if(pOneBoss && CheckCondition(pOneBoss->nOpenCircle, pOneBoss->nOpenDay))
{
// 放入运行列表
if(m_nBossReferList.find(boss.nBossId) != m_nBossReferList.end())
{
OutputMsg(rmError,"[boss] bossId=%d !",(int)boss.nBossId);
}
boss.nReferTime = pOneBoss->GetNextReferTime(boss.nReferTime);
boss.bNeedRefer = true;
boss.bIsPush = true;
boss.nDeath = 1;
m_nBossReferList[boss.nBossId] = boss;
m_RunningReferList.insert(&m_nBossReferList[boss.nBossId]);
m_nMapBossList[pOneBoss->nMapId].push_back(&m_nBossReferList[boss.nBossId]);
// 删除
waitIter = m_nWaitBossReferList.erase(waitIter);
}else
{
waitIter++;
}
}
}
if (m_1sTimer.CheckAndSet(nTickCount))
{
RunBossIter runIter = m_RunningReferList.begin();
for (;runIter != m_RunningReferList.end(); ++runIter)
{
BOSSREFERINFO& boss = *(*runIter);
if(boss.nReferTime <= nNow)
{
if(boss.nDeath == 1 && boss.bNeedRefer)
{
BOSSCONFIGINFO* pOneBoss = GetLogicServer()->GetDataProvider()->GetMonsterConfig().GetBossInfoById(boss.nBossId);
if(pOneBoss )
{
if(!boss.bIsPush && pOneBoss->nNotice == 1)
{
GetGlobalLogicEngine()->GetEntityMgr()->BroadcastTipmsg(pOneBoss->nContent, tstBigRevolving);
}
if(pOneBoss->nShowwindow) {
char bossId[10] = {0};
sprintf_s(bossId, sizeof(bossId), "%d", pOneBoss->nSerial);
GetGlobalLogicEngine()->GetEntityMgr()->BroadcastTipmsg(bossId, tstBossRelive);
}
boss.bIsPush = true;
boss.nReferTime = pOneBoss->GetNextReferTime(boss.nReferTime);
BossCallLuaScript(boss.nBossId, CBossSystem::enOnInit);
}
boss.nDeath = 0;
CreateBossEntity(boss);
}
}
// else
// {
// break;
// }
}
}
}
}
void CBossManager::CreateBossEntity(BOSSREFERINFO& boss)
{
// CScene* pScene = NULL;
BOSSCONFIGINFO* pOneBoss = GetLogicServer()->GetDataProvider()->GetMonsterConfig().GetBossInfoById(boss.nBossId);
if(pOneBoss )
{
CScene* pScene = NULL;
CFuBen * pRetFb =NULL;
GetGlobalLogicEngine()->GetFuBenMgr()->GetFbPtrBySceneId(pOneBoss->nFubenId, pOneBoss->nMapId, pRetFb, pScene);
if(!pScene) return;
int nBossId = boss.nBossId%BOSSSOCAIL_MUTIPLY;
if(boss.bNeedRefer && boss.nDeath == 0)
{
BOSSGROWDATA* pGrowCfg = GetLogicServer()->GetDataProvider()->GetMonsterConfig().GetBossGrowDataById(nBossId);
if(pGrowCfg)
{
boss.nBossLv = pGrowCfg->GetBossGrowLv( GetLogicServer()->GetDaysSinceOpenServer(), GetGlobalLogicEngine()->GetTopTitleMgr().GetTopMaxLevel(), &GetGlobalLogicEngine()->GetGlobalVarMgr());
boss.nBuffAddValue = pGrowCfg->GetBuffAddValue(boss.nBossLv);
}
REFRESHCONFIG referCfg;
referCfg.nEntityId =nBossId;
referCfg.nMobX = boss.nReferX;
referCfg.nMobY = boss.nReferY;
referCfg.nMobRange = boss.nReferRange;
referCfg.nEntityLevel = boss.nBossLv;
int nCount = 1;
CEntity* pMoster = CreateBossEntity(boss, referCfg, pScene, nCount);
if(pMoster)
{
boss.bNeedRefer = false;
}
}
}
}
void CBossManager::CreateBossEntity(CScene* pScene)
{
// CScene* pScene = NULL;
// GetGlobalLogicEngine()->GetFuBenMgr()->GetFbPtrBySceneId(nSceneId, NULL, pScene);
if(!pScene) return;
int nBuffValue = 0;
int nReferMapId = pScene->GetSceneId();
MapBossIter runIter = m_nMapBossList.find(nReferMapId);
if(runIter != m_nMapBossList.end())
{
if(runIter->second.size() == 0)
return;
int nSize = runIter->second.size();
for(int i = 0; i < nSize; i++)
{
BOSSREFERINFO& boss = *(runIter->second[i]);
int nBossId = boss.nBossId%BOSSSOCAIL_MUTIPLY;
if(boss.bNeedRefer && boss.nDeath == 0)
{
BOSSGROWDATA* pGrowCfg = GetLogicServer()->GetDataProvider()->GetMonsterConfig().GetBossGrowDataById(nBossId);
if(pGrowCfg)
{
boss.nBossLv = pGrowCfg->GetBossGrowLv( GetLogicServer()->GetDaysSinceOpenServer(), GetGlobalLogicEngine()->GetTopTitleMgr().GetTopMaxLevel(), &GetGlobalLogicEngine()->GetGlobalVarMgr());
boss.nBuffAddValue = pGrowCfg->GetBuffAddValue(boss.nBossLv);
}
REFRESHCONFIG referCfg;
referCfg.nEntityId =nBossId;
referCfg.nMobX = boss.nReferX;
referCfg.nMobY = boss.nReferY;
referCfg.nMobRange = boss.nReferRange;
referCfg.nEntityLevel = boss.nBossLv;
int nCount = 1;
CEntity* pMoster = CreateBossEntity(boss, referCfg, pScene, nCount);
if(pMoster)
{
boss.bNeedRefer = false;
}
}
}
}
}
CEntity* CBossManager::CreateBossEntity(BOSSREFERINFO& boss, REFRESHCONFIG& referCfg, CScene* pScene, int Index)
{
if(!pScene) return NULL;
INT_PTR nMonsterPosX = 0;//pRefreshConf->Points[seed].x;
INT_PTR nMonsterPosY = 0;//pRefreshConf->Points[seed].y;
if (!pScene->GetMobMonsterXY(&referCfg,nMonsterPosX,nMonsterPosY))
{
return NULL;
}
static CLogicDataProvider *pProvider = GetLogicServer()->GetDataProvider();
PMONSTERCONFIG pMonsterConfig = pProvider->GetMonsterConfig().GetMonsterData(referCfg.nEntityId);
if(pMonsterConfig == NULL) return NULL;
//这里属于配置有问题
switch (pMonsterConfig->btEntityType )
{
case enActor:
case enHero:
case enPet:
return NULL;
}
//boss.nBuffAddValue = 200;
if (boss.nBuffAddValue < 100)
boss.nBuffAddValue = 100;
CEntity* pEntity = pScene->CreateEntityAndEnterScene(referCfg.nEntityId,
pMonsterConfig->btEntityType,
nMonsterPosX,nMonsterPosY,-1,NULL,
referCfg.nLiveTime, 0,NULL, 0,boss.nBuffAddValue);
if(pEntity)
{
pEntity->SetProperty<unsigned int>(PROP_MONSTER_BELONG_ID, 0);
CMonster *pMonster = ((CMonster*)pEntity);
pMonster->SetBossReferId(boss.nBossId);
OutputMsg(rmTip, "monster %d, nBuffAddValue:%d", pMonster->GetBossReferId(),boss.nBuffAddValue);
}
}
BOSSREFERINFO* CBossManager::GetBossInfo(int nBossId)
{
BossIterator it = m_nBossReferList.find(nBossId);
if(it != m_nBossReferList.end())
{
return &(it->second);
}
return NULL;
}
void CBossManager::BossDeath(int nBossId)
{
// OutputMsg(rmTip, "BossDeath =%d", nBossId);
BossIterator it = m_nBossReferList.find(nBossId);
if(it != m_nBossReferList.end())
{
OutputMsg(rmTip, "boss find sucess =%d", nBossId);
BOSSREFERINFO& boss = it->second;
boss.nDeath = 1;
boss.bNeedRefer = true;
boss.bIsPush = false;
unsigned int nTime = GetGlobalLogicEngine()->getMiniDateTime();
BOSSCONFIGINFO* pOneBoss = GetLogicServer()->GetDataProvider()->GetMonsterConfig().GetBossInfoById(boss.nBossId);
if(pOneBoss)
{
boss.nReferTime = pOneBoss->GetNextReferTime(nTime);
}
// if(pOneBoss && pOneBoss->nReborn == 2) //死亡递延
// boss.nReferTime = pOneBoss->GetNextReferTime(time(NULL));
// boss.nReferTime = pOneBoss->GetNextReferTime(time(NULL));
// 取消非活动副本Boss归属
int nTempBossId = boss.nBossId % BOSSSOCAIL_MUTIPLY;
CMonster* pMonster = GetGlobalLogicEngine()->GetEntityMgr()->GetMonsterPtrByEntityId(nTempBossId);
if ( pMonster )
{
pMonster->SetProperty<unsigned int>(PROP_MONSTER_BELONG_ID, 0);
}
}
}
bool CBossManager::GetBossInfoIsDeath(int nBossId)
{
BossIterator runIter = m_nBossReferList.begin();
for (;runIter != m_nBossReferList.end(); ++runIter)
{
BOSSREFERINFO& boss = runIter->second;
int nId = boss.nBossId % BOSSSOCAIL_MUTIPLY;
if(nId == nBossId )
{
if(boss.nDeath != 1)
return false;
}
}
return true;
}
int CBossManager::GetBossMinReferTime(int nBossId)
{
BossIterator runIter = m_nBossReferList.begin();
int nMinTime = 0;
for (;runIter != m_nBossReferList.end(); ++runIter)
{
BOSSREFERINFO& boss = runIter->second;
int nId = boss.nBossId % BOSSSOCAIL_MUTIPLY;
if(nId == nBossId && ( nMinTime == 0 || nMinTime > boss.nReferTime))
{
nMinTime = boss.nReferTime;
}
}
return nMinTime;
}
void CBossManager::SetReferBossBasicInfo(BOSSREFERINFO& boss)
{
BOSSCONFIGINFO* pBossCfg = GetLogicServer()->GetDataProvider()->GetMonsterConfig().GetBossInfoById(boss.nBossId);
if(pBossCfg)
{
boss.nReferX = pBossCfg->nBossX;
boss.nReferY = pBossCfg->nBossY;
boss.nReferRange = pBossCfg->nBossRange;
boss.nReferMapId = pBossCfg->nMapId;
BOSSGROWDATA* pGrowCfg = GetLogicServer()->GetDataProvider()->GetMonsterConfig().GetBossGrowDataById(pBossCfg->nBossId);
if(pGrowCfg)
{
boss.nBuffAddValue = pGrowCfg->GetBuffAddValue(boss.nBossLv);
}
}
}
//服务器启动就需要全部重新刷新boss
bool CBossManager::Initialize()
{
// 加载等待列表
std::map<int,BOSSCONFIGINFO>& bossCfg = GetLogicServer()->GetDataProvider()->GetMonsterConfig().GetBossInfoList();
std::map<int,BOSSCONFIGINFO>::iterator iter = bossCfg.begin();
for (; iter != bossCfg.end(); iter++)
{
BOSSCONFIGINFO& cfg = (*iter).second;
if(cfg.nTab == 0 || cfg.nReborn == 0)
continue;
// 已在刷新列表
if (m_nBossReferList.find(iter->first) != m_nBossReferList.end())
{
continue;
}
BOSSREFERINFO boss;
boss.nBossId = iter->first;
boss.bNeedRefer = true;
boss.nReferTime = cfg.GetNextReferTime(boss.nReferTime);
boss.bIsPush = true;
boss.nDeath = 1;
SetReferBossBasicInfo(boss);
//if(GetGlobalLogicEngine()->GetGlobalVarMgr().GetCountByCircleLevel(cfg.nOpenCircle) && GetLogicServer()->CheckOpenServer(cfg.nOpenDay))
if(CheckCondition(cfg.nOpenCircle, cfg.nOpenDay))
{
m_nBossReferList[boss.nBossId] = boss;
m_RunningReferList.insert(&m_nBossReferList[boss.nBossId]);
m_nMapBossList[cfg.nMapId].push_back(&m_nBossReferList[boss.nBossId]);
}
else
{
m_nWaitBossReferList[boss.nBossId] = boss;
}
}
// 初始化完成
m_IsInited = true;
return true;
}
void CBossManager::BossCallLuaScript(int nBossId, int nType, CActor* pActor, CDataPacket* data)
{
BOSSCONFIGINFO* pOneBoss = GetLogicServer()->GetDataProvider()->GetMonsterConfig().GetBossInfoById(nBossId);
if(pOneBoss)
{
int nMonsterType = 1;
int nid = nBossId % BOSSSOCAIL_MUTIPLY;
PMONSTERCONFIG pMonsterConfig = GetLogicServer()->GetDataProvider()->GetMonsterConfig().GetMonsterData(nid);
if(pMonsterConfig)
{
nMonsterType = pMonsterConfig->btMonsterType;
}
CScriptValueList paramList,retList;
paramList << (int)nMonsterType;//(int)EnBossEvent::enOnCancel;
paramList << (int)nType;//(int)EnBossEvent::enOnCancel;
paramList << (int)pOneBoss->nFubenId;
paramList << (int)pOneBoss->nMapId;
paramList << (int)nBossId;
paramList << pActor;
paramList << data;
if(!GetGlobalLogicEngine()->GetGlobalNpc()->GetScript().CallModule("MonDispatcher","OnEvent", paramList, retList, 1))
{
OutputMsg(rmError,"[MonDispatcher] OnEvent nType 错误页签类型ID=%d场景=%d bossId= %d !",pOneBoss->nTab,pOneBoss->nMapId, nBossId);
}
}
}