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

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

Добрый день господа программисты!!!

Прошу помощи вот по какому вопросу. Имеется мысль "сдружить" два класса представленных в игре монстров и НПС, а конкретно зомби гражданского и зомбированного сталкера "zombie" и "zombied" соответственно. Сделать это путем редактирования конфиг-файла "game_relations.ltx" не представляется возможным т. к такая возможность там попросту не предусмотрена. Подружить либо рассорить всех и вся можно только с ГГ, а необходимо именно с вышеописанными неписями при этом с ГГ они должны по прежнему оставаться врагами. Покопавшись в файле "xr_effects.script" я обнаружил там две стандартные функции:

function set_friends(actor, npc, p)


local npc1
for i, v in pairs(p) do
npc1 = level_object_by_sid(v)
if npc1 and npc1:alive() then
--printf("_bp: %d:set_friends(%d)", npc:id(), npc1:id())
npc:set_relation(game_object.friend, npc1)
npc1:set_relation(game_object.friend, npc)
end
end
end

function set_enemies(actor, npc, p)
local npc1
for i, v in pairs(p) do
--printf("_bp: set_enemies(%d)", v)
npc1 = level_object_by_sid(v)
if npc1 and npc1:alive() then
npc:set_relation(game_object.enemy, npc1)
npc1:set_relation(game_object.enemy, npc)
end
end
end

 

Однако если я правильно понял, то во-первых для их реализации необходимо присвоить всем участникам сценки SIDы (не так уж принципиально). Во-вторых работают ли они на монстрах??? В-третьих отношение ГГ к ним также будет меняться положительное или нет, мне надобно что бы они остались врагами для актора и друзьями между собой. Предполагаю использовать сии наработки через логику, хотя если это невозможно, то можно и по старинке с активацией через диалог либо другую функцию например... 

Вот собственно суть проблемы, кто знает подскажите пожалуйста!!!

Жизнь следует измерять поступками, а не временем...

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

@losiara, если тебе нужно помирить их только на время одной сцены, то используй оверрайды в логике (combat_ignore и т.п.).

Или можно зомбированным сталкерам сделать отдельную секцию, в которой прописать в species вместо human - zombie.

Изменено пользователем naxac

Аддон для ОП-2.09.2: Яндекс/Google/GitHub

naxac.gif

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

 

 naxac да, на одну сцену, но можно ли использовать "combat_ignore" в логике монстров, она работает???

 

Жизнь следует измерять поступками, а не временем...

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

@losiara

Для монстров есть оверрайды:

actor_friendly = true/false - если true, то монстр не атакует актера, до первой атаки на него.
npc_friendly = true/false - если true, то монстр не атакует сталкеров и монстров, до первой атаки на него.
friendly = true/false - если true, то монстр не атакует никого до первой атаки на него.
braindead = true/false - если true, то монстр игнорирует любые атаки.

  • Согласен 1
  • Полезно 1
Ссылка на комментарий

Спасибо я знаю, потому и уточнил работают ли для монстров секции типа  "combat_ignore", а имеющиеся указанные тобою в посте не подходят для моей задумки.  "combat_ignore" вполне бы подошла...

Жизнь следует измерять поступками, а не временем...

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

Отвечаю на свой же предыдущий вопрос. Просматривая статьи по логике мы видим, что действительно секция [combat_ignore] рекомендована как бы только для сталкеров (НПС), по крайней мере никаких пояснений относительно использования ее у монстров в статьях нет, для монстров же разработчиками были придуманы так называемые оверрайды:

 

actor_friendly = true/false - если true, то монстр не атакует актера, до первой атаки на него.
npc_friendly = true/false - если true, то монстр не атакует сталкеров и монстров, до первой атаки на него.
friendly = true/false - если true, то монстр не атакует никого до первой атаки на него.
braindead = true/false - если true, то монстр игнорирует любые атаки.

 

Однако они весьма однобоки и неразнообразны, поэтому я в тестовом режиме прописал двум игровым классам в логику секцию  [combat_ignore]  следующим образом:

 

Для зомби гражданского:
[smart_terrains]
none = true

[logic]
active = mob_remark@hold
combat_ignore = combat_ignore

