//~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->