北大侠客行MUD论坛

 找回密码
 注册
搜索
热搜: 新手 wiki 升级
查看: 15527|回复: 14

zmud721高级进阶指导

[复制链接]
发表于 2014-1-1 01:32:26 | 显示全部楼层 |阅读模式
看到很多人零散问一些zmud721的问题,觉得有必要做一个系统的应用高级进阶指导。

Q:Zmud721,MC,Zmud462优劣比较
A:无答案
个人观点如下:
Zmud462简单易用,路径工作量大,但是设置合理模式也可以很快甚至超越zmud721和MC
Zmud721简单易上手,缺点需要规避乱码问题,优点再多bug他也能运行
MC编程复杂,需要计算机语言基础,缺点某些小bug会导致崩溃,高手无视

Q:Zmud721乱码怎么办
A:可以规避乱码
目前中文mud都是得到中文触发,然后输入你需要的英文指令。所以只要解决中文抓取问题,所有问题迎刃而解。

抓取中文然后判断比较应用实例:
宽阔苦逼人走了过来。
触发: (%x)走了过来。
Trigger:#if %ismember(%1,"宽阔苦逼人") {kiss him;kill him}

抓取字符中间的某个部分:比如我只要抓取“宽阔”
使用正则触发:(\S{4})\S*走了过来
Trigger:#if %ismember(%1,"宽阔") {kiss him;kill him}

以上可以解决全部乱忙抓取问题,灵活运用即可。

Q:如何得到任务目标地点比如“扬州城 北大街”
A:举例如下
zone=扬州城
room=北大街
zoneid=%zonenum(@zone)
#var temp %concat( "Zoneid = @zoneid and [name] = '@room')
room_list=%mapquery(@temp)

当然这只是简单举例还有其他应用,灵活掌握。例如定位
#var temp %concat( "Zoneid = @zoneid and [name] = '@room' and [desc] Like '%@room_desc1%' and [desc] Like '%@room_desc1%')
gps=%mapquery(@temp)

Q:如何得到目标房间周围n个房间
A:很多方法(方法很多,自己选择合的)
方法一举例:zscript (房间多可能比较慢)
区域:zone=1
房间号:room=1
范围:range=2
room_list=%maquery(Zoneid = @zone)
search_list=""
#forall @room_list {#var distance %numitems(%pathexpand(%pathfrom(@room,%i)))
#if (@distance<(@range+1) and @distance>0) {#additem search_list %i}
}

方法二举例:使用VBS直接连接数据库查询(结果秒到)
由于代码太长,本处紧部分举例,不提供完整代码。具体需要可以私信联系我吧。
'-----------------------------连接数据库----------------------------------
Dim job_room_list
Dim no_Repeat_list_all
ReDim no_Repeat_list_all(0)
ReDim job_room_list(0)
Dim no_Repeat_list_bak
ReDim no_Repeat_list_bak(0)
Dim target_out_room
Dim target_room_array
Dim no_enter_list
Dim goto_end
goto_end=0

target_room_list=getvar("job_room_list","").value
step=getvar("job_range","").value
char_id=getvar("char_id","").value
zone_id=getvar("zone_id","").value
fpath=".\"&char_id&"\mymud.mdb"

'-----------------------------连接数据库----------------------------------
Set Conn=CreateObject("adodb.connection")
Set Rs=CreateObject("ADODB.Recordset")
strCon="DBQ="&fpath&";DRIVER={Microsoft Access Driver (*.mdb)};"   
Conn.Open strCon
'-----------------------------连接数据库----------------------------------

Q:如何遍历
A:方法也很多,本文仅仅举例快搜遍历方法

很多时候我们得到一个搜索列表如100|101|102|103
我们可以通过%walk(),和%pathfrom(a,b)得到房间之间的路径,然后在路径之间加入alias,最后会得到一个路径比如:
e;e;e;e;e;killnpc;s;killnpc;n;killnpc
这样就可以快速搜索所有房间了。注意killnpc只是举例,搜索npc方法很多自己确认合适的

Q:如何做到最佳路径搜索
A:通过搜索路径出来的结果通常按照广度优先排列,其实很多时候不是很科学,如何获得最佳路径呢,个人方法如下:
制作地图时,按照最佳顺序逐个画房间,那么当你得到一串房间以后直接%sort(@search_list),就是最佳路径了。

Q:如何尽量不通过某些距离很短,但是很多问题的房间
A:设置房间cost,比如设置20,那么通过这条路径需要比其他路径少20步才能通过,设置方法后面介绍

Q:如何关闭进入房间(包括特殊丐帮地道,护镖不走地道等等)
A:设置房间do not enter 通过设置cost来达到
房间1设置为禁止进入
#MENU {Mapper|File|Map Creation Mode}
#NOOP %roommode(1)
#noop %roomcost(1,2147483647)
#MENU {Mapper|File|Follow Mode}
房间1设置为允许进入
#noop %roomcost(1,0)
房间1设置为允许进入,但不建议进入,需要消耗20点路径长度
#noop %roomcost(1,20)

得到搜索房间的列表的时候我不想看到cost高于1000的房间
zone=扬州城
room=北大街
zoneid=%zonenum(@zone)
#var temp %concat( "Zoneid = @zoneid and [name] = '@room' and cost < 1000)
room_list=%mapquery(@temp)

Q:目标房间某些原因和其他房间断开了
A:举例房间1 s一步是 房间2
断开房间s方向路径
#MENU {Mapper|File|Map Creation Mode}
#NOOP %roommode(1)
%roomlink(1,s,-1)
#MENU {Mapper|File|Follow Mode}
重新连接房间s方向路径
#MENU {Mapper|File|Map Creation Mode}
#NOOP %roommode(1)
%roomlink(1,s,2)
#MENU {Mapper|File|Follow Mode}

Q:如何使用room script
A: room script很强大,理论上讲,可以做到所有任务都在room script里面实现,机器人只要alias走路就行
room script举例:
#if @job=hyd {kill npc}
只要你走到该房间,任务是hyd时候就kill npc,所以你可以alias job。
真的很强大只是抛砖引玉而已。

其他建议:
1,模块化机器人
举例很多时候需要用到打坐信息,可以设置一个dazuo模块,比如
alias: set_dazuo XXX
#if %1=job {
alias start_dazuo {YYYY}
alias after_dazuo {zzzz}
}
alias: set_heal XXX
#if %1=job {
alias start_heal {YYYY}
alias after_heal {zzzz}
}
以后每次使用的时候只要set_dazuo job就可以了。
该模块化同样适用全局机器人,比如检查物品,接任务,前往地点,搜索,杀人,回家,学习,领悟

最后祝大家玩的开心。

北大侠客行MUD,中国最好的MUD
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2014-1-1 08:03:49 | 显示全部楼层
以前看楼主关于721的帖子颇有收获
今天突然就诈尸了!
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
 楼主| 发表于 2014-1-1 10:24:59 | 显示全部楼层
新年第一篇强一下
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2014-1-1 12:18:50 | 显示全部楼层
解决乱码的还是没看懂。。。
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2014-1-1 17:33:47 | 显示全部楼层
神贴又现~
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
 楼主| 发表于 2014-1-1 21:52:15 | 显示全部楼层
回复 4# hanzoln


就是一次性抓取,判断中文不用
@aa=苦逼
而用%ismember(@aa,苦逼)

第二抓取以后不要再次赋值。
不如aa=苦逼
bb=@aa
你去变量那里就能看到aa不乱码但是bb乱码

不要经过中间转换就不是乱码。

还有其他方法防止乱码,比如将变量写到地图库里面。
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2014-1-2 08:46:29 | 显示全部楼层
顶楼主,确实是强帖啊
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2014-1-2 08:51:45 | 显示全部楼层
回复 6# oolong


    再问楼主一下,对于推车时伙计的名字,抓取时有的字是“?”,比如“康”等,这样的情况如何处理?
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
 楼主| 发表于 2014-1-3 13:49:47 | 显示全部楼层
你没有说明你得到中文后的用途啊。
假定如下:
康库(kang ku)
触发(%x)~(*)
name=%1
id=%2

kill @id

然后
(%x)死了。
触发:
#if %ismember(%1,@name){get gold from corpse}
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
 楼主| 发表于 2014-1-3 14:14:01 | 显示全部楼层
再举例。
萧峰说去把康库杀了。
name=康库

康库(kang ku)
触发:(%x)~(*~)
#if %ismember(%1,@name) {#stop;kill %2}
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|北大侠客行MUD ( 京ICP备16065414号-1 )

GMT+8, 2024-11-28 07:35 AM , Processed in 0.013803 second(s), 14 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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