├── 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 | main 30 | 31 | # Current Status 32 | 33 | 34 | 35 | 38 | 39 | 40 | 41 | 46 | 47 | 48 | 49 | 54 | 55 | 56 | 57 | 61 | 62 | 63 | 64 | 68 | 69 | 70 | 71 | 74 | 75 | 76 | 77 | 80 | 81 | 82 | 83 | 86 | 87 | 88 | 89 | 92 | 93 | 94 | 95 | 98 | 99 | 100 | 101 | 105 | 106 | 107 | 108 | 113 | 114 | 115 | 116 | 121 | 122 | 123 | 124 | 129 | 130 | 131 | 132 | 137 | 138 | 139 | 140 | 144 | 145 | 146 | 147 | 150 | 151 | 152 | 153 | 156 | 157 | 158 | 159 | 162 | 163 | 164 | 165 | 170 | 171 | 172 | 173 | 178 | 179 | 180 | 181 | 184 | 185 | 186 | 187 | 190 | 191 | 192 | 193 | 197 | 198 | 199 | 200 | 204 | 205 | 206 | 207 | 212 | 213 | 214 | 215 | 219 | 220 | 221 | 222 | 230 | 231 | 232 | 233 | 241 | 242 | 243 | 244 | 251 | 252 | 253 | 254 | 261 | 262 | 263 | 264 | 270 | 271 | 272 | 273 | 280 | 281 | 282 | 283 | 289 | 290 | 291 | 292 | 295 | 296 | 297 | 298 | 301 | 302 | 303 | 304 | 307 | 308 | 309 | 310 | 313 | 314 |
36 | This Picture shows the default MultiBot-Interface after start. 37 |
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 |
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 |
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 |
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 |
72 | You can use the Buttons on the left to adjust the Combat-Behavior of your Playerbot. 73 |
78 | With the first Button on the right you can summon your Playerbot. 79 |
84 | With the second Button on the right you can add or dismiss your Playerbot from the Party or Raid. 85 |
90 | With the next three the Buttons you can adjust the Non-Combat-Behavior of your Playerbot. 91 |
96 | The last button on the right opens the Inventory of the Playerbot. 97 |
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 |
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 |
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 |
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 |
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 |
141 | Items can be viewed regardless of the selected Mode. 142 | Means: View-Mode is always active. 143 |
148 | With a left click on the Character-Button you can hide and show the Playerbot-Control. 149 |
154 | With a left click on the left Scroll-Button you can hide and show the Playerbots. 155 |
160 | With a left click on the right Scroll-Button you can hide and show the Friendbots. 161 |
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 |
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 |
182 | You can limit the Selection to make it easier to find the wished Friendbot. 183 |
188 | Simply press one of these Filter-Buttons to narrow down the Selection. 189 |
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 |
201 | The filter shows you the current limitation. 202 | In this example, we filtered to Warrior. 203 |
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 |
216 | This is the Tank-Attack-Button. 217 | A left click on the Button let all Tanks attack you Target. 218 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
293 | This Button will send the "drink"-Command to the Party or Raid. 294 |
299 | This Button will send the "release"-Command to the Party or Raid. 300 |
305 | This Button will send the "revive"-Command to the Party or Raid. 306 |
311 | This Button will summon all active Friend- and Playerbots. 312 |
315 | 316 | # Comming soon 317 | Share your ideas 318 | 319 | # Currently not supported 320 | -------------------------------------------------------------------------------- /UI/MultiBotPVPUI.lua: -------------------------------------------------------------------------------- 1 | -- MultiBot PvP UI 2 | -- local ADDON = "MultiBot" 3 | 4 | local function CreateStyledFrame() 5 | -- Main frame 6 | local f = CreateFrame("Frame", "MultiBotPVPFrame", UIParent) 7 | f:SetSize(420, 460) 8 | f:SetPoint("CENTER", UIParent, "CENTER", 0, 0) 9 | f:Hide() 10 | f:EnableMouse(true) 11 | f:SetMovable(true) 12 | f:RegisterForDrag("LeftButton") 13 | f:SetScript("OnDragStart", function(self) self:StartMoving() end) 14 | f:SetScript("OnDragStop", function(self) self:StopMovingOrSizing() end) 15 | 16 | -- Backdrop 17 | f:SetBackdrop({ 18 | bgFile = "Interface\\DialogFrame\\UI-DialogBox-Background", 19 | edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border", 20 | tile = true, tileSize = 16, edgeSize = 16, 21 | insets = { left = 6, right = 6, top = 6, bottom = 6 } 22 | }) 23 | if f.SetBackdropColor then f:SetBackdropColor(0, 0, 0, 0.8) end 24 | if f.SetBackdropBorderColor then f:SetBackdropBorderColor(0.4, 0.4, 0.4, 1) end 25 | 26 | -- Header + title 27 | local titleBg = f:CreateTexture(nil, "ARTWORK") 28 | titleBg:SetTexture("Interface\\DialogFrame\\UI-DialogBox-Header") 29 | titleBg:SetPoint("TOPLEFT", f, "TOPLEFT", 12, -6) 30 | titleBg:SetPoint("TOPRIGHT", f, "TOPRIGHT", -12, -6) 31 | titleBg:SetHeight(48) 32 | f.Title = f:CreateFontString(nil, "OVERLAY", "GameFontHighlight") 33 | f.Title:SetPoint("TOP", titleBg, "TOP", 0, -10) 34 | f.Title:SetText("MultiBot PvP Panel") 35 | 36 | -- Close button 37 | local close = CreateFrame("Button", nil, f, "UIPanelCloseButton") 38 | close:SetPoint("TOPRIGHT", f, "TOPRIGHT", -6, -6) 39 | close:SetScript("OnClick", function() f:Hide() end) 40 | 41 | -- Content area 42 | local content = CreateFrame("Frame", nil, f) 43 | content:SetPoint("TOPLEFT", f, "TOPLEFT", 16, -68) 44 | content:SetPoint("BOTTOMRIGHT", f, "BOTTOMRIGHT", -16, 64) 45 | 46 | -- Column offsets (relative to right edge of section) 47 | local colOffsets = { -120, -80, -40 } 48 | 49 | -- Section factory (simple) 50 | local function CreateSection(parent, topOffset, height, title) 51 | local sec = CreateFrame("Frame", nil, parent) 52 | sec:SetPoint("TOPLEFT", parent, "TOPLEFT", 0, -topOffset) 53 | sec:SetPoint("TOPRIGHT", parent, "TOPRIGHT", 0, -topOffset) 54 | sec:SetHeight(height) 55 | sec.title = sec:CreateFontString(nil, "OVERLAY", "GameFontNormal") 56 | sec.title:SetPoint("TOPLEFT", sec, "TOPLEFT", 0, 0) 57 | sec.title:SetText(title) 58 | return sec 59 | end 60 | 61 | -- AddRow returns fontstrings so they can be updated later 62 | local function AddRow(sec, index, label, col1, col2, col3) 63 | local lineHeight, startY = 18, -22 64 | local y = startY - (index - 1) * lineHeight 65 | local lbl = sec:CreateFontString(nil, "OVERLAY", "GameFontHighlightSmall") 66 | lbl:SetPoint("TOPLEFT", sec, "TOPLEFT", 4, y) 67 | lbl:SetText(label) 68 | local out = {} 69 | local vals = { col1 or "-", col2 or "-", col3 or "-" } 70 | for i = 1, 3 do 71 | local v = sec:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall") 72 | v:SetPoint("TOPRIGHT", sec, "TOPRIGHT", colOffsets[i], y) 73 | v:SetText(vals[i]) 74 | out[i] = v 75 | end 76 | return out 77 | end 78 | 79 | -- Build layout top-down 80 | local top = 0 81 | local spacing = 12 82 | 83 | -- Header that will display bot name (updated from whisper sender) 84 | local customHeader = content:CreateFontString(nil, "OVERLAY", "GameFontNormal") 85 | customHeader:SetPoint("TOPLEFT", content, "TOPLEFT", 0, -top) 86 | customHeader:SetText(MultiBot.tips.every.pvpcustom) 87 | top = top + 18 + 6 88 | 89 | -- HONNEUR section: only one row "Honneur" 90 | local honorHeight = 18 + 1 * 18 + 8 91 | local honor = CreateSection(content, top, honorHeight, "Honneur") 92 | 93 | -- Column header labels for Honneur (1st renamed Total) 94 | local hdr1 = honor:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall") 95 | hdr1:SetPoint("TOPRIGHT", honor, "TOPRIGHT", colOffsets[1], -2) 96 | hdr1:SetText(MultiBot.tips.every.pvptotal) 97 | --local hdr2 = honor:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall") 98 | --hdr2:SetPoint("TOPRIGHT", honor, "TOPRIGHT", colOffsets[2], -2) 99 | --hdr2:SetText("Hier") 100 | --local hdr3 = honor:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall") 101 | --hdr3:SetPoint("TOPRIGHT", honor, "TOPRIGHT", colOffsets[3], -2) 102 | --hdr3:SetText("À vie") 103 | 104 | -- separator 105 | local sepH = honor:CreateTexture(nil, "ARTWORK") 106 | sepH:SetHeight(1) 107 | sepH:SetPoint("TOPLEFT", honor, "TOPLEFT", 0, -18) 108 | sepH:SetPoint("TOPRIGHT", honor, "TOPRIGHT", 0, -18) 109 | sepH:SetTexture(0.5, 0.5, 0.5, 0.6) 110 | 111 | -- Only the Honneur row (we keep placeholders) 112 | local honorRow = AddRow(honor, 1, "Honneur", "-", "-", "-") 113 | if honorRow[2] then honorRow[2]:Hide() end 114 | if honorRow[3] then honorRow[3]:Hide() end 115 | -- honorRow[1] = Total column fontstring 116 | 117 | top = top + honorHeight + spacing 118 | 119 | -- ARENE section: we create three sub-blocks, one per mode, stacked vertically 120 | local arenaBlockHeight = 18 + 2 * 18 + 6 -- title + two lines (team + rating) approx 121 | local arena = CreateSection(content, top, arenaBlockHeight * 3 + spacing * 2, "Arène") 122 | 123 | -- separator 124 | local arenaSep = arena:CreateTexture(nil, "ARTWORK") 125 | arenaSep:SetHeight(1) 126 | arenaSep:SetPoint("TOPLEFT", arena, "TOPLEFT", 0, -18) 127 | arenaSep:SetPoint("TOPRIGHT", arena, "TOPRIGHT", 0, -18) 128 | arenaSep:SetTexture(0.5, 0.5, 0.5, 0.6) 129 | 130 | -- Points d'Arène (affiché à gauche de la section Arène) 131 | arena.pointsLabel = arena:CreateFontString(nil, "OVERLAY", "GameFontNormal") 132 | arena.pointsLabel:SetPoint("TOPLEFT", arena, "TOPLEFT", 120, 0) 133 | arena.pointsLabel:SetText(MultiBot.tips.every.pvparenapoints) 134 | 135 | arena.pointsValue = arena:CreateFontString(nil, "OVERLAY", "GameFontHighlightSmall") 136 | arena.pointsValue:SetPoint("LEFT", arena.pointsLabel, "RIGHT", 6, 0) 137 | arena.pointsValue:SetText("-") 138 | 139 | -- helper to create per-mode display inside arena 140 | local function CreateArenaModeRow(parent, idx, modeLabel, offsetY) 141 | -- mode title (e.g., "Mode: 2v2") 142 | local modeText = parent:CreateFontString(nil, "OVERLAY", "GameFontNormal") 143 | modeText:SetPoint("TOPLEFT", parent, "TOPLEFT", 4, -offsetY -32) 144 | modeText:SetText(MultiBot.tips.every.pvparenamode .. modeLabel) 145 | 146 | -- team name 147 | local teamText = parent:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall") 148 | teamText:SetPoint("TOPLEFT", parent, "TOPLEFT", 4, -offsetY - 50) 149 | teamText:SetText(MultiBot.tips.every.pvparenanoteam) 150 | 151 | -- rating 152 | local ratingText = parent:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall") 153 | ratingText:SetPoint("TOPRIGHT", parent, "TOPRIGHT", -8, -offsetY - 34) 154 | ratingText:SetText(MultiBot.tips.every.pvparenanoteamrank) 155 | 156 | return { mode = modeText, team = teamText, rating = ratingText } 157 | end 158 | 159 | -- create rows for 2v2, 3v3, 5v5 160 | local modes = { "2v2", "3v3", "5v5" } 161 | local arenaRows = {} 162 | for i = 1, 3 do 163 | -- local offset = 0 + (i-1) * (arenaBlockHeight + spacing) 164 | arenaRows[modes[i]] = CreateArenaModeRow(arena, i, modes[i], 0 + (i-1) * (arenaBlockHeight + 6)) 165 | end 166 | 167 | --top = top + arenaBlockHeight * 3 + spacing * 2 168 | -- Tabs (bottom) 169 | local tabs = {} 170 | --local tabNames = { "JcJ", "Dummy" } 171 | local tabNames = { "JcJ" } 172 | 173 | for i, name in ipairs(tabNames) do 174 | local template = (_G["CharacterFrameTabButtonTemplate"] and 175 | "CharacterFrameTabButtonTemplate") or "UIPanelButtonTemplate" 176 | local tab = CreateFrame("Button", f:GetName() .. "Tab" .. i, f, template) 177 | tab:SetSize(90, 22) 178 | tab:SetText(name) 179 | tab:SetPoint("BOTTOMLEFT", f, "BOTTOMLEFT", 180 | 12 + (i - 1) * 98, 12) 181 | tab.id = i 182 | tabs[i] = tab 183 | end 184 | 185 | -- Dummy pane (shares content area) 186 | local dummy = CreateFrame("Frame", nil, f) 187 | dummy:SetPoint("TOPLEFT", content, "TOPLEFT") 188 | dummy:SetPoint("BOTTOMRIGHT", content, "BOTTOMRIGHT") 189 | dummy:Hide() 190 | dummy.text = dummy:CreateFontString(nil, "OVERLAY", "GameFontNormal") 191 | dummy.text:SetPoint("TOPLEFT", dummy, "TOPLEFT", 4, -4) 192 | dummy.text:SetText("Dummy tab (placeholder)") 193 | 194 | -- SelectTab: show/hide + visual feedback 195 | local function SelectTab(id) 196 | if id == 1 then content:Show(); dummy:Hide() else content:Hide(); dummy:Show() end 197 | for idx, t in ipairs(tabs) do 198 | if t.LockHighlight then 199 | if idx == id then t:LockHighlight() else t:UnlockHighlight() end 200 | else 201 | if idx == id and t.Disable then t:Disable() elseif t.Enable then t:Enable() end 202 | end 203 | end 204 | end 205 | 206 | for _, t in ipairs(tabs) do 207 | t:SetScript("OnClick", function(self) SelectTab(self.id) end) 208 | end 209 | 210 | SelectTab(1) 211 | 212 | -- expose references for update from chat handler 213 | f._arena = arena 214 | f._honorTotal = honorRow[1] 215 | f._arenaRows = arenaRows 216 | f._customHeader = customHeader 217 | 218 | return f 219 | end 220 | 221 | -- Create frame on login and listen for whispers 222 | local loader = CreateFrame("Frame") 223 | loader:RegisterEvent("PLAYER_LOGIN") 224 | loader:RegisterEvent("CHAT_MSG_WHISPER") 225 | loader:SetScript("OnEvent", function(self, event, ...) 226 | if event == "PLAYER_LOGIN" then 227 | if not MultiBotPVPFrame then 228 | MultiBotPVPFrame = CreateStyledFrame() 229 | end 230 | return 231 | end 232 | 233 | if event == "CHAT_MSG_WHISPER" then 234 | local msg, sender = ... 235 | if not MultiBotPVPFrame then return end 236 | 237 | -- Update header with sender name (strip realm if present) 238 | if sender and MultiBotPVPFrame._customHeader then 239 | local simpleName = sender:match("([^%-]+)") or sender 240 | simpleName = simpleName:match("([^%.%-]+)") or simpleName 241 | MultiBotPVPFrame._customHeader:SetText(MultiBot.tips.every.pvparenadata .. simpleName) 242 | end 243 | 244 | -- Parse Honor Points (both languages) 245 | local honor = msg:match("Honor Points:%s*(%d+)") or msg:match("Honor:%s*(%d+)") or msg:match("Honneur:%s*(%d+)") 246 | if honor and MultiBotPVPFrame._honorTotal then 247 | MultiBotPVPFrame._honorTotal:SetText(honor) 248 | end 249 | 250 | -- Parse Arena points (English or localized variants) 251 | local arenaPoints = msg:match("Arena points:%s*(%d+)") or 252 | msg:match("Arena points%s*[:]%s*(%d+)") or 253 | msg:match("Points d'Arène:%s*(%d+)") 254 | if arenaPoints and MultiBotPVPFrame._arena then 255 | MultiBotPVPFrame._arena.pointsValue:SetText(arenaPoints) 256 | end 257 | 258 | -- Detect explicit "no team" messages (English/French) 259 | local noTeamMsg = msg:lower():find("no[%s_-]*team") or 260 | msg:lower():find("i have no arena team") or 261 | msg:lower():find("pas d'?équipe") or 262 | msg:lower():find("pas d'?équipe d'arène") 263 | if noTeamMsg then 264 | -- Set all modes to No team / rating 0 265 | for _, mode in ipairs({"2v2","3v3","5v5"}) do 266 | local row = MultiBotPVPFrame._arenaRows[mode] 267 | if row then 268 | row.mode:SetText("Mode: " .. mode) 269 | row.team:SetText("Equipe: No team") 270 | row.rating:SetText("Cote équipe: 0") 271 | end 272 | end 273 | return 274 | end 275 | 276 | -- Otherwise parse per-mode lines and update matching rows 277 | for _, modePattern in ipairs({ "2v2", "3v3", "5v5" }) do 278 | -- try strict pattern: mode followed by colon and and (rating N) 279 | local pattern1 = modePattern .. 280 | "%s*[:]?%s*<([^>]+)>%s*%(%s*rating%s*(%d+)%s*%)" 281 | local team1, rating1 = msg:match(pattern1) 282 | if team1 then 283 | local row = MultiBotPVPFrame._arenaRows[modePattern] 284 | if row then 285 | row.mode:SetText("Mode: " .. modePattern) 286 | row.team:SetText("Equipe: " .. team1) 287 | row.rating:SetText("Cote équipe: " .. rating1) 288 | end 289 | else 290 | -- looser pattern: mode then team (with or without <>), then rating 291 | local pattern2 = modePattern .. "[:%s]*%(]+)>?%s*%(%s*rating%s*(%d+)%s*%)" 292 | local team2, rating2 = msg:match(pattern2) 293 | if team2 then 294 | local row = MultiBotPVPFrame._arenaRows[modePattern] 295 | if row then 296 | row.mode:SetText("Mode: " .. modePattern) 297 | row.team:SetText("Equipe: " .. team2) 298 | row.rating:SetText("Cote équipe: " .. rating2) 299 | end 300 | else 301 | -- fallback: if message contains modePattern and a somewhere, use them 302 | if msg:match(modePattern) then 303 | local team3 = msg:match("<([^>]+)>") 304 | local rating3 = msg:match("rating%s*(%d+)") 305 | if team3 and MultiBotPVPFrame._arenaRows[modePattern] then 306 | local row = MultiBotPVPFrame._arenaRows[modePattern] 307 | row.mode:SetText("Mode: " .. modePattern) 308 | row.team:SetText("Equipe: " .. team3) 309 | if rating3 then row.rating:SetText("Cote équipe: " .. rating3) end 310 | end 311 | end 312 | end 313 | end 314 | end 315 | end 316 | end) 317 | 318 | -- Expose helper to recreate if needed 319 | _G.MultiBotPVP_Ensure = CreateStyledFrame 320 | -------------------------------------------------------------------------------- /Strategies/MultiBotPaladin.lua: -------------------------------------------------------------------------------- 1 | MultiBot.addPaladin = function(pFrame, pCombat, pNormal) 2 | pFrame.addButton("Heal", 0, 0, "spell_holy_aspiration", MultiBot.tips.paladin.heal).setDisable() 3 | .doLeft = function(pButton) 4 | if(MultiBot.OnOffActionToTarget(pButton, "co +heal,?", "co -heal,?", pButton.getName())) then 5 | pButton.getButton("Tank").setDisable() 6 | pButton.getButton("Dps").setDisable() 7 | end 8 | end 9 | 10 | -- SEAL -- 11 | 12 | local sealButton = pFrame.addButton("Seal", -30, 0, "spell_holy_healingaura", MultiBot.tips.paladin.seal.master) 13 | sealButton.doLeft = function(pButton) 14 | MultiBot.ShowHideSwitch(pButton.parent.frames["Seal"]) 15 | end 16 | 17 | local sealFrame = pFrame.addFrame("Seal", -32, 30) 18 | sealFrame:Hide() 19 | 20 | sealFrame.addButton("SealHealth", 0, 0, "spell_holy_healingaura", MultiBot.tips.paladin.seal.bhealth) 21 | .doLeft = function(pButton) 22 | MultiBot.SelectToTarget(pButton.get(), "Seal", pButton.texture, "nc +bhealth,?", pButton.getName()) 23 | pButton.getButton("Seal").doRight = function(btn) 24 | MultiBot.OnOffActionToTarget(btn, "nc +bhealth,?", "nc -bhealth,?", btn.getName()) 25 | end 26 | end 27 | 28 | sealFrame.addButton("SealMana", 0, 26, "spell_holy_sealofwisdom", MultiBot.tips.paladin.seal.bmana) 29 | .doLeft = function(pButton) 30 | MultiBot.SelectToTarget(pButton.get(), "Seal", pButton.texture, "nc +bmana,?", pButton.getName()) 31 | pButton.getButton("Seal").doRight = function(btn) 32 | MultiBot.OnOffActionToTarget(btn, "nc +bmana,?", "nc -bmana,?", btn.getName()) 33 | end 34 | end 35 | 36 | sealFrame.addButton("SealStats", 0, 52, "spell_magic_magearmor", MultiBot.tips.paladin.seal.bstats) 37 | .doLeft = function(pButton) 38 | MultiBot.SelectToTarget(pButton.get(), "Seal", pButton.texture, "nc +bstats,?", pButton.getName()) 39 | pButton.getButton("Seal").doRight = function(btn) 40 | MultiBot.OnOffActionToTarget(btn, "nc +bstats,?", "nc -bstats,?", btn.getName()) 41 | end 42 | end 43 | 44 | sealFrame.addButton("SealDps", 0, 78, "inv_hammer_01", MultiBot.tips.paladin.seal.bdps) 45 | .doLeft = function(pButton) 46 | MultiBot.SelectToTarget(pButton.get(), "Seal", pButton.texture, "nc +bdps,?", pButton.getName()) 47 | pButton.getButton("Seal").doRight = function(btn) 48 | MultiBot.OnOffActionToTarget(btn, "nc +bdps,?", "nc -bdps,?", btn.getName()) 49 | end 50 | end 51 | 52 | -- STRATEGIES:SEAL -- 53 | 54 | if(MultiBot.isInside(pNormal, "bhealth")) then 55 | sealButton.setTexture("spell_holy_healingaura").setEnable().doRight = function(pButton) 56 | MultiBot.OnOffActionToTarget(pButton, "nc +bhealth,?", "nc -bhealth,?", pButton.getName()) 57 | end 58 | elseif(MultiBot.isInside(pNormal, "bmana")) then 59 | sealButton.setTexture("spell_holy_sealofwisdom").setEnable().doRight = function(pButton) 60 | MultiBot.OnOffActionToTarget(pButton, "nc +bmana,?", "nc -bmana,?", pButton.getName()) 61 | end 62 | elseif(MultiBot.isInside(pNormal, "bstats")) then 63 | sealButton.setTexture("spell_magic_magearmor").setEnable().doRight = function(pButton) 64 | MultiBot.OnOffActionToTarget(pButton, "nc +bstats,?", "nc -bstats,?", pButton.getName()) 65 | end 66 | elseif(MultiBot.isInside(pNormal, "bdps")) then 67 | sealButton.setTexture("inv_hammer_01").setEnable().doRight = function(pButton) 68 | MultiBot.OnOffActionToTarget(pButton, "nc +bdps,?", "nc -bdps,?", pButton.getName()) 69 | end 70 | end 71 | 72 | -- NON-COMBAT-AURA -- 73 | 74 | local nonCombatAuraButton = pFrame.addButton("NonCombatAura", -60, 0, "spell_holy_crusaderaura", MultiBot.tips.paladin.naura.master) 75 | nonCombatAuraButton.doLeft = function(pButton) 76 | MultiBot.ShowHideSwitch(pButton.parent.frames["NonCombatAura"]) 77 | end 78 | 79 | local nonCombatAuraFrame = pFrame.addFrame("NonCombatAura", -62, 30) 80 | nonCombatAuraFrame:Hide() 81 | 82 | nonCombatAuraFrame.addButton("NonCombatSpeed", 0, 0, "spell_holy_crusaderaura", MultiBot.tips.paladin.naura.bspeed) 83 | .doLeft = function(pButton) 84 | MultiBot.SelectToTarget(pButton.get(), "NonCombatAura", pButton.texture, "nc +bspeed,?", pButton.getName()) 85 | pButton.getButton("NonCombatAura").doRight = function(btn) 86 | MultiBot.OnOffActionToTarget(btn, "nc +bspeed,?", "nc -bspeed,?", btn.getName()) 87 | end 88 | end 89 | 90 | nonCombatAuraFrame.addButton("NonCombatFire", 0, 26, "spell_fire_sealoffire", MultiBot.tips.paladin.naura.rfire) 91 | .doLeft = function(pButton) 92 | MultiBot.SelectToTarget(pButton.get(), "NonCombatAura", pButton.texture, "nc +rfire,?", pButton.getName()) 93 | pButton.getButton("NonCombatAura").doRight = function(btn) 94 | MultiBot.OnOffActionToTarget(btn, "nc +rfire,?", "nc -rfire,?", btn.getName()) 95 | end 96 | end 97 | 98 | nonCombatAuraFrame.addButton("NonCombatFrost", 0, 52, "spell_frost_wizardmark", MultiBot.tips.paladin.naura.rfrost) 99 | .doLeft = function(pButton) 100 | MultiBot.SelectToTarget(pButton.get(), "NonCombatAura", pButton.texture, "nc +rfrost,?", pButton.getName()) 101 | pButton.getButton("NonCombatAura").doRight = function(btn) 102 | MultiBot.OnOffActionToTarget(btn, "nc +rfrost,?", "nc -rfrost,?", btn.getName()) 103 | end 104 | end 105 | 106 | nonCombatAuraFrame.addButton("NonCombatShadow", 0, 78, "spell_shadow_sealofkings", MultiBot.tips.paladin.naura.rshadow) 107 | .doLeft = function(pButton) 108 | MultiBot.SelectToTarget(pButton.get(), "NonCombatAura", pButton.texture, "nc +rshadow,?", pButton.getName()) 109 | pButton.getButton("NonCombatAura").doRight = function(btn) 110 | MultiBot.OnOffActionToTarget(btn, "nc +rshadow,?", "nc -rshadow,?", btn.getName()) 111 | end 112 | end 113 | 114 | nonCombatAuraFrame.addButton("NonCombatDamage", 0, 104, "spell_holy_auraoflight", MultiBot.tips.paladin.naura.baoe) 115 | .doLeft = function(pButton) 116 | MultiBot.SelectToTarget(pButton.get(), "NonCombatAura", pButton.texture, "nc +baoe,?", pButton.getName()) 117 | pButton.getButton("NonCombatAura").doRight = function(btn) 118 | MultiBot.OnOffActionToTarget(btn, "nc +baoe,?", "nc -baoe,?", btn.getName()) 119 | end 120 | end 121 | 122 | nonCombatAuraFrame.addButton("NonCombatArmor", 0, 130, "spell_holy_devotionaura", MultiBot.tips.paladin.naura.barmor) 123 | .doLeft = function(pButton) 124 | MultiBot.SelectToTarget(pButton.get(), "NonCombatAura", pButton.texture, "nc +barmor,?", pButton.getName()) 125 | pButton.getButton("NonCombatAura").doRight = function(btn) 126 | MultiBot.OnOffActionToTarget(btn, "nc +barmor,?", "nc -barmor,?", btn.getName()) 127 | end 128 | end 129 | 130 | nonCombatAuraFrame.addButton("NonCombatCast", 0, 156, "spell_holy_mindsooth", MultiBot.tips.paladin.naura.bcast) 131 | .doLeft = function(pButton) 132 | MultiBot.SelectToTarget(pButton.get(), "NonCombatAura", pButton.texture, "nc +bcast,?", pButton.getName()) 133 | pButton.getButton("NonCombatAura").doRight = function(btn) 134 | MultiBot.OnOffActionToTarget(btn, "nc +bcast,?", "nc -bcast,?", btn.getName()) 135 | end 136 | end 137 | 138 | -- STRATEGIES:NON-COMBAT-AURA -- 139 | 140 | if(MultiBot.isInside(pNormal, "bspeed")) then 141 | nonCombatAuraButton.setTexture("spell_holy_crusaderaura").setEnable().doRight = function(pButton) 142 | MultiBot.OnOffActionToTarget(pButton, "nc +bspeed,?", "nc -bspeed,?", pButton.getName()) 143 | end 144 | elseif(MultiBot.isInside(pNormal, "rfire")) then 145 | nonCombatAuraButton.setTexture("spell_fire_sealoffire").setEnable().doRight = function(pButton) 146 | MultiBot.OnOffActionToTarget(pButton, "nc +rfire,?", "nc -rfire,?", pButton.getName()) 147 | end 148 | elseif(MultiBot.isInside(pNormal, "rfrost")) then 149 | nonCombatAuraButton.setTexture("spell_frost_wizardmark").setEnable().doRight = function(pButton) 150 | MultiBot.OnOffActionToTarget(pButton, "nc +rfrost,?", "nc -rfrost,?", pButton.getName()) 151 | end 152 | elseif(MultiBot.isInside(pNormal, "rshadow")) then 153 | nonCombatAuraButton.setTexture("spell_shadow_sealofkings").setEnable().doRight = function(pButton) 154 | MultiBot.OnOffActionToTarget(pButton, "nc +rshadow,?", "nc -rshadow,?", pButton.getName()) 155 | end 156 | elseif(MultiBot.isInside(pNormal, "baoe")) then 157 | nonCombatAuraButton.setTexture("spell_holy_auraoflight").setEnable().doRight = function(pButton) 158 | MultiBot.OnOffActionToTarget(pButton, "nc +baoe,?", "nc -baoe,?", pButton.getName()) 159 | end 160 | elseif(MultiBot.isInside(pNormal, "barmor")) then 161 | nonCombatAuraButton.setTexture("spell_holy_devotionaura").setEnable().doRight = function(pButton) 162 | MultiBot.OnOffActionToTarget(pButton, "nc +barmor,?", "nc -barmor,?", pButton.getName()) 163 | end 164 | elseif(MultiBot.isInside(pNormal, "bcast")) then 165 | nonCombatAuraButton.setTexture("spell_holy_mindsooth").setEnable().doRight = function(pButton) 166 | MultiBot.OnOffActionToTarget(pButton, "nc +bcast,?", "nc -bcast,?", pButton.getName()) 167 | end 168 | end 169 | 170 | -- COMBAT-AURA -- 171 | 172 | local combatAuraButton = pFrame.addButton("CombatAura", -90, 0, "spell_holy_crusaderaura", MultiBot.tips.paladin.caura.master) 173 | combatAuraButton.doLeft = function(pButton) 174 | MultiBot.ShowHideSwitch(pButton.parent.frames["CombatAura"]) 175 | end 176 | 177 | local combatAuraFrame = pFrame.addFrame("CombatAura", -92, 30) 178 | combatAuraFrame:Hide() 179 | 180 | combatAuraFrame.addButton("CombatSpeed", 0, 0, "spell_holy_crusaderaura", MultiBot.tips.paladin.caura.bspeed) 181 | .doLeft = function(pButton) 182 | MultiBot.SelectToTarget(pButton.get(), "CombatAura", pButton.texture, "co +bspeed,?", pButton.getName()) 183 | pButton.getButton("CombatAura").doRight = function(btn) 184 | MultiBot.OnOffActionToTarget(btn, "co +bspeed,?", "co -bspeed,?", btn.getName()) 185 | end 186 | end 187 | 188 | combatAuraFrame.addButton("CombatFire", 0, 26, "spell_fire_sealoffire", MultiBot.tips.paladin.caura.rfire) 189 | .doLeft = function(pButton) 190 | MultiBot.SelectToTarget(pButton.get(), "CombatAura", pButton.texture, "co +rfire,?", pButton.getName()) 191 | pButton.getButton("CombatAura").doRight = function(btn) 192 | MultiBot.OnOffActionToTarget(btn, "co +rfire,?", "co -rfire,?", btn.getName()) 193 | end 194 | end 195 | 196 | combatAuraFrame.addButton("CombatFrost", 0, 52, "spell_frost_wizardmark", MultiBot.tips.paladin.caura.rfrost) 197 | .doLeft = function(pButton) 198 | MultiBot.SelectToTarget(pButton.get(), "CombatAura", pButton.texture, "co +rfrost,?", pButton.getName()) 199 | pButton.getButton("CombatAura").doRight = function(btn) 200 | MultiBot.OnOffActionToTarget(btn, "co +rfrost,?", "co -rfrost,?", btn.getName()) 201 | end 202 | end 203 | 204 | combatAuraFrame.addButton("CombatShadow", 0, 78, "spell_shadow_sealofkings", MultiBot.tips.paladin.caura.rshadow) 205 | .doLeft = function(pButton) 206 | MultiBot.SelectToTarget(pButton.get(), "CombatAura", pButton.texture, "co +rshadow,?", pButton.getName()) 207 | pButton.getButton("CombatAura").doRight = function(btn) 208 | MultiBot.OnOffActionToTarget(btn, "co +rshadow,?", "co -rshadow,?", btn.getName()) 209 | end 210 | end 211 | 212 | combatAuraFrame.addButton("CombatDamage", 0, 104, "spell_holy_auraoflight", MultiBot.tips.paladin.caura.baoe) 213 | .doLeft = function(pButton) 214 | MultiBot.SelectToTarget(pButton.get(), "CombatAura", pButton.texture, "co +baoe,?", pButton.getName()) 215 | pButton.getButton("CombatAura").doRight = function(btn) 216 | MultiBot.OnOffActionToTarget(btn, "co +baoe,?", "co -baoe,?", btn.getName()) 217 | end 218 | end 219 | 220 | combatAuraFrame.addButton("CombatArmor", 0, 130, "spell_holy_devotionaura", MultiBot.tips.paladin.caura.barmor) 221 | .doLeft = function(pButton) 222 | MultiBot.SelectToTarget(pButton.get(), "CombatAura", pButton.texture, "co +barmor,?", pButton.getName()) 223 | pButton.getButton("CombatAura").doRight = function(btn) 224 | MultiBot.OnOffActionToTarget(btn, "co +barmor,?", "co -barmor,?", btn.getName()) 225 | end 226 | end 227 | 228 | combatAuraFrame.addButton("CombatCast", 0, 156, "spell_holy_mindsooth", MultiBot.tips.paladin.caura.bcast) 229 | .doLeft = function(pButton) 230 | MultiBot.SelectToTarget(pButton.get(), "CombatAura", pButton.texture, "co +bcast,?", pButton.getName()) 231 | pButton.getButton("CombatAura").doRight = function(btn) 232 | MultiBot.OnOffActionToTarget(btn, "co +bcast,?", "co -bcast,?", btn.getName()) 233 | end 234 | end 235 | 236 | -- STRATEGIES:COMBAT-AURA -- 237 | 238 | if(MultiBot.isInside(pCombat, "bspeed")) then 239 | combatAuraButton.setTexture("spell_holy_crusaderaura").setEnable().doRight = function(pButton) 240 | MultiBot.OnOffActionToTarget(pButton, "co +bspeed,?", "co -bspeed,?", pButton.getName()) 241 | end 242 | elseif(MultiBot.isInside(pCombat, "rfire")) then 243 | combatAuraButton.setTexture("spell_fire_sealoffire").setEnable().doRight = function(pButton) 244 | MultiBot.OnOffActionToTarget(pButton, "co +rfire,?", "co -rfire,?", pButton.getName()) 245 | end 246 | elseif(MultiBot.isInside(pCombat, "rfrost")) then 247 | combatAuraButton.setTexture("spell_frost_wizardmark").setEnable().doRight = function(pButton) 248 | MultiBot.OnOffActionToTarget(pButton, "co +rfrost,?", "co -rfrost,?", pButton.getName()) 249 | end 250 | elseif(MultiBot.isInside(pCombat, "rshadow")) then 251 | combatAuraButton.setTexture("spell_shadow_sealofkings").setEnable().doRight = function(pButton) 252 | MultiBot.OnOffActionToTarget(pButton, "co +rshadow,?", "co -rshadow,?", pButton.getName()) 253 | end 254 | elseif(MultiBot.isInside(pCombat, "baoe")) then 255 | combatAuraButton.setTexture("spell_holy_auraoflight").setEnable().doRight = function(pButton) 256 | MultiBot.OnOffActionToTarget(pButton, "co +baoe,?", "co -baoe,?", pButton.getName()) 257 | end 258 | elseif(MultiBot.isInside(pCombat, "barmor")) then 259 | combatAuraButton.setTexture("spell_holy_devotionaura").setEnable().doRight = function(pButton) 260 | MultiBot.OnOffActionToTarget(pButton, "co +barmor,?", "co -barmor,?", pButton.getName()) 261 | end 262 | elseif(MultiBot.isInside(pCombat, "bcast")) then 263 | combatAuraButton.setTexture("spell_holy_mindsooth").setEnable().doRight = function(pButton) 264 | MultiBot.OnOffActionToTarget(pButton, "co +bcast,?", "co -bcast,?", pButton.getName()) 265 | end 266 | end 267 | 268 | -- DPS -- 269 | 270 | pFrame.addButton("DpsControl", -120, 0, "ability_warrior_challange", MultiBot.tips.paladin.dps.master) 271 | .doLeft = function(pButton) 272 | MultiBot.ShowHideSwitch(pButton.getFrame("DpsControl")) 273 | end 274 | 275 | local dpsFrame = pFrame.addFrame("DpsControl", -122, 30) 276 | dpsFrame:Hide() 277 | 278 | dpsFrame.addButton("DpsAssist", 0, 0, "spell_holy_heroism", MultiBot.tips.paladin.dps.dpsAssist).setDisable() 279 | .doLeft = function(pButton) 280 | if(MultiBot.OnOffActionToTarget(pButton, "co +dps assist,?", "co -dps assist,?", pButton.getName())) then 281 | pButton.getButton("TankAssist").setDisable() 282 | pButton.getButton("DpsAoe").setDisable() 283 | end 284 | end 285 | 286 | dpsFrame.addButton("DpsAoe", 0, 26, "spell_holy_surgeoflight", MultiBot.tips.paladin.dps.dpsAoe).setDisable() 287 | .doLeft = function(pButton) 288 | if(MultiBot.OnOffActionToTarget(pButton, "co +dps aoe,?", "co -dps aoe,?", pButton.getName())) then 289 | pButton.getButton("TankAssist").setDisable() 290 | pButton.getButton("DpsAssist").setDisable() 291 | end 292 | end 293 | 294 | dpsFrame.addButton("Dps", 0, 52, "spell_holy_divinepurpose", MultiBot.tips.paladin.dps.dps).setDisable() 295 | .doLeft = function(pButton) 296 | if(MultiBot.OnOffActionToTarget(pButton, "co +dps,?", "co -dps,?", pButton.getName())) then 297 | pButton.getButton("Heal").setDisable() 298 | pButton.getButton("Tank").setDisable() 299 | end 300 | end 301 | 302 | -- OFF-HEAL -- 303 | dpsFrame.addButton("OffHeal", 0, 78, "Spell_Holy_FlashHeal", MultiBot.tips.paladin.dps.offheal).setDisable() 304 | .doLeft = function(pButton) 305 | if (MultiBot.OnOffActionToTarget( 306 | pButton, "co +offheal,?", "co -offheal,?", 307 | pButton.getName())) then 308 | 309 | -- Modes exclusifs 310 | pButton.getButton("Dps").setDisable() 311 | pButton.getButton("Heal").setDisable() 312 | end 313 | end 314 | 315 | -- Added missing Healer DPS 316 | dpsFrame.addButton("HealerDps", 0, 104, "INV_Alchemy_Elixir_02", MultiBot.tips.paladin.dps.healerdps).setDisable() 317 | .doLeft = function(pButton) 318 | if(MultiBot.OnOffActionToTarget(pButton, "co +healer dps,?", "co -healer dps,?", pButton.getName())) then 319 | pButton.getButton("TankAssist").setDisable() 320 | pButton.getButton("DpsAoe").setDisable() 321 | pButton.getButton("DpsAssist").setDisable() 322 | end 323 | end 324 | 325 | -- ASSIST -- 326 | 327 | pFrame.addButton("TankAssist", -150, 0, "ability_warrior_innerrage", MultiBot.tips.paladin.tankAssist).setDisable() 328 | .doLeft = function(pButton) 329 | if(MultiBot.OnOffActionToTarget(pButton, "co +tank assist,?", "co -tank assist,?", pButton.getName())) then 330 | pButton.getButton("DpsAssist").setDisable() 331 | pButton.getButton("DpsAoe").setDisable() 332 | end 333 | end 334 | 335 | -- TANK -- 336 | 337 | pFrame.addButton("Tank", -180, 0, "ability_warrior_shieldmastery", MultiBot.tips.paladin.tank).setDisable() 338 | .doLeft = function(pButton) 339 | if(MultiBot.OnOffActionToTarget(pButton, "co +tank,?", "co -tank,?", pButton.getName())) then 340 | pButton.getButton("Heal").setDisable() 341 | pButton.getButton("Dps").setDisable() 342 | end 343 | end 344 | 345 | -- STRATEGIES -- 346 | 347 | if(MultiBot.isInside(pCombat, "dps,")) then pFrame.getButton("Dps").setEnable() end 348 | if(MultiBot.isInside(pCombat, "heal")) then pFrame.getButton("Heal").setEnable() end 349 | if(MultiBot.isInside(pCombat, "tank,")) then pFrame.getButton("Tank").setEnable() end 350 | if(MultiBot.isInside(pCombat, "dps aoe")) then pFrame.getButton("DpsAoe").setEnable() end 351 | if(MultiBot.isInside(pCombat, "offheal")) then pFrame.getButton("OffHeal").setEnable() end 352 | if(MultiBot.isInside(pCombat, "healer dps")) then pFrame.getButton("HealerDps").setEnable() end 353 | if(MultiBot.isInside(pCombat, "dps assist")) then pFrame.getButton("DpsAssist").setEnable() end 354 | if(MultiBot.isInside(pCombat, "tank assist")) then pFrame.getButton("TankAssist").setEnable() end 355 | end --------------------------------------------------------------------------------