В данной теме вы можете задавать любые вопросы касательно 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 - содержит секции конфигов уникального оружия и костюмов.
Вечер добрый.Может кто подскажет решение следующей проблемы.Сделал не большую солянку на Чистое Небо(ОГСМ+Текстуры Мистери+Динамический худ+Атмосфер+Weapon Pack для ОГСМ 1.8).До определенного момента все в ажуре было.А затем вылез баг:сохранения ( любые-и быстрые и через меню) бьются и не загружаются. Выдает в логе вот такое:
! [LUA][ERROR] ERROR: xr_logic: pstor_load_all: not registered type in sim_default_csky_049204 encountered: ! Cannot find saved game ~~~ xr_logic: pstor_load_all: not registered type in sim_default_csky_049204 encountered:
В call of chernobyl нет класса CCampfire, либо я не там смотрю.
Такого конечно нет, а вот такой есть - CZoneCampfire. И да смотрите не там. Проверка же на костерность такая:
Код
if get_clsid(object) == clsid.zone_campfire then ... end
Цитатаstalker00 ()
Может кто подскажет что за фигня и как с этим бороться.
Скрипт решил, что дальше такое продолжаться не может и вызвал функцию abort. Причина: попытка прочитать сохраненную переменную незарегистрированного типа.
Сообщение отредактировал denis2000 - Пятница, 03.11.2017, 08:27
А что что за переменная?.Можно ее как-то найти?.Самое интересное то,что до зтого гонял предедущую версию этой солянки без проблем.А в новую добавил только апргрейд стволов и атмосфер.Получается,что портачка либо при адаптации атмосфера,либо накосячил где-то в апгрейдах.Но вот где...........
В скрипте _g.script в строке 973 есть конструкция вида string.format(...) или :format(...), так кто то из переданных аргументов равен nil, а ожидается строка...
Пост Скриптум.Посмотрел скрипт в котором ошибка.В нем прописанны типы патронов.Но есть парочка новых типов патронов( входят в адаптацию стволов правозатворных для ОГСМ).И эти боеприпасы в скрипт не прописаны.Возможно из-за этого замарочка или это здесь не при делах?.
Плафон - статическая геометрия локации (level.geom и др.), источник света - спавн объект (all.spawn) или лайтмапы для статического освещения (lmap#***.dds). Что, то из этого или не содержит изменений или не перенесено в директорию игры.
Сообщение отредактировал denis2000 - Пятница, 03.11.2017, 12:30
.Возможно из-за этого замарочка или это здесь не при делах?
Вряд-ли это из-за этого. У Вас побился пстор ( некое хранилище всяких переменных ). Бороться с этим бессмысленно на испорченном сейве, откатывайтесь назад. Причем в оригинале есть ошибки, способные вызвать ошибку с пстором.
Смотрите внимательно лог, конкретно вот это сообщение:
Код
[LUA][ERROR] ERROR: xr_logic: pstor_load_all: not registered type in sim_default_csky_049204 encountered
В нем сказано скрипт xr_logic, функция pstor_load_all, сообщение not registered type in sim_default_csky_049204 encountered, то есть из нетпакета объекта (reader) в хранилища объекта (db.storage[npc_id].pstor) конкретно этого - sim_default_csky_049204 (section_name = sim_default_csky, id = 49204 точно известно у кого) пытались считать некую переменную, считали ctr - количество переменных, далее в цикле читаются переменные в формате varname - строка имя переменной, tn - число 8 битное тип переменной (значения 0,1,2), далее поле значение переменной, но на каком то этапе тип переменной оказался вне диапазона значений. Вот кусок этой функции:
Код
function pstor_load_all(obj, reader) local npc_id = obj:id() local pstor = db.storage[npc_id].pstor if not pstor then pstor = {} db.storage[npc_id].pstor = pstor end local ctr = reader:r_u32()
for i = 1, ctr do local varname = reader:r_stringZ() local tn = reader:r_u8() if tn == pstor_number then pstor[varname] = reader:r_float() elseif tn == pstor_string then pstor[varname] = reader:r_stringZ() elseif tn == pstor_boolean then pstor[varname] = reader:r_bool() else abort("xr_logic: pstor_load_all: not registered type N %d encountered", tn) end --printf("_bp: pstor_load_all: loaded [%s]='%s'", varname, utils.to_str(pstor[varname])) end end
Обратите внимание если тип переменной не определен, то вызывается функция abort именно с вашим сообщением в лог файл. Далее функция abort выводит сообщение в лог и крашит принудительно игру:
Код
function abort(fmt, ...) local reason = string.format(fmt, ...) assert("ERROR: " .. reason) error_log("ERROR: " .. reason) log(string.format("%s",nil)) end
Частенько причиной такого является превышение нетпакета объекта при его записи, дело в том что размер ограничен, но инструмента контроля превышения размера нет, в результате данные одного пакета перекрывают данные другого пакета, в результате порча сохранения и невозможность корректно считать из него данные. Ищите в логе сообщения "SAVE DIF:", "WARNING! may be this is problem save point", "You are saving too much".
Сообщение отредактировал denis2000 - Пятница, 03.11.2017, 13:03
Понятно.Поковырялся в Атмосфер 3 для ЧН.Вероятнее всего либо изначально шла в модификации ошибка,либо не корректная адаптация.Скорее всего второе.По любому надо откатываться до старой версии без Атмосфер и апгреда стволов.Благо сохранил ее( работала великолепно,без замарочек прошел основную сюжетку и побочки).Оставалась только войну группировок "откатать".Но приспичило улучшить сборку( правильно говорят-лучшее враг хорошего).В общем попробую откатиться до предедущей версии+прибавлю только апгрейды.Посмотрим как пойдет.Благодарю за помощь.
function campfire_distance() for i=1,65534 do local s = alife():object(i) if s then local o = level.object_by_id(s.id) if get_clsid(o) == clsid.zone_campfire then local cf = o:get_campfire() if cf and o:position():distance_to(db.actor:position()) < 1.5 then log("campfire_distance true") return true else log("campfire_distance false") return false end end end end end
Выдает
Код
stack traceback: ....e.r. - call of chernobyl 1.4\gamedata\scripts\_g.script:594: in function 'get_clsid' ...f chernobyl 1.4\gamedata\scripts\campfire_manager.script:80: in function 'campfire_distance' ...f chernobyl 1.4\gamedata\scripts\campfire_manager.script:14: in function 'func_or_userdata' ...- call of chernobyl 1.4\gamedata\scripts\axr_main.script:187: in function 'make_callback' ....e.r. - call of chernobyl 1.4\gamedata\scripts\_g.script:96: in function 'SendScriptCallback' ...f chernobyl 1.4\gamedata\scripts\bind_stalker_ext.script:183: in function <...f chernobyl 1.4\gamedata\scripts\bind_stalker_ext.script:165> ERROR: get_clsid - obj is nil!
В alun_utils.script есть вот такая функция:
Код
function nearest_object(s,offline) local dist local nearest local min_dist local is_match for i=1, 65535 do local obj = alife_object(i) if (obj) then is_match = false if (type(s) == "string" and string.find(obj:name(),s)) then is_match = true elseif (type(s) == "number" and s == obj:clsid()) then is_match = true end
if (is_match) then dist = obj.position:distance_to_sqr(db.actor:position())
if not(min_dist) then min_dist = dist nearest = obj elseif (dist < min_dist) then min_dist = dist nearest = obj end end end end
if (nearest) then if (simulation_objects.is_on_the_same_level(nearest, alife():actor())) then if (offline or min_dist <= alife():switch_distance()^2) then return nearest,min_dist end end end end
Может из нее можно получить костер?
Сообщение отредактировал yobakun - Пятница, 03.11.2017, 16:23
function campfire_distance() local actor_pos = db.actor:position() for i=1,65534 do local s = alife():object( i ) if s and s:clsid() == clsid.zone_campfire and s.position:distance_to( actor_pos ) < 1.5 and s.online then log("campfire_distance true") return true end end log("campfire_distance false") return false end
P.S. Скрипт поправил
Сообщение отредактировал makdm - Пятница, 03.11.2017, 19:56
makdm, спасибо, работает. Теперь вот тут где-то косяк, не могу понять.
Код
function item_use(obj) if obj:section() == "c_matches" then obj:set_remaining_uses(obj:get_remaining_uses()+1) if campfire_distance() then local roll = math.random(1,2) if roll == 1 then campfire_on(obj) log("turn_on:success") else obj:set_remaining_uses(obj:get_remaining_uses()-1) SetHudMsg(game.translate_string("st_fail"),3) log("turn_on:fail") end end end if obj:section() == "c_matches_old" then obj:set_remaining_uses(obj:get_remaining_uses()+1) if campfire_distance() then local roll = math.random(1,3) if roll == 1 then campfire_on(obj) log("turn_on:success") else obj:set_remaining_uses(obj:get_remaining_uses()-1) SetHudMsg(game.translate_string("st_fail"),3) log("turn_on:fail") end end if obj:section() == "c_ignition_set" then obj:set_remaining_uses(obj:get_remaining_uses()+1) if campfire_distance() then campfire_on(obj) log("turn_on:success") end end end end
Часть c c_matches и c_matches_old работает, а часть с c_ignition_set просто тратит спички.
Сама функция на сохранение выглядит так:
Код
function campfire_on(matches) for i=1,65534 do local s = alife():object(i) if s then local o = level.object_by_id(s.id) if o then local cf = o:get_campfire() if cf and o:position():distance_to(db.actor:position()) < 1.5 then local flist = getFS():file_list_open_ex("$game_saves$", bit_or(FS.FS_ListFiles,FS.FS_RootOnly),"*".. ui_load_dialog.saved_game_extension) local f_cnt = flist and flist:Size() or 0
local inc = 0 if (f_cnt > 0) then flist:Sort(FS.FS_sort_by_modif_down) for it=0, f_cnt-1 do local file_name = flist:GetAt(it):NameFull():sub(0,-6):lower() -- grab last modified quicksave increment count local d = tonumber( string.match(file_name,"campfire_autosave(%d+)") ) if (d) then inc = d
break end end end
inc = inc >= axr_main.config:r_value("mm_options","quicksave_cnt",2,5) and 1 or inc + 1 if (pre_timer == nil) then get_console():execute("save campfire_autosave"..inc) s_timer() end
if not (cf:is_on()) then if (rainy_is() == 1) then local snd_obj = sound_object("interface\\inv_matches") snd_obj:play(db.actor,0,sound_object.s2d) -- xr_sound.set_sound_play(db.actor:id(),"inv_matches") matches:set_remaining_uses(matches:get_remaining_uses()-1) cf:turn_on() -- return break else matches:set_remaining_uses(matches:get_remaining_uses()-1) local text = game.translate_string("st_fail") SetHudMsg(text,3) end end end end end end end
Здесь идет вторая проверка на дистанцию у костра, но попытка убрать
Код
for i=1,65534 do local s = alife():object(i) if s then local o = level.object_by_id(s.id) if o then local cf = o:get_campfire() if cf and o:position():distance_to(db.actor:position()) < 1.5 then
ломает функцию.
К тому же, скрипт подвисает когда используешь любые спички вне радиуса действия костра. Альтернативных методов для проверки нет?
P.S. Надеюсь, это не выглядит как попытка сделать все за меня.
Сообщение отредактировал yobakun - Пятница, 03.11.2017, 18:08