В данной теме вы можете задавать любые вопросы касательно 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 по основным вопросам моддинга - обращаемся в ЛС.
ColR_iT, Если правильно понял вопрос то нет. Я начинаю НИ, ни куда не иду, затем загружаю all.save и иду к рестриктору. Если же я делаю своё сохранение, рестриктор работает.
Добавлено (04.02.2013, 16:11) --------------------------------------------- lllee, Для этого нужны ф-ции АМК! function имя() local obj = alife():create("nps",vector():set(x,y,z), lv, gv) local tbl = имя_скрипта.read_monster_params(obj) tbl.custom="[logic]\ncfg = scripts\\имя.ltx" tbl.sid= свободое число в story_ids Не забудь его прописать! имя_скрипта.write_monster_params(tbl, obj) end Имя скрипта в данном случае надо указать то в которое поместишь ф-ции АМК.
-- серверный объект на входе function read_stalker_params(sobj) local stpk=net_packet() local uppk=net_packet() sobj:STATE_Write(stpk) sobj:UPDATE_Write(uppk) local size=stpk:w_tell() local size1=uppk:w_tell() stpk:r_seek(0) uppk:r_seek(0) local tbl= ins_task.parse_stalker_packet({},stpk,uppk,size) return tbl end
function read_monster_params(sobj) local stpk=net_packet() local uppk=net_packet() sobj:STATE_Write(stpk) sobj:UPDATE_Write(uppk) local size=stpk:w_tell() local size1=uppk:w_tell() stpk:r_seek(0) uppk:r_seek(0) local tbl= ins_task.parse_se_monster_packet({},stpk,uppk,size) return tbl end
-- таблица параметров и серверный объект на входе function write_stalker_params(tbl,sobj,noconvert) local stpk=net_packet() local uppk=net_packet() ins_task.fill_stalker_packet(tbl,stpk,uppk) local size=stpk:w_tell() local size1=uppk:w_tell() stpk:r_seek(0) uppk:r_seek(0) sobj:STATE_Read(stpk,size) sobj:UPDATE_Read(uppk) local npc=level.object_by_id(sobj.id) if npc and (not noconvert) then ins_task.convert_npc[sobj.id]=true npc:stop_talk() switch_offline(npc) end end
function write_monster_params(tbl,sobj) local stpk=net_packet() local uppk=net_packet() ins_task.fill_se_monster_packet(tbl,stpk,uppk) local size=stpk:w_tell() local size1=uppk:w_tell() stpk:r_seek(0) uppk:r_seek(0) sobj:STATE_Read(stpk,size) sobj:UPDATE_Read(uppk) end
function add_spot_on_map(obj_id,type,text) --возможные типы type смотри в ui\map_spots.xml if obj_id then if text==nil then text=" " end -- Ставим метку на серверный объект чтобы её не пришлось обновлять level.map_add_object_spot_ser(obj_id, type, text) end end
function remove_spot_from_map(obj_id,type) if obj_id and level.map_has_object_spot(obj_id, type)~= 0 then level.map_remove_object_spot(obj_id, type) end end
function parse_stalker_packet(ret,stpk,updpk,size) parse_human_packet(ret,stpk,updpk) parse_skeleton_packet(ret,stpk,updpk) ret.hellodlg=updpk:r_stringZ() ret.stunk1={} for i=stpk:r_tell(),size-1,1 do table.insert(ret.stunk1,stpk:r_u8()) end return ret end
function parse_se_monster_packet(ret,stpk,updpk,size) parse_monster_packet(ret,stpk,updpk,size) parse_skeleton_packet(ret,stpk,updpk,size) ret.spec_obj_id=stpk:r_u16() ret.job_online=stpk:r_u8() if ret.job_online>3 then ret.state=true ret.job_online=ret.job_online-4 else ret.state=false end if ret.job_online==3 then ret.job_online_condlist=stpk:r_stringZ() end ret.was_in_smtr=stpk:r_u8() ret.stunk1={} for i=stpk:r_tell(),size-1,1 do table.insert(ret.stunk1,stpk:r_u8()) end return ret end
function on_actor_upade(delta) for k,v in pairs(convert_npc) do local obj=level.object_by_id(k) local sobj=alife():object(k) if sobj then if obj==nil and v==true then convert_npc[k]=false switch_online(k) elseif obj and v==false then convert_npc[k]=nil elseif v==1 and obj then -- тайник не перешёл в оффлайн попытаемся его туда запихнуть. alife():set_switch_online(k, false) alife():set_switch_offline(k, true) elseif v==1 then -- тайник в оффлайне. выталкиваем. convert_npc[k]=nil switch_online(k) else -- convert_npc[k]=nil end else convert_npc[k]=nil end end end
function fill_stalker_packet(ret,stpk,updpk) fill_human_packet(ret,stpk,updpk) fill_skeleton_packet(ret,stpk,updpk) updpk:w_stringZ(ret.hellodlg) for i,v in ipairs(ret.stunk1) do stpk:w_u8(v) end end
function fill_se_monster_packet(ret,stpk,updpk) fill_monster_packet(ret,stpk,updpk) fill_skeleton_packet(ret,stpk,updpk) stpk:w_u16(ret.spec_obj_id) local st=0 if ret.state then st=4 end stpk:w_u8(ret.job_online+st) if ret.job_online==3 then stpk:w_stringZ(ret.job_online_condlist) end stpk:w_u8(ret.was_in_smtr) for i,v in ipairs(ret.stunk1) do stpk:w_u8(v) end end
function parse_human_packet(ret,stpk,updpk) parse_trader_packet(ret,stpk,updpk) parse_monster_packet(ret,stpk,updpk) ret.huvu32u8u1=readvu32u8(stpk) ret.huvu32u8u2=readvu32u8(stpk) return ret end
function parse_trader_packet(ret,stpk,updpk) ret.money=stpk:r_s32() ret.profile=stpk:r_stringZ() ret.infammo=stpk:r_s32() ret.class=stpk:r_stringZ() ret.communityid=stpk:r_s32() ret.rank=stpk:r_s32() ret.reputation=stpk:r_s32() ret.charname=stpk:r_stringZ() return ret end
function parse_monster_packet(ret,stpk,updpk) parse_creature_packet(ret,stpk,updpk) ret.baseoutr=stpk:r_stringZ() ret.baseinr=stpk:r_stringZ() ret.smtrid=stpk:r_u16() ret.smtrtaskactive=stpk:r_u8()
ret.updu16u1=updpk:r_u16() ret.updu16u2=updpk:r_u16() ret.upds32u3=updpk:r_s32() ret.upds32u4=updpk:r_s32() return ret end
ret.updhealth=updpk:r_float() ret.upds32u1=updpk:r_s32() ret.updu8u2=updpk:r_u8() ret.updpos={} -- или поставить вектор? ладно потом ret.updpos.x=updpk:r_float() ret.updpos.y=updpk:r_float() ret.updpos.z=updpk:r_float() ret.updmodel=updpk:r_float() ret.upddir={} ret.upddir.x=updpk:r_float() ret.upddir.y=updpk:r_float() ret.upddir.z=updpk:r_float() ret.updteam=updpk:r_u8() ret.updsquad=updpk:r_u8() ret.updgroup=updpk:r_u8() return ret end
function parse_dynamic_object_visual(ret,stpk,updpk) parse_object_packet(ret,stpk,updpk) parse_visual_packet(ret,stpk,updpk) return ret end
function parse_object_packet(ret,stpk,updpk) ret.gvid=stpk:r_u16() ret.obf32u1=stpk:r_float() ret.obs32u2=stpk:r_s32() ret.lvid=stpk:r_s32() ret.oflags=stpk:r_s32() ret.custom=stpk:r_stringZ() ret.sid=stpk:r_s32() ret.obs32u3=stpk:r_s32() return ret end
function parse_visual_packet(ret,stpk,updpk) ret.visual=stpk:r_stringZ() ret.vsu8u1=stpk:r_u8() return ret end
function parse_skeleton_packet(ret,stpk,updpk) ret.skeleton=stpk:r_stringZ() ret.skeleton_flags=stpk:r_u8() ret.source_id=stpk:r_u16()
-- ret.updsku8u1=updpk:r_u8() return ret end
function fill_human_packet(ret,stpk,updpk) fill_trader_packet(ret,stpk,updpk) fill_monster_packet(ret,stpk,updpk) writevu32u8(stpk,ret.huvu32u8u1) writevu32u8(stpk,ret.huvu32u8u2) end
function fill_skeleton_packet(ret,stpk,updpk) stpk:w_stringZ(ret.skeleton) stpk:w_u8(ret.skeleton_flags) stpk:w_u16(ret.source_id)
-- updpk:w_u8(ret.updsku8u1) end
function fill_monster_packet(ret,stpk,updpk) fill_creature_packet(ret,stpk,updpk) stpk:w_stringZ(ret.baseoutr) stpk:w_stringZ(ret.baseinr) stpk:w_u16(ret.smtrid) stpk:w_u8(ret.smtrtaskactive)
updpk:w_u16(ret.updu16u1) updpk:w_u16(ret.updu16u2) updpk:w_s32(ret.upds32u3) updpk:w_s32(ret.upds32u4) end
function fill_trader_packet(ret,stpk,updpk) stpk:w_s32(ret.money) stpk:w_stringZ(ret.profile) stpk:w_s32(ret.infammo) stpk:w_stringZ(ret.class) stpk:w_s32(ret.communityid) stpk:w_s32(ret.rank) stpk:w_s32(ret.reputation) stpk:w_stringZ(ret.charname) end
Прошу помочь.Задался вопросом: Как через диалог изменить отношение к определенной группировке,например к Военным.Можете сказать какую функцию нужно писать в скрипт, чтобы потом ее задать в диалоге?
Добавлено (04.02.2013, 16:47) --------------------------------------------- Существует ли доступный тутор по созданию спейс_рестрикторов и смарт_террейнов?Если можно ссылку...
И толку то.Написано то-же самое что я и сделал. И ещё я тут пишу просьбы о помощи не для ответов типо иди на амк или insade и читай туторы. Нечего написать - не пиши.
CRAZY_stalkER6665, да ну!? Тоже самое? И где в статье написано, что на схему нужно переходить?
Добавлено (04.02.2013, 18:13) --------------------------------------------- saxar, тебе какие именно функции нужны, для какой цели? Потому как перечислять ВСЕ - никто не будет.