What's new
  • Visit Rebornbuddy
  • Visit Panda Profiles
  • Visit LLamamMagic
  • Visit Resources
  • Visit Downloads
  • Visit Portal
RebornBuddy Forums

Register a free account today to become a member! Once signed in, you'll be able to participate on this site by adding your own topics and posts, as well as connect with other members through your own private inbox!

Simcraft Implemented, a Raidbot Derivate with Integrated Combat

Kane49_2

New Member
Joined
Jun 13, 2012
Messages
450
Yo guys !

Im a big big fan of Simcraft, for those of you who don't know what that is heres a link
In Simcraft, to model what the character has to do to achieve the best possible DPS they use a system called Action priority list which in itself is not far from the Behavior Trees used in todays Combat Routines which this Botbase tries to replicate.

Technical stuff, click if you wanna read ^^
Heres a small example

Code:
actions+=/arcane_torrent,if=rage<rage.max-40
actions+=/call_action_list,name=single_target,if=active_enemies=1

actions.single_target=bloodbath
actions.single_target+=/recklessness,if=target.health.pct<20

So at first i tried to use Singular and modify it so it follows the simcraft rotation but quickly got annoyed by the large overhead and basically having to rethink every single statement and sometimes entire concepts.
I decided to write the whole thing from scratch using Altecs Prot Warrior Routine for some of the basics while trying to allow the User to write Behavior Code as close to simcraft as possible.
Using Dynamics, Caching, LazyInitialisation and some Maneuvering it was possible to enable very special C# code thats very close to actual Simcraft APL Script.

To implement a new Class/Specc Combo you simply need to write a single Function, heres the Combat Rogue for example:

Code:
        [Behavior(WoWClass.Rogue, WoWSpec.RogueCombat, WoWContext.PvE)]
        public void GenerateCombatPvEBehavior()
        {
            actions += Cast(Preparation, ret => !buff[Vanish].up && cooldown[Vanish].remains > 30);
            actions += UseItem(13, ret => cooldowns_enabled && melee_range);
            actions += Cast(Blade_Flurry, ret => (active_enemies >= 2 && !buff[Blade_Flurry].up));
            actions += Cast(Ambush);
            actions += Cast(Vanish,ret =>cooldowns_enabled && Time > 10 &&(combo_points < 3 || (talent[Anticipation].enabled && anticipation_charges < 3) ||(combo_points < 4 || (talent[Anticipation].enabled && anticipation_charges < 4))) &&((talent[Shadow_Focus].enabled && buff[Adrenaline_Rush].down && energy < 90 && energy >= 15) ||(talent[Subterfuge].enabled && energy >= 90) ||(!talent[Shadow_Focus].enabled && !talent[Subterfuge].enabled && energy >= 60)));
            actions += Cast(Slice_and_Dice,ret =>buff[Slice_and_Dice].remains < 2 ||((target.time_to_die > 45 && combo_points == 5 && buff[Slice_and_Dice].remains < 12) &&buff[Deep_Insight].down));
            actions += CallActionList("adrenaline_rush",ret => target.melee_range && (energy < 35 || bloodlust_up) && cooldown[Killing_Spree].remains > 10);
            actions += CallActionList("killing_spree",ret =>(energy < 40 || (bloodlust_up) || BloodlustRemains > 20) && buff[Adrenaline_Rush].down &&(!talent[Shadow_Reflection].enabled || cooldown[Shadow_Reflection].remains > 30 ||buff[Shadow_Reflection].remains > 3));
            actions += CallActionList("generator",ret =>combo_points < 5 || !dot[Revealing_Strike].Ticking ||(talent[Anticipation].enabled && anticipation_charges <= 4 && buff[Deep_Insight].down));
            actions += CallActionList("finisher",ret =>combo_points == 5 && dot[Revealing_Strike].Ticking &&(buff[Deep_Insight].up || !talent[Anticipation].enabled ||(talent[Anticipation].enabled && anticipation_charges >= 4)));

            actions.adrenaline_rush += Cast(Adrenaline_Rush, ret => cooldowns_enabled);

            actions.killing_spree += Cast(Killing_Spree, ret => cooldowns_enabled);

            actions.generator += Cast(Revealing_Strike,ret =>(combo_points == 4 && dot[Revealing_Strike].Remains < 7.2 &&(target.time_to_die > dot[Revealing_Strike].Remains + 7.2)) || !Ticking);
            actions.generator += Cast(Sinister_Strike, ret => dot[Revealing_Strike].Ticking);

            actions.finisher += Cast(Death_from_Above);
            actions.finisher += Cast(Eviscerate);
        }

The Botbase will automatically select the function based on the properties you see above the method head.

There are 3 Hotkeys that you can define in the Bot Settings, Cooldowns, AOE and Execution.
Execution is to stop the bot completely, nothing will be done :)
cooldowns_enabled and aoe_enabled need to be checked by the APL itself to enable the player to for example to block AOE when boss mechanics call for it.

1. Botbase with integrated Combat
2. No Movement or Plugin nonsense
3. Classes already implemented are: Fury Warrior, Windwalker Monk, Combat Rogue, Subtlety Rogue, Survival Hunter
4. 3 Hotkeys to steer Execution, Cooldowns and AOE Usage.
5. Optimized Rotations, Simcraft APL Style
6. Highly performant via FrameLock and Caching, one iteration of the combat Routine takes less than 10ms
7. 15 Actions per Second (you can increase this but why :P ?)

https://github.com/insaneKane/simpl

Heres the Github, you dont need GIT you can just download the ZIP.
Remember, this goes into your Honorbuddy/Bots Folder :)

PS:
Combat Rogues, the Bot will enable Bladeflurry once there are two targets but you will have to turn it off manually since its hard to programmatically decide when it should be turned off.




You can now easily create your own Rotations ! Check out the profile folder for (mostly working XD) examples :)

Hunter / Warrior / Combat/Assa Rogue / Moonkin / Deathknight / Monk should work out of the Box
Mage works but i dont know if it works correctly
I dont have a warlock to test things, the apls seem super complicated though so it probably has some bugs
Shaman should work as well

Feral / Sub Rogue / Shadow Priest default profiles do not work, you will need to write your own.
Again check the profiles folder for examples its pretty easy

You can aso use profiles you import from simcraft, simply put your imported character in a simc file inside the profiles folder


Profiles can now be found under Honorbuddy/Simcraft Profiles, if you dont have that folder you can create it or the bot will :)
Profile Pack:
View attachment Profiles.zip

Its better if you Simcraft your character and use those though :)
 
Last edited:
May i ask, do we have to chose any CR? or we just cancel wen it pops up?

Thank you!
 
wow nice :p can you make a Ret CR for it :p!

Thanks again
 
Does it use execute,cooldowns,aoe and burst by it self ? as i would like that
 
wow nice :p can you make a Ret CR for it :p!

Thanks again

Hmm maybe ^^ the Simcraft pala APL is pretty complicated but it should be easy to port its just a lot of typing


actions=rebuke
actions+=/potion,name=draenic_strength,if=(buff.bloodlust.react|buff.avenging_wrath.up|target.time_to_die<=40)
actions+=/auto_attack
actions+=/speed_of_light,if=movement.distance>5
actions+=/judgment,if=talent.empowered_seals.enabled&time<2
actions+=/execution_sentence
actions+=/lights_hammer
actions+=/use_item,name=vial_of_convulsive_shadows,if=buff.avenging_wrath.up
actions+=/holy_avenger,sync=seraphim,if=talent.seraphim.enabled
actions+=/holy_avenger,if=holy_power<=2&!talent.seraphim.enabled
actions+=/avenging_wrath,sync=seraphim,if=talent.seraphim.enabled
actions+=/avenging_wrath,if=!talent.seraphim.enabled
actions+=/blood_fury
actions+=/berserking
actions+=/arcane_torrent
actions+=/seraphim
actions+=/wait,sec=cooldown.seraphim.remains,if=talent.seraphim.enabled&cooldown.seraphim.remains>0&cooldown.seraphim.remains<gcd.max&holy_power>=5
actions+=/call_action_list,name=cleave,if=active_enemies>=3
actions+=/call_action_list,name=single

