├── Icons
├── flee.blp
├── rtsc.blp
├── attack.blp
├── border.blp
├── browse.blp
├── invite.blp
├── reward.blp
├── attack_dps.blp
├── class_mage.blp
├── flee_dps.blp
├── flee_melee.blp
├── flee_range.blp
├── flee_tank.blp
├── formation.blp
├── mode_grind.blp
├── rtsc_dps.blp
├── rtsc_melee.blp
├── rtsc_range.blp
├── rtsc_tank.blp
├── attack_melee.blp
├── attack_range.blp
├── attack_tank.blp
├── class_druid.blp
├── class_hunter.blp
├── class_priest.blp
├── class_rogue.blp
├── class_shaman.blp
├── command_stay.blp
├── filter_druid.blp
├── filter_mage.blp
├── filter_none.blp
├── filter_rogue.blp
├── flee_healer.blp
├── flee_ranged.blp
├── flee_target.blp
├── mode_passive.blp
├── rtsc_browse.blp
├── rtsc_group1.blp
├── rtsc_group2.blp
├── rtsc_group3.blp
├── rtsc_group4.blp
├── rtsc_group5.blp
├── rtsc_healer.blp
├── rtsc_ranged.blp
├── rtsc_target.blp
├── addclass_druid.blp
├── addclass_hunter.blp
├── addclass_mage.blp
├── addclass_priest.blp
├── addclass_rogue.blp
├── addclass_shaman.blp
├── attack_healer.blp
├── attack_ranged.blp
├── class_paladin.blp
├── class_unknown.blp
├── class_warlock.blp
├── class_warrior.blp
├── command_follow.blp
├── filter_browse.blp
├── filter_hunter.blp
├── filter_paladin.blp
├── filter_priest.blp
├── filter_shaman.blp
├── filter_warlock.blp
├── filter_warrior.blp
├── formation_arrow.blp
├── formation_chaos.blp
├── formation_line.blp
├── formation_melee.blp
├── formation_near.blp
├── formation_queue.blp
├── invite_party_5.blp
├── invite_raid_10.blp
├── invite_raid_25.blp
├── invite_raid_40.blp
├── language_deDE.blp
├── language_enGB.blp
├── language_none.blp
├── roster_actives.blp
├── roster_friends.blp
├── roster_members.blp
├── roster_players.blp
├── addclass_paladin.blp
├── addclass_warlock.blp
├── addclass_warrior.blp
├── class_deathknight.blp
├── formation_circle.blp
├── formation_shield.blp
├── addclass_deathknight.blp
├── filter_deathknight.blp
├── xp_progress_18_percent.blp
├── xp_progress_27_percent.blp
├── xp_progress_36_percent.blp
├── xp_progress_45_percent.blp
├── xp_progress_54_percent.blp
├── xp_progress_63_percent.blp
├── xp_progress_72_percent.blp
├── xp_progress_81_percent.blp
├── xp_progress_90_percent.blp
├── xp_progress_99_percent.blp
└── xp_progress_9_percent.blp
├── Textures
├── Grey.blp
├── Black.blp
├── Iconos.blp
├── Raidus.blp
├── Reward.blp
├── Stats.blp
├── Talent.blp
├── White.blp
├── Inventory.blp
├── Talent_Black.blp
├── Talent_Mage1.blp
├── Talent_Mage2.blp
├── Talent_Mage3.blp
├── Raidus_Wanted.blp
├── Talent_Druid1.blp
├── Talent_Druid2.blp
├── Talent_Druid3.blp
├── Talent_Hunter1.blp
├── Talent_Hunter2.blp
├── Talent_Hunter3.blp
├── Talent_Priest1.blp
├── Talent_Priest2.blp
├── Talent_Priest3.blp
├── Talent_Rogue1.blp
├── Talent_Rogue2.blp
├── Talent_Rogue3.blp
├── Talent_Shaman1.blp
├── Talent_Shaman2.blp
├── Talent_Shaman3.blp
├── Raidus_Banner_Top.blp
├── Talent_Gold_Down.blp
├── Talent_Paladin1.blp
├── Talent_Paladin2.blp
├── Talent_Paladin3.blp
├── Talent_Warlock1.blp
├── Talent_Warlock2.blp
├── Talent_Warlock3.blp
├── Talent_Warrior1.blp
├── Talent_Warrior2.blp
├── Talent_Warrior3.blp
├── Talent_DeathKnight1.blp
├── Talent_DeathKnight2.blp
├── Talent_DeathKnight3.blp
├── Talent_Silver_Down.blp
├── UI-GlyphFrame-Glow.blp
├── gliph_majeur_layout.blp
├── gliph_mineur_layout.blp
├── Background-GlyphFrame.blp
├── Raidus_Banner_Bottom.blp
├── Talent_Gold_Down_Arrow.blp
├── Talent_Gold_Down_Left.blp
├── Talent_Gold_Down_Right.blp
├── UI-GlyphFrame-Locked.blp
├── Talent_Silver_Down_Arrow.blp
├── Talent_Silver_Down_Left.blp
├── Talent_Silver_Down_Right.blp
├── Talent_Gold_Down_Left_Arrow.blp
├── Talent_Gold_Down_Arrow_Short.blp
├── Talent_Gold_Down_Right_Arrow.blp
├── Talent_Gold_Left_Arrow_Short.blp
├── Talent_Gold_Right_Arrow_Short.blp
├── Talent_Silver_Down_Left_Arrow.blp
├── Talent_Silver_Down_Arrow_Short.blp
├── Talent_Silver_Down_Right_Arrow.blp
├── Talent_Silver_Left_Arrow_Short.blp
└── Talent_Silver_Right_Arrow_Short.blp
├── Screenshots
├── Handout-00-Start.png
├── Handout-09-Drink.png
├── Handout-01-Summon.png
├── Handout-03-Use-Mode.png
├── Handout-09-Control.png
├── Handout-09-Modebar.png
├── Handout-09-Release.png
├── Handout-09-Revive.png
├── Handout-09-Summon.png
├── Handout-00-Playerbots.png
├── Handout-01-Inventory.png
├── Handout-03-Equip-Mode.png
├── Handout-03-Sell-Mode.png
├── Handout-03-View-Mode.png
├── Handout-06-Firendbots.png
├── Handout-09-Formation.png
├── Handout-00-Main-Control.png
├── Handout-03-Destroy-Mode.png
├── Handout-08-Shows-Filter.png
├── Handout-09-Beastmaster.png
├── Handout-09-Stay-Follow.png
├── Handout-09-Tank-Attack.png
├── Handout-00-Character-Info.png
├── Handout-05-Hide-Playerbots.png
├── Handout-06-Show-Friendbots.png
├── Handout-09-Actionbar-Flee.png
├── Handout-01-Combat-Behaviour.png
├── Handout-01-Group-And-Ungroup.png
├── Handout-01-Playerbot-Online.png
├── Handout-06-Browse-Friendbots.png
├── Handout-07-Filter-By-Classes.png
├── Handout-07-Filter-Selection.png
├── Handout-08-Friendbot-Button.png
├── Handout-08-No-Browse-Button.png
├── Handout-09-Actionbar-Attack.png
├── Handout-01-Non-Combat-Behaviour.png
├── Handout-02-Inspect-And-Inventory.png
└── Handout-04-Hide-Playerbot-Control.png
├── .editorconfig
├── .github
├── ISSUE_TEMPLATE
│ ├── config.yml
│ └── generic.yml
└── workflows
│ ├── lua-lint.yml
│ └── lua-format.yml
├── .gitignore
├── stylua.toml
├── MultiBot.toc
├── Strategies
├── MultiBotWarrior.lua
├── MultiBotRogue.lua
├── MultiBotDeathKnight.lua
├── MultiBotPriest.lua
├── MultiBotShaman.lua
├── MultiBotMage.lua
├── MultiBotDruid.lua
├── MultiBotHunter.lua
└── MultiBotPaladin.lua
├── Core
├── MultiBotThrottle.lua
├── MultiBotConfig.lua
└── MultiBotEvery.lua
├── UI
├── MultiBotSpell.lua
├── MultiBotItem.lua
├── MultiBotStats.lua
├── MultiBotOptions.lua
└── MultiBotPVPUI.lua
├── Features
└── MultiBotReward.lua
├── .luacheckrc
├── Data
└── HunterPetFamily.lua
└── README.md
/Icons/flee.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/flee.blp
--------------------------------------------------------------------------------
/Icons/rtsc.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/rtsc.blp
--------------------------------------------------------------------------------
/Icons/attack.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/attack.blp
--------------------------------------------------------------------------------
/Icons/border.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/border.blp
--------------------------------------------------------------------------------
/Icons/browse.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/browse.blp
--------------------------------------------------------------------------------
/Icons/invite.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/invite.blp
--------------------------------------------------------------------------------
/Icons/reward.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/reward.blp
--------------------------------------------------------------------------------
/Textures/Grey.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Textures/Grey.blp
--------------------------------------------------------------------------------
/Icons/attack_dps.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/attack_dps.blp
--------------------------------------------------------------------------------
/Icons/class_mage.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/class_mage.blp
--------------------------------------------------------------------------------
/Icons/flee_dps.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/flee_dps.blp
--------------------------------------------------------------------------------
/Icons/flee_melee.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/flee_melee.blp
--------------------------------------------------------------------------------
/Icons/flee_range.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/flee_range.blp
--------------------------------------------------------------------------------
/Icons/flee_tank.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/flee_tank.blp
--------------------------------------------------------------------------------
/Icons/formation.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/formation.blp
--------------------------------------------------------------------------------
/Icons/mode_grind.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/mode_grind.blp
--------------------------------------------------------------------------------
/Icons/rtsc_dps.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/rtsc_dps.blp
--------------------------------------------------------------------------------
/Icons/rtsc_melee.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/rtsc_melee.blp
--------------------------------------------------------------------------------
/Icons/rtsc_range.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/rtsc_range.blp
--------------------------------------------------------------------------------
/Icons/rtsc_tank.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/rtsc_tank.blp
--------------------------------------------------------------------------------
/Textures/Black.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Textures/Black.blp
--------------------------------------------------------------------------------
/Textures/Iconos.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Textures/Iconos.blp
--------------------------------------------------------------------------------
/Textures/Raidus.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Textures/Raidus.blp
--------------------------------------------------------------------------------
/Textures/Reward.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Textures/Reward.blp
--------------------------------------------------------------------------------
/Textures/Stats.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Textures/Stats.blp
--------------------------------------------------------------------------------
/Textures/Talent.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Textures/Talent.blp
--------------------------------------------------------------------------------
/Textures/White.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Textures/White.blp
--------------------------------------------------------------------------------
/Icons/attack_melee.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/attack_melee.blp
--------------------------------------------------------------------------------
/Icons/attack_range.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/attack_range.blp
--------------------------------------------------------------------------------
/Icons/attack_tank.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/attack_tank.blp
--------------------------------------------------------------------------------
/Icons/class_druid.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/class_druid.blp
--------------------------------------------------------------------------------
/Icons/class_hunter.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/class_hunter.blp
--------------------------------------------------------------------------------
/Icons/class_priest.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/class_priest.blp
--------------------------------------------------------------------------------
/Icons/class_rogue.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/class_rogue.blp
--------------------------------------------------------------------------------
/Icons/class_shaman.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/class_shaman.blp
--------------------------------------------------------------------------------
/Icons/command_stay.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/command_stay.blp
--------------------------------------------------------------------------------
/Icons/filter_druid.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/filter_druid.blp
--------------------------------------------------------------------------------
/Icons/filter_mage.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/filter_mage.blp
--------------------------------------------------------------------------------
/Icons/filter_none.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/filter_none.blp
--------------------------------------------------------------------------------
/Icons/filter_rogue.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/filter_rogue.blp
--------------------------------------------------------------------------------
/Icons/flee_healer.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/flee_healer.blp
--------------------------------------------------------------------------------
/Icons/flee_ranged.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/flee_ranged.blp
--------------------------------------------------------------------------------
/Icons/flee_target.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/flee_target.blp
--------------------------------------------------------------------------------
/Icons/mode_passive.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/mode_passive.blp
--------------------------------------------------------------------------------
/Icons/rtsc_browse.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/rtsc_browse.blp
--------------------------------------------------------------------------------
/Icons/rtsc_group1.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/rtsc_group1.blp
--------------------------------------------------------------------------------
/Icons/rtsc_group2.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/rtsc_group2.blp
--------------------------------------------------------------------------------
/Icons/rtsc_group3.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/rtsc_group3.blp
--------------------------------------------------------------------------------
/Icons/rtsc_group4.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/rtsc_group4.blp
--------------------------------------------------------------------------------
/Icons/rtsc_group5.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/rtsc_group5.blp
--------------------------------------------------------------------------------
/Icons/rtsc_healer.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/rtsc_healer.blp
--------------------------------------------------------------------------------
/Icons/rtsc_ranged.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/rtsc_ranged.blp
--------------------------------------------------------------------------------
/Icons/rtsc_target.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/rtsc_target.blp
--------------------------------------------------------------------------------
/Textures/Inventory.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Textures/Inventory.blp
--------------------------------------------------------------------------------
/Icons/addclass_druid.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/addclass_druid.blp
--------------------------------------------------------------------------------
/Icons/addclass_hunter.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/addclass_hunter.blp
--------------------------------------------------------------------------------
/Icons/addclass_mage.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/addclass_mage.blp
--------------------------------------------------------------------------------
/Icons/addclass_priest.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/addclass_priest.blp
--------------------------------------------------------------------------------
/Icons/addclass_rogue.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/addclass_rogue.blp
--------------------------------------------------------------------------------
/Icons/addclass_shaman.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/addclass_shaman.blp
--------------------------------------------------------------------------------
/Icons/attack_healer.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/attack_healer.blp
--------------------------------------------------------------------------------
/Icons/attack_ranged.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/attack_ranged.blp
--------------------------------------------------------------------------------
/Icons/class_paladin.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/class_paladin.blp
--------------------------------------------------------------------------------
/Icons/class_unknown.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/class_unknown.blp
--------------------------------------------------------------------------------
/Icons/class_warlock.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/class_warlock.blp
--------------------------------------------------------------------------------
/Icons/class_warrior.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/class_warrior.blp
--------------------------------------------------------------------------------
/Icons/command_follow.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/command_follow.blp
--------------------------------------------------------------------------------
/Icons/filter_browse.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/filter_browse.blp
--------------------------------------------------------------------------------
/Icons/filter_hunter.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/filter_hunter.blp
--------------------------------------------------------------------------------
/Icons/filter_paladin.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/filter_paladin.blp
--------------------------------------------------------------------------------
/Icons/filter_priest.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/filter_priest.blp
--------------------------------------------------------------------------------
/Icons/filter_shaman.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/filter_shaman.blp
--------------------------------------------------------------------------------
/Icons/filter_warlock.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/filter_warlock.blp
--------------------------------------------------------------------------------
/Icons/filter_warrior.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/filter_warrior.blp
--------------------------------------------------------------------------------
/Icons/formation_arrow.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/formation_arrow.blp
--------------------------------------------------------------------------------
/Icons/formation_chaos.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/formation_chaos.blp
--------------------------------------------------------------------------------
/Icons/formation_line.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/formation_line.blp
--------------------------------------------------------------------------------
/Icons/formation_melee.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/formation_melee.blp
--------------------------------------------------------------------------------
/Icons/formation_near.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/formation_near.blp
--------------------------------------------------------------------------------
/Icons/formation_queue.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/formation_queue.blp
--------------------------------------------------------------------------------
/Icons/invite_party_5.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/invite_party_5.blp
--------------------------------------------------------------------------------
/Icons/invite_raid_10.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/invite_raid_10.blp
--------------------------------------------------------------------------------
/Icons/invite_raid_25.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/invite_raid_25.blp
--------------------------------------------------------------------------------
/Icons/invite_raid_40.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/invite_raid_40.blp
--------------------------------------------------------------------------------
/Icons/language_deDE.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/language_deDE.blp
--------------------------------------------------------------------------------
/Icons/language_enGB.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/language_enGB.blp
--------------------------------------------------------------------------------
/Icons/language_none.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/language_none.blp
--------------------------------------------------------------------------------
/Icons/roster_actives.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/roster_actives.blp
--------------------------------------------------------------------------------
/Icons/roster_friends.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/roster_friends.blp
--------------------------------------------------------------------------------
/Icons/roster_members.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/roster_members.blp
--------------------------------------------------------------------------------
/Icons/roster_players.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/roster_players.blp
--------------------------------------------------------------------------------
/Textures/Talent_Black.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Textures/Talent_Black.blp
--------------------------------------------------------------------------------
/Textures/Talent_Mage1.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Textures/Talent_Mage1.blp
--------------------------------------------------------------------------------
/Textures/Talent_Mage2.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Textures/Talent_Mage2.blp
--------------------------------------------------------------------------------
/Textures/Talent_Mage3.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Textures/Talent_Mage3.blp
--------------------------------------------------------------------------------
/Icons/addclass_paladin.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/addclass_paladin.blp
--------------------------------------------------------------------------------
/Icons/addclass_warlock.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/addclass_warlock.blp
--------------------------------------------------------------------------------
/Icons/addclass_warrior.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/addclass_warrior.blp
--------------------------------------------------------------------------------
/Icons/class_deathknight.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/class_deathknight.blp
--------------------------------------------------------------------------------
/Icons/formation_circle.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/formation_circle.blp
--------------------------------------------------------------------------------
/Icons/formation_shield.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/formation_shield.blp
--------------------------------------------------------------------------------
/Textures/Raidus_Wanted.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Textures/Raidus_Wanted.blp
--------------------------------------------------------------------------------
/Textures/Talent_Druid1.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Textures/Talent_Druid1.blp
--------------------------------------------------------------------------------
/Textures/Talent_Druid2.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Textures/Talent_Druid2.blp
--------------------------------------------------------------------------------
/Textures/Talent_Druid3.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Textures/Talent_Druid3.blp
--------------------------------------------------------------------------------
/Textures/Talent_Hunter1.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Textures/Talent_Hunter1.blp
--------------------------------------------------------------------------------
/Textures/Talent_Hunter2.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Textures/Talent_Hunter2.blp
--------------------------------------------------------------------------------
/Textures/Talent_Hunter3.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Textures/Talent_Hunter3.blp
--------------------------------------------------------------------------------
/Textures/Talent_Priest1.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Textures/Talent_Priest1.blp
--------------------------------------------------------------------------------
/Textures/Talent_Priest2.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Textures/Talent_Priest2.blp
--------------------------------------------------------------------------------
/Textures/Talent_Priest3.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Textures/Talent_Priest3.blp
--------------------------------------------------------------------------------
/Textures/Talent_Rogue1.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Textures/Talent_Rogue1.blp
--------------------------------------------------------------------------------
/Textures/Talent_Rogue2.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Textures/Talent_Rogue2.blp
--------------------------------------------------------------------------------
/Textures/Talent_Rogue3.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Textures/Talent_Rogue3.blp
--------------------------------------------------------------------------------
/Textures/Talent_Shaman1.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Textures/Talent_Shaman1.blp
--------------------------------------------------------------------------------
/Textures/Talent_Shaman2.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Textures/Talent_Shaman2.blp
--------------------------------------------------------------------------------
/Textures/Talent_Shaman3.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Textures/Talent_Shaman3.blp
--------------------------------------------------------------------------------
/Icons/addclass_deathknight.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/addclass_deathknight.blp
--------------------------------------------------------------------------------
/Icons/filter_deathknight.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/filter_deathknight.blp
--------------------------------------------------------------------------------
/Textures/Raidus_Banner_Top.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Textures/Raidus_Banner_Top.blp
--------------------------------------------------------------------------------
/Textures/Talent_Gold_Down.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Textures/Talent_Gold_Down.blp
--------------------------------------------------------------------------------
/Textures/Talent_Paladin1.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Textures/Talent_Paladin1.blp
--------------------------------------------------------------------------------
/Textures/Talent_Paladin2.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Textures/Talent_Paladin2.blp
--------------------------------------------------------------------------------
/Textures/Talent_Paladin3.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Textures/Talent_Paladin3.blp
--------------------------------------------------------------------------------
/Textures/Talent_Warlock1.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Textures/Talent_Warlock1.blp
--------------------------------------------------------------------------------
/Textures/Talent_Warlock2.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Textures/Talent_Warlock2.blp
--------------------------------------------------------------------------------
/Textures/Talent_Warlock3.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Textures/Talent_Warlock3.blp
--------------------------------------------------------------------------------
/Textures/Talent_Warrior1.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Textures/Talent_Warrior1.blp
--------------------------------------------------------------------------------
/Textures/Talent_Warrior2.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Textures/Talent_Warrior2.blp
--------------------------------------------------------------------------------
/Textures/Talent_Warrior3.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Textures/Talent_Warrior3.blp
--------------------------------------------------------------------------------
/Icons/xp_progress_18_percent.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/xp_progress_18_percent.blp
--------------------------------------------------------------------------------
/Icons/xp_progress_27_percent.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/xp_progress_27_percent.blp
--------------------------------------------------------------------------------
/Icons/xp_progress_36_percent.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/xp_progress_36_percent.blp
--------------------------------------------------------------------------------
/Icons/xp_progress_45_percent.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/xp_progress_45_percent.blp
--------------------------------------------------------------------------------
/Icons/xp_progress_54_percent.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/xp_progress_54_percent.blp
--------------------------------------------------------------------------------
/Icons/xp_progress_63_percent.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/xp_progress_63_percent.blp
--------------------------------------------------------------------------------
/Icons/xp_progress_72_percent.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/xp_progress_72_percent.blp
--------------------------------------------------------------------------------
/Icons/xp_progress_81_percent.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/xp_progress_81_percent.blp
--------------------------------------------------------------------------------
/Icons/xp_progress_90_percent.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/xp_progress_90_percent.blp
--------------------------------------------------------------------------------
/Icons/xp_progress_99_percent.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/xp_progress_99_percent.blp
--------------------------------------------------------------------------------
/Icons/xp_progress_9_percent.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Icons/xp_progress_9_percent.blp
--------------------------------------------------------------------------------
/Screenshots/Handout-00-Start.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Screenshots/Handout-00-Start.png
--------------------------------------------------------------------------------
/Screenshots/Handout-09-Drink.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Screenshots/Handout-09-Drink.png
--------------------------------------------------------------------------------
/Textures/Talent_DeathKnight1.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Textures/Talent_DeathKnight1.blp
--------------------------------------------------------------------------------
/Textures/Talent_DeathKnight2.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Textures/Talent_DeathKnight2.blp
--------------------------------------------------------------------------------
/Textures/Talent_DeathKnight3.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Textures/Talent_DeathKnight3.blp
--------------------------------------------------------------------------------
/Textures/Talent_Silver_Down.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Textures/Talent_Silver_Down.blp
--------------------------------------------------------------------------------
/Textures/UI-GlyphFrame-Glow.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Textures/UI-GlyphFrame-Glow.blp
--------------------------------------------------------------------------------
/Textures/gliph_majeur_layout.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Textures/gliph_majeur_layout.blp
--------------------------------------------------------------------------------
/Textures/gliph_mineur_layout.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Textures/gliph_mineur_layout.blp
--------------------------------------------------------------------------------
/Screenshots/Handout-01-Summon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Screenshots/Handout-01-Summon.png
--------------------------------------------------------------------------------
/Screenshots/Handout-03-Use-Mode.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Screenshots/Handout-03-Use-Mode.png
--------------------------------------------------------------------------------
/Screenshots/Handout-09-Control.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Screenshots/Handout-09-Control.png
--------------------------------------------------------------------------------
/Screenshots/Handout-09-Modebar.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Screenshots/Handout-09-Modebar.png
--------------------------------------------------------------------------------
/Screenshots/Handout-09-Release.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Screenshots/Handout-09-Release.png
--------------------------------------------------------------------------------
/Screenshots/Handout-09-Revive.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Screenshots/Handout-09-Revive.png
--------------------------------------------------------------------------------
/Screenshots/Handout-09-Summon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Screenshots/Handout-09-Summon.png
--------------------------------------------------------------------------------
/Textures/Background-GlyphFrame.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Textures/Background-GlyphFrame.blp
--------------------------------------------------------------------------------
/Textures/Raidus_Banner_Bottom.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Textures/Raidus_Banner_Bottom.blp
--------------------------------------------------------------------------------
/Textures/Talent_Gold_Down_Arrow.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Textures/Talent_Gold_Down_Arrow.blp
--------------------------------------------------------------------------------
/Textures/Talent_Gold_Down_Left.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Textures/Talent_Gold_Down_Left.blp
--------------------------------------------------------------------------------
/Textures/Talent_Gold_Down_Right.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Textures/Talent_Gold_Down_Right.blp
--------------------------------------------------------------------------------
/Textures/UI-GlyphFrame-Locked.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Textures/UI-GlyphFrame-Locked.blp
--------------------------------------------------------------------------------
/Screenshots/Handout-00-Playerbots.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Screenshots/Handout-00-Playerbots.png
--------------------------------------------------------------------------------
/Screenshots/Handout-01-Inventory.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Screenshots/Handout-01-Inventory.png
--------------------------------------------------------------------------------
/Screenshots/Handout-03-Equip-Mode.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Screenshots/Handout-03-Equip-Mode.png
--------------------------------------------------------------------------------
/Screenshots/Handout-03-Sell-Mode.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Screenshots/Handout-03-Sell-Mode.png
--------------------------------------------------------------------------------
/Screenshots/Handout-03-View-Mode.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Screenshots/Handout-03-View-Mode.png
--------------------------------------------------------------------------------
/Screenshots/Handout-06-Firendbots.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Screenshots/Handout-06-Firendbots.png
--------------------------------------------------------------------------------
/Screenshots/Handout-09-Formation.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Screenshots/Handout-09-Formation.png
--------------------------------------------------------------------------------
/Textures/Talent_Silver_Down_Arrow.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Textures/Talent_Silver_Down_Arrow.blp
--------------------------------------------------------------------------------
/Textures/Talent_Silver_Down_Left.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Textures/Talent_Silver_Down_Left.blp
--------------------------------------------------------------------------------
/Textures/Talent_Silver_Down_Right.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Textures/Talent_Silver_Down_Right.blp
--------------------------------------------------------------------------------
/Screenshots/Handout-00-Main-Control.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Screenshots/Handout-00-Main-Control.png
--------------------------------------------------------------------------------
/Screenshots/Handout-03-Destroy-Mode.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Screenshots/Handout-03-Destroy-Mode.png
--------------------------------------------------------------------------------
/Screenshots/Handout-08-Shows-Filter.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Screenshots/Handout-08-Shows-Filter.png
--------------------------------------------------------------------------------
/Screenshots/Handout-09-Beastmaster.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Screenshots/Handout-09-Beastmaster.png
--------------------------------------------------------------------------------
/Screenshots/Handout-09-Stay-Follow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Screenshots/Handout-09-Stay-Follow.png
--------------------------------------------------------------------------------
/Screenshots/Handout-09-Tank-Attack.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Screenshots/Handout-09-Tank-Attack.png
--------------------------------------------------------------------------------
/Textures/Talent_Gold_Down_Left_Arrow.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Textures/Talent_Gold_Down_Left_Arrow.blp
--------------------------------------------------------------------------------
/Screenshots/Handout-00-Character-Info.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Screenshots/Handout-00-Character-Info.png
--------------------------------------------------------------------------------
/Screenshots/Handout-05-Hide-Playerbots.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Screenshots/Handout-05-Hide-Playerbots.png
--------------------------------------------------------------------------------
/Screenshots/Handout-06-Show-Friendbots.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Screenshots/Handout-06-Show-Friendbots.png
--------------------------------------------------------------------------------
/Screenshots/Handout-09-Actionbar-Flee.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Screenshots/Handout-09-Actionbar-Flee.png
--------------------------------------------------------------------------------
/Textures/Talent_Gold_Down_Arrow_Short.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Textures/Talent_Gold_Down_Arrow_Short.blp
--------------------------------------------------------------------------------
/Textures/Talent_Gold_Down_Right_Arrow.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Textures/Talent_Gold_Down_Right_Arrow.blp
--------------------------------------------------------------------------------
/Textures/Talent_Gold_Left_Arrow_Short.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Textures/Talent_Gold_Left_Arrow_Short.blp
--------------------------------------------------------------------------------
/Textures/Talent_Gold_Right_Arrow_Short.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Textures/Talent_Gold_Right_Arrow_Short.blp
--------------------------------------------------------------------------------
/Textures/Talent_Silver_Down_Left_Arrow.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Textures/Talent_Silver_Down_Left_Arrow.blp
--------------------------------------------------------------------------------
/Screenshots/Handout-01-Combat-Behaviour.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Screenshots/Handout-01-Combat-Behaviour.png
--------------------------------------------------------------------------------
/Screenshots/Handout-01-Group-And-Ungroup.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Screenshots/Handout-01-Group-And-Ungroup.png
--------------------------------------------------------------------------------
/Screenshots/Handout-01-Playerbot-Online.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Screenshots/Handout-01-Playerbot-Online.png
--------------------------------------------------------------------------------
/Screenshots/Handout-06-Browse-Friendbots.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Screenshots/Handout-06-Browse-Friendbots.png
--------------------------------------------------------------------------------
/Screenshots/Handout-07-Filter-By-Classes.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Screenshots/Handout-07-Filter-By-Classes.png
--------------------------------------------------------------------------------
/Screenshots/Handout-07-Filter-Selection.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Screenshots/Handout-07-Filter-Selection.png
--------------------------------------------------------------------------------
/Screenshots/Handout-08-Friendbot-Button.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Screenshots/Handout-08-Friendbot-Button.png
--------------------------------------------------------------------------------
/Screenshots/Handout-08-No-Browse-Button.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Screenshots/Handout-08-No-Browse-Button.png
--------------------------------------------------------------------------------
/Screenshots/Handout-09-Actionbar-Attack.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Screenshots/Handout-09-Actionbar-Attack.png
--------------------------------------------------------------------------------
/Textures/Talent_Silver_Down_Arrow_Short.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Textures/Talent_Silver_Down_Arrow_Short.blp
--------------------------------------------------------------------------------
/Textures/Talent_Silver_Down_Right_Arrow.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Textures/Talent_Silver_Down_Right_Arrow.blp
--------------------------------------------------------------------------------
/Textures/Talent_Silver_Left_Arrow_Short.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Textures/Talent_Silver_Left_Arrow_Short.blp
--------------------------------------------------------------------------------
/Textures/Talent_Silver_Right_Arrow_Short.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Textures/Talent_Silver_Right_Arrow_Short.blp
--------------------------------------------------------------------------------
/Screenshots/Handout-01-Non-Combat-Behaviour.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Screenshots/Handout-01-Non-Combat-Behaviour.png
--------------------------------------------------------------------------------
/Screenshots/Handout-02-Inspect-And-Inventory.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Screenshots/Handout-02-Inspect-And-Inventory.png
--------------------------------------------------------------------------------
/Screenshots/Handout-04-Hide-Playerbot-Control.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Wishmaster117/MultiBot/HEAD/Screenshots/Handout-04-Hide-Playerbot-Control.png
--------------------------------------------------------------------------------
/.editorconfig:
--------------------------------------------------------------------------------
1 | root = true
2 |
3 | [*.lua]
4 | indent_style = space
5 | indent_size = 4
6 | tab_width = 4
7 | end_of_line = lf
8 | charset = utf-8
9 | trim_trailing_whitespace = true
10 | insert_final_newline = true
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/config.yml:
--------------------------------------------------------------------------------
1 | blank_issues_enabled: false
2 | contact_links:
3 | - name: 📚 Documentation / Wiki
4 | url: https://github.com/Wishmaster117/MultiBot/wiki
5 | about: Please check the docs before opening an issue.
6 | - name: 💬 Quick support
7 | url: https://www.azerothdevs.com/index.php
8 | about: For usage or installation questions.
9 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Compiled Lua sources
2 | luac.out
3 |
4 | # luarocks build files
5 | *.src.rock
6 | *.zip
7 | *.tar.gz
8 |
9 | # Object files
10 | *.o
11 | *.os
12 | *.ko
13 | *.obj
14 | *.elf
15 |
16 | # Precompiled Headers
17 | *.gch
18 | *.pch
19 |
20 | # Libraries
21 | *.lib
22 | *.a
23 | *.la
24 | *.lo
25 | *.def
26 | *.exp
27 |
28 | # Shared objects (inc. Windows DLLs)
29 | *.dll
30 | *.so
31 | *.so.*
32 | *.dylib
33 |
34 | # Executables
35 | *.exe
36 | *.out
37 | *.app
38 | *.i*86
39 | *.x86_64
40 | *.hex
41 |
42 |
--------------------------------------------------------------------------------
/stylua.toml:
--------------------------------------------------------------------------------
1 | indent_type = "Spaces" # ("Spaces" ou "Tabs")
2 | indent_width = 4 # (nombre d’espaces)
3 | column_width = 120 # (largeur max)
4 | quote_style = "AutoPreferDouble" # ("AutoPreferDouble", "AutoPreferSingle", "ForceDouble", "ForceSingle")
5 | line_endings = "Unix" # ("Unix" ou "Windows")
6 | collapse_simple_statement = "Never" # ("Always", "Never", "FunctionOnly")
7 |
8 | # Options supplémentaires
9 | no_call_parentheses = false # true/false supprime les parenthèses autour des appels de fonction avec un seul argument littéral
10 |
11 | [sort_requires]
12 | enabled = false
--------------------------------------------------------------------------------
/.github/workflows/lua-lint.yml:
--------------------------------------------------------------------------------
1 | name: Lua Lint
2 |
3 | on: [push, pull_request]
4 |
5 | jobs:
6 | lint:
7 | runs-on: ubuntu-latest
8 | steps:
9 | - uses: actions/checkout@v3
10 |
11 | - name: Install Lua and LuaRocks
12 | run: |
13 | sudo apt-get update
14 | sudo apt-get install -y lua5.3 luarocks liblua5.3-dev
15 |
16 | - name: Install Luacheck (local)
17 | run: |
18 | luarocks install --local luacheck
19 | echo "$HOME/.luarocks/bin" >> $GITHUB_PATH
20 |
21 | - name: Run Luacheck
22 | run: luacheck .
--------------------------------------------------------------------------------
/.github/workflows/lua-format.yml:
--------------------------------------------------------------------------------
1 | name: Lua Format
2 |
3 | on: [push, pull_request]
4 |
5 | jobs:
6 | stylua:
7 | runs-on: ubuntu-latest
8 | steps:
9 | - uses: actions/checkout@v4
10 |
11 | - name: Install Rust toolchain
12 | uses: actions-rs/toolchain@v1
13 | with:
14 | toolchain: stable
15 | override: true
16 |
17 | - name: Install Stylua
18 | run: cargo install stylua --locked
19 |
20 | - name: Run Stylua format file by file
21 | run: |
22 | find Core Data Features UI Locales Strategies -type f -name "*.lua" -print0 |
23 | while IFS= read -r -d '' file; do
24 | echo "➡️ Formating $file"
25 | stylua "$file"
26 | done
--------------------------------------------------------------------------------
/MultiBot.toc:
--------------------------------------------------------------------------------
1 | ## Interface: 30300
2 | ## Version: 2.0.0
3 | ## Title: MultiBot
4 | ## Notes: User Interface for Playerbot
5 | ## Author: Nico Löbbert
6 | ## SavedVariablesPerCharacter: MultiBotSave, MultiBotDB, MultiBotSaved
7 | ## SavedVariables: MultiBotGlobalSave
8 | ## X-Maintainer: Wishmaster117 aka TheWarlock
9 | ## X-Contributors: Wishmaster117 aka TheWarlock
10 | ## X-Contact: admin@azerothdevs.com
11 | ## X-ProjectURL: https://www.azerothdevs.com
12 |
13 | Core\MultiBot.lua
14 | Core\MultiBotConfig.lua
15 | UI\MultiBotOptions.lua
16 | Core\MultiBotThrottle.lua
17 |
18 | Locales\MultiBotLanguage-deDE.lua
19 | Locales\MultiBotLanguage-enGB.lua
20 | Locales\MultiBotLanguage-enUS.lua
21 | Locales\MultiBotLanguage-frFR.lua
22 | Locales\MultiBotLanguage-zhCN.lua
23 | Locales\MultiBotLanguage-koKR.lua
24 | Locales\MultiBotLanguage-ruRU.lua
25 | Locales\MultiBotLanguage-esES.lua
26 | Data\HunterPetFamily.lua
27 | Data\HunterPetList_1.lua
28 | Data\HunterPetList_2.lua
29 | Data\HunterPetList_3.lua
30 | Data\HunterPetList_4.lua
31 | Core\MultiBotEngine.lua
32 | Core\MultiBotHandler.lua
33 | Strategies\MultiBotDeathKnight.lua
34 | Strategies\MultiBotDruid.lua
35 | Strategies\MultiBotHunter.lua
36 | Strategies\MultiBotMage.lua
37 | Strategies\MultiBotPaladin.lua
38 | Strategies\MultiBotPriest.lua
39 | Strategies\MultiBotRogue.lua
40 | Strategies\MultiBotShaman.lua
41 | Strategies\MultiBotWarlock.lua
42 | Strategies\MultiBotWarrior.lua
43 | Core\MultiBotEvery.lua
44 | UI\MultiBotStats.lua
45 | UI\MultiBotSpell.lua
46 | UI\MultiBotItem.lua
47 | Core\MultiBotInit.lua
48 | UI\MultiBotIconos.lua
49 | UI\MultiBotSpecUI.lua
50 | Data\MultiBotItemus.lua
51 | UI\MultiBotTalent.lua
52 | UI\MultiBotPVPUI.lua
53 | Features\MultiBotReward.lua
54 | Features\MultiBotNecronet.lua
55 | Features\MultiBotRaidus.lua
--------------------------------------------------------------------------------
/Strategies/MultiBotWarrior.lua:
--------------------------------------------------------------------------------
1 | MultiBot.addWarrior = function(pFrame, pCombat, pNormal)
2 | pFrame.addButton("DpsControl", 0, 0, "ability_warrior_challange", MultiBot.tips.warrior.dps.master)
3 | .doLeft = function(pButton)
4 | MultiBot.ShowHideSwitch(pButton.getFrame("DpsControl"))
5 | end
6 |
7 | local tFrame = pFrame.addFrame("DpsControl", -2, 30)
8 | tFrame:Hide()
9 |
10 | tFrame.addButton("DpsAssist", 0, 0, "spell_holy_heroism", MultiBot.tips.warrior.dps.dpsAssist).setDisable()
11 | .doLeft = function(pButton)
12 | if(MultiBot.OnOffActionToTarget(pButton, "co +dps assist,?", "co -dps assist,?", pButton.getName())) then
13 | pButton.getButton("TankAssist").setDisable()
14 | pButton.getButton("DpsAoe").setDisable()
15 | end
16 | end
17 |
18 | tFrame.addButton("DpsAoe", 0, 26, "spell_holy_surgeoflight", MultiBot.tips.warrior.dps.dpsAoe).setDisable()
19 | .doLeft = function(pButton)
20 | if(MultiBot.OnOffActionToTarget(pButton, "co +dps aoe,?", "co -dps aoe,?", pButton.getName())) then
21 | pButton.getButton("TankAssist").setDisable()
22 | pButton.getButton("DpsAssist").setDisable()
23 | end
24 | end
25 |
26 | -- ASSIST --
27 |
28 | pFrame.addButton("TankAssist", -30, 0, "ability_warrior_innerrage", MultiBot.tips.warrior.tankAssist).setDisable()
29 | .doLeft = function(pButton)
30 | if(MultiBot.OnOffActionToTarget(pButton, "co +tank assist,?", "co -tank assist,?", pButton.getName())) then
31 | pButton.getButton("DpsAssist").setDisable()
32 | pButton.getButton("DpsAoe").setDisable()
33 | end
34 | end
35 |
36 | -- TANK --
37 |
38 | pFrame.addButton("Tank", -60, 0, "ability_warrior_shieldmastery", MultiBot.tips.warrior.tank).setDisable()
39 | .doLeft = function(pButton)
40 | MultiBot.OnOffActionToTarget(pButton, "co +tank,?", "co -tank,?", pButton.getName())
41 | end
42 |
43 | -- STRATEGIES --
44 |
45 | if(MultiBot.isInside(pCombat, "dps aoe")) then pFrame.getButton("DpsAoe").setEnable() end
46 | if(MultiBot.isInside(pCombat, "dps assist")) then pFrame.getButton("DpsAssist").setEnable() end
47 | if(MultiBot.isInside(pCombat, "tank assist")) then pFrame.getButton("TankAssist").setEnable() end
48 | if(MultiBot.isInside(pCombat, "tank")) then pFrame.getButton("Tank").setEnable() end
49 | end
--------------------------------------------------------------------------------
/Core/MultiBotThrottle.lua:
--------------------------------------------------------------------------------
1 | -- MultiBotThrottle.lua
2 | -- print("MultiBotThrottle.lua loaded")
3 | MultiBot = MultiBot or {}
4 |
5 | -- pack/unpack avec longueur n (pour gérer les nil au milieu)
6 | local function pack(...)
7 | return { n = select('#', ...), ... }
8 | end
9 |
10 | function MultiBot.Throttle_Init()
11 | if MultiBot._throttleInited then return end
12 |
13 | local orig_SendChatMessage = SendChatMessage
14 |
15 | -- Valeurs par défaut depuis la DB si présentes
16 | local rate = 5
17 | local burst = 8
18 | if MultiBotDB and MultiBotDB.throttle then
19 | if type(MultiBotDB.throttle.rate) == "number" and MultiBotDB.throttle.rate > 0 then rate = MultiBotDB.throttle.rate end
20 | if type(MultiBotDB.throttle.burst) == "number" and MultiBotDB.throttle.burst > 0 then burst = MultiBotDB.throttle.burst end
21 | end
22 |
23 | local RATE_PER_SEC, BURST = rate, burst
24 | local tokens = BURST
25 | local queue = {}
26 |
27 | -- Frame de vidage
28 | local f = CreateFrame("Frame")
29 | f:Show()
30 | f:SetScript("OnUpdate", function(_, dt)
31 | tokens = math.min(BURST, tokens + RATE_PER_SEC * dt)
32 | while tokens >= 1 and #queue > 0 do
33 | local item = table.remove(queue, 1)
34 | -- IMPORTANT: passer la borne haute à unpack (Lua 5.1)
35 | orig_SendChatMessage(unpack(item.args, 1, item.args.n))
36 | tokens = tokens - 1
37 |
38 | -- Debug optionnel: ne log que les messages de test [MB_TEST]
39 | if item.args and type(item.args[1]) == "string" and string.find(item.args[1], "^%[MB_TEST%]") then
40 | if DEFAULT_CHAT_FRAME and GetTime then
41 | DEFAULT_CHAT_FRAME:AddMessage(string.format("|cff88ff88[Throttle]|r %.2fs -> %s", GetTime(), item.args[1]))
42 | end
43 | end
44 | end
45 | end)
46 |
47 | -- Surcharge globale (enfile tous les envois)
48 | SendChatMessage = function(msg, chatType, language, target)
49 | queue[#queue+1] = { args = pack(msg, chatType, language, target) }
50 | end
51 |
52 | -- API interne pour MAJ live depuis les sliders
53 | MultiBot._ThrottleStats = function(newRate, newBurst)
54 | if type(newRate) == "number" and newRate > 0 then RATE_PER_SEC = newRate end
55 | if type(newBurst) == "number" and newBurst > 0 then BURST = newBurst; tokens = math.min(tokens, BURST) end
56 | end
57 |
58 | MultiBot._throttleInited = true
59 | MultiBot._throttleOrig = orig_SendChatMessage
60 | if DEFAULT_CHAT_FRAME then
61 | DEFAULT_CHAT_FRAME:AddMessage(string.format(MultiBot.tips.sliders.throttleinstalled .. " (%.0f msg/s, rafale %d)", RATE_PER_SEC, BURST))
62 | end
63 | end
64 |
--------------------------------------------------------------------------------
/UI/MultiBotSpell.lua:
--------------------------------------------------------------------------------
1 | MultiBot.getSpellID = function(pInfo)
2 | local tInfo = MultiBot.doSplit(pInfo, "|")
3 | if(string.sub(tInfo[3], 1, 6) == "Hspell") then return string.sub(tInfo[3], 8) end
4 | return 0
5 | end
6 |
7 | MultiBot.addSpell = function(pInfo, pName)
8 | -- local tInfo = MultiBot.doSplit(pInfo, "|")
9 | local tID = MultiBot.getSpellID(pInfo)
10 | if(tID == 0) then return end
11 |
12 | local tName, tRank, tIcon = GetSpellInfo(tID)
13 | local tLink = GetSpellLink(tID)
14 |
15 | if(tName == nil) then tName = "" end
16 | if(tRank == nil) then tRank = "" end
17 | if(tIcon == nil) then tIcon = "inv_misc_questionmark" end
18 | if(tLink == nil) then tLink = tName end
19 |
20 | local tSpell = { tID, tName, tRank, tIcon, tLink }
21 |
22 | table.insert(MultiBot.spellbook.spells, tSpell)
23 | MultiBot.spellbook.index = MultiBot.spellbook.index + 1
24 |
25 | if(MultiBot.spells[pName] == nil) then MultiBot.spells[pName] = {} end
26 | if(MultiBot.spells[pName][tID] == nil) then MultiBot.spells[pName][tID] = true end
27 |
28 | if(MultiBot.spellbook.index < 17) then
29 | MultiBot.setSpell(MultiBot.spellbook.index, tSpell, pName)
30 | end
31 | end
32 |
33 | MultiBot.setSpell = function(pIndex, pSpell, pName)
34 | local tIndex = MultiBot.IF(pIndex < 10, "0", "") .. pIndex
35 | local tOverlay = MultiBot.spellbook.frames["Overlay"]
36 |
37 | if(pSpell ~= nil) then
38 | local tTitle = MultiBot.IF(string.len(pSpell[2]) > 16, string.sub(pSpell[2], 1, 16) .. "...", pSpell[2])
39 | tOverlay.setButton("S" .. tIndex, pSpell[4], pSpell[5])
40 | tOverlay.setText("T" .. tIndex, "|cffffcc00" .. tTitle .. "|r")
41 | tOverlay.setText("R" .. tIndex, "|cff402000" .. pSpell[3] .. "|r")
42 | tOverlay.buttons["S" .. tIndex].spell = pSpell[1]
43 | tOverlay.buttons["C" .. tIndex].spell = pSpell[1]
44 | tOverlay.buttons["S" .. tIndex].doShow()
45 | tOverlay.buttons["C" .. tIndex].doShow()
46 | tOverlay.texts["T" .. tIndex]:Show()
47 | tOverlay.texts["R" .. tIndex]:Show()
48 | tOverlay.buttons["C" .. tIndex]:SetChecked(MultiBot.spells[pName][pSpell[1]])
49 | tOverlay.buttons["C" .. tIndex].doClick = function(pButton)
50 | local tName = pButton.getName()
51 | local tAction = ""
52 | MultiBot.spells[tName][pButton.spell] = MultiBot.IF(MultiBot.spells[tName][pButton.spell], false, true)
53 | pButton:SetChecked(MultiBot.spells[tName][pButton.spell])
54 | for id, state in pairs(MultiBot.spells[tName]) do
55 | if(state == false) then tAction = tAction .. MultiBot.IF(tAction == "", "ss +", ", +") .. id end
56 | end
57 | MultiBot.ActionToTarget(MultiBot.IF(tAction == "", "ss -" .. pButton.spell, tAction), tName)
58 | end
59 | else
60 | tOverlay.buttons["S" .. tIndex].spell = 0
61 | tOverlay.buttons["C" .. tIndex].spell = 0
62 | tOverlay.buttons["S" .. tIndex].doHide()
63 | tOverlay.buttons["C" .. tIndex].doHide()
64 | tOverlay.texts["T" .. tIndex]:Hide()
65 | tOverlay.texts["R" .. tIndex]:Hide()
66 | end
67 | end
--------------------------------------------------------------------------------
/Features/MultiBotReward.lua:
--------------------------------------------------------------------------------
1 | MultiBot.setRewards = function()
2 | if(MultiBot.reward.state == false) then return end
3 | local tChoices = MultiBot.IF(GetNumQuestChoices() > 6, 6, GetNumQuestChoices())
4 | --table.wipe(MultiBot.reward.rewards)
5 | --table.wipe(MultiBot.reward.units)
6 | MultiBot.reward.rewards = {}
7 | MultiBot.reward.units = {}
8 |
9 | for i = 1, tChoices do
10 | local tLink = GetQuestItemLink("CHOICE", i)
11 | local tName, tIcon = GetQuestItemInfo("CHOICE", i)
12 | MultiBot.reward.rewards[i] = { tLink, tName, tIcon }
13 | end
14 |
15 | for i = 1, 12 do
16 | local tID = "U" .. MultiBot.IF(i < 10, "0", "") .. i
17 | local tUnit = MultiBot.reward.frames["Overlay"].frames[tID]
18 | for j = 1, 6 do tUnit.buttons["R" .. j]:Hide() end
19 | tUnit:Hide()
20 | end
21 |
22 | if(GetNumRaidMembers() > 0) then
23 | for i = 1, 40 do
24 | local tUnit = UnitName("raid" .. i)
25 | if(tUnit ~= nil) then
26 | local tBot = MultiBot.getBot(tUnit)
27 | if(tBot ~= nil and tBot.name ~= UnitName("player")) then table.insert(MultiBot.reward.units, tBot) end
28 | end
29 | end
30 | elseif(GetNumPartyMembers() > 0) then
31 | for i = 1, 5 do
32 | local tUnit = UnitName("party" .. i)
33 | if(tUnit ~= nil) then
34 | local tBot = MultiBot.getBot(tUnit)
35 | if(tBot ~= nil and tBot.name ~= UnitName("player")) then table.insert(MultiBot.reward.units, tBot) end
36 | end
37 | end
38 | end
39 |
40 | --if(table.getn(MultiBot.reward.units) > 0 and tChoices > 0) then
41 | -- Nombre de bots éligibles à une récompense
42 | local unitsCount = #MultiBot.reward.units
43 |
44 | if(unitsCount > 0 and tChoices > 0) then
45 | local tOverlay = MultiBot.reward.frames["Overlay"]
46 | --local tUnits = table.getn(MultiBot.reward.units)
47 | local tUnits = unitsCount
48 |
49 | MultiBot.reward.max = math.ceil(tUnits / MultiBot.reward.to)
50 | tOverlay.setText("Pages", MultiBot.reward.now .. "/" .. MultiBot.reward.max)
51 | tOverlay.buttons["<"]:Show()
52 | tOverlay.buttons[">"]:Show()
53 |
54 | if(MultiBot.reward.now == 1) then tOverlay.buttons["<"]:Hide() end
55 | if(MultiBot.reward.now == MultiBot.reward.max) then tOverlay.buttons[">"]:Hide() end
56 |
57 | --if(tUnits > MultiBot.reward.to) then tUnits = MultiBot.reward.to end
58 |
59 | if(tUnits > MultiBot.reward.to) then
60 | tUnits = MultiBot.reward.to
61 | end
62 |
63 | for i = 1, tUnits do
64 | local tBot = MultiBot.reward.units[i]
65 | local tUnit = MultiBot.setReward(i, tBot, false)
66 |
67 | for j = 1, tChoices do
68 | local tReward = tUnit.buttons["R" .. j]
69 | tReward:Show()
70 | tReward.link = MultiBot.reward.rewards[j][1]
71 | tReward.setButton(MultiBot.reward.rewards[j][3], MultiBot.reward.rewards[j][1])
72 | tReward.doLeft = function(pButton)
73 | pButton.parent:Hide()
74 | SendChatMessage("r " .. pButton.link, "WHISPER", nil, pButton.getName())
75 | MultiBot.getBot(pButton.getName()).rewarded = true
76 | MultiBot.reward.doClose()
77 | end
78 | end
79 | end
80 |
81 | MultiBot.reward:Show()
82 | end
83 | end
84 |
85 | MultiBot.setReward = function(pIndex, pBot, oRewarded)
86 | local tID = "U" .. MultiBot.IF(pIndex < 10, "0", "") .. pIndex
87 | local tUnit = MultiBot.reward.frames["Overlay"].frames[tID]
88 | if(oRewarded ~= nil) then pBot.rewarded = oRewarded end
89 | if(pBot.rewarded) then tUnit:Hide() else tUnit:Show() end
90 | tUnit.setText(tID, "|cffffcc00" .. pBot.name .. " - " .. pBot.class .. "|r")
91 | tUnit.class = pBot.class
92 | tUnit.name = pBot.name
93 | return tUnit
94 | end
--------------------------------------------------------------------------------
/.luacheckrc:
--------------------------------------------------------------------------------
1 | -- Configuration Luacheck
2 | std = "lua53"
3 |
4 | exclude_files = {
5 | "**/MultiBotInit.lua"
6 | }
7 |
8 | globals = {
9 | "MultiBot", "GetLocale", "GetSpellInfo", "GetSpellLink", "MultiBotSave", "SendChatMessage", "CreateFrame", "UIParent",
10 | "MultiBotGlobalSave", "DEFAULT_CHAT_FRAME", "C_Timer_After", "IsInRaid", "GetNumRaidMembers", "IsInGroup", "GetNumPartyMembers",
11 | "GetNumGroupMembers", "GetNumSubgroupMembers", "lvl", "C_Timer", "UnitClass", "InspectUnit", "InspectFrame", "HideUIPanel",
12 | "tinsert", "strtrim", "wipe", "UnitName", "GetRealmName", "GameTooltip", "GameTooltip_Hide", "MultiBotDB", "SlashCmdList",
13 | "GetScreenWidth", "tParts", "tSpace", "strsub", "strlen", "GetNumTalents", "UnitLevel", "IsSpellKnown", "GetInventoryItemLink",
14 | "iName", "iLink", "iRare", "iMinLevel", "iType", "iSubType", "iStack", "GetItemInfo", "floor", "tIcon", "tBody", "GetMacroInfo",
15 | "CreateMacro", "PickupMacro", "UnitSex", "UnitRace", "substr", "StaticPopupDialogs", "ACCEPT", "CANCEL", "StaticPopup_Show",
16 | "MultiBotPVPFrame", "GetItemIcon", "OKAY", "_MB_getIcon", "_MB_applyDesat", "_MB_applyDesatToTexture", "_MB_setDesat", "unpack",
17 | "CheckInteractDistance", "Minimap", "GetScreenHeight", "GetCursorPosition", "InterfaceOptionsFrame_OpenToCategory", "TimerAfter",
18 | "UnitExists", "UnitIsPlayer", "GuildRoster", "ShowFriends", "GetNumGuildMembers", "GetGuildRosterInfo", "GetNumFriends", "GetFriendInfo",
19 | "UnitFactionGroup", "IsUnitOnQuest", "GetNumQuestLogEntries", "GetQuestLink", "YES", "NO", "GetQuestLogTitle", "GetNumQuestLeaderBoards",
20 | "GetNumQuestLogEntries", "SelectQuestLogEntry", "SetAbandonQuest", "QuestLogPushQuest", "UIErrorsFrame", "SendAll", "CancelTrade", "InitiateTrade",
21 | "GetNumMacroIcons", "gApply", "GetActiveTalentGroup", "GetTalentInfo", "GetUnspentTalentPoints", "GetTalentLink", "GetCursorInfo", "strsplit",
22 | "GetSpellTexture", "ClearCursor", "MBHunterPetPreview", "tru", "InterfaceOptionsFrame", "INTERFACEOPTIONS_ADDONCATEGORIES", "InterfaceOptionsFrame_AddCategory",
23 | "InterfaceOptions_AddCategory", "UIDropDownMenu_JustifyText", "UIDropDownMenu_SetSelectedValue", "UIDropDownMenu_SetButtonWidth", "UIDropDownMenu_SetWidth",
24 | "UIDropDownMenu_Initialize", "UIDropDownMenu_AddButton", "UIDropDownMenu_CreateInfo", "UIDropDownMenu_SetSelectedID", "SetRaidSubgroup", "GetRaidRosterInfo",
25 | "MouseIsOver", "UninviteUnit", "UnitInRaid", "UnitInGroup", "GetNumQuestChoices", "GetQuestItemLink", "GetQuestItemInfo", "SwapRaidSubgroup", "WorldMapButton",
26 | "UnitIsConnected", "event", "arg1", "arg2", "MultiBotSaved", "GetUnitName", "GetTime", "GetNumMacros", "ReloadUI", "GetQuestLogLeaderBoard", "AbandonQuest",
27 | "GetMacroIconInfo", "GetPlayerInfoByGUID", "UnitGUID", "ConvertToRaid", "HandleQuestsAllResponse", "UnitXPMax", "UnitXP", "UnitManaMax", "UnitMana",
28 | "GetCurrentMapContinent", "GetCurrentMapAreaID", "SLASH_MULTIBOT1", "SLASH_MULTIBOT2", "SLASH_MULTIBOT3", "SLASH_MULTIBOTOPTIONS1", "SLASH_MBFAKEGM1",
29 | "SLASH_MBCLASS1", "SLASH_MBCLASSTEST1"
30 |
31 | }
32 |
33 | read_globals = {
34 | math = {
35 | fields = {
36 | atan2 = {}
37 | }
38 | }
39 | }
40 |
41 | -- Interdire les tabulations
42 | no_tab_indent = true
43 |
44 | -- Indentation à 4 espaces
45 | indent_size = 4
46 |
47 | -- Options de propreté du code
48 | unused_args = false
49 | unused_vars = false
50 | redefined_vars = false
51 | unused_values = false
52 |
53 | -- Interdire les globals implicites
54 | allow_defined_top = false
55 |
56 | -- Considérer 'self' comme utilisé automatiquement
57 | self = true
58 |
59 | -- Limite de longueur de ligne
60 | max_line_length = 500
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/generic.yml:
--------------------------------------------------------------------------------
1 | name: "🧩 Issue – Bug / Improvement / Question"
2 | description: "Thanks for filling this out. Please make sure to complete all required fields (including the Title above)."
3 | title: "[Issue] "
4 | labels:
5 | - needs triage
6 | body:
7 | - type: markdown
8 | attributes:
9 | value: |
10 | Thanks for using this form. Fields marked with * are required.
11 | 👉 Please set a **clear title** at the top before submitting.
12 |
13 | - type: dropdown
14 | id: type
15 | attributes:
16 | label: Issue type *
17 | options:
18 | - Bug
19 | - Improvement
20 | - Question
21 | validations:
22 | required: true
23 |
24 | - type: input
25 | id: addon_version
26 | attributes:
27 | label: Addon version
28 | placeholder: "e.g., v1.2.3"
29 | validations:
30 | required: false
31 |
32 | - type: input
33 | id: wow_version
34 | attributes:
35 | label: WoW client version
36 | placeholder: "e.g., 3.3.5"
37 | validations:
38 | required: false
39 |
40 | - type: input
41 | id: server_version
42 | attributes:
43 | label: Server/AzerothCore version
44 | placeholder: "e.g., git hash, tag, or build"
45 | validations:
46 | required: false
47 |
48 | - type: textarea
49 | id: description
50 | attributes:
51 | label: Description *
52 | description: "What is happening, or what would you like to see?"
53 | placeholder: "Context, what you were doing, any error messages, etc."
54 | render: markdown
55 | validations:
56 | required: true
57 |
58 | - type: textarea
59 | id: steps
60 | attributes:
61 | label: Steps to reproduce
62 | description: "Provide a clear path to reproduce the issue."
63 | placeholder: |
64 | 1. Go to '...'
65 | 2. Click on '...'
66 | 3. Observe '...'
67 | render: markdown
68 | validations:
69 | required: false
70 |
71 | - type: textarea
72 | id: expected
73 | attributes:
74 | label: Expected behavior *
75 | placeholder: "What should have happened instead?"
76 | render: markdown
77 | validations:
78 | required: true
79 |
80 | - type: textarea
81 | id: actual
82 | attributes:
83 | label: Actual behavior / Errors
84 | description: "Paste error messages/stack traces/logs (you can drag & drop files)."
85 | placeholder: "Logs, console output, screenshots…"
86 | validations:
87 | required: false
88 |
89 | - type: input
90 | id: log_link
91 | attributes:
92 | label: Crashlog / Gist link (optional)
93 | placeholder: "https://gist.github.com/…"
94 | validations:
95 | required: false
96 |
97 | - type: textarea
98 | id: screenshots
99 | attributes:
100 | label: Screenshots
101 | description: "Drag & drop images here if helpful."
102 | validations:
103 | required: false
104 |
105 | - type: checkboxes
106 | id: checks
107 | attributes:
108 | label: Pre-submission checklist *
109 | options:
110 | - label: I searched for existing issues that match mine.
111 | required: true
112 | - label: I tested with the minimum set of addons/changes.
113 | required: false
114 | - label: I provided reproduction steps and/or relevant logs.
115 | required: true
116 |
117 | - type: textarea
118 | id: extra
119 | attributes:
120 | label: Additional context
121 | placeholder: "Environment details, configuration, ideas for a fix, etc."
122 | validations:
123 | required: false
--------------------------------------------------------------------------------
/Strategies/MultiBotRogue.lua:
--------------------------------------------------------------------------------
1 | MultiBot.addRogue = function(pFrame, pCombat, pNormal)
2 | pFrame.addButton("DpsControl", 0, 0, "ability_warrior_challange", MultiBot.tips.rogue.dps.master)
3 | .doLeft = function(pButton)
4 | MultiBot.ShowHideSwitch(pButton.getFrame("DpsControl"))
5 | end
6 |
7 | local tFrame = pFrame.addFrame("DpsControl", -2, 30)
8 | tFrame:Hide()
9 |
10 | tFrame.addButton("DpsAssist", 0, 0, "spell_holy_heroism", MultiBot.tips.rogue.dps.dpsAssist).setDisable()
11 | .doLeft = function(pButton)
12 | if(MultiBot.OnOffActionToTarget(pButton, "co +dps assist,?", "co -dps assist,?", pButton.getName())) then
13 | pButton.getButton("TankAssist").setDisable()
14 | pButton.getButton("DpsAoe").setDisable()
15 | end
16 | end
17 |
18 | tFrame.addButton("DpsAoe", 0, 26, "spell_holy_surgeoflight", MultiBot.tips.rogue.dps.dpsAoe).setDisable()
19 | .doLeft = function(pButton)
20 | if(MultiBot.OnOffActionToTarget(pButton, "co +dps aoe,?", "co -dps aoe,?", pButton.getName())) then
21 | pButton.getButton("TankAssist").setDisable()
22 | pButton.getButton("DpsAssist").setDisable()
23 | end
24 | end
25 |
26 | tFrame.addButton("Dps", 0, 52, "spell_holy_divinepurpose", MultiBot.tips.rogue.dps.dps).setDisable()
27 | .doLeft = function(pButton)
28 | MultiBot.OnOffActionToTarget(pButton, "co +dps,?", "co -dps,?", pButton.getName())
29 | end
30 |
31 | -- STEALTH (maintenir le camouflage HORS COMBAT)
32 | tFrame.addButton("Stealth", 0, 78, "ability_stealth", MultiBot.tips.rogue.dps.stealth).setDisable()
33 | .doLeft = function(pButton)
34 | -- "stealth" est une stratégie non-combat : on la pousse côté pNormal
35 | MultiBot.OnOffActionToTarget(pButton, "co +stealth,?", "co -stealth,?", pButton.getName())
36 | end
37 |
38 | -- STEALTHED (comportement EN CAMOUFLAGE en combat)
39 | tFrame.addButton("Stealthed", 0, 104, "ability_sap", MultiBot.tips.rogue.dps.stealthed).setDisable()
40 | .doLeft = function(pButton)
41 | -- Pour entrer en mode "stealthed", on coupe dps et on force stealthed ; l'inverse pour repasser en dps.
42 | if(MultiBot.OnOffActionToTarget(pButton, "co +stealthed,?", "co -stealthed,?", pButton.getName())) then
43 | pButton.getButton("Dps") .setDisable()
44 | pButton.getButton("DpsAoe") .setDisable()
45 | pButton.getButton("DpsAssist") .setDisable()
46 | end
47 | end
48 |
49 | -- BOOST (active les CD offensifs : Adrenaline Rush, Blade Flurry, etc.)
50 | tFrame.addButton("Boost", 0, 130, "ability_mage_potentspirit", MultiBot.tips.rogue.dps.boost).setDisable()
51 | .doLeft = function(pButton)
52 | MultiBot.OnOffActionToTarget(pButton, "co +boost,?", "co -boost,?", pButton.getName())
53 | end
54 |
55 | -- ASSIST --
56 |
57 | pFrame.addButton("TankAssist", -30, 0, "ability_warrior_innerrage", MultiBot.tips.rogue.tankAssist).setDisable()
58 | .doLeft = function(pButton)
59 | if(MultiBot.OnOffActionToTarget(pButton, "co +tank assist,?", "co -tank assist,?", pButton.getName())) then
60 | pButton.getButton("DpsAssist").setDisable()
61 | pButton.getButton("DpsAoe").setDisable()
62 | end
63 | end
64 |
65 | -- STRATEGIES --
66 |
67 | if(MultiBot.isInside(pCombat, "dps")) then pFrame.getButton("Dps").setEnable() end
68 | if(MultiBot.isInside(pCombat, "dps aoe")) then pFrame.getButton("DpsAoe").setEnable() end
69 | if(MultiBot.isInside(pCombat, "dps assist")) then pFrame.getButton("DpsAssist").setEnable() end
70 | if(MultiBot.isInside(pCombat, "tank assist")) then pFrame.getButton("TankAssist").setEnable() end
71 | if(MultiBot.isInside(pNormal, "stealth")) then pFrame.getButton("Stealth").setEnable() end
72 | if(MultiBot.isInside(pCombat, "stealthed")) then pFrame.getButton("Stealthed").setEnable() end
73 | if(MultiBot.isInside(pCombat, "boost")) then pFrame.getButton("Boost").setEnable() end
74 | end
--------------------------------------------------------------------------------
/Core/MultiBotConfig.lua:
--------------------------------------------------------------------------------
1 | -- MultiBotConfig.lua
2 | -- print("MultiBotConfig.lua loaded")
3 | MultiBot = MultiBot or {}
4 |
5 | -- Valeurs d'origine (en secondes) : gardées à l'identique
6 | local DEFAULTS = {
7 | stats = 45, -- ping "stats"
8 | talent = 3, -- application auto des talents
9 | invite = 5, -- boucle d'invitations
10 | sort = 1, -- tri/rafraîchissement
11 | }
12 |
13 | local THROTTLE_DEFAULTS = {
14 | rate = 5,
15 | burst = 8
16 | }
17 |
18 | -- Assure l'existence de la SavedVariables et des clés
19 | function MultiBot.Config_Ensure()
20 | MultiBotDB = MultiBotDB or {}
21 |
22 | -- Timers
23 | MultiBotDB.timers = MultiBotDB.timers or {}
24 | for k, v in pairs(DEFAULTS) do
25 | if type(MultiBotDB.timers[k]) ~= "number" or MultiBotDB.timers[k] <= 0 then
26 | MultiBotDB.timers[k] = v
27 | end
28 | end
29 |
30 | -- Throttle (DB)
31 | MultiBotDB.throttle = MultiBotDB.throttle or {}
32 | if type(MultiBotDB.throttle.rate) ~= "number" or MultiBotDB.throttle.rate <= 0 then
33 | MultiBotDB.throttle.rate = THROTTLE_DEFAULTS.rate
34 | end
35 | if type(MultiBotDB.throttle.burst) ~= "number" or MultiBotDB.throttle.burst <= 0 then
36 | MultiBotDB.throttle.burst = THROTTLE_DEFAULTS.burst
37 | end
38 | end
39 |
40 | -- Recopie les valeurs sauvegardées vers les timers runtime
41 | function MultiBot.ApplyTimersToRuntime()
42 | if not (MultiBot and MultiBot.timer) then return end
43 | for k, v in pairs(MultiBotDB.timers or {}) do
44 | MultiBot.timer[k] = MultiBot.timer[k] or { elapsed = 0, interval = v }
45 | MultiBot.timer[k].interval = v
46 | end
47 | end
48 |
49 | -- Lecture
50 | function MultiBot.GetTimer(name)
51 | if MultiBotDB and MultiBotDB.timers then
52 | return MultiBotDB.timers[name]
53 | end
54 | return DEFAULTS[name]
55 | end
56 |
57 | -- Réinitialise les compteurs elapsed (un ou tous)
58 | function MultiBot.ApplyTimerChanges(name)
59 | if not (MultiBot and MultiBot.timer) then return end
60 | local function resetOne(n)
61 | if MultiBot.timer[n] and type(MultiBot.timer[n].elapsed) == "number" then
62 | MultiBot.timer[n].elapsed = 0
63 | end
64 | end
65 | if name then
66 | resetOne(name)
67 | else
68 | resetOne("stats"); resetOne("talent"); resetOne("invite"); resetOne("sort")
69 | end
70 | end
71 |
72 | -- Écriture + clamp + application immédiate
73 | function MultiBot.SetTimer(name, value)
74 | if not (MultiBotDB and MultiBotDB.timers) then return end
75 | if type(value) ~= "number" then return end
76 | if value < 0.1 then value = 0.1 end
77 | if value > 600 then value = 600 end
78 | MultiBotDB.timers[name] = value
79 |
80 | -- Applique au runtime si présent
81 | if MultiBot and MultiBot.timer and MultiBot.timer[name] then
82 | MultiBot.timer[name].interval = value
83 | end
84 | MultiBot.ApplyTimerChanges(name) -- remet elapsed=0 pour ce timer
85 | end
86 |
87 | -- Throttle: lecture
88 | function MultiBot.GetThrottleRate() return (MultiBotDB and MultiBotDB.throttle and MultiBotDB.throttle.rate) or 5 end
89 | function MultiBot.GetThrottleBurst() return (MultiBotDB and MultiBotDB.throttle and MultiBotDB.throttle.burst) or 8 end
90 |
91 | -- Throttle: écriture + application immédiate
92 | function MultiBot.SetThrottleRate(v)
93 | if type(v) ~= "number" then return end
94 | if v < 1 then v = 1 end
95 | if v > 50 then v = 50 end
96 | MultiBotDB.throttle = MultiBotDB.throttle or {}
97 | MultiBotDB.throttle.rate = v
98 | if MultiBot._ThrottleStats then MultiBot._ThrottleStats(MultiBotDB.throttle.rate, MultiBot.GetThrottleBurst()) end
99 | end
100 |
101 | function MultiBot.SetThrottleBurst(v)
102 | if type(v) ~= "number" then return end
103 | if v < 1 then v = 1 end
104 | if v > 100 then v = 100 end
105 | MultiBotDB.throttle = MultiBotDB.throttle or {}
106 | MultiBotDB.throttle.burst = v
107 | if MultiBot._ThrottleStats then MultiBot._ThrottleStats(MultiBot.GetThrottleRate(), MultiBotDB.throttle.burst) end
108 | end
109 |
--------------------------------------------------------------------------------
/Data/HunterPetFamily.lua:
--------------------------------------------------------------------------------
1 | -- print(">>> HunterPetFamily.lua exécuté")
2 | MultiBot = MultiBot or {}
3 | MultiBot.PET_FAMILY = { -- ← fallback enUS
4 | [1]="Wolf",[2]="Cat",[3]="Spider",[4]="Bear",[5]="Boar",[6]="Crocolisk",[7]="Carrion Bird",
5 | [8]="Crab",[9]="Gorilla",[11]="Raptor",[12]="Tallstrider",[20]="Scorpid",[21]="Turtle",
6 | [24]="Bat",[25]="Hyena",[26]="Bird of Prey",[27]="Wind Serpent",[30]="Dragonhawk",
7 | [31]="Ravager",[32]="Warp Stalker",[33]="Sporebat",[34]="Nether Ray",[35]="Serpent",
8 | [37]="Moth",[38]="Chimaera",[39]="Devilsaur",[41]="Silithid",[42]="Worm",[43]="Rhino",
9 | [44]="Wasp",[45]="Core Hound",[46]="Spirit Beast",
10 | }
11 |
12 | -- -----------------------------------------------------------------
13 | -- Localisation Table : id => translated name
14 | -- -----------------------------------------------------------------
15 | MultiBot.PET_FAMILY_L10N = {
16 | deDE = { -- Allemand
17 | [1]="Wolf",[2]="Katze",[3]="Spinne",[4]="Bär",[5]="Eber",[6]="Krokilisk",
18 | [7]="Aasvogel",[8]="Krabbe",[9]="Gorilla",[11]="Raptor",[12]="Weitschreiter",
19 | [20]="Skorpid",[21]="Schildkröte",[24]="Fledermaus",[25]="Hyäne",
20 | [26]="Raubvogel",[27]="Windnatter",[30]="Drachenfalke",[31]="Verheerer",
21 | [32]="Sphärenpirscher",[33]="Sporensegler",[34]="Netherrochen",[35]="Schlange",
22 | [37]="Motte",[38]="Chimäre",[39]="Teufelssaurier",[41]="Silithide",[42]="Wurm",
23 | [43]="Nashorn",[44]="Wespe",[45]="Kernhund",[46]="Geisterbestie",
24 | },
25 | frFR = { -- Français
26 | [1]="Loup",[2]="Félin",[3]="Araignée",[4]="Ours",[5]="Sanglier",[6]="Crocilisque",
27 | [7]="Charognard",[8]="Crabe",[9]="Gorille",[11]="Raptor",[12]="Haut-trotteur",
28 | [20]="Scorpid",[21]="Tortue",[24]="Chauve-souris",[25]="Hyène",
29 | [26]="Oiseau de proie",[27]="Serpent des vents",[30]="Faucon-dragon",
30 | [31]="Ravageur",[32]="Traqueur dimensionnel",[33]="Sporoptère",
31 | [34]="Raie du Néant",[35]="Serpent",[37]="Phalène",[38]="Chimère",
32 | [39]="Diablosaurien",[41]="Silithide",[42]="Ver",[43]="Rhinocéros",
33 | [44]="Guêpe",[45]="Chien du magma",[46]="Bête spirituelle",
34 | },
35 | esES = { -- Espagnol (UE and MX)
36 | [1]="Lobo",[2]="Felino",[3]="Araña",[4]="Oso",[5]="Jabalí",[6]="Crocolisco",
37 | [7]="Ave carroñera",[8]="Cangrejo",[9]="Gorila",[11]="Raptor",[12]="Zancudo",
38 | [20]="Escórpido",[21]="Tortuga",[24]="Murciélago",[25]="Hiena",
39 | [26]="Ave rapaz",[27]="Serpiente alada",[30]="Halcón dracónico",
40 | [31]="Devastador",[32]="Acechador vil",[33]="Esporiélago",
41 | [34]="Raya abisal",[35]="Serpiente",[37]="Polilla",[38]="Quimera",
42 | [39]="Devilsaurio",[41]="Silítido",[42]="Gusano",[43]="Rinoceronte",
43 | [44]="Avispa",[45]="Can del Núcleo",[46]="Bestia espíritu",
44 | },
45 | ruRU = { -- Russe
46 | [1]="Волк",[2]="Кошка",[3]="Паук",[4]="Медведь",[5]="Кабан",[6]="Кроколиск",
47 | [7]="Падальщик",[8]="Краб",[9]="Горилла",[11]="Ящер",[12]="Долгоног",
48 | [20]="Скорпид",[21]="Черепаха",[24]="Летучая мышь",[25]="Гиена",
49 | [26]="Хищная птица",[27]="Крылатый змей",[30]="Дракондор",
50 | [31]="Опустошитель",[32]="Прыгуана",[33]="Спороскат",
51 | [34]="Скат Пустоты",[35]="Змея",[37]="Мотылек",[38]="Химера",
52 | [39]="Дьявозавр",[41]="Силитид",[42]="Червь",[43]="Носорог",
53 | [44]="Оса",[45]="Гончая Недр",[46]="Дух зверя",
54 | },
55 | koKR = { -- Coréen
56 | [1]="늑대",[2]="살쾡이",[3]="거미",[4]="곰",[5]="멧돼지",[6]="악어",
57 | [7]="독수리",[8]="게",[9]="고릴라",[11]="랩터",[12]="타조",
58 | [20]="전갈",[21]="거북",[24]="박쥐",[25]="하이에나",
59 | [26]="맹금수",[27]="풍뱀",[30]="용매",[31]="칼날발톱",
60 | [32]="차원의 추적자",[33]="포자날개",[34]="황천의 가오리",[35]="뱀",
61 | [37]="나방",[38]="키메라",[39]="악마사우루스",[41]="실리시드",
62 | [42]="벌레",[43]="코뿔소",[44]="말벌",[45]="용암사냥개",[46]="영혼의 야수",
63 | },
64 | zhCN = { -- Chinois simplifié
65 | [1]="狼",[2]="猫",[3]="蜘蛛",[4]="熊",[5]="野猪",[6]="鳄鱼",
66 | [7]="食腐鸟",[8]="螃蟹",[9]="猩猩",[11]="迅猛龙",[12]="长颈陆行鸟",
67 | [20]="蝎子",[21]="海龟",[24]="蝙蝠",[25]="土狼",
68 | [26]="猎鹰",[27]="风蛇",[30]="龙鹰",[31]="劫掠者",
69 | [32]="扭曲猎手",[33]="孢子蝠",[34]="虚空鳐",[35]="蛇",
70 | [37]="蛾",[38]="双头龙",[39]="魔暴龙",[41]="异种蝎",
71 | [42]="蠕虫",[43]="犀牛",[44]="黄蜂",[45]="核犬",[46]="灵魂兽",
72 | },
73 | zhTW = { -- Chinois traditionnel
74 | [1]="狼",[2]="貓",[3]="蜘蛛",[4]="熊",[5]="野豬",[6]="鱷魚",
75 | [7]="食腐鳥",[8]="螃蟹",[9]="大猩猩",[11]="迅猛龍",[12]="長腳陸行鳥",
76 | [20]="毒蠍",[21]="海龜",[24]="蝙蝠",[25]="土狼",
77 | [26]="猛禽",[27]="風蛇",[30]="龍鷹",[31]="劫掠者",
78 | [32]="扭曲巡者",[33]="孢子蝙蝠",[34]="虛空魟",[35]="蛇",
79 | [37]="蛾",[38]="奇美拉",[39]="魔暴龍",[41]="異種蟲",
80 | [42]="蠕蟲",[43]="犀牛",[44]="黃蜂",[45]="熔核犬",[46]="靈魂獸",
81 | },
82 | }
--------------------------------------------------------------------------------
/UI/MultiBotItem.lua:
--------------------------------------------------------------------------------
1 | MultiBot.addItem = function(pFrame, pInfo)
2 | local tInfo = MultiBot.doSplit(pInfo, "|")
3 | local tID = MultiBot.doSplit(tInfo[3], ":")[2]
4 |
5 | local tIcon = GetItemIcon(tID)
6 | local tName, tLink, tRare = GetItemInfo(tID)
7 |
8 | local tX = (pFrame.index%8) * 38
9 | local tY = math.floor(pFrame.index/8) * -37.1
10 |
11 | if(tName == nil) then tName = string.sub(tInfo[4], 3, string.len(tInfo[4]) - 1) end
12 | if(tLink == nil) then tLink = "|" .. tInfo[2] .. "|" .. tInfo[3] .. "|" .. tInfo[4] .. "|h|r" end
13 | if(tRare == nil) then tRare = 4 end -- for Security
14 |
15 | local tButton = pFrame.addButton(tName, tX, tY, tIcon, tLink)
16 | pFrame.catButton("Catecher", 270, -490, 308, 524)
17 |
18 | tButton.item = {}
19 | tButton.item.id = tID
20 | tButton.item.link = tLink
21 | tButton.item.name = tName
22 | tButton.item.info = pInfo
23 | tButton.item.rare = tRare
24 |
25 | --tButton.doLeft = function(pButton)
26 | --local tAction = MultiBot.inventory.action
27 | --local tName = MultiBot.inventory.name
28 |
29 | tButton.doLeft = function(pButton)
30 | local tAction = MultiBot.inventory.action
31 | -- Nom du bot cible (destinataire du whisper), on évite de masquer tName (nom de l'objet)
32 | local botName = MultiBot.inventory.name
33 |
34 | if(tAction == "") then
35 | SendChatMessage(MultiBot.info.action, "SAY")
36 | return
37 | end
38 |
39 | --[[if(tAction == "s" and MultiBot.isTarget()) then
40 | if(pButton.item.id == "6948") then return SendChatMessage(MultiBot.info.itemsellalert, "SAY") end
41 | if(MultiBot.isInside(pButton.item.info or "", "%f[%a][Kk]ey%f[%A]")) then
42 | return SendChatMessage(MultiBot.info.keydestroyalert, "SAY")
43 | end
44 | --SendChatMessage(tAction .. " " .. pButton.tip, "WHISPER", nil, tName)
45 | SendChatMessage(tAction .. " " .. pButton.tip, "WHISPER", nil, botName)
46 | pButton:Hide()
47 | return
48 | end]]--
49 |
50 | if(tAction == "s" and MultiBot.isTarget()) then
51 | if(pButton.item.id == "6948") then
52 | return SendChatMessage(MultiBot.info.itemsellalert, "SAY")
53 | end
54 |
55 | if(MultiBot.isInside(pButton.item.info or "", "%f[%a][Kk]ey%f[%A]")) then
56 | return SendChatMessage(MultiBot.info.keydestroyalert, "SAY")
57 | end
58 |
59 | -- Envoi de la commande "s [item]" au bot dont l’inventaire est ouvert
60 | --SendChatMessage(tAction .. " " .. pButton.tip, "WHISPER", nil, tName)
61 | SendChatMessage(tAction .. " " .. pButton.tip, "WHISPER", nil, botName)
62 |
63 | -- On masque l’item cliqué pour un feedback immédiat
64 | pButton:Hide()
65 |
66 | -- Puis on relit proprement l’inventaire du bot pour se resynchroniser
67 | if MultiBot.RefreshInventory then
68 | MultiBot.RefreshInventory(0.3)
69 | end
70 |
71 | return
72 | end
73 |
74 | if(tAction == "e" or tAction == "u" or tAction == "give") then
75 | --SendChatMessage(tAction .. " " .. pButton.tip, "WHISPER", nil, tName)
76 | SendChatMessage(tAction .. " " .. pButton.tip, "WHISPER", nil, botName)
77 | return
78 | end
79 |
80 | if(tAction == "destroy") then
81 | local needsConfirm = false
82 | if(pButton.item.id == "6948") then needsConfirm = true end -- Hearthstone
83 | if(MultiBot.isInside(pButton.item.info, "%f[%a][Kk]ey%f[%A]")) then needsConfirm = true end
84 | if(pButton.item.rare > 3) then needsConfirm = true end -- Épique ou mieux
85 | if needsConfirm then
86 | if not StaticPopupDialogs["MULTIBOT_CONFIRM_DESTROY"] then
87 | StaticPopupDialogs["MULTIBOT_CONFIRM_DESTROY"] = {
88 | text = MultiBot.info.itemdestroyalert,
89 | button1 = OKAY,
90 | button2 = CANCEL,
91 | timeout = 0,
92 | whileDead = 1,
93 | hideOnEscape = 1,
94 | OnAccept = function(self, data)
95 | if not data or not data.button then return end
96 | SendChatMessage("destroy" .. " " .. data.button.tip, "WHISPER", nil, data.tName)
97 | data.button:Hide()
98 | end,
99 | }
100 | end
101 | --local data = { button = pButton, tName = tName }
102 | local data = { button = pButton, tName = botName }
103 | StaticPopup_Show("MULTIBOT_CONFIRM_DESTROY", pButton.item.link, nil, data)
104 | return
105 | end
106 | -- Pas de confirmation requise
107 | --SendChatMessage(tAction .. " " .. pButton.tip, "WHISPER", nil, tName)
108 | SendChatMessage(tAction .. " " .. pButton.tip, "WHISPER", nil, botName)
109 | pButton:Hide()
110 | return
111 | end
112 | end
113 |
114 | if(string.sub(tInfo[6], 1, 2) == "rx") then
115 | tButton.setAmount(string.sub(MultiBot.doSplit(tInfo[6], " ")[1], 3))
116 | end
117 |
118 | pFrame.index = pFrame.index + 1
119 | end
--------------------------------------------------------------------------------
/UI/MultiBotStats.lua:
--------------------------------------------------------------------------------
1 | MultiBot.addStats = function(pFrame, pIndex, pX, pY, pSize, pWidth, pHeight)
2 | local tFrame = pFrame.addFrame(pIndex, pX, pY, pSize, pWidth, pHeight)
3 | local tAddon = tFrame.addFrame("Addon", -2, 46, 48)
4 | tAddon.addTexture("Interface\\AddOns\\MultiBot\\Icons\\xp_progress_99_percent.blp")
5 | tFrame.addTexture("Interface\\AddOns\\MultiBot\\Textures\\Stats.blp")
6 | tFrame:Hide()
7 |
8 | tFrame.addText("Name", "", "TOPLEFT", 54, -11, 11)
9 | tFrame.addText("Values", "", "TOPLEFT", 54, -27, 11)
10 | tAddon.addText("Percent", "", "CENTER", 0, 0, 11)
11 | tFrame.addText("Level", "", "CENTER", 85.25, 5, 11)
12 |
13 | tFrame.setProgress = function(frame, pProgress)
14 | local addonFrame = frame.frames["Addon"]
15 |
16 | addonFrame.texture:Hide()
17 |
18 | if pProgress >= 99 then
19 | addonFrame.setTexture(
20 | "Interface\\AddOns\\MultiBot\\Icons\\xp_progress_99_percent.blp"
21 | )
22 | elseif pProgress >= 90 then
23 | addonFrame.setTexture(
24 | "Interface\\AddOns\\MultiBot\\Icons\\xp_progress_90_percent.blp"
25 | )
26 | elseif pProgress >= 81 then
27 | addonFrame.setTexture(
28 | "Interface\\AddOns\\MultiBot\\Icons\\xp_progress_81_percent.blp"
29 | )
30 | elseif pProgress >= 72 then
31 | addonFrame.setTexture(
32 | "Interface\\AddOns\\MultiBot\\Icons\\xp_progress_72_percent.blp"
33 | )
34 | elseif pProgress >= 63 then
35 | addonFrame.setTexture(
36 | "Interface\\AddOns\\MultiBot\\Icons\\xp_progress_63_percent.blp"
37 | )
38 | elseif pProgress >= 54 then
39 | addonFrame.setTexture(
40 | "Interface\\AddOns\\MultiBot\\Icons\\xp_progress_54_percent.blp"
41 | )
42 | elseif pProgress >= 45 then
43 | addonFrame.setTexture(
44 | "Interface\\AddOns\\MultiBot\\Icons\\xp_progress_45_percent.blp"
45 | )
46 | elseif pProgress >= 36 then
47 | addonFrame.setTexture(
48 | "Interface\\AddOns\\MultiBot\\Icons\\xp_progress_36_percent.blp"
49 | )
50 | elseif pProgress >= 27 then
51 | addonFrame.setTexture(
52 | "Interface\\AddOns\\MultiBot\\Icons\\xp_progress_27_percent.blp"
53 | )
54 | elseif pProgress >= 18 then
55 | addonFrame.setTexture(
56 | "Interface\\AddOns\\MultiBot\\Icons\\xp_progress_18_percent.blp"
57 | )
58 | elseif pProgress >= 9 then
59 | addonFrame.setTexture(
60 | "Interface\\AddOns\\MultiBot\\Icons\\xp_progress_9_percent.blp"
61 | )
62 | end
63 |
64 | return pProgress
65 | end
66 |
67 | tFrame.setStats = function(pName, pLevel, pStats, oPlayer)
68 | local statsFrame = MultiBot.stats.frames[MultiBot.toUnit(pName)]
69 | local addonFrame = statsFrame.frames["Addon"]
70 | local tChina = GetLocale() == "zhCN"
71 |
72 | if oPlayer ~= nil and oPlayer == true then
73 | local tStats = MultiBot.doSplit(pStats, ", ")
74 | local tMana = tonumber(tStats[5])
75 | local tXP = tonumber(tStats[4])
76 |
77 | statsFrame.texts["Name"]:SetText(pName)
78 | statsFrame.texts["Level"]:SetText(pLevel)
79 | statsFrame.texts["Values"]:SetText("Player")
80 |
81 | if pLevel == 80 then
82 | addonFrame.texts["Percent"]:SetText(
83 | statsFrame.setProgress(statsFrame, tMana)
84 | .. "%\n"
85 | .. MultiBot.info.shorts.mp
86 | )
87 | else
88 | addonFrame.texts["Percent"]:SetText(
89 | statsFrame.setProgress(statsFrame, tXP)
90 | .. "%\n"
91 | .. MultiBot.info.shorts.xp
92 | )
93 | end
94 |
95 | statsFrame:Show()
96 | return
97 | end
98 |
99 | local tStats = MultiBot.doSplit(pStats, ", ")
100 | local tMoney = "|cffffdd55" .. tStats[1] .. "|r, "
101 | local tBag = MultiBot.IF(
102 | tChina,
103 | MultiBot.doReplace(tStats[2], "Bag", MultiBot.info.shorts.bag),
104 | tStats[2]
105 | )
106 |
107 | statsFrame.texts["Name"]:SetText(pName)
108 | statsFrame.texts["Level"]:SetText(pLevel)
109 | statsFrame.texts["Values"]:SetText(tMoney .. tBag)
110 |
111 | if pLevel == 80 then
112 | local durabilityString = MultiBot.doSplit(tStats[3], "|")[2]
113 | local tDur = MultiBot.doSplit(string.sub(durabilityString, 10), " ")
114 | local tQuality = tonumber(string.sub(tDur[1], 1, string.len(tDur[1]) - 1))
115 | local tRepair = tonumber(string.sub(tDur[2], 2, string.len(tDur[2]) - 1))
116 |
117 | if tQuality == 0 and tRepair == 0 then
118 | tQuality = 100
119 | end
120 |
121 | addonFrame.texts["Percent"]:SetText(
122 | statsFrame.setProgress(statsFrame, tQuality)
123 | .. "%\n"
124 | .. MultiBot.info.shorts.dur
125 | )
126 | else
127 | local xpString = MultiBot.doSplit(tStats[4], "|")[2]
128 | local tXP = tonumber(string.sub(xpString, 10))
129 |
130 | addonFrame.texts["Percent"]:SetText(
131 | statsFrame.setProgress(statsFrame, tXP)
132 | .. "%\n"
133 | .. MultiBot.info.shorts.xp
134 | )
135 | end
136 |
137 | statsFrame:Show()
138 | return
139 | end
140 | end
--------------------------------------------------------------------------------
/Strategies/MultiBotDeathKnight.lua:
--------------------------------------------------------------------------------
1 | MultiBot.addDeathKnight = function(pFrame, pCombat, pNormal)
2 | local tButton = pFrame.addButton("Presence", 0, 0, "spell_deathknight_bloodpresence", MultiBot.tips.deathknight.presence.master).setDisable()
3 | tButton.doLeft = function(pButton)
4 | MultiBot.ShowHideSwitch(pButton.getFrame("Presence"))
5 | end
6 |
7 | local tFrame = pFrame.addFrame("Presence", -2, 30)
8 | tFrame:Hide()
9 |
10 | tFrame.addButton("Unholy", 0, 0, "spell_deathknight_unholypresence", MultiBot.tips.deathknight.presence.unholy)
11 | .doLeft = function(pButton)
12 | MultiBot.SelectToTarget(pButton.get(), "Presence", pButton.texture, "co +unholy,?", pButton.getName())
13 | --pButton.getButton("Presence").doRight = function(pButton)
14 | pButton.getButton("Presence").doRight = function()
15 | MultiBot.OnOffActionToTarget(pButton, "co +unholy,?", "co -unholy,?", pButton.getName())
16 | end
17 | end
18 |
19 | tFrame.addButton("Frost", 0, 26, "spell_deathknight_frostpresence", MultiBot.tips.deathknight.presence.frost)
20 | .doLeft = function(pButton)
21 | MultiBot.SelectToTarget(pButton.get(), "Presence", pButton.texture, "co +frost,?", pButton.getName())
22 | --pButton.getButton("Presence").doRight = function(pButton)
23 | pButton.getButton("Presence").doRight = function()
24 | MultiBot.OnOffActionToTarget(pButton, "co +frost,?", "co -frost,?", pButton.getName())
25 | end
26 | end
27 |
28 | tFrame.addButton("Blood", 0, 52, "spell_deathknight_bloodpresence", MultiBot.tips.deathknight.presence.blood)
29 | .doLeft = function(pButton)
30 | MultiBot.SelectToTarget(pButton.get(), "Presence", pButton.texture, "co +blood,?", pButton.getName())
31 | --pButton.getButton("Presence").doRight = function(pButton)
32 | pButton.getButton("Presence").doRight = function()
33 | MultiBot.OnOffActionToTarget(pButton, "co +blood,?", "co -blood,?", pButton.getName())
34 | end
35 | end
36 |
37 | -- SRATEGIES:PRESENCE ---
38 |
39 | if(MultiBot.isInside(pCombat, "unholy")) then
40 | tButton.setTexture("spell_deathknight_unholypresence").setEnable().doRight = function(pButton)
41 | MultiBot.OnOffActionToTarget(pButton, "co +unholy,?", "co -unholy,?", pButton.getName())
42 | end
43 | elseif(MultiBot.isInside(pCombat, "frost")) then
44 | tButton.setTexture("spell_deathknight_frostpresence").setEnable().doRight = function(pButton)
45 | MultiBot.OnOffActionToTarget(pButton, "co +frost,?", "co -frost,?", pButton.getName())
46 | end
47 | elseif(MultiBot.isInside(pCombat, "blood")) then
48 | tButton.setTexture("spell_deathknight_bloodpresence").setEnable().doRight = function(pButton)
49 | MultiBot.OnOffActionToTarget(pButton, "co +blood,?", "co -blood,?", pButton.getName())
50 | end
51 | end
52 |
53 | -- DPS --
54 |
55 | pFrame.addButton("DpsControl", -30, 0, "ability_warrior_challange", MultiBot.tips.deathknight.dps.master)
56 | .doLeft = function(pButton)
57 | MultiBot.ShowHideSwitch(pButton.getFrame("DpsControl"))
58 | end
59 |
60 | local tDpsFrame = pFrame.addFrame("DpsControl", -32, 30)
61 | tDpsFrame:Hide()
62 |
63 | --tFrame.addButton("DpsAssist", 0, 0, "spell_holy_heroism", MultiBot.tips.deathknight.dps.dpsAssist).setDisable()
64 | tDpsFrame.addButton("DpsAssist", 0, 0, "spell_holy_heroism", MultiBot.tips.deathknight.dps.dpsAssist).setDisable()
65 | .doLeft = function(pButton)
66 | if(MultiBot.OnOffActionToTarget(pButton, "co +dps assist,?", "co -dps assist,?", pButton.getName())) then
67 | pButton.getButton("TankAssist").setDisable()
68 | pButton.getButton("DpsAoe").setDisable()
69 | end
70 | end
71 |
72 | --tFrame.addButton("DpsAoe", 0, 26, "spell_holy_surgeoflight", MultiBot.tips.deathknight.dps.dpsAoe).setDisable()
73 | tDpsFrame.addButton("DpsAoe", 0, 26, "spell_holy_surgeoflight", MultiBot.tips.deathknight.dps.dpsAoe).setDisable()
74 | .doLeft = function(pButton)
75 | if(MultiBot.OnOffActionToTarget(pButton, "co +dps aoe,?", "co -dps aoe,?", pButton.getName())) then
76 | pButton.getButton("TankAssist").setDisable()
77 | pButton.getButton("DpsAssist").setDisable()
78 | end
79 | end
80 |
81 | -- missing CLASS AOE (Frost/Unholy) --
82 |
83 | --tFrame.addButton("FrostAoe", 0, 52, "spell_frost_frostbolt02", "Frost Aoe").setDisable()
84 | tDpsFrame.addButton("FrostAoe", 0, 52, "spell_frost_frostbolt02", "Frost Aoe").setDisable()
85 | .doLeft = function(pButton)
86 | if(MultiBot.OnOffActionToTarget(pButton, "co +frost aoe,?", "co -frost aoe,?", pButton.getName())) then
87 | pButton.getButton("DpsAoe").setDisable()
88 | pButton.getButton("UnholyAoe").setDisable()
89 | end
90 | end
91 |
92 | --*tFrame.addButton("UnholyAoe", 0, 78, "spell_fire_felflamering", "Unholy Aoe").setDisable()
93 | tDpsFrame.addButton("UnholyAoe", 0, 78, "spell_fire_felflamering", "Unholy Aoe").setDisable()
94 | .doLeft = function(pButton)
95 | if(MultiBot.OnOffActionToTarget(pButton, "co +unholy aoe,?", "co -unholy aoe,?", pButton.getName())) then
96 | pButton.getButton("DpsAoe").setDisable()
97 | pButton.getButton("FrostAoe").setDisable()
98 | end
99 | end
100 |
101 | -- ASSIST --
102 |
103 | pFrame.addButton("TankAssist", -60, 0, "ability_warrior_innerrage", MultiBot.tips.deathknight.tankAssist).setDisable()
104 | .doLeft = function(pButton)
105 | if(MultiBot.OnOffActionToTarget(pButton, "co +tank assist,?", "co -tank assist,?", pButton.getName())) then
106 | pButton.getButton("DpsAssist").setDisable()
107 | pButton.getButton("DpsAoe").setDisable()
108 | end
109 | end
110 |
111 | -- STRATEGIES --
112 |
113 | if(MultiBot.isInside(pCombat, "dps aoe")) then pFrame.getButton("DpsAoe").setEnable() end
114 | if(MultiBot.isInside(pCombat, "dps assist")) then pFrame.getButton("DpsAssist").setEnable() end
115 | if(MultiBot.isInside(pCombat, "tank assist")) then pFrame.getButton("TankAssist").setEnable() end
116 | if(MultiBot.isInside(pCombat, "frost aoe")) then pFrame.getButton("FrostAoe").setEnable() end
117 | if(MultiBot.isInside(pCombat, "unholy aoe")) then pFrame.getButton("UnholyAoe").setEnable() end
118 | end
--------------------------------------------------------------------------------
/Strategies/MultiBotPriest.lua:
--------------------------------------------------------------------------------
1 | MultiBot.addPriest = function(pFrame, pCombat, pNormal)
2 | pFrame.addButton("Heal", 0, 0, "spell_holy_aspiration", MultiBot.tips.priest.heal).setDisable()
3 | .doLeft = function(pButton)
4 | if(MultiBot.OnOffActionToTarget(pButton, "co +heal,?", "co -heal,?", pButton.getName())) then
5 | pButton.getButton("Shadow").setDisable()
6 | pButton.getButton("Dps").setDisable()
7 | end
8 | end
9 |
10 | -- BUFF --
11 |
12 | pFrame.addButton("Buff", -30, 0, "spell_holy_power", MultiBot.tips.priest.buff).setDisable()
13 | .doLeft = function(pButton)
14 | MultiBot.OnOffActionToTarget(pButton, "co +buff,?", "co -buff,?", pButton.getName())
15 | end
16 |
17 | -- PLAYBOOK --
18 |
19 | pFrame.addButton("Playbook", -60, 0, "inv_misc_book_06", MultiBot.tips.priest.playbook.master)
20 | .doLeft = function(pButton)
21 | MultiBot.ShowHideSwitch(pButton.getFrame("Playbook"))
22 | end
23 |
24 | --local tFrame = pFrame.addFrame("Playbook", -62, 30)
25 | --tFrame:Hide()
26 |
27 | --tFrame.addButton("ShadowDebuff", 0, 0, "spell_shadow_demonicempathy", MultiBot.tips.priest.playbook.shadowDebuff).setDisable()
28 |
29 | local playbookFrame = pFrame.addFrame("Playbook", -62, 30)
30 | playbookFrame:Hide()
31 |
32 | playbookFrame.addButton("ShadowDebuff", 0, 0, "spell_shadow_demonicempathy", MultiBot.tips.priest.playbook.shadowDebuff).setDisable()
33 | .doLeft = function(pButton)
34 | if(MultiBot.OnOffActionToTarget(pButton, "co +shadow debuff,?", "co -shadow debuff,?", pButton.getName())) then
35 | pButton.getButton("DpsDebuff").setEnable()
36 | else
37 | pButton.getButton("DpsDebuff").setDisable()
38 | end
39 | end
40 |
41 | --tFrame.addButton("ShadowAoe", 0, 26, "spell_arcane_arcanetorrent", MultiBot.tips.priest.playbook.shadowAoe).setDisable()
42 | playbookFrame.addButton("ShadowAoe", 0, 26, "spell_arcane_arcanetorrent", MultiBot.tips.priest.playbook.shadowAoe).setDisable()
43 | .doLeft = function(pButton)
44 | MultiBot.OnOffActionToTarget(pButton, "co +shadow aoe,?", "co -shadow aoe,?", pButton.getName())
45 | end
46 |
47 | --tFrame.addButton("Shadow", 0, 52, "spell_holy_devotion", MultiBot.tips.priest.playbook.shadow).setDisable()
48 | playbookFrame.addButton("Shadow", 0, 52, "spell_holy_devotion", MultiBot.tips.priest.playbook.shadow).setDisable()
49 | .doLeft = function(pButton)
50 | if(MultiBot.OnOffActionToTarget(pButton, "co +shadow,?", "co -shadow,?", pButton.getName())) then
51 | pButton.getButton("Heal").setDisable()
52 | pButton.getButton("Dps").setEnable()
53 | else
54 | pButton.getButton("Dps").setDisable()
55 | end
56 | end
57 |
58 | -- HOLY (PLAYBOOK) --
59 | --tFrame.addButton("HolyHeal", 0, 78, "spell_holy_guardianspirit", MultiBot.tips.priest.playbook.holyheal).setDisable()
60 | playbookFrame.addButton("HolyHeal", 0, 78, "spell_holy_guardianspirit", MultiBot.tips.priest.playbook.holyheal).setDisable()
61 | .doLeft = function(pButton)
62 | if(MultiBot.OnOffActionToTarget(pButton, "co +holy heal,?", "co -holy heal,?", pButton.getName())) then
63 | pButton.getButton("Shadow").setDisable()
64 | pButton.getButton("Dps").setDisable()
65 | end
66 | end
67 |
68 | --tFrame.addButton("HolyDps", 0, 102, "spell_holy_holybolt", MultiBot.tips.priest.playbook.holydps).setDisable()
69 | playbookFrame.addButton("HolyDps", 0, 102, "spell_holy_holybolt", MultiBot.tips.priest.playbook.holydps).setDisable()
70 | .doLeft = function(pButton)
71 | if(MultiBot.OnOffActionToTarget(pButton, "co +holy dps,?", "co -holy dps,?", pButton.getName())) then
72 | pButton.getButton("Heal").setDisable()
73 | pButton.getButton("Shadow").setDisable()
74 | pButton.getButton("Dps").setEnable()
75 | end
76 | end
77 |
78 | -- SHADOW RESISTANCE --
79 | -- (Expose 'rshadow' pour Shadow Protection)
80 | --tFrame.addButton("ShadowRes", 0, 128, "spell_shadow_antishadow", MultiBot.tips.priest.playbook.rshadow).setDisable()
81 | playbookFrame.addButton("ShadowRes", 0, 128, "spell_shadow_antishadow", MultiBot.tips.priest.playbook.rshadow).setDisable()
82 | .doLeft = function(pButton)
83 | MultiBot.OnOffActionToTarget(pButton, "co +rshadow,?", "co -rshadow,?", pButton.getName())
84 | end
85 |
86 | -- DPS --
87 |
88 | pFrame.addButton("DpsControl", -90, 0, "ability_warrior_challange", MultiBot.tips.priest.dps.master)
89 | .doLeft = function(pButton)
90 | MultiBot.ShowHideSwitch(pButton.getFrame("DpsControl"))
91 | end
92 |
93 | --local tFrame = pFrame.addFrame("DpsControl", -92, 30)
94 | --tFrame:Hide()
95 |
96 | --tFrame.addButton("DpsAssist", 0, 0, "spell_holy_heroism", MultiBot.tips.priest.dps.dpsAssist).setDisable()
97 | local dpsControlFrame = pFrame.addFrame("DpsControl", -92, 30)
98 | dpsControlFrame:Hide()
99 |
100 | dpsControlFrame.addButton("DpsAssist", 0, 0, "spell_holy_heroism", MultiBot.tips.priest.dps.dpsAssist).setDisable()
101 | .doLeft = function(pButton)
102 | if(MultiBot.OnOffActionToTarget(pButton, "co +healer dps,?", "co -healer dps,?", pButton.getName())) then
103 | pButton.getButton("TankAssist").setDisable()
104 | pButton.getButton("DpsAoe").setDisable()
105 | end
106 | end
107 |
108 | --tFrame.addButton("DpsDebuff", 0, 26, "spell_holy_restoration", MultiBot.tips.priest.dps.dpsDebuff).setDisable()
109 | dpsControlFrame.addButton("DpsDebuff", 0, 26, "spell_holy_restoration", MultiBot.tips.priest.dps.dpsDebuff).setDisable()
110 | .doLeft = function(pButton)
111 | if(MultiBot.OnOffActionToTarget(pButton, "co +shadow debuff,?", "co -shadow debuff,?", pButton.getName())) then
112 | pButton.getButton("ShadowDebuff").setEnable()
113 | else
114 | pButton.getButton("ShadowDebuff").setDisable()
115 | end
116 | end
117 |
118 | --tFrame.addButton("DpsAoe", 0, 52, "spell_holy_surgeoflight", MultiBot.tips.priest.dps.dpsAoe).setDisable()
119 | dpsControlFrame.addButton("DpsAoe", 0, 52, "spell_holy_surgeoflight", MultiBot.tips.priest.dps.dpsAoe).setDisable()
120 | .doLeft = function(pButton)
121 | if(MultiBot.OnOffActionToTarget(pButton, "co +dps aoe,?", "co -dps aoe,?", pButton.getName())) then
122 | pButton.getButton("TankAssist").setDisable()
123 | pButton.getButton("DpsAssist").setDisable()
124 | end
125 | end
126 |
127 | --tFrame.addButton("Dps", 0, 78, "spell_holy_divinepurpose", MultiBot.tips.priest.dps.dps).setDisable()
128 | dpsControlFrame.addButton("Dps", 0, 78, "spell_holy_divinepurpose", MultiBot.tips.priest.dps.dps).setDisable()
129 | .doLeft = function(pButton)
130 | if(MultiBot.OnOffActionToTarget(pButton, "co +shadow,?", "co -shadow,?", pButton.getName())) then
131 | pButton.getButton("Shadow").setEnable()
132 | pButton.getButton("Heal").setDisable()
133 | else
134 | pButton.getButton("Shadow").setDisable()
135 | end
136 | end
137 |
138 | -- ASSIST --
139 |
140 | pFrame.addButton("TankAssist", -120, 0, "ability_warrior_innerrage", MultiBot.tips.priest.tankAssist).setDisable()
141 | .doLeft = function(pButton)
142 | if(MultiBot.OnOffActionToTarget(pButton, "co +tank assist,?", "co -tank assist,?", pButton.getName())) then
143 | pButton.getButton("DpsAssist").setDisable()
144 | pButton.getButton("DpsAoe").setDisable()
145 | end
146 | end
147 |
148 | -- STRATEGIES --
149 |
150 | if(MultiBot.isInside(pCombat, "heal")) then pFrame.getButton("Heal").setEnable() end
151 | if(MultiBot.isInside(pNormal, "buff,")) then pFrame.getButton("Buff").setEnable() end
152 | if(MultiBot.isInside(pCombat, "shadow debuff")) then pFrame.getButton("ShadowDebuff").setEnable() end
153 | if(MultiBot.isInside(pCombat, "shadow aoe")) then pFrame.getButton("ShadowAoe").setEnable() end
154 | if(MultiBot.isInside(pCombat, "holy heal")) then pFrame.getButton("HolyHeal").setEnable() end
155 | if(MultiBot.isInside(pCombat, "holy dps")) then pFrame.getButton("HolyDps").setEnable() end
156 | if(MultiBot.isInside(pCombat, "shadow,")) then pFrame.getButton("Shadow").setEnable() end
157 | if(MultiBot.isInside(pCombat, "healer dps")) then pFrame.getButton("DpsAssist").setEnable() end
158 | if(MultiBot.isInside(pCombat, "shadow debuff")) then pFrame.getButton("DpsDebuff").setEnable() end
159 | if(MultiBot.isInside(pCombat, "dps aoe")) then pFrame.getButton("DpsAoe").setEnable() end
160 | if(MultiBot.isInside(pCombat, "shadow,")) then pFrame.getButton("Shadow").setEnable() end
161 | if(MultiBot.isInside(pCombat, "tank assist")) then pFrame.getButton("TankAssist").setEnable() end
162 | if(MultiBot.isInside(pNormal, "rshadow")) then pFrame.getButton("ShadowRes").setEnable() end
163 | end
--------------------------------------------------------------------------------
/Strategies/MultiBotShaman.lua:
--------------------------------------------------------------------------------
1 | MultiBot.addShaman = function(pFrame, pCombat, pNormal)
2 | pFrame.addButton("Heal", 0, 0, "spell_holy_aspiration", MultiBot.tips.shaman.heal).setDisable()
3 | .doLeft = function(pButton)
4 | if(MultiBot.OnOffActionToTarget(pButton, "co +heal,?", "co -heal,?", pButton.getName())) then
5 | pButton.getButton("Caster").setDisable()
6 | pButton.getButton("Melee").setDisable()
7 | end
8 | end
9 |
10 | -- NON-COMBAT-TOTEM --
11 |
12 | local nonCombatTotemButton = pFrame.addButton(
13 | "NonCombatTotem", -30, 0, "spell_nature_manaregentotem",
14 | MultiBot.tips.shaman.ntotem.master
15 | )
16 | nonCombatTotemButton.doLeft = function(pButton)
17 | MultiBot.ShowHideSwitch(pButton.parent.frames["NonCombatTotem"])
18 | end
19 |
20 | local nonCombatTotemFrame = pFrame.addFrame("NonCombatTotem", -32, 30)
21 | nonCombatTotemFrame:Hide()
22 |
23 | nonCombatTotemFrame.addButton(
24 | "NonCombatMana", 0, 0, "spell_nature_manaregentotem",
25 | MultiBot.tips.shaman.ntotem.bmana
26 | )
27 | .doLeft = function(pButton)
28 | MultiBot.SelectToTarget(pButton.get(), "NonCombatTotem", pButton.texture, "nc +bmana,?", pButton.getName())
29 | pButton.getButton("NonCombatTotem").doRight = function(btn)
30 | MultiBot.OnOffActionToTarget(btn, "nc +bmana,?", "nc -bmana,?", btn.getName())
31 | end
32 | end
33 |
34 | nonCombatTotemFrame.addButton(
35 | "NonCombatDps", 0, 26, "spell_nature_windfury",
36 | MultiBot.tips.shaman.ntotem.bdps
37 | )
38 | .doLeft = function(pButton)
39 | MultiBot.SelectToTarget(pButton.get(), "NonCombatTotem", pButton.texture, "nc +bdps,?", pButton.getName())
40 | pButton.getButton("NonCombatTotem").doRight = function(btn)
41 | MultiBot.OnOffActionToTarget(btn, "nc +bdps,?", "nc -bdps,?", btn.getName())
42 | end
43 | end
44 |
45 | -- STRATEGIES:NON-COMBAT-TOTEM --
46 |
47 | if(MultiBot.isInside(pNormal, "bmana")) then
48 | nonCombatTotemButton.setTexture("spell_nature_manaregentotem").setEnable().doRight = function(pButton)
49 | MultiBot.OnOffActionToTarget(pButton, "nc +bmana,?", "nc -bmana,?", pButton.getName())
50 | end
51 | elseif(MultiBot.isInside(pNormal, "bdps")) then
52 | nonCombatTotemButton.setTexture("spell_nature_windfury").setEnable().doRight = function(pButton)
53 | MultiBot.OnOffActionToTarget(pButton, "nc +bdps,?", "nc -bdps,?", pButton.getName())
54 | end
55 | end
56 |
57 | -- COMBAT-TOTEM --
58 |
59 | local combatTotemButton = pFrame.addButton(
60 | "CombatTotem", -60, 0, "spell_nature_manaregentotem",
61 | MultiBot.tips.shaman.ctotem.master
62 | )
63 | combatTotemButton.doLeft = function(pButton)
64 | MultiBot.ShowHideSwitch(pButton.parent.frames["CombatTotem"])
65 | end
66 |
67 | local combatTotemFrame = pFrame.addFrame("CombatTotem", -62, 30)
68 | combatTotemFrame:Hide()
69 |
70 | combatTotemFrame.addButton(
71 | "CombatMana", 0, 0, "spell_nature_manaregentotem",
72 | MultiBot.tips.shaman.ctotem.bmana
73 | )
74 | .doLeft = function(pButton)
75 | MultiBot.SelectToTarget(pButton.get(), "CombatTotem", pButton.texture, "co +bmana,?", pButton.getName())
76 | pButton.getButton("CombatTotem").doRight = function(btn)
77 | MultiBot.OnOffActionToTarget(btn, "co +bmana,?", "co -bmana,?", btn.getName())
78 | end
79 | end
80 |
81 | combatTotemFrame.addButton(
82 | "CombatDps", 0, 26, "spell_nature_windfury",
83 | MultiBot.tips.shaman.ctotem.bdps
84 | )
85 | .doLeft = function(pButton)
86 | MultiBot.SelectToTarget(pButton.get(), "CombatTotem", pButton.texture, "co +bdps,?", pButton.getName())
87 | pButton.getButton("CombatTotem").doRight = function(btn)
88 | MultiBot.OnOffActionToTarget(btn, "co +bdps,?", "co -bdps,?", btn.getName())
89 | end
90 | end
91 |
92 | -- STRATEGIES:COMBAT-TOTEM --
93 |
94 | if(MultiBot.isInside(pCombat, "bmana")) then
95 | combatTotemButton.setTexture("spell_nature_manaregentotem").setEnable().doRight = function(pButton)
96 | MultiBot.OnOffActionToTarget(pButton, "co +bmana,?", "co -bmana,?", pButton.getName())
97 | end
98 | elseif(MultiBot.isInside(pCombat, "bdps")) then
99 | combatTotemButton.setTexture("spell_nature_windfury").setEnable().doRight = function(pButton)
100 | MultiBot.OnOffActionToTarget(pButton, "co +bdps,?", "co -bdps,?", pButton.getName())
101 | end
102 | end
103 |
104 | -- PLAYBOOK --
105 |
106 | pFrame.addButton("Playbook", -90, 0, "inv_misc_book_06", MultiBot.tips.shaman.playbook.master)
107 | .doLeft = function(pButton)
108 | MultiBot.ShowHideSwitch(pButton.getFrame("Playbook"))
109 | end
110 |
111 | local playbookFrame = pFrame.addFrame("Playbook", -92, 30)
112 | playbookFrame:Hide()
113 |
114 | playbookFrame.addButton(
115 | "Totems", 0, 0, "inv_relics_totemofrebirth",
116 | MultiBot.tips.shaman.playbook.totems
117 | ).setDisable()
118 | .doLeft = function(pButton)
119 | MultiBot.OnOffActionToTarget(pButton, "co +totems,?", "co -totems,?", pButton.getName())
120 | end
121 |
122 | playbookFrame.addButton(
123 | "CasterAoe", 0, 26, "spell_nature_lightningoverload",
124 | MultiBot.tips.shaman.playbook.casterAoe
125 | ).setDisable()
126 | .doLeft = function(pButton)
127 | MultiBot.OnOffActionToTarget(pButton, "co +caster aoe,?", "co -caster aoe,?", pButton.getName())
128 | end
129 |
130 | playbookFrame.addButton("Caster", 0, 52, "spell_nature_lightning", MultiBot.tips.shaman.playbook.caster).setDisable()
131 | .doLeft = function(pButton)
132 | if(MultiBot.OnOffActionToTarget(pButton, "co +caster,?", "co -caster,?", pButton.getName())) then
133 | pButton.getButton("Melee").setDisable()
134 | pButton.getButton("Heal").setDisable()
135 | end
136 | end
137 |
138 | playbookFrame.addButton(
139 | "MeleeAoe", 0, 78, "ability_warrior_shockwave",
140 | MultiBot.tips.shaman.playbook.meleeAoe
141 | ).setDisable()
142 | .doLeft = function(pButton)
143 | MultiBot.OnOffActionToTarget(pButton, "co +melee aoe,?", "co -melee aoe,?", pButton.getName())
144 | end
145 |
146 | playbookFrame.addButton("Melee", 0, 104, "ability_parry", MultiBot.tips.shaman.playbook.melee).setDisable()
147 | .doLeft = function(pButton)
148 | if(MultiBot.OnOffActionToTarget(pButton, "co +melee,?", "co -melee,?", pButton.getName())) then
149 | pButton.getButton("Caster").setDisable()
150 | pButton.getButton("Heal").setDisable()
151 | end
152 | end
153 |
154 | -- UTILITAIRE : CURE --
155 | pFrame.addButton("Cure", -180, 0, "Ability_Creature_Poison_02", MultiBot.tips.shaman.playbook.cure).setDisable()
156 | .doLeft = function(pButton)
157 | MultiBot.OnOffActionToTarget(pButton, "co +cure,?", "co -cure,?", pButton.getName())
158 | end
159 |
160 | -- STRATEGIES:PLAYBOOK --
161 |
162 | if(MultiBot.isInside(pCombat, "heal")) then pFrame.getButton("Heal").setEnable() end
163 | if(MultiBot.isInside(pCombat, "melee,")) then pFrame.getButton("Melee").setEnable() end
164 | if(MultiBot.isInside(pCombat, "totems")) then pFrame.getButton("Totems").setEnable() end
165 | if(MultiBot.isInside(pCombat, "caster,")) then pFrame.getButton("Caster").setEnable() end
166 | if(MultiBot.isInside(pCombat, "melee aoe")) then pFrame.getButton("MeleeAoe").setEnable() end
167 | if(MultiBot.isInside(pCombat, "caster aoe")) then pFrame.getButton("CasterAoe").setEnable() end
168 | if(MultiBot.isInside(pCombat, "cure")) then pFrame.getButton("Cure").setEnable() end
169 |
170 | -- DPS --
171 |
172 | pFrame.addButton("DpsControl", -120, 0, "ability_warrior_challange", MultiBot.tips.shaman.dps.master)
173 | .doLeft = function(pButton)
174 | MultiBot.ShowHideSwitch(pButton.getFrame("DpsControl"))
175 | end
176 |
177 | local dpsControlFrame = pFrame.addFrame("DpsControl", -122, 30)
178 | dpsControlFrame:Hide()
179 |
180 | dpsControlFrame.addButton("DpsAssist", 0, 0, "spell_holy_heroism", MultiBot.tips.shaman.dps.dpsAssist).setDisable()
181 | .doLeft = function(pButton)
182 | if(MultiBot.OnOffActionToTarget(pButton, "co +dps assist,?", "co -dps assist,?", pButton.getName())) then
183 | pButton.getButton("TankAssist").setDisable()
184 | pButton.getButton("DpsAoe").setDisable()
185 | end
186 | end
187 |
188 | dpsControlFrame.addButton("DpsAoe", 0, 26, "spell_holy_surgeoflight", MultiBot.tips.shaman.dps.dpsAoe).setDisable()
189 | .doLeft = function(pButton)
190 | if(MultiBot.OnOffActionToTarget(pButton, "co +dps aoe,?", "co -dps aoe,?", pButton.getName())) then
191 | pButton.getButton("TankAssist").setDisable()
192 | pButton.getButton("DpsAssist").setDisable()
193 | end
194 | end
195 |
196 | -- HEALER DPS --
197 | dpsControlFrame.addButton("HealerDps", 0, 52, "INV_Alchemy_Elixir_02", MultiBot.tips.shaman.dps.healerdps).setDisable()
198 | .doLeft = function(pButton)
199 | if(MultiBot.OnOffActionToTarget(pButton, "co +healer dps,?", "co -healer dps,?", pButton.getName())) then
200 | pButton.getButton("TankAssist").setDisable()
201 | pButton.getButton("DpsAoe").setDisable()
202 | pButton.getButton("DpsAssist").setDisable()
203 | end
204 | end
205 |
206 | -- ASSIST --
207 |
208 | pFrame.addButton("TankAssist", -150, 0, "ability_warrior_innerrage", MultiBot.tips.shaman.tankAssist).setDisable()
209 | .doLeft = function(pButton)
210 | if(MultiBot.OnOffActionToTarget(pButton, "co +tank assist,?", "co -tank assist,?", pButton.getName())) then
211 | pButton.getButton("DpsAssist").setDisable()
212 | pButton.getButton("DpsAoe").setDisable()
213 | end
214 | end
215 |
216 | -- STRATEGIES --
217 |
218 | if(MultiBot.isInside(pCombat, "dps aoe")) then pFrame.getButton("DpsAoe").setEnable() end
219 | if(MultiBot.isInside(pCombat, "dps assist")) then pFrame.getButton("DpsAssist").setEnable() end
220 | if(MultiBot.isInside(pCombat, "healer dps")) then pFrame.getButton("HealerDps").setEnable() end
221 | if(MultiBot.isInside(pCombat, "tank assist")) then pFrame.getButton("TankAssist").setEnable() end
222 |
223 | end
--------------------------------------------------------------------------------
/Strategies/MultiBotMage.lua:
--------------------------------------------------------------------------------
1 | MultiBot.addMage = function(pFrame, pCombat, pNormal)
2 | local tButton = pFrame.addButton("Buff", 0, 0, "inv_elemental_primal_mana", MultiBot.tips.mage.buff.master)
3 | tButton.doLeft = function(pButton)
4 | MultiBot.ShowHideSwitch(pButton.parent.frames["Buff"])
5 | end
6 |
7 | --local tFrame = pFrame.addFrame("Buff", -2, 30)
8 | --tFrame:Hide()
9 |
10 | --tFrame.addButton("NonCombatMana", 0, 0, "inv_elemental_primal_mana", MultiBot.tips.mage.buff.bmana)
11 |
12 | local buffFrame = pFrame.addFrame("Buff", -2, 30)
13 | buffFrame:Hide()
14 |
15 | buffFrame.addButton("NonCombatMana", 0, 0, "inv_elemental_primal_mana", MultiBot.tips.mage.buff.bmana)
16 | .doLeft = function(pButton)
17 | MultiBot.SelectToTarget(pButton.get(), "Buff", pButton.texture, "nc +bmana,?", pButton.getName())
18 | --pButton.getButton("Buff").doRight = function(pButton)
19 | --MultiBot.OnOffActionToTarget(pButton, "nc +bmana,?", "nc -bmana,?", pButton.getName())
20 | pButton.getButton("Buff").doRight = function(btn)
21 | MultiBot.OnOffActionToTarget(btn, "nc +bmana,?", "nc -bmana,?", btn.getName())
22 | end
23 | end
24 |
25 | -- tFrame.addButton("NonCombatDps", 0, 26, "inv_elemental_primal_nether", MultiBot.tips.mage.buff.bdps)
26 |
27 | buffFrame.addButton("NonCombatDps", 0, 26, "inv_elemental_primal_nether", MultiBot.tips.mage.buff.bdps)
28 | .doLeft = function(pButton)
29 | MultiBot.SelectToTarget(pButton.get(), "Buff", pButton.texture, "nc +bdps,?", pButton.getName())
30 | --pButton.getButton("Buff").doRight = function(pButton)
31 | --MultiBot.OnOffActionToTarget(pButton, "nc +bdps,?", "nc -bdps,?", pButton.getName())
32 | pButton.getButton("Buff").doRight = function(btn)
33 | MultiBot.OnOffActionToTarget(btn, "nc +bdps,?", "nc -bdps,?", btn.getName())
34 | end
35 | end
36 |
37 | -- STRATEGIES:BUFF --
38 |
39 | if(MultiBot.isInside(pNormal, "bmana")) then
40 | tButton.setTexture("inv_elemental_primal_mana").setEnable().doRight = function(pButton)
41 | MultiBot.OnOffActionToTarget(pButton, "nc +bmana,?", "nc -bmana,?", pButton.getName())
42 | end
43 | elseif(MultiBot.isInside(pNormal, "bdps")) then
44 | tButton.setTexture("inv_elemental_primal_nether").setEnable().doRight = function(pButton)
45 | MultiBot.OnOffActionToTarget(pButton, "nc +bdps,?", "nc -bdps,?", pButton.getName())
46 | end
47 | end
48 |
49 | -- PLAYBOOK --
50 |
51 | --pFrame.addButton("Playbook", -30, 0, "inv_misc_book_06", MultiBot.tips.mage.playbook.master)
52 | --.doLeft = function(pButton)
53 | --MultiBot.ShowHideSwitch(pButton.getFrame("Playbook"))
54 | --end
55 |
56 | --tFrame = pFrame.addFrame("Playbook", -32, 30)
57 | --tFrame:Hide()
58 |
59 | --tFrame.addButton("ArcaneAoe", 0, 0, "spell_arcane_starfire", MultiBot.tips.mage.playbook.arcaneAoe).setDisable()
60 |
61 | pFrame.addButton("Playbook", -30, 0, "inv_misc_book_06", MultiBot.tips.mage.playbook.master)
62 | .doLeft = function(pButton)
63 | MultiBot.ShowHideSwitch(pButton.getFrame("Playbook"))
64 | end
65 |
66 | local playbookFrame = pFrame.addFrame("Playbook", -32, 30)
67 | playbookFrame:Hide()
68 |
69 | playbookFrame.addButton("ArcaneAoe", 0, 0, "spell_arcane_starfire", MultiBot.tips.mage.playbook.arcaneAoe).setDisable()
70 | .doLeft = function(pButton)
71 | MultiBot.OnOffActionToTarget(pButton, "co +arcane aoe,?", "co -arcane aoe,?", pButton.getName())
72 | end
73 |
74 | --tFrame.addButton("Arcane", 0, 26, "ability_mage_arcanebarrage", MultiBot.tips.mage.playbook.arcane).setDisable()
75 | playbookFrame.addButton("Arcane", 0, 26, "ability_mage_arcanebarrage", MultiBot.tips.mage.playbook.arcane).setDisable()
76 | .doLeft = function(pButton)
77 | if(MultiBot.OnOffActionToTarget(pButton, "co +arcane,?", "co -arcane,?", pButton.getName())) then
78 | pButton.getButton("Frost").setDisable()
79 | pButton.getButton("Fire").setDisable()
80 | end
81 | end
82 |
83 | --tFrame.addButton("FrostAoe", 0, 52, "spell_frost_freezingbreath", MultiBot.tips.mage.playbook.frostAoe).setDisable()
84 | playbookFrame.addButton("FrostAoe", 0, 52, "spell_frost_freezingbreath", MultiBot.tips.mage.playbook.frostAoe).setDisable()
85 | .doLeft = function(pButton)
86 | MultiBot.OnOffActionToTarget(pButton, "co +frost aoe,?", "co -frost aoe,?", pButton.getName())
87 | end
88 |
89 | -- tFrame.addButton("Frost", 0, 78, "spell_frost_frostbolt02", MultiBot.tips.mage.playbook.frost).setDisable()
90 | playbookFrame.addButton("Frost", 0, 78, "spell_frost_frostbolt02", MultiBot.tips.mage.playbook.frost).setDisable()
91 | .doLeft = function(pButton)
92 | if(MultiBot.OnOffActionToTarget(pButton, "co +frost,?", "co -frost,?", pButton.getName())) then
93 | pButton.getButton("Arcane").setDisable()
94 | pButton.getButton("Fire").setDisable()
95 | end
96 | end
97 |
98 | --tFrame.addButton("FireAoe", 0, 104, "spell_shadow_rainoffire", MultiBot.tips.mage.playbook.fireAoe).setDisable()
99 | playbookFrame.addButton("FireAoe", 0, 104, "spell_shadow_rainoffire", MultiBot.tips.mage.playbook.fireAoe).setDisable()
100 | .doLeft = function(pButton)
101 | MultiBot.OnOffActionToTarget(pButton, "co +fire aoe,?", "co -fire aoe,?", pButton.getName())
102 | end
103 |
104 | --tFrame.addButton("Fire", 0, 130, "spell_fire_fireball02", MultiBot.tips.mage.playbook.fire).setDisable()
105 | playbookFrame.addButton("Fire", 0, 130, "spell_fire_fireball02", MultiBot.tips.mage.playbook.fire).setDisable()
106 | .doLeft = function(pButton)
107 | if(MultiBot.OnOffActionToTarget(pButton, "co +fire,?", "co -fire,?", pButton.getName())) then
108 | pButton.getButton("Arcane").setDisable()
109 | pButton.getButton("Frost").setDisable()
110 | end
111 | end
112 | -- missing Frostfire & Firestarter --
113 | --tFrame.addButton("FrostFireAoe", 0, 156, "ability_mage_frostfirebolt", MultiBot.tips.mage.playbook.frostfireAoe).setDisable()
114 | playbookFrame.addButton("FrostFireAoe", 0, 156, "ability_mage_frostfirebolt", MultiBot.tips.mage.playbook.frostfireAoe).setDisable()
115 | .doLeft = function(pButton)
116 | MultiBot.OnOffActionToTarget(pButton, "co +frostfire aoe,?", "co -frostfire aoe,?", pButton.getName())
117 | end
118 |
119 | --tFrame.addButton("FrostFire", 0, 182, "ability_mage_frostfirebolt", MultiBot.tips.mage.playbook.frostfire).setDisable()
120 | playbookFrame.addButton("FrostFire", 0, 182, "ability_mage_frostfirebolt", MultiBot.tips.mage.playbook.frostfire).setDisable()
121 | .doLeft = function(pButton)
122 | if(MultiBot.OnOffActionToTarget(pButton, "co +frostfire,?", "co -frostfire,?", pButton.getName())) then
123 | pButton.getButton("Arcane").setDisable()
124 | pButton.getButton("Frost").setDisable()
125 | pButton.getButton("Fire").setDisable()
126 | end
127 | end
128 |
129 | --tFrame.addButton("Firestarter", 0, 208, "ability_mage_firestarter", MultiBot.tips.mage.playbook.firestarter).setDisable()
130 | playbookFrame.addButton("Firestarter", 0, 208, "ability_mage_firestarter", MultiBot.tips.mage.playbook.firestarter).setDisable()
131 | .doLeft = function(pButton)
132 | MultiBot.OnOffActionToTarget(pButton, "co +firestarter,?", "co -firestarter,?", pButton.getName())
133 | end
134 |
135 | -- STRATEGIES:PLAYBOOK --
136 |
137 | if(MultiBot.isInside(pCombat, "arcane aoe")) then pFrame.getButton("ArcaneAoe").setEnable() end
138 | if(MultiBot.isInside(pCombat, "arcane,")) then pFrame.getButton("Arcane").setEnable() end
139 | if(MultiBot.isInside(pCombat, "frost aoe")) then pFrame.getButton("FrostAoe").setEnable() end
140 | if(MultiBot.isInside(pCombat, "frost,")) then pFrame.getButton("Frost").setEnable() end
141 | if(MultiBot.isInside(pCombat, "fire aoe")) then pFrame.getButton("FireAoe").setEnable() end
142 | if(MultiBot.isInside(pCombat, "fire,")) then pFrame.getButton("Fire").setEnable() end
143 | if(MultiBot.isInside(pCombat, "frostfire aoe")) then pFrame.getButton("FrostFireAoe").setEnable() end
144 | if(MultiBot.isInside(pCombat, "frostfire,")) then pFrame.getButton("FrostFire").setEnable() end
145 | if(MultiBot.isInside(pCombat, "firestarter")) then pFrame.getButton("Firestarter").setEnable() end
146 |
147 | -- DPS --
148 |
149 | --pFrame.addButton("DpsControl", -60, 0, "ability_warrior_challange", MultiBot.tips.mage.dps.master)
150 | --.doLeft = function(pButton)
151 | --MultiBot.ShowHideSwitch(pButton.getFrame("DpsControl"))
152 | --end
153 |
154 | --local tFrame = pFrame.addFrame("DpsControl", -62, 30)
155 | --tFrame:Hide()
156 |
157 | --tFrame.addButton("DpsAssist", 0, 0, "spell_holy_heroism", MultiBot.tips.mage.dps.dpsAssist).setDisable()
158 |
159 | pFrame.addButton("DpsControl", -60, 0, "ability_warrior_challange", MultiBot.tips.mage.dps.master)
160 | .doLeft = function(pButton)
161 | MultiBot.ShowHideSwitch(pButton.getFrame("DpsControl"))
162 | end
163 |
164 | local dpsControlFrame = pFrame.addFrame("DpsControl", -62, 30)
165 | dpsControlFrame:Hide()
166 |
167 | dpsControlFrame.addButton("DpsAssist", 0, 0, "spell_holy_heroism", MultiBot.tips.mage.dps.dpsAssist).setDisable()
168 | .doLeft = function(pButton)
169 | if(MultiBot.OnOffActionToTarget(pButton, "co +dps assist,?", "co -dps assist,?", pButton.getName())) then
170 | pButton.getButton("TankAssist").setDisable()
171 | pButton.getButton("DpsAoe").setDisable()
172 | end
173 | end
174 |
175 | --tFrame.addButton("DpsAoe", 0, 26, "spell_holy_surgeoflight", MultiBot.tips.mage.dps.dpsAoe).setDisable()
176 | dpsControlFrame.addButton("DpsAoe", 0, 26, "spell_holy_surgeoflight", MultiBot.tips.mage.dps.dpsAoe).setDisable()
177 | .doLeft = function(pButton)
178 | if(MultiBot.OnOffActionToTarget(pButton, "co +dps aoe,?", "co -dps aoe,?", pButton.getName())) then
179 | pButton.getButton("TankAssist").setDisable()
180 | pButton.getButton("DpsAssist").setDisable()
181 | end
182 | end
183 |
184 | -- ASSIST --
185 |
186 | pFrame.addButton("TankAssist", -90, 0, "ability_warrior_innerrage", MultiBot.tips.mage.tankAssist).setDisable()
187 | .doLeft = function(pButton)
188 | if(MultiBot.OnOffActionToTarget(pButton, "co +tank assist,?", "co -tank assist,?", pButton.getName())) then
189 | pButton.getButton("DpsAssist").setDisable()
190 | pButton.getButton("DpsAoe").setDisable()
191 | end
192 | end
193 |
194 | -- STRATEGIES --
195 |
196 | if(MultiBot.isInside(pCombat, "dps aoe")) then pFrame.getButton("DpsAoe").setEnable() end
197 | if(MultiBot.isInside(pCombat, "dps assist")) then pFrame.getButton("DpsAssist").setEnable() end
198 | if(MultiBot.isInside(pCombat, "tank assist")) then pFrame.getButton("TankAssist").setEnable() end
199 | end
--------------------------------------------------------------------------------
/Strategies/MultiBotDruid.lua:
--------------------------------------------------------------------------------
1 | MultiBot.addDruid = function(pFrame, pCombat, pNormal)
2 | pFrame.addButton("Heal", 0, 0, "spell_holy_aspiration", MultiBot.tips.druid.heal).setDisable()
3 | .doLeft = function(pButton)
4 | if(MultiBot.OnOffActionToTarget(pButton, "co +heal,?", "co -heal,?", pButton.getName())) then
5 | pButton.getButton("Caster").setDisable()
6 | pButton.getButton("Tank").setDisable()
7 | pButton.getButton("Bear").setDisable()
8 | pButton.getButton("Cat").setDisable()
9 | pButton.getButton("Dps").setDisable()
10 | pButton.getButton("HealerDps").setDisable()
11 | end
12 | end
13 |
14 | -- BUFF --
15 |
16 | pFrame.addButton("Buff", -30, 0, "spell_holy_power", MultiBot.tips.druid.buff).setDisable()
17 | .doLeft = function(pButton)
18 | MultiBot.OnOffActionToTarget(pButton, "nc +buff,?", "nc -buff,?", pButton.getName())
19 | end
20 |
21 | -- PLAYBOOK --
22 |
23 | pFrame.addButton("Playbook", -60, 0, "inv_misc_book_06", MultiBot.tips.druid.playbook.master)
24 | .doLeft = function(pButton)
25 | MultiBot.ShowHideSwitch(pButton.getFrame("Playbook"))
26 | end
27 |
28 | local tFrame = pFrame.addFrame("Playbook", -62, 30)
29 | tFrame:Hide()
30 |
31 | tFrame.addButton("CasterDebuff", 0, 0, "ability_druid_cower", MultiBot.tips.druid.playbook.casterDebuff).setDisable()
32 | .doLeft = function(pButton)
33 | if(MultiBot.OnOffActionToTarget(pButton, "co +caster debuff,?", "co -caster debuff,?", pButton.getName())) then
34 | pButton.getButton("DpsDebuff").setEnable()
35 | else
36 | pButton.getButton("DpsDebuff").setDisable()
37 | end
38 | end
39 |
40 | tFrame.addButton("CasterAoe", 0, 26, "spell_arcane_starfire", MultiBot.tips.druid.playbook.casterAoe).setDisable()
41 | .doLeft = function(pButton)
42 | MultiBot.OnOffActionToTarget(pButton, "co +caster aoe,?", "co -caster aoe,?", pButton.getName())
43 | end
44 |
45 | tFrame.addButton("Caster", 0, 52, "spell_nature_starfall", MultiBot.tips.druid.playbook.caster).setDisable()
46 | .doLeft = function(pButton)
47 | if(MultiBot.OnOffActionToTarget(pButton, "co +caster,?", "co -caster,?", pButton.getName())) then
48 | pButton.getButton("Heal").setDisable()
49 | pButton.getButton("Tank").setDisable()
50 | pButton.getButton("Bear").setDisable()
51 | pButton.getButton("Cat").setDisable()
52 | pButton.getButton("Dps").setDisable()
53 | end
54 | end
55 |
56 | tFrame.addButton("CatAoe", 0, 78, "ability_druid_bash", MultiBot.tips.druid.playbook.catAoe).setDisable()
57 | .doLeft = function(pButton)
58 | MultiBot.OnOffActionToTarget(pButton, "co +cat aoe,?", "co -cat aoe,?", pButton.getName())
59 | end
60 |
61 | tFrame.addButton("Cat", 0, 104, "ability_druid_catform", MultiBot.tips.druid.playbook.cat).setDisable()
62 | .doLeft = function(pButton)
63 | if(MultiBot.OnOffActionToTarget(pButton, "co +cat,?", "co -cat,?", pButton.getName())) then
64 | pButton.getButton("Caster").setDisable()
65 | pButton.getButton("Heal").setDisable()
66 | pButton.getButton("Tank").setDisable()
67 | pButton.getButton("Bear").setDisable()
68 | pButton.getButton("Dps").setEnable()
69 | else
70 | pButton.getButton("Dps").setDisable()
71 | end
72 | end
73 |
74 | tFrame.addButton("Bear", 0, 130, "ability_racial_bearform", MultiBot.tips.druid.playbook.bear).setDisable()
75 | .doLeft = function(pButton)
76 | if(MultiBot.OnOffActionToTarget(pButton, "co +bear,?", "co -bear,?", pButton.getName())) then
77 | pButton.getButton("Caster").setDisable()
78 | pButton.getButton("Heal").setDisable()
79 | pButton.getButton("Cat").setDisable()
80 | pButton.getButton("Dps").setDisable()
81 | pButton.getButton("Tank").setEnable()
82 | else
83 | pButton.getButton("Tank").setDisable()
84 | end
85 | end
86 |
87 | -- Missin MELEE --
88 | tFrame.addButton("Melee", 0, 156, "ability_parry", MultiBot.tips.druid.playbook.melee).setDisable()
89 | .doLeft = function(pButton)
90 | if(MultiBot.OnOffActionToTarget(pButton, "co +melee,?", "co -melee,?", pButton.getName())) then
91 | pButton.getButton("Caster").setDisable()
92 | pButton.getButton("Heal").setDisable()
93 | end
94 | end
95 |
96 | -- DPS --
97 |
98 | pFrame.addButton("DpsControl", -90, 0, "ability_warrior_challange", MultiBot.tips.druid.dps.master)
99 | .doLeft = function(pButton)
100 | MultiBot.ShowHideSwitch(pButton.getFrame("DpsControl"))
101 | end
102 |
103 | --local tFrame = pFrame.addFrame("DpsControl", -92, 30)
104 | --tFrame:Hide()
105 |
106 | local tDpsFrame = pFrame.addFrame("DpsControl", -92, 30)
107 | tDpsFrame:Hide()
108 |
109 | --tFrame.addButton("DpsAssist", 0, 0, "spell_holy_heroism", MultiBot.tips.druid.dps.dpsAssist).setDisable()
110 | tDpsFrame.addButton("DpsAssist", 0, 0, "spell_holy_heroism", MultiBot.tips.druid.dps.dpsAssist).setDisable()
111 | .doLeft = function(pButton)
112 | if(MultiBot.OnOffActionToTarget(pButton, "co +dps assist,?", "co -dps assist,?", pButton.getName())) then
113 | pButton.getButton("TankAssist").setDisable()
114 | pButton.getButton("DpsAoe").setDisable()
115 | end
116 | end
117 |
118 | --tFrame.addButton("DpsDebuff", 0, 26, "spell_holy_restoration", MultiBot.tips.druid.dps.dpsDebuff).setDisable()
119 | tDpsFrame.addButton("DpsDebuff", 0, 26, "spell_holy_restoration", MultiBot.tips.druid.dps.dpsDebuff).setDisable()
120 | .doLeft = function(pButton)
121 | if(MultiBot.OnOffActionToTarget(pButton, "co +caster debuff,?", "co -caster debuff,?", pButton.getName())) then
122 | pButton.getButton("CasterDebuff").setEnable()
123 | else
124 | pButton.getButton("CasterDebuff").setDisable()
125 | end
126 | end
127 |
128 | -- tFrame.addButton("DpsAoe", 0, 52, "spell_holy_surgeoflight", MultiBot.tips.druid.dps.dpsAoe).setDisable()
129 | tDpsFrame.addButton("DpsAoe", 0, 52, "spell_holy_surgeoflight", MultiBot.tips.druid.dps.dpsAoe).setDisable()
130 | .doLeft = function(pButton)
131 | if(MultiBot.OnOffActionToTarget(pButton, "co +dps aoe,?", "co -dps aoe,?", pButton.getName())) then
132 | pButton.getButton("TankAssist").setDisable()
133 | pButton.getButton("DpsAssist").setDisable()
134 | end
135 | end
136 |
137 | -- Missing HEALER DPS --
138 | --tFrame.addButton("HealerDps", 0, 130, "INV_Alchemy_Elixir_02", MultiBot.tips.druid.dps.healerdps).setDisable()
139 | tDpsFrame.addButton("HealerDps", 0, 130, "INV_Alchemy_Elixir_02", MultiBot.tips.druid.dps.healerdps).setDisable()
140 | .doLeft = function(pButton)
141 | if(MultiBot.OnOffActionToTarget(pButton, "co +healer dps,?", "co -healer dps,?", pButton.getName())) then
142 | pButton.getButton("Dps").setDisable()
143 | pButton.getButton("OffHeal").setDisable()
144 | pButton.getButton("Heal").setDisable()
145 | end
146 | end
147 |
148 | --tFrame.addButton("Dps", 0, 78, "spell_holy_divinepurpose", MultiBot.tips.druid.dps.dps).setDisable()
149 | tDpsFrame.addButton("Dps", 0, 78, "spell_holy_divinepurpose", MultiBot.tips.druid.dps.dps).setDisable()
150 | .doLeft = function(pButton)
151 | if(MultiBot.OnOffActionToTarget(pButton, "co +cat,?", "co -cat,?", pButton.getName())) then
152 | pButton.getButton("Caster").setDisable()
153 | pButton.getButton("Tank").setDisable()
154 | pButton.getButton("Bear").setDisable()
155 | pButton.getButton("Cat").setEnable()
156 | else
157 | pButton.getButton("Cat").setDisable()
158 | end
159 | end
160 |
161 | -- OFF-HEAL --
162 | --tFrame.addButton("OffHeal", 0, 104, "spell_nature_healingtouch", MultiBot.tips.druid.dps.offheal).setDisable()
163 | tDpsFrame.addButton("OffHeal", 0, 104, "spell_nature_healingtouch", MultiBot.tips.druid.dps.offheal).setDisable()
164 | .doLeft = function(pButton)
165 | if (MultiBot.OnOffActionToTarget(
166 | pButton, "co +offheal,?", "co -offheal,?",
167 | pButton.getName())) then
168 |
169 | -- Modes exclusifs
170 | pButton.getButton("Dps").setDisable()
171 | pButton.getButton("Heal").setDisable()
172 | end
173 | end
174 |
175 | -- ASSIST --
176 |
177 | pFrame.addButton("TankAssist", -120, 0, "ability_warrior_innerrage", MultiBot.tips.druid.tankAssist).setDisable()
178 | .doLeft = function(pButton)
179 | if(MultiBot.OnOffActionToTarget(pButton, "co +tank assist,?", "co -tank assist,?", pButton.getName())) then
180 | pButton.getButton("DpsAssist").setDisable()
181 | pButton.getButton("DpsAoe").setDisable()
182 | end
183 | end
184 |
185 | -- TANK --
186 |
187 | pFrame.addButton("Tank", -150, 0, "ability_warrior_shieldmastery", MultiBot.tips.druid.tank).setDisable()
188 | .doLeft = function(pButton)
189 | if(MultiBot.OnOffActionToTarget(pButton, "co +tank,?", "co -tank,?", pButton.getName())) then
190 | pButton.getButton("Caster").setDisable()
191 | pButton.getButton("Heal").setDisable()
192 | pButton.getButton("Dps").setDisable()
193 | pButton.getButton("Cat").setDisable()
194 | pButton.getButton("Bear").setEnable()
195 | else
196 | pButton.getButton("Bear").setDisable()
197 | end
198 | end
199 |
200 | -- STRATEGIES --
201 |
202 | if(MultiBot.isInside(pCombat, "heal")) then pFrame.getButton("Heal").setEnable() end
203 | if(MultiBot.isInside(pNormal, "buff,")) then pFrame.getButton("Buff").setEnable() end
204 | if(MultiBot.isInside(pCombat, "caster debuff")) then pFrame.getButton("CasterDebuff").setEnable() end
205 | if(MultiBot.isInside(pCombat, "caster aoe")) then pFrame.getButton("CasterAoe").setEnable() end
206 | if(MultiBot.isInside(pCombat, "caster,")) then pFrame.getButton("Caster").setEnable() end
207 | if(MultiBot.isInside(pCombat, "cat aoe")) then pFrame.getButton("CatAoe").setEnable() end
208 | if(MultiBot.isInside(pCombat, "cat,")) then pFrame.getButton("Cat").setEnable() end
209 | if(MultiBot.isInside(pCombat, "bear")) then pFrame.getButton("Bear").setEnable() end
210 | if(MultiBot.isInside(pCombat, "dps assist")) then pFrame.getButton("DpsAssist").setEnable() end
211 | if(MultiBot.isInside(pCombat, "dps aoe")) then pFrame.getButton("DpsAoe").setEnable() end
212 | if(MultiBot.isInside(pCombat, "cat,")) then pFrame.getButton("Dps").setEnable() end
213 | if(MultiBot.isInside(pCombat, "tank assist")) then pFrame.getButton("TankAssist").setEnable() end
214 | if(MultiBot.isInside(pCombat, "bear,")) then pFrame.getButton("Tank").setEnable() end
215 | if(MultiBot.isInside(pCombat, "healer dps")) then pFrame.getButton("HealerDps").setEnable() end
216 | if(MultiBot.isInside(pCombat, "melee")) then pFrame.getButton("Melee").setEnable() end
217 | if(MultiBot.isInside(pCombat, "offheal")) then pFrame.getButton("OffHeal").setEnable() end
218 | end
--------------------------------------------------------------------------------
/Core/MultiBotEvery.lua:
--------------------------------------------------------------------------------
1 | -- Confirmation popup for Autogear
2 | if not StaticPopupDialogs["MULTIBOT_AUTOGEAR_CONFIRM"] then
3 | StaticPopupDialogs["MULTIBOT_AUTOGEAR_CONFIRM"] = {
4 | text = MultiBot.tips.every.autogearpopup,
5 | button1 = ACCEPT,
6 | button2 = CANCEL,
7 | OnAccept = function(self, data)
8 | if data and data.target then
9 | SendChatMessage("autogear", "WHISPER", nil, data.target)
10 | end
11 | end,
12 | timeout = 0,
13 | whileDead = 1,
14 | hideOnEscape = 1,
15 | preferredIndex = 3, -- évite les conflits d’index avec d’autres popups
16 | }
17 | end
18 |
19 | MultiBot.addEvery = function(pFrame, pCombat, pNormal)
20 |
21 | -- MENU MISC --------------------------------------------
22 | -- Crée un sous-frame « Misc » au-dessus du bouton
23 | local tMisc = pFrame.addFrame("Misc", 64, 29)
24 | tMisc:Hide()
25 |
26 | -- Bouton parent « Misc »
27 | local btnMisc = pFrame.addButton("Misc", 64, 0, "inv_misc_enggizmos_swissarmy", MultiBot.tips.every.misc)
28 | btnMisc.doLeft = function(self)
29 | if tMisc:IsShown() then
30 | tMisc:Hide()
31 | else
32 | tMisc:Show()
33 | end
34 | end
35 |
36 | -- local dy = 26
37 | -- local y = 0
38 | -- Texture étoile
39 | local STAR_TEX = "Interface\\TARGETINGFRAME\\UI-RaidTargetingIcon_1"
40 | -- for _, data in ipairs{
41 | local y, dy = 0, 28
42 | -- Buttons inside the "Misc" sub-frame
43 | for _, data in ipairs{
44 | { "Wipe", "Achievement_Halloween_Ghost_01", MultiBot.tips.every.wipe, function(b)
45 | MultiBot.ActionToTarget("wipe", b.getName())
46 | end
47 | },
48 | { "Autogear", "inv_misc_enggizmos_30", MultiBot.tips.every.autogear, function(b)
49 | StaticPopup_Show("MULTIBOT_AUTOGEAR_CONFIRM", b.getName(), nil, { target = b.getName() })
50 | end
51 | },
52 | -- NEW: Favorite toggle (per-character)
53 | -- { "Favorite", "Interface\\RaidFrame\\ReadyCheck-Ready", MultiBot.tips.every.favorite, function(b)
54 | -- Favorite toggle (per-character) - étoile
55 | { "Favorite", STAR_TEX, MultiBot.tips.every.favorite, function(b)
56 | local name = b.getName()
57 | MultiBot.ToggleFavorite(name)
58 | --[[if MultiBot.IsFavorite(name) then
59 | b.icon:SetTexture("Interface\\RaidFrame\\ReadyCheck-NotReady")
60 | else
61 | b.icon:SetTexture("Interface\\RaidFrame\\ReadyCheck-Ready")
62 | end--]]
63 | local tex = b.icon
64 | if tex then
65 | tex:SetTexture(STAR_TEX)
66 | local isFav = MultiBot.IsFavorite(name)
67 | -- Griser l’étoile quand favori, sinon couleur normale
68 | if tex.SetDesaturated then tex:SetDesaturated(isFav) end
69 | if tex.SetVertexColor then
70 | if isFav then tex:SetVertexColor(0.5, 0.5, 0.5) else tex:SetVertexColor(1, 1, 1) end
71 | end
72 | end
73 | -- If the current roster filter is "favorites", refresh the list
74 | local unitsBtn = MultiBot.frames and
75 | MultiBot.frames["MultiBar"] and
76 | MultiBot.frames["MultiBar"].buttons and
77 | MultiBot.frames["MultiBar"].buttons["Units"]
78 | if unitsBtn and unitsBtn.roster == "favorites" then
79 | unitsBtn.doLeft(unitsBtn, "favorites", unitsBtn.filter)
80 | end
81 | end
82 | },
83 | -- NEW PVP tab
84 | { "PvP", "INV_BannerPVP_02", MultiBot.tips and
85 | MultiBot.tips.every and
86 | MultiBot.tips.every.pvp or "Send PvP command to bot",
87 | function(b)
88 | local name = b.getName()
89 | if name then
90 | SendChatMessage("pvp stats", "WHISPER", nil, name)
91 | end
92 | -- Affiche la frame PvP custom si disponible
93 | if MultiBotPVPFrame and MultiBotPVPFrame.Show then
94 | MultiBotPVPFrame:Show()
95 | end
96 | end
97 | },
98 | { "Maintenance", "Achievement_Halloween_Smiley_01", MultiBot.tips.every.maintenance, function(b)
99 | SendChatMessage("maintenance", "WHISPER", nil, b.getName())
100 | end
101 | },
102 | } do
103 | local btn = tMisc.addButton(data[1], 0, y, data[2], data[3])
104 | btn.doLeft = data[4]
105 | y = y + dy
106 | end
107 |
108 |
109 | -- Initialize the Favorite icon to the correct state if this bot is already saved
110 | do
111 | local favBtn = tMisc.buttons and tMisc.buttons["Favorite"]
112 | if favBtn then
113 | local name = favBtn.getName and favBtn.getName()
114 | --[[if name and MultiBot.IsFavorite and MultiBot.IsFavorite(name) then
115 | favBtn.icon:SetTexture("Interface\\RaidFrame\\ReadyCheck-NotReady")
116 | end--]]
117 | local tex = favBtn.icon
118 | if tex then
119 | tex:SetTexture(STAR_TEX)
120 | local isFav = (name and MultiBot.IsFavorite and MultiBot.IsFavorite(name)) and true or false
121 | -- Appliquer l’état visuel au chargement
122 | if tex.SetDesaturated then tex:SetDesaturated(isFav) end
123 | if tex.SetVertexColor then
124 | if isFav then tex:SetVertexColor(0.5, 0.5, 0.5) else tex:SetVertexColor(1, 1, 1) end
125 | end
126 | end
127 | end
128 | end
129 | -- MENU MISC END-----------------------------------------
130 |
131 | pFrame.addButton("Summon", 94, 0, "ability_hunter_beastcall", MultiBot.tips.every.summon)
132 | .doLeft = function(pButton)
133 | MultiBot.ActionToTarget("summon", pButton.getName())
134 | end
135 |
136 | pFrame.addButton("Uninvite", 124, 0, "inv_misc_grouplooking", MultiBot.tips.every.uninvite).doShow()
137 | .doLeft = function(pButton)
138 | MultiBot.doSlash("/uninvite", pButton.getName())
139 | pButton.getButton("Invite").doShow()
140 | pButton.doHide()
141 | end
142 |
143 | pFrame.addButton("Invite", 124, 0, "inv_misc_groupneedmore", MultiBot.tips.every.invite).doHide()
144 | .doLeft = function(pButton)
145 | MultiBot.doSlash("/invite", pButton.getName())
146 | pButton.getButton("Uninvite").doShow()
147 | pButton.doHide()
148 | end
149 |
150 | pFrame.addButton("Food", 154, 0, "inv_drink_24_sealwhey", MultiBot.tips.every.food).setDisable()
151 | .doLeft = function(pButton)
152 | MultiBot.OnOffActionToTarget(pButton, "nc +food,?", "nc -food,?", pButton.getName())
153 | end
154 |
155 | pFrame.addButton("Loot", 184, 0, "inv_misc_coin_16", MultiBot.tips.every.loot).setDisable()
156 | .doLeft = function(pButton)
157 | MultiBot.OnOffActionToTarget(pButton, "nc +loot,?", "nc -loot,?", pButton.getName())
158 | end
159 |
160 | pFrame.addButton("Gather", 214, 0, "trade_mining", MultiBot.tips.every.gather).setDisable()
161 | .doLeft = function(pButton)
162 | MultiBot.OnOffActionToTarget(pButton, "nc +gather,?", "nc -gather,?", pButton.getName())
163 | end
164 |
165 | -- Selfbot is not allowed to use these Tools --
166 | if(pFrame.getName() == UnitName("player")) then return end
167 |
168 | pFrame.addButton("Inventory", 244, 0, "inv_misc_bag_08", MultiBot.tips.every.inventory).setDisable()
169 | .doLeft = function(pButton)
170 | if(pButton.state) then
171 | MultiBot.inventory:Hide()
172 | pButton.setDisable()
173 | else
174 | local tUnits = MultiBot.frames["MultiBar"].frames["Units"]
175 | for key, value in pairs(MultiBot.index.actives) do
176 | if(tUnits.buttons[value].name ~= UnitName("player")) then
177 | tUnits.frames[value].getButton("Inventory").setDisable()
178 | end
179 | end
180 |
181 | pButton.setEnable()
182 | MultiBot.inventory.name = pButton.getName()
183 | tUnits.buttons[MultiBot.inventory.name].waitFor = "INVENTORY"
184 | SendChatMessage("items", "WHISPER", nil, pButton.getName())
185 | end
186 | end
187 |
188 | pFrame.addButton("Spellbook", 274, 0, "inv_misc_book_09", MultiBot.tips.every.spellbook).setDisable()
189 | .doLeft = function(pButton)
190 | if(pButton.state) then
191 | MultiBot.spellbook:Hide()
192 | pButton.setDisable()
193 | else
194 | local tUnits = MultiBot.frames["MultiBar"].frames["Units"]
195 | for key, value in pairs(MultiBot.index.actives) do
196 | if(tUnits.buttons[value].name ~= UnitName("player")) then
197 | tUnits.frames[value].getButton("Spellbook").setDisable()
198 | end
199 | end
200 |
201 | pButton.setEnable()
202 | MultiBot.spellbook.name = pButton.getName()
203 | tUnits.buttons[MultiBot.spellbook.name].waitFor = "SPELLBOOK"
204 | SendChatMessage("spells", "WHISPER", nil, pButton.getName())
205 | end
206 | end
207 |
208 | pFrame.addButton("Talent", 304, 0, "ability_marksmanship", MultiBot.tips.every.talent).setDisable()
209 | .doLeft = function(pButton)
210 | if(pButton.state) then
211 | pButton.setDisable()
212 | MultiBot.talent:Hide()
213 | elseif(UnitLevel(MultiBot.toUnit(pButton.getName())) < 10) then
214 | SendChatMessage(MultiBot.info.talent.Level, "SAY")
215 | elseif(CheckInteractDistance(MultiBot.toUnit(pButton.getName()), 1) == nil) then
216 | SendChatMessage(MultiBot.info.talent.OutOfRange, "SAY")
217 | else
218 | MultiBot.talent:Hide()
219 | MultiBot.talent.doClear()
220 |
221 | local tUnits = MultiBot.frames["MultiBar"].frames["Units"]
222 | for key, value in pairs(MultiBot.index.actives) do
223 | if(tUnits.buttons[value].name ~= UnitName("player")) then
224 | tUnits.frames[value].getButton("Talent").setDisable()
225 | end
226 | end
227 |
228 | InspectUnit(MultiBot.toUnit(pButton.getName()))
229 | pButton.setEnable()
230 |
231 | MultiBot.talent.name = pButton.getName()
232 | MultiBot.talent.class = pButton.getClass()
233 | MultiBot.auto.talent = true
234 | end
235 | end
236 |
237 | -- BOUTON SETTALENTS : toggle affichage de la barre des specs
238 | local btn = pFrame
239 | .addButton("SetTalents", 334, 0, "inv_sword_22", MultiBot.tips.every.settalent)
240 | -- état initial : toujours désactivé (zen, pas de barre affichée au load)
241 | btn:setDisable()
242 |
243 | btn.doLeft = function(self)
244 | -- si le dropdown existe et est visible → on le ferme
245 | if MultiBot.spec.dropdown and MultiBot.spec.dropdown:IsShown() then
246 | MultiBot.spec:HideDropdown()
247 | self:setDisable()
248 | else
249 | -- sinon on envoie la requête au bot, et on active le bouton
250 | MultiBot.spec:RequestList(self:getName(), self)
251 | self:setEnable()
252 | end
253 | end
254 |
255 | -- STRATEGIES --
256 |
257 | if(MultiBot.isInside(pNormal, "food")) then pFrame.getButton("Food").setEnable() end
258 | if(MultiBot.isInside(pNormal, "loot")) then pFrame.getButton("Loot").setEnable() end
259 | if(MultiBot.isInside(pNormal, "gather")) then pFrame.getButton("Gather").setEnable() end
260 | end
--------------------------------------------------------------------------------
/UI/MultiBotOptions.lua:
--------------------------------------------------------------------------------
1 | -- MultiBotOptions.lua
2 | -- print("MultiBotOptions.lua loaded")
3 |
4 | local PANEL_NAME = "MultiBotOptionsPanel"
5 |
6 | local function round(x, step) step = step or 1; return math.floor(x/step + 0.5)*step end
7 |
8 | local function makeSlider(parent, key, label, minV, maxV, step, y)
9 | local name = PANEL_NAME .. "_" .. key .. "_Slider"
10 | local s = CreateFrame("Slider", name, parent, "OptionsSliderTemplate")
11 | s:SetPoint("TOPLEFT", 16, y)
12 | s:SetMinMaxValues(minV, maxV)
13 | s:SetValueStep(step)
14 | if s.SetObeyStepOnDrag then s:SetObeyStepOnDrag(true) end
15 | s:SetWidth(300)
16 |
17 | _G[name .. "Text"]:SetText(label)
18 | _G[name .. "Low"]:SetText(string.format("%.1f s", minV))
19 | _G[name .. "High"]:SetText(string.format("%.1f s", maxV))
20 |
21 | local val = parent:CreateFontString(nil, "ARTWORK", "GameFontHighlightSmall")
22 | val:SetPoint("TOP", s, "BOTTOM", 0, 0)
23 |
24 | local function refresh()
25 | local v = MultiBot.GetTimer(key)
26 | s:SetValue(v)
27 | val:SetText(string.format("%.1f s", v))
28 | end
29 |
30 | s:SetScript("OnValueChanged", function(self, v)
31 | v = round(v, step)
32 | self:SetValue(v)
33 | MultiBot.SetTimer(key, v)
34 | val:SetText(string.format("%.1f s", v))
35 | end)
36 |
37 | s._refresh = refresh
38 | return s
39 | end
40 |
41 | -- Fabrique pour les sliders throttle (utilise Get/Set dédiés)
42 | local function makeThrottleSlider(parent, key, label, minV, maxV, step, y)
43 | local name = PANEL_NAME .. "_" .. key .. "_Slider"
44 | local s = CreateFrame("Slider", name, parent, "OptionsSliderTemplate")
45 | s:SetPoint("TOPLEFT", 16, y)
46 | s:SetMinMaxValues(minV, maxV)
47 | s:SetValueStep(step)
48 | if s.SetObeyStepOnDrag then s:SetObeyStepOnDrag(true) end
49 | s:SetWidth(300)
50 |
51 | _G[name .. "Text"]:SetText(label)
52 | _G[name .. "Low"]:SetText(tostring(minV))
53 | _G[name .. "High"]:SetText(tostring(maxV))
54 |
55 | local val = parent:CreateFontString(nil, "ARTWORK", "GameFontHighlightSmall")
56 | val:SetPoint("TOP", s, "BOTTOM", 0, 0)
57 |
58 | local function getValue()
59 | if key == "thr_rate" then return MultiBot.GetThrottleRate() else return MultiBot.GetThrottleBurst() end
60 | end
61 | local function setValue(v)
62 | if key == "thr_rate" then MultiBot.SetThrottleRate(v) else MultiBot.SetThrottleBurst(v) end
63 | end
64 |
65 | local function refresh()
66 | local v = getValue()
67 | s:SetValue(v)
68 | val:SetText(tostring(v))
69 | end
70 |
71 | s:SetScript("OnValueChanged", function(self, v)
72 | v = round(v, step)
73 | self:SetValue(v)
74 | setValue(v)
75 | val:SetText(tostring(v))
76 | end)
77 |
78 | s._refresh = refresh
79 | return s
80 | end
81 |
82 | function MultiBot.BuildOptionsPanel()
83 | if MultiBot._optionsBuilt then return end
84 |
85 | -- parent = UIParent (pas InterfaceOptionsFramePanelContainer sur 3.3.5)
86 | local panel = CreateFrame("Frame", PANEL_NAME, UIParent)
87 | panel.name = "MultiBot"
88 | panel:Hide()
89 |
90 | local scrollFrame = CreateFrame("ScrollFrame", PANEL_NAME.."ScrollFrame", panel, "UIPanelScrollFrameTemplate")
91 | scrollFrame:SetPoint("TOPLEFT", 3, -4)
92 | scrollFrame:SetPoint("BOTTOMRIGHT", -27, 4)
93 |
94 | local scrollChild = CreateFrame("Frame", PANEL_NAME.."ScrollChild", scrollFrame)
95 | scrollChild:SetSize(1, 1)
96 | scrollFrame:SetScrollChild(scrollChild)
97 |
98 | scrollChild:SetScript("OnShow", function(self)
99 | if self._initialized then return end
100 | self._initialized = true
101 |
102 | local title = self:CreateFontString(nil, "ARTWORK", "GameFontNormalLarge")
103 | title:SetPoint("TOPLEFT", 16, -16)
104 | title:SetText(MultiBot.tips.sliders.frametitle)
105 |
106 | -- SV minimap garanties côté options
107 | MultiBotSave = MultiBotSave or {}
108 | MultiBotSave.Minimap = MultiBotSave.Minimap or {}
109 |
110 | local strataDropDown = CreateFrame("Frame", "MultiBotStrataDropDown", self, "UIDropDownMenuTemplate")
111 | --strataDropDown:SetPoint("TOPLEFT", title, "BOTTOMLEFT", -14, -30)
112 |
113 | --------------------------------------------------------------------
114 | -- Minimap: Hide button
115 | --------------------------------------------------------------------
116 | local chkMinimapHide = CreateFrame("CheckButton", "MultiBot_MinimapHideCheck",
117 | self, "InterfaceOptionsCheckButtonTemplate")
118 | chkMinimapHide:SetPoint("TOPLEFT", title, "BOTTOMLEFT", 0, -10)
119 | _G[chkMinimapHide:GetName().."Text"]:SetText(MultiBot.info.buttonoptionshide)
120 | chkMinimapHide.tooltipText = MultiBot.info.buttonoptionshidetooltip
121 |
122 | -- État initial
123 | chkMinimapHide:SetChecked(MultiBotSave.Minimap.hide and true or false)
124 |
125 | chkMinimapHide:SetScript("OnClick", function(btn)
126 | local hide = btn:GetChecked() and true or false
127 | MultiBotSave.Minimap = MultiBotSave.Minimap or {}
128 | MultiBotSave.Minimap.hide = hide
129 | if MultiBot.Minimap_Refresh then
130 | MultiBot.Minimap_Refresh()
131 | else
132 | -- Back-up très défensif si la fonction n'existe pas encore
133 | local b = _G["MultiBot_MinimapButton"] or MultiBot.MinimapButton
134 | if b then
135 | if hide then b:Hide() else b:Show() end
136 | end
137 | end
138 | end)
139 |
140 | -- Replacer le dropdown de Strata SOUS la checkbox
141 | strataDropDown:ClearAllPoints()
142 | strataDropDown:SetPoint("TOPLEFT", chkMinimapHide, "BOTTOMLEFT", -14, -18)
143 |
144 | local strataLabel = self:CreateFontString(nil, "OVERLAY", "GameFontNormal")
145 | strataLabel:SetPoint("BOTTOMLEFT", strataDropDown, "TOPLEFT", 16, 3)
146 | strataLabel:SetText("Frame Strata")
147 |
148 | -- Petite aide visuelle sous la case
149 | -- local hint = panel:CreateFontString(nil, "ARTWORK", "GameFontHighlightSmall")
150 | local hint = self:CreateFontString(nil, "ARTWORK", "GameFontHighlightSmall")
151 | hint:SetPoint("TOPLEFT", chkMinimapHide, "BOTTOMLEFT", 28, -4)
152 | --hint:SetText("Tip: drag the button around the minimap to reposition it.")
153 |
154 | -- Conserver la référence
155 | panel.chkMinimapHide = chkMinimapHide
156 |
157 | local current = (MultiBotGlobalSave and MultiBotGlobalSave["Strata.Level"]) or "HIGH"
158 | local strataLevels = { "BACKGROUND", "LOW", "MEDIUM", "HIGH", "DIALOG", "TOOLTIP" }
159 |
160 | local function OnClick(button)
161 | UIDropDownMenu_SetSelectedID(strataDropDown, button:GetID())
162 | MultiBotGlobalSave["Strata.Level"] = strataLevels[button:GetID()]
163 | if MultiBot.ApplyGlobalStrata then
164 | MultiBot.ApplyGlobalStrata()
165 | end
166 | end
167 |
168 | local function Initialize(dropdown, level)
169 | local info
170 | for k, v in ipairs(strataLevels) do
171 | info = UIDropDownMenu_CreateInfo()
172 | info.text = v
173 | info.value = v
174 | info.func = OnClick
175 | UIDropDownMenu_AddButton(info, level)
176 | end
177 | end
178 |
179 | UIDropDownMenu_Initialize(strataDropDown, Initialize)
180 | UIDropDownMenu_SetWidth(strataDropDown, 120)
181 | UIDropDownMenu_SetButtonWidth(strataDropDown, 144)
182 | UIDropDownMenu_SetSelectedValue(strataDropDown, current)
183 | UIDropDownMenu_JustifyText(strataDropDown, "LEFT")
184 |
185 | local sub = self:CreateFontString(nil, "ARTWORK", "GameFontHighlightSmall")
186 | sub:SetPoint("TOPLEFT", strataDropDown, "BOTTOMLEFT", 20, -12)
187 | sub:SetText(MultiBot.tips.sliders.actionsinter)
188 |
189 | -- Sliders : on les crée puis on les ANCRE sous le sous-titre pour éviter tout chevauchement
190 | self.s_stats = makeSlider(self, "stats", MultiBot.tips.sliders.statsinter, 5, 300, 1, -40)
191 | self.s_talent = makeSlider(self, "talent", MultiBot.tips.sliders.talentsinter, 1, 30, 0.5, -90)
192 | self.s_invite = makeSlider(self, "invite", MultiBot.tips.sliders.invitsinter, 1, 60, 1, -140)
193 | self.s_sort = makeSlider(self, "sort", MultiBot.tips.sliders.sortinter, 0.2,10, 0.2, -190)
194 |
195 | -- Throttle (NOUVEAU)
196 | self.s_thr_rate = makeThrottleSlider(self, "thr_rate", MultiBot.tips.sliders.messpersec, 1, 20, 1, 0)
197 | self.s_thr_burst = makeThrottleSlider(self, "thr_burst", MultiBot.tips.sliders.maxburst, 1, 50, 1, 0)
198 |
199 | -- Ré-ancrage vertical
200 | self.s_stats:ClearAllPoints()
201 | self.s_stats:SetPoint("TOPLEFT", sub, "BOTTOMLEFT", 0, -16)
202 |
203 | self.s_talent:ClearAllPoints()
204 | self.s_talent:SetPoint("TOPLEFT", self.s_stats, "BOTTOMLEFT", 0, -36)
205 |
206 | self.s_invite:ClearAllPoints()
207 | self.s_invite:SetPoint("TOPLEFT", self.s_talent, "BOTTOMLEFT", 0, -36)
208 |
209 | self.s_sort:ClearAllPoints()
210 | self.s_sort:SetPoint("TOPLEFT", self.s_invite, "BOTTOMLEFT", 0, -36)
211 |
212 | self.s_thr_rate:ClearAllPoints()
213 | self.s_thr_rate:SetPoint("TOPLEFT", self.s_sort, "BOTTOMLEFT", 0, -36)
214 |
215 | self.s_thr_burst:ClearAllPoints()
216 | self.s_thr_burst:SetPoint("TOPLEFT", self.s_thr_rate, "BOTTOMLEFT", 0, -36)
217 |
218 | -- Bouton : descendu sous le dernier slider
219 | local btn = CreateFrame("Button", nil, self, "UIPanelButtonTemplate")
220 | btn:SetSize(140, 22)
221 | btn:ClearAllPoints()
222 | btn:SetPoint("TOPLEFT", self.s_thr_burst, "BOTTOMLEFT", 0, -24)
223 | btn:SetText(MultiBot.tips.sliders.rstbutn)
224 | btn:SetScript("OnClick", function()
225 | -- Timers
226 | MultiBot.SetTimer("stats", 45)
227 | MultiBot.SetTimer("talent", 3)
228 | MultiBot.SetTimer("invite", 5)
229 | MultiBot.SetTimer("sort", 1)
230 | self.s_stats._refresh(); self.s_talent._refresh(); self.s_invite._refresh(); self.s_sort._refresh()
231 |
232 | -- Throttle (défauts)
233 | MultiBot.SetThrottleRate(5)
234 | MultiBot.SetThrottleBurst(8)
235 | self.s_thr_rate._refresh(); self.s_thr_burst._refresh()
236 | end)
237 |
238 | self.s_stats._refresh(); self.s_talent._refresh(); self.s_invite._refresh(); self.s_sort._refresh()
239 | self.s_thr_rate._refresh(); self.s_thr_burst._refresh()
240 | end)
241 |
242 | -- Enregistre proprement dans le menu Options (avec fallback 3.3.5)
243 | if type(InterfaceOptions_AddCategory) == "function" then
244 | InterfaceOptions_AddCategory(panel)
245 | elseif type(InterfaceOptionsFrame_AddCategory) == "function" then
246 | InterfaceOptionsFrame_AddCategory(panel)
247 | elseif type(INTERFACEOPTIONS_ADDONCATEGORIES) == "table" then
248 | table.insert(INTERFACEOPTIONS_ADDONCATEGORIES, panel)
249 | end
250 |
251 | MultiBot._optionsPanel = panel -- garder une référence pour /mbopt
252 | MultiBot._optionsBuilt = true
253 | -- print("MultiBotOptions: panel registered")
254 | end
255 |
256 | -- Slash pour ouvrir le panneau (double appel nécessaire sur 3.3.5 parfois)
257 | _G.SLASH_MULTIBOTOPTIONS1 = "/mbopt"
258 | SlashCmdList["MULTIBOTOPTIONS"] = function()
259 | if not MultiBot._optionsBuilt then
260 | if MultiBot.BuildOptionsPanel then MultiBot.BuildOptionsPanel() end
261 | end
262 | local p = MultiBot._optionsPanel
263 | if p and InterfaceOptionsFrame_OpenToCategory then
264 | InterfaceOptionsFrame_OpenToCategory(p)
265 | InterfaceOptionsFrame_OpenToCategory(p)
266 | elseif p then
267 | -- Fallback très simple : affiche juste le frame si l’API n’existe pas
268 | p:Show()
269 | end
270 | end
271 |
272 | -- Ouvre/ferme le panneau d'options. Retourne true si ouvert, false si fermé.
273 | function MultiBot.ToggleOptionsPanel()
274 | if not MultiBot._optionsBuilt and MultiBot.BuildOptionsPanel then
275 | MultiBot.BuildOptionsPanel()
276 | end
277 | local p = MultiBot._optionsPanel
278 | if not p then return false end
279 |
280 | local io = InterfaceOptionsFrame
281 | -- Si notre panneau est déjà affiché, on ferme la fenêtre d’options
282 | if io and io:IsShown() and p:IsShown() then
283 | HideUIPanel(io)
284 | return false
285 | end
286 |
287 | -- Sinon on l’ouvre (double appel nécessaire sur 3.3.5)
288 | if InterfaceOptionsFrame_OpenToCategory then
289 | InterfaceOptionsFrame_OpenToCategory(p)
290 | InterfaceOptionsFrame_OpenToCategory(p)
291 | else
292 | p:Show()
293 | end
294 | return true
295 | end
296 |
--------------------------------------------------------------------------------
/Strategies/MultiBotHunter.lua:
--------------------------------------------------------------------------------
1 | MultiBot.addHunter = function(pFrame, pCombat, pNormal)
2 | --local tButton = pFrame.addButton("NonCombatAspect", 0, 0, "spell_nature_protectionformnature", MultiBot.tips.hunter.naspect.master)
3 | --tButton.doLeft = function(pButton)
4 | local nonCombatAspectButton = pFrame.addButton("NonCombatAspect", 0, 0, "spell_nature_protectionformnature", MultiBot.tips.hunter.naspect.master)
5 | nonCombatAspectButton.doLeft = function(pButton)
6 | MultiBot.ShowHideSwitch(pButton.parent.frames["NonCombatAspect"])
7 | end
8 |
9 | --local tFrame = pFrame.addFrame("NonCombatAspect", -2, 30)
10 | --tFrame:Hide()
11 | local nonCombatAspectFrame = pFrame.addFrame("NonCombatAspect", -2, 30)
12 | nonCombatAspectFrame:Hide()
13 |
14 | --tFrame.addButton("NonCombatNature", 0, 0, "spell_nature_protectionformnature", MultiBot.tips.hunter.naspect.rnature)
15 | nonCombatAspectFrame.addButton("NonCombatNature", 0, 0, "spell_nature_protectionformnature", MultiBot.tips.hunter.naspect.rnature)
16 | .doLeft = function(pButton)
17 | MultiBot.SelectToTarget(pButton.get(), "NonCombatAspect", pButton.texture, "nc +rnature,?", pButton.getName())
18 | --pButton.getButton("NonCombatAspect").doRight = function(pButton)
19 | --MultiBot.OnOffActionToTarget(pButton, "nc +rnature,?", "nc -rnature,?", pButton.getName())
20 | pButton.getButton("NonCombatAspect").doRight = function(btn)
21 | MultiBot.OnOffActionToTarget(btn, "nc +rnature,?", "nc -rnature,?", btn.getName())
22 | end
23 | end
24 |
25 | --tFrame.addButton("NonCombatSpeed", 0, 26, "ability_mount_whitetiger", MultiBot.tips.hunter.naspect.bspeed)
26 | nonCombatAspectFrame.addButton("NonCombatSpeed", 0, 26, "ability_mount_whitetiger", MultiBot.tips.hunter.naspect.bspeed)
27 | .doLeft = function(pButton)
28 | MultiBot.SelectToTarget(pButton.get(), "NonCombatAspect", pButton.texture, "nc +bspeed,?", pButton.getName())
29 | --pButton.getButton("NonCombatAspect").doRight = function(pButton)
30 | --MultiBot.OnOffActionToTarget(pButton, "nc +bspeed,?", "nc -bspeed,?", pButton.getName())
31 | pButton.getButton("NonCombatAspect").doRight = function(btn)
32 | MultiBot.OnOffActionToTarget(btn, "nc +bspeed,?", "nc -bspeed,?", btn.getName())
33 | end
34 | end
35 |
36 | --tFrame.addButton("NonCombatMana", 0, 52, "ability_hunter_aspectoftheviper", MultiBot.tips.hunter.naspect.bmana)
37 | nonCombatAspectFrame.addButton("NonCombatMana", 0, 52, "ability_hunter_aspectoftheviper", MultiBot.tips.hunter.naspect.bmana)
38 | .doLeft = function(pButton)
39 | MultiBot.SelectToTarget(pButton.get(), "NonCombatAspect", pButton.texture, "nc +bmana,?", pButton.getName())
40 | --pButton.getButton("NonCombatAspect").doRight = function(pButton)
41 | --MultiBot.OnOffActionToTarget(pButton, "nc +bmana,?", "nc -bmana,?", pButton.getName())
42 | pButton.getButton("NonCombatAspect").doRight = function(btn)
43 | MultiBot.OnOffActionToTarget(btn, "nc +bmana,?", "nc -bmana,?", btn.getName())
44 | end
45 | end
46 |
47 | --tFrame.addButton("NonCombatDps", 0, 78, "ability_hunter_pet_dragonhawk", MultiBot.tips.hunter.naspect.bdps)
48 | nonCombatAspectFrame.addButton("NonCombatDps", 0, 78, "ability_hunter_pet_dragonhawk", MultiBot.tips.hunter.naspect.bdps)
49 | .doLeft = function(pButton)
50 | MultiBot.SelectToTarget(pButton.get(), "NonCombatAspect", pButton.texture, "nc +bdps,?", pButton.getName())
51 | --pButton.getButton("NonCombatAspect").doRight = function(pButton)
52 | --MultiBot.OnOffActionToTarget(pButton, "nc +bdps,?", "nc -bdps,?", pButton.getName())
53 | pButton.getButton("NonCombatAspect").doRight = function(btn)
54 | MultiBot.OnOffActionToTarget(btn, "nc +bdps,?", "nc -bdps,?", btn.getName())
55 | end
56 | end
57 |
58 | -- STRATEGIES:NON-COMBAT-BUFF --
59 |
60 | if(MultiBot.isInside(pNormal, "rnature")) then
61 | --tButton.setTexture("spell_nature_protectionformnature").setEnable().doRight = function(pButton)
62 | nonCombatAspectButton.setTexture("spell_nature_protectionformnature").setEnable().doRight = function(pButton)
63 | MultiBot.OnOffActionToTarget(pButton, "nc +rnature,?", "nc -rnature,?", pButton.getName())
64 | end
65 | elseif(MultiBot.isInside(pNormal, "bspeed")) then
66 | --tButton.setTexture("ability_mount_whitetiger").setEnable().doRight = function(pButton)
67 | nonCombatAspectButton.setTexture("ability_mount_whitetiger").setEnable().doRight = function(pButton)
68 | MultiBot.OnOffActionToTarget(pButton, "nc +bspeed,?", "nc -bspeed,?", pButton.getName())
69 | end
70 | elseif(MultiBot.isInside(pNormal, "bmana")) then
71 | --tButton.setTexture("ability_hunter_aspectoftheviper").setEnable().doRight = function(pButton)
72 | nonCombatAspectButton.setTexture("ability_hunter_aspectoftheviper").setEnable().doRight = function(pButton)
73 | MultiBot.OnOffActionToTarget(pButton, "nc +bmana,?", "nc -bmana,?", pButton.getName())
74 | end
75 | elseif(MultiBot.isInside(pNormal, "bdps")) then
76 | --tButton.setTexture("ability_hunter_pet_dragonhawk").setEnable().doRight = function(pButton)
77 | nonCombatAspectButton.setTexture("ability_hunter_pet_dragonhawk").setEnable().doRight = function(pButton)
78 | MultiBot.OnOffActionToTarget(pButton, "nc +bdps,?", "nc -bdps,?", pButton.getName())
79 | end
80 | end
81 |
82 | -- COMABT-BUFF --
83 |
84 | --local tButton = pFrame.addButton("CombatAspect", -30, 0, "spell_nature_protectionformnature", MultiBot.tips.hunter.caspect.master)
85 | --tButton.doLeft = function(pButton)
86 | local combatAspectButton = pFrame.addButton("CombatAspect", -30, 0, "spell_nature_protectionformnature", MultiBot.tips.hunter.caspect.master)
87 | combatAspectButton.doLeft = function(pButton)
88 | MultiBot.ShowHideSwitch(pButton.parent.frames["CombatAspect"])
89 | end
90 |
91 | --local tFrame = pFrame.addFrame("CombatAspect", -32, 30)
92 | --tFrame:Hide()
93 | local combatAspectFrame = pFrame.addFrame("CombatAspect", -32, 30)
94 | combatAspectFrame:Hide()
95 |
96 | --tFrame.addButton("CombatNature", 0, 0, "spell_nature_protectionformnature", MultiBot.tips.hunter.caspect.rnature)
97 | combatAspectFrame.addButton("CombatNature", 0, 0, "spell_nature_protectionformnature", MultiBot.tips.hunter.caspect.rnature)
98 | .doLeft = function(pButton)
99 | MultiBot.SelectToTarget(pButton.get(), "CombatAspect", pButton.texture, "co +rnature,?", pButton.getName())
100 | --pButton.getButton("CombatAspect").doRight = function(pButton)
101 | --MultiBot.OnOffActionToTarget(pButton, "co +rnature,?", "co -rnature,?", pButton.getName())
102 | pButton.getButton("CombatAspect").doRight = function(btn)
103 | MultiBot.OnOffActionToTarget(btn, "co +rnature,?", "co -rnature,?", btn.getName())
104 | end
105 | end
106 |
107 | --tFrame.addButton("CombatSpeed", 0, 26, "ability_mount_whitetiger", MultiBot.tips.hunter.caspect.bspeed)
108 | combatAspectFrame.addButton("CombatSpeed", 0, 26, "ability_mount_whitetiger", MultiBot.tips.hunter.caspect.bspeed)
109 | .doLeft = function(pButton)
110 | MultiBot.SelectToTarget(pButton.get(), "CombatAspect", pButton.texture, "co +bspeed,?", pButton.getName())
111 | --pButton.getButton("NonCombatAspect").doRight = function(pButton)
112 | --MultiBot.OnOffActionToTarget(pButton, "co +bspeed,?", "co -bspeed,?", pButton.getName())
113 | pButton.getButton("NonCombatAspect").doRight = function(btn)
114 | MultiBot.OnOffActionToTarget(btn, "co +bspeed,?", "co -bspeed,?", btn.getName())
115 | end
116 | end
117 |
118 | --tFrame.addButton("CombatMana", 0, 52, "ability_hunter_aspectoftheviper", MultiBot.tips.hunter.caspect.bmana)
119 | combatAspectFrame.addButton("CombatMana", 0, 52, "ability_hunter_aspectoftheviper", MultiBot.tips.hunter.caspect.bmana)
120 | .doLeft = function(pButton)
121 | MultiBot.SelectToTarget(pButton.get(), "CombatAspect", pButton.texture, "co +bmana,?", pButton.getName())
122 | --pButton.getButton("CombatAspect").doRight = function(pButton)
123 | --MultiBot.OnOffActionToTarget(pButton, "co +bmana,?", "co -bmana,?", pButton.getName())
124 | pButton.getButton("CombatAspect").doRight = function(btn)
125 | MultiBot.OnOffActionToTarget(btn, "co +bmana,?", "co -bmana,?", btn.getName())
126 | end
127 | end
128 |
129 | --tFrame.addButton("CombatDps", 0, 78, "ability_hunter_pet_dragonhawk", MultiBot.tips.hunter.caspect.bdps)
130 | combatAspectFrame.addButton("CombatDps", 0, 78, "ability_hunter_pet_dragonhawk", MultiBot.tips.hunter.caspect.bdps)
131 | .doLeft = function(pButton)
132 | MultiBot.SelectToTarget(pButton.get(), "CombatAspect", pButton.texture, "co +bdps,?", pButton.getName())
133 | --pButton.getButton("CombatAspect").doRight = function(pButton)
134 | --MultiBot.OnOffActionToTarget(pButton, "co +bdps,?", "co -bdps,?", pButton.getName())
135 | pButton.getButton("CombatAspect").doRight = function(btn)
136 | MultiBot.OnOffActionToTarget(btn, "co +bdps,?", "co -bdps,?", btn.getName())
137 | end
138 | end
139 |
140 | -- STRATEGIES:COMABT-ASPECT --
141 |
142 | if(MultiBot.isInside(pCombat, "rnature")) then
143 | --tButton.setTexture("spell_nature_protectionformnature").setEnable().doRight = function(pButton)
144 | combatAspectButton.setTexture("spell_nature_protectionformnature").setEnable().doRight = function(pButton)
145 | MultiBot.OnOffActionToTarget(pButton, "co +rnature,?", "co -rnature,?", pButton.getName())
146 | end
147 | elseif(MultiBot.isInside(pCombat, "bspeed")) then
148 | --tButton.setTexture("ability_mount_whitetiger").setEnable().doRight = function(pButton)
149 | combatAspectButton.setTexture("ability_mount_whitetiger").setEnable().doRight = function(pButton)
150 | MultiBot.OnOffActionToTarget(pButton, "co +bspeed,?", "co -bspeed,?", pButton.getName())
151 | end
152 | elseif(MultiBot.isInside(pCombat, "bmana")) then
153 | --tButton.setTexture("ability_hunter_aspectoftheviper").setEnable().doRight = function(pButton)
154 | combatAspectButton.setTexture("ability_hunter_aspectoftheviper").setEnable().doRight = function(pButton)
155 | MultiBot.OnOffActionToTarget(pButton, "co +bmana,?", "co -bmana,?", pButton.getName())
156 | end
157 | elseif(MultiBot.isInside(pCombat, "bdps")) then
158 | --tButton.setTexture("ability_hunter_pet_dragonhawk").setEnable().doRight = function(pButton)
159 | combatAspectButton.setTexture("ability_hunter_pet_dragonhawk").setEnable().doRight = function(pButton)
160 | MultiBot.OnOffActionToTarget(pButton, "co +bdps,?", "co -bdps,?", pButton.getName())
161 | end
162 | end
163 |
164 | -- DPS --
165 |
166 | pFrame.addButton("DpsControl", -60, 0, "ability_warrior_challange", MultiBot.tips.hunter.dps.master)
167 | .doLeft = function(pButton)
168 | MultiBot.ShowHideSwitch(pButton.getFrame("DpsControl"))
169 | end
170 |
171 | --local tFrame = pFrame.addFrame("DpsControl", -62, 30)
172 | --tFrame:Hide()
173 | local dpsFrame = pFrame.addFrame("DpsControl", -62, 30)
174 | dpsFrame:Hide()
175 |
176 | --tFrame.addButton("DpsAssist", 0, 0, "spell_holy_heroism", MultiBot.tips.hunter.dps.dpsAssist).setDisable()
177 | dpsFrame.addButton("DpsAssist", 0, 0, "spell_holy_heroism", MultiBot.tips.hunter.dps.dpsAssist).setDisable()
178 | .doLeft = function(pButton)
179 | if(MultiBot.OnOffActionToTarget(pButton, "co +dps assist,?", "co -dps assist,?", pButton.getName())) then
180 | pButton.getButton("TankAssist").setDisable()
181 | pButton.getButton("DpsAoe").setDisable()
182 | end
183 | end
184 |
185 | --tFrame.addButton("DpsDebuff", 0, 26, "spell_holy_restoration", MultiBot.tips.hunter.dps.dpsDebuff).setDisable()
186 | dpsFrame.addButton("DpsDebuff", 0, 26, "spell_holy_restoration", MultiBot.tips.hunter.dps.dpsDebuff).setDisable()
187 | .doLeft = function(pButton)
188 | MultiBot.OnOffActionToTarget(pButton, "co +dps debuff,?", "co -dps debuff,?", pButton.getName())
189 | end
190 |
191 | --tFrame.addButton("DpsAoe", 0, 52, "spell_holy_surgeoflight", MultiBot.tips.hunter.dps.dpsAoe).setDisable()
192 | dpsFrame.addButton("DpsAoe", 0, 52, "spell_holy_surgeoflight", MultiBot.tips.hunter.dps.dpsAoe).setDisable()
193 | .doLeft = function(pButton)
194 | if(MultiBot.OnOffActionToTarget(pButton, "co +dps aoe,?", "co -dps aoe,?", pButton.getName())) then
195 | pButton.getButton("TankAssist").setDisable()
196 | pButton.getButton("DpsAssist").setDisable()
197 | end
198 | end
199 |
200 | --tFrame.addButton("Dps", 0, 78, "spell_holy_divinepurpose", MultiBot.tips.hunter.dps.dps).setDisable()
201 | dpsFrame.addButton("Dps", 0, 78, "spell_holy_divinepurpose", MultiBot.tips.hunter.dps.dps).setDisable()
202 | .doLeft = function(pButton)
203 | MultiBot.OnOffActionToTarget(pButton, "co +dps,?", "co -dps,?", pButton.getName())
204 | end
205 |
206 | -- Trap Weave : active/désactive le weaving des pièges en mêlée
207 | --tFrame.addButton("TrapWeave", 0, 104, "ability_ensnare", MultiBot.tips.hunter.trapweave).setDisable()
208 | dpsFrame.addButton("TrapWeave", 0, 104, "ability_ensnare", MultiBot.tips.hunter.trapweave).setDisable()
209 | .doLeft = function(pButton)
210 | MultiBot.OnOffActionToTarget(pButton, "co +trap weave,?", "co -trap weave,?", pButton.getName())
211 | end
212 |
213 | -- ASSIST --
214 |
215 | pFrame.addButton("TankAssist", -90, 0, "ability_warrior_innerrage", MultiBot.tips.hunter.tankAssist).setDisable()
216 | .doLeft = function(pButton)
217 | if(MultiBot.OnOffActionToTarget(pButton, "co +tank assist,?", "co -tank assist,?", pButton.getName())) then
218 | pButton.getButton("DpsAssist").setDisable()
219 | pButton.getButton("DpsAoe").setDisable()
220 | end
221 | end
222 |
223 | -- STRATEGIES --
224 |
225 | if(MultiBot.isInside(pCombat, "dps,")) then pFrame.getButton("Dps").setEnable() end
226 | if(MultiBot.isInside(pCombat, "dps aoe")) then pFrame.getButton("DpsAoe").setEnable() end
227 | if(MultiBot.isInside(pCombat, "dps assist")) then pFrame.getButton("DpsAssist").setEnable() end
228 | if(MultiBot.isInside(pCombat, "dps debuff")) then pFrame.getButton("DpsDebuff").setEnable() end
229 | if(MultiBot.isInside(pCombat, "tank assist")) then pFrame.getButton("TankAssist").setEnable() end
230 | if(MultiBot.isInside(pCombat, "trap weave")) then pFrame.getButton("TrapWeave").setEnable() end
231 | end
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # MultiBot
2 | User interface for AzerothCore-Module "Playerbots" by Playerbots team https://github.com/mod-playerbots/mod-playerbots.
3 | Tested with American, German, French and Spanish 3.3.5 Wotlk-Client.
4 |
5 | # Installation
6 | Simply place the files in a folder called "MultiBot" in your World of Warcraft AddOns directory.
7 | Example: "C:\WorldOfWarcraft\Interface\AddOns\MultiBot"
8 | # Use
9 | Start World of Warcraft and enter "/multibot" or "/mbot" or "/mb" in the chat, or use the minimap button.
10 |
11 | ---
12 |
13 | ## ⚠️ Notice — About This Fork
14 |
15 | This is a **temporary fork** of the original [MultiBot addon by Macx-Lio](https://github.com/Macx-Lio/MultiBot).
16 |
17 | The reason for this fork is that I submitted several pull requests to the original repository, but since the creator, **Macx-Lio**, is currently unavailable, those changes could not be merged.
18 |
19 | To allow the community to benefit from the additional features and improvements I have implemented, I’ve published this fork **as a temporary solution**.
20 |
21 | > **All credit for the original addon goes to Macx-Lio.** I do not claim ownership of this project — I’m simply maintaining a working version until development resumes on the main repository.
22 |
23 | Thank you for understanding.
24 |
25 | ---
26 |
27 | Screens:
28 |
29 |
30 |
31 | # Current Status
32 |
![]() |
35 | 36 | This Picture shows the default MultiBot-Interface after start. 37 | | 38 |
![]() |
41 | 42 | The horizontal Buttonbar is the Main-Control. 43 | Commands from the Main-Control go to all bots in a Group or Raid. 44 | Differences in functionality are commented on in the tooltips. 45 | | 46 |
![]() |
49 | 50 | The vertical Buttonbar is the Playerbot-Selection. 51 | Here you will find the Characters of your Account. 52 | There is a button for each Character. 53 | | 54 |
![]() |
57 | 58 | The Tooltip of a Character-Button shows you the Class and Name of the Character. 59 | This should allow you to identify your characters. 60 | | 61 |
![]() |
64 | 65 | With a Left-Click you can load your Character and have him automatically added to the Party or Raid. 66 | The horizontal Buttonbar that appears is the Playerbot-Control. 67 | | 68 |
![]() |
71 | 72 | You can use the Buttons on the left to adjust the Combat-Behavior of your Playerbot. 73 | | 74 |
![]() |
77 | 78 | With the first Button on the right you can summon your Playerbot. 79 | | 80 |
![]() |
83 | 84 | With the second Button on the right you can add or dismiss your Playerbot from the Party or Raid. 85 | | 86 |
![]() |
89 | 90 | With the next three the Buttons you can adjust the Non-Combat-Behavior of your Playerbot. 91 | | 92 |
![]() |
95 | 96 | The last button on the right opens the Inventory of the Playerbot. 97 | | 98 |
![]() |
101 | 102 | A Left-Click on the Inventory-Button opens the Inspect- and Inventory-Window of your Playerbot. 103 | Notice: The Inspect-Window only will be open if the Playerbot is in reach. 104 | | 105 |
![]() |
108 | 109 | The Inventory will automatically open in Sell-Mode. 110 | In the Sell-Mode a left click on a Item will sell it. 111 | Notice: You must have a Merchent as Target. 112 | | 113 |
![]() |
116 | 117 | With this Button you can switch to the Equip-Mode. 118 | In the Equip-Mode a left click on a Item will equip it. 119 | Notice: Only works with Equipment. 120 | | 121 |
![]() |
124 | 125 | With this Button you can switch to the Use-Mode. 126 | In the Use-Mode a left click on a Item will use it. 127 | Notice: Only works with usable Items. 128 | | 129 |
![]() |
132 | 133 | With this Button you can switch to the Destroy-Mode. 134 | In the Destroy-Mode a left click on a Item will destroy it. 135 | Important: There is no security Quest and it will work with every Item. 136 | | 137 |
![]() |
140 | 141 | Items can be viewed regardless of the selected Mode. 142 | Means: View-Mode is always active. 143 | | 144 |
![]() |
147 | 148 | With a left click on the Character-Button you can hide and show the Playerbot-Control. 149 | | 150 |
![]() |
153 | 154 | With a left click on the left Scroll-Button you can hide and show the Playerbots. 155 | | 156 |
![]() |
159 | 160 | With a left click on the right Scroll-Button you can hide and show the Friendbots. 161 | | 162 |
![]() |
165 | 166 | The vertical Buttonbar is the Friend-Selection. 167 | Here you will find the Characters of your Friendlist. 168 | There are max 10 Buttons visible. 169 | | 170 |
![]() |
173 | 174 | With this Button you could browse throu your Friendlist. 175 | Each click will show the next 10 Characters. 176 | If you reach the End it starts from the Beginning. 177 | | 178 |
![]() |
181 | 182 | You can limit the Selection to make it easier to find the wished Friendbot. 183 | | 184 |
![]() |
187 | 188 | Simply press one of these Filter-Buttons to narrow down the Selection. 189 | | 190 |
![]() |
193 | 194 | As you can see, the browse button has disappeared. 195 | This is because the Filter reduced the Selection to less than 10 Friendbots. 196 | | 197 |
![]() |
200 | 201 | The filter shows you the current limitation. 202 | In this example, we filtered to Warrior. 203 | | 204 |
![]() |
207 | 208 | This button is the result of our filter. 209 | The functionality is almost identical to that of the Playerbots. 210 | Therefore we save ourselves a further explanation. 211 | | 212 |
![]() |
215 | 216 | This is the Tank-Attack-Button. 217 | A left click on the Button let all Tanks attack you Target. 218 | | 219 |
![]() |
222 | 223 | This is the Attack-Actionbar. 224 | A left click on the Button executes the selected Action. 225 | A right click on the Button will show and hide the Optional-Actions. 226 | To replace the selected Action, right click a Optional-Action. 227 | To execute a Optional-Action, left click it. 228 | The default Action is "All attack my target". 229 | | 230 |
![]() |
233 | 234 | This is the Modebar. 235 | A left click on the Button enables and disables the selected Mode. 236 | A right click on the Button will show and hide the Mode-Selection. 237 | To select another Mode, left click the Mode-Option. 238 | The Mode will activated by selection. 239 | The default Mode-Toggle is "passive". 240 | | 241 |
![]() |
244 | 245 | This is the Stay-Follow-Toggle-Button. 246 | A left click on the Button sends the Stay-Command to the Party or Raid. 247 | Another left click on the Button sends the Follow-Command to the Party or Raid. 248 | The Icon will show the current State. 249 | The default State is "Follow". 250 | | 251 |
![]() |
254 | 255 | This is the Flee-Actionbar. 256 | A left click on the Button executes the selected Action. 257 | A right click on the Button will show and hide the Optional-Actions. 258 | To replace the selected Action, right click a Optional-Action. 259 | To execute a Optional-Action, left click it. 260 | | 261 |
![]() |
264 | 265 | This is the Formation-Selector. 266 | A left click on the Button will show and hide the Options. 267 | A left click on the Option-Button will send the corresponding Formation-Command to the Party or Raid. 268 | A right click on the Button will ask the Party or Raid for the current Formation. 269 | | 270 |
![]() |
273 | 274 | This is the Beastmaster-Control. 275 | A left click on the Button will show and hide the Actions. 276 | A left click on the Action will send the corresponding Command to your Target, Party or Raid. 277 | It supports the "mod-beastmaster"-Module of the Azerothcore. 278 | These Buttons work with Target, Group and Raid. 279 | | 280 |
![]() |
283 | 284 | This is the MultiBot-Control. 285 | A left click on the Button will show and hide the Controls. 286 | Here you will find the "reset", "reset botAI" and "naxx"-Commands for your Bots. 287 | These Buttons works with Target, Group and Raid. 288 | | 289 |
![]() |
292 | 293 | This Button will send the "drink"-Command to the Party or Raid. 294 | | 295 |
![]() |
298 | 299 | This Button will send the "release"-Command to the Party or Raid. 300 | | 301 |
![]() |
304 | 305 | This Button will send the "revive"-Command to the Party or Raid. 306 | | 307 |
![]() |
310 | 311 | This Button will summon all active Friend- and Playerbots. 312 | | 313 |