Могут ли перезаписатся глобалки например тут, если это будет в 2-ух триггерах, которые имею одинаковый triggerevent ?
set bj_lastCreatedUnit = GetTriggerUnit()
GroupEnumUnitsInRange(g, x, y, radius, Condition(function anc) )

Принятый ответ

пример
Если действие мгновенное, то глобалки не перезапишут. И локалки не нужны.
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 в качестве темповой глобалки (но только задержки чтобы не было, а то перезапишет), то ничего страшного, не перезапишут, так как действие мгновенно. В варкрафте два триггера одновременно не могут выполнить работу. Варкрафт мгновенно выполняет поочередно, в доле микросекунд. Возбмет один обработает, а потом переключается на второй триггер.
0
20
7 лет назад
Отредактирован biridius
0
вроде нет
сейчас проверил
выдает все как надо без перемешивания, 1 к 1, затем 2 к 2
Загруженные файлы
0
32
7 лет назад
0
Блин, читайте статью про порядок действий в варкравте, глобалки не перезапишутся при грамотном Использования:
  1. никаких вейтов, задержек, все действия с глобалкой в 1 поток.
  2. при действиях с глобалкой не вызывать никаких событий триггеров, действия которые используют эту глобальную переменную.
0
21
7 лет назад
0
quq_CCCP, а можно статью? Поиск ничего не выдал.
0
32
7 лет назад
0
ScopteRectuS, в поиск вбиваем "Передача и хранение данных"
И ищем,подобное жевали уже не раз, помнится даже была древняя статья где все это описывалась, я привел краткое содержание.
1
27
7 лет назад
Отредактирован MpW
1
пример
Если действие мгновенное, то глобалки не перезапишут. И локалки не нужны.
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 в качестве темповой глобалки (но только задержки чтобы не было, а то перезапишет), то ничего страшного, не перезапишут, так как действие мгновенно. В варкрафте два триггера одновременно не могут выполнить работу. Варкрафт мгновенно выполняет поочередно, в доле микросекунд. Возбмет один обработает, а потом переключается на второй триггер.
Принятый ответ
0
23
7 лет назад
Отредактирован pro100master
0
Ответ выше уже описали....
0
21
7 лет назад
0
Steal nerves, нуу \то то понятно. Я имел ввиду передачу данных в функцию ForGroup через bj_lastCreatedUnit и bj_groupEnumUnitPlayer во всех группах. Может ли тогда произойти перезапись.
1
27
7 лет назад
Отредактирован MpW
1
ScopteRectuS, нет, не должно быть никакой перезаписи (смотря что ты там в функции ForGroup напишешь). ForGroup и фильтры запускаются сразу. Как я помню, использовал часто темповые глобалки для переноса инфы, например юнита или игрока в фильтр. Брал переменную типа юнит, и потом делал манипуляции типа юнит-кастер не враг GetFilterUnit(), то брать в группу (а остальных не подходящих условии фильтр отсеивал)
ForGroup - своего рода тоже цикл, он берет одного юнита GetEnumUnit, обрабатываем функцию. Берем второго, обрабатываем. И так далее.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.