Хочется при критическом ударе с руки еще и оглушать цель
Сабж - как лучше реализовывается стан без помощи спеллов?

ssbbssc, достаточно указать у молота бурь требование уровня больше 2 и в разрешенные цели добавить Уязвимые-Неуязвимые, то даммик сможет пулять стан в имунных к магии юнитов, с щитами проще пареной репы - даммика создавай за нейтрально пассивных и он не собьет амулет защиты, но нужно указать в допустимых целях союзников.
`
ОЖИДАНИЕ РЕКЛАМЫ...
32
Clamp:
quq_CCCP, если ищется способ не использовать способности для реализации оглушения, то, по моему убеждению, целью является отказ от дефолтных способностей в принципе => это не имеет значения.
Ценой бесконечных багов? Пауза придумана близзардами для кинематиков и имеет тучу побочных эффектов, темболее когда есть более безопасная альтернатива - приказы или кастом стан на мемхаке (требуется триггер)
30
безопасная альтернатива - приказы
Не помню приказа оглушения \о/
Ценой бесконечных багов?
У меня никаких багов нет, хз в чём ваша проблема.
32
Clamp, ну вопервых - событие что юнит отдал любой приказ кроме stop-hold-stan (Да есть приказ стана), тут же приказ stop + пауза на 1 фрейм, юнит стоит и не двигается, не дергается анимация, панель приказов свободна, единственное но можно кастануть мгновенные абилки вроде виндвалка.
Либо стан мемхаком как я уже писал...
Во вторых то что у тебя их нету, не значит что их не у кого нету...
Твой стан будет продлят все другие станы, номально да? когда они не складываются, так же отказатся от всех дефолтных абилок подчас недоступная роскошь для многих картоделов.
30
Твой стан будет продлят все другие станы
Если ты внимательно посмотришь на код мимо PauseUnit, то заметишь, что он рассчитан на использование в качестве единственного источника станов на карте и учитывает возможность нескольких последовательных станов. Ну и офк никто не мешает в TimerCallback() воткнуть приказ "stop" для юнитов из стека, убрав действия с паузой. наезд, конечно, аргументированный, но по сути это тупо копипаст из одной моей карты, где использование паузы абсолютно оправдано \о/
29
Про паузу уже 500 раз мусолили. Её использовать просто не нужно.
16
минусы паузы:
юнит не может поставить следующий приказ на выполнение;
зависают все стандартные бафы;
нужно самому вести учет навешанных и снимаемых пауз.
минусы болта:
??*?????
30
Да успокойтесь вы уже, неугомонные искатели правды, влюблённые в "стандартные бафы". Если непонятно, как заменить так нелюбимую вами паузу на приказ, то пожалуйста:
раскрыть
library StunUnit initializer Init
{
    private timer   periodicTimer = CreateTimer()    // Can be replaced with main map timer

    private unit    unitsStack[]
    private effect  effectsStack[]  // Stun effect storage
    private float   timeRemaining[] // Time of stun left
    private int     stackCounter = 0

    #define private TICK_PERIOD  = 0.05
    #define private STACK_LIMIT  = 8190
    #define private STUN_EFFECT  = "Abilities\\Spells\\Human\\Thunderclap\\ThunderclapTarget.mdl"
    #define private ORDERID_STOP = 0xD0004


    // Looking for id of specified unit in stack
    private int StackSearch(unit givenUnit) {
        int i = -1
        while(i++ < stackCounter) {
            if (givenUnit == unitsStack[i]) {
                return i
            }
        }
        return -1
    }

    // Add unit to stack with overflow check
    private void StackPush(unit givenUnit, float duration) {
        if(stackCounter < STACK_LIMIT) {
            unitsStack   [stackCounter] = givenUnit
            effectsStack [stackCounter] = AddSpecialEffectTarget(STUN_EFFECT, givenUnit, "overhead")
            timeRemaining[stackCounter] = duration
            stackCounter++
        } else {
            BJDebugMsg("Stunned units stack overflow!")
        }
    }

    // Remove unit from stack
    private void StackPop(int id) {

        DestroyEffect(effectsStack[id])

        stackCounter--
        unitsStack   [id] = unitsStack   [stackCounter]
        effectsStack [id] = effectsStack [stackCounter]
        timeRemaining[id] = timeRemaining[stackCounter]

        unitsStack   [stackCounter] = null
        effectsStack [stackCounter] = null
        timeRemaining[stackCounter] = 0.0
    }

    void StunUnit(unit givenUnit, float duration) {

        int stackedUnitId = StackSearch(givenUnit)

        if (stackedUnitId == -1) {
            StackPush(givenUnit, duration)
        } elseif (timeRemaining[stackedUnitId] < duration) {		// <=!!
            timeRemaining[stackedUnitId] = duration
        }
    }

    private void TimerCallback() {

        int i = -1

        while(i++ < stackCounter) {

            timeRemaining[i] -= TICK_PERIOD
            IssueImmediateOrderById(unitsStack[i], ORDERID_STOP)

            if (timeRemaining[i] <= 0.0) {
                StackPop(i)
            }
        }
    }

    private void Init() {
        TimerStart(periodicTimer, TICK_PERIOD, true, function TimerCallback)
    }
}

нужно самому вести учет навешанных и снимаемых пауз
Ты удивишься, но умение следить за результатами выполнения кода из этого самого кода в принципе полезный навык, если ты планируешь что-нибудь помимо варкрафта любить. В коде выше специально указал место, где этот самый "учёт" происходит вот такими комментами: <=!!.

минусы болта
Возня в РО, даммикаст.

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