- 27 Июн 2023
- 6
- 1
Сейчас юнит при атаке можно сказать сразу вызывает lua код, а не использует способность, вопрос это правильный подход к реализации?
Суть абилки такая (пока условие триггера атака) что при атаке юнит кастует способность (сейчас просто выполняется lua, ставится кд и отнимается мана) - вот до этого дошел, но как по мне это костыль какой-то.
Я пытался сделать отдельный lua подключить его в addon_game_mod и там "слушать атаки", если атакует нужный юнит и способности isCastable, то кастуем, но чего-то вообще было 0 реакции - по мне так правильно реализовать скил, потому-что если тригер не атаки юнита, а его кол-во хп например.
Есть юнит с абилкой
Сама абилка
Суть абилки такая (пока условие триггера атака) что при атаке юнит кастует способность (сейчас просто выполняется lua, ставится кд и отнимается мана) - вот до этого дошел, но как по мне это костыль какой-то.
Я пытался сделать отдельный lua подключить его в addon_game_mod и там "слушать атаки", если атакует нужный юнит и способности isCastable, то кастуем, но чего-то вообще было 0 реакции - по мне так правильно реализовать скил, потому-что если тригер не атаки юнита, а его кол-во хп например.
Есть юнит с абилкой
"Ability1" "summon_zombie"
Сама абилка
Код:
"summon_zombie"
{
// General
//-------------------------------------------------------------------------------------------------------------
"BaseClass" "ability_lua"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET"
"ScriptFile" "ability/neutral/boss_undying.lua"
"AbilityCastAnimation" "ACT_DOTA_ATTACK"
"MaxLevel" "1"
"AbilityCastPoint" "3.0"
"AbilityCooldown" "20.0"
"AbilityManaCost" "20"
}
Код:
LinkLuaModifier("modifier_summon_zombie", "ability/neutral/boss_undying.lua", LUA_MODIFIER_MOTION_NONE)
require("timers")
-- Класс скилла
summon_zombie = class({})
function summon_zombie:GetIntrinsicModifierName()
return "modifier_summon_zombie"
end
-- Модификатор для скилла
modifier_summon_zombie = class({
IsHidden = function(self) return true end,
DeclareFunctions = function(self) return {
MODIFIER_EVENT_ON_ATTACK_START
} end,
})
-- При создании модификатора
function modifier_summon_zombie:OnCreated(kv)
self.zombieName = "npc_dota_unit_undying_zombie" -- Имя юнита-зомби
self.team = self:GetParent():GetTeam()
self.respawnDuration = 2 -- Длительность возрождения зомби
end
function summon(event)
print("summon")
local caster = event.caster
local spawnLoc = caster:GetAbsOrigin()
local zombieName = "npc_dota_unit_undying_zombie"
local zombie = CreateUnitByName(zombieName, spawnLoc, true, nil, nil, caster:GetTeam())
zombie:SetForwardVector(caster:GetForwardVector())
zombie:SetOwner(caster:GetPlayerOwner())
end
-- При атаке юнита
function modifier_summon_zombie:OnAttackStart(data)
local attacker = data.attacker
local ability = self:GetAbility()
-- Проверяем, что атакующий юнит является владельцем модификатора
if attacker == self:GetParent() then
-- Проверяем, что способность не находится в перезарядке и хватает маны
if ability:IsCooldownReady() and ability:GetManaCost(-1) <= attacker:GetMana() then
-- Проверяем, что целью атаки является другой юнит (не сам атакующий)
if data.target and data.target ~= attacker then
local spawnLoc = attacker:GetAbsOrigin()
local casterFw = attacker:GetForwardVector()
-- Создаем юнита-зомби после истечения времени возрождения
Timers:CreateTimer(self.respawnDuration, function()
local zombie = CreateUnitByName(self.zombieName, spawnLoc, true, nil, nil, self.team)
zombie:SetForwardVector(casterFw)
end)
-- Вычитаем ману у юнита
attacker:SpendMana(ability:GetManaCost(-1), ability)
-- Активируем способность
attacker:CastAbilityNoTarget(ability, -1)
-- Устанавливаем перезарядку
ability:StartCooldown(ability:GetCooldown(-1))
end
end
end
end