Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Спавн через скрипт
GAMEINATOR forums > S.T.A.L.K.E.R. > S.T.A.L.K.E.R. Архив > S.T.A.L.K.E.R. Архив по модификациям
Zorndaik
Спавн через скрипт(облегченная версия).
Wiki-версия статьи на эту тему(с сайта S.T.A.L.K.E.R Inside) излагает все основные принципы спавна через скрипт,
но, как я убедился, посещая некоторые форумы, многие новички просто не понимают сам
принцип скрипт-спана, поэтому для них я и изготовил данную статью.
Итак, выберем в качестве подопытного кролика Гордона Фримена smile.gif

1. Скрипт спавна.
Заранее оговорюсь:скрипт не мой. Но я попытаюсь максимально разобрать секции, необходимые для редактирования.

function spawn_novice ()
spawn_name = "mil_stalker_freeman" --'
end

function spawn_test ()
local xpos, ypos, zpos, spawn_pos
xpos = -25,69036
ypos = -4,117243
zpos = -27,08046
spawn_pos = vector():set(
xpos,
ypos,
zpos
)
spawn_novice ()
local obj=alife():create(spawn_name,
spawn_pos,
db.actor:level_vertex_id() ,
db.actor:game_vertex_id() )
-- level.map_add_object_spot_ser(obj.id, "alife_presentation_stalker", spawn_name )
-- dbglog('SPAWN_COMPLETE'..' '..'Name'..' '..tostring(spawn_name))
end

Итак, секции:
function spawn_test () - функция спавна, вызывается из диалога(об этом ниже).

xpos = -25,69036 - координаты спавна. Они получаются несколькими способами(об этом ниже)
ypos = -4,117243
zpos = -27,08046

spawn_name = "mil_stalker_freeman" - секция сталкера из spawn_sections.ltx

db.actor:level_vertex_id() - вертексы. Подробнее о вертексах можно прочитать в вышеуказанной статье.
db.actor:game_vertex_id() Внимание! Вертексы отвечают за глобальное местонахождение объекта, поэтому, спавня НПС на другой карте(не на той, на которой находится Актор) - изучите эту тему внимательнее.

-- level.map_add_object_spot_ser(obj.id, "alife_presentation_stalker", spawn_name )
-- dbglog('SPAWN_COMPLETE'..' '..'Name'..' '..tostring(spawn_name)) - тестовые строки. Раскоментировав их, мы получим на заспавненном НПС его координаты.

Со скриптом разобрались. Теперь создадим файл-скрипт spawn_freeman.script и скопируем в него вышеуказанный пример.

2. Диалоги и профиль.

Как мы знаем, сам по себе скрипт погоды не сделает, для него нужен вызов(запуск) через диалог и секции в spawn_sections.ltx С них и начнем.

Открываем этот файл и после строчки

;----------Miltary-----------

добавляем следующую секцию:

[mil_stalker_freeman]:stalker
$spawn = "respawn\mil_stalker_freeman"
character_profile = mil_stalker_freeman
spec_rank = novice
community = stalker

Разберем ее:
[mil_stalker_freeman] - секция, которую мы указываем в скрипте,

$spawn = "respawn\mil_stalker_freeman" - ссылка на спавн(после слеша прописываем название секции)

character_profile = mil_stalker_freeman - профиль персонажа, указывается в character_desc_military.xml

spec_rank = novice - ранг НПС (в данн. случае-новичок)

community = stalker - группировка персонажа

Теперь-диалоги. Как правило, скрипт вызывается через диалог строчкой вида <action>name.function</action>,
где name-имя скрипта, function-функция из самого скрипта.

Заставим Фримена спавниться после диалога с часовым у базы Свободы:

<dialog id="mil_bodyguard_dialog">
<phrase_list>
<phrase id="5">
<text>mil_bodyguard_dialog_5</text>
<action>spawn_freeman.spawn_test</action>
<next>6</next>
</phrase>

Думаю, вы сами увидите, где была добавлена строка <action> и какие изменения были в нее внесены wink.gif

Теперь займемся профилем Фримена. Скопируем в character_desc_military и слегка изменим его секцию:

<!-- ************************ Гордон Фримен *********************** -->
<specific_character id="mil_stalker_freeman" team_default = "1">
<name>ros_freeman_name</name>
<icon>ui_npc_u_green_stalker_7</icon>
<map_icon x="0" y="0"></map_icon>
<bio>ros_freeman_bio</bio>

<class>mil_stalker_freeman</class>
<community>stalker</community> <terrain_sect>stalker_terrain</terrain_sect>
<money min="200" max="6000" infinitive="0"></money>

<rank>201</rank>
<reputation>90</reputation>

<visual>actors\novice\green_stalker_7</visual>
<snd_config>characters_voice\human_01\newbie\</snd_config>
<crouch_type>0</crouch_type>

<supplies>
[spawn] \n
wpn_desert_eagle \n
ammo_11.43x23_fmj \n
</supplies>

#include "gameplay\character_criticals_3.xml"
#include "gameplay\character_dialogs.xml"

<start_dialog>mil_freeman_start</start_dialog>
<actor_dialog>mil_freeman_quest_start</actor_dialog>
<actor_dialog>mil_freeman_quest_finish</actor_dialog>
</specific_character>

Примечание: детальную информацию по этой теме вы найдете в статье "Редактирование НПС", секция с диалогами создана мной для квеста от Фримена,
без ее правки игра вылетит.

<specific_character id="mil_stalker_freeman" team_default = "1"> <class>mil_stalker_freeman</class> - строчки, в которые необходимо прописать
id и класс, указанные в spawn_sections.ltx

3. Координаты.

Существует 2 сравнительно точных способа получения координат, я опишу оба.

1 способ. Консоль.
Вводим в консоль 2 команды - rs_stats 1 и demo_record 1 для вывода информации и полета. "Летим" в место спавна, распологаем камеру в точке спавна
(на уровне земли, иначе Фримен провалится) и записываем координаты из Camera Position

2 способ. xrSpawner.
Этот способ наиболее точный. Для него:

*делаем сохранение на месте спавна
*запускаем xrSpawner
*грузим ЛЮБОЙ all.spawn и наш сейв
*тыкаем в произвольную строчку в "Имя объекта"
*нажимаем кнопку "Получить коор. из сохранения"
*в строчках "координаты x/y/z значения меняются, записываем и используем их smile.gif

Собираем мод и тестируем. Приятной игры.

Все!
HikeR
Цитата
2 способ. xrSpawner.
Этот способ наиболее точный.

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

если честно, то здесь ситуация не лучше.
Zorndaik
На вики описывается способ спавна группы монстров, а здесь-одного НПС(скрипты представлены разные)
Smanxx1
[quote]-- dbglog('SPAWN_COMPLETE'..' '..'Name'..' '..tostring(spawn_name)) - тестовые строки. Раскоментировав их, мы получим на заспавненном НПС его координаты[/quote]
Раскомментируешь эту с троку и получешь вылет, т.к. функции dbglog не существует в оригинальной игре.
[quote]function spawn_novice ()
spawn_name = "mil_stalker_freeman" --'
end

function spawn_test ()
local xpos, ypos, zpos, spawn_pos
xpos = -25,69036
ypos = -4,117243
zpos = -27,08046
spawn_pos = vector():set(
xpos,
ypos,
zpos
)
spawn_novice ()
local obj=alife():create(spawn_name,
spawn_pos,
db.actor:level_vertex_id() ,
db.actor:game_vertex_id() )
-- level.map_add_object_spot_ser(obj.id, "alife_presentation_stalker", spawn_name )
-- dbglog('SPAWN_COMPLETE'..' '..'Name'..' '..tostring(spawn_name))
end[/quote]
Ыы, это же самое натуральное извращенство, писать подобные "скрипты"... Все это можно сделать тремя строчками:
[quote]function spawn_novice()
   alife():create("mil_stalker_freeman",vector():set(-25.69036,-4.117243,-27.08046),1,db.actor:game_vertex_id())
end[/quote]
Но стоит заметить, что данная функция корректно сработатет только если объект, который мы спавним, находиться на той-же локации что и ГГ, иначе нужно просто подставить свои левел и гейм вертексы.
Далее:
[quote]function spawn_novice ()
spawn_name = "mil_stalker_freeman" --'
end[/quote]
Тут, наверное, правильнее будет так:
[quote]function spawn_novice()
   return "mil_stalker_freeman"
end[/quote]


И в статье еще полно ошибок:
1)[quote]xpos = -25,69036
ypos = -4,117243
zpos = -27,08046[/quote]
правильно:
[quote]xpos=-25.69036
ypos=-4.117243
zpos=-27.08046[/quote]
2)[quote]dbglog('SPAWN_COMPLETE'..' '..'Name'..' '..tostring(spawn_name))[/quote]
правильно:
[quote]dbglog("SPAWN_COMPLETE".." ".."Name".." "..tostring(spawn_name))[/quote]
[quote]3. Координаты.

Существует 2 сравнительно точных способа получения координат, я опишу оба.[/quote]
Гыы, существует 1000 и 1 способ получения точных координат.

З.Ы. А это вообще глупость:
[quote]tostring(spawn_name)[/quote]
Зачем переводить строку в строку? Оо
З.Ы.2. Как это не плачевно, но автору похоже самому нужно понять как правильно спавнить, да и не только...
russian-stalker
Эхх, новичков только в большую растеренность заводишь!
Зачем обьявлять столько переменных?
Как написал Smanxx1:
function spawn_novice()
alife():create("mil_stalker_freeman",vector():set(-25.69036,-4.117243,-27.08046),1,db.actor:game_vertex_id())
end
Это самый понятный способ для новичка
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.