Hey, Rubim, have you fixed that blood tap problems? I felt the need to write my own Frost profile since I wanted to see the DPS difference when using Blood Tap and, man, it's worth it. It gives me a flat 10% DPS increase just by switching talents from Runic Empowerment to Blood Tap. Let me know if you want to see my code, i'll gladly share it with you.
Another thing. While I was making my profile (I still am, btw, it's far from ready) I often used yours as base for writing my abilities and I found that your logic for checking runes is wrong, at least for the FROST rotations.
You check runes by TYPE (blood/unholy/frost/death), while Simcraft is obviously checking runes by SLOT (blood/unholy/frost). I'll give you one example: simcraft's Frost 2H single target rotation:
-
actions.single_target+=/obliterate,if=blood=2|frost=2|unholy=2
It won't make any sense to look for blood runes here because frost DK's simply do not have blood runes. So they are checking for the blood SLOTS, the ones that always contains 2 death runes.
Ok, so what?
Let's look at your translation to PQR of this part of the rotation:
PHP Code:
if
TargetValidation("target",Obliterate)
and (RuneCheck("Blood") == 2
or RuneCheck("Frost") == 2
or RuneCheck("Unholy") == 2)
then
CastSpell(Obliterate)
end
You are correctly checking for blood runes = 2, but let's look at your RuneCheck() method:
PHP Code:
function RuneCheck(Rune)
FrostRune = 0
UnholyRune = 0
BloodRune = 0
DeathRune = 0
for i=1, 6 do
if GetRuneType(i) == 1 and select(1,GetRuneCooldown(i)) + select(2,GetRuneCooldown(i)) - GetTime() < 0 then
BloodRune = BloodRune + 1
end
if GetRuneType(i) == 2 and select(1,GetRuneCooldown(i)) + select(2,GetRuneCooldown(i)) - GetTime() < 0 then
UnholyRune = UnholyRune + 1
end
if GetRuneType(i) == 3 and select(1,GetRuneCooldown(i)) + select(2,GetRuneCooldown(i)) - GetTime() < 0 then
FrostRune = FrostRune + 1
end
if GetRuneType(i) == 4 and select(1,GetRuneCooldown(i)) + select(2,GetRuneCooldown(i)) - GetTime() < 0 then
DeathRune = DeathRune + 1
end
end
if Rune == nil
then
return BloodRune, UnholyRune, FrostRune, DeathRune
end
Using your function, blood runes will ALWAYS be zero, because you are counting runes by type so that obliterate will never happen when you have 2 death runes active in your blood rune slots.
Here's my code for rune checking, it's pretty different from yours since I'm building my own framework, but you will get the idea:
PHP Code:
function Hf_GetRunesBySlot()
local runeSlots = { "b", "u", "f"}
local runes = {
["b"] = { Up = 0, CdLeft = 10 },
["u"] = { Up = 0, CdLeft = 10 },
["f"] = { Up = 0, CdLeft = 10 },
}
local r = 1
for slot=1, 6 do
local start, cd, up = GetRuneCooldown(slot)
local left = start + cd - GetTime()
if not up then
if runes[runeSlots[r]].CdLeft > left then
runes[runeSlots[r]].CdLeft = left
end
else
runes[runeSlots[r]].Up = runes[runeSlots[r]].Up + 1
end
if slot % 2 == 0 then
r = r + 1
end
end
return runes
end
And my code for that same Obliterate:
PHP Code:
local ob = Obliterate
local runes = Hf_GetRunesBySlot()
if
Hf_ValidateSkill(ob, "target")
and (runes["b"].Up == 2 or runes["f"].Up == 2 or runes["u"].Up == 2)
then
return true
end
If you count slots 1 and 2 as the actual blood runes, you can squeeze one more obliterate from time to time.
