//~silent
// 挂机自动练习
// 四区白三三
($localVer) = 2022062701
($changeLog) = 🆕 新增练习结束后远程通知功能。
($flowName) = 精确练习
($flowCode) = jqlx
($flowPath) = 提升
($flowFinder) = 提升
//($repourl) = https://cdn.jsdelivr.net/gh/mapleobserver/wsmud-script
($repourl) = http://wsmud-cdn.if404.com
@js ($version) = $.ajax({type: "GET", url: "(repourl)/version.txt", async: false, cache: false}).responseText;
[if] (version) != null
@js ($remoteVer) = var v = (version);v.(flowCode)
[if] (localVer) < (remoteVer) && (remoteVer) != null
[if] (UPnum) == null
($UPnum) = 0
[if] (UPnum) < 2
[if] (UPnum) == 1
@print 未获取到最新版本,使用备用地址再次尝试...
($repourl) = http://wsmud-cdn.if404.com
($UPnum) = (UPnum) + 1
[if] (flowPath) != 根文件夹 && (flowPath) != null
($flowSource) = (repourl)/(flowPath)/(flowName).flow.txt
[else]
($flowSource) = (repourl)/(flowName).flow.txt
[if] (flowFinder) == null
($flowFinder) = 根文件夹
@js WG.SendCmd("tm 当前(flowName)版本【(localVer)】,将开始自动更新至最新【(remoteVer)】。")
($f_ss)={"name":"(flowName)","source":"(flowSource)","finder":"(flowFinder)"}
@js var time = Date.parse( new Date());var f=(f_ss);var n=f["name"];var s=f["source"];var fd=f["finder"];WorkflowConfig.removeWorkflow({"name":n,"type":"flow","finder":fd});$.get(s,{stamp:time},function(data,status){WorkflowConfig.createWorkflow(n,data,fd);});
@wait 1500
($log) = ✅(flowName)已更新至最新版【(remoteVer)】,即将自动运行。
[else]
($log) = ⭕(flowName)暂时无法正常更新至【(remoteVer)】,直接运行当前版本【(localVer)】。
($UPnum) = null
@js WG.SendCmd("tm (log)")
@print (log)
[if] (UPnum) != null
@js var f=(f_ss);ManagedPerformerCenter.start(f["name"], FlowStore.get(f["name"]));
[exit]
[else]
($UPnum) = null
[if] (remoteVer) == null
($log) = ⚠️获取远程版本失败,维持当前版本不变。
[else]
($log) = 🚀开始运行(flowName),当前版本【(remoteVer)】。更新内容:(changeLog)
@js WG.SendCmd("tm (log)")
@print (log)
@toolbar jh
//获取境界
[while] (jj) == null
@toolbar score
@js ($jj) = $(`span[data-prop=level]`).text()
//获取等级上限
[while] (level) == null
@toolbar skills
@js ($level) = /\d+/.exec($(".obj-money").text())['0']
//参数预置
[(LXMap)==null]($LXMap) = 住房-练功房
[if] (:room 副本区域) == true
($LXMap) = 原地不动
($LXEnd) = 原地防掉线
//($LXtts) = 打开
[(OffLxTriggers) == null]($OffLxTriggers) = 续冰心,续飞翼,续药飞翼,鼓舞续药飞翼,续药飞翼徽章,补冰心,补飞翼
[(Chiyao) == null]($Chiyao) = 是
[(Feiyi) == null]($Feiyi) = 是
[(LXEnd) == null]($LXEnd) = 闭关或挖矿
[LXAfter] == null]($LXAfter) = $zdwk
[(LXtts) == null]($LXtts) = 关闭
[(LXtts) == 打开]($LXtts) = 远程通知
[(Type) == null]($Type) = 练至上限
//选择练习方式、其它选项
#select ($Type) = 当前技能上限为(level)级
 * 练习方式,批量指定等级|指定等级|练至上限|手动填写,(Type)
