Решено Способность срабатываемая при атаке

Filonov

Пользователь
13 Ноя 2022
37
4
Помогите пожалуйста сделать пассивную способность, которая будет замедлять врага на 2 секунды при успешной атаке по нему
 

iia3uk666

Друзья CG
18 Дек 2021
411
70
Проект
Ушел с CG
Для создания пассивной способности, которая замедляет противника (героя) при атаке, вам понадобится изменить файл npc_abilities_custom.txt и написать соответствующий Lua-скрипт.

1. Откройте файл npc_abilities_custom.txt и добавьте следующий код:

Код:
"custom_slow_attack"
{
"BaseClass"    "ability_lua"
"AbilityTextureName" "custom_slow_attack"
"ScriptFile"   "abilities/custom_slow_attack"
"AbilityBehavior"  "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"AbilityType"   "DOTA_ABILITY_TYPE_BASIC"
"MaxLevel"    "1"
"AbilitySpecial"
{
  "01"
  {
   "var_type"  "FIELD_INTEGER"
   "slow_duration" "2"  // Длительность замедления в секундах
  }
  "02"
  {
   "var_type"  "FIELD_INTEGER"
   "slow_amount" "10" // Процент замедления
  }
}
}

2. Создайте новый файл с именем custom_slow_attack.lua и поместите его в папку scripts/vscripts/abilities/. Вставьте следующий код в файл:
Lua:
LinkLuaModifier("modifier_custom_slow_attack", "abilities/custom_slow_attack", LUA_MODIFIER_MOTION_NONE)
custom_slow_attack = class({})


function custom_slow_attack:GetIntrinsicModifierName()
return "modifier_custom_slow_attack"
end
modifier_custom_slow_attack = class({})

function modifier_custom_slow_attack:IsHidden()
return true
end


function modifier_custom_slow_attack:DeclareFunctions()
local funcs = {
  MODIFIER_EVENT_ON_ATTACK_LANDED,
}
return funcs
end


function modifier_custom_slow_attack:OnAttackLanded(keys)
if IsServer() then
  local attacker = keys.attacker
  local target = keys.target


  if attacker == self:GetParent() and target:IsHero() then
   local slow_duration = self:GetAbility():GetSpecialValueFor("slow_duration")
   local slow_amount = self:GetAbility():GetSpecialValueFor("slow_amount")


   target:AddNewModifier(attacker, self:GetAbility(), "modifier_custom_slow_attack", {duration = slow_duration})
  end
end
end


function modifier_custom_slow_attack:GetEffectName()
return "particles/generic_gameplay/generic_slowed_cold.vpcf"
end


function modifier_custom_slow_attack:GetEffectAttachType()
return PATTACH_ABSORIGIN_FOLLOW
end


function modifier_custom_slow_attack:GetTexture()
return "custom_slow_attack"
end


function modifier_custom_slow_attack:DeclareFunctions()
local funcs = {
  MODIFIER_PROPERTY_MOVESPEED_BONUS_PERCENTAGE,
}
return funcs
end


function modifier_custom_slow_attack:GetModifierMoveSpeedBonus_Percentage()
return -self:GetAbility():GetSpecialValueFor("slow_amount")
end

3. Сохраните файлы и перезапустите Dota 2.

Теперь у вас есть пассивная способность "custom_slow_attack", которая замедляет противника на 10% на 2 секунды при каждой атаке. Вы можете настроить значения замедления и длительности в файле npc_abilities_custom.txt.
 

Filonov

Пользователь
13 Ноя 2022
37
4
Для создания пассивной способности, которая замедляет противника (героя) при атаке, вам понадобится изменить файл npc_abilities_custom.txt и написать соответствующий Lua-скрипт.

1. Откройте файл npc_abilities_custom.txt и добавьте следующий код:

Код:
"custom_slow_attack"
{
"BaseClass"    "ability_lua"
"AbilityTextureName" "custom_slow_attack"
"ScriptFile"   "abilities/custom_slow_attack"
"AbilityBehavior"  "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"AbilityType"   "DOTA_ABILITY_TYPE_BASIC"
"MaxLevel"    "1"
"AbilitySpecial"
{
  "01"
  {
   "var_type"  "FIELD_INTEGER"
   "slow_duration" "2"  // Длительность замедления в секундах
  }
  "02"
  {
   "var_type"  "FIELD_INTEGER"
   "slow_amount" "10" // Процент замедления
  }
}
}

2. Создайте новый файл с именем custom_slow_attack.lua и поместите его в папку scripts/vscripts/abilities/. Вставьте следующий код в файл:
Lua:
LinkLuaModifier("modifier_custom_slow_attack", "abilities/custom_slow_attack", LUA_MODIFIER_MOTION_NONE)
custom_slow_attack = class({})


function custom_slow_attack:GetIntrinsicModifierName()
return "modifier_custom_slow_attack"
end
modifier_custom_slow_attack = class({})

function modifier_custom_slow_attack:IsHidden()
return true
end


function modifier_custom_slow_attack:DeclareFunctions()
local funcs = {
  MODIFIER_EVENT_ON_ATTACK_LANDED,
}
return funcs
end


function modifier_custom_slow_attack:OnAttackLanded(keys)
if IsServer() then
  local attacker = keys.attacker
  local target = keys.target


  if attacker == self:GetParent() and target:IsHero() then
   local slow_duration = self:GetAbility():GetSpecialValueFor("slow_duration")
   local slow_amount = self:GetAbility():GetSpecialValueFor("slow_amount")


   target:AddNewModifier(attacker, self:GetAbility(), "modifier_custom_slow_attack", {duration = slow_duration})
  end
end
end


function modifier_custom_slow_attack:GetEffectName()
return "particles/generic_gameplay/generic_slowed_cold.vpcf"
end


function modifier_custom_slow_attack:GetEffectAttachType()
return PATTACH_ABSORIGIN_FOLLOW
end


function modifier_custom_slow_attack:GetTexture()
return "custom_slow_attack"
end


function modifier_custom_slow_attack:DeclareFunctions()
local funcs = {
  MODIFIER_PROPERTY_MOVESPEED_BONUS_PERCENTAGE,
}
return funcs
end


function modifier_custom_slow_attack:GetModifierMoveSpeedBonus_Percentage()
return -self:GetAbility():GetSpecialValueFor("slow_amount")
end

3. Сохраните файлы и перезапустите Dota 2.

Теперь у вас есть пассивная способность "custom_slow_attack", которая замедляет противника на 10% на 2 секунды при каждой атаке. Вы можете настроить значения замедления и длительности в файле npc_abilities_custom.txt.
Почему-то не работает
 

iia3uk666

Друзья CG
18 Дек 2021
411
70
Проект
Ушел с CG
Почему-то не работает
Замени луашку на эту - должно все воркать, проверил /// партикл добавляй сам!
Lua:
LinkLuaModifier("modifier_custom_slow_attack", "abilities/custom_slow_attack", LUA_MODIFIER_MOTION_NONE)
LinkLuaModifier("modifier_custom_slow_attack_debuff", "abilities/custom_slow_attack", LUA_MODIFIER_MOTION_NONE)

custom_slow_attack = class({})

function custom_slow_attack:GetIntrinsicModifierName()
    return "modifier_custom_slow_attack"
end

modifier_custom_slow_attack = class({})

function modifier_custom_slow_attack:IsHidden()
    return true
end

function modifier_custom_slow_attack:DeclareFunctions()
    local funcs = {
        MODIFIER_EVENT_ON_ATTACK_LANDED,
    }
    return funcs
end

function modifier_custom_slow_attack:OnAttackLanded(keys)
    if IsServer() then
        local attacker = keys.attacker
        local target = keys.target

        if attacker == self:GetParent() and target:IsHero() and attacker:GetTeamNumber() ~= target:GetTeamNumber() then
            local slow_duration = self:GetAbility():GetSpecialValueFor("slow_duration")
            local slow_amount = self:GetAbility():GetSpecialValueFor("slow_amount")

            target:AddNewModifier(attacker, self:GetAbility(), "modifier_custom_slow_attack_debuff", {duration = slow_duration})
        end
    end
end

modifier_custom_slow_attack_debuff = class({})

function modifier_custom_slow_attack_debuff:IsDebuff()
    return true
end

function modifier_custom_slow_attack_debuff:GetEffectName()
    return "particles/items_fx/wand_of_the_brine_buff.vpcf"
end

function modifier_custom_slow_attack_debuff:GetEffectAttachType()
    return PATTACH_ABSORIGIN_FOLLOW
end



function modifier_custom_slow_attack_debuff:DeclareFunctions()
    local funcs = {
        MODIFIER_PROPERTY_MOVESPEED_BONUS_PERCENTAGE,
    }
    return funcs
end

function modifier_custom_slow_attack_debuff:GetModifierMoveSpeedBonus_Percentage()
    return -self:GetAbility():GetSpecialValueFor("slow_amount")
end
 
Последнее редактирование:

iia3uk666

Друзья CG
18 Дек 2021
411
70
Проект
Ушел с CG
Чуть скринов + addon_russian.txt
Код:
        "DOTA_Tooltip_modifier_custom_slow_attack_debuff" "Яд"
        "DOTA_Tooltip_modifier_custom_slow_attack_debuff_Description" "Вы замедлены"
        
        "DOTA_Tooltip_Ability_custom_slow_attack" "Ядовитые путы"
        "DOTA_Tooltip_Ability_custom_slow_attack_Description" "Замедляет атакуемую цель на %slow_duration% секунды на %slow_amount%%."

1693086204000.png
1693086194047.png
 

Filonov

Пользователь
13 Ноя 2022
37
4
Чуть скринов + addon_russian.txt
Код:
        "DOTA_Tooltip_modifier_custom_slow_attack_debuff" "Яд"
        "DOTA_Tooltip_modifier_custom_slow_attack_debuff_Description" "Вы замедлены"
       
        "DOTA_Tooltip_Ability_custom_slow_attack" "Ядовитые путы"
        "DOTA_Tooltip_Ability_custom_slow_attack_Description" "Замедляет атакуемую цель на %slow_duration% секунды на %slow_amount%%."

Большое спасибо! Завтра проверю
 

iia3uk666

Друзья CG
18 Дек 2021
411
70
Проект
Ушел с CG
Вот кусочек кода, красивого партикла дебаффа - его просто замени в луашке
function modifier_custom_slow_attack_debuff:GetEffectName()
return "particles/units/heroes/hero_dark_willow/dark_willow_wisp_spell_debuff.vpcf"
end

function modifier_custom_slow_attack_debuff:GetEffectAttachType()
return PATTACH_OVERHEAD_FOLLOW
end
1693087771050.png
 
Последнее редактирование:

iia3uk666

Друзья CG
18 Дек 2021
411
70
Проект
Ушел с CG
Добавив в луашку пару строк можно добиться эффекта ракрытия инвиза на время действия и постоянного вижина - как ульта бх собственно только с виженом вокруг
1693088023063.png
function modifier_custom_slow_attack_debuff:CheckState()
local state = {
[MODIFIER_STATE_INVISIBLE] = false,
[MODIFIER_STATE_PROVIDES_VISION] = true,
}
return state
end
 
Последнее редактирование:

Filonov

Пользователь
13 Ноя 2022
37
4
Чуть скринов + addon_russian.txt
Код:
        "DOTA_Tooltip_modifier_custom_slow_attack_debuff" "Яд"
        "DOTA_Tooltip_modifier_custom_slow_attack_debuff_Description" "Вы замедлены"
      
        "DOTA_Tooltip_Ability_custom_slow_attack" "Ядовитые путы"
        "DOTA_Tooltip_Ability_custom_slow_attack_Description" "Замедляет атакуемую цель на %slow_duration% секунды на %slow_amount%%."

Я проверил и понял, что возможно тот код тоже работал, но у меня был модификатор который даёт бафф герою и модикатор который замедляет врага, а я написал 2 фунции GetIntrinsicModifierName() на бафф и на дебафф врага поэтоиу не работало. Сейчас добавил функцию OnAttackLanded в модификатор баффа и добавил партикл, теперь при атаке всё работает. Спасибо!
 
Реклама: