天龙八部服务器端Lua脚本系统

news/2025/3/19 5:25:14/

一、Lua脚本功能接口

1. LuaInterface.h/.cpp声明和实现LuaInterface。

LuaInterface成员如下:

//脚本引擎

FoxLuaScript mLua ;

//注册器

LuaCFuncRegister mFuncRegister;

//场景关联

Scene* mOwner;

//已经读取的脚本表

IDTable m_ScriptTable ;

主要方法:

VOID Init(Scene* pScene);//完成Lua脚本环境的初始化和C导出函数的注册

Scene* GetOwner();

执行Lua脚本C++接口,提供多达8个参数支持。

INT ExeScript( ScriptID_t scriptid, CHAR* funcname ) ;

INT ExeScript_D( ScriptID_t scriptid, CHAR* funcname, INT Param0 ) ;

INT ExeScript_DD( ScriptID_t scriptid, CHAR* funcname, INT Param0, INT Param1 ) ;

INT ExeScript_DDD( ScriptID_t scriptid, CHAR* funcname, INT Param0, INT Param1, INT Param2 ) ;

INT ExeScript_DDDD( ScriptID_t scriptid, CHAR* funcname, INT Param0, INT Param1, INT Param2, INT Param3 ) ;

LuaInterface::Init里面会初始化mLua引擎,注册C++提供给Lua脚本的函数(LuaCFuncRegister),并加载ScriptGlobal.lua脚本。

2. LuaCFuncRegister.cpp里面对所有导出到Lua的C++函数进行注册。

struct _Str2Func functbl[] =

{

{"AddEventList",FuncProto(LuaFnAddNumText)},

{"GetMission", FuncProto(LuaFnGetMission)},

{"GetMissionCount", FuncProto(LuaFnGetMissionCount)},

{"SetMissionByIndex", FuncProto(LuaFnSetMissionByIndex)},

{"AddMission", FuncProto(LuaFnAddMission)},

{"AddMissionEx", FuncProto(LuaFnAddMissionEx)},

{"SetMissionEvent", FuncProto(LuaFnSetMissionEvent)},

...

};

这些C++函数的实现是在下列头文件中进行的:

#include "LuaFnTbl_Mission.h"

#include "LuaFnTbl_Misc.h"

#include "LuaFnTbl_Ability.h"

#include "LuaFnTbl_Attr.h"

#include "LuaFnTbl_Pet.h"

#include "LuaFnTbl_Battle.h"

#include "LuaFnTbl_Shop.h"

#include "LuaFnTbl_PetPlacard.h"

#include "LuaFnTbl_Scene.h"

#include "LuaFnTbl_Team.h"

#include "LuaFnTbl_DoAction.h"

#include "LuaFnTbl_Relation.h"

#include "LuaFnTbl_Guild.h"

#include "LuaFnTbl_City.h"

这些函数并不是功能的真正实现地方,真正的实现代码在Scene、Obj_Human等地方。这里只是集中转调而已。

3. 注册完成后,在Lua脚本中就可以使用类似AddMission接口调用C++里面功能。

二、Lua脚本位置

所有脚本在Bin\Public\Data\Script子目录中。

Bin\Public\Data\Script.dat是索引,里面保存了ScriptID和对应的脚本文件名。如:

888888=\scene.lua

888889=\mail.lua

888890=\player_login.lua

...

脚本ID是6位的。

三、脚本索引的初始化

每个场景都会进行脚本初始化,具体是在Scene::Load里面,在在m_pLuaInterface初始化之后。

m_pLuaInterface->Init(this);

if( !m_pScriptFileMgr->IsInit() )

{

m_pScriptFileMgr->Init( FILE_SCRIPT, FALSE);

}

Log::SaveLog( SERVER_LOGFILE, "Load ../Public/Data/script.dat OK!" );

m_pScriptFileMgr->Init将"888888=\scene.lua"拆开,保存ID和文件名到SFileData里面。所有的SFileData用SFileDataLink串起来。

四、脚本加载和调用

每个脚本的调用都是通过INT LuaFnCallScriptFunction(Lua_State* L);来进行的。该函数是一个C++函数,脚本里面调用名是CallScriptFunction,注册如下:

{"CallScriptFunction", FuncProto(LuaFnCallScriptFunction)},

LuaFnCallScriptFunction的实现在文件LuaFnTbl_Misc.h里。

可以看到在,此函数:

l 把SFileData添加到pScene->GetLuaInterface()->m_ScriptTable表里面;

pSFileData = pScene->GetLuaInterface()->GetOwner()->GetScriptFileMgr()->GetFileData(scriptId);

pScene->GetLuaInterface()->m_ScriptTable.Add( scriptId, pSFileData ) ;

l 然后加载脚本;

pScene->GetLuaInterface()->mLua.Load( const_cast<CHAR*>(filename) ) ;

l 最后调用脚本。

五、典型脚本的结构

ScriptDef.h,定义了一些脚本接口函数,如OnDefaultEvent,对于脚本805007,就是:

function x805007_OnDefaultEvent( sceneId, selfId,targetId );

有一些调用没有在这里定义宏,直接写在C++代码里面,如OnScenePlayerLogin

#define DEF_EVENT_ENTRY_FUNC_NAME ("OnDefaultEvent") //脚本进入函数

#define DEF_ON_KILL_OBJECT_FUNC_NAME ("OnKillObject")

#define DEF_ON_ITEM_CHANGED_FUNC_NAME ("OnItemChanged")