[mob_remark@hold]
anim = stand_idle_0
time = 50000
combat_ignore_cond = true

[combat_ignore]
Для зомбированного сталкера (класс НПС)
[smart_terrains]
none = true

[logic]
active = remark
combat_ignore = combat_ignore

[remark]
target = actor
anim = probe_1
combat_ignore_cond = true

[combat_ignore]

 

На выходе стоят два красавца и друг к другу абсолютно равнодушны, что и требовалось собственно для сценки. Правда конечно это был тестовый режим поэтому я прописал по быстрому им РЕМАРК дабы не ковырять all.spawn и не создавать пути.  Потребуется присвоить им SIDы и задать игнорирование боя только в отношении друг друга, но это уже детали. Получается что вопрос решаем только лишь стандартными средствами данными нам разработчиками.

Жизнь следует измерять поступками, а не временем...

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

Доброго дня господа!!!

Вот хотел посоветоваться. В процессе создания и собственно даже тестирования своего детища, при переходе на другую локацию стал возникать вылет следующего содержания:

 

Expression : no_assert
Function : CALifeStoryRegistry::add
File : E:\stalker\patch_1_0004\xr_3da\xrGame\alife_story_registry.cpp
Line : 30
Description : Specified story object is already in the Story registry!

 

Ну я конечно же бросился перепроверять своих SID-овских НПС, монстров и др. но как вы понимаете никаких дубликатов и повторных спавнов не обнаружил. Пришлось переверстывать весь мод весом 354мг, понятное дело я западозрил скрипты и нашел одну вещь которую предположительно и считаю виновником сией проблемы. Это универсальная функция дающая возможность повторного спавна чего (кого) либо на локации, привожу ее:

 

function list_new_funcs()
--this.level_active()
this.level_active_c()
this.level_active_a()
--this.level_active_b()
--this.level_active_d()
end

function level_active()
if not has_alife_info('level_active') and level.name() == "l01_escape" then
monsters_spawn.bloodsucker_esc()
monsters_spawn.esc_zombie_1()
db.actor:give_info_portion('level_active')
elseif has_alife_info('level_active') and level.name() ~= "l01_escape" then
db.actor:disable_info_portion ('level_active')
end
end

function level_active_c()
if not has_alife_info('level_active_c') and level.name() == "l03_agroprom" then
random_spawn.random_spawn_agr_dog()
db.actor:give_info_portion('level_active_c')
elseif has_alife_info('level_active_c') and level.name() ~= "l03_agroprom" then
db.actor:disable_info_portion ('level_active_c')
end
end

function level_active_a()
if not has_alife_info('level_active_a') and level.name() == "l04_darkvalley" then
--random_spawn.random_spawn_td_krovosos()
--random_spawn.random_spawn_dar_bandit1()
db.actor:give_info_portion('level_active_a')
elseif has_alife_info('level_active_a') and level.name() ~= "l04_darkvalley" then
db.actor:disable_info_portion ('level_active_a')
end
end

function level_active_b()
if not has_alife_info('level_active_b') and level.name() == "l06_rostok" then
npc_spawn.rostok_killer()
npc_spawn.ros_ecolog()
db.actor:give_info_portion('level_active_b')
elseif has_alife_info('level_active_b') and level.name() ~= "l06_rostok" then
db.actor:disable_info_portion ('level_active_b')
end
end

function level_active_d()
if not has_alife_info('level_active_d') and level.name() == "l12_stancia_2" then
monsters_spawn.aes_zombie()
npc_spawn.stalker_zombied_aes2_2()
--actor_spawn_items.main_spawn2()
db.actor:give_info_portion('level_active_d')
elseif has_alife_info('level_active_d') and level.name() ~= "l12_stancia_2" then
db.actor:disable_info_portion ('level_active_d')
end
end

 

На комментарии не обращайте внимания это я тестил... Соот. создаются инфопоршни и активируется через биндер актора. Ну все бы ничего она работает, но при ПОВТОРНОМ заходе на локу где обозначен спавн чего нибудь происходит этот надоедливый вылет.

