11

» WarCraft 3 / eventDispatcher - Диспетчер Событий

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

Преимущество в том, что на move могут подписаться многие библиотеки, при этом А не должна ничего о них знать
По этому объяснению я не понял в чем разница между триггерами, мы же по сути создавая триггер и подписываемся на разные события.
11

» WarCraft 3 / Как дополнить методами структуру unit?

Принятый ответ
Ну да, оказалось все намного сложнее, первый мой пример - ошибка. Если не вызывать thistype.allocate() то переменным не будет выделяться память, однако все можно решить через хэш-таблицу и переопределение свойств класса через оператор.
Если есть желание обозвать свойства класса также как и нативки - это можно, но через костыль в виде дополнительного приватного имени, ибо jusshelper багует и пытается обозвать вызванную функцию внутри класса именем метода, даже без обращение через this.~ . прошерстил весь хайв, решения без костыля не нашел.
Также как и не нашел способа возвращать handle unit'а при стандартном обращении , аля "немой" оператор. Решение через оператор unit , самое оптимальное
Решение
//
// ==== Макрос для публичного свойства ==== 
//! textmacro OperatorProprety takes NAME, DTYPE, dtype, CHILDKEY
    method operator $NAME$ takes nothing returns $dtype$
        return Load$DTYPE$(this.hash, this, $CHILDKEY$)
    endmethod
    method operator $NAME$= takes $dtype$ value returns nothing
        call Save$DTYPE$(this.hash, this, $CHILDKEY$, value)
    endmethod
//! endtextmacro
//
// ==== Макрос для приватного свойства ==== 
//! textmacro PrivateOperatorProprety takes NAME, DTYPE, dtype, CHILDKEY
    private method operator $NAME$ takes nothing returns $dtype$
        return Load$DTYPE$(this.hash, this, $CHILDKEY$)
    endmethod
    private method operator $NAME$= takes $dtype$ value returns nothing
        call Save$DTYPE$(this.hash, this, $CHILDKEY$, value)
    endmethod
//! endtextmacro
//
// ==== Макрос для свойства только для чтения ==== 
//! textmacro ReadonlyOperatorProprety takes NAME, DTYPE, dtype, CHILDKEY
    method operator $NAME$ takes nothing returns $dtype$
        return Lib_Load$DTYPE$(thistype.hash, this, $CHILDKEY$)
    endmethod
    private method operator $NAME$= takes $dtype$ value returns nothing
        call Lib_Save$DTYPE$(thistype.hash, this, $CHILDKEY$, value)
    endmethod
//! endtextmacro
//
//
// ==== Переименование нативных функций ====
private function Lib_SetUnitPosition takes unit whichUnit, real newX, real newY returns nothing
    call SetUnitPosition(whichUnit,newX,newY)
endfunction
//
// ==== перемеиннование Save/Load Hashtable value
//! textmacro RenameHashtableFunc takes DTYPE, dtype
private function Lib_Save$DTYPE$ takes hashtable table, integer parentKey, integer childKey, $dtype$ value returns nothing
    call Save$DTYPE$(table,parentKey,childKey,value)
endfunction

private function Lib_Load$DTYPE$ takes hashtable table, integer parentKey, integer childKey returns $dtype$
    return Load$DTYPE$(table,parentKey,childKey)
endfunction
//! endtextmacro
//! runtextmacro RenameHashtableFunc("Integer", "integer")
//! runtextmacro RenameHashtableFunc("Real", "real")
//! runtextmacro RenameHashtableFunc("Boolean", "boolean")
//! runtextmacro RenameHashtableFunc("UnitHandle", "unit")
// =========================================
//
private struct UNIT
    private static hashtable hash
    //! novjass
    //private unit unit // Получение хэндла юнита
    //! endnovjass
    //! runtextmacro ReadonlyOperatorProprety("isin", "Boolean", "boolean", "0")
    //! runtextmacro ReadonlyOperatorProprety("unit", "UnitHandle", "unit", "1")
    //
    //
    method SetUnitPosition takes real newX,real newY returns nothing
        call Lib_SetUnitPosition(this.unit, newX, newY)
    endmethod
    //
    // Макросы для загрузки и сохранения
    //! textmacro SaveLoadHashtableMethod takes DTYPE, dtype
    method Load$DTYPE$ takes integer childKey returns $dtype$
        return Lib_Load$DTYPE$(thistype.hash, this, childKey)
    endmethod
    method Save$DTYPE$ takes integer childKey, $dtype$ value returns nothing
        call Lib_Save$DTYPE$(thistype.hash,this, childKey, value)
    endmethod
    //! endtextmacro
    // ==== Загрузка/Сохранение целочисленного принадлежащего юниту ================
    //! runtextmacro SaveLoadHashtableMethod("Integer", "integer")
    // ==== Загрузка/Сохранение логического принадлежащего юниту ===================
    //! runtextmacro SaveLoadHashtableMethod("Boolean", "boolean")
    // ==== Загрузка/Сохранение числа с плавающей точкой принадлежащего юниту =======
    //! runtextmacro SaveLoadHashtableMethod("Real", "real")
    //
    // ==== Констуркор ========================================
    static method create takes unit un returns thistype
        local thistype this = GetHandleId(un)
        set this.unit = un
        set this.isin = true
        return this
    endmethod
    //
    // ==== Деструктор ========================================
    method flush takes nothing returns nothing
        call FlushChildHashtable(thistype.hash, this)
    endmethod
    //
    // ==== Инициализация =====================================
    private static method onInit takes nothing returns nothing
        set hash = InitHashtable()
    endmethod
