Сповіщення
Очистити все

Як заспавнити труп?


Ранг:
Майстер
Роль:
Гість
Записи:
752
Приєднався:
2 роки тому
 

в ТЧ

Спавнимо НПС. Можливо, зроблю про це окремий пост та скину в коментарі сюди, якщо вже його не зробив.
тільки замість health = 1 та upd:health = 1
ставимо health = 0 та upd:health = 0

У ТЧ теж є метод для спавна трупа:

 
local obj = alife ( ) :create ( "stalker" , pos, lvid, gvid )   -- позиція та вертекси 
obj:on_death ( )
 

в ЧН

Можна так само, як і в ТЧ. Або без редагування all.spawn :
Створити НПС, додати його до character_desc_**.xml , npc_profile.xml і spawn_sections.ltx
В останньому файлі ( spawn_sections.ltx ) додати НПС свою логіку.

[ID_непися]:stalker
$spawn = "respawn\ID_непися"
character_profile = ID_непися ;из character_desc_**.xml
custom_data = scripts\скриптовая_логика_нпс.ltx ;из gamedata\configs\scripts\

у gamedata\configs\scripts\ створити логіку для нашого мерця:

 
[logic]
active = walker@1
 
[walker@1]
path_walk = где_стоит
path_look = куда_смотрит
combat_ignore_cond = true
on_info = %=kill_npc()%

Можна також зробити, щоб НПС помер після видачі інфопорції:

[logic]
active = walker@1
 
[walker@1]
path_walk = где_стоит
path_look = куда_смотрит
combat_ignore_cond = true
on_info = {+инфопорция} %=kill_npc()%

у ЗП

У ЗП для цього є навіть спеціальна функція. Знаходиться вона в xr_effects.script :

function spawn_corpse(actor, obj, p)
		--' p[1] - секция кого спаунить
		--' p[2] - имя патрульного пути где спаунить.
	local spawn_sect = p[1]
	if spawn_sect == nil then
		abort("Wrong spawn section for 'spawn_corpse' function %s. For object %s", tostring(spawn_sect), obj:name())
	end
 
	local path_name = p[2]
	if path_name == nil then
		abort("Wrong path_name for 'spawn_corpse' function %s. For object %s", tostring(path_name), obj:name())
	end
 
	if not level.patrol_path_exists(path_name) then
		abort("Path %s doesnt exist. Function 'spawn_corpse' for object %s ", tostring(path_name), obj:name())
	end
	local ptr = patrol(path_name)
	local index = p[3] or 0
 
	local se_obj = alife():create(spawn_sect,
									ptr:point(index),
									ptr:level_vertex_id(0),
									ptr:game_vertex_id(0))
	se_obj:kill()
end

Якщо викликати через логіку, має таку структуру:

=spawn_corpse(ID_непися:walk_поинт_для_спавна)

На прикладі рестриктора:
Спавн від початку гри

[logic]
active = sr_idle
 
[sr_idle]
on_info = sr_idle@end %=spawn_corpse(ID_непися:walk_поинт_для_спавна)%
 
[sr_idle@end]

Або спавн після видачі певної інфопорції

[logic]
active = sr_idle
 
[sr_idle]
on_info = {+инфопорция} sr_idle@end %=spawn_corpse(ID_непися:walk_поинт_для_спавна)%
 
[sr_idle@end]

Універсальний спосіб

Все дуже просто. Створюємо стандартну функцію спавна:

function test_corpse_spawn()
alife():create("ID_НПС",vector():set(x,y,z),lvid,gvid)
end

x, y, z, lvid, gvid - координати І дописуємо до рядка сповна значення :on_death() :

function test_corpse_spawn
alife():create("ID_НПС",vector():set(x,y,z),lvid,gvid):on_death()
end

   
Vasco da Gama відреагував
Цитата