Решено Проблема с ability_lua

Setinder

Пользователь
23 Авг 2022
28
1
Сделал способность наподобие пассивки веника, но без замедла и с эффектом горения. При запуске кастомки пишет в консоль
Ability script afterburn_lua failed to find class named afterburn.
Вот код абилки в npc_abilities_custom

KV:
"afterburn"
    {
        
        "BaseClass"                     "ability_lua"
        "AbilityTextureName"            "ember_spirit_sleight_of_fist"
        "MaxLevel"                         "1"
        "ScriptFile" "afterburn_lua"
        "AbilityType" "DOTA_ABILITY_TYPE_BASIC"
        "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
        "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL"
        "SpellImmunityType"                "SPELL_IMMUNITY_ENEMIES_NO"
        "SpellDispellableType"            "SPELL_DISPELLABLE_YES"
        "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY"
        "AbilityUnitTargetType" "DOTA_UNIT_TARGET_ALL"
        "AbilityUnitTargetFlags" "DOTA_UNIT_TARGET_NONE"

        "AbilitySpecial"
        {
            "burn_dps"
            {
                "var_type" "FIELD_INTEGER"
                "value" "220"
            }

            "burn_duration"
            {
                "var_type" "FIELD_INTEGER"
                "value" "2"
            }
        }
    }
lua спелл
Lua:
afterburn_lua = class({})
modifier_afterburn_lua = class({})
modifier_afterburn_debuff_lua = class({})
LinkLuaModifier( "modifier_afterburn_lua", "modifier_afterburn_lua", LUA_MODIFIER_MOTION_NONE )
LinkLuaModifier( "modifier_afterburn_debuff_lua", "modifier_afterburn_debuff_lua", LUA_MODIFIER_MOTION_NONE )


function afterburn_lua:Precache( context )
    PrecacheResource( "particle", "particles/units/heroes/hero_shredder/shredder_flame_thrower_tree_afterburn.vpcf", context )
end

function afterburn_lua:Spawn()
    if not IsServer() then
        return
    end
end

function modifier_afterburn_lua:GetIntrinsicModifierName()
    return "modifier_afterburn_lua"
end

function modifier_afterburn_debuff_lua:GetIntrinsicModifierName()
    return "modifier_afterburn_debuff_lua"
end
lua модификатор на владельце
Lua:
modifier_afterburn_lua = class({})
function modifier_afterburn_lua:IsHidden()
    return true
end

function modifier_afterburn_lua:IsDebuff()
    return false
end

function modifier_afterburn_lua:IsStunDebuff()
    return false
end

function modifier_afterburn_lua:IsPurgable()
    return false
end

function modifier_afterburn_lua:OnCreated( kv )
    self.caster = self:GetCaster()
    self.ability = self:GetAbility()
    self.team = self:GetCaster():GetTeamNumber()

    -- references
    self.duration = self:GetAbility():GetSpecialValueFor( "burn_duration" )

    if not IsServer() then return end
    -- ability properties
    self.abilityDamageType = self:GetAbility():GetAbilityDamageType()
    self.abilityTargetTeam = self:GetAbility():GetAbilityTargetTeam()
    self.abilityTargetType = self:GetAbility():GetAbilityTargetType()
    self.abilityTargetFlags = self:GetAbility():GetAbilityTargetFlags()
end

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

function modifier_afterburn_lua:OnRemoved()
end

function modifier_afterburn_lua:OnDestroy()
end

--------------------------------------------------------------------------------
-- Modifier Effects
function modifier_afterburn_lua:DeclareFunctions()
    local funcs = {
        MODIFIER_PROPERTY_PROCATTACK_FEEDBACK,
    }

    return funcs
end

function modifier_afterburn_lua:GetModifierProcAttack_Feedback( params )
    if not IsServer() then return end
    if self.caster:PassivesDisabled() then return end

    local filter = UnitFilter(
        params.target,
        self.abilityTargetTeam,
        self.abilityTargetType,
        self.abilityTargetFlags,
        self.team
    )
    if not filter==UF_SUCCESS then return end

    -- apply debuff
    params.target:AddNewModifier(
        self.caster, -- player source
        self.ability, -- ability source
        "modifier_afterburn_debuff_lua", -- modifier name
        { burn_duration = self.duration } -- kv
    )
end
lua дебафф на враге
Lua:
modifier_afterburn_debuff_lua = class({})

--------------------------------------------------------------------------------
-- Classifications
function modifier_afterburn_debuff_lua:IsHidden()
    return false
end

function modifier_afterburn_debuff_lua:IsDebuff()
    return true
end

function modifier_afterburn_debuff_lua:IsStunDebuff()
    return false
end

function modifier_afterburn_debuff_lua:IsPurgable()
    return true
end

--------------------------------------------------------------------------------
-- Initializations
function modifier_afterburn_debuff_lua:OnCreated( kv )
    self.parent = self:GetParent()
    self.caster = self:GetCaster()

    -- references
    local damage = self:GetAbility():GetSpecialValueFor( "burn_dps" )
    

    if not IsServer() then return end

    -- precache damage
    self.damageTable = {
        victim = self:GetParent(),
        attacker = self:GetCaster(),
        damage = damage,
        damage_type = DAMAGE_TYPE_MAGICAL,
        ability = self:GetAbility(), --Optional.
        damage_flags = DOTA_DAMAGE_FLAG_HPLOSS, --Optional.
    }
    -- ApplyDamage(damageTable)

    self:StartIntervalThink( 1 )
    self:OnIntervalThink()
end

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

function modifier_afterburn_debuff_lua:OnRemoved()
end

function modifier_afterburn_debuff_lua:OnDestroy()
end

--------------------------------------------------------------------------------
-- Modifier Effects
function modifier_afterburn_debuff_lua:DeclareFunctions()
    local funcs = {
        
    }

    return 0
end




--------------------------------------------------------------------------------
-- Interval Effects
function modifier_afterburn_debuff_lua:OnIntervalThink()
    ApplyDamage( self.damageTable )

    -- overhead damage info
    SendOverheadEventMessage(
        nil,
        OVERHEAD_ALERT_BONUS_SPELL_DAMAGE,
        self.parent,
        self.damageTable.damage,
        self.caster:GetPlayerOwner()
    )
end

--------------------------------------------------------------------------------
-- Graphics & Animations
function modifier_afterburn_debuff_lua:GetEffectName()
    return "particles/units/heroes/hero_shredder/shredder_flame_thrower_tree_afterburn.vpcf"
end

function modifier_afterburn_debuff_lua:GetEffectAttachType()
    return PATTACH_ABSORIGIN_FOLLOW
end
 
Путь к файлам меняй!!! Я его ставил на джагу по этому пути у меня:
в файле npc_abilities_custom.txt ----- heroes/hero_juggernaut/afterburn_lua
в файле afterburn_lua.lua путь до модифаера ----- heroes/hero_juggernaut/modifier_afterburn_lua
в файле afterburn_lua.lua путь до модифаера ----- heroes/hero_juggernaut/modifier_afterburn_debuff_lua
Lua:
afterburn_lua = class({})


LinkLuaModifier( "modifier_afterburn_lua", "heroes/hero_juggernaut/modifier_afterburn_lua", LUA_MODIFIER_MOTION_NONE )
LinkLuaModifier( "modifier_afterburn_debuff_lua", "heroes/hero_juggernaut/modifier_afterburn_debuff_lua", LUA_MODIFIER_MOTION_NONE )

function afterburn_lua:Precache( context )
    PrecacheResource( "particle", "particles/units/heroes/hero_shredder/shredder_flame_thrower_tree_afterburn.vpcf", context )
end

function afterburn_lua:Spawn()
    if not IsServer() then
        return
    end
end

function afterburn_lua:GetIntrinsicModifierName()
    return "modifier_afterburn_lua"
