Перейти к публикации

Welcome to Call of Duty Black Ops , Call of Duty: Modern Warfare 3, COD2, COD4, COD4, MW2, Call of Duty War, CallofDuty Black Ops - В России!





Скриптинг проблема(


  • Вы не можете создать новую тему
  • Please log in to reply
62 replies to this topic

#41 Slinger

Slinger

    технический спецЫалист

  • Staff
  • PipPipPipPipPipPipPipPip
  • 3131 Сообщений:
  • Пол:Мужской
  • Location:Moscow, Russia

Отправлено 05 January 2011 - 13:54

Закончить карту/мод или что ты там с другом создаёте
Размещенное изображение

#42 Slowpoke3586

Slowpoke3586

    Рядовой

  • Рядовые
  • 31 Сообщений:

Отправлено 06 January 2011 - 00:26

А как можно проще всего реализовать передвижения сразу нескольких стенок за раз? Например дать им всем одно название... Я даже сделал небольшую карту:

Присоединенный файл  map.rar   22.5К   51 Количество скачиваний

Скажите пжлст.

#43 sERGE-002

sERGE-002

    Подполковник

  • Офицеры
  • PipPipPipPipPip
  • 895 Сообщений:
  • Пол:Мужской

Отправлено 06 January 2011 - 13:07

Я кстати радиантом доволен, малость неудобен но ничего сложного.

Малость - это слабо сказано. Он не просто не недружелюбен, он враждебен :)

Если хочешь действительно получить острых ощущений - скачай самый первый редактор q3-мап под названием Quark.

Не помню кварк это был или какой-то другой редактор (под первый квейк еще), но там было все гораздо удобнее. И в 3д-виде можно было летать как спеком в игре, не то что в радианте - пока сообразишь куда чего повернуть чтобы объект рассмотреть...
Ну да ладно... Че-то я разворчался... Все равно маппером не собираюсь становиться. Я просто свое "фи" высказал :)

Я всегда думал, что триггер с активацией по нажатию клавиши F это trigger_use_touch

Да я сначала сделал юзе-тач, но потом у меня че-то в игре hintstring по-русски выводиться не захотел - только пол-предложения вывел. Я попробовал просто "юзе" - не помогло, но особых изменений в триггере я не заметил, поэтому и оставил его. Ну терь разница понятна (благодаря Слингеру) :)

А как можно проще всего реализовать передвижения сразу нескольких стенок за раз? Например дать им всем одно название...


Когда у тебя несколько объектов (энтити) с одним именем, то получать их надо как массив:
ents = getentarray("e","targetname");
и потом в цикле перебираешь все элементы массива и производишь с ними какое-то нужное тебе действие.
Вот, я поправил твой скрипт:

tt()
{
	walls=getentarray("e","targetname"); // получаем все объекты с targetname = "e"
	trig=getent("ue","targetname");
	while(1)
	{
		trig waittill("trigger");
		
		for(i=0; i<walls.size; i++) // перебираем объекты и запускаем движение для каждого
		{
			walls[i] movex(112,1);
		}
		walls[0] waittill("movedone"); // ждем окончания движения для первого объекта, т.к. все они двигаются одинаково
		
		wait(1);

		// тут аналогично
		for(i=0; i<walls.size; i++)
		{
			walls[i] movex(-112,1);
		}
		walls[0] waittill("movedone");
	} 
}

Все работает :)

А можно сделать еще так:
tt()
{
	walls=getentarray("e","targetname");
	trig=getent("ue","targetname");
	while(1)
	{
		trig waittill("trigger");
		
		for(i=0; i<walls.size; i++)
		{
			walls[i] thread moving(i);
		}
	} 
}

moving(id)
{
	self movex(112,1);
	self waittill("movedone");
	
	wait(1);

	self movex(-112,1);
	self waittill("movedone");
}

Т.е. тут для каждого объекта запускается свой поток moving(). В id передается порядковый номер (можно использовать для идентификации - для каких-нибудь целей).
Правда, тут надо подумать как после цикла сделать задержку ожидания завершения движения всех объектов. Но это все решаемо - все зависит от поставленных задач.
Например, так:
moving(id)
{
	if(isDefined(self.isMoving))
		return;
		
	self.isMoving = true;
	
	self movex(112,1);
	self waittill("movedone");
	
	wait(1);

	self movex(-112,1);
	self waittill("movedone");
	
	self.isMoving = undefined;
}

Тут пока платформа движется, второй раз ее активировать можно только по окончанию движения.