endstruct
//
//
11

» WarCraft 3 / Как дополнить методами структуру unit?

а зачем впринципе?
Я делал другой класс, который обрабатывает одномерные массивы юнитов group_alpha[номер юнита] , я хотел сделать методы для этой структуры , которые бы сохраняли в хэш-таблицу параметры юнита group_alpha[номер юнита].saveinteger(childid, integer) , и при присваивании присваивались через хэштаблицу также и все параметры group_alpha[номер юнита_1] = group_alpha[номер юнита_2]. Со вторым проблем нету, а вот с первым незадача.

Забей на структуры, в 99% случаев можно и без них обойтись.
У меня несколько библиотек, которые выполняют все это без структур, да. И я понимаю, что можно. Структура мне нужна , что бы 10 раз не переписывать одни и те же вещи. Аля проверка умер ли юнит из массива, если умер то на его место поставить последнего юнита из массива и разные методы дополнительные, которые работали бы через наследование.
11

» WarCraft 3 / Как дополнить методами структуру unit?

пока адекватным решением для меня является следующее
struct UNIT
        private unit un
        method operator unit takes nothing returns unit
            return this.un
        endmethod
        
        method SetPosition takes real X,real Y returns nothing
            call SetUnitPosition(this.un, X, Y)
        endmethod
        
        static method create takes unit un returns UNIT
            local UNIT this = GetHandleId(un)
            set this.un = un
            return this
        endmethod
endstruct
Если в этом примере определение оператора unit можно заменить "немым" оператором, это будет решение
11

» WarCraft 3 / 16. Функция как объект