actions.single=divine_storm,if=buff.divine_crusader.react&(holy_power=5|buff.holy_avenger.up&holy_power>=3)&buff.final_verdict.up
actions.single+=/divine_storm,if=buff.divine_crusader.react&(holy_power=5|buff.holy_avenger.up&holy_power>=3)&active_enemies=2&!talent.final_verdict.enabled
actions.single+=/divine_storm,if=(holy_power=5|buff.holy_avenger.up&holy_power>=3)&active_enemies=2&buff.final_verdict.up
actions.single+=/divine_storm,if=buff.divine_crusader.react&(holy_power=5|buff.holy_avenger.up&holy_power>=3)&(talent.seraphim.enabled&cooldown.seraphim.remains<gcd*4)
actions.single+=/templars_verdict,if=holy_power=5|buff.holy_avenger.up&holy_power>=3&(!talent.seraphim.enabled|cooldown.seraphim.remains>gcd*4)
actions.single+=/templars_verdict,if=buff.divine_purpose.react&buff.divine_purpose.remains<3
actions.single+=/divine_storm,if=buff.divine_crusader.react&buff.divine_crusader.remains<3&!talent.final_verdict.enabled
actions.single+=/final_verdict,if=holy_power=5|buff.holy_avenger.up&holy_power>=3
actions.single+=/final_verdict,if=buff.divine_purpose.react&buff.divine_purpose.remains<3
actions.single+=/hammer_of_wrath
actions.single+=/judgment,if=talent.empowered_seals.enabled&seal.truth&buff.maraads_truth.remains<cooldown.judgment.duration
actions.single+=/judgment,if=talent.empowered_seals.enabled&seal.righteousness&buff.liadrins_righteousness.remains<cooldown.judgment.duration
actions.single+=/judgment,if=talent.empowered_seals.enabled&seal.righteousness&cooldown.avenging_wrath.remains<cooldown.judgment.duration
actions.single+=/exorcism,if=buff.blazing_contempt.up&holy_power<=2&buff.holy_avenger.down
actions.single+=/seal_of_truth,if=talent.empowered_seals.enabled&buff.maraads_truth.down
actions.single+=/seal_of_truth,if=talent.empowered_seals.enabled&cooldown.avenging_wrath.remains<cooldown.judgment.duration&buff.liadrins_righteousness.remains>cooldown.judgment.duration
actions.single+=/seal_of_righteousness,if=talent.empowered_seals.enabled&buff.maraads_truth.remains>cooldown.judgment.duration&buff.liadrins_righteousness.down&!buff.avenging_wrath.up&!buff.bloodlust.up
actions.single+=/divine_storm,if=buff.divine_crusader.react&buff.final_verdict.up&(buff.avenging_wrath.up|target.health.pct<35)
actions.single+=/divine_storm,if=active_enemies=2&buff.final_verdict.up&(buff.avenging_wrath.up|target.health.pct<35)
actions.single+=/final_verdict,if=buff.avenging_wrath.up|target.health.pct<35
actions.single+=/divine_storm,if=buff.divine_crusader.react&active_enemies=2&(buff.avenging_wrath.up|target.health.pct<35)&!talent.final_verdict.enabled
actions.single+=/templars_verdict,if=holy_power=5&(buff.avenging_wrath.up|target.health.pct<35)&(!talent.seraphim.enabled|cooldown.seraphim.remains>gcd*3)
actions.single+=/templars_verdict,if=holy_power=4&(buff.avenging_wrath.up|target.health.pct<35)&(!talent.seraphim.enabled|cooldown.seraphim.remains>gcd*4)
actions.single+=/templars_verdict,if=holy_power=3&(buff.avenging_wrath.up|target.health.pct<35)&(!talent.seraphim.enabled|cooldown.seraphim.remains>gcd*5)
actions.single+=/crusader_strike,if=holy_power<5&talent.seraphim.enabled
actions.single+=/crusader_strike,if=holy_power<=3|(holy_power=4&target.health.pct>=35&buff.avenging_wrath.down)
actions.single+=/divine_storm,if=buff.divine_crusader.react&(buff.avenging_wrath.up|target.health.pct<35)&!talent.final_verdict.enabled
actions.single+=/judgment,cycle_targets=1,if=last_judgment_target!=target&glyph.double_jeopardy.enabled&holy_power<5
actions.single+=/exorcism,if=glyph.mass_exorcism.enabled&active_enemies>=2&holy_power<5&!glyph.double_jeopardy.enabled
actions.single+=/judgment,if=holy_power<5&talent.seraphim.enabled
actions.single+=/judgment,if=holy_power<=3|(holy_power=4&cooldown.crusader_strike.remains>=gcd*2&target.health.pct>35&buff.avenging_wrath.down)
actions.single+=/divine_storm,if=buff.divine_crusader.react&buff.final_verdict.up
actions.single+=/divine_storm,if=active_enemies=2&holy_power>=4&buff.final_verdict.up
actions.single+=/final_verdict,if=buff.divine_purpose.react
actions.single+=/final_verdict,if=holy_power>=4
actions.single+=/divine_storm,if=buff.divine_crusader.react&active_enemies=2&holy_power>=4&!talent.final_verdict.enabled
actions.single+=/templars_verdict,if=buff.divine_purpose.react
actions.single+=/divine_storm,if=buff.divine_crusader.react&!talent.final_verdict.enabled
actions.single+=/templars_verdict,if=holy_power>=4&(!talent.seraphim.enabled|cooldown.seraphim.remains>gcd*5)
actions.single+=/seal_of_truth,if=talent.empowered_seals.enabled&buff.maraads_truth.remains<cooldown.judgment.duration
actions.single+=/seal_of_righteousness,if=talent.empowered_seals.enabled&buff.liadrins_righteousness.remains<cooldown.judgment.duration&!buff.bloodlust.up
actions.single+=/exorcism,if=holy_power<5&talent.seraphim.enabled
actions.single+=/exorcism,if=holy_power<=3|(holy_power=4&(cooldown.judgment.remains>=gcd*2&cooldown.crusader_strike.remains>=gcd*2&target.health.pct>35&buff.avenging_wrath.down))
actions.single+=/divine_storm,if=active_enemies=2&holy_power>=3&buff.final_verdict.up
actions.single+=/final_verdict,if=holy_power>=3
actions.single+=/templars_verdict,if=holy_power>=3&(!talent.seraphim.enabled|cooldown.seraphim.remains>gcd*6)
actions.single+=/holy_prism

