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

[SoC] Ковыряемся в файлах


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

 

 

возможно ли и каким образом менять взаимодействие между например гражданским зомби (класс монстров) и сталкером зомбированным (класс сталкеров), таким образом, что бы они в игре не нападали друг на друга?
Конкретно между этими двумя - нет, во всяком случае, посредством конфигов. Зомбированные сталкеры - это zombied, в табличке communities_relations, а зомби-гражданские - это zombie из monster_relations, таким образом, для гражданских можно установить нейтральные отношения только со всеми НПС (human из monster_relations), включая зомбированных сталкеров.



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

ColR_iT

Благодарю, это не совсем тот вариант, так как гражданские зомби у меня во многих сценках воюют со сталкерами.

Еще один вопрос, в каком скриптовом файле регулируются эти отношения (monster_relations), посмотрю, возможно удастся что нибудь придумать...

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

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

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

@losiara, хотя ко мне закралось подозрение, что @Капрал Хикс всё же прав.

У контролёра в конфиге присутствует строка Friend_Community_Overrides с единственным значением monolith, по всей видимости благодаря которой он не атакует указанную группировку.

Попробуй прописать этот же параметр другому монстру, например слепому псу, и прописать группировку сталкеров, и для теста заспавнить одну собачонку в Лагере новичков. Сам проверить не могу - нет возможности.

 

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

@losiara,@ColR_iT, и др.

В игре есть хитрый файлик mob_alife_mgr.script, который управляет возможностями нахождения монстров под схемами (управляться скриптами) или же быть отпущенными в алайф (под управление движком). В этом файле прописано возможность читать 4 параметра из конфигов (всегда, дружелюбен всем, дружен человекам, дружен актору). В принципе, ничего не мешает добавить свой параметр (типа 'dog_friendly') и, немного подправив скрипт, иметь возможность в схемах монстров, чтобы они не враждовали с псами... Ну, и меняя/добавляя параметр(ы), можно "подружить" с какой группировкой требуется... При желании, можно прописать обработку сида (story_id) и делать невраждебным конкретного монстра/сталкера.

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

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

ColR_iT

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

 

 

Artos

Есть такой хитрый скрипт.

А какова возможность добавить вариант дружелюбности сталкеров к монстрам??? В скрипте же речь только о монстрячих схемах??? По идее, даже добавив параметр назовем его условно "дружен_со_сталкерами", сталкеры все равно будут вести стрельбу против монстров не смотря на то, что последние не сопротивляются или я ошибаюсь??? 

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

-- Mob alife manager

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

 

disable_scheme = 1

reset_scheme = 2

continue_execution = 3

 

function cfg_get_mode(ini, section, npc)

local alife = {}

alife.actor_friendly = utils.cfg_get_bool(ini, section, "actor_friendly", npc, false)

alife.npc_friendly = utils.cfg_get_bool(ini, section, "npc_friendly", npc, false)

alife.friendly = utils.cfg_get_bool(ini, section, "friendly", npc, false)

alife.braindead = utils.cfg_get_bool(ini, section, "braindead", npc, false)

alife.zombie_friendly = utils.cfg_get_bool(ini, section, "zombie_friendly", npc, false)

return alife

end

 

function issue_combat_event(obj)

--printf("_bp: issue_combat_event?")

local st = db.storage[obj:id()]

if st.mob_combat then

printf("_bp: alife_control: issuing event combat_callback")

xr_logic.issue_event(obj, st.mob_combat, "combat_callback")

end

end

 

function alife_control(obj, actor, mode)

-- Мертвые монстры сразу отпускаются под alife

if not obj:alive() then

xr_logic.mob_release(obj)

return true

end

 

-- Монстры, у которых есть враг - также должны работать в alife

local enemy = obj:get_enemy()

if enemy then

--printf("_bp: got enemy")

if not mode.braindead and

not mode.friendly and

(not mode.actor_friendly or enemy:id () ~= actor:id ()) and

(not mode.npc_friendly or enemy:id() == actor:id()) then

issue_combat_event(obj)

xr_logic.mob_release(obj)

return true

end

end

 

-- Отпускать в alife монстров, которых обстреляли

local h = obj:get_monster_hit_info()

if h.who and h.time ~= 0 then

if mode.braindead then

-- Braindead монстры не уходят из под скрипта даже если их обстрелять

return false

end

if h.who:id() == actor:id() and mode.actor_friendly then

-- Если хотя бы раз был атакован actor-ом, то больше не дружественен к нему

mode.actor_friendly = false

if h.who:id() == actor:id() and mode.zombie_friendly then

mode.zombie_friendly = true

end

--printf("_bp [%s]: h.who:name() = %s", obj:name(), h.who:name())

issue_combat_event(obj)

xr_logic.mob_release(obj)

return true

end

 

-- Остальные монстры работают под схемой

return false

end

 

 

Прошу простить, но времени на редактирование поста не хватило...

 

disable_scheme = 1

reset_scheme = 2

continue_execution = 3

 

function cfg_get_mode(ini, section, npc)

local alife = {}

alife.actor_friendly = utils.cfg_get_bool(ini, section, "actor_friendly", npc, false)

alife.npc_friendly = utils.cfg_get_bool(ini, section, "npc_friendly", npc, false)

alife.friendly = utils.cfg_get_bool(ini, section, "friendly", npc, false)

alife.braindead = utils.cfg_get_bool(ini, section, "braindead", npc, false)

alife.zombie_friendly = utils.cfg_get_bool(ini, section, "zombie_friendly", npc, false)

return alife

end

 

function issue_combat_event(obj)

--printf("_bp: issue_combat_event?")

local st = db.storage[obj:id()]

if st.mob_combat then

printf("_bp: alife_control: issuing event combat_callback")

xr_logic.issue_event(obj, st.mob_combat, "combat_callback")

end

end

 

function alife_control(obj, actor, mode)

-- Мертвые монстры сразу отпускаются под alife

if not obj:alive() then

xr_logic.mob_release(obj)

return true

end

 

-- Монстры, у которых есть враг - также должны работать в alife

local enemy = obj:get_enemy()

if enemy then

--printf("_bp: got enemy")

if not mode.braindead and

not mode.friendly and

not mode.zombie_friendly and

(not mode.actor_friendly or enemy:id () ~= actor:id ()) and

(not mode.npc_friendly or enemy:id() == actor:id()) then

issue_combat_event(obj)

xr_logic.mob_release(obj)

return true

end

end

 

-- Отпускать в alife монстров, которых обстреляли

local h = obj:get_monster_hit_info()

if h.who and h.time ~= 0 then

if mode.braindead then

-- Braindead монстры не уходят из под скрипта даже если их обстрелять

return false

end

if h.who:id() == actor:id() and mode.actor_friendly then

-- Если хотя бы раз был атакован actor-ом, то больше не дружественен к нему

mode.actor_friendly = false

if h.who:id() == actor:id() and mode.zombie_friendly then

mode.zombie_friendly = true

end

--printf("_bp [%s]: h.who:name() = %s", obj:name(), h.who:name())

issue_combat_event(obj)

xr_logic.mob_release(obj)

return true

end

 

-- Остальные монстры работают под схемой

return false

end

 

 

 

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

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

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

@losiara, твой вопрос касался возможности "регулировать взаимоотношения" монстров и human'ов (сталкеров), и в частности "менять взаимодействие между например гражданским зомби (класс монстров) и сталкером зомбированным (класс сталкеров), таким образом, что бы они в игре не нападали друг на друга".

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

Что имеем:

0. Сталкеры (species = human) строят свои взаимоотношения по табличке 'communities_relations', где нет места монстрам, т.е. только гуманоиды, а все монстры враждебны.

Монстры, а монолитовцы в этом отношении отношении относятся к ним (species = zombie), регулируют свои взаимоотношения по табличке 'monster_relations' и тут можно только с актором и/или сразу со всеми гуманоидами менять отношение.

Вот поэтому и не дружат все сталкеры с монстрами и монолитом, а контролер и монолит не враждуют.

 

1. Для сталкеров существует схема "combat_ignore", в которой можно задать условия, чтобы сталкер(ы) не воспринимали врагами других неписей (монстров и/или сталкеров).

Также, для них есть схема 'danger' (см. xr_danger.script), в которой также можно задать условия,чтобы не "возбуждались"...

Имеется для них и схемка 'threshold' с параметрами 'ignore_monster' и 'max_ignore_distance'  (см. stalker_generic.script) и в логике позволяющий игнорировать монстров.

Все это и дает возможность тебе регулировать "а) старкер не враждебен к монстрам". Однако, для того, чтобы указать конкретную группировку монстров, придется поработать над добавлением в  "combat_ignore" возможности читать параметры с указанием группировки и игнорировать ее.

 

2. Для монстров такого выбора нет, кроме упомянутого mob_alife_mgr.script, и которым можно регулировать "б) монстр не враждебен к сталкерам".

Т.к. в оригинальном виде этот скрипт дает возможность выставлять "невраждебность" только сразу ко всем неписям, то и помянул про необходимость доработать скрипт, чтобы он смог обрабатывать новые потребные тебе параметры.

 

Вот тогда ты сможешь управлять взаимоотношениями 'монстр<?>сталкер' как тебе хочется (далее работай головой и со скриптами). ;-)

 

P.S. По показанной тобою доработке скрипта нет смысла говорить, т.к. все же нужно понимать что за условие тебе необходимо и как его реализовать, чтобы оно работало, но не корежило все остальное. Добавленный тобою параметр "в тупую" дублирует 'npc_friendly', т.е. по его наличию монстр опять же не будет отпущен в алайф для всех(!) неписей.

Тут, как минимум, требуется не булев-параметр, а строка с именем группировки, и чтобы в функции 'alife_control' обрабатывалось условие, что "если есть враг, но его его группировка соответствует заданной новым параметром, то не отпускать в алайф", т.е. не будет включен 'issue_combat_event'.

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

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

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

Во имя Материнки, Винта и Святого интернета. Админ!

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

Melo, наверное никто тебе не ответит, потому что муссировалось уже не раз, вот здесь посмотри: 

 

http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%A1%D0%BC%D0%B0%D1%80%D1%82%D0%B5%D1%80%D1%80%D0%B5%D0%B9%D0%BD%D1%8B_%D0%B8_%D0%B3%D1%83%D0%BB%D0%B0%D0%B3%D0%B8

 

Вот кусок кода, человек как раз поясняет где и что находится.

 

if type == "esc_bandits_smart_terrain" then


t = {}
;-- "соеденительная секция" для логики, определяем ltx фаилом
t.section = "logic@esc_bandits_smart_terrain_bandit1_walker"
;-- no idea, probably describes after what time
;-- npc will use this job again (?)
t.idle = 0
;-- no idea but i guess it's optional
t.timeout = 0
;-- пріоритет
t.prior = 100
;-- нпс будет использовать эту логику,
;-- если ST переключится в это состояние
;-- в этом случае - состояние 0 (день)
t.state = {0}
;-- Какой squad и group назначится персонажу принявшему эту работу.
t.squad = squad
t.group = groups[1]
;-- no idea what means position_threshold
t.position_threshold = 100
;-- описывает нпс в этом состоянии: онлайн или офлайн
;-- онлайн = истина по дефолту
t.online = true
;-- описывает рестрикторы (куда нпс могут/не могут пойти)
t.in_rest = ""
t.out_rest = ""
;-- ввиду особого способа присвоения работ в
;-- smart_terrain.script вы никогда не знаете, какая работа
;-- будет использоваться каждым нпсом; если вы хотите быть уверенным
;-- что конкретный нпс взял конкретную работу, тогда
;-- вам нужно заюзать предикатную функцию; в этом слуае
;-- мы хотим чтобы эта работа присвоилась мастеру бандиту
t.predicate = function(obj_info) return obj_info.rank >= 900 end
table.insert(sj, t)

 

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

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

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

Будьте добры объясните  почему происходит вот такой вылет, спавню химеру. все что не хватало дописал, теперь вот эта бяка

FATAL ERROR



[error]Expression : index != BI_NONE
[error]Function : CParticlesPlayer::LoadParticles
[error]File : E:\stalker\patch_1_0004\xr_3da\xrGame\ParticlesPlayer.cpp
[error]Line : 87
[error]Description : Particles bone not found
[error]Arguments : bone


stack trace:

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

Intrel Core i5 9400F, msi gtx 1660 super ventus, RAM 16g-DDR4, HD 2000g, Win 10x64, SSD 256g, SSD m2 500g.

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

поставил один из зимних модов, и понял что аномалий на белом фоне не видно совсем, как можно сделать аномалии более заметнее?

Грамматические ошибки в посте.
Устное предупреждение.
ColR_iT

Изменено пользователем ColR_iT
Ссылка на комментарий

Привет всем!

Собрал стволы В.О.В. как дополнение к ОП+К+МА и прописал их Бандитам в Т.Д., как говорил " Ворон",что они там раскопали склад с трафеями, в каком фаиле дополнить обмен этих стволов у него, на арты? :blink:

XP Professionalx32 2048Mb 2ядра видюха NVIDIA GEFORCE 8600Gt 512 Mb

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

Еще вопрос возник: Можно ли как-то отследить, что гг погиб именно от аномалии? Неважно какой, просто от аномалии? Я вижу пока только вариант проверки по расстоянию до ближайшей аномалии, но он чреват ложнгыми срабатываниями, когда гг застрелили рядом с аномалией) Есть ли какой надежный способ определить это в ТЧ?

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

@proper70,в оригинале нельзя, поставь x-ray extensions, там сделали коллбек отслежки того, кто хитовал ГГ, дальше дело техники. Без него нормально сделать никак не выйдет. Т.к. даже что-бы отследить тип хита нужен хит коллбек, ну а если он будет, то проще по клсиду, ну или еще как - дело вкуса. 

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

Можно ли как-то отследить, что гг погиб именно от аномалии?

В чистом ТЧ можно при помощи методов db.actor:who_hit_name() или db.actor:who_hit_section_name().

Поставь это на скриптовый хит-колбек и смотри какой объект атаковал ГГ в последний раз (и сколько отнял здоровья). После чего, по имени получай гейм-объект и сканируй его на принадлежность к классу аномалий.

 

З.Ы. впрочем, тут даже можно обойтись без колбека на хит - просто проверяй, что ГГ не живой (через db.actor:alive()) и смотри кто нанес последний хит.

Изменено пользователем Shadows
Ссылка на комментарий

Всем привет! Возник вопрос: заспавнил двух сталкеров: торговца и бармена. Они спавнятся, торгуют, говорят, все чин чинарем. Решил поменять им визуал. Вытащил модели из ЧН, скопировал текстуры, все запустилось, визуалы сменились, но почему-то с ними нельзя поговорить: надпись "Говорить (F)" не появляется. В чем может быть причина?



И да, забыл написать, что при наведении прицела на этих сталкеров не появляется даже их имен.

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

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

Тут ты очевидно неправильно перенёс модель, а именно - кривая настройка костей. Я даже догадываюсь, по какому уроку ты переносил модельку.

Воспользуйся этим уроком. http://stalkerin.gameru.net/wiki/index.php?title=MilkShape_3D._%D0%9F%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81_%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D0%B5%D0%B9_%D0%9D%D0%9F%D0%A1_%D0%B8%D0%B7_%D0%A7%D0%9D/%D0%97%D0%9F_%D0%B2_%D0%A2%D0%A7_%D0%B8_%D0%BE%D0%B1%D1%80%D0%B0%D1%82%D0%BD%D0%BE

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

La'Rento, да я пользовался другим уроком. Спасибо за ответ и ссылку, все заработало, как надо.

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

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

Товарищи...возник вопрос. Как реализовать динамические ответы НПСов? По поиску не нашел...пробовал делать 2 тега(на продолжение диалога и на альтернативное продолжение), но всегда выбирается только первый тег. Как иначе можно реализовать?

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

@Dniwe, что ты вкладываешь в понятие "динамические"? Формулируй вопрос яснее. Если тебе нужен диалог типа "Что интересного?", то тебе в dialog_manager.script, а если тебе нужна рандомная фраза, то нужно просто вызвать перед ветвлением функцию, которая рандомно выберет твои фразы, можешь поглядеть Megadeath Mod, там по моему это было.
 
Продублирую свой вопрос из соседнего топика, там мне отвечать не хотят.

 

Как получить стори айди собеседника?

Так не выходит:

function test(s1,s2)
if s1:id() == (db.actor or db.actor:id()) then
return s2:story_id()
end
return s1:story_id() --/> номер из game_story_ids
end

Пробовал и сразу вот так:

function test(s1,s2)
if s1:id() == (db.actor or db.actor:id()) then
return alife():story_object(s2:story_id())
end
return alife():story_object(s1:story_id()) --/> объект по sid
end

 

 

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

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

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

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

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

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

Войти

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

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

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