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

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

ssbbssc, достаточно указать у молота бурь требование уровня больше 2 и в разрешенные цели добавить Уязвимые-Неуязвимые, то даммик сможет пулять стан в имунных к магии юнитов, с щитами проще пареной репы - даммика создавай за нейтрально пассивных и он не собьет амулет защиты, но нужно указать в допустимых целях союзников.
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
32
7 лет назад
0
Clamp:
quq_CCCP, если ищется способ не использовать способности для реализации оглушения, то, по моему убеждению, целью является отказ от дефолтных способностей в принципе => это не имеет значения.
Ценой бесконечных багов? Пауза придумана близзардами для кинематиков и имеет тучу побочных эффектов, темболее когда есть более безопасная альтернатива - приказы или кастом стан на мемхаке (требуется триггер)
0
30
7 лет назад
0
безопасная альтернатива - приказы
Не помню приказа оглушения \о/
Ценой бесконечных багов?
У меня никаких багов нет, хз в чём ваша проблема.
0
32
7 лет назад
0
Clamp, ну вопервых - событие что юнит отдал любой приказ кроме stop-hold-stan (Да есть приказ стана), тут же приказ stop + пауза на 1 фрейм, юнит стоит и не двигается, не дергается анимация, панель приказов свободна, единственное но можно кастануть мгновенные абилки вроде виндвалка.
Либо стан мемхаком как я уже писал...
Во вторых то что у тебя их нету, не значит что их не у кого нету...
Твой стан будет продлят все другие станы, номально да? когда они не складываются, так же отказатся от всех дефолтных абилок подчас недоступная роскошь для многих картоделов.
1
30
7 лет назад
1
Твой стан будет продлят все другие станы
Если ты внимательно посмотришь на код мимо PauseUnit, то заметишь, что он рассчитан на использование в качестве единственного источника станов на карте и учитывает возможность нескольких последовательных станов. Ну и офк никто не мешает в TimerCallback() воткнуть приказ "stop" для юнитов из стека, убрав действия с паузой. наезд, конечно, аргументированный, но по сути это тупо копипаст из одной моей карты, где использование паузы абсолютно оправдано \о/
0
29
7 лет назад
0
Про паузу уже 500 раз мусолили. Её использовать просто не нужно.
0
16
7 лет назад
0
минусы паузы:
юнит не может поставить следующий приказ на выполнение;
зависают все стандартные бафы;
нужно самому вести учет навешанных и снимаемых пауз.
минусы болта:
??*?????
1
30
7 лет назад
Отредактирован Clamp
1
Да успокойтесь вы уже, неугомонные искатели правды, влюблённые в "стандартные бафы". Если непонятно, как заменить так нелюбимую вами паузу на приказ, то пожалуйста:
раскрыть
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 комментария удалено
Чтобы оставить комментарий, пожалуйста, войдите на сайт.