почему не работает sleight_of_fist

dEN5

Пользователь
10 Фев 2019
25
0
steamcommunity.com
Проект
MADNESS: PROJECT ABADDON
Код:
 "sleight_of_fist_no_target"
    {
        // General
        //-------------------------------------------------------------------------------------------------------------
        "BaseClass"                     "ability_datadriven"
        "AbilityBehavior"               "DOTA_ABILITY_BEHAVIOR_NO_TARGET"
        "AbilityUnitDamageType"         "DAMAGE_TYPE_PHYSICAL" 
        "SpellImmunityType"             "SPELL_IMMUNITY_ENEMIES_YES"
        
        "MaxLevel"        "8"
        "RequiredLevel"  "3"
        "FightRecapLevel"   "3"
        "AbilityCastRange"              "200 250 300 350 400 450 500 550 600 600"
        "AbilityCastPoint"              "0"
        "AbilityTextureName"            "tabusha"
        "AOERadius"                     "200 250 300 350 400 450 500 550 600 600"
        
        // Time     
        //-------------------------------------------------------------------------------------------------------------
        "AbilityCooldown"               "15.0 15.0 15.0 14.0 12.0 10.0 8.0 5.0 4.0 3.5"
    
        // Cost
        //-------------------------------------------------------------------------------------------------------------
        "AbilityManaCost"               "50 120 150 150 150 200 200 300 350 400 "
    
        // Special
        //-------------------------------------------------------------------------------------------------------------
        "AbilitySpecial"
        {
            "01"
            {
                "var_type"                  "FIELD_INTEGER"
                "radius"                    "200 300 400 450 500 550 600 650 700 800"
            }
            
            "02"
            {
                "var_type"                  "FIELD_INTEGER"
                "bonus_hero_damage"         "200"
            }
                        
            "03"
            {
                "var_type"                  "FIELD_FLOAT"
                "attack_interval"           "0.1"
            }
    
            "04"
            {
                "var_type"                  "FIELD_INTEGER"
                "creep_damage_penalty"          "120 140 160 180 200 220 240 260 280 300"
            }
        }
            
        // Data driven
        //-------------------------------------------------------------------------------------------------------------
        "precache"
        {
            "soundfile"                     "soundevents/game_sounds_heroes/game_sounds_ember_spirit.vsndevts"
            "particle"                      "particles/units/heroes/hero_ember_spirit/ember_spirit_sleight_of_fist_cast.vpcf"
            "particle"                      "particles/units/heroes/hero_ember_spirit/ember_spirit_sleight_of_fist_caster.vpcf" // for dummy
            "particle"                      "particles/units/heroes/hero_ember_spirit/ember_spirit_sleight_of_fist_targetted_marker.vpcf"
            "particle"                      "particles/units/heroes/hero_ember_spirit/ember_spirit_sleightoffist_tgt.vpcf"
            "particle"                      "particles/units/heroes/hero_ember_spirit/ember_spirit_sleightoffist_trail.vpcf"
        }
        
        "OnSpellStart"
        {
            "FireSound"
            {
                "Target"                    "CASTER"
                "EffectName"                "Hero_EmberSpirit.SleightOfFist.Cast"
            }
        
            "ApplyModifier"
            {
                "Target"                    "CASTER"
                "ModifierName"              "modifier_sleight_of_fist_caster_datadriven"
            }
        
            "RunScript"
            {
                "ScriptFile"                "scripts/npc_abilities/sleight_of_fist_no_target.lua"
                "Function"                  "sleight_of_fist_init"
                "Target"                    "POINT"
            }
        }
        
        "Modifiers"
        {
            "modifier_sleight_of_fist_caster_datadriven"
            {
                "IsPurgable"                "0"
            
                "States"
                {
                    "MODIFIER_STATE_INVULNERABLE"       "MODIFIER_STATE_VALUE_ENABLED"
                    "MODIFIER_STATE_NO_HEALTH_BAR"      "MODIFIER_STATE_VALUE_ENABLED"
                    "MODIFIER_STATE_UNSELECTABLE"       "MODIFIER_STATE_VALUE_ENABLED"
                    "MODIFIER_STATE_NO_UNIT_COLLISION"  "MODIFIER_STATE_VALUE_ENABLED"
                    "MODIFIER_STATE_ROOTED"             "MODIFIER_STATE_VALUE_ENABLED"
                }
            }
            
            "modifier_sleight_of_fist_dummy_datadriven"
            {
                "IsPurgable"                "0"
                "IsHidden"                  "1"
                
                "OnCreated"
                {
                    "AttachEffect"
                    {
                        "Target"                    "TARGET"
                        "EffectName"                "particles/units/heroes/hero_ember_spirit/ember_spirit_sleight_of_fist_caster.vpcf"
                        "EffectAttachType"          "start_at_customorigin"
                        "ControlPointEntities"
                        {
                            "TARGET"                "attach_hitloc"
                        }
                    }
                }
                
                "States"
                {
                    "MODIFIER_STATE_INVULNERABLE"                   "MODIFIER_STATE_VALUE_ENABLED"
                    "MODIFIER_STATE_NO_HEALTH_BAR"                  "MODIFIER_STATE_VALUE_ENABLED"
                    "MODIFIER_STATE_NO_UNIT_COLLISION"              "MODIFIER_STATE_VALUE_ENABLED"
                    "MODIFIER_STATE_NOT_ON_MINIMAP"                 "MODIFIER_STATE_VALUE_ENABLED"
                    "MODIFIER_STATE_UNSELECTABLE"                   "MODIFIER_STATE_VALUE_ENABLED"
                    "MODIFIER_STATE_COMMAND_RESTRICTED"             "MODIFIER_STATE_VALUE_ENABLED"
                    "MODIFIER_STATE_DISARMED"                       "MODIFIER_STATE_VALUE_ENABLED"
                }
            }
            
            "modifier_sleight_of_fist_target_datadriven"
            {
                "IsPurgable"                "0"
            
                "EffectName"                "particles/units/heroes/hero_ember_spirit/ember_spirit_sleight_of_fist_targetted_marker.vpcf"
                "EffectAttachType"          "follow_overhead"
            }
            
            "modifier_sleight_of_fist_target_hero_datadriven"
            {
                "IsPurgable"                "0"
                "IsHidden"                  "1"
            
                "Properties"
                {
                    "MODIFIER_PROPERTY_PREATTACK_BONUS_DAMAGE"      "%bonus_hero_damage"
                }
            }
            
            "modifier_sleight_if_fist_target_creep_datadriven"
            {
                "IsPurgable"                "0"
                "IsHidden"                  "1"
            
                "Properties"
                {
                    "MODIFIER_PROPERTY_DAMAGEOUTGOING_PERCENTAGE"   "%creep_damage_penalty"
                }
            }
        }
    }

