В данной теме вы можете задавать любые вопросы касательно 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 по основным вопросам моддинга - обращаемся в ЛС.
---------------------------------------------------------------------------------------------------------------------- function actor_binder:net_destroy()
if(actor_stats.remove_from_ranking~=nil)then actor_stats.remove_from_ranking(self.object:id()) end -- game_stats.shutdown () db.del_actor(self.object)
xr_sound.stop_all_sound_object() ------------------bolt mod------------- bolt_mod.net_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.next_restrictors_update_time = -10000
self.object:set_callback(callback.inventory_info, self.info_callback, self) self.object:set_callback(callback.article_info, self.article_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.actor_sleep, self.sleep_callback, self) self.object:set_callback(callback.task_state, self.task_callback, self) --self.object:set_callback(callback.map_location_added, self.map_location_added_callback, self) self.object:set_callback(callback.level_border_enter, self.level_border_enter, self) self.object:set_callback(callback.level_border_exit, self.level_border_exit, self) self.object:set_callback(callback.take_item_from_box, self.take_item_from_box, self) self.object:set_callback(callback.use_object, self.onuseobject, self) --******************************************* --// добавим наконец ГГ каллбек на юзание self.object:set_callback(callback.use_object, self.use_callback, self) --******************************************* end function actor_binder:onuseobject(obj, who) if obj then if obj:section() =="bandage" then ins_poisk.vyzdorovil()--(obj, who)--()--(actor, npc) end end end --******************************************* --// ну и метод канешно function actor_binder:use_callback(obj, who) ---------bolt mod------------------ bolt_mod.on_actor_use(obj) ----------------------------------- end
---------------------------------------------------------------------------------------------------------------------- function actor_binder:take_item_from_box(box, item) local story_id = box:story_id() if story_id == nil then return end
treasure_manager.take_item_from_box(box, story_id) --[[ local respawner = se_respawn.get_respawner_by_parent(story_id) if respawner == nil then return end
--' Необходимо уменьшить счетчик в респавнере respawner:remove_spawned(item:id())
local smart_terrain = db.strn_by_respawn[respawner:name()] if smart_terrain == nil then return end
local npc = smart_terrain.gulag:get_nearest_online_obj(db.actor:position()) if npc ~= nil then xr_sound.set_sound_play(npc, "reac_box") xr_gulag.setGulagEnemy(smart_terrain:name() , db.actor) end ]]
end ---------------------------------------------------------------------------------------------------------------------- function actor_binder:level_border_enter(npc, info_id) self.actor_detector:actor_enter() end ---------------------------------------------------------------------------------------------------------------------- function actor_binder:level_border_exit(npc, info_id) self.actor_detector:actor_exit() end ---------------------------------------------------------------------------------------------------------------------- function actor_binder:info_callback(npc, info_id)
printf("*INFO*: npc='%s' id='%s'", npc:name(), info_id) --' Сюжет level_tasks.proceed(self.object) -- Отметки на карте level_tasks.process_info_portion(info_id) ----------bolt mod------------------ --bolt_mod.on_info(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) --printf("article_callback [%s][%s]", group, name) if device().precache_frame >1 then return end
if group == "Diary" then news_manager.send_encyclopedy("diary", group) else news_manager.send_encyclopedy("encyclopedy", group) end end ---------------------------------------------------------------------------------------------------------------------- function actor_binder:on_item_take (obj) level_tasks.proceed(self.object) --game_stats.update_take_item (obj, self.object)
-->>Treasure rucksack 2/2 if obj:section()=="inv_ruck" then -- запомним id объекта self.rr_id=obj:id() end --<< end ----------------------------------------------------------------------------------------------------------------------
function actor_binder:task_callback(_task, _objective, _state) task_manager.task_callback(_task:get_id(), _objective:get_idx(), _state) if _objective:get_idx() == 0 then if _state == task.fail then news_manager.send_task(db.actor, "fail", _task, _objective) elseif _state == task.completed then task_manager.reward_by_task(_task) news_manager.send_task(db.actor, "complete", _task, _objective) else news_manager.send_task(db.actor, "new", _task, _objective) end else if _task:get_objective(0):get_state() == task.in_progress then news_manager.send_task(db.actor, "update", _task, _objective) end end end
---------------------------------------------------------------------------------------------------------------------- function actor_binder:map_location_added_callback(spot_type_str, object_id) if (false==app_ready()) or (device().precache_frame>1) then return end --'news_manager.send_task(db.actor, "new") end ---------------------------------------------------------------------------------------------------------------------- local corspoff = true function actor_binder:update(delta) object_binder.update(self, delta) --htorch.torch_control() hdetect.detector_control()
-- DEBUG slowdown -- slowdown.update() ------------bolt mod-------------------- bolt_mod.update() ---------------------------------------- local time = time_global()
-- мои функции -- потом объеденить ins_poisk.zabolel() --ins_poisk.vyzdorovil() ins_timer_all.timer_start_qwest() -- if tabula_rasa then tabula_rasa.update(delta) end ins_ins.timer_doc() -- апдейт наших функций использования пульта и ремнабора repair.use_repkit() --' Проверка потери жизни --[[ if self.object.health - lasthealth > 0.001 or self.object.health - lasthealth < -0.001 then printf("%f | %f", self.object.health, self.object.health - lasthealth, game.time() - lasttime) lasthealth = self.object.health lasttime = game.time() end ]] -- Обновление отключения ввода с клавиатуры. 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.st.sleep_relocate_time ~= nil and game.get_game_time():diffSec(self.st.sleep_relocate_time) >= self.st.sleep_relocate_idle then self.object:set_actor_position(self.st.sleep_relocate_point) local dir = self.st.sleep_relocate_point:sub(self.st.sleep_relocate_look) self.object:set_actor_direction(dir:getH()) self.st.sleep_relocate_time = nil end
-- Апдейт прятание оружия игрока во время диалога if weapon_hide == true or self.object:is_talking() then if self.weapon_hide == false then self.object:hide_weapon() self.weapon_hide = true end else if self.weapon_hide == true then self.object:restore_weapon() self.weapon_hide = false end end -- smena.join_monolith() -- end
-- обновление рестрикторов, которые под логикой, срабатывает через интервалы времени if self.next_restrictors_update_time < time then bind_restrictor.actor_update(delta)
-- Апдейтим наш телепорт bind_mteleport.actor_update(delta)
self.next_restrictors_update_time = time + 200
task_manager.actor_update() end
-- обновление сна if post_time < time then post_time = time + 250
if sleep_manager.is_sleep_active() and xr_conditions.actor_dead() then xr_logic.issue_event(db.actor, db.storage[db.actor:id()]["ar_sleep"], "update") end
sleep_manager.update(delta) end
-- обновление постпроцессов if post_process ~= 0 then if post_process:update () == true then post_process = 0 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():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 fake_det then fake_det.update() end
--' Запускаем затычку от возможной потери содержимого тайников treasure_manager.get_treasure_manager():loss_workaround()
if self.bCheckStart then printf("SET DEFAULT INFOS")
if not has_alife_info("storyline_actor_start") and (level.name() == "l01_escape") then self.object:give_info_portion("storyline_actor_start") _G.g_start_avi = true printf("*AVI* RUN START AVI") end
-- if not has_alife_info("encyclopedy") then -- self.object:give_info_portion("encyclopedy") -- end
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
level_tasks.add_lchanger_location()
--if not self.particle then -- self.particle = particles_object([[weather\water]]) -- self.particle:play_at_pos(self.object:position()) --else --self.particle:move_to(self.object:position():add(vector():set(0,1,0)),vector():set(0,0,0)) --end
if xrs_ai then xrs_ai.actor_update(delta) end
--added by xmk -- Новости news_main_data.show_news_main() self.bCheckStart = false end
local sim = alife() if sim then local obj = sim:story_object(19854) if obj then level.map_add_object_spot(obj.id, "level_changer", "переход на припять") end local obj = sim:story_object(19853) if obj then level.map_add_object_spot(obj.id, "level_changer", "переход на юпитер") end
local obj = sim:story_object(19852) if obj then level.map_add_object_spot(obj.id, "level_changer", "переход на затон") end local obj = sim:story_object(19851) if obj then level.map_add_object_spot(obj.id, "level_changer", "переход в путепровод") end local obj = sim:story_object(19850) if obj then level.map_add_object_spot(obj.id, "level_changer", "переход в лабу x8") end local obj = sim:story_object(19849) if obj then level.map_add_object_spot(obj.id, "level_changer", "переход в мертвый город") end local obj = sim:story_object(19900) if obj then level.map_add_object_spot(obj.id, "level_changer", "переход в подземку агропрома ЧН") end local obj = sim:story_object(19901) if obj then level.map_add_object_spot(obj.id, "level_changer", "переход в предбанник") end local obj = sim:story_object(19902) if obj then level.map_add_object_spot(obj.id, "level_changer", "переход на старую свалку") end local obj = sim:story_object(19903) if obj then level.map_add_object_spot(obj.id, "level_changer", "переход на старый янтарь") end local obj = sim:story_object(19904) if obj then level.map_add_object_spot(obj.id, "level_changer", "переход на старые болота") end
-->>Treasure rucksack 1/2 if self.rr_id~=nil then -- пытаемся получить объект по id local se_obj=alife():object(self.rr_id) -- проверяем, что объекта нет if se_obj==nil or se_obj:section_name()~="inv_ruck" then local ruck=alife():create("active_ruck", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id()) level.map_add_object_spot_ser(ruck.id, "red_location", "%c[255,238,155,23]Моя нычка для хабара") news_manager.send_tip(db.actor, "Тайник заложен.", nil, nil, 5000) end -- сбросим переменную self.rr_id=nil end --<<
if xrs_grenade then xrs_grenade.update(delta) end end
---------------------------------------------------------------------------------------------------------------------- function actor_binder:save(packet)
--' Сохраняем уровень сложности if save_treasure_manager == true then packet:w_u8(level.get_game_difficulty() + 128) else packet:w_u8(level.get_game_difficulty()) end
--' Сохраняем данные об отключенном вводе if self.st.disable_input_time == nil then packet:w_bool(false) else packer:w_bool(true) utils.w_CTime(packet, self.st.disable_input_time) end
-- Weapon functions function hide_weapon() weapon_hide = true end function restore_weapon() weapon_hide = false end
// this is test for section iteration /** local function test_section_iteration(file_name, section_name) printf ("file : %s",file_name) printf ("section : %s",section_name)
local file = ini_file(file_name) local n = file:line_count(section_name) printf ("lines : %d",n)
local id, value = "", "", result for i=0,n-1 do result, id, value = file:r_line(section_name,i,"","") printf ("line %d : %s = %s",i,id,value) end end
function actor_binder:use_callback(obj, who) if obj then if obj:section() =="bandage" then ins_poisk.vyzdorovil()--(obj, who)--()--(actor, npc) end end end
Сообщение отредактировал ins33 - Четверг, 22.11.2012, 12:17
lllee, в acdc, файл acdccop.pl:Правой кнопкой мыши: Открыть с помощью блокнота.В середине список объектов,начинается(у меня):
ругается то не на отсутствие секции....они прописаны, я уже проверяла...проблема именно в секции логики, т.к. пустой ящик спаунится, а с начинкой не пакуется
Jargon, мне нужно поменять анимации рук только. взять анимации рук с какого нибудь оружия и поставить на другое!!. может ты поможе сделать??? я уж сколько е***сь ничего не вышло и не сконвертилось даже(((((((((((
Сообщение отредактировал Sanjaaa - Четверг, 22.11.2012, 15:46