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

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

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


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

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

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

 

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

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

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


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

@FonSwong

Оператор # может применяться к любой таблице. Если в таблице есть индексированная часть, то оператор определит её размер.

В твоём случае ключами таблицы являются ID, которые не создают индексированного массива. Т.е. ключи таблицы не соответствуют порядку ключей массива 1,2,3,4,5,6, ... и т.д. по порядку. А что-то вроде 1523, 907, 23120 и т.п.
Поэтому когда ты определяешь длину массива оператором #, то длина будет равна нулю (если конечно не будет ID с номером 1).
А 
math.random не понимает единственного аргумента 0. Если первым аргументом задан 0 (являющийся началом интервала случайных чисел), то должен быть задан и второй аргумент, обозначающий конец этого интервала. Отсюда и ошибка - bad argument #1 to 'random' (interval is empty)

 

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

FonSwong, Charsi дал простой и верный намёк на решение проблемы. Надо всего лишь изменить структуру массива tbl_sos. Сделать его не ассоциативным, а индексированным, т.е. вида

tbl_sos = {{npc_id = id1, sos = 'SOS'},{ npc_id = id2, sos = ' '}, . . .}
ну и далее получаем по случайному индексу соответствующее ему значение, т.е. ассоциативный массив, а из него чего уж там требуется или tbl_sos[index].npc_id или строку tbl_sos[index].sos
Ссылка на комментарий

Кстати, давно интересовал момент - как правильно будет получить количество элементов в ассоциативном массиве? Я помню делал полный перебор массива чтобы получить его размер, но может есть более приятный вариант?

Freedom

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

Как правильно достать профиль?

 

Сохраняю npc:id() непися, затем загружаю и мне нужно получить его профиль, но не через npc = level.object_by_id(id), ибо в оффлайне если нпс, то крашится игра

затем передать npc другой фунции, а там уже она снова возьмёт npc:id()

Пробовал после загрузки профиль вытаскивать через npc = alife():object(a), но он вроде как даёт сид, а дальше нужно передать "npc" с "id()"

Изменено пользователем FonSwong
Ссылка на комментарий
  19.10.2015 в 21:21, _Призрак_ сказал:

Кстати, давно интересовал момент - как правильно будет получить количество элементов в ассоциативном массиве? Я помню делал полный перебор массива чтобы получить его размер, но может есть более приятный вариант?

Быстрее будет наверное только использование метаданных (setmetatable), в которых в процедурах добавления/удаления управлять списком ключей/количеством элементов. из плюсов - в дальнейшем не надо пробегаться каждый раз по всему массиву для подсчета , а обратится сразу к переменной метаданных, из минусов - накладные вычислительные расходы на эти процедуры. Если массив очень большой - то само собой обращение к метаданным будет быстрее. если часто меняется - то считать количество можно достаточно редко. Вам выбирать :)

Ссылка на комментарий
  _Призрак_ писал(а):
может есть более приятный вариант?

:) Ну это кому и как приятнее будет.

 

Winsor, в принципе уже основное определил.

 

Нужно сделать прокси таблицу в которой хранить ссылку на реальную таблицу.

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

будет максимально исключен. В таких полях можно хранить всякие

служебные данные, как например длина таблицы.

Также нужно определить для прокси и метатаблицу с полями (как минимум)

__index и __newindex. В __newindex сделать слежение за размером таблицы

при добавлении\удалении полей.

 

Объявлять таблицу нужно с использованием специальной обёртки.

эта обертка, при объявлении таблицы, присвоит переменной значение не реальной,

а прокси-таблицы.

 

Теперь при обращении к созданной таблице (а реально к прокси) каждый раз будет

вызываться метаметод, так как таких полей в проски, к которым вы обращаетесь нет

(на уникальные ключи попасть будет крайне сложно).

 

Но тут минусы не ограничиваются

  Цитата
"из минусов - накладные вычислительные расходы на эти процедуры."

Для работы с такими таблицами нужно "научить понимать их" соответствующие функции.

А именно :

все из библиотеки "table"

pairs

ipairs

next

rawget

rawset

unpack

getmetatable

setmetatable

 

В принципе там изменить быстрее чем говорить об этом :)

 

Ну и последнее. Я это уже давно написал и пользуюсь. Так что если нужно, то поделюсь

примером.
Изменено пользователем Nazgool
  • Нравится 1
Ссылка на комментарий

@Nazgool, зачем ждать запроса? Кому-то может пригодиться позже, а своевременно выложить пример возможности не будет.

Лучше сейчас, это полезно. :)

Свои работы и совместные проекты: ИнструментOGSM CSFinal StrokeHARDWARMOD

Полезное: модули АртосаXML парсер

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

Ок. Подготовлю выложу.Ведь я так понимаю, что нужно и расписать всё "по понятиям" :)

 

Вроде готово. Как-то так

  Показать

 

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

Нужна помощь. ЗП

Имеется выброс. Он случается раз в 2 - 4 дня.

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

Могу получить промежуток между выбросами, в секундах.

Могу получить текущие дату и время, например 21 апреля 11 часов 48 минут.

