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

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

17 часов назад, _Sk8_AsTeR_ сказал:

где НПС предлагает рандомный итем из таблицы в скрипте. То есть по факту НПС предмет не имеет.

 

17 часов назад, _Sk8_AsTeR_ сказал:

Будет выполнена проверка инвентаря НПС на наличие аптечки. Если такая есть, то НПС ответит - есть

Чет у меня не сростается - так предмет должен быть у непися али нет ?

 

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

@AndreySol, по задумке предмет, который мы хотим получить от НПС должен быть у самого НПС, иначе он скажет - извини, брат, аптечек лишних нету.
@Kirgudu, прошу прощения, да. Имеем диалог (фрагмент): 

Скрытый текст



function init_exchanging_items_dialog(dlg)
   local intro_phrase = exchanging_items_intro_phrase[math.random(1, table.getn(exchanging_items_intro_phrase))]   --рандомная фраза из таблицы с приветствиями
    phr0 = dlg:AddPhrase(intro_phrase, "0", "", -10000)  --фраза 1
	phr1 = dlg:AddPhrase(exchanging_items_phr_1, "1", "0", -10000) -- фраза 2, вызывающая ниже написанную функцию
	    phr1:GetPhraseScript():AddAction("exchanging_items.give_message_proposed_items")  --вызывается функция по нашему диалогу в ответах (второй спойлер внизу)
									...продолжение диалогов...
end

 

Готовая функция, вызываемая из диалога (фрагмент): 

Скрытый текст



function give_message_proposed_items(first_speaker, second_speaker)	
 local Art, Item, Outfit, Wpn, TxtArt, TxtItm, TxtOutfit, TxtWpn   --переменные итемов
 local npc_rank = ranks.get_obj_rank_name(first_speaker)    -- переменные рангов (в этом фрагменте кода пример с новичком)
    if npc_rank == "novice" then		
        Art = GetRndItemFromTable(arts_table_novice)  --переменной Art присваевается случайный арт из заранее прописанной таблицы
		Outfit = GetRndItemFromTable(outfits_table_novice) --тоже самое с бронёй
		Item = GetRndItemFromTable(items_table_novice)  --тоже самое с предметами
		Wpn = GetRndItemFromTable(weapons_table_novice) --тоже самое с оружием

	    ProposedArtRank = Get_Number_Item(Art, arts_table_novice)    --если не ошибаюсь, то в диалоге предлагается (отображается) выбранный артефакт
        ProposedOutfRank = Get_Number_Item(Outfit, outfits_table_novice)    --тоже самое с бронёй
        ProposedItmRank = Get_Number_Item(Item, items_table_novice)   --тоже самое с предметами
        ProposedWpnRank = Get_Number_Item(Wpn, weapons_table_novice)   --тоже самое с оружием
    end
  TxtArt = game.translate_string(get_inv_name(Art))
		TxtOutfit = game.translate_string(get_inv_name(Outfit))
	    TxtItm = game.translate_string(get_inv_name(Item))
		TxtWpn = game.translate_string(get_inv_name(Wpn))
		
		InArt = Art
		InOutf = Outfit
		InItm = Item
		InWpn = Wpn
	  db.actor:give_talk_message("%c[255,250,194,87]Артефакт:%c[255,87,250,240] "..TxtArt, "ui\\ui_iconstotal", Frect():set(0,188,83,47), "iconed_answer_item")
	  db.actor:give_talk_message("%c[255,250,194,87]Костюм:%c[255,87,250,240] "..TxtOutfit, "ui\\ui_iconstotal", Frect():set(0,329,83,47), "iconed_answer_item")
	  db.actor:give_talk_message("%c[255,250,194,87]Предмет:%c[255,87,250,240] "..TxtItm, "ui\\ui_iconstotal", Frect():set(0,423,83,47), "iconed_answer_item")
	  db.actor:give_talk_message("%c[255,250,194,87]Оружие:%c[255,87,250,240] "..TxtWpn, "ui\\ui_iconstotal", Frect():set(0,517,83,47), "iconed_answer_item")
  end --конец функции

 

В последней функции для реализации моей идеи почти все лишнее. В этой функции, вызываемой из скриптового диалога, как-то нужно реализовать проверку НПС на нужный итем (medkit). Если true, то НПС даст диалог: поделюсь аптечкой. Если False, то, мол: Извини брат, нет лишних аптечек.

Подскажите, мил-люди, как сделать проверку НПС на определенный предмет? Своих мозгов не хватает :(

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

@_Sk8_AsTeR_, если отвечать по существу вопроса, и если функция give_message_proposed_items вызывается во фразе НПС, тогда:

function give_message_proposed_items(first_speaker, second_speaker)
  if first_speaker:object("medkit") ~= nil then
    -- предмет есть
  else
    -- предмета нет
  end
end

Только тебе вместо "medkit" надо ещё передать в функцию, какой именно предмет ты запрашиваешь, ведь до собственно проверки ты случайным образом берёшь его из таблицы допустимых предметов.

Это первое. А второе - по-хорошему, тебе надо генерить фразы диалога так, чтобы они шли списком: либо "мне нужно 1. это; 2. это; 3. это" от имени ГГ, либо "у меня есть 1. это; 2. это; 3. это" от имени НПС, и с дальнейшим выбором нужного пункта игроком.

Рекомендую взять здесь в скриптах «Чистого Неба» модуль guiders.script и посмотреть, как там реализовано формирование диалога с доступными для перехода точками и выбор из них нужной.

 

Впрочем, не исключено, что кто-нибудь посоветует что-то попроще.

Изменено пользователем Kirgudu
  • Спасибо 1
Ссылка на комментарий

@Kirgudu, от души благодарю! Заработало всё как надо! Передал НеПиСю аптечку, он сначала сам вылечился, обменяться не предложил. А вот вторую аптечку уже предложил мне обменять! То что надо! Огромное спасибо!

А еще вопрос. Как можно проверить все в тех же скриптах, является ли НПС другом? То есть if НПС друг, then выполнение скрипта обмена аптечкой, Else отбой, грубо говоря.

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

Не стоит игнорировать возможность поискать самому ответы на простые вопросы.

Например, поиск в скриптах оригинала по слову «friend» даёт массу интересных результатов, в том числе dialogs.is_friend(first_speaker, second_speaker) и dialogs.is_not_friend(first_speaker, second_speaker).

Также много полезной информации даст поиск по «enemy» и «relation».

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

@Kirgudu, и снова огромное спасибо! Благодаря последней подсказке реализовал кучу новых фишек для себя! Я конечно новичок и дурачок, но схватываю на лету! Еще раз благодарю! 

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

[ЗП/СоС]

Как прочесть/выставить режим огня для оружия, с помощью нет-пакетов?

Если есть готовые примеры, ткните, пожалуйста.

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

Здрасьте.

 

Солянка 2010, экзоскелет СКАТ-15М [scripts\meceniy_outfit.script].

Пытаюсь научить костюм регистрировать смерть носителя. Добавил приведенный ниже сегмент, костюм перестал делать припарки мертвому, но теперь просто спамит сообщением о смерти. Как так сделать, чтобы это сообщение выводилось только один раз? На мой неискушенный взгляд, условие написано как "если мертв, показать сообщение, _иначе_ обработать весь старый скрипт (включая приращение переменной t_upd)".

 

[новый текст]

function on_actor_update()

    local act = db.actor
    if not act:alive() then
        news_manager.send_tip(act, "%c[skat_name]".."Система жизнеобеспечения:".."\\n".."%c[skat_msg]".."носитель мертв.".."\n", nil, nil, 30000)

    elseif t_upd<time_global() then

 

https://drive.google.com/open?id=1qxS9CaauRCcHkQjk0Onqq-OZBpbsyJcg

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

Ссылка на комментарий
1 час назад, Norman Eisenherz сказал:

чтобы это сообщение выводилось только один раз?

Добавить переменную, в которую будем сохранять факт смерти хозяина костюма, и на апдейте обрабатывать её. Типа так:

local is_died = false

function on_actor_update()

    local act = db.actor
    if not act:alive() and not 
is_died then
        news_manager.send_tip(act, "%c[skat_name]".."Система жизнеобеспечения:".."\\n".."%c[skat_msg]".."носитель мертв.".."\n", nil, nil, 30000)

       is_died = true

    elseif t_upd<time_global() then

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

 

P.S. Вот только не понятно зачем отслеживать смерть актера(ГГ), ведь игрок и так получит на экран стандартное сообщение о смерти, и обычно после этого сразу загружаются с какого то сейва.

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

@Norman Eisenherz

local actor_alive = true
function on_actor_update()
...
	if actor_alive and not act:alive() then
		actor_alive = false
		news_manager.send_tip(...)

Но лучше для гибели актора использовать специальный callback.death, как в xr_motivator.script для НПС.

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

Работает, спасибо.

 

Если я правильно понимаю, состояние "true" _любой_ указанной в начале переменной означает "исполнять скрипт дальше", а перевод переменной в состояние "false", соответственно, выключает оставшийся скрипт? 

 

Касательно отслеживания смерти: по умолчанию костюм пытается лечить мертвого и спамит сообщениями о примененных аптечках, поэтому условие начала лечения все равно надо было менять. Сообщение о смерти – попытка сделать костюм "умным" до конца.

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

Ссылка на комментарий
7 часов назад, Norman Eisenherz сказал:

означает "исполнять скрипт дальше"

Правильнее будет говорить не о всем скрипте а о конкретной функции. Начальное состояние переменной не означает какого-то конкретного действия, все определяется условиями проверки переменной в ф-ции. Как напишешь - так и будет работать.

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

Всем привет. Кто знает как реализовать расширенное контекстное меню для аддонов, чтобы было видно название оружия к которому приклепляешь аддон. Например "прикрепить гранатомет к ак-74". Желательно без правок внутри движка. Знаю, такое было в S.N.I.P.E.R, а движок там не был затронут. Кто знает такой мод, или как реализовать либо вытащить такую фичу, очень прошу сообщить

jpwsa5byp73nyaufrbis15dcci1y.png
 

Ссылка на комментарий
5 часов назад, DoberBull сказал:

Желательно без правок внутри движка.

Сомнительно. Все формирование контекстной менюшки происходит в движке.

Ссылка на комментарий
5 hours ago, DoberBull said:

Желательно без правок внутри движка. Знаю, такое было в S.N.I.P.E.R, а движок там не был затронут

Это вряд ли возможно. Текст для всех меню в движке.

То есть или движок правился или это был не ТЧ.

Ссылка на комментарий
2 часа назад, lordmuzer сказал:

был не ТЧ

Так точно, это был мод S.N.I.P.E.R для ЗП. Вот и интересно, можно ли выдернуть оттуда. Там точно знаю не в движке, я с разными проверял. Вроде все в скриптах, но пока конкретного скрипта отвечающего за это я не обнаружил 

jpwsa5byp73nyaufrbis15dcci1y.png
 

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

Подскажите пожалуйста, какая функция РЕАЛЬНО передает предмет от ГГ к НПС? dialog.relocate_item (или какое там название у этой ф-ции) делает лишь видимость. По факту у ГГ просто отнимается предмет. НПС он не передается (проверял). Как передать предмет НПС? Или костыльно (как заспавнить предмет у нпс через скрипт?) Заранее благодарю!

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

Заглядывай по чаще в "Справочник по ф-циям и классам".

actor:transfer_item(transfer_obj, npc)

Как получить объекты актера, НПС и перемещаемого предмета разберешься сам. Или с этим то же проблемы ?

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

@AndreySol, благодарю, сенсей! Строг ты и суров, но подсказки твои работают! Но столкнулся с проблемкой. Смотри, реализовал идею с твоей подсказкой следующим образом:

Скрытый текст

function name(npc, actor)

function item(actor)
actor:iterate_inventory(keep_item, actor)
end

function keep_item(actor, item)
if item:section() == "medkit" then
actor:transfer_item(item, npc)
end
end

item(actor)
end

 

Аптечка передается и у НПС она появляется. Только передаётся не 1 аптечка, а сразу все medkit что в рюкзаке у ГГ. Сразу 10, 20, одной передачей. Как пофиксить? Под ночь не соображу никак :( 

Вдруг еще сможешь помочь!

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

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

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

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

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

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

Войти

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

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

×
×
  • Создать...