Как фиксить Motion?

  • Автор темы Автор темы DDSuper
  • Дата начала Дата начала

DDSuper

Друзья CG
31 Май 2019
405
58
Я пытаюсь сделать так, чтобы герой бег(прыгал) на цель, а не в последнюю точку где он находился

Код:
"beat_jigulevskogo"
  {
     "BaseClass"                     "ability_datadriven"
     "AbilityTextureName"            "ability_name"
     "MaxLevel"                         "3"

     "AbilityBehavior"                "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET"
     "AbilityUnitTargetTeam"            "DOTA_UNIT_TARGET_TEAM_ENEMY"
     "AbilityUnitTargetType"            "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC"

     "AbilityCooldown"                "8.0"
     "AbilityManaCost"                "100"

     "AbilityCastRange"                "1500 2000 2500"
     "AbilityCastPoint"                "0.3"
     "AbilityCastAnimation"            "ACT_DOTA_CAST_ABILITY_FLAIL"

     "AbilitySpecial"
     {
         "01"
         {
             "var_type"            "FIELD_INTEGER"
             "speed_traveling"            "1500"
         }
         "02"
         {
             "var_type"            "FIELD_INTEGER"
             "radius"            "1200"
         }
         "03"
         {
             "var_type"            "FIELD_INTEGER"
             "bonus_attack_speed"    "120 200 280"
         }
         "04"
         {
             "var_type"            "FIELD_INTEGER"
             "bonus_movement_speed"    "100 200 300"
         }
         "05"
         {
             "var_type"    "FIELD_INTEGER"
             "bonus_damage"    "120 200 280"
         }
     }
     "OnSpellStart"
     {
         "ApplyModifier"
         {
             "ModifierName"    "modifier_beat"
             "Target"         "CASTER"
             "Duration"        "15"
         }
         "ApplyModifier"
         {
             "ModifierName"    "modifier_motion"
             "Target"         "TARGET"
             "Duration"        "%duration"
         }
     }
     "Modifiers"
     {
         "modifier_beat"
         {
             "Passive"            "0"
             "IsHidden"            "1"
             "IsDebuff"            "0"

             "Properties"
             {
                 "MODIFIER_PROPERTY_ATTACKSPEED_BONUS_CONSTANT" "%bonus_attack_speed"
                 "MODIFIER_PROPERTY_MOVESPEED_BONUS_PERCENTAGE" "%bonus_movement_speed"
                 "MODIFIER_PROPERTY_PREATTACK_BONUS_DAMAGE"       "%bonus_damage"
             }
         }
         "modifier_motion"
         {
             "Passive"            "0"
             "IsHidden"            "1"
             "IsDebuff"            "0"
      
             "OnCreated"
             {
                 "RunScript"
                 {
                     "ScriptFile"    "ability/beat_jigulevskogo.lua"
                     "Function"        "ExtraData"
                 }
                 "ApplyMotionController"
                 {
                     "ScriptFile"    "ability/beat_jigulevskogo.lua"
                     "HorizontalControlFunction" "HorizontalJump"
                      "VerticalControlFunction"     "VerticalJump"
                      "Caster"    "TARGET"
                      "Target" "CASTER"  
                 }
             }
             "OnDestroy"
             {
                 "Damage"
                 {
                     "Target"        "TARGET"
                     "Type"            "DAMAGE_TYPE_MAGICAL"
                     "Damage"        "200"
                 }
             }
         }
     }
  }
Код:
function ExtraData( keys )
    local caster = keys.caster
    local ability = keys.ability

    caster:Stop()

    local distance = ( keys.target:GetAbsOrigin() - caster:GetAbsOrigin() ):Length2D()
    local direction = ( keys.target:GetAbsOrigin() - caster:GetAbsOrigin() ):Normalized()
    ability.traveled_distance = 0
    ability.speed_traveling = 1800 * 1/30
    ability.distance_traveling = distance
    ability.direction_traveling = direction
    ability.z = 0
    ability.move = keys.target:GetOrigin()
end

function HorizontalJump( keys )
    local caster = keys.target
    local ability = keys.ability
    local original_position = caster:GetAbsOrigin()

    if ability.traveled_distance < ability.distance_traveling then
        caster:SetAbsOrigin(original_position + ability.direction_traveling * ability.speed_traveling)
        ability.traveled_distance = ability.traveled_distance + ability.speed_traveling
    else
        caster:InterruptMotionControllers(true)
        caster:RemoveModifierByName("modifier_motion")
    end
    if caster:IsStunned() or caster:IsHexed() or caster:IsOutOfGame() or caster:IsRooted() then
        caster:InterruptMotionControllers(true)
    end
end

function VerticalJump( keys )
    local caster = keys.target
    local ability = keys.ability

    if ability.traveled_distance < ability.distance_traveling / 2 then
        ability.z = ability.z + ability.speed_traveling / 2
        caster:SetAbsOrigin(GetGroundPosition(caster:GetAbsOrigin(), caster) + Vector(0,0,ability.z))
    else
        ability.z = ability.z - ability.speed_traveling / 2
        caster:SetAbsOrigin(GetGroundPosition(caster:GetAbsOrigin(), caster) + Vector(0,0,ability.z))
    end
end
Добавьте к коду решение.
За это огромное спасибо!
 
Последнее редактирование:
Нужно расчеты делать не в ExtraData() а в самом моушене, потому что цель двигается а ты записываешь данные один раз.
Код:
local distance = ( keys.target:GetAbsOrigin() - caster:GetAbsOrigin() ):Length2D()
    local direction = ( keys.target:GetAbsOrigin() - caster:GetAbsOrigin() ):Normalized()
Нужно двигать персонажа до того момента пока дистанция между героем и целью не будет равна, ну скажем 150 (стандартный рендж атаки милишника), и при этом постоянно направлять его в сторону цели.
что типо такого:
Код:
if (caster:GetAbsOrigin() - target:GetAbsOrigin()):Length2D() > 150 then
local direction = (target:GetAbsOrigin() - caster:GetAbsOrigin()):Normalized()
caster:SetAbsOrigin(original_position + direction * ability.speed_traveling)

end
 
  • Нравится
Реакции: Sannin и DDSuper
Реклама: