Автор | Сообщение |
Archi Lieutenant Colonel
| 2187 |
Doom Rate: 1.68
|
Отправлено: 20.06.09 14:35:35 | |
| Стоп, это что за файл?! | |
|
| |
c4tnt = Corporal =
| 182 |
Doom Rate: 1.92
|
Отправлено: 20.06.09 16:10:01 | |
| Нужно открывать файл materials\decals.mtr и искать в нём тот фрагмент, который указал Archi
Файл находится обычно в нулевом паке. | |
|
| |
Dragon = 1st Lieutenant =
| 1346 |
Doom Rate: 1.49
|
Отправлено: 20.06.09 17:42:37 | |
| Как делать двери, лифты и другие подобные вещи? | |
|
| |
Bruiser = Corporal =
| 176 |
Doom Rate: 2.00
|
|
| |
Dragon = 1st Lieutenant =
| 1346 |
Doom Rate: 1.49
|
Отправлено: 20.06.09 18:53:19 | |
| Bruiser
Спасибо! Очень полезный ресурс. Ещё раз спасибо. | |
|
| |
c4tnt = Corporal =
| 182 |
Doom Rate: 1.92
|
Отправлено: 20.06.09 21:46:58 | |
| Только там ошибки и неточности бывают иногда. | |
|
| |
Bruiser = Corporal =
| 176 |
Doom Rate: 2.00
|
Отправлено: 21.06.09 08:22:05 | |
| c4tnt, ты вроде говорил что у тебя есть скрипт для рандомного спауна. Плиз, залей его куда-нибудь и скажи в какую директорию его помещать. | |
|
| |
c4tnt = Corporal =
| 182 |
Doom Rate: 1.92
|
Отправлено: 21.06.09 20:09:10 | |
| В общем текст скрипта:
void randomspawn(entity where)
{
string SpawnKey;
string OvKey;
float Overall;
float t;
Overall = where.getFloatKey("_overall");
if (Overall <=0)
{
Overall = 0;
SpawnKey = where.getNextKey( "spawn_", "" );
while (SpawnKey != "")
{
OvKey = "chance"+sys.strSkip(SpawnKey, 5 );
t = where.getFloatKey(OvKey);
if (t==0)
{
Overall++;
}else{
Overall+=t;
}
SpawnKey = where.getNextKey( "spawn_", SpawnKey );
}
where.setKey("_overall",Overall);
}
Overall = sys.random(Overall);
SpawnKey = where.getNextKey( "spawn_", "" );
while (SpawnKey != "")
{
OvKey = "chance"+sys.strSkip(SpawnKey, 5 );
t = where.getFloatKey(OvKey);
if (t==0)
{
Overall--;
}else{
Overall-=t;
}
if (Overall <= 0)
{
OvKey = where.getKey(SpawnKey);
sys.setSpawnArg("origin",where.getWorldOrigin());
sys.setSpawnArg("angle",where.getAngles());
SpawnKey = where.getNextKey( "target", "" );
while (SpawnKey != "")
{
sys.setSpawnArg(SpawnKey,where.getKey(SpawnKey));
sys.print(SpawnKey+":"+where.getKey(SpawnKey)+"\n");
SpawnKey = where.getNextKey( "target", SpawnKey );
}
sys.spawn(OvKey);
sys.print("spawning\n");
sys.waitFrame();
break;
}
SpawnKey = where.getNextKey( "spawn_", SpawnKey );
}
}
Всё запихивается в файл с таким же названием, как у карты и расширением script. Файл должен быть рядом с картой.
Используется так:
на карте нужно создать какой-нибудь неосязаемый объект, например func_static с текстурой nodraw. На тип объекта ограничений нет, можно даже сделать мувер и двигать точку появления монстров по карте. Главное - чтобы он был неосязаемым. Монстры будут появляться в том месте, где находится объект.
В свойствах объекта нужно создать ключи вида
"spawn_1" "monster_demon_imp"
"spawn_2" "monster_demon_trite"
ну и так далее
Если нужно неравномерное появление монстров - можно дополнительно создать такие ключи:
"chance_1" "5"
"chance_2" "10"
Соответственно имп будет появляться 5 раз из 15, а трайт - 10 раз из 15
Если ключ не указан - он считается равным единице.
После этого нужно просто вызвать функцию void randomspawn(entity where) с указанием этого объекта.
Пример вызова:
void testspawn()
{
randomspawn($func_static_1);
}
Соответственно, у меня такой точкой высадки был func_static_1
У созданного монстра будет такой же угол поворота, как у спавнера, и кроме того, монстру передаются все таргеты от спавнера.
Для создания монстра нужно создать триггер на карте и вписать в него ключ "call" "testspawn".
Если нужно создать случайного монстра в одной из случайных точек - код вызова randomspawn будет примерно таким:
void testspawn()
{
float x;
x = sys.random(4);
if (x <= 1)
{
randomspawn($имя_первой_точки);
return;
}
if (x <= 2)
{
randomspawn($имя_второй_точки);
return;
}
if (x <= 3)
{
randomspawn($имя_третьей_точки);
return;
}
randomspawn($имя_четвёртой_точки);
}
В каждой из точек можно указать собственный комплект монстров. | |
|
| |
Azamael = Sergeant =
| 441 |
Doom Rate: 1.60
|
Отправлено: 22.06.09 15:04:02 | |
| Как оптимизировать карту? (вот спомощю нодрав и виспорталов и всего осталного, а то не пойму как оно работает) - этот вопрос для меня очень важен, так как карта выросла (да и детализация значительно больше шести брашей на комнату ), а машина у меня слабая - в результате на настройках по минимуму больше 10-15 фпс нету. (а в боях и того меньше)
Поетому прошу помощи в оптимизации | |
|
| |
Archi Lieutenant Colonel
| 2187 |
Doom Rate: 1.68
|
|
| |
Bruiser = Corporal =
| 176 |
Doom Rate: 2.00
|
Отправлено: 22.06.09 19:04:22 | |
| c4tnt, карта не запускается, в консоли написано Error: file maps\test2.script line 65: " is not a name | |
|
| |
c4tnt = Corporal =
| 182 |
Doom Rate: 1.92
|
|
| |
Bruiser = Corporal =
| 176 |
Doom Rate: 2.00
|
Отправлено: 22.06.09 20:20:31 | |
| c4tnt, ошибка вроде исчезла, но монстры не спаунятся. Я создал func_static, покрыл текстурой nodraw, в свойствах написал spawn_1 monster_demon_imp, spawn_2 monster_demon_mancubus, spawn_3 monster_demon_hellknight, потом поставил на карту бфг, в свойствах бфг прописал target func_static_1. Может нужно писать после monster пробел или ввести ещё какие-то параметры? | |
|
| |
c4tnt = Corporal =
| 182 |
Doom Rate: 1.92
|
Отправлено: 22.06.09 20:29:31 | |
| Нужно добавить триггер_релэй с параметрами "call" "название_функции". И его триггерить.
И в скрипте должна быть функция вида
void имя_функции()
{
randomspawn($в_какой_точке);
}
Можешь попробовать testspawn из файла. К сожалению обход этой необходимости (то есть просто спавнер, который можно затриггерить) усложняет всё во много раз.
и ещё из финальной версии можно и нужно убрать все строки sys.print | |
|
| |
Bruiser = Corporal =
| 176 |
Doom Rate: 2.00
|
Отправлено: 23.06.09 06:17:57 | |
| c4tnt, спасибо! Все работает! Только можно сделать, чтобы монстры бесконечно появлялись и чтобы они телепортировались? | |
|
| |
c4tnt = Corporal =
| 182 |
Doom Rate: 1.92
|
Отправлено: 23.06.09 12:48:34 | |
| Впиши в спавнер таргет на тот триггер, который запускает процесс (лучше на триггер_релэй), ключ "teleport" "1" и ключ "trig" "1"
Скрипт придётся слегка обновить. ( http://c4tnt.ucoz.ru/testarea/spawne.zip ) | |
|
| |
Bruiser = Corporal =
| 176 |
Doom Rate: 2.00
|
Отправлено: 23.06.09 18:17:08 | |
| c4tnt, огромное спасибо! У меня возникло ещё 3 вопроса: 1. Как увеличить время между телепортациями? В триггере релай пробовал wait прописать больше, но ничего не изменилось. 2. В какую папку или может нужно в пак класть звуки, чтобы редактор видел их? 3. Как сделать, чтобы звук играл на весь уровень? | |
|
| |
Dragon = 1st Lieutenant =
| 1346 |
Doom Rate: 1.49
|
Отправлено: 23.06.09 18:19:25 | |
| А что бы новый пда работал надо его в пк4 сунуть? | |
|
| |
Archi Lieutenant Colonel
| 2187 |
Doom Rate: 1.68
|
Отправлено: 23.06.09 18:30:57 | |
| нет
его надо засунуть в папку newpdas которую надо создать в папке base. | |
|
| |
Dragon = 1st Lieutenant =
| 1346 |
Doom Rate: 1.49
|
Отправлено: 23.06.09 18:36:18 | |
| Archi
ага. А если этоту карту с пда нужно передать кому то? | |
|
| |
c4tnt = Corporal =
| 182 |
Doom Rate: 1.92
|
Отправлено: 23.06.09 18:48:28 | |
| Bruiser
1. Не wait а delay. wait - минимальное время между срабатываниями триггера, при wait = 1 триггер после срабатывания не реагирует на события примерно секунду. А delay - это задержка срабатывания триггера.
2. Звуки в папку sound, но для того, чтобы звук был в редакторе, нужно написать для него "шейдер" (не знаю, как правильно это назвать). В общем посмотри файлики .sndshd в папке со звуками.
3. Собственно, в шейдер звука вписать:
название звука {
looping - звук зациклен
global - на весь уровень
unclamped - без затухания
sound/... - файл звука
}
По поводу запаковки в пак - если всё лежит в папках в doom3\base\ и работает - нужно просто запаковать всё, относящееся к карте, в архив. Новые папки лучше не создавать - в некоторых версиях дума есть глюк, с такими паками мод может не запуститься. | |
|
| |
Archi Lieutenant Colonel
| 2187 |
Doom Rate: 1.68
|
Отправлено: 23.06.09 19:04:03 | |
| Dragon
добавь такой ключ.
"pda_name" "beta_map2_lab"
взял из своего проекта. beta_map2_lab - название пда. вот так оно выглядит в файле pda beta_map2_lab {. | |
|
| |
Bruiser = Corporal =
| 176 |
Doom Rate: 2.00
|
Отправлено: 23.06.09 19:52:18 | |
| c4tnt, для проверки я скачал с сайта файл test.wav(to win the game you must kill me, john Romero). Создал для него "шейдер". В редакторе он видится, но не воспроизводится, в игре тоже. | |
|
| |
c4tnt = Corporal =
| 182 |
Doom Rate: 1.92
|
Отправлено: 23.06.09 20:07:36 | |
| Значит либо файл не подходит, либо в шейдере ошибка - смотри консоль | |
|
| |
Archi Lieutenant Colonel
| 2187 |
Doom Rate: 1.68
|
Отправлено: 23.06.09 20:27:15 | |
| Bruiser
возможно ошибка находится в ваве. Кстати он их и без шейдеров видит | |
|
| |
Bruiser = Corporal =
| 176 |
Doom Rate: 2.00
|
Отправлено: 24.06.09 09:35:16 | |
| Archi, я в консоли посмотрел и было написано, что частота не подходит. Сейчас изменил и все нормально . У меня вопрос: можно ли сделать, чтобы после определённого действия все монстры на карте подохли? Только чтобы они не просто исчезли, а именно подохли с эффектом исчезания тел. | |
|
| |
c4tnt = Corporal =
| 182 |
Doom Rate: 1.92
|
Отправлено: 24.06.09 09:44:26 | |
| Ну в принципе можно... | |
|
| |
Archi Lieutenant Colonel
| 2187 |
Doom Rate: 1.68
|
Отправлено: 24.06.09 09:54:04 | |
| Ставь на карту func_damage и от него таргеты к монстрам. Вот такой код.
def_damage
damage_triggerhurt_1000 | |
|
| |
Bruiser = Corporal =
| 176 |
Doom Rate: 2.00
|
Отправлено: 24.06.09 11:36:45 | |
| Archi : | от него таргеты к монстрам |
А если например монстры спаунятся пока кибер жив, а потом как завалишь его все оставшиеся монстры должны сдохнуть , то как в этом случае сделать? | |
|
| |
Archi Lieutenant Colonel
| 2187 |
Doom Rate: 1.68
|
Отправлено: 24.06.09 13:22:13 | |
| Надо ввести переменную в скрипт, например
if(i = 1){монстры спанятся}
elseif(i = 0){уничтожение скрипта}
А когда кибер умрет поменять переменную на 0. И используя func_damage убить уже спавненных. | |
|
| |