149 lines
4.5 KiB
C++
149 lines
4.5 KiB
C++
|
||
#pragma once
|
||
|
||
/***************************************************************/
|
||
/*
|
||
/* NPC实体,集成怪物实体
|
||
/*
|
||
/***************************************************************/
|
||
#define MAXFUNCTIONLENGTH 1024
|
||
class CNpc:
|
||
public CEntity
|
||
{
|
||
public:
|
||
typedef CEntity Inherited;
|
||
|
||
public:
|
||
|
||
static int GETTYPE() {return enNpc;}
|
||
|
||
CNpc();
|
||
|
||
void InitNPCAi();
|
||
|
||
//初始化
|
||
bool Init(void * data, size_t size){ SetInitFlag(true); return Inherited::Init(data,size); }
|
||
//删除的一些内存消耗操作
|
||
inline void Destroy()
|
||
{
|
||
m_Script.setScript(NULL, NULL);
|
||
Inherited::Destroy();
|
||
}
|
||
//处理LogicRun,实现对脚本的内存定时回收
|
||
void LogicRun(TICKCOUNT nCurrentTime);
|
||
//处理实体消息
|
||
void ProcessEntityMsg(const CEntityMsg &msg);
|
||
|
||
//获取属性集的指针
|
||
virtual CPropertySet * GetPropertyPtr() {return &m_property ;}
|
||
virtual const CPropertySet * GetPropertyPtr() const {return &m_property ;}
|
||
virtual INT_PTR GetPropertySize() const {return sizeof(CNPCProperty) -sizeof(CPropertySet);}
|
||
virtual int GetPropertySetTotalSize()const { return sizeof(m_property);}
|
||
|
||
public:
|
||
|
||
inline VOID SetConfig(NPCCONFIG* pConifg)
|
||
{
|
||
m_pConfig = pConifg;
|
||
}
|
||
inline NPCCONFIG* GetConfig() { return m_pConfig;}
|
||
//获取脚本对象
|
||
inline CLogicScript& GetScript(){ return m_Script; }
|
||
/*
|
||
* Comments: 加载/重新加载NPC脚本
|
||
* Param LPCSTR sPath: 脚本文件路径,可以是绝对路径或基于程序运行目录的相对路径
|
||
* Param bool boReload:是否重新读取
|
||
* @Return bool: 返回加载脚本是否成功
|
||
*/
|
||
bool LoadScript(LPCSTR sPath =NULL,bool boReload=false);
|
||
// /*
|
||
// * Comments: 用户与NPC对话并执行指定的函数,如果脚本函数返回字符串,那么脚本返回值将发给客户端呈现
|
||
// * Param CActor* pActor: 对话的玩家对象
|
||
// * Param LPCSTR sFnName: 函数名称
|
||
// * @Return void:
|
||
// */
|
||
// void Talk(CActor *pActor, LPCSTR sFnName);
|
||
|
||
// void Talk(CActor * pActor,LPCSTR sFnName,CScriptValueList& va);
|
||
|
||
//用户点击NPC的处理函数,默认是调用main函数
|
||
//inline void Click(CActor *pActor){ Talk(pActor, "main"); }
|
||
|
||
//发送消息,关闭npc的对话窗口
|
||
VOID CloseDialog(CActor *pActor);
|
||
|
||
/*
|
||
* Comments: NPC发言
|
||
* @Return void:
|
||
*/
|
||
void NPCTalk();
|
||
|
||
/*
|
||
* Comments: 重新刷一遍脚本
|
||
* @Return void:
|
||
* @Remark: 增加此接口用于重新刷一次NPC脚本。主要针对NPC复用。考虑到当前已经处于内测阶段,保证稳定性为主。以后可以考虑
|
||
* 不用reloadScript,而是call Uninitialize和Initialize接口。
|
||
*/
|
||
void ResetScript();
|
||
|
||
/*
|
||
* Comments:设置npc的执行idle的间隔时间
|
||
* Param int nTime:间隔时间,最小是30000(30秒),单位毫秒
|
||
* @Return void:
|
||
*/
|
||
inline void SetIdleTime(int nTime)
|
||
{
|
||
m_idleTime = ((nTime != 0 && nTime < 30000)?30000:nTime);
|
||
}
|
||
|
||
//调用npc脚本的一个函数
|
||
bool Call( LPCSTR sFnName);
|
||
|
||
//调用脚本某个模块的一个函数
|
||
bool CallModule(LPCSTR sModuleName,LPCSTR sFnName);
|
||
|
||
/*
|
||
* Comments: 通过场景和NPC的名字获取NPC的指针
|
||
* Param char * sSceneName:场景的名字
|
||
* Param char * sNpcName:npc的名字
|
||
* @Return CNpc *:返回NPC的指针
|
||
*/
|
||
static CNpc * GetNpcPtr(char * sSceneName,char * sNpcName);
|
||
|
||
|
||
|
||
/**
|
||
* Comments:函数的参数处理,约定的格式为函数名字,参数1,参数2,处理完以后va 中包含参数1,参数2
|
||
* Param LPCSTR str:输出的函数的名字 格式为函数名字,参数1,参数2
|
||
* Param CScriptValueList & va: 参数列表
|
||
* Param char * & pFunc:函数的名字
|
||
* Param nOutBuffSize: pFunc这个字符串缓冲的长度
|
||
* @param boAddFuncParam 是否压入函数名
|
||
* @Return void:
|
||
*/
|
||
void FuncParamProcess(LPCSTR str, CHAR * pFunc, INT_PTR nOutBuffSize,CScriptValueList & va, bool boAddFuncParam = false );
|
||
|
||
//调用npc脚本,包含玩家指针
|
||
//void CallScript(CActor * pActor, LPCSTR sFnName);
|
||
|
||
//调用npc脚本,不包含玩家指针
|
||
void OnNpcCaller(LPCSTR sFnName, int nNpcId = -1);
|
||
|
||
bool LoadScriptBuff(LPCTSTR sFilePath)
|
||
{
|
||
return m_Script.LoadBuff(sFilePath);
|
||
}
|
||
//重新加载npc脚本
|
||
void ReloadAllNpc();
|
||
//检查脚本错误
|
||
void CheckAllScript(char* sParam);
|
||
protected:
|
||
CNPCProperty m_property; // 属性集
|
||
CLogicScript m_Script; //脚本对象
|
||
NPCCONFIG* m_pConfig; //npc的配置信息
|
||
CTimer<60000> m_ScriptGCTimer; //脚本垃圾收集定时器(动态时间)
|
||
CTimer<10000> m_RunIdleTimer; //NPC调用Idle函数定时器(动态时间)
|
||
bool m_bScriptInited; // 脚本初始化完毕
|
||
int m_idleTime; //执行idle的间隔时间,默认是0
|
||
};
|