Вот собственно можно ли как то это поправить (если дело все таки в этом коде, ну может по типу: проверки какой нибудь... если НПС были убиенны кем нибудь, то спавнить, в противном случае не спавнить...) как то так теоретически или как нибудь еще просто ничего более не приходит на ум. Возможно дело вообще не в этом, а глючит какой то другой скрипт (но здесь я тестил и без этого кода вроде все работает), Либо вообще отказаться от сего замечательного изменения и выбросить скрипт (что крайне не желательно)...

Благодарю за внимание!!! :)

Жизнь следует измерять поступками, а не временем...

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

Срочно нужна помощь! Как можно уменьшить нагрузку от аномалий в ЗП? Многие люди говорят, что из-за огромного количества аномалий на локациях ЗП бывают лаги при включении урона неписям от аномалий. Вот я и хочу поправить данный глюк, ибо нормальную симуляцию хочу - без поблажек неписям. Второй вопрос - можно ли в ЧН отредактировать что-то, чтобы заставить неписей во время выброса прятаться по укрытиям или получать урон?а то пофигисты какие-то все, кроме ГГ...

Изменено пользователем MegaStalker

Все зовут меня Пришедший из Ниоткуда...Почему?Потому что я пришел из ниоткуда и иду в никуда...

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

losiara, приведенная тобой функция сама по себе ничего и никого не спавнит, она только вызывает соответствующие функции для спавна чего/кого (monsters_spawn.bloodsucker_esc, monsters_spawn.esc_zombie_1, random_spawn.random_spawn_agr_dog, random_spawn.random_spawn_td_krovosos, random_spawn.random_spawn_dar_bandit1, npc_spawn.rostok_killer, npc_spawn.ros_ecolog, monsters_spawn.aes_zombie, npc_spawn.stalker_zombied_aes2_2). Копай их, явно там назначается story_id, и при повторном вызове функции ты получаешь вылет.

Сталкер - наше всё!

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

 AndrewMor Спасибо что отозвался!

Я конечно же знаю что данная функция ничего не спавнит, почему я собственно заподозрил ее в подобном вылете, из за ее прямого назначения повторного спавна объектов в игре при заходе на локу (одних и тех же объектов но без SIDа). 

Что такое SID как я его понимаю? Это ПРИНУДИТЕЛЬНО зарезервированный для игрового объекта ключ (номер) дабы игрок мододел мог в дальнейшем производить с ним какие либо действия... Но в игре существует еще так называемый ID-объектов всех абсолютно!!! Этот номер назовем его так присваивается самой игрой каждому объекту.

Возможно ли повторение этих ID игрой и получение ошибки с соот. логом как я привел в предыдущем посте, или подобный вылет возможен только лишь у игровых объектов именно  с SIDом??? Но точно скажу что все эти функции ничего и никому не присваивают, они только спавнят один и тот же набор объектов, например zombie_normal - 10 шт. или dog_strong и т. д. Для примера приведу эти функции что бы было понятней:

local zombie_types = {"zombie_esc", "zombie_esc_1", "zombie_esc_2", "zombie_esc_3", "zombie_esc_4"} -- лежачие зомби --


function spawn_zombies( position,lvx,gvx,total)
local zombie_index
local new_pos, x_offset, z_offset
for zombie_index=1, total do
x_offset = math.random(5)
z_offset = math.random(5)
new_pos = position
new_pos.x = new_pos.x + x_offset
new_pos.z = new_pos.z + z_offset
alife():create(zombie_types[math.random(5)],new_pos,lvx,gvx)
end
end
function esc_zombie( actor, npc ) -- Зомбяки на отдыхе на Кордоне возле остановки --

local spawn_point = vector():set( 21.074, 1.78, 30.096 )

spawn_zombies( spawn_point,299445,90,10 )
end

 

Соответственно в spawn_sections.ltx:

 

[zombie_esc]:zombie_weak
$spawn = "respawn\zombie_esc"
custom_data = scripts\moy_logic\zombie_legat.ltx

[zombie_esc_1]:zombie_normal
$spawn = "respawn\zombie_esc_1"
custom_data = scripts\moy_logic\zombie_legat.ltx

[zombie_esc_2]:zombie_strong
$spawn = "respawn\zombie_esc_2"
custom_data = scripts\moy_logic\zombie_legat.ltx

[zombie_esc_3]:zombie_immortal
$spawn = "respawn\zombie_esc_3"
custom_data = scripts\moy_logic\zombie_legat.ltx

[zombie_esc_4]:zombie_ghost
$spawn = "respawn\zombie_esc_4"
custom_data = scripts\moy_logic\zombie_legat.ltx

 

Логика:

 

[smart_terrains]
none = true

[logic]
active = mob_fake_death

[mob_fake_death]
on_actor_dist_le_nvis = 5 | nil

 

Благодарю за ответ!

Изменено пользователем losiara

Жизнь следует измерять поступками, а не временем...

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

 

 

Возможно ли повторение этих ID игрой и получение ошибки с соот. логом как я привел в предыдущем посте, или подобный вылет возможен только лишь у игровых объектов именно  с SIDом???

Насчет возможности повторов ID'ов - ни разу об этом нигде и ничего не попадалось. А раз информации такой нет - значит у движка с этим все нормально. А в приведенном тобой логе достаточно понятно сказано про дублирование SID. Ищи внимательно, где у тебя может происходить более одного спавна объекта, который имеет назначенный SID.

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

losiara, тогда вспоминай, после чего у тебя стал возникать вылет. Чего делал перед тем, как вылет словить. На первый взгляд, в приведенных тобой функциях нет намека на присвоение SID.

Сталкер - наше всё!

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

После чего вспомнить трудно ибо очень много изменений было сделано в том числе и скриптовых. А вот вылечился он после отключения этой функции, я всю игру не проходил конечно, но пару тройку локаций пробежал вылета не было!!!

И точно не вспомню где, но точно видел что лог вылета не всегда соответствует аргументации, т. е. возможно что косяк в чем то другом, однако факт остается фактом, отключил вылет пропал. Вот и задачка... как полечить, вроде бы и ничего такого сложного и функция простейшая как бы, а глючит...

SIDы я присваиваю конечно, через скрипт:

function esc_propusk () -- На входе в лагерь новичков помощник --


local obj = alife():create("stalker_esc_propusk",vector():set(247.277,-19.60,-146.528),11347,8)
local tbl = amk.read_stalker_params(obj)
tbl.sid = 5495
amk.write_stalker_params(tbl, obj)
end

Понятно что мод с использованием АМК файлов.

 

но там все четко, иногда классическим способом через all.spawn.

Изменено пользователем losiara

Жизнь следует измерять поступками, а не временем...

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

Имеется несколько функций в одном файле *.script, выполняющие роль предусловий в диалоге. Как написать ещё одну функцию, которая возвращала бы true, если остальные вернули false, т.е. ни одно из предусловий не выполнено.

ЗЫ составил такую конструкцию, кажись работает ^_^

function test()
	if	файл.функция1() ~= true and 
		файл.функция2() ~= true and 
		файл.функция3() ~= true and then
			return true
		else
			return false
	end
end
Изменено пользователем dPlayer
Ссылка на комментарий

@dPlayer, у тебя третий and лишний.

function test() return not( файл.функция1() or файл.функция2() or файл.функция3() ) end
  • Спасибо 1
Ссылка на комментарий

 

 

возможно что косяк в чем то другом, однако факт остается фактом, отключил вылет пропал.

Лог врать не будет. Если есть объект с таким же SID-ом, будет этот вылет. Каким-то образом твоя функция пересекается с другой/другими, присваивающими СИД

Сталкер - наше всё!

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

@Charsi, спасибо, and случайно поставил :)

А как передать текущий параметр в диалог оригинальными средствами? К примеру ремонтник говорит цену за ремонт.

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

@dPlayer, использовать метод give_talk_message.

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine.

Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист.

AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD.

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

Посмотрел в этой теме как его используют, но результата нет, хотя ф-ция работает - если написать то, чего не существует - вылетит с руганью. Вызов через диалог.

function mess()
    local mess = "text"
    db.actor:give_talk_message(mess)
end
Изменено пользователем dPlayer
Ссылка на комментарий

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

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

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

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

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

Войти

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

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

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