Рыцарь Смерти

Обмен опытом по созданию ротаций
Minion64
Сообщения: 1
Зарегистрирован: 05 апр 2023, 21:24

Re: Рыцарь Смерти

Сообщение Minion64 » 05 апр 2023, 21:25

Есть у кого то сборка на БДК дд спеке на 3.3.5?

freejack
Сообщения: 3
Зарегистрирован: 24 июл 2022, 19:25

Re: Рыцарь Смерти

Сообщение freejack » 08 ноя 2023, 14:29

нет ли у кого сборки фдк бдк адк для ШЛ 9.2.7?

noname123
Сообщения: 193
Зарегистрирован: 19 мар 2020, 09:15

Re: Рыцарь Смерти

Сообщение noname123 » 24 май 2024, 20:23

В этой теме я расписывал как сделать прожим сейвов основываясь на входящем уроне в течении последних 5 секунд http://blackdps.ru/forum/viewtopic.php?f=6&t=1013

Выкладываю доработанный код для блад дк который помимо определения входящего урона в течении 5 секунд (см. ссылку выше) ещё определяет сколько будет хилить "Удар смерти" учитывая моды на дополнительный отхил и входящий урон в течении 5 секунд (моды увеличивающие отхил были написаны под патч драгонфлая, в других дополнениях возможна частично некорректная работа)

Вставляем в пользовательский код

Код: Выделить всё

frame = CreateFrame("FRAME")
frame:RegisterEvent("COMBAT_LOG_EVENT_UNFILTERED")
local damageTable = {}
local updatedamageInterval = 0.1
local eventIndex = 0
frame:SetScript("OnEvent", function(self, event, ...)
    if event == "COMBAT_LOG_EVENT_UNFILTERED" then
        local timestamp, cleuEvent, hideCaster, sourceGUID, sourceName, sourceFlags, sourceRaidFlags, destGUID, destName, destFlags, destRaidFlags, spellId, spellName, spellSchool, param15, param16, param17, param18, param19, param20;
        eventIndex = eventIndex + 1
        local t = time()   
        if checkVersionOld(1,3) then
            timestamp, cleuEvent, sourceGUID, sourceName, sourceFlags, destGUID, destName, destFlags, spellId, spellName, spellSchool, param15, param16, param17, param18, param19, param20 = ...;
        elseif checkVersionOld(4,7) then
            timestamp, cleuEvent, hideCaster, sourceGUID, sourceName, sourceFlags, sourceRaidFlags, destGUID, destName, destFlags, destRaidFlags, spellId, spellName, spellSchool, param15, param16, param17, param18, param19, param20 = ...;
        else
            timestamp, cleuEvent, hideCaster, sourceGUID, sourceName, sourceFlags, sourceRaidFlags, destGUID, destName, destFlags, destRaidFlags, spellId, spellName, spellSchool, param15, param16, param17, param18, param19, param20 = CombatLogGetCurrentEventInfo();
        end
        if cleuEvent == "SWING_DAMAGE" and isPlayer(destGUID) then
            local _, _, _, _, _, _, _, _, _, _, _, amount = CombatLogGetCurrentEventInfo()
            damageTable[eventIndex] = {t, amount}
        elseif (cleuEvent == "SPELL_DAMAGE" or cleuEvent == "SPELL_PERIODIC_DAMAGE" or cleuEvent == "RANGE_DAMAGE") and isPlayer(destGUID) then
            local _, _, _, _, _, _, _, _, _, _, _, _, _, _, amount = CombatLogGetCurrentEventInfo()
            damageTable[eventIndex] = {t, amount}
        end
    end
end)
local DeathStrikeHeal = 0
local totalTime = 0
local totalDamage = 0
local damageInLast5Seconds = 0
frame:SetScript("OnUpdate", function(self, elapsed)
    totalTime = totalTime + elapsed
    if totalTime >= updatedamageInterval then
        local t = time() - 5
        for k, v in pairs(damageTable) do
            if v[1] < t then
                damageTable[k] = nil
            else
                totalDamage = totalDamage + v[2]
            end
        end
        damageInLast5Seconds = totalDamage
        -- The death strike check has begun
        local mod = 0
        local DSHEAL = 0
        local ModDSHEAL = 0
        local BaseDSHEAL = 0
        local minHealing = 0
        local baseHealing = 0
        local vers_bonus = 1 + (GetCombatRatingBonus(CR_VERSATILITY_DAMAGE_DONE) + GetVersatilityBonus(CR_VERSATILITY_DAMAGE_DONE))/100
        minHealing = 0.07
        baseHealing = 0.25
        if max(GetBuffCount("player", "Окровавленная земля",0)) > 0 then
            mod = mod + 0.06
        end
        if IsPlayerSpell(374277) then
            if ((MyGetSpecializationName() == "Кровь") and 1 or 0) == 1 then
                mod = mod + 0.05
            else
                mod = mod + 0.6
            end
        end
        if IsPlayerSpell(273953) then
            mod = mod + 0.15
        end
        if max(GetBuffRemainTime("player", "Кровь вампира",0)) > 0 then
            if IsPlayerSpell(317133) then
                mod = mod + 0.4
            else
                mod = mod + 0.3
            end
        end
        if max(GetBuffCount("player", "Гемостаз",0)) > 0 then
            mod = mod * (1 + (max(GetBuffCount("player", "Гемостаз",0)) * 0.08))
        end
        if max(GetBuffRemainTime("player", "Божественный гимн",0)) > 0 then
            mod = mod + 0.04
        end
        if max(GetBuffRemainTime("player", "Оберегающий дух",0)) > 0 then
            mod = mod + 0.60
        end
        baseHealing = baseHealing * (1 + mod) * vers_bonus
        minHealing = minHealing * (1 + mod) * vers_bonus
        BaseDSHEAL = UnitHealthMax("player") * minHealing
        ModDSHEAL = damageInLast5Seconds * baseHealing
        if ModDSHEAL > BaseDSHEAL then
            DSHEAL = ModDSHEAL
        else
            DSHEAL = BaseDSHEAL
        end
        DeathStrikeHeal = DSHEAL
        -- The death strike check is over

        totalDamage = 0
        totalTime = 0
    end
end)
Теперь команда пользовательского кода "DeathStrikeHeal" будет возвращать количество которое нам отхилит данный спелл.
Остаётся только вычесть это значение из максимального количества своего здоровья чтобы получить порог хп при котором данный спелл не будет оверхилить.

Код: Выделить всё

UnitHealthMax("player")-DeathStrikeHeal
В блоке выглядеть это будет вот так
DeathStrikeHeal.png
DeathStrikeHeal.png (10.9 КБ) 2861 просмотр

Ответить

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость