27

» WarCraft 3 / Перезапись глобальных переменных

ScopteRectuS, нет, не должно быть никакой перезаписи (смотря что ты там в функции ForGroup напишешь). ForGroup и фильтры запускаются сразу. Как я помню, использовал часто темповые глобалки для переноса инфы, например юнита или игрока в фильтр. Брал переменную типа юнит, и потом делал манипуляции типа юнит-кастер не враг GetFilterUnit(), то брать в группу (а остальных не подходящих условии фильтр отсеивал)
ForGroup - своего рода тоже цикл, он берет одного юнита GetEnumUnit, обрабатываем функцию. Берем второго, обрабатываем. И так далее.
27

» WarCraft 3 / Перезапись глобальных переменных

Принятый ответ
пример
Если действие мгновенное, то глобалки не перезапишут. И локалки не нужны.
set bj_lastCreatedUnit = GetTriggerUnit()
..... //что-то делаем с юнитом bj_lastCreatedUnit
Если есть работы с задержкой, короче со временем (с тем же вэйтом или таймером). То тут может переписаться инфа.
set bj_lastCreatedUnit = GetTriggerUnit()
..... //что-то делаем с юнитом bj_lastCreatedUnit
//вэйт
..... //что-то продолжаем делать с юнитом bj_lastCreatedUnit (но где гарантия, что его не перезаписали).
У тебя допустим есть триггерная способность, там накидывающая эффект отравления (дамаг триггером наносишь bj_lastCreatedUnit). Есть триггер, ловящий каст, он вещает в bj_lastCreatedUnit юнита-цель. Допустим эффект длится 50 сек. (там вэйт стоит). Когда ты каждый раз запускаешь триггер, он запускает поток. А вот вэйт, он паузит поток. Допустим ты кликнул на одного юнита, повесил эффект на 50 сек. Потом на другого юнита. А эффект на первом не снимется (точнее частично снимется, не будет дамага), так как ты перезаписал bj_lastCreatedUnit (там уже второй юнит.). Надеюсь понял? похожее описывалось в xgm.guru/p/wc3/jass_local_vars В статье предлагают использовать локи, лично ничего страшного не вижу в использований локи. Можно сделать так чтобы нельзя было перезаписать ненароком, например юзнуть хэш, только локалки не нужны были бы. Хотя вот в работе с GetLocalPlayer() нужна ли локалка? (например имя или число (равкод) изменить)
Если у тебя в двух триггерах используется одна и та же глобалка, например используется bj_lastCreatedUnit в качестве темповой глобалки (но только задержки чтобы не было, а то перезапишет), то ничего страшного, не перезапишут, так как действие мгновенно. В варкрафте два триггера одновременно не могут выполнить работу. Варкрафт мгновенно выполняет поочередно, в доле микросекунд. Возбмет один обработает, а потом переключается на второй триггер.
27

» WarCraft 3 / Есть ли утечка?

когда уже можно удалить (код)
//в функции Example1 запускаем таймер. прошла 1 секунда, и запускается Example2

function Example2 takes nothing returns nothing
local timer t=GetExpiredTimer() // Истекший ( запущенный ) таймер 
.....//делаем что-то, может быть по номеру хэндла таймера достаем из хэша что-то
call DestroyTimer(t) //тогда можно уже удалить
set t = null
endfunction

function Example1 takes nothing returns nothing
local timer t
If udg_example == 1 then
set t = CreateTimer()
call TimerStart(t,1.0,false, function Example2)
set t = null
endif
endfunction
У тебя должна быть библиотека в JNGP. Мне пришлось вспоминать нативку GetExpiredTimer() jass.wikia.com/wiki/Functions
avuremybe, ну ошибся, не существенно
27

» WarCraft 3 / Есть ли утечка?

Можно его и не создавать
local timer t //объявляем локалку
If udg_example == 1 then //если условие прокатывает
set t = CreateTimer() //создаём таймер
call TimerStart(t,1.0,false, function Example2) //запускаем его
endif
set t = null //обнуляем
27

» WarCraft 3 / Есть ли утечка?

В данный момент нет утечек. В памяти остаётся таймер. Но удалять его сейчас не нужно, удаляют после завершения работы таймера, например в функции Example2 (короче как у тебя написано через 1 минуту). Если мы удалили бы сейчас, то запуск таймера не пройзошел бы (ибо таймера больше нет).
27

» WarCraft 3 / Нажатие на предмете и действие

Манипулирующий предмет - переменная предмета, срабатывает при событий "юнит получает", "юнит использует предмет", "юнит теряет предмет". Ссылается на этот итем
Событие - Юнит использует предмет
Условие - Тип манипулирующего предмета = .....
Ваше действие
Предмет напрямую связан со способностью. Короче с активной способностью предмета. Смотришь, какая способность стоит в предмете
Событие - юнит применяет смпособность
Условие - применяемая абилка = .....
Ваши действия
Если в предмете никакой активной способности нет, а в предмете, отмечен как итем на которого можно прожать, то сами события выше не запускаются. Проверял дебагом когда-то давно
xgm.guru/p/wc3/180041 где-то здесь пример можно посмотреть
27

» WarCraft 3 / Как создать пожар и тушение?

Принятый ответ
Можно будет использовать огненный столб, который кастует дамми, и когда нужно прервать, то дамми удаляешь. Огненный столб - абилка, которая прерывается, если юнит прекращает каставать. Идея бредовая. Хотя, мне кажется триггерно полностью нужно все делать (поджигающую абилу) нужно будет, только тогда можно будет потушить или прервать.
не по теме
Помню, у орков у катапульты есть пассивка (жидкое пламя или горючая смесь). Там она еще и запрещает ремонтировать подожённое здание, если не ошибаюсь (посмотрите описание. У меня нет возможности посмотреть сейчас. Давно нашел ту интересную фишку). Только она бьет по области, наверное можно будет перенастроить. Там все что нужно - это удалить бафф с здания
xgm.guru/forum/showthread.php?t=52170 или триггерно временно классификацию убрать, тогда рабочий не сможет ремонтировать этого юнита. Потом не забудьте вернуть эту классификацию ему, иначе его не смогут починить
27

» WarCraft 3 / Добыча ресурсов

Во втором триггере переменная "Атакующий" может 10 раз успеть переписаться, пока ваш юнит делает замах и наносит урон. Для передачи аргументов используй CustomValue (целочисленная, на русском обычное значение или как-то как, короче юнит может хранить целое число). Есть другие способы передачи. А так что-то не вижу почему у других игроков не работает, то над в карту смотреть
27

» WarCraft 3 / Ошибка базы данных триггеров

Andrey33, скрины лучше скидывать на сайт.
а если создать новую карту, и попробовать сохранить, затем открыть? норм ведь откроет? если так, значит дело в редакторе (нужен JNGP и его настроить надо)
27

» WarCraft 3 / Удаление работника если он построил сторожевую башню

Попробуй дебагом выводить на экран. Выводи имя юнитов (там triggerUnit, ConstructedStructure). По-моему, ConstructedStructure - переменная ссылается на здание, и работает при событий "юнит завершает строительство". ConstructedStructure в этом событий (юнит завершает строительство) равен TriggerUnit. А у вас указано на скрине событие, которое срабатывает при нажиманий кнопки строительства (Build structure). Существует ли при клике кнопки triggerUnit, скорее всего triggerunit подразумеваешь строителя (если событие ссылается на него, иначе, мб triggerunit пуст), и условие с переменной ConstructedStructure работает?
Посмотри как работает триггер без условии.
Строителя сложнее найти, так как при событиях юнит начинает строить и юнит завершает переменные ссылаются на здание, но не на строителя. Поэтому нужно ловить приказ на строительство, и дальше ссылаемся на юнита, получивший приказ. Но сам как-то делать пытался, но не доходил до этого
xgm.guru/p/100/179956?postid=336559#comment7 когда-то тоже задавал вопрос, ответа не нашёл четкого. Но можно схитрить
27

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

Принятый ответ
как сказал quq_CCCP, добавляете классификации. Классификации в варкрафте не много, но можно добавить свои искусственно. Вот есть классификации самоубийцы, древо и механика
xgm.guru/p/wc3/wc3targets есть статья, эксперементируйте
Если кто не понял, пример
древо и не самоубийцы и не механика -1 класс
самоубийцы и не древо и не механика - 2 класс
механика и не древо и не самоубийцы - 3 класс
древо и самоубийцы и не механика - 4 класс
древо и механика и не самоубийцы - 5 класс
самоубийцы и механика и не древо - 6 класс
древо и самоубийцы и механика - 7 класс
не древо и не самоубийцы и не механика - 8 класс
и так далее (сколько классов максимум наплодить я не знаю, не проверял), похоже что 8 классов.
Если поставить просто древо, то будет действовать на тех у кого та классификация установлена. Если поставить древо и самоубийцы, то будет то же самое делать (это не 4 или 7 класс, ибо в целях не указано механика или не механика, срабатывает только на то есть дреао и самоубийцы).
подправьте меня, если ошибаюсь
27

