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

Внимание. На форуме проводятся технические работы с боковым меню.

_Val_ _Val_

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

Тема для обсуждения скриптов всего и всех в серии игр 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/

@WinCap Я знаю как в Lua получать дату и время... Будь добр, прочитай ещё раз мой предыдущий вопрос, внимательно. Потом - сам проверь В ИГРЕ - то что ты рекомендуешь - и ты сам себе ответишь на свой вопрос: "... а чем os.date() не устраивает..." Если бы оно работало В ИГРЕ - я бы не спрашивал :facepalm:

Вопрос - актуален: 

 

Возможно ли получить в игре скриптово реальное время компьютера (не игровое время) -> как в Lua с помощью os.date()?  Если да, то можно пример для получения yy:MM:dd hh:mm:ss?

Для "быстрых" и невнимательных: os.date() в игре STALKER - не работает.

 

! Unknown command:  ..\gamedata\scripts\test.lua:101:_attempt_to_index_global_'os'_(a_nil_value)

 

Изменено пользователем Баба ЯГА
  • Не согласен 1

Мы, вчера, соседям сказали, что материализация - состоялась, чтобы ваш авторитет не уронить. Вот, мол, было изваяние, а теперь - стала Марья Ивановна. Многие верят ... ©

@Баба ЯГА Как это не работает? В OGSE таким образом главное меню подбирается в зависимости от реального времени суток.

 

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

function main_menu:InitBackground()
    local time = level.present() and level.get_time_hours() or tonumber(os.date("%H", os.time()))
    local night = time <= 8 or time >= 20
    self.bg_st:InitTexture(night and "ui\\ui_mm_night_back" or "ui\\ui_mm_main_back")
    local multiplier = 0.5625
    if screen_aspect_ratio > 2 then -- ultra-wide
        multiplier = 0.40
    end
    local tex_orig_w = screen_aspect_ratio * 1024 * multiplier
    local tex_orig_x_offs = (1024 - tex_orig_w) / 2
    self.bg_st:SetOriginalRect(tex_orig_x_offs, 0, tex_orig_w, 768);
end

 

Изменено пользователем I am Dead

@I am Dead ну, может, в OGSE - уже и допилили движок и там есть такое, не спорю, у меня - нет (играю в Диетическую Солянку), кстати, в оригинале - тоже нет os. Вот по-этому и спрашиваю - может кто поможет (если, конечно, кто знает).

 

 

 @NikitosKnyaz 

12 часов назад, NikitosKnyaz сказал(а):

можно ли в ОП 2-1 через скрипт выдать и показать на карте все тайники существующие в зоне?!

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

Можно, вот так, например:


function find_all_tainik()
  local s_obj,cnt = nil, 0
	for i = 1, 65534 do
    s_obj = alife():object(i)
    if (s_obj) and (s_obj:section_name():find("inventory" , 1, true) or s_obj:section_name():find("_box" , 1, true))  then
		  cnt = cnt + 1
      get_console():execute( "load ::: ".."section: "..s_obj:section_name().." | name: "..s_obj:name().." | id: "..s_obj.id)
      if level.map_has_object_spot( s_obj.id, "treasure" ) == 0 then -- нет метки
        level.map_add_object_spot_ser( s_obj.id, "treasure", "Тайник"..s_obj:name() ) -- поставим свою
      end
    end
  end
  get_console():execute( "load ::: ".."Количество найденных тайников = "..cnt)
end

find_all_tainik()

 

 

 

Изменено пользователем Баба ЯГА

Мы, вчера, соседям сказали, что материализация - состоялась, чтобы ваш авторитет не уронить. Вот, мол, было изваяние, а теперь - стала Марья Ивановна. Многие верят ... ©

@gam а может недозапись ОГФа в системсе ? В таблице капчюрс? 

  • Полезно 1

"Кругом зомби.....у меня кончаются патроны...."

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

1. Как скриптово активировать диалог с нужным нпс?

2. Как активировать торговлю с этим нпс? (Например, после активации определённой фразы)

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

1. Функции npc:set_start_dialog("start_dialog") и npc:restore_default_start_dialog().

2. Функции npc:enable_trade() и npc:disable_trade().

Но, возможно, удастся обойтись стандартными средствами:

1. Теги has_info и dont_has_info для диалога или параметры meet_dialog и use в секции meet работы npc.

2. Параметр trade_enable в секции meet работы npc.

  • Нравится 1

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

Приветствую. Пару вопросов:

1)В игре есть метод начать неразрываемый диалог с НПС, однако существует хитрость: если нажать паузу, а затем Esc, то такой диалог всё-таки закроется. Как это поправить?

2) Есть такая функция:

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

if math.random(100) <= 50 then
    действие_1
elseif math.random(100) > 50 then
    действие_2
end

но срабатывает не всегда. Где ошибка?

Спасибо.

Изменено пользователем Jek@n
4 часа назад, Jek@n сказал(а):

нажать паузу, а затем Esc, то такой диалог всё-таки закроется. Как это поправить?

Ну, самый простой способ: не нажимать на esc вовремя паузы.

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

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

  • Согласен 2
  • Полезно 1

 Моя нычка, Нычка в арендованном у Опричника холодильнике  

Мы хорошие ребята, жаль патронов маловато:):ukostra:

UriZzz.gif

Здрасьте.

 

[ЗП 1.6.02] Проблема: при каждом повторе сейва и загрузки добавляется примерно 10 секунд реального времени к значению game.time().

Дельта постоянная – время в главном меню при создании сейва и время ожидания на экране загрузки не влияют.

Пример: вывод внутреннего таймера в сообщение, сразу же сейв и загрузка – начальное время 35 653 секунд, время после загрузки – 35 665 секунд.

Как с этим бороться?

 

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

Шпаргалка

Снимаю вопрос. Через pstor-запись в момент сейва и сравнение на первом апдейте разница ловится достаточно точно.

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

Шпаргалка

@Norman Eisenherz если хочешь прям конкретно узнать,  что грузит время сейва,  то надо юзать утилитку filemon.  Щас она не юзается на 7ке. Есть другая. Поиском найдешь.

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

Именно так я искал время загрузки текстур и звуков,  для НС,  по заданию Сапсана. В результате была сделана оптимизация и время загрузки сократилось с полутора минут, до 10-18 секунд.  Но там после,  уже скритово было сделано.  Но утиль полезный,  правда настраивать его тяжко. Но если ты уж так заморочился,  оно того стоит. 

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

"Кругом зомби.....у меня кончаются патроны...."

@BFG game.time() – счетчик времени в активном сейве, и этот счетчик должен обновляться только при апдейте актера, который начинается после загрузки сейва и отключения меню. Или не совсем так?

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

Шпаргалка

Написал меню:

class "menu" (CUIScriptWnd)

function menu:__init() super()
	self:InitControls()
end
function menu:__finalize() end

-- и т.д.

открываю прямо в игре из инвентаря, всё работает.

Вопрос: как его отловить из другого скрипта (когда это меню открыто)?

Мы, вчера, соседям сказали, что материализация - состоялась, чтобы ваш авторитет не уронить. Вот, мол, было изваяние, а теперь - стала Марья Ивановна. Многие верят ... ©

16 минут назад, AndreySol сказал(а):

@Баба ЯГА 

Код покажи, которым ты открываешь свое окно.

 

открываю так

level.start_stop_menu( ui_my_menu.menu(), true ) -- открываю меню

 

Мы, вчера, соседям сказали, что материализация - состоялась, чтобы ваш авторитет не уронить. Вот, мол, было изваяние, а теперь - стала Марья Ивановна. Многие верят ... ©

Наткнулся на один очень странный и неприятный вылет. Платформа RMA mod v1.1.5 + Shadows Addon v0.8.5 + Патч lvg_brest v3.5... При быстром сохранении и загрузке с него вылет вида:

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

FATAL ERROR
 [error]Expression    : fatal error
[error]Function      : CScriptEngine::lua_error
[error]File          : E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cpp
[error]Line          : 73
[error]Description   : <no expression>
[error]Arguments     : LUA error: ... of chernobyl\gamedata\scripts\dialog_manager.script:880: attempt to compare number with nil
stack trace:

Собственно строка:

if ver >= 7 then

Идёт проверка патча, верно? В system.ltx указан шестой патч, т.е. current_server_entity_version = 7

 

А вот при попытке поставить затычку перед строкой if ver >= 7 then -> if not ver then ver = 8 end...

(вся функция ниже под спойлером)

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

function load(npc, reader, ver)
    if selected_phrase_by_id == nil then
        selected_phrase_by_id = {
            intro = {},
            cool_info = {},
            action_info = {}
        }
    end

    local flag = nil
        if not ver then ver = 8 end
    if ver >= 7 then
        flag = reader:r_stringZ()
    else
        flag = tostring(reader:r_s16())
    end

    if flag ~= "-1" then
        selected_phrase_by_id.intro[npc:id()] = {phrase = flag, count = 0}
    else
        selected_phrase_by_id.intro[npc:id()] = nil
    end

       
    if ver >= 7 then
        flag = reader:r_stringZ()
    else
        flag = tostring(reader:r_s16())
    end
    if flag ~= "-1" then
        selected_phrase_by_id.cool_info[npc:id()] = {phrase = flag, count = 0}
    else
        selected_phrase_by_id.cool_info[npc:id()] = nil
    end


    if ver >= 7 then
        flag = reader:r_stringZ()
    else
        flag = tostring(reader:r_s16())
    end
    if flag ~= "-1" then
        selected_phrase_by_id.action_info[npc:id()] = {phrase = flag, count = 0}
    else
        selected_phrase_by_id.action_info[npc:id()] = nil
    end
end

...начинаются вылеты вида:

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

Синхронизация...
* phase time: 4 ms
* phase cmem: 225135 K
* [win32]: free[2698856 K], reserved[466984 K], committed[1028400 K]
* [ D3D ]: textures[298939 K]
* [x-ray]: crt heap[225135 K], process heap[464336 K], game lua[27948 K], engine lua[217 K], render[4108 K]
* [x-ray]: economy: strings[6773 K], smem[8222 K]
stack trace:

0023:05185AF0 xrGame.dll
 [error][      87]    : Параметр задан неверно.

Но! С ручных сейвов всё грузится. Мало того. Стоит переименовать квиксейв в папке сейвов вручную, игра послушно грузится с него тоже.

Какая-то хаффовщина, честное слово.

То ли это проблема движка с правками x-ray extensions, то ли я не знаю.

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

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

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

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

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

Войти

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

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

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