Добавлен  ArhiMEN 
                            
                            
                            
                            
                            
                            
                        
                        
                    Делаю способность, в которой юнит плюёт в случайные точки и плевки летят по параболе, но столкнулся с проблемой, что периодически плевки не летят вовсе. Причём вообще не понимаю почему не записывается часть данных в хеш. 
Код способности
function AcidSplitFunc takes nothing returns nothing
    local timer ASTimer = GetExpiredTimer()
    
    local effect AcidSplit = LoadEffectHandle(H, GetHandleId(ASTimer), StringHash("AcidSplit"))
    local real ASX = GetEffectX(AcidSplit)
    local real ASY = GetEffectY(AcidSplit)
    local real ASZ = GetEffectZ(AcidSplit)
    local real Distance = LoadReal(H, GetHandleId(ASTimer), StringHash("Distance")) + 2
    local real Height = LoadReal(H, GetHandleId(ASTimer), StringHash("Height"))
    
    
    local real AlarmX = LoadReal(H, GetHandleId(ASTimer), StringHash("AlarmX"))
    local real AlarmY = LoadReal(H, GetHandleId(ASTimer), StringHash("AlarmY"))
    
    local real DistanceBetween = SquareRoot((AlarmX - ASX) * (AlarmX - ASX) - (AlarmY - ASY) * (AlarmY - ASY))
    local real a = bj_RADTODEG * Atan2(AlarmY - ASY, AlarmX - ASX)
    
    if DistanceBetween > 5.00 then
        call SetEffectX(AcidSplit, ASX + 2 * Cos(a * bj_DEGTORAD))
        call SetEffectY(AcidSplit, ASY + 2 * Sin(a * bj_DEGTORAD))
        call SetEffectZ(AcidSplit, (4 * ((Distance *  Height) * ((1 - (Distance / DistanceBetween) / DistanceBetween)))))
    else
        call DestroyTimer(ASTimer)
        call FlushChildHashtable(H, GetHandleId(ASTimer))
    endif
    
    set ASTimer = null
    set AcidSplit = null
endfunction
function DefilerSpellCast takes nothing returns nothing
    local integer Spell = GetRandomInt(1,1)
    local real PointX 
    local real PointY
    local real a = GetRandomReal(1, 360)
    local effect Alarm
    local effect AcidSplit
    local integer ASLoop = 0
    local timer ASTimer 
    local real DistanceBetween
    
    if Spell == 1  and GetUnitState(GetTriggerUnit(), UNIT_STATE_MANA) == 100 then
        loop 
            exitwhen ASLoop == 10
            
            set AcidSplit = AddSpecialEffect("Abilities\\Weapons\\ChimaeraAcidMissile\\ChimaeraAcidMissile.mdl", GetUnitX(GetTriggerUnit()), GetUnitY(GetTriggerUnit()))
            
            set PointX = GetUnitX(gg_unit_h000_0070) + GetRandomReal(1, 1000) * Cos(a * bj_DEGTORAD)
            set PointY = GetUnitY(gg_unit_h000_0070) + GetRandomReal(1, 1000) * Sin(a * bj_DEGTORAD)
            
            set Alarm = AddSpecialEffect("Alarm.mdl", PointX, PointY)
            call SetEffectColourR(Alarm, 255)
            call SetEffectColourG(Alarm, 0)
            call SetEffectColourB(Alarm, 0)
            
            set DistanceBetween = SquareRoot((PointX - GetUnitX(GetTriggerUnit())) * (PointX - GetUnitX(GetTriggerUnit())) - (PointY - GetUnitY(GetTriggerUnit())) * (PointY - GetUnitY(GetTriggerUnit())))
            
            set ASTimer = CreateTimer()
            call TimerStart(ASTimer, 0.01, true, function AcidSplitFunc)
            
            call SaveEffectHandle(H, GetHandleId(ASTimer), StringHash("AcidSplit"), AcidSplit)
            call SaveReal(H, GetHandleId(ASTimer), StringHash("AlarmX"), PointX)
            call SaveReal(H, GetHandleId(ASTimer), StringHash("AlarmY"), PointY)
            call SaveReal(H, GetHandleId(ASTimer), StringHash("Distanse"), 0)
            call SaveReal(H, GetHandleId(ASTimer), StringHash("Height"), DistanceBetween * 0.4)
            
            set ASTimer = null 
            
            set ASLoop = ASLoop + 1
        endloop
    endif
    
    call SetUnitState(GetTriggerUnit(), UNIT_STATE_MANA, RMaxBJ(0, 0))
    
    set Alarm = null
    set AcidSplit = null
endfunction
//===========================================================================
function InitTrig_DefilerSpell takes nothing returns nothing
    local trigger defiler = CreateTrigger()
    
    call TriggerRegisterUnitEvent( defiler, gg_unit_n003_0054, EVENT_UNIT_ATTACKED )
    call TriggerAddAction( defiler, function DefilerSpellCast )
    
    set defiler = null
endfunctionЧто я сделал не так?
Принятый ответ
 ArhiMEN, скинь карту или опиши как должен выглядеть спелл и я сделаю тебе пример в свободное время
    
        
            
                `
            
            
                
        
    
    ОЖИДАНИЕ РЕКЛАМЫ...
            
                    
                        Чтобы оставить комментарий, пожалуйста, войдите на сайт.
                    
                
            
                                WC3
                            



(4 * h / d) * (d - x) * (x / d)
вот остальные формулы
(4 * ((Distance * Height) * ((1 - (Distance / DistanceBetween) / DistanceBetween))))
Ред. rsfghd
Ред. rsfghd