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!

Black Mage rotations?

Enochian isn't hard to code - if (Enochian <5) Enochian.

Raging Strikes and Leyline would ideally be casted just after an Enochian is cast.
Sharpcast after a Fire III.
Unsure how to code those, though.

How can i fetch the Aura IDs for you? albeit, Firestarter aura is already in UltimaCR does simply:
Core.Player.HasAura("Firestarter"))
 
Enochian isn't hard to code - if (Enochian <5) Enochian.

Raging Strikes and Leyline would ideally be casted just after an Enochian is cast.
Sharpcast after a Fire III.
Unsure how to code those, though.

How can i fetch the Aura IDs for you? albeit, Firestarter aura is already in UltimaCR does simply:
Core.Player.HasAura("Firestarter"))

It's all relatively easy once you know what RB and C# is capable of. You need to start with suedo-code and lay out the conditions for everything, in similar fasion to what you've already done. Here is what you have so far:

if (LastSpellCast == Enochian) cast(Raging Strikes); //Raging Strikes will only cast right after an Enochian
if (LastSpellCast == FireIII) cast(Sharpcast); //Sharpcast will only cast right after a FireIII
if (EnochianCooldown>=10) && (AstralFireIIIAura>=4) && mana>2000) cast(Fire IV) //Fire4 will only cast when remaining Enochian Cooldown is atleast 10 seconds, and Astral Fire 3 aura has atleast 4 seconds, and mana is over 2000
if (EnochianCooldown>=10) && (AstralFireIIIAura<4) && HasAura(Firestarter)) cast(Fire III) //Fire3 will only cast when remaining Enochian Cooldown is atleast 10 seconds, and Astral Fire 3 aura has less then 4 seconds, and Firestarter aura is procced
if (EnochianCooldown>=10) && (AstralFireIIIAura<4) && mana>2000) cast(Fire I) //Fire1 will only cast when remaining Enochian Cooldown is atleast 10 seconds, and Astral Fire 3 aura has less then 4 seconds, and mana is over 2000
if ((EnochianCooldown<10 || Mana<=2000) && !Umbral Ice ) cast(Blizzard III) //Blizzard3 will only cast when remaining Enochian Cooldown is under 10 seconds or mana is no more then 2000, and Umbral Ice aura is not active
if ((EnochianCooldown<10 || Mana<=2000) && Umbral Ice) cast(Blizzard IV) //Blizzard4 will only cast when remaining Enochian Cooldown is under 10 seconds or mana is no more then 2000, and Umbral Ice aura is active
 
Uh, actually i'm a C#\Java programmer by day job.
I just need to set up intellisense and some the rest of the API.

Okay, i found mostly everything i needed; As far i understand the structure of UltimaCR; the 'master' list is in Rotations.BlackMage, where the wall of if
Code:
(await) Spell()) return true;
casts the first spell which itself returns a Task and not a false.

So, the entire rotation has to be formulated as a stateless priority list?
 
If you guys would get this to work it would mean the world to me. I'd appreciate it with a small donation if I can go at least into dungeons at level 60. (it must not be raids)
 
Try to cast Scathe or any procs when moving to upkeep DPS.


Yes this is a good call.


Yes, upkeeping Enochian is the trick for a lvl 60 BLM.


By reset you mean, keep doing it until Enochian is cast-able again? Yes.


I'm not sure what you mean by that.


Here is the first experimental build based on input from Valpsjuk and you. It will try to run each rotation for 50 seconds, then timeout and restart the appropriate rotation. Core rotation also exits if Enochian and Sharpcast are off cooldown

Ultima\Ultima.cs
View attachment Ultima.cs

Ultima\Spells\Spell.cs:
View attachment Spell.cs

Ultima\Rotations\Behaviors\Combat\BlackMage.cs
View attachment BlackMage.cs

Ultima\Rotations\Methods\BlackMage.cs
View attachment BlackMage.cs

You need to select Single Target mode in Ultima in order to use the routine. Also, be sure to select Quelling Strikes and Raging Strikes as cross-class skills for this rotation.

Keep in mind that my black mage is level 40, and I know very little about the class and mechanics, so my testing is extremely limited.
 
Uh, actually i'm a C#\Java programmer by day job.
I just need to set up intellisense and some the rest of the API.

Okay, i found mostly everything i needed; As far i understand the structure of UltimaCR; the 'master' list is in Rotations.BlackMage, where the wall of if
Code:
(await) Spell()) return true;
casts the first spell which itself returns a Task and not a false.

So, the entire rotation has to be formulated as a stateless priority list?

It doesn't have to be, but that is how Ultima is organized. That particular setup seems to allow it to be the most compatible and universal to all levels and situations, without being specialized for any specific one.

This is how I would experiment with your rotation (it can be cleaned up and incorporated into the rest of the Ultima style if it proves effective):

Ultima\Spells\Spell.cs:
View attachment Spell.cs

Ultima\Rotations\Behaviors\Combat\BlackMage.cs
View attachment BlackMage.cs

Ultima\Rotations\Methods\BlackMage.cs
View attachment BlackMage.cs
 
<waitforupdate>
Here's a semi-working version.
The main issue is that i can't stop the bot from firing a spell twice, even with specific checks on LastSpell.
Do we have a transient, or a "Last spell QUEUED", rather than spell successfully casted?
 
no, but it is easy to add. Just declare it the same way that LastSpell is declared and set it at the beginning of Cast() instead of the end.

BTW, your code tries to run your routine, then the normal Single/Smart routine right afterwards. You should change the normal Smart and Single routines to 'else if' to prevent that.
 
puu.sh/jpXoT/df17b727e3.rar
Okay, single targets (No Leyline \ Sharpcast \ Thunder yet) is working. Getting blizzard IV not to double cast was an incredible hassle, and the thing that worked ended up being a hard timer, of all things.
Still lag sensitive, even if i tried to put as many checks as possible - lag means LastSpell doesn't work, and my workaround, LastSpellQueued, doesn't either.
 
Dude, thank you so much for your attempt. But since I live in euorpea the lag issue is huge. Damn!
 
puu.sh/jpXoT/df17b727e3.rar
Okay, single targets (No Leyline \ Sharpcast \ Thunder yet) is working. Getting blizzard IV not to double cast was an incredible hassle, and the thing that worked ended up being a hard timer, of all things.
Still lag sensitive, even if i tried to put as many checks as possible - lag means LastSpell doesn't work, and my workaround, LastSpellQueued, doesn't either.

can an await coroutine not be used here ?
 
I tried, but it didn't work. I was using:
await Couroutine.Wait(5000, ()=> TimeLeftOnEnochian > 15)
(TimeLeftOnEnochian returns Core.Player.GetAuraByName("Enochian").TimeLeft; with a 0 if aura doesn't exist.)

The current checks are:
if (LastSpellWas(MySpells.BlizzardIV)) return false;

plus a timer of 2.5s that starts when BlizzardIV is casted, and doesn't allow any BlizzardIV cast to commence while it's on.
Code chunk:
Code:
        private async Task<bool> BlizzardIV()
        {
            if (!blizzardTimer.IsFinished) return false;
            if (LastSpellWas(MySpells.BlizzardIV)) return false;
            if (Ultima.lastQueuedSpell.Name == MySpells.BlizzardIV.Name) return false;

            if (UmbralAura && 
                Core.Player.HasAura("Enochian", true, 4000) && 
                !Core.Player.HasAura("Enochian", true, 14000) )
            {

                if (await MySpells.BlizzardIV.Cast())
                {
                    blizzardTimer.Reset();
                }
                return true;
            }
            return false;
        }

I've tried most things i could think of - I'm going to need some input from someone more knowledgeable than me, i fear.
 
I tried, but it didn't work. I was using:
await Couroutine.Wait(5000, ()=> TimeLeftOnEnochian > 15)
(TimeLeftOnEnochian returns Core.Player.GetAuraByName("Enochian").TimeLeft; with a 0 if aura doesn't exist.)

The current checks are:
if (LastSpellWas(MySpells.BlizzardIV)) return false;

plus a timer of 2.5s that starts when BlizzardIV is casted, and doesn't allow any BlizzardIV cast to commence while it's on.
Code chunk:
Code:
        private async Task<bool> BlizzardIV()
        {
            if (!blizzardTimer.IsFinished) return false;
            if (LastSpellWas(MySpells.BlizzardIV)) return false;
            if (Ultima.lastQueuedSpell.Name == MySpells.BlizzardIV.Name) return false;

            if (UmbralAura && 
                Core.Player.HasAura("Enochian", true, 4000) && 
                !Core.Player.HasAura("Enochian", true, 14000) )
            {

                if (await MySpells.BlizzardIV.Cast())
                {
                    blizzardTimer.Reset();
                }
                return true;
            }
            return false;
        }

I've tried most things i could think of - I'm going to need some input from someone more knowledgeable than me, i fear.

Have you tried:

Code:
if (await MySpells.BlizzardIV.Cast())
                {
                    await CoRoutine.Wait(6000, () => LastSpell == BlizzardIV);
                }
 
Have you tried:

Code:
if (await MySpells.BlizzardIV.Cast())
                {
                    await CoRoutine.Wait(6000, () => LastSpell == BlizzardIV);
                }

ya this is the exact same thing I was thinking, I tried using your most recent update cloud and my game keep crashing the second I engage something and im' in single target mode any idea ? I"ve replaced all 4 files.
 
i'll try within the night.
Still, i'm in europe, and the double-B4 thing isn't very common. It's one refresh in ten or so - it's much better than old rotations.

Also, for some reason, in dungeons it never double-B4'd, while on the dummy it's a common occurence.
 
ya this is the exact same thing I was thinking, I tried using your most recent update cloud and my game keep crashing the second I engage something and im' in single target mode any idea ? I"ve replaced all 4 files.

Could you post the log? I can't test it myself until I get my BLM up to 60

I've updated that post with a version that adds a 100ms delay in between spell cast attempts, in case that is what is causing the crash:

Ultima\Rotations\Methods\BlackMage.cs
**Later version now in original and latest post**

Also, be sure to select Quelling Strikes and Raging Strikes as cross-class skills for this rotation.
 
View attachment CrashLog.txt
Could you post the log? I can't test it myself until I get my BLM up to 60

I've updated that post with a version that adds a 100ms delay in between spell cast attempts, in case that is what is causing the crash:

Ultima\Rotations\Methods\BlackMage.cs
View attachment 184389



Also, be sure to select Quelling Strikes and Raging Strikes as cross-class skills for this rotation.
 
Did anyone do more testing with this routine? Was on the run for a few days and didn't check it myself yet
 
Back
Top