Исходник Модифицированный Essence Shift

iia3uk666

Друзья CG
18 Дек 2021
411
70
Проект
Ушел с CG
slark_essence_shift_boost.png
Модифицированный Essence Shift​
Особенности:
Атака по существам дает временную ловкость за удар (стак) 0.1/0.2/0.5/1.0 (меняется в файле npc_abilities_custom - creep_agi_gain)
Временная ловкость от атаки по существам исчезает с героя (секунды) 60/90/120/150 (меняется в файле npc_abilities_custom - duration_creep)
Постоянный бонус к ловкости от убийства существ (не героев) 1/2/3/4 (меняется в файле npc_abilities_custom - buffalltime_creep)

Атака по героям дает временную ловкость за удар (стак) 3.0/9.0/15.0/21.0 (меняется в файле npc_abilities_custom - agi_gain)
Временная ловкость от атаки по героям исчезает с героя (секунды) 120/160/200/240 (меняется в файле npc_abilities_custom - duration)
Постоянный бонус к ловкости от убийства героев (не существ) 1/3/5/7 (меняется в файле npc_abilities_custom - buffalltime)
Дебафф крадущий атрибуты на героях за удар (стак) 1.0/3.0/5.0/7.0 (меняется в файле npc_abilities_custom - stat_loss)

Все временные сбрасываются при смерти или по окончанию таймера, постоянные остаются всегда.

Lua:
LinkLuaModifier('modifier_slark_essence_shift_lua', 'heroes/slarkich/slark_essence_shift_lua', LUA_MODIFIER_MOTION_NONE)
LinkLuaModifier('modifier_slark_essence_shift_buff_custom', 'heroes/slarkich/modifier_slark_essence_shift_buff_custom', LUA_MODIFIER_MOTION_NONE)
LinkLuaModifier('modifier_slark_essence_shift_debuff_custom', 'heroes/slarkich/modifier_slark_essence_shift_debuff_custom', LUA_MODIFIER_MOTION_NONE)

slark_essence_shift_lua = class({})

function slark_essence_shift_lua:GetIntrinsicModifierName()
    return 'modifier_slark_essence_shift_lua'
end

modifier_slark_essence_shift_lua = class({})

function modifier_slark_essence_shift_lua:IsHidden()
    return self:GetStackCount() == 0
end

function modifier_slark_essence_shift_lua:IsDebuff() return false end
function modifier_slark_essence_shift_lua:IsPurgable() return false end

function modifier_slark_essence_shift_lua:DeclareFunctions()
    if self:GetParent():IsIllusion() then return end

    local funcs = {
        MODIFIER_PROPERTY_PROCATTACK_FEEDBACK,
        MODIFIER_EVENT_ON_DEATH,
        MODIFIER_PROPERTY_STATS_AGILITY_BONUS
    }
    return funcs
end

function modifier_slark_essence_shift_lua:OnRefresh(keys)
    self.parent = self:GetParent()
    self.ability = self:GetAbility()
    self.creep_agi_gain = self.ability:GetSpecialValueFor('creep_agi_gain')
end

-- Удаляем временный бафф с атаки по крипам/героям если мы сдохли
function modifier_slark_essence_shift_lua:OnDestroy()
    if self.hero_modifier and not self.hero_modifier:IsNull() then self.hero_modifier:Destroy() end
end

function modifier_slark_essence_shift_lua:OnDeath(keys)
    local unit = keys.unit

    if unit == self.parent then
        self:SetStackCount(0)
        return
    end

    if unit:IsIllusion() then return end

    local modifier = unit:FindModifierByName("modifier_slark_essence_shift_debuff_custom")
        if modifier and modifier:GetCaster() == self.parent and (self.parent == keys.attacker or unit:GetRangeToUnit(self.parent) <= 300) then
        local permanent_buff
        local buffalltime = self.ability:GetSpecialValueFor("buffalltime")
        local buffalltime_creep = self.ability:GetSpecialValueFor("buffalltime_creep")
        if unit:IsRealHero() then
            permanent_buff = self.parent:AddNewModifier(self.parent, self.ability, "modifier_slark_essence_shift_permanent_buff", nil)
            if permanent_buff then
               permanent_buff:SetStackCount(permanent_buff:GetStackCount() + buffalltime)
            end
        else
            permanent_buff = self.parent:AddNewModifier(self.parent, self.ability, "modifier_slark_essence_shift_permanent_buff", nil)
            if permanent_buff then
               permanent_buff:SetStackCount(permanent_buff:GetStackCount() + buffalltime_creep)
            end
 
        end

        unit:AddNewModifier(self.parent, self.ability, "modifier_slark_essence_shift_permanent_debuff", nil):IncrementStackCount()
    end

end

-- Атака по сушествам / героям
function modifier_slark_essence_shift_lua:GetModifierProcAttack_Feedback(keys)
    if self.parent:IsIllusion() or self.parent:PassivesDisabled() then return end
    if keys.target:GetTeam() == self.parent:GetTeam() or keys.target:IsOther() or keys.target:IsIllusion() then return end
    local duration = self:GetAbility():GetSpecialValueFor("duration")
    if keys.target:IsCreep() or keys.target:IsCreature() then
        duration = self:GetAbility():GetSpecialValueFor("duration_creep")
        self.parent:AddNewModifier(self.parent, self.ability, "modifier_slark_essence_shift_lua", { duration = duration })
        self:IncrementStackCount()
    else
        self.parent:AddNewModifier(self.parent, self.ability, "modifier_slark_essence_shift_buff_custom", { duration = duration })
        keys.target:AddNewModifier(self.parent, self.ability, "modifier_slark_essence_shift_debuff_custom", { duration = duration })
        keys.target:AddNewModifier(self.parent, self.ability, "modifier_slark_essence_shift_permanent_debuff", nil)
    end

    -- Партикл
    local particle_cast = ParticleManager:GetParticleReplacement('/particles/units/heroes/hero_slark/slark_essence_shift.vpcf', self.parent)
    local effect_cast = ParticleManager:CreateParticle(particle_cast, PATTACH_ABSORIGIN_FOLLOW, keys.target)
    ParticleManager:SetParticleControl(effect_cast, 0, keys.target:GetAbsOrigin() + Vector(0, 0, 64))
    ParticleManager:SetParticleControl(effect_cast, 1, self.parent:GetAbsOrigin() + Vector(0, 0, 64))
    ParticleManager:ReleaseParticleIndex(effect_cast)
end

-- Ловкость
function modifier_slark_essence_shift_lua:GetModifierBonusStats_Agility()
    return self:GetStackCount() * (self.creep_agi_gain or 0)
end
Lua:
modifier_slark_essence_shift_buff_custom = class({})

function modifier_slark_essence_shift_buff_custom:IsPurgable() return false end

function modifier_slark_essence_shift_buff_custom:DeclareFunctions()
    local funcs = {
        MODIFIER_PROPERTY_STATS_AGILITY_BONUS
    }
    return funcs
end

function modifier_slark_essence_shift_buff_custom:GetModifierBonusStats_Agility()
    return self:GetStackCount() * (self.agi_gain or 0)
end

function modifier_slark_essence_shift_buff_custom:OnCreated(kv)
    self.agi_gain = self:GetAbility():GetSpecialValueFor("agi_gain")

    if IsClient() then return end

    self:IncrementStackCount()

    Timers:CreateTimer(self:GetDuration(), function()
        if self:IsNull() then return end
        self:DecrementStackCount()
        self:GetParent():CalculateStatBonus(true)
    end)
end

function modifier_slark_essence_shift_buff_custom:OnRefresh(kv)
    self:OnCreated(kv)
end
Lua:
modifier_slark_essence_shift_debuff_custom = class({})

