找回密码
 注册
搜索
查看: 3503|回复: 32

重大发现,彻底修复误入梅林问题!

[复制链接]
门派:明教
发表于 2019-3-24 01:52:50 | 显示全部楼层 |阅读模式
本帖最后由 kkfromch@tj 于 2019-3-27 14:30 编辑
  1. --不废话,直接上code!

  2. lujing.lua——

  3. -----------------------------------------------出梅林-------------------------------------
  4. [b]function mlOutt()[/b]
  5.         tmp.cnt=0
  6.         exe('look')
  7.         wait.make(function()
  8.         wait.time(2.5)
  9.         if flag.find==1 then return end         
  10.                 exe('n')
  11.         return mloutdo()
  12.     end)
  13. end
  14. function mloutdo()
  15.         fastLocate()
  16.         wait.make(function()
  17.         wait.time(1)
  18.         if flag.find==1 then return end         
  19.         if locl.room~='梅林' then
  20.                         return path_consider()
  21.             else
  22.                         return mlOut()
  23.                 end
  24.         end)
  25. end
  26. function mlOut()
  27.     tmp.way = "north"
  28.         tmp.ml = "out"
  29.         exe('w;e;n')
  30.         fastLocate()
  31.         return checkWait(wayMl,0.5)
  32. end
  33. function wait_seconds()
  34.         wait.make(function()
  35.          wait.time(5)
  36.         return wayMl()
  37.     end)
  38. end
  39. function wayMl()
  40.         tmp.cnt=tmp.cnt+1
  41.         if tmp.cnt>50 then
  42.            tmp.cnt=0
  43.            return wait_seconds()
  44.         end
  45.     local ways = {
  46.                 ["north"] = "east",
  47.                 ["east"]  = "south",
  48.                 ["south"] = "west",
  49.                 ["west"]  = "north",
  50.         }
  51.         local wayt = {
  52.                 ["north"] = "west",
  53.                 ["east"]  = "north",
  54.                 ["south"] = "east",
  55.                 ["west"]  = "south",
  56.         }
  57.         if not tmp.way or not ways[tmp.way] then
  58.            tmp.way = 'south'
  59.         end
  60.         if locl.room=="青石板大路" then
  61.            if tmp.ml and tmp.ml=="in" then
  62.               return wayMlOver()
  63.            else
  64.               tmp.way = "north"
  65.               exe(tmp.way)
  66.                   fastLocate()
  67.                   return checkWait(wayMl,0.5)
  68.            end
  69.     end
  70.     if locl.room=="小路" then
  71.            if tmp.ml and tmp.ml=="out" then
  72.                   print('出来了')
  73.                   exe('n')
  74.               return wayMlOver()
  75.            else
  76.               tmp.way = "south"
  77.               exe('south;south')
  78.                   locate()
  79.                   return checkWait(wayMl,0.5)
  80.            end
  81.     end
  82.     if locl.room~="小路" and locl.room~="青石板大路" and locl.room~="梅林" then
  83.        return wayMlOver()
  84.     end       
  85.         tmp.way = ways[tmp.way]
  86.         --[[while not locl.exit[tmp.way] do
  87.             Note(tmp.way)
  88.             tmp.way = wayt[tmp.way]
  89.         end]]
  90.         repeat
  91.        if not locl.exit[tmp.way] then
  92.               Note(tmp.way)
  93.               tmp.way = wayt[tmp.way]
  94.        end
  95.         until(locl.exit[tmp.way])
  96.         --[[if not locl.exit[tmp.way] then
  97.            Note(tmp.way)
  98.            tmp.way = wayt[tmp.way]
  99.         end
  100.         if not locl.exit[tmp.way] then
  101.            Note(tmp.way)
  102.            tmp.way = wayt[tmp.way]
  103.         end
  104.         if not locl.exit[tmp.way] then
  105.            Note(tmp.way)
  106.            tmp.way = wayt[tmp.way]
  107.         end
  108.         if not locl.exit[tmp.way] then
  109.            Note(tmp.way)
  110.            tmp.way = wayt[tmp.way]
  111.         end]]
  112.         exe(tmp.way)
  113.         fastLocate()
  114.         return checkWait(wayMl,0.5)
  115. end
  116. function wayMlOver()
  117.         return path_consider()
  118.     --return walk_wait()
  119. end
  120. -------------------------------------------------------------------------------------------
  121. [b]function path_consider()[/b]
  122.     local l_sour,l_dest,l_path,l_way
  123.     local l_where=locl.area .. locl.room
  124.     sour.rooms={}
  125.     dest.rooms={}
  126.         if sour.id and map.rooms[sour.id].name ~= locl.room then
  127.            sour.id = nil
  128.         end

  129.     if not sour.id and road.id and map.rooms[road.id] and map.rooms[road.id].name == locl.room then
  130.        sour.id = road.id
  131.     end
  132.     if sour.id == nil then
  133.        sour.room=locl.room
  134.        sour.area=locl.area
  135.        sour.rooms=getRooms(sour.room,sour.area)
  136.     end
  137.     if dest.id == nil then
  138.        dest.rooms=getRooms(dest.room,dest.area)
  139.     end
  140.     if sour.id ~= nil then
  141.        chats_locate('定位系统:从【'.. sour.id ..'】出发!')
  142.     else
  143.        chats_locate('定位系统:从【'.. sour.area .. sour.room ..'】出发!')
  144.        if sour.room=="观星台" then
  145.         exe('jump down')
  146.        end
  147.        if table.getn(sour.rooms)==0 then
  148.          if locl.room=='小木筏' then
  149.           return toSldHua()
  150.                  elseif locl.room=='泉水中' then
  151.                     exe('tiao out;tiao out')
  152.                     --quick_locate=0
  153.             return checkWait(goContinue,0.3)
  154.                  elseif locl.room=='水潭' then
  155.                     exe('pa up')
  156.                     --quick_locate=0
  157.             return checkWait(goContinue,0.3)
  158.          else
  159.                         if locl.room_relation=='九老洞九老洞' or locl.room_relation=="不知道哪里九老洞 不知道哪里 九老洞" then
  160.                  exe('drop fire;leave;leave;leave;leave;leave;leave;out;ne;ed;ne;ed')       
  161.                         --quick_locate=0
  162.             return checkWait(goContinue,0.3)
  163.            end
  164.                if locl.room_relation=='西湖边↙|白堤柳浪闻莺西湖边' then
  165.                   exe('sw')       
  166.                   --quick_locate=0
  167.               return checkWait(goContinue,0.3)
  168.                end
  169. [color=Blue]               if locl.room=='梅林' then
  170.                       --quick_locate=0
  171.                       exe('n')
  172.                   return mlOutt()
  173.                end[/color]--[color=Red]就添加这个就行了![/color]
  174.                if locl.room=='渔船' then       
  175.                     exe('out;w;s;out;w;s;out;w;s')       
  176.                            --quick_locate=0
  177.                return checkWait(goContinue,0.3)
  178.            end
  179.           if locl.room_relation~='' then
  180.               chats_locate('定位系统:没有归属地的房间加入了room_relative,【可以尝试定位没有归属地的房间】','LimeGreen')
  181.               --这里可以尝试定位没有归属地的房间
  182.           end
  183.           chats_locate('定位系统:地图系统无此地点【'..locl.area .. locl.room ..'】资料,随机移动寻找确切定位点!','red')
  184.           exe('stand;leave')
  185.           exe(locl.dir)
  186.           return checkWait(goContinue,0.2)
  187.         end
  188.        end       
  189.            if table.getn(sour.rooms)>1 and sour.id~='city/jiangbei' then                                                        ---------------------------------------------------------------------------------------------------
  190.             chats_locate('定位系统:进入第一个同名房间判断【'..sour.room..'】了!','LimeGreen')
  191.              if locl.room_relation~='' then
  192.               chats_locate('定位系统:房间关系为【'..locl.room_relation..'】','LimeGreen')
  193.             end
  194.             for i=1,table.getn(sour.rooms) do
  195.                     if ( locl.room_relation~='' and map.rooms[sour.rooms[i]].room_relative == locl.room_relation) then
  196.                        chats_locate('定位系统:尝试精确定位!','LimeGreen')   
  197.                        sour.id=sour.rooms[i]
  198.                        return check_halt(path_consider)
  199.                        --return go(road.act,dest.area,dest.room,sour.rooms[i])
  200.                     end
  201.             end               
  202.               for p in pairs(locl.id) do
  203.                   local l_cnt = 0
  204.                   local l_id
  205.                   for k,v in pairs(sour.rooms) do
  206.                               local l_corpse
  207.                               if string.find(p,"的尸体") then
  208.                                 l_corpse = del_string(p,"的尸体")
  209.                                   else
  210.                                      l_corpse = p
  211.                                   end
  212.                              if map.rooms[v] and map.rooms[v].objs and (map.rooms[v].objs[p] or map.rooms[v].objs[l_corpse]) then
  213.                                     l_cnt = l_cnt + 1
  214.                                 l_id = v
  215.                                  end
  216.                          end  
  217.                          if l_cnt == 1 then
  218.                      return go(road.act,dest.area,dest.room,l_id)
  219.                   end
  220.               end
  221.                   if not roomMaze[l_where] then
  222.              for p in pairs(locl.exit) do
  223.                 local l_cnt = 0
  224.                     local l_id
  225.                 for i=1,table.getn(sour.rooms) do
  226.                     if map.rooms[sour.rooms[i]] and map.rooms[sour.rooms[i]].ways and map.rooms[sour.rooms[i]].ways[p] then
  227.                        l_cnt = l_cnt + 1
  228.                                   l_id = sour.rooms[i]
  229.                         end
  230.                 end
  231.                 if l_cnt == 1 then
  232.                        return go(road.act,dest.area,dest.room,l_id)
  233.                     end
  234.              end
  235.                   end
  236.            end
  237.            if roomMaze[l_where] then
  238.               if type(roomMaze[l_where])=='function' then
  239.                      l_way = roomMaze[l_where]()
  240.                   else
  241.                      l_way = roomMaze[l_where]
  242.                   end
  243.            end
  244.        if l_way then
  245.           exe(l_way)
  246.               exe("yun jingli")
  247.           chats_locate('定位系统:地图系统此地点【'..locl.area .. locl.room ..'】无简单路径,移动寻找确切定位点!','red')
  248.           return checkWait(goContinue,0.5)
  249.        end
  250.        if table.getn(sour.rooms)>1 and sour.id~='city/jiangbei' then                                                              -------------------------------------------------------------------------
  251.           if locl.room_relation~='' then   --触发器获取到房间相对关系字符串
  252.             for i=1,table.getn(sour.rooms) do
  253.                     if (locl.room_relation~='' and map.rooms[sour.rooms[i]].room_relative == locl.room_relation) then
  254.                        chats_locate('定位系统:精确定位房间id为:【'..sour.rooms[i]..'】','LimeGreen')
  255.                        sour.id=sour.rooms[i]
  256.                        return check_halt(path_consider)               
  257.                        --return go(road.act,dest.area,dest.room,sour.rooms[i])
  258.                      else
  259.                         chats_locate('定位系统:地图系统此地点【'..locl.area .. locl.room ..'】无法精确定位,随机移动!','red')
  260.                         exe('stand;leave')
  261.                         exe(locl.dir)
  262.                         return checkWait(goContinue,0.5)
  263.                     end
  264.             end
  265.           else
  266.             chats_locate('定位系统:地图系统此地点【'..locl.area .. locl.room ..'】存在不止一处,随机移动寻找确切定位点!','red')
  267.             exe('stand;leave')
  268.             exe(locl.dir)
  269.             return checkWait(goContinue,0.5)
  270.          end
  271.        end
  272.     end

  273.     if dest.id == nil and table.getn(dest.rooms)==0 then
  274.        Note('Path Consider GetRooms Error!')
  275.        return false
  276.     end
  277.     path_create()
  278.     return check_halt(path_start)
  279. end
  280. -------------

  281. [b]最后,rooms.lua[/b]

  282. Room {
  283.         id = "meizhuang/plum_maze",
  284.         name = "梅林",
  285.         ways = {
  286.                 ["#mlOutt"] = "meizhuang/road2",
  287.                 --["#inmz"] = "meizhuang/road3",
  288.         },
  289. }
复制代码
门派:明教
 楼主| 发表于 2019-3-24 05:18:47 | 显示全部楼层
梅林问题已彻底解决,走多深都能自动走出来,而且不会导致mush死机,分分钟搞定梅林!

测试了一晚上,总算搞定了,现在去睡觉,白天更新code,并细细剖析之前梅林走不出来的问题!
门派:铁掌帮
发表于 2019-3-24 07:10:15 | 显示全部楼层
这么晚还没睡么,太辛苦了   
门派:丐帮
发表于 2019-3-24 09:07:21 | 显示全部楼层
搞了一夜吗?辛苦辛苦            
门派:明教
 楼主| 发表于 2019-3-24 14:41:44 | 显示全部楼层
下面细细剖析,梅林迷宫之前频繁死机,走不出来的原因,供mush机器人爱好者参考!

第一大坑,mush 路径倒走问题:

以前的梅林迷宫机器人,有很大概率是可以走出来的,但是在上方小路拐角处,往往会出现**现象,本来都走出来了,又**进了梅林,如此反复数次,导致mush死机!

请看这个log:
http://www.sjever.net/bbs/forum.php?mod=viewthread&tid=227696

> 【你现在正处于梅庄】
                                               
                                    
                   石级-----小路               
                             |     
                            小路               
小路 -
TRACE: Matched trigger locate2
TRACE: 正在执行 trigger 脚本 "local_area"
unset look
石级-----小路|小路小路
    这是一条折向南边的小路,前面不远处是一大片梅林,放眼望去,遍地都
是梅树,老干横斜,枝叶茂密,想像初春梅花盛开之日,香雪如海,定然观赏
不尽。
  这是一个初秋的凌晨,东方的天空布满了灰蒙蒙的云层。
    这里明显的出口是 south 和 west。
TRACE: Matched trigger locate3
TRACE: 正在执行 trigger 脚本 "local_exit"
> Ok.
>
TRACE: Fired timer wait_timer_2927
TRACE: 正在执行 timer 脚本 "wait.timer_resume"
TRACE: Fired timer walkWait
TRACE: 正在执行 timer 脚本 "walkTimer"
alias action 正在赶路中
TRACE: Fired timer walkWait
TRACE: 正在执行 timer 脚本 "walkTimer"
alias action 正在赶路中
你把 "action" 设定为 "正在赶路中" 成功完成。
TRACE: Matched trigger walk1
TRACE: 正在执行 trigger 脚本 "walk_goon"
>
TRACE: Matched trigger hp12
TRACE: 正在执行 trigger 脚本 "resetWait"
TRACE: Fired timer roadWait
TRACE: 正在执行 timer 脚本 "path_start"
halt
south
south
south
south
south
south
south
south
southwest
south
south
south
south
south
south
south
west
northwest
southwest
east
east

评分

1

查看全部评分

门派:明教
 楼主| 发表于 2019-3-24 14:46:12 | 显示全部楼层
这一段路径是哪里来的呢?我跑一个log,大家一看就明白了!

<!-- Produced by MUSHclient v 4.84 - www.mushclient.com -->


> 【你现在正处于扬州城
                                               
                                    
               长江南岸---
长江南岸---长江南岸  
                             |     
                          江南官道            
长江南岸 -
unset look
长江南岸---长江南岸---长江南岸|江南官道长江南岸
    面前是一条波涛翻滚的大江(river)。 浊流滚滚,万舟竞发。两岸渡船来
来往往,江边一长溜摆满了鱼摊,渔家就将船泊在岸边,支一块木板,板上摆
满了活蹦乱跳的鲤鱼。不远处是一个摆渡,不少过江客都在这里等待渡船。
  
这是一个初秋的凌晨,东方的天空布满了灰蒙蒙的云层。
    这里明显的出口是 east、southwest
l_exit=east、south 和 west
p=east
p=south
p=west
  桃花岛第二代弟子「武当任务杭州城万年春」一阵风(Vent)
  
本高面带凝涩之气,双目低垂内视。
  慕容十二眼神凌厉,神态极为凝重。
  本飞面带凝涩之气,双目低垂内视。
  似水流年双手捏个剑诀,脸上紫气浮现。
  小蓓风面容肃穆,静坐如渊岳,沐轻风而不惊。
  米哥风面容肃穆,静坐如渊岳,沐轻风而不惊。
  慕容七号眼神凌厉,神态极为凝重。
  大草海的卡丽熙「送信二明教聚议厅」丹妮莉丝(Bank) <战斗中>
  普通百姓 船夫四(Boate)
  普通百姓「赶路中」长江南(Cjiangn)
  普通百姓 纤夫二(Qianfub)
  天杀门杀手 慕容谈(Murong tan)
<战斗中>
  仲孙风的尸体(Corpse)
  枯干的骸骨(Hai gu)
> 现在是书剑丁卯年七月十六日卯时二刻。
您参与游戏的主机北京时间是 星期日 2019-三月-24 14:46:17
                悉尼时间是 星期日 2019-三月-24 17:46:17 (夏令时间)
      奥克兰、惠灵顿时间是 星期日 2019-三月-24 18:46:17
      温哥华、洛杉矶时间是 星期六 2019-三月-23 22:46:17
        多伦多、纽约时间是 星期日 2019-三月-24 01:46:17
    柏林、罗马、巴黎时间是 星期日 2019-三月-24 07:46:17
您已经连续玩了一分五十二秒。
你最近玩了二小时八分二十五秒。
贵宾系统提示:您目前不是贵宾,如何成为贵宾请看( help vip )。
贵宾生效时间:您没有贵宾生效时间记录。
你共有贵宾累计时间:二十九天十一小时四十八分四秒。
> 你把 "action" 设定为 "等待一下" 成功完成。
halt
> Ok.
> 你现在不忙。
halt
> 你现在不忙。
halt
south
southeast
south
south
south
south
south
south
south
south
south
southwest
south
south
south
south
south
south
south
west
northwest
southwest
east
east
east

> 你现在不忙。
> 江南官道 -
    你走在一条青石大道上,人来人往非常繁忙,不时有人骑着马匆匆而过。
北面是长江下游近入海口的地方,东南面通往姑苏城。
  
这是一个初秋的凌晨,东方的天空布满了灰蒙蒙的云层。
    这里明显的出口是 northsoutheast
> 苏州北郊 - northwest、south、southwest、west
  桃花岛第二代弟子「美女在苏州城头门山」铁锈风(Rust) <战斗中>
  枯干的骸骨(Hai gu)
  
东北捕头 南柏芝(Nan baizhi) <战斗中>
  任小姐(Beauty)
> 北门 - north、south、west
  华山派风清扬传人「华山任务中」仙缘(Renxian)
  长鞭(Changbian)
  武将(Wu jiang)
  夜行衣(Yexing yi)
  二位官兵(Guan bing)
  枯干的骸骨(Hai gu)
> 北大街 - east、north、south、west
>
alias action 正在赶路中
北大街 -
east、north、south、southwest、west
  静岚的尸体(Corpse)
> 沧浪亭 - north、south、southeast、southwest
  丐帮帮众 青年乞丐(Qi gai)
> 宝带桥 - north、northeast、northwest、south
  古墓派神雕侠侣传人「华山任务中」米笑(Tzhulei)
  游客(You ke)
  小贩子(Xiao fan)
> 南大街 - east、north、northeast、south、southwest、west
> 南大街 - east、north、south、west
> 南门 - north、south
  武将(Wu jiang)
  二位官兵(Guan bing)
> 青石官道 - north、northeast、southeast、southwest
  二只野兔(Ye tu)
> 山路 - east、northeast、south、west
> 山路 - east、north、south、west
> 青石大道 - north、south
> 北门 - north、south
  武将(Wu jiang)
  二位官兵(Guan bing)
> 青石大道 - east、north、south、west
  公良羲的尸体(Corpse)
> 青石大道 - east、north、south、west
> 青石大道 - east、north、south、west
  江北山贼 迟空(Chi kong)
>
alias action 正在赶路中
鸿昌客栈 - east、north、up、west
  店小二(Xiao er)
> 岳王庙 - east、enter、northwest、southeast、west
> 白堤 - north、northeast、northwest、southeast、southwest、west
  九龙城天伤楼主 邢睿(Recluzpr) <战斗中>
  二位游客(You ke)
  孙赞浩(Sun zanhao)
<战斗中>
  游客(You ke)
> 孤山 - east、north、northeast、south、west
  钢刀(Blade)
  箫(Xiao)
  方灰的尸体(Corpse)
> 西湖边 - east、west
  天龙寺第十三代弟子「武当任务杭州城青石大道」本科(Dzs)
  二位游客(You ke)
> 石级 - east、west
> 小路 - south、west
> > 你把 "action" 设定为 "正在赶路中" 成功完成。
> 你把 "action" 设定为 "正在赶路中" 成功完成。
>
alias action 正在定位
unwield sword
unwield sword 2
unwield qiankun xiao
unwield mu jian
unwield fengyun xiao
i
wield fengyun xiao
i
id here
set look
l
time
你把 "
action" 设定为 "正在定位" 成功完成。
> 你身上没有这样东西。
> 你身上没有这样东西。
> 你身上没有这样东西。
> 你身上没有这样东西。
> 你身上没有这样东西。
> 你身上带着十一件东西(负重 3.97%):
  五十二两
白银(Silver)
  十八锭
黄金(Gold)
  八十一文
铜钱(Coin)
布履(Shoes)
绿色圣衣(Cloth)
翡翠玉镯(Bangle)
龙凤玉佩(Jade)
白金指环(Ring)
紫晶项链(Necklace)
黄金头饰(Headgear)
背囊(Bei nang)
> 你身上没有这样东西。
> 你身上带着十一件东西(负重 3.97%):
  五十二两
白银(Silver)
  十八锭
黄金(Gold)
  八十一文
铜钱(Coin)
布履(Shoes)
绿色圣衣(Cloth)
翡翠玉镯(Bangle)
龙凤玉佩(Jade)
白金指环(Ring)
紫晶项链(Necklace)
黄金头饰(Headgear)
背囊(Bei nang)
> 在这个房间中, 生物及物品的(英文)名称如下:
金庸 = jinyong
> 设定环境变量:look = "YES"
> 【你现在正处于梅庄
                                               
                                    
                   石级-----
小路               
                             |     
                            小路               
小路 -
unset look
石级-----小路|小路小路
    这是一条折向南边的小路,前面不远处是一大片梅林,放眼望去,遍地都
是梅树,老干横斜,枝叶茂密,想像初春梅花盛开之日,香雪如海,定然观赏
不尽。
  
这是一个初秋的凌晨,东方的天空布满了灰蒙蒙的云层。
    这里明显的出口是 southwest



看明白了吧?这一段路径就是从长江南岸到梅庄的路径!
门派:明教
 楼主| 发表于 2019-3-24 14:51:59 | 显示全部楼层
那么这个就好奇怪了,明明都走出梅林了,为啥还会走长江南岸到梅庄的路径呢?

我在上边用红色标记了一句code:

TRACE: 正在执行 timer 脚本 "path_start"

也就是说,在小路拐角处,因为执行了函数path_start(),导致了这个问题!

我们来看看小路拐角处,执行了什么程序?

    if locl.room=="小路" then
           if tmp.ml and tmp.ml=="out" then
              return wayMlOver()
           else
              tmp.way = "south"
              exe('south;south')
                  locate()
              return checkWait(wayMl,0.1)
           end
    end

function wayMlOver()
    return walk_wait()
end

---------

也就是说,判定是小路的话,那么就认为已经走出梅林,转为执行wayMlOver(),然后再去执行walk_wait()
门派:明教
 楼主| 发表于 2019-3-24 15:01:22 | 显示全部楼层
好吧!这个walk_wait()是个很深的坑,大家不要以为任何时候路径断掉,执行一个walk_wait()就能解决问题,这个坑真得很深!

walk_wait()具体的内容就不贴了,总之会执行一条alias“正在赶路中”,然后跳转去执行path_start()

function path_start()
    EnableTrigger("hp12",false)
    EnableTimer("roadWait",false)
        DeleteTimer("roadWait",false)
    local l_road
    road.i=road.i + 1
    if flag.find==1 then return end
    if road.i>table.getn(road.detail) then
           locate_finish='go_confirm'
       return locate()
    end
……
……
path_start的内容不多说,以免一些程序小白看得头晕,我就简单说说原理——

它是给road.i这个变量每次+1,执行一次,+1一次,直到road.i>table.getn(road.detail)。

啥意思呢?

原来road.detail装着行走的路径,存储在一个个表单元里,大概的规则是,一次装入road.steps个方向,例如——

e;w;s;n....一直到,比如我的road.steps是72步,那就一直装72个方向。

如果72个方向装完了,路径还没装完怎么办?

那就walk_wait一下,然后换第二个表单元继续装,也是装到72个方向为止,直到所有路径都装进去为止!

碰上#号,就表示这里是迷宫函数,那就单独装一个单元。

岛主的武当前置搜索,就是把最后几步拆开,一个个装进road.detail里,那么就变成走一步停一下,达到了前置搜索的效果了!
门派:明教
 楼主| 发表于 2019-3-24 15:13:16 | 显示全部楼层
    road.i=road.i + 1
    if road.i>table.getn(road.detail) then

总之,road.i就是个指针,每+1一次,就指向road.detail的单元,读取里边的行走路径,然后行走,直到road.detail里所有的单元路径都走完为止!

举例来说——

从宋远桥到梅庄小路:

road.detail单元1:从宋远桥到长江北岸
road.detail单元2:渡江函数
road.detail单元3:从长江南岸到梅庄小路。

一共是三段!

那么我们就知道了,road.i最后=4,因为4>3,跳出path_start,确认是否到达目的地?路径行走完毕!

------

那么梅林倒走的问题是怎么发生的呢?

有时候我们做任务杀掉npc,在梅林里边,我们返回时,执行了go函数,这里边会让road.i=0,也就是重新开始一段路径,清空之前的指针。

然后接下来是path_consider,考虑路径是否可行?如果可行,就执行path_create,创建路径;创建完毕后,执行path_start,开始新的行走。

但是问题正是出在这里!

因为在path_consider里有个梅林识别,假如发现梅林房间,就跳转去执行mlOutt(),然后走出来了之后,直接执行path_start了!根本没有执行path_create

各位看官,大家还记得path_start里装着什么吗?

对喽!就是最后那段路径,从长江南岸到梅庄小路,而且road.i被go函数赋予0,所以导致再次执行长江南岸到梅庄小路的路径,这也就是梅林倒走发生的原因了!

很绕吧?绕了我好久才搞清楚原因,真是太坑了!
门派:明教
 楼主| 发表于 2019-3-24 15:21:38 | 显示全部楼层
知道了原因,修复就很简单了!

把原来所有梅林的walk_wait函数,统统替换成path_consider,也就是说,我不信任path_start了,谁知道里边装着什么东东?

我统统path_consider,然后重新执行path_create,再path_start!

----

所以有关第一个梅林倒走问题,分析到这里就结束了,总的感觉walk_wait是个好东西,比如路径断掉了,比如发呆了,比如要了任务机器人停了,用它来续上断点确实很方便!

但walk_wait的背后是path_start,它是利用road.i指针来读取road.detail的行走路径,所以必须要慎重!

在渡江渡河和迷宫之后,不建议用walk_wait,容易发生路径乱走。

path_consider更靠谱一些!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|书剑永恒MUD ( 闽ICP备14012032号|闽公网安备 35050202000162号 )

GMT+8, 2025-6-7 03:10 , Processed in 0.065164 second(s), 27 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表