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

Monk Addon - Switch to high dps 1h weapon prior to casting sweeping winds

Swap your left and right weapon and it will be fixed ;)
I'm pretty sure that is a different issue. I already swapped my weapons over. The scorn is in the correct location each time.
But when the bot switches the skorn for my dual wield weapons, and then maybe picks up some loot, demonbuddy does a town run BEFORE switching back. The offhand from my dual wield is then stashed

happens really often, i pick up all rares
 
ff.webp

i already fix that problem. these reds spot. you have to set up a protect
 
I think it would be helpful if protected slots couldn't have stuff put into them when picking up loot. Would require some changes to loot handling and when an inventory is considered "full"

Obviously a bit out of scope but would help in those instances where you attempt to do a switch when you only have one slot open.
 
one way to fix would be just to have the weapons switching back take priority over town run, if that is even possible
 
Added a small security measure so it won't switch too fast.

Code:
if (weaponSwap.DpsGearOn() && GilesHasBuff(SNOPower.Monk_SweepingWind) && settings.bMonkInnaSet && DateTime.Now.Subtract(SweepWindSpam).TotalMilliseconds >= 800)

that's for the switch back to dual wield - this way it waits 0.8sec before changing back to dual wield.

---

Todo:

1. Find a way to check if it's initiating town run or somesorts - that way we can disable the switching to skorn until he finishes the town run.
2. When equipping back to dual wield - auto equip the item stashed in the top left corner (security measure to make sure the skorn will return to its original slot).

---

Btw testing now on MP3 dual wielding with 2.7 attacks per second 100dps buffed (with Won Khim Lao + Echoing Fury) running life on kill at under 1dph.
tornados criting at 150k+
 
Last edited:
GREAT JOB!!!!

One Question: Wouldnt it be better to equip 2h weapon before casting blinding flash to get more total dps =)

And could you optimize the SW uptime for non-inna users?

cheers
 
Last edited:
https://www.dropbox.com/s/wdrl6bs9nz6nck3/GilesTrinity-WeaponSwap.rar
Community Version!

Set it so it will switch weapon to skorn, wait abit, cast sweeping winds, wait abit, then switch back to dual wield.
so it won't be doing this too fast (tinfoil hat) and to make sure d3 gets the weapon switch and new dmg.

Also this version includes a few of my edits:
1. if you set bot for salvage it will salvage brimstone worthy legendaries that you don't want to keep and it will sell all rares that suck.
2. my custom stashing rules
3. my custom loot rules (won't pickup quivers and other crap)

Make sure you have Inna Set selected under trinity config for this to work or if you don't use inna set then edit the monk.cs file and delete the bHasInnaSet in the if statement b4 weapon switching
 
GREAT JOB!!!!
One Question: Wouldnt it be better to equip 2h weapon before casting blinding flash to get more total dps =)

Thx, i checked and DPS is higher if first 2h is EQ.

Code:
            {
				if (!weaponSwap.DpsGearOn() && settings.bMonkInnaSet && !GilesHasBuff(SNOPower.Monk_SweepingWind)) {
					weaponSwap.SwapGear();
					WeaponSwapTime = DateTime.Now;
					return null;
				}	
				if (!(weaponSwap.DpsGearOn() && settings.bMonkInnaSet && DateTime.Now.Subtract(WeaponSwapTime).TotalMilliseconds <= 100 && !GilesHasBuff(SNOPower.Monk_SweepingWind)))			
					return new GilesPower(SNOPower.Monk_BlindingFlash, 0f, vNullLocation, iCurrentWorldID, -1, 0, 1, USE_SLOWLY); //intell -- 11f -- 1, 2
            }

If you use my community version then take the above code and replace the blinding flash part in monk.cs, i changed so if it's ready to cast blinding flash it will first switch to 2h, then blinding flash, then sweeping winds.
if it can't cast blinding flash then it will switch then cast sweeping winds without flashing.
 
sweet, gonna check try this out..


edit - I am shredding the joint. Elites are melting. Fine job sir, fine job indeed!

edit2 - been running mp4 key runs...my gold/xp has gone up quite a bit with this new build and all I've got is a hellfire ring for xp, and p67 for gold. Probably seen 100k gold spike p/hr, and XP is up by about a mil/hr or so.
 
Last edited:
I am confused as a NON inna's user =)

can you exactly tell me which inna checks i have to remove from the code in blinding flash and/or sweeping wind ?

thank you
 
Code:
			if (weaponSwap.DpsGearOn() && GilesHasBuff(SNOPower.Monk_SweepingWind) && [B]settings.bMonkInnaSet[/B] && DateTime.Now.Subtract(WeaponSwapTime).TotalMilliseconds >= 800)
				weaponSwap.SwapGear();

Code:
            // Blinding Flash
            if (!bOOCBuff && playerStatus.CurrentEnergy >= 20 && hashPowerHotbarAbilities.Contains(SNOPower.Monk_BlindingFlash) &&
                (
                    iElitesWithinRange[RANGE_15] >= 1 || playerStatus.CurrentHealthPct <= 0.4 || (iAnythingWithinRange[RANGE_20] >= 5 && iElitesWithinRange[RANGE_50] == 0) ||
                    (iAnythingWithinRange[RANGE_15] >= 3 && playerStatus.CurrentEnergyPct <= 0.5) || (CurrentTarget.IsBoss && CurrentTarget.RadiusDistance <= 15f) ||
                    (iAnythingWithinRange[RANGE_15] >= 1 && hashPowerHotbarAbilities.Contains(SNOPower.Monk_SweepingWind) && !GilesHasBuff(SNOPower.Monk_SweepingWind) && settings.bMonkInnaSet)
                ) &&
                // Check if we don't have breath of heaven
                (!hashPowerHotbarAbilities.Contains(SNOPower.Monk_BreathOfHeaven) ||
                (hashPowerHotbarAbilities.Contains(SNOPower.Monk_BreathOfHeaven) && (!settings.bMonkInnaSet || GilesHasBuff(SNOPower.Monk_BreathOfHeaven)))) &&
                // Check if either we don't have sweeping winds, or we do and it's ready to cast in a moment
                (!hashPowerHotbarAbilities.Contains(SNOPower.Monk_SweepingWind) ||
                (hashPowerHotbarAbilities.Contains(SNOPower.Monk_SweepingWind) && (playerStatus.CurrentEnergy >= 95 ||
                (settings.bMonkInnaSet && playerStatus.CurrentEnergy >= 25) || GilesHasBuff(SNOPower.Monk_SweepingWind))) ||
                playerStatus.CurrentHealthPct <= 0.4) &&
                GilesUseTimer(SNOPower.Monk_BlindingFlash) && PowerManager.CanCast(SNOPower.Monk_BlindingFlash))
            {
				if (!weaponSwap.DpsGearOn() && [B]settings.bMonkInnaSet[/B] && !GilesHasBuff(SNOPower.Monk_SweepingWind)) {
					weaponSwap.SwapGear();
					WeaponSwapTime = DateTime.Now;
					return null;
				}	
				if (!(weaponSwap.DpsGearOn() && [B]settings.bMonkInnaSet[/B] && DateTime.Now.Subtract(WeaponSwapTime).TotalMilliseconds <= 100 && !GilesHasBuff(SNOPower.Monk_SweepingWind)))			
					return new GilesPower(SNOPower.Monk_BlindingFlash, 0f, vNullLocation, iCurrentWorldID, -1, 0, 1, USE_SLOWLY); //intell -- 11f -- 1, 2
            }

Code:
				if (!weaponSwap.DpsGearOn() && [B]settings.bMonkInnaSet[/B]) {
					weaponSwap.SwapGear();
					WeaponSwapTime = DateTime.Now;
					return null;
				}
				if (!(weaponSwap.DpsGearOn() && [B]settings.bMonkInnaSet[/B] && DateTime.Now.Subtract(WeaponSwapTime).TotalMilliseconds <= 200)) {
					SweepWindSpam = DateTime.Now;
					return new GilesPower(SNOPower.Monk_SweepingWind, 0f, vNullLocation, iCurrentWorldID, -1, 0, 1, USE_SLOWLY); //intell -- 2,2
				}
 
Code:
			if (weaponSwap.DpsGearOn() && GilesHasBuff(SNOPower.Monk_SweepingWind) && [B]settings.bMonkInnaSet[/B] && DateTime.Now.Subtract(WeaponSwapTime).TotalMilliseconds >= 800)
				weaponSwap.SwapGear();

