Перейти к контенту
Senator

Создание и настройка моделей NPC

Рекомендуемые сообщения

Привет!Как перенести персонажа из игры на движке Source(типа css,half life,left 4 dead) в сталкер тч или чн/зп?

Ну, да поможет Вам F1, да сохранит Вас F2, во имя Control`а, Alt`а и святого Delet`а. Enter.

Ссылка на комментарий

@Котошметик [YouTube]

привет! Долго и упорно допривязывая, что не привяжется от иного скелета (Source) к Сталкеру. Это если кратчайшим путем, либо полная перепривязка, делается в любом удобном 3Д редакторе. Знание Фотошопа, чтобы исходники для бампа сделать. Знание СДК с настройкой моделей и текстур. https://www.youtube.com/results?search_query=Привязка+меши+НПС+к+костям+сталкера

  • Спасибо 1
  • Полезно 1

ed_rez.gif

c1f11b67ff360413e81b4e4dcf21eb41.jpg

Ссылка на комментарий

Пипл,хэлп!У меня после переноса монолитовца в тяжёлом бронекостюме из ЗП в ТЧ я словил вылет. Вот часть лога :

Скрытый текст

[error]Expression    : fatal error
[error]Function      : CSkeletonX::_Load
[error]File          : E:\stalker\sources\trunk\xr_3da\SkeletonX.cpp
[error]Line          : 380
[error]Description   : <no expression>
[error]Arguments     : Invalid vertex type in skinned model 'actors\neytral\stalker_neytral_balon_1:1'

Я делал по этому гайду.

Ну, да поможет Вам F1, да сохранит Вас F2, во имя Control`а, Alt`а и святого Delet`а. Enter.

Ссылка на комментарий

@Котошметик [YouTube], а ты его в каком СДК делал? Для ТЧ или для ЗП? Для каждой версии игры - свой СДК нужен.

Ссылка на комментарий

Пытался перенести Лесника из ЧН в ТЧ (раньше переносил НПС из ЗП в ТЧ с ЗПшными анимками - работали), перегнал модель Лесника через СДК 0.4, анимки все в омф файле (от ЧН), в СДК анимки на НПС работают. Добавил анимки в mob_trader.script

Скрытый текст

----------------------------------------------------------------------------------------------------
-- mob_trader
----------------------------------------------------------------------------------------------------
global_animations = {
	desk_idle				= {"idle","idle_1","palci","zatylok"},
	desk_talk				= {"idle","idle_1"},
	desk_to_chair_hack		= {"idle_spinka"},
	desk_to_listen			= {"idle_chitaet"},
	desk_to_diagonal		= {"perehod_0"},
	
	chair_hack_idle			= {"idle_2","idle_2_def_0"},
	chair_hack_talk			= {"idle_2_talk_0","idle_2_talk_1","idle_2_talk_2","idle_2_talk_3"},
	chair_hack_to_diagonal	= {"idle_2_to_idle_0"},
	chair_hack_to_desk		= {"spinka_idle"},
	
	compute_idle				= {"idle_1_spec_think_0","idle_1_spec_think_1"},
	compute_idle_to_diagonal	= {"idle_1_to_idle_0"},
	
	diagonal_idle			= {"idle_0_def_0","idle_0_spec_click_0","idle_0_spec_scratch_0"},
	diagonal_idle_short		= {"idle_0_def_0"},
	diagonal_talk			= {"idle_0_talk_0","idle_0_talk_1","idle_0_talk_2","idle_0_talk_3"},
	diagonal_to_chair_hack	= {"idle_0_to_idle_2"},
	diagonal_to_compute		= {"idle_0_to_idle_1"},
	diagonal_to_desk		= {"perehod_1"},
		
	first_phrase			= {"vstuplenie"},
	
	listen_idle				= {"chitaet"},
	listen_to_desk			= {"chitaet_idle"},
	
	hello				= {"hello"},

	forester_sit                 = {"sit"},
    forester_beard                = {"beard_in","beard","beard_out"},
    forester_reaction        = {"reaction_in","reaction","reaction_out"},
    forester_see                = {"see_in","see","see_out"},
    forester_talk_1                = {"sit_talk_1_in","sit_talk_1","sit_talk_1_out"},
    forester_talk_2                = {"sit_talk_2_in","sit_talk_2","sit_talk_2_out"},
    forester_talk_3                = {"sit_talk_3_in","sit_talk_3","sit_talk_3_out"}	
}

head_animations = {
	normal			= {"talk_0","talk_1","talk_4"}, 
	angry			= {"talk_3","talk_2","talk_1"},
	good			= {"talk_glad_0"},
	first_phrase	= {"vstuplenie_head"},
	forester_talk_1    		= {"sit_talk_1_in","sit_talk_1","sit_talk_1_out"},
	forester_talk_2    = {"sit_talk_2_in","sit_talk_2","sit_talk_2_out"},
	forester_talk_3    = {"sit_talk_3_in","sit_talk_3","sit_talk_3_out"},
	forester_reaction        = {"reaction_in","reaction","reaction_out"}
}

----------------------------------------------------------------------------------------------------
function on_start_tutorial_item_1()
	if db.trader == nil then return end
	
	db.trader:external_sound_start("characters_voice\\scenario\\trader\\trader_tutorial_pda_12")
end

function on_stop_tutorial_item()
	if db.trader == nil then return end
	db.trader:external_sound_stop()
end
----------------------------------------------------------------------------------------------------

class "mob_trader"

function mob_trader:__init(obj, storage)
	self.object = obj
	self.st		= storage
end

function mob_trader:reset_scheme()
	trader_obj = self.object

	self.st.signals = {}
	
	self.object:set_callback(callback.trader_global_anim_request, self.on_global_anim_request, self )
	self.object:set_callback(callback.trader_head_anim_request, self.on_head_anim_request, self )
	self.object:set_callback(callback.trader_sound_end, self.on_sound_end, self )

	-- start global animation
	self.object:set_trader_global_anim(self:select_global_animation())
	
	-- start sound and head animation
	if (self.st.sound_phrase) then 
		local snd = mob_sound.pick_sound_from_set(self.object, self.st.sound_phrase, {})
		self.object:set_trader_sound(snd, self:select_head_animation());
	end
	
	if self.st.anim_head == nil then
		self.st.anim_head = "normal"
	end
	
	db.trader = self.object
end

function mob_trader:update(delta)
	if xr_logic.try_switch_to_another_section(self.object, self.st, db.actor) then
		return
	end
end

---------------------------------------------------------------------------------------------------------------------
function mob_trader:select_global_animation()
	local anim_set = global_animations[self.st.anim_global]
    local r = math.random(1, table.getn(anim_set))
	return anim_set[r]
end

function mob_trader:select_head_animation()
	-- random select 
	local anim_set = head_animations[self.st.anim_head]
    local r = math.random(1, table.getn(anim_set))
	return anim_set[r]	
end

---------------------------------------------------------------------------------------------------------------------

function mob_trader:on_global_anim_request()
	self.st.signals["animation_end"] = true	
	
	if (not self.st.play_once) then
		self.object:set_trader_global_anim(self:select_global_animation())
	end
end

function mob_trader:on_head_anim_request()
	if self.st.anim_head == nil then return end
		
	self.object:set_trader_head_anim(self:select_head_animation());
end

function mob_trader:on_sound_end()
	self.st.signals["sound_phrase_end"] = true	
end
---------------------------------------------------------------------------------------------------------------------
function mob_trader:deactivate()
	self.object:set_callback(callback.trader_global_anim_request, nil )
	self.object:set_callback(callback.trader_head_anim_request, nil )
	self.object:set_callback(callback.trader_sound_end, nil )
	self.st.signals = {}
	db.trader		= nil
end

---------------------------------------------------------------------------------------------------------------------
function add_to_binder(npc, ini, scheme, section, storage)
	printf("DEBUG: add_to_binder: npc:name()='%s', scheme='%s', section='%s'", npc:name(), scheme, section)

	local new_action = mob_trader(npc, storage)

	-- Зарегистрировать все actions, в которых должен быть вызван метод reset_scheme при изменении настроек схемы:
	xr_logic.subscribe_action_for_events(npc, storage, new_action)
end

function set_scheme(npc, ini, scheme, section, gulag_name)
	local st	= xr_logic.assign_storage_and_bind(npc, ini, scheme, section)
	st.logic	= xr_logic.cfg_get_switch_conditions(ini, section, npc)

	st.anim_global    = utils.cfg_get_string(ini, section, "anim_global", npc, true,  "")
	st.can_talk		  = utils.cfg_get_bool(ini,   section, "can_talk",    npc, false, true)
	st.tip_text		  = utils.cfg_get_string(ini, section, "tip_text",    npc, false, "", "character_use")
	if st.tip_text == nil then
		st.tip_text = ""
	end
	npc:set_tip_text(st.tip_text)
	
	if (ini:line_exist( section, "sound_phrase")) then
		st.anim_head	= utils.cfg_get_string(ini, section, "anim_head", npc, false, "")
		st.sound_phrase	= utils.cfg_get_string(ini, section, "sound_phrase", npc, false, "")
	else
		st.anim_head	= nil
		st.sound_phrase	= nil
	end
	
	
	--' check if play once animation
	st.play_once = false
	if (ini:line_exist( section, "on_signal")) then
		local str = utils.cfg_get_string(ini, section, "on_signal", npc, false, "")
		local par = utils.parse_params(str)
		if par[1] == "animation_end" then
			st.play_once = true
		end
	end

	if st.can_talk == true then
		npc:enable_talk()
	else
		npc:disable_talk()
	end
	
