Как спавнить сквады в сталкере
Создание сквада сталкеров (НПС)
Я создам сквад на примере одного сталкера. Начнем. Первая папка для работ - это gameplay (gamedata\configs\gameplay), открываем любой файл character_desc_. ltx
Создаем секцию:
<specific_character team_default="1">
<name>Дикобраз</name>
<icon>ui_inGame2_Dolg_4</icon>
<map_icon x="1" y="0">
</map_icon>
<bio>Опытный сталкер. Детальная информация отсутствует.</bio>
<class>a10_dolg_dikobraz</class>
<community>dolg</community>
<mechanic_mode>1</mechanic_mode> ;наш НПС будет механиком, либо просто удалите эту строку.
<terrain_sect>stalker_terrain</terrain_sect>
<snd_config>characters_voice\human_01\dolg\</snd_config>
[spawn] \n
wpn_pkm \n
ammo_pkm_100 = 1 \n
wpn_colt1911 \n
ammo_11.43x23_fmj = 1 \n
Нашего сталкера зовут Дикобраз, он из Долга и имеет уникальное имя a10_dolg_dikobraz
Далее файл npc_profile.ltx
<character /> <class>a10_dolg_dikobraz</class>
</character>
Записываем уникальное имя в обе строки.
Теперь переходим в новую папку: gamedata\configs\creatures
Любой файл spawn_sections_. ltx
[a10_dolg_dikobraz]:stalker ;любое имя секции, но лучше, чтобы совпадали (меньше путаницы).
$spawn = "respawn\a10_dolg_dikobraz"
character_profile = a10_dolg_dikobraz ;его профиль (имена совпадают)
spec_rank = regular
community = dolg
story_id = a10_dolg_dikobraz ;уникальный идентификатор персонажа.
И последняя папка: gamedata\configs\misc
Любой файл squad_descr_. ltx
[a10_dolg_dikobraz_squad]:online_offline_group ;любое имя секции, но лучше, чтобы совпадали (меньше путаницы).
faction = dolg
npc = a10_dolg_dikobraz ;наш персонаж.
target_smart = a10_sv_terrain ;его торрейн.
spawn_point = a10_sv_terrain_dikobraz_walk ;в way прописываем точку спавна (координаты должны совпадать с торрейном).
story_id = a10_dolg_dikobraz_squad ;уникальный идентификатор отряда.
on_death = %+a10_dolg_dikobraz_death% ;выдается инфопоршень при смерти всего отряда.
Для того, чтобы наш сквад появился в игре необходимо либо прописать в файле gamedata\configs\misc\simulation в общий список той локации, на которой он должен появиться, либо через логику рестриктора:
[logic]
active = sr_idle@spawn
[sr_idle@spawn]
on_info = %=create_squad(name_squad:name_terrain)% sr_idle@nil
Спавн через скрипт
Первый параметр - секция в конфигурациях, описывающая объект, например "bolt","med_kit" - это простые секции, простых объектов а есть объекты, которые переходят в онлайн/оффлайн, это неписи, монстры и так далее, например mil_killer_respawn_2 - спавнится снайпер группировки киллеров.
С позицией, думаю объяснять не надо, только существует нюанс - высота это Y, а не Z. Задать позицию можно такой конструкцией vector():set(x,y,z), где x, y и z - координаты точки на уровне, где спавним объект.
Дальше сложнее, так как сам толком сформулировать не могу.
Начнем от простого к сложному. На каждом уровне много объектов, все объекты состоят из полигонов, у каждого полигона есть вершины – вертексы.
Именно они и должны здесь указываться, зачем - не особо понимаю, скорее всего для точного позиционирования объекта. Например, можно получить вертекс ближайший к актору - db.actor:level_vertex()
Дальше идет гораздо более интересный параметр game_vertex, это почти то же самое, что и level_vertex, но (!) это глобальные величины! Если level_vertex считается для уровня, то game_vertex - для всей игры, и нужен он для того, чтобы указать на какой карте спавнить объект (более вразумительного объяснения я не нашел).
Соответственно, чтобы заспавнить что-нибудь на другой карте, достаточно указать game_vertex в четвертом параметре Например:
db.actor:game_vertex()
Итак, чтобы, например, заспавнить болт под ногами актора, пишем:
alife():create("bolt",db.actor():position(),1,db.actor:game_vertex())
Почему 1, а не level_vertex? Проверено - разницы особой нет, какой level_vertex, хотя в некоторых случаях надо прописывать валидный вертекс, а то предмет может просто заспавнится не там, где планировалось. Но по большей части все проходит нормально и с единицей. (Игнорирование level_vertex может приводить к проваливанию произведенных предметов/персонажей под землю.) А вот game_vertex решает все - он указывает на каком уровне спавнить предмет, поэтому его надо указывать. Теоретически можно просто найти для каждого уровня по одному game_vertex'у и использовать их в скриптах. На самом деле game_vertex показывает какой фрагмент карты используется (вся карта разбита на кусочки имеющие сквозную нумерацию по всем уровням и game_vertex выбирает нужный) соответственно неправильное использование черевато.
Кроме того - есть еще один параметр - ID объекта, если указать ID NPC или актора - то предмет заспавнится у него в инвентаре.
Пример (спавним артефакт Медуза в инвентаре у актора):
alife():create("af_medusa", db.actor():position(), 1, db.actor:game_vertex(), db.actor:id())
Функция спавна возвращает серверный объект, то есть ни NPC, ни монстра ни что-либо еще.
Серверный объект позволяет свеже созданного NPC или тайник затарить разными рулезами/артефактами. Например, вот так создадим перед входом к Сидоровичу долговца и засунем в него пачку патронов:
local obj
local a = vector() -- Задаем тип переменной
local dir = db.actor:direction()
a.x = -243.61 -- координата X
a.y = -19.52 -- высота Y
a.z = -127.17 -- координата Z
obj = alife():create("bar_dolg_respawn_3",a,13193,8,65535)
alife():create_ammo("ammo_9x18_fmj",
obj.position,
obj.m_level_vertex_id,
obj.m_game_vertex_id,
obj.id,
20) -- число патронов
Кстати, create_ammo - практически тоже самое, что и create, разница в том, что create_ammo предназначена специально для спавна патронов и позволяет создавать неполные пачки патронов. Возможно есть еще какие-то отличия. Стоит учесть, что сами авторы игры спавнят патроны исключительно через create_ammo. Imp 22:38, 23 июля 2007 (EEST)
Просто минимальный набор - координаты, ID, секция,а из него (серверного объекта) обычно нужен только ID, так как по ID можно получить этот самый серверный объект:
(alife():object(id))
Его можно использовать, чтобы поставить метку, например, но я его лично использую для других целей - спавн сложных объектов, конкретно – NPC.
Например надо решить следующую задачу - надо создать наемника, сменить ему группировку и изменить его инвентарь, ну и в нагрузку - сделать другом для игрока.
В определенный момент заспавненый объект переходит онлайн, в этот момент вызывается callback - net_spawn.
Что мы делаем? Сверяем ID онлайн объекта с сохраненным ID!
Если они совпадают, например так:
if obj:id()==saved_id then .
Важно то, что у серверного объекта ID - это параметр, а у онлайнового объекта ID получается с помощью функции. Это важно, а то можно прогореть.
Итак, мы поймали нашего киллера по ID.
Далее все очень просто - вызываем команды для спавна гаусса и патронов к нему в инвентаре NPC (см. выше), меняем группировку специальной функцией, и делаем его другом.
Зачем такие сложности? Просто в оффлайне NPC как бы не существует, есть только косвенное упоминание о нем, и, плюс, все эти функции работают именно с объектом типа "NPC", а не с серверными объектами.
Практика (часть 1)
1. Чтобы не повторяться в описании создания нового квеста, просто изучите статью по созданию квестов от Fr3nzy – лучшей статьи на эту тему я просто не видел :) Мы просто свяжем все воедино и научимся спавнить объекты из скрипта.
Почему предпочтительнее делать спавн скриптом, а не через тот же xrSpawner? Программа xrSpawner, при всех своих достоинствах, обладает одним недостатком, а именно – она делает спавн через файл all.spawn, что приводит к:
Невозможности совместить два мода, такой спавн использующих
Необходимости каждый раз начинать новую игру
При спавне через скрипт ситуация иная: в подавляющем большинстве случаев, ранее сохраненные игры будут работать, что не может не радовать :)
Итак, определимся с квестом.
Задача: после разговора с Сидоровичем спавним зомби на территории фабрики в первой локации. Для того, чтобы не повредить оригинальный сюжет игры, задание будет выдаваться после прохождения квеста с флешкой Шустрого, так как появись там зомби одновременно с бандитами и Шустрым. я думаю, исход боя предрешен :)
Реализация: Постараюсь описать все действия максимально подробно, буквально по шагам. Первым делом запустите игру :)
В консоли введите команду:
rs_stats on или rs_stats 1
Тем самым мы включаем вывод информации на экран. Далее вводим еще одну команду:
demo_record 1
И «летим» на фабрику. Нам нужно выбрать место для спавна объектов и данный режим как нельзя лучше подходит для реализации задуманного. Помещаем камеру в точке предполагаемого спавна и записываем координаты - у меня получились 115, -6, -16.
Для выхода из режима demo_record нажимаем Esc, в консоли пишем rs_stats off или rs_stats 0 (убираем вывод информации).
a = db.actor:position() -- Наше положение в координатах
vid = db.actor:level_vertex_id()
gvid = db.actor:game_vertex_id()
text = "Позиция:\\nX= "..a.x.."\\nY= "..a.y.."\\nZ= "..a.z.."\\nlevel_vertex= "..vid.."\\ngame_vertex_id= "..gvid news_manager.send_tip(db.actor, text, nil, nil, 30000) end В результате не нужно экспериментировать мы сразу получаем все, в том числе и level_vertex и game_vertex. Imp 22:38, 23 июля 2007 (EEST) Выходим из игры, идем в папку с установленной игрой и создаем каталог gamedata (предполагается, что «лепим» свой «мод» на «чистую» игру, без установленных модов, и имеем распакованные ресурсы игры в папке, скажем, gamedata source). В папке gamedata создаем папку config, а в ней - папку creatures. Скопируем из оригинальной папки файл m_zombie.ltx и откроем его на редактирование. В файлах игры присутствуют 5 моделей гражданских зомби: файлы zombi_1.ogf, zombi_1_ghost.ogf, zombi_2.ogf, zombi_trup.ogf, zombi_trup_2.ogf Вернем в игру их всех :) Уже имеются секции: [zombie_weak]:m_zombie_e, [zombie_normal]:m_zombie_e, [zombie_strong]:m_zombie_e и [zombie_immortal]:zombie_strong. Два последних типа используют одну и ту же модель zombi_trup.ogf, хм. непорядок, исправляем. Последняя секция выглядит теперь так: [zombie_immortal]:zombie_strong $spawn = "monsters\zombies\zombie_immortal"
visual = monsters\zombi\zombi_trup_2
panic_threshold = 0.05
Добавим пятую модель.
Для этого в конце файла создадим секцию:
[zombie_ghost]:zombie_strong
Это означает, что наш пятый зомби наследует все параметры zombie_strong, мы добавим лишь визуальное представление.
Пишем дальше:
$spawn = "monsters\zombies\zombie_ghost"
visual = monsters\zombi\zombi_1_ghost
Все. Сохраняем изменения и закрываем файл.
2. Пишем скрипт спавна. В папке gamedata создаем новую папку scripts, в ней создаем новый текстовый документ и называем его esc_zombie.script.
При написании статьи использовался оригинальный скрипт zombie_story.script из horror-mod’а. Концепция спавна перенесена практически без изменений, поэтому на авторство этого способа спавна я никоим образом не претендую :)
Итак, открываем наш пустой файл на редактирование, первой строкой объявляем переменную, в которой хранятся наши зомби:
local zombie_types =
Далее пишем функцию:
function spawn_zombies( position, total )
local zombie_index -- тип зомби из массива zombie_types
local new_pos, x_offset, z_offset -- объявляем переменные
for zombie_index=1, total do -- крутим цикл столько раз, сколько
задает переменная total
x_offset = math.random(5) -- случайное (рандомное) x от 1 до 5
z_offset = math.random(5) -- случайное (рандомное) z от 1 до 5
new_pos = position -- передаем координаты в функцию
new_pos.x = new_pos.x + x_offset -- прибавляем к указанной нами
координате x полученное выше рандомное x
new_pos.z = new_pos.z + z_offset -- прибавляем к указанной нами
координате z полученное выше рандомное z
-- Ниже, собственно и вызывается функция спавна случайного типа зомби
zombie_types[math.random(5)] привязанного к нашим координатам
alife():create(zombie_types[math.random(5)],new_pos,db.actor:level_vertex_id(),db.actor:game_vertex_id())
end
end
И последнее:
function zomby_story_1( actor, npc )
-- десять зомби на фабрике (Кордон)
local spawn_point = vector():set( 115, -6, -16 ) -- здесь указываем координаты,
выбранные нами для спавна, когда «летали» камерой :)
spawn_zombies( spawn_point, 10 ) -- собственно вызов предыдущей функции
с передачей ей координат и количества объектов
end
Все. Сохраняем и закрываем файл.
Для того, чтобы игра не вылетала после того, как мы добавили новый тип монстров, их нужно добавить в файл xr_statistic.script. Итак, скопируем этот файл из папки игры scripts в нашу папку к файлу esc_zombie.script и откроем на редактирование.
Добавим в local killCountProps к монстрам строчку:
zombie_weak = 1, zombie_normal = 2, zombie_str 3
В local sect_alias строчку:
zombie_weak = "zombie_weak", zombie_normal = "zombie_normal", zombie_str "zombie_strong"
А ниже в monster_classes строчку:
[clsid.zombie_s ] = "zombie"
В функцию getNpcType(npc) добавляем конструкцию:
elseif npc:character_community() == "zombie" then
community = "zombie"
Сохраняем изменения и закрываем файл.
Все будет работать на ура, пока мы не попробуем обыскать убитого зомби. Как только мы это сделаем, игра вылетит с примерно такой ошибкой.
Expression : fatal error
Function : CInifile::r_string
File : D:\xray-svn\xrCore\Xr_ini.cpp
Line : 351
Description :
Arguments : Can't find variable icon in [zombie_weak]
Все верно – игра не знает какую иконку нам показывать для зомби. Иконки монстров хранятся в файле ui_npc_monster.dds. Здесь есть два варианта:
Если дружите с Фотошопом, отредактировать этот файл (нарисовать, добавить иконки);
Взять готовый из любого мода, естественно, с разрешения авторов мода. Сейчас мы пропустим данный аспект и присвоим нашим зомби иконки контролера :)
Вернемся к файлу m_zombie.ltx и в секцию [m_zombie_e]:monster_base впишем параметр
icon = ui_npc_monster_kontroler
Все. Вылетов не будет.
3. Тема данной статьи не предусматривает подробного описания того, как сделать новый диалог. В начале статьи я упомянул источник, где можно найти исчерпывающую информацию по созданию диалогов, могу также привести в пример статью по созданию диалогов от BAC9-FLCL.
Нам нужно просто проверить работоспособность скриптового спавна, поэтому я приведу просто собственно сам измененный диалог из файла dialogs_escape.xml:
escape_trader_talk_info_999
7770
9991
9992
9993
9994
9995
9996
escape_trader_talk_info_99922
9996
9995
escape_trader_talk_info_3121
9996
9995
escape_trader_talk_info_3131
9996
9995
escape_trader_talk_info_41
9996
9995
escape_trader_talk_info_7771
7772
7773
escape_trader_talk_info_7779
9996
9995
escape_trader_talk_info_7777
esc_zombie.zombie_story_1
9996
9995
escape_trader_talk_info_51
9996
9995
И также связанный с ним файл stable_dialogs_escape.xml. В самом начале файла пишем следующее:
Происшествий никаких не было?
Да знаешь. Вроде как тихо все у нас. Хотя, вот, вспомнил! Говорили мне
на днях, что на фабрике, ну, там, где бандюки околачиваются постоянно, видели каких-то то ли
людей, то ли призраков. Мало ли что спьяну почудится - я и сказал этим паникерам, мол,
закусывать надо! Хех, блин, алкаши.
Дык мне по любому мимо фабрики топать - заодно и посмотрю на этих
"людей-призраков".
Да я как-то не собирался в ту сторону.
Ну, смотри сам, все равно будь осторожен.
Ага. Сходи, проветрись. Потом зайдешь, расскажешь, что там и как.
Здесь проход воспрещён, сталкер.
Все. Можно запускать игру, идти на Кордон, после разговора с Сидоровичем, в зависимости от выбранного Меченным решения, бежим на фабрику и … смотрим сами :)
Готовые файлы примера
Spawn Lib
Домашнее задание - вернуть в игру 6-ой тип гражданского зомби :)
Продолжение следует…
Практика (часть 2)
Файл модели до редактирования
Файл модели после редактирования
На скринах видно, что мы просто изменили для этой модели путь к текстуре. Все. Без использования 3D-редакторов и затраты кучи времени на обработку модели в них, мы получили абсолютно новую (на внешний вид) модель. :)
5. Теперь пропишем нашего нового зомби во все файлы, которые мы создали ранее. В файл m_zombie.ltx в самый конец добавляем секцию:
[zombie_old]:zombie_normal
$spawn = "monsters\zombies\zombie_old"
visual = monsters\zombi\zombi_3
в файле esc_zombie.script изменяем массив в первой строке:
local zombie_types = "zombie_old", "zombie_ghost">
В функции spawn_zombies изменяем строку спавна:
alife():create(zombie_types[math.random(6)],new_pos,
db.actor:level_vertex_id(),db.actor:game_vertex_id())
в функции zombie_story_1 меняем число объектов на кратное 6-ти (необязательно):
spawn_zombies( spawn_point, 12 )
Всё. Сохраняем и закрываем.
6. Копируем в папку gamedata\config\gameplay\ файл encyclopedia_mutants.xml, добавляем описание зомби в энциклопедию:
И в связанный с ним файл string_table_enc_mutants.xml в папке gamedata\config\text\rus\ добавляем:
Зомби-привидение отличается от обычного зомби лишь тем, что
воздействие Выжигателя мозгов полностью разрушило не только структуру личности, но и
тело, поэтому зомби-призрак несколько более живуч по сравнению с обычным зомби.
Воздействие Выжигателя мозгов полностью разрушает структуру личности,
оставляя только телесную оболочку.\n\n Побродив немного по Зоне, лишённые разума тела
начинают превращаться в настоящих зомби. Из рефлексов у них остаются лишь самые примитивные,
оружие и экипировка скоро приходят в негодность. В результате зомби становятся собой ни чем
иным, как медлительными полутрупами, которых наличествуют лишь два эффективных раздражителя:
еда и сон. Зомби совершенно неразборчивы в выборе пищи и питья, поэтому их тела буквально
пропитаны радиацией и токсинами. Как правило, эти существа бесцельно бродят по Зоне или,
словно трупы, валяются внутри заброшенных построек. Однако, лишь только зомби почует близкое
присутствие живого человека, он сразу же пытается атаковать. Умудрённые опытом сталкеры
стараются обходить эти неуклюжие опустошённые оболочки.
Копируем сюда же файл stable_statistic_caption.xml и изменяем в нем 3 строчки:
Сохраняем и закрываем.
7. И последнее – добавим иконки. Скажу сразу, воспользовался готовым файлом, уже содержащим иконки зомби и других «восстановленных монстров» (спасибо Fr3nzy). Поэтому просто скопируйте файл ui_npc_monster.dds из архива в папку gamedata\textures\ui\, а файл ui_npc_monster.xml – в папку gamedata\config\ui\. Если вы хотите сделать собственные - прочитайте урок по изменению текстур.
Вкратце, что описывает файл ui_npc_monster.xml: в нем задаются координаты иконок, расположенных в файле ui_npc_monster.dds, применительно к каждому типу монстров в игре.
Заключительный штрих. Откройте файл m_zombie.ltx и в первой секции замените строку
icon = ui_npc_monster_kontroler
В секцию [zombie_ghost] добавьте строку:
icon = ui_npc_monster_zombieg
Сохраняйте изменения. Всё.
Вот готовые файлы примера. Удачи и спасибо за внимание :)
Спавн NPC
Эта часть статьи написана Arhet и создана на примере того, как в SRP Mod были созданы NPC группировки "Грех".
Начнем с character_desc_escape.xml. Описание что значит каждая строка писать не буду, так как все до меня уже сделано.
Тут создадим нового персонажа:
esc_dark_stalker_01 - вот тут наш новый класс кстати.
dark_stalker stalker_terrain
Впишем наш код после какого-нибудь
Теперь идем в npc_profile.xml и туда вгоняем:
Теперь надо заняться spawn_sections.ltx. Скрипт будет «брать NPC» как раз из этого файла. Пишем туда:
[esc_dark_stalker_1]:stalker – имя секции для скрипта..
$spawn = "respawn\esc_dark_stalker_1"
character_profile = esc_dark_stalker_1 – ссылка на описание нашего NPC
spec_rank = regular – спец ранг
community = dark_stalker – группировка.
Теперь берем любой скрипт спавна NPC, вгоняем туда имя секции из spawn_sections.ltx и ву-а-ля.
Тока забыли что данному НПС будет присвоенная дефолтовая логика (т.е. тупо хожу куда сам не знаю) забыли упомянуть про (ххх - лока):
О сайте
Приветствую случайный посетитель, хотя, скорее, вы попали на этот сайт намеренно. И вот, что вы можете здесь отыскать: большую информационную базу по игре S.T.A.L.K.E.R., если быть конкретнее, то информация, размещенная на данном сайте, преимущественно касается разбора игры в качестве скриптовой платформы. Если быть проще, сайт посвящен модостроению. Надеюсь, вы останетесь довольны сайтом.Шутки из Зоны
Залетает разъяренный Меченый к Сидоровичу в бункер, достаёт АК и всаживает в него всю обойму, выбрасывает пустую, заряжает новую и снова высаживает её всю. так раз пять. затем останавливается, удивленно смотрит на Сидоровича, откидывает автомат и падает на колени, слезы текут с глаз:
- Вот он - Бог! - прошептал Меченый
Спорят как-то Меченый с Волком.
Меченый: Связка ломов, как правило, тонет.
Волк: Но в ртути прекрасно плавает.
Меченый: Но если ломы урановые, то и во ртути тонут.
Волк: сам топи урановые ломы в ртути.
- Гюльчатай, открой личико! Ну, открой же! - в который раз просил Петруха.
- Хреновы военные! Мало того, что надругались, так ещё издеваются, гады! - подумал про себя грустный снорк.
Заходит сталкер в бар:
- Бармен! - кричит он.
Выходит бармен, говорит:
- Извините, но бар закрыт, откроется только через час.
Сталкер, усаживаясь за столик:
- Ничего, я подожду!
Бармен: Может пока что-нибудь закажете?
К Воронину нас не пустили, но сержант Пличко рассказал свой любимый анекдот: "Новобранец "Долга" жалуется: "Товарищ старшина, смотрите, что мне выдали: брюки только до колен, рубаха болтается, рукава коротки, сапоги хлябают, глядеть страшно".
- Все в порядке, - сказал старшина, - воин "Долга" должен внушать страх".
Пришёл сталкер к Сахарову и говорит:
- Профессор, почему мной кровососы брезгуют?
- Молодой человек, я же вам говорил, что в вашем спирту крови не обнаружено!
Сталкер-новичок в первый раз пришёл в Бар. Просит меню, но вместо этого сразу получает тарелку с непонятной жратвой. Спрашивает:
- А я могу сам выбрать?
- Можешь, - ответил Бармен. - Хочешь - ешь, хочешь - не ешь.
Доктор:
- Посмотрел я ваши анализы, молодой человек, и должен огорчить: у вас глисты.
Пациент (браток):
- Да ну. Диагноз какой-то не пацанский. Братва меня засмеёт! Доктор:
- Не проблема! Напишем "очковые змеи".
Отношения сталкеров и военных.
Блокпост: Стой, кто идет?
Сталкер: Свои, с бутылкой!
Блокпост: Свои, проходи! Бутылка - стой!
- Представляешь, я вчера забыл на базе автомат!
- Ой-ой-ой. И когда ты про него вспомнил?
- К сожалению, только тогда, когда принёс торговцу щупальца кровососа.
Семья сталкера. Все сидят за столом, молча ужинают. Вдруг сын задевает бутылку с водкой локтём. Бутылка стремительно летит к полу. Но в сантиметре от пола сын успевает подхватить бутылку. Ставит на стол и обращается весело к отцу:
- Пап, приколи, бутылка была на волоске от смерти!
Сталкер прячет пистолет и говорит серьезным голосом:
- Ты тоже, сынок!
Молодой сталкер подбежал к псевдопсу и стал гладить его пышный хвост. Ветеран в испуге кричит:
- Что ты делаешь? Он же порвет тебя!
- Нет, чувак, с этого конца они не кусаются.
Поймал вояка сталкера на периметре:
- Щас я тебе покажу, как в Зону лазить!
- Ф-фух, слава Богу, а то меня уже 3-й раз ловят!
Сталкеры, не пейте палёную водку - кровососы травятся.
Стоят два наемника, ждут "заказанного" сталкера. Его все нет и нет. Один спрашивает другого:
- Что-то долго его нет. Может, случилось что?
Два сталкера:
- Ты с каждым днём всё больше становишься похож на алкаша.
- Это почему же?
- Да у тебя руки трясутся, когда ты ведро с водкой ко рту подносишь!
- Ты чего такой грустный?
- Да вот, пошли с мужиками на кабана охотиться. Кабан не пришел. Ну, мы и напились как свиньи. И тут пришел кабан.
Идут два сталкера по дороге. Один спрашивает:
- А что делать, если меня кровосос схватит?
- Сопротивляйся подольше, чтобы я успел убежать!
Трусливые сталкеры в засаде:
- Почему же ты не стреляешь в этого кровососа?
- Ты разве не видишь, как бежит?! Может, бешеный, ну его к черту!
- Какая первая обязанность долговца на войне?
- Умереть за свою идею!
- Неправильно. Первая обязанность долговца - сделать так, чтобы свободовцы умерли за свою идею!
- Доктор, приходите скорей, у Меченого "белочка"!
- А что, собственно, случилось?
- По комнате скачут белые лошади, а он их не замечает!
Лукаш:
- Кто поедет зачищать заставу "Долга", два шага вперед.
Из строя выходят два бойца.
Лукаш:
- А остальные пойдут пешком. Гы-гы-гы.
Приснилось сталкеру его собственная могила - у дубка, на его родине. Тот, проснувшись, подумал, что это означает. И решил пока в Зоне отсидеться.
Идут занятия по уставу караульной службы в "Долге".
- Рядовой Петров! Вы стоите на посту и замечаете, что к вам подползает человек. Ваши действия?
- Отведу генерала Воронина в штаб.
Один сталкер другому:
- Я попадаю в крысу с расстояния ста шагов.
- Интересно, где ты найдешь таких крыс, которые ждут, пока ты отмеришь сто шагов?
Приходит Меченый к Болотному доктору:
- Доктор, меня мучает бессонница!
- Примите слабительное.
- И я от него усну?
- Нет, но, по крайней мере, вам будет чем заняться.
В гоpодке около Периметра женщина сообщает соседке:
- Вчера кто-то весь огород вытоптал.
- Может сталкеры?
- Да ну, какие сталкеры, следы-то человеческие.
Стоят два монолитовца и держат плакат. На плакате надпись: "Сверните со своего пути, неверные, или погибните!"
Мимо ехал на ниве Стрелок. Увидев надпись, он крикнул со всей злости: "Религиозные фанатики. " - и нажал на педаль газа. Через пару секунд послышался всплеск воды.
Один сектант говорит другому:
- Слушай, Фёдор, может нам нужно было попроще написать: "Мост поломан"?
Ты охренел фраер, ничего не попутал. Вали давай отсюда.
Сталкера ограбили на дороге бандиты.
- Почему же ты не мог дать им отпор? - удивились товарищи.
- А что я мог поделать? - Обиделся сталкер. - У меня были заняты руки: в правой был нож, а в левой - ружье.
База бандюков. Базарят два братка:
- Стало быть, надо тебе двадцать тыщь. Я их тебе дам, но какая гарантия, что ты их через месяц вернешь?
- Слово честного человека!
- Лады! Вот нынче вечером ты этого человека и приводи, поглядим.
Подходит, значит, сталкер к Монолиту. Тот ему:
- Загадывай желание.
- Хочу, чтоб Зона исчезла.
- Не, ну ты загнул. Попроси чё полегче.
- Ну, тогда сделай так, чтоб Сидорович при торговле не обманывал.
- Так что ты там насчёт Зоны говорил.
Новобранец блокпоста в Зоне присылает домой гранату с письмецом:
- Бабушка, если ты дёрнешь за это колечко, то я получу 3 дня отпуска.
Ползут два сталкера, пересекают периметр. Вдруг один вляпывается рукой в дерьмо. Второй начинает ржать. Первый (зажимая ему рот рукой):
- Тихо, военных встревожишь!
- А я свою девушку в армию вчера проводил. Я ее любить буду, я ее ждать буду, я ей ребёночка рожу маленького такого.
- Ты че? Ты же мужик! Большого рожай!
- Деда, а расскажи, как ты в Зоне два вертолета сбил!
- Ну-у-у. Не совсем сбил.. Скажем так: недозаправил!
Зашёл как-то Стрелок на базу бандитов. Продал то, что не надо, закупил, то что надо. И перед уходом говорит толпе бандитов, сидящих на выходе:
- Ну что, драконы, отдыхаете?-
Бандиты в непонятках: что за новое слово "Драконы"? Пошли они к своему бугру спросить. Тот им и отвечает:
- Драконы - это те же петухи, только у них гребешок во всю спину.
S.T.A.L.K.E.R.: Call of Pripyat "Гайд по созданию NPC через сквад"
В этом уроке я полностью и во всех точностях опишу возможность спавна нпс не затрагивая all.spawn.
P.S Это мой первый урок так что не судите строго!
stalkerJK Попробую сделать по Вашему урок. Мне вот только интересно, а что отвечает за то, чтобы спавнился не военный, а к примеру простой сталкер. А можно добавить координаты для спавна, чтобы НПС сравнился в определённой точки? А так урок замечательный, жду продолжения.
trem200 дядяСаша Если хотите я опишу все строки и за что они отвечают.
stalkerJK Очень хочу, пока не нашёл статьи ни одной по созданию полноценного сквада. Если знаешь как давай начнём с того что, мы имеем модели (3шт например) новые.ogf и её текстуры. И умеем снимать координаты на локации. А вот дальше: 1. Как прописываем модели 2. Озвучиваем 3. Точка спавна 4 Гулаг 5. Кто там лидер с которым говорим 6. Остальные сидят 7. прописывание логики гулага пусть самой элементарной двое сидят у костра, один охраняет стоит невдалеке. Обязательно - пример. Вот это будет шикарно. Как делаются гулги в ТЧ я знаю, лохов, которые говорят что в ЗП точно также, прошу не беспокоить у Вас и так всё также -))
Информация о пользователе
Спавнер - Как прописывать отряд для спавна на другой локации
Это секция в файле all.spawn которая спавнит НПС/монстров для смарттеррайнов. Там указываются условия для спавна, количество и вид монстра/нпс. Ну и там другая разная мелочь. Вот, например, секция респавна военных на Кордоне на Южном Блокпосту:
; cse_abstract properties
section_name = respawn
name = esc2_blockpost_soldier_respawn
position = -134.366546630859, -30.1380043029785, -377.086364746094
direction = 5.68867981201038e-005, 4.36376934587202e-010, -7.67097026255215e-006
id = 65535
version = 118
script_version = 6
spawn_id = 6836
; cse_alife_object properties
game_vertex_id = 20
distance = 7
level_vertex_id = 116561
object_flags = 0xffffff3e
custom_data = <<END
[respawn]
respawn_section = esc_soldier_respawn_1, 13, esc_soldier_respawn_specnaz, 4
;max_count = 17
;min_count = 3
max_spawn = 8
idle_spawn = medium
conditions = 100
END
; cse_shape properties
shapes = 1
shape_0:type = sphere
shape_0:offset = 0,0,0
shape_0:radius = 1
Читайте также: