В данной теме вы можете задавать любые вопросы касательно S.T.A.L.K.E.R. моддинга
• Не флудить • Предварительно просматривайте раздел, ведь ответ на ваш вопрос может быть там • В своем вопросе указывайте платформу моддинга — Тень Чернобыля, Чистое небо или Зов Припяти
1. Какая стоит игра, с каким патчем? 2. Какой мод, версия мода? 3. Что правили своими ручками? 4. Лог вылета и последние 25 строк (помещать под спойлер).
Структура папок и файлов в корневом каталоге игры:
...\S.T.A.L.K.E.R\gamedata\anims – папка содержит исполнительные файлы эффектов (например от ПНВ).
...\S.T.A.L.K.E.R\gamedata\config – папка содержит основные конфигурационные файлы (т. е. большинство настроек игры)
...\S.T.A.L.K.E.R\gamedata\meshes – содержит модели игровых предметов и персонажей...
...\S.T.A.L.K.E.R\gamedata\scripts – папка со скриптами (рабочими файлами содержащими в себе наборы функций) – основная папка, отвечающая за ответные действия игры и действия производимых игроком в игре.
...\S.T.A.L.K.E.R\gamedata\shaders – папка содержит в себе конфигурационные файлы шейдеров.
...\S.T.A.L.K.E.R\gamedata\sounds – здесь находятся все звуки игры (разложены по своим каталогам и папкам)
...\S.T.A.L.K.E.R\gamedata\spawns – содержит файл спавна – очень важный файл – не трогать без нужды!!!
...\S.T.A.L.K.E.R\gamedata\textures – содержит разложенные по каталогам и папкам текстуры используемые в игре.
Теперь разберем папки в каталоге «config»
...\S.T.A.L.K.E.R\gamedata\config\creatures - содержит массу конфигурационных файлов, в основном отвечающих за взаимодействие Главного героя игры (в дальнейшем ГГ) и прочего окружения в игре и ТТХ самого ГГ.
...\S.T.A.L.K.E.R\gamedata\config\gameplay – содержит конфиг. файлы персонажей игры (НПС) отвечающие за внешний вид, статус, снаряжение. Файлы: character_desc_ххх (где ххх – название локации) и character_desc_general (отвечает за зомбированного персонажа). Также содержит файлы диалогов и профилей НПС.
…\S.T.A.L.K.E.R\gamedata\config\misc – конфиг.файлы торговцев (папки с именами торговцев), артефактов, брони, квестовых предметов, уникальных предметов, файл отвечающий за награды за автозадания, файл эффектов (алкоголизма, ранения, ПНВ и прочих)...
…\S.T.A.L.K.E.R\gamedata\config\mp – среди прочих содержит важный файл mp_ranks – отвечающий за выпадение оружия и патронов из рук ГГ и НПС – без прописывания добавляемого в игру оружия в этот файл при выпадении нового оружия из рук ГГ\НПС будут следовать вылеты.
…\S.T.A.L.K.E.R\gamedata\config\text\rus – содержит файлы описаний всего и вся находящегося в игре (брони, артефактов, оружия, предметов и прочего).
…\S.T.A.L.K.E.R\gamedata\config\weapons – содержит конфиг.файлы оружия и боеприпасов используемых в игре.
…\S.T.A.L.K.E.R\gamedata\config\weathers – содержит конфиг.файлы настройки погоды на локациях.
Теперь немного подробнее о файлах.
...\S.T.A.L.K.E.R\gamedata\config\misc:
Папка shop_ххх (ххх – имя торговца) – содержит конфиг.файлы ассортимента торговца.
outfits – содержит секции конфигов костюмов.
artefacts - содержит секции конфигов артефактов.
items - содержит секции конфигов предметов.
monster_items - содержит секции конфигов частей монстров
postprocess - содержит секции конфигов пост. процессов (например: ПНВ).
quest_items - содержит секции конфигов квестовых предметов.
task_manager - содержит секции наград за автоквесты.
unique_items - содержит секции конфигов уникального оружия и костюмов.
ЗП. Хочу сделать такую функцию, чтобы при перемещении определенной брони в слот - броня скидывалась обратно в инвентарь. Прошу помощи, так как перепробовал разными методами, но с каждым разом выходили еще более разные баги.
Функция:
Цитата
function actor_item_to_slot(obj) if not has_alife_info ("power_1_add") then local outfit = db.actor:item_in_slot(7) if (outfit and obj:section() == "exo_outfit") then ui_dyn_msg_box.msg_box_ui("message_box_ok",true,game.translate_string("Вы не настолько сильны и ловки, чтобы таскать на себе такую тяжесть")) ... -- Без понятия что дальше end end end
[error]Expression : <no expression> [error]Function : CScriptEngine::lua_error [error]File : ..\xrServerEntities\script_engine.cpp [error]Line : 189 [error]Description : fatal error [error]Arguments : LUA error: ...l of chernobyl\gamedata\scripts\axr_trade_manager.script:225: 'for' limit must be a number
stack trace:
Что стало причиной - понятия не имею. Пробовал убирать все вещи из ассортимента торговцев, вылет не исчезает. Появляется при приближении к торговцам (на локации их 3, Шустрый, Петренко, бармен). Некоторые поменяли параметр with_distance до низких значений, вылет вроде бы как перестал появляться.
Хочу сделать такую функцию, чтобы при перемещении определенной брони в слот - броня скидывалась обратно в инвентарь.
Тут есть сложности. Дело в том, что нет движкового метода перемещения брони из слота в рюкзак. Это первое. Второе. Если выбросить броню и снова подобрать, то движок "автоматом" вставит ее снова в слот, если слот пустой. Вроде как "тупик", НО мы можем вбить свой "костыль" и это дело поправить скриптами. Делается это так ( честно скажу , что это первое что пришло в голову, но это работает на все 100% ): 1. Делаем секцию фейкового бронекостюма. Для этого в файле outfit.ltx добавляем секцию [novice_fake_outfit]:novice_outfit 2. Ставим два колбека в функцию перемещения экзоскелета в рюкзак:
function actor_item_to_slot() local actor = db.actor local outfit = actor:item_in_slot( 7 ) if outfit and outfit:section() == "exo_outfit" then level.disable_input() get_hud():HideActorMenu() actor:drop_item( outfit ) alife():create( "novice_fake_outfit", vector(), 0, 0, actor:id() )
local novice_outfit_wait = function() if actor:item_in_slot( 7 ) and actor:item_in_slot( 7 ):section() == "novice_fake_outfit" then return true end end
local transfer_outfit = function() outfit:transfer_item( outfit, actor ) end
local both_outfits_wait = function() if actor:item_in_slot( 7 ) and actor:item_in_slot( 7 ):section() == "novice_fake_outfit" and actor:object( "exo_outfit" ) ~= nil then return true end end
local remove_outfit = function() local rem_outfit = actor:item_in_slot( 7 ) alife():release( alife():object( rem_outfit:id() ), true ) level.enable_input() end
Причина в том что в скрипте axr_trade_manager.script в строке 225 один из аргументов оператора for не является числом в какой то момент времени, а является - например nil, отсюда и вылет.
Сообщение отредактировал denis2000 - Вторник, 19.09.2017, 09:28
ТЧ. Есть какой-нибудь способ поменять логику (в моем случае рестриктора), который находиться в all.spawn скриптами. У меня обнаружилась проблема с логикой.
Пытаюсь добавить в метод update рестриктора такой код после строк :
if not self.initialized and db.actor then self.initialized = true xr_logic.initialize_obj(self.object, self.st, self.loaded, db.actor, modules.stype_restrictor) end
[spoiler]function clear_logic(obj) local st = db.storage[obj:id()] st.ini_filename = "<customdata>" st.ini = ini_file("[logic]\nactive = nil") --xr_logic.get_customdata_or_ini_file(obj, st.ini_filename) st.active_section = nil st.active_scheme = nil st.section_logic = "logic" xr_logic.switch_to_section(obj,nil,nil) end
function setup_restr_logic(obj,st,loaded) local ltx_name = "scripts\\test_restr.ltx" if not (ltx_name) then abort("There is no file") end local ltx = ini_file(ltx_name) if not (ltx) then abort("There is no file_name") end
xr_logic.configure_schemes(obj, ltx, ltx_name, 4, loaded and st.loaded_section_logic or "logic", nil)
local new_section = loaded and st.loaded_active_section or xr_logic.determine_section_to_activate(obj, ltx, "logic") --xr_logic.activate_by_section(obj, ltx, new_section, loaded) xr_logic.switch_to_section(obj, ltx, new_section) --st.overrides = xr_logic.cfg_get_overrides(ltx, new_section, obj) --dbglog("setup complete") end
[/spoiler]
И ничего не выходит...=((
Тут по логу видно что вроде как и находит мой файл test_rest, и как видно опять ж по логу не может прочитать секцию, и скидывает в кастомдату с логом INI = nil!!!. Так до бесконечности.
Есть какой-нибудь способ поменять логику (в моем случае рестриктора), который находиться в all.spawn скриптами
Зачем столько мучений? 1. Удаляете ненужный вам рестриктор с логикой, которая вас не устраивает 2. Спавните скриптом свой рестриктор с новой логикой.
Например в методе UPDATE биндера объекта рестриктор пишите:
if string.find( self.object:name(), "Имя_рестриктора_который_удаляем" ) ~= nil then local lv_id, gv_id, pos = self.object:level_vertex_id(), self.object:game_vertex_id(), self.object:position() alife():release(alife():object(self.object:id()), true) local logica = "[logic]\n".. "active = sr_idle@zone_in\n".. "[sr_idle@zone_in]\n" create_restrictor( logica , lv_id, gv_id, pos ) end
В конце файла пишем:
function create_restrictor( logica , lv_id, gv_id, pos )
local s_obj = alife():create( "space_restrictor", pos , lv_id, gv_id )
local packet = net_packet() packet:w_begin( 0 )
-- Читаем данные из нет-пакета
s_obj:STATE_Write( packet ) packet:r_seek( 2 )
-- cse_alife_object
local game_vertex_id = packet:r_u16() local distance = packet:r_float() local direct_control = packet:r_s32() local level_vertex_id = packet:r_s32() local object_flags = packet:r_s32() local custom_data = packet:r_stringZ() local story_id = packet:r_s32() local spawn_story_id = packet:r_s32()
-- cse_shape
local shapes = packet:r_u8() local shape_type = packet:r_u8() local center = packet:r_vec3() local radius = packet:r_float()
Такая трабла. Есть глобальная переменная в одном скрипте, допустим - равна 1. Из другого скрипта хочу считывать её цифру, чтобы при 1 была одна функция, а при 0 - другая. Без понятия, как считывать - пробовал "мой_скрипт.переменная == 1 then" и т.д, но почему-то всегда считывался только 0, даже когда значение было 1 или больше - все равно выдавало часть функции, где указан 0. Короче, как вообще правильно считывать значение глобальной переменной в отдельном скрипте?
makdm, Да Ваша функция работает! Спасибо! Но мои самостоятельные поиски не прошли зря. Я вот тут кое что обнаружил:
1. Думаю что проверка на actor в биндере рестриктора излишняя. Тк вызывается все равно из апдейта актора и если он равен нил, то скорей всего проблема в сейве или где-то серьезная ошибка.
2. Почему нет удаления для st.loaded_ini_filename и ему подобных. Ведь это не нужно после инициализации которая происходит в initialize_obj. Думаю что в конце этой функции нужно присвоить st.loaded... всем нил. Я правильно понимаю?
3.Считаю от функции get_customdata_or_ini_file можно отказаться просто перенести условие выбора gulag_task в функцию initialize_obj.