How to Use#

下面我们将介绍如何使用这个项目. 我们假设我们刚来到一个 WotLK 巫妖王之怒版本的服务器, 我们建立了 5 个游戏账号, 每个账号上有 1 个角色, 它们分别是一个 防护/惩戒 (主防护) 骑士, 三个 元素/恢复 (主元素) 萨满, 一个 元素/恢复 (主恢复) 的萨满.

Note

这个项目支持多个不同的 WOW 版本, 因为它们的客户端 WTF 目录结构大同小异. 虽然这篇文档是以人气较高的 WotLK 版本为例, 但是你在使用其他版本时依然可以参考本文.

Note

wow_sdm/tests/exp03_wotlk 目录有一个完整的如何使用这个库项目来管理你的宏命令的例子. 请在阅读本文时跟这个例子互相印证.

1. Account and Character Configuration#

Note

这部分的功能由另一个库 wow_acc 提供. 你可以参考 这篇文档 来了解如何枚举你的账号和角色.

首先你要枚举你的账号和角色.

我们在 acc_dataset.yml 文件中定义了我们的游戏账号和角色.

wow_sdm/tests/exp03_wotlk/acc_dataset.yml
 1acc01:
 2  realm1:
 3    - mypaladin
 4acc02:
 5  realm1:
 6    - myshaman1
 7acc03:
 8  realm1:
 9    - myshaman2
10acc04:
11  realm1:
12    - myshaman3
13acc05:
14  realm1:
15    - myshaman4

然后我们编写了一个 acc_dataset.py 脚本用于生成对所有账号和角色的 enum 模块.

wow_sdm/tests/exp03_wotlk/acc_dataset.py
 1# -*- coding: utf-8 -*-
 2
 3from pathlib_mate import Path
 4from wow_acc.api import Dataset
 5
 6dir_here = Path(__file__).absolute().parent
 7ds = Dataset.from_yaml(dir_here.joinpath("acc_dataset.yml").read_text())
 8
 9if __name__ == "__main__":
10    path = dir_here.joinpath("acc_enum.py")
11    content = ds.to_module(
12        import_line="from wow_sdm.tests.exp03_wotlk.acc_dataset import ds",
13    )
14    path.write_text(content)

现在我们就得到了一个可以用 Python 变量引用我们的账号和角色的 acc_enum.py 模块了.

wow_sdm/tests/exp03_wotlk/acc_enum.py
 1# -*- coding: utf-8 -*-
 2
 3from wow_sdm.tests.exp03_wotlk.acc_dataset import ds
 4
 5
 6# fmt: off
 7class AccountEnum:
 8    acc01 = ds.accounts["acc01"]
 9    acc02 = ds.accounts["acc02"]
10    acc03 = ds.accounts["acc03"]
11    acc04 = ds.accounts["acc04"]
12    acc05 = ds.accounts["acc05"]
13
14
15class RealmEnum:
16    acc01_realm1 = ds.accounts["acc01"].realms_mapper["realm1"]
17    acc02_realm1 = ds.accounts["acc02"].realms_mapper["realm1"]
18    acc03_realm1 = ds.accounts["acc03"].realms_mapper["realm1"]
19    acc04_realm1 = ds.accounts["acc04"].realms_mapper["realm1"]
20    acc05_realm1 = ds.accounts["acc05"].realms_mapper["realm1"]
21
22
23class CharacterEnum:
24    acc01_realm1_mypaladin = ds.accounts["acc01"].realms_mapper["realm1"].characters_mapper["mypaladin"]
25    acc02_realm1_myshaman1 = ds.accounts["acc02"].realms_mapper["realm1"].characters_mapper["myshaman1"]
26    acc03_realm1_myshaman2 = ds.accounts["acc03"].realms_mapper["realm1"].characters_mapper["myshaman2"]
27    acc04_realm1_myshaman3 = ds.accounts["acc04"].realms_mapper["realm1"].characters_mapper["myshaman3"]
28    acc05_realm1_myshaman4 = ds.accounts["acc05"].realms_mapper["realm1"].characters_mapper["myshaman4"]
29# fmt: on

更进一步地, 你可以按照逻辑对这些账号和角色的 enum 进行分组, 这样在之后引用的时候就可以批量引用而不用一个个的手打了. acc_group.py 模块是一个很好的例子.

wow_sdm/tests/exp03_wotlk/acc_group.py
 1# -*- coding: utf-8 -*-
 2
 3"""
 4This module can help you organize your enum into group, made it easier to
 5construct mappings later.
 6"""
 7
 8from wow_sdm.api import get_values
 9from wow_sdm.tests.exp03_wotlk.acc_enum import AccountEnum, CharacterEnum
10
11
12# ==============================================================================
13# START of manual editing
14# ==============================================================================
15class AccountGroupEnum:
16    all_accounts = get_values(AccountEnum)
17
18
19class CharacterGroupEnum:
20    all_characters = get_values(CharacterEnum)
21
22    paladin_protect_retri = [
23        CharacterEnum.acc01_realm1_mypaladin,
24    ]
25
26    shaman_elemental_resto = [
27        CharacterEnum.acc02_realm1_myshaman1,
28        CharacterEnum.acc03_realm1_myshaman2,
29        CharacterEnum.acc04_realm1_myshaman3,
30        CharacterEnum.acc05_realm1_myshaman4,
31    ]
32
33
34# ==============================================================================
35# END of manual editing
36# ==============================================================================

2. Craft Your Macro Catalogs#

下面我们就会开始编写一个非常庞大的宏命令库了.

exp03_wotlk/sdm_macros 目录下有一些 YAML 文件和文件夹. 每个 YAML 文件就是一个宏命令. 例如在 02-paladin/1-protect-retri/11305-rotation-zhCN.yml 就是一个 防护/惩戒 骑士的输出循环宏.

02-paladin/1-protect-retri/11305-rotation-zhCN.yml
 1name: Rotation
 2character:
 3  name:
 4  realm:
 5type: b
 6id: 11305
 7icon:
 8description: |
 9  防骑 / 惩戒骑 的一键宏循环.
10text: |
11  #showtooltip
12  /startattack
13  /castsequence [spec:1] reset=10 正义之锤,正义盾击,智慧审判,神圣之盾,正义之锤,正义盾击,智慧审判,正义之锤,正义盾击,神圣之盾
14  /castsequence [spec:2] reset=10 智慧审判,十字军打击,神圣风暴,奉献,十字军打击,智慧审判,驱邪术,十字军打击,神圣风暴,十字军打击

这个目录结构只是我认为最合理的结构, 你可以使用你喜欢的任何目录结构. 不过我在 exp03_wotlk/sdm_macros/README.rst 文件中详细阐述了我的目录结构为什么这样设计. 我建议你查看 exp03_wotlk/sdm_macros 里的 yaml 文件, 学习了解之后再考虑设计你自己的目录结构.

3. Generate Macro Enum Module#

1. Account and Character Configuration 类似, 我们也要将我们的宏命令转化成一个 Python 模块, 使得每一个宏命令文件都是一个 enum.

我们编写了一个 sdm_dataset.py 脚本用于生成对所有配置文件的 enum 模块.

wow_sdm/tests/exp03_wotlk/sdm_dataset.py
 1# -*- coding: utf-8 -*-
 2
 3from pathlib_mate import Path
 4from wow_sdm.api import exp03_wotlk
 5
 6dir_here = Path.dir_here(__file__)
 7dir_root = dir_here.joinpath("sdm_macros")
 8
 9if __name__ == "__main__":
10    content = exp03_wotlk.to_module(
11        dir_root=dir_root,
12        import_dir_root_line="from .sdm_dataset import dir_root",
13    )
14    dir_here.joinpath("sdm_enum.py").write_text(content, encoding="utf-8")

现在我们就得到了一个可以用 Python 变量引用我们的配置文件的 sdm_enum.py 模块了.

