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 оптимизации есть некоторые требования для передаваемых параметров, потому функции не в некоторых случаях не будут "раскрыты".
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
29
6 лет назад
0
Msey, Кол-во плодящихся хэндлов = количество созданных эффектов
То есть, ЧТД?)
0
29
6 лет назад
0
local player p = GetOwningPlayer(caster)
А игрока не обнулил :P Это тоже хендл.
0
27
6 лет назад
Отредактирован Феникс
0
KingMaximax, Кстати твоя версия со временем была не безосновательной, хэндлы при повторных активациях уменьшаются, однако кое-что таки зависает в количестве 3-5 штук за каждое применение. Буду дальше копать
2
28
6 лет назад
Отредактирован PT153
2
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 оптимизации есть некоторые требования для передаваемых параметров, потому функции не в некоторых случаях не будут "раскрыты".
Принятый ответ
0
18
6 лет назад
0
KingMaximax:
local player p = GetOwningPlayer(caster)
А игрока не обнулил :P Это тоже хендл.
игрок в игре никуда не пропадет, это же не какой-то там юнит или разрушаемый объект.
Тоже самое с boolexpr
Они никуда не утекают
0
27
6 лет назад
0
Интересное наблюдение, в 1.29.2 хэндлы не плодятся и всё нормально работает -_-
Чтобы оставить комментарий, пожалуйста, войдите на сайт.