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

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
23
Похожие вопросы:

ответ
проверь настройки A01P, возможно, там кривые данные выше 3-го уровня
ответ
Kanteu, у тебя в описаниях стоит код AUdc, тебе нужно его заменить на равкод твоей способности. Чтобы его узнать, выдели способность и нажми Ctrl+D. Перед двоеточием будет равкод способности.
ответ
МодификаторПал я так понимаю число, а не юнит...
local unit u
local real r
Это конкретно по ошибке... а вообще - не надо смотреть видео от этого человека, он тебя плохому научит... правда. А другим потом придётся тебя переучивать, если ты сам это дело не забросишь
ответ
краш пропал сам собой, после смены варика. КАЧАЙТЕ ДЕФОЛТНЫЙ ВАРИК БЕЗ миксов и всякой дряни!

28
Radioactive, как они будут перезаписываться если там каждый раз новый таймер?

Вот формула параболы без учёта начальной и конечной высоты
(4 * h / d) * (d - x) * (x / d)
вот остальные формулы
а у тебя
(4 * ((Distance * Height) * ((1 - (Distance / DistanceBetween) / DistanceBetween))))

Так же советую избавиться от утечек, у тебя эффект навсегда остаётся в игре

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))
убери тут "* bj_DEGTORAD" и "bj_RADTODEG *"

при изменении позиции эффекта ты не меняешь пройденную дистанцию

стрингхэши можешь запеременить в глобалки и GetHandleId в локалку, а вообще перейди на структуры уже, ими удобнее пользоваться, выгрузил структуру и меняешь значения не объявляя для них переменную, после изменений значений не нужно обратно всё сохранять
11
rsfghd, с пораболой я уже разобрался и я не совсем понял,что за структуры?

Сейчас дело в том, что часть "снарядов" надвигается с места. Я решил проверить почему и выяснил, что в среднем у трёх эффектов дистанция равна нулю. Возможно дело в том, что я использую функции МемХака и из-за скорости движения что-то сбивается?
28
ArhiMEN, я тоже двигал эффекты на мх ничего не сбивалось. По структурам есть статьи и vJass.doc
14
rsfghd:
ArhiMEN, я тоже двигал эффекты на мх ничего не сбивалось. По структурам есть статьи и vJass.doc
не лучше ли скинуть ему пример? я вот научился изучая твои спелы а статьи не очень то помогли
28
Гуванч, я ему уже кидал пример вместе с полуготовым скиллом по его просьбе, кушка катарины
14
rsfghd:
Гуванч, я ему уже кидал пример вместе с полугодовым скиллом по его просьбе, кушка катарины
а мне не скинешь?
28
rsfghd, алло))
чекни его вопросы и найдёшь мой пример

вы ж в паре работаете
11
rsfghd, а как проблему с тем, что не все эффекты двигаются решить?
28
ArhiMEN, скинь карту или опиши как должен выглядеть спелл и я сделаю тебе пример в свободное время
Принятый ответ
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.