wow_sdm/tests/exp03_wotlk/sdm_enum.py
  1# -*- coding: utf-8 -*-
  2
  3from wow_sdm.tests.exp03_wotlk.sdm_dataset import dir_root
  4
  5# fmt: off
  6class MacroEnum:
  7    f_00_common__1001_respawn = dir_root.joinpath("00-common", "1001-respawn.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/00-common/1001-respawn.yml
  8    f_00_common__1002_feigh_death = dir_root.joinpath("00-common", "1002-feigh-death.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/00-common/1002-feigh-death.yml
  9    f_00_common__1003_reset_cooldown = dir_root.joinpath("00-common", "1003-reset-cooldown.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/00-common/1003-reset-cooldown.yml
 10    f_00_common__1004_ice_block = dir_root.joinpath("00-common", "1004-ice-block.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/00-common/1004-ice-block.yml
 11    f_00_common__1005_resurrection = dir_root.joinpath("00-common", "1005-resurrection.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/00-common/1005-resurrection.yml
 12    f_00_common__1006_invisibility = dir_root.joinpath("00-common", "1006-invisibility.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/00-common/1006-invisibility.yml
 13    f_00_common__1007_unbind_instance = dir_root.joinpath("00-common", "1007-unbind-instance.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/00-common/1007-unbind-instance.yml
 14    f_00_common__1008_fly_up = dir_root.joinpath("00-common", "1008-fly-up.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/00-common/1008-fly-up.yml
 15    f_00_common__1009_fly_down = dir_root.joinpath("00-common", "1009-fly-down.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/00-common/1009-fly-down.yml
 16    f_00_common__1010_x32_speed = dir_root.joinpath("00-common", "1010-x32-speed.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/00-common/1010-x32-speed.yml
 17    f_00_common__1011_MountUp_zhCN = dir_root.joinpath("00-common", "1011-MountUp-zhCN.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/00-common/1011-MountUp-zhCN.yml
 18    f_00_common__1011_MountUp_zhTW = dir_root.joinpath("00-common", "1011-MountUp-zhTW.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/00-common/1011-MountUp-zhTW.yml
 19    f_00_common__1012_MountDown_zhCN = dir_root.joinpath("00-common", "1012-MountDown-zhCN.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/00-common/1012-MountDown-zhCN.yml
 20    f_00_common__1012_MountDown_zhTW = dir_root.joinpath("00-common", "1012-MountDown-zhTW.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/00-common/1012-MountDown-zhTW.yml
 21    f_00_common__1101_target_party = dir_root.joinpath("00-common", "1101-target-party.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/00-common/1101-target-party.yml
 22    f_00_common__1102_target_raid = dir_root.joinpath("00-common", "1102-target-raid.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/00-common/1102-target-raid.yml
 23    f_00_common__1103_target_focus_target = dir_root.joinpath("00-common", "1103-target-focus-target.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/00-common/1103-target-focus-target.yml
 24    f_00_common__1104_target_focus_target_target = dir_root.joinpath("00-common", "1104-target-focus-target-target.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/00-common/1104-target-focus-target-target.yml
 25    f_00_common__1105_confirm = dir_root.joinpath("00-common", "1105-confirm.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/00-common/1105-confirm.yml
 26    f_00_common__1106_set_focus = dir_root.joinpath("00-common", "1106-set-focus.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/00-common/1106-set-focus.yml
 27    f_00_common__1107_clear_focus = dir_root.joinpath("00-common", "1107-clear-focus.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/00-common/1107-clear-focus.yml
 28    f_00_common__1108_set_high_fps = dir_root.joinpath("00-common", "1108-set-high-fps.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/00-common/1108-set-high-fps.yml
 29    f_00_common__1109_set_low_fps = dir_root.joinpath("00-common", "1109-set-low-fps.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/00-common/1109-set-low-fps.yml
 30    f_00_common__1110_follow_focus = dir_root.joinpath("00-common", "1110-follow-focus.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/00-common/1110-follow-focus.yml
 31    f_00_common__1131_target_window_01 = dir_root.joinpath("00-common", "1131-target-window-01.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/00-common/1131-target-window-01.yml
 32    f_00_common__1132_target_window_10 = dir_root.joinpath("00-common", "1132-target-window-10.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/00-common/1132-target-window-10.yml
 33    f_00_common__1151_invite_raid = dir_root.joinpath("00-common", "1151-invite-raid.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/00-common/1151-invite-raid.yml
 34    f_00_common__1152_leave_raid = dir_root.joinpath("00-common", "1152-leave-raid.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/00-common/1152-leave-raid.yml
 35    f_00_common__1153_summon = dir_root.joinpath("00-common", "1153-summon.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/00-common/1153-summon.yml
 36    f_00_common__1171_tele_darnassus = dir_root.joinpath("00-common", "1171-tele-darnassus.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/00-common/1171-tele-darnassus.yml
 37    f_00_common__1172_tele_ironforge = dir_root.joinpath("00-common", "1172-tele-ironforge.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/00-common/1172-tele-ironforge.yml
 38    f_00_common__1173_tele_orgrimmar = dir_root.joinpath("00-common", "1173-tele-orgrimmar.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/00-common/1173-tele-orgrimmar.yml
 39    f_00_common__1174_tele_undercity = dir_root.joinpath("00-common", "1174-tele-undercity.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/00-common/1174-tele-undercity.yml
 40    f_00_common__1175_tele_shattrath = dir_root.joinpath("00-common", "1175-tele-shattrath.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/00-common/1175-tele-shattrath.yml
 41    f_00_common__1176_tele_dalaran = dir_root.joinpath("00-common", "1176-tele-dalaran.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/00-common/1176-tele-dalaran.yml
 42    f_00_common__2001_buff_physics_dps_lv60 = dir_root.joinpath("00-common", "2001-buff-physics-dps-lv60.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/00-common/2001-buff-physics-dps-lv60.yml
 43    f_00_common__2001_buff_physics_dps = dir_root.joinpath("00-common", "2001-buff-physics-dps.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/00-common/2001-buff-physics-dps.yml
 44    f_00_common__2002_buff_caster_dps_lv60 = dir_root.joinpath("00-common", "2002-buff-caster-dps-lv60.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/00-common/2002-buff-caster-dps-lv60.yml
 45    f_00_common__2002_buff_caster_dps = dir_root.joinpath("00-common", "2002-buff-caster-dps.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/00-common/2002-buff-caster-dps.yml
 46    f_00_common__2003_buff_tank_lv60 = dir_root.joinpath("00-common", "2003-buff-tank-lv60.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/00-common/2003-buff-tank-lv60.yml
 47    f_00_common__2003_buff_tank = dir_root.joinpath("00-common", "2003-buff-tank.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/00-common/2003-buff-tank.yml
 48    f_00_common__2004_buff_healer_lv60 = dir_root.joinpath("00-common", "2004-buff-healer-lv60.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/00-common/2004-buff-healer-lv60.yml
 49    f_00_common__2004_buff_healer = dir_root.joinpath("00-common", "2004-buff-healer.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/00-common/2004-buff-healer.yml
 50    f_00_common__6001_mb_special1 = dir_root.joinpath("00-common", "6001-mb-special1.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/00-common/6001-mb-special1.yml
 51    f_00_common__6002_mb_special2 = dir_root.joinpath("00-common", "6002-mb-special2.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/00-common/6002-mb-special2.yml
 52    f_00_common__6003_mb_special3 = dir_root.joinpath("00-common", "6003-mb-special3.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/00-common/6003-mb-special3.yml
 53    f_02_paladin__0_common__11101_consumable = dir_root.joinpath("02-paladin", "0-common", "11101-consumable.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/02-paladin/0-common/11101-consumable.yml
 54    f_02_paladin__0_common__11111_clear_debuff_zhCN = dir_root.joinpath("02-paladin", "0-common", "11111-clear-debuff-zhCN.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/02-paladin/0-common/11111-clear-debuff-zhCN.yml
 55    f_02_paladin__0_common__11111_clear_debuff_zhTW = dir_root.joinpath("02-paladin", "0-common", "11111-clear-debuff-zhTW.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/02-paladin/0-common/11111-clear-debuff-zhTW.yml
 56    f_02_paladin__0_common__11112_raid_divine_sacrifice_zhCN = dir_root.joinpath("02-paladin", "0-common", "11112-raid-divine-sacrifice-zhCN.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/02-paladin/0-common/11112-raid-divine-sacrifice-zhCN.yml
 57    f_02_paladin__0_common__11112_raid_divine_sacrifice_zhTW = dir_root.joinpath("02-paladin", "0-common", "11112-raid-divine-sacrifice-zhTW.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/02-paladin/0-common/11112-raid-divine-sacrifice-zhTW.yml
 58    f_02_paladin__0_common__11131_protect_rotation_zhCN = dir_root.joinpath("02-paladin", "0-common", "11131-protect-rotation-zhCN.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/02-paladin/0-common/11131-protect-rotation-zhCN.yml
 59    f_02_paladin__0_common__11131_protect_rotation_zhTW = dir_root.joinpath("02-paladin", "0-common", "11131-protect-rotation-zhTW.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/02-paladin/0-common/11131-protect-rotation-zhTW.yml
 60    f_02_paladin__0_common__11132_retribution_rotation_zhCN = dir_root.joinpath("02-paladin", "0-common", "11132-retribution-rotation-zhCN.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/02-paladin/0-common/11132-retribution-rotation-zhCN.yml
 61    f_02_paladin__0_common__11132_retribution_rotation_zhTW = dir_root.joinpath("02-paladin", "0-common", "11132-retribution-rotation-zhTW.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/02-paladin/0-common/11132-retribution-rotation-zhTW.yml
 62    f_02_paladin__0_common__11133_holy_rotation_zhCN = dir_root.joinpath("02-paladin", "0-common", "11133-holy-rotation-zhCN.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/02-paladin/0-common/11133-holy-rotation-zhCN.yml
 63    f_02_paladin__0_common__11133_holy_rotation_zhTW = dir_root.joinpath("02-paladin", "0-common", "11133-holy-rotation-zhTW.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/02-paladin/0-common/11133-holy-rotation-zhTW.yml
 64    f_02_paladin__0_common__27171_high_int_heal_rotation_zhCN = dir_root.joinpath("02-paladin", "0-common", "27171-high-int-heal-rotation-zhCN.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/02-paladin/0-common/27171-high-int-heal-rotation-zhCN.yml
 65    f_02_paladin__0_common__27171_high_int_heal_rotation_zhTW = dir_root.joinpath("02-paladin", "0-common", "27171-high-int-heal-rotation-zhTW.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/02-paladin/0-common/27171-high-int-heal-rotation-zhTW.yml
 66    f_02_paladin__0_common__27172_high_crt_heal_rotation_zhCN = dir_root.joinpath("02-paladin", "0-common", "27172-high-crt-heal-rotation-zhCN.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/02-paladin/0-common/27172-high-crt-heal-rotation-zhCN.yml
 67    f_02_paladin__0_common__27172_high_crt_heal_rotation_zhTW = dir_root.joinpath("02-paladin", "0-common", "27172-high-crt-heal-rotation-zhTW.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/02-paladin/0-common/27172-high-crt-heal-rotation-zhTW.yml
 68    f_02_paladin__1_protect_retri__11301_act1_zhCN = dir_root.joinpath("02-paladin", "1-protect-retri", "11301-act1-zhCN.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/02-paladin/1-protect-retri/11301-act1-zhCN.yml
 69    f_02_paladin__1_protect_retri__11301_act1_zhTW = dir_root.joinpath("02-paladin", "1-protect-retri", "11301-act1-zhTW.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/02-paladin/1-protect-retri/11301-act1-zhTW.yml
 70    f_02_paladin__1_protect_retri__11302_act2_zhCN = dir_root.joinpath("02-paladin", "1-protect-retri", "11302-act2-zhCN.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/02-paladin/1-protect-retri/11302-act2-zhCN.yml
 71    f_02_paladin__1_protect_retri__11302_act2_zhTW = dir_root.joinpath("02-paladin", "1-protect-retri", "11302-act2-zhTW.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/02-paladin/1-protect-retri/11302-act2-zhTW.yml
 72    f_02_paladin__1_protect_retri__11303_act3_zhCN = dir_root.joinpath("02-paladin", "1-protect-retri", "11303-act3-zhCN.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/02-paladin/1-protect-retri/11303-act3-zhCN.yml
 73    f_02_paladin__1_protect_retri__11303_act3_zhTW = dir_root.joinpath("02-paladin", "1-protect-retri", "11303-act3-zhTW.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/02-paladin/1-protect-retri/11303-act3-zhTW.yml
 74    f_02_paladin__1_protect_retri__11304_act4_zhCN = dir_root.joinpath("02-paladin", "1-protect-retri", "11304-act4-zhCN.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/02-paladin/1-protect-retri/11304-act4-zhCN.yml
 75    f_02_paladin__1_protect_retri__11304_act4_zhTW = dir_root.joinpath("02-paladin", "1-protect-retri", "11304-act4-zhTW.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/02-paladin/1-protect-retri/11304-act4-zhTW.yml
 76    f_02_paladin__1_protect_retri__11305_rotation_zhCN = dir_root.joinpath("02-paladin", "1-protect-retri", "11305-rotation-zhCN.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/02-paladin/1-protect-retri/11305-rotation-zhCN.yml
 77    f_02_paladin__1_protect_retri__11305_rotation_zhTW = dir_root.joinpath("02-paladin", "1-protect-retri", "11305-rotation-zhTW.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/02-paladin/1-protect-retri/11305-rotation-zhTW.yml
 78    f_02_paladin__1_protect_retri__11311_buff_self_alliance_zhCN = dir_root.joinpath("02-paladin", "1-protect-retri", "11311-buff-self-alliance-zhCN.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/02-paladin/1-protect-retri/11311-buff-self-alliance-zhCN.yml
 79    f_02_paladin__1_protect_retri__11311_buff_self_alliance_zhTW = dir_root.joinpath("02-paladin", "1-protect-retri", "11311-buff-self-alliance-zhTW.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/02-paladin/1-protect-retri/11311-buff-self-alliance-zhTW.yml
 80    f_02_paladin__1_protect_retri__11311_buff_self_horde_zhCN = dir_root.joinpath("02-paladin", "1-protect-retri", "11311-buff-self-horde-zhCN.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/02-paladin/1-protect-retri/11311-buff-self-horde-zhCN.yml
 81    f_02_paladin__1_protect_retri__11311_buff_self_horde_zhTW = dir_root.joinpath("02-paladin", "1-protect-retri", "11311-buff-self-horde-zhTW.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/02-paladin/1-protect-retri/11311-buff-self-horde-zhTW.yml
 82    f_02_paladin__3_holy_protect__11711_act1_zhCN = dir_root.joinpath("02-paladin", "3-holy-protect", "11711-act1-zhCN.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/02-paladin/3-holy-protect/11711-act1-zhCN.yml
 83    f_02_paladin__3_holy_protect__11711_act1_zhTW = dir_root.joinpath("02-paladin", "3-holy-protect", "11711-act1-zhTW.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/02-paladin/3-holy-protect/11711-act1-zhTW.yml
 84    f_02_paladin__3_holy_protect__11712_act2_zhCN = dir_root.joinpath("02-paladin", "3-holy-protect", "11712-act2-zhCN.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/02-paladin/3-holy-protect/11712-act2-zhCN.yml
 85    f_02_paladin__3_holy_protect__11712_act2_zhTW = dir_root.joinpath("02-paladin", "3-holy-protect", "11712-act2-zhTW.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/02-paladin/3-holy-protect/11712-act2-zhTW.yml
 86    f_02_paladin__3_holy_protect__11731_buff_self_alliance_zhCN = dir_root.joinpath("02-paladin", "3-holy-protect", "11731-buff-self-alliance-zhCN.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/02-paladin/3-holy-protect/11731-buff-self-alliance-zhCN.yml
 87    f_02_paladin__3_holy_protect__11731_buff_self_alliance_zhTW = dir_root.joinpath("02-paladin", "3-holy-protect", "11731-buff-self-alliance-zhTW.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/02-paladin/3-holy-protect/11731-buff-self-alliance-zhTW.yml
 88    f_02_paladin__3_holy_protect__11731_buff_self_horde_zhCN = dir_root.joinpath("02-paladin", "3-holy-protect", "11731-buff-self-horde-zhCN.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/02-paladin/3-holy-protect/11731-buff-self-horde-zhCN.yml
 89    f_02_paladin__3_holy_protect__11731_buff_self_horde_zhTW = dir_root.joinpath("02-paladin", "3-holy-protect", "11731-buff-self-horde-zhTW.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/02-paladin/3-holy-protect/11731-buff-self-horde-zhTW.yml
 90    f_02_paladin__3_holy_protect__11751_mb_periodical_beacon_zhCN = dir_root.joinpath("02-paladin", "3-holy-protect", "11751-mb-periodical-beacon-zhCN.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/02-paladin/3-holy-protect/11751-mb-periodical-beacon-zhCN.yml
 91    f_02_paladin__3_holy_protect__11751_mb_periodical_beacon_zhTW = dir_root.joinpath("02-paladin", "3-holy-protect", "11751-mb-periodical-beacon-zhTW.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/02-paladin/3-holy-protect/11751-mb-periodical-beacon-zhTW.yml
 92    f_02_paladin__3_holy_protect__11752_mb_periodical_judgement_zhCN = dir_root.joinpath("02-paladin", "3-holy-protect", "11752-mb-periodical-judgement-zhCN.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/02-paladin/3-holy-protect/11752-mb-periodical-judgement-zhCN.yml
 93    f_02_paladin__3_holy_protect__11752_mb_periodical_judgement_zhTW = dir_root.joinpath("02-paladin", "3-holy-protect", "11752-mb-periodical-judgement-zhTW.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/02-paladin/3-holy-protect/11752-mb-periodical-judgement-zhTW.yml
 94    f_05_shaman__0_common__14101_consumable = dir_root.joinpath("05-shaman", "0-common", "14101-consumable.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/05-shaman/0-common/14101-consumable.yml
 95    f_05_shaman__0_common__14102_interrupt_zhCN = dir_root.joinpath("05-shaman", "0-common", "14102-interrupt-zhCN.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/05-shaman/0-common/14102-interrupt-zhCN.yml
 96    f_05_shaman__0_common__14102_interrupt_zhTW = dir_root.joinpath("05-shaman", "0-common", "14102-interrupt-zhTW.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/05-shaman/0-common/14102-interrupt-zhTW.yml
 97    f_05_shaman__0_common__14111_elemental_rotation_lv60_zhCN = dir_root.joinpath("05-shaman", "0-common", "14111-elemental-rotation-lv60-zhCN.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/05-shaman/0-common/14111-elemental-rotation-lv60-zhCN.yml
 98    f_05_shaman__0_common__14111_elemental_rotation_zhCN = dir_root.joinpath("05-shaman", "0-common", "14111-elemental-rotation-zhCN.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/05-shaman/0-common/14111-elemental-rotation-zhCN.yml
 99    f_05_shaman__0_common__14111_elemental_rotation_zhTW = dir_root.joinpath("05-shaman", "0-common", "14111-elemental-rotation-zhTW.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/05-shaman/0-common/14111-elemental-rotation-zhTW.yml
100    f_05_shaman__0_common__14112_resto_rotation_zhCN = dir_root.joinpath("05-shaman", "0-common", "14112-resto-rotation-zhCN.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/05-shaman/0-common/14112-resto-rotation-zhCN.yml
101    f_05_shaman__0_common__14112_resto_rotation_zhTW = dir_root.joinpath("05-shaman", "0-common", "14112-resto-rotation-zhTW.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/05-shaman/0-common/14112-resto-rotation-zhTW.yml
102    f_05_shaman__0_common__14113_enhancement_rotation_zhCN = dir_root.joinpath("05-shaman", "0-common", "14113-enhancement-rotation-zhCN.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/05-shaman/0-common/14113-enhancement-rotation-zhCN.yml
103    f_05_shaman__0_common__14113_enhancement_rotation_zhTW = dir_root.joinpath("05-shaman", "0-common", "14113-enhancement-rotation-zhTW.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/05-shaman/0-common/14113-enhancement-rotation-zhTW.yml
104    f_05_shaman__0_common__14114_mb_resto_earth_shield_zhCN = dir_root.joinpath("05-shaman", "0-common", "14114-mb-resto-earth-shield-zhCN.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/05-shaman/0-common/14114-mb-resto-earth-shield-zhCN.yml
105    f_05_shaman__0_common__14114_mb_resto_earth_shield_zhTW = dir_root.joinpath("05-shaman", "0-common", "14114-mb-resto-earth-shield-zhTW.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/05-shaman/0-common/14114-mb-resto-earth-shield-zhTW.yml
106    f_05_shaman__1_elemental_resto__14311_buff_self_zhCN = dir_root.joinpath("05-shaman", "1-elemental-resto", "14311-buff-self-zhCN.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/05-shaman/1-elemental-resto/14311-buff-self-zhCN.yml
107    f_05_shaman__1_elemental_resto__14311_buff_self_zhTW = dir_root.joinpath("05-shaman", "1-elemental-resto", "14311-buff-self-zhTW.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/05-shaman/1-elemental-resto/14311-buff-self-zhTW.yml
108    f_05_shaman__1_elemental_resto__14312_burst_zhCN = dir_root.joinpath("05-shaman", "1-elemental-resto", "14312-burst-zhCN.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/05-shaman/1-elemental-resto/14312-burst-zhCN.yml
109    f_05_shaman__1_elemental_resto__14312_burst_zhTW = dir_root.joinpath("05-shaman", "1-elemental-resto", "14312-burst-zhTW.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/05-shaman/1-elemental-resto/14312-burst-zhTW.yml
110    f_05_shaman__2_resto_enhancement__14511_buff_self_zhCN = dir_root.joinpath("05-shaman", "2-resto-enhancement", "14511-buff-self-zhCN.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/05-shaman/2-resto-enhancement/14511-buff-self-zhCN.yml
111    f_05_shaman__2_resto_enhancement__14511_buff_self_zhTW = dir_root.joinpath("05-shaman", "2-resto-enhancement", "14511-buff-self-zhTW.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/05-shaman/2-resto-enhancement/14511-buff-self-zhTW.yml
112    f_05_shaman__2_resto_enhancement__14512_burst_zhCN = dir_root.joinpath("05-shaman", "2-resto-enhancement", "14512-burst-zhCN.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/05-shaman/2-resto-enhancement/14512-burst-zhCN.yml
113    f_05_shaman__2_resto_enhancement__14512_burst_zhTW = dir_root.joinpath("05-shaman", "2-resto-enhancement", "14512-burst-zhTW.yml") # file:///Users/sanhehu/Documents/GitHub/wow_sdm-project/wow_sdm/tests/exp03_wotlk/sdm_macros/05-shaman/2-resto-enhancement/14512-burst-zhTW.yml
114# fmt: on

更进一步地, 你可以按照逻辑对这些 enum 进行分组, 这样在之后引用的时候就可以批量引用而不用一个个的手打了. sdm_group.py 模块是一个很好的例子.

wow_sdm/tests/exp03_wotlk/sdm_group.py
 1# -*- coding: utf-8 -*-
 2
 3"""
 4This module can help you organize your enum into group, made it easier to
 5construct mappings later.
 6"""
 7
 8from ordered_set import OrderedSet
 9from wow_sdm.api import get_values
10from wow_sdm.tests.exp03_wotlk.sdm_enum import MacroEnum
11
12
13# ==============================================================================
14# START of manual editing
15# ==============================================================================
16class MacroGroupEnum:
17    all_macros = get_values(MacroEnum)
18
19    acc_common = [
20        # GM command
21        MacroEnum.f_00_common__1001_respawn,
22        MacroEnum.f_00_common__1002_feigh_death,
23        MacroEnum.f_00_common__1003_reset_cooldown,
24        MacroEnum.f_00_common__1004_ice_block,
25        MacroEnum.f_00_common__1005_resurrection,
26        MacroEnum.f_00_common__1006_invisibility,
27        MacroEnum.f_00_common__1007_unbind_instance,
28        MacroEnum.f_00_common__1008_fly_up,
29        MacroEnum.f_00_common__1009_fly_down,
30        MacroEnum.f_00_common__1010_x32_speed,
31        # Mount
32        MacroEnum.f_00_common__1011_MountUp_zhTW,
33        MacroEnum.f_00_common__1012_MountDown_zhTW,
34        # Multi-box
35        MacroEnum.f_00_common__1101_target_party,
36        MacroEnum.f_00_common__1102_target_raid,
37        MacroEnum.f_00_common__1103_target_focus_target,
38        MacroEnum.f_00_common__1104_target_focus_target_target,
39        MacroEnum.f_00_common__1105_confirm,
40        MacroEnum.f_00_common__1106_set_focus,
41        MacroEnum.f_00_common__1107_clear_focus,
42        MacroEnum.f_00_common__1108_set_high_fps,
43        MacroEnum.f_00_common__1109_set_low_fps,
44        MacroEnum.f_00_common__1110_follow_focus,
45        # Target specific character
46        MacroEnum.f_00_common__1131_target_window_01,
47        MacroEnum.f_00_common__1132_target_window_10,
48        # Party and Raid
49        MacroEnum.f_00_common__1151_invite_raid,
50        MacroEnum.f_00_common__1152_leave_raid,
51        MacroEnum.f_00_common__1153_summon,
52        # Teleport
53        MacroEnum.f_00_common__1173_tele_orgrimmar,
54        MacroEnum.f_00_common__1174_tele_undercity,
55        MacroEnum.f_00_common__1175_tele_shattrath,
56        MacroEnum.f_00_common__1176_tele_dalaran,
57    ]
58    acc_common = OrderedSet(acc_common)
59
60    paladin_protect_retri = [
61        # Buff
62        MacroEnum.f_02_paladin__1_protect_retri__11311_buff_self_alliance_zhCN,
63        # Act
64        MacroEnum.f_02_paladin__1_protect_retri__11301_act1_zhCN,
65        MacroEnum.f_02_paladin__1_protect_retri__11302_act2_zhCN,
66        MacroEnum.f_02_paladin__1_protect_retri__11303_act3_zhCN,
67        MacroEnum.f_02_paladin__1_protect_retri__11304_act4_zhCN,
68        MacroEnum.f_02_paladin__0_common__11131_protect_rotation_zhCN,
69        MacroEnum.f_02_paladin__0_common__11132_retribution_rotation_zhCN,
70    ]
71    paladin_protect_retri = OrderedSet(paladin_protect_retri)
72
73    shaman_elemental_resto = [
74        # Command
75        MacroEnum.f_05_shaman__0_common__14102_interrupt_zhCN,
76        # Buff
77        MacroEnum.f_05_shaman__1_elemental_resto__14311_buff_self_zhCN,
78        # Act
79        MacroEnum.f_05_shaman__0_common__14111_elemental_rotation_lv60_zhCN,
80        MacroEnum.f_05_shaman__0_common__14112_resto_rotation_zhCN,
81        MacroEnum.f_05_shaman__0_common__14114_mb_resto_earth_shield_zhCN,
82        MacroEnum.f_05_shaman__1_elemental_resto__14312_burst_zhCN,
83    ]
84    shaman_elemental_resto = OrderedSet(shaman_elemental_resto)
85
86
87# ==============================================================================
88# END of manual editing
89# ==============================================================================

4. Define Your Account / Character and Macro Mapping#

我们有了 Account / Character 的 Enum, 也有了 WTF Config 的 Enum, 下面就是要指定哪些账号和角色应该使用哪些配置了. 这个映射关系叫做 mapping.

我们需要编写一个 sdm_mapping.py 模块, 里面导入了我们之前定义的 acc_enum.pywtf_enum.py Enum.

wow_sdm/tests/exp03_wotlk/sdm_mapping.py
 1# -*- coding: utf-8 -*-
 2
 3from pathlib_mate import Path
 4from wow_sdm.api import get_values, concat_lists, exp03_wotlk
 5from wow_sdm.tests.exp03_wotlk.acc_enum import (
 6    AccountEnum as AccEnum,
 7    CharacterEnum as CharEnum,
 8)
 9from wow_sdm.tests.exp03_wotlk.acc_group import (
10    AccountGroupEnum as AccGrpEnum,
11    CharacterGroupEnum as CharGrpEnum,
12)
13from wow_sdm.tests.exp03_wotlk.sdm_enum import MacroEnum
14from wow_sdm.tests.exp03_wotlk.sdm_group import MacroGroupEnum
15
16Client = exp03_wotlk.Client
17AccMap = exp03_wotlk.AccLvlMapping
18CharMap = exp03_wotlk.CharLvlMapping
19SdmMapping = exp03_wotlk.SdmMapping
20
21dir_here = Path.dir_here(__file__)
22dir_game_client = dir_here.joinpath("world_of_warcraft_zhCN")
23
24client = exp03_wotlk.Client(
25    locale="zhCN",
26    dir=dir_game_client,
27)
28all_accounts = AccGrpEnum.all_accounts
29all_characters = CharGrpEnum.all_characters
30
31# ==============================================================================
32# START of manual editing
33# ==============================================================================
34# ------------------------------------------------------------------------------
35# acc_macros
36# ------------------------------------------------------------------------------
37acc_macros = AccMap.make_many(AccGrpEnum.all_accounts, MacroGroupEnum.acc_common)
38
39# ------------------------------------------------------------------------------
40# char_macros
41# ------------------------------------------------------------------------------
42char_macros = concat_lists(
43    CharMap.make_many(
44        CharGrpEnum.paladin_protect_retri, MacroGroupEnum.paladin_protect_retri
45    ),
46    CharMap.make_many(
47        CharGrpEnum.shaman_elemental_resto, MacroGroupEnum.shaman_elemental_resto
48    ),
49)
50
51# ==============================================================================
52# END of manual editing
53# ==============================================================================
54# ------------------------------------------------------------------------------
55# wtf_mapping
56# ------------------------------------------------------------------------------
57sdm_mapping = exp03_wotlk.SdmMapping(
58    client=client,
59    all_accounts=all_accounts,
60    all_characters=all_characters,
61    acc_macros=acc_macros,
62    char_macros=char_macros,
63)

接下来就是定义 SdmMapping 对象, 它是一个 mapping 数据的容器. 里面定义了例如 account 和 character 级别的宏命令.

wow_sdm 库还提供了一些函数能让你更方便地定义这些 mapping 数据. 例如:

  • make_many()make_many() 方法可以方便地让你将多个账户或角色和多个配置文件建立映射关系.

  • get_values() 方法可以方便地让你获得一个 enum 类的所有 member 的集合. 注意这里是集合, 也就是说你可以用 difference (取差异), intersection (取交集), union (取并集) 这些集合操作进行筛选.

  • concat_lists() 方法可以方便地让你将多个 list 连接起来.

5. Apply Macros#

有了 SdmMapping 对象之后, 你就可以将你的配置批量应用到你的客户端了. 你可以使用下面 wow_sdm.exp03_wotlk.mapping.SdmMapping.apply() 方法来将你的宏命令写入到客户端的 WTF/Account/MYACCOUNT/SavedVariables/SuperDuperMacro.lua 文件中:

sdm_apply.py 文件是一个例子, 它展示了如何将我们的配置应用到我们的客户端.

wow_sdm/tests/exp03_wotlk/sdm_apply.py
1# -*- coding: utf-8 -*-
2
3from wow_sdm.tests.exp03_wotlk.sdm_mapping import sdm_mapping
4
5real_run = True
6
7sdm_mapping.apply(real_run)

How to debug before you apply

由于 apply 操作会覆盖 WTF 中已有的文件. 所以在你还不确定你的代码是否正确之前, 你希望能提前进行验证, 或是确保出现问题时能够回滚到之前的状态. 我推荐下面几种方法:

  1. 备份你客户端中的 WTF 文件夹, 以备不时之需.

  2. 在定义 Client 时将目录指向到一个临时目录, 而不是真正的魔兽世界客户端目录. 这样你可以检查生成后的文件, 然后拷贝一小部分到客户端中看看是否惯用.

  3. 在调用 apply(...) 方法时, 将 real_run 参数设为 False. 这样它只会渲染最终要写入的内容而不会真正写入. 这样可以确定你至少你的 lua 文件没有问题.

Manage Multiple Servers and Mappings#

本节介绍了在你同时玩多个服务器的时候, 有多个客户端, 有多套人物角色和配置的组合的时候, 如何组织你的文件目录来管理数量庞大的 WTF 配置.

首先我们要知道一些规范:

  • 用不同的客户端玩不同的服务器. 例如你在用一个客户端玩 2 个私服. 那么建议把你的游戏客户端拷贝一份, 每一个客户端玩不同的私服. 因为不同的私服的服务器名和游戏角色名可能会出现冲突.

  • 不要用多个 mapping 来分别管理一个账号下的不同角色. 举例来说, 你一个账号下有 10 个角色, 你用一套 mapping 管理其中的 5 个, 另一套 mapping 管理另外 5 个. 这样是不可以的. 因为 SDM 的插件 lua 文件是账号级别的. 如果你的配置只涉及到其中的 5 个角色, 那么一旦你登录另外的 5 个角色中的任意一个, 那么登录的角色里的宏命令就丢失了, 导致动作条混乱, 并且这个动作条还会被保存到服务器上.

  • 跟上一条对应, 你可以用多个 mapping 来管理一个服务器上的不同账号. 例如用一套 mapping 管理 5 个账号, 用另一套 mapping 管理另外 5 个账号, 这样做是可以的.

根据这些规范, 我们可以创建下面的目录结构. 在 workspace 下的每一个子目录都应该是一套独立的 mapping. 子目录的文件夹名可以是 ${server_name}_${description}. 其中 server_name 是服务器的名字, description 是你这套 mapping 的描述. 而这些子目录的结构就跟 exp03_wotlk 目录下的结构一样了.