XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Закрытая тема
 
16GB
GhostOne User
offline
Опыт: 60,317
Активность:
Добавление отрицательной маны/Fatal Error
В общем может кто-то знает при каких условиях, она вызывает фатал, у меня в карте есть спелл добавляющий юниту цели абилку на -15к маны. Иногда при этом случается фатал. Но провести аналогию между ситуациями не вышло, не понятно почему фаталит не всегда. Если кто сталкивался прошу поделится.
function SoulHarvestCon takes nothing returns boolean
    return GetSpellAbilityId() == 'A0JI'
endfunction

function SoulHarvestMove takes nothing returns nothing
    local timer t = GetExpiredTimer()
    local integer id = GetHandleId(t)
    local unit c = LoadUnitHandle(udg_AssassinHash, id, 0)
    local unit u = LoadUnitHandle(udg_AssassinHash, id, 1)
    local unit d = LoadUnitHandle(udg_AssassinHash, id, 2)
    local real r = 0.
    local real dist = LoadReal(udg_AssassinHash, id, 3)
    local real dist1 = 0.
    local integer i = LoadInteger(udg_AssassinHash, id, 5)
    local boolean b = LoadBoolean(udg_AssassinHash, id, 4)
    local boolean v = LoadBoolean(udg_AssassinHash, id, 6)
    local real dmg = 75. * GetUnitAbilityLevel(c, 'A0JI')
    if b == false and i == 0 then
        set dist1 = FDFD(d, c)
        if dist1 > 35. then
            set r = ABU(c, d)
            if dist1 > dist then
                call SaveReal(udg_AssassinHash, id, 3, dist1)
            endif
            call SetUnitX(d, GetUnitX(d) + 30. * Cos(r))
            call SetUnitY(d, GetUnitY(d) + 30. * Sin(r))
            call SetUnitFlyHeight(d, ParabolaZ(400., dist, dist1) - 20., 0)
        else
            call SaveBoolean(udg_AssassinHash, id, 4, true)
        endif
    endif
    if b then
        if i < 70 and v == false then
            set r = LoadReal(udg_AssassinHash, id, 6) + .174
            if r == 6.28 then
                set r = 0.
            endif
            call SaveReal(udg_AssassinHash, id, 6, r)
            call SetUnitFacing(d, r * bj_RADTODEG)
            call SetUnitX(d, SafeX(GetUnitX(c) + 95. * Cos(r)))
            call SetUnitY(d, SafeY(GetUnitY(c) + 95. * Sin(r)))
            if IsUnitInvisible(c, udg_EmenyPlayer[GetPlayerId(GetOwningPlayer(c)) + 1]) then
                call UnitAddAbility(d, 'A0ES')
            else
                call UnitRemoveAbility(d, 'A0ES')
            endif
            call SaveInteger(udg_AssassinHash, id, 5, i + 1)
            if FDFD(c, u) < 185. then
                call SaveBoolean(udg_AssassinHash, id, 6, true)
            endif
        endif
        if v then
            set r = ABU(u, d)
            if FDFD(d, u) < 35. then
                call UnitRemoveAbility(u, 'A0JG')
                call DestroyEffect(LoadEffectHandle(udg_AssassinHash, id, StringHash("ED")))
                call DestroyEffect(LoadEffectHandle(udg_AssassinHash, id, StringHash("ED2")))
                call DestroyEffect(LoadEffectHandle(udg_AssassinHash, id, StringHash("ED3")))
                call UnitApplyTimedLife(d, 'BTLF', 1)
                call DestroyTimer(t)
                call FlushChildHashtable(udg_AssassinHash, id)
            else
                call SetUnitX(d, SafeX(GetUnitX(d) + 30. * Cos(r)))
                call SetUnitY(d, SafeY(GetUnitY(d) + 30. * Sin(r)))
                call UnitRemoveAbility(d, 'A0ES')
            endif
        endif
        if i > 68 and v == false then
            set r = ABU(u, d)
            if FDFD(d, u) < 35. then
                call DestroyEffect(LoadEffectHandle(udg_AssassinHash, id, StringHash("ED")))
                call DestroyEffect(LoadEffectHandle(udg_AssassinHash, id, StringHash("ED2")))
                call DestroyEffect(LoadEffectHandle(udg_AssassinHash, id, StringHash("ED3")))
                call UnitApplyTimedLife(d, 'BTLF', 1)
                call UnitRemoveAbility(u, 'A0JG')
                if IsUnitDeadBX(u) == false then
                    call UnitDamageTarget(c, u, dmg, true, false, ATTACK_TYPE_CHAOS, DAMAGE_TYPE_UNKNOWN, WEAPON_TYPE_WHOKNOWS)
                    if LoadReal(udg_AssassinHash, id, StringHash("SHM")) - dmg < 0. then
                        call SetUnitState(u, UNIT_STATE_MANA, 0.)
                    else
                        call SetUnitState(u, UNIT_STATE_MANA, LoadReal(udg_AssassinHash, id, StringHash("SHM")) - dmg)
                    endif
                    set d = CreateUnit(GetOwningPlayer(u), 'h02G', GetUnitX(u), GetUnitY(u), 0)
                    call UnitApplyTimedLife(d, 'BTLF', 1.)
                    call SetUnitAbilityLevel(d, 'A0H7', 5)
                    call IssueTargetOrder(d, "soulburn", u)
                    set d = null
                endif
                call DestroyTimer(t)
                call FlushChildHashtable(udg_AssassinHash, id)
            else
                call SetUnitX(d, SafeX(GetUnitX(d) + 30. * Cos(r)))
                call SetUnitY(d, SafeY(GetUnitY(d) + 30. * Sin(r)))
                call UnitRemoveAbility(d, 'A0ES')
            endif
        endif
    endif
    set t = null
    set u = null
    set c = null
    set d = null