end
Lua:
modifier_afterburn_debuff_lua = class({})

--------------------------------------------------------------------------------
-- Classifications
function modifier_afterburn_debuff_lua:IsHidden()
    return false
end

function modifier_afterburn_debuff_lua:IsDebuff()
    return true
end

function modifier_afterburn_debuff_lua:IsStunDebuff()
    return false
end

function modifier_afterburn_debuff_lua:IsPurgable()
    return true
end

--------------------------------------------------------------------------------
-- Initializations
function modifier_afterburn_debuff_lua:OnCreated( kv )
    self.parent = self:GetParent()
    self.caster = self:GetCaster()

    -- references
    local damage = self:GetAbility():GetSpecialValueFor( "burn_dps" )


    if not IsServer() then return end

    -- precache damage
    self.damageTable = {
        victim = self:GetParent(),
        attacker = self:GetCaster(),
        damage = damage,
        damage_type = DAMAGE_TYPE_MAGICAL,
        ability = self:GetAbility(), --Optional.
        damage_flags = DOTA_DAMAGE_FLAG_HPLOSS, --Optional.
    }
    -- ApplyDamage(damageTable)

    self:StartIntervalThink( 1 )
    self:OnIntervalThink()
end

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

function modifier_afterburn_debuff_lua:OnRemoved()
end

function modifier_afterburn_debuff_lua:OnDestroy()
end

--------------------------------------------------------------------------------
-- Modifier Effects
function modifier_afterburn_debuff_lua:DeclareFunctions()
    local funcs = {

    }

    return 0
end




--------------------------------------------------------------------------------
-- Interval Effects
function modifier_afterburn_debuff_lua:OnIntervalThink()
    ApplyDamage( self.damageTable )

    -- overhead damage info
    SendOverheadEventMessage(
        nil,
        OVERHEAD_ALERT_BONUS_SPELL_DAMAGE,
        self.parent,
        self.damageTable.damage,
        self.caster:GetPlayerOwner()
    )
end

--------------------------------------------------------------------------------
-- Graphics & Animations
function modifier_afterburn_debuff_lua:GetEffectName()
    return "particles/units/heroes/hero_shredder/shredder_flame_thrower_tree_afterburn.vpcf"
end

function modifier_afterburn_debuff_lua:GetEffectAttachType()
    return PATTACH_ABSORIGIN_FOLLOW
end
Lua:
modifier_afterburn_lua = class({})
function modifier_afterburn_lua:IsHidden()
    return true
end

function modifier_afterburn_lua:IsDebuff()
    return false
end

function modifier_afterburn_lua:IsStunDebuff()
    return false
end

function modifier_afterburn_lua:IsPurgable()
    return false
end

function modifier_afterburn_lua:OnCreated( kv )
    self.caster = self:GetCaster()
    self.ability = self:GetAbility()
    self.team = self:GetCaster():GetTeamNumber()

    -- references
    self.duration = self:GetAbility():GetSpecialValueFor( "burn_duration" )

    if not IsServer() then return end
    -- ability properties
    self.abilityDamageType = self:GetAbility():GetAbilityDamageType()
    self.abilityTargetTeam = self:GetAbility():GetAbilityTargetTeam()
    self.abilityTargetType = self:GetAbility():GetAbilityTargetType()
    self.abilityTargetFlags = self:GetAbility():GetAbilityTargetFlags()
end

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

function modifier_afterburn_lua:OnRemoved()
end

function modifier_afterburn_lua:OnDestroy()
end

--------------------------------------------------------------------------------
-- Modifier Effects
function modifier_afterburn_lua:DeclareFunctions()
    local funcs = {
        MODIFIER_PROPERTY_PROCATTACK_FEEDBACK,
    }

    return funcs
end

function modifier_afterburn_lua:GetModifierProcAttack_Feedback( params )
    if not IsServer() then return end
    if self.caster:PassivesDisabled() then return end

    local filter = UnitFilter(
        params.target,
        self.abilityTargetTeam,
        self.abilityTargetType,
        self.abilityTargetFlags,
        self.team
    )
    if not filter==UF_SUCCESS then return end

    -- apply debuff
    params.target:AddNewModifier(
        self.caster, -- player source
        self.ability, -- ability source
        "modifier_afterburn_debuff_lua", -- modifier name
        { duration = self.duration } -- kv
    )
end
Код:
"afterburn_lua"
    {

        "BaseClass"                     "ability_lua"
        "AbilityTextureName"            "ember_spirit_sleight_of_fist"
        "MaxLevel"                         "1"
        "ScriptFile" "heroes/hero_juggernaut/afterburn_lua"
        "AbilityType" "DOTA_ABILITY_TYPE_BASIC"
        "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
        "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL"
        "SpellImmunityType"                "SPELL_IMMUNITY_ENEMIES_NO"
        "SpellDispellableType"            "SPELL_DISPELLABLE_YES"
        "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY"
        "AbilityUnitTargetType" "DOTA_UNIT_TARGET_ALL"
        "AbilityUnitTargetFlags" "DOTA_UNIT_TARGET_NONE"

        "AbilitySpecial"
        {
            "01"
            {
                "var_type" "FIELD_INTEGER"
                "burn_dps" "220"
            }

            "02"
            {
                "var_type" "FIELD_INTEGER"
                "burn_duration" "2"
            }
        }
    }
Код:
"DOTA_Tooltip_modifier_afterburn_debuff_lua" "Пылевое пламя"
    "DOTA_Tooltip_modifier_afterburn_debuff_lua_Description" "Наносит Вам переодический урон в секунду"
  
    "DOTA_Tooltip_Ability_afterburn_lua_Description" "После каждого удара наносит врагам %burn_dps% единиц магического урона каждую секунду в течение %burn_duration% секунды."
    "DOTA_Tooltip_Ability_afterburn_lua" "Пылевое пламя"
    "DOTA_Tooltip_Ability_afterburn_lua_burn_dps" "Магического урона в секунду: "
    "DOTA_Tooltip_Ability_afterburn_lua_burn_duration" "Длительность отрицательного эффекта: "

Теперь касаемо ошибок в коде:
1) У тебя был неверный путь до твоих lua по этому у тебя была ошибка - что не найден файл
2) У тебя в файле npc_abilities_custom.txt :
в параметрах: AbilitySpecial - перечисление 01 / 02 были названы в честь burn_dps и burn_duration - а их значения были value - ошибка! посмотришь как надо в моем коде
3) У тебя в файле afterburn_lua.lua накладывались модификаторы сами на себя - а не на абилку, ты не должен вписывать класс модификаторов внутри файла если ты делаешь LinkLuaModifier в другой файл, а не в него самого
4) У тебя был дебафф наложен сам на себя в случае если бы был правильно написан код (наложен был бы на скилл), то он бы накладывался на персонажа с момента прокачки пассивки чем вызывал бы дамаг
5) У тебя в файле modifier_afterburn_lua - где накладывать дебафф от атаки params.target:AddNewModifier вместо duration что означает длительность burn_duration - является ошибкой
 
Последнее редактирование:
  • Нравится
Реакции: Setinder
Название абилки и название класса не совпадает
У тебя afterburn и afterburn_lua
А надо afterburn_lua и afterburn_lua
Переименуй абилку в afterburn_lua
 
  • Нравится
Реакции: Setinder
Путь к файлам меняй!!! Я его ставил на джагу по этому пути у меня:
в файле npc_abilities_custom.txt ----- heroes/hero_juggernaut/afterburn_lua
в файле afterburn_lua.lua путь до модифаера ----- heroes/hero_juggernaut/modifier_afterburn_lua
в файле afterburn_lua.lua путь до модифаера ----- heroes/hero_juggernaut/modifier_afterburn_debuff_lua
Lua:
afterburn_lua = class({})


LinkLuaModifier( "modifier_afterburn_lua", "heroes/hero_juggernaut/modifier_afterburn_lua", LUA_MODIFIER_MOTION_NONE )
LinkLuaModifier( "modifier_afterburn_debuff_lua", "heroes/hero_juggernaut/modifier_afterburn_debuff_lua", LUA_MODIFIER_MOTION_NONE )

function afterburn_lua:Precache( context )
    PrecacheResource( "particle", "particles/units/heroes/hero_shredder/shredder_flame_thrower_tree_afterburn.vpcf", context )
end

function afterburn_lua:Spawn()
    if not IsServer() then
        return
    end
end

function afterburn_lua:GetIntrinsicModifierName()
    return "modifier_afterburn_lua"
end
Lua:
modifier_afterburn_debuff_lua = class({})

--------------------------------------------------------------------------------
-- Classifications
function modifier_afterburn_debuff_lua:IsHidden()
    return false
end

function modifier_afterburn_debuff_lua:IsDebuff()
    return true
end

function modifier_afterburn_debuff_lua:IsStunDebuff()
    return false
end

function modifier_afterburn_debuff_lua:IsPurgable()
    return true
end

--------------------------------------------------------------------------------
-- Initializations
function modifier_afterburn_debuff_lua:OnCreated( kv )
    self.parent = self:GetParent()
    self.caster = self:GetCaster()

    -- references
    local damage = self:GetAbility():GetSpecialValueFor( "burn_dps" )


    if not IsServer() then return end

    -- precache damage
    self.damageTable = {
        victim = self:GetParent(),
        attacker = self:GetCaster(),
        damage = damage,
        damage_type = DAMAGE_TYPE_MAGICAL,
        ability = self:GetAbility(), --Optional.
        damage_flags = DOTA_DAMAGE_FLAG_HPLOSS, --Optional.
    }
    -- ApplyDamage(damageTable)

    self:StartIntervalThink( 1 )
    self:OnIntervalThink()
end

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

function modifier_afterburn_debuff_lua:OnRemoved()
end

function modifier_afterburn_debuff_lua:OnDestroy()
end

--------------------------------------------------------------------------------
-- Modifier Effects
function modifier_afterburn_debuff_lua:DeclareFunctions()
    local funcs = {

    }

    return 0
end




--------------------------------------------------------------------------------
-- Interval Effects
function modifier_afterburn_debuff_lua:OnIntervalThink()
    ApplyDamage( self.damageTable )

    -- overhead damage info
    SendOverheadEventMessage(
        nil,
        OVERHEAD_ALERT_BONUS_SPELL_DAMAGE,
        self.parent,
        self.damageTable.damage,
        self.caster:GetPlayerOwner()
    )
end

--------------------------------------------------------------------------------
-- Graphics & Animations
function modifier_afterburn_debuff_lua:GetEffectName()
    return "particles/units/heroes/hero_shredder/shredder_flame_thrower_tree_afterburn.vpcf"
end

function modifier_afterburn_debuff_lua:GetEffectAttachType()
    return PATTACH_ABSORIGIN_FOLLOW
end
Lua:
modifier_afterburn_lua = class({})
function modifier_afterburn_lua:IsHidden()
    return true
end

function modifier_afterburn_lua:IsDebuff()
    return false
end

function modifier_afterburn_lua:IsStunDebuff()
    return false
end

function modifier_afterburn_lua:IsPurgable()
    return false
end

function modifier_afterburn_lua:OnCreated( kv )
    self.caster = self:GetCaster()
    self.ability = self:GetAbility()
    self.team = self:GetCaster():GetTeamNumber()

    -- references
    self.duration = self:GetAbility():GetSpecialValueFor( "burn_duration" )

    if not IsServer() then return end
    -- ability properties
    self.abilityDamageType = self:GetAbility():GetAbilityDamageType()
    self.abilityTargetTeam = self:GetAbility():GetAbilityTargetTeam()
    self.abilityTargetType = self:GetAbility():GetAbilityTargetType()
    self.abilityTargetFlags = self:GetAbility():GetAbilityTargetFlags()
