ScopteRectuS, нет, не должно быть никакой перезаписи (смотря что ты там в функции ForGroup напишешь). ForGroup и фильтры запускаются сразу. Как я помню, использовал часто темповые глобалки для переноса инфы, например юнита или игрока в фильтр. Брал переменную типа юнит, и потом делал манипуляции типа юнит-кастер не враг GetFilterUnit(), то брать в группу (а остальных не подходящих условии фильтр отсеивал)
ForGroup - своего рода тоже цикл, он берет одного юнита GetEnumUnit, обрабатываем функцию. Берем второго, обрабатываем. И так далее.
Если действие мгновенное, то глобалки не перезапишут. И локалки не нужны.
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 в качестве темповой глобалки (но только задержки чтобы не было, а то перезапишет), то ничего страшного, не перезапишут, так как действие мгновенно. В варкрафте два триггера одновременно не могут выполнить работу. Варкрафт мгновенно выполняет поочередно, в доле микросекунд. Возбмет один обработает, а потом переключается на второй триггер.
//в функции 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
local timer t //объявляем локалку
If udg_example == 1 then //если условие прокатывает
set t = CreateTimer() //создаём таймер
call TimerStart(t,1.0,false, function Example2) //запускаем его
endif
set t = null //обнуляем
В данный момент нет утечек. В памяти остаётся таймер. Но удалять его сейчас не нужно, удаляют после завершения работы таймера, например в функции Example2 (короче как у тебя написано через 1 минуту). Если мы удалили бы сейчас, то запуск таймера не пройзошел бы (ибо таймера больше нет).
Манипулирующий предмет - переменная предмета, срабатывает при событий "юнит получает", "юнит использует предмет", "юнит теряет предмет". Ссылается на этот итем
Событие - Юнит использует предмет
Условие - Тип манипулирующего предмета = .....
Ваше действие
Предмет напрямую связан со способностью. Короче с активной способностью предмета. Смотришь, какая способность стоит в предмете
Если в предмете никакой активной способности нет, а в предмете, отмечен как итем на которого можно прожать, то сами события выше не запускаются. Проверял дебагом когда-то давно
Можно будет использовать огненный столб, который кастует дамми, и когда нужно прервать, то дамми удаляешь. Огненный столб - абилка, которая прерывается, если юнит прекращает каставать. Идея бредовая. Хотя, мне кажется триггерно полностью нужно все делать (поджигающую абилу) нужно будет, только тогда можно будет потушить или прервать.
не по теме
Помню, у орков у катапульты есть пассивка (жидкое пламя или горючая смесь). Там она еще и запрещает ремонтировать подожённое здание, если не ошибаюсь (посмотрите описание. У меня нет возможности посмотреть сейчас. Давно нашел ту интересную фишку). Только она бьет по области, наверное можно будет перенастроить. Там все что нужно - это удалить бафф с здания
xgm.guru/forum/showthread.php?t=52170или триггерно временно классификацию убрать, тогда рабочий не сможет ремонтировать этого юнита. Потом не забудьте вернуть эту классификацию ему, иначе его не смогут починить
Во втором триггере переменная "Атакующий" может 10 раз успеть переписаться, пока ваш юнит делает замах и наносит урон. Для передачи аргументов используй CustomValue (целочисленная, на русском обычное значение или как-то как, короче юнит может хранить целое число). Есть другие способы передачи. А так что-то не вижу почему у других игроков не работает, то над в карту смотреть
Andrey33, скрины лучше скидывать на сайт.
а если создать новую карту, и попробовать сохранить, затем открыть? норм ведь откроет? если так, значит дело в редакторе (нужен JNGP и его настроить надо)
Попробуй дебагом выводить на экран. Выводи имя юнитов (там triggerUnit, ConstructedStructure). По-моему, ConstructedStructure - переменная ссылается на здание, и работает при событий "юнит завершает строительство". ConstructedStructure в этом событий (юнит завершает строительство) равен TriggerUnit. А у вас указано на скрине событие, которое срабатывает при нажиманий кнопки строительства (Build structure). Существует ли при клике кнопки triggerUnit, скорее всего triggerunit подразумеваешь строителя (если событие ссылается на него, иначе, мб triggerunit пуст), и условие с переменной ConstructedStructure работает?
Посмотри как работает триггер без условии.
Строителя сложнее найти, так как при событиях юнит начинает строить и юнит завершает переменные ссылаются на здание, но не на строителя. Поэтому нужно ловить приказ на строительство, и дальше ссылаемся на юнита, получивший приказ. Но сам как-то делать пытался, но не доходил до этого
как сказал quq_CCCP, добавляете классификации. Классификации в варкрафте не много, но можно добавить свои искусственно. Вот есть классификации самоубийцы, древо и механика
древо и не самоубийцы и не механика -1 класс самоубийцы и не древо и не механика - 2 класс механика и не древо и не самоубийцы - 3 класс древо и самоубийцы и не механика - 4 класс древо и механика и не самоубийцы - 5 класс самоубийцы и механика и не древо - 6 класс древо и самоубийцы и механика - 7 класс не древо и не самоубийцы и не механика - 8 класс
и так далее (сколько классов максимум наплодить я не знаю, не проверял), похоже что 8 классов.
Если поставить просто древо, то будет действовать на тех у кого та классификация установлена. Если поставить древо и самоубийцы, то будет то же самое делать (это не 4 или 7 класс, ибо в целях не указано механика или не механика, срабатывает только на то есть дреао и самоубийцы). подправьте меня, если ошибаюсь
Эта функция запускает условие триггера (точнее функцию, которая приписана в регистре) и эта функция может возвращать 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 в момент срабатывания события
Нужно в способностях предмета цели настроить. xgm.guru/p/100/180041 Не помню точно в этом ли примере, там есть настройки клика на предмет. У меня компа просто нет уже =((
А в триггерах проверяешь условием - является ли предмет такой-то такой (в зависимости от события переменные разные, если то каст то цель каста, если то приказ, то цель приказа). то если обязательно нужно условие какое-то
Либо создавать для каждого отдельную доску и показывать каждому нужную, как заполомили этим ответом сайт и форум. Бывает очень глупо плодить мультиборды, можно было бы попробовать использовать одну доску, изменяя лишь локально. Второй вариант - локально, то есть через GetLocalPlayer()
//при инициализации записываешь какие-то значения или в других ситуации изменяешь значения
set B[0]="красный" //переменная типа строка
set B[1]="синий"
local integer id = GetPlayerId(GetLocalPlayer())
call MultiboardSetTitleText(B[id]) //красный игрок будет видеть надпись "красный", а синий "синий". Похожему методу можно сделать с ячейками. Если ты понял хитрость
Попробуй это. Не знаю сработает ли эта теория. Лично сам это не пробовал
Пробовал через MultiboardDispley(MB,GetLocalPlayer() == Player(нужный игрок)) но что-то не то .
Допустим игрок 1 при нажатии ArrowUp открывает Multiboard при отпускании кнопки Multiboard закрывается , но с другими игроками начинает некорректно работать .
Ну что там сложного? всем предметам в Редакторе объектов проставляете уровень.
раскрыть
Событие - юнит подбирает предмет
Если уровень итема ==1 это условие смотри в разделе целочисленное
То делать действия
Иначе, если уровень итема == 2
То делать действия
Иначе дропнуть итем сколько макс. уровень можно ввести ?
Можно использовать базу данных, например хэш-таблица. Там два ключа, удобно тебе базу делать. Там первый ключ - тип предмета (функция типа возвращает целое число), а второе просто можно пермаментный ноль (если придумаешь куда второй ключ давать.). Ты бужешь подзагружать из хэша нужные данные
При инициализации создаешь базу, есть функция генерирующее случайное число. Забиваешь базу данных
UT[0] = пехотинец
UT[1] = бугай
UT[2] = лучница
Count = 2 это кол-во макс. типов, нумерация идёт с нуля у меня
CountU = 20 макс. возможное кол-во юнитов. Здесь можете сами указать . а вообще можно отказаться от этой переменной, проставляете сразу в цикл
Теперь как сделать рандом
set RandomCount = от 1 до CountU генерирует случайное кол-во юнитов Цикл A от 1 до RandomCountнадеюсь знаете как работает цикл? А то многие новички неизнают
-set RandomType = от 0 до Count генерируем случайный тип
-создать юнита с типом UT[RandomType] Конец цикла
Вообще можно раскрыть BJ функцию и посмотреть как там генерируют кол-во циклом тему то переименуйте
Юзай поиск. Нейтральный игроки не дают полноценной возможности управлять ихними юнитами, и поэтому приходится в константах рыться либо костыли (с приказами). Кроме возврата там у них есть много чего другого: например крип игнорит башню, идет мимо нее и др.
ты в в качестве фильтра написал функцию SpellGolemFireStone, короче вставил в функцию GroupEnumUnitsInRangeOfLoc. Исправь на SpellGroupForCreepConditionEnemy.
Зачем ты ее удаляешь фильтр? во-первых, нужно было в переменную засунуть, и потом удалить. а так бесполезно создаешь. во-вторых, она не утекает, и удалять не нужно.
Используй глобалку вместо GetTriggerUnit() в функции SpellGroupForCreepConditionEnemy (использую для переноса в фильтр, так как надежнее).
ну и точки. неудобно же. взял бы функции GetUnitX и GetUnitY, GroupEnumUnitsInRange, IssuePointOrder
Потом проверяй кол-во пикнутых юнитов в группу. Может быть фильтр не работает и прочее.
Если группа норм выделяет, проверяй SpellGolemFireStone, почему не работает. Там приказы не может юзнуть или что-то еще. Может быть дело в самих даймиках, там радиус у них маленький, и им нужно подбежать ближе, а они не могут так как скорость движения на нуле и др
Пока не в каких проектах. Просто потянуло создать систему подбора и продажи. Изначально, я посмотрел видео Вадима, где играл в карту под названием Весёлая ферма. Механика карты понравилась, но все было сыровато. Там нужно было без конца кликать, и практически не было возможности что-либо сделать (осмотрется, и др.), если в поле вырастало кучу овощей, нужно было собрать. Сумка у героя не резиновая, и много не положишь, поэтому нужно было потом собранное отнести куда-то. Если нужно было продать или занести куда-то, то выискивать магазин и положить. На это время теряется, так и ещё нужно было поляну обрабатывать, сорняки выдергивать и др. Жалко, что кнопочки не было. Я вспомнил одну замечательную свою наработку в первоначальном виде xgm.guru/forum/showthread.php?t=59707 И предложил автору карты PUver, пообещал доработать. Походу дела автор просил много чего переделать и доработать. Puver был внимателен (где я зачастую не разглядел ошибки), и помогал тестировать. За что спасибо ему. Мы вдвоём создали наработку. Пока карта Весёлая ферма не обновляется =((. Странно, что мало отписавшихся и не отображается в ресурсах. Просто не хочу, что наработка не пропала, МБ пригодится кому-то
В ИИ я часто в качестве основы беру какие абилки, рабочие абилки. Например, хочешь сделать аое дамаг, берём либо буран или аое-шную абилку короля-гнома. И делаем что-то. Это только как пример. Не знаю, вот в указанных абилках можно там дамаг, эффекты и прочее убрать. И дай ещё юниту, и в скрипте укажи . Нужно знать какие абилки и когда применяются ИИ (буран бьёт по врагам, скил гнома когда рядом враги, культа кенариуса, когда все ранены и др). Можно самому триггерами отслеживать и приказами делать. Но часто бывает не работает, убрал все и параметры обнулил, и ИИ не хочет работать
Вот не знаю, как будет с негеройскими скилами.
А так только через приказы, триггеры. Вроде ИИ не трудно написать на одного юнита. Но сложно написать на расстрой, исследования и покупки и др
Ред. MpW
» WarCraft 3 / Перезапись глобальных переменных
Ред. MpW
» WarCraft 3 / Перезапись глобальных переменных
» WarCraft 3 / ТестТаг перестал работать (без bj)
Ред. MpW
» WarCraft 3 / Есть ли утечка?
avuremybe, ну ошибся, не существенно
Ред. MpW
» WarCraft 3 / Есть ли утечка?
Ред. MpW
» WarCraft 3 / Есть ли утечка?
Ред. MpW
» WarCraft 3 / Нажатие на предмете и действие
Ред. MpW
» WarCraft 3 / Как создать пожар и тушение?
Ред. MpW
» WarCraft 3 / Добыча ресурсов
» WarCraft 3 / Ошибка базы данных триггеров
а если создать новую карту, и попробовать сохранить, затем открыть? норм ведь откроет? если так, значит дело в редакторе (нужен JNGP и его настроить надо)
Ред. MpW
» WarCraft 3 / Удаление работника если он построил сторожевую башню
Ред. MpW
» WarCraft 3 / Как увеличить урон боевой единице с помощью триггера?
самоубийцы и не древо и не механика - 2 класс
механика и не древо и не самоубийцы - 3 класс
древо и самоубийцы и не механика - 4 класс
древо и механика и не самоубийцы - 5 класс
самоубийцы и механика и не древо - 6 класс
древо и самоубийцы и механика - 7 класс
не древо и не самоубийцы и не механика - 8 класс
и так далее (сколько классов максимум наплодить я не знаю, не проверял), похоже что 8 классов.
подправьте меня, если ошибаюсь
Ред. MpW
» WarCraft 3 / TriggerEvaluate(trig)
Ред. MpW
» WarCraft 3 / Канал
Ред. MpW
» WarCraft 3 / Предметы
А в триггерах проверяешь условием - является ли предмет такой-то такой (в зависимости от события переменные разные, если то каст то цель каста, если то приказ, то цель приказа). то если обязательно нужно условие какое-то
» WarCraft 3 / хочу найти карту с моделями
» WarCraft 3 / Раптор Хаоса
Ред. MpW
» WarCraft 3 / Multiboard игроков
https://www.xgm.guru/forum/showthread.php?t=47646
Ред. MpW
» WarCraft 3 / Как разделить предметы по классам?
Если уровень итема ==1 это условие смотри в разделе целочисленное
То делать действия
Иначе, если уровень итема == 2
То делать действия
Иначе дропнуть итем
сколько макс. уровень можно ввести ?
Ред. MpW
» 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]
Конец цикла
тему то переименуйте
Ред. MpW
» WarCraft 3 / Юниты самовольно убегают
Ред. MpW
» WarCraft 3 / Не работает триггерный спелл.
Ред. MpW
» WarCraft 3 / Автоподбор / Автопродажа предметов
» WarCraft 3 / Создать в РО способность
Ред. MpW
» WarCraft 3 / способности
Вот не знаю, как будет с негеройскими скилами.
А так только через приказы, триггеры. Вроде ИИ не трудно написать на одного юнита. Но сложно написать на расстрой, исследования и покупки и др