Самое вкусное, в какую кашу из жасс это превращается, не показали(
Ты имеешь в виду как компилятор разворачивает vjass в JASS ?
11

» WarCraft 3 / 16. Функция как объект

Не очевидно, но evaluate и execute вызывают новый поток, со своим оп лимитом
11

» WarCraft 3 / Кривая Безье

Мне необходимо было разобраться как динамически добавлять больше 4 опорных
Не очень проблематику понял. Можно поподробнее про подводные камни.
11

» WarRaft / IntelliJASS

Потом очень полезная функция из теша это function list. Мне система better triggers не очень нравится именно из-за того , что там эта функция отсутствует. Часто забываешь названия функций, нужно напомнить себе. Часто помогает найти функцию в гуи , перевести в текст. В сторонней среде разработки, естественно, это невозможно, поэтому function list был бы очень хорош.

Притом повторюсь, жасс хелпер написан через одно место.
да, это и не важно, присутствие функционала это не минус , а плюс.
Как и в остальных, нормальных яп.
Ну в любом нормальным языке также реализовано указание на критические ошибки при компилировании.
11

» WarRaft / IntelliJASS

Koladik, а что за поддержка нужна? Грамматика для vJass и Zinc присутствуют, а компиляцией в JASS может и сам JassHelper справится. В IDEA уже есть все необходимые инструменты для запуска скриптов.
Ну у меня есть привычка в теше сохранять карту, включая джас хелпер, и проверять все ли нормально компилируется. Он на ошибки указывает конкретные в коде и примерное место ошибки. Обычно это реализуют так, что не понятно где ошибка, не компилируется и все. А джас хелпер хорошо в этом помогает.
11

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

Только еще учитывай, что есть разные состояния применения способности, подготавливает, начинает применять и приводит в действие.
11

» WarCraft 3 / 4. Директива //! inject

Жаль , что такую инжекцию нельзя делать в любую вообще функцию.
11

» WarCraft 3 / Так много ли по итогу памяти жрет инициализация хеш-таблицы?

Относись к ним как к двумерным массивам.
Разумно, спасибо, а максимальная размерность какая получается в таком представлении? Ну то есть по горизонтали понятно 2^32, а по вертикали?
11

» WarCraft 3 / Hashtable 8000

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

» WarCraft 3 / Так много ли по итогу памяти жрет инициализация хеш-таблицы?

ну а сейчас есть просадки ?
Моментально. Единственное, что тестить, надо было не в инициализации, но и тем все нормально. Интересно , это реально было, или я просто заблуждался на пустом месте.

Для "динамических" хэштаблиц можно использовать наработку Vlod'a - Hashtable 8000
спасибо за наводку

Внесу ясность для чего это вообще спрашивается. Нужно подгружать N массивов Размером L*L>256^2, затем, подгружая каждый массивов, перемножать, складывать с другим массивом. Есть ощущение, что такое динамически можно только на хэштаблицах. Но я, честно говоря, немного плаваю в базе хэштаблиц. И не понимаю как это будет по скорости и вписывается ли это в ограничения.
11

» WarCraft 3 / Проверка проходимости юнита

Такие попытки уже были
Стандартных способов для этого нет, придётся либо делать свой костыльный метод, либо реализовывать отдельный патчфайндинг в варкрафте.
Спасибо, думал что с выходом рефорджа ситуация как-то изменилась. Удивительно, что с 2010г. умельцы ничего лучше не придумали.
11

» WarCraft 3 / Почему предмет не использует 2 способности одновременно

Принятый ответ
Надо детально смотреть, скорее всего дело в требованиях технологий которые ты не убрал.

А ты же в предмет вставил все. Никогда не видел, что предмет 2 активки использует. Это и нельзя.
11

» WarCraft 3 / Как скрыть надпись "Заклинание ещё не готово"?

Потесть, возможно, если в другую карту создашь то тоже не будет видно. Раньше баг был, что некоторые исправления подобного рода перетекали из карты в карту пока в вар3 не перезайдешь. Вроде названий игроков в лобби.

Дело в том., что в рефордже появилась возможность конкретные фреймы убирать, без затрагивания констант игровых.
11

» WarCraft 3 / Способность фуры из Доты

Ты можешь записывать каждое создаваемое дерево как отдельный разрушаемый объект (в переменную), и так же записывать время его жизни (для таймера).
В момент каста просто создаёшь таким образом N деревьев и всё.
По таймеру чекаешь все деревья и их время жизни, если оно дошло до нуля - ломаешь дерево.
До мультеприменимостьи твой пример развить надо, хэштаблица, наверное, верный совет. Нужно все номера созданных деревьев в хэштаблицу этого таймера запихнуть. Тогда будет как надо, и удалять те что загрузятся при окончании таймера.
11

» WarCraft 3 / Эффект жизни

Ну добавь птиц, зверей бродящих, окружение различное, что тут еще можно посоветовать :D
Вот в том и дело что всё это есть!Но всеровно не то.
Если ты перфекционист , то покажи карту друзьям может они увидят нереальную глубину жизни , которую ты уже не видиш сам из-за того , что глаз замылелся. Это не ирония, реально помогает.
11

» WarCraft 3 / Эффект жизни

Ну добавь птиц, зверей бродящих, окружение различное, что тут еще можно посоветовать :D
11

» WarCraft 3 / Нападение крипов на героев

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

» WarCraft 3 / Уничтожение Handle sound'a

Что мешает объявлять в своей библиотеке глобалки и использовать инициализатор для них? Или здесь более сложный случай?
Случай то тривиальный. Тут любой спел-чаннел, как пример, подойдет. Если использовать способность в двух местах карты одновременно, ну банальный близзард мага, то в этих двух местах звук дождя будет слышен, если использовать 3д звук, а во всей остальной карте нет. Так вот, такое можно реализовать триггерно с только если инициализировать массив звуков. Но вопрос заключается в том, действительно предложенная выше функция очищает память от handle'а звука при удалении, в принципе это можно проверить самому просто инициализируя ОЧЕНЬ много звуков без удаления до вылета варкрафта, а потом сравнить с удалением. Но это всё-таки запарно, я надеялся, что кто-то работал с похожими вещами.
11

» WarCraft 3 / Уничтожение Handle sound'a

Koladik, не через пару секунд, насколько я помню, если у модели спецэффекта присутствует только анимация birth (опционально death?), спецэффект можно удалять сразу же после создания, анимация завершится и спецэффект удалится; если модель не соответствует этим требованиям, спецэффект придется удалять после того, как пройдет анимация stand (+birth?), иначе никакого визуального эффекта не будет.
А зачем звуки динамически создавать? В редакторе звуков заранее создаются все нужные звуки и проигрываются когда нужно.
Я проверю с одной анимацией, даже интересно, я проверял только когда две анимации. Но мне кажется, что ее заного можно будет запустить после удаления, если анимация короткая.
Звук создавать динамически затем, что бы удобно было копировать алгоритм, создал в одной своей карте систему и легко ее перетащил в любую другую без захламления переменных в редакторе звука, так как динамически ты все записываешь напрямую через путь звука. Плюс, я сейчас тестировал вообще воспроизведения звука в варике. Одну переменную получается можно "приклеить" только к одной точке на карте, чтобы воспроизводился 3д звук. А если хочешь, чтобы один и тот же звук воспроизводился в двух местах сразу то нужна еще одна переменная.
Мне пока непонятно многое в воспроизведении звука в варике, поэтому могу в чем-то ошибаться. Но то, что динамически создавать переменную самостоятельно намного удобнее, чем отдавать все на откуп редактору звука, я уверен.