QQ:3240898131
QQ:1332846985
QQ群:793346929
API

龙族提供多种下载龙族提供多种下载龙族提供多种下载龙族提供多种下载

龙族说明书 Lua说明书 游戏编辑器说明书

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

打开金币交易行页面脚本命令: 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




游戏编辑器说明书下载