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

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

мне скриптом и надо. Можешь показать код?

Примерный шаблон(с использованием модуля нет-пакетов от Artos), дорабатывать - в зависимости от конкретных похотелок:

local get_ini = system_ini()
local ammo_total = 0
 
function CheckAllAmmo()
     local actor = db.actor
     if actor ~= nil then
          actor:iterate_inventory(check_inv_items, actor) -- ф-ция-итератор, о ней прочтешь в "Справочнике по ф-циям и классам" --
     end
 
     return ammo_total -- тута получишь искомую цифру --
end
 
function check_inv_items(actor, item)
     local section = item:section()
     if section then
          if get_ini:section_exist(section) and get_ini:line_exist(section, "class") then
               local item_class = get_ini:r_string_wq(section, "class")
               ----- тут сам разберись - выстрелы для подстволов у тебя будут как патроны или нет ??????????????? -----------------
               if (item_class == "AMMO") or (item_class == "A_VOG25") or (item_class == "A_M209") then
                    local num_in_box = get_ammo_count(item:id()) -- тута из нет-пакета получим реальное кол-во в реальной пачке --
                    if num_in_box then
                         ammo_total = ammo_total + num_in_box
                    end
               end
          end
     end
end
 
function get_ammo_count(obj_id)
     local se_obj = alife():object(obj_id)
     if se_obj then
          local packet = net_packet()
          cse_alife_item_ammo.STATE_Write(se_obj, packet)
          packet:r_seek(packet:w_tell() - 2)
 
          return packet:r_u16() -- кол-во боеприпаса в конкретной пачке --
     end
 
     return 0
end

 

 

 

Чуть не забыл - не забудь разрулить тему с наличием в инвентаре гаусс-боеприпасов.

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

@Sla-Sla, ЗП? Тогда так:

 

function get_ammo_size(obj)
  local pk = net_packet()
  pk:w_begin(0)
  obj:STATE_Write(pk)
  pk:r_seek(pk:w_tell()-2)
  return pk:r_u16()  -- ammo_left
end

function ammo_count(section)
  local n = 0
  local sobj
  db.actor:iterate_inventory( function (actor, item)
    if item:section() == section then
      sobj = alife():object( item:id() )
      if sobj then n = n + get_ammo_size(sobj) end
    end
  end, db.actor)
  return n
end

 

Использовать:

ammo_cnt = ammo_count("ammo_12x70_buck")
Это если надо конкретные патроны посчитать. А если все подряд, то вместо проверки по секции поставить проверку по классу. Типа
if item:clsid() == clsid.ammo or item:clsid() == clsid.ammo_s then
Изменено пользователем naxac
  • Спасибо 1

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

naxac.gif

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

Вопрос к скриптовикам: Что означет db.actor в коде функции? Например, в функции вывода сообщений.

Discord-сервер modfaq.ru: https://discord.gg/9j42BXwB

Ссылка на комментарий
Выходит вместо db.actor можно писать просто nil

Можно, если играть надоело.

nil, в том контексте который Вы привели, это только активация этой глобальной переменной при её объявлении. Далее же ей присваивается ссылка на созданный объект ГГ. Хотите его убрать из игры - присвойте этой ссылке значение nil, т.е. удалите её. Всё в Ваших руках.

Изменено пользователем Serge!
  • Нравится 1
  • Полезно 1
Ссылка на комментарий
А если все подряд, то вместо проверки по секции поставить проверку по классу.

Мои потуги на этом пути (делал когда-то для себя скрипт по разрядке всех стволов в инвентаре) подсказывают - так не получится. Первый вопрос был: "У меня вопрос, возможно ли получить значение общего количества патронов в инвентаре?". Вы все ответили на его часть - как подсчитать патроны требуемые к стволам, которые есть у ГГ (приведённые вами скрипты Atros именно эту проблему и решают) причём, если они на момент проверки, не были разряжены штатными методами . Но, в инвентаре могуть быть и патроны к стволам, которох у ГГ в данный момент нет + нужные, но в пачках. А потому ОБЩЕГО количества (ему именно такого хочется) он, по вашему совету, не получит. Увы, но это так. Хотя, вполне это допускаю, что и вопрос был сформирован не очень корректно.

Я могу и ошибаться.

 

@naxac,

проверка по классу - это ближе к хорошему результату (пусть любители учёта миллисекунд подсчитают потери), но... не при этом вопросе. В данном случае придётся проверять именно по секциям или решать задачу по частям.

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

Как создать тайник с запиской на следующий тайник (как в Коллекционере)? Как создать тайник я знаю, а как добавить инфопоршень с использованием функций спавна и удаления предметов - не знаю. Подскажите как?

Ссылка на комментарий
Вы все ответили на его часть - как подсчитать патроны требуемые к стволам, которые есть у ГГ

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

 

 

Как создать тайник с запиской на следующий тайник (как в Коллекционере)?

Не играл в "Коллекционер", но к примеру можно вместе с лутом ложить в тайник саму записку. При использовании этой записки выводить информацию игроку с наводкой на следующий тайник.

Изменено пользователем UnLoaded
Ссылка на комментарий
 Внимательнее посмотри в примеры скриптов... откуда такой вывод? В моем примере происходит перебор всего хлама в инвентаре ГГ, то что является по классу патронами - обрабатывается на предмет получения реального кол-ва в пачке, и суммируется. Где ты увидел привязку к стволам в инвентаре ГГ?

Соглашусь, я был не очень внимателен, т.к. просто не предполагал такого подхода к такой мелкой проблеме. Мой вывод: "А потому ОБЩЕГО количества (ему именно такого хочется) он, по вашему совету, не получит.", остаётся верен и при таком раскладе. Т.к. сейчас у меня просто элементарно нет времени, да и форум уходит на профилактику, но я позже обязательно объясню в чём Вы не правы. Возможно в "курилке" или других, располагающий для лёгкого трёпа местах, поскольку к "скриптованию" эти вопросы отношение вряд ли имеют.

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

