Ожидаемый контент:

...

Карты, моды, дополнения, утилиты...

...

... и другое

В разработке... (Внимание: это меню отображается некорректно на некоторых стилях форума)

DOOM 0.9.1282

Форум Мапперов и Doom'еров

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Форум Мапперов и Doom'еров » Уроки » Скрипты


Скрипты

Сообщений 1 страница 12 из 12

1

В этой теме я научу вас тому, как пользоваться скриптами на картах Doom 3.
Здесь будут приведены самые нужные и распространенные скриптовые команды и их описание.
Так же, все вопросы по скриптам в игре советую задавать здесь.

+3

2

Итак, начнем.

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

Как видите, возможности скрипты открывают немалые. И я научу вас использовать все это.

Итак, простейший скрипт состоит из 2-ух основных частей - объявлений функций и функции main, в которой можно указать, какие скрипты начнут выполняться сразу после запуска карты, а какие только при срабатывании триггера на карте.

вот простейший вид скрипта :

void First_script() {        // объявление скриптовой функции с названием First_script (название функциям можно давать какое угодно)

sys.say("Hello World!");  // напишет в чат сетевой игры фразу Hello World!, как только функция будет вызвана из игры. Работает только в сетевой игре. В одиночной ничего не напишет.
}

void Second_script() {    // объявление еще одной скриптовой функции с названием Second_script. Можно объявлять любое число функций.

sys.setcvar("pm_thirdperson", "1");    //Сменит значение игровой переменной pm_thirdperson на 1, при вызове функции из игры. Функции из игры вызываются триггерами на карте.
}

void main() {    // Функция main (должна обязательно иметь имя - "main"). В этой функции вписываются функции, которые должны начать выполняться сразу при запуске карты.
                       // Если вы не хотите, чтобы ни одна функция не начинала выполняться при запуске, то функцию main можно в скрипте не писать.
}

и еще - имейте ввиду, если слово void написать с заглавной буквы V, то игра не поймет, что вы написали функцию и выдаст ошибку. Всегда пишите void прописными буквами.

==============

В скриптах можно взаимодействовать со всеми игровыми объектами, находящимися на карте, кроме брашей (worldspawn).
Чтобы начать взаимодействие с объектом на карте через скрипт нужно взять его имя на карте (например func_static_32) и перед его именем добавить значек $

Это будет выглядеть вот так:

void remove_model() {
$func_static_32.remove();   //это удалит объект func_static_32 с карты, при вызове скрипта. После перезапуска карты - объект снова появится.
}

В скриптах можно объявлять переменные, различных видов и 2ух типов (глобальные и локальные). Переменная - задаваемая величина, которая может меняться во время выполнения скрипта.

виды:

float i; - численные переменные, могут содержать только числа (как целые так и дробные, например 1,2,3,0.2,1.5,2.3 и др.)
string i; - текстовые переменные, их значение может содержать в себе только текст.
vector i; - переменные координат x y z, обязательно 3 числа, отделенных друг от друга пробелом ('12 56.2 0.53')
entity i; - переменные, которые могут содержать в себе только entity.

где i - название переменной, переменным можно давать любое название. Рекомендую давать короткие - так удобней.

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

Как объявляются переменные:

Глобальная:

float chislo;   // в данном случае объявлена числовая переменная. Глобальная - потому что объявлена ВНЕ функций. Значит доступ к ней может получить любая функция скрипта.
chislo = 1;  // задаю, что переменная равна единице

void slozhenie() {   // имя функции

chislo = chislo + 1;   // сложение - прибавляю к текущему значению chislo единицу, получаю - 2.
}

void proverka() {   // имя функции

if (chislo == 2) {   // проверяет, равно ли значение переменной chislo двум. Так как переменная chislo глобальная - эта функция имеет к ней доступ.

   $light_2.remove();
   }

}

Локальная:

void raschet() {  // имя функции

float chislo;  // объявляем локальную переменную (она объявлена ВНУТРИ этой функции и поэтому будет доступна только внутри этой функции)
chislo = 1;

if (chislo == 1) {  // проверяем равно ли единице
   
   $light_3.setColor(0.245, 0.832, 1.207);   //меняем цвет лампы на карте
   }
}

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

И кстати, никогда не забывайте ставить символ ; в конце каждой строки скрипта, кроме тех, что заканчиваются символами "{" и "}" .

Теперь перейдем к методам, которые можно применять к объектам.

+1

3

Для начала о том, как заставить из игры ту или иную функцию выполняться:

Создаем на карте триггер и в его свойство call вписываем название нужной нам функции (например call и в его значение вводим "podgotovka" ), когда триггер будет активирован - функция будет выполнена.
Запомните, в скрипте не должно быть функций с ОДИНАКОВЫМИ названиями.

Если мы хотим, чтобы какая то из функций скрипта начала выполняться сразу при запуске карты, то добавляем эту функцию в функцию main с припиской thread.
вот так:

void podgotovka() {

    $func_static_1.hide();
    $func_static_2.hide();
    $func_static_3.hide();
    $func_static_4.show();
    $func_emitter_5.remove();

}

void StartKarty() {
   
    $func_static_1.show();
    $func_static_2.show();
    $func_static_3.show();
    $func_static_4.hide();

}

void main() {
   
     thread StartKarty();  // эта функция начнет выполняться сразу при запуске карты, а функция podgotovka будет ждать когда ее активируют триггером.
                                                                  // если добавить сюда строку thread podgotovka(); , то функция podgotovka тоже начнет выполняться сразу при запуске.
}

Ну а теперь собственно методы:

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

.remove(); - удаляет указанный объект с карты

пример:

void remove_object() {
$func_static_27.remove();
}

.bind( entity master ); - привязывает объект к какому либо предмету, к чему привязать указывается в скобках

пример:

void bind_object() {
$func_static_27.bind($player1);
}

прибиндит этот статик к игроку

.bindPosition( entity master ); - привязвает к обекту не на прямую, а на том расстоянии, на котором находился до привязки, к чему привязать - в скобках

пример:

void bind_object() {
$func_static_27.bindPosition($player1);
}

.unbind(); - отменяет команду bind и entity становится свободным

пример:

void freedoom() {
$func_static_27.unbind();
}

.setModel( string modelName ); - назначить объекту модель

пример:

void shifter() {
$item_medkit_mp_1.setModel("models/mapobjects/filler/burgerboxclose.lwo");
}

назначит аптечке модель коробки с бургером

.setSkin( string skinName ); - назначить объекту скин

пример:

void setSkin() {

$func_static_52789.setSkin("skins/sodamachinesq");
}

назначает обычной красной модели аппарата с лимонадом зеленый скин

.getWorldOrigin(); - возвращает текущее положение объекта на карте (x y z)

пример:

vector i;

void GetPlayerOrigin() {

i = $player1.getWorldOrigin();
}

Создана глобальная переменная i и в нее записали текущие координаты игрока, чтобы потом их можно было для чего-нибудь использовать

.setWorldOrigin( vector origin ); - задает текущее положение объекта на карте (x y z)

пример:

viod setPlayerPosition() {
$player1.setWorldOrigin('0 240 8');
}

переместит игрока в координаты 0 240 8 (x y z)
обратите внимание, что координаты надо указывать не в двойных кавычках, а в одинарных.

.getAngles(); - получает текущие координаты поворота объекта

пример:

vector ugol;

void ugol_povorota() {
ugol = $player1.getAngles();
}

передаст в переменную ugol текущий угол поворота игрока, эти данные можно в последующем для чего либо использовать.
Так же конечно можно получить угол поворота и для любого другого объекта на карте.

.setAngles( vector angles ); - задает угол поворота объекта (x y z)

пример:

void povorot() {
$func_static_52789.setAngles('0 0 -90');
}

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

.hide(); - прячет объект

пример:

void HideModel() {
$func_static_52789.hide();
}

спрячет объект func_static_52789 и он станет невидим на карте.

.show(); - восстановит спрятанные объекты (если были скрыты)

пример:

void ShowModel() {
$func_static_52789.show();
}

