Воскрешение юнита

FlashDok

Новичок
27 Июн 2023
6
1
Как сделать воскрешение юнита на его первоначальной точке? т.е где был создан юнит.
Сейчас такой код, но он срабатывает 1 раз (воскрешает), далее позиция становится 0,0,0
0004F6F880 [4416.000000 -7040.000000 256.000000]
0004EDE620 [0.000000 0.000000 0.000000]


Код:
-- Глобальная таблица для отслеживания точек создания юнитов
spawnLocations = {}

LinkLuaModifier("modifier_revive_creeps", "ability/neutral/revive_creeps.lua", LUA_MODIFIER_MOTION_NONE)

revive_creeps = class({})

function revive_creeps:GetIntrinsicModifierName()
    return "modifier_revive_creeps"
end

modifier_revive_creeps = class({
    IsHidden = function(self) return true end,
    DeclareFunctions = function(self) return {
        MODIFIER_EVENT_ON_DEATH
    } end,
})

function modifier_revive_creeps:OnCreated(kv)
    -- Получаем уникальный идентификатор юнита
    local unit_id = self:GetParent():entindex()
    -- Сохраняем первоначальную точку создания юнита в глобальной таблице, если она еще не сохранена
    if not spawnLocations[unit_id] then
        spawnLocations[unit_id] = self:GetParent():GetAbsOrigin()
    end
end

function modifier_revive_creeps:OnDeath(data)
    local unit = data.unit

    if unit == self:GetParent() then
        local respawn_duration = self:GetAbility():GetSpecialValueFor("respawn_duration")
        local unit_id = self:GetParent():entindex()
        local spawn_loc = spawnLocations[unit_id] -- Используем сохраненную точку создания
        print(spawn_loc)
        local caster_fw = self:GetParent():GetForwardVector()
        local unit_name = self:GetParent():GetUnitName() -- Получаем имя юнита
        local team = self:GetParent():GetTeam()

        Timers:CreateTimer(respawn_duration, function()
            local new_unit = CreateUnitByName(unit_name, spawn_loc, true, nil, nil, team)
            new_unit:SetForwardVector(caster_fw)
        end)
    end
end
 

vulkantsk

Супермодератор
Команда форума
21 Июн 2017
1,150
196
www.dotabuff.com
Проект
Roshan defense
При использовании функции CreateUnitByName , то в момент появления его на карте он находится на координате (0,0,0), и только спустя кадр перемещается на указанную позицию spawn_loc.
Решение - вызывать функцию считывания координаты с задержкой 0.1 сек ( поставь таймер)

Также рекомендую посмотреть как сделан респавн юнитов в этоп проекте
 

FlashDok

Новичок
27 Июн 2023
6
1
При использовании функции CreateUnitByName , то в момент появления его на карте он находится на координате (0,0,0), и только спустя кадр перемещается на указанную позицию spawn_loc.
Решение - вызывать функцию считывания координаты с задержкой 0.1 сек ( поставь таймер)

Также рекомендую посмотреть как сделан респавн юнитов в этоп проекте
Я по подобию как в проекте делал, но нашел ошибку у себя. (сейчас исправил).

Такой вопрос пытаюсь реализовать далее повышения уровня при воскрешении/смерти юнита.
Почему-то OnDeath() срабатывает как-будто два раза (юнит появляется 1), но уровень повышается с 1 сразу на 3, и далее при воскрешении вообще не повышается так и остается 3 уровень.
Код:
LinkLuaModifier("modifier_revive_creeps", "ability/neutral/revive_creeps.lua", LUA_MODIFIER_MOTION_NONE)

revive_creeps = class({})

function revive_creeps:GetIntrinsicModifierName()
    return "modifier_revive_creeps"
end

modifier_revive_creeps = class({
    IsHidden = function(self) return true end,
    DeclareFunctions = function(self) return {
        MODIFIER_EVENT_ON_DEATH
    } end,
})

function modifier_revive_creeps:OnCreated(kv)
    Timers:CreateTimer(0, function()
        local ability = self:GetAbility()
        self.respawn_duration = ability:GetSpecialValueFor("respawn_duration")
        self.spawn_loc = self:GetCaster():GetAbsOrigin()
        self.caster_fw = self:GetCaster():GetForwardVector()
    end)
end

function modifier_revive_creeps:OnDeath(data)
    local unit = data.unit
    local caster = self:GetCaster()

    if unit == caster then -- Проверяем, что юнит, который умер, является самим кастером
        local spawn_loc = self.spawn_loc
        local caster_fw = self.caster_fw
        local unit_name = caster:GetUnitName()
        local team = caster:GetTeam()
        local respawn_duration = self:GetAbility():GetSpecialValueFor("respawn_duration")

        -- Создаем юнита после истечения времени возрождения
        Timers:CreateTimer(respawn_duration, function()
            local new_unit = CreateUnitByName(unit_name, spawn_loc, true, nil, nil, team)

            -- Получаем текущий уровень юнита
            local current_level = new_unit:GetLevel()

            -- Увеличиваем уровень юнита на 1
            local new_level = current_level + 1

            -- Устанавливаем уровень юнита
            new_unit:CreatureLevelUp(new_level)
            new_unit:SetForwardVector(caster_fw)
        end)
    end
end
 
Реклама: