Аура

Туня

Новичок
10 Мар 2020
6
0
Приветствую вновь в моей теме.

Встала перед вопросом, можно ли сделать в одной ауре с одним эффектом( например, "nevermore_dark_lord" )разницу действия относительно юнита. То есть, чем ближе - сильнее эффект, чем дальше - слабее. Или же по радиусам, 200 - 2 снижения брони, 400 - 4 и тд.

Буду рада обсудить или выслушать Ваше мнение.
 

ZLOY

Администратор
Команда форума
27 Июн 2016
953
182
Можно
В функции GetModifierPhysicalArmorBonus модификатора считать расстояние от владельца модификатора до кастера и в зависимости от расстояния возвращать нужное значение
 

Туня

Новичок
10 Мар 2020
6
0
Можно
В функции GetModifierPhysicalArmorBonus модификатора считать расстояние от владельца модификатора до кастера и в зависимости от расстояния возвращать нужное значение
Если не сложно, можете показать пример ?
"DOTAAbilities"
{
"nevermore_dark_lord"
{
"BaseClass" "ability_datadriven"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"AbilityTextureName" "nevermore_dark_lord"
"MaxLevel" "7"
// Casting
//-------------------------------------------------------------------------------------------------------------
"AbilityCastRange" "900"

// Special
//-------------------------------------------------------------------------------------------------------------
"AbilitySpecial"
{
"01"
{
"var_type" "FIELD_INTEGER"
"presence_armor_reduction" "-1 -2 -3 -4 -5 -6 -8"
"LinkedSpecialBonus" "special_bonus_unique_nevermore_5"
}
"02"
{
"var_type" "FIELD_INTEGER"
"presence_radius" "1200"
}
"03"
{
"var_type" "FIELD_FLOAT"
"disarmor_percent" "15 17 20 22 24 27 30"
}
}

"Modifiers"
{
"modifier_passive_dark_lord_aura_emitter"
{
"Passive" "1"
"IsHidden" "1"
"IsPurgable" "0"

"Aura" "modifier_passive_dark_lord_aura"
"Aura_Radius" "%presence_radius"
"Aura_Teams" "DOTA_UNIT_TARGET_TEAM_ENEMY"
"Aura_Types" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC"
"Aura_Flags" "DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES"
"Aura_ApplyToCaster" "0"
}

"modifier_passive_dark_lord_aura"
{
"IsHidden" "1"
"Passive" "0"

"ThinkInterval" "0.5"
"OnIntervalThink"
{
"RunScript"
{
"ScriptFile" "heroes/nevermore/dark_lord.lua"
"Function" "Disarmor"
"ModifierName" "modifier_passive_dark_lord_disarmor"
"Disarmor_const" "%presence_armor_reduction"
"Disarmor_pct" "%disarmor_percent"
}
}
}

"modifier_passive_dark_lord_disarmor"
{
"IsDebuff" "1"
"Passive" "0"
"IsHidden" "0"

"Properties"
{
"MODIFIER_PROPERTY_PHYSICAL_ARMOR_BONUS" "-1"
}

"ThinkInterval" "0.2"
"OnIntervalThink"
{
"RunScript"
{
"ScriptFile" "heroes/nevermore/dark_lord.lua"
"Function" "CheckAura"
"ModifierName" "modifier_passive_dark_lord_aura"
"ModifierRemove" "modifier_passive_dark_lord_disarmor"
}
}
}
}
}
}
 
Последнее редактирование модератором:

ZLOY

Администратор
Команда форума
27 Июн 2016
953
182
Код:
"DOTAAbilities"
{
    "ability_test"
    {
        "BaseClass" "ability_lua"
        "ScriptFile" "ability_test.lua"

        "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
        "AbilityTextureName" "nevermore_dark_lord"
        "MaxLevel" "7"
        // Casting
        //-------------------------------------------------------------------------------------------------------------
        "AbilityCastRange" "900"

        // Special
        //-------------------------------------------------------------------------------------------------------------
        "AbilitySpecial"
        {
            "01"
            {
                "var_type" "FIELD_INTEGER"
                "aura_armor" "-10"
            }
            "02"
            {
                "var_type" "FIELD_INTEGER"
                "aura_radius" "1200"
            }

        }

    
    }
}
Код:
ability_test = class({})
LinkLuaModifier("modifier_test","ability_test.lua",LUA_MODIFIER_MOTION_NONE)
LinkLuaModifier("modifier_test_aura_effect","ability_test.lua",LUA_MODIFIER_MOTION_NONE)

function ability_test:GetIntrinsicModifierName()
    return "modifier_test"
end

-------------------------------------------------------------------------------

modifier_test = class({})

function modifier_test:GetAttributes()
    return MODIFIER_ATTRIBUTE_MULTIPLE + MODIFIER_ATTRIBUTE_PERMANENT
end

function modifier_test:IsHidden()
    return true
end

function modifier_test:IsPurgable()
    return false
end


function modifier_test:IsAura()
    return true
end

function modifier_test:GetAuraRadius()
    return self.radius
end

function modifier_test:GetAuraSearchType()
    return DOTA_UNIT_TARGET_BASIC + DOTA_UNIT_TARGET_HERO
end

function modifier_test:GetAuraSearchTeam()
    return DOTA_UNIT_TARGET_TEAM_FRIENDLY
end

function modifier_test:GetAuraSearchFlags()
    return DOTA_UNIT_TARGET_FLAG_INVULNERABLE
end

function modifier_test:GetAuraDuration()
    return 1
end

function modifier_test:GetModifierAura()
    return "modifier_test_aura_effect"
end

function modifier_test:OnCreated(kv)
    self.radius = self:GetAbility():GetSpecialValueFor("aura_radius")
end

-----------------------------------------------------------------------------------------

modifier_test_aura_effect = class({})

function modifier_test_aura_effect:IsBuff()
    return true
end

function modifier_test_aura_effect:DeclareFunctions()
    local funcs = {
        MODIFIER_PROPERTY_PHYSICAL_ARMOR_BONUS
    }
 
    return funcs
end

function modifier_test_aura_effect:GetModifierPhysicalArmorBonus()
    local dist = self:GetParent():GetRangeToUnit(self:GetCaster())
    local radius =  self:GetAbility():GetSpecialValueFor("aura_radius")

    local x = dist/radius

    if x > 1 then
        x = 1
    end


    return x * self.armorBonus
end

function modifier_test_aura_effect:OnCreated(kv)
    self.armorBonus = self:GetAbility():GetSpecialValueFor("aura_armor")
end

Как-то так
 

Dangalor

Пользователь
11 Авг 2016
32
0
Код:
"DOTAAbilities"
{
    "ability_test"
    {
        "BaseClass" "ability_lua"
        "ScriptFile" "ability_test.lua"

        "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
        "AbilityTextureName" "nevermore_dark_lord"
        "MaxLevel" "7"
        // Casting
        //-------------------------------------------------------------------------------------------------------------
        "AbilityCastRange" "900"

        // Special
        //-------------------------------------------------------------------------------------------------------------
        "AbilitySpecial"
        {
            "01"
            {
                "var_type" "FIELD_INTEGER"
                "aura_armor" "-10"
            }
            "02"
            {
                "var_type" "FIELD_INTEGER"
                "aura_radius" "1200"
            }

        }

   
    }
}
Код:
ability_test = class({})
LinkLuaModifier("modifier_test","ability_test.lua",LUA_MODIFIER_MOTION_NONE)
LinkLuaModifier("modifier_test_aura_effect","ability_test.lua",LUA_MODIFIER_MOTION_NONE)

function ability_test:GetIntrinsicModifierName()
    return "modifier_test"
end

-------------------------------------------------------------------------------

modifier_test = class({})

function modifier_test:GetAttributes()
    return MODIFIER_ATTRIBUTE_MULTIPLE + MODIFIER_ATTRIBUTE_PERMANENT
end

function modifier_test:IsHidden()
    return true
end

function modifier_test:IsPurgable()
    return false
end


function modifier_test:IsAura()
    return true
end

function modifier_test:GetAuraRadius()
    return self.radius
end

function modifier_test:GetAuraSearchType()
    return DOTA_UNIT_TARGET_BASIC + DOTA_UNIT_TARGET_HERO
end

function modifier_test:GetAuraSearchTeam()
    return DOTA_UNIT_TARGET_TEAM_FRIENDLY
end

function modifier_test:GetAuraSearchFlags()
    return DOTA_UNIT_TARGET_FLAG_INVULNERABLE
end

function modifier_test:GetAuraDuration()
    return 1
end

function modifier_test:GetModifierAura()
    return "modifier_test_aura_effect"
end

function modifier_test:OnCreated(kv)
    self.radius = self:GetAbility():GetSpecialValueFor("aura_radius")
end

-----------------------------------------------------------------------------------------

modifier_test_aura_effect = class({})

function modifier_test_aura_effect:IsBuff()
    return true
end

function modifier_test_aura_effect:DeclareFunctions()
    local funcs = {
        MODIFIER_PROPERTY_PHYSICAL_ARMOR_BONUS
    }

    return funcs
end

function modifier_test_aura_effect:GetModifierPhysicalArmorBonus()
    local dist = self:GetParent():GetRangeToUnit(self:GetCaster())
    local radius =  self:GetAbility():GetSpecialValueFor("aura_radius")

    local x = dist/radius

    if x > 1 then
        x = 1
    end


    return x * self.armorBonus
end

function modifier_test_aura_effect:OnCreated(kv)
    self.armorBonus = self:GetAbility():GetSpecialValueFor("aura_armor")
end

Как-то так

Подход работает , но есть проблемка не понимаю в чем прикол может знаешь...
Когда использую статическую цифру в GetModifierPhysicalArmorBonus например return 10 все норм
но если начинаю брать из переменной которая инициализируеться в OnCreated то ничего не работает и в GetModifierPhysicalArmorBonus очень часто приходит nil
Код:
-------------------------------------------------------------------------------

AuraAbility = class({})

function AuraAbility:GetAttributes()
    return MODIFIER_ATTRIBUTE_MULTIPLE + MODIFIER_ATTRIBUTE_PERMANENT
end

function AuraAbility:IsHidden()
    return false
end

function AuraAbility:IsPurgable()
    return false
end


function AuraAbility:IsAura()
    return true
end

function AuraAbility:GetAuraRadius()
    return  self.AOE
end

function AuraAbility:GetAuraSearchType()
    return DOTA_UNIT_TARGET_BASIC + DOTA_UNIT_TARGET_HERO
end

function AuraAbility:GetAuraSearchTeam()
    return DOTA_UNIT_TARGET_TEAM_FRIENDLY
end

function AuraAbility:GetAuraSearchFlags()
    return DOTA_UNIT_TARGET_FLAG_INVULNERABLE
end

function AuraAbility:GetAuraDuration()
    return 1
end

function AuraAbility:GetModifierAura()
    return "R_EarthAura"
end

function AuraAbility:OnCreated(kv)
       if IsServer() then
        local x = self:GetCaster():FindAbilityByName("Shaman_R_EarthSkill")
        self.AOE = x:GetLevelSpecialValueFor( "AOE",x:GetLevel()  )
        end
end

function AuraAbility:GetEffectAttachType()
 return PATTACH_POINT_FOLLOW
end

function AuraAbility:GetEffectName()
    return "particles/frostivus_gameplay/wraith_king_hellfire_eruption_tell.vpcf"
end

--------------------
--------------------
--------------------

R_EarthAura= class({})

function R_EarthAura:IsHidden()
  return false
end
function R_EarthAura:OnCreated ()
    if IsServer() then
        local x = self:GetCaster():FindAbilityByName("Shaman_R_EarthSkill")
        self.manaRestore = x:GetLevelSpecialValueFor( "ManaRestore",x:GetLevel()  )/10000
        self.heal = x:GetLevelSpecialValueFor( "Heal",x:GetLevel() ) /10000
        self.HP = self:GetParent():GetMaxHealth()*self.heal
        self.MP = self:GetParent():GetMaxMana() * self.manaRestore
        self.AS = x:GetLevelSpecialValueFor( "AS",x:GetLevel()  )
        self.arm = x:GetLevelSpecialValueFor( "arm",x:GetLevel()  )
        self.res = x:GetLevelSpecialValueFor( "res",x:GetLevel() )
        -- print    ( "AS = ",self.AS )
    end
end

function R_EarthAura:DeclareFunctions()
    local funcs = {
        MODIFIER_PROPERTY_PHYSICAL_ARMOR_BONUS,
        MODIFIER_PROPERTY_TRANSLATE_ACTIVITY_MODIFIERS,
        MODIFIER_PROPERTY_ATTACKSPEED_BONUS_CONSTANT,
        MODIFIER_PROPERTY_MAGICAL_RESISTANCE_BONUS ,
        MODIFIER_PROPERTY_MANA_REGEN_CONSTANT ,
        MODIFIER_PROPERTY_HEALTH_REGEN_CONSTANT,
    }
 
    return funcs
end

function R_EarthAura:GetModifierConstantManaRegen ( params )
    if self:GetParent():GetMana() >= 0 and self.MP ~= nil then
        self:GetParent():SetMana( self:GetParent():GetMana() + self.MP)
    end
    return self.MP
end

function R_EarthAura:GetModifierConstantHealthRegen ( params )
    if self.HP ~= nil then
    self:GetParent():Heal(self.HP,  self:GetCaster())
    end
    return self.HP
end

function R_EarthAura:GetModifierAttackSpeedBonus_Constant ( params )
    return self.AS
end

function R_EarthAura:GetModifierPhysicalArmorBonus ( params )
-- print(" self.GetParent = ", self:GetParent():GetName())
-- print(" self.arm = ", self.arm)
    -- return 11
    return self.arm
end

function R_EarthAura:GetActivityTranslationModifiers( params )
        print("GetActivityTranslationModifiers")
        return "zzz"
end
function R_EarthAura:GetModifierMagicalResistanceBonus ( params )
    return self.res
end

function R_EarthAura:GetEffectAttachType()
 return PATTACH_OVERHEAD_FOLLOW
end

function R_EarthAura:GetEffectName()
    return "particles/econ/items/earth_spirit/earth_spirit_ti6_boulder/espirit_ti6_rollingboulder_gather.vpcf"
end

function R_EarthAura:IsDebuff()
  return false
end
function R_EarthAura:GetTexture()
    return "Shaman/Shaman_R_EarthAura"
end

function R_EarthAura:GetAuraSearchType()
    return DOTA_UNIT_TARGET_BASIC + DOTA_UNIT_TARGET_HERO
end

function R_EarthAura:GetAuraSearchTeam()
    return DOTA_UNIT_TARGET_TEAM_FRIENDLY
end

function R_EarthAura:GetAuraSearchFlags()
    return DOTA_UNIT_TARGET_FLAG_INVULNERABLE
end


-----------------
-----------------
-----------------
-----------------
-----------------


zzz= class({})

function zzz:IsHidden()
  return false
end
function zzz:OnCreated ()
        print    ( "zzzzzz = " )
    if IsServer() then
        print    ( "zzzzzz = " )
    end
end


R_EarthAuraAncient= class({})

function R_EarthAuraAncient:IsHidden()
  return false
end
function R_EarthAuraAncient:OnCreated ()
        print    ( "zzzzzz = " )
    if IsServer() then
        print    ( "zzzzzz = " )
    end
end

function R_EarthAuraAncient:DeclareFunctions()
    local funcs = {
        MODIFIER_PROPERTY_ATTACKSPEED_BONUS_CONSTANT,
        MODIFIER_PROPERTY_PREATTACK_BONUS_DAMAGE,
        MODIFIER_PROPERTY_INCOMING_DAMAGE_PERCENTAGE,
    }
 
     return funcs
end

function R_EarthAuraAncient:GetModifierAttackSpeedBonus_Constant()
     return 150
end

function R_EarthAuraAncient:GetModifierPreAttack_BonusDamage()
     return 200
end

function R_EarthAuraAncient:GetModifierIncomingDamage_Percentage()
    if 1 then
     return -50
    else
     return 0
     end
end

Также не понятно как работает GetActivityTranslationModifiers из модифаера, как я понял оно должно само наложить другой модифаер , в функцию заходит иногда , но ничего не делает , если можно подробнее об этом.

Вызываю ауру у дами которому даётся скилл который кастуется по условию в общем саму ауру вызываю так

Код:
В OnSpellStart
self:GetCaster():AddNewModifier(self:GetCaster(),self,"AuraAbility", {})

Заранее благодарен!)
 

ZLOY

Администратор
Команда форума
27 Июн 2016
953
182
Ну тут нужно просто разделять модификатор на стороне клиента и на стороне сервера. Ты же сам добавил IsServer() и на клиенте этих переменных нет.
Если ты уберешь IsServer() и будешь использовать self:GetAbility():GetSpecialValueFor("arm"), то увидишь что все отлично работает
 
  • Нравится
Реакции: Dangalor

Dangalor

Пользователь
11 Авг 2016
32
0
Ну тут нужно просто разделять модификатор на стороне клиента и на стороне сервера. Ты же сам добавил IsServer() и на клиенте этих переменных нет.
Если ты уберешь IsServer() и будешь использовать self:GetAbility():GetSpecialValueFor("arm"), то увидишь что все отлично работает

Не подумал спасибо !
 
Реклама: