前面讲解了MUSH机器的基础部分,这次直接上机器的核心了。就以森林/僵尸副本机器人为例: 
 
开始命令,初始化什么的就不说了,大家到群72442263里去下载打包版,前面提到的Me.lua什么的都在里面。如果没有特殊需要,直接按照说明运行就可以了。如果想学习代码,请继续往下看。 
 
机器的主要的结构函数就是main,另一个主要的功能函数就是fight,即每进入一个迷宫房间要做的事。 
 
大家看代码里的注释就应该明白了。 
me.main = function() 
        repeat 
                me.goMaze()    --  进入副本 
                Maze.walk(me.fight)   -- 在副本里面逛,Maze.walk会遍历这个迷宫,而me.fight就是战斗,也就是说每次走进一个迷宫房间,就进行战斗,战斗结束后继续 
                if me.needOutOfMaze() then  -- 该出副本就出来吧 
                        Execute("out;e") 
                        me.inMaze = false 
                        if me.stop then me.term = true end    -- 这里设置结束标志,否则出来后会自动再次进副本 
                elseif me.kickedout then    --  副本过期被踢出,一般打的慢的ID,还没打完就刷新或者刚打完不久久要刷新,如果只跑一圈太浪费,那么就反复跑,直到副本自己到期 
                        me.inMaze = false 
                        wait.time(2) 
                        Execute("ask nan xian about all") 
                        local l, w = wait.regexp("^[> ]*(南贤在你的耳边悄声说道.*|这里没有 nan xian 这个人。)$") 
                        if string.find(l, "南贤") then Execute("e") end   -- 在副本里瞎逛时被踢出,有可能停在武庙,也有可能刚好逛到北大街,所以这里看下自己究竟是不是在武庙 
                end 
        until me.terminate()     -- 用户输入stop命令,这里出了副本就不再进了 
end 
 
每个房间的战斗函数,每次在迷宫里walk的时候会回调这个函数 
me.enemy_list = {"tiger", "bear", "wolf", "snake", "dragon", "zombie"} 
me.fight = function() 
        local enemycount = 0 
        for _, enemy in pairs(Maze.obj) do   -- 对迷宫里存在的敌人下kill指令。  我看见不少人的机器为了偷懒,直接发一堆kill指令,结束后发一堆get all from corpse n (森林机器),虽然不影响机器运行,但是由于发了很多无效指令,不得不到处wa防止被雷劈 
                for _, v in ipairs(me.enemy_list) do 
                        if string.find(enemy, v) then 
                                Execute("kill ".. enemy) 
                                enemycount = enemycount + 1 
                                break 
                        end 
                end 
        end 
        if enemycount > 0 then 
                Me.auto_pfm()   -- 如果该房间存在敌人,那么自动pfm 
                if var.mazeName == "forest" then   -- 森林副本战斗结束之后搜尸体 
                        wait.time(0.1) 
                        for i = 1, enemycount do Execute("get all from corpse " .. i) end 
                end 
        end 
        if Maze.baoxiang then   -- 如果存在宝箱,那么捡宝 
                Maze.baoxiang = false 
                Execute("open bao xiang;get all from bao xiang")    -- 这里根据个人喜好,可以修改为只捡宝箱里的黄金 
        end 
        Me.check_state(function() 
                if var.w10b and var.w10b ~= "" then    -- 检查状态,如果有10b且内力过低,则摸10b 
                        if Me.force < (var.lowforce + 0 or 80000) then 
                                Execute("touch " .. var.w10b) 
                        end 
                else 
                        if Me.force < 10000 then    -- 如果没有10b,则在内力低于1万的时候吃罗刹丹 
                                Execute("eat luosha dan") 
                                local l, w = wait.regexp("^[> ]*(你吃下一粒罗刹无常丹,内力得到了完全的补充。|你身上没有 luosha dan 这样东西。)$") 
                                if string.find(l, "罗刹无常丹") then wait.time(3) end 
                        end 
                end 
                Me.heal()    -- 在前面确保内力之后,进行疗伤 
                Me.eat(false, false)   -- 需要吃喝就吃喝吧 
        end) 
        Execute("jdo")   -- 每次打扫迷宫之后,自行jdo这个alias,如果有10b的话,可以alias jdo do yanjiu,lian,jiqu,没有10b可以alias jdo jiqu,当然也可以yanjiu+jiqu,练习就不必了,毕竟没有10b就不要在这里浪费内力了 
        wait.time(1) 
        Execute("halt") 
        if var.mazeName == "forest" and Maze.isOut() then 
                Execute("give all to hunter")    --  森林副本的出口出需要give all 
        end 
        if me.terminate() or me.needOutOfMaze() or me.kickedout then 
                return 1 
        end 
        if tonumber(var.explimit) and Me.exp and tonumber(var.explimit) < Me.exp then   -- 如果到了经验上限,自动把经验bup给宠物,不喜欢bup不要设置经验上限,或者直接把代码去掉 
                Execute("bup 1000000") 
                wait.time(5) 
        end 
        return 0 
end 
 
 
 
 |