Всем привет! Как сделать триггер, что бы мобы-охранники при смерти воскрешались, через определённое время, каждый в своей области? например 20 разных областей и 20 одинаковых юнитов. Что бы они после смерти воскрешались не там где умерли, а именно в своей области

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

Системы респауна крипов как и инфа по этому поводу давно выложена на xgm. Поиск в помощь.
Не всем под силу великая магия поиска))

`
ОЖИДАНИЕ РЕКЛАМЫ...
0
29
4 года назад
0
Сохраняйте область на хэндл юнита.
1
7
4 года назад
1
NazarPunk:
Сохраняйте область на хэндл юнита.
Возможно пациент не знает что такое хэндл (как и я) да и говорит скорее всего о ГУИ.
Йа думаю тебе поможет в событии указать любую смерть. А в действиях проверять через if then else в условиях (if) тип юнита и тогда (then) зависимости от типа отправлять в нужную тебе область, иначе (else) сделать тоже самое но только в проверке указать тип следующего юнита, и так столько раз сколько у тебя типов юнитов. А в конце не забудь установить "Ничего не делать".. Хотя в части оптимизации "Хэндл" наверняка куда эффективнее будет)))
1
29
4 года назад
Отредактирован nazarpunk
1
Возможно пациент не знает что такое хэндл (как и я)
Для таких случаев существуют статьи.
сделать тоже самое но только в проверке указать тип следующего юнита, и так столько раз сколько у тебя типов юнитов
В самом же вопросе указано:
например 20 разных областей и 20 одинаковых юнитов

Так как я не разбираюсь в гуях, то напишу пример на lua без идиотских проверок на тип юнита

do
	local table = {} -- используем таблицу для сзапоминания юнитов
	
	-- создаём функцию для удобного спавна
	---@param player player
	---@param raw integer
	---@param rct rect
	function SpawnGuard(player, raw, rct)
		-- получаем координаты рэкта
		local minX, maxX, minY, maxY = GetRectMinX(rct), GetRectMaxX(rct), GetRectMinY(rct), GetRectMaxY(rct)
		-- создаём юнита
		local unit                   = CreateUnit(player, raw, math.random(minX, maxX), math.random(minY, maxY), math.random(0, 359))
		-- сохраняем хэндл в таблицу
		table[GetHandleId(unit)]     = rct
	end
	
	-- отлавливаем смерть юнитов
	local trigger = CreateTrigger() -- создаём триггер
	for i = 0, bj_MAX_PLAYER_SLOTS-1 do
		-- перебираем все слоты игрока
		TriggerRegisterPlayerUnitEvent(trigger, Player(i), EVENT_PLAYER_UNIT_DEATH) -- регистрируем событие смерти
	end
	TriggerAddAction(trigger, function()
		-- добавляем действия в триггер
		local unit   = GetTriggerUnit() -- получаем юнита
		local handle = GetHandleId(unit) -- получаем хэндл юнита
		if table[handle] == nil then return end -- проверяем его наличие в таблице
		local raw    = GetUnitTypeId(unit) -- запоминаем тип юнита на случай внезапного исчезновения хэндла
		local player = GetOwningPlayer(unit) -- запоминаем владельца по той же причине
		
		-- стартуем таймер
		TimerStart(CreateTimer(), 20, false, function()
			SpawnGuard(player, raw, table[handle]) -- спавним юнита по новой
			table[handle] = nil -- подчищаем за собой
			DestroyTimer(GetExpiredTimer()) -- не забываем удалять отработанные таймеры
		end)
	
	end)

end

-- Где-то ниже по коду
do
	local InitGlobalsOrigin = InitGlobals
	function InitGlobals()
		InitGlobalsOrigin()
		SpawnGuard(Player(PLAYER_NEUTRAL_AGGRESSIVE), FourCC('hfoo'), gg_rct_myGuardRect)
		SpawnGuard(Player(PLAYER_NEUTRAL_AGGRESSIVE), FourCC('hfoo'), gg_rct_myGuardRect1)
		SpawnGuard(Player(PLAYER_NEUTRAL_AGGRESSIVE), FourCC('hfoo'), gg_rct_myGuardRect2)
		SpawnGuard(Player(PLAYER_NEUTRAL_AGGRESSIVE), FourCC('hfoo'), gg_rct_myGuardRect3)
		SpawnGuard(Player(PLAYER_NEUTRAL_AGGRESSIVE), FourCC('hfoo'), gg_rct_myGuardRect4)
		SpawnGuard(Player(PLAYER_NEUTRAL_AGGRESSIVE), FourCC('hfoo'), gg_rct_myGuardRect5)
		SpawnGuard(Player(PLAYER_NEUTRAL_AGGRESSIVE), FourCC('hfoo'), gg_rct_myGuardRect6)
	end
end 
1
32
4 года назад
1
Системы респауна крипов как и инфа по этому поводу давно выложена на xgm. Поиск в помощь.
1
29
4 года назад
1
Системы респауна крипов как и инфа по этому поводу давно выложена на xgm. Поиск в помощь.
Не всем под силу великая магия поиска))

Принятый ответ
1
24
4 года назад
1
Имхо, здесь не обязательны хендлы. С головой хватит custom value для хранения номера локи к которой привязан гвард или, если custom value уже занято, то банально двух массивов. В одном массиве по порядку гварды, в другом локи. Умер гвард (проверка по типу, чтобы система не кидалась на других юнитов) - ищем его в массиве, чистим ячейку массива и запускаем процесс респавна в локе с соответствующим номером. Перебор массива менее эффективен, чем прямая привязка по номеру, но тут всего 20 юнитов и не такое уж частое событие смерти.
NazarPunk,
Луа это хорошо, сам на нем пишу, но гуишникам от него пользы мало. Особенно если они на 1.26 сидят. Ну и сколько можно показывать людям код, в котором триггеры создаются до инициализации, падать же будет при сборке мусора. Тем более, у тебя даже инжект в InitGlobals есть, но в нем почему-то только юниты создаются, хотя можно было бы и триггер там создавать...
1
29
4 года назад
Отредактирован nazarpunk
1
Ну и сколько можно показывать людям код, в котором триггеры создаются до инициализации, падать же будет при сборке мусора.
Только вот у меня почему-то не падает.
Тем более, у тебя даже инжект в InitGlobals есть, но в нем почему-то только юниты создаются, хотя можно было бы и триггер там создавать...
Инжект там только с одной целью - чтоб создание юнитов работало даже если его перенесут выше объявления функции.
Луа это хорошо, сам на нем пишу, но гуишникам от него пользы мало.
Звучит так, как будто "гуишник" это диагноз. Не спорю, есть особо одарённые личности, но думаю адекватные смогут подправить несколько строк в тексте под свои нужды.
1
24
4 года назад
1
Только вот у меня почему-то не падает.
Даже если принудительно вызвать сборку мусора после старта игры? Автоматическую сборку мусора можно долго ждать, особенно на стандартных настройках 1.31.
1
29
4 года назад
Отредактирован nazarpunk
1
Даже если принудительно вызвать сборку мусора после старта игры?
Я ж сборщик для этого в чат и выводил. Он убивает триггер, если его принудительно вызвать до TriggerAddAction()
Чтобы оставить комментарий, пожалуйста, войдите на сайт.