• Страница 1 из 3
  • 1
  • 2
  • 3
  • »
Модератор форума: comador  
Форум настоящего сталкера » S.T.A.L.K.E.R. Тень Чернобыля » Теория модостроения » Маленькие уроки по модостроению
Маленькие уроки по модостроению
# 1
Вторник, 11.08.2009, 18:24:25

Ранг: Мастер
Сообщений: 2546
Награды: 237
Репутация: 2302 Регистрация: 11.12.2008 Город: Заполярье    

Тут будут собраны некоторые маленькие уроки. Простые и сложные. Каждому начинающему модостроителю будет позео здесь побывать... уроки взяты с АМК team сайта
Как отослать сообщение Меченому на ПДА



Создание тайника



Как прописать свои тексты в игру



Выводим часы на HUD
Автор: steelrat


Эффект критического раненния:



Спавн ГГ на другой локации

Автор: WAWKA


Это тема для выкладывания уроков, а не стол заказов и не "вопроссница"!

Если нужен совет, отписываемся вот в этой теме.




-Он счастлив.
-Он мёртв.
# 2
Пятница, 21.08.2009, 18:40:14

Ранг: Мастер
Сообщений: 2546
Награды: 237
Репутация: 2302 Регистрация: 11.12.2008 Город: Заполярье    

Спаун через Скрипт

Создание на лету рабочих аномалий, вертолётов, переходов между уровнями, рестрикторов, точек воспроизводства и других объектов, конструктор которых задаёт не все необходимые для полноценного функционирования параметры.

Автор: bardak
[spoiler]Идея проста.

1) Создаём объект стандартным методом:
local obj = alife():create(...)

2) Создаём экземпляр класса net_packet:
local packet = net_packet()

3) Сохраняем состояние объекта в пакет:
obj:STATE_Write(packet)

4) Считываем _все_ сохраняемые свойства в переменные:
local property1 = packet:r_u32()
...
local propertyN = packet:r_float()

5) Записываем эти переменные опять, меняя или дополняя необходимые параметры:
packet:w_u32(property1)
...
propertyN = new_value
packet:w_float(propertyN)

6) Считываем модифицированное состояние объекта:
packet:r_seek(0)
obj:STATE_Read(packet, packet:w_tell())[/spoiler]

Создание НПС "привязанного к точке" без редактирования all.spawn
Автор: меченый(стрелок)
Создание Снайпера

[spoiler]*1
Для начала создадим профиль!
Откроем фаил character_****.xml
и создаем там новый профиль
Пример:
<specific_character id="название_секции" team_default = "1">
<name>GENERATE_NAME_stalker</name>
<icon>иконка</icon>
<map_icon x="1" y="0"></map_icon>
<bio>Опытный сталкер. Детальная информация отсутствует.</bio>

<class>класс</class>
<community>группировка</community> <terrain_sect>stalker_terrain</terrain_sect>
<snd_config>characters_voice\human_01\папка с названием группировки\</snd_config>

<rank>цифры от 0 до 900</rank>
<reputation>цифры от 0 до 1000</reputation>

<visual>путь до модели"визуала"</visual>
<supplies>
[spawn] \n
оружие \n
патроны к этому оружию = 5 \n
</supplies>
#include "gameplay\character_criticals_4.xml"
#include "gameplay\character_dialogs.xml"
</specific_character>

*2
Теперь нужно прописать класс нашего НПС в npc_profile.xml
Пример:
<character id="название_секции из character_****.xml">
<class>класс прописанный вами ранее</class>
<specific_character>название_секции из character_****.xml</specific_character>
</character>

*3
Теперь зарегистрируем Нашего НПС в spawn_section.ltx
Пример:
[секция спавна(название пишите сами)]:stalker
$spawn = "respawn\секция спавна"
character_profile = название_секции из character_****.xml
spec_rank = regular ;это ранг непеся оставляйте как есть ,особой роли не играет
community = группировка которую вы приписали этому (название_секции из character_****.xml)
custom_data = scripts\sniper_addon\sniper_addon_***_logic.ltx;*** - если группировка НПС нейтральна к вам или дружелюбна ,то friend , в противном случае enemy

*4
Потом открываем xr_conditions.script
и добавляем вот такую функцию
function is_sniper_enemy(enemy, object)
return enemy:id() ~= db.actor:id()
end
PS:Если нет такого фаила ,то возьмите из оригинальной Игры!

*5
Теперь осталось Заспавнить Нашего НПСа
PS:Тем кто делает это впервые ,прочитайте дальше :),а если сталкивались ,всё равно читайте :)

*5.1
Для Начала нам нужно снять координаты того места Где появится наш Снайпер.
Для этого открываем ui_main_menu.script
находим вот примерно такое
if dik == DIK_keys.DIK_Q then
self:OnMessageQuitWin()
end
и делаем так :
if dik == DIK_keys.DIK_Q then
self:OnMessageQuitWin()
elseif dik==DIK_keys.DIK_W then
self:position_info()
end
И в конец фаила.В Самый Конец!!!
function main_menu:position_info()
local a = db.actor:position()
local vid = db.actor:level_vertex_id()
local gvid = db.actor:game_vertex_id()
local text = "GPS:\\nX= "..a.x.."\\nY= "..a.y.."\\nZ= "..a.z.."\\nlevel_vertex= "..vid.."\\ngame_vertex_id= "..gvid
news_manager.send_tip(db.actor, text, nil, nil, 30000)
end
Сохраняем!!!
*5.2
Заходим в игру ,добегаем до места где бы хотели чтобы сидел снайпер,выходим в Меню и в меню жмём на W , потом возвращаемся в игру
И Делаем скриншот (F12)
*5.3
Далее создаём скрипт спавна
(создаётся с помощью блокнота или Notepad++)
Например sniper_add.script
В нём будем писать функции!
function start_add_spawn()--\\*Это "список".Сюда будем вписывать вызов всех функции спавна
--\\*Сюда вписываем название ваших функций
--пример:
spawn_sniper_one()
end

function название_латиницей()--\\spawn_sniper_one()
local x= смотрим скриншот и переписываем сюда x
local y= смотрим скриншот и переписываем сюда y
local z= смотрим скриншот и переписываем сюда z
local level_vertex= смотрим скриншот и переписываем сюда level_vertex
local game_vertex_id= смотрим скриншот и переписываем сюда game_vertex_id
alife():create("тут название вашей из spawn_section.ltx",vector():set(x,y,z),level_vertex,game_vertex_id)
end

function save_variable(variable_name, value)
xr_logic.pstor_store(db.actor, variable_name, value)
end
function load_variable(variable_name, value_if_not_found)
return xr_logic.pstor_retrieve(db.actor, variable_name, value_if_not_found)
end

*5.4
Когда вписали всех наших Снайперов и все функции спавна и внесли их в "список",то добавляем вызов нашей функции в bind_stalker.script

в функцию actor_binder:update(delta)
перед последнем end'ом этой функции
добавляем
if sniper_add.load_variable("spawn_sniper",false)==false then
sniper_add.start_add_spawn()
sniper_add.save_variable("spawn_sniper",true)
end

Сохраняем!

*6
Теперь работаем с логикой.
в папке configs/scripts создаём папку с sniper_addon , открываем её
*6.1
Создаём два фаила
sniper_addon_friend_logic.ltx и sniper_addon_enemy_logic.ltx
*6.2
открываем sniper_addon_friend_logic.ltx
и вписываем туда:
;SNIPER ADDON
;Меченый(Стрелок)
[logic]
active = remark@search

[remark@fire]
combat_ignore_cond = {!is_sniper_enemy}
radius = 0
anim = hide
on_info = {=health_le(0.5)} remark@search
wounded = wounded@work
sniper = true

[remark@search]
combat_ignore_cond = true
combat_ignore_keep_when_attacked = false
anim = hide
target = actor
on_info = {=see_enemy} remark@fire
wounded = wounded@work
[smart_terrains]
none = true
[wounded@work]
hp_state = 0|wounded_heavy@help_heavy
hp_state_see = 0|wounded_heavy@help_heavy
hp_victim = 0|nil
hp_fight = 0|false
hp_cover = 0|false

Сохраняем этот фаил и открываем второй
и вставляем туда
;SNIPER ADDON
;Меченый(Стрелок)
[logic]
active = remark@search

[remark@fire]
combat_ignore_cond = {!is_enemy_actor}
radius = 0
anim = hide
on_info = {=health_le(0.5)} remark@search
wounded = wounded@work
sniper = true
[smart_terrains]
none = true
[remark@search]
combat_ignore_cond = true
combat_ignore_keep_when_attacked = false
anim = hide
target = actor
on_info = {=see_actor} remark@fire
wounded = wounded@work

[wounded@work]
hp_state = 0|wounded_heavy@help_heavy
hp_state_see = 0|wounded_heavy@help_heavy
hp_victim = 0|nil
hp_fight = 0|false
hp_cover = 0|false[/spoiler]

Спавн через скрипт
Авторы
*xStream
* OffBar
* Fr3nzy
* Imp
* Arhet

[spoiler]Теория

В скриптах есть одна единственная функция, отвечающая за спавн объектов:

alife():create(section,position,levelvertex,gamevertex)

Строго говоря, их две: create create_ammo но различия между ними не существенны. Imp 22:45, 23 июля 2007 (EEST)

Первый параметр - секция в конфигурациях, описывающая объект, например "bolt","med_kit" - это простые секции, простых объектов а есть объекты, которые переходят в онлайн/оффлайн, это неписи, монстры и так далее, например mil_killer_respawn_2 - спавнится снайпер группировки киллеров.

С позицией, думаю объяснять не надо, только существует нюанс - высота это Y, а не Z. Задать позицию можно такой конструкцией vector():set(x,y,z), где x, y и z - координаты точки на уровне, где спавним объект.

Вертекс в игре Сталкер не тоже самое, что вертекс в трехмерной графике. Vertex - определенная зона малого размера за которой закреплен индивидуальный номер в пределах уровня или целой игры. level_vertex определяет зону на уровне, по которой можно пройти NPC. game_vertex определяют зоны для свободного хождения, т.е. под руководством ИИ, а также между уровнями. Вертексы имеют одно из первостепенных значений. Точность положения указывается уже через точку спавна. Например, можно получить вертекс ближайший к актору - db.actor:level_vertex_id()

game_vertex_id нужен для того, чтобы указать на какой карте спавнить объект.

Соответственно, чтобы заспавнить что-нибудь на другой карте, достаточно указать game_vertex_id в четвертом параметре Например:

db.actor:game_vertex_id()

Итак, чтобы, например, заспавнить болт под ногами актора, пишем:

alife():create("bolt", db.actor():position(), 1, db.actor:game_vertex_id())

Почему 1, а не level_vertex_id? Проверено - разницы особой нет, какой level_vertex_id, хотя в некоторых случаях надо прописывать валидный вертекс, а то предмет может просто заспавнится не там, где планировалось... Но по большей части все проходит нормально и с единицей. (Игнорирование level_vertex_id может приводить к проваливанию произведенных предметов/персонажей под землю.) А вот game_vertex решает все - он указывает на каком уровне спавнить предмет, поэтому его надо указывать. Теоретически можно просто найти для каждого уровня по одному game_vertex'у и использовать их в скриптах. На самом деле game_vertex показывает какой фрагмент карты используется (вся карта разбита на кусочки имеющие сквозную нумерацию по всем уровням и game_vertex выбирает нужный) соответсвенно неправильное использование черевато....

Кроме того - есть еще один параметр - ID объекта, если указать ID NPC или актора - то предмет заспавнится у него в инвентаре.

Пример (спавним артефакт Медуза в инвентаре у актора):

alife():create("af_medusa", db.actor():position(), 1, db.actor:game_vertex_id(), db.actor:id())

Функция спавна возвращает серверный объект, то есть ни NPC, ни монстра ни что-либо еще.

Серверный обьект позволяет свеже созданного NPC или тайник затарить разными рулезами/артефактами. Например, вот так создадим перед входом к Сидоровичу долговца и засунем в него пачку патронов:

local obj
local a = vector() -- Задаем тип переменной
local dir = db.actor:direction()

a.x = -243.61 -- координата X
a.y = -19.52 -- высота Y
a.z = -127.17 -- координата Z

obj = alife():create("bar_dolg_respawn_3", a, 13193, 8, 65535)
alife():create_ammo("ammo_9x18_fmj",
obj.position,
obj.m_level_vertex_id,
obj.m_game_vertex_id,
obj.id,
20) -- число патронов

Кстати, create_ammo - практически тоже самое, что и create, разница в том, что create_ammo предназначена специально для спавна патронов и позволяет создавать неполные пачки патронов. Возможно есть еще какие-то отличия. Стоит учесть, что сами авторы игры спавнят патроны исключительно через create_ammo. Imp 22:38, 23 июля 2007 (EEST)

Просто минимальный набор - координаты, ID, секция,а из него (серверного объекта) обычно нужен только ID, так как по ID можно получить этот самый серверный объект:

(alife():object(id))

Его можно использовать, чтобы поставить метку, например, но я его лично использую для других целей - спавн сложных объектов, конкретно – NPC.

Например надо решить следующую задачу - надо создать наемника, сменить ему группировку и изменить его инвентарь, ну и в нагрузку - сделать другом для игрока.

В определенный момент заспавненый объект переходит онлайн, в этот момент вызывается callback - net_spawn.

Что мы делаем? Сверяем ID онлайн объекта с сохраненным ID!

Если они совпадают, например так:

if obj:id()==saved_id then ...

Важно то, что у серверного объекта ID - это параметр, а у онлайнового объекта ID получается с помощью функции. Это важно, а то можно прогореть.

Итак, мы поймали нашего киллера по ID.

Далее все очень просто - вызываем команды для спавна гаусса и патронов к нему в инвентаре NPC (см. выше), меняем группировку специальной функцией, и делаем его другом.

Зачем такие сложности? Просто в оффлайне NPC как бы не существует, есть только косвенное упоминание о нем, и, плюс, все эти функции работают именно с объектом типа "NPC", а не с серверными объектами.

Более простая функция спауна в одну строчку:
Пример:
alife():create("stalker",vector():set(0,0,0),1,135) -- спаунит сталкера на водокачке. (Игра ЧН, на уровне Болото)

alife():create(section,position,levelvertex,gamevertex)
section - это секция предмета
position - Это его позиция (Через vector()) Брать в игре с помощью консольной команды rs_stats 1 или rs_cam_pos 1 (Тока в ЧН)
levelvertex - Пусть равно 1
gamevertex - Его Game Vertex, определяет уровень где будет спаун.
GV можно взять либо скриптом, либо через распакованный all.spawn.

[править]
Практика (часть 1)

1. Чтобы не повторяться в описании создания нового квеста, просто изучите статью по созданию квестов от Fr3nzy – лучшей статьи на эту тему я просто не видел :) Мы просто свяжем все воедино и научимся спавнить объекты из скрипта.

Небольшое отступление:

Почему предпочтительнее делать спавн скриптом, а не через тот же xrSpawner? Программа xrSpawner, при всех своих достоинствах, обладает одним недостатком, а именно – она делает спавн через файл all.spawn, что приводит к:

* Невозможности совместить два мода, такой спавн использующих
* Необходимости каждый раз начинать новую игру

При спавне через скрипт ситуация иная: в подавляющем большинстве случаев, ранее сохраненные игры будут работать, что не может не радовать :)

Итак, определимся с квестом.

Задача: после разговора с Сидоровичем спавним зомби на территории фабрики в первой локации. Для того, чтобы не повредить оригинальный сюжет игры, задание будет выдаваться после прохождения квеста с флешкой Шустрого, так как появись там зомби одновременно с бандитами и Шустрым... я думаю, исход боя предрешен :)

Реализация: Постараюсь описать все действия максимально подробно, буквально по шагам. Первым делом запустите игру :)

В консоли введите команду:

rs_stats on или rs_stats 1

Тем самым мы включаем вывод информации на экран. Далее вводим еще одну команду:

demo_record 1

И «летим» на фабрику. Нам нужно выбрать место для спавна объектов и данный режим как нельзя лучше подходит для реализации задуманного. Помещаем камеру в точке предполагаемого спавна и записываем координаты - у меня получились 115, -6, -16.

Для выхода из режима demo_record нажимаем Esc, в консоли пишем rs_stats off или rs_stats 0 (убираем вывод информации).

Другой способ получения тех же сведений - прийти в нужное место и запустить там скрипт, который выдаст все нужные координаты. Я пользуюсь следующим скриптом (вызываю общеизвестным способом, через main_menu):

function main_menu:main_cheat_f3()
-- Выдадим сообщение о нашем местоположении
local text
local vid
local gvid
local a = vector() -- Тип переменной
local text

