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

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

Тема для обсуждения скриптов всего и всех в серии игр STALKER.


Задавая вопрос (!):
1. Внимательно изучите суть вопроса. Вопрос должен соответствовать выбранной Вами темы. Это поможет сохранить порядок и читабельность темы, а также облегчит поиск и понимание сего;
2. Изучите то, что уже есть в теме (пролистайте "руками", воспользуйтесь поиском на форуме);
3. Изучите информацию которая может вам помочь:

  Информация (Показать)

4. Дабы не превращать обсуждение в "кашу" разной информативной направленности, задавайте несколько вопросов по порядку (в разных постах) после того, как получите ответ на предыдущий вопрос;
5. "Спасибо" и тому подобное - будьте так любезны в ПМ. Если не любите писать в ПМ, в конце вопроса напишите фразу: "Заранее спасибо!" - или что-то в этом духе;
6. ПОЖАЛУЙСТА! Указывайте, для какой игры Вам необходима информация (ТЧ, ЧН, ЗП), если стоит мод - укажите название мода;
7. Если Вы что-то сделали и результат не такой, какой Вами задумывался, то, пожалуйста, приводите коды которые Вы изменяли/писали целиком! Это поможет другим правильно ответить на Ваш вопрос, а также оградит Вас от лишней писанины.
8. Оформляйте сообщение. Пользуйтесь тегами для того, чтобы отделить код от текста. Пишите грамотно - ПОЛЬЗУЙТЕСЬ ЗНАКАМИ ПРЕПИНАНИЯ.
9. И помните: «Правильно заданный вопрос – половина ответа».

 

Какие вопросы следует задавать, а какие нет...

  Читать рекомендуется. (Показать)

И последнее: очень рекомендовано к прочтению Правила форума
 


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

 

Если вылет при перезапуске сэйва (не выходя из игры) связан

Он с этим не связан, я могу перезапустить сейв и играть себе спокойно дальше, хоть всю игру пройти, НО если я начну диалог после которого спавнится вертолет, то будет вылет. И параметр 'startup_animation' я изменил, как сказал Shoker, если раньше вылеты были практически всегда, то сейчас только так, как я описал выше.

 

P.S. По этому поводу у меня только одна мысль, что дело в том что, как ты сказал из-за того что попадает "лишний" байт, завтра я попробую принудительно "очистить" пакет, как ты написал, думаю поможет :) 

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

@Старлей, я немного перепутал, motion_name можно вернуть как было, из за того что ты используешь какой то старый скрипт (видимо прямиком из ТЧ) и там параметр startup_animation назван как cse_alife_helicopter__unk1_sz поэтому я его и не увидел.

 

Тебе советую сделать вот что:
Попросить у Artos-а свежий скрипт для работы с нэт-пакетами (т.к его ссылка мертва): Либо взять тут прошлую версию, но я не гарантирую что там нету косяков. И спавнить вертолёт через него.

 

Всё как раз таки похоже что твой скрипт нэт-пакета криво спавнит вертёшку, видимо иногда игра это переваривает, а иногда нет. Как минимум советую тебе оставить для теста лишь один вертолёт, и вообще использовать две функции обе которые спавнят вертолёт и с нуля пишут ему нэт пакет это извращенство %)
Нужно функцию спавна вертолёта сделать одну общую, а потом просто вызвать её два раза передав нужные параметры вертолётов.
 

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

Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О

Мастер аномалий на свою заднюю точку.

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

[spoiler=Актуальная версия модуля "Интерфейс чтения/записи net-пакетов" (m_netpk)]

 


Название: Модуль "Интерфейс чтения/записи net-пакетов" (m_netpk)
Автор(ы): Artos (по материалам: bardak, Red75, Sokol_jack, KD87 (uACDC), xStream (xs_netpk))
 
Версия/Дата: - (20.09.2013)
Платформа: Универсальный (ТЧ/ЧН/ЗП), начиная с ТЧ 1.0004
Сложность подключения: Простая
 
