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

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

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


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

 
 

Stalkerin. Там есть много хороших статей касательно данной темы.
Уроки по модостроению. Есть рабочие примеры готовых скриптов различного назначения.

 

Справочное руководство по языку Lua 5.1
https://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual/ru
Справочник по функциям и классам. Собрано много информации по функциям и классам, не всем, но по основные сведения предоставлены.

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

 

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

 

Задавайте вопросы, которые касаются непосредственно скриптов и их работы, т.е. Вы что-то делаете, а у Вас что-то не получается, при этом у Вас на руках должен быть хотя бы какой-то код, свидетельствующий о Вашей причастности к вопросу.

 

Вопросы которые будут удалятся, следовательно их задавать не нужно:
-- Где находится та или иная функция?
Для ответа используем поиск по словам среди файлов оригинальной игры или мода, если объект поиска относится к нему, при помощью программы, которая Вам наиболее симпатизирует;
-- Как сделать что-то/то-то?
С подобными вопросами, либо в "ковырялки", где Вам вероятнее всего так же не ответят, либо выдвигаем мысли, подкреплённые теорией, практикой (идеальный вариант) и здравым рассудком;
-- Вопросы со смыслом: "сделайте", "совместите" и подобными глаголами повелительного наклонения.
-- К тому же удалению будут подвергаться вопросы, в которых масштабно не используются теги, для отделения кода и цитат от основного текста, а также не вписан в спойлер код размером превышающие семь строк.
Ответ на возможно возникший вопрос: В какую тему можно обратиться по поводу логики и спавна объектов?
В тему "ковырялок" соответствующей версии игры, для которой Вы задаёте вопрос.

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


  • Спасибо 1
  • Полезно 2
Ссылка на комментарий
https://www.amk-team.ru/forum/topic/6185-skriptovanie/
10 часов назад, rost2000 сказал:
obj = sim:object(id)
if zone and zone:inside(obj:position()) then

 

У серверного объекта position является свойством, а не методом (функцией). Выполнение будет приводить к ошибке, как у тебя, тогда как правильное написание будет таким:

if zone and zone:inside(obj.position) then

 

  • Нравится 1
  • Полезно 1

Свои работы и совместные проекты: Инструмент, OGSM CS, Final Stroke, HARDWARMOD

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

@rost2000, а ещё, в добавлении к предыдущему посту:

Наличие "зоны" лучше проверить перед циклом, один раз.

А внутри цикла нужно убедиться в наличии объекта:

if obj and zone:inside(obj.position) then
  • Нравится 2

S.T.A.L.K.E.R. CoP Objects  >200 шт  (upd 21.05.26) - Скачать  (Яндекс-диск)

21 час назад, Купер сказал:

страшно, конечно. Там, по идее, по дельте времени ~ 1раза в секунду более, чем достаточно.

В x-ray extensions вроде есть коллбэк на перемещение в слот. Хм, как бы его правильно использовать, пример нужен.

Приветствую, подскажите ковыряю напарников, имеет ли смысл вообще данные строки:
 

Скрытый текст

...

local real_enemy = db.storage[npc:id()].enemy
...
    if not real_enemy or (real_enemy and not real_enemy:alive()) then
            db.storage[npc:id()].enemy = who
    end

Потому что иногда ловлю вылет по методу alive, я так понимаю у переменной real_enemy вообще нельзя проверить жив он или нет?

  • Полезно 1

Не вижу такого метода в оригинале… Может быть, он возвращает серверный объект вместо клиентского, из-за чего и вылетает проверка alive?

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

Тоже думал насчет серверного объекта, я просто не особо понимаю для чего вообще нужна эта проверка, типа если врага нет или враг не живой то db.storage[npc:id()].enemy = who, но вот для чего это нужно?
(все это в функции we_are_hit в xr_companion)

  • Нравится 1

@Купер , короче проще сразу переехать на OGSR...

  • Согласен 1

[ТЧ 1.0006]

 

В обработчике логики [xr_remark.script] для выдачи сообщений сделано что-то странное:
- после проверки "в конфиге логики есть параметр tips" запускается проверка наличия звука, сопоставленного с таким текстом в [news_manager.script];
- если получена ссылка на сопоставленный звук, этот звук проигрывается в дополнение к звуку, указанному в логике через параметр "snd" (при разнице в задержке вывода или ссылках будет каша);
- "настоящий" звук запускается отдельным обработчиком xr_sound.set_sound_play вне проверки tips;
- в проверку наличия звука передаются аргументы "объект ГГ, tips_id, tips_sender", хотя принимаются аргументы "объект ГГ, tips_id, задержка вывода, tips_sender", из которых проверяется только tips_id;
- задержка вывода при обработке указана заново, причем глобальной переменной и применяется только для вывода обычного звука КПК;
- отправка сообщения не выполняется ни в каком виде.

 

Я упускаю какой-то хитрый замысел, или этот огород не делает ничего полезного?

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

Можно ли отключить голод у актора скриптом? 

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

Жить стало лучше, жить стало веселей. А когда веселей живётся, то работа скорится.

img.php?nick=Balavnik&sert=2&text=t6

Почему у некоторых объектов вызов метода :id() вызывает ошибку:  attempt to call method 'id' (a number value)?

 

При этом метод :name() работает, и выводит всё как надо.

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

Жить стало лучше, жить стало веселей. А когда веселей живётся, то работа скорится.

img.php?nick=Balavnik&sert=2&text=t6

@Купер Но почему для этого же объекта метод :name() корректно возвращает имя, а для него же при вызове метода :id() вылетает ошибка?

 

P.s. Приложу код и лог. OGSR, если что.

Скрытый текст

log1(wpn:name())
log1(""..wpn:id())

Скрытый текст

 [28.11.24 10:40:07.103] [16192] wpn_pm0420
[28.11.24 10:40:07.103] [16192] 420

wpn_pm0341
[28.11.24 10:40:16.126] [16192] *********************************************************************************
[28.11.24 10:40:16.126] [16192] [print_output([CScriptEngine::lua_pcall_failed])] SCRIPT RUNTIME ERROR:
d:\games\s.t.a.l.k.e.r\gamedata\scripts\rx\rx_utils.script:457: attempt to call method 'id' (a number value)

 

Изменено пользователем Balavnik
  • Смешно 1

Жить стало лучше, жить стало веселей. А когда веселей живётся, то работа скорится.

img.php?nick=Balavnik&sert=2&text=t6

Есть еще один специфический вариант: при разбивании ящика объект-убийца передается в обработчик callback.death как движковый (C++), а не как игровой (Lua), из-за чего случается вылет при проверке who:id().

  • Нравится 2

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

10 часов назад, Balavnik сказал:

Но почему для этого же объекта метод :name() корректно возвращает имя, а для него же при вызове метода :id() вылетает ошибка?

Потому что так написан движок. Метод серверного объекта :name() существует, а метод того же объекта :id() - нет, вместо него числовое свойство .id. На это тебе даже лог намекает:

10 часов назад, Balavnik сказал:

(a number value)

И если в данном случае ты напишешь log1(""..wpn.id), то будет тебе счастье.

Изменено пользователем Kirgudu
  • Нравится 2
  • Полезно 2

Свои работы и совместные проекты: Инструмент, OGSM CS, Final Stroke, HARDWARMOD

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

Здравствуйте, есть вот такой скрипт(зп)

Скрытый текст
function delete_af_mahovik_1()
    local lc = alife():story_object(story_ids.af_mahovik_1)
    alife():release(lc, true)
end

 

находится он у меня в xr_effects, использую в логике рестриктора %=delete_af_mahovik_1%. Сильно за скрипты не шарю. Поэтому и такой вопрос: Как переделать этот скрипт что бы в логике писать нужный мне id по типу %=delete_af(af_mahovik_1)%. Заранее спасибо.

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

«Если долго мучиться, что-нибудь получится»
Охотник за артефактами|Crow Game Killer
img.php?nick=Pavel2000&sert=2&text=t0

По образу и подобию других функций в том же скрипте: сделать обработку стандартных для логики аргументов actor, npc, p (названия любые, типы "объект, объект, список") и читать свои значения, переданные из логики, по ссылкам p[1], p[2], …

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

@Norman Eisenherz так я и делал только у меня ничего не получается, то вылетает то вообще не работает 

Я перепробовал разные варианты, но так так синтаксис луан мне не знаком, у меня ничего не выходит

 

 

function delete_af_mahovik_1(actor, object,  p)

local lc = alife():story_object(story_ids.p[1])

    alife():release(lc, true)

end

 

Вот так вот пробовал не работает

Я пробовал переделать функции remove_npc и destroy_object под свои задачи не получилось.

Пытался с умным лицом читать статьи про Lua, но из этого ничего не вышло. Помогите написать этот скрипт пожалуйста 

«Если долго мучиться, что-нибудь получится»
Охотник за артефактами|Crow Game Killer
img.php?nick=Pavel2000&sert=2&text=t0

@Pavel_2000 если со всеми проверками "на дурака", то примерно так:

function delete_af(actor, npc, p)
  if type(p) == "table" then -- проверяем, что параметр передан и имеет табличный тип
    local story_id = p[1] -- присваиваем story_id из параметра
    if type(story_id) == "string" then -- но если передана строка, то
      story_id = tonumber(story_id) or story_ids[story_id] -- пробуем превратить строку в число или получить числовой story_id из штатного перечисления по его наименованию
    end
    if type(story_id) == "number" and story_id > 0 then -- проверяем, что story_id найден, имеет числовой тип и больше нуля
      local lc = alife():story_object(story_id) -- ищем объект по story_id
      if lc ~= nil then -- проверяем, что объект найден
        alife():release(lc, true) -- производим удаление объекта
      end
    end
  end
end

Использовать так: %=delete_af(af_mahovik_1)% или так: %=delete_af(111)%

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

Изменено пользователем Kirgudu
  • Спасибо 1
  • Нравится 2
  • Полезно 1

Свои работы и совместные проекты: Инструмент, OGSM CS, Final Stroke, HARDWARMOD

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

Можно как то скриптом сделать одного монстра из группировки нейтралом по отношению к актору.

Как на оригинальном движке создать циклическую проверку time_global вне загруженной игры, то есть без апдейта ГГ или другого объекта? Хочу сделать перемотку списка сейвов удерживанием клавиш.

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

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

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

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

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

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

Войти

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

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

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