[lua] Кастомные спавнеры крипов.

CryDeS

Друзья CG
14 Июл 2015
1,210
11
Бывает что нужно заспавнить нейтралов, а точнее существ из npc_units_custom.txt, но они не умеют возвращаться на свое место(это если класс юнита npc_dota_creature, если класс npc_dota_neutral, такого не будет).
Если мы создаем npc_dota_neutral то "Creature" блок в datadriven будет недоступен :(
Что ж, для начала заспавним крипов.
Код:
_G.Units = {} -- глобальная таблица существ. Почему глобальная? Потому что иногда мне необходимо из других скриптов обращаться к Units. Но сделать локальным будет лучше, если вам не нужно вызывать извне. Быстрее будет работать же.

function Spawn()
{
    local tpoint = Entities:FindByName( nil, "DIRE_SPAWNER"):GetAbsOrigin() -- в hammer editor сделать обязательно info_target с именем DIRE_SPAWNER
	local current = CreateUnitByName("Demon_possessed", tpoint, true, nil, nil, DOTA_TEAM_NEUTRALS) -- создаем КАСТОМНОГО крипа.
	print("Spawner: " .. current:GetUnitName()) -- просто тестовый вывод
	InsertInUnitTable(current, tpoint)
}

function InsertInUnitTable(inserting_unit, inserting_point)
	local inserting_data = 
	{
		unit = inserting_unit,
		point = inserting_point,
	}
	table.insert(Units, inserting_data)
end

Теперь мы должны сделать им возврат на их место если далеко ушли. Для этого делаем такой костыль с таймерами.
Код:
function Ai_GetBack()
	Timers:CreateTimer("get_back_units", {
     			endTime = 5,
    		    callback = function()
      			Ai_GetBack_Tick()
				return 5
				end	})

end

function Ai_GetBack_Tick()
	for _, un in pairs(Units) do
		if un then
	  	if (un.point - un.unit:GetAbsOrigin()):Length2D() >= 900 then -- высчитываем расстояние от точки спавна до нахождения юнита, и если больше 900 то отдаем юниту насильный приказ вернутся на точку спавна.
				un.unit:MoveToPosition(un.point)
			end
		end
	end
end
И при запуске игры запускаем функцию Ai_GetBack().
Все. Теперь крип заспавненный и добавленный в таблицу с точкой спавна будет возвращаться насильно на свой спавн если далеко убежал.
Если вы знаете способ лучше, говорите.
 
Последнее редактирование модератором:
  • Нравится
Реакции: UFO

Se7eN

Друзья CG
22 Ноя 2014
334
18
я бы сделал их классом creature, а потом просто поменял им команду на нейтралов.

На место будут возвращаться да и тима будет нейтралов.
 

CryDeS

Друзья CG
14 Июл 2015
1,210
11
я бы сделал их классом creature, а потом просто поменял им команду на нейтралов.

На место будут возвращаться да и тима будет нейтралов.
Через SetTeam? А это поможет о.О
 
Последнее редактирование модератором:

fiCeVitka

Пользователь
21 Авг 2014
48
0
Чтобы крипы возвращались на место достаточно в их описание добавить:
Код:
"UseNeutralCreepBehavior"  "1"
 
Последнее редактирование модератором:

CryDeS

Друзья CG
14 Июл 2015
1,210
11
[quote author=fiCeVitka link=topic=223.msg1187#msg1187 date=1437654651]
Чтобы крипы возвращались на место достаточно в их описание добавить:
Код:
"UseNeutralCreepBehavior"  "1"
[/quote]
Значит тему можно удалять, бесполезна :)
 
Последнее редактирование модератором:

fiCeVitka

Пользователь
21 Авг 2014
48
0
CryDeS, да не, оставь, тут можно редактировать расстояние, и мб кто-нибудь еще что-нибудь прикрутит как условие
 

somsim

Пользователь
14 Мар 2017
23
0
Т.к единственная тема со спавном. Не выходит! Да безусловно скорее всего у меня нет _G.Units и что делать тогда (делал через этот)... Как их связывать?
 

CryDeS

Друзья CG
14 Июл 2015
1,210
11
[quote author=somsim link=topic=223.msg8958#msg8958 date=1490520549]
Т.к единственная тема со спавном. Не выходит! Да безусловно скорее всего у меня нет _G.Units и что делать тогда (делал через этот)... Как их связывать?
[/quote]
Для начала, гайд устарел.
Проверьт так же существует ли твой юнит(заспавнь через читы -createhero <unit_name>), если все ок то проблема с кодом.
Спавнить можно след. кодом из кода сверху(остальное мусор):
Код:
local vPoint = Entities:FindByName( nil, "spawner_name"):GetAbsOrigin() -- в hammer editor сделать обязательно info_target с именем spawner_name
local hUnit = CreateUnitByName("unit_name", vPoint, true, nil, nil, DOTA_TEAM_NEUTRALS) -- создаем КАСТОМНОГО крипа.
 
Последнее редактирование модератором:

somsim

Пользователь
14 Мар 2017
23
0
Можешь расписать? Код целиком. Идея в Хаммере с инфо_таргет мне понравилась. Но у меня мыслей с самоубийством было меньше чем неудачных попыток заспавнить крипа.
Я уже не могу... На этом сайте я разве что все 21 страницу с "скрипт" раздела не пролистал. (крип спавнится и с его параметрами я полностью разобрался(осталсялуа))
 
Последнее редактирование модератором:

CryDeS

Друзья CG
14 Июл 2015
1,210
11
Тут и так все расписано, за тебя делать никто не будет. Вон функция Spawn, вызывай ее когда тебе надо и будет тебе профит.
 

mrlikelot

Продвинутый
24 Июл 2015
168
1
В том то и проблема: что там не все:) штук 7 неболее
В хаммере можно посмотреть модельки и пути к ним через свойства
ce28bef9a845.png
 
Последнее редактирование модератором:

somsim

Пользователь
14 Мар 2017
23
0
Ясно! (не там искал). Через хаммер даже не думал:\ СпосибО
 

xDes

Продвинутый
8 Ноя 2018
232
34
Проект
Boss Survival Adventure
Бывает что нужно заспавнить нейтралов, а точнее существ из npc_units_custom.txt, но они не умеют возвращаться на свое место(это если класс юнита npc_dota_creature, если класс npc_dota_neutral, такого не будет).
Если мы создаем npc_dota_neutral то "Creature" блок в datadriven будет недоступен :(
Что ж, для начала заспавним крипов.
Код:
_G.Units = {} -- глобальная таблица существ. Почему глобальная? Потому что иногда мне необходимо из других скриптов обращаться к Units. Но сделать локальным будет лучше, если вам не нужно вызывать извне. Быстрее будет работать же.

function Spawn()
{
    local tpoint = Entities:FindByName( nil, "DIRE_SPAWNER"):GetAbsOrigin() -- в hammer editor сделать обязательно info_target с именем DIRE_SPAWNER
    local current = CreateUnitByName("Demon_possessed", tpoint, true, nil, nil, DOTA_TEAM_NEUTRALS) -- создаем КАСТОМНОГО крипа.
    print("Spawner: " .. current:GetUnitName()) -- просто тестовый вывод
    InsertInUnitTable(current, tpoint)
}

function InsertInUnitTable(inserting_unit, inserting_point)
    local inserting_data =
    {
        unit = inserting_unit,
        point = inserting_point,
    }
    table.insert(Units, inserting_data)
end

Теперь мы должны сделать им возврат на их место если далеко ушли. Для этого делаем такой костыль с таймерами.
Код:
function Ai_GetBack()
    Timers:CreateTimer("get_back_units", {
                 endTime = 5,
                callback = function()
                  Ai_GetBack_Tick()
                return 5
                end    })

end

function Ai_GetBack_Tick()
    for _, un in pairs(Units) do
        if un then
          if (un.point - un.unit:GetAbsOrigin()):Length2D() >= 900 then -- высчитываем расстояние от точки спавна до нахождения юнита, и если больше 900 то отдаем юниту насильный приказ вернутся на точку спавна.
                un.unit:MoveToPosition(un.point)
            end
        end
    end
end
И при запуске игры запускаем функцию Ai_GetBack().
Все. Теперь крип заспавненный и добавленный в таблицу с точкой спавна будет возвращаться насильно на свой спавн если далеко убежал.
Если вы знаете способ лучше, говорите.
Привет всем! Теме уже 4 года, но все же. А как реализовать это если у меня много разных крипов? Сейчас у меня получается так, есть триггер "А" включая который спавнится крип "А", есть еще один триггер "Б" он спавнит крипа "Б". Функции спавна получается тоже 2. Так вот если заспавнить крипов "А" и "Б" и не убивать их, то они работают как надо, будут отбегать на 900 ренджи и потом бежать назад, но если убить кого-то убить, второй уже не бежит назад. Тоже самое если их спавнить по очереди. Консоль пишет что-то типо отслеживаемый юнит удален (не могу сейчас кинуть скрин).

нашел вот такой ИИ, может кому интересно будет жмяк и может кто поможет мне разобраться в его реализации...
 
Последнее редактирование:

UFO

Пользователь
2 Сен 2016
17
0
Всем привет , а если я хочу накидать допустим 5 точек спавна рандомно на кажые 2000х2000.
Могу ли я это сделать кодом.
А именно создать эти самые поинты что бы потом использовать
Код:
local vPoint = Entities:FindByName( nil, "spawner_name"):GetAbsOrigin()
Если да то можно примерчик как их создать при начале события и удалить по его окончании.
А также есть ли способ проверить путь от созданой рандомной точки к "Эталонной"(которая будет в хамере сделана)
что то вроди если удалось построить маршрут ....
 

UFO

Пользователь
2 Сен 2016
17
0
А проверку возможно ли построить маршрут между ними ?
Или такого нет?
 
Реклама: