LoadUnitHandle не возвращает значение функции
Сразу к делу, в функции Eating_TimeEnd локальная переменная u_c не получает значение юнита из функции Trig_Ramen_Actions, в чем проблема?
function Eating_TimeEnd takes nothing returns nothing
    timer t = GetExpiredTimer()
    integer id = GetHandleId(t)
    unit u_c = LoadUnitHandle(h,id,0)
    real tick = LoadReal(h,id,2)
    
    call DisplayTextToForce( GetPlayersAll(), "По немногу подъезжает")
    tick = tick - 0.02
    //x_c--0.02
    SetWidgetLife(u_c,GetWidgetLife(u_c)+20.00)
    
    if tick <= 0.00 or GetUnitX(u_c) != LoadReal(h,id,0) or GetUnitY(u_c) != LoadReal(h,id,1) or GetWidgetLife(u_c) <= 0.405 or GetWidgetLife(u_c) >= GetUnitState(u_c, UNIT_STATE_MAX_LIFE) then
        call DisplayTextToForce( GetPlayersAll(), I2S(id))
        call DisplayTextToForce( GetPlayersAll(), R2S(tick))
        call DisplayTextToForce( GetPlayersAll(), GetUnitName(LoadUnitHandle(h, id, 0)))
        call DisplayTextToForce( GetPlayersAll(), R2S(LoadReal(h,id,0)))
        call DisplayTextToForce( GetPlayersAll(), R2S(GetUnitX(u_c)))
        call DisplayTextToForce( GetPlayersAll(), R2S(LoadReal(h,id,1)))
        call DisplayTextToForce( GetPlayersAll(), R2S(GetUnitY(u_c)))
        GroupRemoveUnit(Ramen_G, u_c)
    endif
    
    if not IsUnitInGroup(u_c,Ramen_G) then
        DestroyEffect(LoadEffectHandle(h,id,0))
        PauseTimer(t)
        DestroyTimer(t)
        FlushChildHashtable(h, id)
    endif
    
    u_c = null
endfunction

function Trig_Ramen_Actions takes nothing returns nothing
    timer t = CreateTimer()
    integer id = GetHandleId(t)
    unit u_c = GetTriggerUnit()
    real x_c = GetUnitX(u_c)
    real y_c = GetUnitY(u_c)
    effect e
    
    if GetSpellAbilityId() == 'AI04' then
        SaveReal(h, id, 0, x_c) 
        SaveReal(h, id, 1, y_c)
        SaveReal(h, id, 2, 10.00)
        SaveUnitHandle(h, id, 0, u_c)
        
        e = AddSpecialEffectTarget("Abilities\\Spells\\Items\\ScrollOfRegeneration\\Scroll_Regen_Target.mdl​", u_c, "chest")
        SaveEffectHandle(h, id, 0, e)
        GroupAddUnit(Ramen_G, u_c)
        TriggerRegisterUnitEvent(Ramen_Trig, u_c, EVENT_UNIT_DAMAGED)
        TimerStart(t, 0.02, true, function Eating_TimeEnd)
    endif
    
    u_c = null
    e = null
endfunction

Лучший ответ:
Независимо от того SaveReal там или SaveUnitHandle, ты записываешь значения в одну и ту же таблицу.
Ты просто SaveReal(h, id, 0, x_c) перезаписываешь этим - SaveUnitHandle(h, id, 0, u_c) и этим - SaveEffectHandle(h, id, 0, e)



Просмотров: 99

» Лучшие комментарии


Diaboliko #1 - 1 неделю назад (отредактировано ) 0
        SaveUnitHandle(h, id, 0, u_c)
        
        e = AddSpecialEffectTarget("Abilities\\Spells\\Items\\ScrollOfRegeneration\\Scroll_Regen_Target.mdl​​", u_c, "chest")
        SaveEffectHandle(h, id, 0, e)
