MaaFramework icon indicating copy to clipboard operation
MaaFramework copied to clipboard

征集通用 custom 逻辑,考虑加入 maafw 原生支持

Open MistEO opened this issue 8 months ago • 18 comments

MistEO avatar Jun 12 '25 17:06 MistEO

  1. 感觉是最有用的通用的action:Screenshot,用于超时后截图,方便结合log进行测试。 https://github.com/MAA1999/M9A/blob/v3.7.6/agent/custom/action/general.py#L13-L61
    不过这里可能不该重新截图,用 cache 可能更好
  2. NodeOverride:也是action,用于运行过程中覆写节点。 https://github.com/MAA1999/M9A/blob/v3.7.6/agent/custom/action/general.py#L89-L115
  3. 一个rec,结合多种相同或不同的识别类型,同时满足或满足其中一个便匹配成功,不过匹配成功返回的roi可能得自己指定?(像是第index个匹配的结果/指定roi)
  4. 一个action,运行固定次数的当前节点(或别的指定节点)

Windsland52 avatar Jun 12 '25 17:06 Windsland52

计数器

  • 可以设置任务的执行次数
  • 到达设置的次数上限后清零并运行指定任务
  • 也可以设置另一个任务,在未到达指定任务时候运行
  • 设置的任务可能有多个 https://github.com/overflow65537/MAA_Punish/blob/main/assets%2Fcustom%2Faction%2Fbasics%2FCount.py

逻辑识别器

  • 可以设置模式 and 和 or
  • 根据设置的模式来执行输入的node
  • 根据模式来返回是否命中,但无法返回命中的roi(或许可以在加一个参数来选择返回第几个node的识别结果?)
  • 可能还需要有个前置节点的输入选择,来给roi_offset用 https://github.com/overflow65537/MAA_Punish/blob/main/assets%2Fcustom%2Frecognition%2Fexclusives%2FLogicalOperators.py

overflow65537 avatar Jun 13 '25 10:06 overflow65537

细化对计数器的需求

先提供一个我预期的示例:

"SetReplaysTimes": {
        "action": "Count",
        "target_count": 5, // must, 指示目标次数
        "count_msg": "当前次数: {count}, 目标次数: {target_count}" // may, 输出额外信息
        "next": [],
        "else": []
    },

如果达到指定次数 -> 重置计数器并运行跳转至 next ;否则计数器自增1并跳转至 else

在 custom action中由于 run_node 执行其他节点(这个节点的耗时可能很长),custom action不会及时返回执行结果,最终导致 task 超时失败。如果通过 maafw 跳转可能会解决这个问题

kakaa-nju avatar Jun 16 '25 08:06 kakaa-nju

细化对计数器的需求

先提供一个我预期的示例:

"SetReplaysTimes": {
        "action": "Count",
        "target_count": 5, // must, 指示目标次数
        "count_msg": "当前次数: {count}, 目标次数: {target_count}" // may, 输出额外信息
        "next": [],
        "else": []
    },

如果达到指定次数 -> 重置计数器并运行跳转至 next ;否则计数器自增1并跳转至 else

在 custom action中由于 run_node 执行其他节点(这个节点的耗时可能很长),custom action不会及时返回执行结果,最终导致 task 超时失败。如果通过 maafw 跳转可能会解决这个问题

count_msg是给ui看的吧,那应该用focus 不过ui如何获取当前的循环次数是个问题

overflow65537 avatar Jun 16 '25 13:06 overflow65537

循环

预期:循环指定Task,执行指定次数

  • 通过外部override,参数里面的target_count来实现复数次执行。
  • 通过对pipeline的傀儡节点——“CountTask_RunNode”进行override,来实现循环的主体可任意更改的特性。并且不和custom_action_param耦合在一起。
  • 通过next_node可以衔接下一步节点,这里可以删掉不要这部分。

https://github.com/KhazixW2/MaaGumballs/blob/d7fb436fed33473283ffe505ae159d7108fa41d5/agent/action/count.py#L48C1-L84C52

"TL01_Start_Count": {
        "action": "Custom",
        "custom_action": "CountTask",
        "custom_action_param": {
            "count": 0,
            "target_count": 2,
            "next_node": []
        }
    },
"CountTask_RunNode": {
    "next": "TL01_Start"
}

KhazixW2 avatar Jun 17 '25 03:06 KhazixW2

任务列表

当前在执行一系列相似操作(如在商店中购买多个道具 A、B、C)时: 例如: A → A_购买 → A_确认购买 → B → B_购买 → B_确认购买 → C → C_购买 → C_确认购买

使用任务列表 任务列表:[A, B, C] → 指向统一的 购买 → 确认购买 流程。

https://github.com/TanyaShue/MaaYYs/blob/v1.1.9-beta.6/custom_dir/custom_actions/task_list.py

参数: 字典格式: {"task_list": {"A": True, "B": False, "C": True}}(可选) 列表格式: {"task_list": ["A", "B", "C"]} 这样可选参数后还能快速设置某个道具是否需要购买而不改变pipeline流程

TanyaShue avatar Jun 17 '25 04:06 TanyaShue

跨节点计时

相当于多个节点的整体timeout

参考:https://github.com/kqcoxn/MaaNewMoonAccompanying/blob/v2.0.5/agent/customs/Timer.py

本地存储与读取

存一些可能需要读取的信息,直接传key-value之类的就够用

参考:https://github.com/kqcoxn/MaaNewMoonAccompanying/blob/v1.2.6/agent/customs/utils.py#L51-L111

周期性检查

有些周常一周只需要检查一次,日常也可以适当优化,配合本地存储,可以做到如果做过就直接跳过需要经过繁琐路径进入的相关界面检查,节省用户时间

参考:https://github.com/kqcoxn/MaaNewMoonAccompanying/blob/v2.0.4/agent/customs/PeriodicInspection.py

tip: 大多数二游的检查时间应该是4点而不是0点,所以还应该来个设置更新偏移(

kqcoxn avatar Jun 17 '25 04:06 kqcoxn

感觉是最有用的通用的action:Screenshot,用于超时后截图,方便结合log进行测试。 MAA1999/[email protected]/agent/custom/action/general.py#L13-L61 不过这里可能不该重新截图,用 cache 可能更好

@Windsland52 这个用 action command 跑一个 cp 命令就实现了吧(

MistEO avatar Jun 17 '25 09:06 MistEO

玛丽!

unlimitedcodeG avatar Jun 17 '25 09:06 unlimitedcodeG

通过 next 里 node 名来决定怎么执行

MistEO avatar Jun 17 '25 10:06 MistEO

来个内嵌解释器(确信

neko-para avatar Jun 20 '25 09:06 neko-para

实现全局计数
1.循环次数,保存到本地json文件来自kqcoxn
https://github.com/kqcoxn/MaaNewMoonAccompanying/blob/v1.2.6/agent/customs/utils.py#L51-L111,
2.只有两个必须节点
3.本例子为结合pipeline和agent

"""全局计数器
    "custom_action_param": {
            "target_count": 4,#目标次数
            "nextTask": "panduan_zhujiemian", #,达到目标次数后,返回主界面操作
            "LoopNode": "背包向上滑动1"#未达到目标次数,背包翻页
        }
        target_count: 目标次数,**必须**
        nextTask: 完成目标次数后,执行下一任务节点 ,**必须**
        LoopNode: 未达到目标次数,可执行节点,**非必须**
"""

3.1pipeline: https://github.com/gitlihang/Maa_MHXY_MG/blob/main/assets/resource/base/pipeline/zhengli_baibao.json#L97-L131
3.2agent: https://github.com/gitlihang/Maa_MHXY_MG/blob/main/assets/agent/custom/action/count.py#L61-L107


回复: v5.1 已支持,请使用 max_hit 字段(详情参考 Pipeline 文档)

gitlihang avatar Jun 30 '25 02:06 gitlihang

多算法识别

https://github.com/MAA1999/M9A/blob/main/agent/custom/reco/general.py#L15-L574

class MultiRecognition(CustomRecognition):
    """
    多算法组合识别。

    参数格式:
    {
        "nodes": string[],
        "logic": {
            "type": "AND|OR|CUSTOM",
            "expression": string
        },
        "return": string|int[4]|None
    }

    字段说明:
    - nodes: 节点名称数组,按顺序对应 $0、$1、$2...
    - logic: 逻辑判断条件
      - type: 逻辑类型,默认"AND"
        - "AND": 所有节点都识别成功
        - "OR": 任意节点识别成功
        - "CUSTOM": 使用自定义表达式
      - expression: 自定义逻辑表达式,仅当type="CUSTOM"时使用
        - 使用 $0、$1、$2... 引用nodes数组中的节点
        - 使用 {NodeName} 引用其他已执行节点的识别结果
        - 支持 AND、OR、NOT 逻辑运算符和括号分组
    - return: 返回的ROI区域
      - int[4]格式: 直接返回固定坐标 [x, y, w, h]
      - string格式: 基于识别结果计算ROI表达式
        - 支持 $0、$1、$2 引用节点的识别区域
        - 支持 {NodeName} 引用其他已执行节点的识别区域
        - 支持 UNION($0,$1): 计算并集
        - 支持 INTERSECTION($0,$1): 计算交集
        - 支持 OFFSET($0,dx,dy,dw,dh): 偏移调整
        - 支持嵌套计算
    """

Windsland52 avatar Jul 18 '25 02:07 Windsland52

抗惯性的滑动

  • 滑动后不松手,向垂直方向在滑动一小段距离

回复: v4.5.x 已支持,请将 end 设为数组使用

overflow65537 avatar Jul 18 '25 03:07 overflow65537

Count(custom rec)

https://github.com/MAA1999/M9A/blob/main/agent/custom/reco/general.py#L578-L674

class Count(CustomRecognition):
    """
    节点匹配次数计数器,task_id变化时自动重置

    参数格式:
    {
        "target": int,
        "recognition": dict
    }

    字段说明:
    - target: 目标匹配次数,默认sys.maxsize
    - recognition: v2协议的recognition字段
      - type: 识别类型,默认DirectHit
      - param: 识别相关字段
    """

配套 custom action

https://github.com/MAA1999/M9A/blob/main/agent/custom/action/general.py#L128-L151

class ResetCount(CustomAction):
    """
    重置计数器。

    参数格式:
    {
        "node_name": String # 目标计数器节点名称,不存在时重置全部节点
    }
    """

还可以设置到指定次数(待定)

Windsland52 avatar Jul 20 '25 14:07 Windsland52

感觉是最有用的通用的action:Screenshot,用于超时后截图,方便结合log进行测试。 MAA1999/[email protected]/agent/custom/action/general.py#L13-L61 不过这里可能不该重新截图,用 cache 可能更好

@Windsland52 这个用 action command 跑一个 cp 命令就实现了吧(

目前command不能分平台, 用不了一点(

neko-para avatar Aug 07 '25 13:08 neko-para

初步计划:

  • 将该项目命名为 plugin,主要用于实现通用 custom 功能,项目业务 custom 仍通过项目自己的 agent 实现,互不影响
  • 使用动态加载的方式加载 plugin 文件夹中的 dll,开发者将自己项目需要的 dll 置入文件夹中即可
  • MaaFW release 包中暂定内置一个《解析 next 列表中 node name 特殊符号以实现 is_sub 功能的 plugin》,后续 release 包中其他内置的 plugin 需谨慎评估
  • 提供 C++ / C# dll 模板,以便后续其他开发者开发更多 plugin
  • 提供一个类似 社区项目 的文档/章节,供更多第三方 plugin 自荐

上述 dll 仅为代词,在不同系统下指代不同的 dll/so/dylib 等动态库文件

MistEO avatar Oct 02 '25 05:10 MistEO

多算法识别

https://github.com/MAA1999/M9A/blob/main/agent/custom/reco/general.py#L15-L574

class MultiRecognition(CustomRecognition): """ 多算法组合识别。

参数格式:
{
    "nodes": string[],
    "logic": {
        "type": "AND|OR|CUSTOM",
        "expression": string
    },
    "return": string|int[4]|None
}

字段说明:
- nodes: 节点名称数组,按顺序对应 $0、$1、$2...
- logic: 逻辑判断条件
  - type: 逻辑类型,默认"AND"
    - "AND": 所有节点都识别成功
    - "OR": 任意节点识别成功
    - "CUSTOM": 使用自定义表达式
  - expression: 自定义逻辑表达式,仅当type="CUSTOM"时使用
    - 使用 $0、$1、$2... 引用nodes数组中的节点
    - 使用 {NodeName} 引用其他已执行节点的识别结果
    - 支持 AND、OR、NOT 逻辑运算符和括号分组
- return: 返回的ROI区域
  - int[4]格式: 直接返回固定坐标 [x, y, w, h]
  - string格式: 基于识别结果计算ROI表达式
    - 支持 $0、$1、$2 引用节点的识别区域
    - 支持 {NodeName} 引用其他已执行节点的识别区域
    - 支持 UNION($0,$1): 计算并集
    - 支持 INTERSECTION($0,$1): 计算交集
    - 支持 OFFSET($0,dx,dy,dw,dh): 偏移调整
    - 支持嵌套计算
"""

发现现有代码有严重问题,如果是 AND 逻辑,两个节点是 best_result 进行判断,实际应该用 filter_result 组合再判断,然后如果涉及 "roi" : string 的情况会更复杂,感觉不适合用 custom 写,得 fw 支持

Windsland52 avatar Nov 14 '25 06:11 Windsland52

v5.1 版本原生支持了 max_hit 字段(具体请参考 Pipeline 文档),可用于实现循环及计数功能

Tips: DirectHit 也参与计数,可用 next: [ 计数节点, 超限后节点 ] 实现类似 if else 逻辑

MistEO avatar Nov 27 '25 06:11 MistEO

v5.1 版本原生支持了 on_error 触发时自动保存截图,默认开启,若不需要可通过 set_save_on_error 接口关闭

MistEO avatar Nov 27 '25 14:11 MistEO