Code:
            // Blinding Flash
            if (!bOOCBuff && playerStatus.CurrentEnergy >= 20 && hashPowerHotbarAbilities.Contains(SNOPower.Monk_BlindingFlash) &&
                (
                    iElitesWithinRange[RANGE_15] >= 1 || playerStatus.CurrentHealthPct <= 0.4 || (iAnythingWithinRange[RANGE_20] >= 5 && iElitesWithinRange[RANGE_50] == 0) ||
                    (iAnythingWithinRange[RANGE_15] >= 3 && playerStatus.CurrentEnergyPct <= 0.5) || (CurrentTarget.IsBoss && CurrentTarget.RadiusDistance <= 15f) ||
                    (iAnythingWithinRange[RANGE_15] >= 1 && hashPowerHotbarAbilities.Contains(SNOPower.Monk_SweepingWind) && !GilesHasBuff(SNOPower.Monk_SweepingWind) && settings.bMonkInnaSet)
                ) &&
                // Check if we don't have breath of heaven
                (!hashPowerHotbarAbilities.Contains(SNOPower.Monk_BreathOfHeaven) ||
                (hashPowerHotbarAbilities.Contains(SNOPower.Monk_BreathOfHeaven) && (!settings.bMonkInnaSet || GilesHasBuff(SNOPower.Monk_BreathOfHeaven)))) &&
                // Check if either we don't have sweeping winds, or we do and it's ready to cast in a moment
                (!hashPowerHotbarAbilities.Contains(SNOPower.Monk_SweepingWind) ||
                (hashPowerHotbarAbilities.Contains(SNOPower.Monk_SweepingWind) && (playerStatus.CurrentEnergy >= 95 ||
                (settings.bMonkInnaSet && playerStatus.CurrentEnergy >= 25) || GilesHasBuff(SNOPower.Monk_SweepingWind))) ||
                playerStatus.CurrentHealthPct <= 0.4) &&
                GilesUseTimer(SNOPower.Monk_BlindingFlash) && PowerManager.CanCast(SNOPower.Monk_BlindingFlash))
            {
				if (!weaponSwap.DpsGearOn() && [B]settings.bMonkInnaSet[/B] && !GilesHasBuff(SNOPower.Monk_SweepingWind)) {
					weaponSwap.SwapGear();
					WeaponSwapTime = DateTime.Now;
					return null;
				}	
				if (!(weaponSwap.DpsGearOn() && [B]settings.bMonkInnaSet[/B] && DateTime.Now.Subtract(WeaponSwapTime).TotalMilliseconds <= 100 && !GilesHasBuff(SNOPower.Monk_SweepingWind)))			
					return new GilesPower(SNOPower.Monk_BlindingFlash, 0f, vNullLocation, iCurrentWorldID, -1, 0, 1, USE_SLOWLY); //intell -- 11f -- 1, 2
            }

Code:
				if (!weaponSwap.DpsGearOn() && [B]settings.bMonkInnaSet[/B]) {
					weaponSwap.SwapGear();
					WeaponSwapTime = DateTime.Now;
					return null;
				}
				if (!(weaponSwap.DpsGearOn() && [B]settings.bMonkInnaSet[/B] && DateTime.Now.Subtract(WeaponSwapTime).TotalMilliseconds <= 200)) {
					SweepWindSpam = DateTime.Now;
					return new GilesPower(SNOPower.Monk_SweepingWind, 0f, vNullLocation, iCurrentWorldID, -1, 0, 1, USE_SLOWLY); //intell -- 2,2
				}

thats exactly what I did and the swaping did not happen because BF or SW was already up without swaping...

well I said to myself: F***** this I buy 2x more Inna xD

proud 4x Inna owner
 
Thx, i checked and DPS is higher if first 2h is EQ.

Code:
            {
				if (!weaponSwap.DpsGearOn() && settings.bMonkInnaSet && !GilesHasBuff(SNOPower.Monk_SweepingWind)) {
					weaponSwap.SwapGear();
					WeaponSwapTime = DateTime.Now;
					return null;
				}	
				if (!(weaponSwap.DpsGearOn() && settings.bMonkInnaSet && DateTime.Now.Subtract(WeaponSwapTime).TotalMilliseconds <= 100 && !GilesHasBuff(SNOPower.Monk_SweepingWind)))			
					return new GilesPower(SNOPower.Monk_BlindingFlash, 0f, vNullLocation, iCurrentWorldID, -1, 0, 1, USE_SLOWLY); //intell -- 11f -- 1, 2
            }

If you use my community version then take the above code and replace the blinding flash part in monk.cs, i changed so if it's ready to cast blinding flash it will first switch to 2h, then blinding flash, then sweeping winds.
if it can't cast blinding flash then it will switch then cast sweeping winds without flashing.

I get a lot of code errors with this:

Compiler Error: c:\Demonbuddy\Plugins\GilesTrinity\ItemHandling.cs(1095,36) : warning CS0162: Unreachable code detected
[22:53:49.610 N] Compiler Error: c:\Demonbuddy\Plugins\GilesTrinity\ItemHandling.cs(1098,32) : warning CS0162: Unreachable code detected

etc
 
I get a lot of code errors with this:

Compiler Error: c:\Demonbuddy\Plugins\GilesTrinity\ItemHandling.cs(1095,36) : warning CS0162: Unreachable code detected
[22:53:49.610 N] Compiler Error: c:\Demonbuddy\Plugins\GilesTrinity\ItemHandling.cs(1098,32) : warning CS0162: Unreachable code detected

etc

check the first "real" error, like "; needed" or something, this is the result of another missing this or broken line, check again.
 
Hi tesslerc,

Can you tell me why you return null, rather than just returning with the sweeping wind power here?

Code:
                if (!weaponSwap.DpsGearOn() && Settings.Combat.Monk.HasInnaSet)
                {
                    weaponSwap.SwapGear();
                    WeaponSwapTime = DateTime.Now;
                    return null;
                }

I have the GUI and configuration stuff ready to go for this, just wanted to check on this last thing.

As far as I can tell, this method should never return null. I'm more inclined to use the "default" power, if not sweeping wind, or just let the next ability in the tree get used.
 
I think it would be helpful if protected slots couldn't have stuff put into them when picking up loot. Would require some changes to loot handling and when an inventory is considered "full"

Obviously a bit out of scope but would help in those instances where you attempt to do a switch when you only have one slot open.

Should the protected slot always have something in it? Why would a protected slot be empty?

Also, the "vendor run" logic is called when there isn't enough room to pickup a 2-slot item. I can change this!
 
it technically should, but say you don't have enough room to remove both your 1-hand weapons to swap for the 2-hand skorn. Optimally to ensure nothing ever screws it up, you should have two protected slots. 1 slot holds the skorn, the other slot is left empty for the "switch" since you need 2 available slots to remove your 2 weapons.

This really hasn't been a problem for me since I don't often have to switch but I could see a potential problem with it.

To me, a protected slot shouldn't be considered an available space when looting. Typically it is protecting something, but in case it is empty, perhaps it is empty for a reason (this being a good reason).
 
Last edited:
it technically should, but say you don't have enough room to remove both your 1-hand weapons to swap for the 2-hand skorn. Optimally to ensure nothing ever screws it up, you should have two protected slots. 1 slot holds the skorn, the other slot is left empty for the "switch" since you need 2 available slots to remove your 2 weapons.

This really hasn't been a problem for me since I don't often have to switch but I could see a potential problem with it.

To me, a protected slot shouldn't be considered an available space when looting. Typically it is protecting something, but in case it is empty, perhaps it is empty for a reason (this being a good reason).

Just checked - it looks like protected bag slots are not included in the calculation of "available bag slots" - so if you have two empty protected bag slots, they will stay empty :) Giles set this stuff up right!
 
Hi tesslerc,

Can you tell me why you return null, rather than just returning with the sweeping wind power here?

Code:
                if (!weaponSwap.DpsGearOn() && Settings.Combat.Monk.HasInnaSet)
                {
                    weaponSwap.SwapGear();
                    WeaponSwapTime = DateTime.Now;
                    return null;
                }

I have the GUI and configuration stuff ready to go for this, just wanted to check on this last thing.

As far as I can tell, this method should never return null. I'm more inclined to use the "default" power, if not sweeping wind, or just let the next ability in the tree get used.

Old code i used to make it not cast sweeping winds right away.
as you have spotted it is irrelevant and i will remove it also from my future changes :)
 
Back
Top