
frankenshtayn
-
Публикаций
56 -
Зарегистрирован
-
Посещение
Сообщения, опубликованные frankenshtayn
-
-
22 часа назад, StrawFlux сказал:И еще такой вопросик, как запарсить в скрипте строку типа: нужное_значение = тру из лтх файла, именно что бы проверить тру оно или нет, read_if_exists? желательно написать сразу пример функции где идет проверка, а то что-то котелок совсем не варит...
Я делал так:
function check_actor( actor, obj ) local ltx = system_ini() if ( ltx:r_float("actor_condition","max_walk_weight") ~= 60 ) then return true end if ( ltx:r_float("actor","jump_speed") ~= 6.0 ) then return true end return false end
Проверял вес и прыжок ГГ в actor.ltx - если параметры не совпадали с оригиналом, то функция возвращает true
В скрипте указывается секция (actor_condition) и проверяемый параметр из секции (max_walk_weight)
19 часов назад, Pepel сказал:решил иначе - скопировал папки со скриптами, конфигами и текстурами в бэкап, потом удалил геймдату и скопировал ее из оригинала, закинул из бэкапа свои наработки. Всё заработало
Тоже вариант!)
13 часов назад, Stalkervernite сказал:В чем ошибка ? при спавне спавн елемента ошибка такая ---------------------------
Level Editor
---------------------------
External exception 80000003.
---------------------------
ОК
---------------------------1. Ошибки в СДК
2. Отсутствие каких либо библиотек (винду вроде переустанавливал?)
3. Ошибки в редактировании локации
4. Не подходящая фаза Луны). Это не шутка) Иногда (закономерность не обнаружил, но...) после работы в какой-то сторонней программе, чтения новостей в интернете и т.д. и т.п. бывает что СДК на стадии открытия локации зависает наглухо с такой же ошибкой и помогает только диспетчер задач... И это еще не всё - в это же время не запускается Сталкер - т.е. абсолютно любое сохранение и НИ на первой секунде входа в игру виснет намертво без лога и спасает опять же "кантрол+шифт+делейт".
Что характерно - после непродолжительных танцев с бубном, то бишь пары перезагрузок компьютера, или оставление оного в покое например на сутки, всё возвращается в норму - и СДК загружается и работает нормально и Сталкер грузит любое сохранение...
-
1
-
-
В 24.09.2023 в 08:55, Paracetamol сказал:Как сделать, чтобы нпс шёл за актёром, аля компаньён.
Вот так:
СпойлерЗначит так, чтобы не заморачиваться с изменениями, создай скрипт с именем rx_karavan.script (в принципе можно создать и свой скрипт, но тогда в «модулях» нужно будет исправить на имя своего скрипта) в него вставь вот этот код:
----------------------------------------------
class "evaluator_end" (property_evaluator)
function evaluator_end:__init(name,storage) super (nil,name)
self.st = storage
end
function evaluator_end:evaluate()
return not xr_logic.is_active(self.object,self.st)
end
class "evaluator_karavan" (property_evaluator)
function evaluator_karavan:__init(name,storage) super (nil, name)
self.st = storage
end
function evaluator_karavan:evaluate()
return db.actor and xr_logic.is_active(self.object,self.st) and self.st.enabled == true
end
class "action_karavan" (action_base)
function action_karavan:__init(name,storage) super (nil, name)
self.st = storage
end
function action_karavan:initialize()
action_base.initialize(self)
local npc = self.object
npc:set_desired_position()
npc:set_desired_direction()
npc:set_detail_path_type(move.curve)
npc:set_path_type(game_object.level_path)
self.offset = vector():set(math.random()*6-3,0,math.random()*6-3)
self.offset:normalize()
end
function action_karavan:execute()
action_base.execute(self)
local npc = self.object
if xr_logic.try_switch_to_another_section(npc,self.st,db.actor) then
return
end
local dist = db.actor:position():distance_to(npc:position())
local state,look,anim = state_mgr.get_state(npc)
if dist <= self.st.radius then
state,look,anim = self.st.close_state,nil,true
elseif dist < self.st.close_dist then
state,look,anim = self.st.close_state,nil,true
elseif dist >= self.st.faraway_dist then
state,look,anim = self.st.wait_state,nil,true
elseif dist < self.st.near_dist then
state,look,anim = self.st.near_state,nil,true
elseif not (state and state_lib.states[state].movement == move.stand) then
state,look,anim = self.st.faraway_state,nil,true
end
if self.st.look == true and state_lib.states[state].movement == move.stand then
look = true
end
if look == true then
look = {look_object = db.actor}
end
if anim == true then
anim = {animation = true}
end
if state then
state_mgr.set_state(npc,state,nil,nil,look,anim)
end
if state_lib.states[state].movement ~= move.stand then
local vertex_id = level.vertex_in_direction(db.actor:level_vertex_id(),self.offset,self.st.radius)
utils.send_to_nearest_accessible_vertex(npc,vertex_id)
end
end
function action_karavan:finalize()
self.object:clear_animations()
end
prop_karavan = 9651
prop_end = prop_karavan+1
act_karavan = prop_karavan
function add_to_binder(object,char_ini,scheme,section,st)
local manager = object:motivation_action_manager()
manager:add_evaluator(prop_karavan,evaluator_karavan("evaluator_karavan",st))
local action = action_karavan("action_karavan",st)
action:add_precondition(world_property(stalker_ids.property_alive,true))
action:add_precondition(world_property(stalker_ids.property_enemy,false))
action:add_precondition(world_property(stalker_ids.property_danger,false))
xr_motivator.addCommonPrecondition(action)
if watcher_act then
action:add_precondition(world_property(watcher_act.evid_near_stuff,false))
action:add_precondition(world_property(watcher_act.evid_see_body,false))
action:add_precondition(world_property(watcher_act.evid_see_stuff,false))
end
action:add_precondition(world_property(prop_karavan,true))
action:add_effect(world_property(prop_karavan,false))
manager:add_action(act_karavan,action)
local atbl = {xr_actions_id.alife}
for i,id in ipairs(atbl) do
action = manager:action(id)
if action then
action:add_precondition(world_property(prop_karavan,false))
end
end
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.close_dist = utils.cfg_get_number(ini,section,"close_dist",npc,false) or 7
st.near_dist = utils.cfg_get_number(ini,section,"near_dist",npc,false) or 14
st.faraway_dist = utils.cfg_get_number(ini,section,"faraway_dist",npc,false) or 32
st.close_state = utils.cfg_get_string(ini,section,"close_state",npc,false,"") or "guard"
st.near_state = utils.cfg_get_string(ini,section,"near_state",npc,false,"") or "patrol"
st.faraway_state = utils.cfg_get_string(ini,section,"faraway_state",npc,false,"") or "rush"
st.wait_state = utils.cfg_get_string(ini,section,"wait_state",npc,false,"") or "hide"
st.look = utils.cfg_get_bool(ini,section,"look_on_actor",npc,false)
st.radius = utils.cfg_get_number(ini,section,"radius",npc,false) or 4
st.no_loot = utils.cfg_get_bool(ini,section,"no_loot",npc,false)
if st.no_loot ~= true then
st.no_loot = nil
end
st.enabled = true
end
function disable_scheme(npc,scheme)
rx_ai.printf("disable")
local st = db.storage[npc:id()][scheme]
if st then
st.enabled = false
end
end
далее, открой скрипт modules.script и под строками
----------------------------------------------------------------------
-- Загрузка модулей сталкеров:
----------------------------------------------------------------------
if watcher_act then
load_scheme("watcher_act", "watcher_act", stype_stalker)
end
вставь такую строчку:
load_scheme("rx_karavan", "karavan", stype_stalker)
со скриптами все...
Ну и собственно логика персонажа будет выглядеть так:
[smart_terrains]
none = true
[logic]
active = karavan
[karavan]
close_dist = 2
near_dist = 10
faraway_dist = 31
close_state = guard
near_state = rush
faraway_state = sprint
wait_state = rush
look_on_actor = false
radius = 1
combat_ignore_cond = {=fighting_dist_ge(40)} always
no_loot = true
в принципе здесь чувак с самого начала будет бегать за ГГ...Но, если нужно не сразу, а в нужный момент. то логику можно построить примерно так:
[smart_terrains]
none = true
[logic]
active = walker
[walker] ;пока чувак нам не нужен, ходит под валкером по своим путям(стоит, сидит...)
path_walk = snip_naym_walk1
path_look = snip_naym_look1
on_info = {+info} karavan ;при получении инфопоршня, переходим в "караван" и бегим за ГГ
[karavan]
close_dist = 2
near_dist = 10
faraway_dist = 31
close_state = guard
near_state = rush
faraway_state = sprint
wait_state = rush
look_on_actor = false
radius = 1
combat_ignore_cond = {=fighting_dist_ge(40)} always
no_loot = true
on_info = {+info1} walker@prshli ;дошли до места, получили поршень, перешли в другой валкер(стоим, сидим и т.д.)
[walker@prishli]
path_walk = snip_naym_walk2
path_look = snip_naym_look2
Взято из НС, расписано подробнее некуда, кому надо - дерзайте)
-
1
-
1
-
-
В 28.09.2023 в 17:24, RicoNRT сказал:Хочу сделать такой квест.По условию на актере должен быть одет определённый костюм(например куртка бандита.)В чём прикол.Я поставил рестриктор,но от должен работать только в том случае,если на актере надета та самая куртка,в ином же случае, при входе в рестриктор ничего не сработает.
Как то так:
[logic] active = sr_idle [sr_idle] on_actor_inside = {-zashel} %+zashel% sr_idle@in - зашел ГГ, переходим в sr_idle@in [sr_idle@in] on_info = {=check_outfit} sr_idle@da, {!check_outfit} sr_idle@net - проверяем одет нужный костюм или нет, если одет идем в sr_idle@da, если нет идем в sr_idle@net [sr_idle@da] on_info = {+zashel} %+vidayem_info% sr_idle@tm - если одет нужный костюм, выдаем инфо и переходим в схему таймера (выдается инфо vidayem_info из него запускается смс-ка и спавнится бюрер) [sr_idle@net] on_actor_outside = %-zashel% sr_idle - если костюм не одет, ничего не происходит, и при выходе рестриктор возвращается в исходное состояние [sr_idle@tm] type = dec start_value = 60000 -запускаем таймер(время регулируем по себя) on_actor_outside = nil %+slabak% -если вышел до окончания таймера, выдается инфо на провал задания on_value = 0 | sr_idle@tm_da - если гг в рестрикторе и таймер закончился переходим в sr_idle@tm_da [sr_idle@tm_da] on_actor_inside = nil %+molodec% - по окончании таймера и присутствии гг в рестрикторе выдается инфопоршень, по которому делается остальное: засчитывается задание, отбираетс и выдается костюм и т.д. и т.п.
Функция проверки костюма должна лежать в xr_conditions.script и выглядеть так:
function check_outfit() local outfit = db.actor:get_current_outfit() if outfit and outfit:section() == "name_outfit" then return true else return false end end
Дополнено 5 минуты спустяВ 29.09.2023 в 20:22, RicoNRT сказал:Всем привет.На днях переустанавливал виндоус.До переустановки сдк работал прекрасно и без сбоев.Сегодня опять скачал сдк.Как только закидываю геймдату выдаёт ошибку.В чём проблема,геймдата таже.
проверь библиотеки, вроде ругается на KernelBase.dll
-
1
-
-
В 16.09.2023 в 18:04, RicoNRT сказал:Всем привет.Написал функцию,что бы при поднятии предмета выдавался НОВЫЙ квест. Сама функция работает т.к игра не вылетает и не жалуется. На квестовый предмет игра тоже не жалуется т.к я его спокойно подбираю без функции и поршней. Но как только я пытаюся активировать ту самую функцию,вылазит такая ошибка(смотреть фото).В чём может быть проблема.
Зачем такие сложности и замусоривание апдейта?
Можно ведь сделать проще, тем более, что любой мод одним найденным/поднятым предметом явно не обойдется.
Итак, идем в тот же бинд_сталкер, ищем функцию on_item_take и приводим её в такой вид:
local my_info_table = { item_odin = "info_odin", item_dva = "info_dva", item_tri = "info_tri", -------еще пара итем-инфопоршень---------- -------еще пара итем-инфопоршень---------- -------------и так далее------------------ item_stopitsot = "info_stopitsot" } function actor_binder:on_item_take (obj) level_tasks.proceed(self.object) --game_stats.update_take_item (obj, self.object) if my_info_table[obj:section()] then db.actor:give_info_portion( my_info_table[obj:section()]) end end
Что мы имеем?
Здесь, при взятии item_odin получаем инфопоршень "info_odin", при взятии item_dva получаем инфопоршень "info_dva", и так далее в соответствии с таблицей, которую можно заполнять практически бесконечно. Естественно инфопоршни необходимо регистрировать в соответствующем файле info_локация, а уж с выданным инфопоршнем можно творить что угодно - запускать функцию: <action>скрипт.функция</action>, выдавать инфопоршень: <give_info>инфопоршень</give_info>, выдавать задание: <task>идентификатор_задания</task>, и прочее, и почее, и прочее...
Дополнено 19 минуты спустяВ 16.09.2023 в 02:00, Pepel сказал:так выходит это всё-таки из-за аи сетки? а как я теперь ее верну в первоначальное состояние,
блин, просто напросто в свою локацию из оригинальной переместить файлы level.ai, level.gct, level.graf, конечно при условии, что в остальных локациях эти файлы оригинальные, и game.graf тоже
-
В 06.08.2023 в 00:36, ian98 сказал:можно ли отследить урон полученный именно от падения или сам факт приземления?
Ну, как вариант, поставить в нужном месте рестрикор с необходимыми размерами и высотой, ограничить его срабатывание каким либо условием, например инфопоршнем выдаваемым перед тем, как ГГ полезет туда откуда может шмякнутся, и при попадании в него ГГ выполнять то, что нужно. Как-то так:
[logic] active = sr_idle [sr_idle] on_actor_inside = {+gg_polez_kudato} %+gg_shmyaknulsya%
Еще вариант, поставить на апдейт и активировать в нужное время функцию такого плана:
if has_alife_info("gg_polez_kuda_to") and (not has_alife_info("gg_shmyaknulsya"))then actor_position=db.actor:position() if level.name() == "имя_локации" then if actor_position.y < -8 then ---координата ''y'' стоящего на земле ГГ в месте вероятного падения script.function()
Дополнено 1 минуту спустя14 минут назад, imcrazyhoudini сказал:ночная-дневная работа собственно
Так о чем я и говорил с самого начала).
Дополнено 24 минуты спустяВ 05.08.2023 в 13:22, Stalkervernite сказал:Расскажите, как сделать анимацию для камеры
первый спойлер Level Editor пункт 9 "Облет камеры"
-
1
-
-
В 02.08.2023 в 09:51, imcrazyhoudini сказал:а переход из одного состояния в другое сейчас происходит штатно
Гм... Хотелось бы для общего развития узнать, как в таком коде:
t = { section = "logic@esc_atp_bandit_kamp1" idle = 0, prior = 9, state = {0,1}, in_rest = "", out_rest = "", }
со ссылкой на одну логику происходит переход из одного состояния в другое. Нет, в принципе это несложно, если в логике сделать например так:
[logic] active = kamp [kamp] center_point = kamp_center_pusto radius = 1 meet = meet anim = sit_knee on_info = {=is_day} remark@slip [remark@slip] anim = wait no_move = true target = actor on_info2 = {!is_day} kamp
НПС будет днем отрабатывать одну логику, а ночью другую, но смысл городить огород?
Дополнено 0 минут спустя23 часа назад, Stalkervernite сказал:Привет всем, смотрите. Создал смарт для бандитов на Свалке, ну и вообщем написал логику для бандита, когда написал, вылет с ошибкой combat ignore, мол пишит dulicate combat ignore, но до это го я писал логику , ( без смарта, сразу в custom date) было все нормально. Но когда я создал смарт и в gulag garbage написал такую же логику, то вылет. В чем проблема?
чудес не бывает, нужно искать дубликат секции combat ignore
-
16 минут назад, imcrazyhoudini сказал:да а с этим то какие проблемы? всё как в оригинале, 3 одинаковые логики использует и всё отлично работать, зачем кучу дубликатов создавать
Так чтобы не путаться) Ну в принципе моё дело предложить, я не настаиваю)
21 минуту назад, imcrazyhoudini сказал:пример с оригинала например: гулаг esc_specnaz
Гм... И? Если мне память не отшибает, то у них у всех всего одно состояние, и они все кемперы, то бишь тусуются кучкой вокруг одной общей точки.
-
7 минут назад, N42 сказал:frankenshtayn у тебя самого на скрине в db0 4 папки только
Дополнено 0 минут спустяОригинальный этот архив посмотри
Так эти 4 папки и весят 678 мГ, так же как и архив db0
-
13 минут назад, imcrazyhoudini сказал:да у меня такой же код
ещё раз попробовал - уже в оффлайн никто не уходит, странная херняРазве? В скрипте для обоих состояний одна и та же логика, причем секции дублируются, например
t = { section = "logic@esc_atp_bandit_kamp1" idle = 0, prior = 9, state = {0,1}, in_rest = "", out_rest = "", } t = { section = "logic@esc_atp_bandit_kamp1" idle = 0, prior = 9, state = {0,1}, in_rest = "", out_rest = "", }
Чем они отличаются? Для чего это дублирование? Почему для обоих состояний 0 и 1 одна и та же логика?
По идее тут должен быть вылет, ибо игра вряд ли может понять "кто есть кто", и кто что должен делать.
Посмотри внимательнее, как сделано у меня - для каждого НПС в скрипте отдельный код для каждого состояния с ссылкой на РАЗНУЮ секцию логики, соответственно в конфиге для каждого НПС две секции логики для каждого состояния. Представь себе - работает)))
-
-
В 31.07.2023 в 16:42, imcrazyhoudini сказал:по идеи нпс должен переходить в другое состояние (день-ночь, ночью спит, днём охраняет), но вместо того чтобы перейти в другое состояние он уходит в оффлайн как править?
Ну может быть задать для каждого состояния то, что он должен делать? Т.е. Для состояния 0 - одна логика, для состояния 1 другая?
Как пример простейшего гулага с двумя состояниями:
гулаг.скрипт:
Спойлерlocal t = {}
function load_job(sj, gname, type, squad, groups)
--'--------------------------------------------------------------------------
--' GARBAGE
--'--------------------------------------------------------------------------
-------------------------------------------------------------------------------------------
----------первый--------------
if type == "sv_st_smart_terrain" then
t = { section = "logic@sv_st_smart_terrain_walker1",
idle = 0,
prior = 5, state = {0},
online = true,
in_rest = "", out_rest = "",
}
table.insert(sj, t)
endif type == "sv_st_smart_terrain" then
t = { section = "logic@sv_st_smart_terrain_kamp1",
idle = 0,
prior = 5, state = {1},
online = true,
in_rest = "", out_rest = "",
}
table.insert(sj, t)
end----------второй-----------
if type == "sv_st_smart_terrain" then
t = { section = "logic@sv_st_smart_terrain_walker2",
idle = 0,
prior = 5, state = {0},
online = true,
in_rest = "", out_rest = "",
}
table.insert(sj, t)
endif type == "sv_st_smart_terrain" then
t = { section = "logic@sv_st_smart_terrain_kamp2",
idle = 0,
prior = 5, state = {1},
online = true,
in_rest = "", out_rest = "",
}
table.insert(sj, t)
end------третий-------------
if type == "sv_st_smart_terrain" then
t = { section = "logic@sv_st_smart_terrain_walker3",
idle = 0,
prior = 5, state = {0},
online = true,
in_rest = "", out_rest = "",
}
table.insert(sj, t)
endif type == "sv_st_smart_terrain" then
t = { section = "logic@sv_st_smart_terrain_sleeper",
idle = 0,
prior = 5, state = {1},
online = true,
in_rest = "", out_rest = "",
}
table.insert(sj, t)
end
end
function load_states(gname, type)
if type == "sv_st_smart_terrain" then
return function(gulag)
if db.actor ~= nil then
if ( level.get_time_hours() >= 5 and level.get_time_hours() <= 22 ) then
return 0 -- день
else
return 1 -- ночь
end
else
return gulag.state
end
end
end
end--------------------------------------------------------------------------
-- Dynamic ltx
--------------------------------------------------------------------------
function load_ltx(gname, type)
return nil
endfunction checkStalker(npc_community, gulag_type, npc_rank, se_obj)
---------
if gulag_type == "sv_st_smart_terrain" then
return npc_community == "stalker"
end
return false
endfunction checkMonster(npc_community, gulag_type)
if gulag_type == "gar_boars_nest2" then
return npc_community == "boar"
end
if gulag_type == "gar_boars_nest" then
return npc_community == "boar"
end
if gulag_type == "gar_nest_flesh" then
return npc_community == "flesh"
end
if gulag_type == "gar_dogs_nest" then
return npc_community == "dog"
end
if gulag_type == "gar_dogs_nest2" then
return npc_community == "dog"
end
return false
endгулаг.лтх:
Спойлер;;;---------------------------------------------------
;;;-- сталкер1 walker 0, днем)
[logic@sv_st_smart_terrain_walker1]
active = walker@odin_hodit
on_hit = hit_w[hit_w]
on_info = %=zasada_spawn%
[walker@odin_hodit]
path_walk = odin_walk
danger = danger_condition
def_state_moving1 = patrol
def_state_moving2 = patrol
def_state_moving3 = patrol
meet = meet
;;;-- сталкер1 kamp 1, ночью)
[logic@sv_st_smart_terrain_kamp1]
active = kamp@odin_sidit
on_hit = hit_k[hit_k]
on_info = %=zasada_spawn%
[kamp@odin_sidit]
center_point = pole_kamp
meet = no_meet
;;;----------------------------------------------------------------
;;;-- сталкер2 walker 0, днем)
[logic@sv_st_smart_terrain_walker2]
active = walker@dva_hodit
[walker@dva_hodit]
path_walk = dva_walk
danger = danger_condition
def_state_moving1 = patrol
def_state_moving2 = patrol
def_state_moving3 = patrol
meet = meet
;;;-- сталкер2 kamp 1, ночью)
[logic@sv_st_smart_terrain_kamp2]
active = kamp@dva_sidit
[kamp@dva_sidit]
center_point = pole_kamp
meet = no_meet
;;;----------------------------------------------------------------------------
;;;-- сталкер3 walker 0, днем)
[logic@sv_st_smart_terrain_walker3]
active = kamp@tri_sidit
[kamp@tri_sidit]
center_point = pole_kamp
meet = meet
;-- сталкер3 sleeper 1, ночью)
[logic@sv_st_smart_terrain_sleeper]
active = sleeper@tri_slip
[sleeper@tri_slip]
path_main = moy_sleep
wakeable = false
meet = no_meetИ всё нормально работает:
-
В 30.07.2023 в 15:22, N42 сказал:он разбивает архивы? В самом первом есть папка sounds?
sounds есть в 4 и 5 архиве. Проблема не в этом, повторю "условие
задачизагадки"):- При наличии в корне игры папки gamedata, и отсутствии db-архивов (gamedata.db0-gamedata.dbb удалены, их нет в корне игры) - всё нормально, игра запускается, работает. Проблема начинается после упаковки геймдаты в db-архивы. Причем поисковик показывает, что эти файлы присутствуют по указанному в вылетах пути.
В 31.07.2023 в 03:01, CiberZold сказал:frankenshtayn для распаковки и запаковки ТЧ архивов самый лучший это проверенный временем конвертер от Бардака, всё остальное дилетантская васня)
Так с него и начинал) А вообще, пробовал разными конвертерами.
ПС. Вообще склоняюсь в сторону "криворукости", хотя не понимаю каким образом - если кидаю свои звуки, модели, шейдеры в геймдату и упаковываю её в архивы, а скрипты, конфиги, аллспавн и т.д. в отдельный архив, то начинаются танцы с вылетами по
[error]Description : Can't open wave file: [error]Arguments : d:\game\stalker\s.t.a.l.k.e.r. - shadow of hernobyl\gamedata\sounds\material\human\step\tmp_default4.ogg
А вот если оригинал (урезанный) упаковать отдельно, а мои все файлы отдельно, то всё работает.
-
5 часов назад, Mass сказал:Решение напрашивается само собой. Поменять распаковщик, делово то
Смутил тот момент, что если не трогать архивы ТЧ, а тупо упаковать геймдату с изменениями, обозвать типа *.dbz, (Во вносимых изменениях есть и добавленные звуки), и добавить в корень игры, то почему-то всё работает)
Возможно конечно и распаковщик, однако для распаковки после возникновения проблемы пробовал и STALKER_Data_Unpacker_RU и S.T.A.L.K.E.R. UE и Распаковщик + Упаковщик db архивов XrCompress от 11.02.2016 для ТЧ, ЧН, ЗП. В общем пока загадка)
58 минут назад, N42 сказал:посмотри, может у упаковщика есть конфиг, и там прописаны ogg в исключения
[options] exclude_exts = *.log,*.old,*.back bytes = 2 [include_folders] .\ = true ai = true anims = true configs = true levels = true meshes = true scripts = true shaders = true sounds = true spawns = true textures = true [exclude_folders] [include_files] .\ = true game.graph = true gamemtl.xr = true lanims.xr = true particles.xr = true resource.h = true senvironment.xr = true shaders.xr = true shaders_xrlc.xr = true stalkergame.inf = true [header] auto_load = true level_name = single level_ver = 1.0 entry_point = $fs_root$\gamedata\ creator = "gsc game world" link = "www.gsc-game.com"
Это файл datapack.ltx в упаковщике.
-
[error]Expression : wave&&wave->length() [error]Function : CSoundRender_Source::LoadWave [error]File : E:\stalker\patch_1_0004\xrSound\SoundRender_Source_loader.cpp [error]Line : 65 [error]Description : Can't open wave file: [error]Arguments : d:\game\stalker\s.t.a.l.k.e.r. - shadow of hernobyl\gamedata\sounds\material\human\step\tmp_default4.ogg
Файл tmp_default4.ogg имеется в db-архиве.
Делалось - распаковывались архивы, в папку gamedata вносились изменения, добавление нужного и удаление лишнего. Распакованная геймдата работает (при этом из корня удалены все оригинальные db-архивы), вылет происходит только после упаковки геймдаты.
ПС. Причем не упаковываются только звуки, т.к. при добавлении в корень игры папки gmedata/sounds со звуками, всё работает.
ПС. Пользовался Распаковщик + Упаковщик db архивов XrCompress от 11.02.2016 для ТЧ, ЧН, ЗП
-
В 20.07.2023 в 06:54, *lusky* сказал:Интересует вот какой вопрос. Хочу изменить квестовый предмет, например оружие которое нужно найти. В файле all.spawn я изменил его визуальное отображение. И когда я его нахожу визуал изменился, а описание и иконка остались прежними. Где править чтобы поменялось описание и иконка?
Найти в gamedata\config\weapons секцию необходимого оружия (например wpn_bm16). В этой секции найти строки
description = enc_weapons1_wpn-bm16
скопировать enc_weapons1_wpn-bm16 и идти по пути gamedata\config\text\rus и через поисковик найти нужный файл (это наверняка будет enc_weapons1_wpn-bm16) в этом файле так же через поиск найти описание нужного девайса, например enc_weapons1_wpn-bm16 в оригинале находится в файле enc_weapons1_wpn-bm16 в строке под номером 270:
Цитата<string id="enc_weapons1_wpn-bm16">
<text>Обрез охотничьего ружья ВМ 17. Значительно компактней и легче новой двустволки, но эффективен только в ближнем бою. Один из самых распространённых видов оружия у новичков.\n Боеприпасы:\n 12х70 дробь,\n 12x76 жекан,\n 12x76 дротик.</text>
</string>За иконку девайса отвечают строки:
inv_grid_width = 3 inv_grid_height = 1 inv_grid_x = 6 inv_grid_y = 1
в конфиге оружия. Это ссылка на ддс-файл ui_icon_equipment по пути gamedata\textures\ui\
Следовательно надо создать свою иконку, добавить её в файл ui_icon_equipment.dds и в конфиг оружия вставить нужные координаты, по примеру обреза (3 и 1 это количество "клеток" занимаемым иконкой в файле, 6 и 1 это начало координат иконки в файле):
-
20 часов назад, imcrazyhoudini сказал:[smart_terrains]
esc_kamp = {-nachalo_done}
esc_fabrika_bandit = {+nachalo_done}
слегка поправлю:
[smart_terrains] esc_kamp = {-nachalo_done} true esc_fabrika_bandit = {+nachalo_done} true
-
2
-
-
Здравствуйте. Образовалась проблема. Возникла необходимость немного изменить ограждение локации. Взял файл локация_fake.obgect, перегнал в ogg, открыл в Милке, где-то чутка увеличил, где-то слегка передвинул, ничего не удалял и не добавлял, экспортировал в .object. Загрузил локацию, скомпилировал сектор, порталы, сбилдил, запустил компиляцию (на драфте для "посмотреть"). На стадии Converting to OGFs... возникли две ошибки такого плана:
FATAL ERROR [error]Expression : assertion failed [error]Function : OGF::Optimize [error]File : I:\xray-svn\xrLC\OGF_Face.cpp [error]Line : 153 [error]Description : x_faces.size() == faces.size()
ошибки пока проигнорировал, локация скомпилировалась, но... в игре происходит бяка, причем постоянно в одном и том же месте:
Что это? Что-то с сектором или порталами? Почему только здесь? Как с этим бороться?
-
В 12.07.2023 в 13:30, imcrazyhoudini сказал:Stalkervernite у логики есть минус, она работает в пределах алайфа, то есть если тебе надо нпс перегнать с одной части локацию в противоположную, то надо чтобы он в онлайне был, но это тоже решаемо
Не совсем верно, вот часть кода НПС из аллспавна:
[1820] ; cse_abstract properties section_name = stalker_0012 name = tirpic position = -19.1746063232422,15.5646266937256,-147.488845825195 direction = -0.489549994468689,0,-0.871975004673004 ; cse_alife_trader_abstract properties money = 5000 character_profile = npc_tirpic ; cse_alife_object properties game_vertex_id = 2119 distance = 3.5 level_vertex_id = 80698 object_flags = 0xffffff7b custom_data = <<END
Все зависит от флага, например в указанном примере у НПС установлен флаг:
object_flags = 0xffffff7b
И этот НПС прекрасно отрабатывает логику (именно логику, а не смарт) даже в оффлайне. Т.е. можно на одном конце локации поговорить с ним, выдать поршень на переход в другую схему логики, отправляющую его на противоположный край, и смело отправляться туда куда он должен прийти, оставив его далеко позади и в оффлайне. Через некоторое время он придет в нужное место самостоятельно.
Дополнено 38 минуты спустяВ 12.07.2023 в 13:32, Stalkervernite сказал:imcrazyhoudini Насчет того что ты щас сказал я знал) Но она как минимум лучше смарта со смарта, хочу сделать сцену в моде, который щас в разработке, типо нпс с одной точке, перебираются в другую. А грамотна не получается сделать.
Всё достаточно просто. Например есть простейшая логика логика:
[logic] active = walker@tirpic_stroy ;;;; обьявляем активную секцию логики combat_ignore = combat_ignore [walker@tirpic_stroy] ;;;; активная секция логики path_walk = tirpic_walk ;;; нпс стоит в этой точке path_look = tirpic_look ;;; нпс смотрит в эту точку combat_ignore_cond = always ;;;; игнорирует любую опасность (это не обязательно))) можно в него даже стрелять, не ответит danger = danger_condition show_spot = false ;;; не отображается на миникарте on_info = {+mogno_topat} walker@go_tochka_a ;;;; при получении инфопоршня "+mogno_topat" нпс переходит в секцию логики "walker@go_tochka_a" [walker@go_tochka_a] ;;;; перешли сюда path_walk = tirpic_go_walk ;;;; топает в эту точку path_look = tirpic_go_look ;;;; смотрим в эту точку meet = no_meet combat_ignore_cond = always on_signal = tirpic_mesto| %+s_pribitiem% walker@tirpic_na_a ;;;; при получении сигнала (прописывается либо в точках ***_walk, либо в точках ***_look "tirpic_mesto" выдается инфопоршень "s_pribitiem" и нпс переходит в секцию логики "walker@tirpic_na_a" [walker@tirpic_na_a] ;;;; перешли сюда path_walk = tirpic_sid_walk ;;;; дотопали в эту точку path_look = tirpic_sid_look ;;;; смотрит в эту точку combat_ignore_cond = always meet = meet on_info = {+vtoroy_tochka_da} walker@tirpic_tochka_b ;;;; при получении инфопоршня "vtoroy_tochka_da" переходим в секцию логики "walker@tirpic_tochka_b" [walker@tirpic_tochka_b] ;;;; перешли сюда path_walk = tirpic_walk_b ;;;;; дотопали в эту точку path_look = tirpic_look_b ;;;; смотрим в эту точку combat_ignore_cond = always on_actor_dist_le_nvis = 7|remark@talk ;;;; при приближении гг на 7 метров к нпс он переходит в секцию логики "remark@talk" meet = no_meet [remark@talk] ;;;; перешли сюда anim = wait_trade ;;;; нпс отыгрывает анимацию target = actor ;;;; нпс смотрит на гг meet = meet on_actor_dist_ge = 7|walker@tirpic_tochka_b ;;;; при отходе гг от нпс на 7 метров, он возвращается в секцию логики "walker@tirpic_tochka_b"
В общем, немного знаний и упорства, и с нпс можно творить практически всё, что угодно - заставить его ходить или сидеть, бегать или играть на гитаре, есть, пить, отыгрывать анимации и т.д. и т.п.
-
1
-
-
Я давал ссылочку на вики, там можно найти всё, что угодно. Но как пример.....
Аллспавн алайф_локация:
Спойлер[14]
; cse_abstract properties
section_name = smart_terrain
name = sv_st_smart_terrain
position = 217.50959777832,-1.94939196109772,176.110565185547
direction = 0,0,0; cse_alife_object properties
game_vertex_id = 378
distance = 24.5
level_vertex_id = 354113
object_flags = 0xffffff3e
custom_data = <<END
[smart_terrain]
type = sv_st_smart_terrain
capacity = 3
END; cse_shape properties
shapes = shape0
shape0:type = sphere
shape0:offset = 0,0,0
shape0:radius = 3.71439838409424; cse_alife_space_restrictor properties
restrictor_type = 3; se_smart_terrain properties
[15]
; cse_abstract properties
section_name = stalker
name = sv_st_smart_terrain00
position = 218.50959777832,-1.94939196109772,177.110565185547
direction = -0.327957004308701,0,0.944693028926849; cse_alife_trader_abstract properties
money = 5000
character_profile = esc_stalker_novice; cse_alife_object properties
game_vertex_id = 378
distance = 4.19999980926514
level_vertex_id = 354113
object_flags = 0xffffffbf
custom_data = <<END
[smart_terrains]
sv_st_smart_terrain = true
END; cse_visual properties
visual_name = actors\novice\green_stalker_2; cse_alife_creature_abstract properties
g_team = 0
g_squad = 0
g_group = 0
health = 1
dynamic_out_restrictions =
dynamic_in_restrictions =upd:health = 1
upd:timestamp = 0
upd:creature_flags = 0
upd:position = 218.50959777832,-1.94939196109772,177.110565185547
upd:o_model = 0
upd:o_torso = 0.533530831336975,-0.000744261255022138,0
upd:g_team = 0
upd:g_squad = 0
upd:g_group = 0; cse_alife_monster_abstract properties
upd:next_game_vertex_id = 65535
upd:prev_game_vertex_id = 65535
upd:distance_from_point = 0
upd:distance_to_point = 0; cse_alife_human_abstract properties
predicate5 = 1,0,0,2,1
predicate4 = 1,1,0,1; cse_ph_skeleton properties
upd:start_dialog =
; se_stalker properties
[16]
; cse_abstract properties
section_name = stalker
name = sv_st_smart_terrain01
position = 219.50959777832,-1.94939196109772,178.110565185547
direction = -0.327957004308701,0,0.944693028926849; cse_alife_trader_abstract properties
money = 5000
character_profile = esc_stalker_novice; cse_alife_object properties
game_vertex_id = 378
distance = 4.19999980926514
level_vertex_id = 354113
object_flags = 0xffffffbf
custom_data = <<END
[smart_terrains]
sv_st_smart_terrain = true
END; cse_visual properties
visual_name = actors\novice\green_stalker_2; cse_alife_creature_abstract properties
g_team = 0
g_squad = 0
g_group = 0
health = 1
dynamic_out_restrictions =
dynamic_in_restrictions =upd:health = 1
upd:timestamp = 0
upd:creature_flags = 0
upd:position = 219.50959777832,-1.94939196109772,178.110565185547
upd:o_model = 0
upd:o_torso = 0.533530831336975,-0.000744261255022138,0
upd:g_team = 0
upd:g_squad = 0
upd:g_group = 0; cse_alife_monster_abstract properties
upd:next_game_vertex_id = 65535
upd:prev_game_vertex_id = 65535
upd:distance_from_point = 0
upd:distance_to_point = 0; cse_alife_human_abstract properties
predicate5 = 1,0,0,2,1
predicate4 = 1,1,0,1; cse_ph_skeleton properties
upd:start_dialog =
; se_stalker properties
[17]
; cse_abstract properties
section_name = stalker
name = sv_st_smart_terrain02
position = 220.50959777832,-1.94939196109772,179.110565185547
direction = -0.327957004308701,0,0.944693028926849; cse_alife_trader_abstract properties
money = 5000
character_profile = esc_stalker_novice; cse_alife_object properties
game_vertex_id = 378
distance = 4.19999980926514
level_vertex_id = 354113
object_flags = 0xffffffbf
custom_data = <<END
[smart_terrains]
sv_st_smart_terrain = true
END; cse_visual properties
visual_name = actors\novice\green_stalker_2; cse_alife_creature_abstract properties
g_team = 0
g_squad = 0
g_group = 0
health = 1
dynamic_out_restrictions =
dynamic_in_restrictions =upd:health = 1
upd:timestamp = 0
upd:creature_flags = 0
upd:position = 220.50959777832,-1.94939196109772,179.110565185547
upd:o_model = 0
upd:o_torso = 0.533530831336975,-0.000744261255022138,0
upd:g_team = 0
upd:g_squad = 0
upd:g_group = 0; cse_alife_monster_abstract properties
upd:next_game_vertex_id = 65535
upd:prev_game_vertex_id = 65535
upd:distance_from_point = 0
upd:distance_to_point = 0; cse_alife_human_abstract properties
predicate5 = 1,0,0,2,1
predicate4 = 1,1,0,1; cse_ph_skeleton properties
upd:start_dialog =
; se_stalker properties
Аллспавн вай_локация:
Спойлер[sv_st_smart_terrain_dva_walk]
points = p0,p1
p0:name = wp00
p0:position = 220.283889770508,-2.02869510650635,175.384140014648
p0:game_vertex_id = 378
p0:level_vertex_id = 355513
p0:links = p1(1)p1:name = wp01
p1:position = 232.254119873047,-1.04941594600677,167.089828491211
p1:game_vertex_id = 381
p1:level_vertex_id = 368817
p1:links = p0(1)
[sv_st_smart_terrain_moy_sleep]
points = p0,p1
p0:name = wp00
p0:position = 214.50959777832,-1.94939196109772,173.110565185547
p0:game_vertex_id = 378
p0:level_vertex_id = 354113p1:name = wp01
p1:position = 214.50959777832,-1.94939196109772,172.110565185547
p1:game_vertex_id = 378
p1:level_vertex_id = 354113
p1:links = p0(1)
[sv_st_smart_terrain_odin_walk]
points = p0,p1,p2
p0:name = wp00
p0:position = 216.906387329102,-1.92757797241211,175.720275878906
p0:game_vertex_id = 378
p0:level_vertex_id = 353756
p0:links = p1(1)p1:name = wp01
p1:position = 203.708618164063,-1.05473899841309,171.603408813477
p1:game_vertex_id = 378
p1:level_vertex_id = 345806
p1:links = p2(1)p2:name = wp02
p2:position = 204.927429199219,-2.01750707626343,180.354019165039
p2:game_vertex_id = 378
p2:level_vertex_id = 346710
p2:links = p0(1)
[sv_st_smart_terrain_pole_kamp]
points = p0
p0:name = wp00|s=state
p0:position = 216.50959777832,-1.94939196109772,175.110565185547
p0:game_vertex_id = 378
p0:level_vertex_id = 354113
gulag_локация.script:
Спойлерlocal t = {}
function load_job(sj, gname, type, squad, groups)
--'--------------------------------------------------------------------------
--' GARBAGE
--'-------------------------------------------------------------------------------первый---------
if type == "sv_st_smart_terrain" then
t = { section = "logic@sv_st_smart_terrain_walker1",
idle = 0,
prior = 5, state = {0}, ---работа днем первого нпс--------
online = true,
in_rest = "", out_rest = "",
}
table.insert(sj, t)
endif type == "sv_st_smart_terrain" then
t = { section = "logic@sv_st_smart_terrain_kamp1",
idle = 0,
prior = 5, state = {1}, ---работа ночью первого нпс---
online = true,
in_rest = "", out_rest = "",
}
table.insert(sj, t)
end----------второй-----------
if type == "sv_st_smart_terrain" then
t = { section = "logic@sv_st_smart_terrain_walker2",
idle = 0,
prior = 5, state = {0}, ----работа днем второго нпс----
online = true,
in_rest = "", out_rest = "",
}
table.insert(sj, t)
endif type == "sv_st_smart_terrain" then
t = { section = "logic@sv_st_smart_terrain_kamp2",
idle = 0,
prior = 5, state = {1}, ----работа ночью второго нпс -----
online = true,
in_rest = "", out_rest = "",
}
table.insert(sj, t)
end------третий-------------
if type == "sv_st_smart_terrain" then
t = { section = "logic@sv_st_smart_terrain_walker3",
idle = 0,
prior = 5, state = {0}, --- работа днем третьего нпс----
online = true,
in_rest = "", out_rest = "",
}
table.insert(sj, t)
endif type == "sv_st_smart_terrain" then
t = { section = "logic@sv_st_smart_terrain_sleeper",
idle = 0,
prior = 5, state = {1}, ---работа ночью третьего нпс---
online = true,
in_rest = "", out_rest = "",
}
table.insert(sj, t)
end
end
function load_states(gname, type)
-----
if type == "sv_st_smart_terrain" then
return function(gulag)
if db.actor ~= nil then
if ( level.get_time_hours() >= 5 and level.get_time_hours() <= 22 ) then
return 0 -- день
else
return 1 -- ночь
end
else
return gulag.state
end
end
end
end--------------------------------------------------------------------------
-- Dynamic ltx
--------------------------------------------------------------------------
function load_ltx(gname, type)
return nil
endfunction checkStalker(npc_community, gulag_type, npc_rank, se_obj)
------------
if gulag_type == "sv_st_smart_terrain" then
return npc_community == "stalker"
end
return false
endgulag_локация.ltx в config/misc
Спойлер;-- сталкер1 walker первый -> состояние 0, днем)
[logic@sv_st_smart_terrain_walker1]
active = walker@odin_hodit
on_hit = hit_w[hit_w]
on_info = %=zasada_spawn%
[walker@odin_hodit]
path_walk = odin_walk
danger = danger_condition
def_state_moving1 = patrol
def_state_moving2 = patrol
def_state_moving3 = patrol
meet = meet
;-- сталкер1 kamp первый -> состояние 1, ночью)
[logic@sv_st_smart_terrain_kamp1]
active = kamp@odin_sidit
on_hit = hit_k[hit_k]
on_info = %=zasada_spawn%
[kamp@odin_sidit]
center_point = pole_kamp
meet = no_meet
----------------------------------------------------------------
;-- сталкер2 walker второй -> состояние 0, днем)
[logic@sv_st_smart_terrain_walker2]
active = walker@dva_hodit
[walker@dva_hodit]
path_walk = dva_walk
danger = danger_condition
def_state_moving1 = patrol
def_state_moving2 = patrol
def_state_moving3 = patrol
meet = meet
;-- сталкер2 kamp второй -> состояние 1, ночью)
[logic@sv_st_smart_terrain_kamp2]
active = kamp@dva_sidit
[kamp@dva_sidit]
center_point = pole_kamp
meet = no_meet
----------------------------------------------------------------------------
;-- сталкер3 walker третий -> состояние 0, днем)
[logic@sv_st_smart_terrain_walker3]
active = kamp@tri_sidit
[kamp@tri_sidit]
center_point = pole_kamp
meet = meet
;-- сталкер3 sleeper третий -> состояние 1, ночью)
[logic@sv_st_smart_terrain_sleeper]
active = sleeper@tri_slip
[sleeper@tri_slip]
path_main = moy_sleep
wakeable = false
meet = no_meetВ принципе всё. Соответственно либо создать своих новых нпс, либо использовать имеющихся.
Настойчиво повторяю просьбу - изучить материалы на сталкер-вики, там всё достаточно подробно расписано, а вот если что-то не получается, то можно и спросить, а не требовать всё готовое)
-
40 минут назад, Stalkervernite сказал:Привет всем.Кто знает как после диалога нпс нас вел куда-то?отгрывал инфопоршень и нпс шел куда-то.
Так отправить его куда нужно, делов-то...
Как пример:
[logic] active = walker@ts0 [walker@ts0] path_walk = ts0_walk ;;; -изначально непись находится в схеме walker@ts0 и стоит (лежит, сидит, поёт и т.д.) на своем месте в точке ts0_walk path_look = ts0_look on_info = {+dead_ser} walker@ts1 ;;;; - после получения инфопоршня dead_ser переходит в схему walker@ts1 [walker@ts1] ;;; - после перехода в эту схему непись топает в точку ts1_walk path_walk = ts1_walk path_look = ts1_look
а вообще можно сходить на вики http://stalkerin.gameru.net/wiki/index.php?title=Настройка_логики._Часть_0 и почитать, там много интересного, а если что непонятно то и спросить можно)
-
34 минуты назад, РСФСР сказал:не, не работает - сталкер не появляется онлайн. У тебя работы как выглядят? Оффлайн работа есть?
Да, есть и все нормально работают.
Спойлер--' Вояки -------------------ходуны------------------------- if type == "voin_tochka_n" then t = { section = "logic@pri_voin_avto_walker_3", idle = 0, prior = 5, state = {0,1}, online = true, in_rest = "voin_baza_stop", out_rest = "" } table.insert(sj, t) t = { section = "logic@pri_voin_avto_walker_4", idle = 0, prior = 5, state = {0,1}, online = true, in_rest = "voin_baza_stop", out_rest = "" } table.insert(sj, t) t = { section = "logic@pri_voin_avto_walker_5", idle = 0, prior = 5, state = {0,1}, online = true, in_rest = "voin_baza_stop", out_rest = "" } table.insert(sj, t) t = { section = "logic@pri_voin_avto_walker_6", idle = 0, prior = 5, state = {0,1}, online = true, in_rest = "voin_baza_stop", out_rest = "" } table.insert(sj, t) -------------------------сидячие------------------------------ t = { section = "logic@pri_voin_avto_kamp_sidim", idle = 0, prior = 5, state = {0,1}, online = true, in_rest = "voin_baza_stop", out_rest = "" } table.insert(sj, t) t = { section = "logic@pri_voin_avto_kamp_sidim", idle = 0, prior = 5, state = {0,1}, online = true, in_rest = "voin_baza_stop", out_rest = "" } table.insert(sj, t) t = { section = "logic@pri_voin_avto_kamp_sidim", idle = 0, prior = 5, state = {0,1}, online = true, in_rest = "voin_baza_stop", out_rest = "" } table.insert(sj, t) --------------патруль------------------ t = { section = "logic@pri_voin_avto_raid1", idle = 0, prior = 10, state = {0,1}, online = true, in_rest = "voin_baza_stop", out_rest = "" } table.insert(sj, t) t = { section = "logic@pri_voin_avto_raid11", idle = 0, prior = 10, state = {0,1}, online = true, in_rest = "voin_baza_stop", out_rest = "" } table.insert(sj, t) t = { section = "logic@pri_voin_avto_raid12", idle = 0, prior = 10, state = {0,1}, online = true, in_rest = "voin_baza_stop", out_rest = "" } table.insert(sj, t) t = { section = "logic@pri_voin_avto_raid2", idle = 0, prior = 10, state = {0,1}, online = true, in_rest = "voin_baza_stop", out_rest = "" } table.insert(sj, t) t = { section = "logic@pri_voin_avto_raid21", idle = 0, prior = 10, state = {0,1}, online = true, in_rest = "voin_baza_stop", out_rest = "" } table.insert(sj, t) t = { section = "logic@pri_voin_avto_raid22", idle = 0, prior = 10, state = {0,1}, online = true, in_rest = "voin_baza_stop", out_rest = "" } table.insert(sj, t) t = { section = "logic@pri_voin_avto_raid13", idle = 0, prior = 10, state = {1}, online = true, in_rest = "voin_baza_stop", out_rest = "" } table.insert(sj, t) t = { section = "logic@pri_voin_avto_raid23", idle = 0, prior = 10, state = {1}, online = true, in_rest = "voin_baza_stop", out_rest = "" } table.insert(sj, t) t = { section = "logic@pri_voin_avto_sonja1", idle = 0, prior = 7, state = {0,1}, online = true, in_rest = "voin_baza_stop", out_rest = "" } table.insert(sj, t) t = { section = "logic@pri_voin_avto_sonja2", idle = 0, prior = 10, state = {0}, online = true, in_rest = "voin_baza_stop", out_rest = "" } table.insert(sj, t) t = { section = "logic@pri_voin_avto_sonja3", idle = 0, prior = 10, state = {0}, online = true, in_rest = "voin_baza_stop", out_rest = "" } table.insert(sj, t) --------------оффлайн----------------------- t = { section = "logic@pri_voin_avto_walker_3", idle = 0, prior = 5, state = {2}, online = false, in_rest = "", out_rest = "" } table.insert(sj, t) t = { section = "logic@pri_voin_avto_walker_4", idle = 0, prior = 5, state = {2}, online = false, in_rest = "", out_rest = "" } table.insert(sj, t) t = { section = "logic@pri_voin_avto_walker_5", idle = 0, prior = 5, state = {2}, online = false, in_rest = "", out_rest = "" } table.insert(sj, t) t = { section = "logic@pri_voin_avto_walker_6", idle = 0, prior = 5, state = {2}, online = false, in_rest = "", out_rest = "" } table.insert(sj, t) -------------------------сидячие------------------------------ t = { section = "logic@pri_voin_avto_kamp_sidim", idle = 0, prior = 5, state = {2}, online = false, in_rest = "", out_rest = "" } table.insert(sj, t) t = { section = "logic@pri_voin_avto_kamp_sidim", idle = 0, prior = 5, state = {2}, online = false, in_rest = "", out_rest = "" } table.insert(sj, t) t = { section = "logic@pri_voin_avto_kamp_sidim", idle = 0, prior = 5, state = {2}, online = false, in_rest = "", out_rest = "" } table.insert(sj, t) --------------патруль------------------ t = { section = "logic@pri_voin_avto_raid1", idle = 0, prior = 10, state = {2}, online = false, in_rest = "", out_rest = "" } table.insert(sj, t) t = { section = "logic@pri_voin_avto_raid11", idle = 0, prior = 10, state = {2}, online = false, in_rest = "", out_rest = "" } table.insert(sj, t) t = { section = "logic@pri_voin_avto_raid12", idle = 0, prior = 10, state = {2}, online = false, in_rest = "", out_rest = "" } table.insert(sj, t) t = { section = "logic@pri_voin_avto_raid2", idle = 0, prior = 10, state = {2}, online = false, in_rest = "", out_rest = "" } table.insert(sj, t) t = { section = "logic@pri_voin_avto_raid21", idle = 0, prior = 10, state = {2}, online = false, in_rest = "", out_rest = "" } table.insert(sj, t) t = { section = "logic@pri_voin_avto_raid22", idle = 0, prior = 10, state = {2}, online = false, in_rest = "", out_rest = "" } table.insert(sj, t) t = { section = "logic@pri_voin_avto_raid13", idle = 0, prior = 10, state = {2}, online = false, in_rest = "", out_rest = "" } table.insert(sj, t) t = { section = "logic@pri_voin_avto_raid23", idle = 0, prior = 10, state = {2}, online = false, in_rest = "", out_rest = "" } table.insert(sj, t) t = { section = "logic@pri_voin_avto_sonja1", idle = 0, prior = 7, state = {2}, online = false, in_rest = "", out_rest = "" } table.insert(sj, t) t = { section = "logic@pri_voin_avto_sonja2", idle = 0, prior = 10, state = {2}, online = false, in_rest = "", out_rest = "" } table.insert(sj, t) t = { section = "logic@pri_voin_avto_sonja3", idle = 0, prior = 10, state = {2}, online = false, in_rest = "", out_rest = "" } table.insert(sj, t) end
Попробуй для начала оставить здеь один инфопоршень и проверить сам гулаг, может что-то тут не сходится:
if not has_alife_info("tutorial_wounded_end") or not has_alife_info("tutorial_wounded_die") or not has_alife_info("tutorial_wounded_death") or has_alife_info("agroprom_military_case_have") then
-
В 02.07.2023 в 14:56, N42 сказал:function est_npc()
local tbl_npc_sid = {
441,
442,
443,
444,
445,
446
}
local est_npc = false
for i,v in ipairs(tbl_npc_sid) do
local npc = alife():story_object(v)
if npc then
est_npc = true
break
end
endreturn est_npc
endВернет true если есть нпс с сидом из таблички
Спасибо, попробую)
3 часа назад, РСФСР сказал:В ТЧ создал гулаг с одним сталкером,
Я уже точно не помню, но вроде return 0 - переключает на день, return 1 - на ночь, а return 2 в оффлайн. Во всяком случае у меня гулаг работает нормально вот с таким кодом:
if type == "voin_tochka_n" then return function(gulag) local actor = db.actor if not actor then return gulag.state end if not has_alife_info("start_gl_voin") then return 2 -- offline else if ( level.get_time_hours() >= 6 and level.get_time_hours() <= 22 ) then return 0 -- день else return 1 -- ночь end return gulag.state end end end
-
21 минуту назад, Stalkervernite сказал:frankenshtayn В том то и дело,как саму функцию вызвать,можешь скрипт написать
Любым удобным способом. Можно из рестриктора, из другой функции, при выдаче инфопоршня и т.д...
из рестриктора, при попадании в него гг:
[logic] active = sr_idle [sr_idle] on_actor_inside = %=game_credits%
из инфопрошня (выдать инфо любым удобным способом):
<info_portion id="game_over"> <action>xr_effects.game_credits</action> </info_portion>
из другой функции:
local pos_rem = vector():set(913.599975585938,-0.100000001490116,-353.950012207031) local particle_rem = particles_object([[anomaly2\teleport_out_00]]) function par_aes_remont() particle_rem:play_at_pos(pos_rem) xr_effects.game_credits() end
-
1
-
-
21 час назад, N42 сказал:frankenshtayn я правильно понял, есть 6 равнозначных нпс, и если осталось 2 любых - они удаляются?
Есть 6 нпс, двое из них с увеличенным иммунитетом. По сюжету гг с этими нпс проходит определенный маршрут с несколькими боёвками, затем переходят на другую локацию, затем после дохождения до нужной точки все телепортируются.
Соответственно в зависимости от прохождения, на локацию где все телепортируются могут дойти как все шесть, так и пять, и четыре и три и два (двое доходят обязательно). Далее, после диалога со всеми дошедшими они идут в телепорт и удаляются.
После того, как все нпс удалены необходимо, запустить функцию. Т.е. отследить, есть ли на локации эти нпс, и если их нет, то запускаем нужную функцию.
В принципе всё это реализовано и работает, но как я уже говорил, хотелось бы сделать проверку отсутствия этих нпс на локации одной функцией.
Дополнено 10 минуты спустя38 минут назад, Stalkervernite сказал:Привет всем,знаете как после выдачи инфопоршня нас перебрасывала в титры
Нужно вызвать функцию game_credits из xr_effects.script и запустятся титры
-
1
-
[SoC] Модострой: вопросница
в Уроки, вопросы и советы по созданию модов
Опубликовано · Изменено пользователем frankenshtayn
В ТЧ это делается достаточно просто:
На координатах НПС ставится рестриктор с логикой выдачи инфопрошня, ну например proba_dial
(Важно!!!! - размер рестриктора ставить 2 !!!)
НПС добавить такую логику:
[walker@g] path_walk = byk_walk3 path_look = byk_look3 on_actor_dist_le = 2| nil {+proba_dial} %=on_talk% meet = meet
Ну, в общем-то и всё)
https://www.youtube.com/watch?v=cCxoY-n3imM