» WarCraft 3 / TriggerEvaluate(trig)

Принятый ответ
пояснения
Эта функция запускает условие триггера (точнее функцию, которая приписана в регистре) и эта функция может возвращать boolean. если TriggerEvaluate возвращает истину, значит условие триггера истино.
пример для понимания
function ConditionalTriggerExecute takes trigger trig returns nothing
    if TriggerEvaluate(trig) then //если условие истино
        call TriggerExecute(trig) //то запускаем действие
    endif
endfunction
тонкости jass
Хитрецы используют TriggerEvaluate в других способах. Например, урезают действие (action), а сами действия прописывают в условиях. Эта функция то же самое что и TriggerExecute, только здесь пишут в конце return boolean (условие). То есть вместо TriggerExecute используют TriggerEvaluate, а на конце прописывают return false.
function CCC takes nothing returns boolean
...... //действия
return false //по идее если триггер возвращает истину, то запускает действие (action). Но TriggerEvaluate не запускает действие, просто запускает функцию (проверяет условие) и возвращает boolean
endfunction

function DD takes nothing returns nothing
call TriggerEvaluate(trig) //вызываете условие триггера
endfunction
Часто условие может не срабатывать (возвращает ложь), возможно (мое предположение, так как не изучал TriggerEvaluate подробно, все особенности, как сработает ли условие с варкрафтовскими переменными) потому что потому что стоят варкрафтоские переменные (точно не знаю, проверь), ибо переменные пусты или заполнены другим чем-то. По идее переменные эти срабатывают по событию, а значит запускать TriggerEvaluate в момент срабатывания события
27

» WarCraft 3 / Канал

Принятый ответ
Может быть он изначально скрыт? У меня тоже скрыт, нужно в настройках включить изображение
xgm.guru/p/100/190231?postid=348072#comment4 в ссылке есть текстовик, там написаны как настраивать канал, за что отвечают пункты
27

» WarCraft 3 / Предметы

Принятый ответ
Нужно в способностях предмета цели настроить. xgm.guru/p/100/180041 Не помню точно в этом ли примере, там есть настройки клика на предмет. У меня компа просто нет уже =((
А в триггерах проверяешь условием - является ли предмет такой-то такой (в зависимости от события переменные разные, если то каст то цель каста, если то приказ, то цель приказа). то если обязательно нужно условие какое-то
27

» WarCraft 3 / Раптор Хаоса

А я подумал что хгм обновляет парк динозавров)) жаль пауков и жуков мало
27

» WarCraft 3 / Multiboard игроков

Либо создавать для каждого отдельную доску и показывать каждому нужную, как заполомили этим ответом сайт и форум. Бывает очень глупо плодить мультиборды, можно было бы попробовать использовать одну доску, изменяя лишь локально. Второй вариант - локально, то есть через GetLocalPlayer()
пример
//при инициализации записываешь какие-то значения или в других ситуации изменяешь значения
set B[0]="красный" //переменная типа строка
set B[1]="синий"
local integer id = GetPlayerId(GetLocalPlayer())
call MultiboardSetTitleText(B[id]) //красный игрок будет видеть надпись "красный", а синий "синий". Похожему методу можно сделать с ячейками. Если ты понял хитрость
Попробуй это. Не знаю сработает ли эта теория. Лично сам это не пробовал
xgm.guru/p/wc3/bpe посмотри есть ли тут.
Пробовал через MultiboardDispley(MB,GetLocalPlayer() == Player(нужный игрок)) но что-то не то .
Допустим игрок 1 при нажатии ArrowUp открывает Multiboard при отпускании кнопки Multiboard закрывается , но с другими игроками начинает некорректно работать .
Некорректно это как?
27

» WarCraft 3 / Как разделить предметы по классам?

Ну что там сложного? всем предметам в Редакторе объектов проставляете уровень.
раскрыть
Событие - юнит подбирает предмет
Если уровень итема ==1 это условие смотри в разделе целочисленное
То делать действия
Иначе, если уровень итема == 2
То делать действия
Иначе дропнуть итем
сколько макс. уровень можно ввести ?
Можно использовать базу данных, например хэш-таблица. Там два ключа, удобно тебе базу делать. Там первый ключ - тип предмета (функция типа возвращает целое число), а второе просто можно пермаментный ноль (если придумаешь куда второй ключ давать.). Ты бужешь подзагружать из хэша нужные данные
27

» WarCraft 3 / нужна помощь с тригерром(тригерами)

Принятый ответ
раскрыть
При инициализации создаешь базу, есть функция генерирующее случайное число.
Забиваешь базу данных
UT[0] = пехотинец
UT[1] = бугай
UT[2] = лучница
Count = 2 это кол-во макс. типов, нумерация идёт с нуля у меня
CountU = 20 макс. возможное кол-во юнитов. Здесь можете сами указать . а вообще можно отказаться от этой переменной, проставляете сразу в цикл
Теперь как сделать рандом
set RandomCount = от 1 до CountU генерирует случайное кол-во юнитов
Цикл A от 1 до RandomCount надеюсь знаете как работает цикл? А то многие новички неизнают
-set RandomType = от 0 до Count генерируем случайный тип
-создать юнита с типом UT[RandomType]
Конец цикла
Вообще можно раскрыть BJ функцию и посмотреть как там генерируют кол-во циклом
тему то переименуйте
27

» WarCraft 3 / Юниты самовольно убегают

Принятый ответ
Юзай поиск. Нейтральный игроки не дают полноценной возможности управлять ихними юнитами, и поэтому приходится в константах рыться либо костыли (с приказами). Кроме возврата там у них есть много чего другого: например крип игнорит башню, идет мимо нее и др.
27

» WarCraft 3 / Не работает триггерный спелл.

Проверяй дебагом.
раскрыть
Кстати, то что написал в коде работает?
  1. ты в в качестве фильтра написал функцию SpellGolemFireStone, короче вставил в функцию GroupEnumUnitsInRangeOfLoc. Исправь на SpellGroupForCreepConditionEnemy.
  2. Зачем ты ее удаляешь фильтр? во-первых, нужно было в переменную засунуть, и потом удалить. а так бесполезно создаешь. во-вторых, она не утекает, и удалять не нужно.
  3. Используй глобалку вместо GetTriggerUnit() в функции SpellGroupForCreepConditionEnemy (использую для переноса в фильтр, так как надежнее).
  4. ну и точки. неудобно же. взял бы функции GetUnitX и GetUnitY, GroupEnumUnitsInRange, IssuePointOrder

  1. Потом проверяй кол-во пикнутых юнитов в группу. Может быть фильтр не работает и прочее.
  2. Если группа норм выделяет, проверяй SpellGolemFireStone, почему не работает. Там приказы не может юзнуть или что-то еще. Может быть дело в самих даймиках, там радиус у них маленький, и им нужно подбежать ближе, а они не могут так как скорость движения на нуле и др
27

» WarCraft 3 / Автоподбор / Автопродажа предметов

Пока не в каких проектах. Просто потянуло создать систему подбора и продажи. Изначально, я посмотрел видео Вадима, где играл в карту под названием Весёлая ферма. Механика карты понравилась, но все было сыровато. Там нужно было без конца кликать, и практически не было возможности что-либо сделать (осмотрется, и др.), если в поле вырастало кучу овощей, нужно было собрать. Сумка у героя не резиновая, и много не положишь, поэтому нужно было потом собранное отнести куда-то. Если нужно было продать или занести куда-то, то выискивать магазин и положить. На это время теряется, так и ещё нужно было поляну обрабатывать, сорняки выдергивать и др. Жалко, что кнопочки не было. Я вспомнил одну замечательную свою наработку в первоначальном виде xgm.guru/forum/showthread.php?t=59707 И предложил автору карты PUver, пообещал доработать. Походу дела автор просил много чего переделать и доработать. Puver был внимателен (где я зачастую не разглядел ошибки), и помогал тестировать. За что спасибо ему. Мы вдвоём создали наработку. Пока карта Весёлая ферма не обновляется =((. Странно, что мало отписавшихся и не отображается в ресурсах. Просто не хочу, что наработка не пропала, МБ пригодится кому-то
27

» WarCraft 3 / способности

В ИИ я часто в качестве основы беру какие абилки, рабочие абилки. Например, хочешь сделать аое дамаг, берём либо буран или аое-шную абилку короля-гнома. И делаем что-то. Это только как пример. Не знаю, вот в указанных абилках можно там дамаг, эффекты и прочее убрать. И дай ещё юниту, и в скрипте укажи . Нужно знать какие абилки и когда применяются ИИ (буран бьёт по врагам, скил гнома когда рядом враги, культа кенариуса, когда все ранены и др). Можно самому триггерами отслеживать и приказами делать. Но часто бывает не работает, убрал все и параметры обнулил, и ИИ не хочет работать
Вот не знаю, как будет с негеройскими скилами.
А так только через приказы, триггеры. Вроде ИИ не трудно написать на одного юнита. Но сложно написать на расстрой, исследования и покупки и др