function moveAndDamage takes nothing returns nothing
    local timer t = GetExpiredTimer()
    local integer h_id = GetHandleId(t)
    local unit caster = LoadUnitHandle(udg_hash, h_id, StringHash("caster"))
    local unit dummy = LoadUnitHandle(udg_hash, h_id, StringHash("dummy"))
    local integer counter = LoadInteger(udg_hash, h_id, StringHash("counter"))
    local real angle = LoadReal(udg_hash, h_id, StringHash("angle"))
    local real distance = LoadReal(udg_hash, h_id, StringHash("distance"))
    local integer duration_in_count = LoadInteger(udg_hash, h_id, StringHash("duration_in_count"))
    local real new_x = GetUnitX(caster) + distance * Cos(angle * bj_DEGTORAD)
    local real new_y = GetUnitY(caster) + distance * Sin(angle * bj_DEGTORAD)
    local group g_group = LoadGroupHandle(udg_hash, h_id, StringHash("g_group"))
    local unit d_unit
    
    if (counter > 0 and GetUnitState(caster, UNIT_STATE_LIFE) > 0.00) then
        if (counter > duration_in_count - 50) then
            call SaveReal(udg_hash, h_id, StringHash("distance"), distance + 7.00)
        elseif (counter < 50) then
            call SaveReal(udg_hash, h_id, StringHash("distance"), distance - 7.00)
        endif
        
        call SaveReal(udg_hash, h_id, StringHash("angle"), angle - 3.00)
        call SetUnitPosition(dummy, new_x, new_y)
        call SaveInteger(udg_hash, h_id, StringHash("counter"), counter - 1)

        call GroupEnumUnitsInRange(udg_l_group, new_x, new_y, 75.00, null)
        
        // ********************************************************************************
        loop
            set d_unit = FirstOfGroup(udg_l_group)
            if ( not IsUnitInGroup(d_unit, g_group) and d_unit != null) then
                call DisplayTextToPlayer(Player(0), 0.00, 0.00, "БАЦ")
                call GroupRemoveUnit(udg_l_group, d_unit)
                call GroupAddUnit(g_group, d_unit)
            endif
            exitwhen d_unit == null 
        endloop
		// ********************************************************************************
        
        call SaveGroupHandle(udg_hash, h_id, StringHash("g_group"), g_group)
    else
        call RemoveUnit(dummy)
        call DestroyTimer(t)
        call FlushChildHashtable(udg_hash, h_id)
    endif
    
    set t = null
    set caster = null
    set dummy = null
    call DestroyGroup(g_group)
    set g_group = null
    set d_unit = null
    call GroupClear(udg_l_group)
endfunction

function AstralniiStraj takes nothing returns nothing
    local real duration = 15.00
    local real period = 0.03
    local integer counter = R2I(duration / period)
    local timer t
    local unit dummy
    local unit caster
    local integer h_id
    
    if (GetSpellAbilityId() == 'A001') then
        set caster = GetSpellAbilityUnit() 
        set dummy = CreateUnit(GetOwningPlayer(caster), 'h001', GetUnitX(caster), GetUnitY(caster), 0.00)
        set t = CreateTimer()
        set h_id = GetHandleId(t)
        call SaveUnitHandle(udg_hash, h_id, StringHash("caster"), caster)
        call SaveUnitHandle(udg_hash, h_id, StringHash("dummy"), dummy)
        call SaveInteger(udg_hash, h_id, StringHash("counter"), counter)
        call SaveReal(udg_hash, h_id, StringHash("angle"), 360.00)
        call SaveReal(udg_hash, h_id, StringHash("distance"), 0.00)
        call SaveInteger(udg_hash, h_id, StringHash("duration_in_count"), counter)
        call SaveGroupHandle(udg_hash, h_id, StringHash("g_group"), CreateGroup())
        call TimerStart(t, period, true, function moveAndDamage)
        set caster = null
        set dummy = null
        set t = null
    endif
endfunction

// *** trigger initialization ***
function InitTrig_AstralniiStraj takes nothing returns nothing
    local integer i = 0
    set gg_trg_AstralniiStraj = CreateTrigger()
    loop
        exitwhen i > GetPlayers()
        call TriggerRegisterPlayerUnitEvent(gg_trg_AstralniiStraj, Player(i), EVENT_PLAYER_UNIT_SPELL_EFFECT, null)
        set i = i + 1
    endloop
    call TriggerAddCondition(gg_trg_AstralniiStraj, Condition(function AstralniiStraj))
endfunction
В цикле который я пометил комментарием вместо call DisplayTextToPlayer(Player(0), 0.00, 0.00, "БАЦ") будет наноситься урон, за всё время действия спелла каждому юниту попавшему под раздачу урон должен нанестись 1 раз, после чего он добавится в группу, и в сле. раз проверку не пройдёт. Проблема в том что "БАЦ" должно написаться всего 1 раз (при выборе самого героя, даммик имеет способность москиты), но по какой то непонятной причине происходит спам "бац", и такое чувство что не каждое истечение таймера (0.03), а даже каждую итерацию цикла. Помогите разобраться. Условие уже как только не крутил...

Принятый ответ

nvc123,
у меня подобным образом сделаны почти все спелы моей карте и всё ок. Если бы ты сделал карты, в которые хоть кто-то играет, то тебя можно было бы ещё слушать, а так. В доте тоже вон всё на хэше и триггерах и всё ок. Ещё и cjass предлагаешь.
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
28
8 лет назад
0
ну для начала нафиг там глобальная группа
во вторых код ужасен
ибо если спел муи то таймер+хэш не лучшее решение
а если не муи то нафиг вообще хэш
короче вот моя старая волна силы
смотри как сделано там и делай также
или просто скопируй её и поменяй
для работы нужны библиотеки cj_types.j и List.j
я их тоже кидаю
закинь их в папку \AdicHelper\lib\ в папке jngp
Загруженные файлы
1
29
8 лет назад
1
nvc123,
у меня подобным образом сделаны почти все спелы моей карте и всё ок. Если бы ты сделал карты, в которые хоть кто-то играет, то тебя можно было бы ещё слушать, а так. В доте тоже вон всё на хэше и триггерах и всё ок. Ещё и cjass предлагаешь.
Принятый ответ
0
28
8 лет назад
Отредактирован nvc123
0
16GB, твой подход "нафиг делать правильно когда можно делать через жопу" очень полезен
на фоне таких как ты можно легко найти работу
16GB, ещё 1 фапающий на доту
если у вас всё нормально работает то сидите тихо у себя и пишите говнокод
нафиг задавать вопросы если всё нормально?
нафиг вообще заходить на сайт если ты про и работаешь под вар3 по статьям 2003 года
а все кто говорят что сейчас 2016 год и можно сделать проще и быстрее это нубы
кстати в оффтопке как раз сейчас обсуждается нечто подобное
2
29
8 лет назад
Отредактирован 16GB
2
nvc123,
смысл в том что, надо делать карты, а не фапать на качество кода, иначе ты не хера не сделаешь, ты собственно пример этого.
Мне не нравится, когда людей наставляют на неверный путь.
Да и чем мой способ плох? Иди тести скорость и делай выкладки, или не кукарекай.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.