function modifier_slark_essence_shift_debuff_custom:IsPurgable() return false end

function modifier_slark_essence_shift_debuff_custom:DeclareFunctions()
    local funcs = {
        MODIFIER_PROPERTY_STATS_AGILITY_BONUS,
        MODIFIER_PROPERTY_STATS_STRENGTH_BONUS,
        MODIFIER_PROPERTY_STATS_INTELLECT_BONUS,
        MODIFIER_PROPERTY_TOOLTIP,
    }
    return funcs
end

function modifier_slark_essence_shift_debuff_custom:GetModifierBonusStats_Agility()
    return -self:GetStackCount() * (self.stat_loss or 0)
end

function modifier_slark_essence_shift_debuff_custom:GetModifierBonusStats_Strength()
    return -self:GetStackCount() * (self.stat_loss or 0)
end

function modifier_slark_essence_shift_debuff_custom:GetModifierBonusStats_Intellect()
    return -self:GetStackCount() * (self.stat_loss or 0)
end

function modifier_slark_essence_shift_debuff_custom:OnTooltip()
    return self:GetStackCount()
end

function modifier_slark_essence_shift_debuff_custom:OnCreated(kv)
    self.stat_loss = self:GetAbility():GetSpecialValueFor("stat_loss")

    if IsClient() then return end

    self:IncrementStackCount()

    Timers:CreateTimer(self:GetDuration(), function()
        if self:IsNull() then return end
        self:DecrementStackCount()
    end)
end

function modifier_slark_essence_shift_debuff_custom:OnRefresh(kv)
    self:OnCreated(kv)
end


Код:
"slark_essence_shift_lua"
    {
//-------------------------------------------------------------------------------------------------------------
        "BaseClass"                            "ability_lua"
        "ScriptFile"                        "heroes/slarkich/slark_essence_shift_lua.lua"
        "AbilityTextureName"                   "slark_essence_shift_boost"
        "AbilityType"                        "DOTA_ABILITY_TYPE_BASIC"
        "AbilityBehavior"                   "DOTA_ABILITY_BEHAVIOR_PASSIVE"
        "SpellImmunityType"                    "SPELL_IMMUNITY_ENEMIES_YES"
        "SpellDispellableType"                "SPELL_DISPELLABLE_NO"

        // Precache
        //-------------------------------------------------------------------------------------------------------------
        "precache"
        {
            "particle"                    "particles/units/heroes/hero_slark/slark_essence_shift.vpcf"
        }

        // Special
        //-------------------------------------------------------------------------------------------------------------
        "AbilitySpecial"
        {
            "01"
            {
                "var_type"                        "FIELD_FLOAT"
                "agi_gain"                        "3.0 9.0 15.0 21.0"
            }
            "02"
            {
                "var_type"                        "FIELD_FLOAT"
                "creep_agi_gain"                "0.1 0.2 0.5 1.0"
            }
            "03"
            {
                "var_type"                        "FIELD_FLOAT"
                "stat_loss"                        "1.0 3.0 5.0 7.0"
            }
            "04"
            {
                "var_type"                        "FIELD_FLOAT"
                "duration"                        "120 160 200 240"
            }
            "05"
            {
                "var_type"                        "FIELD_FLOAT"
                "duration_creep"                "60 90 120 150"
            }
            "06"
            {
                "var_type"                        "FIELD_INTEGER"
                "buffalltime"                    "1 3 5 7"
            }
            "07"
            {
                "var_type"                        "FIELD_INTEGER"
                "buffalltime_creep"                "1 2 3 4"
            }
 
        }
    }
Код:
        "dota_tooltip_ability_slark_essence_shift_lua"                "Essence Shift"
        "dota_tooltip_ability_slark_essence_shift_lua_Description"  "Герой истощает врагов, воруя их атрибуты которые превращаются в бонусную ловкость для обладателя способности. Если герой убьет врага, он навсегда украдет ловкость. <font color='#3ed038'>Так же герой ворует ловкость у существ.</font>"
        "dota_tooltip_ability_slark_essence_shift_lua_Lore"            "С каждым ударом, герой все лучше и лучше изучает слабые места врага"

        "dota_tooltip_ability_slark_essence_shift_lua_agi_gain"        "БОНУС К ЛОВКОСТИ ОТ УДАРА ПО ГЕРОЮ:"
        "dota_tooltip_ability_slark_essence_shift_lua_creep_agi_gain"    "<font color='#3ed038'>БОНУС К ЛОВКОСТИ ОТ УДАРА ПО СУЩЕСТВАМ:</font>"
        "dota_tooltip_ability_slark_essence_shift_lua_stat_loss"    "ГЕРОЙ ПОЛУЧИВШИЙ УРОН ТЕРЯЕТ АТРИБУТОВ:"
        "dota_tooltip_ability_slark_essence_shift_lua_buffalltime"        "ПОСТОЯННЫЙ БОНУС ОТ ГЕРОЕВ:"
        "dota_tooltip_ability_slark_essence_shift_lua_buffalltime_creep"        "ПОСТОЯННЫЙ БОНУС ОТ СУЩЕСТВ:"
        "dota_tooltip_ability_slark_essence_shift_lua_duration"        "ДЛИТЕЛЬНОСТЬ ВРЕМЕННОЙ ЛОВКОСТИ ОТ ГЕРОЕВ:"
        "dota_tooltip_ability_slark_essence_shift_lua_duration_creep"        "ДЛИТЕЛЬНОСТЬ ВРЕМЕННОЙ ЛОВКОСТИ ОТ СУЩЕСТВ:"

        "dota_tooltip_modifier_slark_essence_shift_lua"            "Essence Shift (СУЩЕСТВА)"
        "dota_tooltip_modifier_slark_essence_shift_lua_Description"    "Временно похищено %dMODIFIER_PROPERTY_STATS_AGILITY_BONUS% ед. ловкости существ."

        "dota_tooltip_modifier_slark_essence_shift_permanent_buff" "Постоянный бонус"
        "dota_tooltip_modifier_slark_essence_shift_permanent_buff_Description" "Получает %dMODIFIER_PROPERTY_STATS_AGILITY_BONUS% ед. ловкости от убийства героев и существ."

        "dota_tooltip_modifier_slark_essence_shift_buff_custom"                            "Essence Shift"        
        "dota_tooltip_modifier_slark_essence_shift_buff_custom_Description"                "Временно похищено %dMODIFIER_PROPERTY_STATS_AGILITY_BONUS% ед. ловкости героев."

        "dota_tooltip_modifier_slark_essence_shift_debuff_custom"                        "Essence Shift"
        "dota_tooltip_modifier_slark_essence_shift_debuff_custom_Description"            "Ваш герой временно теряет %dMODIFIER_PROPERTY_TOOLTIP% ед. каждого атрибута."

У вас уже должна быть база (какой то начальный проект)
Установка в 3х пунктах:
Берем из спойлера - LUA
2.1] Идем по пути: :\steam\steamapps\common\dota 2 beta\game\dota_addons\\scripts\vscripts\ ( - диск, ** - ваша карта) p.s. По желанию можно разделить папками ваши абилки
Пример из сборника пассивок: :\steam\steamapps\common\dota 2 beta\game\dota_addons\***\scripts\vscripts\hero\Passive (Добавилась 1 папка и подпапка)
2.2] Создаем файл с расширением *.lua и вставляем в него код
2.3] Если у вас другие папки/подпапки или вовсе вы создали *.lua в корне vscripts то редактируем путь в коде:
Находим строчку: LinkLuaModifier("modifier_legion_Armor", "heroes/Passive/legion_Armor", LUA_MODIFIER_MOTION_NONE)
Меняем в кавычках путь: "heroes/Passive/legion_Armor" => "Ваш путь к LUA, без расширения *.lua"
P.S. Если вы оставили скрипт в корне VSCRIPTS => Путь будет: "Ваше название скрипта, без расширения *.lua"
P.s. содержание строки зависит от пассивки/модификатора, главное это путь к скрипту!
Берем из спойлера - Абилку
1.1] Идем по пути: :\steam\steamapps\common\dota 2 beta\game\dota_addons\***\npc\ в файлик: npc_abilities_custom.txt
1.2] Вставляем абилку между фигурных скобок
"DOTAAbilities"
{
}
1.3] Строки:
"ScriptFile" "heroes/passive/legion_Armor" - ПУТЬ К LUA файлу (P.S. Если вы оставили скрипт в корне VSCRIPTS => Путь будет: "Ваше название скрипта, без расширения *.lua")
"AbilityTextureName" "specal/armor" - ПУТЬ К Иконке 128х128 .png (Полный путь: :\steam\steamapps\common\dota 2 beta\game\dota_addons\**\resource\flash3\images\spellicons\specal\)
Берем из спойлера - Ру локаль, от абилки
3.1]Идем по пути: :\steam\steamapps\common\dota 2 beta\game\dota_addons\\resource\ ( - диск, ** - ваша карта)
3.2] Открываем / создаем файлик: addon_russian.txt
3.3] Вставляем строки между:

"lang"
{
"Language" "russian"
"Tokens"
{
"addon_game_name" "Название вашей карты на ру"
Вот сюда уже строки
}
}
Все просто закидываем в папку с проектом
\steam\steamapps\common\dota 2 beta\game\dota_addons\scripts\vscripts\ сюда файл из архива
открываем ваш: addon_game_mode.lua
прописываем строчку
require('timers')
 

Вложения

  • timers.zip
    timers.zip
    2 KB · Просмотры: 6
  • slark_essence_shift_boost.png
    slark_essence_shift_boost.png
    44.9 KB · Просмотры: 7
Последнее редактирование:
  • Нравится
Реакции: fabio_longo
В связи с тем, что при атаке по постройке получали ловкость, а при уничтожении получали как за героя, убрал эту фичу

Lua:
LinkLuaModifier('modifier_slark_essence_shift_lua', 'heroes/slarkich/slark_essence_shift_lua', LUA_MODIFIER_MOTION_NONE)
LinkLuaModifier('modifier_slark_essence_shift_buff_custom', 'heroes/slarkich/modifier_slark_essence_shift_buff_custom', LUA_MODIFIER_MOTION_NONE)
LinkLuaModifier('modifier_slark_essence_shift_debuff_custom', 'heroes/slarkich/modifier_slark_essence_shift_debuff_custom', LUA_MODIFIER_MOTION_NONE)

slark_essence_shift_lua = class({})

function slark_essence_shift_lua:GetIntrinsicModifierName()
    return 'modifier_slark_essence_shift_lua'
end

modifier_slark_essence_shift_lua = class({})

function modifier_slark_essence_shift_lua:IsHidden()
    return self:GetStackCount() == 0
end

function modifier_slark_essence_shift_lua:IsDebuff() return false end
function modifier_slark_essence_shift_lua:IsPurgable() return false end

function modifier_slark_essence_shift_lua:DeclareFunctions()
    if self:GetParent():IsIllusion() then return end

    local funcs = {
        MODIFIER_PROPERTY_PROCATTACK_FEEDBACK,
        MODIFIER_EVENT_ON_DEATH,
        MODIFIER_PROPERTY_STATS_AGILITY_BONUS
    }
    return funcs
end

function modifier_slark_essence_shift_lua:OnRefresh(keys)
    self.parent = self:GetParent()
    self.ability = self:GetAbility()
    self.creep_agi_gain = self.ability:GetSpecialValueFor('creep_agi_gain')
end

-- Удаляем временный бафф с атаки по крипам/героям если мы сдохли
function modifier_slark_essence_shift_lua:OnDestroy()
    if self.hero_modifier and not self.hero_modifier:IsNull() then self.hero_modifier:Destroy() end
end

function modifier_slark_essence_shift_lua:OnDeath(keys)
    local unit = keys.unit

    if unit == self.parent then
        self:SetStackCount(0)
        return
    end

    if unit:IsIllusion() then return end

    local modifier = unit:FindModifierByName("modifier_slark_essence_shift_debuff_custom")
        if modifier and modifier:GetCaster() == self.parent and (self.parent == keys.attacker or unit:GetRangeToUnit(self.parent) <= 300) then
        local permanent_buff
        local buffalltime = self.ability:GetSpecialValueFor("buffalltime")
        local buffalltime_creep = self.ability:GetSpecialValueFor("buffalltime_creep")
        if not unit:IsBuilding() then -- отключаем прибавление постоянного баффа если сломали постройку
            if unit:IsRealHero() then
                permanent_buff = self.parent:AddNewModifier(self.parent, self.ability, "modifier_slark_essence_shift_permanent_buff", nil)
                if permanent_buff then
                   permanent_buff:SetStackCount(permanent_buff:GetStackCount() + buffalltime)
                end
            else
                permanent_buff = self.parent:AddNewModifier(self.parent, self.ability, "modifier_slark_essence_shift_permanent_buff", nil)
                if permanent_buff then
                   permanent_buff:SetStackCount(permanent_buff:GetStackCount() + buffalltime_creep)
                end     
            end
        end   
        unit:AddNewModifier(self.parent, self.ability, "modifier_slark_essence_shift_permanent_debuff", nil):IncrementStackCount()
    end

end

-- Атака по сушествам / героям
function modifier_slark_essence_shift_lua:GetModifierProcAttack_Feedback(keys)
    if self.parent:IsIllusion() or self.parent:PassivesDisabled() then return end
    if keys.target:GetTeam() == self.parent:GetTeam() or keys.target:IsOther() or keys.target:IsIllusion() then return end
    local duration = self:GetAbility():GetSpecialValueFor("duration")
    if not keys.target:IsBuilding() then -- отключаем прибавление баффа если атакуем постройку 
        if keys.target:IsCreep() or keys.target:IsCreature() then
            duration = self:GetAbility():GetSpecialValueFor("duration_creep")
            self.parent:AddNewModifier(self.parent, self.ability, "modifier_slark_essence_shift_lua", { duration = duration })
            self:IncrementStackCount()
        else
            self.parent:AddNewModifier(self.parent, self.ability, "modifier_slark_essence_shift_buff_custom", { duration = duration })
            keys.target:AddNewModifier(self.parent, self.ability, "modifier_slark_essence_shift_debuff_custom", { duration = duration })
            keys.target:AddNewModifier(self.parent, self.ability, "modifier_slark_essence_shift_permanent_debuff", nil)
        end
    end

    -- Партикл
    local particle_cast = ParticleManager:GetParticleReplacement('/particles/units/heroes/hero_slark/slark_essence_shift.vpcf', self.parent)
    local effect_cast = ParticleManager:CreateParticle(particle_cast, PATTACH_ABSORIGIN_FOLLOW, keys.target)
    ParticleManager:SetParticleControl(effect_cast, 0, keys.target:GetAbsOrigin() + Vector(0, 0, 64))
    ParticleManager:SetParticleControl(effect_cast, 1, self.parent:GetAbsOrigin() + Vector(0, 0, 64))
    ParticleManager:ReleaseParticleIndex(effect_cast)
end

-- Ловкость
function modifier_slark_essence_shift_lua:GetModifierBonusStats_Agility()
    return self:GetStackCount() * (self.creep_agi_gain or 0)
end
 
Реклама: