Спаун через xrSpawner 1. Предварительные телодвижения
1.1 Итак, прежде чем мы приступим к созданию собственных модов, не помешает проветрить, все ли необходимое у нас есть. a) Собственно, сама игра, установленная на компьютер. b) Распаковщик архивов игры STALKER_Data_Unpacker c) Текстовый редактор, подойдет практически любой, даже Блокнот. Если у вас есть редактор с подсветкой синтаксиса, это будет плюсом. d) Редактор файла all.spawn. Если вы корифей в HEX-редакторах, берите тот, который нравится. Тем же, кто даже толком не представляет, что такое НЕХ-редактор, крайне рекомендую xrSpawner 0.13.0 Beta от небезызвестного в сталкеровском комьюнити Zeed’а. Удивительно удобная штука, тем более что в дальнейшем речь пойдет именно о xrSpawner. e) Ровные руки и мыслящая голова. Если все это у вас есть, продолжим. В том случае, если вы уже распаковали архивы игры, переходите сразу ко второму пункту. Если же нет, то…
1.2 Допустим, игра у вас установлена в папку D:\Games\S.T.A.L.KE.R. Тогда при помощи Unpacker-а извлеките все содержимое файлов gamedata.dbX (где Х – буква или число) из корневого каталога игры в отдельную папку, например D:\Source\gamedata.
1.3 Теперь в папке D:\Source\gamedata\spawns найдите файл all.spawn и скопируйте его в папку D:\Games\S.T.A.L.KE.R. \gamedata\spawns. Если такой папки нет – создайте ее, в дальнейшем, если необходимо будет перенести какой-либо файл в каталог, которого нет – создавайте, учитывая все промежуточные папки. 1.4 Запускаем xrSpawner 0.13.0 Beta , нажимаем «Файл - Открыть файл all.spawn» и указываем ему файл из папки D:\Games\S.T.A.L.KE.R.\gamedata\spawns. Окошки редактора заполнились цифрами и буквами. Теперь у нас все готово, начинаем.
2. Добавление транспорта.
2.1 Начнем, пожалуй, с самого легкого и в достаточной степени необходимого – с добавления транспорта. В правой части окна редактора раскрываем список «Добавить объект» и выбираем пункт Transport. В окне внизу выбираем вид транспорта, который вам необходим, пусть это будет, к примеру, Niva_Green (Нива армейского образца) и жмем кнопку «Добавить».
2.2 В левой части редактора мы видим окно со списком всех объектов, спаунящихся в игре. В самом конце этого списка появился объект m_car, на который указывает синий маркер. Это и есть наша Нива. Давайте обратим теперь внимание на центральную часть редактора и немного разберемся, что есть что. Итак, m_car – тип объекта (Entity), ven_niva_00 – название объекта (можете назвать его по-другому, например Moya_Niva), корд X/Y/Z и вектор X/Y/Z – координаты объекта и углы поворота относительно осей координат. Обратите внимание, что за вертикальную ось отвечает не привычная нам ось Z, а ось Y. Это не ошибка, Zeed сознательно ввел такое обозначение осей, что бы те, кто работает с SDK для мультиплеера, не путались – там координаты поименованы подобным образом. Level_ID указывает, к какой локации относится тот или иной объект, окно Story_ID рекомендую не трогать, по умолчанию новому объекту добавляется значение -1. Если к объекту привязан какой-либо управляющий скрипт, его текст отражается в окне внизу. Таким образом, наша Нива должна респауниться на локации l01_escape (то есть , на Кордоне), в точке с координатами -239,8912/ -19,43/ -123,0998, с углом поворота относительно вертикальной оси -15 градусов. Это значения «по умолчанию» и они вполне корректны, то есть, оставив все как есть, вы не рискуете обнаружить потом свою машину, висящую где-нибудь на дереве или застрявшей в заборе. Не удивляйтесь отрицательному значению высоты, поскольку центр координат локации Кордон расположен на дороге, неподалеку от автобусной остановки, лагерь же новичков относительно этого места лежит в низине. При желании можете немного поэкспериментировать с числами в окнах «Корд. X/Y/Z», не забудьте подтвердить изменения (нажав «Принять изменения», сохраните строчку, иначе данные пропадут, если вы уберете маркер с редактируемого объекта). После этого сохраняете свой файл all.spawn (Файл - Сохранить), все, можно запускать S.T.A.L.K.E.R. и начинать новую игру. На выходе из бункера Сидоровича вас будет встречать автомобиль, заспауненный лично вами. Поздравляю
2.3 Известно, что «по умолчанию» новоявленные автомобили чрезвычайно хрупки и взрываются буквально от первого же столкновения с забором. Устраняется эта проблема моментально. В папке Source ищем файл veh_niva_u_01 и копируем его в папку D:\Games\S.T.A.L.KE.R.\gamedata\config\models\vehicles. Это файл конфигурации автомобиля. Открываем его блокнотом и ищем раздел [immunities], после чего выставляем все параметры (burn_immunity, strike_immunity и т.д.) равными нулю. Сохраняем и закрываем файл. Теперь ваша Нива неуничтожима в принципе. Небольшая ремарка, повреждения для дверей и крышки багажника считаются отдельно и после парочки столкновений можно лишиться нескольких деталей корпуса, но, думаю, без дверей вы уж как-нибудь покатаетесь. Рекомендую сразу же в ту же папку перенести файлы остальных машин и проделать с ними те же операции. Все.
3 Поиск координат и расстановка объектов на других локациях.
Накатавшись вволю по Кордону, вы, несомненно, захотите попутешествовать по остальным локациям уже на своих четырех. Вот тут вы и столкнетесь с проблемой, поскольку точка перехода Кордон-Свалка находится в здании за шлагбаумом, куда машина, по понятным причинам, не пролазит. Это значит, что вам понадобится новый автомобиль, который встречал бы вас на Свалке. В общем случае речь может идти не только о машинах, но и о монстрах, артефактах, сталкерах, предметах и прочих объектах. Для спауна любого предмета необходимо, как мы уже убедились, задать координаты той точки, где он появится. Алгоритм следующий: спаунимся на локацию, куда вы хотите добавить объект, визуально выбираем наиболее подходящую для этого точку и фиксируем ее координаты, выходим из игры, создаем интересующий нас объект с заранее полученными координатами, вновь спаунимся и проверяем корректность добавления объекта. Теперь опишем все это более подробно на примере автомобиля. 3.1 Допустим, вы хотите поместить белую Ниву неподалеку от перехода Армейские склады – Бар. В окне списка объектов поставьте маркер на первый объект. В окне «Поиск» наберите level_changer. Уже в процессе набора маркер переместиться на объект номер 284, который и будет нашим первым левел-ченджером. Level_cahnger, это точка, в которой расположен триггер, который выдает на экран окошко «Вы хотите перейти на другую локацию?». Объект за номером 284 с именем exit_to_garbage_01 отвечает за переход Кордон-Свалка и нам он не нужен. Нажимайте кнопку «Следующий» до тех пор, пока маркер на остановится на нужной нам точке перехода. Определить, какой level_changer за что отвечает, достаточно просто, смотрите на имя объекта, он подскажет в какую локацию переносит вас триггер. Триггеры одной карты обычно группируются вместе. Объекты 5286 (exit_to_bar_01) и 5287 (exit_to_radar_01) явно принадлежат к одной локации, по совокупности того, куда ведут выходы, можно определить, что триггеры принадлежат Армейским складам, только с нее есть выходы на Бар и Радар. Отлично, значит нас интересует номер 5286 exit_to_bar_01 с координатами (-372,6236/ -21,69933/ -4,806515). Запомните эти числа, затем открывайте строчку 63 actor (это вы), меняйте в поле Level_ID l01_escape на l07_military, измените ваши текущие координаты на координаты точки перехода (-372,6236/ -21,69933/ -4,806515), сохраняйте строчку («принять изменения») и файл («Файл - Сохранить»). Обратите внимание, сразу после загрузки вы попадете в триггер выхода. Это не страшно, достаточно нажать «нет» и вы появитесь на локации Армейские склады. Если же это обстоятельство вам неприятно, попросту измените горизонтальные координаты на 1-2 метра. 3.2 Начинаем новую игру. После загрузки и отказа переходить на другую локацию, нам необходимо найти подходящее место для расположения автомобиля и определить его координаты. Делается это одним из следующих способов. a) В консоли прописываем команду «rs_stats on» без кавычек и слева на экране появится статистическая информация. Нас интересует последняя строчка Camera position, которая отражает текущие координаты камеры. Почему я заостряю на этом внимание. Камера поднята над поверхностью на 1,5 метра, поэтому, когда будете вписывать данные для спауна, вычитайте из вертикальной координаты полтора метра. Топаем ножками на понравившуюся площадку и записываем на листочке цифры с экрана. b) Точно так же топаем ножками на понравившееся место и там сохраняемся с помощью quiksave(F6). c) Принимая во внимание, что вы появляетесь на карте с болтами и биноклем в карманах, ваша персона может сильно заинтересовать недружественных товарищей и мутантов. Дабы обезопасить себя во время проведения топографических съемок, набирайте в консоли команду «demo_record 1», которая освобождает камеру, давая возможность «полетать» по уровню. Управлять камерой просто, нажимаете «огонь» и летите вперед («прицел» - назад), стрелки отвечают за поворот вокруг осей. Далее аналогично – прилетаем на место, запускаем «rs_stats on» и записываем текущие координаты. 3.3 Выходим из игры. Если вы сохранялись при помощи быстрого сохранения, ставьте маркер на объект 63 actor и нажимайте кнопку «Получить координаты из файла сохранения». В окошках должны появится те же самые данные, что вы получили при помощи «rs_stats on». Единственное дополнительное преимущество состоит в том, что при загрузке данных с сейва вы получаете также данные об угле поворота вашего персонажа. Это вам поможет в том случае, если вы хотите определенным образом сориентировать вашу машину относительно, скажем, дороги или другой техники.
3.4 Добавить объект - Транспорт - Niva_White. В поле Level_ID выбираем l07_military (если оно уже не стоит там по умолчанию), в поля координат заносим данные, полученные в п.3.2 Сохраняем строчку и файл. Снова запускаем новую игру. Если вы ничего не изменяли в actor, то вы появитесь в том же месте, что и в прошлый раз, на дороге по пути к Бару, а пробежавшись немного вперед, обнаружите свежепоявившуюся Ниву белого цвета. Если кому-то интересно, автомобиль на скриншоте заспаунен в координаты (-305,38/-22,53/61,93), углы поворотов относительно осей (0/0/0). Это важно – когда будите вписывать числовые значения координат, дробная часть отделяется от целой с помощью запятой. Если вы поставите точку, при сохранении редактор выдаст ошибку. Вот таким образом вы можете получать и присваивать нужные координаты любым объектам, начиная от табуретки и заканчивая вертолетами. Внимание, при создании объектов на других локациях всегда сохраняйте изменения и обращайте внимание на то, какое значение Level_ID у вас сохранено. Нередки случаи, когда вместо того, что бы расквартироваться по всей Зоне, монстры сосредоточились на Кордоне, из-за того, что моде (известный вам Бастард), забыл сменить левел _айди у части монстров.
4 Добавление новых монстров
С чисто технической точки зрения заспаунить, скажем, бюрера, никаких трудностей не представляет. Выполняйте все те же операции, что и для автомобиля. То есть, выбираем Добавить объект а Mutants а Burer, корректируем координаты и локацию, если есть необходимость, сохраняемся, заходим и любуемся. НО !!! Каждый житель Зоны, от тушкана до сталкера, должен быть зафиксирован в куче файлов: статистика, описание, инвентарь (то, что вы видите, нажав «обыскать труп») и прочее. Давать описание того, что нужно сделать в каждом фале, это слишком долго и муторно, получится гора сухой писанины, причем, не факт ни я (при наборе) ни вы (при переписывании) не допустим какую-нибудь ошибку. А отсутствие простой запятой в одном файле может привести к крашу игры. Поэтому лучшим выходом из ситуации будет, если вы найдете любой мод, добавляющий монстров и найдете там необходимые файлы, которые нужно добавить/заменить в игре.
Обратите внимание, что у вас есть возможность добавлять не только новых монстров и машины, но и спаунить оружие, предметы, артефакты, старых монстров, сталкеров и проч. Если хотите, выложу и про это...
1: Спавн ГГ Тут ничего сложного нету, открываеш all.spawn, в поиске ищеш actor (только в Entity) и меняеш его координаты (не забудь выставить Level_ID) вот собственно и всё 2: Спавн предметов в рюкзаке у ГГ В этом же параметре actor есть скрип в котом прописаны все предметы он выглядит так: ][spawn] wpn_binoc detector_simple novice_outfit device_torch
далее берём и вписываем названия предметов, оружия, патронов после device_torch, количество указываетсо = xxx (где х - число), тоже всё 3: Спавн НПС Тут тоже ничего сложного, ищем в поиске к примеру контролёра, вводим m_controller и видим в табле ниже m_controller_normal(normal - сила контролёра), далее добавляем его в базу, потом выбираем этого контролёра в базе, выбераем Level_ID и добавляем столько сколько нужно , прописываем координаты и фсё запускаем и мочим 4: Спавн аномалии Насечот аномалий не знаю (никогда не пробовал спавнить) но всётки помоему тут всё просто. Ищем в поиске zone_xxx (х - название аномалии) к прмеру zone_gravi, в табле ниже м ыувидим zone_gravi_zone_weak, добавляем в базу и спавним [dont_spawn_character_supplies]
Вот тебе все добро при спауне у тебя в инвентаре. все уникальное, плюс три комбеза (зеленый ученый, экзоскелет и Скат, вроде бы ).
вот только обрати внимание, что все это добро разом весит почти тонну двести кэгэ. поднимай грузоподъемность или не жадничай. А вот если появится желание скинуть это все и распихать по нычкам - не советую. Достаточно выкинуть пару сотен патронов и игра начинает подтормаживать.
Активация артефактов Распишу по пунктам как добавить например к "огненому шару" аномалию Жарка... Открываете файл: gamedata/config/misc/artefacts.ltx И там в самом начале файла такая секция: ;Артефакты, которые при активизации создают аномальные зоны ;формат: {секция_артефакта} = {секция_зоны},Radius,Power [artefact_spawn_zones] af_medusa = zone_mosquito_bald_weak, 2.0, 30.0
Обозначает что артефакт af_medusa при активации создаст аномальную зону zone_mosquito_bald_weak с радиусом 2 метра и мощностью 30 (возможно влияет и на время жизни аномалии) Кончается этот список по идее строчкой: mp_af_electra_flash = zone_witches_galantine, 3, 50.0 и сразу после неё пишете: af_fireball = zone_zharka_static, 3, 30.0 В принципе можно прописать там не статик а zone_zharka_weak незнаю что из них правильнее использовать... статик работает тоже.В той-же папке есть файл zone_zharka, где описаны свойства зон _weak, _average, _strong( слабая, средняя, сильная), а также зона zone_zharka_static. После этого у вас игра станет вылетать с ошибкой про невозможность обнаружить последовательность описывающую анимацию активации аномалии. А это всё там же в начале файла чуть ниже того где вы добавили новый артефакт в список есть такие строчки: [af_activation_gravi] ;---------------------------------------------------------------------------------------------------------------------------------------- ;format: time(sec), sound_name, light_R,G,B, light_range, particle_name, af_animation_name ;---------------------------------------------------------------------------------------------------------------------------------------- st arting = 5.0, anomalygravi_idle00, 0.5, 1.0, 1.5, 5.0, "anomaly2artefact_gravi_blast_start", "idle" flying = 2.0, anomalygravi_idle01, 0.8, 1.0, 1.2, 3.0, "anomaly2artefactartefact_gravi", "idle" idle_before_spawning = 5.0, anomalygravi_blowout5, 1.0, 1.0, 1, 0.0, "anomaly2artefact_gravi_blast_finished", "idle" spawning = 1, anomalygravity_entrance, 0.9, 1.1, 1.01, 0.0, "", "idle"
Что как раз и описывает анимацию.. По-хорошему надо написать свою анимацию к жарке но это честно говоря не обязательно... потому что нам сейчас важна не красота а работоспособность.... Так вот... из заголовка "[af_activation_gravi]" берем название последовательности af_activation_gravi и ищем сам артефакт af_fireball (кто уже забыл зачем, мы на него собирались вешать новую активацию) Найдете что-то вроде: [af_fireball]:af_base GroupControlSection = spawn_group $spawn = "artifactszharka fireball" $npc = on ; option for Level Editor ;$prefetch = 3 cform = skeleton class = ARTEFACT
visual = physicsanomalyartefact_fire.ogf description = enc_zone_artifact_af-fireball inv_name = af-fireball И где-нибудь тут добавляете строчку: artefact_activation_seq = af_activation_gravi И на этом всё. Прописываем в artefacts.ltx в блоке [af_base]:identity_immunities вместо ;slot=10 вот это: slot=1. Насколько я знаю, знак ; зоначает, что строка закомментирована(неактивна) У себя я прописывал slot=1 между строчками inv_name = af-electra-moonlight inv_name_short = inv_weight = 0.05 slot = 1 inv_grid_x = 10 inv_grid_y = 10 для того артефакта, который хочу активировать. В игре берем артефакт в первый слот и активируем. By XiaNi Получено с http://www.stalkerin.gameru.net/wiki...82%D0%BE%D0%B2
Добавление статей в PDA Добавление статьи На примере статьи из Artefact Activation Mod разберем их добавление в PDA: • Добавим в файл 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>
Редактирование NPC Вступление В этой статье мы научимся редактировать NPC: изменять содержимое их инвентаря, реплики, поведение, имя, и другие параметры. Параметры За параметры 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--------------------->
<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--------------------->
Создание новой группировки Новая группировка Сегодня мы создадим новую группировку. Назовем её, скажем, "Ветер". Не суть важно. Практика: Базовый уровень 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
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*****ipt ищем строку 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*****ipt прописываем в local simMaxCount = { после строчек с зомбированными сталкерами строку: wind_novice = 20, wind_regular = 20, wind_veteran = 20, wind_master = 6, 5. Чтобы при убийстве непися новой группировки игра не вылетала в xr_statistic*****ipt, после строки: 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_desk_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_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_tas k</precondition> </dialog> Соответственно, пройдем туда, куда указывает строка task_manager.init_dolg_task_dialog - в task_manager*****ipt: function init_dolg_task_dialog(dlg) get_random_task():init_task_dialog(dlg, "dolg") По аналогии делаем и с нашим "Ветром". Вступление в группировку: Реализуем возможность вступления в группировку. Прописываем в dialogs*****ipt такие 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>. Советую изучить урок, посвященный диалогам. [править] Новые NPC Лучше всего всё вышеприведенное повесить на нового, уникального персонажа. Способ его спавна описан здесь.
Вычисляем координаты Нашел на одном форуме, достаточно интересно. Как получить координаты для спавна предмета или НПЦ. Скрипт сей найден на каком-то форуме, проверен и работает функция спавна имеет вид alife():create(section,position,levelvertex,gameve rtex) Где: section - имя того/чего спавним position,levelvertex,gamevertex - координаты, позиция вершины обьекта, и сектора карты. Напишу подробно, как очень про100 их узнать: Заходим, предварительно распаковав, в каталог gamedata/scripts/ И там в файле ui_main_menu*****ipt в конце дописываем это: function main_menu:OnButton_credits_clicked() 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 Теперь в игре идём на то место (или ногами или деморекордом), где спавним обьект, выходим в меню игры, и жмём на клавишу СОЗДАТЕЛИ (CREDITS) - соответственно нашему взоры не предстаёт никакой список создателей, а мы услышим звуковой сигнал, после чего выходим в игру из меню, и в строке сообщений высветиться вся инфа. Всё - F12 или на бумажку.
В этой статье мы научимся редактировать NPC: изменять содержимое их инвентаря, реплики, поведение, имя, и другие параметры. Параметры
За параметры 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> - Диалоги с игроком. Практика
Изменим некоторые параметры. Выдадим ему FN2000 и Desert Eagle, примем в "Долг" и сделаем неограниченное количество денег: <!---------------------esc_wolf--------------------->
Файлы: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 и пишем:
Код <action>ваше_название_скрипта.ваше_название_функция</action>
Например в dialogs_trading.xml в диалоге doctor_dialog_start после фразы doctor_dialog_start_13 Пишем <action>ваше_название_скрипта.ваше_название_функции</action>
Теперь после того как поговорите с Доктором (NLC5) по заданным координатам появится рюкзак.
Совет от пользователя stalker
Создание новой группировки
Сегодня мы создадим новую группировку. Назовем её, скажем, "Ветер". Не суть важно. Практика Базовый уровень
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
Также, изменим эту строку, добавив туда имя и номер группировки: ;названия группировок 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
4. Если предусматривается респавн бойцов новой группировки, в se_respawn.script прописываем в local simMaxCount = { после строчек с зомбированными сталкерами строку: wind_novice = 20, wind_regular = 20, wind_veteran = 20, wind_master = 6,
5. Чтобы при убийстве непися новой группировки игра не вылетала в xr_statistic.script,
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>
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>
Этим мы добавили ему ветку диалога "Есть работа?", а также ветку для награды за квест/отказа от него. Теперь зарегистрируем в task_manager.ltx набор новых заданий.
[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>. Советую изучить урок, посвященный диалогам. Новые NPC
Лучше всего всё вышеприведенное повесить на нового, уникального персонажа. Способ его спавна описан здесь
Сегодня мы на примере научимся созданию новых артефактов. Создадим, например, артефакт под названием "Ромашка". Статья написана по материалам Hunter Mod. Создание конфига Заходим в папку gamedata\config\misc и открываем файл artefacts.ltx. И находим, например, артефакт "Медуза": [af_medusa]:af_base GroupControlSection = spawn_group $spawn = "artifacts\moscito medusa"
[af_medusa_absorbation] burn_immunity = 1.0 ;коэффициенты иммунитета strike_immunity = 1.0 shock_immunity = 1.0 wound_immunity = 1.0 radiation_immunity = 1.0 telepatic_immunity = 1.0 chemical_burn_immunity = 1.0 explosion_immunity = 1.0 fire_wound_immunity = 0.98 В этой секции задаются параметры артефакта, начиная от внешнего вида и заканчивая коэффициентами различных эффектов вроде вывода радиации. Сделаем копию секции, принадлежающей "Медузе", и заменим её название с af_medusa на af_romashka.
Должно выйти примерно вот так: [af_romashka]:af_base GroupControlSection = spawn_group $spawn = "artifacts\moscito romashka"
Назначение некоторых параметров, влияющих на одевшего артефакт: • health_restore_speed - прирост к скорости восстановления здоровья • radiation_restore_speed - прирост скорость вывода радиации • satiety_restore_speed - прирост к голоду • power_restore_speed - прирост к выносливости • bleeding_restore_speed - прирост к скорости остановки кровотечений Создание описания и имени артефакта Заходим в gamedata\config\text\rus и открываем файл string_table_enc_zone.xml. Добавим туда строку с названием артефакта. <string id="af-romashka"> <text>"Ромашка"</text> </string> Теперь у артефакта есть имя, но одного его недостаточно. Нужно сделать описание. Поэтому добавим и его. <string id="enc_zone_artifact_af-romaska"> <text>Очень странный артефакт. Впервые появился в Зоне где-то в 2011 году, но толку от него - ноль. Ученые не обнаружили никакого влияния артефакта на организм носителя.</text> </string> Все, поздравляю, вы только что создали свой первый артефакт!
В игре существует такой объект как "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)
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);
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) Создаст телепорт возле выхода из бункера Сидоровича. Наш телепорт перебрасывает игрока на вышку блокпоста (перед выходом с уровня).
Как вы наверно заметили, в папке с игрой содержатся несколько файлов типа gamedata.dbN , где N – это число или буква. Это игровые архивы, в которые запакованы все файлы конфигураций, видеоролики, музыка, звуки, скрипты и прочее. Можно их править HEX-editor’ом, но лучше скачать специальную утилитку STALKER_Data_Unpacker и распаковать в отдельную папку(с именем gamedata, позже поймёте почему) их содержимое. Вот после этого можно начать разгребать весь тот мусор, который вы извлекли. Структура файлов и папок: Рассмотрим, что-же содержится в папке gamedata: Папка ai – в ней содержатся файлы типа *.efd, через которые очевидно управляется искусственный интеллект тех же npc например. Папка anims – здесь и так всё понятно, игровая анимация, а также эффекты камеры. Папка config содержит в себе многие игровые параметры, к ней мы ещё вернёмся. Папка levels – это игровые уровни, ака локации, на которые поделена игра (как карты в CS) Папка meshes – игровые модели, в формате .ogf Папка scripts – скрипты Папка shaders – шейдеры, для двух рендеров(DX8 и 9) Папка sounds – звуки и музыка, кот. используются в игре. Формат .ogg* Папка spawns – отвечает за самую ужасную вещь в игре – респаун противников и др. людей, животных. Папка textures – в ней содержаться текстуры домов, оружия, монстров и др. Формат - .dds(DirectDraw Surface Image) Файлы: game.graph, gamemtl.xr, lanims.xr, particles.xr, resource.h, senvironment.xr, shaders.xr, shaders_xrlc.xr, stalkergame.inf. В звуках, кстати, можно найти много интересного, например: в папке sounds\car содержатся звуки машин(которых в игре нет), а sounds\music\harmonica_1.ogg – файл губной гармошки. Ах да, чуть не забыл, самый главный лол, это файл sounds\car\trabantnoise.ogg --------------------------------------------- Введение в моддинг: Именно с папкой config придётся работать для редактирования многих параметров игры. Но начнём сначала: Перед тем, как начать редактирование файлов игры, нужно в каталог Сталкера поместить ту самую папку gamedata, в которую были извлечены игровые файлы. *Все файлы нам не понадобятся, поэтому можно оставить только папки config, scripts(а конкретно файл se_respawn.script), textures, sounds, а всё остальное удалить(а можно и не удалять) Также хочу заметить, что если распаковать все архивы .dbN в папку с игрой, то это может дать несколько дополнительных FPS.
Текстуры: В папке textures лежат файлы формата .dds, которые можно открыть программой Nero PhotoSnap Viewer(входит в состав NERO7) например или windows texture viewer (63кб), и там же отредактировать по вкусу. Так, например, существует мод, уменьшающий размер PDA Меченого. Текстура PDA находится по адресу textures\ui\ui_pda.dds.
Скрипты: se_respawn.script – файл, отвечающий за респаун. Время респауна можно уменьшить, путём небольших изменений в этом файле. Он открывается обычным блокнотом(notepad). Ищем в нём строку idle_time:setHMSms( 0, 0, 0, math.random(self.idle_spawn_min, self.idle_spawn_max)*1000) и меняем её на idle_time:setHMSms( math.random(X, Y), 0, 0, math.random(self.idle_spawn_min, self.idle_spawn_max)*1000) где X и Y - числа, задают диапазон случайной переменной в часах отвечающей за респаун.
Звуки и музыка: Любой файл в папке sounds можно заменить на другой, но при этом нужно сохранить все параметры звукового файла, который был использован в игре. Например, чтобы заменить музыку в приёмнике у Сидоровича, нужно файл sounds\scripts\magnitofon\magnitofon_2.ogg, заменить на любой другой.(У оригинального файла винамп мне выдал свойства: Average bitrate : 60 kbps Nominal bitrate : 80 kbps Channels : 1 Sampling rate: 44100 Hz.
2.
Config/Weapons: Параметры оружия вы можете найти в папке config\weapons, файлы типа w_ak74.ltx открываются тоже блокнотом. Разберём содержимое файла например w_groza.ltx Во первых стоит обратить внимание на значение пременной(буду их так называть) cost, это цена оружия, т.е. сколько гроза будет стоить у продавца. Переменная weapon_class означает, к какому классу относится оружие, в данном случае - assault_rifle. ammo_limit – лимит боеприпасов(в игре по-моему не используется) ammo_mag_size – размер магазина. Можно поставить например 900, тогда о перезарядке можно совсем не вспоминать. ammo_class – класс патронов, используемых оружием. Здесь [/b]ammo_9x39_pab9[/b], ammo_9x39_sp5, ammo_9x39_ap. hit_power – сила оружия. Чем больше, тем лучше silencer_hit_power - сила оружия, когда на него одет глушитель. misfire_probability - вероятность осечки при максимальном износе. condition_shot_dec - увеличение износа при каждом выстреле. visual – модель оружия. zoom_enabled - поддерживается ли оптика. Config/Сreatures: actor.ltx – параметры главного героя. В этой же папке находятся файлы с параметрами npc, монстров и пр. Рассмотрим некоторые переменные на примере actor.ltx visual – модель персонажа. max_walk_weight - максимальный вес, при достижении которого игрок перестает двигаться. pickup_info_radius – радиус от ГГ, в котром над предметами выводятся их названия. camera_height_factor – высота ГГ. По умолчанию стоит 0.85, но можно увеличить рост ГГ до 0.95 например. disp_base – разброс. Если уменьшать, то и разлёт уменьшается соответственно. wound_incarnation_v - скорость заживления раны. cant_sprint_power_begin - порог силы меньше которого актер не может бежать в спринте. hit_probability_gd_novice hit_probability_gd_stalker hit_probability_gd_veteran hit_probability_gd_master Эти строчки отвечают за вероятность попадания по вам, при разных уровнях сложности. Хотите чтобы враги стреляли не очень метко, уменьшайте значения. Также в файле присутсвуют комментарии на русском языке, так что разобраться в остальных переменных не составит труда.
Config/System.ltx: start_blood_size - размер раны чтоб начала капать кровь. stop_blood_size - размер раны чтоб кровь остановилась. max_weight – вес, с которым ГГ может бежать.
Config/Misc.ltx: В дополнение к конфигам оружия: cвойства патронов находятся в файле weapons.ltx, а бронежилетов – в outfit.ltx. Свойства артефактов находятся в файле artefacts.ltx и файлах zone_ART.ltx, предметов – items. ltx, где ART – название артефакта(например zone_gravi.ltx). Параметры артефактов: health_restore_speed - скорость восстановления здоровья (0.0001 = +100%) radiation_restore_speed - скорость накопления радиации (0.0004 = 4). Если поставить отрицательное число, то артефакт будет ускорять выведение радиации. idle_particles – если закоментить её символами «--« -, то аномалия исчезнет. Чтобы отключить звуковое оповещение, то находим строку visible_by_detector и меняем on на off. Иммунитеты: strike_immunity - удар. shock_immunity - электрошок. chemical_burn_immunity - химический ожог. telepatic_immunity - телепатия. radiation_immunity - радиация. wound_immunity - разрыв. explosion_immunity - взрыв. fire_wound_immunity - огнестрел.
items.ltx: Параметры предметов: В этом файле в квадратных скобках написан тот предмет, чьи параметры идут ниже, за квадр. скобками. Например: [kolbasa]:identity_immunities. Параметры на примере колбасы: class – к какому классу принадлежит предмет. visual – модель. cost – цена. eat_health – сколько восстанавливает здоровья.(если будет 0, то колбаса лечить не будет.) eat_power - сколько восстанавливает силы. eat_radiation - сколько выводит/или добавляет радиации. (Насчёт этого не уверен, надо тестить.) inv_weight – вес предмета.
Outfit.ltx: Параметры костюмов: actor_visual – модель костюма. inv_weight – вес костюма. cost – цена костюма. коэффициенты иммунитета самого костюма: burn_immunity см. коэффиц. ... fire_wound_immunity ; NO RESISTANCE burn_protection - коэффициент защиты от огня strike_protection - коэффициент защиты от пуль shock_protection - коэффициент защиты от молний wound_protection - коэффициент защиты от кровотечений (?) radiation_protection - коэффициент защиты от радиации telepatic_protection - коэффициент защиты от телепатии chemical_burn_protection - коэффициент защиты от хим. ожогов. explosion_protection - коэффициент защиты от взрыва fire_wound_protection - коэффициент защиты от кровотечений(от огня) nightvision_sect – тип ночного видения(плохой/хороший). Если ПНВ нету, то строку добавить, если его нужно убрать, строку закомментируйте(--)
Торговцы: Вещи, которые продают торговцы можно отредактировать(добавить/убрать) в файлах с именем trade_YYY.ltx[.B], где [b]YYY[.B] – это имя торговца(например [b]trade_barman.ltx[.B]) Итак, поехали: Структура файла на самом деле очень проста, под зачком ; прописаны сами предметы, а после него – комментарий(чтоб понятно было). Например ;Аммуниция. В квадратные скобки заключены([barman_generic_buy]), как бы сказать, “условия”. Лучше показать на примере: В самом начале(практически) файла trade_barman.ltx идёт строка содержания [barman_generic_buy], т.е. она означает, что ниже прописанные предметы торговец может купить. Сами предметы например: ;Артефакты af_medusa = 1, 0.3 af_cristall_flower = 1, 0.3 af_night_star = 1, 0.3 af_vyvert = 1, 0.3 af_gravi = 1, 0.3 af_gold_fish = 1, 0.3 af_blood = 1, 0.3 af_mincer_meat = 1, 0.3 или ;ADDONS wpn_addon_scope = 0.7, 0.2 wpn_addon_scope_susat = 0.7, 0.2 Посмотрим какие ещё “условия” содержит этот файл и их значение: [supplies_start] - начальный ассортимент [supplies_after_darkvalley] - ассортимент, после выполнения квеста в тёмной долине [supplies_after_brain] - ассортимент, после “выжигателя мозгов” [barman_start_sell] - цены по которым торговец(бармен в данн. сл.) продает в начале [barman_after_darkvalley_sell] - аналогично [barman_after_brain_sell] Итак: чтобы добавить предмет к торговцу, после строки [supplies_start], находим интересующую нас категорию(а это может быть: ;Аммуниция/;Оружие/;Броники/;Медикаменты/;Еда и др.) и после всех прописанных в данной категории предметов добавляем ещё одну строчку для своего предмета(а именно название модели(т.к. оно совпадает с названием самого предмета) и после знака = параметры(о них чуть ниже)). Ну я так и знал что вы ничего не поймёте, поэтому пример: Чтобы добавить бармену винтовку Гаусса, находим строки после условия [supplies_start] - ;Оружие wpn_pb = 3, 0.6 wpn_walther = 3, 0.6 wpn_mp5 = 3, 0.6 wpn_ak74u = 3, 0.5 и внизу прописываем wpn_gauss = N, n.n *о значениях после знака = см. ниже. Все имена оружия, амуниции, снаряжения и т.п. можно найти в папках gamedata\meshes\equipments, gamedata\meshes\weapons, gamedata\meshes\food. Заметьте, что wpn_gauss нужно писать без расширения .ogf Значения: После знака = у вальтера например стоит цифра 3, а после запятой – 0,6. Первое, для гаусса у нас стоит N, это количество(в штуках) предметов. Т.е. если поставить значение 999, то у бармена будет 999 гауссов. А второе: 1. В разделах supplies вторая цифра это вероятность появления данного предмета. 2. В разделе buy - первая цифра максимальная цена покупки, вторая минимальная (зависит от отношения торговца к Меченному - рейтинг, репутация)[Предположительно. – прим.] 3. Соответственно в разделах sell - первая цифра минимальная цена продажи, вторая - максимальная (точнее множитель на "истинную цену" предмета). Tnx GreyL. В итоге должно получиться: [supplies_start] ;Оружие wpn_pb = 3, 0.6 wpn_walther = 3, 0.6 wpn_mp5 = 3, 0.6 wpn_ak74u = 3, 0.5 wpn_gauss = 6, 0.6 И тогда у торговца мы получим ровно 6 винтовок Гаусса.
3.
При заходе на экран главного меня муз. заставка будет выбираться случайно из добавленных вами. 1. В директорию gamedata\sounds\music\ положить два канальных ogg-файла с нужной музыкой, например: my_music_l.ogg (левый канал) и my_music_r.ogg (правый канал) 2. В текстовом редакторе открыть файл gamedata\config\ui\ui_mm_main.xml, найти в нем строку:
и заменить на:
3. В этом же файле найти строку: music\wasteland2 и ниже нее выставить следующую строку: music\my_music 4. Сохранить файл. 5. Если требуется вставить больше муз. заставок, то в параметре random укажите их количество. NPC покупают оружие: Чтобы обычные сталкеры и др. npc могли покупать у ГГ оружие, нужно править файл gamedata\config\misc\trade_generic.ltx. Его структура точно такая же, как и у любого другого торговца. После строки [generic_buy] находим строку ;Оружие и после неё у каждого вида ставим зачения N и n.n. Можно например так: ;Оружие wpn_pm = 0.08, 0.12 wpn_pb ;NO TRADE wpn_fort = 0.08, 0.12 wpn_hpsa = 0.08, 0.12 wpn_beretta = 0.08, 0.12 wpn_walther = 0.08, 0.12 wpn_sig220 ;NO TRADE … … А чтобы у npc продавалось оружие, нужно проделать тоже самое, только после строки [generic_sell] Метод я проверял, вроде как работает. Чтобы после покупки персонаж не выкидывал купленное оружие(а также чтобы подбирал его с земли), в файле gamedata\config\creatures\m_stalker.ltx строку can_select_items = off меняем на can_select_items = on и строку use_single_item_rule = on меняем на use_single_item_rule = off .
Транспорт: Рассмотрим параметры машин, конфиги находятся в папке gamedata\config\models\vehicles. [car_definition] – после строки идут коментарии на русском языке, перейдём сразу к следующему. … --Factory parameters of Engine -- - параметры двигателя(описание не претендует на совершенно точное) fuel_tank – вместимость бака. engine_power – мощность двигателя. hand_break_torque - сила торможения [damage_items] – повреждения частей машины back_left_wheel - заднее левое колесо back_right_wheel -заднее правое колесо front_left_wheel -переднее левое колесо front_right_wheel - переднее правое колесо left_door - левая дверь right_door - правая дверь [immunities] burn_immunity = 0.5 ;коэффициенты иммунитета strike_immunity = 0.1 shock_immunity = 0.0 wound_immunity = 0.01 radiation_immunity = 0.0 telepatic_immunity = 0.0 chemical_burn_immunity = 0.0 explosion_immunity = 0.4 fire_wound_immunity = 0.0005 P.S. Чтобы сделать вид от третьего лица, в файле user.ltx(ну если не знаете где он находится, то специально для вас в Microsoft сделали поиск в Windows) пишем после строки unbindall: bind cam_1 kF1 bind cam_2 kF2 bind cam_3 kF3 В игре жмём кнопки F1, F2 или F3 для смены вида. Очень нужно при езде на БТР cool
Объекты, которые можно перемещать: В файле system.ltx в конце есть строка [ph_capture_visuals], после неё идёт список перетаскиваемых вещей. Например чтобы можно было таскать монстров, в конец добавляем: //Monsters monsters\mutant_boar\mutant_boar monsters\krovosos\krovosos monsters\kontroler\kontroler monsters\dog\dog monsters\flesh\flesh monsters\dog\dog_cmn_1 monsters\flesh\flesh monsters\poltergeist\poltergeist monsters\pseudodog\pseudodog monsters\snork\snork monste rs\burer\burer monsters\chimera\chimera monsters\cat\cat monsters\zombi\zombi_1 monsters\rat\rat_1 monsters\tushkano\tushkano
Как сделать так, чтоб не убиралось из рук оружие в некоторых локациях?: В файле gamedata\scripts\sr_no_weapon.script найти и закомментировать (поставить перед ними --) строки bind_stalker.hide_weapon() bind_stalker.restore_weapon() и в файле zone_no_weapon.script ищем строки hide_weapon() и заменяем их на restore_weapon() Способ подходит и для предыдущего файла.
Как приделать к оружию оптику, глушитель, подствольник?: Находим в файле оружия строку ;addons и пишем после(без комментарие естественно(или перед ними ставьте + значения после знака = можно менять): ;addons scope_status = 2 0 - нет,1 - несъемный, 2 - можно ставить прицел silencer_status = 0 0 - нет,1 - несъемный, 2 - можно ставить глушитель grenade_launcher_status= 0 0 - нет,1 - несъемный, 2 - можно ставить подствольник zoom_enabled = true Вкл/выкл возможность зума scope_zoom_factor = 50 значение зума scope_name = wpn_addon_scope название прицепляемого прицела scope_x = 47 положение прицела на картинке, x scope_y = 0 положение прицела на картинке, y silencer_name = wpn_addon_silencer название глушителя silencer_x = 218 положение глушителя на картинке, x silencer_y = 9 положение глушителя на картинке, y grenade_launcher_name= wpn_addon_grenade_launcher название подствольника grenade_launcher_x = 126 положение подствольника на картинке, x grenade_launcher_y = 24 положение подствольника на картинке, y
Как убрать/увеличить время для обычных квестов?: В файле gamedata\config\misc\task_manager.ltx найти и изменить все строки вида time = 86400 Чтобы совсем убрать лимит - просто закомментировать их (--)
Как убрать intro-ролики в начале?: В свойствах ярлыка прописываем после пути к exe-шнику: -nointro Получиться должно что то вроде(это как у меня): "D:\Games\S.T.A.L.K.E.R. Shadow of Chernobyl\bin\XR_3DA.exe" -nointro
Как включить motion blur?: В свойствах ярлыка прописываем после пути к exe-шнику: -mblur В файле user.ltx(можно и в консоли) параметру r2_mblur присваиваем значение например 0.15 Работает только на DirectX 9.
Как увеличить время спринта?: В файле actor.ltx меняем параметр sprint_koef.
Как поменять кол-во жизни монстрам?: В файле m_*.ltx(где * - название монстра, например m_controller.ltx; находится в папке gamedata\config\creatures) меняем параметр health
Как повесить на пояс больше артефактов?: В файле system.ltx изменяем параметр max_belt с 5 на 10 (max_belt = 10)
что соответствует 10 артефактам. При желании поправив соответствующим образом файлы system.ltx и inventory_new.xml можно получить 12,14,16 и более слотов под артефакты.
всё предельно просто и понятно...
4.
В файле конфига выбранного оружия меняем: position = 0, -0.075, 0 ; было 0,0,0 zoom_offset = -0.112400,0.091800,-0.115000 ; было -0.112400,0.016800,-0.115000 Где найти файл user.ltx?: Для Windows XP в директории X:\Documents and Settings\All Users\ Общие документы \STALKER-SHOC Для Windows Vista в директории X:\Users\Public\Documents\STALKER-SHOC
Как изменить силу врагов?: В файле gamedata\config\creatures\actor.ltx найти строки hit_probability_gd_novice = 0.20 hit_probability_gd_stalker = 0.30 hit_probability_gd_veteran = 0.40 hit_probability_gd_master = 0.50 Они отвечают за вероятность попадания по вам при разных уровнях сложности.
Гармошка: Для возврата в игру губной гармошки, ищем в папке gamedata\scripts файл xr_kamp.script и открываем его блокнотом. Далее ищем строку -- играть на гармошке . Сам скрипт выглядит так: -- играть на гармошке -- if npcbject("harmonica_a") then -- self.npc[npc_id].states["play_harmonica"] = true -- self.npc[npc_id].states["wait_harmonica"] = true -- self.kamp_states["pre_harmonica"] = true -- self.kamp_states["harmonica"] = true -- self.kamp_states["post_harmonica"] = true -- else self.npc[npc_id].states["play_harmonica"] = false self.npc[npc_id].states["wait_harmonica"] = false self.kamp_states["pre_harmonica"] = false self.kamp_states["harmonica"] = false self.kamp_states["post_harmonica"] = false -- end
В данном случае знак -- означает, что строки скрипта игра не использует, а просто пропускает их, переходя к следующей части. Значит нужно убрать знак – из тех строк, которые нам нужны. Должно получится: -- играть на гармошке if npcbject("harmonica_a") then self.npc[npc_id].states["play_harmonica"] = true self.npc[npc_id].states["wait_harmonica"] = true self.kamp_states["pre_harmonica"] = true self.kamp_states["harmonica"] = true self.kamp_states["post_harmonica"] = true else self.npc[npc_id].states["play_harmonica"] = false self.npc[npc_id].states["wait_harmonica"] = false self.kamp_states["pre_harmonica"] = false self.kamp_states["harmonica"] = false self.kamp_states["post_harmonica"] = false end Всё, теперь можете запускать игру и наслаждаться.*
Как менять скорострельность и удобность оружия?: В папке gamedata/config/weapons в файлах конфигурации оружия ищи
control_inertion_factor
чем меньше параметр - тем выше удобство. и rpm - скорострельность.
Как положить оружие в другой слот?: В папке gamedata/config/weapons в файлах конфигурации оружия ищи SLOT и меняй на 1 (вместо ножа) или 2 (пистолетный слот)
Добавление новых опций в меню игры?: Открываем файл gamedata\config\ui\ui_keybinding.xml. В нём находим строку
и после неё пишем:
Таким образом в меню игры добавляются 4 новых опции, а именно: смена камеры и кнопка включения двигателя. Также можно добавлять сюда др. клавиши(если знать консольные команды)
Скрипты дверей Покажу вам на примере, как открыть дверь в саркофаге без дешифра) мы просто сделаем дверь открытой по умолчанию, этот трюк можно использовать в любом направлении, в том числе и для новых квестов Идём в gamedata\config\scripts и ищем скрипт нужной двери или объекта, нам нужна дверь в саркофаге и это sar_door.ltx Вот вам скрипт с моими комментариями, мои комментарии после символа ;, в вашем скрипте они не нужны, так что удалите их если будете копировать отсюда...
[logic] ;Основное действие active = ph_door@locked ; При нажатии кнопки "Действия" выполняется скрипт [ph_door@locked]
[ph_door@locked] ; То что выполняется сейчас locked = true ; Закрыто на замок, значение правда ("Закрыто", при нажатии на кнопку действия ничего не произойдёт) closed = true ; Прикрыта, правда ("Прикрыта", при нажатии на кнопку действия дверь октроется) tip_open = tip_door_coded ; Всплывающая подсказка "Дверь закодирована" on_info = {=actor_has_decoder} ph_door@coded ; При нажатии на кнопку действия идёт проверка есть ли декодер
[ph_door@coded] ; Если есть декодер то... locked = true ;Закрыто, правда closed = true ;Прикрыто, правда tip_open = tip_door_decode ; Всплывающая подсказка "Декодировать" on_info = {!actor_has_decoder} ph_door@locked on_use = ph_door@decoding %+sar_access_decoding% ; При начале декодирования, пошёл процесс декодирования и выполняется скрипт sar_access_decoding
[ph_door@decoding] ; В процессе декодирования locked = true closed = true tip_open = tip_door_decoding on_info = {+sar_finish_decoding} ph_door@unlocked ; Завершение скрипта sar_finish_decoding и выполнение ph_door@unlocked
[ph_door@unlocked] ; Дверь раскодирована и открыта locked = false closed = false show_tips = false
Если мы хотим увидеть правдивые концовки, но мы уже в саркофаге и у нас нет дешифра, то мы просто можем изменить везде locked = false на true closed = false на true И в зависимости что вам надо и где можете менять и изменять, тут
В списке supplies, после строчки [spawn] \n перечислены все предметы, которые будут у ГГ в начале игры. И в этот список можно добавить любой предмет, например добавим ГГ 12 GPS-Проводников и один ремкомплект (добавляем после последней строчки - detector_battery_1 \n):
Code
guidebook_mono = 12 \n repair_arms_box \n
В SGM поставлена чистка инструментов при начале новой игры и если вы добавите их в список - в рюкзаке они не появятся, т.к. их почистит скрипт. Чтобы отключить чистку инструментов (Внимание: Если вы удалите эту строчку, то инструменты заспавнятся в двойном экземпляре!) необходимо удалить (или заккоментировать знаками --) строчку release_items_by_section("toolkit") в файле scripts\sgm_utils.script (для SGM < v2.2: scripts\sgm_info.script). Cписок предметов на добавление можно взять из файла gamedata\configs\(Список обьектов).txt Также здесь можно поправить кол-во денег у ГГ на начало игры. За это отвечает строчка:
Code
<money min="2500" max="2500" infinitive="0"/>
min, max - Минимальное и максимальное кол-во денег соответсвенно (деньги выдаются случайно, в промежутке от min до max) infinitive - Сделать деньги бесконечными, 1\0 - Да\Нет соответсвенно.
Найдем аттрибут st_actor_name в файле configs\text\rus\st_characters.xml:
И меняем имя на необходимое. В диалогах к ГГ будут обращаться по старому имени (Александр Дегтярев), поэтому лучше пройтись поиском по файлам и поискать еще упоминания старого имени. Нужна Новая Игра!
Открываем файл configs\creatures\actor.ltx и правим в нем следующие интересные строчки:
Code
[actor_condition] satiety_v = 0.0 ; Скорость уменьшения сытости со временем radiation_v = 100 ; Скорость уменьшения радиации satiety_power_v = 100 ; Увеличение силы при уменьшении сытости satiety_health_v = 0.0001 ; Увеличение здоровья при уменьшении сытости satiety_critical = 0.0 ; Критическое значения сытости (в процентах от 0-1) когда здоровье начианает уменьшаться radiation_health_v = 0.0 ; Уменьшение здоровья при воздействии радиации morale_v = 100 ; Скорость восстановления морали psy_health_v = 100 ; Скорость восстановления psy-здоровья alcohol_v = -100 ; Скорость вывода алкоголя из организма health_hit_part = 0.0 ; Процент хита, уходящий на отнимание здоровья power_hit_part = 0.0 ; Процент хита, уходящий на отнимание силы max_power_leak_speed = 0.0 ; Накопление усталости (макс граница, до которой восстанавливается сила) в секунду игрового времени bleeding_v = 0.0 ; Потеря крови при номинальной ране в секунду wound_incarnation_v = 100 ; Скорость заживления раны min_wound_size = 0.0002 ; Минимальный размер раны, после которого она считается зажившей
Открываем файл scripts\ui_main_menu.script Для SGM: Ищем:
Code
elseif db.actor~=nil and dik==DIK_keys.DIK_F5 then self:mod_options()
Добавляем ниже:
Code
elseif db.actor~=nil and dik==DIK_keys.DIK_F6 then give_object_to_actor("Предмет")
Для чистой игры (ТЧ\ЧН\ЗП) и модов на них (Универсальный способ): Ищем:
Code
if dik == DIK_keys.DIK_Q then self:OnMessageQuitWin()
Добавляем ниже:
Code
elseif db.actor~=nil and dik==DIK_keys.DIK_F6 then alife():create("Предмет",db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id())
Все. В игре жмем ESC=>F6=>ESC и у нас в рюкзаке будет лежать Предмет. PS: "Предмет" - секция предмета, берем из файла configs\(список объектов).txt
Разбор системы квестов в S.T.A.L.K.E.R. Зов Припяти
Статья пользователя XMK
icon - иконка квеста Пример использования: icon = ui_inGame2_Put_v_pripyat
prior - приоритет квеста Пример использования: prior = 112
storyline - флаг задания (true - сюжетное, false - несюжетное) Пример использования: storyline = true
title - название задание (id из xml) - если брать название не из xml, то в игре оно будет отображаться без пробелов Пример использования: title = zat_a9_way_gates_check_transport_workshop_name
title_functor - функция-обработчик для заголовка (по умолчанию condlist) Примеры смотри в task_functor.script
descr - описание задания (id из xml) - если брать название не из xml, то в игре оно будет отображаться без пробелов Пример использования: descr = zat_a9_way_gates_check_transport_workshop_text
descr_functor - функция-обработчик для описания (по умолчанию condlist) Примеры смотри в task_functor.script
target - цель на карте (метка) Примеры использования: target = zat_a2_stalker_barmen (ID объекта (в данном случае нпц), на которого будет поставлена метка) target = {условие}obj_id - если выполняется условие, метка будет поставлена на выбранный объект.
descr_functor - функция-обработчик для цели (должна возвращать ID персонажа) (по умолчанию target_condlist) Примеры смотри в task_functor.script
condlist_x - группа параметров, позволяющая задавать условия выполнения, провала или отмены задания. Число в имени ключа позволяет задать несколько последовательно пронумерованных (начиная с нуля) параметров. Кондлист каждого параметра может возвращать следующие значения: complete (выполнить задание), fail (провалить задание), reversed (отменить задание). Примеры использования: condlist_0 = {условие} complete - если выполняется условие, задание выполнено. condlist_1 = {условие} reversed - если выполняется условие, значит есть возможность повторить задание. condlist_2 = {условие} fail - если выполняется условие, задание провалено.
on_init - действия, которые выполняются, при выдаче задания on_complete - действия, которые выполняются, если задание выполнено on_reversed - действия, которые выполняются, если задание провалено Примеры использования: on_init = %+название_инфопоршня% -- выдаем опр.инфопоршень on_complete = %=inc_faction_goodwill_to_actor(stalker:200)% -- повышаем репу у сталкеров (функция юзаются из xr_effect) on_reversed = {условие} %=inc_faction_goodwill_to_actor(stalker:200)% -- повышаем репу у сталкеров, только если есть выполняется условие.
reward_money - денежная награда reward_item - награда в виде предмета
Далее добавляем наши диалоги Бороде. Открываем файл character_desc_zaton.xml Находим строчку <actor_dialog>zat_a2_stalker_barmen_actor_info</actor_dialog> и под ней пишем
Открываем файл dialogs_zaton.script и в начало записываем:
Code
function give_vodka_quest() task_manager.get_task_manager():give_task("quest_vodka_give") end function is_has_vodka_borode() if db.actor:object("vodka") then return true end return false end function transfer_vodka_to_boroda(first_speaker, second_speaker) dialogs.relocate_item_section_from_actor(first_speaker, second_speaker, "vodka") end
Сохраняем Сам квест Открываем файл tm_zaton.ltx и в конец пишем:
Открываем файл st_quests_zaton.xml и добавляем после <string_table>
Code
<string id="vodka_barmen_naiti_name"> <text>Найти водку для бармена</text> </string> <string id="vodka_barmen_prinesti_name"> <text>Принести водку бармену</text> </string> <string id="vodka_barmen_descr"> <text>Бармен в тестовых целях попросил найти и принести ему 2 бутылки водки</text> </string>
Для работы над худом нам нужны следующие файлы(не обязательно все конешно) Текстуры: Папка - 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 - список индикаторов состояния ГГ (радиация,голод и тп.)Далее идёт сам список,НО он не поддаётся правке индивидуально. Правим только всё сразу строчкой упомянутой выше.
<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 - думаю понятно что это <center - хз что это..предполагаю что реч о точках на миникарте
Если вам нужно убрать текстуру - просто убираем в конфиге путь к текстуре. Если нужно убрать текст - либо убираем сам текст либо ставим а="0" Многие элементы передвигаются в связке.К примеру патроны - окно,количество и иконку можно двигать меняя координаты окна.Координаты остального подразумеваются в рамках размера окна(а не всего экрана)
Если вы хотите задать текстуре определённый размер то - пишем нужный width и height а после пишем stretch="1"
+ Авторазбор + Правка XR 3DA.exe. Изменение рисунка при запуске игры + Добавление брони + Делаем прозрачный худ и инвентарь + Активация артефактов + Изменение текстур + Восстанавливаем части монстров в сталкер ЧН + Добавление статей в PDA + Вычисляем координаты + Как изменить длину палочки прицела + Как изменить параметры конкретного боеприпаса + Как изменить параметры конкретного оружия + Как изменить рост главного героя + Как научить техника делать все апгрейды + Как отключить вспышку выстрела у винтореза, вала, ПБ + Как реализовать качание прицела + Как редактировать гранаты + Как редактировать костюмы + Как делать новую хавку + Как редактировать торговцев, торговлю с обычными сталкерами + Как сделать вид от третьего лица + Как сделать главного героя бессмертным + Как сделать так, чтобы стволы не убирались сами + Как сделать, чтобы у главного героя были безконечные деньги + Редактирование торговцев + Настройка погоды и освещения + Создание перемещающихся_ аномалий + Создание Видеофайлов для игры S.T.A.L.K.E.R. + Создание диалогов + Создание диалогов (полный обзор) + Создание нового артефакта + Создание нового оружия + Создание новой группировки + Спавн новых предметов + Спавн телепортов через скрипт + Спавн точек перехода между уровнями + Спавн-через меню + Структура файлов и папок + Тёмная ночь + Спавн через скрипт + Теория модостроения + Техника в игре + Торговля в игре + Удаление дождя + Описание Actor.ltx + Описание Alife.ltx + Описание Inventory new.xml + Описание System.ltx + Описание Trade ******.ltx + Изменение время и даты начала игры + Делаем свой первый мод на 5+ + Добавить предметы в СТАЛКЕРЕ + Добавление Режима Freeplay в игру (Тень Чернобыля) + Добавление Арта в Аномалию + Изменяем худ в ЗП + Исправляем вылет при разговоре с Ковальским для v1.6.0.0 + Как добавить новый предмет + Как отослать сообщение Меченому на ПДА + Как правильно вставить свои звуки в игру + Как создать броник в ЗП + Как увеличить максимальный переносимый вес + Логика НПС + Подключение локаций к ЧН и ЗП с помощью программы от AMK Team + Super config + Библиотека Вырезаных анимаций + Генерирование предметов в трупах + Настройка логики (часть 1) + Настройка логики (часть 2) + Настройка логики (часть 3) + Настройка логики (часть 4) + Настройка логики от Икстрима + Создание проводников + Создание телепора + Точный разбор секций all.spawn + RESPAWN + Анимации NPC + Вывод сообщения на экран + Выдача актеру информации о тайнике + Выдирание оружия + Диалоги Часть1 + Диалоги Часть2 + Диалоги Часть3 + Диалоги Часть4 + Как вывести сообщение на экран без использования функций АМК + Как сделать полный квест + Перенос моделей НПС из ЧН и ЗП в ТЧ + Как создать абсолютно новый костюм с уникальным визуалом + Разблокировка видео опций + Сигаретная зависимость + Снятие денег с трупов + Создаем работающее радио + Создание непися и профиля + Создание полоски здоровья, меняющей цвет + Эффект критического раненния + Часы на HUD + Правим кости неписям + Создание нового шлема + 12 уроков по теме "Работа с ACDC" + 24 урока по СДК
Общие положения Сегодня мы разберем то, каким образом можно редактировать оружие в игре - от характеристик до описания. Характеристики оружия хранятся здесь: ...\S.T.A.L.K.E.R\gamedata\config\weapons\w_[...].ltx
Разбор структуры конфига
Возьмем, для примера, конфиг w_g36.ltx. Он делится на разделы:
Первый раздел Здесь хранится общая информация о оружии - его класс, тип, ссылки на спавн и т.д. Нас интересуют следующие строки:
description = enc_weapons1_wpn-g36 - ссылка на string_id, из которого игра подгружает описание этого оружия. ef_main_weapon_type = 2 - основной тип, к которому принадлежит оружие ef_weapon_type = 6 - подтип, к которому принадлежит оружие sprint_allowed = true - возможность спринта с этим оружием(false-выкл, true-вкл) Второй раздел Содержит модификаторы, которые даются к углу зрения/дальности обзора NPC, держащего это оружие в руках:
holder_range_modifier = 1.85 - во сколько раз увеличивается eye_range holder_fov_modifier = 0.3 - во сколько раз увеличивается eye_fov Третий раздел Содержит данные о самом оружии, его некоторых характеристиках:
cost = 18000 - базовая цена (торговцы умножают её на некоторый коэффициент) weapon_class = assault_rifle - класс оружия (здесь - штурмовая винтовка) ammo_mag_size = 30 - размер магазина ammo_class = ammo_5.56x45_ss190, ammo_5.56x45_ap - типы используемых патронов grenade_class = ammo_m209 - тип используемых гранат fire_modes = 1, -1 - режимы ведения огня hand_dependence = 1 - засивимость о рук (?) - возможно, речь идет о качании ствола single_handed = 0 - держится ли только в одной руке slot = 2 - слот в инвентаре animation_slot = 2 - вид анимации (для пистолета/для винтовки) inv_name = wpn-g36 - ссылка на имя, отображаемое в инвентаре, тоже берется из string table, как и описание inv_name_short = wpn-g36 - короткое имя; в данном случае используется то же самое inv_weight = 3.6 - вес inv_grid_width = 5 - координаты первого угла иконки по x inv_grid_height = 2 - координаты первого угла иконки по y inv_grid_x = 0 - координаты второго угла иконки по x inv_grid_y = 10 - координаты второго угла иконки по y Четвертый раздел В четвертом разделе хранится информация о износе/отдаче оружия. Практически все параметры там снабжены комментариями, поэтому приведу лишь самые интересные:
cam_relax_speed = 5.7 - скорость возврата в исходное положение cam_dispersion = 0.2 - увеличения угла (в градусах) с каждым выстрелом fire_dispersion_condition_factor = 5 - увеличение дисперсии в процентах при максимальном износе misfire_probability = 0.003 - вероятность осечки при максимальном износе misfire_condition_k = 0.05 - порог (в данном случае - 5%), после которого оружие может заклинивать condition_shot_dec = 0.0002 - увеличение износа при каждом выстреле Пятый раздел Здесь хранится множество параметров, из которых наиболее интересны эти:
hit_power = 0.50, 0.54, 0.57, 0.60 - сила выстрела hit_impulse = 105 - импульс пули (сила, которую летящая пуля передает жертве, влияет на поведение ragdoll-тела) hit_type = fire_wound - тип причиняемых повреждений, в данном случае - пулевые ранения (параметр в синглплеере ни на что не влияет) fire_distance = 600 - максимальная дистанция для выстрела bullet_speed = 925 - начальная скорость пули hud = wpn_g36_hud - внешний вид оружия Шестой раздел position = -0.026, -0.132, 0.0 - позиция по отношению к игроку (?) orientation = 0, 0, 0 - направление, в которое смотрит ствол (?) Седьмой раздел Содержит описания визуальной стороны оружия и некоторые другие параметры:
startup_ammo = 90 - как нетрудно догадаться, стартовое количество патронов (в синглплеере ни на что не влияет) visual = weapons\g36\wpn_g36.ogf - модель оружия, используемая NPC, а также игроком при виде от третьего лица ph_mass = 4 - физическая масса, используемая при расчетах scope_status = 1 - ситуация со съемным прицелом silencer_status = 0 - ситуация со съемным глушителем grenade_launcher_status = 0 - ситуация с подствольным гранатометом Параметры: 0 - нет, новый прикрепить нельзя 1 - уже есть, несъемный 2 - нет, но можно установить новый zoom_enabled = true - есть ли зум (прицеливание) scope_zoom_factor = 33.3 - какой зум дает прицеливание (здесь - 1.8х) scope_texture = wpn\wpn_crosshair_g36 - текстура прицельной сетки shell_point = 0.15, 0.0, -0.05 - точка вылета гильз shell_dir = 0.0, 1.0, 0.0 fire_point = -0.000000,0.062000,0.134000 - точка выстрела fire_point2 = 0.30, 0.00, 0.05 - точка выстрела (2) fire_bone = wpn_body orientation = 0, 0, 0 - направление position = 0, 0, 0 - позиция visual = weapons\g36\wpn_g36_hud.ogf - модель, отображаемая у нас в руках Изменение описаний Описания оружия хранятся в файле: ...\S.T.A.L.K.E.R\gamedata\config\text\rus\string_table_enc_weapons.xml
В нем хранятся строки с названиями и описаниями, на которые ссылаются конфиги оружия. Например, тот же G36 ссылается сюда:
[...] <string id="enc_weapons1_wpn-g36"> <text>Штурмовая винтовка немецкого производства, представляющая собой первоклассный образец современного оружия - лёгкого, надёжного и эргономичного.\n Боеприпасы:\n обычный 5,56x45 мм SS109,\n бронебойный 5,56x45 мм АР.</text> [...] <string id="wpn-g36"> <text>ГП37</text> [...]Меняя их содержимое, мы меняем описания/названия данного оружия.
Изменение патронов Параметры патронов хранятся в файле:
Найдем, например, раздел, отвечающий за патроны к тому же G36 (о них мы узнали из параметра ammo_class), и разберем, что означает каждый параметр:
visual = weapons\ammo\ammo_556x45_ss190.ogf - модель коробки с патронами description = enc_weapons1_ammo_ammo-5.56x45-ss190 - ссылка на string_id, из которого игра подгружает описание этого типа патронов cost = 320 - стоимость одной коробки box_size = 30 - количество патронов в одной коробке inv_name = ammo-5.56x45-ss190 - ссылка на string_id, содержащий имя для инвентаря inv_name_short = ammo-5.56x45-ss190_s - ссылка на string_id, содержащий краткое имя для инвентаря inv_weight = 0.33 - вес inv_grid_width = 2 - координаты первого угла иконки по x inv_grid_height = 1 - координаты первого угла иконки по y inv_grid_x = 14 - координаты второго угла иконки по x inv_grid_y = 11 - координаты второго угла иконки по y
k_dist = 1 - коэффициент дальности, сама дальность - в стволе, тупо расстояние. k_disp = 2.5 - кучность, завязана с кучностью в стволе k_hit = 1 - убойность, завязана с убойностью в стволе k_impulse = 1 - чисто наскока эффектно ногами непись дрыгнет во время кердыка k_pierce = 1 - коэффициент наскока испорится броня при попадании
impair = 1 - коэффициент износа ствола от пули buck_shot = 1 - кол-во составляющих в пуле (напр картечь - 4, пуля - 1) tracer = on - является ли патрон трассирующим (on/off) wm_size = 0.05 - визуальный размер дырки на стене от пули
1. находим модели ствола с нужным коллиматором . 2. Импортируем их в 3Д редактор ( например в милку, в ней проще всего). 3. Удаляем все ненужное и приподнимаем прицел (чтоб не мешался пока) 4. Подгружаем модель нужного ствола ( например ЛР300) 5. Удаляем штатный прицел. 6. Устанавливаем на место коллиматор, чтобы сделать съемным привязываем к кости wpn_scope, не съемным - к body. 7. Экспортируем в формат СДК. 8. Делаем в СДК модель худ и мировую модель. 9. Экспортируем в формат ОГФ П.С. Если прицел съемный, надо отдельную модель прицела через СДК сделать, но это уже проще)
Не большой архивчик, внутри текстура прицельной сетки, скрин и инструкция. Прицельная сетка всегда видна и периферийное зрение работает. Это для примера. Освобожусь, выложу текстуру приближенную к натуральной модификации АКОГа. Оптика.rar
Для обычного монитора: секция худа(в руках актора) aim_hud_offset_pos= x,y,z;положение механического прицела. смещение вбок влево(-) вправо(+)/вверх(+) вниз(-)/вперед(+)назад(-), здесь совмещаем мушку и целик (+ и - относится к положению целика)
aim_hud_offset_rot= y,x,z ;смещение угла механ прицела. вверх(-)вниз(+)/влево(-) вправо(+)/вокруг оси, здесь подгоняем мушку под место, куда попадает пуля(смещается линия прицеливания).
Для широкоформатного: секция худа(в руках актора) aim_hud_offset_pos_16x9 = x,y,z;положение механического прицела. смещение вбок влево(-) вправо(+)/вверх(+) вниз(-)/вперед(+)назад(-), здесь совмещаем мушку и целик (+ и - относится к положению целика)
aim_hud_offset_rot_16x9 = y,x,z ;смещение угла механ прицела. вверх(-)вниз(+)/влево(-) вправо(+)/вокруг оси, здесь подгоняем мушку под место, куда попадает пуля(смещается линия прицеливания).
После правки запускаем игру и смотрим, потом выходим из игры правим, опять запускаем и смотрим. Муторно конечно но другого пути нет.
Привет всем! Игра сталкер, а конкретно сам движок X-ray довольно капризный, и зачастую как в процессе модификации, так и во время игры игра «вылетает». Чтобы мы знали причину вылета, движок нам оставляет лог вылета. Лог вылета можно посмотреть несколькими способами: В текстовом редакторе нажать Ctrl+V (Вставить) Посмотреть лог игры включая лог вылета в файле xray_имя_пользователя.log в папке C:\Documents and Settings\All Users\Документы\STALKER-***\logs Посмотреть непосредственно в окне багтрекера (только в ЧН и ЗП).
Ну приступим. Начнём с простых: Expression : wave&&wave->length() Function : CSoundRender_Source::LoadWave File : E:\stalker\patch_1_0004\xrSound\SoundRender_Source_loader.cpp Line : 65 Description : Can't open wave file: Arguments : d:\stalker\gamedata\sounds\music\sound.ogg
Здесь игра не может открыть звуковой OGG-файл под названием sound в папке d:\stalker\gamedata\sounds\music\ Expression : fatal error Function : CRender::texture_load File : E:\stalker\patch_1_0004\xr_3da\xrRender\Texture.cpp Line : 295 Description : <no expression> Arguments : Can't find texture 'act\act_corp_monolit'
Не может найти текстуру act_corp_monolit из папки textures\act Expression : fatal error Function : CModelPool::Instance_Load File : E:\stalker\patch_1_0004\xr_3da\xrRender\ModelPool.cpp Line : 111 Description : <no expression> Arguments : Can't find model file 'physics\mesh.ogf'.
Не найдена трёхмерная OGF-модель mesh.ogf из папки meshes\physics. Expression : SG Function : CRender::model_CreateParticles File : E:\stalker\patch_1_0004\xr_3da\xrRender_R2\r2.cpp Line : 330 Description : Particle effect or group doesn't exist Arguments : hit_fx\hit_water_00
Не найдена система частиц (партикл) hit_water_00 в директории hit_fx файла particles.xr (подробно опишу позже). Expression : fatal error Function : CResourceManager::_GetBlender File : E:\stalker\patch_1_0004\xr_3da\ResourceManager.cpp Line : 49 Description : <no expression> Arguments : Shader 'models\antigas_glass' not found in library.
Не найден шейдер models\antigas_glass в библиотеке шейдеров. Expression : fs Function : CResourceManager::_CreateVS File : E:\stalker\patch_1_0004\xr_3da\ResourceManager_Resources.cpp Line : 185 Description : shader file doesnt exist Arguments : d:\stalker\gamedata\shaders\r2\deffer_impl_flat.vs
Не найден файл шейдера deffer_impl_flat.vs. --Added by Герр. Роммель Да нет. Тут проблема вся в том, что неправильно закомпилился шейдер, при компиляции уровня на качестве, более высоком чем Draft. Нужно скачивать исправление шейдеров от товарища Haron. Для ЗП (ЧН) это может ещё быть из-за отсутствия thm"ок для текстур терраина уровня! Expression : fatal error Function : out_of_memory_handler File : D:\prog_repository\sources\trunk\xrCore\xrDebugNew.cpp Line : 336 Description : <no expression> Arguments : Out of memory. Memory request: 55965 K
Нехватка оперативной памяти. Expression : fatal error Function : CInifile::r_string File :E:\stalker\sources\trunk\xrCore\Xr_ini.cpp Line : 352 Description : <no expression> Arguments : Can't find variable ammo_mag_size in [wpn_addon_grenade_launcher]
Не найдена переменная ammo_mag_size в секции [wpn_addon_grenade_launcher]. Expression : fatal error Function : CScriptEngine::lua_error File : D:\xray-svn\xr_3da\xrGame\script_engine.cpp Line : 74 Description : <no expression> Arguments : LUA error: C stack overflow
Переполнение стека. Смотрим внимательно: lua_error. Ошибка возможно в скриптах. Expression : vertex || show_restrictions(m_object) Function : CPatrolPathManager::select_point File : E:\stalker\sources\trunk\xr_3da\xrGame\patrol_path_manager.cpp Line : 155 Description : any vertex in patrol path [sniper_3_walk] in inaccessible for object [stalker_0002]
Какая то вершина (вейпоинт) пути sniper_3_walk стоит в неположенном месте (например не на аи-сетке). Объект stalker_0002 (в данном случае сталкер) который якобы двигался по пути sniper_3_walk попал на эту точку, а заодно ушёл за аи-сетку. Этого движок не терпит.
Тоже самое произойдет если координаты(вейпоинт) пути sniper_3_walk совпадет с координатами места где нпс запрешенно находится буть то рестриктор или аномалия в схеме обхода аномалий. Также этот вылет набюдается при попытке отправить нпс за пределы места работ параметр out_rest = "имя_рестриктора", в файле загрузки работ гулага
попробуйте любого сталкера из лагеря новичков отправить допустим к остановке получите этот самый вылет Expression : e_entity Function : xrServer::Process_event_reject File : E:\stalker\sources\trunk\xr_3da\xrGame\xrServer_process_event_reject.cpp Line : 12 Description : entity not found. id_parent=7540 id_entity=44047 frame=2075050
Возникают иногда произвольно при смерти неписей. Причина — движок отрабатывая лут изредка теряет серверный объект уничтожаемой вещи, в итоге происходит вылет. Expression : fatal error Function : CScriptEngine::lua_error File : D:\xray-svn\xr_3da\xrGame\script_engine.cpp Line : 74 Description : <no expression> Arguments : LUA error: e:\stalker\gamedata\scripts\_g.script:20: bad argument #2 to 'format' (string expected, got no value)
Ошибка распространённая. На первый взгляд кажется, что ошибка как раз в скриптах, но всё может быть иначе. Делаем так: открываем файл _g.script блокнотом, закоменчиваем 20 строку (ставим перед строкой --) и идём к тому месту где поймали вылет. Так мы получим более развёрнутый ответ. Участник:Призрак: Автор прав в том что вылет очень распространен, но так его исправлять нельзя, т.к. nil передается в эту функцию только при каком-то форс мажоре. Поэтому необходимо перейти в _g.script в функцию printf и перед log1(string.format(fmr,..)) дописать: get_console():execute("load "..fmt). После этого запустить еще раз игру и посмотреть при передачи какой строки игра вылетает. Потом найти эту строку в скриптах игры и прикинуть почему аргумент (у нас это аргумент №2 (bad argument #2)) равен nil Expression : assertion failed Function : _VertexStream::Lock File : E:\stalker\patch_1_0004\xr_3da\R_DStreams.cpp Line : 44 Description : (bytes_need<=mSize) && vl_Count
Проблема возникает при убийстве НПС\мутанта. Типичный вылет по нехватке ресурсов. Участник:Призрак - Встречается в основном на больших локациях. Но не на всех. На болотах из ЧН такой вылет встречается, а вот с локации aver от Кости V такого вылета нет. Однако для данного вылета есть таблетка, в виде правленого экзешника. Искать на АМК-форум Expression : fatal error Function : IRender_Visual::Load File : E:\stalker\patch_1_0004\xr_3da\FBasicVisual.cpp Line : 58 Description : <no expression> Arguments : Invalid visual
Неправильный визуал (модель) НПС. Expression : !phrase_dialog->m_PhraseVector.empty() Function : CPhraseDialog::SayPhrase File : E:\stalker\patch_1_0004\xr_3da\xrGame\PhraseDialog.cpp Line : 140 Description : No available phrase to say, dialog[esc_dialog]
В диалоге esc_dialog нет доступной для отображения фразы (скажем все заткнуты инфопоршенами). Expression : motion_ID.valid() Function : CKinematicsAnimated::ID_Cycle File : D:\prog_repository\sources\trunk\Layers\xrRender\SkeletonAnimated.cpp Line : 210 Description : ! MODEL: can't find cycle: Arguments : death_init
Игра не нашла в модели трёхмерную анимацию с именем death_init. Автор статьи — Pihan13 Дополнил статью — Fireman3000 Частично использовалась информация с сайта http://forum.stalker-simbion.ru/ Не стесняемся — дополняем, если знаем о чём идёт речь.
Дополнение к статье(От Fireman3000): Извините, если я где-нибудь неправильно пишу. Уж не родился я Колмогором Expression : fatal error Function : CScriptEngine::lua_error File : E:\stalker\patch_1_0004\xr_3da\xrGame\script_engine.cpp Line : 73 Description : <no expression> Arguments : LUA error: ...hadow of chernobyl\gamedata\scripts\xr_danger.script:116: attempt to index field 'ignore_types' (a nil value)
Причина вылета в том что игра не понимает значения 0 в danger_ignore.Проще говоря в логике какого то персонажа параметр danger_ignore = 0 либо в минусовом значении. Либо его вообще нету
P.S. Также может быть причина в том, что в логике у какого-то АИ что-то неправильно указано. Для исправления рекомендую вставить строчку перед 116: get_console():execute(self.object:name()). То имя в логе, которое будет последним после вылета, указывает на персонажа с кривой логикой. --Rekongstor 14:01, 2 июня 2011 (UTC) Expression : fatal error Function : CInifile::r_string File : E:\stalker\patch_1_0004\xrCore\Xr_ini.cpp Line : 352 Description : <no expression> Arguments : Can't find variable class in [test_no_klass_npc]
Не найден класс персонажа. Возможно, нпс не прописан под своим классом в gamedata\npc_profile.xml, либо в creatures\spawn_section.ltx, либо в gameplay\character_desc.xml Expression : fatal error Function : CInifile::r_section File : E:\stalker\patch_1_0004\xrCore\Xr_ini.cpp Line : 342 Description : <no expression> Arguments : Can't open section 'bandage_test_kick1'
Игра не может найти секцию. Это может быть предмет, нпс и многое другое. Возможно, вы написали название с ошибками. Либо когда добавляли его в: продажу, скрипт, нпс, выпадение из нпс а в редких случиях это может быть иммунитет чего либо(определить пото трудно). Часто такое бывает связано с названием Expression : fatal error Function : CInifile::r_string File : E:\stalker\patch_1_0004\xrCore\Xr_ini.cpp Line : 352 Description : <no expression> Arguments : Can't find variable remove_time in [vehicle_btr]
Не найдена переменная remove_time в секции [vehicle_btr]. А в данном случае ошибка в том что если вы делали предмет как физическую модель(тобишь которую нельзя использовать, говорить и вообще он похож на декорации типа деревьев, столов и прочего хлама) то необходимо указывать remove_time в его секции Expression : fatal error Function : CScriptEngine::lua_error File : E:\stalker\patch_1_0004\xr_3da\xrGame\script_engine.cpp Line : 73 Description : <no expression> Arguments : LUA error: ...dow of chernobyl\gamedata\scripts\test_kick.script:34: attempt to call method 'section' (a nil value)
Метод обращения в игре не предусмотрен. Возможно, стоит пересмотреть подход к тому или иному скрипту Expression : rpoints[0].size() Function : game_sv_Deathmatch::Create File : D:\prog_repository\sources\trunk\xrGame\game_sv_deathmatch.cpp Line : 99 Description : rpoints for players not found
На мультиплеерной карте не найдены точки респавна игроков. В SDK должен быть красный пацанчик. Настроить Team = 0 Expression : fatal error Function : xrServer::Process_update File : E:\stalker\patch_1_0004\xr_3da\xrGame\xrServer_process_update.cpp Line : 37 Description : <no expression> Arguments : Beer from the creator of 'WP_SHOTG'
Такое иногда бывает, когда ты (ГГ) или НПС заряжает дробовик или другое оружие со значением tri_state_reload = true. Это глюк. в игре что-то сбивается, и когда у дробовика максимальное количество заряженых патронов скажем 6, он заряжается за 6 и дальше.. дальше.. дальше.. и так пока не произойдёт вылет с вышеуказанным логом. вылет не значительный и редкий, но если он случается слишком часто, можно в конфигах всех дробовиков и ружей поменять значение tri_state_reload = true на tri_state_reload = false. Expression : fatal error Function : CInifile::r_string File : D:\prog_repository\sources\trunk\xrCore\Xr_ini.cpp Line : 477 Description : <no expression> Arguments : Can't find variable bound_rect in [level_map]
Такой лог бывает когда подключаешь локу с ТЧ в ЗП. Причина проста в ЗП уровнях файл строчка bound_rect пишется в файле gamedata\levels\имя_уровня\level.ltx , а в ТЧ строка bound_rect для каждого уровня непосредствено в файле gamedata\config\game_maps_single.ltx ... Исправить просто, нужно изменить файл gamedata\levels\имя_уровня\level.ltx в подключеной локации, просто перенести строку bound_rect из game_maps_single.ltx в level.ltx перед строчкой texture .
By Призрак Expression : hGame Function : CEngineAPI::Initialize File : E:\stalker\patch_1_0004\xr_3da\EngineAPI.cpp Line : 65 Description : Game DLL raised exception during loading or there is no game DLL at all
Случается когда одна из dll некорректна. Например такой вылет бывает если подсунуть в ТЧ 1.0004 xrGame от 6 патча Expression : assertion failed Function : CInventory::Eat File : E:\stalker\sources\trunk\xr_3da\xrGame\Inventory.cpp Line : 892 Description : pIItem->m_pCurrentInventory==this
Вылет встречается только на 6 патче при попытке хаванья из трупа. Ищите, исправленную Kolmogor'om, xrGame.dll в Интернете [error]Expression : error handler is invoked! [error]Function : invalid_parameter_handler [error]File : E:\stalker\sources\trunk\xrCore\xrDebugNew.cpp [error]Line : 804 [error]Description :
Данный вылет бывает когда у какого либо из объектов установленно некорректное значение (читал, сам не получал его) Или же если данный вылет происходит при вызове класса, то проблема в том что в методе __init() класса прописано super() Expression : !m_error_code Function : raii_guard::~raii_guard File : D:\prog_repository\sources\trunk\xrServerEntities\script_storage.cpp Line : 748 Description : d:\stalker cop\gamedata\scripts\bind_stalker.script:231: attempt to index global 'ИМЯ_ФАЙЛА' (a nil value)
Вылет происходит в двух случаях - когда скрипт пытается вызвать функцию из несуществующего файла или когда в файле допущена синтаксическая ошибка Expression : fatal error Function : CScriptEngine::lua_error File : E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cpp Line : 73 Description : <no expression> Arguments : LUA error: attempt to call a nil value
Происходит при попытке вызвать класс, которого не существует
Небольшой пример из практики по определению ошибки в особых случаях(для начинающих): Игра зависла, картинка на экране не меняется, на Ctrl + Alt+ Delete не реагирует. Только "Холодная перезагрузка" reset. Но при этом обычно в логе нет записи и обычным Ctrl + V ошибку не увидеть. Я пользуюсь программой Punto Switcher. Есть в ней опция "дневник", она ведёт запись всех нажатий клавиш и по нажатию сочетаний клавиш содержимое памяти может записывать в дневник. теперь когда игра зависла и картинка на экране не меняется, нажимаете Ctrl + Alt+ Delete. Внешне ничего не изменится, но ОС будет реагировать на клавиши, нажимаете сочетание клавиш "записать в дневник". Делаете перезагрузку, открываете дневник - Ваша ошибка записана. "дядя Саша"
By tracker. Expression : bone_id!=BI_NONE Function : SArtefactDetectorsSupport::SetVisible File : D:\prog_repository\sources\trunk\xrGame\Artefact.cpp Line : 525 Description : link
Возникает при создании или добавлении чужих артефактов. В artefacts.ltx, в секции af_base есть параметр particles_bone=link. Это имя косточки, которая принимается за центр при проигрывании партикла. Если кость в артефакте называется по иному, например joint2, и это не указанно в секции нового арта, которая наследуется от базовой и подаразумевает естественно наличие link, получаем вылет. Решается конвертированием модели арта в .object, просмотром в sdk и выяснением имени косточки с занесением в конфиг.
Безлоговый вылет.
Вылет, при котором лог отсутствует. Причины такого вылета:
1. Безлоговые вылеты бывают в основном из-за завышенных настроек видео. Решение: В папке с игрой открыть папку gamedata, папку config, в ней файл alife, открыть любым текстовым редактором (блокнотом, или лучше word pad'ом) и найти строку switch distance = и изменить значение на 5, сохранить изменения.
Это только одна (не сильно вероятная) причина безлогового вылета. если вы знаете ещё одну причину, пожалуйста напишите здесь.