商务QQ:6683057
手机端咨询:2572153269
PC端咨询:3240898131
龙族⑥群:902505450
API

龙族说明书

新增可视化仓库 怪物名称自定义功能 脚本加密解密功能 自定义技能系统等功能 详情请下载完整说明书

打开金币交易行页面脚本命令: OpenGoldExchange



M2设置: 管理 -> 文件管理 -> 金币交易行设置及订单明细



UI: Deal.GUI ->ControlEngine9() -> FormGoldExchange()

金币交易行数据库文件: Mir200\Envir\UserData\GoldExchange.db

Mir200\Envir\UserData\GoldExchange.ldb



(如果此文件夹下没有数据库文件,这两个文件将会被自动创建。如果想启用新的交易行数据,删除这两个文件重启m2即可)

m2设置 : 功能设置 ->其它控制



Mir200/Envir/SerHumList.txt里存有所有登录过角色名。



openmailform 打开邮件系统的命令



UI: EMAIL.GUI->ControlEngine1() ->DNewMailForm(阅读信件)

->DMakeMailForm(写新信件)

->DMailListForm(收件箱)



效果按钮:DOpenMailForm/DOpenMailFormHo/DOpenMailFormHo1024

在原有的任务系统QMission-0.txt上增加了客户端游戏内任务追踪面板的显示;



M2客户端设置可以控制登录时是否显示追踪面板。



脚本命令:OpenMission 运行此脚本命令将立即刷新任务追踪面板



脚本格式:$x;<#y主任务标签名/@跳转的标签>$x;\

说明:x表示在当前主任务下的索引编号,不同的任务追踪应给予不同的数值,以免出现乱码。

y表示任务层级,一般设为0。

主任务标签名 是m2任务NPC页面的里设置的脚本标签,详见帮助文档任务说明系统。

$; 显示在任务追踪面板上的文字必须要包含在$x;$x;中间。

@跳转的标签 除不能调用图片之外,用法和普通跳转标签一致,

还可以在#say里加入$a-b;[说话内容]$a-b;以显示到追踪面板之上,

a-b表示这一级标签下索引编号 如:$1-10;去找<矿洞传送员/@矿洞传送员3>领取奖励$1-10;



UI: Mission.GUI -> ControlEngine1() -> DMissionFrom()




[@活动任务]
#if
#act
#SAY
$1;<#0任务活动/@任务活动指引>$1;\



[@任务活动指引]
#say
$1-1;快去<任务活动使者/@活动使者>看看$1-1;\
$1-2;会有意外惊喜$1-2;



[@活动使者]
#act
gotonow 330 330 1

兼容GOM与龙族用法一样名字不一样的命令

GOM龙族描述
PLAYSOUNDplaymusic播放网络上的MP3文件,或者本地MP3文件
GETRANDOMLINETEXTGetRandomText从文件中随机获取一行字符串
opengameshopOpenSndaShopDlg通过脚本命令打开游戏商铺
REALIVERELIVE原地复活人物
WebBrowserOpenWebSite游戏中打开网站
SortVarToListSortHumVarToList排序在线人物自定义变量
CHECKGROUPMEMBERCOUNTCheckGroupCount检查组队人数




兼容LEG与HX用法一样名字不一样的命令

LEG龙族描述
ReadRandomStrGetRandomText从文件中随机获取一行字符串
CheckStringListCheckTextList可简单实现物品拆解,升级,回收等功能
SetScTimerSetonTimer个人定时器
KillScTimerSetOffTimer停止定时器
HairsTypeHAIRSTYLE更改头发类型
AFFILIATEGUILDAddGuildMember加入指定行会
CheckInMapRangeCheckHumInRange检测人物是否在指定范围之内
CHECKMAGICLEVELCHECKSKILL检查人物技能



龙族说明书下载





引擎lua模块给开发者提供了客户端与服务端消息接发的机制,开发者将利用此功能实现服务端与客户端的请求与响应,这是一个意义重大的功能,所有客户端与服务端的交互将于这里开始


一个客户端与服务端相互发送消息的实例:


必要程序以及工具:

1.引擎包
2.任意可以运行的传奇服务端版本
3.热血传奇客户端
4.lua编辑器



实例将使用luaStudio编辑器(推荐),你也可以使用基础的记事本或者其他编辑软件(notepad++等)来编辑lua代码。


以下为实现客户端服务端通讯的详细步骤:
1.更新服务端版本程序为最新的龙族引擎包程序,配置客户端登录器(此内容请参考传奇Gm相关资料)
2.luaStudio工程的创建:
首先打开已经安装好的luaStudio编辑器9.72版本(下载地址http://www.luastudio.net/LuaStudio.exe)

新建服务端工程:
点击菜单:文件->新建工程
弹出如下对话框,可以自由输入项目名称,在示例里取名为"lua服务端",位置为服务端版本Mir200\lua目录
如果没有lua文件夹,请先在Mir200文件夹下创建lua文件夹

先在你的服务端版本Mir200文件夹下创建lua文件夹

右键点击解决方案下的"lua服务端"->“导入文件夹”

选择之前创建好的lua文件夹

右键点击"lua服务端"lua文件夹->新建文件
选择好Mir200\lua路径并创建SocketLua.lua文件

请在服务端Mir200\Enivr文件夹下创建LuaTest文件夹
请再次右键点击解决方案下的"lua服务端"->"导入文件夹"
选择Mir200\Enivr\LuaTest并确定

现在luaStudio的"解决方案"结构如下

右键点击"LuaTest"->"新建文件"
选择好Mir200\Envir\LuaTest路径并创建ServerTest.lua文件

如果不出意外,客户端与服务端消息通讯实例的服务端的文件已创建完毕

下面我们来创建客户端luaStudio工程文件
点击菜单:文件->新建工程
弹出如下对话框,可以自由输入项目名称,在示例里取名为"lua客户端"

在客户端根目录下创建lua文件夹

右键点击解决方案里的"lua客户端"->"导入文件夹"请选择客户端lua文件夹

右键点击lua客户端->lua文件夹->新建文件选择好客户端根目录\lua路径并创建clientTest.lua文件

请再次重复客户端的以上步骤创建client.lua文件
一切顺利的话,客户端与服务端消息通讯实例的客户端的文件已创建完毕

3.服务端与客户端脚本编辑
服务端:
(1).双击打开服务端SocketLua.lua
写入代码:
BINDSOCKET(100, "luatest\\serverTest.lua", "testFunc", 0)
保存SocketLua.lua文件

说明:绑定服务端自定义事件编号为100 文件为serverTest.lua
函数为testFunc
(2).双击打开服务端serverTest.lua文件
写入代码:

function testFunc()
local c_msg = GETSOCKETMSG() -- 获取客户端发送来的消息
PRINT(c_msg)
SENDTEXT(1,"来自服务端消息") -- 向客户端发送消息;消息ID 1为客户端 BINDLUASOCKET定义的;
end


保存ServerTest.lua文件

说明:testFunc接收客户端消息触发函数,此函数的事件编号在SocketLua.lua里定义, 客户端脚本通过SENDLUASOCKET接口来给服务端发送消息,来触发testFunc函数


客户端:
(1).双击打开客户端client.lua
写入代码:

BINDLUASOCKET(1, "clientTest.lua", "clientTestFunc"); -- 响应服务端发来的消息
BINDKEYEVENT("C", "clientTest.lua", "luaKeyDownC"); -- 按键ctrl+c 触发lua脚本

保存client.lua文件

说明:在本实例中客户端client.lua绑定了一个客户端自定义消息事件和一个客户端按键事件 客户端自定义消息编号为1(通过服务端脚本SENDTEXT接口触发) 文件为clientTest.lua 事件函数为clientTestFunc 客户端按键事件绑定的物理键盘按键为"C"键(游戏中需要按下 Ctrl+C 才有效) 文件为clientTest.lua 按键事件函数为luaKeyDownC

(2).双击打开客户端clientTest.lua 写入代码:


function clientTestFunc(s_msg)
CHAT(s_msg)
end
function luaKeyDownC()
SENDTEXT(100, '来自客户端的消息') -- 向服务端发送消息;消息ID 100为服务端 BINDSOCKET定义的;
end

保存clientTest.lua文件

说明:客户端clientTestFunc函数将在服务端脚本SENDTEXT接口发送消息后触发 客户端luaKeyDownC函数将在客户端按下Ctrl+C时触发

详情请下载说明书查询

(1) 获取M2游戏对象: GETGAMEOBJECT(对象名);

需要二个参数, : 第1个参数为类别名称,有: "player", "monster","maptar"; 第2个参数对象标识:"self", "target", 或名称;
示例:
local player = server.GETGAMEOBJECT("player", "self");
PRINT(player.name);

注意第一个参数为"maptar"时,第二个参数必须以数字编号转换为字符串形式传入,且需要有GETMAPOBJECTS获取地图对象方法为前提

local player = server.GETGAMEOBJECT("player","self");
local count = server.GETMAPOBJECTS(player.mapcode..","..player.selfx..","..player.selfy);

if count > 0 then

local obj = GETGAMEOBJECT("maptar", "0");

end


(2) 获取当前人物身上装备对象: GETUSERITEM(位置);
返回当前位置穿戴的物品; 若未穿戴则返回nil;
位置代码如下:
U_DRESS = 0; //衣服
U_WEAPON = 1; //武器(左手)
U_RIGHTHAND = 2; //右手
U_NECKLACE = 3; //项链
U_HELMET = 4; //头盔
U_ARMRINGL = 5; //左手镯
U_ARMRINGR = 6; //右手镯
U_RINGL = 7; //左戒指
U_RINGR = 8; //右戒指
U_BUJUK = 9; //符
U_BELT = 10; //腰带
U_BOOTS = 11; //鞋
U_CHARM = 12; //宝石
U_HAT = 13; //斗笠
U_DRUM = 14; //鼓
U_HORSE = 15; //马
U_SHIELD = 16; //盾牌



示例:
local item = server.GETGAMEOBJECT(1); -- 获取人物身上武器装备
if item ~= nil then
server.PRINT(item.name);
end;



(3) 获取玩家列表: GETPLAYERLIST([范围编号]);
范围编号:
0或空 -- 全服;
1 -- 行会;
2 -- 组队;
3 -- 国家;
4 -- 好友;
5 -- 同地图;
返回以“|”分割的人物名称字符串列表;



示例:
local nameList = server.GETPLAYERLIST(5); -- 返回当前玩家所在地图上的所有玩家列表
for i = 1,#nameList do
local player = GETGAMEOBJECT("PLAYER", nameList[i]);
if player ~= nil then
PRINT(player.username);
end;
end;



(4) 获取怪物列表: GETMONLIST(地图名,x,y,范围);




(5) 获取怪物对象: GETMON(怪物id);
示例如下:
local myself = server.GETGAMEOBJECT("player");
local monlist=server.GETMONLIST(3, myself.selfx, myself.selfy, 10);
for i = 1,#monlist do
local monster=server.GETMON(monlist[i]);
if monster ~= nil then
monster.gotoxy(myself.selfx, myself.selfy); -- 向玩家靠拢
end;
end;




(6) 创建怪物: CREATEMONSTERS(分组名, 怪物名, 数量, 地图名, x, y[, 范围]);
分组名: 用于区分创建的怪物所属组别;不同组别的怪物会相互攻击;



示例:
local myself = server.GETGAMEOBJECT("player");
local monlist=server.CREATEMONSTERS("RED", "鸡", 10, 3, 330, 333, 10);
for i = 1,#monlist do
local monster=server.GETMON(monlist[i]);
if monster ~= nil then
monster.gotoxy(myself.selfx, myself.selfy); -- 向玩家靠拢
end;
end;



(7) 创建 Lua 怪物: CREATELUAMON(分组名, 怪物名, 类别, 数量, 地图名, x, y);
以指定的怪物名创建新的180怪物;
分组名: 用于区分创建的怪物所属组别;不同组别的怪物会相互攻击;
类别: 1--近战怪;大于1为远程怪, 2--飞箭特效,3--火球特效, 4--冰咆哮特效, 5--寒冰掌特效, 6--灭天火特效; 200~499为自定义特效;



示例:
local myself = server.GETGAMEOBJECT("player");
local t=server.CREATELUAMON("RED", "鸡", 3,5,3, 330, 333);
for i = 1,#t do
local monster=server.GETMON(t[i]);
if monster ~= nil then
monster.gotoxy(myself.selfx- 2, myself.selfy - 2); -- 向玩家靠拢
monster.setRunEvent("lua\\run.lua", "monRunHandler"); -- 绑定lua怪run事件
end;
end;



lua\run.lua 脚本文件:
function monRunHandler(monid)
local monster = GETMON(monid);
if monster ~= nil then
monster.AttackTarget( );
if not monster.haveTarget then
monster.Wondering( );
end;
end;
end;



(8) 通过标识号获取游戏对象(npc/人物/怪物等): GETGAMEOBJECTBYRECOG(recogId), 返回游戏对象
recogId: 游戏对象的标识id。
注:结合客户端脚本命令 GETSELECTGAMEOBJECTLIST()使用;



示例:
-- 响应客户端鼠标框选对象列表
function responseSelectList()
local msg = server.GETSOCKETMSG();
local t = {};
string.gsub(msg,'[^'..'|'..']+', function(w) table.inset(t,w) end); -- split
for i = 1,#t do
local monster=server.GETGAMEOBJECTBYRECOG(t[i]);
if monster ~= nil then
monster.gotoxy(330, 330); -- 向指定位置靠拢
end;
end;
end;


(1) 获取M2游戏对象: GETGAMEOBJECT(对象名);

需要二个参数, : 第1个参数为类别名称,有: "player", "monster","maptar"; 第2个参数对象标识:"self", "target", 或名称;
示例:
local player = server.GETGAMEOBJECT("player", "self");
PRINT(player.name);

注意第一个参数为"maptar"时,第二个参数必须以数字编号转换为字符串形式传入,且需要有GETMAPOBJECTS获取地图对象方法为前提

local player = server.GETGAMEOBJECT("player","self");
local count = server.GETMAPOBJECTS(player.mapcode..","..player.selfx..","..player.selfy);

if count > 0 then

local obj = GETGAMEOBJECT("maptar", "0");

end


(2) 获取当前人物身上装备对象: GETUSERITEM(位置);
返回当前位置穿戴的物品; 若未穿戴则返回nil;
位置代码如下:
U_DRESS = 0; //衣服
U_WEAPON = 1; //武器(左手)
U_RIGHTHAND = 2; //右手
U_NECKLACE = 3; //项链
U_HELMET = 4; //头盔
U_ARMRINGL = 5; //左手镯
U_ARMRINGR = 6; //右手镯
U_RINGL = 7; //左戒指
U_RINGR = 8; //右戒指
U_BUJUK = 9; //符
U_BELT = 10; //腰带
U_BOOTS = 11; //鞋
U_CHARM = 12; //宝石
U_HAT = 13; //斗笠
U_DRUM = 14; //鼓
U_HORSE = 15; //马
U_SHIELD = 16; //盾牌



示例:
local item = server.GETGAMEOBJECT(1); -- 获取人物身上武器装备
if item ~= nil then
server.PRINT(item.name);
end;



(3) 获取玩家列表: GETPLAYERLIST([范围编号]);
范围编号:
0或空 -- 全服;
1 -- 行会;
2 -- 组队;
3 -- 国家;
4 -- 好友;
5 -- 同地图;
返回以“|”分割的人物名称字符串列表;



示例:
local nameList = server.GETPLAYERLIST(5); -- 返回当前玩家所在地图上的所有玩家列表
for i = 1,#nameList do
local player = GETGAMEOBJECT("PLAYER", nameList[i]);
if player ~= nil then
PRINT(player.username);
end;
end;



(4) 获取怪物列表: GETMONLIST(地图名,x,y,范围);




(5) 获取怪物对象: GETMON(怪物id);
示例如下:
local myself = server.GETGAMEOBJECT("player");
local monlist=server.GETMONLIST(3, myself.selfx, myself.selfy, 10);
for i = 1,#monlist do
local monster=server.GETMON(monlist[i]);
if monster ~= nil then
monster.gotoxy(myself.selfx, myself.selfy); -- 向玩家靠拢
end;
end;




(6) 创建怪物: CREATEMONSTERS(分组名, 怪物名, 数量, 地图名, x, y[, 范围]);
分组名: 用于区分创建的怪物所属组别;不同组别的怪物会相互攻击;



示例:
local myself = server.GETGAMEOBJECT("player");
local monlist=server.CREATEMONSTERS("RED", "鸡", 10, 3, 330, 333, 10);
for i = 1,#monlist do
local monster=server.GETMON(monlist[i]);
if monster ~= nil then
monster.gotoxy(myself.selfx, myself.selfy); -- 向玩家靠拢
end;
end;



(7) 创建 Lua 怪物: CREATELUAMON(分组名, 怪物名, 类别, 数量, 地图名, x, y);
以指定的怪物名创建新的180怪物;
分组名: 用于区分创建的怪物所属组别;不同组别的怪物会相互攻击;
类别: 1--近战怪;大于1为远程怪, 2--飞箭特效,3--火球特效, 4--冰咆哮特效, 5--寒冰掌特效, 6--灭天火特效; 200~499为自定义特效;



示例:
local myself = server.GETGAMEOBJECT("player");
local t=server.CREATELUAMON("RED", "鸡", 3,5,3, 330, 333);
for i = 1,#t do
local monster=server.GETMON(t[i]);
if monster ~= nil then
monster.gotoxy(myself.selfx- 2, myself.selfy - 2); -- 向玩家靠拢
monster.setRunEvent("lua\\run.lua", "monRunHandler"); -- 绑定lua怪run事件
end;
end;



lua\run.lua 脚本文件:
function monRunHandler(monid)
local monster = GETMON(monid);
if monster ~= nil then
monster.AttackTarget( );
if not monster.haveTarget then
monster.Wondering( );
end;
end;
end;



(8) 通过标识号获取游戏对象(npc/人物/怪物等): GETGAMEOBJECTBYRECOG(recogId), 返回游戏对象
recogId: 游戏对象的标识id。
注:结合客户端脚本命令 GETSELECTGAMEOBJECTLIST()使用;



示例:
-- 响应客户端鼠标框选对象列表
function responseSelectList()
local msg = server.GETSOCKETMSG();
local t = {};
string.gsub(msg,'[^'..'|'..']+', function(w) table.inset(t,w) end); -- split
for i = 1,#t do
local monster=server.GETGAMEOBJECTBYRECOG(t[i]);
if monster ~= nil then
monster.gotoxy(330, 330); -- 向指定位置靠拢
end;
end;
end;


(1) 获取M2游戏对象: GETGAMEOBJECT(对象名);

需要二个参数, : 第1个参数为类别名称,有: "player", "monster","maptar"; 第2个参数对象标识:"self", "target", 或名称;
示例:
local player = server.GETGAMEOBJECT("player", "self");
PRINT(player.name);

注意第一个参数为"maptar"时,第二个参数必须以数字编号转换为字符串形式传入,且需要有GETMAPOBJECTS获取地图对象方法为前提

local player = server.GETGAMEOBJECT("player","self");
local count = server.GETMAPOBJECTS(player.mapcode..","..player.selfx..","..player.selfy);

if count > 0 then

local obj = GETGAMEOBJECT("maptar", "0");

end


(2) 获取当前人物身上装备对象: GETUSERITEM(位置);
返回当前位置穿戴的物品; 若未穿戴则返回nil;
位置代码如下:
U_DRESS = 0; //衣服
U_WEAPON = 1; //武器(左手)
U_RIGHTHAND = 2; //右手
U_NECKLACE = 3; //项链
U_HELMET = 4; //头盔
U_ARMRINGL = 5; //左手镯
U_ARMRINGR = 6; //右手镯
U_RINGL = 7; //左戒指
U_RINGR = 8; //右戒指
U_BUJUK = 9; //符
U_BELT = 10; //腰带
U_BOOTS = 11; //鞋
U_CHARM = 12; //宝石
U_HAT = 13; //斗笠
U_DRUM = 14; //鼓
U_HORSE = 15; //马
U_SHIELD = 16; //盾牌



示例:
local item = server.GETGAMEOBJECT(1); -- 获取人物身上武器装备
if item ~= nil then
server.PRINT(item.name);
end;



(3) 获取玩家列表: GETPLAYERLIST([范围编号]);
范围编号:
0或空 -- 全服;
1 -- 行会;
2 -- 组队;
3 -- 国家;
4 -- 好友;
5 -- 同地图;
返回以“|”分割的人物名称字符串列表;



示例:
local nameList = server.GETPLAYERLIST(5); -- 返回当前玩家所在地图上的所有玩家列表
for i = 1,#nameList do
local player = GETGAMEOBJECT("PLAYER", nameList[i]);
if player ~= nil then
PRINT(player.username);
end;
end;



(4) 获取怪物列表: GETMONLIST(地图名,x,y,范围);




(5) 获取怪物对象: GETMON(怪物id);
示例如下:
local myself = server.GETGAMEOBJECT("player");
local monlist=server.GETMONLIST(3, myself.selfx, myself.selfy, 10);
for i = 1,#monlist do
local monster=server.GETMON(monlist[i]);
if monster ~= nil then
monster.gotoxy(myself.selfx, myself.selfy); -- 向玩家靠拢
end;
end;




(6) 创建怪物: CREATEMONSTERS(分组名, 怪物名, 数量, 地图名, x, y[, 范围]);
分组名: 用于区分创建的怪物所属组别;不同组别的怪物会相互攻击;



示例:
local myself = server.GETGAMEOBJECT("player");
local monlist=server.CREATEMONSTERS("RED", "鸡", 10, 3, 330, 333, 10);
for i = 1,#monlist do
local monster=server.GETMON(monlist[i]);
if monster ~= nil then
monster.gotoxy(myself.selfx, myself.selfy); -- 向玩家靠拢
end;
end;



(7) 创建 Lua 怪物: CREATELUAMON(分组名, 怪物名, 类别, 数量, 地图名, x, y);
以指定的怪物名创建新的180怪物;
分组名: 用于区分创建的怪物所属组别;不同组别的怪物会相互攻击;
类别: 1--近战怪;大于1为远程怪, 2--飞箭特效,3--火球特效, 4--冰咆哮特效, 5--寒冰掌特效, 6--灭天火特效; 200~499为自定义特效;



示例:
local myself = server.GETGAMEOBJECT("player");
local t=server.CREATELUAMON("RED", "鸡", 3,5,3, 330, 333);
for i = 1,#t do
local monster=server.GETMON(t[i]);
if monster ~= nil then
monster.gotoxy(myself.selfx- 2, myself.selfy - 2); -- 向玩家靠拢
monster.setRunEvent("lua\\run.lua", "monRunHandler"); -- 绑定lua怪run事件
end;
end;



lua\run.lua 脚本文件:
function monRunHandler(monid)
local monster = GETMON(monid);
if monster ~= nil then
monster.AttackTarget( );
if not monster.haveTarget then
monster.Wondering( );
end;
end;
end;



(8) 通过标识号获取游戏对象(npc/人物/怪物等): GETGAMEOBJECTBYRECOG(recogId), 返回游戏对象
recogId: 游戏对象的标识id。
注:结合客户端脚本命令 GETSELECTGAMEOBJECTLIST()使用;



示例:
-- 响应客户端鼠标框选对象列表
function responseSelectList()
local msg = server.GETSOCKETMSG();
local t = {};
string.gsub(msg,'[^'..'|'..']+', function(w) table.inset(t,w) end); -- split
for i = 1,#t do
local monster=server.GETGAMEOBJECTBYRECOG(t[i]);
if monster ~= nil then
monster.gotoxy(330, 330); -- 向指定位置靠拢
end;
end;
end;


(1) 向指定位置靠拢: GOTOXY (x,y[,forceGoto]);
驱使怪物向指定位置靠拢;
x,y 为目标坐标;
forceGoto为 boolean类型值,当为 true时则在走向目标位置时,忽略攻击目标/受到攻击不还击;
示例:
local monid = 201379;
local monster = server.GETMON(monid);
if monster ~= nil then
monster.GOTOXY(355, 190);
end;


(2) 停止靠拢: STOPGO();
停止靠拢;
示例:
monster.STOPGO();


(3) 复活: REALIVE();
让死亡的怪物重新就地复活;
示例:
monster.REALIVE();


(4) 地图上移动: MapMove(mapname, x, y);
怪物瞬移到指定地图坐标点;


(5) LUA怪绑定run事件: SETRUNEVENT(lua文件名, 函数名);
绑定Lua怪run事件函数;

示例:
monster.SETRUNEVENT("lua\\monevent.lua", "monRunEvent");

function monRunEvent(monid)
local monster = server.GETMON(monid); -- 根据id获取怪物对象
if monster ~= nil then
if monster.haveTarget then
monster.attackTarget(); -- 自动攻击目标
end;
end;
end;


============== LUA怪 属性/行为=============



(1) [读写]属性 OverlapOnMap: 怪物是否可在地图上重叠;


(2) [读写]属性 AttackRange: 设置怪物的攻击范围;



(3) [读写]属性 CanWalk: 怪物待机时是否可行走;



(4) [读写]属性 Category: 获取怪物种类:近战怪,远战怪;


(5) [只读]属性 HaveTarget: 是否有锁定目标;
以下方法仅限制于在怪物绑定的run事件中使用;


(6) 方法 SearchTarget([mode,[,inteval]]):搜索目标;
mode : 字符串,指定搜索类型,包含字符: p--人物;n--npc;m--怪物;h--英雄;空或空字符串="pnmh";
inteval: 数值,设置搜索间隔时间(毫秒),最小值为1000; 默认为8000;
示例:
monster.searchTarget(); -- 全部搜索
monster.searchTarget("pmh"); -- 不搜索npc



(7) 方法 SetTarget(id | playerName): 将指定玩家设置为目标对象;
id:怪物或人物对象的id;
playerName:人物名称;
注意:searchTarget为自动搜索目标,setTarget为手动指定人物目标, 两者不可并用。
示例:
monster.setTarget("某某某"); --设置目标并攻击之
monster.attackTarget();
monster.setTarget(enemy_mon.id); --设置怪物目标并攻击之
monster.attackTarget();



(8) 方法 GetTarget(): 获取目标对象;
local target = monster.getTarget();
if target ~= nil then PRINT("当前目标是:"..target.name);
end;


(9) 方法 DelTarget(): 取消锁定的目标;
示例 -- 在run事件函数中让怪物跟随人物一起走动:
monster.delTarget();
monster.gotoxy(player.selfx-1, player.selfy - 1);


(10) 方法 AttackTarget(): 攻击目标;
示例:
if monster.haveTarget then
monster.attackTarget();
else
monster.wondering();
end


(11) 方法 CheckTargetInRange([range]): 检测目标是否在指定范围内;
range: 范围数值; 为空则默认为攻击范围;
返回布尔值:true/false; 若目标为空则返回false;


(12) 方法 Wondering(): 待机;


(1) 绑定自定义消息事件: BINDLUASOCKET(自定义消息ID, lua文件名, 函数名);
自定义消息ID: 取值范围为1~65536;

示例:
BINDLUASOCKET(1, "clientTest.lua", "clientTestFunc");



(2) 绑定按键事件: BINDKEYEVENT(按键, lua文件名, 函数名);
按键: 主键盘中'A'..'Z' 字母键; 注意要避免与已经使用的按键冲突;
示例:
BINDKEYEVENT("N", "keyEvent.lua", "KeyDownN");



(3) 绑定游戏事件: BINDGAMEEVENT(事件ID, lua文件名, 函数名);
事件ID: 游戏事件对应的ID, 参照 附表1(游戏事件ID列表);



示例:
BINDGAMEEVENT(ge_LogonGame, "GameEvent", "logon");
BINDGAMEEVENT(ge_LogoutGame, "GameEvent", "logout");



(4) 绑定定时器事件: BINDTIMER(定时器编号,间隔时间, lua文件名, 函数名);
定时器编号: 最多支持16个定时器(编号取值范围:1~~16);

间隔时间 : 触发lua脚本的间隔时间, 单位为秒; 最小值为1;


示例:
BINDTIMER(1, 2, "timer", "OnTimer");



(5) 解绑定时器事件: UNBINDTIMER(定时器编号);
定时器编号: 为已经使用BINDTIMER设定的编号; 设定后将关闭指定编号的定时器;



示例:
UNBINDTIMER(1);

附表1: 游戏事件ID列表
ge_MouseEnterItem = 1; -- 鼠标移到物品上事件
ge_LogonGame = 2; -- 进入游戏
ge_LogoutGame = 3; -- 退出游戏
ge_MouseRClick = 4; -- 鼠标右键事件
ge_MySelfWalk = 5; -- 玩家动作:走
ge_MySelfRun = 6; -- 玩家动作:跑
ge_MySelfTurn = 7; -- 玩家动作:转身
ge_NewMagic = 8; -- 创建特效事件
ge_ItemShow = 9; -- 物品悬浮框显示事件
ge_MouseMove = 10; -- 鼠标移到动事件
ge_MySelfMove = 11; -- 玩家移动动作:走/跑/转身/施法/自动跑动等
ge_MySelfSpell = 12; -- 玩家动作:施法

ge_ReceiveLuaMsg = 13; -- 接收服务端/其他玩家发来的消息(无消息id号)


(1) 绑定自定义消息事件: BINDLUASOCKET(自定义消息ID, lua文件名, 函数名);
自定义消息ID: 取值范围为1~65536;

示例:
BINDLUASOCKET(1, "clientTest.lua", "clientTestFunc");



(2) 绑定按键事件: BINDKEYEVENT(按键, lua文件名, 函数名);
按键: 主键盘中'A'..'Z' 字母键; 注意要避免与已经使用的按键冲突;
示例:
BINDKEYEVENT("N", "keyEvent.lua", "KeyDownN");



(3) 绑定游戏事件: BINDGAMEEVENT(事件ID, lua文件名, 函数名);
事件ID: 游戏事件对应的ID, 参照 附表1(游戏事件ID列表);



示例:
BINDGAMEEVENT(ge_LogonGame, "GameEvent", "logon");
BINDGAMEEVENT(ge_LogoutGame, "GameEvent", "logout");



(4) 绑定定时器事件: BINDTIMER(定时器编号,间隔时间, lua文件名, 函数名);
定时器编号: 最多支持16个定时器(编号取值范围:1~~16);

间隔时间 : 触发lua脚本的间隔时间, 单位为秒; 最小值为1;


示例:
BINDTIMER(1, 2, "timer", "OnTimer");



(5) 解绑定时器事件: UNBINDTIMER(定时器编号);
定时器编号: 为已经使用BINDTIMER设定的编号; 设定后将关闭指定编号的定时器;



示例:
UNBINDTIMER(1);

附表1: 游戏事件ID列表
ge_MouseEnterItem = 1; -- 鼠标移到物品上事件
ge_LogonGame = 2; -- 进入游戏
ge_LogoutGame = 3; -- 退出游戏
ge_MouseRClick = 4; -- 鼠标右键事件
ge_MySelfWalk = 5; -- 玩家动作:走
ge_MySelfRun = 6; -- 玩家动作:跑
ge_MySelfTurn = 7; -- 玩家动作:转身
ge_NewMagic = 8; -- 创建特效事件
ge_ItemShow = 9; -- 物品悬浮框显示事件
ge_MouseMove = 10; -- 鼠标移到动事件
ge_MySelfMove = 11; -- 玩家移动动作:走/跑/转身/施法/自动跑动等
ge_MySelfSpell = 12; -- 玩家动作:施法

ge_ReceiveLuaMsg = 13; -- 接收服务端/其他玩家发来的消息(无消息id号)


控件属性列表


                                         
名称读写说明名称读写说明
id控件IDtext读/写设置/获取文字
name控件名称items设置组合框列表内容
guiType控件类别itemCount 获取组合框项数
caption读/写控件文本itemIndex 读/写获取/设置组合框/弹出菜单当前项编号
x 或 left读/写控件x坐标onclick 设置单击触发函数
y 或 top 读/写控件y坐标onMouseDown 设置鼠标按下触发函数
fontName读/写文字字体 onMouseUp设置鼠标弹起触发函数
fontSize读/写文字大小onMouseMove 设置鼠标经过触发函数
fontColor读/写文字颜色onDblCick设置双击触发函数
fontStyle读/写文字格式onMouseEnter 设置进入触发函数
visible读/写是否可见onMouseLeave设置离开触发函数
enabled读/写是否有效onKeyPress 设置按键触发函数
transparent读/写是否透明onKeyDown设置键盘按下触发函数
canMove读/写是否可拖动onKeyUp设置键盘弹起触发函数
image设置底图
upImage设置底图
downImage设置鼠标按下时底图
hotImage设置鼠标经过时底图
disabledImage设置无效时底图
owner获取父控件
bgColor读/写获取/设置背景色

控件方法: (1) show( [x, y] ); 控件显示于坐标 (x, y) 处;
示例: control.show(100, 120);

(2) hide(); 隐藏控件, 等同于 visible = false;
示例: control.hide();

(3) free( ); 释放控件;
示例: control.free();

创建控件方法如下: (1) 创建窗体: UI.addForm(ownerId, x, y, width, height, image);
(2) 创建标签: UI.addLabel(ownerId, x, y, caption);
(3) 创建按钮: UI.addButton(ownerId, x, y, width, height, caption, luaFunction [, image])
(4) 创建文本输入框: UI.addEdit(ownerId, x, y, width [, height])
(5) 创建组合框: UI.addComboBox(ownerId, x, y [, width [, items, [, delimiter]]])
(6) 创建弹出菜单: UI.addPopupMenu(items, luaFunction[, fontColor])
(7) 创建图像按钮: UI.addButtonEx(ownerId, x, y, width, text [, luaFunction])
(8) 创建ListView: UI.addListView(ownerId, x, y, width, height, colCount, itemHeight)
(9) 通过控件id获取控件对象: UI.getControl(controlId)



以上参数说明如下:
ownerId: 父控件的id, 可通过这样的方式获取: ownerControl.id;
x, y : 定义控件的左上角位置;
width : 控件宽度;
height : 控件高度;
image : 设置控件的底图, 例如: "gamePlan.pak|203", 以"|"为分隔, 前面为资源文件名称, 后面数值为图像编号;
caption : 标题文字;
luaFunction: 设置控件点击时触发的函数, 例如: "eventHandler.lua\\btnClick", 以最后"\"为分隔, 前面为脚本文件名, 函数名;
items : 组合框/弹出菜单的项目内容, 默认以"|"为分隔符;
colCount: 列数;
itemHeight: 行高;



图像按钮支持显示静态图像, 动态图像和物品图标, 参数text说明如下:
(a) 静态图像: "img|资源文件名|图像编号|提示文字", 示例: "img|ui2.pak|25|251/第一行提示文字^128/第二行提示文字";
(b) 动态图像: "gimg|资源文件名|起始图像编号|图像数量|提示文字", 示例: "gimg|ui2.pak|21|9|251/动画第一行提示文字^128/第二行提示文字";
(c) 物品图标: "itemshow|物品looks数值|物品数量|提示文字", 示例: "itemshow|3|10|251/小瓶金创药^128/第二行提示文字";


(10) 显示信息框: UI.showMessage(文字)
示例:
UI.showMessage("好极了, LUA函数可以运行起来了!");



(11) 显示对话框: UI.showDialog(文字)
返回值为按键标识: 1 = 确认; 2=取消
示例:
local ret = UI.showDialog("将要执行lua函数, 您确认要继续吗");
if ret == 2 then -- 取消
return 0;
end;



(12) 显示输入对话框: UI.showInput(文字)
返回2个参数:
参数1: 按键标识(1 = 确认; 2=取消);
参数2: 输入的内容;
示例:
local ret, value = UI.showInput(msg);
if ret == 1 then
CHAT("输入的内容为: "..value);
end;



示例 -- 控件属性的使用:
btn1.onclick = "eventHandler.lua\\btnClick"; -- 设置按钮btn1点击触发的函数;

btn1.image = "prguse.pak|282|281|281"; -- 设置按钮正常/鼠标按下/鼠标经过时的底图



if comboBox1.itemCount > 0 then
comboBox1.itemIndex = 0; -- 设置组合框当前选中项
end;



label1.caption="这个标签可以拖动";
label1.canMove = true; -- 设置标签可拖动
comboBox1.items="1|3|5|6|8"; --设置组合框项目内容


示例 -- 创建弹出菜单PopMenu:
-- 1. 绑定鼠标右键事件
BINDGAMEEVENT(ge_MouseRClick,"controlEvent", "onMouseRClick");



-- 2. 鼠标右键处理函数 通过鼠标右键+ctrl 弹出菜单
function onMouseRClick(sender, x, y)
showPopMenu(x, y);
end;


-- 3. popMenu 设置为全局变量
function showPopMenu(x, y)
if popMenu == nil then
popMenu = UI.addPopupMenu("走|跑|待机", "controlEvent\\onPopMenuClick"); -- 创建一个弹出菜单
end;
popMenu.visible = true;
end;


-- 4. 响应菜单点击
function onPopMenuClick(sender, x, y)
local control = UI.getControl(sender);
if control.itemIndex = 0 then
-- 走
elseif control.itemIndex = 1 then
-- 跑
elseif control.itemIndex = 2 then
-- 待机
end;
end;





lua说明书下载





下图是GUI编辑时的常规布局

下图是GUI编辑时的常规布局

设计视图->游戏视口:将设计视图中的UI显示在游戏界面中(在搭建UI时我们需要在游戏中看到效果,在进行更好的修改)

1. 单击‘游戏场景窗口'中的“设计视图->游戏视图”控件

2. 如果需要将我们后面修改的UI显示在游戏界面中,必须先将我们显示游戏视图中的UI 释放掉。

捕获:将‘游戏视口’中需要修改的UI捕获到‘设计视口’中进行修改
1.单击‘游戏场景窗口’中“捕获”控件 ,如果弹出‘控件捕获’框 单击‘是’按钮。
2.将鼠标移动到你需要捕获‘游戏视口’中的UI上,按快捷键 Ctrl+F12




游戏编辑器说明书下载