Способность Jinada(реворк)

DDSuper

Друзья CG
31 Май 2019
405
57
Здраствуйте, так как я давно не создавал тем, я решил создать этот гайд(но скорее всего, как просто вот код берите его и всё)
Начнём с небольшого минуса, хотя сложно сказать что это минус этой способности:
  • Эта способность не наводится на цель, только лишь основное(переключение и ничего более)
Начнём из KV

1-я часть. Datadriven​


Так как "DD" стал очень не популярным, это и ясно DD даёт мало возможностей, а в Lua можно реализовать всё, но это вам не DD, потому-что здесь некоторые функции такие как OnOrbFire, OnOrbImpact, OnOrbFail или Lifesteal отсутсвуют, но знаете это реализуемо очень быстро и просто(кроме OnOrbFire, OnOrbImpact, OnOrbFail).​

Приступим, создаём луа способность​

KV:
"bounty_hunter_jinada"
    {
        "BaseClass"                     "ability_lua"
        "ScriptFile"                "ability/bomj.lua"
        "AbilityBehavior"                "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_AUTOCAST | DOTA_ABILITY_BEHAVIOR_IMMEDIATE"
        "MaxLevel"                         "4"
        "AbilityTextureName"               "jinada"   
        "AbilityCooldown"                "8"

        "precache"
        {
              "soundfile"   "soundevents/bomj_euu.vsndevts"
        }
        "AbilitySpecial"
        {
            "01"
            {
                "var_type"                        "FIELD_INTEGER"
                "steal_gold_percent"             "10 12.5 15 17.5"
            }
            "02"
            {
                "var_type"                        "FIELD_FLOAT"
                "get_gold_percent"                "10 12.5 15 17.5"
            }
            "03"
            {
                "var_type"            "FIELD_INTEGER"
                "bonus_damage"        "75 100 125 150"
            }
        }
Дальше луа парт
Код:
LinkLuaModifier('modifier_bomj_steal_money_passive', 'ability/bomj.lua', LUA_MODIFIER_MOTION_NONE)
LinkLuaModifier('modifier_bomj_steal_money_ready', 'ability/bomj.lua', LUA_MODIFIER_MOTION_NONE)
bounty_hunter_jinada = class({})

function bounty_hunter_jinada:GetIntrinsicModifierName()
    return 'modifier_bomj_steal_money_passive'
end

function bounty_hunter_jinada:OnSpellStart()
    self:EndCooldown()
end

modifier_bomj_steal_money_passive = class({})

function modifier_bomj_steal_money_passive:IsHidden() return true end
function modifier_bomj_steal_money_passive:IsPassive() return true end
function modifier_bomj_steal_money_passive:DeclareFunctions()
    return {
        MODIFIER_PROPERTY_PREATTACK_BONUS_DAMAGE,

        MODIFIER_EVENT_ON_ATTACK_LANDED
    }
end

function modifier_bomj_steal_money_passive:OnCreated()
    self.damage = self:GetAbility():GetSpecialValueFor('bonus_damage')
    self.steal_money = self:GetAbility():GetSpecialValueFor('steal_gold_percent')

    self:StartIntervalThink(0)
end

function modifier_bomj_steal_money_passive:OnIntervalThink()
    if IsServer() then
        if self:GetAbility():IsCooldownReady() then -- Fuck you valve. IsCooldownReady() only on server-side that's a bullshit!
            self:GetCaster():AddNewModifier(self:GetCaster(), self:GetAbility(), 'modifier_bomj_steal_money_ready', {})

            self:StartIntervalThink( -1 )
        end
    end
end

AbilityKV = LoadKeyValues('scripts/npc/npc_abilities_custom.txt')

function modifier_bomj_steal_money_passive:OnAttackLanded( kv )
    if kv.attacker == self:GetCaster() then
        if self:GetAbility():IsCooldownReady() and self:GetAbility():GetAutoCastState() == true then
            if kv.target:IsRealHero() then
                local midas_particle = ParticleManager:CreateParticle("particles/items2_fx/hand_of_midas.vpcf", PATTACH_ABSORIGIN_FOLLOW, kv.target)
                ParticleManager:SetParticleControlEnt(midas_particle, 1, self:GetCaster(), PATTACH_POINT_FOLLOW, "attach_hitloc", self:GetCaster():GetAbsOrigin(), false)

                kv.target:EmitSound("Hero_BountyHunter.Jinata")
                kv.target:EmitSound("DOTA_Item.Hand_Of_Midas")

                self:GetCaster():ModifyGold(kv.target:GetGold() * self.steal_money / 100, true, DOTA_ModifyGold_HeroKill)
                kv.target:SpendGold(kv.target:GetGold() * self.steal_money / 100, DOTA_ModifyGold_Buyback)
            end

            self:GetCaster():RemoveModifierByName('modifier_bomj_steal_money_ready')

            self:StartIntervalThink( 0 )
            self:GetAbility():UseResources(false, false, true)
        end
    end
end

function modifier_bomj_steal_money_passive:GetModifierPreAttack_BonusDamage()
    if self:GetCaster():HasModifier('modifier_bomj_steal_money_ready') and self:GetAbility():GetAutoCastState() == true then
        return self.damage
    end

    return 0
end

modifier_bomj_steal_money_ready = class({})

function modifier_bomj_steal_money_ready:IsHidden() return false end
function modifier_bomj_steal_money_ready:IsPassive() return false end
function modifier_bomj_steal_money_ready:IsPurgable() return false end
function modifier_bomj_steal_money_ready:RemoveOnDeath() return false end

function modifier_bomj_steal_money_passive:OnRefresh()
    self:OnCreated()
end
 
Реклама: