- 积分
- 6108
- 注册时间
- 2024-9-14
- 最后登录
- 2025-4-29
- 在线时间
- 197 小时
版主
- 积分
- 6108
- 威望
- 381
- 金币
- 1612
- 贡献
- 4622
|
Blue引擎+登录器+程序全部免费开放,QQ快捷登陆,加入BLUE引擎论坛!
您需要 登录 才可以下载或查看,没有账号?立即注册
×
【引擎版本0524-18】
首次自动扩展monster.db出错问题(之前版本的引擎,多次运行也可以完成自动扩展)
修正部分技能不进行攻击触发问题(比如疾光电影)
大幅度减少生物对消息的响应时间,提高游戏体验
飞行类魔法伤害生效时间更准确
增加NPC脚本的循环支持,#for和#~for,配对使用,循环内部支持完整的#if,#act,#elseact...流程,
注意此次更新需要重新上传远程脚本数据,远程脚本数据和之前的版本数据也不兼容!
配套NPC变量<$LoopCursor>,为当前循环游标变量,获取效率比自定义的游标变量稍高
配套NPC执行命令:BreakLoop,用于中断当前的循环层,并非整个字段中断;整个字段中断仍然使用Break
支持多层次的循环嵌套(见下发自定义技能示例)
格式:
#for (游标变量 = 初始值表达式, 游标变量 < 检测值, 游标变量 + 步进值) // 循环开始和声明
; 中间是完整的#if/#act/#elseact原脚本流程
#if
; ...
#act
; ..
#elseact
; ...
#~for // 循环结束标识
; 初始声明:即【游标变量 = 初始值表达式】部分,“游标变量”的初始化,“初始值表达式”支持单个整数或变量,或者一个运算表达式,如:游标变量 = M_SPLIT_CNT - 1(注意写法,中间留有空格)
; 条件声明:即【游标变量 < 检测值】部分,循环条件限制,“游标变量”小于“检测值”会继续循环,否则将终止循环,“检测值”可以是只读的整数或整数变量,比较符号支持:<小于、>大于、=等于、!不等于、?大于等于
; 步进声明:即【游标变量 + 步进值】部分,游标步进方法,“步进值”支持整数或整数变量,运算符号支持:+加、-减、*乘、/除、%取模、=等于
; “游标变量”建议实用D0~99,M0~99这种非自由定义的整数变量,效率较好
例:
[@loopex]
; 这里没有写#if true,不需要,程序会自动识别
#act
; 分解出*blue引擎*数字,剩余部分是中文汉字
RegExSplitCapture 一1二2三3四4五5六6七7八8九 [0-9]+
SendMsg 7 剩余字的符串数量:<$STR(M_SPLIT_CNT)>
SendMsg 7 *BLUE引擎*数字的数量:<$STR(M_MATCHED_CNT)>
; 循环游标D99从0初始化,至M_SPLIT_CNT - 1取S_SPLIT_STRS[n]的值,每次步进1
#for (D99 = 0, D99 < M_SPLIT_CNT, D99 + 1)
#if
; 此次更新同时会自动补全true,可以忽略
; true
#act
SendMsg 5 S_SPLIT_STRS步进1:<$STR(S_SPLIT_STRS[<$STR(D99)>]>
#~for
; 循环游标D99从0初始化,至M_MATCHED_CNT - 1取S_SPLIT_STRS[n]的值,每次步进1
#for (D99 = 0, D99 < M_MATCHED_CNT, D99 + 1)
#if
#act
SendMsg 6 S_MATCHED_STRS步进1:<$STR(S_MATCHED_STRS[<$STR(D99)>]>
#~for
; 倒退循环,初始D99 = M_SPLIT_CNT - 1,D99 大于等于 0,每次步退1
#for (D99 = M_SPLIT_CNT - 1, D99 ? 0, D99 - 1)
#if
#act
; 这里使用<$LoopCursor>变量,效率稍高些,等同于<$STR(D99)>
SendMsg 7 S_SPLIT_STRS步退1:<$STR(S_SPLIT_STRS[<$LoopCursor>]>
#if
; 游标到6后中断掉循环,会跳出循环继续执行(#~for之后),如果使用Break,则后续不再执行
CompVal <$LoopCursor> = 6
#act
BreakLoop
#~for
; 上个循坏之外继续执行
SendMsg 7 上个循坏之外继续执行...
; 自己定义跳出循环变量
Mov M99 1
; 先定义一个无限循环(不建议,除非你熟悉脚本的写作)
#for (D99 = 0, D99 < 1, D99 - 0)
; 运算M99
#if
#act
Inc M99 10
; 循环10万次后中断循环
#if
Equal M99 100000
#act
SendMsg 7 循环中断于<$STR(M99)>...
BreakLoop
#~for
#if
#act
SendMsg 7 循环结束<$STR(M99)>...
增加NPC脚本的区间选择支持,#case和#~case,配对使用,内部支持的#if,#act,#elseact...流程,仅单层
格式和示例:
[@TestCase]
#act
; 产生一个0~99之间的随机数字
SetRandomNO 100
Mov M99 <$RANDOMNO>
#case (M99) // case开始,括号里的声明仅一个整数变量(Mxx,Dxx...等或此类自定义变量)
#0: // 选择器常量声明,“#”开头,后面是单个数字,以“:”结束
#if // 一个普通的#if/#act/#elseact流程
#act
SendMsg 5 命中:<$STR(M99)>
#1~9: // 选择器常量声明,“#”开头,后面可以是数字区间,以“:”结束,下同
#if
#act
SendMsg 5 <$STR(M99)>在1~9之间
#10~89:
#if
#act
SendMsg 5 <$STR(M99)>在10~99之间
#86,88,91~93: // 以“,”分开多个数字区间的写法
#if
#act
SendMsg 5 <$STR(M99)>在86,88,91~93之间
#def: // 默认选择,如果上面的数字区间均未命中,则默认选择此流程;可以不写,但是都未命中则不执行任何流程
#if
#act
SendMsg 5 <$STR(M99)>其他数字,默认执行此选择
#~case // case结束标识
注意:不允许在#case里执行#for循环,但是允许在#for里包含#case
注意:数字区间禁止重叠,如果重叠加载NPC脚本时会提示,同时重叠的数字区间将失效!
攻击触发里增加目标坐标变量:<$TARINFO_CX>,<$TARINFO_CY>
技能触发[@MagSelfFuncXX]是,<$PARAM(1)>是目标X坐标,<$PARAM(2)>是目标Y坐标
增加释放魔法NPC命令:MagicFire 1技能ID 2等级(0~15) 3显示技能效果(0/1) 4方式(-2链式 -1溅射 0自己,1当前目标,自定义坐标X) 5自定义坐标Y[可选] 6技能延迟(毫秒)[可选] 7自定义坐标强显效果(0/1)
注:支持普通魔法技能和合击技能,不包含战士技能,不支持技能触发,不支持攻击触发,无举手动作,需配套客户端更新!
当参数4为-1时,参数5为溅射技能半径,建议使用T.MagicFire方式
当参数4为-2时,参数5为链式技能半径,建议使用T.MagicFire方式
当使用自定义坐标时,X和Y支持批量方式,如:11|22|33 44|55|56
当自定义坐标有效且参数7不为0是,将不检测目标有效性,强制显示技能效果
例1:
[@attack]
#act
SetRandomNO 60 65
#if
CompVal <$ATTINFO_ISHERO> = 1
#act
h.MagicFire <$RANDOMNO> 5 1 1
#elseact
MagicFire 13 11 1 1
MagicFire <$RANDOMNO> 15 1 1
例2:
[@MagSelfFunc11]
#act
; 暂存技能ID
Mov M97 11
goto @CustomMagic
[@MagSelfFunc13]
#act
; 暂存技能ID
Mov M97 13
goto @CustomMagic
[@CustomMagic]
#act
; 存放XY坐标组,使用“|”间隔
Mov S98 ""
Mov S99 ""
; 多层循环,M0/M1分别从-2至+2,构成一个5x5的攻击范围方格
#for (M0 = -2, M0 < 3, M0 + 1)
#for (M1 = -2, M1 < 3, M1 + 1)
#if(1)
; 过滤掉中间的重合点
CompVal <$STR(M0)> ! 0
CompVal <$STR(M1)> ! 0
#act
; 将计算得出24个坐标放置在S98和S99
Calc "<$PARAM(1)>+0<$STR(M0)>" M98
Calc "<$PARAM(2)>+0<$STR(M1)>" M99
Inc S98 <$STR(M98)>|
Inc S99 <$STR(M99)>|
#~for
#~for
#if
CompVal <$PARAM(0)> = 0
#act
MagicFire <$STR(M97)> <$MAGICLEVEL(<$STR(M97)>)> 1 <$STR(S98)> <$STR(S99)> 500 1
#elseact
h.MagicFire <$STR(M97)> <$MAGICLEVEL(<$STR(M97)>)> 1 <$STR(S98)> <$STR(S99)> 450 1
例3:
[@Attack]
#act
Mov M99 <$ATTINFO_SKILLID>
#case (M99)
#1, 5, 13, 104, 105, 107~110:
#if
CompVal <$ATTINFO_ISHERO> = 1
#act
; 以怪物为中心发出溅射技能
T.MagicFire <$ATTINFO_SKILLID> <$H.MAGICLEVEL(<$ATTINFO_SKILLID>)> 1 -1 3
; 以怪物为主逐次发出链式技能
; T.MagicFire <$ATTINFO_SKILLID> <$H.MAGICLEVEL(<$ATTINFO_SKILLID>)> 1 -2 4
#elseact
T.MagicFire <$ATTINFO_SKILLID> <$MAGICLEVEL(<$ATTINFO_SKILLID>)> 1 -1 3
; T.MagicFire <$ATTINFO_SKILLID> <$MAGICLEVEL(<$ATTINFO_SKILLID>)> 1 -2 4
#~case
增加正则匹配检测NPC命令:RegExMatch 源字符 匹配表达式 // S1是需要检测的字符串,可以到https://www.jyshare.com/front-end/854/验证
例:
; "1[34578]\d{9}" // 手机号码
; "\$[0-9A-Fa-f]+" // NPC说话内容里的16进制颜色
; 检测查源字符中是否包含有URL
#if
; 检测到内容里有网址
RegExMatch 源字符 "[a-zA-Z]+:\/\/"
#act
增加正则替换字符NPC命令:RegExReplace S1 查找表达式 替换字符 替换次数(默认1次) // 使用正则表达式方式,在S1中按“查找表达式”查找,找到后替换为“替换字符”,结果还是在S1中 // 相关资料可参考https://www.runoob.com/regexp/regexp-tutorial.html
见下面例子
增加正则分解捕获NPC命令:RegExSplitCapture 源字符 查找表达式
匹配的字符串数量在:<$STR(M_MATCHED_CNT)>
匹配的字符串保存在:<$STR(S_MATCHED_STRS[n]> // n是数字,在0至“<$STR(M_MATCHED_CNT)> - 1”之间
分解后剩余的字符串数量在:<$STR(M_SPLIT_CNT)> // “分解后剩余的字符串”指不包含匹配字符串的剩余部分,比如源字符是:左中右,按表达式“中”分解后,剩余字符串是:左和右(数量2),匹配字符串是:中(数量1)
分解后剩余的字符串保存在:<$STR(S_SPLIT_STRS[n]> // n是数字,在0至“<$STR(M_SPLIT_CNT)> - 1”之间
例:
#act
; <$STR(M_MATCHED_CNT)>将等于2
; <$STR(S_MATCHED_STRS[0])>将等于:123
; <$STR(S_MATCHED_STRS[1])>将等于:456
; <$STR(M_SPLIT_CNT)>将等于3
; <$STR(S_SPLIT_STRS[0])>将等于:左
; <$STR(S_SPLIT_STRS[1])>将等于:中
; <$STR(S_SPLIT_STRS[2])>将等于:右
RegExSplitCapture 左123中456右 [0-9]+
item数据表中的物品,RareItem字段包含128才可以设置物品描述,在出产时将触发QF的[@ProduceItem],其中:
不要大量设置物品的RareItem包含128,防止系统压力过大!
$PARAM(0) // 来源
$PARAM(1) // 物品ID
$PARAM(2) // 时间
$PARAM(3) // 物品名
$PARAM(4) // 地图
$PARAM(5) // 出产者
$PARAM(6) // 物主
$PARAM(7) // 是否装备类物品(0/1)
$PARAM(8) // 物品的looks
增加设置物品描述NPC命令:SetItemDesc 物品ID 描述 0前缀/1中间/2后缀 // 不支持重叠物品!当“描述”为空时将删除对应物品ID的描述;需要客户端配套,仅AC客户端支持该功能!
增加设置物品属性NPC命令:SetEqUIpProp 物品ID 属性类型(1~31) 属性值 过期秒数(可选,默认-1永久,大于0为过期秒数) @过期触发(可选) // 类型对应的属性参考鉴定属性,过期触发QF的[@过期触发]
例:
; QM
[@OnStart]
#act
; 服务器启动时,加载物品描述数据并设置后台自动保存
; 注意“H_ItemPreDesc”(前缀)、“H_ItemMidDesc”(中间)、“H_ItemSufDesc”(后缀)为系统保留标识,请勿占用
; 注意引擎开启后,不要去读写下列数据文件,防止文件占用冲突导致存取失败
Hash H_ItemPreDesc Load ..\ItemData\ItemPreDesc.csv
Hash H_ItemPreDesc BGSave ..\ItemData\ItemPreDesc.csv
Hash H_ItemMidDesc Load ..\ItemData\ItemMidDesc.csv
Hash H_ItemMidDesc BGSave ..\ItemData\ItemMidDesc.csv
Hash H_ItemSufDesc Load ..\ItemData\ItemSufDesc.csv
Hash H_ItemSufDesc BGSave ..\ItemData\ItemSufDesc.csv
; 服务器启动时,加载装备属性数据并设置后台自动保存
; 注意“H_ItemProp_1~31”为系统保留标识,请勿占用
; 注意引擎开启后,不要去读写下列数据文件,防止文件占用冲突导致存取失败
#for (M_cur = 1, M_cur < 32, M_cur + 1)
#if
#act
; <$STR(M_cur)>等同于<$LoopCursor>
Hash H_ItemProp_<$STR(M_cur)> Load ..\ItemData\ItemProp_<$STR(M_cur)>.csv
Hash H_ItemProp_<$LoopCursor> BGSave ..\ItemData\ItemProp_<$LoopCursor>.csv
#~for
; 脚本示例
[@ProduceItem]
#act
; 装备名称下加几个星星
SetItemDesc <$PARAM(1)> "" 0
; 设置来源
; 注意物品的描述文字里不要带逗号“,”,消耗品不建议添加物品描述
; <字符串|c=clRed>,“字符串”是红色,没有在尖括号内的字符为普通白色
; ,调用magic5.wzl索引位置0的图片(magic5不写默认为ui1),可选项:N=帧数,X=偏移X,Y=偏移Y,W=指定宽度,H=指定高度,F=帧间隔(默认125毫秒,N>1有效)
; 类似上面的图片,可以手动编辑一个静态表,物品名做键,值则是对应的图片数据,在服务器启动时实用Hash加载,之后在脚本中根据名字来快速取得应用数据
; FormatStr "\来源:<%s|c=clRed>\地图:<%s|c=$4AD663>\产者:<%s|c=$E9A000>\<物主:|c=clSkyBlue><%s|c=$5CF4FF>\<时间:%s|c=clLime>" <$PARAM(0)> <$PARAM(4)> <$PARAM(5)> <$PARAM(6)> <$PARAM(2)>
FormatStr "来源:<%s|c=clRed>\地图:<%s|c=$4AD663>\产者:<%s|c=$E9A000>\<物主:|c=clSkyBlue><%s|c=$5CF4FF>\<时间:%s|c=clLime>" <$PARAM(0)> <$PARAM(4)> <$PARAM(5)> <$PARAM(6)> <$PARAM(2)>
SetItemDesc <$PARAM(1)> <$CALCRESULT> 2
#if
; 判断是否是装备类
CompVal <$PARAM(7)> ! 1
#act
break
#if
#act
; 设置装备攻击、魔法、道术都+1万,且为不同的过期时间
SetEquipProp <$PARAM(1)> 1 10000 10 @属性过期_AC
SetEquipProp <$PARAM(1)> 2 10000 15 @属性过期_MC
SetEquipProp <$PARAM(1)> 3 10000 20 @属性过期_SC
; 设置属性描述
; 每种属性的倒计时格式:,其中:T~装备ID,P=是装备属性类型,仅用于物品描述中
FormatStr "%-13s <剩余|c=clLime>%s\%-13s <剩余|c=clLime>%s\%-13s <剩余|c=clLime>%s" "攻击 10000" "<t~|P=1 c=clLime>" "魔法 10000" "<t~|P=2 c=clLime>" "道术 10000" "<t~|P=3 c=clLime>\"
; 设置此物品在中间位置的属性描述
SetItemDesc <$PARAM(1)> <$CALCRESULT> 1
; QF
[@属性过期_AC]
#act
; 先获取物品属性描述到S_tmp
Mov S_tmp <$HASH(H_ItemMidDesc)<$PARAM(1)>>
; 然后清理属性
SetEquipProp <$PARAM(1)> 1 ""
; 去掉对应的属性描述 // 比如去掉:“攻击 12345 <剩余|c=clLime>|P=1 c=clLime>\”
RegExReplace S_tmp "攻击 [0-9]+.*?\\" ""
; 更新修改后的属性描述
SetItemDesc <$PARAM(1)> <$STR(S_tmp)> 1
[@属性过期_MC]
#act
Mov S_tmp <$HASH(H_ItemSufDesc)<$PARAM(1)>>
SetEquipProp <$PARAM(1)> 2 ""
RegExReplace S_tmp "魔法 [0-9]+.*?\\" ""
SetItemDesc <$PARAM(1)> <$STR(S_tmp)> 1
[@属性过期_SC]
#act
Mov S_tmp <$HASH(H_ItemSufDesc)<$PARAM(1)>>
SetEquipProp <$PARAM(1)> 3 ""
; 去掉前两个汉字包含:攻击|魔法|道术...的属性描述
RegExReplace S_tmp "(攻击|魔法|道术) [0-9]+.*?\\" ""
SetItemDesc <$PARAM(1)> <$STR(S_tmp)> 1
【引擎版本0524-18】客户端更新
支持自定义物品附加描述,配套引擎更新
物品描述的图片支持更多选项
【引擎版本0524-18】其他更新
合区工具支持基于Hash命令保存的物品ID数据文件
合区工具日志搜索改用简单实用的表达式方式
合区工具调整UI
控制台清理支持csv、ini、json等扩展名
</t~</t~</t~
|
|