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

CryDeS

Друзья CG
14 Июл 2015
1,210
9
38
18
Реакции
9 0 0
#1
Бывает что нужно заспавнить нейтралов, а точнее существ из 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().
Все. Теперь крип заспавненный и добавленный в таблицу с точкой спавна будет возвращаться насильно на свой спавн если далеко убежал.
Если вы знаете способ лучше, говорите.
 
Последнее редактирование модератором:

Se7eN

Друзья CG
22 Ноя 2014
322
4
18
24
Реакции
4 0 0
#2
я бы сделал их классом creature, а потом просто поменял им команду на нейтралов.

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

CryDeS

Друзья CG
14 Июл 2015
1,210
9
38
18
Реакции
9 0 0
#3
я бы сделал их классом creature, а потом просто поменял им команду на нейтралов.

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

fiCeVitka

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

CryDeS

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

fiCeVitka

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

somsim

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

CryDeS

Друзья CG
14 Июл 2015
1,210
9
38
18
Реакции
9 0 0
#8
[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
1
27
Глухое
Реакции
0 0 0
#9
Можешь расписать? Код целиком. Идея в Хаммере с инфо_таргет мне понравилась. Но у меня мыслей с самоубийством было меньше чем неудачных попыток заспавнить крипа.
Я уже не могу... На этом сайте я разве что все 21 страницу с "скрипт" раздела не пролистал. (крип спавнится и с его параметрами я полностью разобрался(осталсялуа))
 
Последнее редактирование модератором:

CryDeS

Друзья CG
14 Июл 2015
1,210
9
38
18
Реакции
9 0 0
#10
Тут и так все расписано, за тебя делать никто не будет. Вон функция Spawn, вызывай ее когда тебе надо и будет тебе профит.
 
Реклама:

somsim

Пользователь
14 Мар 2017
23
0
1
27
Глухое
Реакции
0 0 0
#11
Последнее редактирование модератором:

CryDeS

Друзья CG
14 Июл 2015
1,210
9
38
18
Реакции
9 0 0
#12
Последнее редактирование модератором:

mrlikelot

Продвинутый
24 Июл 2015
168
0
16
38
Реакции
0 0 0
#14
Последнее редактирование модератором:

CryDeS

Друзья CG
14 Июл 2015
1,210
9
38
18
Реакции
9 0 0
#15
Последнее редактирование модератором:
Реклама:

somsim

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

xDes

Пользователь
8 Ноя 2018
42
1
8
30
Реакции
1 0 0
#17
Бывает что нужно заспавнить нейтралов, а точнее существ из 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 ренджи и потом бежать назад, но если убить кого-то убить, второй уже не бежит назад. Тоже самое если их спавнить по очереди. Консоль пишет что-то типо отслеживаемый юнит удален (не могу сейчас кинуть скрин).

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