Нужно рассчитать оставшееся до следующего выброса время, в часах и минутах (т.е. до выброса осталось Н часов и м минут)

Имеется у меня функция, но она бред выдаёт. Конкретно, отрицательные значения часов и минут.

К тому же, не учитывается, что выброс мог произойти в прошлом месяце (т.е. например, выброс был 28 апреля, а сейчас 1 мая)

  Собственно, вот она (Показать)

Шаман - СисАдмин

Всяко-разно: для ЧН

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

@Romz, у тебя есть все необходимые инструменты, ты же сам недавно подключал модули Артоса.

В lua_helper есть метод (импортированный в публичное пространство) Get_PastSeconds. Получаешь им кол-во секунд, прошедшее со времени последнего выброса:

local past_seconds = Get_PastSeconds(surge_manager.get_last_surge_time())

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

 

Upd: единственное - твоя добавленная функция surge_manager.get_last_surge_time() должна возвращать объект типа CTime, то есть то, что в оригинальном surge_manager хранится в свойстве self.last_surge_time.

 

Upd2: если интересно, как то же самое можно сделать без lua_helper, то вот:

local past_seconds = game.get_game_time():diffSec(surge_manager.get_last_surge_time())
Изменено пользователем Kirgudu
  • Спасибо 1

Свои работы и совместные проекты: ИнструментOGSM CSFinal StrokeHARDWARMOD

Полезное: модули АртосаXML парсер

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

 

 

  Kirgudu писал(а):
единственное - твоя добавленная функция surge_manager.get_last_surge_time() должна возвращать объект типа CTime,
Ну это не моя функция, а @Vergas :)
  Вот она (Показать)

Шаман - СисАдмин

Всяко-разно: для ЧН

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

@Romz, да, Lua регистр различает.

  Romz писал(а):
То есть, можно было гораздо проще всё сделать...

Смотря для чего сам Vergas её писал. А тебе да, можно сделать всё намного проще, по крайней мере в рамках заданного вопроса. Думаю, окончательное решение должно быть уже понятно.

Изменено пользователем Kirgudu
  • Согласен 1

Свои работы и совместные проекты: ИнструментOGSM CSFinal StrokeHARDWARMOD

Полезное: модули АртосаXML парсер

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

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

Но у него это сделано под оригинальный выброс, а у меня в сборке Атмосфир прикручен, и период выброса стоит раз в 2-4 дня. Причём, у меня такое ощущение, что промежуток между выбросами тоже может динамически меняться в некоторых пределах. Потому что если проматывать время, часто спать, то можно ловить выбросы на каждом сне, чего быть не должно.

Шаман - СисАдмин

Всяко-разно: для ЧН

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

Всем привет. Пытался переадаптировать схему боя НПС с ножом из ЗП в ТЧ. В итоге НПС достает нож, смотрит на ГГ и больше ничего не делает. Возникли вопросы:
1. Кто-нибудь разбирал этот скрипт?
2. Возможно подправить это баг?
Вот еще файл скрипта

  rx_knife.script (Показать)
Изменено пользователем Gaz24
Ссылка на комментарий

Добрый день.

 

Для Зова Припяти нужна функция в xr_conditions.  Функция вызывается их логики объекта inventiory_box.  Функция должна выдать true, если ближе 10 метров к этому inventory_box окажется любой сталкер или монстр.  Какой функцией можно воспользоваться? Или как её правильно составить?

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

 

 

  sergej5500 писал(а):
Функция должна выдать true, если ближе 10 метров к этому inventory_box окажется любой сталкер или монстр

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

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

И снова здравстуйте.

Опять за помощью. ЗП.

Имеется инфопоршень. Взводится на пропадание индикаторов ХУДа, сбрасывается при их отображении. Ну, должен, по крайней мере.

Взвод и сброс инфопоршня прописал, соответственно, в xr_effects, в disable_ui, disable_ui_only и enable_ui.

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

Где ещё производится проверка на включение\отключение ХУДа?


Нашёл ещё в _g show_all_ui, добавил туда взведение и сброс инфопоршня. Всё равно, не срабатывает до тех пор, пока не будет использована функция, в которой явно отключается\включается UI. Например, поспать.

Шаман - СисАдмин

Всяко-разно: для ЧН

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

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

Свои работы и совместные проекты: ИнструментOGSM CSFinal StrokeHARDWARMOD

Полезное: модули АртосаXML парсер

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

 

 

  Kirgudu писал(а):
сразу после загрузки никакой диалог (в том числе проводника) ещё не открыт.
Не всегда это возможно. Например, первый переход на Янов. Там разговоры вначале. Хотя ГГ уже заспавнился, но UI пока отключен.

Прикол, вернулся на предыдущую локу - инфопоршень сбросился! Инфопоршни, что ли, сохраняются для каждой локи отдельно?

Переведу-ка я проверку с инфопоршней на se_stor

Добавлено Kirgudu,

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

Шаман - СисАдмин

Всяко-разно: для ЧН

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

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

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

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

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

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

Войти

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

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

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