- A+
石器时代服务端LNS引擎的简单介绍
Lua Npc Script
采用纯LUA语法的NPC脚本引擎,跟传统的服务端NPC引擎比起来(也就是用*.create文件来创建NPC的引擎)更加灵活,功能更加强大.
灵活的体现:
创建一个新的NPC不再需要重新启动服务器,只需要简单的执行一个GM指令就可以了。甚至可以在任何时候更改NPC的功能和任意数据。不再是以前死板的所有NPC数据都定义在create、template文件里了
功能更强大:
传统的NPC引擎功能相当有限,而且也没有相对灵活的语法,没办法写出具有更多功能的NPC。传统的NPC引擎是一种根据NPC的摸板创建NPC只能使用指定摸板的功能。但是LNS引擎则没有这个限制,因为LNS引擎不再是使用摸板而是创建摸板,甚至可以说他是服务端代码的扩展动态加载改变服务端代码的一个方便的接口。
LNS引擎的设计初衷是为了更方便快捷地为服务端添加新功能,甚至可以认为他不是NPC引擎是而随时跟玩家互动的一种插件,它甚至可以控制玩家、玩家的道具、玩家的宠物、甚至是传统NPC引擎所创建的NPC的行为。在LNS引擎里面所有东西都没有私隐(当然我们为了使LNS引擎更加稳定会把一些东西屏蔽而不让LNS引擎去修改,但是他仍然是这么强大和灵活的)
传统的服务端,要增加功能往往要修改服务端代码,而LNS引擎则可以替代很多修改服务端代码的工作。让不会编写服务端的人也可以随时往服务端里面添加新功能。
关于LNS引擎的一个简单的使用教程及例子
init.lua
function GMSV_NPC_Init()
if (M_JZ_TestNpc_index == nil) then --这句检查NPC是否已经创建,防止重复创建
--创建NPC 第一个参数是 JZ_TestNpc_Init函数 所在的文件 第二个参数是NPC初始化时候会调用的函数 第三个是地图标志如无必要设置为FALSE
M_JZ_TestNpc_index = NL.CreateNpc("./data/npc/lua/test/testnpc.lua", "JZ_TestNpc_Init");
--向NPC周围的玩家发送NPC数据更新封包
NLG.UpChar(M_JZ_TestNpc_index);
end
end
--随机种子
math.randomseed(os.time());
print(math.random(1, 100));
GMSV_NPC_Init();
testnpc.lua
--[[
注意 事件响应函数必须使用指定的参数格式如下面的函数
而且每种事件的响应函数的参数格式都不一定一样
当然参数名可以自定义
--]]
--Init事件返回值为 true 或 false
--_MeIndex 是本NPC的索引
function JZ_TestNpc_Init( _MeIndex )
--设置NPC形象 设置成红暴的样子
Char.SetData(_MeIndex, %对象_形象%, 100373);
--设置NPC所在地图
Char.SetData(_MeIndex, %对象_地图%, 2000);
--设置X坐标
Char.SetData(_MeIndex, %对象_X%, 58);
--设置Y坐标
Char.SetData(_MeIndex, %对象_Y%, 58);
--设置NPC方向
Char.SetData(_MeIndex, %对象_方向%, %右下%);
--设置NPC名称
Char.SetData(_MeIndex, %对象_原名%, "我是测试NPC");
--[[
响应说话事件,此事件如果有玩家对此NPC说话就会触发
--]]
if (Char.SetTalkedEvent(nil, "JZ_TestNpc_Talked", _MeIndex) < 0) then
print("JZ_TestNpc_Talked 注册事件失败。");
return false;
end
--最后要返回操作结果
return true;
end
--Talked事件不需要返回值所以 return ; 既可
--_MeIndex 是本NPC的索引
--_PlayerIndex 触发事件的玩家索引
--_Msg 玩家说话的内容
--_Color 说话的颜色
--_Channel 这个是频道
function JZ_TestNpc_Talked( _MeIndex, _PlayerIndex, _Msg, _Color, _Channel)
local TM_Buff;
local TM_X;
local TM_Y;
local TM_Int;
local TM_DIR;
local TM_NpcIndex;
local TM_NameList = {"巴朵兰恩", "弗丽雅", "奇朋德美", "布尔摩", "禁锢骷髅"};
local TM_ImagList = {100373, 101743, 101764, 101441, 101282};
--这里检查玩家是否站在NPC面前
if(NLG.CheckInFront(_PlayerIndex, _MeIndex, 1) == false) then
return ;
end
while true do
TM_X = math.floor(math.random(54, 62));
TM_Y = math.floor(math.random(54, 62));
--检查该位置是否有对象存在
if(NLG.CheckObj(2000, TM_X, TM_Y) == 0) then
--NPC的形象和名字随机
TM_Int = math.floor(math.random(1, 5));
--NPC的方向随机
TM_DIR = math.floor(math.random(0, 7));
TM_NpcIndex = NL.CreateNpc("./data/npc/lua/test/testnewnpc.lua", "JZ_TestNewNpc_Init");
if (TM_NpcIndex >= 0) then
Char.SetData(TM_NpcIndex, %对象_形象%, TM_ImagList);
Char.SetData(TM_NpcIndex, %对象_原名%, TM_NameList);
NLG.UpChar(TM_NpcIndex);
--改变NPC方向
NLG.CharLook(TM_NpcIndex, TM_DIR);
--传送NPC到指定位置 由于 JZ_TestNewNpc_Init函数里面没有对新的NPC进行地图位置等信息的配置所以在这里要使用NLS_Warp
NLG.Warp(TM_NpcIndex, 2000, TM_X, TM_Y);
TM_Buff = "新NPC已经创建。NPC名称:" .. TM_NameList .. "所在地图:玛丽娜斯村 X坐标:" .. TM_X .. " Y坐标:" .. TM_Y;
--NLG.TalkToCli 可以输入2-5个函数
NLG.TalkToCli(_PlayerIndex, TM_Buff, _Color, 0, M_JZ_TestNpc_index);
else
--错误信息
print(NL.GetErrorStr());
end
break;
end
end
return ;
end
testnewnpc.lua
--[[
注意 事件响应函数必须使用指定的参数格式如下面的函数
而且每种事件的响应函数的参数格式都不一定一样
当然参数名可以自定义
--]]
--Init事件返回值为 true 或 false
--_MeIndex 是本NPC的索引
function JZ_TestNewNpc_Init( _MeIndex )
if (Char.SetTalkedEvent(nil, "JZ_TestNewNpc_Talked", _MeIndex) < 0) then
print("JZ_TestNewNpc_Talked 注册事件失败。");
return false;
end
return true;
end
--Talked事件不需要返回值所以 return ; 既可
--_MeIndex 是本NPC的索引
--_PlayerIndex 触发事件的玩家索引
--_Msg 玩家说话的内容
--_Color 说话的颜色
--_Channel 这个是频道
function JZ_TestNewNpc_Talked( _MeIndex, _PlayerIndex, _Msg, _Color, _Channel)
--这里检查玩家是否站在NPC面前
if(NLG.CheckInFront(_PlayerIndex, _MeIndex, 1) == false) then
return ;
end
NLG.TalkToCli(_PlayerIndex, "被你找到了没办法..俺要消失了。", _Color, 0, _MeIndex);
NL.DelNpc(_MeIndex);
return ;
end
- 我的微信
- 这是我的微信扫一扫
-
- 我的微信公众号
- 我的微信公众号扫一扫
-