找回密码
 register

QQ登录

只需一步,快速开始

查看: 1145|回复: 0

[游戏教程] 八、武侠世界2源码分析:脚本

[复制链接]

[游戏教程] 八、武侠世界2源码分析:脚本

[复制链接]
  • 打卡等级:热心大叔
  • 打卡总天数:94
  • 打卡月天数:17
  • 打卡总奖励:94
  • 最近打卡:2025-01-18 01:28:20
Waylee

主题

0

回帖

1万

积分

仙帝

积分
12364
Waylee 2023-6-16 09:21 | 显示全部楼层 |阅读模式

马上注册,查看网站隐藏内容!!

您需要 登录 才可以下载或查看,没有账号?register

×
分析脚本

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
CharacterTarget
PlayerMySelfPlayer
DataPoolDataPool
AbilityTeacherAbilityTeacher
PetPet
PetInviteFriendPetInviteFriend
TargetPetTargetPet
BankBank
ExchangeExchange
LifeAbilityLifeAbility
GuildGuild
CountryCountry
PlayerPackagePlayerPackage
SuperTooltipsSuperTooltips
SuperTooltipsSuperTooltips2
StallSaleStallSale
StallBuyStallBuy
StallBbsStallBbs
MissionReplyMissionReply
TalkTalk
NpcShopNpcShop
IBShopIBShop
QuickChangeQuickChange
PlayerShopPlayerShop
FriendFriend
FriendSearcherFriendSearcher
DaytipsDataDaytipsData
QuestLogDataQuestLogData
CGameProduce_LoginGameProduceLogin
SkillStudySkillStudy
MountMount
SouXiaLuSouXiaLu


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。
RegisterEventCUIWindowItem::LUA_RegisterEvent
ShowCUIWindowItem::LUA_Show
HideCUIWindowItem::LUA_Hide
TogleShowCUIWindowItem::LUA_TogleShow
IsVisibleCUIWindowItem::LUA_IsVisible
TransAllWindowTextCUIWindowItem::LUA_TransAllWindowText
CareObjectCUIWindowItem::LUA_CareObject
MetaTable_UIWindowItem __index---------------|
9.jpg


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 表对象。


您需要登录后才可以回帖 登录 | register

本版积分规则

雪舞知识库 | 浙ICP备15015590号-1 | 萌ICP备20232229号|浙公网安备33048102000118号 |天天打卡

GMT+8, 2025-1-20 04:42 , Processed in 0.101926 second(s), 9 queries , Redis On.

Powered by XueWu Licensed

Copyright © Tencent Cloud.

快速回复 返回顶部 返回列表