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

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

А откуда копать надо, где ковырять. Если за основу взять ремкомплект из урока на сталкерине? Мне главное направление узнать куда тыкаться, там попытаюсь разобраться. Или все же в скрипте ремонта надо выставлять количество использования? В самом конфиге я пытался выставлять количество порционов более 1, но результат: ремонтирует последнее использование, остальные просто для красоты)

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

desert

Судя по упоминанию тобою 'порционов' - ты на верном пути.

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

Переподключи вызов функции ремонта на коллбэк использования предметов (callback.use_object), тогда будет вызываться при каждом 'поедании' порции.

 

Примечание: Но(!) 'callback.use_object' отсутствует в оригинальном биндере актора и потребуется (если в моде ето тоже нет) и его внести в коды.

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

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

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

"Ты можешь прочесть и вывести в лог-файл сохраняемые параметры для Сидоровича, поверив на корректность его сохраняемые координаты. Так же после старта сэйва, можно проверить считанные значения."

Artos, как это сделать?

 

(повторяю вопрос, так как Artos его не заметил)

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

У меня вопрос.Написал функцию в xr_effects.Будет ли в данном случае непись, после передачи параметров, отыгрывать анимацию вместе со звуком?

function set_npc_animation_sound(actor, npc, p)
local cNpc
local snd_obj
     cNpc = level_object_by_sid (p[1])
     snd_obj = xr_sound.get_safe_sound_object(p[2])
if cNpc then
    cNpc:clear_animations ()
    cNpc:add_animation (p[3], true, false)
end
   snd_obj:play_no_feedback(cNpc, sound_object.s3d, 0, cNpc:position(), 1.0)
end

 

Изменено пользователем ColR_iT
Пользуемся тегами!
Ссылка на комментарий

speczadanie

Если на вопрос не дается ответ - ищи причины в первую очередь в своем вопросе.

 

Уже все необходимое расписал ранее.

"Как прочесть" нет-пакет объекта - читаем про класс 'net_packet', статьи и готовые примеры в модах. Если что-то не понятно или не получается - задаем конкретные вопросы по конкретным непоняткам/кодам, а не просим написать первональный тутор.

 

O "вывести в лог-файл" необходимую информации также за годы модмейкерства Сталкера написано предостаточно.

Несколько ранее даже выкладывал универсальный вариант функции вывода в лог 'всего что доступно'. Не нужно просить дать готовое, тем более не удосужившись не дать конкретных своих кодов. Смотри готовые наработки/примеры, коих тут более чем предостаточно.

 

О корректности значений судить тебе. "Как"? Неужели сложно увидев, например, что если координата Y позиции объекта находится ниже уровня данной точки локации, сделать вывод о некорректности этого(?) и далее искать причину такого 'опускания'.

 

Сделав вызов сохранения интересующих параметров в лог-файл перед сэйвом или же после загрузке сэва - тем самым ты и получишь нужную информацию для анализа. Точек куда встроить вызов печати в лог немало, например в 'se_stalker.script' (n_spawn/STATE_Write/STATE_Read).

 

Пробуй сам хоть что-то сделать, а не жди готового кода! Только так ты сможешь перейти на 'ты' со скриптами.

 

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

panzyuza

Плз, объясни мне такому тупому, каков смысл задавать такие вопросы "написал - а будет ли работать?", вмеесто того, чтобы неписав, попробовать и уж если не работает - задаться вопросов в чем причина неудачи?

 

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

На вскидку функция вполне вызлядит корректной, хотя я бы предложил ее немного подправить с целью бОльшей безопасности применения:

function set_npc_animation_sound(actor, npc, p)
  local cNpc = p[1] and level_object_by_sid (p[1])
  if cNpc and p[2] and p[3] then --/ имеется ли все необходимое?
    cNpc:clear_animations()
    cNpc:add_animation (p[3], true, false)
    local snd_obj = xr_sound.get_safe_sound_object(p[2])
    if snd_obj then --/ имеется ли такой звуковой объект?
      snd_obj:play_no_feedback(cNpc, sound_object.s3d, 0, cNpc:position(), 1.0)
    end
  end
end

Примечание: Отсутствие проверки на уже отыгрываемую анимацию может приводить к 'рваной' анмации, т.е. не доиграв предыдущую будет отыгрывать новую. Не фатально, но порой коряао смотрится, если такое возникает.

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

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

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

Возник вопрос по логике: что нужно прописать в логике сталкера, чтобы при его обыске выдавался инфопоршейн?

 

Сообщение от модератора ColR_iT
Если бы заглянул в шапку темы, то мог бы увидеть ссылки на статьи по логике, в которых расписаны практически все секции логики, но ты этого не сделал, а очень жаль! ColR_iT
Изменено пользователем ColR_iT
Заглядывайте в шапку хоть иногда.
Ссылка на комментарий

(из категории: может кому пригодится?)

Возвращаясь к уже упоминавшемуся тут ранее классу 'coroutine', позволяющему приостанавливать работу функции (подпрограммы), предлагаю варианты использования данного класса в практических целях.

Ранее упоминался известный скрипт 'amk_offline_alife.script', в котором периодически сканируются все игровые объекты, что приводит (или может приводить) к ресурсоемким единомоментным лагам в игре.

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

Суть применения метода 'coroutine' в нижеприводимых вариантах - 'размывание' единовременного цикла сканирования на весь период между предполагаемыми сканированиями, что позволит снизить единомоментную нагрузку на ресурсы игры:

--/ ---------------------------------------------
--/ Функция сканирования объектов игры с ограничением времени работы (тело сопрограммы)
--/ ---------------------------------------------
function DoScan(iTimeLimit)
  local iTimeStop = iTimeLimit --/ начальная установка времени прерывания (для таймера)
  local oPTimer = profile_timer() --/ создаем объект таймера
  for id=1,65534 do --/ сканирование по диапазону игровых ID (акторский (0) - пропущен)
    soObj = sim:object(id) --/ очередной серверный объект игры
    if soObj then --/ объект в игре? ('пустышки' пропускаются и таймером)
      oPTimer:start() --/ запуск таймера (на продолжение)
      --/ тело или вызов функции сбора информации по объекту ------
      --/ Func_Object_Handling(soObj)
      --/ ---------------------------------------------------------
      oPTimer:stop() --/ (при)остановка таймера
      if oPTimer:time() > iTimeStop then --/ проверка времени: не закончен ли лимит времени?
        coroutine.yield(id) --/ приостановка цикла(!)
        iTimeStop = oPTimer:time() + iTimeLimit --/ обновляем установку времени прерывания цикла
      end
    end
  end
  --/ 'штатное' окончание сопрограммы (полный цикл закончен)
  return 65535 --/> возвращаем признак окончания цикла (диапазона ID)
end
--/ ---------------------------------------------
--/ сопрограмма сканирования объектов игры
--/ ---------------------------------------------
CoScan = coroutine.create(DoScan)
--/ ---------------------------------------------
--/ Общая функция апдейта. Вызов из actor_binder:update()
--/ ---------------------------------------------
function OnUpdate()
  if coroutine.status(CoScan) == 'suspended' then --/ статус подпрограммы: приостановлена?
    local bFlg,Result = coroutine.resume(CoScan, 25) --/ запуск сопрограммы (на 25 ms)
    if not bFlg then --/ ошибка при выполнении подпрограммы?
      printf("update:Error_CoScan="..tostring(Result))
    elseif Result >= 65534 and coroutine.status(CoScan) == 'dead' then --/ подпрограмма закончила работу?
      CoScan = coroutine.create(DoScan) --/ создаем новую подпрограмму для нового цикла сканирования
    end
  elseif coroutine.status(CoScan) == 'dead' then --/ подпрограмма закончила работу? (нештатно!)
    CoScan = coroutine.create(DoScan) --/ создаем новую подпрограмму для нового цикла сканирования
  end
end
--/ ---------------------------------------------

 

--/ ---------------------------------------------
--/ сопрограмма сканирования объектов игры
--/ ---------------------------------------------
local CoScan = coroutine.create( --/ сопрограмма сканирования объектов игры
  --/ функция сканирования объектов игры с ограничением времени работы
  function(iTimeLimit) --/< на входе время работы субцикла сопрограммы
    local sim = alife() --/ кешируем
    local iCurID = 65535 --/ начальный фейковый ID (сканируемого объекта)
    local oPTimer,iTimeStop,soObj = nil,nil,nil
    while true do
      if iCurID >= 65534 then --/ окончание цикла?
        coroutine.yield(iCurID) --/ приостановка (опционально)
        --/ предустановки для нового цикла
        iCurID = 1 --/ начальный ID (опускаем 0-actor)
        iTimeStop = iTimeLimit --/ начальная установка для таймера
        oPTimer = profile_timer() --/ (пере)создаем объект таймера
      else --/ продолжение цикла
        iCurID = iCurID +1 --/ переход к следующему ID
      end
      soObj = sim:object(iCurID) --/ очередной серверный объект игры
      if soObj then --/ объект в игре? ('пустышки' пропускаются и таймером)
        oPTimer:start() --/ старт таймера (на продолжение)
        --/ тело или вызов функции сбора информации по объекту ------
        --/ Func_Object_Handling(soObj)
        --/ ---------------------------------------------------------
        oPTimer:stop() --/ (при)остановка таймера
        if oPTimer:time() > iTimeStop then --/ проверка: не закончен ли лимит времени?
          coroutine.yield(iCurID) --/ приостановка цикла
          iTimeStop = oPTimer:time() + iTimeLimit --/ обновляем установку времени прерывания цикла
        end
      end
    end
    printf("DoScan:<Error!>")
    return 65535 --/> нештатное завершение
  end
)
--/ ---------------------------------------------
--/ Общая функция апдейта. Вызов из actor_binder:update()
--/ ---------------------------------------------
function OnUpdate(uo,delta)
  if coroutine.status(CoScan) == 'suspended' then --/ статус подпрограммы: приостановлена?
    local bFlg,Result = coroutine.resume(CoScan, 50) --/ запуск сопрограммы (на 50ms)
    if not bFlg then --/ ошибка при выполнении подпрограммы?
      printf("update:Error_CoScan="..tostring(Result))
    end
  end
end
--/ ---------------------------------------------

 

К сожалению, в 'amk_offline_alife.script' потребуются дополнительные изменения для возможности реализации 'распределенного цикла', связанные в внесениями 'точечной' информации об объектах в их массивы, исключив их (массивов) общее обнуление.

 

Материал дан в качестве практического пособия для желающих попрактиковаться в применении класса и методов 'coroutine', о котором можно почитать в теме "Справочник по классам и функциям" (о coroutine).

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

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

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

panzyuza

Вновь вопрос из категории "Давайте пофантазируйте ...".

Ведь сам можешь прочесть комменты разрабов о предназначении отключенной схемы 'xr_reactions'.

Можно ли ее использовать? Хм, ну если разрабы ее отключили, на то вероятно были причины.

Анализ кодов говорит (ИМХО), что она в общем-то рабочая, но явно и не доделана и довольно узка в применении. Вполне вероятны возникновения различных коллизий с другими схемами в каких-либо ситуациях. Т.о. без ее доработки или даже переработке врядли ее можно использовать.

Ну а когда тебе по силам будет подобная работа по доработке - сам себе сможешь ответить "а можно ли и нужно ли ее использовать". ;-)

 

 

Tris

Понятие 'логика' далеко не ограничивается конфиг-файлами для логики/схем.

Из штатных схем и конфигов к ним для выдачи инфопоршня при обыске NPC (трупа) нет возможностей (см. схему 'xr_use.script').

Т.о. или доработка существующей схемы или внесение своей функции/кодов в событие коллбэка на юзание трупов (callback.use_object -> stalker_binder:use_callback(...)).

 

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

panzyuza

Не нужно заблуждаться, параметр 'known_info' используется схемой 'xr_info.script' и никак не при юзании трупов. Да и инфопоршень выдается НЕ актору, а самому НПС, дабы иметь возможность определять что он 'должен рассказать иль спеть' ...

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

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

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

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

А параметр know_info я сам использовал в квестах.И работает.Когда нужно обыскать труп, и что бы выдавалься инфопоршень, переключающий квест на следующую подзадачу.

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

При всем уважении к самородкам- модерам ,та же схема обыска профессионалами сделана лучше(кал припяти),но все же не они ее придумали ;)

Ссылка на комментарий
Artos, я хотел бы уточнить кое-что по поводу coroutine. Как мне применить это для приостановки простой ф-и, где постоянно проверяется здоровье гг? Я не сильно разбираюсь в скриптах, потому прошу сильно не пинать.
Жду ли я Сталкер 2? Хм...
Ссылка на комментарий

gruber

Тут топик не по обсуждалкам тех или иных и, плз, не флуди.

Не смеши других в том, в чем не разбираешься, тем более не потрудившись привести хоть что-то в поддержку своих слов.

Если ты о схеме обыска трупов из SCoP, то это первое - что потребовало до(пере)делки за 'профессионалами', как и 'уборщик трупов'.

 

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

PavelSnork

Перечитай подробнее о 'coroutine' с справочнике, обратив особенно внимание на 'Поговорим о времени "жизни" подпрограмм'.

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

Давать какой-либо совет по конкретному применению невозможно, не зная условий/задач, которые потребны модмейкеру.

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

 

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

panzyuza

Аргумент "а у меня работает" - конечно заслуживает внимания, при условии, когда понятно почему он работает. ;-)

Вот как ты объяснишь то, что у других, использующих не твои коды(мод) это не работает? (и в оригинале не должно работать!) :crazy:

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

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

Ссылка на комментарий
Artos, ну, в моей ф-и куча проверок, и потому в игре появляются лаги (не исчезают надписи ,,использована аптечка'', и т.д). И мне надо, чтобы, например, через каждые 0,1 с. ф-я переставала выполнятся...
Жду ли я Сталкер 2? Хм...
Ссылка на комментарий
Artos, обьяснений по данному вопросу дать не могу.Тем более xr_info не правил.Но ведь и в оригинале при обыске трупа у туннеля с электрами у него такая же логика, и после обыска выдаеться инфопоршень и выполняеться квестовая подзадача, когда нужно пересечь мост.И добавляються статьи в энциклопедию.
Ссылка на комментарий

PavelSnork

Я не Кашпировский. Без конкретики ничем не могу помочь.

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

Ну а то, что пожелалка "надо, чтобы, например, через каждые 0,1 с. ф-я переставала выполнятся... " при учете, что скорее всего она вызывается (перезапускается) каждые 20ms (0.02c), т.е. из апдейта актора - согласись, далеко не умная идея.

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

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

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

Tris, panzyuza, Artos. Вы знаете - [known_info], действительно очень хорошо справляеться с тем, чтобы выдавать актору инфопоршни, непонятно почему, но это факт...

Хотя почему не понятно:

function loadInfo(npc, char_ini)
    -- Загрузка из кастом даты
    if char_ini:section_exist("known_info") then
        local n = char_ini:line_count("known_info")
        local result, id, value = 0,"",""
    
        for i=0,n-1 do
            result, id, value = char_ini:r_line("known_info",i,"","")

            give_npc_info(npc, id)
        end
    end
    
    
    -- Загрузка из генератора.
    local community_info = info_by_community[npc:character_community()]
    if community_info == nil then
        return
    end
    
    local rank = ranks.get_obj_rank_name(npc)
    local rank_info = info_by_rank[rank]
    if rank_info == nil then
        return
    end

    local tt = {}
    -- оставляем инфопоршны, которые есть и там и там.
    for k,v in pairs(community_info) do
        for kk,vv in pairs(rank_info) do
            if v == vv then
                -- Добавляем в список доступных знаний
                table.insert(tt, v)
                break
            end
        end    
    end
    
    local size = table.getn(tt)
    for k = 1,math.min(size,3) do    
        if math.random(100) >= 60 then
            local ii = tt[math.random(size)]
            give_npc_info(npc, ii)
        end
    end
end

function give_npc_info(npc, info)
    -- Даем НПС инфопоршны
    npc:give_info_portion(info)

    -- Проверяем есть ли озвученная история на этот инфопоршн, и если есть
    -- добавляем ее тоже
    if sound_theme.theme[info] ~= nil then
        if db.story_by_id[npc:id()] == nil then
            db.story_by_id[npc:id()] = {}
        end
        
        table.insert(db.story_by_id[npc:id()], info)
    end
end

Функция give_npc_info, выдает параметру npc инфопоршень, по всей видимости, если НПС не жив, в качестве этого параметра выступает actor.

Есть еще один вариант - это секция on_use:

on_use = use
[use]
on_info = %+infoportion%

но инфопоршень будет выдан даже если вы соберетесь поговорить с этим НПС.

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

panzyuza, ColR_iT, Tris

Параметр 'known_info' обрабатывается только одной схемой 'xr_info.script'.

Штатный вызов этой схемы идет из схемы кампера (xr_kamp.script) и предназначен для реализации 'историй костра'.

Дополнительный (обязательный) вызов происходит из 'stalker_binder:net_spawn(...)', т.е. при спавне НПС (при его появлении в онлайне) в обязательном порядке проверяется вышеуказанный параметр ('known_info') и при наличии инфопоршня - выдается данному НПС.

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

То, что выданный инфопоршень влияет на дальнейшую логику иль квесты - это предмет другой темы, не относящийся к исходному вопросу (ИМХО).

 

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

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

 

Резюме:

1. Выдать инфопоршень в момент 'обыска НПС', т.е. трупа - штатными конфигами логики невозможно.

2. Параметр 'known_info' в конфигах логики НПС приводит к выдаче инфопоршня(ей) при любом первом появлении НПС в онлайне (net_spawn).

 

P.S. Приношу извинения за ложные выводы, сделанные по конкретным кодам скрипттов. Пояснение тут: #2640

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

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

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

Artos, методом исключения я установил, что моя проблема именно в том скрипте, где выполняется 24 проверки на здоровье актора. Слушай, ты можешь написать самый простой метод использования coroutine? Пожалуйста.

 

Самые простые (проще некуда) примеры использования 'coroutine' уже привел Gun12 и в описании этого класса в справочнике и чуть ранее в этом топике (см. пост). Могу посоветовать: Не берись за то, что не по плечу. Судя по твоим вопросам и пояснениям - со скриптами ты очень даже на 'Вы'... Да и не факт, что 'coroutine' будет для тебя палочкой выручалочкой.

ИМХО, тебе просто нужно оптимизировать код твоей 'корявой' функции, коды которой ты до сих пор и не показал и не даешь никаких пояснений. Выложишь код функции - может быть разговор по существу.

--/ Artos

Изменено пользователем Artos
Жду ли я Сталкер 2? Хм...
Ссылка на комментарий

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

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

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

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

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

Войти

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

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

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