#define DEF_ON_PET_CHANGED_FUNC_NAME ("OnPetChanged")

#define DEF_ON_ENTER_AREA_FUNC_NAME ("OnEnterArea")

#define DEF_ON_LEAVE_AREA_FUNC_NAME ("OnLeaveArea")

#define DEF_EVENT_ON_TIMER ("OnTimer")

#define DEF_MISSION_ACCEPT ("OnMissionAccept") //接受任务

#define DEF_MISSION_ABANDON ("OnAbandon") //放弃任务

#define DEF_MISSION_REFUSE ("OnMissionRefuse") // 拒绝接受任务

#define DEF_MISSION_SUBMIT ("OnMissionSubmit") //任务完成后,提交任务

#define DEF_MISSION_CHECK ("OnMissionCheck") //任务完成条件检查

#define DEF_MISSION_CONTINUE ("OnMissionContinue") //任务没完成,继续

六、样例分析

大理NPC赵天师脚本分析

脚本名:Script\obj\dali\odali_xinshoutian.lua,汗,居然叫这个名字,找了半天,一般的命名都是拼音。

--赵天师

--脚本号

x002030_g_scriptId = 002030

--所拥有的事件ID列表

x002030_g_eventList={210200,210204,210205,210208,210210,210212,210213,210214,210216,210217,210220,210223, 210224, 210225, 210229, 210230, 210232, 210238, 210239, 210237, 210240, 200080, 200083, 200086, 200091, 200094,200095,210241,050022}

一般情况,每个event对于一个任务,也是一段脚本实现的。210200对于:

;大理城新手指导任务

210200=\event\dali\edali_zhidao_0200.lua

--找人任务

--赵天师寻找蒲良

NPC脚本触发接口函数是xxx_OnDefaultEvent,在AI_HumanPushCommand_DefaultEvent里面触发。

ORESULT PushCommand_DefaultEvent( ObjID_t idNPC );

pCharacter->getScene()->GetLuaInterface()->ExeScript_DDD(

idScript,

DEF_EVENT_ENTRY_FUNC_NAME,

(INT)pCharacter->getScene()->SceneID(),

(INT)pCharacter->GetID(),

(INT)pNPC->GetID() ) ;


http://www.ppmy.cn/news/846645.html

相关文章

天龙八部中的扫地僧的真实身份

天龙八部中的扫地僧被很多人认为是金庸小说中的第一高手。       1、扫地僧出场时&#xff0c;“一个身穿青袍的枯瘦僧人拿着一把扫帚&#xff0c;正在弓身扫地。这僧人年纪不少&#xff0c;稀稀疏疏的几根长须已然全白”&#xff0c;又说他来了“不知是四十二年&#xf…

天龙源码框架分析_天龙八部源码描述【转】

天龙八部(武侠世界)的源码很可能是天龙八部代码流出后改写的,因为在看了代码中可以找到一些证据,整个客户端分为:一个是编辑器,一个是客户端,采用OGRE+cegui+自写的简单的物理碰撞检测+FMOD+自写的网络库。 服务器端代码目前没仔细关注 客户端总体的描述如下: UI系统 CEG…

天龙八部中无名老僧的由来

整理&#xff1a;WangYugang 日期&#xff1a;15-Dec-2004 出处&#xff1a;http://blog.csdn.net/wangyugang版本&#xff1a;0.01 武侠小说看到了这个份上也算是祖师级的高手了&#xff0c;向作者致敬&#xff01;闲来慢慢品尝&#xff01; 文章内容: 话说金庸老先生穷半生之…

天龙八部 找怪物ID

游戏&#xff1a;天龙八部 版本&#xff1a;0.35.0691 主要工具&#xff1a;ODCEGE 开发环境&#xff1a;VS2005 作者:勿在浮沙筑高 转载文章请标明出处http://bbs.bpsend.com要点&#xff1a;从怪物的名字着手&#xff0c;找到怪物的各种信息&#xff0c;分析出游戏定义的描述…

天龙八部资源提取源代码

网上找的《天龙八部》资源读取&#xff0c;先拷贝下来存储在这里&#xff0c;希望有读取文件夹的功能&#xff01;最近一直在愁读取文件夹 #include <stdio.h>#include <string>#include <windows.h>#include <shlobj.h>using namespace std;int do16b…

也谈《天龙八部》

金庸老先生的经典巨作《天龙八部》又被翻拍了一次&#xff0c;随着电视剧的播映&#xff0c;网络上不少吐槽的声音。无论是对于演员的选择&#xff0c;场景布置&#xff0c;道具选择等等都成了网友们吐槽的目标。其实&#xff0c;这些都是很正常的。一直以来电视剧的拍摄都会面…

天龙八部技术分析报告

刘洋通过一段时间对天龙八部这款游戏进行分析研究&#xff0c;主要从客户端入手&#xff0c;从技术角度学习天龙八部游戏中各种实现机制。最终写成此文&#xff0c;献给搜狐游戏&#xff0c;以表敬意。本文主要分为三个部分&#xff0c;分别是1 天龙八部基本技术实现技术分析&a…

天龙八部服务器列表文件,天龙八部服务端目录说明

大师帮我看下怎么不能启动了。 Last login: Mon Jul 5 20:26:46 2010 from 192.168.1.2 [[email protected] ~]# cd /home/tlbb/Server [[email protected] Server]# ./Login_fix (###) main... (-1208624928)(T02010-7-5_20:27:43 T10.0870) Login Starting... (1007052027)(…