Накидал код на костюмную атаку, все работает норм но вот только урон получает только один юнит из группы врагов хотя вроде радиус указан чтоб
цепляло взмахом нескольких, подскажите где ошибка пж.
library CopperSwordMelee///1
function Attack_Filter takes nothing returns boolean
    return not IsUnitType(GetFilterUnit(), UNIT_TYPE_DEAD)
endfunction



function Trig_CopperSword1_Actions takes nothing returns nothing
    local unit u = udg_HeroBody[1]
    local real x = GetUnitX(u)
    local real y = GetUnitY(u)
    local real f = GetUnitFacing(u) * bj_DEGTORAD
    local player p = GetOwningPlayer(u)
    local unit t
    local real x2
    local real y2
   
    call SetUnitTimeScalePercent( udg_HeroBody[1], 290.00 )
    call SetUnitAnimationByIndex(udg_HeroBody[1],GetRandomInt(1, 3))
   
    call GroupEnumUnitsInRange(bj_lastCreatedGroup, x ,y, 150+140, function Attack_Filter)
    loop
        set t = FirstOfGroup(bj_lastCreatedGroup)
        exitwhen t == null
        set x2 = GetUnitX(t)
        set y2 = GetUnitY(t)
        if IsUnitEnemy(t, p) and IsUnitInRangeXY(t, x, y, 110) and Cos(f-Atan2(y2-y, x2-x)) > 0 then
            call UnitDamageTarget(u, t, 10, true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_CLAW_HEAVY_SLICE)
            call CameraSetTargetNoiseForPlayer( GetOwningPlayer(udg_HeroBody[1]),24.80, 7.60 )
            call StopSoundBJ( gg_snd_m1hAxeHitFlesh1a, false )
            call PlaySoundOnUnitBJ( gg_snd_m1hAxeHitFlesh1a, 50.00, GetSpellAbilityUnit() )
            
            
            call GroupClear(bj_lastCreatedGroup)
            
        else
            call GroupRemoveUnit(bj_lastCreatedGroup, t)
        endif
    endloop
          
    set u = null
    set p = null
           call TriggerSleepAction( 0.24 )
           call SetUnitTimeScalePercent( udg_HeroBody[1], 100.00 )
           call SetUnitAnimationByIndex(udg_HeroBody[1],udg_AnimTag[1])
   
    
    
endfunction
function Trig_CopperSword1_Conditions takes nothing returns boolean
    if ( not ( GetSpellAbilityId() == 'A001' ) ) then
        return false
    endif
    return true
endfunction

//===========================================================================
function InitTrig_CopperSword1 takes nothing returns nothing
    local trigger t22 = CreateTrigger()
    call TriggerRegisterAnyUnitEventBJ( t22, EVENT_PLAYER_UNIT_SPELL_CAST )
    call TriggerAddCondition( t22, Condition( function Trig_CopperSword1_Conditions ) )
    call TriggerAddAction( t22, function Trig_CopperSword1_Actions )
     set t22 = null
endfunction

endlibrary

Accepted answer

jasonrus96, удали эту строку, else тоже удали, а удаление юнита перенеси после endif, готово, не зависнет.
Uploaded files
`
LOADING AD...
0
19
2 months ago
0
Похожие вопросы:

ответ
Maniac_91:
VVelikolepniy:
А цикл вызова мобов разве не хуже, чем вызов отряда?
Это точно не знаю, но не помню, что где-то была функция создания группы юнитов по координатам
VVelikolepniy:
И координаты точки все равно потом зачищать нужно, как и область в конце триггера, разве нет?
Ну я ж говорю: координаты вместо точек. Тогда и точки и области не нужны.
Спасибо за помощь) Смотри я переделал по твоему совету с координатами! xgm.guru/p/100/206428
ответ
Кирилл4, на jass есть, вот пример
Для начала тебе хватит, есть более продвинутые системы.
ответ
8gabriel8, я скинул наработку, которая реализует общее событие «получает урон» в 30 строк, для её использования даже думать как именно она работает не нужно.
ответ
C++ тоже показывает 832.0, на С почему-то не смог запустить.
UrsaBoss, вообще, используй нативки, они точнее будут нахождения дистанции "руками" в данном случае. Но не используй Pow(), эта функция очень неточная.
constant native IsUnitInRange       takes unit whichUnit, unit otherUnit, real distance returns boolean
constant native IsUnitInRangeXY     takes unit whichUnit, real x, real y, real distance returns boolean
constant native IsUnitInRangeLoc    takes unit whichUnit, location whichLocation, real distance returns boolean

1
27
2 months ago
1
Ты же сам очищаешь группу после первого юнита, что получил урон
Replies (7)
0
24
2 months ago
0
rsfghd, плюсую
То самое удаление
Uploaded files
0
24
2 months ago
0
Может быть хотел это действие перенести после endloop но промахнулся? :D
0
8
2 months ago
0
0
8
2 months ago
0
konvan5, Это вызывает зависания.
0
24
2 months ago
Edited by konvan5
0
jasonrus96, удали эту строку, else тоже удали, а удаление юнита перенеси после endif, готово, не зависнет.
Uploaded files
Accepted answer
0
8
2 months ago
Edited by jasonrus96
0
konvan5, Думал что не сработает, не улавливаю связь😄.Спасибо
1
24
2 months ago
1
могу объяснить что не так было.
Пройдемся по алгоритму:
  1. Ты создаешь группу юнитов
  2. Далее запускаешь цикл loop и первым действие выбираешь ПЕРВОГО юнита в группе. Тут очень важно слово "первого". Запомним на будущее.
  3. Если юнит не существует, что выбрали, то выход из цикла. То есть если группа пустая, мы не сможем получить первого юнита, и тут мы выйдем.
  4. Делаем какие-то проверки (это не важно) и входим в тело if (и это важно).
  5. Если мы вошли в тело if пройдя проверки, ты удаляешь группу. А что было в 3 действии? Если группа пустая - мы не получаем первого юнита и выходим из цикла. Поэтому у тебя обрабатывался только первый юнит.
  6. Если же условия if не прошли и попали в else, то ты удаляешь юнита из группы. А значит в следующий раз первый юнит будет НОВЫЙ юнит, который раньше был вторым (первого же мы удалили).
А теперь предположим, мы удалим 5 действие, то есть не будем чистить группу. Проверили ПЕРВОГО юнита, он попал под условие, мы задамажили но не удалили его. Далее цикл повторяется, снова выбирает того-же самого ПЕРВОГО юнита, и снова повторяем те-же самые действия и так до бесконечности, ибо из группы мы его не удаляем. Поэтому и зависает, ибо бесконечный цикл у тебя был :)
Поэтому удалять юнита из группы надо ВСЕГДА в конце цикла, чтобы следующий выбор был с новым юнитом а не старым (не важно, прошел он твои условия или нет для действий).
И поэтому чистить группу тоже нельзя во время перебора, ибо мы тогда не чекнем остальных юнитов, что были в группе на этот момент.
Uploaded files
To leave a comment please sign in to the site.