Lua:
--[[
    Author: kritth
    Date: 13.01.2015.
    Mark targets, jump to attack, ignore if invisible
]]
function sleight_of_fist_init( keys )
    -- Cannot cast multiple stacks
    if keys.caster.sleight_of_fist_active ~= nil and keys.caster.sleight_of_fist_action == true then
        keys.ability:RefundManaCost()
        return nil
    end

    -- Inheritted variables
    local caster = keys.caster
    local targetPoint = caster:GetAbsOrigin()
    local ability = keys.ability
    local radius = ability:GetLevelSpecialValueFor( "radius", ability:GetLevel() - 1 )
    local attack_interval = ability:GetLevelSpecialValueFor( "attack_interval", ability:GetLevel() - 1 )
    local modifierTargetName = "modifier_sleight_of_fist_target_datadriven"
    local modifierHeroName = "modifier_sleight_of_fist_target_hero_datadriven"
    local modifierCreepName = "modifier_sleight_if_fist_target_creep_datadriven"
    local casterModifierName = "modifier_sleight_of_fist_caster_datadriven"
    local dummyModifierName = "modifier_sleight_of_fist_dummy_datadriven"
    local particleSlashName = "particles/units/heroes/hero_ember_spirit/ember_spirit_sleightoffist_tgt.vpcf"
    local particleTrailName = "particles/units/heroes/hero_ember_spirit/ember_spirit_sleightoffist_trail.vpcf"
    local particleCastName = "particles/units/heroes/hero_ember_spirit/ember_spirit_sleight_of_fist_cast.vpcf"
    local slashSound = "Hero_EmberSpirit.SleightOfFist.Damage"
    
    -- Targeting variables
    local targetTeam = DOTA_UNIT_TARGET_TEAM_ENEMY
    local targetType = DOTA_UNIT_TARGET_BASIC + DOTA_UNIT_TARGET_HERO
    local targetFlag = DOTA_UNIT_TARGET_FLAG_NO_INVIS
    local unitOrder = FIND_ANY_ORDER
    
    -- Necessary varaibles
    local counter = 0
    caster.sleight_of_fist_active = true
--    local dummy = CreateUnitByName( caster:GetName(), caster:GetAbsOrigin(), false, caster, nil, caster:GetTeamNumber() )
--    ability:ApplyDataDrivenModifier( caster, dummy, dummyModifierName, {} )
    
    -- Casting particles
    local castFxIndex = ParticleManager:CreateParticle( particleCastName, PATTACH_CUSTOMORIGIN, caster )
    ParticleManager:SetParticleControl( castFxIndex, 0, targetPoint )
    ParticleManager:SetParticleControl( castFxIndex, 1, Vector( radius, 0, 0 ) )
    
    Timers:CreateTimer( 0.1, function()
            ParticleManager:DestroyParticle( castFxIndex, false )
            ParticleManager:ReleaseParticleIndex( castFxIndex )
        end
    )
    
    -- Start function
    local castFxIndex = ParticleManager:CreateParticle( particleCastName, PATTACH_CUSTOMORIGIN, caster )
    local units = FindUnitsInRadius(
        caster:GetTeamNumber(), targetPoint, caster, radius, targetTeam,
        targetType, targetFlag, unitOrder, false
    )
    
    for _, target in pairs( units ) do
        counter = counter + 1
        ability:ApplyDataDrivenModifier( caster, target, modifierTargetName, {} )
        Timers:CreateTimer( counter * attack_interval, function()
                -- Only jump to it if it's alive
                if target:IsAlive() then
                    -- Create trail particles
                    local trailFxIndex = ParticleManager:CreateParticle( particleTrailName, PATTACH_CUSTOMORIGIN, target )
                    ParticleManager:SetParticleControl( trailFxIndex, 0, target:GetAbsOrigin() )
                    ParticleManager:SetParticleControl( trailFxIndex, 1, caster:GetAbsOrigin() )
                    
                    Timers:CreateTimer( 0.1, function()
                            ParticleManager:DestroyParticle( trailFxIndex, false )
                            ParticleManager:ReleaseParticleIndex( trailFxIndex )
                            return nil
                        end
                    )
                    
                    -- Move hero there
                    FindClearSpaceForUnit( caster, target:GetAbsOrigin(), false )
                    
                    if target:IsHero() then
                        ability:ApplyDataDrivenModifier( caster, caster, modifierHeroName, {} )
                    else
                        ability:ApplyDataDrivenModifier( caster, caster, modifierCreepName, {} )
                    end
                    
                    caster:PerformAttack(target, true, true, true, false, false, false, false) -- FIXED
                    -- Slash particles
                    local slashFxIndex = ParticleManager:CreateParticle( particleSlashName, PATTACH_ABSORIGIN_FOLLOW, target )
                    StartSoundEvent( slashSound, caster )
                    
                    Timers:CreateTimer( 0.1, function()
                            ParticleManager:DestroyParticle( slashFxIndex, false )
                            ParticleManager:ReleaseParticleIndex( slashFxIndex )
                            StopSoundEvent( slashSound, caster )
                            return nil
                        end
                    )
                    
                    -- Clean up modifier
                    caster:RemoveModifierByName( modifierHeroName )
                    caster:RemoveModifierByName( modifierCreepName )
                    target:RemoveModifierByName( modifierTargetName )
                end
                return nil
            end
        )
    end
    
    -- Return caster to origin position
    Timers:CreateTimer( ( counter + 1 ) * attack_interval, function()
--            FindClearSpaceForUnit( caster, dummy:GetAbsOrigin(), false )
--            dummy:RemoveSelf()
            caster:RemoveModifierByName( casterModifierName )
            caster.sleight_of_fist_active = false
            return nil
        end
    )
end

function fengyuewubian ( keys )
  local caster = keys.caster
   local target = keys.target
    local zhili=caster:GetIntellect()
    local mingjie=caster:GetAgility()
    local liliang=caster:GetStrength()
    local damenum=zhili+mingjie+liliang
    
   local damageTable = {victim=target,   
      attacker=caster,         
      damage=damenum*6,
      damage_type=DAMAGE_TYPE_MAGICAL} 
    ApplyDamage(damageTable)   

end

юзаю а он стоит
 

LAPKI

Продвинутый
26 Окт 2018
271
61
Особо в DD и луа не ковырялся, возможно проблема в этом

"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET"
RunScript {
"Target" "POINT"
}

Вы говорите скрипту что для каста не нужен таргет, но при этом у вас поинт таргет передается в скрипт ( это как минимум ошибка )
в оригинале
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_AOE"
 

SniperX

Друзья CG
26 Фев 2018
539
100
Проект
Dota 2x4
Особо в DD и луа не ковырялся, возможно проблема в этом

"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET"
RunScript {
"Target" "POINT"
}

Вы говорите скрипту что для каста не нужен таргет, но при этом у вас поинт таргет передается в скрипт ( это как минимум ошибка )
в оригинале
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_AOE"
Он пытается сделать NO_TARGET абилку, ошибка скорее всего находится в lua
 

LAPKI

Продвинутый
26 Окт 2018
271
61
Он пытается сделать NO_TARGET абилку, ошибка скорее всего находится в lua
ну я посчитал что скрипт он не менял, но опять же, зачем передавать таргет которого нет в скрипт, возможно из-за того что интерпретатор не может найти этот таргет вылетает где-то nullpointerexception(ссылка или объект nil, а ожидалось строго не nil )или IllegalArgumentException(неверный аргумент) и скрипт вероятно вообще не выполняется
 

HappyFeedFriends

Друзья CG
14 Авг 2017
540
32
Проект
Battle Heroes Arena
ну я посчитал что скрипт он не менял, но опять же, зачем передавать таргет которого нет в скрипт, возможно из-за того что интерпретатор не может найти этот таргет вылетает где-то nullpointerexception(ссылка или объект nil, а ожидалось строго не nil )или IllegalArgumentException(неверный аргумент) и скрипт вероятно вообще не выполняется
Дурак, это отправляется точка курсора -_-
 

LAPKI

Продвинутый
26 Окт 2018
271
61
Дурак, это отправляется точка курсора -_-
отправляется точка курсора в ненаправленном и нетаргетовом скилле, дота не знает, что вы там хотите чтобы привязалось к вашему курсору, ей говорят - скилл DOTA_ABILITY_BEHAVIOR_NO_TARGET , так что она и исполняет его как нетаргетовый ( поинт считается таргетом в опреледенной мере)
Это как сказать вам - сделай мне кастомку, но не сказать какую, а я от вас ожидаю tdшку, но вы то об этом не знаете.
Компы не могут за вас додумывать, там не стоит анализатора вашего кода, только проверка синтаксиса и обработка ошибок.
 

HappyFeedFriends

Друзья CG
14 Авг 2017
540
32
Проект
Battle Heroes Arena
отправляется точка курсора в ненаправленном и нетаргетовом скилле, дота не знает, что вы там хотите чтобы привязалось к вашему курсору, ей говорят - скилл DOTA_ABILITY_BEHAVIOR_NO_TARGET , так что она и исполняет его как нетаргетовый ( поинт считается таргетом в опреледенной мере)
Это как сказать вам - сделай мне кастомку, но не сказать какую, а я от вас ожидаю tdшку, но вы то об этом не знаете.
Компы не могут за вас додумывать, там не стоит анализатора вашего кода, только проверка синтаксиса и обработка ошибок.
Я сказал, что по самой логике этого эвента, отправляется точка курсора, я давно не работаю с дд, а бехавиоры выставлять должен уметь каждый и их я не читаю, если человек не понимает логики ДД, то пусть сначала читает пару троек гайдов, пока не поймет,а не спрашивать вопросы которые имеют одну и ту же проблему
 
Реклама: