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 Ссылка на комментарий
Zander_driver 10 343 Опубликовано 1 Августа 2012 Поделиться Опубликовано 1 Августа 2012 "No available phrase to say, dialog[escape_trader_test_2]" Это значит в каком то месте диалога - все последующие фразы снабжены прекондишенами, и ни один из них не вернул истину. Хотя бы одна доступная фраза всегда должна быть. Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на 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. Ссылка на комментарий
Struck 61 Опубликовано 1 Августа 2012 Поделиться Опубликовано 1 Августа 2012 Zander_driver, до этого я додумался...в функции выбора рандомной фразы поставил операторы >= и <=, но вылет остался. Прекондишны висят только там. Глянул твою функцию рандома, понял одно отличие, буду пробовать . Ссылка на комментарий
Artos 99 Опубликовано 1 Августа 2012 Поделиться Опубликовано 1 Августа 2012 Charsi, верно по сути, хотя более строго нужно было бы пояснить, что метод удаления alife():release(...) применим ТОЛЬКО к серверным об'ектам. Zander_driver: Ну вы бы читали хоть вышенаписанное. Я же уже привел пример как рандомный выбор реализовать С чего такое заключения, что мною НЕ было прочитано ...? К сожалению не корректно сформулировал свою мысл/совет, а не "не прочитал". Вот к твоему " его величество рандом во всей красе" вопрос на засыпку - организуй рандомную фразу самую первую в разговоре, типа чтобы не тупо попугайничали "Привет, как дела?", а рандомно "Привет/Здорово/Пошел нафиг" ... Вот тогда и будет понятен смысл мною сказанного. "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Zander_driver 10 343 Опубликовано 1 Августа 2012 Поделиться Опубликовано 1 Августа 2012 Artos Ну во первых, в том контексте поста речь не шла о именно первой фразе диалога. А для любой другой - ваше утверждение не верно) И что касается первой фразы, есть у меня одна идея. А если первые две фразы сделать "пустыми", т.е. без текста?) При скриптовой генерации диалога, такие фразы пропускаются - считаются как бы пустыми линками. Но ведь экшен из них вызвать можно. И в итоге первая не пустая фраза - будет вовсе уже не первой, но однако первой которую увидит игрок. И она уже может быть рандомной. Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на 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. Ссылка на комментарий
Struck 61 Опубликовано 1 Августа 2012 Поделиться Опубликовано 1 Августа 2012 Что-то ребята мои потуги ни к чему нормальному не приводят, первая фраза выбирается, а вот когда рандом срабатывает второй раз - вылетает.(с вышеуказанным логом) function random_phrase() return math.random(1,10) end function randomselect_1_2() return (random_phrase() < 6) end function randomselect_2_2() return (random_phrase() > 5) end Ссылка на комментарий
Artos 99 Опубликовано 1 Августа 2012 Поделиться Опубликовано 1 Августа 2012 (изменено) Zander_driver, если не указано, что не имеется ввиду 1-ая фраза - то это НЕ исключает ее из вопроса ... ;-) , где как раз и "его величество" теряет всю свою "красу". Мой пост как раз и обращад внимание на и этот момент. Для остальных фраз, подобный рандом хорош только для многократных диалогов, а не одноразовых (кои как раз и преобладают) и делается соответственно гораздо проще и менее русурсоемко, достаточно было взглянуть на готовые примеры в игре/модах. Ну а насчет "пустышек" - как-то хотел именно так сделать, но ... забросил, другие дела перебили. Попробуй и расскажи выйдет ли "во всей красе"? ;-) Добавлено через 2 мин.: Struck, не нужно забывать, что в менеджере диалогов запоминается последняя фраза и она исключается из списка доступных (так по крайней мере сделано в нормальых модах и в игровых многогратных диалогах). Т.о. или пиши для рандома не одну доступную фразу, а по-меньшей мере две ... или в диалоогах придется рекомендовать игрокам ждать некоторое время (чтобы забывались/забИвались фразы) Изменено 1 Августа 2012 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Struck 61 Опубликовано 1 Августа 2012 Поделиться Опубликовано 1 Августа 2012 (изменено) Artos, я добавил еще одну фразу, но вылет остался, вот код: function random_phrase() return math.random(1,15) end function randomselect_1_1() return (random_phrase() < 6) end function randomselect_1_2() return (random_phrase() > 5 and random_phrase() < 11) end function randomselect_1_3() return (random_phrase() > 10 and random_phrase() <= 15) end function t_news_dlg(dlg) phr0 = dlg:AddPhrase(intro_phrase[math.random(1, table.getn(intro_phrase))], 0, -1, -10000):GetPhraseScript() phr0:AddHasInfo("tutorial_end") phr1 = dlg:AddPhrase("Текст2", 1, 0, -10000):GetPhraseScript() phr1:AddAction("escape_dialog.costs") phr1:AddPrecondition("escape_dialog.randomselect_1_1") phr2 = dlg:AddPhrase(no_item_phrase[math.random(1, table.getn(no_item_phrase))], 2, 0, -10000):GetPhraseScript() phr2:AddPrecondition("escape_dialog.randomselect_1_2") phr3 = dlg:AddPhrase(no_item_phrase[math.random(1, table.getn(no_item_phrase))], 3, 0, -10000):GetPhraseScript() phr3:AddPrecondition("escape_dialog.randomselect_1_3") phr4 = dlg:AddPhrase("Текст4",4, 1, -10000):GetPhraseScript() phr5 = dlg:AddPhrase("Текст5",5, 2, -10000):GetPhraseScript() phr6 = dlg:AddPhrase("Текст6",6, 3, -10000):GetPhraseScript() end Изменено 1 Августа 2012 пользователем Struck Ссылка на комментарий
Zander_driver 10 343 Опубликовано 2 Августа 2012 Поделиться Опубликовано 2 Августа 2012 (изменено) Struck Посмотри внимательно что у тебя происходит... Ты в КАЖДОЙ функции прекондишена вызываешь math.random по 1-2 раза. Она же тебе возвращает рандомные числа. Таким образом, поведение каждой из функций рандомно и не зависит от остальных - существует вероятность, что все три не будут доступны, и произойдет вылет, И также есть вероятность что доступны будут все три. Неудивительно что вся эта чехарда не работает. Struck, не нужно забывать, что в менеджере диалогов запоминается последняя фраза и она исключается из списка доступных (так по крайней мере сделано в нормальых модах и в игровых многогратных диалогах). Т.о. или пиши для рандома не одну доступную фразу, а по-меньшей мере две ... или в диалоогах придется рекомендовать игрокам ждать некоторое время (чтобы забывались/забИвались фразы) Впервые об этом слышу. Возможно это и делается для каких то диалогов, для которых имеет смысл... но уж точно такого нет для любого диалога который мододелу вздумается добавить. Тем более что в множестве случаев такое поведение не желательно. В качестве примера та же система бартера в моде Жесть. Нет никаких препятствий тому чтобы несколько раз купить одно и то же. Изменено 2 Августа 2012 пользователем Zander_driver Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на 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. Ссылка на комментарий
Struck 61 Опубликовано 2 Августа 2012 Поделиться Опубликовано 2 Августа 2012 Zander_driver, точно, чего-то я не вник в ответы, сейчас со всем разобрался и работает как надо, спасибо за разъяснения. Ссылка на комментарий
Artos 99 Опубликовано 2 Августа 2012 Поделиться Опубликовано 2 Августа 2012 Zander_driver, что же тебя так тянет на абсолютные обобщения или наоборот на игнорирование частностей? :-) Ведь в процитированной тобою фразе ключевыми словами являются "многоКратных диалогах", т.е. диалогах типа приветствий, анекдотов, новостей о Зоне и т.п. , которые почему то ты не относишь к "любым" добавляемым модмейкерами. Диалоги типа бартерных НЕ контролируются менеджером диалогов (dialog_manager.script) поэтому стОит ли путать/подменять понятия? "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Shredder 49 Опубликовано 2 Августа 2012 Поделиться Опубликовано 2 Августа 2012 (изменено) Пытаюсь в скрипте приаттачить глушитель к оружию (ЗП). Оружие точно может иметь глушитель. Код функции ниже. После того как оружие возвращается из оффлайна в онлайн addon_flag снова равен 0. Что я делаю не так? function attach_silencer(wpn, silencer) if not silencer then silencer = db.actor:object(get_addon_silencer(wpn:section())) end if not silencer then return end local pk = get_netpk(wpn) local wpn_state = pk:get() if wpn_state.addon_flags == 4 then return end wpn_state.addon_flags = wpn_state.addon_flags + 4 pk:set(wpn_state) switch_offline_online(wpn:id()) _m.remove_item_by_id(silencer:id()) end function switch_online(id) if id == -1 then return end local serv_obj = alife():object(id) serv_obj.sim_forced_online = true if serv_obj.online ~= true then serv_obj:switch_online() end end function switch_offline(id) alife():object(id):switch_offline() end function switch_offline_online(id) local obj = level.object_by_id(id) if not obj then switch_online(id) return end local parent = obj:parent() if parent then parent:drop_item(obj) end switch_offline(id) logf('switch_offline [%d]', id) level.add_call(function() if not level.object_by_id(id) then logf('switch_online [%d]', id) switch_online(id) return true end return false end, function() end) end Изменено 2 Августа 2012 пользователем Shredder Ссылка на комментарий
Struck 61 Опубликовано 2 Августа 2012 Поделиться Опубликовано 2 Августа 2012 Подскажите какие файлы задействованы в создании диалога на мотив "Что можешь интересного рассказать?", кроме dialog_manager.script и dialog_manager.ltx. Что-то никак свой не получается добавить. Ссылка на комментарий
Artos 99 Опубликовано 3 Августа 2012 Поделиться Опубликовано 3 Августа 2012 (изменено) Shredder, ты не правильно понимаешь параметр 'addon_flag'. Это не просто число, а битовые флаги, т.е. каждый бит отображает состояние для трех навесов на оружие. Конечно, если этот параметр равен 0 и к нему прибавить 4, то вроде как должен получить желаемое значение, но все же более правильно это делать так: local pk = get_netpk(wpn,1) --/ получаем только 'state' пакет (зачем нам и 'update'?) local data = pk:get() --/ читаем данные из пакета if data.addon_flags and bit_and(data.addon_flags,4) ~= 4 then --/ битовый флаг глушителя не установлен? data.addon_flags = bit_or(data.addon_flags,4) --/ устанавливаем флаг "активного" глушителя pk:set(data) --/ запоминаем в пакет switch_offline_online(wpn:id()) _m.remove_item_by_id(silencer:id()) end Если после повторного прочтения пакета у тебя вновь будет не установлен флаг для глушителя - смотри еще где-то у себя ошибки/неточности. Далее не хочется гадать по твоим кодам перевода в оффлайн и обратно, в m_netpk.script имеется встроенная функция do_switchings(id), которая без проблем выполняет подобную операцию... Если же у тебя флаг сбрасывается именно после возвращения в онлайн - то ... я бы повременил до этого момента удалять собственно глушитель у актора (хотя сам таким способом и не пробовал приаттачивать). Добавлено через 7 мин.: Struck, тут все же топик по скриптам, а не по общим ковыряниям в файлах/конфигах, тем более даже не удосужился версию игры/мода указать ... Изменено 3 Августа 2012 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
NaslednikTutti 1 Опубликовано 3 Августа 2012 Поделиться Опубликовано 3 Августа 2012 Добрый день! Как активировать скрипт через логику нпс в ЗП? Поподробней расскажите пожалуйста. Не соответствует правилам. Ссылка на комментарий
ins33 16 Опубликовано 3 Августа 2012 Поделиться Опубликовано 3 Августа 2012 (изменено) NaslednikTutti, [logic] active = sr_idle@one [sr_idle@one] on_actor_inside = {+поршень} nil %=имя_скрипта.функцияl()% nil указывает на однократное срабатывание. Добавлено через 23 мин.: Пытаюсь запустить скрипт function in_loc() if level_name == "l05_bar" then return true else return false end end function metka_gost() printf ("Поговорить В Баре с Гостом") news_manager.send_tip(db.actor, "%c[255,0,255,0]ГОСТ\\n%c[default]Зайди в бар, дело есть.", 0, "trader", 10000) local obj = alife():story_object(504) --сид Госта local obj_id = obj.id function add_spot_on_map(obj_id,type,text) if obj_id then if not text then text = "no_text" end level.map_add_object_spot_ser(obj_id, type, text) end end function add_spot_on_map2(obj_id,type,text) metka_gost.add_spot_on_map(obj.id,"green_location","Поговорить с Гостом") end из бинд_сталкера. Прописывал в function actor_binder:update(delta) потм в function actor_binder:net_spawn(data) metka_gost.in_loc (actor, npc) return false end и получаю вылет. Подскажите, что не так сделал. Изменено 3 Августа 2012 пользователем ins33 Ссылка на комментарий
Struck 61 Опубликовано 3 Августа 2012 Поделиться Опубликовано 3 Августа 2012 (изменено) ins33, как я понял ты ставишь метку функцией add_spot_on_map2, а что такое там есть obj.id у тебя? В этой функции и надо получать тогда sid объекта. И что вот metka_gost.add_spot_on_map это за ахинея мне тоже неясно. И уровень ты неправильно определяешь...функция получения уровня level.name(), а не level_name. Да, и в биндере актора ты тоже вызываешь непонятно что(уровень в другом месте проверять надо), и непонятно как. В данном случае апдейт можно вообще не трогать, только net_spawn. Artos, все же этот вопрос относится больше к скриптам, чем к чему либо еще. Версия ТЧ 1.0004. Изменено 3 Августа 2012 пользователем Struck Ссылка на комментарий
ins33 16 Опубликовано 3 Августа 2012 Поделиться Опубликовано 3 Августа 2012 Struck, Делаю по уроку. имя_файла.add_spot_on_map(obj.id,"green_location","Текст") Какое имя_файла надо задать наверно не правильно понял. Но больше всего интересует, как в биндере актора правильно вызвать функцию проверки уровня. Ссылка на комментарий
Struck 61 Опубликовано 3 Августа 2012 Поделиться Опубликовано 3 Августа 2012 ins33, твою функцию нужно вызывать в net_spawn, и в самое начало вставить что-то типа: if level.name() == "l05_bar" then Это и будет проверкой уровня. У тебя функция неверная, 4 функции вместо одной. Ссылка на комментарий
NaslednikTutti 1 Опубликовано 4 Августа 2012 Поделиться Опубликовано 4 Августа 2012 Добрый день! Как заспавнить монстра через скрипт в ЗП? Это не хочет работать: function spawn_snork() alife():create("snork_indoor_normal",vector():set(-94.063316,-16.243137,-42.022018),2014,650) end Не соответствует правилам. Ссылка на комментарий
KD87 718 Опубликовано 4 Августа 2012 Поделиться Опубликовано 4 Августа 2012 NaslednikTutti, а как вызываешь функцию? Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти