Zander_driver 10 334 Опубликовано 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 334 Опубликовано 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 334 Опубликовано 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, а как вызываешь функцию? Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти