Делаю способность, в которой юнит плюёт в случайные точки и плевки летят по параболе, но столкнулся с проблемой, что периодически плевки не летят вовсе. Причём вообще не понимаю почему не записывается часть данных в хеш.
Код способности
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, скинь карту или опиши как должен выглядеть спелл и я сделаю тебе пример в свободное время
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
28
ArhiMEN, скинь карту или опиши как должен выглядеть спелл и я сделаю тебе пример в свободное время
Принятый ответ
14
зачем рандом если значении идентичны?
local integer Spell = GetRandomInt(1,1)
11
Гуванч, это потому что у босса пока что одна способность
14
ты все не правильно делаешь опешу примерно
устанавливаешь точку с которого будут вылетать снаряды
создаешь дамми юнита с нужной моделью
создаешь группу для дамми
случайный угол(0-360)
сохраняешь в хеш этот угол под ключом созданного дамми(GetHandleId(Dummy))
заносишь в группу этого дамми
TimerStart()
2 функция
выгружаешь группу
через ForGroup(в этой функции выгружаешь угол выбранного даммика образом) =>
local real a = LoadReal(Hashtable,GetHandleId(GetEnumUnit()),StringHash("Angle"))
SetUnitX(GetEnumUnit(),GetUnitX(GetEnumUnit()) + 30 * Cos(a)
SetUnitY(GetEnumUnit(),GetUnitY(GetEnumUnit()) + 30 * Cos(a)

это можно юзать без мемхака и это делается очень просто
11
Гуванч
  1. Смысл это делать без мемхака, если проще двигать эффект, а не делать нового юнита для этого.
  2. Они у меня двигаются, но не все, в этом проблема, как двигать я знаю
14
ArhiMEN:
вот сделал спелл прикрути сюда параболу и все

я мемхаку не доверяю

у меня все как часы работает

и да забыл, укажи кол-во даммиков

если чуть по колдовать получится это

да блин, сделал первый скилл разора с доты))))))

вот оригинал спела
Загруженные файлы
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.