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

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

"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.

Ссылка на комментарий
Zander_driver, до этого я додумался...в функции выбора рандомной фразы поставил операторы >= и <=, но вылет остался. Прекондишны висят только там. Глянул твою функцию рандома, понял одно отличие, буду пробовать :) .
Ссылка на комментарий

Charsi, верно по сути, хотя более строго нужно было бы пояснить, что метод удаления alife():release(...) применим ТОЛЬКО к серверным об'ектам.

 

Zander_driver: Ну вы бы читали хоть вышенаписанное. Я же уже привел пример как рандомный выбор реализовать

С чего такое заключения, что мною НЕ было прочитано ...? К сожалению не корректно сформулировал свою мысл/совет, а не "не прочитал".

Вот к твоему " его величество рандом во всей красе" вопрос на засыпку - организуй рандомную фразу самую первую в разговоре, типа чтобы не тупо попугайничали "Привет, как дела?", а рандомно "Привет/Здорово/Пошел нафиг" ... Вот тогда и будет понятен смысл мною сказанного. :crazy:

 

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

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

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.

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

Что-то ребята мои потуги ни к чему нормальному не приводят, первая фраза выбирается, а вот когда рандом срабатывает второй раз - вылетает.(с вышеуказанным логом)

 

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

 

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

Zander_driver, если не указано, что не имеется ввиду 1-ая фраза - то это НЕ исключает ее из вопроса ... ;-) , где как раз и "его величество" теряет всю свою "красу". Мой пост как раз и обращад внимание на и этот момент.

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

Ну а насчет "пустышек" - как-то хотел именно так сделать, но ... забросил, другие дела перебили. Попробуй и расскажи выйдет ли "во всей красе"? ;-)

 

Добавлено через 2 мин.:

Struck, не нужно забывать, что в менеджере диалогов запоминается последняя фраза и она исключается из списка доступных (так по крайней мере сделано в нормальых модах и в игровых многогратных диалогах).

Т.о. или пиши для рандома не одну доступную фразу, а по-меньшей мере две ... или в диалоогах придется рекомендовать игрокам ждать некоторое время (чтобы забывались/забИвались фразы)

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

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

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

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

 

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

Struck

Посмотри внимательно что у тебя происходит...

Ты в КАЖДОЙ функции прекондишена вызываешь math.random по 1-2 раза. Она же тебе возвращает рандомные числа. Таким образом, поведение каждой из функций рандомно и не зависит от остальных - существует вероятность, что все три не будут доступны, и произойдет вылет, И также есть вероятность что доступны будут все три. Неудивительно что вся эта чехарда не работает.

 

Struck, не нужно забывать, что в менеджере диалогов запоминается последняя фраза и она исключается из списка доступных (так по крайней мере сделано в нормальых модах и в игровых многогратных диалогах).

Т.о. или пиши для рандома не одну доступную фразу, а по-меньшей мере две ... или в диалоогах придется рекомендовать игрокам ждать некоторое время (чтобы забывались/забИвались фразы)

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

В качестве примера та же система бартера в моде Жесть. Нет никаких препятствий тому чтобы несколько раз купить одно и то же.

Изменено пользователем 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.

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

Zander_driver, что же тебя так тянет на абсолютные обобщения или наоборот на игнорирование частностей? :-)

Ведь в процитированной тобою фразе ключевыми словами являются "многоКратных диалогах", т.е. диалогах типа приветствий, анекдотов, новостей о Зоне и т.п. , которые почему то ты не относишь к "любым" добавляемым модмейкерами.

Диалоги типа бартерных НЕ контролируются менеджером диалогов (dialog_manager.script) поэтому стОит ли путать/подменять понятия?

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

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

Пытаюсь в скрипте приаттачить глушитель к оружию (ЗП). Оружие точно может иметь глушитель. Код функции ниже. После того как оружие возвращается из оффлайна в онлайн 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

 

 

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

Подскажите какие файлы задействованы в создании диалога на мотив "Что можешь интересного рассказать?", кроме dialog_manager.script и dialog_manager.ltx.

 

Что-то никак свой не получается добавить.

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

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, тут все же топик по скриптам, а не по общим ковыряниям в файлах/конфигах, тем более даже не удосужился версию игры/мода указать ...

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

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

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

Добрый день!

Как активировать скрипт через логику нпс в ЗП?

Поподробней расскажите пожалуйста.

 

Не соответствует правилам.

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

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

и получаю вылет. Подскажите, что не так сделал.

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

ins33, как я понял ты ставишь метку функцией add_spot_on_map2, а что такое там есть obj.id у тебя? В этой функции и надо получать тогда sid объекта. И что вот metka_gost.add_spot_on_map это за ахинея мне тоже неясно. И уровень ты неправильно определяешь...функция получения уровня level.name(), а не level_name.

 

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

 

Artos, все же этот вопрос относится больше к скриптам, чем к чему либо еще. Версия ТЧ 1.0004.

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

Struck, Делаю по уроку.

 

имя_файла.add_spot_on_map(obj.id,"green_location","Текст")

 

Какое имя_файла надо задать наверно не правильно понял.

 

Но больше всего интересует, как в биндере актора правильно вызвать функцию проверки уровня.

 

 

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

ins33, твою функцию нужно вызывать в net_spawn, и в самое начало вставить что-то типа:

 

if level.name() == "l05_bar" then

 

Это и будет проверкой уровня.

 

У тебя функция неверная, 4 функции вместо одной.

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

Добрый день!

Как заспавнить монстра через скрипт в ЗП?

Это не хочет работать:

function spawn_snork()
alife():create("snork_indoor_normal",vector():set(-94.063316,-16.243137,-42.022018),2014,650)
end

Не соответствует правилам.

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

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

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

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

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

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

Войти

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

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

    • Ни один зарегистрированный пользователь не просматривает эту страницу.
×
×
  • Создать...