actions.cleave=final_verdict,if=buff.final_verdict.down&holy_power=5
actions.cleave+=/divine_storm,if=buff.divine_crusader.react&holy_power=5&buff.final_verdict.up
actions.cleave+=/divine_storm,if=holy_power=5&buff.final_verdict.up
actions.cleave+=/divine_storm,if=buff.divine_crusader.react&holy_power=5&!talent.final_verdict.enabled
actions.cleave+=/divine_storm,if=holy_power=5&(!talent.seraphim.enabled|cooldown.seraphim.remains>gcd*4)&!talent.final_verdict.enabled
actions.cleave+=/hammer_of_wrath
actions.cleave+=/judgment,if=talent.empowered_seals.enabled&seal.righteousness&buff.liadrins_righteousness.remains<cooldown.judgment.duration
actions.cleave+=/exorcism,if=buff.blazing_contempt.up&holy_power<=2&buff.holy_avenger.down
actions.cleave+=/divine_storm,if=buff.divine_crusader.react&buff.final_verdict.up&(buff.avenging_wrath.up|target.health.pct<35)
actions.cleave+=/divine_storm,if=buff.final_verdict.up&(buff.avenging_wrath.up|target.health.pct<35)
actions.cleave+=/final_verdict,if=buff.final_verdict.down&(buff.avenging_wrath.up|target.health.pct<35)
actions.cleave+=/divine_storm,if=buff.divine_crusader.react&(buff.avenging_wrath.up|target.health.pct<35)&!talent.final_verdict.enabled
actions.cleave+=/divine_storm,if=holy_power=5&(buff.avenging_wrath.up|target.health.pct<35)&(!talent.seraphim.enabled|cooldown.seraphim.remains>gcd*3)&!talent.final_verdict.enabled
actions.cleave+=/divine_storm,if=holy_power=4&(buff.avenging_wrath.up|target.health.pct<35)&(!talent.seraphim.enabled|cooldown.seraphim.remains>gcd*4)&!talent.final_verdict.enabled
actions.cleave+=/divine_storm,if=holy_power=3&(buff.avenging_wrath.up|target.health.pct<35)&(!talent.seraphim.enabled|cooldown.seraphim.remains>gcd*5)&!talent.final_verdict.enabled
actions.cleave+=/hammer_of_the_righteous,if=active_enemies>=4&holy_power<5&talent.seraphim.enabled
actions.cleave+=/hammer_of_the_righteous,,if=active_enemies>=4&(holy_power<=3|(holy_power=4&target.health.pct>=35&buff.avenging_wrath.down))
actions.cleave+=/crusader_strike,if=holy_power<5&talent.seraphim.enabled
actions.cleave+=/crusader_strike,if=holy_power<=3|(holy_power=4&target.health.pct>=35&buff.avenging_wrath.down)
actions.cleave+=/exorcism,if=glyph.mass_exorcism.enabled&holy_power<5
actions.cleave+=/judgment,cycle_targets=1,if=glyph.double_jeopardy.enabled&holy_power<5
actions.cleave+=/judgment,if=holy_power<5&talent.seraphim.enabled
actions.cleave+=/judgment,if=holy_power<=3|(holy_power=4&cooldown.crusader_strike.remains>=gcd*2&target.health.pct>35&buff.avenging_wrath.down)
actions.cleave+=/divine_storm,if=buff.divine_crusader.react&buff.final_verdict.up
actions.cleave+=/divine_storm,if=buff.divine_purpose.react&buff.final_verdict.up
actions.cleave+=/divine_storm,if=holy_power>=4&buff.final_verdict.up
actions.cleave+=/final_verdict,if=buff.divine_purpose.react&buff.final_verdict.down
actions.cleave+=/final_verdict,if=holy_power>=4&buff.final_verdict.down
actions.cleave+=/divine_storm,if=buff.divine_crusader.react&!talent.final_verdict.enabled
actions.cleave+=/divine_storm,if=holy_power>=4&(!talent.seraphim.enabled|cooldown.seraphim.remains>gcd*5)&!talent.final_verdict.enabled
actions.cleave+=/exorcism,if=holy_power<5&talent.seraphim.enabled
actions.cleave+=/exorcism,if=holy_power<=3|(holy_power=4&(cooldown.judgment.remains>=gcd*2&cooldown.crusader_strike.remains>=gcd*2&target.health.pct>35&buff.avenging_wrath.down))
actions.cleave+=/divine_storm,if=holy_power>=3&(!talent.seraphim.enabled|cooldown.seraphim.remains>gcd*6)&!talent.final_verdict.enabled
actions.cleave+=/divine_storm,if=holy_power>=3&buff.final_verdict.up
actions.cleave+=/final_verdict,if=holy_power>=3&buff.final_verdict.down
 
Any reason why i can't move with my ''W'' key when i use this profile?

Yeah, one of the Hotkeys has been set to the 'W' Key
Go into Bot Settings while its running and change it to something like Shift+W or something ^^ (This could also explain why its not using cooldowns for you as W probably disables them ^^)
 
Any chance we could get this for Marks/Survival Hunter? Singular current base is terrible and Im doing very low dps @ ilvl 650
 
Kane49_2, could you add an option for a chatoutput when a hotkey is pressed?

AOE enabled, AOE disabled
Cooldowns enabled, Cooldowns disabled.

Etc.?
 
Kane49_2, could you add an option for a chatoutput when a hotkey is pressed?

AOE enabled, AOE disabled
Cooldowns enabled, Cooldowns disabled.

Etc.?

Right now im using weakauras to display that info on my client, but i will add an option for chat output :)

Any chance we could get this for Marks/Survival Hunter? Singular current base is terrible and Im doing very low dps @ ilvl 650

I will add a quick survival hunter routine, dunno about marks :)
 
Update !

Added Survival Hunter - Dunno how good it is
Added Chat Notifications when you use the Cooldown / Aoe Hotkeys
 
Back
Top