end

 

Спавню в игре и получаю вылет!

Скрытый текст

Expression    : motion_ID.valid()
Function      : CKinematicsAnimated::ID_Cycle
File          : E:\stalker\sources\trunk\xr_3da\SkeletonAnimated.cpp
Line          : 136
Description   : ! MODEL: can't find cycle:
Arguments     : sit

Но анимация "sit" есть в омф и в СДК играет! Пробовал другие анимки - тоже такой вылет.

Внимание! Лесник не НПС, а моб (как Сидорович в ТЧ).

Подскажите в чем кроется ошибка?

Изменено пользователем Graff46
Ссылка на комментарий
2 минуты назад, Graff46 сказал:

перегнал модель Лесника через СДК 0.4

Просто перегнал или перед этим изменил скелет на ТЧ-шный? (Вопрос может быть и ответом)

ed_rez.gif

c1f11b67ff360413e81b4e4dcf21eb41.jpg

Ссылка на комментарий

@ed_rez, Не менял

 

@ed_rez, Моя не внимательность меня погубит! Спавнил Лесника, а скин Сидора был, хотя в секции менял, а как через нет-пакет сменил, так сразу!

8f49c475e4b23341738125991e149aff.jpg

Ссылка на комментарий
17 минут назад, Graff46 сказал:

Не менял

Тогда это объясняет:

29 минут назад, Graff46 сказал:

Лесник не НПС, а моб (как Сидорович в ТЧ).

Странно, а я помню Лесника стоящим и двигающимся у какой-то избушки. Видимо был перенос на сталкерский скелет. 

ed_rez.gif

c1f11b67ff360413e81b4e4dcf21eb41.jpg

Ссылка на комментарий
9 минут назад, ed_rez сказал:

Тогда это объясняет:

Зачем менять скелет, если я омф из ЧН использую  (родную)?

Ссылка на комментарий

@Graff46

тогда смысл перегонять в СДК? Дописать другие файлы настроек косточек?

Мне, к примеру, без разницы в каком СДК компилить модель для ТЧ. Это и ввело меня в путаницу, да еще и думал про сталкерский скелет.

ed_rez.gif

c1f11b67ff360413e81b4e4dcf21eb41.jpg

Ссылка на комментарий
23 часа назад, ed_rez сказал:

тогда смысл перегонять в СДК?

Ну как минимум - шейдер поменять.

 

Мать: ASRock X470 Master SLI. Процессор: AMD Ryzen 9 3900X 12-Core(4200 MHz).
Память: Patriot Memory 3200 C16 Series. DDR4-3200(1600МГц), 16Гбх2(32Гб).
Видео: GeForce GTX 1060 6GB. Блок питания: CoolerMaster 750 Вт. Корпус: Zalman i3 Edge.

Химера конечно сильный хищник, а все держится дома. Чего же ты пришел к ней домой и пытаешься её убить? © Болотный Доктор

Ссылка на комментарий

Логику персонажа смотри. 

http://stalkerin.gameru.net/wiki/index.php?title=Настройка_логики._Часть_1

Изменено пользователем ed_rez
  • Спасибо 1

ed_rez.gif

c1f11b67ff360413e81b4e4dcf21eb41.jpg

Ссылка на комментарий

ИМХО до кучи пути в спавне нужно смотреть.

А по логике - анимки как анимки. Ничего необычного...Всё как у сталкеров))

Изменено пользователем Змея
Ссылка на комментарий
В 07.01.2019 в 04:25, ed_rez сказал:

Мне, к примеру, без разницы в каком СДК компилить модель для ТЧ.

У тебя движек альтернативный? Или есть способ компилить НПС в 0.7 для ТЧ?

Do what thou wilt shall be the whole of the Law.

Ссылка на комментарий

@sto1en

тут не важно какой движок. Важны настройки текстур, а именно шейдеров. Скелет ТЧ отлично съедается СДК ЗП. Галочка HQ geometry не вызывает конфликтов в ТЧ движке. Настройки костей универсальны.

ed_rez.gif

c1f11b67ff360413e81b4e4dcf21eb41.jpg

Ссылка на комментарий

Я компилировал в 0.7 модель под ТЧ. Настройки шейдеров как в 0.4. Скелет - universal.bones подгружал. Компилирует без проблем, но в игре вылет

CSkeletonX::_Load Invalid vertex type in skinned model '%s' , увы.

Do what thou wilt shall be the whole of the Law.

Ссылка на комментарий

Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

Войти
  • Недавно просматривали   0 пользователей

    Ни один зарегистрированный пользователь не просматривает эту страницу.

AMK-Team.ru

×
×
  • Создать...