找回密码
 注册
搜索
查看: 1820|回复: 25

EVERMUD 更新至V2.2 正式版(zmud4.62可编程版)内置浏览器,可调用脚本和子程序

[复制链接]
门派:古墓派
发表于 2019-8-23 23:18:18 | 显示全部楼层 |阅读模式
本帖最后由 kkndbdra@tj 于 2019-9-2 22:58 编辑

融合zmud和mush风格制作的一个客户端,既可以写zmud风格机器人,也可以写mush 风格脚本,或者混合使用。请大家多多支持!

编程语言 python 3
游戏自带python 3.7.3解释器

版本更新:2.2
修正了一些底层触发器的相互覆盖的BUG.

新增了一个自建别名的函数 make_cmds(cmds)

改变了变量存储方式,长久变量需要保存在 self.lscope 里,取值 :/self.lscope["hero_id",存值:/self.lscope["hero_id"]=ABCDE  

匹配的结果现在存在slef.OUTCOMES 变量里      例子:@x=self.OUTCOMES.group(1)

改进了# 悬浮选择框
slot_gbox_checks_create(group_number,title_str,boxs_list,)
现在可以绑定一组指令当zmud4.62的按钮用


版本更新:2.00
内建函数全部完工
自定义标签页以完成
自定义悬浮框以完成
以及其他自定义窗口
加入了判断 断线,发呆的函数。可以发呆,断线,重连
修复了一些引起占用CPU过高的BUG。减小了文件体积
LL版2.0内置浏览器,正式完工。可以保存网页中的图片,用鼠标右键。

[调用打开网址的函数:/WD.open_url_tab("http://www.163.com") 大家可以在登陆游戏后直接在命令行里试一试。(LL版本有效)

evermudLL版本文件超过了论坛限制, 请去百度盘下载地址:https://pan.baidu.com/s/1BYeYNcbNnrld_OTNby5bAw



关于 mush lua公版机器人的使用:
思路一:lua和python的语法非常接近,有些关键字都是一样的,书写缩进格式也差不多相同,简单替换一些语句应该就可以拿来用。但是修改工程量较大。
思路二:使用subprocess模块通过shell调用lua脚本的函数,这个应该可行。

思路三:大家合力重新编写一个python 版的自动寻路模块。其他的模块单独编写应该不难。



python 的第三方库比lua多很多,有很多功能用python很容易完成。
原来lua的脚本函数可以作为子程序调用。利用subprocess模块(已内置) 实用函数subprocess.Popen()

运行环境:

理论上windows 64位的版本都行(32位的版本暂时还没有编译)

点击evermud.exe进入程序

LL版本点击evermudll.exe 进入程序


角色设置里的几个英文按钮 暂时没有做好,需要捆绑数据库模型,比较麻烦暂时就不做了。
mush里面其实大家也没怎么用过,用内置函数是一样的,不影响使用和挂机。

保留了控制台用于观测错误信息,输出一些有用的信息。
大家多测试一下,看看在云主机上能不能挂机。
以及有什么死机报错的信息大家多多反馈,谢谢啦!


简要说明: 之前写的太复杂,现在一切从简。
你可以把evermud 看作 zmud4.62 可编程加强版  两者指令输入格式一摸一样的。
你唯一要做的就是用evermud内建函数代替 zmud的# 指令(内建函数在文章最后,随版本更新)

例如:
zmud 输入指令格式:  buy doufu;#wait 5000;eat doufu
evermud 输入指令格式:  buy doufu;/ti.sleep(5);eat doufu

zmud 输入指令格式:  ABCDE;#wait 1000;A12345      --输入账号和密码
evermud 输入指令格式:   ABCDE;/ti.sleep(1);A12345 --输入账号和密码
是不是很简单?

给变量赋值,变量解值,函数调用变量:
1 快捷写法:@给变量赋值,/为变量解值 作为字符串直接发送给服务器
@myid="ABCDE";@password="A12345";/myid;/ti.sleep(2);/password

2 函数式中级写法:
@myid="ABCDE";@password="A12345";/WD.send_str(myid);/ti.sleep(2);/WD.send_str(password)

3外部脚本式写法
如果你要编写异常复杂的脚本并导入,这个就没办法了,必须要懂一门任意编程语言编写自定义函数,并且阅读后面的详细说明。

例子:@area="大理";@person="朱丹臣";@target=(area,person);/go(target)    -----其中go()是你自定义的函数,你需要自行定义或者从外部脚本导入它。

1 如何登陆?

方法一:点击坐上角的新建文档,填写一个文档名称和IP地址,端口,IP地址直接写数字,(不要填英文网址,网址解析器没有做好。)

快捷方法二:
游戏目录里有一个 account\\sample 文件夹,config.ini里面贮存的是一个模板账号信息和 triggers.text是一个简单的模板登录机器人。
直接在account 文件夹里复制 sample 文件夹然后重命名(例如aaaaaa)。(不要使用中文,用英文小写)
修改config,ini如下内容:
account= aaaaaa(与文件夹同名)
hero_id= 你的登录ID
password= 你的登录密码
然后 点载入文档 就会自动连接了。

如何使用机器人?
和ZMUD4.62 类似的,原理都差不多。想偷懒的话可以去抄zmud4.62的机器人。
然后用/函数 代替 #指令 ,例如/ti.sleep(5);buy doufu 等价于#wait 5000;buy doufu.你只需要到最后的托管函数列表里面找相同或者类似函数代替zmud的指令就行。
点击 脚本/扩展 菜单里的  python扩展 按钮 选择 account\\sample 文件夹中的triggers.txt 导入,成功后会在控制台中看见导入结果。

如果你想像mush一样用脚本编写复杂程序 请阅读详细说明里的内容。

几个触发器的标准写法:其实就是一个简单的自动登录机器人
注意单引号和双引号配合使用,你外层使用的单,内层就要用双,反之亦然。要不然就要使用转义字符\.例如\n,\",\'
{'root': 'unknown', 'flags': re.M, 'open': '1', 'times': '0', 'exe_as': '0', 'pattern': r'Are you using BIG5 font(y/N)?', 'reply': 'n'}  --reply 里存的是触发器反馈的指令,n 是字符串,没有使用解析符直接发送给服务器。

{'root': 'unknown', 'flags': re.M, 'open': '1', 'times': '0', 'exe_as': '0', 'pattern': r'您的英文名字\(ID\)是:', 'reply': '/ti.sleep(1);/hero_id'} --/hero_id 作为变量解析,/是解析符号,调用hero_id这个变量的值。  /ti.sleep(5) 执行 ti.sleep(5)并返回其结果发送,这里结果是None(空),只是等待时间5秒。

{'root': 'unknown', 'flags': re.M, 'open': '1', 'times': '0', 'exe_as': '0', 'pattern': r'请您输入这个人物的识别密码\(passwd\):', 'reply': '/password;jump'}--/password 同上,jump 没有解析符,作为字符串发送。  如果你想在游戏中给password 变量赋值111222可以在reply的指令集 最前面前面加一句@password=111222;
@是赋值解析符。
'pattern': r'您的英文名字\(ID\)是:'   匹配模板 后面的r 不要忘记写了,代表原生字符串,避免python二次转义。

经典问题:
找顾炎武学习x次 怎么写reply?
'reply':'@x=10;/WD.send_str("xue gu {}".format(x))'    用python格式化字符串可以在字符串中调用变量.也可以使用python 占位符写法(老式风格),请百度 python格式化字符串。实际上@后面允许写paython的正是语句,例如@if gold<100:return x=0;多长都可以,如果你不嫌麻烦。

如果你先导入机器人后读取ini文件,而且config.ini里面预存了你的账号信息,就会完成自动登录。

遇到疑难难题请发送回复,我会在后面跟帖。





***************************************************************************************************************************************************************************************************************************************************
ini的内容
[default]   # 存的一些基本设置
account = sample
font_family = Arial
font_size = 10
foregcolor = #005500
bkcolor = #000000
host = 43.243.129.43
port = 5555
maxblocks = 5000

[variables] # 存的初始变量值 可以自行添加一些初始变量 例如 xue=50  (******变量名全部小写,python 的 config模块自身有点问题,ini存的都是小写,在游戏内你可以使用大写变量名)
hero_id = abcd
password = A12345

注意:命名的变量不要和游戏内置变量或者python内置的关键字重合


如何创建触发器?
直接用文本编辑器写成 txt文件。(其实就是python的字典格式)
或者在脚本里用户函数动态生成,导入。

一般都是写几个初始触发器,然后后期用脚本动态生成。
如果你不会写脚本,可以跟zmud一样,全部前期写好,然后开关某一类,进行调配。


如何导入触发器文件?

account\\sample 文件夹里面还有一个triggers.txt 存的是初始触发器列表样板,和原来的mush格式差不多。
导入初始触发器:点击 脚本/扩展里的  pythonextened 按钮 选择 sample 中的triggers.txt 导入成功后会在命令行中看见导入结果。

可以先读取触发器再读取ini文件,完成自动登录
用内置函数也可以导入。

触发器参数说明:
正则表达式用的是python的 re模块

例子:{'root': 'unknown', 'flags': 0, 'open': '1', 'times': '0', 'exe_as': '0', 'pattern': r'Are you using BIG5 font(y/N)?', 'reply': 'n'}


'root': 'unknown' 就是原来ZMUD和mush里面的group 用来给触发器分组

'flags':0  就是re.searh(),re.findall()等函数里面的flag参数 作为表达式修饰符
注意 flags 的值是整数 而不是字符串,是0而不是”0“ 别搞错了

正则表达式—修饰符
正则表达式可以包含一些标志修饰符来控制匹配模式,用在正则表达式处理函数中的flag参数中,为可选参数。

(1) re.I 全写(re.IGNORECASE)
表示使匹配时,忽略大小

(2) re.M 全写(re.MULTILINE)
多行匹配,影响 ^ 和 $的行为

(3) re.S 全写(re.DOTALL)
使点(.)匹配包括换行在内的所有字符

(4) re.X 全写(re.VERBOSE)
这个模式下正则表达式可以是多行,忽略空白字符,并可以加入注释。

(5) 除以上标志外还有re.L和re.U,但不常用
(6) 可以通过使用运算符“|“来指定多个标志,表示同时生效。
如: re.I | re.M被设置成I和M标志,

content = 'My username is zeke999!'

re.search(r'zeke\d{3}', content, re.I | re.M)

常用的参数是re.M 多行匹配  这个影响正则表式的写法。(更多了解请百度 多行匹配)其实服务器发来的消息都可以看作一个带换行符的长句,可以视作单行处理。
需要使用^顶格匹配,排除其他人说同样语句的时候经常用.建议把默认值设为re.M(是一个变量,不是字符串,不用加引号),这样可以照搬mush的正则表达式写法,符合大家原有习惯。mush的多行匹配好像默认是打开的。

open=‘0’或者‘1’ 触发器分组开关,这个好理解吧和mush一样。


times='0' or '1'   匹配一次 和匹配多次 这个有必要强调一下。 有的时候你不确定一个字符模板会在 一段话里出现多少次,例如 查看你学了多少技能,(xxxx=yyyyy级)这个模板出现的次数不固定,也许有5个技能,也许有10个技能,这个时候你可以设置为‘1’。
times=‘0’使用的是re.search() 只匹配第一次出现的位置。
times='1'  使用的是re.finditer() 匹配多次,注意是匹配多次得到多个结果的列表,不是多行匹配,别搞混了。

'exe_as': '0'   reply的内容混合模式发送,基本上用这个就够了.
解析符@代表字符串作为python语句执行。 一般用来给变量赋值,写单行的if,for in 语句也没问题. 很实用。 友情提示:不要在触发器里再去定义使用全局变量的函数,也许会有一些作用域的问题。尽量在自定义函数模块中定义好。
解析符/代表字符串作为python表达式(必须有返回值)执行,一般用作执行函数,变量直接取值。如果你什么都不加就作为mud指令直接发送。

'exe_as': '1' 作为纯python语句执行,如果你对python 很熟悉 可以使用这个模式,不提倡。判断变量的访问域有难度。

'pattern': r'您的英文名字\(ID\)是:' 这个不用说了吧,匹配模板。 注意在所有的匹配字符串开头要加r作为原生字符串执行 ,如果你不加会出现python解释器会出现二次转义,例如 \\d 等价于 r'\d'.请务必加上r,不要自寻烦恼。


几个触发器的标准写法:其实就是一个简单的自动登录机器人
注意单引号和双引号配合使用,你外层使用的单,内层就要用双,反之亦然。要不然就要使用转义字符\.例如\n,\",\'
{'root': 'unknown', 'flags': 0, 'open': '1', 'times': '0', 'exe_as': '0', 'pattern': r'Are you using BIG5 font(y/N)?', 'reply': 'n'}

{'root': 'unknown', 'flags': 0, 'open': '1', 'times': '0', 'exe_as': '0', 'pattern': r'您的英文名字\(ID\)是:', 'reply': '/ti.sleep(1);/hero_id'}
{'root': 'unknown', 'flags': 0, 'open': '1', 'times': '0', 'exe_as': '0', 'pattern': r'请您输入这个人物的识别密码\(passwd\):', 'reply': '/password;@welcome= "欢迎进入";/ti.sleep(5);/WD.send_str("say {}{}".format(hero_id,welcome));jump'}
{'root': 'unknown', 'flags': 0, 'open': '1', 'times': '0', 'exe_as': '0', 'pattern': r'>*\s*你高兴地跳了起来。', 'reply': '@cmd_list=["1","2","3","4","5","上山打老虎!"];@for item in cmd_list:WD.show_note(item);/ti.sleep(5);say 测试成功!'}
{'root': 'unknown', 'flags': 0, 'open': '1', 'times': '0', 'exe_as': '1', 'pattern': r'>*\s*你说道:「测试成功!」', 'reply': 'way="n"\nWD.send_str("say 向北走一步")\nWD.send_str(way)\nWD.send_str("say 下面开始抓取子串!")'}
{'root': 'unknown', 'flags': 0, 'open': '1', 'times': '0', 'exe_as': '0', 'pattern': r'>*\s*你说道:「(下面开始)抓取子串!」', 'reply': '@x1=matchs.group(1);@WD.send_str("say 抓取的子串为:{}".format(x1))'}


正则表达式抓取子串
import re
#系统把所有抓取的字符串结果都在 matchs(小写)这个隐藏局部变量里 请注意避开给matchs命名重名变量,只读不写!!!
matchs=re.search("([0-9]*)([a-z]*)([0-9]*)",a)

print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(0)   #123abc456,返回整体
print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(1)   #123
print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(2)   #abc
print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(3)   #456

x1=matchs.gruop(0)
x2=matchs.gruop(1)
x3=matchs.gruop(2)
x4=matchs.gruop(3)



关于内置函数:
绝大部分全部托管在WD实例中(大小写敏感) 相当于mush中的 world.xxxx
python time模块的方法托管在ti实例中(大小写敏感)

怎么样使用?
例子:
/WD.send_str("say 下面开始抓取子串!")
#结果 你说道:「下面开始抓取子串!」
从ZMUD中消失多年的#wait 又回来了  /ti.sleep(5)=#wa 5000
大家可以在指令输入框中试一试:(必须进入游戏后)

/ti.sleep(5);n; say 大家好!;jump;/WD.send_str("buy doufu")/ti.sleep(1);eat doufu;

弹出一些窗口
/WD.get_item_dialog("测试列表框",("1","2","3"),"x");   # 非阻塞输入模式
输入完成后输入
/WD.show_note(x)

/WD.get_text_dialog("测试文本框",“请输入您的ID:”,"myid"); # 非阻塞输入模式

完成后输入
/WD.show_note(myid)


对于触发器,变量的动态增删查改,内置函数具体定义,请查阅最后的内置函数列表:



大型机器人需要大量的自定义函数怎么办?。这个也没有问题.

关于导入外部自定义py模块:
请使用 WD.imp_mode(self,obj_str, name_str, package_str=None):

参数说明: obj_str = 动态生成的变量 用来贮存导入的模块对象
         name_str= 模块名称
        package =包名称(只有你的模块具有包结构的时候才填写)
例子:
params = importlib.import_module('b.c.c') #绝对导入
params_ = importlib.import_module('.c.c',package='b') #相对导入


导入外部模块的中的函数定义后 就可以在游戏中当作本地函数使用了
例如:
/WD.imp_mode('test','test4')
内部过程:test= importlib.import_module('test4')
自定义的test4模块导入完成后内部便多了test模块,可以直接使用内部托管的函数 speak()
/test.speak(WD)

自定义函数需要注意的地方:
和mush中的自定义函数需要预留(n,l,w)三个参数一样以便接收游戏内的变量

如果你的自定义函数里需要调用WD或者其他实例内的函数,请预留一个实例形参,如果你需要处理抓取的字符串请预留matchs的形参位置。

例子:自定函数speak()需要调用WD中的方法:
def speak(wd):
    wd = wd     # 接收主程序中的WD实例传参以便调用
    wd.send_str('say 测试外部模块')


如果你不会python,?只会lua,js,c++其他语言?还想借用shell 执行外部exe程序,全自动搜索路径?
请使用游戏内置的subprocess模块调用外部子进程。进程间的通信,传值较复杂,具体教程请自行百度。
子进程常用方法 subprocess.Popen()
子线程:threading 模块(游戏内部内置)

***************************************************************************************************************************************************************************************************************************************************
/ 解析符 解析有返回值的表达式(主要用于函数),并将返回值直接作为字符串指令发送给服务器,不能解析无返回值的语句 ,例如/if x>0:x=x+1 没有返回值 不能解析。
假如: x=5   那么 /x就是合法的写法 ,返回x的值5。自动向服务器发送str(5),return none 视为 发送 “None"
@ 解析符 既可以解析语句,也可以解析表达式,但是不会向服务器自动发送返回值作为指令。你需要调用函数来发送。  推荐使用短语句,长语句干脆直接自定义一个函数。
@if gold>500:xue_guyanwu(50) (推荐单句写法,合法但是python不提倡)
@if gold>500\n    xue_guyanwu(50) (正常的python语句写法,但是很繁琐,还要4个空格的缩进,咱不提倡,还不如自定义一个函数)

如果你还是不了解,请百度 表达式与语句的区别
   






# 查看当前模块导入路径               
    check_mode_imp_path()
      
    # 添加模块导入路径函数
    append_mode_path(path)  
参数说明:path 你要添加的模块导入路径  例如: c:\\windows\\system
                
    # print()没有返回值不能作为/函数解析,做一个有返回值的替代品函数
    p_print(c_vars)
参数说明:c_vars 需要打印的变量
        

   
      

    # 发送类指令
    # 发送单条字符串
    send_str(anystring)
参数说明:这是最常用的函数。向服务器发送一个字符串
例子:/WD.send_str("buy doufu")

   ti.sleep()
函数说明:#wait 的替代品,等待若干秒,/ti.sleep(5) == #wait 5000
/WD.send_str("buy doufu");/ti.sleep(5);//WD.send_str("eat doufu");



    # 发送字符串列表,元组,可迭代对象
    send_strs(string_list):
函数说明:
硬写:        /WD.send_strs(("w","n","s","e"))

写法二:     @str_list=("w","n","s","e");/WD.send_strs(str_list)


    # 发送提示信息到主窗口
    show_note(self, note_string)
函数说明:
        /WD.show_note("护镖任务顺利完成!用时1分钟!")
        注意:提示消息不参与触发器的匹配。  
函数式写法:@note="护镖任务顺利完成!用时1分钟!";/WD.show_note(note)
        


# 创建一条新触发器条目
函数说明: 直接定义一个python 字典 非常简单
@newrigger1={'root': 'unknown', 'flags': re.M, 'open': '1', 'times': '0', 'exe_as': '0', 'pattern': r'您的英文名字\(ID\)是:', 'reply': '/ti.sleep(1);/hero_id'}
如果你熟悉json格式使用json格式的字典用json模块转换成python 字典也行



# 添加一条触发器条目
append_trigger(self, new_trigger):
函数说明:往触发器列表末尾里添加一条条目
指令式写法:/WD.append_trigger({'root': 'unknown', 'flags': re.M, 'open': '1', 'times': '0', 'exe_as': '0', 'pattern': r'您的英文名字\(ID\)是:', 'reply': '/ti.sleep(1);/hero_id'})
函数式写法:@newtrigger={'root': 'unknown', 'flags': re.M, 'open': '1', 'times': '0', 'exe_as': '0', 'pattern': r'您的英文名字\(ID\)是:', 'reply': '/ti.sleep(1);/hero_id'};
        /WD.append_trigger(newtrigger)


# 添加一组触发器列表
extend_triggers(new_trigger_list):
函数说明:同上,可以直接添加一整个list,一般用于添加某一组tiggers
              @newtrigger_list=[trigger1,trigger2,tigger3];/WD.append_trigger(newtrigger_list)
      
clear_all_triggers():
函数说明:    清空所有触发器
        # 移除某一组触发器
remove_triggers( str_root):
函数说明:
        /remove_triggers("wudangjob")
或者
        @root1="wudangjob";/remove_triggers(root1)

# 关闭某一组触发器
close_triggers(str_root):
函数说明:   同上
@root1="wudangjob";/close_triggers(root1)
# 开启某一组触发器
open_triggers(str_root):
函数说明:     同上

read_triggers(path):
函数说明:直接从外界读取触发器文件(未完工)
可以直接用python 的with open代替
仔细想了一下,大部分触发器都是动态生成的,也没有必要限制读取格式,可以直接用python 的with open()或者自定义函数代替。        
@with open('E:\python\python\gbk.txt', 'r', encoding='gbk', errors='ignore') as file; @file.read()
(我不确定file.read()有没有返回值,如果有返回值的话,也许用/file.read()也行,但是没有必要,你并没有想向服务发送函数返回的结果)
这样就把txt文件里所有类容都读取了,存在file变量里。(with open的更多用法请百度)


        # 设置一个局部变量值
        # 将抓取的子串值赋值给一个变量
setlocale_var(key_str, index, matchs):

函数说明:/setlocale_var("exp", 1, matchs)

触发器匹配的结果都贮存在maths对象里。
内部过程: exp=matchs.group(1)
如果你抓取到的子串 1为: "经验值:xxxx"   
        那么 exp="经验值:xxxx"
快捷写法: @exp=matchs.group(1)

# 设置多个局部变量
setlocale_vars(self, key_tuple, index_tuple, matchs)
函数说明:  同上
setlocale_vars(("exp","gold"), (1,2), matchs)
等价于@exp=matchs.group(1);@gold=matchs.group(2)       


        # 移除一个局部变量并返回其值
pop_var(key):
函数说明:   
/pop_var("name")
其中name="abc"
你删除了name变量,并将其值"abc"直接发送给了服务器

        # 移除一个局部变量
remove_var(key):
函数说明:     同上,但是不会返回所删除的值   

    # 列表选择框
get_item_dialog(title_str, items_tuple, var_str):
函数说明:   
    /WD.get_item_dialog("测试列表框",("1111","2222","3333"),"x");/WD.show_note(x)
自行在游戏里测试
# 文本选择框
get_text_dialog(title_str, label_str, var_str):
函数说明:
/WD.get_text_dialog("测试文本框","请输入您的ID:","myid");/WD.show_note("myid")


    # 数字选择框
get_int_dialog(title_str, label_str, var_str):
        同上


# 开启一个多选框
get_list_dialog(add_list, var_name_str,title):
参数说明 add_list 你所需要添加的选择项目列表,
        var_name 选择的结果贮存的变量名称
        title 列表框 名称

/WD.get_list_dialog(("a","b","c"),"choose","测试多选框")



# 测试触发器的简单函数
op1(self):
        print("全局触发器1")
op2(self):
        print("全局触发器2")


# 建立全局循环计时器
m_timerx(self,x,seconds, fuc_arg):
   
x= 定时器序号
seconds =间隔时间
fuc_arg= 时间到点时你要执行的函数
/WD.m_timer(1,2,WD.op1)
/TTmer1.cancel() # 销毁1号计时器
请管理好计时器序号。销毁以后只能重建。


# 一次性触发器,用完自动销毁
同上
s_timer(seconds, fuc_arg):
        op_func = fuc_arg # 被执行的函数
        timer1 = Timer(seconds, op_func)
        timer1.start()


   





# 全局循环触发器  测试观察函数 销毁计时器 :TTimer1.cancel()?
m_timer1(self, seconds, fuc_arg):
        global TTimer1
        fuc_arg()
        print(threading.current_thread())
        print(threading.active_count())
        TTimer1 = Timer(seconds, self.m_timer1, [seconds, fuc_arg])
        TTimer1.start()

m_timer2(self, seconds, fuc_arg):
        global TTimer2
        fuc_arg()
        print(threading.current_thread())
        print(threading.active_count())
        TTimer2 = Timer(seconds, self.m_timer2, [seconds, fuc_arg])
        TTimer2.start()


    # 重连
cc_conect():
  /WD.cc_conect

# 强制客户端断线 可能导致死机,慎用。
cut_connect():
        同上

    # 返回当前文本块接收总数量 ,可利用某一段时间的数量差值大小,用来判断断线,发呆
get_blocknumber():
      
    # 在内置浏览器中打开网站 sig
open_url_tab(url_str):
/WD.open_url_tab("http:\\www.sohu.com")


# 打开x号标签 sig  只能从左往右按顺序创建  1,2,3,4 否则执行顺序会错。
    slot_tabwinx_create(x_index,title_str):
        
    # 向x号标签写入数据 sig
   slot_tabwinx_insert(x_index,content, color='[0;32m'):
      
    # 移除x号标签 只能从右往左关 4,3,2 ,1
    def slot_tabwinx_remove(x_index):
例子:/WD.slot_tabwinx_create(1,"测试1");/WD.slot_tabwinx_create(2,"测试2");
/WD.slot_tabwinx_insert(1,"测试输入1");/WD.slot_tabwinx_insert(2,"测试输入2");
/WD.slot_tabwinx_remove(2);/WD.slot_tabwinx_remove(1);

# 悬浮选择框
slot_gbox_checks_create(group_number,title_str,boxs_list,)
例子:
group_number:你的悬浮框组的数字编号,例如1,2,3,4
title_str: 悬浮组的名称  例如  "任务开关组"
boxs_list列表的内部构成 =[(按钮的数字编号,"按钮名称",按钮初始值=Flase,"指令1","指令2")]
按钮初始值=Flase 代表按钮被创建之初没有被勾选。True是被勾选。
" 指令1"代表勾选时执行的指令。
"指令2"代表取消勾选执行的指令。

@cmd1=WD.make_cmds("say 向右走一步,e");@cmd2=WD.make_cmds('say 向左走一步,w')
@boxs_list1=[(1,"开关1",False,cmd1,cmd2),(2,"开关2",False,cmd1,cmd2)];/WD.slot_gbox_checks_create(1,"悬浮组1",boxs_list1)


# 在指令中定义指令的函数
make_cmds(cmds)
说明 : 解决了直接在指令中定义带";" 字符串的问题。
直接使用@cmd='w;n;e'会报错。(指令解析器会将;作为分割符将字符串分解掉)
解决方案:使用,代替; 并使用函数。
@cmd=WD.make_cmds('w;n;e')
      



# 导入外部模块函数
    imp_mode(obj_str, name_str, package_str=None):
函数说明:/WD.imp_mode("mymode", "b.c.c", package_str=None):
这样 mymode=b.c.c     b.c.c内的定义全部被mymode接收
假如 b.c.c下定义了一个函数speak 你就可以直接使用/mymode.speak()


importlib.import_module() 函数 学习网址:  https://blog.csdn.net/edward_zcl/article/details/88809212

a #文件夹
        │a.py
        │__init__.py
b #文件夹
        │b.py
        │__init__.py
        ├─c#文件夹
                │c.py
                │__init__.py

# c.py 中内容
args = {'a':1}

class C:
   
c(self):
        pass
————————————————


params = importlib.import_module('b.c.c') #绝对导入
params_ = importlib.import_module('.c.c',package='b') #相对导入

# 对象中取出需要的对象
params.args #取出变量
params.C  #取出class C
params.C.c  #取出class C 中的c 方法
————————————————
版权声明:本文为CSDN博主「edward_zcl」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/edward_zcl/article/details/88809212





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×

评分

1

查看全部评分

门派:昆仑派
发表于 2019-8-24 13:52:38 | 显示全部楼层
(⊙o⊙)…  估计要有个公版 慢慢研究研究还行
门派:古墓派
发表于 2019-8-24 21:06:41 | 显示全部楼层
大神,膜拜一下。                        
门派:明教
发表于 2019-8-24 23:09:32 | 显示全部楼层
厉害呀,好像比mush还难懂似的
门派:古墓派
 楼主| 发表于 2019-8-25 08:30:39 | 显示全部楼层
本帖最后由 kkndbdra@tj 于 2019-8-28 11:14 编辑
yuanjiu@tj 发表于 2019-8-24 23:09
厉害呀,好像比mush还难懂似的


简要说明: 之前写的太复杂,现在一切从简。
你可以把evermud 看作 zmud4.62 可编程加强版  两者指令输入格式一摸一样的。
你唯一要做的就是用evermud内建函数代替 zmud的# 指令(内建函数在文章最后,随版本更新)

例如:
zmud 输入指令格式:  buy doufu;#wait 5000;eat doufu
evermud 输入指令格式:  buy doufu;/ti.sleep(5);eat doufu

zmud 输入指令格式:  ABCDE;#wait 1000;A12345      --输入账号和密码
evermud 输入指令格式:   ABCDE;/ti.sleep(1);A12345 --输入账号和密码
是不是很简单?

给变量赋值,变量解值,函数调用变量:
1 快捷写法:@给变量赋值,/为变量解值 作为字符串直接发送给服务器
@myid=ABCDE;@password=A12345;/myid;/ti.sleep(2);/password

2 函数式中级写法:
@myid=ABCDE;@password=A12345;/WD.send_str(myid);/ti.sleep(2);/WD.send_str(password)

3外部脚本式写法
如果你要编写异常复杂的脚本,这个就没办法了,必须要懂一门编程语言,并且阅读后面的详细说明。
例子:@area="大理";@person="朱丹臣";@target=(area,person);/go(target)     ---其中go()是你自定义的函数,你需要自行定义或者从外部脚本导入它

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
门派:古墓派
发表于 2019-8-25 09:12:54 | 显示全部楼层
一点都没看懂,那个是运行程序都不知道。求解??
门派:丐帮
发表于 2019-8-25 10:08:16 | 显示全部楼层
一脸懵逼进来,一脸懵逼离开
门派:丐帮
发表于 2019-8-25 10:11:51 | 显示全部楼层
kickall@tj 发表于 2019-8-25 09:12
一点都没看懂,那个是运行程序都不知道。求解??

evermud.exe  是运行程序
门派:桃花岛
发表于 2019-8-25 10:21:15 来自手机 | 显示全部楼层
让我想起一个人,盘古开天辟地啊      
门派:桃花岛
发表于 2019-8-25 10:21:51 来自手机 | 显示全部楼层
python号称胶水语言,任何东西都可以调用了     
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-6-8 06:29 , Processed in 0.036742 second(s), 29 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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