Page 1 of 2
1
2
LastLast
  1. #1

    AffDots Soul Swap fix

    I had some free time and decided to fix this small inconvenience with AffDots and it not tracking correct dot power when spread via Soul Swap.
    You can download the addon folder here: https://www.mediafire.com/?sskbyycldh7o3yb

    or if you just want to change a few lines of code, edit the AffDots.lua file and replace the CombatLog function, local CombatLog = {.... } with

    Code:
    local soulswapstorage		= {}
    local CombatLog = {
    	function(_,_,timestamp,event,_,source_GUID,_,_,_,dest_GUID,_,_,_, ...)
    		if dest_GUID == playerGuid and DmgBuffEvents[event] then AffDots:CheckDmgBuffs() end
    		if(source_GUID ~= playerGuid or (event ~= "SPELL_AURA_REFRESH" and event ~= "SPELL_AURA_APPLIED" and event ~= "SPELL_DAMAGE" and event ~= "SPELL_CAST_SUCCESS")) then return end
    
    		spell = select(1, ...)
    		
    		if(event == "SPELL_CAST_SUCCESS" and spell == 86121) then --Inhale
    			soulswapstoreage = {}
    			soulswapstorage[30108] = targets[dest_GUID.."30108"]
    			soulswapstorage[corr_id] = targets[dest_GUID..corr_id]
    			soulswapstorage[980] = targets[dest_GUID.."980"]
    		end
    		
    		if(event == "SPELL_CAST_SUCCESS" and spell == 86213) then --Exhale
    			soulswapstorage['time'] = timestamp
    			if soulswapstorage[30108] then targets[dest_GUID.."30108"] = {soulswapstorage[30108][1], GetTime(), soulswapstorage[30108][3] }  end
    			if soulswapstorage[corr_id] then targets[dest_GUID..corr_id] = {soulswapstorage[corr_id][1], GetTime(), soulswapstorage[corr_id][3] } end
    			if soulswapstorage[980] then targets[dest_GUID.."980"] = {soulswapstorage[980][1], GetTime(), soulswapstorage[980][3], 0 } end
    		end		
    		
    		local afterCastBeforeApply = ((timestamp - (soulswapstorage['time'] or 0)) > .8)
    		-- If UA is cast between inhale and exhale. All 3 dots are applied at the same timestamp (exactly like a 3 DoT exhale). We need to check if the dots were stored on inhale.
    		if(event == "SPELL_AURA_APPLIED" or event == "SPELL_AURA_REFRESH") then
    				if(spell == 30108) and (afterCastBeforeApply or (soulswapstorage[30108] == nil)) then
    					targets[dest_GUID.."30108"] = { dot_damage[30108][1], GetTime(), dot_damage[30108][2] }
    				elseif(spell == corr_id or spell == 87389) and (afterCastBeforeApply or soulswapstorage[corr_id] == nil) then
    					targets[dest_GUID..corr_id] = { dot_damage[corr_id][1], GetTime(), dot_damage[corr_id][2] }
    				elseif(spell == 980) and (afterCastBeforeApply or soulswapstorage[980] == nil) then
    					targets[dest_GUID.."980"] = { dot_damage[980][1], GetTime(), dot_damage[980][2], 0 }
    				end
    		end
    	end,
    	
    	function(_,_,_,event,_,source_GUID,_,_,_,dest_GUID,_,_,_, ...)
    		if dest_GUID == playerGuid and DmgBuffEvents[event] then AffDots:CheckDmgBuffs() end
    		if(source_GUID ~= playerGuid or (event ~= "SPELL_AURA_REFRESH" and event ~= "SPELL_AURA_APPLIED" and event ~= "SPELL_DAMAGE")) then return end
    
    		spell = select(1, ...)
    		if(event == "SPELL_AURA_APPLIED" or event == "SPELL_AURA_REFRESH") then
    			if(spell == corr_id) then
    				targets[dest_GUID..corr_id] = {dot_damage[corr_id][1],GetTime(),dot_damage[corr_id][2]}
    			elseif(spell == 603) then
    				targets[dest_GUID.."603"] = {dot_damage[603][1],GetTime(),dot_damage[603][2],dot_damage[603][3]}
    			end
    		elseif(event == "SPELL_DAMAGE" and spell == 103964) then
    			targets[dest_GUID..corr_id] = {dot_damage[corr_id][1],GetTime(),dot_damage[corr_id][2]}
    		end
    	end,
    	
    	function(_,_,_,event,_,source_GUID,_,_,_,dest_GUID,_,_,_, ...)
    		if dest_GUID == playerGuid and DmgBuffEvents[event] then AffDots:CheckDmgBuffs() end
    		if(source_GUID ~= playerGuid or (event ~= "SPELL_AURA_REFRESH" and event ~= "SPELL_AURA_APPLIED" and event ~= "SPELL_DAMAGE")) then return end
    
    		spell = select(1, ...)
    		if(event == "SPELL_AURA_APPLIED" or event == "SPELL_AURA_REFRESH") then
    			if(spell == 348) then
    				targets[dest_GUID.."348"] = {dot_damage[348][1],GetTime(),dot_damage[348][2]}
    			elseif(spell == 108686) then
    				targets[dest_GUID.."108686"] = {dot_damage[108686][1],GetTime(),dot_damage[108686][2]}
    			end
    		end
    	end,
    }
    Make sure you grab the local variable I created right above the CombatLog function as well.
    I've notified the author with my fix, so he might update it sooner or later. Or not. In any case, use my fix.
    Last edited by Clebane; 2014-06-18 at 08:20 AM.

  2. #2

  3. #3

  4. #4
    Wow. A lot of people are gonna appreciate this, me included. Holy crapolini. Nice work!
    ~ Battle.net MVP ~
    Overwatch mod
    Twitter | Soundcloud

  5. #5

  6. #6
    sweet now I can stop messing up on protectors! thanks!

  7. #7

  8. #8
    Deleted
    Wait wait, so how does dot snap-shotting work with soul swap? Did I get it completely wrong? Is that why my dps as affliction sucks the big one?!

  9. #9
    Quote Originally Posted by beNN View Post
    Wait wait, so how does dot snap-shotting work with soul swap? Did I get it completely wrong? Is that why my dps as affliction sucks the big one?!
    Your snapshot your dots with all proccs/10stacks BBoY, lust, tricks, whatever, and then soulswap copies the snapshotted dots around to different targets, essentially keeping your opener dots for a very long time on fights where you have something to soulswap to.

  10. #10
    Deleted
    Quote Originally Posted by Valq View Post
    Your snapshot your dots with all proccs/10stacks BBoY, lust, tricks, whatever, and then soulswap copies the snapshotted dots around to different targets, essentially keeping your opener dots for a very long time on fights where you have something to soulswap to.
    But, whenever you soulswap something the duration also gets reduced, so you might squeeze out an extra 3-4 seconds at best, or am I missing something?

  11. #11

  12. #12
    Quote Originally Posted by beNN View Post
    But, whenever you soulswap something the duration also gets reduced, so you might squeeze out an extra 3-4 seconds at best, or am I missing something?
    You don't lose time on the dots is captures the time when you soulswapped as well as the power. You can hold soulswap for almost 3 seconds which allows every set of dots to last that much longer unless there are targets without dots you should use a gcd between swapping them to targets with dots already.

  13. #13
    Quote Originally Posted by beNN View Post
    But, whenever you soulswap something the duration also gets reduced, so you might squeeze out an extra 3-4 seconds at best, or am I missing something?
    Nono, get on dummies now, cast an agony twice, soulswap it to another dummy, then instantly pull it off the newly soulswapped to dummy (essentially spam your soulswap button) and onto another one, you'll notice you're saving immense amounts of time, after that, move onto filling your inhale's with an MG/Haunt, which prolongs the dots even more.

  14. #14
    Quote Originally Posted by beNN View Post
    But, whenever you soulswap something the duration also gets reduced, so you might squeeze out an extra 3-4 seconds at best, or am I missing something?
    DoT duration gets snapshotted as well as the stats.

  15. #15
    Deleted
    Quote Originally Posted by striderZA View Post
    DoT duration gets snapshotted as well as the stats.
    Yes maybe I explained myself wrong, this is what I meant. So you can't really extend dots indefinetly, you might get a few extra seconds out of it but I don't see how you could extend them for much longer than that.

    As inevitably they are going to tick down and every time you soulswap the duration is going to reflect the time left of the original dot, more or less. As people have said you can keep the soulswap for a couple of seconds, effectively increasing the duration by 2seconds, but that's kind of it.

  16. #16
    Quote Originally Posted by beNN View Post
    Yes maybe I explained myself wrong, this is what I meant. So you can't really extend dots indefinetly, you might get a few extra seconds out of it but I don't see how you could extend them for much longer than that.

    As inevitably they are going to tick down and every time you soulswap the duration is going to reflect the time left of the original dot, more or less. As people have said you can keep the soulswap for a couple of seconds, effectively increasing the duration by 2seconds, but that's kind of it.
    Thats the thing, lets give you theoretical numbers here,

    You have an agony with 28 seconds left on it, you inhale it, and exhale it with 28 seconds left, then you immediately inhale it back again, and exhale it on another target with ~27-28 seconds left, then rinse and repeat, I don't see how this is only saving a couple of seconds, especially that you could delay exhaling a dot for 3 seconds, which means you inhale a 28 second agony, then exhale it 3 seconds later with the same duration, that already saved 3 seconds, repeating this keeps dots going for an extremely long time.

    Dots don't tick while you have them inhaled, if you think thats a thing, then its not

    Hope this can clarify the point we're trying to get through.
    Last edited by Valq; 2014-06-17 at 08:16 PM.

  17. #17
    Quote Originally Posted by Valq View Post
    Thats the thing, lets give you theoretical numbers here,

    You have an agony with 28 seconds left on it, you inhale it, and exhale it with 28 seconds left, then you immediately inhale it back again, and exhale it on another target with ~27-28 seconds left, then rinse and repeat, I don't see how this is only saving a couple of seconds, especially that you could delay exhaling a dot for 3 seconds, which means you inhale a 28 second agony, then exhale it 3 seconds later with the same duration, that already saved 3 seconds, repeating this keeps dots going for an extremely long time.

    Dots don't tick while you have them inhaled, if you think thats a thing, then its not

    Hope this can clarify the point we're trying to get through.
    Your still going to lose roughly one second inbetween each exhale - > inhale which prevents you from keeping it going forever.

  18. #18
    It doesn't keep it going forever, but you can extend your opening Agony around 2 minutes if done right, which if you're lucky will let you re-apply it with Dark Soul and Bindings back up.

  19. #19
    Quote Originally Posted by Unholyfap View Post
    Your still going to lose roughly one second inbetween each exhale - > inhale which prevents you from keeping it going forever.
    Seems like you've just quoted me and posted something without even reading what I wrote, because at no point did I say the dots would stay forever, plus, even assuming your 1 second per exhale is true, which isn't always the case, and you have a 20 second dot up, you can delay it 3 seconds every time you inhale, then exhale it, that keeps it going for a very long time, which is exactly what I said in my post, don't understand what you're trying to get to?

  20. #20
    Deleted
    Yeah I think I get it now, I avoided playing affliction as I just came back to the game a few months ago and the new soulswap was quite confusing.

    I didn't think about the fact that when you exhale your dots you immediately inhale them again so keep the duration, and "ping-pong" back and forth between targets. I kept seeing people doing that and I didn't understand wtf was going on.

    Thanks for the clarification and thanks for the affdots fix, I guess I'll start playing affli more often from now on

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •