Svoboда 3 Опубликовано 23 Апреля 2009 Поделиться Опубликовано 23 Апреля 2009 Тема для обсуждения скриптов всего и всех в серии игр STALKER. Задавая вопрос (!): 1. Внимательно изучите суть вопроса. Вопрос должен соответствовать выбранной Вами темы. Это поможет сохранить порядок и читабельность темы, а также облегчит поиск и понимание сего; 2. Изучите то, что уже есть в теме (пролистайте "руками", воспользуйтесь поиском на форуме); 3. Изучите информацию которая может вам помочь: Stalkerin. Там есть много хороших статей касательно данной темы.Уроки по модостроению. Есть рабочие примеры готовых скриптов различного назначения. Справочное руководство по языку Lua 5.1https://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual/ruСправочник по функциям и классам. Собрано много информации по функциям и классам, не всем, но по основные сведения предоставлены. Логика со вступлением и четырьмя частями: ВступлениеЧасть перваяЧасть втораяЧасть третьяЧасть четвертая. Smart_terrain (в простонароде - гулаг)Интересный способ настроики логики для гулаговСкриптовая часть игровой логики 4. Дабы не превращать обсуждение в "кашу" разной информативной направленности, задавайте несколько вопросов по порядку (в разных постах) после того, как получите ответ на предыдущий вопрос; 5. "Спасибо" и тому подобное - будьте так любезны в ПМ. Если не любите писать в ПМ, в конце вопроса напишите фразу: "Заранее спасибо!" - или что-то в этом духе; 6. ПОЖАЛУЙСТА! Указывайте, для какой игры Вам необходима информация (ТЧ, ЧН, ЗП), если стоит мод - укажите название мода; 7. Если Вы что-то сделали и результат не такой, какой Вами задумывался, то, пожалуйста, приводите коды которые Вы изменяли/писали целиком! Это поможет другим правильно ответить на Ваш вопрос, а также оградит Вас от лишней писанины. 8. Оформляйте сообщение. Пользуйтесь тегами для того, чтобы отделить код от текста. Пишите грамотно - ПОЛЬЗУЙТЕСЬ ЗНАКАМИ ПРЕПИНАНИЯ. 9. И помните: «Правильно заданный вопрос – половина ответа». Какие вопросы следует задавать, а какие нет... Задавайте вопросы, которые касаются непосредственно скриптов и их работы, т.е. Вы что-то делаете, а у Вас что-то не получается, при этом у Вас на руках должен быть хотя бы какой-то код, свидетельствующий о Вашей причастности к вопросу. Вопросы которые будут удалятся, следовательно их задавать не нужно:-- Где находится та или иная функция? Для ответа используем поиск по словам среди файлов оригинальной игры или мода, если объект поиска относится к нему, при помощью программы, которая Вам наиболее симпатизирует;-- Как сделать что-то/то-то? С подобными вопросами, либо в "ковырялки", где Вам вероятнее всего так же не ответят, либо выдвигаем мысли, подкреплённые теорией, практикой (идеальный вариант) и здравым рассудком;-- Вопросы со смыслом: "сделайте", "совместите" и подобными глаголами повелительного наклонения.-- К тому же удалению будут подвергаться вопросы, в которых масштабно не используются теги, для отделения кода и цитат от основного текста, а также не вписан в спойлер код размером превышающие семь строк.Ответ на возможно возникший вопрос: В какую тему можно обратиться по поводу логики и спавна объектов? В тему "ковырялок" соответствующей версии игры, для которой Вы задаёте вопрос. И последнее: очень рекомендовано к прочтению Правила форума 1 2 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/
_Sk8_AsTeR_ 122 Опубликовано 20 Апреля 2019 Поделиться Опубликовано 20 Апреля 2019 Как можно получить значение переменной из другого скрипта? Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/489/#findComment-1259200
Overfirst 637 Опубликовано 20 Апреля 2019 Поделиться Опубликовано 20 Апреля 2019 (изменено) @_Sk8_AsTeR_, объявить таковую в одном скрипте и обратиться в другом. Объявлять без служебного слова local. Пример - db.script с известным множеством таблиц, которые много откуда читаются и используются в некоторых целях. Объявление: zone_by_name = {} А в каком-нибудь xr_conditions.script: function actor_in_zone(actor, npc, p) local zone = db.zone_by_name[p[1]] return utils.npc_in_zone(db.actor, zone) end Изменено 20 Апреля 2019 пользователем Overfirst 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/489/#findComment-1259201
Graff46 620 Опубликовано 20 Апреля 2019 Поделиться Опубликовано 20 Апреля 2019 @_Sk8_AsTeR_, можно ещё написать ф-цию которая возвращает значение нужной переменной, в другом скрипте создаете переменную с приравниванием к вызову ф-ции. Скрытый текст -- файл скрипта, например my_script.script -- local a = 5 -- переменная function get_a() return a end -------------------------------- --- файл скрипта 2 "не важно имя файла" -- local a = my_script.get_a() -- теперь у нас в этом скрипте есть переменная "а" такая же как в "my_script.script" ----------------------------------------- 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/489/#findComment-1259209
Fenrir02 199 Опубликовано 20 Апреля 2019 Поделиться Опубликовано 20 Апреля 2019 @mole venomous, Закрыть инвентарь при использовании чего-либо можно так: Скрытый текст local objects = { [ "medkit" ] = true, } function on_use( obj ) if objects[ obj:section() ] then local input = level.main_input_receiver() if input then level.start_stop_menu( input, true ) -- Закрываем инвентарь end end end -- Только такой способ знаю function on_block_inventory() cmd( "unbind inventory" ) end function cmd( scmd, ... ) local args = { ... } if #args > 0 then scmd = scmd .. ' ' .. table.concat( args, ' ' ) end get_console():execute( scmd ) end 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/489/#findComment-1259215
Назир Мухаметханов 0 Опубликовано 25 Апреля 2019 Поделиться Опубликовано 25 Апреля 2019 Всем привет, вот такой словил ЛОГ вылета на Сталкер ЧН, думаю что из-за "не найденных анимаций" в HD Моделе NPC Expression : motion_ID.valid() Function : CKinematicsAnimated::ID_Cycle File : E:\priquel\sources\engine\Layers\xrRender\SkeletonAnimated.cpp Line : 208 Description : ! MODEL: can't find cycle: Arguments : idle Нужна помощь как можно решить, или в чем проблема Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/489/#findComment-1260075
blackburn1489 0 Опубликовано 1 Мая 2019 Поделиться Опубликовано 1 Мая 2019 (изменено) Подскажите пожалуйста, возможно ли такое реализовать на движке COP/COC, и если да, то какие могут быть подводные камни? У меня появилась идея усложнить систему фаст тревала, когда ГГ может попросить НПС-проводника провести его к определенной точке. А именно: ГГ с проводником могут попасть в засаду реальных НПС и мутантов, которые находились "по маршруту" фаст тревела. В теории это выглядит так: когда игрок выбирает точку для фастревела, скрипт берет текущую позицию ГГ и начинает "чертить маршут" от смарт террейна к смарт террейну - пока не дойдет до точки выбранной игроком. Но если на одном из этих смарт терейнов будет враждебный НПС или мутант - то ГГ и проводник телепортятся недалеко от этого смарт терейна и все враги находящиеся там- атакуюют ГГ. Пример: ГГ в деревне новичков просит НПС сопроводить его до определенного места в темной долине. В это время на АТП находятся бандиты, которые враждебны ГГ. ГГ и проводник телепортятся возле АТП и вступают в бой с бандитами -- зы: язык Lua для меня новый и я только собираюсь его начать изучать, чтобы реализовать подобный скрипт Изменено 1 Мая 2019 пользователем blackburn1489 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/489/#findComment-1261349
Norman Eisenherz 354 Опубликовано 3 Мая 2019 Поделиться Опубликовано 3 Мая 2019 Здрасьте. Слепил уборщик бесхозного оружия: • вызов из [scripts\bind_stalker.script] actor_binder:net_spawn(data); • удалять все, кроме списка исключений; • на текущей локации удалять, если рядом нет трупов; • на других локациях удалять просто так. Проблема: если вызывать скрипт каким-нибудь триггером (сброс бинта, например) в уже прогруженной локации, то ближайшие трупы учитываются и пушки, соответственно, лежат на месте. При вызове из "net_spawn" трупы в процессе прогрузки не обнаруживаются. Вариант 1: https://drive.google.com/open?id=1-K5gPW3q3AUPN1bGXfEjBZ1Uj8kecjwh Добавил задержку запуска через level.client_spawn_manager: трупы обнаруживаются и при вызове из "net_spawn", хотя задержка всего ничего. Вариант 2: https://drive.google.com/open?id=1eEcuoF9Daw150FPWxpsAkXodliqAE2x1 Выходит, трупы на текущей локации загружаются чуть позже ГГ. Как это обойти без костылей? Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/489/#findComment-1261740
_Sk8_AsTeR_ 122 Опубликовано 3 Мая 2019 Поделиться Опубликовано 3 Мая 2019 Ребят, вопрос - загадка. С вашей помощью огромной наваял скриптец, благодаря которому через нетпакеты будут перебираться реально существующие НПС, их имена записаться в таблицу, и в итоге от их имени будут сообщения в чат приходить. И так случилось, что практически в начале игры (успел только АТП зачистить вначале) мне отписался Фанат. Официально он появляется после х-18, но он у меня отписался намного раньше. Скрытый текст function table_update_pda() tab = {"пусто"} -- обнуляем таблицу всех НПС tab_newbIes = {"new"} -- обнуляем таблицу новичков for i = 1, 65535 do local sobj = alife():object(i) if (sobj) and IsNpcStalker(sobj) then -- проверка на фракцию (только сталкер, долг, фридум, грин) local pk = get_netpk(sobj) if pk and pk:isOk() then local data = pk:get() local charname = data.character_name table.insert(tab, charname) if (sobj) and is_npc_newbie(sobj) then -- проверка на новичка table.insert(tab_newbIes, charname) end end end end end Так вот вопрос, игра где-то спавнит Фаната намного раньше, или я не понимаю как работает моя ф-ция? Помогите разобраться, ибо интрига! Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/489/#findComment-1261818
AndreySol 215 Опубликовано 3 Мая 2019 Поделиться Опубликовано 3 Мая 2019 8 часов назад, Norman Eisenherz сказал: Как это обойти без костылей? Попробуй в апдейте биндера: if device().precache_frame <= 1 then ....тут вызывай свой уборщик.... end 2 часа назад, _Sk8_AsTeR_ сказал: Официально он появляется после х-18, но он у меня отписался намного раньше. Фанат прописан в all.spawn, по этому спавнится с самого начала НИ, но до момента "Х" сидит в офф-лайне. А в чем проблема? Типа, до появления в качестве замены Волку в ДН, Фанат лежит в анабиозе в секретной лаборатории? И по тому не может писать сообщения, как любой другой сталкер? Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/489/#findComment-1261836
Norman Eisenherz 354 Опубликовано 3 Мая 2019 Поделиться Опубликовано 3 Мая 2019 @AndreySol Теперь на текущей локации вообще пушки не удаляются (вариант скрипта 1). Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/489/#findComment-1261838
naxac 2 571 Опубликовано 3 Мая 2019 Поделиться Опубликовано 3 Мая 2019 @Norman Eisenherz, делай проверку не по клиентским объектам, а по серверным. Я смотрю, у тебя получается в цикле на 65535 ещё один цикл на 65535, это же аццкий ад какой-то. Не лучше будет пройтись один раз по всем объектам, разложив их по таблицам, а потом по этим таблицам уже проверять расстояния, паренты и т.д.?.. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/489/#findComment-1261839
Norman Eisenherz 354 Опубликовано 3 Мая 2019 Поделиться Опубликовано 3 Мая 2019 @naxac Старый уборщик всего и вся от мифического Сяка так и сделан, и я тоже планирую добраться до такой схемы. Но вопрос с загрузкой трупов остается. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/489/#findComment-1261841
Norman Eisenherz 354 Опубликовано 4 Мая 2019 Поделиться Опубликовано 4 Мая 2019 (изменено) Проблема: к серверному объекту невозможно применить проверку if not obj:alive(), хотя такая проверка есть в коде от Сяка. Код оригинального уборщика (солянка 2010): Spoiler for a=1,65534,1 do local obj = alife():object(a) if obj and game_graph():valid_vertex_id(obj.m_game_vertex_id)then local obj_clsid = obj:clsid() local obj_level = game_graph():vertex(obj.m_game_vertex_id):level_id() if IAmAStalker[obj_clsid] and obj_level~=actor_level then if not obj:alive() then Мой код: Spoiler local act_lv = game_graph():vertex( act:game_vertex_id() ):level_id() local bodies = {} for i = 0, 65535 do local obj = alife():object(i) if obj and game_graph():valid_vertex_id( obj.m_game_vertex_id ) then local obj_lv = game_graph():vertex( obj.m_game_vertex_id ):level_id() if IsStalker(obj) and obj_lv == act_lv then if not obj:alive() then table.insert(bodies, obj) end end Изменено 4 Мая 2019 пользователем Norman Eisenherz Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/489/#findComment-1261845
Norman Eisenherz 354 Опубликовано 4 Мая 2019 Поделиться Опубликовано 4 Мая 2019 Попробовал проверку через свойство вместо метода: if IsStalker(obj) and not obj.alive and obj_lv == act_lv Обнаруживается единственный труп – сам Меченый. Настоящие трупы и еще живые NPC в список не попадают. Меченый – вампир? 2 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/489/#findComment-1262022
naxac 2 571 Опубликовано 4 Мая 2019 Поделиться Опубликовано 4 Мая 2019 (изменено) Цитата к серверному объекту невозможно применить проверку if not obj:alive() Почему это? Она вполне работает. Например переделанном уборщике для ОП-2: https://github.com/naxac/CP2_AddOn/blob/master/gamedata/scripts/sak_off_corpses.script Изменено 4 Мая 2019 пользователем naxac 2 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/489/#findComment-1262084
Капрал Хикс 561 Опубликовано 4 Мая 2019 Поделиться Опубликовано 4 Мая 2019 21 час назад, Norman Eisenherz сказал: от мифического Сяка С чего это "мифический" вдруг? Вполне реальный человек. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/489/#findComment-1262107
_Sk8_AsTeR_ 122 Опубликовано 4 Мая 2019 Поделиться Опубликовано 4 Мая 2019 Доброго дня! Подскажите пожалуйста вот с чем... Имеем мод на динамический костер "dynamic campfire". Так вот, там многих, так сказать, бочек с кострами нету. Каким образом можно получить название лагеря? Надеюсь правильно вопрос задал. Скрытый текст ["esc2_st_fabric_kamp_1"] = {flame = "zone_flame_small_0001", light = "lights_camp_fire_omni_r1_r2_0001"}, ["esc_bridge_kamp_point"] = {flame = "zone_flame_small_0002", light = "lights_camp_fire_omni_r1_r2_0002"}, ["esc_lager_camp_center"] = {flame = "zone_flame_small_0004", light = "lights_camp_fire_omni_r1_r2_0004"}, ["esc_killers_kamp"] = {flame = "zone_flame_small_0004", light = "lights_camp_fire_omni_r1_r2_0004"}, ["esc_blokpost_kamp"] = {flame = "zone_flame_small_0005", light = "lights_camp_fire_omni_r1_r2_0005"}, ["esc2_most_kamp_1"] = {flame = "zone_flame_small_0006", light = "lights_camp_fire_omni_r1_r2_0006"}, ["esc_assault_kamp_center1"] = {flame = "zone_flame_small_0007", light = "lights_camp_fire_omni_r1_r2_0007"}, ["esc_fabrika_bandit_camp_center"] = {flame = "zone_flame_small_0007", light = "lights_camp_fire_omni_r1_r2_0007"}, ["esc2_st_fabric_kamp_2"] = {flame = "zone_flame_small_0007", light = "lights_camp_fire_omni_r1_r2_0007"}, ["esc2_bandit_les_kamp_1"] = {flame = "zone_flame_small_0008", light = "lights_camp_fire_omni_r1_r2_0008"}, ["esc_stalker_camp_esc_fox_kamp"] = {flame = "zone_flame_small_0009", light = "lights_camp_fire_omni_r1_r2_0009"}, ["esc2_st_fox_place_kamp_1"] = {flame = "zone_flame_small_0009", light = "lights_camp_fire_omni_r1_r2_0009"}, ["esc_stalker_camp_camp_point"] = {flame = "zone_flame_small_0009", light = "lights_camp_fire_omni_r1_r2_0009"}, Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/489/#findComment-1262108
Norman Eisenherz 354 Опубликовано 4 Мая 2019 Поделиться Опубликовано 4 Мая 2019 @naxac То, что в другом коде работает, я знаю, но я ловлю вылет с ошибкой "attempt to call method 'alive' (a nil value)". Может, вообще не в этой проверке ошибка? Вот последняя версия (пока что "not obj.alive"): https://drive.google.com/open?id=1-K5gPW3q3AUPN1bGXfEjBZ1Uj8kecjwh Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/489/#findComment-1262111
Fenrir02 199 Опубликовано 5 Мая 2019 Поделиться Опубликовано 5 Мая 2019 @Norman Eisenherz, Попробуйте заменить for i = 0, 65535 do на for i = 1, 65535, 1 do 2 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/489/#findComment-1262119
Norman Eisenherz 354 Опубликовано 5 Мая 2019 Поделиться Опубликовано 5 Мая 2019 @Fenrir02 Это шаг обхода, и по умолчанию он как раз равен 1. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/489/#findComment-1262120
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти