//没登陆

欢迎您来到凯恩之角,奈非天!

查看: 27934 - 回复: 98

帖子:74

符文:55

发表于 2019-7-2 16:20:14 |显示全部楼层
本帖最后由 zudikn 于 2019-8-5 13:40 编辑

目录
一、罗技宏界面

二、罗技宏编写
三、罗技宏参数讲解
四、部分常用LUA语言知识
五、罗技脚本API
六、各位大佬的脚本分析
    【一】分解/魔盒升级  -- 绝对水饺
    【二】"仙林四精控宏"无缝切换    -- 狂野之弦
----------------------只写了这么多
----------------------
七、【进阶】协同程序  +  
极客大叔的奶僧代码分析
第七部分不想写了,太麻烦,我就给自己写了个玩玩。



我把文章内容都置顶了,如果你往下翻看到了二楼,就证明没了

希望大家都能写出自己想要的宏,至少能看懂别人的改出来

我没用过雷蛇,有兄弟配合可以出个雷蛇教程
我玩的时间短,对很多BD都不熟悉(只玩过五六个),写不出来太适合的宏





帖子:74

符文:55

5#
本帖最后由 zudikn 于 2019-7-6 08:42 编辑

一、罗技宏界面
  • 有个罗技G系列鼠标
  • 官网下载 Logitech Gaming Software [ https://support.logi.com/hc/zh-cn/articles/360025298053 ]
  • 我用的G300s鼠标,其他鼠标应该差不多,如果不同,可以问我
  • 到鼠标宏设置界面
    第一次看界面应该是这个【板载内存】,点击一下变成【自动检测游戏】

    1.png

    然后点击下面的第二个图标
    2.png

    添加新的配置文件   32位的在暗黑破坏神目录下,64位的在暗黑破坏神/x64目录下
    3.png

    导入别人的配置文件
    9.png
  • 永久性配置文件 是直接把配置文件锁定为这一个,怎么都不会变
    主要是因为  可能有多个按名字排序暗黑宏,第一个不是自己想要的
    可以关闭永久性配置文件,然后设置个切换热键,也可以把想要的设置为永久性配置文件
    10.png


发表于 2019-7-2 16:46:40 |显示全部楼层

帖子:74

符文:55

6#
本帖最后由 zudikn 于 2019-7-2 21:16 编辑

二、罗技宏编写
  • 命令那里点"+"号
  • 点多键
  • 现在我们做个连点1和2键的宏
    名称:随意,我用了  "12"
    按键:点击【开始录制】,按下1和2,【停止录制】,右键 【↓2】,插入延迟,改为10
    重复:切换
    最后点击完成

    4.png
  • 把这个命令拖放到鼠标键上
  • 这个宏是点击一次鼠标键一直执行,然后再点击一次停止,不如打开个记事本试试效果??

发表于 2019-7-2 17:11:50 |显示全部楼层

帖子:74

符文:55

7#
本帖最后由 zudikn 于 2019-7-4 11:50 编辑

三、罗技宏参数讲解
只考虑多键
  • 名称:就是个名字
  • 按键:宏代码,在这里点击鼠标右键能插入鼠标事件
        下箭头 代表按下某个键
        上箭头 代表松开某个键
  • 重复选项:
    无:代表执行一次,你点击几下鼠标键,就会把宏执行几遍
    按下时:你按下鼠标键,当宏执行完时,如果你还按着,就会再执行一遍
    切换:点击鼠标键后,会一直执行宏,执行完等待  重复选项那里的延迟  后再执行,再次点击鼠标键,会结束宏

技巧一:
你按【开始录制】会强制清除现在的宏代码

可以在宏代码中点击鼠标右键,有【此前记录】和【此后记录】,这样不会清除代码
技巧二:
如果一个宏很长,一般是不能停止的,但是可以按【模式切换】键强制停止所有宏
G300s有三套鼠标键位设置,你不嫌麻烦可以三套都设置成一样的,否则就需要点三次【模式切换】
技巧三:注意些延迟  1秒=1000毫秒
宏的最后一个延迟好像并没有意义

ps:暂时就想到这么多,如果有发现以后在补吧

发表于 2019-7-2 17:34:12 |显示全部楼层

帖子:74

符文:55

8#
本帖最后由 zudikn 于 2019-7-3 00:32 编辑

四、部分常用LUA语言知识
【零】注释,被注释的内容不会执行,一般用来提示代码是什么意思

单行注释:
两个减号"--",执行时忽略两个减号后的内容
多行注释:"--[[  ]]",执行时忽略两个中括号中间的内容
【一】数据类型

  • nil    这个最简单,只有一个值,代表无效值
  • boolean    包含两个值,代表真(true)和假(false),常用来进行逻辑判断
  • number    用来存储数字信息,是个实数类型的
  • string    用来存储字符串,字符串由一对双引号或单引号表示,例如 "hello world!"
  • function    函数,用来存储一段代码
  • table    表、"关联数组",先来个简单的表的例子:myTable = { "apple", "pear", "orange"}
        这个表格里有三个字符串,myTable[1]代表"apple",myTable[2]代表"pear"
【二】赋值/算术运算/关系运算/逻辑运算
  • 赋值运算
    x = 1    这里的"="是赋值的意思,也就是让变量x为1
  • 算术运算
    3 + 2    -- 值为5
    3 - 2     -- 值为1
    3 * 2     -- 值为6
    3 / 2     -- 值为1.5
  • 关系运算
    用来判断两个数的关系,结果是个boolean类型的,也就是真true或假false
    假设A = 10,B = 20
    ==  等于           A == B  为false
    ~=  不等于        A ~= B  为true
    >    大于            A >   B  为false
    <    小于            A <   B  为true
    >=  大于等于     A >= B  为false
    <=  小于等于     A <= B  为true
  • 逻辑运算
    and   与运算       A and B    当A和B都为真才为真
    or      或运算       A or   B    当A和B都为假才为假,有一个真就时真的
    not    非运算       not A       假变真,真变假

【三】分支/循环,这个有固定的格式
     if分支语句

  1. -- if语句,如果条件A为真就执行代码B
  2. if  A  then
  3.     B
  4. end
  5. -- if语句,如果条件A为真就执行代码B,A为假执行C
  6. if  A  then
  7.     B
  8. else
  9.     C
  10. end
  11. -- 嵌套if语句,如果条件A为真就执行代码B,A为假D为真才执行C
  12. if  A  then
  13.     B
  14. else
  15.     if D then
  16.         C
  17.     end
  18. end
复制代码
    while循环语句 和 break 跳出循环语句
  1. -- while语句,如果A为真执行B,再判断如果A为真执行B,再...
  2. while A
  3. do
  4.     B
  5. end
  6. -- 例    执行50次代码B
  7. k = 1
  8. while k <= 50
  9. do
  10.     B
  11.     k = k + 1
  12. end
  13. -- break语句,执行10次B
  14. k = 1
  15. while k <= 50
  16.     B
  17.     if k == 10 then
  18.         break
  19.     end
  20.     k = k + 1
  21. end
复制代码
当然还有for循环语句和repeat...until循环语句,不过我觉得用熟练while就够了
【四】函数
函数一般用来写大量重复使用的代码
调用函数时停止当前函数(A)的执行,然后执行被调用函数(B),B执行完后,到A中调用的地方继续执行
  1. -- 函数  格式
  2. function 函数名()
  3.     代码块
  4. end
  5. -- 例,现在执行main函数中的代码,中间调用了foo函数,执行过程A->B->C
  6. function foo()
  7.     B
  8. end
  9. function main()
  10.     A
  11.     foo()
  12.     C
  13. end
  14. -- 是不是很好奇括号是用来干什么的???
  15. -- 他是用来传递数据的,函数可以根据数据的不同,执行不同的代码
  16. -- 执行过程A->B->C->D
  17. function foo(x)
  18.     if x<10 then
  19.         B
  20.     else
  21.         D
  22.     end
  23. end
  24. function main()
  25.     A
  26.     foo(5)
  27.     C
  28.     foo(15)
  29. end
复制代码

点评

WolFord  你这么一介绍,我原来的编程能力感觉回来了,谢谢啊!  发表于 2019-7-3 11:54
发表于 2019-7-2 18:00:22 |显示全部楼层

帖子:74

符文:55

14#
本帖最后由 zudikn 于 2019-7-4 11:50 编辑

五、罗技脚本
【一】G键
    点击下图中的打印按钮,会弹出来个网页,这就是常说的G键了
5.png
6.png

【二】脚本界面
点击配置文件,有个编写脚本
7.png

按Ctrl+S可以保存脚本
8.png

【三】罗技脚本API
这部分是罗技鼠标支持的部分常用函数,全部函数见附件
  • function OnEvent(event,arg)
    [功能] 每次执行脚本都从这个函数开始,这个函数自动捕捉鼠标动作
    [参数]
    event:事件名
            MOUSE_BUTTON_PRESSED     鼠标键   按下时
            MOUSE_BUTTON_RELEASED   鼠标键   释放时
    arg:参数值
            1        鼠标左键
            2        鼠标右键
            3        鼠标滚轮        
            4        返回
            5        前进
            6        复制
            7        粘贴
            8        模式切换
            9        剪切
    [用法]
    if enent=="MOUSE_BUTTON_PRESSED" and arg == 4 then
        -- G4按下时的操作
    end
  • OutputLogMessage()
    [功能] 输出信息到日志区域

    新建的脚本自带这句话
    OutputLogMessage("event = %s, arg = %s\n", event, arg)
    其中%s代表字符串占位符,用后面的参数代替,不懂也不要紧,它等价于下面这句
    OutputLogMessage("event = " .. event .. " ,arg =" .. arg .. "\n")
    其中".."是字符串连接符,"\n"是回车符号,你可以试试看日志区域的输出
  • Sleep(timeout)                                
    [功能] 脚本暂停等待时间
    [参数]
    timeout         暂停多少毫秒
  • PressKey(keyname)                                模拟键盘按键按下动作
  • ReleaseKey(keyname)                            模拟键盘按键释放动作
  • PressAndReleaseKey(keyname)             模拟键盘按键按下并释放动作
    能传多个参数
    [用法]
    PressKey("a")                               按下a键
    ReleaseKey("a")                           松开a键
    PressAndReleaseKey("a","b")      按下并松开a和b键
    IsModifierPressed(keyname)
    [功能] 获得某修饰键是否按下,返回true或false
    只能获取ctrl、shift、alt的状态
  • IsKeyLockOn(name)                               获取锁定键是否启用
    只有三个锁定键
    "scrolllock"    滚轮
    "capslock"     大小写
    "numlock"     数字键
  • PressMouseButton(button)                   模拟鼠标按键按下
  • ReleaseMouseButton(button)               模拟鼠标按键释放
  • PressAndReleaseMouseButton             模拟鼠标按键按下并释放
  • IsMouseButtonPressed(button)            获取鼠标按键是否按下
    [注意]
    鼠标中间和右键顺序变了
    1        鼠标左键
    2        鼠标中键
    3        鼠标右键
  • MoveMouseTo(x,y)                               移动鼠标位置
  • GetMousePosition()                              获取鼠标位置
    [用法]
    x,y = GetMousePosition()
    OutputLogMessage("(x,y) = (%d,%d)\n", x, y)
  • PlayMacro                                             播放一个现有的宏
    [注意]
    只能播放一个宏,他执行时播放其他宏无效,播放相同宏会加入播放队列
  • AbortMacro                                          停止播放的宏

G-series Lua API 参考文档.docx

520.57 KB, 下载次数: 370

发表于 2019-7-2 21:07:18 |显示全部楼层

帖子:74

符文:55

31#
本帖最后由 zudikn 于 2019-7-4 11:50 编辑

六、代码分析
【一】分解和魔盒升级    -- 绝对水饺

  1. -------------------------------玩家设置-------------------------------

  2. YanChi = 30

  3. -------------------------------全局设置-------------------------------
  4. -- 鼠标左键默认不支持编程
  5. -- 写这句话可以让左键也支持编程
  6. EnablePrimaryMouseButtonEvents (true)

  7. -- 分解  需要手动打开铁匠铺的分解界面
  8. function FenJie()
  9.     -- 鼠标移动到分解按钮上
  10.     MoveMouseTo(6000,17000)                 
  11.     Sleep(100)
  12.     -- 点击鼠标左键
  13.     PressAndReleaseMouseButton(1)           
  14.     Sleep(50)
  15.     -- 循环60次,背包一共60个格子
  16.     k = 0
  17.     while k < 60
  18.     do
  19.         -- 一行10个, k / 10 = y ... x
  20.         -- %运算就是取余数
  21.         X = k % 10            -- 分解列
  22.         -- math.floor函数是LUA的math库里的,是下取整的意思
  23.         Y = math.floor(k/10)  --分解行
  24.         
  25.         -- 移动到对应的格子上
  26.         
  27.         -- 写代码的时候可以用GetMousePosition函数获取鼠标位置
  28.         -- (49000,36000)是背包第一个格子的位置
  29.         -- 1700,3000是偏移量
  30.         MoveMouseTo(49000+1700*X,36000+3000*Y)
  31.         Sleep(2)
  32.         
  33.         -- 点击鼠标左键
  34.         PressAndReleaseMouseButton(1)
  35.         Sleep(2)
  36.         -- 点击回车键
  37.         PressAndReleaseKey("Enter")
  38.         Sleep(2)
  39.         
  40.         -- 应该点击一次鼠标回车就够了...
  41.         -- 点击鼠标左键
  42.         PressAndReleaseMouseButton(1)
  43.         Sleep(2)
  44.         -- 点击回车键
  45.         PressAndReleaseKey("Enter")
  46.         
  47.         
  48.         Sleep(2)
  49.         k = k + 1
  50.     end
  51. end

  52. -- 魔盒
  53. function MoHe(i)
  54.     k = 0
  55.     while k<(60/i) and  IsKeyLockOn("capslock")
  56.     do
  57.         X = k % 10-- 物品列
  58.         Y=math.floor(k/10)--物品行
  59.         MoveMouseTo(49000+1700*X,36000+3000*Y*i)--物品
  60.         Sleep(YanChi)
  61.         PressAndReleaseMouseButton(3)
  62.         Sleep(YanChi)
  63.         MoveMouseTo(24500, 50500)--材料
  64.         Sleep(YanChi)
  65.         PressAndReleaseMouseButton(1)
  66.         Sleep(YanChi)
  67.         MoveMouseTo(8400, 50500)--重铸
  68.         Sleep(YanChi)
  69.         PressAndReleaseMouseButton(1)
  70.         Sleep(YanChi)
  71.         -- 升级有个时间较长的过长动画
  72.         -- 这里用了点击下一页再点击上一页取出装备
  73.         MoveMouseTo(29000, 50500)--下一页
  74.         Sleep(YanChi)
  75.         PressAndReleaseMouseButton(1)
  76.         Sleep(YanChi)
  77.         MoveMouseTo(20000, 50500)--上一页
  78.         Sleep(YanChi)
  79.         PressAndReleaseMouseButton(1)
  80.         Sleep(YanChi)
  81.         k=k+1
  82.     end
  83. end

  84. -- OnEvent触发事件,能捕捉鼠标动作,每次都从这里开始
  85. function OnEvent(event, arg)
  86.     -- 按下G3键分解
  87.     if(event=="MOUSE_BUTTON_PRESSED" and arg==3) then
  88.         FenJie()  -- 调用函数
  89.     end
  90.     --按下G5键升级一格黄装
  91.     if(event=="MOUSE_BUTTON_PRESSED"and arg==5 ) then  
  92.         PressKey("capslock")
  93.         ReleaseKey("capslock")
  94.         Sleep(200)
  95.         MoHe(1)
  96.     end
  97.     --G4键两格黄装
  98.     if(event=="MOUSE_BUTTON_PRESSED"and arg==4 ) then
  99.         PressKey("capslock")
  100.         ReleaseKey("capslock")
  101.         Sleep(200)
  102.         MoHe(2)
  103.     end
  104. end
复制代码
如果你点击G4,会发现不能停止这个事件,必须等他执行完
如果你快速点击两次G4,它就会连续执行两遍

两次点击G4,OnEvent函数就会捕捉到两次点击事件
对于目前的知识量来说,我主要想说明两点问题
1. 每次只能执行一个事件,它没结束时,不能执行别的事件
    如果一个宏编的很长,你不小心点了却没法停止,会很烦人
2. 有个存储你事件的地方(我们姑且称为"消息队列"),会在执行完这次事件后,接着执行接下来的事件
    这个会造成消息堵塞,也就是你的消息会先加入消息队列,不能及时处理,需要等他前面的都处理完
    这个问题以后再讲

第一个问题的解决方案
升级黄装里用了 大写锁定指示灯  当作循环判定条件
这个思路很不错,因为所有的鼠标事件都会加入到消息队列,键盘按键却能直接影响代码
不过罗技API只能获取ctrl,alt,shift和三个指示灯的状态

发表于 2019-7-3 09:44:30 |显示全部楼层

帖子:74

符文:55

37#
本帖最后由 zudikn 于 2019-7-4 11:50 编辑

六、代码分析
【二】"仙林四精控宏"无缝切换    -- 狂野之弦
上回我们说到可以用ctrl、alt、shift和三个指示灯来改变代码的运行状态

这回我们来看看用
PlayMacro和AbortMacro函数的操作

PlayMacro( macroname )函数有一个参数,代表宏的名字,这个宏是 "多键-开始录制" 那里的
这么函数同一时间只能运行一个宏
调用宏时有运行的宏,如果和运行的宏相同,加入队列,否则,不会有任何效果
AbortMacro()函数停止运行中的宏
这个脚本的注释够清楚了,我只放一个链接   "仙林四精控宏"无缝切换


这种方式其实已经很好了,毕竟录制宏简单,写脚本麻烦
只用宏需要关闭一个,打开另一个
这里用脚本来协助切换,少了关闭的步骤,同理 天谴跑马之类的 也可以这么做

既然是脚本分析,我还是写个简单明了的,帮助理解吧
我的想法是,G4是一个宏,G5一个宏
按下G4,有三种情况
    1. 没有宏运行,直接运行G4的宏
    2.G4的宏在运行,关闭G4的宏
    3.其他的宏在运行,关闭运行的宏,并运行G4的宏
按下G5的情况和G4差不多
代码中我就直接把他们的宏名叫"G4"和"G5"了

  1. CurrrntMacro = ""  -- 当前正在执行的宏名
  2. function OnEvent(event, arg)
  3.     if (event == "MOUSE_BUTTON_PRESSED" and arg == 4) then
  4.         if (CurrentMacro == "") then
  5.             PlayMacro("G4")
  6.             CurrentMacro = "G4"
  7.         elseif (CurrentMacro == "G4") then
  8.             AbortMacro()
  9.             CurrentMacro = ""
  10.         else
  11.             AbortMacro()
  12.             PlayMacro("G4")
  13.             CurrentMacro = "G4"
  14.         end
  15.     end
  16.     if (event == "MOUSE_BUTTON_PRESSED" and arg == 5) then
  17.         if (CurrentMacro == "") then
  18.             PlayMacro("G5")
  19.             CurrentMacro = "G5"
  20.         elseif (CurrentMacro == "G5") then
  21.             AbortMacro()
  22.             CurrentMacro = ""
  23.         else
  24.             AbortMacro()
  25.             PlayMacro("G5")
  26.             CurrentMacro = "G5"
  27.         end
  28.     end
  29. end
复制代码
发表于 2019-7-4 11:40:24 |显示全部楼层

帖子:74

符文:55

54#
本帖最后由 zudikn 于 2019-7-18 19:02 编辑

发现看别人的代码挺无聊的
先放个从极客大叔的板子里改过的
框架吧,增加了很多小功能
具体的技能按键自己慢慢调吧,注释写的还算清楚

这个框架的优点是:能随时结束和切换运行脚本,增加新功能比较简单,热键支持自己修改
以后再来补协同程序吧


update:
function JiNeng(Task)
    for Key, Values in pairs(Task.Arg) do
        if Values.Time == nil then
            Values.Time = 0  这里改为0
        end
    end
    。。。
end

update: 7.18
我非赛玩了个盾奶混巅峰,释放间隔和水饺大佬的都差不多
我就把跑路的真言改成了2秒而且发现飓风破容易释放失败,加了抬手延迟
具体延迟时间可以调调,我用30ms差不多(和阵同时放还是会被卡掉),因为我会手动放飓风聚怪
G4 跑路 G5 打怪    大写锁定灯亮BOSS 灯不亮小怪  G3关宏  其他看热键吧


暗黑3.zip

4.8 KB, 下载次数: 625

盾奶ZUDIKN.zip

9.9 KB, 下载次数: 287

发表于 2019-7-8 16:26:38 |显示全部楼层

帖子:1065

符文:232

2#
不太会用            
发表于 2019-7-2 16:21:59 来自凯恩之角App |显示全部楼层

帖子:285

符文:52

3#
前排插眼,紫薯布丁
发表于 2019-7-2 16:30:51 来自凯恩之角App |显示全部楼层

帖子:390

符文:59

4#
正文在哪里
发表于 2019-7-2 16:32:26 来自凯恩之角App |显示全部楼层

帖子:161

符文:221

9#
插眼,紫薯布丁
发表于 2019-7-2 18:39:30 来自凯恩之角App |显示全部楼层

帖子:2363

符文:1679

10#
实用技术贴,支持大哥
发表于 2019-7-2 18:43:37 来自凯恩之角App |显示全部楼层

帖子:65

符文:17

11#
占座卖花生瓜子茶水
发表于 2019-7-2 18:46:23 来自凯恩之角App |显示全部楼层

帖子:65

符文:17

12#
求棒棒糖宏制作
发表于 2019-7-2 18:47:46 来自凯恩之角App |显示全部楼层

帖子:100

符文:19

13#
有没有雷蛇的宏呀
发表于 2019-7-2 18:56:35 来自凯恩之角App |显示全部楼层

帖子:611

符文:62

15#
这个恐怕要加精了!
发表于 2019-7-2 22:00:50 来自凯恩之角App |显示全部楼层
您需要登录后才可以回帖 登录 | 注册网易通行证