#input ($LXBefore) = 练习前执行命令(用英文;隔开),(LXBefore)
#input ($OffLxTriggers)=关闭触发(多个触发名字用英文逗号隔开),(OffLxTriggers)
#select ($LXMap) = 练习地点,住房-练功房|帮会-练功房|原地不动,(LXMap)
#select ($Chiyao) = 是否吃冰心丹,是|否,(Chiyao)
#select ($Feiyi) = 是否补飞翼(请事先装备飞翼剑),是|否,(Feiyi)
#select ($LXEnd) = 练习结束后操作,原地防掉线|闭关或挖矿|打坐|自定义命令,(LXEnd)
#input ($LXAfter) = 练习结束后执行命令(自定义命令模式,多个命令用英文;隔开,默认请填$zdwk),(LXAfter)
#select ($LXtts) = 练习结束后通知玩家,远程通知|语音播报|提示音|关闭,(LXtts)
#config
//获取技能列表、根据练习方式显示不同选项
[if] (Type) == 指定等级 || (Type) == 练至上限 || (Type) == 批量指定等级
#input ($info1) = 练习方式:(Type);上限等级:(level);吃冰心丹:(Chiyao);补飞翼:(Feiyi),👇👇👇
[if] (Type) == 指定等级
#input ($info2) = 需要练习哪些技能,在右边输入框中填入指定等级即可,不练习的保持不变。,👇👇👇
[if] (Type) == 批量指定等级
#input ($batchLxLevel) = 批量练习到指定等级,(level)
($_i) = 0
[while] (_i) < 62
@js ($s(_i)) = $(".skill-item").eq('(_i)').attr('skid')
[if] (s(_i)) == null
[break]
@js ($n(_i)) = $(".skill-item").eq('(_i)').html().match(/[^\d]*/)
@js ($n(_i)) = '(n(_i))'.replace(/span class="skill-level"/,'')
@js ($n(_i)) = '(n(_i))'.replace(/<>/, '')
@js ($ln(_i)) = $(".skill-item").eq('(_i)').text().match(/[0-9]+/)
[if] (s(_i)) != literate && (s(_i)) != lianyao
[if] (Type) == 指定等级
#input ($l(_i)) = (n(_i))当前等级(ln(_i)),(ln(_i))
[else]
#select ($k(_i)) = (n(_i))当前等级(ln(_i)),练习|跳过,跳过
($_i) = (_i) + 1
#config
[else if] (Type) == 手动填写
#input ($info1) = 练习方式:(Type);上限等级:(level);吃冰心丹:(Chiyao);补飞翼:(Feiyi),👇👇👇
#input ($info2) = 手动填写技能,会按照从上往下顺序练习,👇👇👇
#select ($manType) = 练习方式,指定等级|练至上限,练至上限
@js ($Skill)=var ss="(Skill)";ss.replace(/,/g,",").replace(/"/g,"").replace(/'/g,"")
@js ($ss)=var ss=("\""+"(Skill)"+"\"");ss.replace(/,/g,"\",\"").split(",")
($_i) = 0
[while] (_i) < 30
@js ($n(_i)) = [(ss)][(_i)]
($n) = (_i) + 1
#input ($n(_i)) = 练习技能(n),(n(_i))
($_i) = (_i) + 1
#config
($_i) = 0
[while] (_i) < 30
[if] (n(_i)) != null && (n(_i)) != 炼药术 && (n(_i)) != 读书写字
@js ($skillbase) = '(n(_i))'.indexOf('基本')
[if] (skillbase) != -1 || (n(_i)) == 野兽扑咬
($skilltype) = base
[else]
($skilltype) = skill
@js ($s(_i)) = $(".(skilltype):contains((n(_i)))").attr("skid")
[if] (s(_i)) != null
//@print (s(_i))
@js ($ln(_i)) = $(".(skilltype):contains((n(_i)))").text().match(/[0-9]+/)
@js ($n(_i)) = $(".(skilltype):contains((n(_i)))").html().match(/[^\d]*/)
@js ($n(_i)) = '(n(_i))'.replace(/span class="skill-level"/,'').replace(/<>/, '').replace(/✔/, '').replace(/.*<\/span>/g,'')
[if] (lx_skill) == null
($lx_skill) = '(s(_i))'
[else]
($lx_skill) = (lx_skill),'(s(_i))'
[if] (lx_name) == null
($lx_name) = '(n(_i))'
[else]
($lx_name) = (lx_name),'(n(_i))'
[if] (lx_level) == null
($lx_level) = (ln(_i))
[else]
($lx_level) = (lx_level),(ln(_i))
($_i) = (_i) + 1
// 手动填写模式的两种练习方式
@js ($slen) = [(lx_skill)].length
[if] (manType) == 指定等级
#input ($info2) = 练习方式:(Type)-(manType);上限等级:(level);吃冰心丹:(Chiyao);补飞翼:(Feiyi),👇👇👇
[if] (slen) == 0
@print 未设定任何技能!
$zdwk
[exit]
($_i) = 0
[while] (_i) < (slen)
@js ($n(_i)) = [(lx_name)][(_i)]
@js ($s(_i)) = [(lx_skill)][(_i)]
@js ($ln(_i)) = [(lx_level)][(_i)]
#input ($l(_i)) = (n(_i))当前等级(ln(_i)),(ln(_i))
($_i) = (_i) + 1
#config
@cmdDelay 500
//生成练习清单
($lx_skill) = null
($lx_name) = null
($lx_level) = null
($_j) = 0
[while] (_j) < (_i)
[if] (k(_j)) == 练习 || (manType) == 练至上限
[if] (Type) == 批量指定等级
@js ($l(_j)) = (batchLxLevel)
[else]
@js ($l(_j)) = (level)
[if] (l(_j)) != null && (l(_j)) > (ln(_j)) && (s(_j)) != null
//技能id
[if] (s(_j))==force || (s(_j))==unarmed || (s(_j))==dodge || (s(_j))==parry || (s(_j))==sword || (s(_j))==blade || (s(_j))==whip || (s(_j))==throwing || (s(_j))==staff || (s(_j))==club || (s(_j))==bite
($baseYes) = true
[if] (lx_skill) == null
($lx_skill) = '(s(_j))'
[else]
[if] (baseYes) == true && (Type) != 手动填写
($lx_skill) = '(s(_j))',(lx_skill)
[else]
($lx_skill) = (lx_skill),'(s(_j))'
//练习等级
[if] (lx_level) == null
($lx_level) = (l(_j))
[else]
[if] (baseYes) == true && (Type) != 手动填写
($lx_level) = '(l(_j))',(lx_level)
[else]
($lx_level) = (lx_level),'(l(_j))'
//技能名称
@js ($n(_j)) = '(n(_j))'.replace(/✔/, '')
@js ($n(_j)) = '(n(_j))'.replace(/.*<\/span>/g,'')
@print 练习(n(_j))[(s(_j))]至(l(_j))级
@js ($n(_j)) = '(n(_j))'.replace(/<[^>]+>/g,'')
tm 练习(n(_j))[(s(_j))]至(l(_j))级
[if] (lx_name) == null
($lx_name) = '(n(_j))'
[else]
[if] (baseYes) == true && (Type) != 手动填写
($lx_name) = '(n(_j))',(lx_name)
[else]
($lx_name) = (lx_name),'(n(_j))'
($_j) = (_j) + 1
//@print 技能名称:(lx_name)
//@print 技能代码:(lx_skill)
//@print 练习等级:(lx_level)
[if] (lx_skill) == null
未设定任何技能!
$zdwk
[exit]
[if] (Type) == 手动填写
($Skill) = (lx_name)
//@print (Skill)
//关闭指定触发、检查触发有效性
[if] (OffLxTriggers) != null
@js ($tgs)=var ts=("\""+"(OffLxTriggers)"+"\"").replace(/,/g,",");ts.replace(/,/g,"\",\"").split(",")
@js ($tl)=[(tgs)].length
@print 关闭指定触发:(OffLxTriggers)
($num)=0
[while] (num)<(tl)
@js ($t)=[(tgs)][(num)]
@js ($checkT) = unsafeWindow.TriggerCenter._checkName("(t)")
[if] (checkT) != true
[if] (lxtrigger) == null
($lxtrigger) = (t)
[else]
($lxtrigger) = (lxtrigger),(t)
@js ($checkT2) = unsafeWindow.TriggerCenter._triggers["(t)"].active()
[if] (checkT2) == true
[if] (offT) == null
($offT) = (t)
[else]
($offT) = (offT),(t)
@js ToRaid.perform(`@off (t)`);
($num)=(num)+1
($OffLxTriggers) = (lxtrigger)
//@print (OffLxTriggers)
//@print (offT)
<-stopSSAuto
//获取技能数量
@js ($skill_num) = [(lx_skill)].length
//传送到练功房
stopstate
[if] (LXMap) != 原地不动
$to (LXMap)
//练习前执行命令
[if] (LXBefore) != null
(LXBefore)
@wait 5000
//循环练习
($num)=0
($tip_done)=start
[while] (num) < (skill_num)
//开场吃药开飞翼
[if] (num) == 0
[if] (:status food) == false && (Chiyao) == 是 && {b冰心丹}? != null
stopstate
use {b冰心丹}?
@await 1000
//判断是否用飞翼
[if] (:status fy) == false && (Feiyi) == 是
stopstate
use (:eq0)
@await 1000
//几种练习节点判断
[if] (tip_done) != null || (tip_limit) != null || (tip_base) != null
($tip_done) = null
($tip_limit) = null
($tip_base) = null
//获取技能id和练习等级
@js ($skill_name) = [(lx_name)][(num)]
@js ($skill_id) = [(lx_skill)][(num)]
@js ($target_level) = [(lx_level)][(num)]
stopstate
//开始练习
@await 500
//检查当前房间和状态
[if] (:room) != (LXMap) && (LXMap) != 原地不动
stopstate
[if] (:room) == 扬州城-矿山 || (:state) == 挖矿
stopstate
(LXBefore)
@await 5000
$to (LXMap)
@await 500
//开始练习,同时避免@tip对同一句内容重复生效
lianxi (skill_id) (target_level)
//判断练习状态
@tip 缺乏($tip_limit)经验|已经练习($tip_done)了|练习($tip_done)毕|你的($tip_base)功火候未到|等级($levelup)了|提升到($levelup)级|你的($tip_qn)不够
[if] (levelup) != null
//判断是否吃药
[if] (:status food) == false && (Chiyao) == 是 && {b冰心丹}? != null
stopstate
use {b冰心丹}?
@await 1000
//判断是否用飞翼
[if] (:status fy) == false && (Feiyi) == 是
stopstate
use (:eq0)
@await 1000
($levelup) = null
[continue]
[if] (tip_limit) != null
tm 技能上限不足(target_level)级,(skill_name)无法继续练习。
[else if] (tip_base) != null
tm 基础技能等级不足(target_level)级,(skill_name)无法继续练习。
[else if] (tip_done) != null
tm (skill_name)已练习(target_level)级,继续练习下一个。
[else if] (tip_qn) != null
tm 潜能不够,停止练习!
[break]
($num) = (num) + 1
stopstate
//还原指定触发
[if] (offT) != null
@js ($tgs)=var ts=("\""+"(offT)"+"\"").replace(/,/g,",");ts.replace(/,/g,"\",\"").split(",")
@js ($tl)=[(tgs)].length
@print 还原指定触发
($num)=0
[while] (num)<(tl)
@js ($t)=[(tgs)][(num)]
@js ToRaid.perform(`@on (t)`);
($num)=(num)+1
//练习结束
[if] (LXtts) == 远程通知
@push 【练习结束】(:name)精确练习已结束,请及时上线处理。
[else if] (LXtts) == 语音播报
$tts 练习结束,请及时处理。;$wait 5000;$music
[else if] (LXtts) == 提示音
@beep
[if] (LXEnd) == 原地防掉线
[while] true
tm (:hour):(:minute):(:second) 原地防掉线功能已开启
lianxi (skill_id) (target_level)
@await 10000
[else if] (LXEnd) == 闭关或挖矿
$zdwk
[else if] (LXEnd) == 打坐
dazuo
[else if] (LXEnd) == 自定义命令
(LXAfter)
stopSSAuto->