30

» WarCraft 3 / Важная информация об обновлении 1.28

RSQR, в письме с описанием мем-хака была указана исчерпывающая техническая информация о его работе и причинах его появления, а также о том, как его можно исправить. Разработчики убрали возможность помещать исполняемый байт-код напрямую в память, однако возможность напрямую читать память оставили, что можно расценивать как официальную поддержку этого функционала. Более того, осталась возможность записывать что-либо напрямую в память, однако исполняться оно будет только внутри виртуальной машины Jass. Технически, динамичные хоткеи реализуемы посредством такой записи.
Про изменения в списке нативных функций пока что ничего не известно, но многое указывает на то, что их список будет расширяться. Просто наберитесь терпения =)

А настраиваемые хоткеи есть и без этого
30

» WarCraft 3 / Важная информация об обновлении 1.28

BrEd Pitt, имхо, примерно так и есть. Ещё вполне возможен вариант, что какой-нибудь достаточно высоко сидящий товарищ из близарда предполагал заикнуться про разработку Wc4, но топ-менеджмент заявил, что жанр ртс в виде Sc2 плохо себя показал и Wc4 не будет, и этот товарищ нашёл вот такой вот выход
30

» WarCraft 3 / Важная информация об обновлении 1.28

Более корректный способ для этого расширение нативного API.
Ятп, он про это и говорит, просто несколько эмоционально
Я думаю, что они до этого дойдут когда разберутся с основными проблемами старой архитектуры вара, чтобы подогнать её под более современные реалии и требования.
А это то, что говорю я :D
30

» WarCraft 3 / Важная информация об обновлении 1.28

сегодня карты не качают, а в 90% их ставят на боты
Действительно, 10% пользователей - статистическая погрешность, не более.
Ну и тебе должно быть весьма очевидно, что пока у близов есть планы на игру, платформа будет считаться защищённой только если близы сами и будут этих ботов контролировать. Предлагаю целиком конвертировать дисскусию на эту тему на хайв и перестать срать на хгм.
Ну и да, записывать в память - это очень крутая абилка. Если оно тебе не надо, так и проходи мимо. А мне надо, вот и распинаюсь. Хейтеры мх похожи на бабок против ГМО - нихера не понимают, им это не надо, значит, правильно, что запретили.
Мне нравится концепция мх и его возможности, некоторые из них я бы с удовольствием использовал, но черви в моей системе мне не нравятся больше, чем нравится мх.
Распинайся - не распинайся, но голос одного человека никак не повлияет. Лучше побереги нервы =)
30

» WarCraft 3 / Важная информация об обновлении 1.28

А как они узнают? ты запустил свою кастом карту, и сказал что делать виртуальной jass машине...
Концептуально BNet2.0 хостит карты сам, а там предварительная проверка в контейнере прекрасно имплементится.
от админа, который якобы переписывается с биззард
Без "якобы", видел пруфы.
Пока они криво заткнули запись в память
Почитай хайв ещё раз, они как раз-таки нормально заткнули.

DracoL1ch, твои полыхания, кстати, мне вообще непонятны. Чтение памяти напрямую никто не закрывал, причём по просьбе твоего товарища по ресёрчу в сторону мем-хака. Через баннеры в интернете вишмастер уже весьма давно не дарится, спасибо развитию браузеров и - как ни странно - интернета. Высказывания про "вылезание за скрипты" на фоне твоего последнего поста в "способ оглушить" выглядят забавными, но не более.
Если ты даже после трёх ответов на хайве не понял, почему возможность записи в память было необходимо выпилить как можно скорее, то и здесь не поймёшь, так что распинаться никто не будет.
Ну и тебе уже сказали, что у парней там уже есть роадмап и они начали наиболее логичным образом: закрыли все найденные критические дыры и озаботились нормальным средствами доставки контента (патчей). Просто попробуй быть немного терпеливее и научись сдерживать эмоции, и ты многого достигнешь.
Алсо, это не хайв, и за явные попытки оскорблений здесь ловятся муты.

Скорее всего это связано с ремастером, который будет продаваться отдельно, но может ещё какой контент выпустят
Я где-то на сайте после выхода 1.26a писал, что такие действия с высокой вероятностью являются признаком начала работы над ремастером, а после ремастера СК1 это стало очевидным. Появление подобной информации было просто вопросом времени.
это огромные инвестиции.
AFAIK, на данный момент там что-то четыре человека плотно Варкрафтом заняты, и используемое железо никуда не девается. Вот то, что разраб заикнулся про "Sc2 level graphics" - куда более интригующий момент, значит уже готовятся артовые мощности.
30

» WarCraft 3 / Важная информация об обновлении 1.28

нету долгожданного API
Какого? Кем?
quq_CCCP:
сломать массив и написать на байткодах можно все что угодно на новых патчах...
Через офф бнет ятп нельзя будет такое сделать, если как в ск2 будет работать
30

» WarCraft 3 / Важная информация об обновлении 1.28

ретурн баг
Если до сих пор непонятно, что через ваш мем-хак и РБ можно было одарить любого юзера вишмастером, то я сдаюсь.
30

» WarCraft 3 / способ оглушить

Да успокойтесь вы уже, неугомонные искатели правды, влюблённые в "стандартные бафы". Если непонятно, как заменить так нелюбимую вами паузу на приказ, то пожалуйста:
раскрыть
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)
    }
}

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

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

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

» WarCraft 3 / способ оглушить

Твой стан будет продлят все другие станы
Если ты внимательно посмотришь на код мимо PauseUnit, то заметишь, что он рассчитан на использование в качестве единственного источника станов на карте и учитывает возможность нескольких последовательных станов. Ну и офк никто не мешает в TimerCallback() воткнуть приказ "stop" для юнитов из стека, убрав действия с паузой. наезд, конечно, аргументированный, но по сути это тупо копипаст из одной моей карты, где использование паузы абсолютно оправдано \о/
30

» WarCraft 3 / способ оглушить

безопасная альтернатива - приказы
Не помню приказа оглушения \о/
Ценой бесконечных багов?
У меня никаких багов нет, хз в чём ваша проблема.
30

» WarCraft 3 / Счётчик времени

Принятый ответ
Автор - ScorpioT1000, код из проекта Jack's Company. с моими незначительными переработками.
раскрыть


library GameClock initializer Init
{
    // CONSTANTS
    #define private LIMIT   = 2147483000    // ~596 hours in milliseconds.
    #define private MS_SEC  = 1000          // One second in milliseconds.
    #define private MS_MIN  = 60000         // One minute in milliseconds.
    #define private MS_HR   = 3600000       // One hour   in milliseconds.
    
    #define private PERIOD  = 0.05          // Tick rate  in milliseconds.
    // END OF CONSTANTS

    private int   msPassed    = 0
    private timer Timer = CreateTimer()


    // Master
    // Count in real seconds.
    float GetTimeInSFloat() {
        return I2R(msPassed) / I2R(MS_SEC)
    }

    // Current hours on clock.
    int GetTimeInH() {
        return msPassed / MS_HR
    }

    // Current minutes on clock.
    int GetTimeInM() {
        if(msPassed >= MS_HR) {
            return ModuloInteger(msPassed, MS_HR) / MS_MIN
        }
        return msPassed / MS_MIN
    }

    // Current seconds on clock.
    int GetTimeInS() {
        if(msPassed >= MS_MIN) {
            return ModuloInteger(msPassed, MS_MIN) / MS_SEC
        }
        if(msPassed >= MS_HR) {
            return ModuloInteger(msPassed, MS_HR) / MS_SEC
        }
        return msPassed / MS_SEC
    }

    // Current milliseconds on clock.
    int GetTimeInMS() {
        if(msPassed >= MS_SEC) {
            return ModuloInteger(msPassed, MS_SEC)
        }
        if(msPassed >= MS_MIN) {
            return ModuloInteger(msPassed, MS_MIN)
        }
        if(msPassed >= MS_HR) {
            return ModuloInteger(msPassed, MS_HR)
        }
        return msPassed
    }

    // Auxillary
    // Total milliseconds passed since game start.
    int GetTimeInAbs() {
        return msPassed
    }

    // Total seconds passed since game start.
    int GetTimeInAbsS() {
        return msPassed / MS_SEC
    }

    // Total minutes passed since game start.
    int GetTimeInAbsM() {
        return msPassed / MS_MIN
    }

    // Total hours passed since game start.
    int GetTimeInAbsH() {
        return msPassed / MS_HR
    }

    // Actual time in formatted string.
    string GetGameCount() {
        string h  = I2S(GetTimeInH ())
        string m  = I2S(GetTimeInM ())
        string s  = I2S(GetTimeInS ())
        string ms = I2S(GetTimeInMS())

        return ( h + ":" + m + ":" + s + "."+ ms )
    }

    private void Increment() {
        if(msPassed > LIMIT) {
            PauseTimer(Timer)
            return
        }
        msPassed = msPassed + R2I(1000*PERIOD)
    }

    private void Init() {
        TimerStart(Timer, PERIOD, true, function Increment)
    }
}
30

» WarCraft 3 / способ оглушить

quq_CCCP, если ищется способ не использовать способности для реализации оглушения, то, по моему убеждению, целью является отказ от дефолтных способностей в принципе => это не имеет значения.
30

» WarCraft 3 / способ оглушить

оглушай на здоровье!
library StunStack initializer Init
{
    #define private STACK_LIMIT = 8190
    #define private TICK_PERIOD = 0.05
    #define private STUN_EFFECT = "Abilities\\Spells\\Human\\Thunderclap\\ThunderclapTarget.mdl"

            timer   globalTimer = 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


    // 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 StackIncrement(unit givenUnit, float duration) {
        if(stackCounter < STACK_LIMIT) {
            PauseUnit(givenUnit, true)
            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 StackDecrement(unit givenUnit, int id) {
        DestroyEffect(effectsStack[id])
        PauseUnit(givenUnit, false)
        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) {
            StackIncrement(givenUnit, duration)
        } elseif (timeRemaining[stackedUnitId] < duration) {
            timeRemaining[stackedUnitId] = duration
        }
    }

    private void TimerCallback() {
        int i = -1
        while(i++ < stackCounter) {

            timeRemaining[i] -= TICK_PERIOD

            if (timeRemaining[i] <= 0.0) {
                StackDecrement(unitsStack[i], i)
            }
        }
    }

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

» WarCraft 3 / Вопрос о функциях

Принятый ответ
	set u[i*3] = ... set u[i*3 + 1] = ... set u[i*3 + 2] = ...
	unit u[][]
	u[i][3] = ...

Любители поизголяться.
30

» WarCraft 3 / Отключаемая аура

Clamp, вообще не понимаю, зачем и чем удобнее виндволка...
Тем, что при наличии WW второй ты дать герою не сможешь.
30

» WarCraft 3 / Как правильно инициализировать способности и юнитов в массиве?

а не легче будет в начале игры таймером создавать юнитов,дамаиков и тдд + ещё создать юнита которому дать все способности ("таймером естественно")а потом всё это дело дружно удалить
Не легче, загрузка карты должна быть достаточно быстрой, иначе второй раз игроки в неё играть уже не пойдут.
Обычно делается так, что предзагрузка данных героя выполняется только тогда, когда он появляется на карте. Для того, чтобы он не был подгружен при запуске карты, достаточно не вызывать в начале игры никаких функций, связанных с героем или его способностями.
30

» WarCraft 3 / Отключаемая аура

Отлично подойдёт отлов приказа включения/выключения автокаста способности:
    // огненные стрелы
    OrderId("flamingarrows")    = 852174
    OrderId("unflamingarrows")  = 852175
    // жар преисподней
    OrderId("immolation")      = 852177
    OrderId("unimmolation")    = 852178
    // ледяные стрелы
    OrderId("coldarrows")      = 852244
    OrderId("uncoldarrows")    = 852245
30

» WarCraft 3 / Альтернативный способ наложения карты путей

Nighty, ЕМНИП проходимость считается в рантайме, так что или делать точно так, как описано в статье, или делать через код, под катом вся нужная инфа:
pathing API
    constant pathingtype        PATHING_TYPE_ANY                = ConvertPathingType(0)
    constant pathingtype        PATHING_TYPE_WALKABILITY        = ConvertPathingType(1)
    constant pathingtype        PATHING_TYPE_FLYABILITY         = ConvertPathingType(2)
    constant pathingtype        PATHING_TYPE_BUILDABILITY       = ConvertPathingType(3)
    constant pathingtype        PATHING_TYPE_PEONHARVESTPATHING = ConvertPathingType(4)
    constant pathingtype        PATHING_TYPE_BLIGHTPATHING      = ConvertPathingType(5)
    constant pathingtype        PATHING_TYPE_FLOATABILITY       = ConvertPathingType(6)
    constant pathingtype        PATHING_TYPE_AMPHIBIOUSPATHING  = ConvertPathingType(7)

native IsTerrainPathable        takes real x, real y, pathingtype t returns boolean
native SetTerrainPathable       takes real x, real y, pathingtype t, boolean flag returns nothing

Через код весьма геморройно, хотя способы упростить себе задачу всё-таки есть (выставлять по типу текстуры ландшафта, по высоте ландшафта, по позициям разрушаемых, etc).
30

» WarCraft 3 / vJass: .create () и .allocate () в чем разница?

Принятый ответ
allocate() используется внутри статичного метода и возвращает лишь индекс новой структуры
Технически верно, но на практике использовать .allocate() есть смысл только при перегрузке .create() (равно как и .deallocate() только при перегрузке .destroy()). Собственно, согласно документации, для того эти методы и существуют.
30

» WarCraft 3 / [vJass] Основы работы со Структурами (Structs)

основы ооп вроде наследования полиморфизма и инкапсуляции на примере структур Animal, Cat и Dog.

Hate, я полагаю, что здесь Doc:
Или основы - описание синтаксиса?
с толикой сарказма подразумевал как раз то, что синтаксис по сути вторичен.