Добавлен 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, скинь карту или опиши как должен выглядеть спелл и я сделаю тебе пример в свободное время
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
(4 * h / d) * (d - x) * (x / d)
вот остальные формулы
(4 * ((Distance * Height) * ((1 - (Distance / DistanceBetween) / DistanceBetween))))
Ред. rsfghd
Ред. rsfghd
чекни его вопросы и найдёшь мой пример