Проблема с 'SpendMana'

SirCauseC4_ka

Новичок
29 Окт 2018
5
0
Проект
дефенс-фармилочка
Новичок, сам пока не очень скриптю, пытаюсь собрать скилл как конструктор, что-то беру с разных скиллов, небольшая задумка: Blade Fury работает как переключаемый скилл(с этим я справился), и пока скилл работает, тратится мана, последнее не особо получилось, выдает ошибку. Вроде как крутится, мана тратится, но дамага с крутилки нет и выдает ошибку.

console.png

Lua:
modifier_juggernaut_blade_fury_lua = class({})

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

function modifier_juggernaut_blade_fury_lua:IsDebuff()
    return false
end

function modifier_juggernaut_blade_fury_lua:IsPurgable()
    return false
end

function modifier_juggernaut_blade_fury_lua:DestroyOnExpire()
    return false
end
--------------------------------------------------------------------------------
-- Initializations
function modifier_juggernaut_blade_fury_lua:OnCreated( kv )
    -- references
    self.tick = self:GetAbility():GetSpecialValueFor( "blade_fury_damage_tick" )
    self.radius = self:GetAbility():GetSpecialValueFor( "blade_fury_radius" )
    self.dps = self:GetAbility():GetSpecialValueFor( "blade_fury_damage" )
    self.manacost = self:GetAbility():GetSpecialValueFor( "mana_cost_per_second" )
    local interval = 1
    
    self.count = 0

    -- Start interval
    self:StartIntervalThink( interval )
    if IsServer() then
        -- precache damagetable
        self.damageTable = {
            -- victim = target,
            attacker = self:GetParent(),
            damage = self.dps * self.tick,
            damage_type = DAMAGE_TYPE_MAGICAL,
            ability = self:GetAbility(), --Optional.
        }

        self:StartIntervalThink( self.tick )
    end

    -- PlayEffects
    self:PlayEffects()
end

function modifier_juggernaut_blade_fury_lua:OnRefresh( kv )
    -- references
    self.tick = self:GetAbility():GetSpecialValueFor( "blade_fury_damage_tick" )
    self.radius = self:GetAbility():GetSpecialValueFor( "blade_fury_radius" )
    self.dps = self:GetAbility():GetSpecialValueFor( "blade_fury_damage" )
    self.manacost = self:GetAbility():GetSpecialValueFor( "mana_cost_per_second" )
    
    self.count = 0

    if IsServer() then
        self.damageTable.damage = self.dps * self.tick
    end
end

function modifier_juggernaut_blade_fury_lua:OnDestroy( kv )
    -- Stop effects
    local sound_cast = "Hero_Juggernaut.BladeFuryStart"
    StopSoundOn( sound_cast, self:GetParent() )
end

--------------------------------------------------------------------------------
-- Modifier Effects
function modifier_juggernaut_blade_fury_lua:DeclareFunctions()
    local funcs = {
        MODIFIER_PROPERTY_PROCATTACK_BONUS_DAMAGE_PHYSICAL,
    }

    return funcs
end

function modifier_juggernaut_blade_fury_lua:GetModifierProcAttack_BonusDamage_Physical( params )
    return -params.damage
end

--------------------------------------------------------------------------------
-- Status Effects
function modifier_juggernaut_blade_fury_lua:CheckState()
    local state = {
        [MODIFIER_STATE_MAGIC_IMMUNE] = true
    }

    return state
end

--------------------------------------------------------------------------------
-- Interval Effects
function modifier_juggernaut_blade_fury_lua:OnIntervalThink()
    -- Find enemies in radius
    local enemies = FindUnitsInRadius(
        self:GetCaster():GetTeamNumber(),    -- int, your team number
        self:GetParent():GetOrigin(),    -- point, center point
        nil,    -- handle, cacheUnit. (not known)
        self.radius,    -- float, radius. or use FIND_UNITS_EVERYWHERE
        DOTA_UNIT_TARGET_TEAM_ENEMY,    -- int, team filter
        DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC,    -- int, type filter
        0,    -- int, flag filter
        0,    -- int, order filter
        false    -- bool, can grow cache
    )

    -- damage enemies
    for _,enemy in pairs(enemies) do
        self.damageTable.victim = enemy
        ApplyDamage( self.damageTable )

        -- Play effects
        self:PlayEffects2( enemy )
    end

    -- counter

end

