Files
mir_server/server/LogicServer/LogicEngine.h

547 lines
18 KiB
C
Raw Normal View History

2025-01-09 17:45:40 +08:00
#pragma once
//class CComponentManager;
#include "JXAbsGameMap.h"
//多倍活动结构
typedef struct tagActivityRate
{
CommonActivityId m_nActivityId; //活动id
float m_fActRate; //当前活动经验倍率
UINT m_uRateTime; //多倍结束时间
}ACTIVITYRATE;
class CLogicEngine :
public wylib::thread::CBaseThread
{
public:
typedef CBaseThread Inherited;
public:
//逻辑处理统一TICKCOUNT
static TICKCOUNT nCurrTickCount;
//全局功能脚本文件路径
static LPCTSTR szGlobalFuncScriptFile;
//全局怪物脚本文件路径
static LPCTSTR szMonsterFuncScriptFile;
//任务脚本文件
static LPCTSTR szQuestNpcFile;
//物品脚本文件
static LPCTSTR szItemNpcFile;
public:
CLogicEngine();
~CLogicEngine();
//启动逻辑引擎
BOOL StartEngine();
//停止逻辑引擎
VOID StopEngine();
/*
* Comments:
* @Return VOID:
*/
VOID InitComponent()
{
if (HasDbDataInit())
return;
m_GlobalVarMgr.Load();
m_ActivityMgr.Load();
m_BossMgr.Load();
m_RankingMgr.LoadBaseRankData();
m_MiscMgr.Init();
m_ConsignmentMgr.Load();
m_MailMgr.Load();
OnDbInitData();
}
//保存
VOID SaveComponent()
{
if (!HasDbDataInit())
return;
m_GlobalVarMgr.Save();
m_ActivityMgr.Save();
m_BossMgr.Save();
m_ConsignmentMgr.SaveConsignItemToDb();
m_GuildMgr.SaveAllGuildEvent();
m_GuildMgr.SaveGuildApplyReslut();
}
/* 设置主逻辑循环性能参数
* dwTimeLimit
* nLoopCount
* dwSleep
*/
inline VOID setMainLoopPerformanceParam(TICKCOUNT dwTimeLimit, INT_PTR nLoopCount, TICKCOUNT dwSleep)
{
m_dwMainLoopTimeLimit = dwTimeLimit;
m_nMainLoopLimit = nLoopCount;
m_dwMainLoopSleep = dwSleep;
}
/* 获取主逻辑循环性能参数 */
inline VOID getMainLoopPerformanceParam(TICKCOUNT& dwTimeLimit, INT_PTR& nLoopCount, TICKCOUNT& dwSleep)
{
dwTimeLimit = m_dwMainLoopTimeLimit;
nLoopCount = m_nMainLoopLimit;
dwSleep = m_dwMainLoopSleep;
}
/* 获取上次主逻辑循环的性能统计值
* dwTimeConsume
* nLoopCount
*/
inline VOID getLastLoopPerformance(TICKCOUNT& dwTimeConsume, INT_PTR& nLoopCount)
{
dwTimeConsume = m_dwLastLoopTime;
nLoopCount = m_nLastLoopCount;
}
inline CEntityManager* GetEntityMgr(void){return &m_EntityMgr; }
inline CGuildComponent& GetGuildMgr(void) {return m_GuildMgr;}
inline CActivityComponent& GetActivityMgr(void) {return m_ActivityMgr;}
inline CFuBenManager* GetFuBenMgr(void) {return &m_FuBenMgr;}
inline CNetWorkMsgHandle* GetNetWorkHandle() { return &m_NetWorkHandle;}
inline CNpc* GetGlobalNpc() { return m_pGlobalFuncNpc;}
inline lua_State * GetGlobalNpcLua() { return m_pGlobalFuncNpc->GetScript().GetLuaState(); }
inline CNpc* GetMonFuncNpc() { return m_pMonFuncNpc; }
inline CNpc * GetItemNpc() { return m_pItemNpc;}
inline CRankingMgr& GetRankingMgr() { return m_RankingMgr;}
inline CGlobalVarMgr& GetGlobalVarMgr() { return m_GlobalVarMgr; }
inline CBossManager& GetBossMgr() { return m_BossMgr; }
inline CTopTitleMgr& GetTopTitleMgr() { return m_TopTitleMgr;}
inline CEncryptFunctionName & GetEncryptFuncMgr() {return m_EncryptFunctionMgr;}
inline CTeamManager& GetTeamMgr(){return m_teamMgr;} //获取队伍管理器
inline CScriptTimeCallManager& GetScriptTimeCallManager(){ return m_ScriptTimeCallMgr; }
inline CMiscMgr& GetMiscMgr() { return m_MiscMgr;}
inline CWorldLevelMgr& GetWorldLevelMgr() { return m_WorldLevelMgr;}
inline CConsignmentMgr& GetConsignmentMgr(){return m_ConsignmentMgr;}
inline CMailMgr& GetMailMgr(){return m_MailMgr;}
inline CTransmitMgr& GetTransmitMgr() { return m_TransmitMgr; }
inline CCrossMgr& GetCrossMgr() {return m_CrossMgr;}
//获取时间管理的组件
inline CTimeStatisticMgr* GetStatisticMgr(){return m_timeStatisticMgr; }
//获取聊天的组件
inline CChatManager & GetChatMgr(){return m_chatMgr;}
//获取公告的组件
inline CNoticeManager & GetNoticeMgr(){return m_NoticeMgr;}
inline CSimulatorMgr* GetSimulatorMgr() { return &m_SimulatorMgr;}
inline void SetUserItemSpId(int nSpId)
{
m_UserItemAllocator.SetSpid(nSpId);
}
inline void SetUserItemServerId(int nSvrId)
{
m_UserItemAllocator.SetServerIndex(nSvrId);
}
inline CUserItem::ItemSeries BuildMailSn()
{
return m_UserItemAllocator.BuildMailSn();
}
inline CUserItem::ItemSeries BuildNeedBuySn()
{
return m_UserItemAllocator.BuildNeedBuySn();
}
//返回离线玩家的管理器
inline COfflineUserMgr& GetOfflineUserMgr() {return m_offlineUserMgr;}
//返回跨服离线玩家的管理器
inline COfflineCenterUserMgr& GetOfflineCenterUserMgr() {return m_offlineCenterUserMgr;}
/*
* Comments:
* Param const bool boNewSeries:
* Param CUserItem * pTempUserItem:
* @Return CUserItem*:
*/
inline CUserItem* _CopyAllocUserItem(const bool boNewSeries,CUserItem *pTempUserItem, LPCSTR file, INT_PTR line)
{
CUserItem *pUserItem= _AllocUserItem(boNewSeries,file,line);
if(pUserItem == NULL)
{
OutputMsg(rmError,"[ItemTrace],AllocUserItem alloc return nil,file=%s,line=%d",file,(int)line);
return NULL;
}
else
{
memcpy(pUserItem,pTempUserItem,sizeof(CUserItem));
return pUserItem;
}
}
#define CopyAllocUserItem(boNewSeries,pTempUserItem) _CopyAllocUserItem(boNewSeries, pTempUserItem,__FILE__, __LINE__)
//申请用户物品对象boGenNewSeries参数用于决定是否分配新的物品系列号
inline CUserItem* _AllocUserItem(const bool boNewSeries, LPCSTR file, INT_PTR line )
{
return m_UserItemAllocator.allocItem(boNewSeries,file,line);
}
#define AllocUserItem(boNewSeries) _AllocUserItem(boNewSeries, __FILE__, __LINE__)
inline void _DestroyUserItem(CUserItem* pUserItem, LPCSTR file, INT_PTR line )
{
m_UserItemAllocator.DestroyUserItem(pUserItem,file,line);
}
#define DestroyUserItem(pUserItem) _DestroyUserItem(pUserItem, __FILE__, __LINE__)
//输出物品的使用情况
void TraceItem()
{
m_UserItemAllocator.TraceItem();
}
//申请实体消息
CEntityMsg* AllocEntityMsg(LPCSTR file, INT_PTR line );
//销毁实体消息
void __DestoryEntityMsg(CEntityMsg *pMsg,CEntity * pEntity,LPCSTR file, INT_PTR line);
#define DestoryEntityMsg(pMsg,pEntity) __DestoryEntityMsg(pMsg,pEntity,__FILE__,__LINE__)
//创建实体的特效
inline CEntityEffect* AllocEntityEffect(){ return m_EntityEffectAllocator.allocObject(); }
//删除实体的特效
inline void DestoryEntityEffect(CEntityEffect* pMsg){m_EntityEffectAllocator.freeObject(pMsg); }
//获取同步的系统逻辑日期和时间
inline SYSTEMTIME& getSysTime(){ return m_CurSysTime; }
//获取同步的系统TICKCOUNT
inline TICKCOUNT getTickCount(){ return m_dwCurTick; }
//获取同步的逻辑短日期时间值
inline unsigned int getMiniDateTime(){ return m_CurMiniDateTime; }
//判断是否同个星期 nRefreshDay:判断星期 0星期天为分界 1星期1分界
bool IsSameWeek(unsigned int t1, unsigned int t2, unsigned int nRefreshDay=0);
//判断是否同个月
bool IsSameMonth(unsigned int t1, unsigned int t2)
{
SYSTEMTIME st1, st2;
((CMiniDateTime)t1).decode(st1);
((CMiniDateTime)t2).decode(st2);
if (st1.wYear != st2.wYear || st1.wMonth != st2.wMonth) //判断是否同一个月
{
return false;
}
return true;
}
//获取当前在线的人数
inline int getOnlinceCount() {return (int)m_nOnliceCount;}
/*
* Comments:
* @Return INT_PTR:
*/
inline unsigned int GetRandValue()
{
return wrandvalue();
}
//返回 [0, nModule)
inline unsigned int GetRandValue(unsigned int nModule)
{
if (nModule ==0) return 0;
return ( (unsigned int) wrandvalue() + (unsigned int)_getTickCount() ) % (unsigned int) nModule;
}
//返回ai管理器
inline CAiMgr & GetAiMgr(){return m_aiMgr;}
//获取给脚本存储的动态数据
inline CCLVariant& GetDyanmicVar() { return m_DynamicVar; }
// 获取后台资源加载模块
inline CBackResLoadModule& GetBackResLoadModule() { return m_backLoadModule; }
// 重新加载物品配置数据
void reloadItemConfig();
//获取计分器管理器
inline CScoreRecorderManager& GetScoreRecorderManager(){ return m_ScoreRecorderManager; }
//获取数据包统计
inline CActorDataPacketStat& GetDataPacketStat() {return m_sPacketRecord;}
//获取是否统计数据包的标志
inline BOOL GetPacketRecordState() {return m_bTracePacketRecord;}
inline void SetPacketRecordState(bool bState) {m_bTracePacketRecord = bState;}
//设置服务器多少秒后自动停机维护,单位是秒
void SetStopServerTime(UINT nTime);
void CancelStopServer();
//发停服公告
void SendStopServerNotice();
/*
* Comments:
* Param INT_PTR nRate:
* Param INT_PTR nTime:0
* @Return INT_PTR:
*/
INT_PTR SetSysExpRate(INT_PTR nRate,INT_PTR nTime);
INT_PTR GetSysExpRate() { return (INT_PTR)m_ExpRate; }
/// @param nTime 持续时长
bool SetActivityCommonRate(CommonActivityId nActivityId,float nRate, INT_PTR nTime);
//获取活动多倍加成比率
float GetActivityCommonRate(CommonActivityId nActivityId);
/*
* Comments:
* @Return CActorMsgFilter&:
* @Remark:
*/
CActorMsgFilter& GetActorMsgFilter() { return m_AcotrMsgFilter; }
// 输出内存池详细信息
void DumpDataAllocator();
//发送消息给数据服务器停止数据服
void SendDbServerStop();
//引擎是否启动了
volatile BOOL inline IsEngineerRuning()
{
if( TRUE == InterlockedCompareExchange(&m_boEngineRunning, TRUE, TRUE))
{
return TRUE;
}
else
{
return FALSE;
}
}
//获取stringbuff
inline CStringBuff& GetStringBuff()
{
return m_strBuff;
}
/*
* Comments:
* Param bool isOpen:true表示开启,false不开启
* @Return void:
*/
inline void SetOpenPerfLog(bool isOpen)
{
m_bNeedPerfLog =isOpen;
CTimeProfDummy::SetOpenFlag(isOpen);
}
VOID AddDealToLog(int nLogid,
int nActorid,int nTarActorid,
INT nItemId=0,WORD nItemNum=0,WORD nMoneyType=0,INT64 nMoneyNum=0, int nDues = 0, unsigned int nServerId = 0);
/*
* Comments:
* Param WORD nLogid:
* Param int nActorid: id
* Param LPCTSTR szAccount:
* Param LPCTSTR szCharName:
* Param int nCount:
* Param int nPaymentCount:
* Param LPCTSTR szConsumeDescr:
* int nConsumeLevel:
* @Return VOID:
*/
VOID AddCosumeToLog(WORD nLogid,int nActorid,LPCTSTR szAccount,
LPCTSTR szCharName,BYTE nMoneytype,int nCount,int nPaymentCount,LPCTSTR szConsumeDescr=NULL,int nConsumeLevel=0, int nBalance = 0,unsigned int nServerId = 0);
//发送累计玩家的消费
void SendActorConsumeLog();
/*
* Comments:
* Param int nActorid: id
* Param LPCTSTR szAccount:
* Param LPCTSTR szCharName:
* Param LPCTSTR szMonName:
* Param LPCTSTR szSceneName:
* Param LPCTSTR szItemName:
* Param int nCount:
* Param int nPosx:x坐标
* Param int nPosy:y坐标
* @Return VOID:
*/
VOID AddKillDropToLog(int nActorid,LPCTSTR szAccount,LPCTSTR szCharName,LPCTSTR szMonName,
LPCTSTR szSceneName,LPCTSTR szItemName,int nCount,int nPosX, int nPosY,unsigned int nServerId = 0);
//发送击杀掉落统计
void SendKillDrop2Log();
/*
* Comments:
* Param int nActorid: id
* Param LPCTSTR szAccount:
* Param LPCTSTR szCharName:
* Param int nAtvId:id
* Param int nIndex:
* @Return VOID:
*/
VOID AddJoinAtvToLog(int nActorid,LPCTSTR szAccount,LPCTSTR szCharName,int nAtvId, int nIndex,unsigned int nServerId = 0);
void SendJoinAtv2Log();
void BackStageSetSecondPswFlag(bool boFlag);
bool GetSecondPswFlag() {return m_boSeoncdPswFlag;}
bool GetLoginSecondPswFlag() {return m_boLoginSecondPswFlag;}
void SetLoginSecondPsw()
{
m_boLoginSecondPswFlag = !m_boLoginSecondPswFlag;
}
static void PostAsyncWorkMsg(void* pCBData);
void SetPrintDamageInfo(bool v){ m_boPrintDamageInfo = v; }
bool IsPrintDamageInfo() { return m_boPrintDamageInfo; }
protected:
VOID OnRountine();
//virtual void OnThreadStarted();
//virtual void OnTerminated();
//单次逻辑处理
VOID LogicRun();
//逻辑引擎启动函数(由主逻辑线程启动时调用)
VOID LogicEngineStarted();
//逻辑引擎停止函数(由主逻辑线程即将退出前调用)
VOID LogicEngineStoped();
private:
//初始化保留场景
VOID InitReserveScene();
//初始化保留NPC
BOOL InitReserveNpc();
// 设置线程的亲和度
void SetThreadAffinite(DWORD_PTR dwMask);
//DB初始化子系统的数据完成
inline void OnDbInitData()
{
m_hasDbInitData =true;
}
//DB的数据是否初始化完毕
inline bool HasDbDataInit()
{
return m_hasDbInitData;
}
//销毁消息管理器
void TraceMsgMgr();
private:
static CTimeStatisticMgr* m_timeStatisticMgr; //时间统计组件
volatile LONG m_boEngineStarted; //逻辑引擎是否已经启动
volatile LONG m_boEngineRunning; //逻辑引擎正在运行
TICKCOUNT m_dwMainLoopTimeLimit; //主循环中每次循环时间限制,单位是毫秒
INT_PTR m_nMainLoopLimit; //主循环中每次循环处理逻辑数据次数限制
TICKCOUNT m_dwMainLoopSleep; //主循环中每次循环休眠时间,单位是毫秒
TICKCOUNT m_dwLastLoopTime; //上次完整逻辑循环消耗的时间,单位是毫秒
INT_PTR m_nLastLoopCount; //上次逻辑循环次数
#ifdef WIN32
HANDLE m_hStartEvent; //启动信号事件
HANDLE m_hStopEvent; //停止信号事件
#else
sem_t m_hStartEvent; //启动信号事件
sem_t m_hStopEvent; //停止信号事件
#endif
SYSTEMTIME m_CurSysTime; //当前系统日期和时间,每个循环更新一次
TICKCOUNT m_dwCurTick; //当前系统TICKCOUNT每个循环更新一次
CLogicServer * m_pLogicServer;
CEntityManager m_EntityMgr;
CRankingMgr m_RankingMgr; //排行榜管理器
CSimulatorMgr m_SimulatorMgr; //模拟人物管理器
CGlobalVarMgr m_GlobalVarMgr;
CBossManager m_BossMgr; //boss信息
CTopTitleMgr m_TopTitleMgr;
CMiscMgr m_MiscMgr;
CMailMgr m_MailMgr;
CWorldLevelMgr m_WorldLevelMgr;
CConsignmentMgr m_ConsignmentMgr;
CTransmitMgr m_TransmitMgr;
CCrossMgr m_CrossMgr;//跨服管理
CEncryptFunctionName m_EncryptFunctionMgr;
CNetWorkMsgHandle m_NetWorkHandle;
CFuBenManager m_FuBenMgr;
CMiniDateTime m_CurMiniDateTime; //当前短日期时间
COfflineUserMgr m_offlineUserMgr; //离线玩家的信息管理器
COfflineCenterUserMgr m_offlineCenterUserMgr;//跨服离线玩家数据
CTeamManager m_teamMgr; //队伍管理器
CScriptTimeCallManager m_ScriptTimeCallMgr; //脚本定时调用管理器
CChatManager m_chatMgr; //聊天管理器
CNoticeManager m_NoticeMgr; //公共管理器
CUserItemAllocator m_UserItemAllocator; //用户物品申请器
CActorMsgFilter m_AcotrMsgFilter; // 角色消息过滤器
CSingleObjectAllocator<CEntityMsg> m_EntityMsgAllocator;//实体消息内存管理器
CSingleObjectAllocator<CEntityEffect> m_EntityEffectAllocator; //实体的特效的内存管理器
jxcomm::gameMap::CAbstractMap m_ReserveMapData;//保留场景的地图数据
CScene* m_pReserveScene;//保留场景用于存放保留NPC
CNpc* m_pGlobalFuncNpc; //执行全局的脚本函数
CNpc* m_pMonFuncNpc;//全局怪物脚本
CNpc * m_pItemNpc; //物品npc
CAiMgr m_aiMgr; //ai管理器
unsigned int s_randSeed; //随机数种子,为了避免一个循环里取随机数相同
CTimer<0> m_CheckLuaMemTimer; //检查脚本内存管理器内存的定时器
CTimer<300000> m_SendOnlineCountTimer;//发送在线人数的定时器,1分钟一次
CTimer<120000> m_timeStatTimer;// 耗时分析,2分钟一次
INT_PTR m_nOnliceCount;//在线人数,每分钟更新
CCLVariant m_DynamicVar; //一个用来给脚本保存全局变量数据的变量数据不保存db
CBackResLoadModule m_backLoadModule; // 后台加载模块
CScoreRecorderManager m_ScoreRecorderManager;//计分器管理器
UINT m_StopServerTime; //停机维护倒计时0表示不停机
UINT m_StopServNoticeTimer; //停服公告每15s发一次
CStringBuff m_strBuff; //字符串缓冲器,用于大的字符串操作的
float m_ExpRate; //当前的系统经验倍率
//float m_ActExpRate; //当前活动经验倍率
UINT m_ExpRateTime;//系统经验倍率的过期时间即到期就恢复成0无加成经验
//UINT m_ActExpRateTime;
TICKCOUNT m_dwCheckOnlineSceneLog;//下次检查记录在线人数的场景信息
BOOL m_boOnlineSceneLoged; //是否已经记录在线人数的场景信息
TICKCOUNT m_dwActorConsumeLogTime; //发送消息的消费日志的间隔
TICKCOUNT m_dwKillDropLogTime; //发送怪物击杀日志的间隔
TICKCOUNT m_dwJoinAtvLogTime; //
bool m_bNeedPerfLog; //是否需要记录性能日志
BOOL m_bTracePacketRecord; //是否统计数据包
CActorDataPacketStat m_sPacketRecord; //数据包统计
bool m_hasDbInitData; //DB是否初始化了改子系统的数据(防止每次重启DB都初始数据)
CGuildComponent m_GuildMgr;
CActivityComponent m_ActivityMgr;
CVector<LOGCONSUMESAVE> m_ActorTotalLog; //发送到全局的消费日志 汇总所有的消费项,如果有消费定时向服务发包 累计玩家每天的消费
CVector<LOGKILLDROPSAVE> m_KillDropLog; //发送到全局的击杀掉落日志
CVector<LOGACTIVITYSCHEDULE> m_JoinAtvlog; //参与活动数据
CVector<ACTIVITYRATE> m_AvtivityRateList; //活动多倍加成数据
bool m_boSeoncdPswFlag; //false为开启二级密码验证true为关闭二级密码验证
bool m_boLoginSecondPswFlag;//是否跳过登录验证二级密码 true为跳过
bool m_boPrintDamageInfo;
public:
static LPCTSTR s_szBuffAllocStatLogName;
};