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

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

`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
7
NazarPunk:
Сохраняйте область на хэндл юнита.
Возможно пациент не знает что такое хэндл (как и я) да и говорит скорее всего о ГУИ.
Йа думаю тебе поможет в событии указать любую смерть. А в действиях проверять через if then else в условиях (if) тип юнита и тогда (then) зависимости от типа отправлять в нужную тебе область, иначе (else) сделать тоже самое но только в проверке указать тип следующего юнита, и так столько раз сколько у тебя типов юнитов. А в конце не забудь установить "Ничего не делать".. Хотя в части оптимизации "Хэндл" наверняка куда эффективнее будет)))
30
Возможно пациент не знает что такое хэндл (как и я)
Для таких случаев существуют статьи.
сделать тоже самое но только в проверке указать тип следующего юнита, и так столько раз сколько у тебя типов юнитов
В самом же вопросе указано:
например 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 
32
Системы респауна крипов как и инфа по этому поводу давно выложена на xgm. Поиск в помощь.
30
Системы респауна крипов как и инфа по этому поводу давно выложена на xgm. Поиск в помощь.
Не всем под силу великая магия поиска))

Принятый ответ
24
Имхо, здесь не обязательны хендлы. С головой хватит custom value для хранения номера локи к которой привязан гвард или, если custom value уже занято, то банально двух массивов. В одном массиве по порядку гварды, в другом локи. Умер гвард (проверка по типу, чтобы система не кидалась на других юнитов) - ищем его в массиве, чистим ячейку массива и запускаем процесс респавна в локе с соответствующим номером. Перебор массива менее эффективен, чем прямая привязка по номеру, но тут всего 20 юнитов и не такое уж частое событие смерти.
NazarPunk,
Луа это хорошо, сам на нем пишу, но гуишникам от него пользы мало. Особенно если они на 1.26 сидят. Ну и сколько можно показывать людям код, в котором триггеры создаются до инициализации, падать же будет при сборке мусора. Тем более, у тебя даже инжект в InitGlobals есть, но в нем почему-то только юниты создаются, хотя можно было бы и триггер там создавать...
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.