--------------------------------------------------------------------------------
-- Graphics & Animations
function modifier_juggernaut_blade_fury_lua:PlayEffects()
        -- Get Resources
    local particle_cast = "particles/units/heroes/hero_juggernaut/juggernaut_blade_fury.vpcf"
    local sound_cast = "Hero_Juggernaut.BladeFuryStart"

    -- Create Particle
    local effect_cast = ParticleManager:CreateParticle( particle_cast, PATTACH_ABSORIGIN_FOLLOW, self:GetParent() )
    ParticleManager:SetParticleControl( effect_cast, 5, Vector( self.radius, 0, 0 ) )

    -- buff particle
    self:AddParticle(
        effect_cast,
        false,
        false,
        -1,
        false,
        false
    )

    -- Emit sound
    EmitSoundOn( sound_cast, self:GetParent() )
end

function modifier_juggernaut_blade_fury_lua:PlayEffects2( target )
    local particle_cast = "particles/units/heroes/hero_juggernaut/juggernaut_blade_fury_tgt.vpcf"
    local effect_cast = ParticleManager:CreateParticle( particle_cast, PATTACH_ABSORIGIN_FOLLOW, target )
    ParticleManager:ReleaseParticleIndex( effect_cast )
end
--------------------------------------------------------------------------------
function modifier_juggernaut_blade_fury_lua:OnIntervalThink()
    -- check mana
    local mana = self:GetParent():GetMana()
    if mana < self.manacost then
        -- turn off
        if self:GetAbility():GetToggleState() then
            self:GetAbility():ToggleAbility()
        end
        return
    end

    -- damage
    self:Burn()
end

function modifier_juggernaut_blade_fury_lua:Burn()
    -- spend mana
    self:GetParent():SpendMana( self.manacost, self:GetAbility() )
end

Lua:
    "juggernaut_blade_fury_lua"
    {
        // Ability Technical Aspect
        // base script folder    : scripts/vscripts
        // base texture folder    : resource/flash3/images/spellicons
        //-------------------------------------------------------------------------------------------------------------
        "BaseClass"                        "ability_lua"
        "ScriptFile"                    "lua_abilities/juggernaut_blade_fury_lua/juggernaut_blade_fury_lua"
        "AbilityTextureName"            "custom/blade_fury_icon"
        "FightRecapLevel"                "1"
        "MaxLevel"                        "6"
        "precache"
        {
            "soundfile"    "soundevents/game_sounds_heroes/game_sounds_juggernaut.vsndevts"
            "particle"    "particles/units/heroes/hero_juggernaut/juggernaut_blade_fury.vpcf"
            "particle"    "particles/units/heroes/hero_juggernaut/juggernaut_blade_fury_tgt.vpcf"
        }
        
        // Ability General
        //-------------------------------------------------------------------------------------------------------------
        "AbilityType"                    "DOTA_ABILITY_TYPE_BASIC"
        "AbilityBehavior"                "DOTA_ABILITY_BEHAVIOR_TOGGLE | DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_IGNORE_CHANNEL"
        "AbilityUnitDamageType"            "DAMAGE_TYPE_MAGICAL"
        "SpellDispellableType"            "SPELL_DISPELLABLE_NO"
        "SpellImmunityType"                "SPELL_IMMUNITY_ENEMIES_NO"

        // Ability Casting
        //-------------------------------------------------------------------------------------------------------------
        "AbilityCastRange"                "250"

        // Ability Resource
        //-------------------------------------------------------------------------------------------------------------
        "AbilityCooldown"                "0"
        "AbilityManaCost"                "0"

        // Damage
        //-------------------------------------------------------------------------------------------------------------

        // Special
        //-------------------------------------------------------------------------------------------------------------
        "AbilitySpecial"
        {
            "01"
            {
                "var_type"                    "FIELD_FLOAT"
                "blade_fury_damage_tick"    "0.1"
            }
            "02"
            {
                "var_type"                    "FIELD_INTEGER"
                "blade_fury_radius"            "200 300 400 550 750 1000"
            }
            "03"
            {
                "var_type"                    "FIELD_INTEGER"
                "blade_fury_damage"            "100 150 200 250 300 350"
            }
            "04"
            {
                "var_type"                    "FIELD_INTEGER"
                "mana_cost_per_second"        "2"
            }
        }
    }
 
Потому-что функция работает на стороне сервера, по этому стоит добавить if IsServer() then
 
Реклама: