28

» WarCraft 3 / Замена модели юнита или альтернативы

Есть ли возможность перманентного морфа?
Конечно есть.
Есть ещё тёмный.
28

» WarCraft 3 / Мы ждали этого так долго - обновление лаунчера Battle.net 😌

Так же хочу спросить, есть ли возможность запустить редактор отдельной иконкой
В лаунчере есть. И через ярлык можно.
28

» WarCraft 3 / Как лучше организовать обработку кастов?

Doc, можно сохранить имя функции и вызывать её потом через ExecuteFunc. А можно воспользоваться vJass и сохранить как число.
28

» WarCraft 3 / Как лучше организовать обработку кастов?

У меня организовано вот так.
Effect
function BuilderAbilityEffect takes unit b, integer id returns nothing
    local CustomPlayer p = GetCustomPlayer(GetOwningPlayer(b))
    // SelectBarracks Faction 1
    if id == p.faction1.builder_icon0 then
        if p.isLocalPlayer then
            call ClearSelection()
            call SelectUnit(p.barracks, true)
        endif
        if p.current_barracks_faction != p.faction1 then
            call p.swapFactionInBarracks()
        endif
        return
    endif
    // SelectBarracks Faction 2
    if id == p.faction2.builder_icon1 then
        if p.isLocalPlayer then
            call ClearSelection()
            call SelectUnit(p.barracks, true)
        endif
        if p.current_barracks_faction != p.faction2 then
            call p.swapFactionInBarracks()
        endif
        return
    endif
    // SelectAltar
    if (id == p.herodata.builder_icon or id == BuilderSelectAltar) and p.isLocalPlayer then
        call ClearSelection()
        call SelectUnit(p.altar, true)
    endif
endfunction

function BarracksAbilityEffect takes unit b, integer id returns nothing
    local CustomPlayer p = GetCustomPlayer(GetOwningPlayer(b))
    // MinionSpawn
    if Minion.hire(p, id) then
        return
    endif
    // SelectBlacksmith
    if id == BarracksSelectBlacksmith then
        if p.isLocalPlayer then
            call ClearSelection()
            call SelectUnit(p.blacksmith, true)
        endif
        if p.current_barracks_faction != p.current_blacksmith_faction then
            call p.swapFactionInBlacksmith()
        endif
        return
    endif
    // SelectAltar
    if id == BarracksSelectAltar and p.isLocalPlayer then
        call ClearSelection()
        call SelectUnit(p.altar, true)
        return
    endif
    // SelectCapm
    if id == BarracksSelectCamp and p.isLocalPlayer then
        call ClearSelection()
        call SelectUnit(p.merccamp, true)
        return
    endif
    // SwapFaction
    if id == SwapFaction then
        call p.swapFactionInBarracks()
    endif
endfunction

function BlacksmithAbilityEffect takes unit b, integer id returns nothing
    local CustomPlayer p = GetCustomPlayer(GetOwningPlayer(b))
    // MinionUpgrades
    if Minion.makeUpgrade(p, id) then
        return
    endif
    // SwapFaction
    if id == SwapFaction then
        call p.swapFactionInBlacksmith()
        return
    endif
    // MHU
    if id == BlacksmithMHU then
        call UpgradeMinionHealth(p)
    endif
endfunction

function AltarAbilityEffect takes unit b, integer id returns nothing
    local CustomPlayer p = GetCustomPlayer(GetOwningPlayer(b))
    // Hero selection
    if id == p.faction1.herodata.altar_icon0 then
        call UnitRemoveAbility(b, p.faction2.herodata.altar_icon1)
        call p.addHero(p.faction1.herodata)
        return
    endif
    if id == p.faction2.herodata.altar_icon1 then
        call UnitRemoveAbility(b, p.faction1.herodata.altar_icon0)
        call p.addHero(p.faction2.herodata)
        return
    endif
    // Ability selection
    if p.changeHeroAbilityByRawCode(id) then
        return
    endif
    // Upgrades
    if Minion.makeUpgrade(p, id) then
        return
    endif
endfunction

function MercCampAbilityEffect takes unit b, integer id returns nothing
   call Minion.hire(GetCustomPlayer(GetOwningPlayer(b)), id)
endfunction

function TowerAbilityEffect takes Tower caster, integer id, integer target returns nothing
    // Sell
    if id == TowerAbilSell or id == TowerAbilDestroy then
        call caster.sell()
        return
    endif
    // Upgrade
    if id == TowerAbilUpgrade then
        call Tower.upgradeTower(caster)
        return
    endif
    // ExpGenerator
    if id == AbilExpGenerator.AbilSelectTower then
        call AbilExpGenerator.selectTowerAll(caster.abil, target)
    endif
endfunction

function Trig_PlayerAbilityEffect_Actions takes nothing returns nothing
    local integer id = GetSpellAbilityId()
    local unit u = GetSpellAbilityUnit()
    local integer caster = GetUnitUserData(u)
    local integer target = GetUnitUserData(GetSpellTargetUnit())
    local integer T = GetUnitTypeId(u)
    if T == BuilderId then
        call BuilderAbilityEffect(u, id)
    elseif T == BarracksId then
        call BarracksAbilityEffect(u, id)
    elseif T == BlacksmithId then
        call BlacksmithAbilityEffect(u, id)
    elseif T == AltarId then
        call AltarAbilityEffect(u, id)
    elseif T == MercCampId then
        call MercCampAbilityEffect(u, id)
    elseif IsUnitTower(u) then
        call TowerAbilityEffect(caster, id, target)
    endif
    set u = null
endfunction

function InitTrig_PlayerAbilityEffect takes nothing returns nothing
    set gg_trg_PlayerAbilityEffect = CreateTrigger()
    call TriggerAddAction(gg_trg_PlayerAbilityEffect, function Trig_PlayerAbilityEffect_Actions)
endfunction
Endcast
function TowerAbilityEndcast takes Tower caster, integer id returns nothing
    local TowerAbility abil = caster.abil
    // FocusedAttack
    if abil.getType() == AbilFocusedAttack.typeid then
        call AbilFocusedAttack.returnNormalProjectile(abil, id)
        return
    endif
    // ChillingAttack
    if abil.getType() == AbilChillingAttack.typeid then
        call AbilChillingAttack.returnNormalProjectile(abil, id)
        return
    endif
    // LightningAttack
    if abil.getType() == AbilLightningAttack.typeid then
        call AbilLightningAttack.returnNormalProjectile(abil, id)
        return
    endif
    // ExpGenerator
    if abil.getType() == AbilExpGenerator.typeid then
        call AbilExpGenerator.changeModeAll(abil, id)
    endif
endfunction

function MinionAbilityEndcast takes Minion m, integer id returns nothing
    // Stop
    if id == MinionAbilStop then
        call Minion.stopOrder(m.owner)
        return
    endif
    // Sell
    if id == MinionAbilSell or id == MinionAbilUnchallenge then
        call m.sell()
    endif
endfunction

function Trig_PlayerAbilityEndcast_Actions takes nothing returns nothing
    local integer id = GetSpellAbilityId()
    local unit u = GetSpellAbilityUnit()
    local integer caster = GetUnitUserData(u)
    if IsUnitTower(u) or IsUnitTowerAttacker(u) then
        call TowerAbilityEndcast(caster, id)
    elseif IsUnitMinion(u) then
        call MinionAbilityEndcast(caster, id)
    endif
    set u = null
endfunction

function InitTrig_PlayerAbilityEndcast takes nothing returns nothing
    set gg_trg_PlayerAbilityEndcast = CreateTrigger()
    call TriggerAddAction(gg_trg_PlayerAbilityEndcast, function Trig_PlayerAbilityEndcast_Actions)
endfunction

Тут всё зависит от того, какая карта.
Если куча-куча спелов, то стоит сохранять в хеш по любому парент ключу и равкоду спела как чайлд ключу функцию, которая запускает спел. Функция может не принимать аргументов, всё необходимое можно будет достать изнутри. Во время срабатывания спела достаётся это функция и запускается через .evaluate() или .execute().
28

» WarCraft 3 / не могу зайти в jass

На английском
Язык зависит от вара, на котором запускается JNGP.
28

» WarCraft 3 / JNGP: Rebuild от PT153

foreach по группам
В мануале этого нет.
flushlocals
также нет клоунского ограничения на объявление переменных в начале функции
Это не имеет никакого отношения в синтаксису.
В cJass есть whilenot, do - whilenot и препроцессорные штуки include, define и enum и прочие препроцессорные директивы, инкремент и декремент. У ZINC препроцессор такой же, как и у vJass, есть циклы for и while. Также отличается определение функций. На этом синтаксические отличия заканчиваются. В обоих одинаковые логические операторы, не нужно писать local, set и call, блоки определяются скобками. Тем самым бóльшая часть кода будет идентична с точки зрения подсветки и автодополнения.
И очень классно ты переделал вот это.
на самом деле cJass мало чем отличается от ZINC по синтаксису
В это.
Насчет отсутствия отличий с Zinc - бред
Никто не писал, что отличий вовсе нет.
28

» WarCraft 3 / 15. Массивы

Лады, в общем, если дойдут руки, сам исправлю. Пока некритично. Всё равно лучше всё почитать.
28

» WarCraft 3 / JNGP: Rebuild от PT153

Vlod, на самом деле cJass мало чем отличается от ZINC по синтаксису (только дурацким void). TESH не поддерживает ZINC, но автор может добавить поддержку (ровно как и поддержку Lua).
28

» WarCraft 3 / 15. Массивы

Из статьи:
Это имеет отношение к типу-массиву, но не к двумерному. Я же спрашивал как раз про двумерный массив.

Как я и написал, лучше перенести двумерный массив в Расширенную индексацию. Там хотя бы пример использования есть. И заодно добавить, что width * height не может быть больше общего лимита в 408 000 (это также есть в оригинале, но там ошибка, Вексориан забыл дописать один ноль).
28

» WarCraft 3 / 19. Расширенная индексация

Расширенная индексация доступна двумерным массивам. В этом случае
GetLocalPlayer, как будто в случае не расширенной индексации .size будет возвращать что-то другое. Он всегда возвращает .width * .height, не зависимо от того, расширена индексация или нет.
28

» WarCraft 3 / Отличия static от глобальной переменной

Ну за с++ я ничего не хотел говорить, там просто есть толковый пример, который можно перенести на джасс
Нет, нельзя. Это ВООБЩЕ разные языки. И уж тем более, что в JASS нет ключевого static, оно есть только в vJass, который также не имеет никакого отношения к C++.
28

» WarCraft 3 / 19. Расширенная индексация

Расширенная индексация доступна двумерным массивам. В этом случае, атрибут size будет содержать размер в виде произведения ширины и высоты массива
Во-первых, он всегда будет содержать произведение высоты на ширину. Во-вторых, не понятно, почему такой хороший пример использования двумерных массивов делает тут, а не в Массивы. Рекомендую в Массивы оставить только про структуру-массив и тип-массив, а двумерные полностью перенести сюда, как и сделано в оригинале.
28

» WarCraft 3 / 15. Массивы

Массив структуры
Я бы это назвал "структура-массив". Ибо массив структуры это просто MyStruct array MyStructArray.

Почему ничего не сказано про .size, .height и .width у двумерного массива?
28

» WarCraft 3 / Набор людей для работы над проектом.

Модуль вопросов не предназначен для поиска команды. Для этого есть специальный канал на сервере XGM в дискоре.
28

» WarCraft 3 / Набор людей для работы над проектом.

для форджа нет NGWE
JNGP просто подмена файлов, а в рефе она есть, можно наворотить что угодно.
28

» WarCraft 3 / Отличия static от глобальной переменной

rsfghd, причём тут вообще C++ к vJass?
Добавляя ключевое слово static к глобальной переменной, мы определяем её как внутреннюю, то есть такую, которую нельзя экспортировать и использовать в других файлах
Это вообще откуда?
28

» WarCraft 3 / Проблема с воскрешением героев

easypeasy, JNGP используй, я использовал функции UMSWE. Кастом скрипт просто дебаг.
28

» WarCraft 3 / Проблема с воскрешением героев

easypeasy, я починил, но почему варвар и таурен не ресаются, не понятно. Сейчас это выясняю.

Таурен вроде норм ресается, а варвар тупит.

Не, таурен тоже тупит.
28

» WarCraft 3 / Структуры и хэш-таблица

прекращаем заниматься микрооптимизацией без необходимости
Но ведь обнуление в это случае и есть микрооптимизация...
28

» WarCraft 3 / JNGP: Rebuild от PT153

Могут, но там есть нюансы. Как минимум часть вещей нужно будет писать на понятном для vJass синтаксисе. Если при этом использовать синтаксис cJass, появляется проблема читаемости.

Я никогда не использовал cJass из-за каких-то проблем с ним (AdicHelper зависал из-за какой-то ерунды). Автор TESH 2.0 не добавлял поддержку cJass, потому что никто не просил, и вряд ли будет - cJass сейчас юзает несколько человек. А мне важнее настройка подсветки и добавление своих функций, чем cJass, которым я не пользуюсь.

Тут всё ещё можно использовать cJass, просто, как и написал, адекватной подсветки не будет.