Вход в бар
 
Сталкер! Если ты пришел в
Бар "100 рентген"
впервые - оформи пропуск.
Если же ты наш постоянный посетитель - представься и можешь войти.
Музыка Зоны
Общий канал
"Энциклопедия зоны"
Энциклопедия зоны
Что ищем?
Наша кнопка
Территория бара «100 рентген»

Если вы хотите обменяться баннерами с нашим сайтом - Подайте заявку в разделе "Партнеры" и поставьте нашу кнопку на свой сайт.
Друзья сайта
Сталкинг во мне
База отдыха «СТАЛКЕР» Book Mod
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 2
  • 1
  • 2
  • »
Модератор форума: ЛЕШИЙ  
Бар » Общий зал » Games » Модостроение (Самое простое)
Модостроение
Холод Дата: Пятница, 08.06.2012, 09:42 | Сообщение # 1

Ранг: Новичок
Сообщений: 96
Награды: 6
Уважение: 83
Статус: Вне Зоны
Многие задавали вопросы такого плана: как увеличить прыжок, как увеличить максимальный носимый вес, как увеличить обойму. Отвечаю полностью на все.
НО сделать свой мод могут только те, у кого игра разархивирована, т.е. имеется папка gamedata. Если её нету, скачайте программу для разархивации файлов игры ( скачайте прогрмму SUE.exe, там имеются все папки и файлы для всех трех игр)
Так вот вам понадобится папка gamedata и умение работать в блокноте.
Как увеличить скорость передвижения:
Открываем все тот же файл actor.ltx, находим строчки:
run_coef - строчка содержит параметр простого бега (а точнее ходьбы)
sprint_koef - строчка содержит параметр спринта (бег при нажатии клавишы Х)
run_back_coef - строчка указывает параметр ходьбы назад
walk_back_coef - строчка указывает параметр ходьбы назад при зажатой клавише shift.
Как хотите, так и изменяйте.
Как увеличить максимальный носимый вес:
Заходим сюда gamedata\config находим файл system.ltx в нем строчку max_weight - она указывает какой максимальный вес вы можете носить так, что при этом вы сможете бегать спринт с минимальной потерей выносливости. Ставьте сколько хотите. Далее заходим опять сюда gamedata\config\creatures опять находим файл actor.ltx в нем строчку max_walk_weight - эта строчка указывает, после какого веса вы не сможете передвигаться а тупо встанете на месте с вежливой надписью внизу выбросить что-то. Ясное дело, что параметр этой строчки должен быть больше параметра строчки max_weight в файле system.ltx.
Как увеличить обойму вашего любимого ствола:
Заходим сюда gamedata\config\weapons находим файл с вашим любимым оружием. Например w_abakan.ltx в нем строчку ammo_mag_size – именно она указывает сколько патронев в вашем магазине. Думаю, в пределах разумного поставить 50-60 единиц. Также вы можете понизить износ вашего оружия строчка condition_shot_dec (разрабы даже потрудились написать напротив неё что она обозначает ) добавьте после точки побольше нулей или вообще поставьте там всего один нуль, тогда ваще оружие будет бессмертно.
Как проапгрейдить вашу любимую пижамку:
Забираемся сюда gamedata\config\misc находим файл outfit.ltx, в нем находим ваш любимый костюмчик. Например вы любите куртку сталкера – костюм новичка
Ищем строчки:
burn_protection - защита от огня
strike_protection - защита от удара
shock_protection - защита от электрического удара
wound_protection - защита от разрыва
radiation_protection - защита от радиации
telepatic_protection - защита от телепатических волн
chemical_burn_protection - защита от химических реактивов
explosion_protection - защита от взрыва
fire_wound_protection - защита от выстрела
значение 0.0 говорит о том что от костюм ни на сколько процентов не защищает вас от такого воздействия, значение 1.0 обозначает что ваш костюм на 100 % защитит вас от этого недуга.
Далее чтоб понизить износ костюма ищем строчки:
burn_immunity
strike_immunity
shock_immunity
wound_immunity
radiation_immunity
telepatic_immunity
chemical_burn_immunity
explosion_immunity
fire_wound_immunity
все эти строчки соответственно показывают защищенность самого костюма от воздействий.
Чем больше нулей после точки тем больше костюм устойчив к эдакой заразе. Ставить только нули не советую.
Есть ещё масса методов изменить игру под вас но всех их не рассказать
Одно главное правило: не удаляйте никаких точек, запятых, скобочек, ибо, если они там стоят значит это кому-нибудь нужно.


 
Холод Дата: Пятница, 08.06.2012, 09:47 | Сообщение # 2

Ранг: Новичок
Сообщений: 96
Награды: 6
Уважение: 83
Статус: Вне Зоны
Теперь немного про оружие
На примере того же Абакана:
gamedata\config\weapons файл по вашему желанию. Наше желание остановилось на w_abakan.ltx. Строчка ammo_class – можно перепрошить патроны для ствола на любые по желанию, главное правильно их прописать (именно так сделано для уникальных пушек).
Строчка grenade_class – можно перепрошить гранаты для подстволки. Гранат для натовского оружия дефицит, поэтому можно прописать натовским стволам гранаты от советских пушек.
Строчка inv_weight – если вам совесть не позволяет увеличить максимальный носимый вес, но вы любите таскать много стволов, то можно уменьшить параметр этой строчки, ибо он означает вес оружия.
Строчка cam_dispersion - содержит параметр показывающий так называемую вертикальную отдачу. Какая там стоит цифра, на такое кол-во градусов увеличивается угол при каждом вылете пули. Можно понизить этот параметр путем добавления нулей после точки. Тогда ствол будет меньше скакать в руках.
Строчка condition_shot_dec - как я говорил уже, содержит параметр, указывающий на сколько единиц будет ваше оружие портиться при каждом выстреле. Лучше понизить путем добавления нулей после точки.
Строчка hit_power содержит параметр, указывающий какой размер дырки от пули будет в том в кого вы стреляли из этого ствола. Это один из тех важных параметров, повышающих мощность оружия, но в косвенном смысле: чем больше дыра тем быстрее дохнет жертва.
Строчка bullet_speed содержит начальную скорость, с которой пуля покидает ствол оружия. Изменять её надо с осторожностью и в комплексе с другими параметрами, ибо вместо желаемого можно добиться обратного эффекта.
Вот эти строки для отличных эффектов:
light_color - цвета пламени при выстреле
light_range - радиус пламени
light_var_color - цвет варьирующий среди представленных
light_var_range - радиус варьирующего цвета
light_time - время
Впринципе, этого хватит, для начала.


 
Холод Дата: Пятница, 08.06.2012, 09:53 | Сообщение # 3

Ранг: Новичок
Сообщений: 96
Награды: 6
Уважение: 83
Статус: Вне Зоны
Как добавить эффект лечения у пищи?
Отвечаю
Сейчас вы узнаете, как убрать или добавить эффект лечения у пищи, как изменить её сытность.

Открываем gamedata\config\misc\items.ltx.
Там сразу по порядку идет перечисление пищи. Название еды ищите в строчках типа [kolbasa]:identity_immunities.
Смотрим в конфигах для найденного типа пищи. Для той же колбасы видим такие строки:
GroupControlSection= spawn_group
discovery_dependency =
$spawn = "food and drugs\kolbasa"
$prefetch = 8
class = II_FOOD
cform= skeleton
visual= weapons\kolbasa\kolbasa.ogf
description = enc_equipment_food_kolbasa1

inv_name = Kolbasa
inv_name_short= Kolbasa
inv_weight = 0.5

inv_grid_width = 1
inv_grid_heigt = 1
inv_grid_x = 19
inv_grid_y= 12
cost = 50

attach_angle_offset = 0.440521, 1.378287, -0.644026
attach_position_offset= 0.104196, -0.010821, 0.076969
attach_bone_name = bip01_r_hand
auto_attach= false

// should be deleted after update
bone_name = bip01_r_hand
position_offset= 0.0,0.0,0.0
angle_offset= 1.570790,1.570790,3.92699