Модуль (скрипт) реализует в игре интерфейс чтения и изменения параметров игровых объектов посредством net_packet'ов.
  Краткое описание: (Показать)
Изменено пользователем Artos
  • Нравится 1

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

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

ув. @Artos, использую Ваши таймеры сейчас, и ловлю небольшую проблему, а именно - действие происходит очень быстро, мне нужно что-бы действие воспроизводилось циклично пока не выполнятся мои условия, и в начало функции ставлю:

if start_real_timer(3) then

Условия выполняются явно быстрее, чем 3 секунды.

Судя по мануалу я возможно не правильно делаю, возможно нужно вот так:
 

start_real_timer(3):set_name("my_timer_name")
if not timer_exists("my_timer_name") then
Изменено пользователем Карлан
Ссылка на комментарий

@Карлан, по пртведенной строке и пояснениям невозможно понять сути и причины...
Сама строка: if start_real_timer(3) then - неверна и непонятна!
 Для запуска таймера требуется в качестве аргументов указать:
- время (в секундах);
- функцию, которая будет вызвана таймером по окончании времени, указанную 1-м аргументом;
- параметры для функции, которая указана во 2-ом аргументе.
Примечание: 2-ой аргумент может быть nil, т.е. seyrwbz не указывается, но в этом случае должны быть указаны параметры для внутреннего обработчика (читаем readme к модулю).
Т.о. ты просто не запустил таймер, т.к. указал время и НИЧЕГО для того, чтобы таймер хоть как-то сообщил о событии 'окончания времени'.
 
Вот пример запуска таймера реального времени на 8 секунд, после чего будет вызвана функция OnTimer_Test:
 
 


...
  start_real_timer(8,OnTimer_Test,{id=21249}) --/ запуск таймера ~8sec [time(sec),func,params]
...

function OnTimer_Test(t)
  log("OnTimer_Test: %s", tostring(t.id)) --/#~#
end

Если требуется проверить запустился ли таймер (и заодно время), то делать это можно так:
 
 

...
  local timer = start_game_timer(3*60, nil, {info_id = "my_infoportion"}) --/ через 3 game-minutes выдать инфопоршень
  if timer then --/ запущен ли таймер? (получент ли объект таймера)
    local time_rest = timer:get_time_rest() --/ оставшееся время
...

 

  Актуальная версия модуля " Универсальные таймеры" (m_timers) (Показать)
Изменено пользователем Artos
  • Нравится 1

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

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

@Artos, а как им воспользоватся при таком запросе:

Если прошло 3 секунды то
 выполняем функцию
завершить

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

 

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

start_multi_timer(2*60, "my_file.my_func") --/ я так понял, что цикличны только мульти-таймеры

И что-то я не совсем понял, после выполнения всех моих условий таймер отключится, или так и будет крутится вечно?

 

А, по моему до меня дошло...сейчас проверю и отпишусь, чето туплю под вечер :)



start_real_timer(2, "my_file.my_func")

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

 

Можно конечно все на нем и оставить(time_global())... но не хочется.

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

@Карлан

1. Твое "если прошло 3 секунды то -> выполняем функцию -> завершить" полностью эквивалентно собственно запуску таймера: "запуск таймера с выполнением через 3 секунды функции". Т.е. когда пройдут 3 секунды с момента запуска таймера будет вызвана указанная функция и таймер завершит свою работу.

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

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

 

2. Таймеры по определению НЕ цикличны. Только класс MultiTimer (само название подсказывает) цикличен. На то и назван модуль "универсальные таймерЫ", что под почти любую задачу можно выбрать и подстроить нужный таймер. Реализовать все это на одном классе - не разумно, вместо выбора таймера тебе все одно пришлось бы задавать кучу параметров, подстраивая под свои нужды. Практика показывает, что проще выбрать из набора, чем помнить и путаться в параметрах запуска единственного...

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

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

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

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

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

Именно так и сделал, даже вот код:

 

function my_update() --/ update
start_real_timer(2, "my_file.my_func1")
start_real_timer(2, "my_file.my_func2")
start_multi_timer(2, "my_file.my_func3", nil, true)
end

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

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

@Карлан, что-то ты действительно "тупишь под вечер"...

 

 

  Карлан писал(а):
Мне нужно чтобы моя функция выполнялась каждые две секунды, взвожу такой таймер. Ничего почему-то не происходит.

Говоришь о цикличности, а запускаешь: start_real_timer(2, "my_file.my_func") - одноразовый таймер реального времени. И чего ты ждешь?!  :crazy:

Включи режим отладки в модуле (local __DEBUG__ = true), позаботившись о рабочем выводе в лог и посмотри - у тебя вообще модуль работает(?), таймеры вообще запускаются ли? Не стОит засорять топик...

 

И не нужно поминать про time_global() - это всего лишь функция возвращающая время и она тоже испльзуется и в универсальных таймерах (если потребно). Если твои таймеры (по твоим алгоритмам/кодам) работают и устраивают тебя - то и используй их.  ;)

 

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

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

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

@Карлан

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

local bStarted = false
function my_update() --/ update
 if not bStarted then
  start_multi_timer(2, "my_file.my_func3", nil, true)
  bStarted = true
 end
end

И дальше таймер уже сам будет вызывать функцию my_file.my_func3 каждые 2 секунды\минуты или что там.

Это мульти-таймер. 

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

 

UPD: Поправил код.

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

Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О

Мастер аномалий на свою заднюю точку.

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

@*Shoker*, разумеется, я это все понимаю :) Твой флаг бесполезен, т.к. таймеру дается каждый раз новое имя.

 

@Artos, таймеры у меня работают(тестовый из bind_stalker по крайней мере), так что проблема явно не в модуле, и явно не в моих функциях. Пока я считаю, что проблема в моих руках, т.к. они модуль не так как-то используют... Ладно, пойду поковыряюсь, больше не буду засорять топик. 

 

Upd:

 

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

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

@*Shoker*, можно даже проще, если задать таймеру свое эксклюзивное имя, или получить с уже запущенного и контролировать его: 

function my_update() --/ update
  if not timer_exists("MY_TIMER") then
    start_multi_timer(2, "my_file.my_func3", nil, true):set_name("MY_TIMER")
  end
end

@Карлан, ты действительно "тупишь" (без обид, плз). В варианте Shoker'а используется флаг запуска таймера (bStarted), и если какой-либо таймер из апдейта был запущен (с любым именем) - то уже не будет других запусков. Но(!) это в течении игры, но после перезапуска игры - будет запущен новый таймер...

Изменено пользователем Artos
  • Нравится 1

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

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

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

 

  Мои действия (Показать)
Изменено пользователем Карлан
Ссылка на комментарий

Обновил модуль "Универсальные таймеры":

- добавлена возможность получения имени таймера и др.

- обновлено описание (добавлены описания доступных методов)

  список: (Показать)
Изменено пользователем Artos

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

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

Я универсальные таймеры пока не использовал, но вот вопрос, почему не передавать сразу функцию:

 

start_multi_timer(1, my_file.t1, nil, true)
Ссылка на комментарий
  Shredder писал(а):

почему не передавать сразу функцию:

Встречный вопрос. Как таймер узнает после загрузки игры, какую функцию ему передали до этого?
  Полезный утиль (Показать)
Ссылка на комментарий
  Shredder писал(а):
почему не передавать сразу функцию:

Пояснение: (пока не отраженное в описании)

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

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

Для последнего случая предназначены QUICK-таймеры, которые никогда не запоминаются.

Все остальные таймеры (real/game/multi/hud) обязательно запоминаются при условии(!) что заданная таймеру функция задана строкою (string)! В противном случае, таймер не будет сохранен.

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

Т.о. при запуске любого (кроме quick) таймера можно непосредственно типом данных линка на задаваемую функцию устанавливать свойство таймера: должен он запоминаться в сэйвах или нет.

Примечание: Если функция вообще не задана (nil), но заданы параметры для внутреннего обработчика таймеров (выдача инфопоршня/типса/...) - такой таймер обязательно будет сохранен в сэйве. Чтобы такой таймер не запоминался - используем quick-timer.

 

Так что ответ на вопрос: "Задавай как тебе хочется, исходя из потребностей, но учитывая возможности..."

(универсальность в действии  ;) )

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

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

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

Подскажите пожалуйста, еще вот в чем: требуется от ГГ передать НПС 2 артефакта. Для этого я использую  функции ColR_iT(в посте под спойлером), однако от ГГ передается НПС только 1 артефакт, сделал не большую эхо-печать в лог, для проверки счетчика - все правильно, вот только вылазиет одна строчка странная:

! Cannot find saved game ~:psi:__i_=_1,_count_=_2
* Log file has been saved successfully!
! Cannot find saved game ~:psi:__i_=_2,_count_=_2
* Log file has been saved successfully!
! ERROR: SV: can't find children [39427] of parent [270253968]
! Cannot find saved game ~:psi:__i_=_1,_count_=_2
* Log file has been saved successfully!
! Cannot find saved game ~:psi:__i_=_2,_count_=_2
* Log file has been saved successfully!
! ERROR: SV: can't find children [39425] of parent [270253968]

Я нашел в этой же теме, год назад такой вопрос задавал *Shoker*, только он пытался переместить предмет с земли нпс, и у предмета не было родителя и т.д., поэтому как сказали и вылазили эти ошибки. Но у меня 2 вопроса:

1. Почему перемещается только 1 предмет.

2. Почему вылазиют сообщения, ведь изначально родитель артефакта ГГ, потом НПС?

P.S. Или поделитесь своими функциями :)

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

Я могу ошибаться, но возможно в цикле who:object(section) возвращает один и тот же предмет. Т.е. только на следующем апдейте после who:transfer_item метод who:object(section) вернёт другой предмет. Т.е. по сути, в цикле будет попытка передать один и от же предмет count раз, из-за этого и запись в лог. Это предположение.

 

Да, это действительно так. Для правильного функционирования нужно итерировать инвентарь на предмет одинаковых предметов и их передавать.

Доберусь до домашнего ПК, посмотрю осталось ли доделанная функция... ну или доделаю.

ColR_iT

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

@Shredder, ты прав, именно в данном случае, когда цикл НЕ привязан к итерации по инвентарю,  who:object(section) может возвращать один и тот же предмет, т.к. who:transfer_item(...) ассинхронна и предмет исчезнет из инвентаря 'who' только на следующем апдейте.

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

Как вариант, можно использовать и не iterate_inventory, а получать кол-во объектов в инвентаре:

  local count = npc:object_count()

и сразу перебирать предметы используя (но это опять же итерация):

  for i = 0, count - 1 do
    local item = npc:object(i)
    ...

Есть, правда, один "хитрый" способ, который вероятно задумывался разработчиками GSC, для обхода подобных ситуаций, для чего были добавлены методы:

  npc:mark_item_dropped(item) --/ отметка предмета с которым совершается действие (удаление/передача)

  npc:marked_dropped(item) --/ проверка наличия метки о совершенном действии над предметом (уже удаляется/передается)

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

 

@Старлей, строка в логе "! ERROR: SV: can't find children [ХХХХХ] of parent [ХХХХХХ]" - вполне может говорить о том, что предмету уже дана команда трансфера и движок удалил информацию о владельце... Повторное обращения к нему (предмет все еще в инвентаре у 'who') приводит к подобной информации об ошибке (без вылета!).

Если есть желание покопаться и поэкспериментировать то можешь поискать подходящее (например, Relocate_Items)

в этой "полезняшке" из моего набора:

  Скрипт "Общие функции (Показать)
Изменено пользователем Artos
  • Нравится 3

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

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

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

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

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

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

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

Войти

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

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

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