В данной теме вы можете задавать любые вопросы касательно 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 по основным вопросам моддинга - обращаемся в ЛС.
Arist, Попробуй передать в несуществующий тайник, если не будет вылета, то перестраховка, которая скажет, что не туда спавнишь. Если будет, то смотри, что лог напишет. Точнее, упомянет ли он имя несуществующего тайника.
Добавлено (17.04.2014, 00:10) --------------------------------------------- Сейчас у себя проверю.
function spawn_object_in(actor, obj, p) local spawn_sect = p[1] local target_name = p[2] local box = alife():object(target_name) if spawn_sect ~= nil and target_name ~= nil and box ~=nil then local obj = alife():create(spawn_sect,vector(),0,0,box.id) end end
В рестриктор тоже сработало(заспавнил сталкера и аптечку) [logic] active = sr_idle
[sr_idle] on_info = {+test_info} nil %=spawn_obj_in_zone(agr_stalker_veteran:esc_test_restrictor) =spawn_obj_in_zone(medkit:esc_test_restrictor)% В xr_effects.script
Код
function spawn_obj_in_zone(actor, obj, p) local spawn_sect = p[1] local zone_name = p[2] local zone = db.zone_by_name[zone_name] if spawn_sect ~= nil and zone_name ~= nil and zone ~= nil then local spawned_obj = alife():create( spawn_sect,zone:position(),zone:level_vertex_id(),zone:game_vertex_id()) end end
Надо через диалог попробовать.
Сообщение отредактировал Arist - Четверг, 17.04.2014, 00:38
ins33, а как правильно повесить timer_start? я повесил
Код
timer_start.update(delta)
и получил
Код
Expression : fatal error Function : CScriptEngine::lua_error File : E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cpp Line : 73 Description : <no expression> Arguments : LUA error: ...:\s.t.a.l.k.e.r\gamedata\scripts\bind_stalker.script:246: attempt to index global 'timer_start' (a nil value)
Но у меня правленый скрипт для вывода в лог инфы по логике. С стандартным этой строки Cannot find saved game error: there is no such object bla_bla не будет.
Sanjaaa, В том скрипте было 2 опечатки, ты их исправил? Лог говорит, что в скрипте timer_start есть ошибка. Проверь его script Syntax Checker.exe П.С. ты исправил torch_binder:load® на torch_binder:load(_r_) только без _! Сайт р в скобках отображает, как ®
А как ты в диалоге собираешься medkit:esc_test_restrictor передать? А для спавн в тайник или нпс, я использую эту ф-ию:
Код
-- =give_items_nps(item:sid) function give_items_nps(actor, npc, p) local item = p and p[1] local to_obj = level_object_by_sid(p[2]) alife():create(item, to_obj:position(), to_obj:level_vertex_id(), to_obj:game_vertex_id(), to_obj:id()) end
Но тут передаётся sid, что не всегда удобно! Хотя можно использовать
Код
-- =name(name) function name(actor, npc, p) local obj = p[1] for a=10,65635,1 do local npc=level.object_by_id(a) if npc and string.find(npc:name(),obj) then *
и передавать имя.
Помогите разобраться с оверрайдами в секции [mob_home] mob_home.script:
---------------------------------------------------------------------------------------------------- -- Mob Home ---------------------------------------------------------------------------------------------------- -- Разработчик: Jim ----------------------------------------------------------------------------------------------------
local def_min_radius = 20 local def_max_radius = 40
class "mob_home"
---------------------------------------------------------------------------------------------------- -- CONSTRUCTION SCHEME ---------------------------------------------------------------------------------------------------- function mob_home:__init(obj, storage) self.object = obj self.st = storage end
---------------------------------------------------------------------------------------------------- -- RESET SCHEME ---------------------------------------------------------------------------------------------------- function mob_home:reset_scheme() --[[ Добавлено: Haron Описание: Теперь можно задавать радиусы home_min_radius и home_max_radius во флагах пути path_home. Для этого введены флаги minr, maxr. Они должны быть прописаны в первой точке пути. У радиусов заданых в секции приоритет больший чем для тех что заданы во флагах, т.е. если задано и там и там, то берутся значения из секции (сделано для обратной совместимости). --]] local minr, maxr = def_min_radius, def_max_radius local ptr = patrol(self.st.home) local path_info = utils.parse_waypoint_data(self.st.home, ptr:flags(0), ptr:name(0)) local r = 0
if self.st.home_min_radius then minr = self.st.home_min_radius else r = path_info.minr if r then r = tonumber® if r then minr = r end end end
if self.st.home_max_radius then maxr = self.st.home_max_radius else r = path_info.maxr if r then r = tonumber® if r then maxr = r end end end
-- check min and max radius if minr > maxr then _G.abort("Mob_Home : Home Min Radius MUST be < Max Radius. Got: min radius = %d, max radius = %d.", minr, maxr) end
self.object:set_home(self.st.home, minr, maxr, self.st.aggressive) end
if xr_logic.try_switch_to_another_section(self.object, self.st, db.actor) then return end
if mob_alife_mgr.alife_control(self.object, db.actor, self.st.alife_mode) then-- Добавил return-- Добавил end-- Добавил end
function mob_home:deactivate() self.object:remove_home() end
---------------------------------------------------------------------------------------------------- -- ADD_TO_BINDER ---------------------------------------------------------------------------------------------------- function add_to_binder(npc, ini, scheme, section, storage) printf("DEBUG: add_to_binder: npc:name()='%s', scheme='%s', section='%s'", npc:name(), scheme, section)
local new_action = mob_home(npc, storage)
-- Зарегистрировать все actions, в которых должен быть вызван метод reset_scheme при изменении настроек схемы: xr_logic.subscribe_action_for_events(npc, storage, new_action) end
---------------------------------------------------------------------------------------------------- -- SET_SCHEME ---------------------------------------------------------------------------------------------------- function set_scheme(npc, ini, scheme, section, gulag_name) local storage = xr_logic.assign_storage_and_bind(npc, ini, scheme, section)
Проверял все 4 оверрайда в разных вариантах\сочетаниях, и не один не сработал. ХЕЛП!!!
Добавлено (17.04.2014, 01:21) --------------------------------------------- Sanjaaa, На тот момент у меня был только один таймер, и писать доп ф-ию, которая будет запускать остальные, не было смысла. Если обратишь внимание, то ф-ия update запускает timer_start() и hud_timer(), а сама она висит на update(delta).
ЦитатаSanjaaa ()
А "r" обязательно маленькую,а то я большую поставил
ни когда не задавался этим вопросом, думаю это не критично. Сам всегда пишу маленькую. П.С. комментарии исправил.
function spawn_object(actor, obj, p) local spawn_sect = p[1] local path_name = p[2] if level.patrol_path_exists(path_name) and spawn_sect ~= nil and path_name ~= nil then local ptr = patrol(path_name) local se_obj = alife():create(spawn_sect,ptr:point(),ptr:level_vertex_id(0),ptr:game_vertex_id(0)) end end
ни когда не задавался этим вопросом, думаю это не критично.
Критично. Lua чувствителен к регистру и для него Value и value - разные переменные.
Цитатаins33 ()
Проверял все 4 оверрайда в разных вариантах\сочетаниях, и не один не сработал.
При выставленном значении actor_friendly плоть нападала на ГГ? Попробуй подсунуть вместо mob_home - mob_walker, с тем же actor_friendly = true, если будет нападать, то причина в чём-то другом.
ins33, ну я вообще хз что такое. прописал в бинде апдейт без дельты, проверил на ошибки скрипт, ошибок нету! а вылетает серавно
Код
Expression : fatal error Function : CScriptEngine::lua_error File : E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cpp Line : 73 Description : <no expression> Arguments : LUA error: ...:\s.t.a.l.k.e.r\gamedata\scripts\bind_stalker.script:246: attempt to index global 'timer_start' (a nil value)
Сообщение отредактировал Sanjaaa - Четверг, 17.04.2014, 08:58
Эммм... Я так понял, что вы пытаетесь некоторых зверушек сделать дружелюбными к ГГ при помощи логики. Не проще добавить в конфиг этих зверушек особей , изначально дружелюбных к ГГ?
_Val_, иногда бывает, что такое нужно сделать для одного конкретного мутанта, а из-за одного создавать группировку, как-то не ахти... Вопрос такой: Из-за чего может вылетать игра, когда из неё выходишь? С изменённым _g скриптом(выводить всё в лог) вылет пропадает. Всё это на ТЧ версии 1.0004 без правок движка.
ins33, mob_home - если монстрам не угрожает опасность,они просто сидят около точки? Свиньи, вроде должны спать, А НЕ.... Ладно. mob_home.script
---------------------------------------------------------------------------------------------------- -- Mob Home ---------------------------------------------------------------------------------------------------- -- Разработчик: Jim ----------------------------------------------------------------------------------------------------
local def_min_radius = 20 local def_max_radius = 40 class "mob_home"
---------------------------------------------------------------------------------------------------- -- CONSTRUCTION SCHEME ---------------------------------------------------------------------------------------------------- function mob_home:__init(obj, storage) self.object = obj self.st = storage end
---------------------------------------------------------------------------------------------------- -- RESET SCHEME ---------------------------------------------------------------------------------------------------- function mob_home:reset_scheme() local minr, maxr = def_min_radius, def_max_radius local ptr = patrol(self.st.home) local path_info = utils.parse_waypoint_data(self.st.home, ptr:flags(0), ptr:name(0)) local r = 0
if self.st.home_min_radius then minr = self.st.home_min_radius else r = path_info.minr if r then r = tonumber® if r then minr = r end end end
if self.st.home_max_radius then maxr = self.st.home_max_radius else r = path_info.maxr if r then r = tonumber® if r then maxr = r end end end
-- check min and max radius if minr > maxr then _G.abort("Mob_Home : Home Min Radius MUST be < Max Radius. Got: min radius = %d, max radius = %d.", minr, maxr) end
self.object:set_home(self.st.home, minr, maxr, self.st.aggressive) -- xr_logic.mob_capture(self.object, not self.st.no_reset) end
function mob_home:update(delta) local actor = db.actor if xr_logic.try_switch_to_another_section(self.object, self.st, actor) then return end if mob_alife_mgr.alife_control(self.object, actor, self.st.alife_mode) then return end -- Монстр после выхода из alife может уже быть не под скриптом, поэтому взять опять под скрипт if not xr_logic.mob_captured(self.object) then self:reset_scheme() return end end
function mob_home:deactivate() self.object:remove_home() end
---------------------------------------------------------------------------------------------------- -- ADD_TO_BINDER ---------------------------------------------------------------------------------------------------- function add_to_binder(npc, ini, scheme, section, storage) printf("DEBUG: add_to_binder: npc:name()='%s', scheme='%s', section='%s'", npc:name(), scheme, section)
local new_action = mob_home(npc, storage)
-- Зарегистрировать все actions, в которых должен быть вызван метод reset_scheme при изменении настроек схемы: xr_logic.subscribe_action_for_events(npc, storage, new_action) end
---------------------------------------------------------------------------------------------------- -- SET_SCHEME ---------------------------------------------------------------------------------------------------- function set_scheme(npc, ini, scheme, section, gulag_name) local storage = xr_logic.assign_storage_and_bind(npc, ini, scheme, section) -- storage.alife_mode = mob_alife_mgr.cfg_get_mode(ini, section, npc) storage.no_reset = utils.cfg_get_bool(ini, section, "no_reset", npc, false) --