Доброго времени суток.
Нужна помощь с данной проблемой:
У меня область на карте рандомно перемещается и в ней время от времени спавнятся враждебные существа. Я не хочу чтоб они спавнились внутри чьего либо поселения. Следовательно мне нужно проверять находится ли рядом с областью какой либо из юнитов и только после этого спавнить. Подскажите как мне правильно сделать?

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

тебе надо что-то одно выбрать. а ты всунул одно и тоже в одну кучу, и выполняется действие это дважды (не верно).
код
в функции Trig_a_F записываются все условия, под которыми берут юнитов в группу
проверяем, что являются зданием. и что номера владельцев-игроков в диапазоне от 0 до 10. нумерация номеров начинается с 0. диапазон можно изменить.
function Trig_a_F takes nothing returns boolean
local integer n =GetPlayerId(GetOwningPlayer(GetFilterUnit()))
 return IsUnitType(GetFilterUnit(), UNIT_TYPE_STRUCTURE)and(n>0 and n<10) 
endfunction
вводим условие Check(rect)
if Check(rect) then
ваши действия
endif
в функции основная фишка это проверять не пуст ли первый выбранный юнит в группе. с помощью FirstOfGroup. Если такого юнита нет (не записан в группе), выдаст null
function Check takes rect re returns boolean
local group g = CreateGroup() //создать группу
local real x = GetRectCenterX(re) //координаты центра области (x,y)
local real y = GetRectCenterY(re)
local boolean b
call GroupEnumUnitsInRange(g, x, y, 1600, Condition(function Trig_a_F))
set b = (FirstOfGroup(g)==null) //условие проверки: если первый попавшийся юнит пустой, запишет true. Иначе false
call DestroyGroup(g) //удаляем группу-утечку
set g = null //обнуляем
return b //вернет true (если группа пуста) или false (группа не пуста, значит есть какое поселение)
endfunction
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
27
5 лет назад
Отредактирован MpW
0
Ну это просто:
если они спавнятся в центре области, а область перемещается периодически. Значит возьмем этот центр как основную точку. лучше конечно перемещать точку, чем рект. Но дело ваше
  1. проверять расстояние между осн точкой и центром поселения. Указываете сами опр дистанцию. если больше указанного расстояния, значит спавнить можно
  2. проверка. пикаете все здания игроков на карте. перебираете циклом каждое здание: чекаете расстояние между выбранным зданием и осн точкой. Если ни одно здание не попала в радиус, можно спавнить
  3. Заранее в вашем поселении на карте расставить области, объединить их в один регион. Лучше объединить в один, тк проще проверять будет. Это будет своего рода метка. И будешь проверять попала ли осн точка в регион или область (есть нативки).
1
26
5 лет назад
1
Как понял, поселение не фиксировано, то есть сначала надо выбрать всех юнитов в каком-то радиусе от точки, которые живы и не принадлежат нейтральному игроку, если количество юнитов в этой группе больше или равно 1, то заново переместить точку в новое место, если нет, то переместить область к точке.
0
27
5 лет назад
0
ну или как сказал 8gabriel8 пикать в радиусе и чекать здания. это лучший вариант
0
32
5 лет назад
0
Все намного проще - сделай на карте с 20-30 спаунов крипов в таких точках, где неможет быть ни поселений ни чего то что может мешать спауну, занеси все эти точки в массив и выбирай случайную из массива.
0
9
5 лет назад
0
Steal nerves:
Ну это просто:
если они спавнятся в центре области, а область перемещается периодически. Значит возьмем этот центр как основную точку. лучше конечно перемещать точку, чем рект. Но дело ваше
  1. проверять расстояние между осн точкой и центром поселения. Указываете сами опр дистанцию. если больше указанного расстояния, значит спавнить можно
  2. проверка. пикаете все здания игроков на карте. перебираете циклом каждое здание: чекаете расстояние между выбранным зданием и осн точкой. Если ни одно здание не попала в радиус, можно спавнить
  3. Заранее в вашем поселении на карте расставить области, объединить их в один регион. Лучше объединить в один, тк проще проверять будет. Это будет своего рода метка. И будешь проверять попала ли осн точка в регион или область (есть нативки).
Типо такого? Но как можно оптимизировать это? Для множества событий
1
18
5 лет назад
1
Можно перемещать точку в случайное место и проверять видимость этой точки для владельцев поселений. Если не видят - то спавнить.
0
26
5 лет назад
0
DarKRs, нет. Ты выбираешь юнитов в радиусе 1600 от WolfSpawn и начинаешь проверять больше или равно их расстояние 8х200 от WolfSpawn. Ты же выбрал юнитов с условием, что расстояние не более 1600.
2
27
5 лет назад
Отредактирован MpW
2
тебе надо что-то одно выбрать. а ты всунул одно и тоже в одну кучу, и выполняется действие это дважды (не верно).
код
в функции Trig_a_F записываются все условия, под которыми берут юнитов в группу
проверяем, что являются зданием. и что номера владельцев-игроков в диапазоне от 0 до 10. нумерация номеров начинается с 0. диапазон можно изменить.
function Trig_a_F takes nothing returns boolean
local integer n =GetPlayerId(GetOwningPlayer(GetFilterUnit()))
 return IsUnitType(GetFilterUnit(), UNIT_TYPE_STRUCTURE)and(n>0 and n<10) 
endfunction
вводим условие Check(rect)
if Check(rect) then
ваши действия
endif
в функции основная фишка это проверять не пуст ли первый выбранный юнит в группе. с помощью FirstOfGroup. Если такого юнита нет (не записан в группе), выдаст null
function Check takes rect re returns boolean
local group g = CreateGroup() //создать группу
local real x = GetRectCenterX(re) //координаты центра области (x,y)
local real y = GetRectCenterY(re)
local boolean b
call GroupEnumUnitsInRange(g, x, y, 1600, Condition(function Trig_a_F))
set b = (FirstOfGroup(g)==null) //условие проверки: если первый попавшийся юнит пустой, запишет true. Иначе false
call DestroyGroup(g) //удаляем группу-утечку
set g = null //обнуляем
return b //вернет true (если группа пуста) или false (группа не пуста, значит есть какое поселение)
endfunction
Принятый ответ
Чтобы оставить комментарий, пожалуйста, войдите на сайт.