Это сообщение было изменено sERGE-002: (06 January 2011 - 13:32)

Posted Image
cod.proc.ru

#44 Slowpoke3586

Slowpoke3586

    Рядовой

  • Рядовые
  • 31 Сообщений:

Отправлено 08 January 2011 - 10:16

буквы


Спасибо :) А я пытался сделать это просто вот так:

tt()
{
        walls=getentarray("wall","targetname");
        trig=getent("ue","targetname");

        while(1)
        {
        trig waittill("trigger");
        walls movex(-112,1);
        walls movex(112,1);
        walls waittill("movedone");
        } 
}

Поэтому и не работало.

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


Вроде можно решить эту проблему, я не пробовал, но все же:

trigger thread maps\mp\_utility::triggerOff();

А потом:

trigger thread maps\mp\_utility::triggerOn();


#45 sERGE-002

sERGE-002

    Подполковник

  • Офицеры
  • PipPipPipPipPip
  • 895 Сообщений:
  • Пол:Мужской

Отправлено 08 January 2011 - 13:07

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

А triggerOn/triggerOff - это отключение триггера (хотя на самом деле он просто перемещается вниз от своей реальной позиции и становится недоступен в точке активации). Но это тоже надо вставить в правильное место :)
Это можно использовать, если надо отключить триггер на какое-то время после его активации или по какому-то событию.
Posted Image
cod.proc.ru

#46 Slowpoke3586

Slowpoke3586

    Рядовой

  • Рядовые
  • 31 Сообщений:

Отправлено 08 January 2011 - 15:22

А можно ли как - то осуществить в код 2 запись в файл, открытие этого файла, изменение, сохранение, поиск строки и т.д.?

#47 sERGE-002

sERGE-002

    Подполковник

  • Офицеры
  • PipPipPipPipPip
  • 895 Сообщений:
  • Пол:Мужской

Отправлено 08 January 2011 - 17:22

Можно. И этим-то скриптинг в код2 и хорош :)
Для работы с файлами используются следующие функции:

  • openfile(fName, fMode) - функция для открывания файла с именем fName в режим доступа fMode ("read" - на чтение; "write" - на запись - старый файл затирается; "append" - добавление данных).
    Функциия возвращает идентификатор файла или -1, если возникает ошибка открытия файла.

    Например:
    f = openfile("my_data.dat", "read");if(f < 0){    // ошибка открытия файла    iprintln("^1File open error");}else{    // работа с файлом}

    Все файлы создаются в папке scriptdata (в директории игры). Можно задавать подпапки:
    f = openfile("MYDATA/my_data.dat", "write");
    В этом случае автоматом будет создана подпапка MYDATA в папке scriptdata.
  • closefile(fID) - функция закрывает открытый ранее файл (fID - идентификатор открытого файла).
    // проверка наличия заданного файла:f = openfile("my_data", "read");if(f >= 0)    closefile(f);else    iprintln("File not found");
  • fprintln(fID, data) - функция записи данных (data) в открытый ранее файл (fID - идентификатор открытого файла). В качестве данных могут выступать как переменные, так и строки. Причем вcе данные пишутся в одну строчку и автоматом разделяются запятыми (","). Хотя, никто не запрещает разбивать данные на строки, записав символ перевода на новую строку ("\n"):
    f = openfile("my_data", "write");if(f >= 0){    i = 3.14;    fprintln(f, "Test string"); // этот...    fprintln(f, i); // ... и этот параметры запишутся в одну строку    fprintln(f, "\nNew line"); // а этот уже будет на следующей. причем перевод строки надо делать именно в начале первого параметра, а не в конце предыдущего    closefile(f);}
    Файл будет выглядеть так:

    Test string,3.14,
    New line,

  • freadln(fID) - эта функция возвращает кол-во элементов в текущей строке файла (т.е. число подстрок, разделенных запятыми). Причем каждый вызов этой функции переводит "указатель позиции" к следующей строке файла. Для последней строки функция вернет значение: -1
    f = openfile("my_data", "read");if(f >=0){    line = 0;    while(1)    {        line++;        items = freadln(f);        if(items < 0)            break; // последняя строка        iprintln("Line #"+line+": "+items+" items"); // выводим номер строки и кол-во элементов    }    closefile(f);}
  • fgetarg(fID, iNum) - функция возвращает считанный из текущей строки файла элемент с номером iNum (отсчет от нуля). Переход к следующей строке - по freadln.
    f = openfile("my_data", "read");if(f < 0){    iprintln("File open error");    return;}while(1){    items = freadln(f);    if(items < 0)        break;    params = []; // обнуляем массив считанных параметров    for(i=0; i<items; i++)    {        params[i] = fgetarg(f, i); // читаем очередной параметр    }    // теперь массив params содержит все элементы текущей строки файла.}closefile(f);
    Только надо учесть, что все считанные параметры будут иметь тип string (т.е. они будут строковыми). Для преобразования их в integer надо действовать так:
        i = int(param[0]); // преобразуем считанный первый параметр в тип integer

Ну вот, вкратце так :)
Заменять строки в файле нельзя (только перезаписывать целиком, ну или добавлять). Ну это и не критично. Я считывал все параметры из своих файлов в массив данных, а при изменении данных скидывал их заново в файл, перезаписывая старый.

Да, и еще одно важное и неприятное ограничение: одновременно можно открыть только 1 файл. Открыть второй файл, не закрыв перед этим уже открытый первый - не получится. Такие вот пироги... Так что не забывай всегда закрывать файл по окончанию работы с ним. И желательно, чтобы он не был открыт долгое время - мало ли в каком скрипте еще кто-то захочет открыть файл - будет конфликт. Так что если даже тебе нужен открытый файл во время всей игры, то делай так: открывай только сразу перед чтением/записью и потом сразу закрывай. Можно функцию написать что-то вроде:
newwrite(fName, data)
{
    f = openfile(fName, write);
    if(f<0)
        return;
    fprintln(f, data);
    closefile(f);
}

Posted Image
cod.proc.ru

#48 Slowpoke3586

Slowpoke3586

    Рядовой

  • Рядовые
  • 31 Сообщений:

Отправлено 08 January 2011 - 20:07

еще букавки


Даа, у меня тут куча делающих моды знакомых убьет за этот код, а вы его тут нахаляву выкладываете :). Спасибо.

#49 sERGE-002

sERGE-002

    Подполковник

  • Офицеры
  • PipPipPipPipPip
  • 895 Сообщений:
  • Пол:Мужской

Отправлено 08 January 2011 - 22:58

Пожалуйста. Да вообще-то все уже давно известно. С доками, правда, напряженка (где-то одни функции описаны, где-то другие, то инфа неполная, то еще что), но настойчивый скриптер давно бы уже нарыл всю инфу в чужих модах :)
Posted Image
cod.proc.ru

#50 Slowpoke3586

Slowpoke3586

    Рядовой

  • Рядовые
  • 31 Сообщений:

Отправлено 09 January 2011 - 10:11

Пожалуйста. Да вообще-то все уже давно известно. С доками, правда, напряженка (где-то одни функции описаны, где-то другие, то инфа неполная, то еще что), но настойчивый скриптер давно бы уже нарыл всю инфу в чужих модах :)


Дак ведь прячут же все, не дают скачать :) А откуда еще это все узнать можно?

#51 Slinger

Slinger

    технический спецЫалист

  • Staff
  • PipPipPipPipPipPipPipPip
  • 3131 Сообщений:
  • Пол:Мужской
  • Location:Moscow, Russia

Отправлено 09 January 2011 - 10:15

Исходники мало кто даёт. Вернее почти никто не дает. Хотя OpenWarfare Mod для cod4/cod5 является open source и исходники можно спокойно слить.

Ещё древний но добротный мод от Зероя (Zeroy) под названием RMS мод был с исходниками. Кажется =)

Остальные все добываются путём раскурочивания фаст файла
Размещенное изображение

#52 sERGE-002

sERGE-002

    Подполковник

  • Офицеры
  • PipPipPipPipPip
  • 895 Сообщений:
  • Пол:Мужской

Отправлено 09 January 2011 - 11:12

Дак ведь прячут же все, не дают скачать :)

Исходники мало кто даёт. Вернее почти никто не дает

Ой да ладно вам :)
Мы же говорим о код2 - а тут много модов в свободном доступе с исходниками. Те же awe, extreme, admiral и прочие.
Этого более чем достаточно. Кстати, экстрим - это самый качественный и профессионально написанный мод. Всем желающим изучить скриптинг (или повысить проф.уровень) рекомендую покопаться именно в его скриптах - почерпнете для себя много полезных фишек, скриптов и приемов.
Да и стандартные игровые скрипты код2 тоже покопать не мешает - я многое узнал из них. А уж их-то точно никто не прячет :)
У меня в отдельной папке специально в распакованном виде лежат все стандартные скрипты от код2 до код6. Забудешь как какая-нибудь функция работает или еще какую-то фишку - вбил поиск по файлам - нашел, посмотрел.

По поводу док - в modtools есть дока по скриптингу (не полная, но все-таки описание многих стандартных функций там есть).
Еще был сайтик www.codscript.com - там тоже было много инфы по функциям (правда сейчас уже не доступен).
В любом случае - было бы желание, информацию найти можно.
Posted Image
cod.proc.ru

#53 Slinger

Slinger

    технический спецЫалист

  • Staff
  • PipPipPipPipPipPipPipPip
  • 3131 Сообщений:
  • Пол:Мужской
  • Location:Moscow, Russia

Отправлено 09 January 2011 - 11:24

http://www.zeroy.com/script/


Если че - функции для cod4. Хорошая весчь
Размещенное изображение

#54 Slowpoke3586

Slowpoke3586

    Рядовой

  • Рядовые
  • 31 Сообщений:

Отправлено 10 January 2011 - 18:02

Остальные все добываются путём раскурочивания фаст файла

А что это такое? :o

По поводу док - в modtools есть дока по скриптингу (не полная, но все-таки описание многих стандартных функций там есть).
Еще был сайтик www.codscript.com - там тоже было много инфы по функциям (правда сейчас уже не доступен).
В любом случае - было бы желание, информацию найти можно.

Есть кое-что полезное, но в основном для синглплеера :)

http://www.zeroy.com/script/


Если че - функции для cod4. Хорошая весчь

Да кстати. Сходства заметны, хорошая вещь!

-0-0-0-0-0-0-0-0-

Объясните, почему код не работает:
trig2()
{
b1=getent("two","targetname");
b2=getent("three","targetname");
b3=getent("four","targetname");
b4=getent("five","targetname");
b5=getent("six","targetname");
b6=getent("seven","targetname");
t1=getent("ttwo","targetname");
t2=getent("tthree","targetname");
t3=getent("tfour","targetname");
t4=getent("tfive","targetname");
t5=getent("tsix","targetname");
t6=getent("tseven","targetname");
while(1)
{
t1 waittill ("trigger");
b1 movex (-500,1);
b1 waittill ("movedone");
wait(1)
b1 movex (500,1);
b1 waittill ("movedone");
wait(2);
} 
while(1)
{
t2 waittill ("trigger");
b2 movex (-500,1);
b2 waittill ("movedone");
wait(1);
b2 movex (500,1);
b2 waittill ("movedone");
wait(2);
} 
while(1)
{
t3 waittill ("trigger");
b3 movex (-500,1);
b3 waittill ("movedone");
wait(1);
b3 movex (500,1);
b3 waittill ("movedone");
wait(2);
} 
while(1)
{
t4 waittill ("trigger");
b4 movex (-500,1);
b4 waittill ("movedone");
wait(1);
b4 movex (500,1);
b4 waittill ("movedone");
wait(2);
} 
while(1)
{
t5 waittill ("trigger");
b5 movex (-500,1);
b5 waittill ("movedone");
wait(1);
b5 movex (500,1);
b5 waittill ("movedone");
wait(2);
} 
while(1)
{
t6 waittill ("trigger");
b6 movex (-500,1);
b6 waittill ("movedone");
wait(1);
b6 movex (500,1);
b6 waittill ("movedone");
wait(2);
} 
}
Пишет мне (developer 0):
Присоединенный файл  one.jpg   609.63К   54 Количество скачиваний
(developer 1):
Присоединенный файл  two.jpg   625.17К   52 Количество скачиваний
Прилагаю так-же весь .gsc (мало ли что):
Присоединенный файл  mp_------------------.txt   4.19К   57 Количество скачиваний

Это сообщение было изменено Slowpoke3586: (10 January 2011 - 18:03)


#55 sERGE-002

sERGE-002

    Подполковник

  • Офицеры
  • PipPipPipPipPip
  • 895 Сообщений:
  • Пол:Мужской

Отправлено 11 January 2011 - 00:11

Ну ты и намутил :)
Для начала, команда while(1) - работает как бесконечный цикл. Т.е. в твоей функции управление повиснет на первом триггере, а дальше код выполнятся не будет.
Потом, если у тебя все платформы двигаются одинаково, зачем городить такой огород?
Делай так: всем платформам, двигающимся одинаково задай одно имя (targetname), а в ключе target пропиши имя триггера, которым она активируется (его targetname).

Ну т.е. всем своим платформам (two..seven) прописываешь targetname = walls1 (к примеру).
И у каждой платформы в target прописываешь имя, активирующего ее триггера.
Т.е. для платформы "two" будет так:
targetname = walls1
target = ttwo

для "three":
targetname = walls1
target = tthree

и т.д.

Тогда код будет такой:
main()
{
	thread Trig1();
}

Trig1()
{
	walls = getentarray("walls1", "targetname"); // получаем все платформы с заданным именем
	for(i=0; i<walls.size; i++)
	{
		walls[i] thread WallProcess1(); // для каждой запускаем поток ожидания
	}
}

WallProcess1()
{
	trig = getent(self.target, "targetname"); // для каждой платформы получаем ее триггер (из поля target)
	while(1)
	{
		trig waittill("trigger");
		
		self movex (-500,1);
		self waittill ("movedone");
		wait(1);
		self movex (500,1);
		self waittill ("movedone");
		wait(2);		
	}
}
Вот и все :)

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

Вот краткое описание:

см. ниже

Это сообщение было изменено sERGE-002: (15 January 2011 - 01:07)

Posted Image
cod.proc.ru

#56 Slowpoke3586

Slowpoke3586

    Рядовой

  • Рядовые
  • 31 Сообщений:

Отправлено 11 January 2011 - 08:16

Ну ты и намутил :)


Не лень было такое писать? :0 Или вы часто такие размеры пишете? Додуматься ведь еще надо как это сделать...
Скрипт понравился, буду использовать его :)

У меня еще вопрос. А можно как-нибудь так-же сделать, но не движение, а что-бы он крутился вот так:
|____/_________\______|_____/__________\_____|
|___/_____-----___\_____|____/___-------_____\____| Вид сбоку
|__/_____________\____|___/______________\___|
Середина должна быть всегда на одном месте.

if(!isDefined(walls))
Кстати, неужели эти рюшечки правда так сильно нужны? Ведь если ничего не найдет карта вылетит, а тут просто дальше будет, но я то хочу например результат, а не думать потом где я допустил ошибку в скрипте, а оказывается просто название не прописал :). А так сразу понятно будет... К тому же без этого ошибку проще найти как-бы.

У меня сегодня день рожденье :).

#57 sERGE-002

sERGE-002

    Подполковник

  • Офицеры
  • PipPipPipPipPip
  • 895 Сообщений:
  • Пол:Мужской

Отправлено 12 January 2011 - 23:04

Не лень было такое писать? :0 Или вы часто такие размеры пишете?

Да разве ж это размер? Это вполне рядовой скрипт :) Единственной проблемкой было найти ключ у скрипт-браша, в который можно было бы любой текст писать.
Вообще, мне нравятся всякие заковыристые задачки, только все обычно упирается в свободное время...
Скрипитинг - это весьма интересно и увлекательно. Особенно игровой и особенно когда в нем разбираешься :)

Скрипт понравился, буду использовать его

welcome :)

У меня еще вопрос. А можно как-нибудь так-же сделать, но не движение, а что-бы он крутился вот так:

Я немного переделал скрипт, теперь в описании движения можно использовать и вращение. А если не указывать в поле target имя триггера, то объект будет двигаться по заданному алгоритму постоянно, начиная со старта карты.
Только с вращением проблемка. Че-то объект вращается не относительно своего центра, а относительно хрен пойми чего. Помнится, сталкивался я уже с этим...
Сдается мне, надо что-то в карте указать...
Посмотрел на одной карте как вращают двери - вроде бы все так же, только у их браша есть ключ origin, а те, которые создаю я в радианте - без него. Походу косяк здесь.
Только я хз как этот ориджн к брашу привязать. Пробовал руками прописать ключ origin к брашу - не добавляется. ..
Вообщем, нужна помощь клуба :)

Может Слингер чего подскажет или еще кто?

if(!isDefined(walls))
Кстати, неужели эти рюшечки правда так сильно нужны? Ведь если ничего не найдет карта вылетит, а тут просто дальше будет

Это не рюшечки - это защита от кривого использования скрипта. Конечно, когда скрипт пишется для конкретной карты, когда все известно (что есть, чего нет) - то подобные проверки обычно не делают. А когда делается универсальный скрипт - тут надо учитывать все возможные ошибки, которые могут привести к падению мода, в котором скрипт будет использоваться (это считается хорошим тоном).

У меня сегодня день рожденье

Бывает... С прошедшим :)
Posted Image
cod.proc.ru

#58 Slowpoke3586

Slowpoke3586

    Рядовой

  • Рядовые
  • 31 Сообщений:

Отправлено 13 January 2011 - 08:42

Я немного переделал скрипт, теперь в описании движения можно использовать и вращение. А если не указывать в поле target имя триггера, то объект будет двигаться по заданному алгоритму постоянно, начиная со старта карты.
Только с вращением проблемка. Че-то объект вращается не относительно своего центра, а относительно хрен пойми чего. Помнится, сталкивался я уже с этим...
Сдается мне, надо что-то в карте указать...
Посмотрел на одной карте как вращают двери - вроде бы все так же, только у их браша есть ключ origin, а те, которые создаю я в радианте - без него. Походу косяк здесь.
Только я хз как этот ориджн к брашу привязать. Пробовал руками прописать ключ origin к брашу - не добавляется. ..
Вообщем, нужна помощь клуба


Так в этом то и вся проблема :). А так бы я и сам сделать смог...

#59 sERGE-002

sERGE-002

    Подполковник

  • Офицеры
  • PipPipPipPipPip
  • 895 Сообщений:
  • Пол:Мужской

Отправлено 15 January 2011 - 01:00

Так в этом то и вся проблема :). А так бы я и сам сделать смог...

Захотел бы - сделал :)
Я нашел инфу про создание дверей. Причем тут же, на форуме - Слингер выложил ее аж в 2006-м :)
Вот туториал: http://www.callofdut...indpost&p=71701
Все достаточно просто, хотя методом тыка я бы до этого не допер.

Вот обновленный скрипт с тестовой картой и исходниками: Присоединенный файл  mp_triggerwalls_v1.3.zip   22.05К   42 Количество скачиваний
Теперь доступно вращение объектов и возможность постоянного движения (вращения) без активации триггером.

Описание:

Объекты, триггеры и алгоритм движения должны быть прописаны в карте:
- все движимые объекты должны иметь ключ targetname = walls
- если движение объекта активируется по триггеру, то объекту необходимо добавить ключ target - в котором указывается имя активирующего триггера (его targetname)
- можно использовать 1 триггер для активации нескольких объектов (в каждом объекте в ключе target нужно прописать одно и то же имя триггера)
- если ключ target у объекта не задан (нет активирующего триггера), то объект начинает движение сразу при старте карты (движение повторяется бесконечно по заданному алгоритму)

- алгоритм движения объекта прописывается в ключе script_noteworthy. Все параметры разделяются пробелами.
формат такой: <тип движения> <смещение> <время движения> <пауза>
<тип движения>: x, y или z (для продольного движения) или: ry, rp, rr (для вращения по осям yaw, pitch, roll)
<смещение> - на сколько юнитов переместить объект по заданной оси (для x,y,z) или угол поворота (для ry,rp,rr)
<время движения> - время в сек. (возможны дроби)
<пауза> - пауза после движения (возможны дроби)

Пример:
script_noteworthy = z 64 0.5 0 y 256 1 0 z -64 0.5 0 y -256 0

Расшифровка:
1) на 64 по z за 0.5 сек, пауза 0
2) на 256 по y за 0.5 сек, пауза 0
3) на -64 по z за 0.5 сек, пауза 0
4) на -256 по y за 0 сек, пауза 0 (исходная точка)

Замечания:
1) Активирующий триггер находится всегда в одной точке, так что необходимо предусмотреть, чтобы объект по окончанию движения возвращался в исходную (начальную) точку.

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

3) Можно использовать разные типы триггеров:
- trigger_use (активация нажатием USE, срабатывает на некотором расстоянии от триггера);
- trigger_use_touch (активация нажатием USE, необходимо войти в область триггера);
- trigger_radius (активируется при вхождении в триггер. сам триггер в виде цилиндра)
- trigger_once (активируется однократно при вхождении в триггер)
- trigger_multiple (активируется многократно при вхождении в триггер)
- trigger_lookat (активируется при взгляде на триггер (прицелом))
- trigger_damage (активируется при нанесении триггеру повреждения)


P.S. Обновил скрипт и карту. Алгоритм движения теперь надо прописывать в ключе script_noteworthy (он специально для передачи параметров в скрипт предназначен), а не в name.
Posted Image
cod.proc.ru

#60 Slowpoke3586

Slowpoke3586

    Рядовой

  • Рядовые
  • 31 Сообщений:

Отправлено 15 January 2011 - 16:48

Вот обновленный скрипт с тестовой картой и исходниками: .


Не качается :)




0 посетителей читают эту тему

0 пользователей, 0 гостей, 0 анонимных пользователей