В данной теме вы можете задавать любые вопросы касательно S.T.A.L.K.E.R. моддинга.
Не флудить
Предварительно просматривайте раздел. Ответ на ваш вопрос может быть там.
В своем вопросе указывайте платформу моддинга - Тень Чернобыля, Чистое небо или Зов Припяти.
1. Какая стоит игра, с каким патчем? 2. Какой мод, версия мода? 3. Что правили своими ручками? 4. Конфиг компа. 5. Лог вылета и последние 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 - содержит секции конфигов уникального оружия и костюмов.
У кого есть желание, создать FAQ по основным вопросам моддинга - обращаемся в ЛС.
В _g.script функцию printf(fmt,...) приведи к такому виду.
У меня был вылет по этому скрипту, и я сделал вот так :
FATAL ERROR
[error]Expression : fatal error [error]Function : CScriptEngine::lua_error [error]File : E:\stalker\patch_1_0004\xr_3da\xrGame\script_engine.cpp [error]Line : 73 [error]Description : <no expression> [error]Arguments : LUA error: ....r. - shadow of chernobyl\gamedata\scripts\_g.script:20: bad argument #2 to 'format' (string expected, got no value)
Можешь заменить дефолтную функцию printf из файла _g.script. Если у тебя 20 строчка именно вот это log(string.format(fmt,...)) , то попробуй заменить функцию printf на ее аналог из Зенобиан мода:
Код function printf(fmt,...) local arg = {...} if arg == nil then get_console():execute("Error_printf:_Arg_=_nil_value") else for a=1, table.getn(arg), 1 do if arg[a] == nil then get_console():execute(string.format("Error_printf:_Arg_#%d_=_nil_value",a)) end end end end
Возможно ошибка исчезнет. Из-за дефолтной printf бывают ошибки по той причине, что метод string.format() не понимает nil, и когда в printf передается аргумент со значением nil или вообще ничего - то и получаем string expected, got no value. Хотя причина вылета может быть и не здесь зарыта
BeeRsek, одну секундочку! Никакую логику в целом, я не проверял! Ты лишь спросил как работает секция и показал то, как ты её прописал:
Код
mob_death = %+какой-то поршень%
После этого, я тебе сказал, что в параметр mob_death нужно прописывать ссылку на секцию и в итоге должно выглядеть так:
Код
mob_death = death [death] on_info = %+какой-то поршень%
Но я же не предполагал, что ты mob_death прописываешь НЕ в секции logic. В примере на Вики, вполне ясно написано, что секцию прописывается именно там. Так что не нужно переводить "стрелки".
Просматрия туториал по созданию квестов заметил несоответствие(http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%B2%D0%B5%D1%81%D1%82%D0%BE%D0%B2-2): На моменте где мы добавляем экранные подсказки, которые высвечиваются при получении/выполнении этапа/завершении задания:
Но в конструкции текста и во всем туториале вообще нет таких идов как esc_test_prinesti_vodku_0/1/2. Либо я что-то не понимаю, либо действительно в туториале лажа
Добавлено (20.06.2013, 11:01) --------------------------------------------- И еще такой вопрос. Как сделать проверку состояния брони в слоте? Подскажите.
cxcxShaman, ищи в repair'моде, могу скинуть код, думаю там есть:
Код
local weapon_profit_margin = 1.3 local armor_profit_margin = 1.2
function trader_repair_precond(trader, actor) local item_in_slot_1 = db.actor:item_in_slot(1) local item_in_slot_2 = db.actor:item_in_slot(2) local item_in_slot_6 = db.actor:item_in_slot(6) if item_in_slot_1 ~= nil and 1 > item_in_slot_1:condition() + 0.01 then return true elseif item_in_slot_2 ~= nil and 1 > item_in_slot_2:condition() + 0.01 then return true elseif item_in_slot_6 ~= nil and 1 > item_in_slot_6:condition() + 0.01 then return true else return false end end
function trader_check_money_s1(trader, actor) local item_in_slot = db.actor:item_in_slot(1) if item_in_slot ~= nil then local item_repair_cost = math.floor( (1-item_in_slot:condition()) * item_in_slot:cost() * weapon_profit_margin ) if item_repair_cost > 0 and db.actor:money() >= item_repair_cost and 1 > item_in_slot:condition() then return true end end return false end
function trader_check_money_s2(trader, actor) local item_in_slot = db.actor:item_in_slot(2) if item_in_slot ~= nil then local item_repair_cost = math.floor( (1-item_in_slot:condition()) * item_in_slot:cost() * weapon_profit_margin ) if item_repair_cost > 0 and db.actor:money() >= item_repair_cost and 1 > item_in_slot:condition() then return true end end return false end
function trader_check_money_s6(trader, actor) local item_in_slot = db.actor:item_in_slot(6) if item_in_slot ~= nil then local item_repair_cost = math.floor( (1-item_in_slot:condition()) * item_in_slot:cost() * armor_profit_margin ) if item_repair_cost > 0 and db.actor:money() >= item_repair_cost and 1 > item_in_slot:condition() then return true end end return false end
function trader_repiar_weapon_s1(trader, actor) local item_in_slot = db.actor:item_in_slot(1) if item_in_slot ~= nil then local item_repair_cost = math.floor( (1-item_in_slot:condition()) * item_in_slot:cost() * weapon_profit_margin ) item_in_slot:set_condition(1) dialogs.relocate_money(actor, item_repair_cost, "out") end end
function trader_repiar_weapon_s2(trader, actor) local item_in_slot = db.actor:item_in_slot(2) if item_in_slot ~= nil then local item_repair_cost = math.floor( (1-item_in_slot:condition()) * item_in_slot:cost() * weapon_profit_margin ) item_in_slot:set_condition(1) dialogs.relocate_money(actor, item_repair_cost, "out") end end
function trader_repiar_armor_s6(trader, actor) local item_in_slot = db.actor:item_in_slot(6) if item_in_slot ~= nil then local item_repair_cost = math.floor( (1-item_in_slot:condition()) * item_in_slot:cost() * armor_profit_margin ) item_in_slot:set_condition(1) dialogs.relocate_money(actor, item_repair_cost, "out") end end
function repair_costs(first_speaker, second_speaker) local task_texture, task_rect = get_texture_info("ui_iconsTotal_lost_money")
local item_name_and_price = "" local item_repair_cost = 0 if db.actor ~= nil then local item_in_slot_1 = db.actor:item_in_slot(1) local item_in_slot_2 = db.actor:item_in_slot(2) local item_in_slot_6 = db.actor:item_in_slot(6)
if item_in_slot_1 ~= nil then item_repair_cost = math.floor( (1-item_in_slot_1:condition()) * item_in_slot_1:cost() * weapon_profit_margin ) if item_repair_cost > 0 then item_name_and_price = game.translate_string("list_trader_repair_0").." %c[255,238,155,23]"..item_repair_cost.."Ru%c[default]" db.actor:give_talk_message(item_name_and_price, task_texture, task_rect, "iconed_trade_info") end end if item_in_slot_2 ~= nil then item_repair_cost = math.floor( (1-item_in_slot_2:condition()) * item_in_slot_2:cost() * weapon_profit_margin ) if item_repair_cost > 0 then item_name_and_price = game.translate_string("list_trader_repair_1").." %c[255,238,155,23]"..item_repair_cost.."Ru%c[default]" db.actor:give_talk_message(item_name_and_price, task_texture, task_rect, "iconed_trade_info") end end if item_in_slot_6 ~= nil then item_repair_cost = math.floor( (1-item_in_slot_6:condition()) * item_in_slot_6:cost() * armor_profit_margin ) if item_repair_cost > 0 then item_name_and_price = game.translate_string("list_trader_repair_2").." %c[255,238,155,23]"..item_repair_cost.."Ru%c[default]" db.actor:give_talk_message(item_name_and_price, task_texture, task_rect, "iconed_trade_info") end end end end
Добавлено (20.06.2013, 11:09) --------------------------------------------- Думается что ответ где-то здесь:
Код
function trader_repair_precond(trader, actor) local item_in_slot_1 = db.actor:item_in_slot(1) local item_in_slot_2 = db.actor:item_in_slot(2) local item_in_slot_6 = db.actor:item_in_slot(6) if item_in_slot_1 ~= nil and 1 > item_in_slot_1:condition() + 0.01 then return true elseif item_in_slot_2 ~= nil and 1 > item_in_slot_2:condition() + 0.01 then return true elseif item_in_slot_6 ~= nil and 1 > item_in_slot_6:condition() + 0.01 then return true else return false end end