Привет всем. Такой вопрос. Как можно запретить полностью использовать (обыскивать) труп по опр. секции? Делал проверку на секцию, которую нельзя обыскать, и использовал self.object:set_nonscript_usable(false), но в таком случае все равно висит статик "Обыскать труп", хотя окно обыска и не открывается. Хотелось бы знать, как можно перекрыть сей статик пустышкой, ну или вообще нормальным методом запретить обыск, а не криво, как у меня.

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

@HellRatz, в мотиваторе на обновлении подсказки такую же проверку сделай с переопределением текста подсказки. И на net_spawn тоже всё это добавить нужно, чтобы после перезагрузки уровня применялось.

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

Привет всем. Такой вопрос. Как можно запретить полностью использовать (обыскивать) труп по опр. секции? Делал проверку на секцию, которую нельзя обыскать, и использовал self.object:set_nonscript_usable(false), но в таком случае все равно висит статик "Обыскать труп", хотя окно обыска и не открывается. Хотелось бы знать, как можно перекрыть сей статик пустышкой, ну или вообще нормальным методом запретить обыск, а не криво, как у меня.

по другому не меняется. а текст с помощью 

set_tip_text_default() set_tip_text() 

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

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

Выходит вместо db.actor можно писать просто nil ?

bind_stalker.script:

function actor_binder:net_spawn(data)

...

db.add_actor(self.object)

 

db.script:

function add_actor( obj )

actor = obj

 

Но, как уже писал, это плохая идея, производить несколько операций с переменной, которая используется 100500 миллионов раз в секунду, вместо одной.

Да еще везде и всюду набирать руками это самое db.actor с риском где-то забыть или попутать буковки местами.

 

Так что:

bind_stalker.script:

function actor_binder:__init( npc ) super( npc )

_G.actor = self.object -- теперь отовсюду будет работать просто actor, без всякого self.object и db.

 

 

function actor_binder:net_destroy()

...

_G.actor = nil

object_binder.net_destroy( self )

end

  • Полезно 1
Ссылка на комментарий
Несколько вопросов:

1) xr_motivator.script(а в нем класс motivator_binder) рулит сталкерами. А кто рулит монстрами?

 

2) какие рабочие кэллбэки есть для сталкеров?

В нет_спавн вижу:

 hit - это понятно

 death - это то же понятно

 use_object - это надеюсь то же понятно(этот кэллбэк удерживает непися при разговоре ГГ с ним?)

 sound - закомментирован, по обработчику вроде понятно, что связан с тем, что слышат неписи.

 extrapolate_callback - а вот этот о чем? Устанавливается не как вышеперечисленные, а через set_patrol_extrapolate_callback...

Это все что есть для сталкеров, или еще что-то имеется?

 

3) в death_callback есть вызов death_manager.drop_manager(self.object):create_release_item() - это запускает всю цепочку подчистки\доспавна лута, и с этим все понятно. Но и в update есть точно такой-же вызов. Если я правильно понял, в update это нужно для контроля сталкеров, которые уже мертвяки после очередной загрузки игры?

 

И еще, напомните - какая схема управляет подбором оружия сталкерами, и в каком скрипте прописана?

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

@UnLoaded

1. bind_monster.script

2. ещё есть on_item_take,on_item_drop,script_animation (окончание анимации)

4. Схема называется gather_items, сама она находится в движке, в ЗП управляется через xr_gather_items.script

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

@UnLoaded, возможно ты про can_select_item_rules, это в движке on_after_take если верно помню, можешь посмотреть, обычная строка конфига, работает только на подбор оружия (а точнее CWeapon, если опять же не ошибаюсь), другого поднятия итемов там нет.

 

По дез менеджеру, ну, как тебе сказать, да, для трупов, но и не только (проверь сам, удивишься, только прежде чем следующий вопрос задавать - подумай) ;).

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

 

 

возможно ты про can_select_item_rules, это в движке on_after_take если верно помню

Получается, подбор оружия неписями в ТЧ - это движковое? Я думал, что какая-то схема логики...

Такой момент: сценка с Юриком при входе на Свалку, с последующей помощью Бесу. У меня Юрик топает от места сценки к месту, где стоит Бес. Если возле Беса кинуть ствол, к примеру МР-5, то Юрик его подбирает. Но, в дальнейшей перестрелке с бандюками, его не использует. Не сложно было выяснить причину - ствол-то он подбирает, а патронов к нему у него нет. Для теста, сделал спавн ему нужных патронов, после их спавна Юрик сразу переключается на МР-5 и в последующей перестрелке исправно его использует.

Тут я подумал - на кой ПЫСы сделали подбор стволов, если их непись не будет использовать? Логично было сделать, при подборе ствола, сразу спавн подходящих боеприпасов. Думал, что этим схема рулит какая-то, потому и хотел ее найти, чтоб попробовать доделать спавн патронов. Но раз это движковое - то видно пока не судьба...

 

Р.S. Попытался сделать спавн патронов через добавление в motivator_binder кэллбэка on_item_take, вроде спавн получился, но сразу же наткнулся на грабли - вылеты при интенсивной боевке.

 

 

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

@UnLoaded, я это в движке зарубил, а для оригинальной работы просто в коллбеке на перезарядку скармливаю неписю те патроны, что у него в стволе. Но вообще в оригинальном виде у непися должен быть бесконечный боезапас, так как, в противном случае, в силу кривизны неписей они весь свой боезапас моментально расстреливают и пускаются в бега.

 

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

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

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

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

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

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

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

Войти

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

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

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