В данной теме вы можете задавать любые вопросы касательно 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 - содержит секции конфигов уникального оружия и костюмов.
_S_k_i_F_, вот блин, какие же мы невнимательные: я не заметил, мой напарник и еще один, у которого я спрашивал данный вопрос. Спасибо, Скиф, да только вот при загрузке локации у меня теперь безлоговый вылет «stack trace:».
Сообщение отредактировал Vlador - Суббота, 30.07.2016, 16:52
Нашёл ответ: if условие остановки апдейта then todo return if *
Цитатаdenis2000 ()
Если имеете ввиду флаги в точках пути
Нет, не пути. Как я понял, флаги возвращают присвоинные им значения. flag = true \ false и nil -- кстати, это одно и тоже, или есть разница? Если мне надо получить значение флаг из соседнего скрипта, то используется if name_script.return_flag then todo end В самой же ф-ии флаг надо присваивать явно:
Код
flag = false function return_flag() flag = true end
log("--------->"..tostring(_G.amb_vol)) log("--------->"..tostring(_G.mus_vol)) if(_G.amb_vol~=0) then get_console():execute("snd_volume_eff "..tostring(_G.amb_vol)) _G.amb_vol = 0 end if(_G.mus_vol~=0) then get_console():execute("snd_volume_music "..tostring(_G.mus_vol)) _G.mus_vol = 0 end if sr_psy_antenna.psy_antenna then sr_psy_antenna.psy_antenna:destroy() sr_psy_antenna.psy_antenna = false end xrs_dyn_music.finish_theme() xr_s.on_actor_destroy() object_binder.net_destroy(self) end ---------------------------------------------------------------------------------------------------------------------- function actor_binder:reinit() object_binder.reinit(self) local npc_id = self.object:id() db.storage[npc_id] = { } self.st = db.storage[npc_id] self.st.pstor = nil
self.object:set_callback(callback.inventory_info, self.info_callback, self) self.object:set_callback(callback.on_item_take, self.on_item_take, self) self.object:set_callback(callback.on_item_drop, self.on_item_drop, self) self.object:set_callback(callback.trade_sell_buy_item, self.on_trade, self) -- for game stats self.object:set_callback(callback.task_state, self.task_callback, self) self.object:set_callback(callback.take_item_from_box, self.take_item_from_box, self) self.object:set_callback(callback.use_object, self.use_inventory_item, self) end ---------------------------------------------------------------------------------------------------------------------- function actor_binder:take_item_from_box(box, item) local box_name = box:name() end
---------------------------------------------------------------------------------------------------------------------- function actor_binder:info_callback(npc, info_id) printf("*INFO*: npc='%s' id='%s'", npc:name(), info_id) --' Сюжет -- Отметки на карте end ---------------------------------------------------------------------------------------------------------------------- function actor_binder:on_trade (item, sell_bye, money) if sell_bye == true then game_stats.money_trade_update (money) else game_stats.money_trade_update (-money) end end ---------------------------------------------------------------------------------------------------------------------- function actor_binder:article_callback(npc, group, name) end ---------------------------------------------------------------------------------------------------------------------- function actor_binder:on_item_take (obj) printf("on_item_take [%s]", obj:name()) if isArtefact(obj) then local anomal_zone = bind_anomaly_zone.parent_zones_by_artefact_id[obj:id()] if anomal_zone ~= nil then anomal_zone:on_artefact_take(obj) else bind_anomaly_zone.artefact_ways_by_id[obj:id()] = nil end local artefact = obj:get_artefact() artefact:FollowByPath("NULL",0,vector():set(500,500,500)) xr_statistic.inc_founded_artefacts_counter(obj:id()) --[[ local s_art = alife():object(obj:id()) if(s_art) then xr_statistic.inc_founded_artefacts_counter(s_art:section_name()) else xr_statistic.inc_founded_artefacts_counter() end ]] end ui_food.on_item_take(obj) -- Stalker_Monstr treasure_manager.get_treasure_manager():on_item_take(obj:id()) end ---------------------------------------------------------------------------------------------------------------------- function actor_binder:on_item_drop (obj) end
function actor_binder:use_inventory_item(obj) if(obj) then local s_obj = alife():object(obj:id()) if(s_obj) and (s_obj:section_name()=="drug_anabiotic") then xr_effects.disable_ui_only(db.actor, nil) level.add_cam_effector("camera_effects\\surge_02.anm", 10, false, "bind_stalker.anabiotic_callback") level.add_pp_effector("surge_fade.ppe", 11, false) give_info("anabiotic_in_process") _G.mus_vol = get_console():get_float("snd_volume_music") _G.amb_vol = get_console():get_float("snd_volume_eff") get_console():execute("snd_volume_music 0") get_console():execute("snd_volume_eff 0") end end ui_food.use_food(obj) -- Stalker_Monstr end
function anabiotic_callback() level.add_cam_effector("camera_effects\\surge_01.anm", 10, false, "bind_stalker.anabiotic_callback2") local rnd = math.random(35,45) local m = surge_manager.get_surge_manager() if(m.started) then local tf = level.get_time_factor() local diff_sec = math.ceil(game.get_game_time():diffSec(m.inited_time)/tf) if(rnd>(m.surge_time-diff_sec)*tf/60) then m.time_forwarded = true m.ui_disabled = true m:kill_all_unhided() m:end_surge() end end level.change_game_time(0,0,rnd) level_weathers.get_weather_manager():forced_weather_change() printf("anabiotic_callback: time forwarded on [%d]", rnd) end
function anabiotic_callback2() xr_effects.enable_ui(db.actor, nil) get_console():execute("snd_volume_music "..tostring(_G.mus_vol)) get_console():execute("snd_volume_eff "..tostring(_G.amb_vol)) _G.amb_vol = 0 _G.mus_vol = 0 disable_info("anabiotic_in_process") end ----------------------------------------------------------------------------------------------------------------------
function actor_binder:task_callback(_task, _state) if _state ~= task.fail then if _state == task.completed then news_manager.send_task(db.actor, "complete", _task) else news_manager.send_task(db.actor, "new", _task) end end task_manager.task_callback(_task, _state) end
function actor_binder:update(delta) object_binder.update(self, delta)
if string.find(command_line(), "-designer") then return end
if self.already_jumped==false and jump_level.need_jump==true and (device().frame > self.spawn_frame+2000) then jump_level.try_to_jump() self.already_jumped = true return end
-- Вызов апдейта переноса игрока проводником if travel_func ~= nil then travel_func() end
-- DEBUG slowdown --slowdown.update() local time = time_global() game_stats.update (delta, self.object) -- апдейт погоды self.weather_manager:update()
-- Обновление отключения ввода с клавиатуры. if self.st.disable_input_time ~= nil and game.get_game_time():diffSec(self.st.disable_input_time) >= self.st.disable_input_idle then level.enable_input() self.st.disable_input_time = nil end
-- Апдейт прятание оружия игрока во время диалога if self.object:is_talking() then if self.weapon_hide_in_dialog == false then self.object:hide_weapon() printf("hiding weapon!!!") self.weapon_hide_in_dialog = true end else if self.weapon_hide_in_dialog == true then printf("restoring weapon!!!") self.object:restore_weapon() self.weapon_hide_in_dialog = false end end -- Апдейт прятание оружия игрока в зоне sr_no_weapon if check_for_weapon_hide_by_zones() == true then if self.weapon_hide == false then printf("hiding weapon!!!") self.object:hide_weapon() self.weapon_hide = true end else if self.weapon_hide == true then printf("restoring weapon!!!") self.object:restore_weapon() self.weapon_hide = false end end
-- обновление пси-антенны if sr_psy_antenna.psy_antenna then sr_psy_antenna.psy_antenna:update(delta) end --[[ --' Вывод сообщения о большой радиации if self.object.radiation >= 0.7 then local hud = get_hud() local custom_static = hud:GetCustomStatic("cs_radiation_danger") if custom_static == nil then hud:AddCustomStatic("cs_radiation_danger", true) hud:GetCustomStatic("cs_radiation_danger"):wnd():TextControl():SetTextST("st_radiation_danger") end else local hud = get_hud() local custom_static = hud:GetCustomStatic("cs_radiation_danger") if custom_static ~= nil then hud:RemoveCustomStatic("cs_radiation_danger") end end ]]--
if self.bCheckStart then printf("SET DEFAULT INFOS") if not has_alife_info("global_dialogs") then self.object:give_info_portion("global_dialogs") end if not has_alife_info("level_changer_icons") then self.object:give_info_portion("level_changer_icons") end self.bCheckStart = false
-- if self.actor_weapon_on_start == true then -- db.actor:activate_slot(3) -- self.actor_weapon_on_start = false -- end end -- device().precache_frame == 0 and if not self.loaded_slot_applied then self.object:activate_slot(self.loaded_active_slot) self.loaded_slot_applied = true end
xr_s.on_actor_update(delta)
if(self.surge_manager) then if(self.f_surge_manager_loaded ~= true) then self.surge_manager:initialize() self.f_surge_manager_loaded = true end if(self.surge_manager.levels_respawn[level.name()]) then self.surge_manager:respawn_artefacts_and_replace_anomaly_zone() end self.surge_manager:update() end -- Апдейт доступности для симуляции. simulation_objects.get_sim_obj_registry():update_avaliability(alife():actor())
if not self.loaded then get_console():execute("dump_infos") self.loaded = true end treasure_manager.get_treasure_manager():update()
if not(primary_objects_filled) then pda.fill_primary_objects() primary_objects_filled = true end pda.fill_sleep_zones() end ---------------------------------------------------------------------------------------------------------------------- function actor_binder:save(packet) set_save_marker(packet, "save", false, "actor_binder") object_binder.save(self, packet) --' Сохраняем уровень сложности packet:w_u8(level.get_game_difficulty()) --' Сохраняем данные об отключенном вводе if self.st.disable_input_time == nil then packet:w_bool(false) else packet:w_bool(true) utils.w_CTime(packet, self.st.disable_input_time) end xr_logic.pstor_save_all(self.object, packet) self.weather_manager:save(packet) release_body_manager.get_release_body_manager():save(packet) self.surge_manager:save(packet) sr_psy_antenna.save( packet ) packet:w_bool(sim_board.get_sim_board().simulation_started)
local n = 0 for k,v in pairs(db.script_ids) do n = n + 1 end packet:w_u8(n) for k,v in pairs (db.script_ids) do packet:w_u16(k) packet:w_stringZ(v) end task_manager.get_task_manager():save(packet)
-- packet:w_bool(self.actor_weapon_on_start)
packet:w_u8(self.object:active_slot())
local deimos_exist = false for k,v in pairs(db.zone_by_name) do if(db.storage[v:id()] and db.storage[v:id()].active_scheme=="sr_deimos") then deimos_exist = true packet:w_bool(true) packet:w_float(db.storage[v:id()].sr_deimos.intensity) end end if not deimos_exist then packet:w_bool(false) end
if self.last_detective_achievement_spawn_time == nil then packet:w_bool(false) else packet:w_bool(true) utils.w_CTime(packet, self.last_detective_achievement_spawn_time) end if self.last_mutant_hunter_achievement_spawn_time == nil then packet:w_bool(false) else packet:w_bool(true) utils.w_CTime(packet, self.last_mutant_hunter_achievement_spawn_time) end set_save_marker(packet, "save", true, "actor_binder") end ---------------------------------------------------------------------------------------------------------------------- function actor_binder:load(reader) set_save_marker(reader, "load", false, "actor_binder") object_binder.load(self, reader) --' Загружаем уровень сложности local game_difficulty = reader:r_u8() printf("load game_difficulty %s", tostring(game_difficulty)) get_console():execute("g_game_difficulty "..game_difficulty_by_num[game_difficulty]) local stored_input_time = reader:r_u8() if stored_input_time == true then self.st.disable_input_time = utils.r_CTime(reader) end xr_logic.pstor_load_all(self.object, reader) self.weather_manager:load(reader) release_body_manager.get_release_body_manager():load(reader) -- self.surge_manager:initialize() self.surge_manager:load(reader) self.f_surge_manager_loaded = true sr_psy_antenna.load(reader) sim_board.get_sim_board().simulation_started = reader:r_bool()
xr_sound.actor_load(reader) local n = reader:r_stringZ() if(n~="nil") then self.last_level_name = n end xr_statistic.load(reader) treasure_manager.get_treasure_manager():load(reader) n = reader:r_u8() for i = 1,n do db.script_ids[reader:r_u16()] = reader:r_stringZ() end
task_manager.get_task_manager():load(reader)
-- self.actor_weapon_on_start = reader:r_bool()
self.loaded_active_slot = reader:r_u8()
self.loaded_slot_applied = false
local b = reader:r_bool() if(b) then self.deimos_intensity = reader:r_float() end
local stored_achievement_time = reader:r_bool() if stored_achievement_time == true then self.last_detective_achievement_spawn_time = utils.r_CTime(reader) end stored_achievement_time = reader:r_bool() if stored_achievement_time == true then self.last_mutant_hunter_achievement_spawn_time = utils.r_CTime(reader) end set_save_marker(reader, "load", true, "actor_binder") end
--************************************************************* --* Подспаун вещей в ящики * --************************************************************* local detective_achievement_items = { "medkit", "antirad", "bandage"}
local mutant_hunter_achievement_items = { "ammo_5.45x39_ap", "ammo_5.56x45_ap", "ammo_9x39_ap", "ammo_5.56x45_ap", "ammo_12x76_zhekan"}
local function spawn_achivement_items(items_table, count, inv_box_story_id) local inv_box = alife():object(get_story_object_id(inv_box_story_id)) for i = 1,count do alife():create(items_table[math.random(#items_table)], inv_box.position, inv_box.m_level_vertex_id, inv_box.m_game_vertex_id, inv_box.id) end end
function actor_binder:check_detective_achievement() if not has_alife_info("detective_achievement_gained") then return end if self.last_detective_achievement_spawn_time == nil then self.last_detective_achievement_spawn_time = game.get_game_time() end if game.get_game_time():diffSec(self.last_detective_achievement_spawn_time) > 43200 then spawn_achivement_items(detective_achievement_items, 4, "zat_a2_actor_treasure") xr_effects.send_tip(db.actor, nil, {"st_detective_news","got_medicine"}) self.last_detective_achievement_spawn_time = game.get_game_time() end end
function actor_binder:check_mutant_hunter_achievement() if not has_alife_info("mutant_hunter_achievement_gained") then return end if self.last_mutant_hunter_achievement_spawn_time == nil then self.last_mutant_hunter_achievement_spawn_time = game.get_game_time() end if game.get_game_time():diffSec(self.last_mutant_hunter_achievement_spawn_time) > 43200 then spawn_achivement_items(mutant_hunter_achievement_items, 5, "jup_b202_actor_treasure") xr_effects.send_tip(db.actor, nil, {"st_mutant_hunter_news","got_ammo"}) self.last_mutant_hunter_achievement_spawn_time = game.get_game_time() end
function check_for_weapon_hide_by_zones() for k,v in pairs(weapon_hide) do if v == true then return true end end return false end
-- Weapon functions function hide_weapon(zone_id) printf("[WEAPON_CONTROL]:hiding weapon from zone [%s] in section [%s]!!!", zone_id, db.storage[zone_id].active_section) weapon_hide[zone_id] = true end
function restore_weapon(zone_id) printf("[WEAPON_CONTROL]:restoring weapon from zone [%s] in section [%s]!!!", zone_id, db.storage[zone_id].active_section) weapon_hide[zone_id] = false end
а можете уточнить какие именно строчки - правленные?
Лень и недалекость не украшает модостроителя.
Цитатаins33 ()
true \ false и nil -- кстати, это одно и тоже, или есть разница?
Нет естественно! false - одно из значений бинарной переменной (соответственно с переменной можно производить действия в рамках Битовых операций), nil - отсутствие вообще какого либо значения у переменной (и с этой переменной нельзя производить никаких действий).
Цитатаins33 ()
flag = false
Это определение глобальной переменной в скрипте. Какая разница, что ее имя flag?
Цитатаins33 ()
name_script.return_flag
Это запрос значения глобально определенной переменной return_flag из скрипта name_script, а не функции. Если запрашиваете значение функции из другого скрипта то так:
Код
name_script.return_flag()
Цитатаins33 ()
function return_flag() flag = true end
Эта функция не возвращает никаких значений. Поэтому использовать ее как аргумент в функции выбора невозможно.
Сообщение отредактировал denis2000 - Воскресенье, 31.07.2016, 11:02
Спауню скриптом предмет (генератор), но ГГ проходит сквозь него. В чём дело, подскажите?
дело в том что спавнится лишь геометрия,то есть этот объект спавнится просто без(блин немогу вспомнить что именно)-но короче он,то бишь генератор спавнится как просто моделька без обозначения что это препятствие,физика игры невидит в этом объекте взаимодействие с др.(блин столько ахинеи написал,я и сам нубас ),а вообще для того чтобы генератор на локе заспавнить и не маятся с привязков-делай все через сдк и 3дредактор.
Я добавил в игру работающее радио на базах, как добавить фишку с включением и выключением радио через диалог? Например: "Борода выключи радио" и радио перестаёт работать или же наоборот "Борода включи радио" и радио снова работает.
Да я когда то уже задавал подобный вопрос, но приведите пожалуйста подробный пример реализации этого как-нибудь, можно в ЛС.
_МстителЬ_, в диалоге выдай поршень. Потом в логике радио останови проигрывание музыки если есть твой поршень. Потом чтоб вернуть музыку - в следующем диалоге забери поршень.
вот до чего же ленивые пошли модмейкеры. Одному файлик сравни, другому кнопку в диалоге сделай.
Скачиваете себе мод SGM 2.2. Там всё, что вы хотите уже реализовано. Сами разбираетесь как это работает и переносите к себе в мод.
Ну извините если уж я не понимаю, поэтому и спрашиваю именно здесь. Я же не просил конкретно сделать это именно для моего мода, а просто попросил на подробном примере мне объяснить, только и всего.