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

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

Товарищи! Помогите, нужна функция проверки при снятии костюма и функция при попадании в рюкзак. Не в целом к ГГ а именно в рюкзак. 

Поделиться этим сообщением


Ссылка на сообщение
Поделиться на других сайтах

@karavan, снимать костюмы, вроде только гг умеет, нпс максимум, что визуал меняют.

Поделиться этим сообщением


Ссылка на сообщение
Поделиться на других сайтах
22 часа назад, karavan сказал:

при снятии костюма и функция при попадании в рюкзак.

при попадании в рюкзак - кэллбэк on_item_take в биндере актера или мотиваторе НПСов. Для снятия костюма кэллбэк не предусмотрен(в чистой ТЧ), по этому только костыли с отслеживанием на апдейте содержимого в соответствующем слоте.

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

Поделиться этим сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться этим сообщением


Ссылка на сообщение
Поделиться на других сайтах

@_Sk8_AsTeR_,

if npc:object("medkit")~=nil then...

Аддон для ОП-2.09.2: Яндекс/Google/GitHub

naxac.gif

Поделиться этим сообщением


Ссылка на сообщение
Поделиться на других сайтах

@naxac, attempt to index global 'npc' (a nil value)

Есть еще идеи? :(

Поделиться этим сообщением


Ссылка на сообщение
Поделиться на других сайтах

@_Sk8_AsTeR_, потому что советы надо применять с умом, а не тупо копируя. Если у тебя из диалога вызывается функция, например, такого вида:

function my_func(fs, ss, dn, pi)
  -- какие-то действия
end

где fs и ss - это первый и второй собеседники, а ты внутри функции пишешь, ничего не меняя, npc:object("medkit)", ежу понятно, что переменной npc неоткуда взяться, а искомый персонаж содержится в одной из переменных fs и ss.

Если самостоятельно не получается, не надейся на телепатов - покажи диалог, покажи функцию, и тогда кто-нибудь сможет дать более конкретный совет.

Поделиться этим сообщением


Ссылка на сообщение
Поделиться на других сайтах
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

Поделиться этим сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

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

Поделиться этим сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

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

Поделиться этим сообщением


Ссылка на сообщение
Поделиться на других сайтах

@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. Вот только не понятно зачем отслеживать смерть актера(ГГ), ведь игрок и так получит на экран стандартное сообщение о смерти, и обычно после этого сразу загружаются с какого то сейва.

Поделиться этим сообщением


Ссылка на сообщение
Поделиться на других сайтах

@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 для НПС.

Поделиться этим сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

 

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

 

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

Поделиться этим сообщением


Ссылка на сообщение
Поделиться на других сайтах

Присоединиться к обсуждению

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

Гость
Ответить в этой теме...

×   Вы вставили отформатированный текст.   Удалить форматирование

  Допустимо не более 75 смайлов.

×   Ваша ссылка была автоматически заменена на медиа-контент.   Отображать как ссылку

×   Ваши публикации восстановлены.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

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

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

AMK-Team.ru

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