function damage takes nothing returns nothing
    local effect e = AddSpecialEffectTarget("Objects\\Spawnmodels\\Human\\HumanBlood\\HumanBloodFootman.mdl", GetEnumUnit(), "chest") // Создаём спецэффект //
    call UnitDamageTarget(caster, GetEnumUnit(), 100, TRUE, FALSE, ATTACK_TYPE_HERO, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS)
    call TriggerSleepAction(0.3)
    call DestroyEffect(e)
    set e = null
endfunction
Почему утекает спецэффект?

function check takes nothing returns boolean
    local unit u = GetFilterUnit()
    local player p = GetOwningPlayer(caster)
    local real coneAngle = TransferDegrees(bj_RADTODEG * Atan2(GetUnitY(u) - GetUnitY(caster), GetUnitX(u) - GetUnitX(caster)))
    local real sector = 30
    local boolean answer =  u != caster and IsUnitEnemy(u, p) and IsUnitVisible(u, p) and IsUnitAliveBJ(u) and GetUnitFacing(caster) - coneAngle <= sector and GetUnitFacing(caster) - coneAngle >= sector - sector*2
    set u = null
    set p = null // игрока можно не обнулять, их всё же очень конечное количество.
    return answer
endfunction
На кол-во handles это никак не повлияло.
Потому что никто из твоих FilterUnit() не был убран из игры. Без обнуления после удаления юнита хэндл бы остался, а с обнулением, был бы освобождён для нового использования.
У них стандартное время смерти 5 секунд, смотри игровые константы.
Поставь в игровых константах Decay Time - Effects время меньше, но не очень маленькое, а то анимация смерти эффекта проигрываться не будет.

Чтобы не плодить переменные эффекта, сделай такие функции:
function CreateEffectPoint takes string s, real x, real y returns nothing
    call DestroyEffect(AddSpecialEffect(s, x, y))
endfunction

function CreateEffectTarget takes string s, widget w, string att returns nothing
    call DestroyEffect(AddSpecialEffectTarget(s, w, att))
endfunction
Во время сохранения при включённой оптимизации кода и выключенном режиме дебага эти 2 функции будут "раскрыты", и в конечном коде будут только DestroyEffect(AddSpecialEffectTarget(...)).
У Inline оптимизации есть некоторые требования для передаваемых параметров, потому функции не в некоторых случаях не будут "раскрыты".
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
29
Все спецэффекты должны прелоадиться, чтобы при первом их применении не было лагов. Это особенно заметно, если использовать многокомпонентные заклинания с несколькими эффектами.
Делается так:
call Preload("Abilities\\Spells\\Other\\Stampede\\StampedeMissileDeath.mdl")
28
если ты вызовешь функцию более одного раза за 0.3 секунды, то запаузенный триггер запустится заново, а созданный спецэффект не удалится.
Удалится, он же локальную переменную использует, а не глобальную, потому что при каждом запуске триггера создаётся новый поток.
28
function check takes nothing returns boolean
local unit u = GetFilterUnit()
local player p = GetOwningPlayer(caster)
local real coneAngle = TransferDegrees(bj_RADTODEG * Atan2(GetUnitY(u) - GetUnitY(caster), GetUnitX(u) - GetUnitX(caster)))
local real sector = 30
return u != caster and IsUnitEnemy(u, p) and IsUnitVisible(u, p) and IsUnitAliveBJ(u) and GetUnitFacing(caster) - coneAngle <= sector and GetUnitFacing(caster) - coneAngle >= sector - sector*2
endfunction
ты тут локалку u не обнуляешь
уже утечка
юзай тут глобалку
29
По идее там ничего утекать не должно. Кстати, я тестировал с дуосом эффекты на память, они удаляются с игры не сразу, а постепенно. Может убрать наркоманский wait и всё доверить это дело таймеру, как говорил Msey. Можно конечно сделать и псевдо таймеры..Ы. И вообще, а разве кровь пехотинца сразу перебивается DestroyEffect?
29
Msey, С эффектом даже прелоад не сработал
16GB:
ты тут локалку u не обнуляешь
уже утечка
юзай тут глобалку
Да нет там никакой утечки -_-
По крайней мере handles не изменяются от повторений
28
юзай тут глобалку
Тут можно создать локальную логическую, а хендлы обнулить.
KingMaximax:
ни удаляются с игры не сразу, а постепенно
У них стандартное время смерти 5 секунд, смотри игровые константы.
29
KingMaximax, Я уже удалил wait, дело не в нём. Мб, ты прав, и стоит подождать...
28
Да нет там никакой утечки -_-
Есть, ты не обнуляешь u. Как я уже сказал, создай логическую переменную, запиши ответ, обнули u и верни ответ.
29
Да нет там никакой утечки -_-
Вообще-то Миха прав, у тебя там утечки, ты не обнуляешь ссылки. Оно не подчищает за собой знаешь ли, в локалках. Как можно быть таким. Лучше ищи утечки в необнулённых локальных переменных типа hanlde.
29
Попробуй создать 10 различных спецэффектов, а потом их же несколько раз. Если остается в памяти 10 хэндлов, то предположение по поводу интернирования спецэффектов близко к правде
29
Чтобы успокоить ваши души
function check takes nothing returns boolean
    local unit u = GetFilterUnit()
    local player p = GetOwningPlayer(caster)
    local real coneAngle = TransferDegrees(bj_RADTODEG * Atan2(GetUnitY(u) - GetUnitY(caster), GetUnitX(u) - GetUnitX(caster)))
    local real sector = 30
    if u != caster and IsUnitEnemy(u, p) and IsUnitVisible(u, p) and IsUnitAliveBJ(u) and GetUnitFacing(caster) - coneAngle <= sector and GetUnitFacing(caster) - coneAngle >= sector - sector*2 then
       set u = null
    return true
    else 
        set u = null
    return false
    endif 
endfunction
На кол-во handles это никак не повлияло.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.