a = db.actor:position() -- Наше положение в координатах
vid = db.actor:level_vertex_id()
gvid = db.actor:game_vertex_id()
text = "Позиция:\\nX= "..a.x.."\\nY= "..a.y.."\\nZ= "..a.z.."\\nlevel_vertex= "..vid.."\\ngame_vertex_id= "..gvid
news_manager.send_tip(db.actor, text, nil, nil, 30000)
end

В результате не нужно эксперементировать мы сразу получаем все, в том числе и level_vertex и game_vertex. Imp 22:38, 23 июля 2007 (EEST)

Выходим из игры, идем в папку с установленной игрой и создаем каталог gamedata (предполагается, что «лепим» свой «мод» на «чистую» игру, без установленных модов, и имеем распакованные ресурсы игры в папке, скажем, gamedata source).

В папке gamedata создаем папку config, а в ней - папку creatures. Скопируем из оригинальной папки файл m_zombie.ltx и откроем его на редактирование.

В файлах игры присутствуют 5 моделей гражданских зомби:

файлы zombi_1.ogf, zombi_1_ghost.ogf, zombi_2.ogf, zombi_trup.ogf, zombi_trup_2.ogf

Вернем в игру их всех :)

Уже имеются секции:

[zombie_weak]:m_zombie_e, [zombie_normal]:m_zombie_e, [zombie_strong]:m_zombie_e и [zombie_immortal]:zombie_strong.

Два последних типа используют одну и ту же модель zombi_trup.ogf, хм... непорядок, исправляем. Последняя секция выглядит теперь так:

[zombie_immortal]:zombie_strong
$spawn = "monsters\zombies\zombie_immortal"
visual = monsters\zombi\zombi_trup_2
panic_threshold = 0.05

Добавим пятую модель.

Для этого в конце файла создадим секцию:

[zombie_ghost]:zombie_strong

Это означает, что наш пятый зомби наследует все параметры zombie_strong, мы добавим лишь визуальное представление.

Пишем дальше:

$spawn = "monsters\zombies\zombie_ghost"
visual = monsters\zombi\zombi_1_ghost

Все. Сохраняем изменения и закрываем файл.

2. Пишем скрипт спавна. В папке gamedata создаем новую папку scripts, в ней создаем новый текстовый документ и называем его esc_zombie.script.

Отступление третье:

При написании статьи использовался оригинальный скрипт zombie_story.script из horror-mod’а. Концепция спавна перенесена практически без изменений, поэтому на авторство этого способа спавна я никоим образом не претендую :)

Итак, открываем наш пустой файл на редактирование, первой строкой объявляем переменную, в которой хранятся наши зомби:

local zombie_types = {"zombie_weak", "zombie_normal", "zombie_strong", "zombie_immortal", "zombie_ghost"}

Далее пишем функцию:

function spawn_zombies( position, total )
local zombie_index -- тип зомби из массива zombie_types
local new_pos, x_offset, z_offset -- объявляем переменные
for zombie_index=1, total do -- крутим цикл столько раз, сколько
задает переменная total
x_offset = math.random(5) -- случайное (рандомное) x от 1 до 5
z_offset = math.random(5) -- случайное (рандомное) z от 1 до 5
new_pos = position -- передаем координаты в функцию
new_pos.x = new_pos.x + x_offset -- прибавляем к указанной нами
координате x полученное выше рандомное x
new_pos.z = new_pos.z + z_offset -- прибавляем к указанной нами
координате z полученное выше рандомное z
-- Ниже, собственно и вызывается функция спавна случайного типа зомби
zombie_types[math.random(5)] привязанного к нашим координатам
alife():create(zombie_types[math.random(5)],new_pos,db.actor:level_vertex_id(),db.actor:game_vertex_id())
end
end

И последнее:

function zombie_story_1( actor, npc )
-- десять зомби на фабрике (Кордон)
local spawn_point = vector():set( 115, -6, -16 ) -- здесь указываем координаты,
выбранные нами для спавна, когда «летали» камерой :)
spawn_zombies( spawn_point, 10 ) -- собственно вызов предыдущей функции
с передачей ей координат и количества объектов
end

Все. Сохраняем и закрываем файл.

Продолжаем разговор :)

Для того, чтобы игра не вылетала после того, как мы добавили новый тип монстров, их нужно добавить в файл xr_statistic.script. Итак, скопируем этот файл из папки игры scripts в нашу папку к файлу esc_zombie.script и откроем на редактирование.

Добавим в local killCountProps к монстрам строчку:

zombie_weak = 1, zombie_normal = 2, zombie_strong = 3

В local sect_alias строчку:

zombie_weak = "zombie_weak", zombie_normal = "zombie_normal", zombie_strong = "zombie_strong"

А ниже в monster_classes строчку:

[clsid.zombie_s ] = "zombie"

В функцию getNpcType(npc) добавляем конструкцию:

elseif npc:character_community() == "zombie" then
community = "zombie"

Сохраняем изменения и закрываем файл.

Все будет работать на ура, пока мы не попробуем обыскать убитого зомби. Как только мы это сделаем, игра вылетит с примерно такой ошибкой.

Expression : fatal error
Function : CInifile::r_string
File : D:\xray-svn\xrCore\Xr_ini.cpp
Line : 351
Description : <no expression>
Arguments : Can't find variable icon in [zombie_weak]

Все верно – игра не знает какую иконку нам показывать для зомби. Иконки монстров хранятся в файле ui_npc_monster.dds. Здесь есть два варианта:

* Если дружите с Фотошопом, отредактировать этот файл (нарисовать, добавить иконки);
* Взять готовый из любого мода, естественно, с разрешения авторов мода. Сейчас мы пропустим данный аспект и присвоим нашим зомби иконки контролера :)

Вернемся к файлу m_zombie.ltx и в секцию [m_zombie_e]:monster_base впишем параметр

icon = ui_npc_monster_kontroler

Все. Вылетов не будет.

3. Тема данной статьи не предусматривает подробного описания того, как сделать новый диалог. В начале статьи я упомянул источник, где можно найти исчерпывающую информацию по созданию диалогов, могу также привести в пример статью по созданию диалогов от BAC9-FLCL.

Нам нужно просто проверить работоспособность скриптового спавна, поэтому я приведу просто собственно сам измененный диалог из файла dialogs_escape.xml:

<dialog id="escape_trader_talk_info">
………
<phrase id="999">
<text>escape_trader_talk_info_999</text>
<next>7770</next>
<next>9991</next>
<next>9992</next>
<next>9993</next>
<next>9994</next>
<next>9995</next>
<next>9996</next>
</phrase>
<phrase id="9992">
<text>escape_trader_talk_info_9992</text>
<next>99922</next>
</phrase>
<phrase id="99922">
<text>escape_trader_talk_info_99922</text>
<next>9996</next>
<next>9995</next>
</phrase>
<phrase id="9993">
<text>escape_trader_talk_info_9993</text>
<next>99933</next>
</phrase>
<phrase id="9995">
<text>escape_trader_talk_info_9995</text>
</phrase>
<phrase id="3121">
<text>escape_trader_talk_info_3121</text>
<next>9996</next>
<next>9995</next>
</phrase>
<phrase id="3131">
<text>escape_trader_talk_info_3131</text>
<next>9996</next>
<next>9995</next>
</phrase>
<phrase id="41">
<text>escape_trader_talk_info_41</text>
<next>9996</next>
<next>9995</next>
</phrase>
<!------Наш диалог: Начало------->
<phrase id="7770">
<text>escape_trader_talk_info_7770</text>
<next>7771</next>
</phrase>
<phrase id="7771">
<text>escape_trader_talk_info_7771</text>
<next>7772</next>
<next>7773</next>
</phrase>
<phrase id="7772">
<text>escape_trader_talk_info_7772</text>
<next>7777</next>
</phrase>
<phrase id="7773">
<text>escape_trader_talk_info_7773</text>
<next>7779</next>
</phrase>
<phrase id="7779">
<text>escape_trader_talk_info_7779</text>
<next>9996</next>
<next>9995</next>
</phrase>
<phrase id="7777">
<text>escape_trader_talk_info_7777</text>
<action>esc_zombie.zombie_story_1</action>
<next>9996</next>
<next>9995</next>
</phrase>
<!------Наш диалог: Конец------->
<phrase id="51">
<text>escape_trader_talk_info_51</text>
<next>9996</next>
<next>9995</next>
</phrase>
……
</dialog>

И также связанный с ним файл stable_dialogs_escape.xml. В самом начале файла пишем следующее:

<string id="escape_trader_talk_info_7770">
<text>Происшествий никаких не было?</text>
</string>
<string id="escape_trader_talk_info_7771">
<text>Да знаешь... Вроде как тихо все у нас. Хотя, вот, вспомнил! Говорили мне
на днях, что на фабрике, ну, там, где бандюки околачиваются постоянно, видели какиих-то то ли
людей, то ли призраков... Мало ли что спьяну почудится - я и сказал этим паникерам, мол,
закусывать надо! Хех, блин, алкаши...</text>
</string>
<string id="escape_trader_talk_info_7772">
<text>Дык мне по любому мимо фабрики топать - заодно и посмотрю на этих
"людей-призраков".</text>
</string>
<string id="escape_trader_talk_info_7773">
<text>Да я как-то не собирался в ту сторону...</text>
</string>
<string id="escape_trader_talk_info_7779">
<text>Ну, смотри сам, все равно будь осторожен.</text>
</string>
<string id="escape_trader_talk_info_7777">
<text>Ага. Сходи, проветрись. Потом зайдешь, расскажешь, что там и как.</text>
</string>
<string id="esc_bridge_soldiers_start_11">
<text>Здесь проход воспрещён, сталкер.</text>
</string>

Все. Можно запускать игру, идти на Кордон, после разговороа с Сидоровичем, в зависимости от выбранного Меченным решения, бежим на фабрику и … смотрим сами :)

Готовые файлы примера(перезалито)
Spawn Lib

Домашнее задание - вернуть в игру 6-ой тип гражданского зомби :)

Продолжение следует…
[править]
Практика (часть 2)

4. Сегодня мы закончим с зомби в полном объеме – добавим их описания в энциклопедию, добавим иконки, и разберемся с «домашним заданием»:) Думаю, что внимательно изучив эту статью, вы сами сможете через скриптовые функции восстановить любого персонажа, не вошедшего в финальный релиз игры. Если у кого хватит времени и желания, те могут даже написать что-то типа «Ночи живых мертвецов» :) - серию квестов, связанную своим собственным сюжетом. Итак, «домашнее задание» - добавляем в игру шестого зомби.

* Создаем в папке gamedata папку meshes, в ней папку monsters, а там – папку zombi. В папке meshes хранятся модели персонажей, объектов, окружения, присутствующих в игре. Как я уже говорил выше, в игре представлено 5 моделей гражданских зомби, а вот текстур – 6. Также немного смутила нумерация моделей – 1, 2, 4... А где третий? Наверное, сбежал :)

* Скопируем из папки с оригинальными файлами игры в созданную нами папку zombi файл zombi_2.ogf и переименуем его в zombi_3.ogf. Откроем файл нашей новой модели любым HexEditor’ом, я использую BiEd (Binary Editor 1.00). Так как данная статья рассчитана не только на «продвинутых юзеров», но и на «обычных чайников», которые, тем не менее, хотят «что-нить замутить» и при этом не сильно «парить моск», я не буду рассказывать здесь про адресацию, двухбайтовую запись и т.д., я просто наглядно покажу, где что поправить :)

Файл модели до редактирования

Файл модели после редактирования

На скринах видно, что мы просто изменили для этой модели путь к текстуре. Все. Без использования 3D-редакторов и затраты кучи времени на обработку модели в них, мы получили абсолютно новую (на внешний вид) модель. :)

5. Теперь пропишем нашего нового зомби во все файлы, которые мы создали ранее. В файл m_zombie.ltx в самый конец добавляем секцию:

[zombie_old]:zombie_normal
$spawn = "monsters\zombies\zombie_old"
visual = monsters\zombi\zombi_3

в файле esc_zombie.script изменяем массив в первой строке:

local zombie_types = {"zombie_weak", "zombie_normal", "zombie_strong", "zombie_immortal",
"zombie_old", "zombie_ghost"}

В функции spawn_zombies изменяем строку спавна:

alife():create(zombie_types[math.random(6)],new_pos,
db.actor:level_vertex_id(),db.actor:game_vertex_id())

в функции zombie_story_1 меняем число объектов на кратное 6-ти (необязательно):

spawn_zombies( spawn_point, 12 )

Всё. Сохраняем и закрываем.

6. Копируем в папку gamedata\config\gameplay\ файл encyclopedia_mutants.xml, добавляем описание зомби в энциклопедию:

<!-------------------------------- Zombieg ----------------------------->

<article id="mutant_zombieg_general" name="Zombieg" group="Mutants">
<texture>ui_npc_monster_zombieg</texture>
<text>enc_mutant_zombieg_general</text>
</article>

И в связанный с ним файл string_table_enc_mutants.xml в папке gamedata\config\text\rus\ добавляем:

<string id="Zombie">
<text>Зомби, гражданский</text>
</string>
<string id="Zombieg">
<text>Зомби-призрак, гражданский</text>
</string>
<string id="enc_mutant_zombieg_general">
<text>Зомби-привидение отличается от обычного зомби лишь тем, что
воздействие Выжигателя мозгов полностью разрушило не только структуру личности, но и
тело, поэтому зомби-призрак несколько более живуч по сравнению с обычным зомби.</text>
</string>
<string id="enc_mutant_zombie_general">
<text>Воздействие Выжигателя мозгов полностью разрушает структуру личности,
оставляя только телесную оболочку.\n\n Побродив немного по Зоне, лишённые разума тела
начинают превращаться в настоящих зомби. Из рефлексов у них остаются лишь самые примитивные,
оружие и экипировка скоро приходят в негодность. В результате зомби становятся собой ни чем
иным, как медлительными полутрупами, которых наличествуют лишь два эффективных раздражителя:
еда и сон. Зомби совершенно неразборчивы в выборе пищи и питья, поэтому их тела буквально
пропитаны радиацией и токсинами. Как правило, эти существа бесцельно бродят по Зоне или,
словно трупы, валяются внутри заброшенных построек. Однако, лишь только зомби почует близкое
присутствие живого человека, он сразу же пытается атаковать. Умудрённые опытом сталкеры
стараются обходить эти неуклюжие опустошённые оболочки.</text>
</string>

Копируем сюда же файл stable_statistic_caption.xml и изменяем в нем 3 строчки:

<string id="zombie_normal">
<text>зомбированный, гражданский</text>
</string>
<string id="zombie_strong">
<text>зомби-призрак, гражданский</text>
</string>
<string id="zombie_weak">
<text>зомби, гражданский</text>
</string>

Сохраняем и закрываем.

7. И последнее – добавим иконки. Скажу сразу, воспользовался готовым файлом, уже содержащим иконки зомби и других «восстановленных монстров» (спасибо Fr3nzy). Поэтому просто скопируйте файл ui_npc_monster.dds из архива в папку gamedata\textures\ui\, а файл ui_npc_monster.xml – в папку gamedata\config\ui\. Если вы хотите сделать собственные - прочитайте урок по изменению текстур.

Вкратце, что описывает файл ui_npc_monster.xml: в нем задаются координаты иконок, расположенных в файле ui_npc_monster.dds, применительно к каждому типу монстров в игре.

Заключительный штрих. Откройте файл m_zombie.ltx и в первой секции замените строку

icon = ui_npc_monster_kontroler

На:

icon = ui_npc_monster_zombie

В секцию [zombie_ghost] добавьте строку:

icon = ui_npc_monster_zombieg

Сохраняйте изменения. Всё.

Вот готовые файлы примера. Удачи и спасибо за внимание :)
[править]
Спавн NPC

Эта часть статьи написана Arhet и создана на примере того, как в SRP Mod были созданы NPC группировки "Грех".

Задействуем файлы:

* gamedata\config\gameplay\character_desc_escape.xml
* gamedata\config\gameplay\npc_profile.ltx
* gamedata\config\creatures\spawn_sections.ltx

Начнем с character_desc_escape.xml. Описание что значит каждая строка писать не буду, так как все до меня уже сделано.

Тут создадим нового персонажа:

<specific_character id="esc_dark_stalker_1" team_default = "1">
<name>GENERATE_NAME_bandit</name>
<icon>ui_npc_dark_1</icon>
<map_icon x="0" y="0"></map_icon>
<bio>sim_stalker_novice_bio</bio>

<class>esc_dark_stalker_01</class> - вот тут наш новый класс кстати.
<community>dark_stalker</community> <terrain_sect>stalker_terrain</terrain_sect>
<money min="200" max="600" infinitive="0"></money>

<rank>198</rank>
<reputation>-24</reputation>

<visual>actors\dark_stalker\dark_stalker_1</visual>
<snd_config>characters_voice\human_01\monolith\</snd_config>
<crouch_type>-1</crouch_type>
<panic_treshold>0</panic_treshold>
<supplies>
[spawn] \n
wpn_dark_colt1911 \n
ammo_11.43x23_hydro \n
#include "gameplay\character_items.xml" \n
#include "gameplay\character_drugs.xml" \n
#include "gameplay\character_food.xml"
</supplies>

#include "gameplay\character_criticals_3.xml"

<start_dialog>dm_hello_dialog</start_dialog>
<actor_dialog>dm_cool_info_dialog</actor_dialog>
</specific_character>

Впишем наш код после какого-нибудь </specific_character>

Теперь идем в npc_profile.xml и туда вгоняем:

<character id="esc_dark_stalker_1">
<class>esc_dark_stalker_01</class>
<specific_character>esc_dark_stalker_1</specific_character>
</character>

Теперь надо заняться spawn_sections.ltx. Скрипт будет «брать NPC» как раз из этого файла. Пишем туда:

* [esc_dark_stalker_1]:stalker – имя секции для скрипта..
* $spawn = "respawn\esc_dark_stalker_1"
* character_profile = esc_dark_stalker_1 – ссылка на описание нашего NPC
* spec_rank = regular – спец ранг
* community = dark_stalker – группировка.

Теперь берем любой скрипт спавна NPC, вгоняем туда имя секции из spawn_sections.ltx и ву-а-ля.

Тока забыли что данному НПС будет присвоенная дефолтовая логика (т.е. тупо хожу куда сам не знаю) забыли упомянуть про (ххх - лока):
ххх gulag.script (действия НПС! Где можно: где можно присвоить статус кампера; волкера; и.д.т)
ххх gulag.ltx (дублер логики т.е. дублирует кратко действия НПС)
[/spoiler]





-Он счастлив.
-Он мёртв.
# 3
Суббота, 22.08.2009, 15:45:01

Ранг: Мастер
Сообщений: 2546
Награды: 237
Репутация: 2302 Регистрация: 11.12.2008 Город: Заполярье    

Добавление вырезанных анимаций в игру

[spoiler]Инструкция по добавлению анимок:
Нужны два скрипта: state_mgr_animation_list и state_lib. В первом каталог анимок, во втором библиотека анимок для использования в игре. В state_mgr_animation_list добавляется новые раздел в котором указываются названия анимок дла idle, in , out и rnd (rnd - это для рандомного воспроизведения анимок) Потом пишется новый раздел в state_lib, в котором указывается название раздела из state_mgr_animation_list (строчка animation). Потом анимация ставиться на нпц через all.spawn или ltx на который стоит ссылка в all.spawn.
Текст выглядит так:

[logic]
active = walker@drunk

[walker@drunk]
path_look = my_own_camper_look
path_walk = my_own_camper_walk
radius = 1
sniper = true
on_info = {+esc_trader_can_leave} remark@drunk1

[remark@drunk1]
anim = probe_stand
target = 920
combat_ignore_cond = always
danger = danger_condition@yan_ecolog
meet = meet

[danger_condition@yan_ecolog]
ignore_distance = 0

[smart_terrains]
none = true

[meet]
use = false
use_wpn = false
meet_talk_enabled = true

Выйпоинты ставяться свои, там где probe_stand название анимки из state_lib. Правда с нпц нельзя будет поговорить, но это поправимо: use = false поменять на use = true.[/spoiler]

Работа в гулаге для сталкера. Днем он гуляет (walker), а ночью сидит у костра (kamp).

Автор IG-2007

[spoiler]1) Пропишите в all.spawn своему смарту такую custom_data:

custom_data = <<END
[smart_terrain]
type = esc_new_lager
capacity = 1
END

2) Пропишите в all.spawn два пути: один из нескольких точек для схемы walker (esc_new_lager_npc1_walk), другой из одной точки (центр кампа) для kamp (esc_new_lager_npc1_kamp)

3) Откройте файл config\misc\gulag_escape.ltx и добавьте в самый конец работу для своего сталкера:

[logic@esc_new_lager_npc1]
active = walker@esc_new_lager_npc1

[walker@esc_new_lager_npc1]
path_walk = npc1_walk
on_info = {!is_day} kamp@esc_new_lager_npc1

[kamp@esc_new_lager_npc1]
center_point = npc1_kamp
on_info = {=is_day} walker@esc_new_lager_npc1

4) Откройте файл gulag_escape.script и добавьте в него:

4.1) в функцию load_job

if type == "esc_new_lager" then
t = { section = "logic@esc_new_lager_npc1",
idle = 0,
prior = 5, state = {0},
online = false,
in_rest = "", out_rest = ""
}
table.insert(sj, t)
end

4.2) в функцию load_states

if type == "esc_new_lager" then
return function (gulag)
return 0
end
end

4.3) в функцию checkStalker

if gulag_type == "esc_new_lager" then
return npc_community == "stalker"
end[/spoiler]

Настройка SDK от KostyaV

Автор KostyaV

[spoiler]Настройка СДК.
1. Установите СДК на свой компьютер. Лучше полную версию. Читал некоторые отзывы, что облегченная версия глючит.
2. Лучше всего устанавливать СДК по такому адресу (в будущем тогда будет меньше мороки с настройками): C:\Program Files\X-Ray SDK
3. Установите патч для СДК от Neo. Называется SDK Update v 0.1.
4. Возьмите распакованную версию игры Сталкер ТЧ версии 1.0004 (gamedata) и поставьте с заменой в X-Ray SDK\level_editor. Это упростит работу в будущем.
5. Теперь понадобятся инструменты от Бардака xray_re-tools-10sep2008.
6. Из этого набора инструментов необходим сейчас конвертер. С помощью его преобразовываем текстуры деревьев dds2tga. Как - читаем ридми. Необходимо только запустить конвертер на преобразование, остальное он сделает сам. Это необходимо для того, чтобы в СДК появились недостающие текстуры, которых будет много не хватать, если этого не сделать.
7. Открываем СДК. Это делается путем запуска батника LevelEditor в X-Ray SDK\level_editor.
8. Создаем ЛОДы для деревьев. Нажимаем Objects, Library Editor. Открывается окно Object Library. Находим закладку trees\new_trees. Выделяем какой-нибудь куст и нажимаем Make LOD (качество выбираете сами). Открывается окно Select Library Object. Здесь ставим галочки напротив всех деревьев и кустов и нажимаем ОК. Все ЛОДы деревьев готовы. Таким же образом можно сделать ЛОДы камней.
9. Все, теперь камни и деревья настроены.

Настройка конвертера.
Создаем папку X-Ray SDK\converter. Из папки xray_re-tools-10sep2008 от Бардака копируем файлы converter.exe, fsconverter.ltx в эту папку. Это делается для удобства, чтобы все было в одном месте.Файл converter.ini помещаем в папку x-ray sdk\level_editor
Затем настраиваем конвертер.
Если установили СДК, как я говорил в C:\Program Files\X-Ray SDK, то в файле fsconverter.ltx ничего уже настраивать не надо.
В файле converter.ini находим такие строки и исправляем их вот так:

; 2947+ (финалка включая обновления)
[2947_config]:2945_config
$game_data$ = c:\program files\x-ray sdk\level_editor\gamedata\
$game_levels$ = c:\program files\x-ray sdk\level_editor\gamedata\levels\

[aitest_config]:2947_config
$game_data$ = c:\program files\x-ray sdk\level_editor\gamedata\
$game_levels$ = c:\program files\x-ray sdk\level_editor\gamedata\levels\

[3120_config]:2947_config
$game_data$ = c:\program files\x-ray sdk\level_editor\gamedata\
$game_levels$ = c:\program files\x-ray sdk\level_editor\gamedata\levels\

Я не уверен, что это на 100% процентов точно. Но я сделал так и у меня все работает.
Все, теперь конвертер настроен. Как им пользоваться, читаем ридми.

Настройка аиврапера.
Создаем папку X-Ray SDK\aiwrapper. Из папки xray_re-tools-10sep2008 от Бардака копируем файлы aiwrapper.exe, aiwrapper.ini, fsaiwrapper.ltx в эту папку.
Настраиваем аиврапер.
1. Если установили, как говорил выше, то в файле fsaiwrapper.ltx ничего менять не надо.
2. Потом надо скопировать из папки xray_re-tools-10sep2008 папку 2215 в X-Ray SDK\level_editor.

Аивраппер настроен. Можно пользоваться. Как – читаем ридми. Все очень просто, главное соблюдать инструкции.[/spoiler]





-Он счастлив.
-Он мёртв.
# 4
Понедельник, 24.08.2009, 09:28:50

Ранг: Мастер
Сообщений: 2546
Награды: 237
Репутация: 2302 Регистрация: 11.12.2008 Город: Заполярье    

Сегодня посветим наши уроки SDK

Подключение нового уровня к игре (небольшой тутор)

Автор KostyaV
[spoiler]Настало время обобщить уроки по подключению нового уровня к игре.

Для начала скачайте СДК, лучше оригинальную английскую версию.
Затем Глобальный патч v0.3 (14 Feb 2009) для X-Ray SDK v0.4.
Потом инструменты от Бардака по этой ссылке http://stalkerin.gameru.net/index.php Там надо скачать X-ray asset tools pack FINAL окончательная версия пака утилит от bardak'а

Теперь надо настроить СДК и инструменты.

Настройка инструментов

Настройка СДК.
1. Установите СДК на свой компьютер. Лучше полную версию. Читал некоторые отзывы, что облегченная версия глючит.
2. Лучше всего устанавливать СДК по такому адресу (в будущем тогда будет меньше мороки с настройками): C:\Program Files\X-Ray SDK
3. Установите Глобальный патч v0.3 (14 Feb 2009) для X-Ray SDK v0.4
4. Возьмите распакованную версию игры Сталкер ТЧ версии 1.0004 (gamedata) и поставьте с заменой в X-Ray SDK\level_editor. Это упростит работу в будущем.
5. Теперь понадобятся инструменты от Бардака xray_re-tools-10sep2008.
6. Из этого набора инструментов необходим сейчас конвертер. С помощью его преобразовываем текстуры деревьев dds2tga. Как - читаем ридми. Необходимо только запустить конвертер на преобразование, остальное он сделает сам. Это необходимо для того, чтобы в СДК появились недостающие текстуры, которых будет много не хватать, если этого не сделать.
7. Открываем СДК. Это делается путем запуска батника LevelEditor в X-Ray SDK\level_editor.
8. Создаем ЛОДы для деревьев. Нажимаем Objects, Library Editor. Открывается окно Object Library. Находим закладку trees\new_trees. Выделяем какой-нибудь куст и нажимаем Make LOD (качество выбираете сами). Открывается окно Select Library Object. Здесь ставим галочки напротив всех деревьев и кустов и нажимаем ОК. Все ЛОДы деревьев готовы. Таким же образом можно сделать ЛОДы камней.
9. Все, теперь камни и деревья настроены.

Настройка конвертера.
Создаем папку X-Ray SDK\converter. Из папки xray_re-tools-10sep2008 от Бардака копируем файлы converter.exe, fsconverter.ltx в эту папку. Это делается для удобства, чтобы все было в одном месте.Файл converter.ini помещаем в папку x-ray sdk\level_editor
Затем настраиваем конвертер.
Если установили СДК, как я говорил в C:\Program Files\X-Ray SDK, то в файле fsconverter.ltx ничего уже настраивать не надо.
В файле converter.ini находим такие строки и исправляем их вот так:

; 2947+ (финалка включая обновления)
[2947_config]:2945_config
$game_data$ = c:\program files\x-ray sdk\level_editor\gamedata\
$game_levels$ = c:\program files\x-ray sdk\level_editor\gamedata\levels\

[3120_config]:2947_config
$game_data$ = c:\program files\x-ray sdk\level_editor\gamedata\
$game_levels$ = c:\program files\x-ray sdk\level_editor\gamedata\levels\

Все, теперь конвертер настроен. Как им пользоваться, читаем ридми.

Настройка аиврапера.
Создаем папку X-Ray SDK\aiwrapper. Из папки xray_re-tools-10sep2008 от Бардака копируем файлы aiwrapper.exe, aiwrapper.ini, fsaiwrapper.ltx в эту папку.
Настраиваем аиврапер.
1. Если установили, как говорил выше, то в файле fsaiwrapper.ltx ничего менять не надо.
2. Потом надо скопировать из папки xray_re-tools-10sep2008 папку 2215 в X-Ray SDK\level_editor.

Аивраппер настроен. Можно пользоваться. Как – читаем ридми. Все очень просто, главное соблюдать инструкции.

Теперь можно приступить к подготовке уровня к компиляции. Я сейчас обобщаю эту информацию. Для более подробного изучения надо прочитать вот эту статью: http://tinyurl.com/b3osf3

Подготовка уровня

1. Сделайте в 3Д редакторе какой-нибудь террейн. Затекстурьте его и эспортируйте в СДК.
2. Открываем наш новый уровень в Левел Едиторе.
3. Заходим в Scene\Options и меняем Name prefix и Level path на нужные нам названия. Выбираем Quality.
4. Добавляем Glow. Назначаем ему текстуру.
5. Затем жмем Edit Mode\Light и добавляем Light на уровень. Можно поставить 3 штуки в разных углах и хватит.
6. Далее добавляем переход с уровня.
Edit Mode\Spawn Element\ai\level changer и ставим этот level changer в любом месте, где хотим сделать переход. Потом жмем Edit Mode\Shape выбираем,
допустим, сферу и ставим ее в том же месте, где и level changer. Затем обратно на Edit Mode\Spawn Element и нажимаем Commands\Attach Object, а потом опять на сферу. После этого сфера и level changer объединяться.
7. Теперь нажимаем на level changer правой кнопкой мыши и выбираем properties. В нем выбираем в Level to change уровень, на который хотим перейти. В Level point to change пишем start_actor_01. Заходим в custom data перехода и пишем там:
[pt_move_if_reject]
path = название уровня_way_if_reject

8. Нажимаем Edit Mode\Way Points, ставим 1 вейпоинт рядом с level changer, теперь жмем point mode и ставим второй. Теперь у нас получился путь, который мы прописали в custom data level changer, заходим в свойства и обзываем его также как и в custom data, то есть название уровня_way_if_reject.
9. Расставляем графпоинты.
Edit Mode\Spawn Element\ai\graph point. Ставим один графпоинт рядом с переходом и в свойствах прописываем ему название start_actor_01.
10. Далее расставляем графпоинты по уровню. Необходимо ставить их там, где предполагаются места стоянок, а также по периметру уровня.
11. Далее идем в Edit Mode\Spawn Element\weapons и спавним рядом со вторым вейпоинтом, который до этого создали, какое-нибудь оружие (например, винторез). Это надо для того, чтобы позже, когда скомпилируем уровень, снять координаты места перехода на эту локацию.
12. Теперь надо сделать АИ-сетку.
Нажимаем Edit Mode\Object и выделяем все объекты на уровне. Далее Edit Mode\AI Map и вносим все выделенные объекты в список. Snap List\Comands\Add Selected To List.
Расставляем АИ-ноды по уровню. Необходимо поставить везде по одному АИ-ноду, где предполагается наличие каких-нибудь спавн-объектов.
После расставления нажимаем Generate Full.
13. Все, приготовления закончились. Теперь начнем компиляцию.

Компиляция

1. В СДК делается Make Game, Make AI Map, Make Details, Build этого уровня.
2. Затем делаем компиляцию xr LC, xrDo_light
3. Далее прописываем в конфигах свой уровень. Прописать надо в файлах game_graphs.ltx, game_levels.ltx, game_maps_single.ltx
4. Теперь переходим к работе с аиврапером. Можно или через команду cmd выйти в папку с аивраппером, или Тотал Коммандером открыть эту папку. И потом вводить в командную строку нужные команды.
5. Сначала надо ввести команду aiwrapper -split_spawns. Зачем - читаем ридми к аиврапперу.
6. А потом выполнить последовательно команды из ридми от Бардака для аивраппера.

Цитата
3) Сборка черновой сетки ИИ:
> aiwrapper -draft -f <имя_уровня>
На выходе: gamedata\levels\<имя_уровня>\level.ai.
4) Проверка связности сетки ИИ:
> aiwrapper -verify <имя_уровня>
В случае ошибки поправить ячейки в LE и повторить с п.2.
5) Просчёт укрытий для сетки ИИ. Предварительно необходимо произвести
сборку геометрии для получения build.cform (xrLC, здесь это не
рассматривается). Команда:
> aiwrapper -f <имя_уровня>
Вообще, этот шаг необязателен на ранних этапах тестирования карты.
6) Сборка ИИ-графа:
> aiwrapper -g <имя_уровня>
На выходе: gamedata\levels\<имя_уровня>\level.{graph|gct.raw}
7) Склейка ИИ-графов карт в глобальный игровой граф:
> aiwrapper -m
На выходе: gamedata\game.graph и gamedata\levels\*\level.gct
(см. ниже для случая с картами без исходников)
8) Сборка all.spawn
> aiwrapper -s
На выходе: gamedata\spawns\all.spawn

Все карта скомпилирована. Теперь надо собрать геймдату своего уровня.
Обязательно необходимо скопировать из level_editor\gamedata в свою геймдату следующие файлы:
- config\game_graphs.ltx, config\game_levels.ltx, config\game_maps_single.ltx
- spawns\all.spawn (только предварительно надо добавить в этот all.spawn переход на новую локацию со старой локации, с которой хотим заходить на нее. А также в переходах с новой локации надо прописать точку выхода на старой локации.)
- из папки levels необходимо скопировать в соответствующие папки файлы level.gct для каждого уровня. И не забыть из этой же папки скопировать папку с новым уровнем.
- game.graph
- в папку textures скопировать все свои новые текстуры, которые использовали для своего уровня. Также скопировать файл textures.ltx

Теперь получившуюся папку gamedata помещаем в папку с игрой и запускаем новую игру. Все.

Вроде все. Осталось опробовать это на деле и задавать вопросы, если что не получается.[/spoiler]

Декомпиляция уровней в формат СДК

[spoiler]Итак пытаюсь очень подробно расписать процесс декомпиляции уровней в формат СДК,надеюсь все те кто не мог понять теперь разберется. Расписываю по пунктам:

1)Распаковать утилиту Бардака в нужную папку

2)Там находим и открываем любым текстовым редакором converter.ini в нем находим строчки:

2947+ (финалка включая обновления)

[2947_config]:2945_config $game_data$ = c:\temp\1\gamedata.3312\ $game_levels$ = c:\temp\1\gamedata.3312\levels\

3456+ (Clear Sky включая обновления)

[3456_config]:2947_config $game_data$ = c:\temp\1\gamedata.3502\ $game_levels$ = c:\temp\1\gamedata.3502\levels\ fake_mu_gamemtls = 34xx_fake_mu_gamemtls fake_gamemtls = 34xx_fake_gamemtls Тут $game_data$-путь до gamedata и $game_levels$-до папки levels в gamedata соответственно.

3)Находим fsconverter.ltx там находим строчку : $sdk_root$ = false| false| c:\program files\x-ray sdk\level_editor\ где $sdk_root$ путь до полного СДК(покоцанный не работает нормально с этой утилитой)т.е. после строчек false| false| пишем полный путь и именно со строчкой level_editor\ в конце как на примере(многие забывают).

4)Ну вот конвертер полностью настроен теперь ключь для конвертирования в формат СДК: Для этого создаем текстовой фаил в него вписываем этот параметр и меняем формат(переименованием)с .txt на .bat. converter -level <имя_карты> -out <имя_сцены> -mode le pause где <имя_карты> точное название папки с картой пример:l08_yantar(локация янтарь из ТЧ), <имя_сцены> то как карта будет назваться после конвертирования, можно не писать в этом случае карта будет называться также как и до конвертирования в нашем случае l08_yantar,ну и ключь mode в нашем примере le т.е. конвертирование карты в формат СДК,также можно использовать ключи maya(Конвертирование геометрии в формат Майи),le2(Формат использующийся для карты l12_stancia_2(может быть еще для каких не проверял)),raw(Опять же формат СДК но уже в отладочном режиме).

5)ну вот если все сделанно правильно после запуска батника пойдет процесс декомпиляции.

6)Найти карту можно будет по адресу $sdk_root$\maps-фаил читаемый СДК и $sdk_root$\rawdata\objects\levels обьекты используемые данным уровнем. [/spoiler]





-Он счастлив.
-Он мёртв.
# 5
Пятница, 28.08.2009, 13:11:40

Ранг: Мастер
Сообщений: 2546
Награды: 237
Репутация: 2302 Регистрация: 11.12.2008 Город: Заполярье    

Добавление Режима Freeplay в игру

[spoiler]Делается это так: в файле xr_effects.script
ищем строку :function after_credits(actor, npc)
и ниже находим вот что c:execute("disconnect")

Меняем "disconnect" например на hud_crosshair 1
и все вместо того чтобы после концовок (похоже даже фальшивых) будет возможно продолжить игру...

Только осталось добавить level_changer (например на Припять и все freeplay работает.)[/spoiler]

Добавление в главное меню нескольких фоновых мелодий

[spoiler]Данный урок довольно прост.
Для реализации сего дива нам понадобится парочка музыкальных треков (music_1, music_2...), предварительно разбитых на два моно канала и переведенных в OGG формат с частотой 44kHz(64kbps). В этом может помочь Adobe Audition 2.0(по крайней мере я ним пользуюсь).
Также есть еще один вариант: Если уж очень лень - Музычку можно вытащить из различных МОДов, обычно в каждом, разработчики, как правило, засовывают новую музыку, которая лежит в "gamedata\sounds\music".
И так берем наши OGG треки и засовываем, в выше указанную папку, gamedata\sounds\music, не забывая про то, что каждая дорожка должна состоять из левого и правого моно канала "magnitofon_l.ogg" - левый канал и "magnitofon_r.ogg" - правый!
Причем количество дорожек не ограничено .
Далее нам понадобится ui_mm_main.xml, который лежит в "gamedata\config\ui" и находим там вот такой текст:
Код
<menu_sound random="0" >
<!--whell_sound>car\apc_run</whell_sound>
<whell_click>car\test_car_stop</whell_click-->

<menu_music>music\Terrapack-Empty_noise</menu_music>

<!--menu_music>music\guitar_2</menu_music>
<menu_music>music\guitar_1</menu_music>
<menu_music>music\guitar_3</menu_music-->

</menu_sound>

И проводим с ним некоторые манипуляции:
1. - В строчке
Код
<menu_sound random="0" >
и цифру "0" меняем на число соответствующие количеству наших муз. композиций, правда на одну единицу больше.
2. - Далее после строчки
Код
<menu_music>music\Terrapack-Empty_noise</menu_music>
ниже, на ее примере прописываем новые композиции
Код
<menu_music>music\music_1</menu_music>

И в конечном итоге получится примерно так
Код
<menu_sound random="7" >
<!--whell_sound>car\apc_run</whell_sound>
<whell_click>car\test_car_stop</whell_click-->

<!--whell_sound>car\apc_run</whell_sound>
<whell_click>car\test_car_stop</whell_click-->
<menu_music>music\Terrapack-Empty_noise</menu_music>
<menu_music>music\music_1</menu_music>
<menu_music>music\music_2</menu_music>
<menu_music>music\music_3</menu_music>
<menu_music>music\music_4</menu_music>
<menu_music>music\music_5</menu_music>
<!--menu_music>music\guitar_2</menu_music>
<menu_music>music\guitar_1</menu_music>
<menu_music>music\guitar_3</menu_music-->

</menu_sound>

Сохраняем. И теперь при каждом входе в главное меню у нас будут играть радомно 7 музыкальных композиций![/spoiler]

Немного о Худе


Автор: Serafim12
[spoiler]Раздел первый:файлы.
Для работы над худом нам нужны следующие файлы(не обязательно все конешно)
Текстуры:
Папка - textures\ui
Файлы + описание:
1- ui_hud.dds (собственно опорный файл содержащий почти все текстуры худа)
2 - cursor.dds (текстура причела без оружия в руках,попросту кругляшка)
3 - hud_map_arrow.dds (стрелка компаса)
Конфиги:
Папка - config\ui
Файлы + описание:
1 - maingame.xml (содержит конфиги индикаторов здоровья и состояния брони,индикаторов состояния ГГ(радиация,поломка оружия и тп) , окно патронов и всё с ним связаное,пояс артефактов ,мигающая иконка ПДА и кол во контактов. Так же состояние машины)
2 - motion_icon.xml (содержит конфиги положения ГГ (сидит,стоит и тп) ,а так же полоски выносливости,уровня шума и заметности ГГ.)
3 - ui_custom_msgs.xml (часы + всякая лабуда типо укусов...вообщем худы повреждений)
4 - zone_map.xml (собственно миникарта + компас)

Собственно это стандартный набор...он естественно не полный...есть ещё пара конфигов .... типо координаты новостей на худе...но они редко правятся.

Раздел второй:правка конфигов.

Открываем файлик maingame.xml

Что там есть:
<static_health - положение "колбы" здоровья
<progress_bar_health - полоска здоовья

<static_armor - положение "колбы" состояния брони.
<progress_bar_armor - полоска брони

<static_weapon - окно патронов + тип патронов
<static_ammo - количество патронов
<static_wpn_icon - иконка коробки от патронов
<car_panel - состояние машины
<static_pda_online - счётчик контактов
<quick_info - задания и всякая лабуда типо обучения в начале игры.
<icons_scroll_view - список индикаторов состояния ГГ (радиация,голод и тп.)Далее идёт сам список,НО он не поддаётся правке индивидуально. Правим только всё сразу строчкой упомянутой выше.

<flashing_icons> - мигющий ПДА
<pick_up_item - "поднять предмет"
<artefact_panel - панелька артов.

__________________________________

Файл motion_icon.xml

Что мы видим в нём:
<background - текстура на которой будет всё отображаться

Список иконок положения ГГ:
начиная от <state_normal> и заканчивая <state_sprint>

<power_progress - полоска выносливости
<luminosity_progress - полоска заметности ГГ
<noise_progress - полоска издаваемого шума

__________________________________

Файл ui_custom_msgs.xml
Что имеется:

<hud_timer - часы
<controller_fx - худ поареждения от контролёра
<monster_claws - худ повреждения от мутанта(царапины)
<main_task - "главное задание"
<cs_psy_danger - предупреждение о сильном излучении
<cs_radiation_danger - предупреждение о высоком уровне радиации
<game_saved - "игра сохранена"
<autosave - "автосохранение"
<item_used - "использован .... " (аптечка и тп)
<gun_jammed - "оружее заклинило"
<cant_walk - "вы слишком истощены"
<cant_walk_weight - "вы перегружены"
<not_enough_money_mine - у ГГ не хватает денег
<not_enough_money_other - у НПС не хватает денег

Далее идут строчки с координатами сообщений связаных с пингом.(разбирать МП не буду)

__________________________________

Файл zone_map.xml
Тут всё просто:

<level_frame - сама карта
<background - рамка карты
<dist_text - расстояние до цели
<compass - думаю понятно что это biggrin.gif
<center - хз что это..предполагаю что реч о точках на миникарте

__________________________________

Советы:
Если вам нужно убрать текстуру - просто убираем в конфиге путь к текстуре.
Если нужно убрать текст - либо убираем сам текст либо ставим а="0"
Многие элементы передвигаются в связке.К примеру патроны - окно,количество и иконку можно двигать меняя координаты окна.Координаты остального подразумеваются в рамках размера окна(а не всего экрана)
[/spoiler]





-Он счастлив.
-Он мёртв.
# 6
Понедельник, 14.09.2009, 18:29:54

Ранг: Мастер
Сообщений: 2546
Награды: 237
Репутация: 2302 Регистрация: 11.12.2008 Город: Заполярье    

Немного о утилите от бардака и декомпиляции уровня





-Он счастлив.
-Он мёртв.
# 7
Воскресенье, 20.09.2009, 10:37:02

Ранг: Мастер
Сообщений: 700
Награды: 89
Репутация: 1753 Регистрация: 03.06.2009 Город: vladis planet    

Вот самые легкие моды



VLADIS MOD

Сообщение отредактировал vladis98 - Воскресенье, 20.09.2009, 10:43:03
# 8
Среда, 23.09.2009, 14:10:29

Ранг: Мастер
Сообщений: 2546
Награды: 237
Репутация: 2302 Регистрация: 11.12.2008 Город: Заполярье    

Справочник вылетов игры и их причин




-Он счастлив.
-Он мёртв.
# 9
Воскресенье, 27.09.2009, 16:08:57

Ранг: Мастер
Сообщений: 700
Награды: 89
Репутация: 1753 Регистрация: 03.06.2009 Город: vladis planet    

как создать свой артефакт

Добавлено (26.09.2009, 16:18:55)
---------------------------------------------
как изменить носимый вес

Добавлено (26.09.2009, 16:20:46)
---------------------------------------------
сделат бессмертие

Добавлено (26.09.2009, 16:22:54)
---------------------------------------------

Добавлено (26.09.2009, 16:42:16)
---------------------------------------------
замена текстур

Добавлено (27.09.2009, 16:08:57)
---------------------------------------------
езда на машинах



VLADIS MOD

Сообщение отредактировал vladis98 - Суббота, 26.09.2009, 16:44:29
# 10
Воскресенье, 11.10.2009, 14:03:46

Ранг: Мастер
Сообщений: 2546
Награды: 237
Репутация: 2302 Регистрация: 11.12.2008 Город: Заполярье    

Настройка converter.ini под ЧН для распаковки локаций

Автор - KostyaV
Правка - уа





-Он счастлив.
-Он мёртв.
# 11
Вторник, 20.10.2009, 15:57:11

Ранг: Мастер
Сообщений: 2546
Награды: 237
Репутация: 2302 Регистрация: 11.12.2008 Город: Заполярье    

Строение текстур рельефа в игре

Автор: Argus

Создание текстур рельефа bump и bump#
Автор: Argus




-Он счастлив.
-Он мёртв.
# 12
Воскресенье, 25.10.2009, 06:44:08

Ранг: Мастер
Сообщений: 2546
Награды: 237
Репутация: 2302 Регистрация: 11.12.2008 Город: Заполярье    

Создание бесшовных текстур. Часть 1
Автор: Argus


Создание бесшовных текстур. Часть 2

Автор: Argus





-Он счастлив.
-Он мёртв.
# 13
Воскресенье, 25.10.2009, 06:51:23

Ранг: Мастер
Сообщений: 2546
Награды: 237
Репутация: 2302 Регистрация: 11.12.2008 Город: Заполярье    

Работа с форматом .dds

Автор: Argus





-Он счастлив.
-Он мёртв.
# 14
Понедельник, 02.11.2009, 16:42:51

Ранг: Мастер
Сообщений: 2546
Награды: 237
Репутация: 2302 Регистрация: 11.12.2008 Город: Заполярье    

Как прикрепить карту локации на глобальную карту в ПДА
Авторы Руся и ХМК
Теория

Практика





-Он счастлив.
-Он мёртв.
# 15
Среда, 23.12.2009, 23:20:09

Ранг: Охотник
Сообщений: 989
Награды: 64
Репутация: 3055 Регистрация: 27.06.2009 Город: Дндз    

Создание квестов (базовый уровень)
Авторы
XiaNi,Keha,BAC9-FLCL

Добавлено (23.12.2009, 23:20:09)
---------------------------------------------
Мануал по созданию модификаций для начинающих.Часть 1.
Автор: Alex[_LP_

Мануал по созданию модификаций для начинающих.Часть 2.



Кажется, что-то пошло не так..
# 16
Суббота, 09.01.2010, 12:20:11

Ранг: Мастер
Сообщений: 2546
Награды: 237
Репутация: 2302 Регистрация: 11.12.2008 Город: Заполярье    

Добавляем новую группировку в Зов Припяти
Автор: Vano_Santuri (???)




-Он счастлив.
-Он мёртв.
# 17
Суббота, 09.01.2010, 12:22:39

Ранг: Мастер
Сообщений: 2546
Награды: 237
Репутация: 2302 Регистрация: 11.12.2008 Город: Заполярье    

Разбор системы квестов в S.T.A.L.K.E.R. Зов Припяти
Автор: Xmk
Параметры





-Он счастлив.
-Он мёртв.
# 18
Суббота, 10.07.2010, 09:54:47

Ранг: Новичок
Сообщений: 33
Награды: 5
Репутация: 7 Регистрация: 01.07.2010 Город: Ставропольский край    

Работа с all.spawn
# 19
Пятница, 06.08.2010, 11:30:30

Ранг: Разведчик
Сообщений: 252
Награды: 8
Репутация: 57 Регистрация: 20.05.2010 Город: Казань    

Я полазил в нете и нашел интересный файл который добавляет 4 новых опции в игру


В разработке I.T.S. mod v2.0

Сообщение отредактировал [STREL0K] - Суббота, 07.08.2010, 11:59:10
# 20
Среда, 25.08.2010, 02:15:16

Ранг: Прибывший
Сообщений: 16
Награды: 1
Репутация: -2 Регистрация: 02.06.2010 Город: Cаратов    

Урок по созданию нового калибра

автор я


_!

Сообщение отредактировал stаrt - Среда, 25.08.2010, 02:59:21
Форум настоящего сталкера » S.T.A.L.K.E.R. Тень Чернобыля » Теория модостроения » Маленькие уроки по модостроению
  • Страница 1 из 3
  • 1
  • 2
  • 3
  • »
Поиск:
Вверх
Правила чата
Мини-чат
+Мини-чат
0