; eatable item
eat_health = 0.1
eat_satiety = 0.3
eat_power = 0
eat_radiation = 0
wounds_heal_perc = 0
eat_portions_num = -1

Выделенные красным строки нам и нужны. Параметр eat_health отвечает за восстановление здоровья при съедении - повышаем или понижаем его. Параметр eat_satiety отвечает за убавление голода. Редактируем...
Также есть интересный параметр eat_radiation - он отвечает за убавление радиации при съедении пищи.

вот и все.


 
Холод Дата: Пятница, 08.06.2012, 09:56 | Сообщение # 4

Ранг: Новичок
Сообщений: 96
Награды: 6
Уважение: 83
Статус: Вне Зоны
Теперь, как добавить вид от третьего лица?

Так же всем тем,кто хочет играть от 3-его лица делаем так:
в папке Documents and Settings/All Users/Общие документы/STALKER-SHOC,а в ней файл user.ltx,открываем его блокнотом и прописываем в самом конце эти строчки:
bind cam_1 kF1
bind cam_2 kF2
bind cam_3 kF3
bind cam_4 kF4
Теперь играем и клавишами F1,F2,F3,F4 меняем позицию камеры на вид от третьего лица.

Все очень легко и просто)


 
Холод Дата: Пятница, 08.06.2012, 10:01 | Сообщение # 5

Ранг: Новичок
Сообщений: 96
Награды: 6
Уважение: 83
Статус: Вне Зоны
Теперь по поводу ячеек для артов

Например,увеличим число артефактов с 5 до 16
inventory_new.xml и system.ltx
В system.ltx изменяем только параметр max_belt с 5 на 16
В inventory_new.xml
<dragdrop_belt x="590" y="118" width="410" height="104"
cell_width = "52" cell_height="52" rows_num="2" cols_num="8"/>

dragdrop_belt - эта параметры слотовой сетки ремня
<x y> - координаты ее расположения
<width,height> - ее размеры
<cell_width cell_height> - размеры одной ее ячейки
<rows_num cols_num> - число строк и столбцов в ней

     вроде все


 
Холод Дата: Пятница, 08.06.2012, 10:29 | Сообщение # 6

Ранг: Новичок
Сообщений: 96
Награды: 6
Уважение: 83
Статус: Вне Зоны
Создание особого оружия

ЛАЗЕРНАЯ ВИНТОВКА

Теперь займемся созданием футуристических стволов. Первый из них - лазерная винтовка. Делать её мы будем на основе снайперки СВУмк2, которая детально описана в файле w_svu.ltx. Начните опять же с цены, подняв число, соответствующее показателю cost, до 12000. А вот запас патронов следует ограничить, задав характеристикам ammo_limit, ammo_current, ammo_mag_size и startup_ammo значения 40 (первой из них) и 6 (остальным трем.
Не помешает также чуточку утяжелить винтовку (пропишите параметру inv_weight значение 5.2) и усилить её ( в этом нам поможет регулировка параметров hit_power и hit_impulse). Первой теперь должно соответствовать значение 1.20, 1.30, 1.40, 1.50, а второй - 180. Скорость полета снаряда и дальность стрельбы тоже увеличиваем: параметрам bullet_speed и fire_distance пропишите 1130. А вот скорострельность (rpm) лучше снизить до 150.
Ослабим у пушки зум, приписав атрибуту scope_zoom_factor число 30 - увеличение из трехкратного станет двухкратным. Значение же показателя shell_particles следует обнулить, удалив прежнее weapons\generic_shells. В результате при стрельбе из винтовки больше не будут видны падающие на землю гильзы, что нам и нужно. Стреляет-то она теперь лазером. Наконец, слегка повысьте быстроту изнашиваемости ствола: у показателя condition_shot_dec пропишите число 0.00035. Лазерная винтовка готова. Она дает большой урон, имеет высокую точность стрельбы, бешеную скорость полета заряда, но вот перезарядка происходит медленно. Это открывает совершенно новые тактики ведения боя. Можно притаиться за каким-либо сооружением, стоящим на возвышенности, дождаться группы бандитов, подпустить их на дистанцию выстрела и начать постепенно отступать, отстреливая догоняющих вас врагов.
До этого подобная тактика со снайперкой не работала, потому что бегущие впереди противники догоняли вас раньше, чем вы их уничтожали. Но с лазерной винтовкой можно убивать незащищенных врагов с одного выстрела. Главное, научиться метко стрелять.
А вот пытать засесть с лазерной винтовкой на верхотуре явно не стоит. Из-за того, что она долго перезаряжается, враги успеют подобраться к вам в промежутке между выстрелами.

АТОМНАЯ ПУШКА
На десерт у нас атомная пушка. Её мы получим из ракетницы (РПГ-7у). Следовательно, править нужно файл w_rpg7.ltx, и первое, что стоит сделать, - поднять цену на оружие (cost) до 14000. Показателю ammo_limit следует придать значение 10, дабы понизить скорость полета снаряда, к характеристикам launch_speed, bullet_speed и fragment_speed подставьте соответственно числа 3, 5 и 30. Скорострельность тоже снижаем: сбавляем обороты параметра rpm до отметки 100, а дальнобойность (fire_distance) уменьшаем до 300.
Теперь поработаем над отдачей. У столь мощной пушки она должна быть весьма ощутимой. Посему настройкам cam_relax_speed, cam_dispersion и cam_max_angle следует задать значения 1, 8 и 12 соответственно.
Но баланс пока все равно остается перекошенным: слишком уж мощная штука у нас получилась. Добавим стволу ещё один серьёзный недостаток - сделаем его быстро изнашиваемым. Атрибуту condition_shot_dec логично будет поставить значение 0.00150. Кроме того, вероятность осечки при максимальном износе (misfire_probability) надо сделать равной 0.01. Понятно, что вес у громоздкой новинки будет соответствующий: этого можно добиться, прописав показателю inv_weight число 8.
Повреждения же от новой пушки будут поистине громадными. Задайте параметрам hit_power, hit_impulse и explode_duration значения 5, 600 и 8. Также необходимо отредактировать третий раздел файла wpn_rpg7_missile (все оставшиеся изменения производите именно в нем), характеризующие непосредственно ракету. Здесь вы снова встретите показатель explode_duration, которому и в этот раз надо присвоить значение 8. Чтобы сделать взрыв ракеты ещё более мощным, "привяжите" к настройке blast число 8, к blast_impulse - 450, а чтобы расширить его радиус - увеличте показатель blast_r до 18.
Рекоммендуем сделать взрыв более эффектным. В этом вам поможет изменение значений параметров light_range и light_time соответственно на 50 и 2.6. Это сделает вспышку после разрыва снаряда более длительной и яркой. Увеличению не помешало бы подвергнуть и следы на стенах, остающиеся после взрыва: задайте атрибуту wm_size значение 0.3.
Напоследок установите цену на снаряд (cost) в размере 300 рублей. Получившееся орудие убийства будет в игре на вес золота - по убойной силе ему просто нет равных. Один выстрел - и вокруг остаются только горы трупов.
С этим тоже все


 
Холод Дата: Пятница, 08.06.2012, 10:37 | Сообщение # 7

Ранг: Новичок
Сообщений: 96
Награды: 6
Уважение: 83
Статус: Вне Зоны
Добавление статей в ПДА

• Добавим в файл config\gameplay\encyclopedia_zone.xml новую статью: 
    <!-------------------------------- Activation - Basic ----------------------------->

    <article id="zone_anomalies_activation_basic" name="zone_anomalies_activation-basic" group="Anomalies">
<texture x="500" y="150" width="100" height="100">ui_icon_photo</texture>
        <text>enc_zone_anomalies_activation_basic</text>
    </article>
Здесь: 

o article id - внутреннее имя статьи, именно на него ссылаются в файлах игры 
o name - имя статьи, отображаемое в игре, подгружается из строкового массива 
o texture - картинка и её позиция в статье, в данном случае мы использовали обычный белый шум 
o text - текст статьи, отображаемый в игре, подгружается из строкового массива 
• Добавим в, например, config\gameplay\info_l01escape.xml (инфопорции уровня "Кордон") ссылку на получение статьи - скажем, к трупу у туннеля, при обыске которого выдается информация о аномалиях в туннеле (вы его обнаруживаете, проходя второе спецзадание от Сидоровича). Найдем эти строки и дополним их: 
<!-- труп у аномалии -->
<info_portion id="esc_tutorial_dead_novice">
<article>tutorial_moving_anomaly</article>
'''<article>zone_anomalies_activation_basic</article>'''
</info_portion>
Главное - никогда не путайте article id, name и text статьи. Я в данном примере это сделать легко. Лучше называйте их непохожими друг на друга названиями. 
• Так как в статье у нас есть такое поле: 
        <text>enc_zone_anomalies_activation_basic</text>
Да и название тоже не написано прямо, а ссылается на определенную строку, то добавим этот самый text в config\text\rus\string_table_enc_zone.xml, в нашем случае: 
<string id="enc_zone_anomalies_activation-basic">
<text>Активация - базис</text>
</string>
<string id="enc_zone_anomalies_activation_basic">
<text>С артефактами связана, помимо всего прочего, ''(ну, и так далее, там большой текст)''...</text>
</string>
Дополнительно
Чтобы статья добавлялась при получении определенного задания, в ..._task.xml (вместо ... стоит название уровня) нужно прописать конструкцию вида: 
<article>название_задания_descr</article>


 
Холод Дата: Пятница, 08.06.2012, 10:40 | Сообщение # 8

Ранг: Новичок
Сообщений: 96
Награды: 6
Уважение: 83
Статус: Вне Зоны
Как добавить тайник?

Файлы:spawn_sections.ltx,devices.ltx,любой стандартный диалог. 
Для того, чтобы замерить координаты можно воспользоватся аддончиком Position Informer. 

1.Создаём файл ваше_название_скрипта.script в папке gamedata/scripts и пишем в него: 

Код 
function ваше_название_функции() $$$НАЗВАНИЕ ФУНКЦИИ$$$ 
alife():create(section,position,levelvertex,gamevertex) $$$ЭТО ТОЧКА ГДЕ СПАВНИТСЯ ПРЕДМЕТ$$$ 
end 

2.В папке config/scripts создаём файл m_taynik.ltx и пишем в него: 
Код 
[spawn] $$$ Это то, что появится в тайнике $$$ 
предмет 
предмет 
предмет 
предмет 
предмет 

3. Открываем файл spawn_sections.ltx из папки gamedata/config/creatures и пишем: 

Код 
[m_taynik]:ваш_текст 
visual = equipments\item_rukzak 
radius = 1 
custom_data = scripts\m_taynik.ltx 

4. Открываем файл devices.ltx и пишем: 

Код 
[ваш_текст] 
GroupControlSection = spawn_group 
discovery_dependency = 
$spawn = "devices\inventory box" 
class = O_INVBOX 
cform = skeleton 
visual = physics\box\expl_dinamit.ogf 
script_binding = bind_physic_object.init 

5. Пихаем в любой диалог функцию спавна: 

Код 
<action>ваше_название_скрипта.ваше_название_функция</action> 

Например в dialogs_trading.xml в диалоге doctor_dialog_start после фразы doctor_dialog_start_13 
Пишем <action>ваше_название_скрипта.ваше_название_функции</action> 

Теперь после того как поговорите с Доктором (NLC5) по заданным координатам появится рюкзак.


 
Холод Дата: Пятница, 08.06.2012, 10:45 | Сообщение # 9

Ранг: Новичок
Сообщений: 96
Награды: 6
Уважение: 83
Статус: Вне Зоны
Создание нового торговца

Сейчас мы научимся создавать нового торговца - Петровича:
1.Для начала создадим нового NPC, к которому и привяжем функцию торговли.
Cоздадим описание нашего NPC, для этого в папке gamedata\config\gameplay создадим xml файл, содержащий описание нашего торговца. Назовем его к примеру
character_by_escape.xml (вообще называть можно как угодно).
В нем пишем:

<xml>
<specific_character id="petrovich_trader" team_default = "1">
<name>Петрович</name>
<icon>ui_npc_u_stalker_sv_balon_1</icon>
<map_icon x="1" y="4"></map_icon>
<bio>petrovich_trader</bio>

<class>petrovich_trader</class>
<community>stalker</community>
<money min="100000" max="110000" infinitive="1"></money>
<terrain_sect>stalker_terrain</terrain_sect>

<rank>730</rank>
<reputation>96</reputation>
<visual>actors\svoboda\stalker_sv_balon_1</visual>
<snd_config>characters_voice\human_02\freedom\</snd_config>
<crouch_type>-1</crouch_type>

<supplies>
[spawn] \n
wpn_sig220 \n
ammo_11.43x23_hydro = 1 \n
wpn_sig550 \n
ammo_5.56x45_ap = 1 \n
</supplies>

<start_dialog>hello_dialog</start_dialog>
</specific_character>

</xml>

За тем прописываем его в npc_profile.xml(gamedata\config\gameplay), т.е под строчкой Новые Профиля пишем:
<character id="petrovich_trader">
<class>petrovich_trader</class>
<specific_character>petrovich_trader</specific_character>
</character>
После этого регистрируем описание нашего торговца в файле gamedata\config\system.ltx
В секцию [profiles] дописываем в конец после запятой character_by_escape.
3.Чтобы персонаж появился, нужно его заспавнить, для этого:
В папке gamedata\config\creatures есть замечательный файл spawn_sections.ltx
Будем править его.
Дабы не путаться потом, в самое его начало пишем:

[petrovich_trader_spawn]:stalker_trader
character_profile = petrovich_trader
spec_rank = veteran
community = stalker
use_single_item_rule = off
can_select_items = off
custom_data = scripts\petrovich_trader.ltx
Далее создаем скрипт с названием, например my_spawns.script в папке gamedata\scripts\
Прописываем в него функцию:

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

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

obj = alife():create("petrovich_trader_spawn",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) -- число патронов, которые будут спавнится при убиистве Петровича
end

Открываем блокнотом escape_dialog.script(gamedata\scripts\) и там в диалоге с Сидоровичем, например, после квеста с флешкой Шустрого,
функция: "function give_wounded_flash(first_speaker,second_speaker)"
(Можно впринципе в любой диалог)
вставляем:

my_spawns.petrovich_trader_spwn1()

вот так будет выглядеть разговор с Сидером:

function give_wounded_flash(first_speaker, second_speaker)
dialogs.relocate_item_section(second_speaker, "esc_wounded_flash", "out")
dialogs.relocate_money(second_speaker, 1500, "in" )
my_spawns.petrovich_trader_spwn1() -- Вызов Петровича
end
Т.е наш персонаж появится только после выполнения задания с флешкой Шустрого, и когда Сидорович выдаст вам деньги за это задание, а торговец появляется по нашим координатам рядом с лагерем новичков.
4.Теперь в папке \gamedata\config\scripts создаем файл petrovich_trader.ltx
Этот файл является проводником к файлу торговли и логикой персонажа.
И в нем пишем:
[logic]
trade = misc\trade_petrovich.ltx
active = remark

[remark]
anim = wait

5.Теперь создаем в папке \gamedata\config\misc файл trade_petrovich.ltx
Это и есть файл торговли.
И в начале пишем:
[trader]
buy_condition = petrovich_generic_buy
sell_condition = petrovich_start_sell
buy_supplies = supplies_start

и потом как у других торговцев,т.е у бармена например [barman_generic_buy], а у нас будет [petrovich_generic_buy]

Ну, торговец создан
Поясню некоторые нюансы:
1.
<specific_character id="petrovich_trader" team_default = "1">
<name>Петрович</name>
<icon>ui_npc_u_stalker_sv_balon_1</icon>
<map_icon x="1" y="4"></map_icon>
<bio>petrovich_trader</bio>

<class>petrovich_trader</class>
<community>stalker</community> -- группировка, которая будет указана при разговоре с ним
<money min="100000" max="110000" infinitive="1"></money> -- деньги, на которые он покупает оружие и все, что принесет на продажу сам игрок
<terrain_sect>stalker_terrain</terrain_sect>

<rank>730</rank>
<reputation>96</reputation>
<visual>actors\svoboda\stalker_sv_balon_1</visual> --модель героя, можно поменять, указав путь другой модели
<snd_config>characters_voice\human_02\freedom\</snd_config> -- озвучка, тоже можно заменить на другую
<crouch_type>-1</crouch_type> --оставлять также, не трогать

<supplies>
[spawn] \n
wpn_sig220 \n
ammo_11.43x23_hydro = 1 \n
wpn_sig550 \n
ammo_5.56x45_ap = 1 \n
</supplies>

<start_dialog>hello_dialog</start_dialog>
</specific_character>

2.
<character id="petrovich_trader"> --id указывайте тот, который указан в созданном файле описания торговца (предыдущий пункт), т.е. можно назвать как угодно торговца, но id сохранять в каждом файле
<class>petrovich_trader</class>
<specific_character>petrovich_trader</specific_character>
</character>

Quote
В секцию [profiles] дописываем в конец после запятой character_by_escape

Т.е. дописываем название файла описания торговца (см. в 1 пункте)

3.
[petrovich_trader_spawn]:stalker_trader
character_profile = petrovich_trader -- это наш id, который будет использоваться в файлах как ссылка на нашего персонажа, типа, связки
spec_rank = veteran
community = stalker
use_single_item_rule = off
can_select_items = off
custom_data = scripts\petrovich_trader.ltx

Quote (qwerty111)
Далее создаем скрипт с названием, например my_spawns.script в папке gamedata\scripts\

Называйте как угодно, главное потом в файле escape_dialog.script(gamedata\scripts\) укажите в функции function give_wounded_flash(first_speaker,second_speaker) ссылку на ваш скрипт. Например, в указанном здесь my_spawns.petrovich_trader_spwn1() , где my_spawns. - наш созданный скрипт, а petrovich_trader_spwn1() - выполнение функции в этом скрипте.

4.
[logic]
trade = misc\trade_petrovich.ltx --указываем на созданный файл торговца (где и будет находится ассортимент оружия)
active = remark

[remark]
anim = wait

5. Здесь объяснять ничего не нужно, и так все ясно уже давно


 
Холод Дата: Пятница, 08.06.2012, 10:49 | Сообщение # 10

Ранг: Новичок
Сообщений: 96
Награды: 6
Уважение: 83
Статус: Вне Зоны
Создание новой группировки

Сегодня мы создадим новую группировку. Назовем её, скажем, "Ветер". Не суть важно.

1. Для начала в game_relations.ltx и в таблицу отношений группировок в конце и в заголовке добавляем название своей группировки и коэффициенты отношений к ней у других группировок. Также, не забываем прописать её собственное отношение к другим группировкам:
[communities_relations]
;|actor |act_dol|act_fre|stalker|monolit|militar|killer |ecolog |dolg |freedom|bandit |zombied|strange|trader|arena_enemy|wind|
;=================================================================================================================================
actor = 0, 0, 0, 0, -5000, -5000, -5000, 0, 0, 0, -5000, -5000, 0, 0, -5000, 0
actor_dolg = 0, 0, 0, 0, -5000, -500, -5000, 5000, 600, -5000, -5000, -5000, 0, 0, -5000
actor_freedom = 0, 0, 0, 0, -5000, -5000, -5000, -1500, -5000, 5000, 0, -5000, 0, 0, -5000, 0

stalker = 0, 0, 0, 0, -5000, -5000, -5000, 0, 0, 0, -5000, -5000, 0, 0, -5000, 0
monolith = -5000, -5000, -5000, -5000, 5000, -5000, -5000, -5000, -5000, -5000, 5000, 5000, -5000, 0, -5000, 0
military = -5000, -5000, -5000, -5000, -5000, 5000, -5000, 0, -5000, -5000, -5000, -5000, 0, 0, -5000, 0
killer = -5000, -5000, 0, -5000, -5000, -5000, 5000, -5000, -5000, -5000, 0, -5000, -5000, 0, -5000, 0
ecolog = 0, 600, -5000, 0, -5000, 1000, -5000, 5000, 500, -5000, -500, -5000, 0, 0, 0, 0
dolg = 0, 600, -5000, 0, -5000, -500, -5000, 5000, 5000, -5000, -5000, -5000, 0, 0, 0, 0
freedom = 0, -5000, 600, 0, -5000, -5000, -5000, -1500, -5000, 5000, 0, -5000, 0, 0, 0, 0
bandit = -5000, -5000, 0, -5000, -5000, -500, 0, -5000, -5000, 0, 0, -5000, -5000, 0, -5000, 0
zombied = -5000, -5000, -5000, -5000, 5000, -5000, -5000, -5000, -5000, -5000, -5000, 5000, -5000, 0, -5000, 0
stranger = 0, 0, 0, 0, -5000, -5000, -5000, 0, 0, 0, -500, -5000, 0, 0, 0, 0
trader = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
arena_enemy = -5000, -5000, -5000, -5000, -5000, -5000, 0, 0, 0, -5000, -5000, 0, 0, 0, 0, 0

wind = 0, 0, 0, 0, -5000, -5000, -5000, 0, 0, 0, -5000, -5000, 0, 0, -5000, 0

Также, изменим эту строку, добавив туда имя и номер группировки:
;названия группировок
communities = actor, 0, actor_dolg, 1, actor_freedom, 2, stalker, 5, monolith, 6, military, 7, killer, 8, ecolog, 9, dolg, 10,
freedom, 11, bandit, 12, zombied, 13, stranger, 14, trader, 15, arena_enemy, 16, wind, 18,

Отсчет идет построчно начиная сверху. Хотя есть небольшой нюанс. У первых трех строк - нумерация начинается с нуля, с остальных группировок она идет как надо. Для wind выставили 18, так как мы эту группировку отделили от других.

Далее, в разделе [communities_sympathy] в конце добавляем свою группировку и коэффициент "впечатлительности" - чем он меньше, тем меньше отношение группировки будет меняться к вам в целом:
[communities_sympathy]
actor = 0.0
actor_dolg = 0.0
actor_freedom = 0.0
stalker = 0.0
monolith = 0.0
military = 0.0
killer = 0.0
ecolog = 0.0
dolg = 0.1
freedom = 0.1
bandit = 0.0
zombied = 0.0
trader = 0.0
stranger = 0.0
arena_enemy = 0.0
wind = 0.0

2. После этого в файле death_manager.script ищем строку local community_list и в скобках добавляем название своей группировки:
function init_drop_settings()
local community_list = { "stalker", "dolg", "freedom", "bandit", "military", "zombied", "ecolog", "killer", "monolith",
"arena_enemy", "actor_dolg", "wind" }

3. В файле death_items_by_communities.ltx пишем [x]:stalker (вместо x - название вашей группировки):
[...]
af_dummy_spring = 0
af_fuzz_kolobok = 0

;Еда
vodka = 0

[arena_enemy]
[actor_dolg]

[wind]: stalker
bread = 0
kolbasa = 0
vodka = 0
energy_drink = 0.3

4. Если предусматривается респавн бойцов новой группировки, в se_respawn.script прописываем в local simMaxCount = { после строчек с зомбированными сталкерами строку:
wind_novice = 20, wind_regular = 20, wind_veteran = 20, wind_master = 6,

5. Чтобы при убийстве непися новой группировки игра не вылетала в xr_statistic.script,

после строки:
zombied_novice = 1, zombied_experienced = 2, zombied_veteran = 3, zombied_master = 4,

пишем
dark_stalker_novice = 1, dark_stalker_experienced = 2, dark_stalker_veteran = 3, dark_stalker_master = 4,

6. Ну а в character_desc_x.xml выбираем любого NPC (или группу) и меняем группировку на свою:
<!---esc_wolf--->
<specific_character id="esc_wolf" team_default = "1">
<name>esc_wolf_name</name>
<icon>ui_npc_u_stalker_neytral_balon_1</icon>
<bio>esc_wolf_bio</bio>

<class>esc_wolf</class>
<community>wind</community>
[...]

7. Чтобы у персонажа в графе "Группировка" отображалось не "wind", а "Ветер", зарегистрируем соответствующую строку в файле string_table_general.xml:

<string_table>
<string id="wind">
<text>Ветер</text>
</string>
<string id="actor">
<text>Одиночка</text>
</string>
[...]

8. Существует возможность создать для нашей новой группировки места, где они будут ходить (*_terrain брать из m_stalker.ltx):

То есть, к примеру, существует секция:
[stalker_terrain]
255,000,255,255
008,001,255,255 ;Разрешено ходить по опасным местам на баре
012,001,255,255 ;Разрешено ходить по опасным местам на Милитари

Тогда можно создать новую, по аналогии:
[wind_terrain]
255,000,255,255
008,001,255,255 ;Разрешено ходить по опасным местам на баре
012,001,255,255 ;Разрешено ходить по опасным местам на Милитари
010,001,255,255 ;Разрешено ходить по опасным местам на янтаре

Здесь, очевидно, указаны координаты самого уровня. Для каждого уровня существует своя начальная координата.
Продвинутый уровень

Такой метод достаточно примитивен. Это не полноценная группировка. Нам нужны соответствующие диалоги, возможность получения квестов и вступления в группировку, уникальные NPC.
Квесты

Добавим квесты, которые нужно выполнить для группировки. Пока - простые поручения распространенных типов.

Во-первых, пропишите в список диалогов персонажа следующие строки:
<actor_dialog>[что-нибудь]_dialog</actor_dialog>
<actor_dialog>[что-нибудь]_reward</actor_dialog>

Примеры названий: tm_trader_dialog, tm_wolf_dialog...

Этим мы добавили ему ветку диалога "Есть работа?", а также ветку для награды за квест/отказа от него. Теперь зарегистрируем в task_manager.ltx набор новых заданий.


    [...]

    ;--------Wind------------------------
    ;----------Kill Stalker----
    wind_kill_stalker
    ;----------Find Item----
    wind_find_item

    [...]

    ;tasks for Wind

    [wind_find_item]
    type = find_item
    community = actor
    text = [ссылка на текст с рассказом заказчика о задании]
    description = [ссылка на текст с описанием задания]
    parent = [имя NPC-заказчика]
    target = scientific_outfit
    reward_money = 5000
    reward_reputation = +5
    reward_rank = 4
    reward_item = wpn_sig_m1
    time = 86400

    [wind_kill_stalker]
    type = kill_stalker
    community = actor
    text = [ссылка на текст с рассказом заказчика о задании]
    description = [ссылка на текст с описанием задания]
    parent = [имя NPC-заказчика]
    target = sim_stalker_master_master
    reward_money = 4000
    reward_reputation = +5
    reward_rank = 9
    reward_item = ammo_5.56x45_ap, ammo_5.56x45_ap, ammo_5.56x45_ap
    time = 86400

    Не забудьте прописать описания заданий в текстовые массивы. Подробнее о редактировании task_manager.ltx читайте в уроке, посвященном однотипным квестам.

    Да, и зарегистрируйте сами ветки диалогов в файле dialogs.xml. Вот пример того, как это сделано для заданий "Долга":
    <dialog id="tm_dolg_dialog" priority="-1">
    <init_func>task_manager.init_dolg_task_dialog</init_func>
    </dialog>
    <dialog id="tm_dolg_reward" priority="0">
    <init_func>task_manager.init_dolg_reward_dialog</init_func>
    <precondition>task_manager.has_active_vendor_task</precondition>
    </dialog>

    Соответственно, пройдем туда, куда указывает строка task_manager.init_dolg_task_dialog - в task_manager.script:
    function init_dolg_task_dialog(dlg)
    get_random_task():init_task_dialog(dlg, "dolg")

    По аналогии делаем и с нашим "Ветром".
    Вступление в группировку

    Реализуем возможность вступления в группировку.

    Прописываем в dialogs.script такие action'ы:
    -----------------------------------------------------------------------------------
    -- Community
    -----------------------------------------------------------------------------------

    [...]

    function actor_set_wind (actor, npc)
    printf ("ACTOR NOW IN WIND COMMUNITY"
    if db.actor then
    db.actor:set_character_community ("actor_wind", 0, 0)
    end
    return true
    end

    После чего создадим диалог, и сделаем в нем фразу с action'ом вида <action>actor_set_wind</action>. Советую изучить урок, посвященный диалогам.

 
Холод Дата: Пятница, 08.06.2012, 10:52 | Сообщение # 11

Ранг: Новичок
Сообщений: 96
Награды: 6
Уважение: 83
Статус: Вне Зоны
Создадим телепорт

В игре существует такой объект как "zone_teleport", но если мы его создадим через create, то он будет выглядеть и переливаться как настоящий телепорт, но телепортировать нас куда-либо увы не сможет. Связано это с тем что, у аномалий ( а телепорт это такая разновидность аномалии ) параметры задаются хитромудро, через all.spawn. Вобщем штатным способом телепорты без полнофункционального редактора карт не получить (хотя возможно я не прав уже после написания этого текста появились идеи как это сделать через all.spawn). Значит на нашу долю остаються способы "не штатные"  Реализуем самый простой. Будем считать что у нас на карте есть квадрат с заданными координатами при попадании в который актера должно переместить в точку с другими координатами. Для этого будем периодически проверять координаты актера, и если он в квадрате - перемещяем. Вот в краце принцип действия нашего "самодельного" телепорта. 
Реализация 
В каталоге gamedata\scripts\ Создадим файл bind_mteleport.script с логикой работы нашего телепорта. 
-- ************************************************ 
-- ** Imp ** 
-- ** Биндер самодельных телепортов ** 
-- ** Поддерживает работу самопальных телепортов ** 
-- ************************************************ 

local teleport_binders ={} -- Список телепортов 

function abs_comp(a,b) 
-- Служебная функция вычисления разности 
if( a < b) then 
return (b - a) 
else 
return (a - b) 
end 
end 

function teleportate(x,y,z) 
-- Функция телепортации 
local a = vector() 
-- Задаем координаты 
a.x = x 
a.y = y 
a.z = z 

-- Сама телепортация 
db.actor:set_actor_position(a) 

-- Звуковое сопровождение 
local snd_obj = xr_sound.get_safe_sound_object([[affects\tinnitus3a]]) 
snd_obj:play_no_feedback(db.actor, sound_object.s2d, 0, vector(), 1.0) 

end 

function actor_update(delta) 
local i,v,acter_poz,s 

-- Получим позицию актера (что-бы каждый раз не запрашивать) 
acter_poz = db.actor:position() 

-- Проверяем наши телепорты 
for i, v in pairs(teleport_binders) do 
s = v.parametrs 

local obj = level.object_by_id( i ) 
if obj ~= nil then 
-- Наш телепорт в онлайне проверяем дальше 
if s.teleporte ~= nil and s.teleporte ~= false then 
-- Телепорт запущен 
if ( time_global() <= s.time ) then 
-- Если время отведенное на показ спецэфектов 
-- прошло, производим телепортацию 
teleportate(s.poz_x,s.poz_y,s.poz_z) 
if s.rotate ~= nil then 
db.actor:set_actor_direction(s.rotate) 
end 
s.teleporte = false 
end 
return 
end 

-- Пороверим не забрел-ли актер в наш телепорт 
if (abs_comp(s.x, acter_poz.x)< v.parametrs.radius and 
abs_comp(s.z, acter_poz.z)< v.parametrs.radius and 
abs_comp(s.y, acter_poz.y)< v.parametrs.z_radius) then 
-- Актер в зоне действия телепорта, запустим телепорт 
s["teleporte"] = true 
s["time"] = time_global() + 500 

-- Запускаем спецэфекты телепортации 
level.add_pp_effector ("teleport.ppe", 2006, false) 
end 
end 
end 
end 

function bind( obj ) 
obj:bind_object( restrictor_teleport( obj ) ) 
end 

---------------------------------------------------------------------------------------------------- 
class "restrictor_teleport" ( object_binder ) 

function restrictor_teleport:__init(obj, char_ini) super(obj) 
end 

function restrictor_teleport:net_spawn(data) 
local char_ini = system_ini() 

-- Если это телепорт то занесем его в специальный список телепортов 
if self.teleport == true then 
teleport_binders[self.object:id()] = self 

-- Заполним таблицу параметров 
self["parametrs"] = {} 
if char_ini:line_exist(self.section, "radius") then 
self.parametrs["radius"] = tonumber(char_ini:r_string(self.section, "radius")) 
else 
self.parametrs["radius"] = 2 -- Дефолтный радиус по xy 
end 
if char_ini:line_exist(self.section, "z_radius") then 
self.parametrs["z_radius"] = tonumber(char_ini:r_string(self.section, "z_radius")) 
else 
self.parametrs["z_radius"] = self.parametrs["radius"] -- если радиус высоты не задан то задаем равным радиусу xy 
end 

-- Запомним позицию что-бы каждый раз не считать 
local s_obj = alife():object(self.object:id()) 
self.parametrs["x"] = tonumber(s_obj.position.x); 
self.parametrs["y"] = tonumber(s_obj.position.y); 
self.parametrs["z"] = tonumber(s_obj.position.z); 

-- Запомним координаты куда телепортимся 
self.parametrs["poz_x"] = tonumber(char_ini:r_string(self.section, "poz_x")) 
self.parametrs["poz_y"] = tonumber(char_ini:r_string(self.section, "poz_y")) 
self.parametrs["poz_z"] = tonumber(char_ini:r_string(self.section, "poz_z")) 

if char_ini:line_exist(self.section, "rotate") then 
self.parametrs["rotate"] = tonumber(char_ini:r_string(self.section, "rotate")) 
end 
end 
return true 
end 

function restrictor_teleport:net_destroy() 
-- Удаляем наш телепорт 
teleport_binders[self.object:id()] = nil 
self.parametrs = nil 
object_binder.net_destroy(self) 
end 

function restrictor_teleport:reload(section) 
local char_ini = system_ini() 

self.section = section 
-- Если это телепорт то 
if char_ini ~= nil and char_ini:line_exist(self.section, "teleport") then 
self["teleport"] = true 
end 
end 

Для постоянного обновления нужно прицепить функцию actor_update() к биндеру актера, для чего в файле bind_stalker.script найдем функцию: 
function actor_binder:update(delta) 
В ней найдем вызов обновления рестрикторов bind_restrictor.actor_update(delta) под которым вставим строку с вызовом нашей функции обновления: bind_mteleport.actor_update(delta) 
Все с программной частью закончили, теперь задаем данные телепорта. 
В каталоге gamedata\config\misc открываем файл zone_teleport.ltx и в конце файла добавляем следующие строки описывающие конкретный телепорт: 
[m_teleport_1]:zone_teleport 
teleport = standart 
script_binding = bind_mteleport.bind 
;Параметры нашего телепорта 
radius = 2 
;Высота захвата телепорта 
z_radius = 2 

;Куда телепортируемся (телепортация всегда идет в пределах карты) 
poz_x = 22.78 
poz_y = 20.35 
poz_z = 659.24 

; Угол зрения при появлении. Если параметра нет то не меняется. 
rotate = 1.5 
Параметры нашего телепорта: 
radius - на самом деле не радиус, а половина длинны стороны нашего квадрата (в начале я хотел сделать его кругом, но посчитал, что лучше не тратить процессорное врямя по пусту). Центром квадрата является точка респавна телепорта. 
z_radius - высота нашего телепорта. 
poz_x, poz_y, poz_z - координаты точки телепортации. 
rotate - Угол поворота после телепортации от оси X (я не разбирался в каких единицах задается, но 1.5 примерно равно 90 градусов). Если параметр удалить то будет оставатья угол под которым актер вошел в телепорт. 
Использование 
Теперь с помощью create создадим наш телепорт: Пример: 
local obj 
local a = vector() 
a.x = -244.55 
a.y = -19.46 
a.z = -125.42 
obj = alife():create("m_teleport_1",a,12829,8,65535) 
Создаст телепорт возле выхода из бункера Сидоровича. Наш телепорт перебрасывает игрока на вышку блокпоста (перед выходом с уровня).
Все)


 
Холод Дата: Пятница, 08.06.2012, 10:56 | Сообщение # 12

Ранг: Новичок
Сообщений: 96
Награды: 6
Уважение: 83
Статус: Вне Зоны
Редактируем нпс

За параметры NPC отвечают файлы:
\config\gameplay\character_desc_[название локации].xml

Каждый из них разбит на секции - по одной на NPC. Используются следующие параметры:
<name>...</name> - Имя (ссылка на строку в текстовом массиве).
<icon>ui_npc_...</icon> - Иконка для диалогов/торговли.
<bio>..._bio</bio> - Биография (в игре не используется).
<class>...</class> - Класс (лучше не трогать).Imp 12:46, 12 августа 2007 (EEST)Нужно для того что-бы автоматические респавнеры могли спавнить немного разных персонажей. То есть например в игре есть описание восьми (кажеться может и больше) разных новичков и что бы при автоматическом респавне не получалась куча братьев-близнецов, респавнер настраивается на класс персонажей и спавнит случайным образом разных персонажей одного класса.
<community>...</community> - Группировка.
<rank>...</rank> - Ранг.
<reputation>...</reputation> - Репутация.
<money min="..." max="..." infinitive="..."/> - Количество денег (infinitive="1" - бесконечные деньги).
<snd_config>...</snd_config> - Набор звуков.
<crouch_type>-1</crouch_type> - Тип приседания. Лучше не трогать.
<visual>actors\...</visual> - Внешность. Влияет как на внешний вид костюма, так и на его свойства. Укажите здесь экзоскелет - и персонаж действительно в нем окажется: как по внешности, так и по свойствам.
<supplies>...</supplies> - Предметы, находящиеся у него в инвентаре. Некоторые из них в игре не отображаются, поэтому не удивляйтесь присутствию здесь предметов вроде рации или фонарика.

В игре отображаються все предметы, просто при торговле есть ограничения на допустимые к торговле предметы, а при смерти персонажа, "запрещенные" предметы удаляються скриптом. Imp 12:46, 12 августа 2007 (EEST)
<start_dialog>...<start_dialog> - Приветственный диалог. Их может быть несколько, с различными условиями появления.
<actor_dialog>...</actor_dialog> - Диалоги с игроком.
Практика

Изменим, например, параметры NPC по имени Волк.

Откроем файл:
\config\gameplay\character_desc_escape.xml

И найдем в нем раздел, ему соответствующий:
<!---------------------esc_wolf--------------------->

<specific_character id="esc_wolf" team_default = "1">
<name>esc_wolf_name</name>
<icon>ui_npc_u_stalker_neytral_balon_1</icon>
<bio>esc_wolf_bio</bio>

<class>esc_wolf</class>
<community>stalker</community> <terrain_sect>stalker_terrain</terrain_sect>

<rank>434</rank>
<reputation>5</reputation>
<money min="600" max="2000" infinitive="0"/>

<snd_config>characters_voice\human_01\stalker\</snd_config>
<crouch_type>-1</crouch_type>

<visual>actors\neytral\stalker_neytral_balon_1</visual>
<supplies>
[spawn] \n
wpn_pm \n
ammo_9x18_fmj = 1 \n
wpn_ak74u \n
ammo_5.45x39_fmj \n
device_torch \n
hand_radio \n
</supplies>

#include "gameplay\character_criticals_4.xml" //

<start_dialog>escape_lager_volk_talk</start_dialog>
<start_dialog>dm_hello_dialog</start_dialog>
<actor_dialog>dm_cool_info_dialog</actor_dialog>
<actor_dialog>dm_help_wounded_medkit_dialog</actor_dialog>
<actor_dialog>tm_wolf_dialog</actor_dialog>
<actor_dialog>tm_wolf_reward</actor_dialog>
</specific_character>

Изменим некоторые параметры. Выдадим ему FN2000 и Desert Eagle, примем в "Долг" и сделаем неограниченное количество денег:
<!---------------------esc_wolf--------------------->

<specific_character id="esc_wolf" team_default = "1">
<name>esc_wolf_name</name>
<icon>ui_npc_u_stalker_neytral_balon_1</icon>
<bio>esc_wolf_bio</bio>

<class>esc_wolf</class>
<community>dolg</community> <terrain_sect>stalker_terrain</terrain_sect>

<rank>434</rank>
<reputation>5</reputation>
<money min="600" max="2000" infinitive="1"/>

<snd_config>characters_voice\human_01\stalker\</snd_config>
<crouch_type>-1</crouch_type>

<visual>actors\neytral\stalker_neytral_balon_1</visual>
<supplies>
[spawn] \n
wpn_deagle \n
ammo_11.43x23_fmj = 1 \n
wpn_fn2000 \n
ammo_5.56x45_ap \n
ammo_5.45x39_fmj \n
device_torch \n
hand_radio \n
</supplies>

#include "gameplay\character_criticals_4.xml" //

<start_dialog>escape_lager_volk_talk</start_dialog>
<start_dialog>dm_hello_dialog</start_dialog>
<actor_dialog>dm_cool_info_dialog</actor_dialog>
<actor_dialog>dm_help_wounded_medkit_dialog</actor_dialog>
<actor_dialog>tm_wolf_dialog</actor_dialog>
<actor_dialog>tm_wolf_reward</actor_dialog>
</specific_character>
Здесь все


 
Холод Дата: Пятница, 08.06.2012, 11:03 | Сообщение # 13

Ранг: Новичок
Сообщений: 96
Награды: 6
Уважение: 83
Статус: Вне Зоны
И последняя статья
Перенос локаций из тч в зп или чн

Запускаем программу ggEditor. Видим там два окошка. В левом открываем game.graph от ТЧ, а в правом — от ЗП или ЧН (в ЗП и ЧН граф вшит в all.spawn, ищите его там. Нужно выбрать тип файлов для ЧН — graph.bin, а для ЗП — все файлы и открыть в папке с ACDC файл section4.bin). В окошках мы видим список уровней. В левом окошке находим нужный нам уровень и нажимаем на соответствующую стрелку для переноса уровня в нужный нам граф. Нажимаем в правом окошке «сохранить». После того, как граф сохранился, можно закрыть программу, она нам больше не понадобится. Потом этого шагаем в папку с ACDC для ЧН/ЗП и удаляем старые файлы section4.bin или graph.bin. Затем переименовываем файлы graph.bin.new или section4.bin.new в graph.bin и соответственно section4.bin.
Далее идем в папку с ACDC от ТЧ, находим там файл alife_наша_локация и копируем его. Затем шуруем в папку с ACDC от ЧН/ЗП, вставляем скопированный нами файл. Открываем этот файл, сносим все, оставляем только одну секцию спавна (лучше всего, если это будет какой-нибудь объект), присваиваем секции номер не меньше 20000, сворачиваем на время этот файл. Далее нужно подогнать вертексы. Для этого запускаем ggTool.bat, ждем некоторое время, после чего в parse_lvids.ltx появляются имена локаций, а рядом с ними числа. Смотрим это число рядом с нашей локацией (в ЧН это скорее всего будет 1620, а в ЗП 934). Далее разворачиваем alife_ файл с нашей локацией, ищем там строку game_vertex_id и пишем там число, которое появилось рядом с нашей локацией при запуске батника ggTool. А вот строку level_vertex_id трогать не следует, т.к. вершины уровня в нашем случае остаются неизменными. RedPython 10:04, 21 ноября 2010 (UTC) Мы подогнали вертексы.
Затем открываем файл all.ltx. Вписываем туда свой alife_ файл локации, way_ файлы не трогаем. Меняем на соответствующее количество локаций строку level_count.
После этого открываем файл alife_zaton (для ЗП) или alife_marsh (для ЧН) и ищем там ГГ по строке section_name = actor. Нашли? Отлично. Теперь присваиваем этой секции спавна позицию (новую позицию прописываем также в строке upd:position = ) и вертексы как у единственного предмета в файле alife_новая_локация. При следующей распаковке, если вы все сделали правильно, наш актор окажется в файле alife_новая_локация.
Мы почти закончили с пробной сборкой новой локации (пока без переходов на другие уровни).
Осталось только прописать наш новый уровень в файл ACDC_CoP\acdccop.pl (для ЗП), либо в файле ACDC_CS\stkutils\level.pm.
В этих файлах ищем такие строки (для ЗП):
use constant levels_info => (
{ gvid0 => 934, },
{ gvid0 => 883, name => 'jupiter_underground' },
{ gvid0 => 857, name => 'labx8' },
{ gvid0 => 666, name => 'pripyat' },
{ gvid0 => 317, name => 'jupiter' },
{ gvid0 => 0,   name => 'zaton' },
И если у вас число, когда мы запускали батник ggTool, тоже 934, то прописываем так:
use constant levels_info => (
{ gvid0 => 934, name => 'ваша_локация' },
{ gvid0 => 883, name => 'jupiter_underground' },
{ gvid0 => 857, name => 'labx8' },
{ gvid0 => 666, name => 'pripyat' },
{ gvid0 => 317, name => 'jupiter' },
{ gvid0 => 0,   name => 'zaton' },
А в файле level.pm от ACDC ЧН вы увидите такой текст:
use constant levels_info => (
{ gvid0 => 1620, },
{ gvid0 => 1573, name => 'l12_hospital' },
{ gvid0 => 1565, name => 'l11_stancia2' },
{ gvid0 => 1524, name => 'l10_limansk' },
{ gvid0 => 1511, name => 'l09_agroprom_undeground' },
{ gvid0 => 1313, name => 'l08_military' },
{ gvid0 => 1212, name => 'l07_yantar' },
{ gvid0 => 1057, name => 'l06_agroprom' },
{ gvid0 => 961,  name => 'l05_red_forest' },
{ gvid0 => 743,  name => 'l04_darkvalley' },
{ gvid0 => 472,  name => 'l03_escape' },
{ gvid0 => 245,  name => 'l02_garbage' },
{ gvid0 => 0,    name => 'l01_marsh' },
Прописать там свой уровень нужно точно так-же как в файле от ACDC ЗП:
use constant levels_info => (
{ gvid0 => 1620, name => 'ваша_локация' },
{ gvid0 => 1573, name => 'l12_hospital' },
{ gvid0 => 1565, name => 'l11_stancia2' },
{ gvid0 => 1524, name => 'l10_limansk' },
{ gvid0 => 1511, name => 'l09_agroprom_undeground' },
{ gvid0 => 1313, name => 'l08_military' },
{ gvid0 => 1212, name => 'l07_yantar' },
{ gvid0 => 1057, name => 'l06_agroprom' },
{ gvid0 => 961,  name => 'l05_red_forest' },
{ gvid0 => 743,  name => 'l04_darkvalley' },
{ gvid0 => 472,  name => 'l03_escape' },
{ gvid0 => 245,  name => 'l02_garbage' },
{ gvid0 => 0,    name => 'l01_marsh' },
По идее, в levels_info следует прописать также верхнюю вершину последнего уровня. RedPython 10:04, 21 ноября 2010 (UTC)
Всё. Собираем all.spawn.
Сборка геймдаты.
Осталось собрать gamedata`у для игры и посмотреть, что получилось. Итак, приступим.
В папке с игрой создаем папку gamedata, а в ней папки configs, levels, spawns. В папку spawns кладем получившийся при сборке all.spawn.new (или new.spawn), не забывая переименовать его в all.spawn. В папку levels кладем уровень из ggEditor_01\SoC\gamedata\levels\ваша_локация\. Затем заходим в папку с уровнем, удаляем старый файл level.ai и переименовываем файл level.ai10 в level.ai.
Теперь осталось только прописать уровень в конфигах. Из распакованной геймдаты игры берем файлы configs\game_graphs.ltx, \game_levels.ltx, \game_maps_single.ltx.
game_graphs.ltx для ЧН должен выглядеть так:
[location_0]
  000 = "..."
  001 = "эскейп"
  002 = "свалка"
  003 = "агропром"
  004 = "агропром-подземка"
  005 = "темная долина"
  006 = "лаборатория X-18"
  007 = "даркскейп"
  008 = "Бар"
  009 = "Росток"
  010 = "Янтарь"
  011 = "лаборатория X-16"
  012 = "Милитари"
  013 = "Мертвый город"
  014 = "Радар"
  015 = "Радар бункер"
  016 = "Припять"
  017 = "станция АЭС"
  018 = "ваша_локация"
[location_1]
  000 = "..."
  001 = "ограниченный доступ"
  002 = "запрещенный доступ"
[location_2]
  000 = "..."
  001 = "не для игрока"
[location_3]
  000 = "..."
  001 = "ваша_локация"
game_graphs.ltx для ЗП должен выглядеть так:
[location_0]
  000 = "..."
  001 = "ваша_локация"
  002 = "sim_smart_2"
  003 = "sim_smart_3"
  004 = "sim_smart_4"
  005 = "sim_smart_5"
  006 = "sim_smart_6"
  007 = "sim_smart_7"
  008 = "sim_smart_8"
  009 = "sim_smart_base"
[location_1]
  000 = "..."
  001 = "ограниченный доступ"
  002 = "запрещенный доступ"
[location_2]
  000 = "..."
  001 = "не для игрока"
[location_3]
  000 = "..."
  ....
  ....
  ....
  112 = "pri_a22_smart_terrain"
  113 = "pri_a25_smart_terrain"
  114 = "pri_a28_arch"
  115 = "pri_a28_base"
  116 = "pri_b28_evac"
  117 = "pri_a28_heli"
  118 = "pri_a28_school"
  119 = "pri_a28_shop"
  120 = "pri_b301"
  121 = "pri_b302"
  122 = "pri_b303"
  123 = "pri_b304_monsters_smart_terrain"
  124 = "pri_b305_dogs"
  125 = "pri_b306"
  126 = "pri_b307"
  127 = "pri_b35_mercs"
  128 = "pri_b35_military"
  129 = "pri_b36_smart_terrain"
  130 = "pri_sim_1"
  131 = "pri_sim_2"
  132 = "pri_sim_3"
  133 = "pri_sim_4"
  134 = "pri_sim_5"
  135 = "pri_sim_6"
  136 = "pri_sim_7"
  137 = "pri_sim_8"
  138 = "pri_sim_9"
  139 = "pri_sim_10"
  140 = "pri_sim_11"
  141 = "pri_sim_12"
  142 = "ваша_локация"
[graph_points_draw_color_palette]
  default        = 0x6000ffff
  000_000_000_000    = 0x60ff00ff
Далее лезем в game_levels.ltx. Там в самом начале, где список уровней, вписываем level183 (число не менее 183.) Листаем файл до самого конца и в конце пишем следующее:
[level183]
name   = ваша_локация
caption = "ваша_локация"
offset  = 700.0,     1000.0,    -840.0
weathers = [default]
id  = 183
Затем открываем файл game_maps_single.ltx и прописываем свой уровень в секции [level_maps_single]. Затем создаем примерно такую секцию для нашего уровня:
[ваша_локация]
  global_rect = 307.0, 90.0, 717.0, 500.000000
  weathers    = dynamic_default
Всё. Запускайте игру и пробуйте, что получилось.
Соединение с остальными уровнями.
Предлагаю вам не терять зря времени, просто бегая по подключенной локации, а замерить координаты для создания перехода.Координаты будем снимать на 2-х локациях: на подключенной и на той, на которую вы хотите сделать переход соответственно. На каждой локации нам нужно снять по две координаты (координата самого перехода и координата места, в которое будет бросать при переходе с второй локации, вторую координату делаем на пару метров дальше, потому как если сделать близко, то сразу же будет кидать обратно, на локацию с которой переходим). Как снять координаты, я думаю все знают, поэтому объяснять здесь не буду.
Мы отмерили все необходимые нам координаты.
Затем распаковываем сделанный нами ранее all.spawn. Теперь в нужных нам локациях, в alife_ файлах добавляем следующую секцию спавна:
[40000] ;свободный номер секции
; cse_abstract properties
section_name = level_changer
name = escgar_level_changer ;уникальное имя для секции перехода
position = 28.060224533081,16.556184768677,685.80151367188 ;координаты перехода
direction = 0,0,0
cse_abstract__unk1_h16 = 0x1
; cse_alife_object properties
game_vertex_id = 1142 ;геймвертексы
distance = 0
level_vertex_id = 308110 ;левелвертексы
object_flags = 0xffffff3e
; cse_shape properties
shapes = shape0
shape0:type = box
shape0:axis_x = 1.25219917297363,0,0
shape0:axis_y = 0,3.09340000152588,0
shape0:axis_z = 0,0,1.25219917297363
shape0:offset = 0,0,0
; cse_alife_space_restrictor properties
restrictor_type = 3
; cse_alife_level_changer properties
dest_game_vertex_id = 1187 ;вертексы локи, на которую ведет переход
dest_level_vertex_id = 212769 ;вертексы локи, на которую ведет переход
dest_position = 39.396331787109,0.48722490668297,-299.7674505469 ;позиция, куда кидает
dest_direction = 0,0,0 ;направление взгляда игрока при появлении
dest_level_name = l02_garbage ;имя локации, на которую ведет переход
dest_graph_point = start_actor_01
silent_mode = 1 ;режим "тихого" перехода
; se_level_changer properties
Пояснения после знаков ; желательно удалить. RedPython 10:04, 21 ноября 2010 (UTC)
Всё готово. Собираем all.spawn и запихиваем в игру.
Метод исправления лайтмапов
После переноса лок из ТЧ в ЧН/ЗП освещение локации вело себя странным образом, тени были жутко черные, тени от деревьев на зданиях имели странную форму, некоторые объекты вообще светились в темноте. А все дело заключалось в картах освещения, принцип их построения в ТЧ отличается от ЧН/ЗП, поэтому для получения более качественной картинки нужно произвести некоторые манипуляции с ними. Карты освещения хранятся в файлах
    * lmap#1_1.dds
    * lmap#1_2.dds
    * lmap#2_1.dds
    * lmap#2_2.dds
    * lmap#3_1.dds
    * lmap#3_2.dds
    * ...
в папке с локацией. Мапы с именем заканчивающимся на _1 менять не нужно а вот заканчивающимся на _2 нужно изменить. Значит так, открываем в фотошопе (ну, или в другом редакторе, не суть важно) карты:
    * lmap#1_2.dds
    * lmap#2_2.dds
    * lmap#3_2.dds
... и меняем местами альфа канал и RGB. Сохраняем. Теперь косяков с освещением не будет. Но в некоторых картах в файлах lmap#*.dds нет альфа канала, поэтому нужно в lmap#*_1.dds добавить черный альфа канал, а в lmap#*_2.dds канал rgb перенести в альфу, и залить rgb черным цветом.
Убедительная просьба к начинающим модмейкерам. Пожалуйста, если вы только начали заниматься модами, то я вам настоятельно не советую заниматься подключением локаций. Наберитесь опыта, подучитесь элементарному. Никто вас учить этому не подписывался.
Да, и еще. Если будете переносить секции спавна, то для массовой замены геймвертексов и левелвертексов можно использовать блокнот: открываем наш файл в блокноте=>правка=>заменить, и пишем, что на что заменять. Также можно использовать Vertex Parser или Spawn Parser 2.0 beta.


 
Шпак Дата: Пятница, 08.06.2012, 12:43 | Сообщение # 14

Майор "Военных"
Ранг: Опытный
Сообщений: 930
Награды: 36
Уважение: 364
Статус: Вне Зоны
Холод, спс. полезно


...Мы делили апельсин - много наших полегло...
_____________________
через 149 дней я изменюсь
_____________________
"Широка обойма Гаусс-пушки
Еще шире морда Бороды.
Не успел добраться до вертушки -
Получай заслуженной пи*ды" (с)
 
Холод Дата: Пятница, 08.06.2012, 15:54 | Сообщение # 15

Ранг: Новичок
Сообщений: 96
Награды: 6
Уважение: 83
Статус: Вне Зоны
Потом еще что нить добавлю

 
Бар » Общий зал » Games » Модостроение (Самое простое)
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

Территория Бара "100 рентген" © 2024. 12+

 
Индекс цитирования