Пушистый #2 - 1 неделю назад (отредактировано ) 0
Много раз осуществляется перезапись одного на другое в функции Trig_Ramen_Actions:
        SaveReal(h, id, 0, x_c) 
        SaveReal(h, id, 1, y_c)
        SaveReal(h, id, 2, 10.00)
        SaveUnitHandle(h, id, 0, u_c)
		...
        SaveEffectHandle(h, id, 0, e)
Что-то здесь да затирается.
P.S. Да и вопрос лучше под кат.
UrsaBoss #3 - 1 неделю назад (отредактировано ) 1

Независимо от того SaveReal там или SaveUnitHandle, ты записываешь значения в одну и ту же таблицу.
Ты просто SaveReal(h, id, 0, x_c) перезаписываешь этим - SaveUnitHandle(h, id, 0, u_c) и этим - SaveEffectHandle(h, id, 0, e)
Hate #4 - 1 неделю назад (отредактировано ) 0
убедитесь что изначально там записывается юнит
п.с. комментаторов выше можешь игнорировать, они ударились об что то твердое и очень сильно

кстати вы не пересохраняете тик, так что таймер будет вечным по сути
DracoL1ch #5 - 1 неделю назад 4
Ну ваще-т он
SaveUnitHandle(h, id, 0, u_c)
...
SaveEffectHandle(h, id, 0, e)
затирает хендл предыдущий
LainMikoroso #6 - 1 неделю назад 0
Ну ваще-т он
SaveUnitHandle(h, id, 0, u_c)
...
SaveEffectHandle(h, id, 0, e)
затирает хендл предыдущий
Т.е. Хеш-тэйбл не имеет различий по типу? мне нужно менять childKey для каждого хендла?
Hate:
кстати вы не пересохраняете тик, так что таймер будет вечным по сути
Спасибо, не увидел
PT153 #7 - 1 неделю назад (отредактировано ) 0
Независимо от того SaveReal там или SaveUnitHandle, ты записываешь значения в одну и ту же таблицу.
Ты просто SaveReal(h, id, 0, x_c) перезаписываешь этим - SaveUnitHandle(h, id, 0, u_c) и этим - SaveEffectHandle(h, id, 0, e)
Это не так, в таблицу под одними и теми же ключами можно сохранять integer, real, string, boolean, handle, и получать сохранённые значения, используя соответствующие функции. То есть если под ключами 1, 2 записать 0, а потом 1.1, то сохранятся оба значения. А вот если сохранить юнита (handle), а потом какой-то другой объект (тоже handle) с теми де ключами, то сохранится только последний, потому что он перезапишет предыдущий.

Ошибка тут.
function Trig_Ramen_Actions takes nothing returns nothing
    if GetSpellAbilityId() == 'AI04' then
        SaveReal(h, id, 0, x_c) 
        SaveReal(h, id, 1, y_c)
        SaveReal(h, id, 2, 10.00)
        SaveUnitHandle(h, id, 0, u_c)  // НЕ перезапишет сохранённое значение x_c.
        
        e = AddSpecialEffectTarget("Abilities\\Spells\\Items\\ScrollOfRegeneration\\Scroll_Regen_Target.mdl​​", u_c, "chest")
        SaveEffectHandle(h, id, 0, e)  // перезапишет сохранённый handle u_c.
        GroupAddUnit(Ramen_G, u_c)
        TriggerRegisterUnitEvent(Ramen_Trig, u_c, EVENT_UNIT_DAMAGED)
        TimerStart(t, 0.02, true, function Eating_TimeEnd)
    endif
    
    u_c = null
    e = null
endfunction
А ещё тут местами пропущены set и call.
UrsaBoss #8 - 1 неделю назад (отредактировано ) 0
Hate:
п.с. комментаторов выше можешь игнорировать, они ударились об что то твердое и очень сильно
ну уж извини, в материале про хештаблицу это и многое другое не упоминается.
Был бы полноценный материал - не было бы таких ошибок.
Постоянно называете "отсталым/и", вместо того чтобы поправить
PT153, благодарю