分析脚本
8.1 Class view
class CScriptEnvironment : public tScriptEnvironment
class CScriptSystem : public tScriptSystem
This is the complete list of members for CScriptEnvironment, including all inherited members.
CScriptEnvironment(LPCTSTR szName, LPCTSTR szFileName)
DoFile(LPCTSTR szScriptFile)
DoFunction(LPCTSTR szFunctionName, LPCTSTR szParam=NULL)
DoString(LPCTSTR szString)
DoString_WithCPPException(LPCTSTR szString)
DoString_WithGenException(LPCTSTR szString)
GetLuaObject(VOID)
GetName(VOID) const
m_strFileName
m_strName
m_strNameInLua
m_theEnvObj
~CScriptEnvironment()
8.2 脚本表
主要有任务脚本和 ui 脚本
参考:\天龙八部策划文档\任务-传送-NPC 与怪物摆放\《脚本 ID 编号规则.doc》
任务脚本
quest | 任务脚本 \Bin\Public\Data\Script\quest | Common | 玩法脚本 | Growpoint | 生长点脚本 | Item | 物品使用脚本 | 所有任务相关脚本文件 Public\Data\Script.tab,参考《任务脚本.doc》
UI 脚本
所有UI相关脚本列表 resource\config\ui.tab
参考《UI 组定义.doc》
8.3 脚本使用逻辑通道
8.3.1 脚本加载
void CScriptSystem::_loadQuestFile(void)
这里加载了 script.tab,也就是所有的任务相关的脚本
8.3.2 C++注册
CScriptSystem::Initial(VOID*)
C++函数注册,参考《C++注册全局函数.doc》
C++类注册表,参考《C++注册类.doc》
C++ Lua
Character | Target | PlayerMySelf | Player | DataPool | DataPool | AbilityTeacher | AbilityTeacher | Pet | Pet | PetInviteFriend | PetInviteFriend | TargetPet | TargetPet | Bank | Bank | Exchange | Exchange | LifeAbility | LifeAbility | Guild | Guild | Country | Country | PlayerPackage | PlayerPackage | SuperTooltips | SuperTooltips | SuperTooltips | SuperTooltips2 | StallSale | StallSale | StallBuy | StallBuy | StallBbs | StallBbs | MissionReply | MissionReply | Talk | Talk | NpcShop | NpcShop | IBShop | IBShop | QuickChange | QuickChange | PlayerShop | PlayerShop | Friend | Friend | FriendSearcher | FriendSearcher | DaytipsData | DaytipsData | QuestLogData | QuestLogData | CGameProduce_Login | GameProduceLogin | SkillStudy | SkillStudy | Mount | Mount | SouXiaLu | SouXiaLu |
8.4 脚本环境
8.4.1 创建脚本运行环境
VOID CUIWindowItem::PreLoadWindow(VOID)
{
m_pScriptEnv = g_pScriptSys->NewEnvironment(m_strWindowName.c_str(),
m_strScriptFileName.c_str());
所有脚本环境对象的this均指向元表MetaTable_UIWindowItem。
RegisterEvent | CUIWindowItem::LUA_RegisterEvent | Show | CUIWindowItem::LUA_Show | Hide | CUIWindowItem::LUA_Hide | TogleShow | CUIWindowItem::LUA_TogleShow | IsVisible | CUIWindowItem::LUA_IsVisible | TransAllWindowText | CUIWindowItem::LUA_TransAllWindowText | CareObject | CUIWindowItem::LUA_CareObject | MetaTable_UIWindowItem __index---------------|
8.4.2 环境类 CscriptEnvironment
CScriptEnvironment::CScriptEnvironment(LPCTSTR szName, LPCTSTR szFileName)
{
//创建环境Table
m_strName = szName;
m_strFileName = szFileName;
m_strNameInLua = m_strName+"_Env";
m_theEnvObj =
CScriptSystem::GetMe()->GetLuaState()->GetGlobals().CreateTable(m_strNameInLua.c_str());
}
m_strFileName 脚本文件全路径
m_strName 环境名,脚本文件窗口对应的名字,也就是 tab 数据库中的名字
m_strNameInLua m_strName+"_Env";
m_theEnvObj 以 strNameInLua 为名字创建的 lua 表
窗口名↔脚本环境↔脚本环境名↔脚本环境 lua 对象 均为一一对应
8.4.3 脚本系统 CscriptSystem 保存了所有环境对象
tScriptEnvironment* CScriptSystem::NewEnvironment(LPCTSTR szName, LPCTSTR szFileName)
{
CScriptEnvironment* pNewEnv = new CScriptEnvironment(szName, szFileName);
m_listScriptEnv.push_back(pNewEnv);
8.4.4 激活脚本环境
void CScriptSystem::SetActiveEnvironment(LPCTSTR szEnvName)
{
m_strEnvName = szEnvName;
CHAR szSetEnvScript[MAX_PATH];
_snprintf(szSetEnvScript, MAX_PATH, "setmetatable(_G, {__index = %s});",
szEnvName);
GetLuaState()->DoString(szSetEnvScript);
基本环境激活其实就是将_G 的__index 元表重新设置为 CscriptEnvironment 对应的 lua 表对象。
|