Files
mir_server/server/LogicServer/script/ext/ScriptTimeCall.h

160 lines
6.6 KiB
C
Raw Normal View History

2025-01-09 17:45:40 +08:00
#pragma once
class CScriptTimeCallManager :
protected CTimeCaller,
public CComponent
{
protected:
typedef CTimeCaller Inherited;
public:
CScriptTimeCallManager();
~CScriptTimeCallManager();
public:
/*
* Comments:
* Param CNpc * pNPC: NPC对象
* Param LPCSTR sFnName:
* Param LPCSTR sNextCall: 2011-03-04 0:0:0
* Param INT nSecInterval:
* Param bool boCallOnNextBoot:
* Param const CScriptValueList & args:
* @Return HANDLE: NULL
*
*
* 1
*
* 2sNextCall表示的日期和时间为一个已经过去的时间
* 12010-01-01 12:30
* 2011-03-04 17:532011-03-05 12:30
*
* 3boCallOnNextBoot决定是否在下次启动中的时候恢复调用此函数
*
* 使
* 0:30001:0
* 0:00:20
*
*
* 4CScriptValueList::MaxValueCount(16)
* (boCallOnNextBoot = false)
*
*/
HANDLE RegisterTimeCall(CNpc *pNPC, LPCSTR sFnName, LPCSTR sNextCall, UINT dwSecInterval,
bool boCallOnNextBoot, const CScriptValueList &args);
/*
* Comments:
* Param HANDLE hTimeCall: RegisterTimeCall中返回的调用函数句柄
* @Return bool: true否则返回false
*/
bool UnregisterTimeCall(HANDLE hTimeCall);
/*
* Comments:
* Param CNpc * pNPC: NPC对象NULL则表示匹配任何脚本中注册的此名称的函数
* Param LPCSTR sFnName:
* @Return HANDLE:
*/
HANDLE GetTimeCall(CNpc *pNPC, LPCSTR sFnName);
/*
* Comments:
* Param ULONGLONG lCurTick: TickCount
* Param ULONGLONG lRunTickLimit: Run函数运行的时间限制0
* @Return INT_PTR:
*/
INT_PTR Run(ULONGLONG lRunTickLimit = 0);
/*
* Comments: (BootCall)
* @Return INT_PTR:
*
* BootCall列表将被清空以防止重复调用
*/
INT_PTR RunBootCalls();
/*
* Comments: BootCall数据
* Param LPCTSTR sFilePath:
* @Return INT_PTR: BootCall数据
*/
INT_PTR LoadBootCalls(LPCTSTR sFilePath);
/*
* Comments: BootCall数据到文件
* Param LPCTSTR sFilePath:
* @Return INT_PTR: BootCall数据
*/
INT_PTR SaveBootCalls(LPCTSTR sFilePath);
protected:
/*
* Comments: 线MiniDateTime从而使得可以通过修改系统时间来在现实时间中提前运行一个函数
* @Return ULONGLONG:
*/
ULONGLONG GetCurrentTick();
protected:
/* 定义脚本定时调用数据结构 */
class ScriptCallInfo : public Counter<ScriptCallInfo>
{
public:
CNpc* pNPC; //NPC对象
HANDLE hCall; //定时调用句柄
CHAR sFn[64]; //脚本名称
CHAR sNPCName[64]; //NPC名称保存用于输出未取消的函数以及在下次启动的时候恢复执行函数
CHAR sSceneName[64]; //NPC所在场景名称
CScriptValueList args; //脚本调用参数表
BOOL boBootCall; //是否在下次启动时恢复调用
BOOL boMarkedRemove; //是否标记为删除
public:
~ScriptCallInfo(){};
};
/* 定义脚本定时调用数据存储结构 */
class ScriptBootCallData : public ScriptCallInfo
{
public:
CMiniDateTime nNextCall; //下次调用时间
DWORD dwSecInterval; //调用周期,单位为秒
public:
bool loadFromStream(wylib::stream::CBaseStream &stm);
void saveToStream(wylib::stream::CBaseStream &stm);
};
/* 定义BootCall文件头结构 */
struct ScriptBootCallFileHeader
{
static const FileHeaders::FILEIDENT FileIdent; //声明BootCall文件头标志
static const FileHeaders::FILEVERSION FileVersion;//声明BootCall文件版本号
FileHeaders::FILEIDENT ident; //文件标识固定为BootCallFileHeader::FileIdent
FileHeaders::FILEVERSION version; //文件版本固定为BootCallFileHeader::FileVersion
DWORD dwDataCRC32; //BootCall数据段CRC32效验值
UINT dwNumCalls; //BootCall数据记录数量
DWORD dwSizeData; //sizeof(ScriptBootCallData)的大小
DWORD dwDataSize; //数据段长度
CHAR btReserve[40]; //保留字节促使文件头为64字节
};
protected:
//脚本定时调用集中分派函数
static VOID STDCALL ScriptTimeCallDispatcher(CScriptTimeCallManager *lpManager, CList<ScriptCallInfo>::NodeType *pCallInfoNode, INT_PTR nCount);
/*
* Comments:
* Param BOOL boJustRemoveMarked:
* @Return VOID:
*/
VOID RemoveAll(BOOL boJustRemoveMarked);
/*
* Comments: BootCall列表中
* Param const ScriptCallInfo & sc:
* @Return VOID:
*/
VOID AddToBootCall(const ScriptCallInfo& callInfo);
/*
* Comments: BootCall列表
* @Return VOID:
*/
VOID ClearBootCallList();
protected:
CList<ScriptCallInfo> m_CallList; //脚本调用数据列表
CScriptValueList m_SRetList; //脚本调用返回值存储列表(用于优化性能)
CList<ScriptBootCallData> m_BootCallList;//下次启动时需要恢复执行的回调记录列表
INT_PTR m_nMarkedRemoveCount;//标记为移除的定时回调数量
};