end

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

function modifier_afterburn_lua:OnRemoved()
end

function modifier_afterburn_lua:OnDestroy()
end

--------------------------------------------------------------------------------
-- Modifier Effects
function modifier_afterburn_lua:DeclareFunctions()
    local funcs = {
        MODIFIER_PROPERTY_PROCATTACK_FEEDBACK,
    }

    return funcs
end

function modifier_afterburn_lua:GetModifierProcAttack_Feedback( params )
    if not IsServer() then return end
    if self.caster:PassivesDisabled() then return end

    local filter = UnitFilter(
        params.target,
        self.abilityTargetTeam,
        self.abilityTargetType,
        self.abilityTargetFlags,
        self.team
    )
    if not filter==UF_SUCCESS then return end

    -- apply debuff
    params.target:AddNewModifier(
        self.caster, -- player source
        self.ability, -- ability source
        "modifier_afterburn_debuff_lua", -- modifier name
        { duration = self.duration } -- kv
    )
end
Код:
"afterburn_lua"
    {

        "BaseClass"                     "ability_lua"
        "AbilityTextureName"            "ember_spirit_sleight_of_fist"
        "MaxLevel"                         "1"
        "ScriptFile" "heroes/hero_juggernaut/afterburn_lua"
        "AbilityType" "DOTA_ABILITY_TYPE_BASIC"
        "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
        "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL"
        "SpellImmunityType"                "SPELL_IMMUNITY_ENEMIES_NO"
        "SpellDispellableType"            "SPELL_DISPELLABLE_YES"
        "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY"
        "AbilityUnitTargetType" "DOTA_UNIT_TARGET_ALL"
        "AbilityUnitTargetFlags" "DOTA_UNIT_TARGET_NONE"

        "AbilitySpecial"
        {
            "01"
            {
                "var_type" "FIELD_INTEGER"
                "burn_dps" "220"
            }

            "02"
            {
                "var_type" "FIELD_INTEGER"
                "burn_duration" "2"
            }
        }
    }
Код:
"DOTA_Tooltip_modifier_afterburn_debuff_lua" "Пылевое пламя"
    "DOTA_Tooltip_modifier_afterburn_debuff_lua_Description" "Наносит Вам переодический урон в секунду"
 
    "DOTA_Tooltip_Ability_afterburn_lua_Description" "После каждого удара наносит врагам %burn_dps% единиц магического урона каждую секунду в течение %burn_duration% секунды."
    "DOTA_Tooltip_Ability_afterburn_lua" "Пылевое пламя"
    "DOTA_Tooltip_Ability_afterburn_lua_burn_dps" "Магического урона в секунду: "
    "DOTA_Tooltip_Ability_afterburn_lua_burn_duration" "Длительность отрицательного эффекта: "

Теперь касаемо ошибок в коде:
1) У тебя был неверный путь до твоих lua по этому у тебя была ошибка - что не найден файл
2) У тебя в файле npc_abilities_custom.txt :
в параметрах: AbilitySpecial - перечисление 01 / 02 были названы в честь burn_dps и burn_duration - а их значения были value - ошибка! посмотришь как надо в моем коде
3) У тебя в файле afterburn_lua.lua накладывались модификаторы сами на себя - а не на абилку, ты не должен вписывать класс модификаторов внутри файла если ты делаешь LinkLuaModifier в другой файл, а не в него самого
4) У тебя был дебафф наложен сам на себя в случае если бы был правильно написан код (наложен был бы на скилл), то он бы накладывался на персонажа с момента прокачки пассивки чем вызывал бы дамаг
5) У тебя в файле modifier_afterburn_lua - где накладывать дебафф от атаки params.target:AddNewModifier вместо duration что означает длительность burn_duration - является ошибкой
Спасибо огромное, всё заработало
 
Реклама: