11

» WarCraft 3 / Расстояние между точками, когда цель подвижна

Расстояние между юнитами можно мерить в различных метриках. Например вы можете использовать метрику Манхеттена r = max(|x1 - x2|, |y1-y2|) , евклидову (L2) r = sqrt((x1-x2)^2+(y1-y2)^2), L1 метрику r = abs(x1-x2) + abs(y1-y2). Если под точкой имеется в виду handle Location, динамически можно менять ее значения x и y. Что конкретно понимается под термином динамическая точка? Точка которая двигается?
11

» WarCraft 3 / Руби лес!

Берги, по поводу стандартных механик. Касаясь этой карты конкретно. Я не видел карт, где лес постепенно зарастает, это фишка и базовая механика карты. Считаю, что именно эта механика составит новый опыт для игрока.
11

» WarCraft 3 / 6. Перехват вызова

Важная вещь, что перехват идет до выполнения самой нативки. То есть , вы до удаления юнита можете узнать его GetHandleId(unit)
11

» WarRaft / IntelliJASS

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

» WarRaft / IntelliJASS

Я оставил только requires. Ибо судя по статье только он каноничен.
initializer и весь vjass поддерживается стандартным рефордж варкрафтом без теша и всего остального, эта статья написана до него для jngp, как я понимаю.
Там же примитивный формат TRIGSTR_число. Значит можно всё распарить и получить строки
Формат примитивный, проблема в том, что эти строки меняются как черти, например если создать апгрейд с 10-ю уровнями, порядок строк и описаний будут тасоваться в зависимости от того в каком порядке их править. Я и спросил потому, что мне саму интересно, можно ли узнать какой блок wts к чему относиться, учитывая, что такая хаотичная способность или улучшение будут подписаны одним и тем же техническим описанием.
STRING 352
// Upgrades: R001 (Improved Lumber Harvesting,Advanced Lumber Harvesting), Name (Name)
{
Улучшенная пила ур 20
}

STRING 2105
// Upgrades: R001 (Improved Lumber Harvesting,Advanced Lumber Harvesting), Name (Name)
{
Improved Lumber Harvesting lv1 
}

STRING 2096
// Upgrades: R001 (Improved Lumber Harvesting,Advanced Lumber Harvesting), Name (Name)
{
Improved Lumber Harvesting lv2 
}
STRING 2097
// Upgrades: R001 (Improved Lumber Harvesting,Advanced Lumber Harvesting), Name (Name)
{
Improved Lumber Harvesting lv3 
}

Например у меня в карте wts выглядит так, я сначала написал все на русском, начал переписывать на английском и оказалось, что первые уровни сместились вниз. Заметить это довольно сложно, большинство строк идет по порядку уровня, но вот такую особенность я заметил.
11

» WarRaft / IntelliJASS

Вот такую проблему еще пишет при слове initilazer
<func def>, <module def>, <struct def>, VjassIToken.endlibrary, VjassIToken.globals, VjassIToken.hook or VjassIToken.requires expected, got 'initializer'

library AIHarvestLib2 initializer onInit uses HandlerLib
И на globals ругается почему-то

в vj формате function подсвечивает а endfunction нет, хотя в ,j все нормально

А это значит? Можно как-то узнать куда строки из wts файла вставляются?
Планируется реализовать поддержку файла строк и линковку их с JASS файлами.
11

» WarRaft / IntelliJASS

Как вызвать JassHelper для скрипта, я писал тут.
Жаль что ты не написал как сделать это под линукс. :( Вообще под убунту плагин едва ли не единственный адекватный способ писать на джазе.
nazarpunk, Хотелось бы, чтобы переменные integer, unit тоже подсвечивались, синим например. И я не оч понял, зачем для vjass отдельное разрешение .vj потребовалось? Вроде для всех файлов стандартно .j используют.
11

» WarCraft 3 / Бежевые орки

tysch_tysch, Я просто недавно видел вот такой пак и комментарий RvzerBro про клан дуратана меня натолкнул на мысль, что было бы прикольно модели для классической графики сделать с внедренными текстурами орочьих кланов. Например рисунок тимколора сделать в виде знамени клана, хотя сейчас там какие-то три полоски(у пеона например). (P.S. не на тот коментарий ответ вставился почему-то)
11

» WarCraft 3 / Бежевые орки

RvzerBro, Да я имел в виду костюмно добавить) Хотя мне всегда казалось, что у чернокнижника тоже знамя :(
11

» WarCraft 3 / Бежевые орки

было бы круто если бы еще текстуры знамен племен орков под цвет кожи подобрали, была бы бомба
11

» WarCraft 3 / Глобальный таймер

У тебя была ситуация, что ты инициализировал таймер после того как пытался ему присвоить триггер, который срабатывал бы после него. А надо сначала инициализировать таймер, а затем присвоить ему триггер. А когда ты пишешь, что паразительно, то ты сначала инициализировал все, а только потом начал присвоение. Hate верно пишет тебе. Поэтому нет ничего поразительного.

Более того, ты бы вполне мог свой таймер
call TimerStart(T, 5, false, null)  //Запускаю таймер
начинать внутри инициализации
11

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

по 3 точки в обе стороны
Я так понимаю, он говорит про общий случай динамических массивов, что если точки появляются по середине.
11

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

Koladik, и если понадобится динамическое количество точек ты будешь бегать между квадратичной и кубической кривой?
Там только на краях проблемы возникают. Так, что да. В любом случае придется всю кривую пересчитывать, если вдруг лишняя точка появится.
11

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

Поясни проблему внятнее пожалуйста, . И оформи код через блок кода, если возможно, пожалуйста.
//такой код удобнее читать
Я хоть убей не могу понять зачем GetRandomInt(2, 2)
11

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

Koladik, как разделить нечётное количество точек на кривые? Например 5 на 2?
Точки от 1 до 3 описываешь одним полиномом, от 3 до 5 вторым, оба 3-тей степени. На третей точке связка по производной и координате. Я не математик, просто предположение.
11

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

росто за счёт большего количества опорных точек
А почему ты решил увеличивать степень полинома? Почему бы не связать на границе две кривые по координатам и производной/ным? Я сам плохо разбираюсь в такой аппроксимации , могу специфики не понимать.
11

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

тяжело было найти хоть где-либо пример полиномы для 5 опорных точек
А можешь пояснить зачем больше 4 точек нужно? Хочется просто понять проблему целиком, которая может возникнуть.
rsfghd:
т.к. ты гений, миллиардер, плейбой, филантроп
Вообще не понял почему это под моим коментарием :D
11

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

evaluate не создаёт.
Тестил недавно, 200к операций через evaluate несколько раз, все ок работает. Через обычный вызов функции не работает. Выше владимир тоже написал о том, что создается триггер.
Vladimir TVK:
в собранном проекте под неё делается отдельная функция-обёртка и триггер.
11

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

Koladik, речь про моддерский код и взаимодействие написанных нами систем. Триггеры тоже событийно-ориентированные, да. Только вот они работают на движке игры (с сетевой моделью), поэтому значительно медленнее, даже если бы мы могли создавать собственные события.
А эту штуку в целом можно и вне контекста warcraft 3 юзать.
ну то есть, это, по сути, реализация подписки на события, аналогичная триггерам по функционалу но быстрее и более универсальная?
11

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

Жасс и так писался ногами и люто медленный. Зачем лишний раз усложнять себе жизнь на ровном месте?
Ну насколько я понимаю, тут только обращение к разным функциям, даже действий нет, неуверен, что это сильно замедляет выполнение. Да и кому какая разница как оно разворачивается, если этого не видно и с этим не надо работать.
11

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

Мастера превратить код в нечитаемую кашу
не не, тут прикол именно в том, что бы сделать код читаемым, например, вы создали такую структуру, как я описал в последнем сообщении, затем вы наследнуете ее, например так
struct CAVE extends UNIT    
    method operator LastGold takes nothing returns integer
        return this.LoadInteger(this.thishandler.p)
    endmethod
    method operator LastGold= takes integer value returns nothing
        call this.SaveInteger(this.thishandler.p, value)
    endmethod
endstruct
Что позволяет, просто очень просто обращаться к отдельным свойствам класса через хэш-таблицу
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
//
//