Всем доброго времени суток!
Снова я со своими странными вопросами и на сей раз у меня кое-что интересное)
Я пробую создавать новые механики и одна из них это производство еды. Охотники накладывают паразита на цель-животное, после чего появляется даммик-еда. Юнит дает +1 к еде и имеет отрицательный реген хп.
Охота лишь один из способов создания еды через дамми и мне интересно, как задать некоторым типам даммиков "очередь на смерть". То есть, чтобы отрицательный реген работал и/или задавался только у одного из даммиков.
Думал, но не пробовал делать даммика "призываемым" и призывать следующего, но я хз как в теории это сделать, так как мало работал с перемененными и подозреваю что тут без них никак)

Тупое решение в лоб - делаешь абилку с отрицательным регеном. Каждую секунду перебираешь всех живых даммиков. Если ни у одного из них нет абилки на Реген, то выдаёшь одному из даммиков эту абилку.
Если нужно от последнего созданного, то так же в лоб создаешь переменную DummyEatCounter. При каждом появлении нового дам Мика увеличиваешь её на единицу и пишешь в CustomValue юнита. Потом при выборе нужного даммика просто выбираешь того, у кого наибольший CustomValue.
`
ОЖИДАНИЕ РЕКЛАМЫ...
23
Ну, самое простое, это сделать свою ауру в РО, на основе любой ауры восстановления здоровья и настроить её на тип цели Сам воин, радиус 50 и поставить ей отрицательный параметр регенерации, и триггерно выдавать нужному даммику.
Ответы (2)
2
EugeAl, так в том то и проблема, чтобы определить нужного. Игрок теперь будет производить еду, создавая даммиков, которых может быть очень много. Вопрос - как сделать для них очередь (допустим от последнего произведенного) и постепенно смещать ее в сторону новых..
23
SharrKnen, тут без переменных не обойтись, мб даже массив понадобится. Объяснить это без скрина триггера я вряд ли смогу
30
Тупое решение в лоб - делаешь абилку с отрицательным регеном. Каждую секунду перебираешь всех живых даммиков. Если ни у одного из них нет абилки на Реген, то выдаёшь одному из даммиков эту абилку.
Если нужно от последнего созданного, то так же в лоб создаешь переменную DummyEatCounter. При каждом появлении нового дам Мика увеличиваешь её на единицу и пишешь в CustomValue юнита. Потом при выборе нужного даммика просто выбираешь того, у кого наибольший CustomValue.
Принятый ответ
Ответы (3)
2
nazarpunk, Звучит реализуемо (без необходимости очереди)
2
nazarpunk, Могу попросить (мб есть наработки в наличии) как реализовать перебор всех дамиков на карте. Ибо:
  1. Проверку через таймер знаю как сделать
  2. Работу с конкретными юнитами на карте в триггерах, я не практиковал и даже не знаю как подступиться..
30
SharrKnen, держи на грязножассе. Думаю триггер установки SetUnitUserData осилишь написать.
native UnitAlive takes unit id returns boolean 

library FoodQuery initializer Init 

    globals 
        private group Group = CreateGroup() 
        private integer array Counter 
        private integer dummyId = 'dumy' // Равкод даммика              
        private integer abilId = 'abil' // Равкод абилки с отрицательным регеном             
    endglobals 

    private function periodic takes nothing returns nothing 
        local integer i = -1 
        local unit target = null 
        local unit found = null 
        local integer count = 0 

        loop 
            set i = i + 1 
            exitwhen i > bj_MAX_PLAYER_SLOTS 

            call GroupClear(Group) 
            call GroupEnumUnitsOfPlayer(Group, Player(i), null) 

            loop 
                set target = FirstOfGroup(Group) 
                exitwhen target = null 
                call GroupRemoveUnit(Group, target) 

                if UnitAlive(target) and GetUnitTypeId(target) == dummyId then 
                    // Считаем юнитов с абилкой         
                    if GetUnitAbilityLevel(target, abilId) > 0 then 
                        count = count + 1 
                    endif 

                    // Сразу выбираем юнита с максимальным значением     
                    if found == null or GetUnitUserData(target) > GetUnitUserData(found) then 
                        set found = target 
                    endif 
                endif 
            endloop 

            // Если никто не найден, то выдаём абилку юниту  
            if count == 0 and found != null then 
                call UnitAddAbility(found, abilId) 
            endif 

        endloop 

    endfunction 

    private function Init takes nothing returns nothing 
        local trigger t = CreateTrigger() 
        call TriggerRegisterTimerEventPeriodic(t, 1.00) 
        call TriggerAddAction(t, function periodic) 

        // Здесь нужно дописать триггор, который присвоит SetUnitUserData  

        set t = null 
    endfunction 
endlibrary
Чтобы оставить комментарий, пожалуйста, войдите на сайт.