Добавлен
Накидал код на костюмную атаку, все работает норм но вот только урон получает только один юнит из группы врагов хотя вроде радиус указан чтоб
цепляло взмахом нескольких, подскажите где ошибка пж.
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

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

jasonrus96, удали эту строку, else тоже удали, а удаление юнита перенеси после endif, готово, не зависнет.
Загруженные файлы
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
19
3 недели назад
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
3 недели назад
1
Ты же сам очищаешь группу после первого юнита, что получил урон
Ответы (7)
0
23
3 недели назад
0
rsfghd, плюсую
То самое удаление
Загруженные файлы
0
23
3 недели назад
0
Может быть хотел это действие перенести после endloop но промахнулся? :D
0
8
3 недели назад
0
0
8
3 недели назад
0
konvan5, Это вызывает зависания.
0
23
3 недели назад
Отредактирован konvan5
0
jasonrus96, удали эту строку, else тоже удали, а удаление юнита перенеси после endif, готово, не зависнет.
Загруженные файлы
Принятый ответ
0
8
3 недели назад
Отредактирован jasonrus96
0
konvan5, Думал что не сработает, не улавливаю связь😄.Спасибо
1
23
3 недели назад
1
могу объяснить что не так было.
Пройдемся по алгоритму:
  1. Ты создаешь группу юнитов
  2. Далее запускаешь цикл loop и первым действие выбираешь ПЕРВОГО юнита в группе. Тут очень важно слово "первого". Запомним на будущее.
  3. Если юнит не существует, что выбрали, то выход из цикла. То есть если группа пустая, мы не сможем получить первого юнита, и тут мы выйдем.
  4. Делаем какие-то проверки (это не важно) и входим в тело if (и это важно).
  5. Если мы вошли в тело if пройдя проверки, ты удаляешь группу. А что было в 3 действии? Если группа пустая - мы не получаем первого юнита и выходим из цикла. Поэтому у тебя обрабатывался только первый юнит.
  6. Если же условия if не прошли и попали в else, то ты удаляешь юнита из группы. А значит в следующий раз первый юнит будет НОВЫЙ юнит, который раньше был вторым (первого же мы удалили).
А теперь предположим, мы удалим 5 действие, то есть не будем чистить группу. Проверили ПЕРВОГО юнита, он попал под условие, мы задамажили но не удалили его. Далее цикл повторяется, снова выбирает того-же самого ПЕРВОГО юнита, и снова повторяем те-же самые действия и так до бесконечности, ибо из группы мы его не удаляем. Поэтому и зависает, ибо бесконечный цикл у тебя был :)
Поэтому удалять юнита из группы надо ВСЕГДА в конце цикла, чтобы следующий выбор был с новым юнитом а не старым (не важно, прошел он твои условия или нет для действий).
И поэтому чистить группу тоже нельзя во время перебора, ибо мы тогда не чекнем остальных юнитов, что были в группе на этот момент.
Загруженные файлы
Чтобы оставить комментарий, пожалуйста, войдите на сайт.