Перейти к содержанию

frankenshtayn

Сталкеры
  • Публикаций

    56
  • Зарегистрирован

  • Посещение

Весь контент frankenshtayn

  1. В ТЧ это делается достаточно просто: На координатах НПС ставится рестриктор с логикой выдачи инфопрошня, ну например 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
  2. Я делал так: 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) Тоже вариант!) 1. Ошибки в СДК 2. Отсутствие каких либо библиотек (винду вроде переустанавливал?) 3. Ошибки в редактировании локации 4. Не подходящая фаза Луны). Это не шутка) Иногда (закономерность не обнаружил, но...) после работы в какой-то сторонней программе, чтения новостей в интернете и т.д. и т.п. бывает что СДК на стадии открытия локации зависает наглухо с такой же ошибкой и помогает только диспетчер задач... И это еще не всё - в это же время не запускается Сталкер - т.е. абсолютно любое сохранение и НИ на первой секунде входа в игру виснет намертво без лога и спасает опять же "кантрол+шифт+делейт". Что характерно - после непродолжительных танцев с бубном, то бишь пары перезагрузок компьютера, или оставление оного в покое например на сутки, всё возвращается в норму - и СДК загружается и работает нормально и Сталкер грузит любое сохранение...
  3. Вот так: Взято из НС, расписано подробнее некуда, кому надо - дерзайте)
  4. Как то так: [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 минуты спустя проверь библиотеки, вроде ругается на KernelBase.dll
  5. Зачем такие сложности и замусоривание апдейта? Можно ведь сделать проще, тем более, что любой мод одним найденным/поднятым предметом явно не обойдется. Итак, идем в тот же бинд_сталкер, ищем функцию 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 минуты спустя блин, просто напросто в свою локацию из оригинальной переместить файлы level.ai, level.gct, level.graf, конечно при условии, что в остальных локациях эти файлы оригинальные, и game.graf тоже
  6. Ну, как вариант, поставить в нужном месте рестрикор с необходимыми размерами и высотой, ограничить его срабатывание каким либо условием, например инфопоршнем выдаваемым перед тем, как ГГ полезет туда откуда может шмякнутся, и при попадании в него ГГ выполнять то, что нужно. Как-то так: [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 минуту спустя Так о чем я и говорил с самого начала). Дополнено 24 минуты спустя первый спойлер Level Editor пункт 9 "Облет камеры"
  7. Гм... Хотелось бы для общего развития узнать, как в таком коде: 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 минут спустя чудес не бывает, нужно искать дубликат секции combat ignore
  8. Так чтобы не путаться) Ну в принципе моё дело предложить, я не настаиваю) Гм... И? Если мне память не отшибает, то у них у всех всего одно состояние, и они все кемперы, то бишь тусуются кучкой вокруг одной общей точки.
  9. Разве? В скрипте для обоих состояний одна и та же логика, причем секции дублируются, например 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 одна и та же логика? По идее тут должен быть вылет, ибо игра вряд ли может понять "кто есть кто", и кто что должен делать. Посмотри внимательнее, как сделано у меня - для каждого НПС в скрипте отдельный код для каждого состояния с ссылкой на РАЗНУЮ секцию логики, соответственно в конфиге для каждого НПС две секции логики для каждого состояния. Представь себе - работает)))
  10. Ну может быть задать для каждого состояния то, что он должен делать? Т.е. Для состояния 0 - одна логика, для состояния 1 другая? Как пример простейшего гулага с двумя состояниями: гулаг.скрипт: гулаг.лтх: И всё нормально работает:
  11. sounds есть в 4 и 5 архиве. Проблема не в этом, повторю "условие задачи загадки"): - При наличии в корне игры папки gamedata, и отсутствии db-архивов (gamedata.db0-gamedata.dbb удалены, их нет в корне игры) - всё нормально, игра запускается, работает. Проблема начинается после упаковки геймдаты в db-архивы. Причем поисковик показывает, что эти файлы присутствуют по указанному в вылетах пути. Так с него и начинал) А вообще, пробовал разными конвертерами. ПС. Вообще склоняюсь в сторону "криворукости", хотя не понимаю каким образом - если кидаю свои звуки, модели, шейдеры в геймдату и упаковываю её в архивы, а скрипты, конфиги, аллспавн и т.д. в отдельный архив, то начинаются танцы с вылетами по [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 А вот если оригинал (урезанный) упаковать отдельно, а мои все файлы отдельно, то всё работает.
  12. Смутил тот момент, что если не трогать архивы ТЧ, а тупо упаковать геймдату с изменениями, обозвать типа *.dbz, (Во вносимых изменениях есть и добавленные звуки), и добавить в корень игры, то почему-то всё работает) Возможно конечно и распаковщик, однако для распаковки после возникновения проблемы пробовал и STALKER_Data_Unpacker_RU и S.T.A.L.K.E.R. UE и Распаковщик + Упаковщик db архивов XrCompress от 11.02.2016 для ТЧ, ЧН, ЗП. В общем пока загадка) [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 в упаковщике.
  13. [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 для ТЧ, ЧН, ЗП
  14. Найти в 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: За иконку девайса отвечают строки: 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 это начало координат иконки в файле):
  15. слегка поправлю: [smart_terrains] esc_kamp = {-nachalo_done} true esc_fabrika_bandit = {+nachalo_done} true
  16. Здравствуйте. Образовалась проблема. Возникла необходимость немного изменить ограждение локации. Взял файл локация_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() ошибки пока проигнорировал, локация скомпилировалась, но... в игре происходит бяка, причем постоянно в одном и том же месте: Что это? Что-то с сектором или порталами? Почему только здесь? Как с этим бороться?
  17. Не совсем верно, вот часть кода НПС из аллспавна: [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 минуты спустя Всё достаточно просто. Например есть простейшая логика логика: [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" В общем, немного знаний и упорства, и с нпс можно творить практически всё, что угодно - заставить его ходить или сидеть, бегать или играть на гитаре, есть, пить, отыгрывать анимации и т.д. и т.п.
  18. Я давал ссылочку на вики, там можно найти всё, что угодно. Но как пример..... Аллспавн алайф_локация: Аллспавн вай_локация: gulag_локация.script: gulag_локация.ltx в config/misc В принципе всё. Соответственно либо создать своих новых нпс, либо использовать имеющихся. Настойчиво повторяю просьбу - изучить материалы на сталкер-вики, там всё достаточно подробно расписано, а вот если что-то не получается, то можно и спросить, а не требовать всё готовое)
  19. Так отправить его куда нужно, делов-то... Как пример: [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 и почитать, там много интересного, а если что непонятно то и спросить можно)
  20. Да, есть и все нормально работают. Попробуй для начала оставить здеь один инфопоршень и проверить сам гулаг, может что-то тут не сходится: 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
  21. Спасибо, попробую) Я уже точно не помню, но вроде 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
  22. Любым удобным способом. Можно из рестриктора, из другой функции, при выдаче инфопоршня и т.д... из рестриктора, при попадании в него гг: [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
  23. Есть 6 нпс, двое из них с увеличенным иммунитетом. По сюжету гг с этими нпс проходит определенный маршрут с несколькими боёвками, затем переходят на другую локацию, затем после дохождения до нужной точки все телепортируются. Соответственно в зависимости от прохождения, на локацию где все телепортируются могут дойти как все шесть, так и пять, и четыре и три и два (двое доходят обязательно). Далее, после диалога со всеми дошедшими они идут в телепорт и удаляются. После того, как все нпс удалены необходимо, запустить функцию. Т.е. отследить, есть ли на локации эти нпс, и если их нет, то запускаем нужную функцию. В принципе всё это реализовано и работает, но как я уже говорил, хотелось бы сделать проверку отсутствия этих нпс на локации одной функцией. Дополнено 10 минуты спустя Нужно вызвать функцию game_credits из xr_effects.script и запустятся титры