В данной теме вы можете задавать любые вопросы касательно 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, на сколько я понял вопрос, надо передать в local fun = {nfme_funcnion_1(), name_function_2()} А это вроде не правильно, утверждать не могу, но в своё время у меня подобное не получилось, и я выдал поршни используя matf.random и tostring в которых вызывал функцию. П.С. local fun можно использовать в таком виде? Или с поршнями правильное решение?
TYOPA, function name() --level.add_pp_effector ("teleport.ppe", 20129, false) расскоментируй, если нужен эффект телепортации. (вспышка) db.actor:set_actor_position(vector():set(x,y,z),lv, gv) --куда local dir = vector():set(0,0,0) -- поворот гг end
Сообщение отредактировал ins33 - Суббота, 22.03.2014, 19:02
TYOPA, в оригинале функции телепортации НПС нет, можно удалить его и заспавнить на нужных координатах, при этом нужно знать секцию этого НПС. С правками движка X-Ray Extension появилась функция alife():teleport_object, которая телепортирует НПС в любую точку игры, даже на разные уровни. MoDoStRoY, по сути есть два способа, я приведу оба, а ты уже думай, что тебе больше подходит:
Код
local functions = {} functions[1] = function () print ("Работает первая функция.") end functions[2] = function () print ("Работает вторая функция.") end functions[3] = function () print ("Работает третья функция.") end functions[math.random(#functions)]()
И второй вариант:
Код
function func_1() print ("Работает первая функция.") end function func_2() print ("Работает вторая функция.") end function func_3() print ("Работает третья функция.") end
ins33, ColR_iT, ясно..тогда ещё вопросик. Мне написали, что переместить ГГ на другую локацию скриптом можно только в том случае, если заспавнить level_changer скриптом. Как заспавнить level_changer скриптом и переместить потом ГГ на другую локацию?
Сообщение отредактировал TYOPA - Суббота, 22.03.2014, 19:23
function create_level_changer( p_story_id, -- STORY_ID нового level_changer (понадобится нам позже) p_position, -- вектор, координаты точки, в которой будет располагаться центр нового level_changer p_lvertex_id, -- level_vertext_id - идентифицируют уровень, на котором будет создан level_changer p_gvertex_id, -- game_vertext_id
p_dest_lv, -- level_vertex_id - идентифицируют уровень, на который level_changer будет перебрасывать игрока p_dest_gv, -- game_vertex_id p_dest_pos, -- координаты точки, в которой на новом уровне окажется игрок p_dest_dir, -- направрение взгляда игрока p_dest_level, -- название уровня, например "L11_Pripyat" p_silent -- следует задать 1, чтобы подавить вопрос о смене уровня (автоматический переход) ) local obj = alife():create("level_changer", p_position, p_lvertex_id, p_gvertex_id)
local packet = net_packet() obj:STATE_Write(packet)
-- свойства cse_alife_object local game_vertex_id = packet:r_u16() local cse_alife_object__unk1_f32 = packet:r_float() local cse_alife_object__unk2_u32 = packet:r_u32() local level_vertex_id = packet:r_u32() local object_flags = packet:r_u32() local custom_data = packet:r_stringZ() local story_id = packet:r_u32() local spawn_story_id = packet:r_u32()
-- свойства cse_shape local shape_count = packet:r_u8() for i=1,shape_count do local shape_type = packet:r_u8() if shape_type == 0 then -- sphere local center = packet:r_vec3() local radius = packet:r_float() else -- box local axis_x_x = packet:r_float() local axis_x_y = packet:r_float() local axis_x_z = packet:r_float() local axis_y_x = packet:r_float() local axis_y_y = packet:r_float() local axis_y_z = packet:r_float() local axis_z_x = packet:r_float() local axis_z_y = packet:r_float() local axis_z_z = packet:r_float() local offset_x = packet:r_float() local offset_y = packet:r_float() local offset_z = packet:r_float() end end
-- свойства cse_alife_space_restrictor local restrictor_type = packet:r_u8()
-- свойства cse_level_changer local dest_game_vertex_id = packet:r_u16() local dest_level_vertex_id = packet:r_u32() local dest_position = packet:r_vec3() local dest_direction = packet:r_vec3() local dest_level_name = packet:r_stringZ() local dest_graph_point = packet:r_stringZ() local silent_mode = packet:r_u8()
function name() create_level_changer(SID, db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(), -- SID - свободное stori_id, остальное под ногами ГГ, но можно указать и координаты. LV, -- куда GV, -- куда vector():set(x,y,z), -- куда vector():set( 0.0,0.0,0.0 ), -- поворот "l07_military", -- имя уровня, 1) -- при единице нет диалогового окна перехода. end
Добавлено (22.03.2014, 19:31) --------------------------------------------- И не забудь его потом удалить.
Добавлено (22.03.2014, 19:36) --------------------------------------------- ColR_iT, А тут точка не нужна? this["func_"..math.random(3)]()
MoDoStRoY, нет, только this! Это служебное слово определяющее текущий модуль (файл). Если тебе нужно рандомно выбрать функции из другого файла, то да, нужно указывать имя этого файла вместо this. Graff46, имеется:
Код
// Вспомогательный класс, содержащий три координаты, и позволяющий выполнять с ними различные манипуляции. C++ class vector { property x; property y; property z;
vector ();
// v1:set_length(number) - изменяет длину v1 равной number, при этом направление остаётся то же. function set_length(number); // v1:normalize(); - изменить длину v1 сделав равной единице (направление остаётся вроде как то же). function normalize(); // v1:normalize(v2); - сделать длину v2 равной единице и записать в v1 (направление остаётся вроде как то же). function normalize(const vector&); // результат показывает такой же. function normalize_safe(); function normalize_safe(const vector&);
// v1:magnitude() - возвращает длину вектора v1. function magnitude() const; // v1:distance_to(v2) - возвращает расстояние между v1 и v2. function distance_to(const vector&) const; // v1:distance_to_sqr(v2) - возвращает квадрат расстояния между v1 и v2. function distance_to_sqr(const vector&) const; // v1:crossproduct(v2,v3) - векторное произведение v2 и v3. Полученный вектор записывает в v1. function crossproduct(const vector&, const vector&); // v1:dotproduct(v2) - скалярное произведение v2 и v1. Возвращает число. function dotproduct(const vector&) const;
// v1:sub(number) - вычесть из каждого компонента v1 число number. function sub(number); // v1:sub(v2) - вычесть почленно вектор v2 из v1 и поместить в v1. function sub(const vector&); // v1:sub(v2, v3) - вычесть из v2 - v3 и поместить в v1. function sub(const vector&, const vector&); // v1:sub(v2,number) - вычесть из каждого компонента v2 число number и поместить в v1. function sub(const vector&, number);
// v1:add(number) - увеличивает почленно v1 на number. function add(number); // v1:add(v2) - почленно складывает v2 и v1. function add(const vector&); // v1:add(v2,number) - увеличивает почленно v2 на number и записывает в v1. function add(const vector&, number); // v1:add(v2,v3) - увеличивает почленно v2 на v3 и записывает в v1. function add(const vector&, const vector&);
// v1:mul(number) - умножает почленно v1 на number. function mul(number); // v1:mul(v2) - почленно умножает v2 на v1. function mul(const vector&); // v1:mul(v2,number) - умножает почленно v2 на number и записывает в v1. function mul(const vector&, number); // v1:mul(v2,v3) - умножает почленно v2 на v3 и записывает в v1. function mul(const vector&, const vector&);
// v1:div(number) - делит почленно v1 на number. function div(number); // v1:div(v2) - почленно делит v2 на v1. function div(const vector&); // v1:div(v2,number) - делит почленно v2 на number и записывает в v1. function div(const vector&, const vector&); // v1:div(v2,v3) - делит почленно v2 на v3 и записывает в v1. function div(const vector&, number);
// v1:mad(v2,number) - умножает v2 на number, а затем приплюсовывает это к v1. function mad(const vector&, number); // v1:mad(v2,v3) - почленно умножает v2 на v3, а затем приплюсовывает это к v1. function mad(const vector&, const vector&); // v1:mad(v2,v3,number) - умножает v3 на number, приплюсовывает к этому v2 и записывает в v1. function mad(const vector&, const vector&, number); // v4:mad(v1,v2,v3) - бешеная операция =) умножить почленно второе на третье и сложить с первым, т.е. v4 = v1 + v2*v3 (название операции mad == mul + add). function mad(const vector&, const vector&, const vector&);
// v1:min(v2) - почленное сравнивает v1 и v2. function min(const vector&); // v1:min(v2) - почленное сравнивает v2 и v3 и записывает в v1. function min(const vector&, const vector&);
// v1:max(v2) - почленное сравнивает v1 и v2 function max(const vector&); // v1:max(v2) - почленное сравнивает v2 и v3 и записывает в v1 function max(const vector&, const vector&);
// v1:clamp(v2) - почленное обрезание первого вторым. function clamp(const vector&); function clamp(const vector&, vector);
// v1:average(v2) - почленное среднее v1 и v2. function average(const vector&); // v1:average(v2) - определить почленное среднее v2 и v3 и записать в v1. function average(const vector&, const vector&);
// v1:invert() - почленная инверсия знака. function invert(); // v1:inbert(v2) - почленная инверсия знака v2 с записью в v1. function invert(const vector&);
// v1:abs(v2); - копирует почленно положительные компоненты в v1 из v2 function abs(const vector&);
// lerp(v1, v2, number) - линейная интерполяция между двумя векторами. // если number больше 1, то выходит за них - экстраполяция. function lerp(const vector&, const vector&, number);
// v1:reflect(v2, v3) - должно быть отражение одного вектора от плоскости, определяемой другим. Не проверял. function reflect(const vector&, const vector&); // v1:slide(v2, v3); - вероятно, проекция одного вектора на плоскость, определяемую другим. Не уверен. function slide(const vector&, const vector&); // v1:distance_to_xz(v2) - учитывая, что плоскость XZ - это плоскость параллельная земле, // то возможно это длина проекции на землю пути от точки до точки. Не проверял. function distance_to_xz(const vector&) const;
// v:getP() - зенитный угол в радианах (угол наклона над плоскостью XZ ). function getP() const; // v:getH() - азимутальный угол в радианах (угол в плоскости XZ между проекцией вектора на эту плоскость и осью Z). function getH() const; // setHP - соответственно для установки этих значений. function setHP(number, number); // v1:align() - выравнивает вектор вдоль оси x или z и нормирует его. Значение по y игнорируется. // В итоге всегда возвращается одно из четырёх значений ([1,0,0], [-1,0,0], [0,0,1], [0,0,-1]). function align(); // v1:inertion(v2, number) - v1 = v2 + (v1-v2)*number (тоже почленно). function inertion(const vector&, number); // v1:similar(v2, number) - сравнение векторов на равенство с погрешностью number. Выдаёт 1 или 0. function similar(const vector&, number) const;
function set(number, number, number); function set(const vector&); };
Сообщение отредактировал ColR_iT - Суббота, 22.03.2014, 19:48