endfunction

function SoulHarvest takes nothing returns nothing
    local unit c = GetSpellAbilityUnit()
    local unit u = GetSpellTargetUnit()
    local timer t
    local integer id
    local unit d
    if GetUnitAbilityLevel(u, 'A0JG') == 0 then
        set t = CreateTimer()
        set id = GetHandleId(t)
        set d = CreateUnit(GetOwningPlayer(c), 'e00O', GetUnitX(u), GetUnitY(u), ABU(c, u) * bj_RADTODEG)
        call SaveUnitHandle(udg_AssassinHash, id, 0, c)
        call SaveUnitHandle(udg_AssassinHash, id, 1, u)
        call SaveUnitHandle(udg_AssassinHash, id, 2, d)
        call SaveEffectHandle(udg_AssassinHash, id, StringHash("ED"), AddSpecialEffectTarget("Abilities\\Weapons\\IllidanMissile\\IllidanMissile.mdl", d, "origin"))
        call SaveEffectHandle(udg_AssassinHash, id, StringHash("ED2"), AddSpecialEffectTarget("Abilities\\Weapons\\AvengerMissile\\AvengerMissile.mdl", d, "origin"))
        call SaveEffectHandle(udg_AssassinHash, id, StringHash("ED3"), AddSpecialEffectTarget("Abilities\\Weapons\\WitchDoctorMissile\\WitchDoctorMissile.mdl", d, "origin"))
        call SetUnitFlyHeight(d, 50, 0)
        call SetUnitScale(d, 1.55, 1.55, 1.55)
        call SaveReal(udg_AssassinHash, id, 3, FDFD(c, u))
        call SaveReal(udg_AssassinHash, id, StringHash("SHM"), GetUnitState(u, UNIT_STATE_MANA))
        call UnitAddAbility(u, 'A0JG')
        call TimerStart(t, .03, true, function SoulHarvestMove)
    else
        call SimError(GetOwningPlayer(c), "У этого юнита уже нет души.")
        call IssueImmediateOrder(c, "stop")
        call DelayedManaCheck(c, 145.)
    endif
    set t = null
    set u = null
    set c = null
    set d = null
endfunction
Видео
В обоих случаях, фатал вылетел сразу в начале каста, т.е при добавлении способности.
Так же бывает, что после удаления способности, мана цели восстановится до максимума или же на оборот, опустится до нуля.
[+] замечание от DioD: нет отладочных сообщений

Отредактировано 16GB, 12.05.2013 в 11:57.
Старый 12.05.2013, 11:49
Extremator

offline
Опыт: 39,428
Активность:
Я конечно в коде не шарю...
Но мб подойти к этом по другому?
Например на отнимать 15к маны абилкой,
а просто запомнить ману юнита-жертвы,
и каждые там 0.05 сек устанавливать её на 0.
Когда действие эффекта окончится - вернуть ману на прежнее значение.
Я так понимаю ты отнимаешь ману что бы не дать юниту пользоваться магией - тогда может быть дать сайленс?
Хотя возможно ты рассчитываешь на запрет активации только тех скиллов которые тратят ману (артовые способности тоже), тогда можно как раз таки и обнулять ману!
Старый 13.05.2013, 17:05
16GB
GhostOne User
offline
Опыт: 60,317
Активность:
Extremator,
нужна именно минус мана, например, есть герой у которого блок урона от количестве маны, у другого дот от маны. И это абилка контрит всё это , сало не пойдёт.
Старый 13.05.2013, 17:19
adic3x

offline
Опыт: 108,439
Активность:
И вы конечно же пробовали добавлять способность на отрицательную ману вне данного кода, что-бы узнать, проблема в самой способность или в кривом коде, а ответ нам не сообщили только потому, что вы скрытый веган?
Старый 13.05.2013, 17:41
16GB
GhostOne User
offline
Опыт: 60,317
Активность:
конечно пробовал, всё нормально удаляется/добавляется, но это не показатель, ибо фатлит абилка не чаще чем раз в 100 игр. За час теста, этого героя на карте я не смог вызывать фатал. Из-за чего не удаётся понять при каких конкретно условиях фаталит абилка, записанные реплеи так же ответа не дают, ничего общего в ситуациях нет.
Поэтому и я создал тему мб кто сталкивался.
Старый 13.05.2013, 18:11
DioD

offline
Опыт: 45,134
Активность:
записанные риплеи не дают ответа потому что по неведомым притчинам вы не используете отладку.
добавите отладку создайте тему еще раз.
Старый 13.05.2013, 18:46
Закрытая тема

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 20:34.