Приветствую.
Есть воин (h000) с аурой защиты +1 (A000). Тренируя ещё таких 9 штук войнов я хочу получить +10 к защите всем, кто находится в области действия всех аур. Если же разобрать их на две одинаковые группы и отдалить группы друга от друга на расстояние большее, чем область действие ауры, то должно быть в первой и второй группе +5 защиты.
Вопрос именно в реализации данной задачи. Есть идеи или есть решение очень простое, что мне не попалось пока на глаза?

6.11.2021 Upd: где-то видел на какой-то карте похожей на LTD подобное, но название карты не помню и было в далёких временах


7.11.2021 Upd: спасибо за помощь. Всё таки добрался до своего старенького ноутбука Asus f5rl под Windows XP...
Разгадка оказалось очень проста - удалить статус (Buff) со способности ауры ('A000'). Правда есть пару нюансов:
  1. Всё же высвечивается статус (Buff) на рядом стоящих. Мой ноутбук не вывозит большое количество эффектов и пришлось удалить с Buff все эффекты
  2. Получаемый бонус удваивается. То бишь прописано в способности +1 к броне, но в игре даёт +2 к броне.
  3. Скачут показатели бонуса.
И все эти радости без Jass, vJass, cJass кодов.
Всё можно испробовать на приложенной карте и посмотреть на скриншотах.

`
ОЖИДАНИЕ РЕКЛАМЫ...
28
А разные ауры не суммируются разве?

в принципе могу предложить такой вариант - периодически выбирать всех юнитов вокруг владельца ауры в темповую группу при условии, что они не находятся в группе, которую сохранили в владельца ауры - добавить их в группу, накинуть бафф и проверить всех находящихся в этой группе на наличие в темповой, если в темповой их нет - то удалить их из группы, сохранённой в владельца и снять с них бафф

чуть позже скину пример, если это необходимо
5
rsfghd, спасибо, но подобная система перебора уже имеется.
Разные суммируются, однако я подразумевал(аю) только от одной ауры и одного и того же типа боевой единицы.
Если не затруднит могли бы попробовать играться с Buff или с самой способностью(ями)? На данный момент не имею доступа к редактору в ближайшую неделю.
28
DazzleFirst, то что я описал выше - это использование одной и той же ауры-пустышки разными юнитами, просто будем к примеру повышать уровень абилки предмета кольца защиты или что там у тебя бафается
28
решил всё-таки запилить пример, чтобы закрыть вопрос
код
library SpellLib
globals
    constant hashtable H = InitHashtable( )
    
    private constant real AuraRange        = 400.00
    private constant integer AuraID        = 'A000'
    private constant integer AbilityID     = 'A001'
    private constant integer AbilityMaxLvl = 10
    private constant integer UnitGroup     = StringHash( SCOPE_PRIVATE + "UnitGroup" )
    
    private constant group TempG   = CreateGroup( )
    private constant group TempG_1 = CreateGroup( )
    private group TempG_2          = null
    
    private boolexpr CondAura = null
    private boolexpr CondAdd  = null
    
    private unit TempUnit            = null
    private unit bj_lastFilterUnit   = null
    private unit bj_lastFilterUnit_1 = null
    
endglobals

native UnitAlive takes unit id returns boolean

private function CheckRange takes nothing returns nothing
    local integer i
    set TempUnit = GetEnumUnit( )
    
    if not IsUnitInGroup( TempUnit, TempG_1 ) then
        call GroupRemoveUnit( TempG_2, TempUnit )
        set i = GetUnitAbilityLevel( TempUnit, AbilityID ) - 1
        
        if i > 0 then
            call SetUnitAbilityLevel( TempUnit, AbilityID, i )
        else
            call UnitRemoveAbility( TempUnit, AbilityID )
        endif
    endif
endfunction

private function EnumAddBuff takes nothing returns boolean
    local integer i
    set bj_lastFilterUnit_1 = GetFilterUnit( )
    
    if IsUnitAlly( bj_lastFilterUnit_1, bj_groupEnumOwningPlayer ) and not IsUnitInGroup( bj_lastFilterUnit_1, TempG_2 ) then
        call GroupAddUnit( TempG_2, bj_lastFilterUnit_1 )
        set i = GetUnitAbilityLevel( bj_lastFilterUnit_1, AbilityID )
        if i == 0 then
            call UnitAddAbility( bj_lastFilterUnit_1, AbilityID )
        else
            call SetUnitAbilityLevel( bj_lastFilterUnit_1, AbilityID, i + 1 )
        endif
    endif
    
    return true
endfunction

private function EnumWithAura takes nothing returns boolean
    set bj_lastFilterUnit = GetFilterUnit( )
    
    if GetUnitAbilityLevel( bj_lastFilterUnit, AuraID ) > 0 then
        set TempG_2 = LoadGroupHandle( H, GetHandleId( bj_lastFilterUnit ), UnitGroup )
        if TempG_2 == null and UnitAlive( bj_lastFilterUnit ) then
            set TempG_2 = CreateGroup( )
            call SaveGroupHandle( H, GetHandleId( bj_lastFilterUnit ), UnitGroup, TempG_2 )
        endif
        
        if UnitAlive( bj_lastFilterUnit ) then
            set bj_groupEnumOwningPlayer = GetOwningPlayer( bj_lastFilterUnit )
            call GroupEnumUnitsInRange( TempG_1, GetUnitX( bj_lastFilterUnit ), GetUnitY( bj_lastFilterUnit ), AuraRange, CondAdd )
            call ForGroup( TempG_2, function CheckRange )
            call GroupClear( TempG_1 )
        else
            loop
                set TempUnit = FirstOfGroup( TempG_2 )
                exitwhen TempUnit == null
                call UnitRemoveAbility( TempUnit, AbilityID )
            endloop
            
            call DestroyGroup( TempG_2 )
            call RemoveSavedHandle( H, GetHandleId( bj_lastFilterUnit ), UnitGroup )
        endif
    endif
    
    return false
endfunction

function Spell_Actions takes nothing returns nothing
    call GroupEnumUnitsInRect( TempG, bj_mapInitialPlayableArea, CondAura )
endfunction

//===========================================================================
function InitTrig_Spell takes nothing returns nothing
    set gg_trg_Spell = CreateTrigger( )
    call TriggerRegisterTimerEvent( gg_trg_Spell, 1.00, true )
    call TriggerAddAction( gg_trg_Spell, function Spell_Actions )
    
    set CondAura = Condition( function EnumWithAura )
    set CondAdd  = Condition( function EnumAddBuff )
    
    set TempUnit = CreateUnit( Player( 0x0F ), 'hfoo', 0.00, 0.00, 0.00 )
    call UnitAddAbility( TempUnit, AbilityID )
    call SetUnitAbilityLevel( TempUnit, AbilityID, AbilityMaxLvl )
    call KillUnit( TempUnit )
    call RemoveUnit( TempUnit )
endfunction
endlibrary
по хорошему было бы юзать не миллион уровней атаки, а как сделал это Extremator в данном заказе
я просто не особо разобрал принцип, поэтому по старинке

спелл не для импорта само собой, просто показ, что это реально сделать с одной аурой
5

7.11.2021 Upd: спасибо за помощь. Всё таки добрался до своего старенького ноутбука Asus f5rl под Windows XP...
Разгадка оказалось очень проста - удалить статус (Buff) со способности ауры ('A000'). Правда есть пару нюансов:
  1. Всё же высвечивается статус (Buff) на рядом стоящих. Мой ноутбук не вывозит большое количество эффектов и пришлось удалить с Buff все эффекты
  2. Получаемый бонус удваивается. То бишь прописано в способности +1 к броне, но в игре даёт +2 к броне.
  3. Скачут показатели бонуса.
И все эти радости без Jass, vJass, cJass кодов.
Всё можно испробовать на приложенной карте и посмотреть на скриншотах.

Принятый ответ
Чтобы оставить комментарий, пожалуйста, войдите на сайт.