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

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

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

Кузнецова (как узнать его ид?)

Зачем Id? Для спавна нужна секция конфига или номер секции из алл.спавн.

@AndreySol, А, то есть просто его заново заспавнить... А все инфопоршни его касаемые, они останутся актуальными? 

Например пару квестов с ним было выполнено, были выданы соответствующие инфопоршни о их завершении, всё останется актуальным?

Инфо-порции останутся, просто заспавни этого Кузнецова в нужное место.

  • Спасибо 1
  • Полезно 1

Доброго времени!

Платформа ЗП

Через некоторое время после начала игры (новая или сохранение - несущественно) происходит вылет с таким логом:

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

FATAL ERROR
 
[error]Expression    : !m_error_code
[error]Function      : raii_guard::~raii_guard
[error]File          : ..\xrServerEntities\script_storage.cpp
[error]Line          : 748
[error]Description   : error in error handling
 

stack trace:

0023:006C75D1 xrCore.dll, xrDebug::fail()
0023:0714660E xrGame.dll, CDialogHolder::IgnorePause()
0023:07012CBC xrGame.dll, CDialogHolder::operator=()
0023:03E6B1B1 lua.JIT.1.1.4.dll, lua_getinfo()
0023:03E6B530 lua.JIT.1.1.4.dll, lua_getinfo()
0023:03E62092 lua.JIT.1.1.4.dll, lua_call()

Вопрос - где искать косяк или хотя бы примерное направление поисков ошибки?

16.09.2020 в 19:47, mdm64 сказал:

хотя бы примерное направление

В скриптах.

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

  • Полезно 1

@AndreySol, Да исходники-то есть, но я не понял, где искать эту 748 строку. Судя по этому сообщению error in error handling - ошибка в отладчике ошибок, если не ошибаюсь.

5 часов назад, mdm64 сказал:

я не понял, где искать эту 748 строку

Не трать время зря, ничего полезного там нет.

 

"Error in error handling" - Lua не смог корректно обработать ошибку.

Найти причину очень сложно. Вспоминай всё, что менял в последнее время.

В первую очередь проверяй все скрипты, которые правил, и не только корректность синтаксиса, но и правильность написания имен переменных и функций (хорошо помогает подсветка совпадающих слов в Notepad++).

Также проверяй логику объектов, всех новых или недавно правленых, и, конечно, работу в смартах.

  • Полезно 2

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

Добренько вам. Есть ли возможность поставить в исключения для схемы выброса непися, находящегося в конкретном гулаге под конкретной работой. Или всех НПС под этим гулагом, независимо от "рода деятельности" (в основе ТЧ 1.0006 + АМК 1.41) .

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

Здесь могла быть ваша реклама.

Если неписю продать штук 10-20 разных стволов, он какое-то время будет их носить в инвентаре, но затем большинство из них в одну секунду пропадут, останется только самое мощное (по его мнению).

Вопрос - как можно  управлять этим процессом? (например, запретить такое вот исчезновение оружия из инвентаря непися). За это отвечает какой-то скрипт или что-то еще?

15 часов назад, phalcor сказал:

За это отвечает какой-то скрипт или что-то еще?

Таки нашёл сам. Предметы из инвентаря неписей исчезают благодаря функции first_update(npc) в скрипте trade.script. (Это справедливо для ОП 2.1). Может кому-то будет полезна эта информация ;)

Доброго времени! Возможно ли в Нет-пакет НПС добавить какие-то свои данные? В качестве теста - новую переменную, которая будет в себе хранить просто какое-нибудь число. Как это реализовать? Чтение нетпакета:

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

local pk = get_netpk(npc) --
if pk and pk:isOk() then
	local data = pk:get()
  	--КАКАЯ-ТО ФУНКЦИЯ, работаем с нет-пакетом
  	pk:set(data)

 

 

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

@Kirgudu, интересно. А после проделанных манипуляций сейвы теоретически могут каким-либо образом убиться? 

Вот чтобы не "убились", и надо задействовать кастом дату. :) В описанном случае никаких неприятных последствий замечено не было.

  • Спасибо 1
  • Согласен 2

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

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

1 час назад, _Sk8_AsTeR_ сказал:

А после проделанных манипуляций сейвы теоретически могут каким-либо образом убиться?

Вообще-то, могут довольно запросто. Размер нетпакета в игре ограничен, и если записать в кастом дату слишком много данных (Кучу длинных строк например), то получится "битый сейв" - ничего не случится при сохранении, игра даже в логе не ругнется, но при попытке сейв загрузить, будет вылет с совершенно невразумительными логами.

Я не знаю, есть ли в последних версиях модуля Артоса, железно-надежная внутренняя проверка, не допускающая переполнения. В тех версиях, с которыми я имел дело, такой проверки не было. Т.е. объем записываемых данных, надлежит контролировать самостоятельно.

1 час назад, Kirgudu сказал:

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

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

Если в модуле Артоса есть проверка, запрещающая запись в пакет лишних данных - значит, когда мы попытаемся записать слишком много, часть данных не запишется.

Если такой проверки внутри модуля нет, и мы не проверив, запишем больше разрешенного объема, то получим битый сейв. Т.е. и так и эдак, следить за объемом своих данных, надо самому, а не полагаться на то, что Артос "все предусмотрел". Тут нельзя избавить конечного пользователя от заботы об объеме данных. Получится выбор между потерей данных во имя стабильности, либо битьем сейвов во имя сохранения всего и вся.
Как вариант для записи больших данных - se_stor того же Артоса. Там данные распределяются по нетпакетам многих объектов, а не одного, и благодаря этому хранить можно теоретически сколько угодно. Только следить за тем, чтобы не было монолитных неделимых строк размером больше разрешенной длины нетпакета. Если такие запихивать на запись, то даже se_stor будет бить сейвы. Проверено на личном опыте... :)

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


karikatura-arheologiya_(vladimir-brovkin


 

 

  • Согласен 2

Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine / Мимокрокодил.

Я понял что моя старая подпись что-то нарушает. Удалил все ссылки.

@Zander_driver, я имел в виду несколько другое. Если выбирать между записью в кастом дату и в отдельное свойство всего нет-пакета [ local data = pk:get()    data.my_prop = 1    pk:set(data) ] - однозначно следует предпочесть кастом дату, поскольку добавление отдельного свойства может поломать весь нет-пакет, обладающий определённой структурой для каждого типа объекта (хотя не исключено, что модуль просто проигнорирует добавленные свойства, не характерные для нет-пакета - это я не проверял).

Ну а то, что мы не можем превышать определённую длину, обсуждалось уже много раз. Впрочем, согласен, упомянуть об этом стоило. :)

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

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

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

Нужен скриптер, возможно ли переделать скрипт из мода Dynamics Helmets на ЗП в ТЧ? Поменял только названия визуалов, вылет.

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

[26.09.20 15:11:25.868] *********************************************************************************
[26.09.20 15:11:25.868] [print_output([CScriptEngine::lua_pcall_failed])] SCRIPT RUNTIME ERROR:
....a.l.k.e.r - shadow of chernobyl\gamedata\scripts\m_visuals.script:125: bad argument #1 to 'find' (string expected, got nil)
stack traceback:
    [C]: at 0x7ff92d71b8d8
    [C]: in function 'find'
    ....a.l.k.e.r - shadow of chernobyl\gamedata\scripts\m_visuals.script:125: in function 'str_explode'
    ....a.l.k.e.r - shadow of chernobyl\gamedata\scripts\m_visuals.script:68: in function 'update'
    ...l.k.e.r - shadow of chernobyl\gamedata\scripts\bind_stalker.script:340: in function <...l.k.e.r - shadow of chernobyl\gamedata\scripts\bind_stalker.script:214>
[26.09.20 15:11:25.868] *********************************************************************************
[26.09.20 15:11:25.868] 
FATAL ERROR

[error]Expression    : FATAL ERROR
[error]Function      : CScriptEngine::lua_pcall_failed
[error]File          : c:\projects\ogsr-engine\ogsr_engine\common_ai\script_engine.cpp
[error]Line          : 52
[error]Description   : [CScriptEngine::lua_pcall_failed]: ....a.l.k.e.r - shadow of chernobyl\gamedata\scripts\m_visuals.script:125: bad argument #1 to 'find' (string expected, got nil)

[26.09.20 15:11:25.868] ***************************[ScriptCrashHandler]**********************************
[26.09.20 15:11:25.868] stack traceback:
    [C]: at 0x7ff92d71b8d8
    [C]: in function 'find'
    ....a.l.k.e.r - shadow of chernobyl\gamedata\scripts\m_visuals.script:125: in function 'str_explode'
    ....a.l.k.e.r - shadow of chernobyl\gamedata\scripts\m_visuals.script:68: in function 'update'
    ...l.k.e.r - shadow of chernobyl\gamedata\scripts\bind_stalker.script:340: in function <...l.k.e.r - shadow of chernobyl\gamedata\scripts\bind_stalker.script:214>
[26.09.20 15:11:25.868]     Locals: 
[26.09.20 15:11:25.868]      string (*temporary) : ....a.l.k.e.r - shadow of chernobyl\gamedata\scripts\m_visuals.script:125: bad argument #1 to 'find' (string expected, got nil)
[26.09.20 15:11:25.868]     End
[26.09.20 15:11:25.868]     Locals: 
[26.09.20 15:11:25.868]      nil (*temporary) : [not available]
[26.09.20 15:11:25.868]      string (*temporary) : .
[26.09.20 15:11:25.868]      number (*temporary) : 1.000000
[26.09.20 15:11:25.868]      boolean (*temporary) : true
[26.09.20 15:11:25.868]      string (*temporary) : string expected, got nil
[26.09.20 15:11:25.868]      string (*temporary) : bad argument #1 to 'find' (string expected, got nil)
[26.09.20 15:11:25.868]     End
[26.09.20 15:11:25.868]     Locals: 
[26.09.20 15:11:25.868]      string div : .
[26.09.20 15:11:25.868]      nil str : [not available]
[26.09.20 15:11:25.868]      number pos1 : 1.000000
[26.09.20 15:11:25.868]      number pos2 : 1.000000
[26.09.20 15:11:25.868]      nil clear : [not available]
[26.09.20 15:11:25.868]      nil conv : [not available]
[26.09.20 15:11:25.868]      Table: t
[26.09.20 15:11:25.868]      nil cpt : [not available]
[26.09.20 15:11:25.868]      nil pos : [not available]
[26.09.20 15:11:25.868]     End
[26.09.20 15:11:25.868]     Locals: 
[26.09.20 15:11:25.868]     End
[26.09.20 15:11:25.868]     Locals: 
[26.09.20 15:11:25.868]      Userdata: self
[26.09.20 15:11:25.868]              Table: self.st
[26.09.20 15:11:25.868]              number self.next_restrictors_update_time : 28190.000000
[26.09.20 15:11:25.868]              boolean self.weapon_hide : false
[26.09.20 15:11:25.868]              boolean self.bCheckStart : false
[26.09.20 15:11:25.868]              Userdata: self.weather_manager
[26.09.20 15:11:25.868]                      table self.weather_manager.weather_list : [...]
[26.09.20 15:11:25.868]                      number self.weather_manager.update_time : 10000.000000
[26.09.20 15:11:25.868]                      string self.weather_manager.update_level : l01_escape
[26.09.20 15:11:25.868]                      number self.weather_manager.weather_change_day : 1.000000
[26.09.20 15:11:25.868]              Userdata: self.actor_detector
[26.09.20 15:11:25.868]                      number self.actor_detector.init_time : -1.000000
[26.09.20 15:11:25.868]      number delta : 0.000000
[26.09.20 15:11:25.868]      number time : 27990.000000
[26.09.20 15:11:25.868]     End

Вот сам скрипт:

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

----------------------
-- File:   Visuals
-- Author: Shoker, Mechanic
-- Правки: Antnigm, Redix
-- Меняет визуал ГГ в зависимости от одетого на него шлема
----------------------


-- Таблица секций брони, а также визуалов
--[[
local visuals = {
    секция_брони = {
        секция_шлема = путь к моделе 
        ...
                }
    ...
}
]] 
-- Если шлем не нужен, то ничего не пишем

local visuals = {
    without_outfit = { 
        helm_respirator            = "actors\\novice\\green_stalker_antigas",
                },
    novice_outfit = { 
        helm_respirator            = "actors\\novice\\green_stalker_antigas",
                },
    stalker_outfit = {
        helm_respirator         = "actors\\novice\\green_stalker_antigas",
                },
    svoboda_light_outfit = {
        helm_respirator            = "actors\\novice\\green_stalker_antigas",
                },
    dolg_outfit = {
        helm_respirator            = "actors\\novice\\green_stalker_antigas",
                },        
    svoboda_heavy_outfit = {
        helm_respirator            = "actors\\novice\\green_stalker_antigas",
                },
    specops_outfit = {
        helm_respirator            = "actors\\novice\\green_stalker_antigas",
                },            
    military_outfit = {
        helm_respirator         = "actors\\novice\\green_stalker_antigas",
                },        
    dolg_heavy_outfit = {
        helm_respirator            = "actors\\novice\\green_stalker_antigas",
                },                    
}

local otf  
local helm
local curent_vis
local helm_tbl
local new_model

function update()
otf = db.actor:item_in_slot(7)
helm = db.actor:item_in_slot(11)
curent_vis = db.actor:get_visual_name()

if otf==nil and helm==nil then 
    db.actor:set_visual_name("actors\\hero\\hero_novice")
    return
end

if otf~=nil and helm==nil then
    local otf_vis_name = str_explode(".", get_ltx(otf:section(), "actor_visual", "str"))[1]
    if otf_vis_name~=curent_vis then
        db.actor:set_visual_name(otf_vis_name)
    end
else
-------------------------------------
    if otf==nil and helm~=nil then 
        helm_tbl = visuals["without_outfit"]
    else 
        helm_tbl = visuals[otf:section()]
    end
    if helm_tbl~=nil then
        new_model = helm_tbl[helm:section()]
        if new_model~=nil then
            if new_model~=curent_vis then
                db.actor:set_visual_name(new_model)
            end
        end
    end
-------------------------------------
end

end


-- Получить строку из LTX файла
function get_ltx(l_name,l_string,type)
if system_ini():section_exist(l_name) and system_ini():line_exist(l_name, l_string) then

    if type=="bol" then
        return system_ini():r_bool(l_name, l_string)
    end
    if type=="num" then   -- целое число
        return tonumber(system_ini():r_u32(l_name, l_string))
    end
    if type=="num_float" then   -- число с запятой
        return tonumber(system_ini():r_float(l_name, l_string))
    end
    if type=="str" then
        return tostring(system_ini():r_string(l_name, l_string))
    end
    if type==nil then
        return system_ini():r_u32(l_name, l_string)
    end

end

return nil
end

function str_explode(div,str,pos1,pos2,clear, conv)
    local t={}
    local cpt, pos

    if pos1 == nil then pos1 = 1 end
    if pos2 == nil then pos2 = pos1 end

    local cpt1 = string.find (str, div, pos1, true)
    local cpt2 = string.find (str, div, pos2, true)

    if cpt1 and cpt2 then

        if cpt2-cpt1 > 5 then
            cpt = cpt1
            pos = pos1
        else
            cpt = cpt2
            pos = pos2
        end

        repeat
            if clear then
                table.insert( t, trim(string.sub(str, 1, cpt-1)) )
            else
                table.insert( t, string.sub(str, 1, cpt-1) )
            end
            str = string.sub( str, cpt+string.len(div) )
            cpt = string.find (str, div, pos, true)
        until cpt==nil
    end
    if clear then
        table.insert(t, trim(str))
    else
        table.insert(t, str)
    end

    if conv then 
        t = convert_tbl(t)
    end

    return t
end

125 строка - local cpt1 = string.find (str, div, pos1, true)
Заранее спасибо

В xray_ext есть скриптовой метод задающий путь до визуала для актора - set_actor_visual(string<path>), не думал попробовать?

В ОГСР скорее всего тоже что то есть, не знаю.

Как показал lua_help в ТЧ нет методов set_visual_name, get_visual_name, так что однозначно правим движок:big_boss:

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

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

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

UriZzz.gif

Ребят, а как вообще реализована механика ворон в Сталкере? Насколько я понял - они спавнятся и "беспалева" преследуют ГГ по небу, имитируя бурную воронью деятельность. А есть возможность задать воронам вектор движения? По вызову скрипта, например, чтобы летела ворона от края до края локи?

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

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

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

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

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

Войти

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

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

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