если объект и так уже был виден - ничего не изменится.

.isHidden(); - проверка на то, является ли объект видимым

пример:

void proverka() {
if ($func_static_52789.isHidden()) {  // проверяет является ли статик видимым
   $func_static_52789.show();              // делает его видимым, если он оказался невидим
   }
}

.touches( entity other ); - проверка на то, соприкасается ли объект с другим объектом (в скобках)

пример:

void proverka() {
if (player1.touches($func_volume_water_1)) {
   sys.setcvar("pm_thirdperson", "1");
   }
}

Проверяет соприкасается ли игрок с объектом func_volume_water_1 и если соприкасается - переводит игрока в режим 3 лица.

.getColor(); - получает текущее значение цвета

пример:

void getColor() {
$light_1.getColor();
}

.setColor( float red, float green, float blue ); - задает цвет (красный, зеленый, синий)

пример:

void smenaCveta() {
$light_1.setColor(0.245, 0.832, 1.207);
}

в скобках по порядку задаются цвета - красный, зеленый, синий.

.restorePosition(); - перемещает объект обратно на его координаты origin, если он был перемещен

пример:

На карте у нас есть мовабл, допустим коробка, мы его сдвинули, попинали, попинали и захотелось обратно его положить, как лежал.
Тут то нам эта функция и поможет, вернет его положение, как было при запуске карты.

void vosstanovlenie() {
$moveable_diamondbox_1.restorePosition();
}

C этим все, перейдем к методам sys.

0

4

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

0

5

jONNY[ReWIRE] написал(а):

В скриптах можно объявлять переменные, различных видов и 2ух типов (глобальные и локальные). Переменная - задаваемая величина, которая может меняться во время выполнения скрипта.

Вот за это респект)) Давно хотел заняться переменными в скриптах, да никак нормальную статейку про это найти не мог, так и забил))

0

6

Хм, однако, есть минусы в том, что у каждого своя тема. У меня светлые оттенки на форуме, и белого текста невидно  :D

0

7

Кто-нить знает как скриптами управлять дверьми т.е закрывать и открывать при условии что дверь no_touch,просто есть пару идей на этот случай :unsure:

0

8

Respawner написал(а):

Кто-нить знает как скриптами управлять дверьми т.е закрывать и открывать при условии что дверь no_touch,просто есть пару идей на этот случай :unsure:

конечно )

$func_door_12.open(); - откроет дверь func_door_12
$func_door_12.close(); - закроет дверь func_door_12

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

+1

9

Во!Спс за команду то что нужно) теперь для mp какрты сделал такую фичу как блокировку всего этажа на 10 сек,вобще крутяк  :D

Отредактировано Respawner (30-04-2012 01:04:34)

0

10

Как по мне - так я прибегаю к скриптам в самую крайнюю очередь, когда уже ни trigger'ы, ни func'и не помогают, это позволяет получше узнать редактор дума, а на всякую мелочь - не стал бы писать скрипт xD
Хотя... стоит отметить что в сетевой скрипты порой лучше работают чем всё остальное.

0

11

Методы sys:

При использовании методов sys в скрипте не нужно указывать ссылку на какой либо объект с карты через $, просто пишем sys. и далее нунжый метод.

sys.wait( float time ); - приостанавливает выполнение текущего void'а на указанное кол-во секунд

Пример:

void zaderzhka() {
$func_lalala_1.hide();
$func_lalala_2.hide();
$func_lalala_3.hide();
$func_lalala_4.hide();
sys.wait(5);
$func_lalala_5.hide();
$func_lalala_6.hide();
$func_lalala_7.hide();
$func_lalala_8.hide();

как только выполнение скрипта дойдет до строки sys.wait(5); - выполнение этого void'a приостановится и продолжится спустя 5 секунд.
sys.wait(здесь задаем нужное нам время паузы в секундах);
}

sys.waitFor( entity mover ); - используется для ожидания, пока объект (mover) не закончит движение

Пример:

void moveToTarget() {

$func_mover_1.moveTo($target_null_1);
sys.waitFor($func_mover_1);
$func_mover_1.moveTo($target_null_2);
sys.waitFor($func_mover_1);
$func_mover_1.moveTo($target_null_3);
sys.waitFor($func_mover_1);
$func_mover_1.moveTo($target_null_4);
sys.waitFor($func_mover_1);
}

если написать скрипт перемещения объекта без ожидания завершения перемещения, вот так:

void moveToTarget() {

$func_mover_1.moveTo($target_null_1);
$func_mover_1.moveTo($target_null_2);
$func_mover_1.moveTo($target_null_3);
$func_mover_1.moveTo($target_null_4);
}

То получим ошибку "Runaway loop error" и карта не запустится. Поэтому всегда при скриптовом перемещении муверов приписывайте им ожидание завершения каждого перемещения командой sys.waitFor($имя_перемещаемого_мувера);

sys.print( string text ); - отправляет в консоль текст

Пример:

void sendMessage() {
sys.print("*** Doom 3 russian, version 1.0.1274 map dm_map by jONNY=[ReWiRE]= ***");
}

Так же можно выводить и цветные надписи:

void sendMessage() {
sys.print("^1*** ^7Doom 3 russian, version 1.0.1274 map dm_map by jONNY=[^8Re^5WiRE^7]= ^1***");
}

при срабатывании скрипта эта надпись будет добавлена в содержимое консоли.

sys.println( string text ); - отправляет в консоль текст

Никакой разницы между sys.println(); и sys.print(); не замечено - результат одинаковый. И да, эта функция не передает команду в консоль на выполнение, а просто как и sys.print(); выводит текст в консоль

sys.say( string text ); - заставит админа сервера написать заданный текст на экран в режиме сетевой игры

Пример:

void message() {
sys.say("Добро пожаловать на карту!");
}

Работает только в сетевой, в одиночной по понятным причинам - не работает.

sys.trigger( entity entityToTrigger ); - триггерит объект указанный в скобках

Пример:

void startTriggering() {
sys.trigger($func_door_24);
sys.trigger($light_24);
sys.trigger($speaker_52);
sys.trigger($func_fracture_12);
}

В общем делает то же самое, что и триггеры на карте, но без участия самих триггеров.

sys.setcvar( string name, string value ); - задает значение игровой переменной cvar

Пример:

void InitializeCVars() {
sys.setcvar("ui_showGun", "1");
sys.setcvar("pm_thirdperson", "0");
sys.setcvar("g_showHud", "0");
sys.setcvar("g_mazafucka", "2");
}

sys.setcvar(имя переменной, значение );
Изменять можно только переменные, которым передается float значение, команды типа spawn, give, noclip, god и т.д. - не работают.
все команды из pm_, g_, ui_, si_ и т. д. - работают.

sys.getcvar( string name ); - получает значение игровой переменной cvar

Пример:

float i;

void proverka() {
i = sys.getcvar("pm_thirdperson");
}

sys.isClient(); - проверка на то, является ли игрок клиентом

Пример:

void check() {
if (sys.isClient() = 1) {
   
   }
}

sys.isMultiplayer(); - проверка на сетевой ли сейчас режим игры

Пример:

void check() {
if (sys.isMultiplayer() = 1) {
   
   }
}

sys.drawText( string text, vector origin, float scale, vector color, float align, float lifetime ); - текст для дебаггинга, расположение текста 0-left, 1-center, 2-right.  время жизни сообщения 0 == 1 frame

Пример:

void lalala() {
sys.drawText("lalala", '24 97 154', 2, '132 154 200', 1, 2 );
}

вот наглядный пример, что является результатом команды sys.drawText:
http://s1.hostingkartinok.com/uploads/images/2012/05/afba7e1286bc8016490f6c8b5945b853.jpg

0

12

Годный гайд по полному перечню скриптовых команд для Doom 3:

Modwiki dhewm3

Также, полный список всех команд можно увидеть распаковав pak000.pk4. Все они перечислены с синтаксисом в файле script\doom_events.script

+1


Вы здесь » Форум Мапперов и Doom'еров » Уроки » Скрипты