UID381
阅读权限70
威望 点
积分1688
注册时间2009-3-14
最后登录1970-1-1
听众
收听
升级
34.4%
|
脚本编程基础
============
功能符号:(以下所述均为英文,半角符号)
圆括号 () 容器标志,其中的内容为一个×作对象,运算中可设置为优先,注意,圆括号可以复用,最里面的将优先运算,例如
(@temp1 * (@temp2 - @temp3)),先计算@temp2 - @temp3 再 * @temp1
方括号 [] 数组标示,在数组数据中表示数据的下标,标志如果是数字变量为第几位
花括号 {} 程序集合,除了Monster,Shop的脚本程序必须放在其中让计算机执行
引号 \"\" 字符串标识符,其中的文本均以字符串输出
逗号 , (×作符??不知道怎么定义,Robert来说明下)
分号 ; 语句结束符,每一行语句的末尾
冒号 : 过程标识符,结合前面的过程名标识一个过程的开始
双斜杠 // 注释符,之后到这一行末尾的内容将跳过不被执行
/**/ 注释符,之中的内容将不被执行
运算符 用于对变量进行数值运算以及文本叠加
加号 + 前后的数据加起来成为一个新的数据,注意数值数据和文本数据的区别,数值数据1+1=2,文本数据\"1\"+\"1\"=\"11\"
减号 - 前面的数值减去后面的数值
乘号 * 两数值相乘
除号 / 前面数值除以后面的数值,余数将舍去。
比较符 用于对变量之间,变量和明确值进行判断
等于 == 可以比较数值和文本
不等于 != 可以比较数值和文本
大于 > 仅比较数值
小于 < 同上
大于或等于 >= 同上
小于或等于 <= 同上
并列符
和 && 前后两个比较同时成立
或 || 前后两个比较只要达成一个
其它说明
空格 分隔命令和数据等
TAB 自己看着用就是了
特殊符号
定色符 ^ 使用3原色(红绿蓝顺序)16进制值定义跟随的文本颜色,仅在文本标示符中有效,此符号有客户端解释,和脚本计算无关
变量规则:
脚本可以×作的变量:
4字节整数(10进制范围是 -2147483647到2147483647)
声明:不支持小数,如果计算结果有余数。余数将舍去。
256字节字符串(也就是128个汉字)
对明确书写的字符串必须用\"\"扩起来
变量名称可以使用英文大小写字母和数字以及下划线构成
自定义变量识别大小写,系统变量无分大小写
自定义变量不可以和系统变量冲突,系统变痢辽参考db文件夹下的const.txt
变量无后缀,表示变量为数值型,
“$”作为后缀,那么变量将作为字符串保存
变量无前缀,单个角色使用,并保存于数据库中
使用了“@”的前缀,单个角色使用,不保存于数据库,该角色下线将被服务器删除
使用了“#”的前缀,同一帐号下的所有角色使用,并保存于数据库中
使用了“#@”的前缀,同一帐号下的所有角色使用,不保存于数据库,该帐号断开后将被服务器删除
使用了“$”的前缀,变量保存在mapreg.txt(默认此文件,可自己改)文件中,全服务器有效
使用了“$@”的前缀,不保存,服务端终止运行后消失
注意:保存于服务器的变量除了服务器变量(“$”开头)一律只能为数字
============
特殊过程名
============
特殊过程名都是以On开头,加上一些特定名字做成
OnInit:
初始化,当脚本首次被map加载就运行的过程,可以先预设一些变量或者执行功能,例如隐藏NPC
OnClock0000:
一天内某一分钟执行,后面的0000表示0点0分
OnMinute00:
每小时的某一分钟执行,后面的00表示0分
OnHour00:
每天的某一个小时执行,后面的00表示0点
OnDate0101:
每年的某一天的0时执行,后面的0101表示1月1日
如果在一个事件中使用On后面使用自定义名称的过程,那么将允许其他脚本调用。
============
程序指令详解
============
命令 mes
名称 消息
用途 发送一个消息给客户端并以窗口模式显示
句型 mes \"这是一个消息窗口\";
mes @temp;
mes \"后面的是一个变量的值\"+@temp;
小技巧 mes后面的\"\"表示其中的内容为文本,必须成对使用。如果希望发送一个变量,可以使用mes @temp; 将@temp的内容转为文本发送。mes 消息可以通过“+”来累加文本
命令 set
名称 赋值
用途 给于变量一个数值或者文本,对变量进行计算。
句型 set @temp1,1;
set @temp2,@temp1 + 1;
set @temp3,@temp1 + @temp2;
set @temptext$,\"这是一个字符变量\";
set @temptest$[1],\"这是在数组中的一个字符变量\";
小技巧 set是主要的变量×作命令,如果要删除一个数字型变量,可以将它的值赋为“0”,如果要删除一个字符串变量,可以写成 set @text$,\"\";
命令 next
名称 刷新
用途 刷新客户端消息窗口的内容,客户端会在消息窗口右下显示一个“下一步”按钮
句型 next;
注意 必须单独一行
命令 close
名称 关闭
用途 要求客户端关闭消息窗口并结束脚本运行,客户端会在消息窗口右下显示一个“关闭”按钮
句型 close;
扩展 close2关闭消息窗口,但不结束脚本而继续执行下一行。
注意 必须单独一行
命令 end
名称 结束
用途 终止脚本运行
句型 end;
小技巧 可以在条件后执行,例如 if (@temp == 1) end;
命令 if
名称 条件
用途 判断条件执行其他命令
句型 if (@temp == 1) mes \"@temp的值为\"+@temp;
if (@temp1 < @temp2) set @temp1,@temp2 + 1;
if (@temp1 > 2 && @temp1 != @temp2) goto Sub_1;
小技巧 和其他语言以及脚本不同的是,无需书写成立(Then)和不成立(Else)的过程,满足圆括号“()”之中的条件执行之后部分,不满足继续到下一行。这里可以充分运用各种运算符,比较符和条件符做成复杂的条件。例如:((@temp1 - @temp2) < @temp3 && @temp4 > (@temp1 + @temp3))
命令 goto
名称 跳转
用途 有条件或者无条件的跳转到一个过程标识符
句型 goto Sub_1;
if (@temp1 > 2 ) goto Sub_1;
命令 input
名称 输入
用途 要求客户端输入一个数值或文本赋值给之后的变量
句型 input @temp;
input @temp$;
命令 doevent
名称 事件
用途 调用一个地图内的事件,或者事件中的某个过程
句型 doevent \"事件名\";
doevent \"事件名::OnSub_1\";
小技巧 事件和NPC很相似,区别在于名字后面的代码,NPC为正整数,事件为-1,NPC需要由客户端激活运行,事件则是由其他NPC执行过程中调用,而且仅在事件设定的地图中有效。调用事件的过程标示符必须用On作为过程名的开头。
命令 callfunc
名称 调用函数
用途 支持在事件,NPC,物品中调用一个全局函数
句型 callfunc \"函数名\";
callfunc(\"函数名\");
小技巧 callfunc(\"函数名\") 执行结果是被调用函数的返回值,参考return
命令 callsub
名称 调用过程
用途 调用本脚本中的一个过程
句型 callsub L_Sub_1;
小技巧 和goto跳转到过程区别在于调用的过程能够返回到原来的调用的语句继续执行,参考return
命令 return
名称 返回
用途 被调用的函数或者过程执行完返回原脚本继续执行,或者返回一个值
句型 return;
return \"返回值\";
小技巧 return \"返回值\" 之中的文本或数值将返回给原脚本,参考callfunc 以及callsub
命令 rand
名称 随机取值
用途 在指定范围内随机返回一个整数,如果指定一个数,那就是0到这个数的范围
句型 set @temp,rand(1,100);
set @temp,rand(-100);
小技巧 要充分运用范围的功能,例如rand(2354,2369),获取一个大于2354小于2369的数
一.数组
1.[]
和C语言用法相同,
在变量后面加上[],表示数组下标,
若不加[],表示数组的第一个元素[0]
2.setarray 起始变量,数值1,数值2,...
赋值操作,把列出的值依次赋给起始变量开始的N个元素
3.getarraysize()
取元素个数
4.copyarray
把一个数组复制到另一个上
5.deletearray 起始变量,N
删除从起始变量起N个元素,之后元素前移
数组使用示例:
prontera.gat,164,190,1 script 数组使用示例 112,{
set @hoge[0],1;
set @hoge[1],5;
mes \"请输入hoge[2]\";
next;
input @hoge[2];
mes \"hoge => \" + @hoge;
mes \"hoge[0]=> \" + @hoge[0];
mes \"hoge[1]=> \" + @hoge[1];
mes \"hoge[2]=> \" + @hoge[2];
next;
setarray @hoge[1],2,3,4,5;
mes \"true: 5,1,2,3,4,5\";
mes \"hoge size = \"+ getarraysize(@hoge);
mes \"hoge[0]=> \" + @hoge[0];
mes \"hoge[1]=> \" + @hoge[1];
mes \"hoge[2]=> \" + @hoge[2];
mes \"hoge[3]=> \" + @hoge[3];
mes \"hoge[4]=> \" + @hoge[4];
next;
copyarray @fuga[0],@hoge[2],2;
mes \"true: 3,4,0\";
mes \"fuga[0]=> \" + @fuga[0];
mes \"fuga[1]=> \" + @fuga[1];
mes \"fuga[2]=> \" + @fuga[2];
next;
deletearray @hoge[1],2;
mes \"true: 1,4,5,0\";
mes \"hoge[0]=> \" + @hoge[0];
mes \"hoge[1]=> \" + @hoge[1];
mes \"hoge[2]=> \" + @hoge[2];
mes \"hoge[3]=> \" + @hoge[3];
close;
}
二.函数与过程
1.callfunc
调用函数,可有返回值
2.callsub
调用过程,无返回值
函数与过程示例:
// 无返回值的函数
function script func001 {
mes \"无返回值的函数\";
next;
return; // 无返回值的函数
}
// 有返回值的函数
function script func002 {
return \"有返回值的函数\";
}
// 函数与过程示例
prontera.gat,168,189,1 script 函数与过程示例 112,{
callfunc \"func001\"; // 调用无返回值的函数
mes callfunc(\"func002\"); // 调用有返回值的函数
next;
callsub L_SUB001; // 调用过程
close;
end;
L_SUB001:
mes \"过程示例\";
return; // 无返回值
}
三.时间日期事件
1.OnSecond%02d
2.OnMinute%02d
3.OnClock%02d%02d
4.OnDateTime%02d%02d%02d%02d
5.OnDayTime%02d%02d%02d
6.OnWeekTime%02d%02d%02d
例: OnDateTime06011200 表示6月1日12:00执行以下脚本
OnDayTime161235 表示每个月16号12:35分执行以下脚本
OnWeekTime001200 表示星期天12:00执行以下脚本
OnWeekTime061200 表示星期六12:00执行以下脚本
增加以上命令,便于安排工会战时间
四.item_db新增脚本执行功能
item_db每行最后可以有四个{},{},{},{}, 最后的空{}可以省略
分别表示使用物品,装备物品后人物属性变化,装备上物品时和卸下物品时执行的脚本命令
1.使用物品
例:
把item_db.txt中苹果行改为
512,Apple,苹果,0,15,,20,,,,,10477567,2,,,,,{ doevent \"Apple_Event\"; },{}
并增加一个脚本
prontera.gat,116,74,0 script Apple_Event -1,{
Announce strcharinfo(0)+\"吃了个大苹果!\",8;
End;
}
则每次吃苹果就会启动Apple_Event (调用事件中某段也可以,只要加上标号,如Apple_Event::OnEatApple)
2.装备物品后人物属性变化
此处仅能用简单修改属性的脚本, 因为每次人物属性变化时都会调用
3.装备上物品时和卸下物品时执行的脚本命令
例如把item_db.txt中短剑行改为:
1201,Knife,短剑,4,50,,400,17,,1,3,10444527,2,2,1,1,1,{},{},{ doevent \"Knife_Event\"; },{ doevent \"Knife_Event2\"; }
再加上以下脚本
prontera.gat,116,73,0 script Knife_Event -1,{
Announce \"偶是\"+strcharinfo(0)+\"!\",8;
Announce \"今天阿爸阿妈给偶买了第一把剑,偶好开心啊,\",8;
Announce \"偶一定要好好练习,或许偶还有机会成为天下第一用剑高手捏!\",8;
End;
}
prontera.gat,116,74,0 script Knife_Event2 -1,{
Announce \"俺是\"+strcharinfo(0)+\"!\",8;
Announce \"别人给俺起了个名字叫做剑魔独孤求败,\",8;
Announce \"俺第一次拿剑便立志要成为天下第一高手\",8;
Announce \"但自从再无敌手之后,俺发誓今生不再用剑...\",8;
End;
} |
温馨提示:
1. 本站模拟器源于网络,经 99Max.mE 二次开发,仅供个人学习娱乐使用,切勿用于商业用途,否则后果自负!
2. 如需更好体验游戏内容,请前往官方游戏!不具备合法的运营模式,都是强盗,请勿擅自搭建私服!
3. 如本站内容有侵犯您的权益,请发送信息至QQ:372607220 或 EMAIL:372607220@qq.com ,我们会及时删除。
|