Sidebar

[HL1] Два звука для дверей

  • Рекомендуется задавать вопросы только относительно темы с уроком. Для остальных вопросов существует раздел [url=/forums/pomosch.12/]«Помощь»[/url].

    Темы с просьбами помощи будут удаляться без предупреждения и без объяснения причины.

    Запрещается поднятие старой темы оффтопом. Ваше сообщение будет удалено, а в профиль будет выписано замечание.

Sigurth

New member
May 30, 2015
1
28
[HL1] Два звука для дверей

Всем привет. Что ж, это мой первый тутор и в нём я расскажу, как сделать так, чтобы дверь имела два разных звука движения. Один для открытия, другой для закрытия. Начнём.
Откроем doors.cpp
Добавим это к остальным дефайнам:
Code:
#define noiseClosing noise3 // door tutorial
Затем спустимся ниже и в описании класса CBaseDoor после
Code:
BYTE	m_bMoveSnd;			// sound a door makes while moving
BYTE	m_bStopSnd;			// sound a door makes when it stops
добавим:
Code:
BYTE	m_bCloseSnd; // door tutorial
Далее чуть ниже в TYPEDESCRIPTION CBaseDoor::m_SaveData[] после
Code:
DEFINE_FIELD( CBaseDoor, m_bStopSnd, FIELD_CHARACTER ),
добавим:
Code:
DEFINE_FIELD( CBaseDoor, m_bCloseSnd, FIELD_CHARACTER ), // door tutorial
Найдём функцию KeyValue и в ней по аналогии с другими ifами вставим:
Code:
else if (FStrEq(pkvd->szKeyName, "closesnd"))  // door tutorial 
{
	m_bCloseSnd = atof(pkvd->szValue);
	pkvd->fHandled = TRUE;
}
Идём в функцию Precache и после:
Code:
// set the door's "in-motion" sound
	switch (m_bMoveSnd)
	{
	case	0:
		pev->noiseMoving = ALLOC_STRING("common/null.wav");
		break;
	case	1:
		PRECACHE_SOUND ("doors/doormove1.wav");
		pev->noiseMoving = ALLOC_STRING("doors/doormove1.wav");
		break;
	case	2:
		PRECACHE_SOUND ("doors/doormove2.wav");
		pev->noiseMoving = ALLOC_STRING("doors/doormove2.wav");
		break;
	case	3:
		PRECACHE_SOUND ("doors/doormove3.wav");
		pev->noiseMoving = ALLOC_STRING("doors/doormove3.wav");
		break;
	case	4:
		PRECACHE_SOUND ("doors/doormove4.wav");
		pev->noiseMoving = ALLOC_STRING("doors/doormove4.wav");
		break;
	case	5:
		PRECACHE_SOUND ("doors/doormove5.wav");
		pev->noiseMoving = ALLOC_STRING("doors/doormove5.wav");
		break;
	case	6:
		PRECACHE_SOUND ("doors/doormove6.wav");
		pev->noiseMoving = ALLOC_STRING("doors/doormove6.wav");
		break;
	case	7:
		PRECACHE_SOUND ("doors/doormove7.wav");
		pev->noiseMoving = ALLOC_STRING("doors/doormove7.wav");
		break;
	case	8:
		PRECACHE_SOUND ("doors/doormove8.wav");
		pev->noiseMoving = ALLOC_STRING("doors/doormove8.wav");
		break;
	case	9:
		PRECACHE_SOUND ("doors/doormove9.wav");
		pev->noiseMoving = ALLOC_STRING("doors/doormove9.wav");
		break;
	case	10:
		PRECACHE_SOUND ("doors/doormove10.wav");
		pev->noiseMoving = ALLOC_STRING("doors/doormove10.wav");
		break;
	default:
		pev->noiseMoving = ALLOC_STRING("common/null.wav");
		break;
	}
вставим это:
Code:
switch (m_bCloseSnd) // door tutorial
	{
	case	0:
		pev->noiseClosing = ALLOC_STRING("common/null.wav");
		break;
	case	1:
		PRECACHE_SOUND ("doors/doormove1.wav");
		pev->noiseClosing = ALLOC_STRING("doors/doormove1.wav");
		break;
	case	2:
		PRECACHE_SOUND ("doors/doormove2.wav");
		pev->noiseClosing = ALLOC_STRING("doors/doormove2.wav");
		break;
	case	3:
		PRECACHE_SOUND ("doors/doormove3.wav");
		pev->noiseClosing = ALLOC_STRING("doors/doormove3.wav");
		break;
	case	4:
		PRECACHE_SOUND ("doors/doormove4.wav");
		pev->noiseClosing = ALLOC_STRING("doors/doormove4.wav");
		break;
	case	5:
		PRECACHE_SOUND ("doors/doormove5.wav");
		pev->noiseClosing = ALLOC_STRING("doors/doormove5.wav");
		break;
	case	6:
		PRECACHE_SOUND ("doors/doormove6.wav");
		pev->noiseClosing = ALLOC_STRING("doors/doormove6.wav");
		break;
	case	7:
		PRECACHE_SOUND ("doors/doormove7.wav");
		pev->noiseClosing = ALLOC_STRING("doors/doormove7.wav");
		break;
	case	8:
		PRECACHE_SOUND ("doors/doormove8.wav");
		pev->noiseClosing = ALLOC_STRING("doors/doormove8.wav");
		break;
	case	9:
		PRECACHE_SOUND ("doors/doormove9.wav");
		pev->noiseClosing = ALLOC_STRING("doors/doormove9.wav");
		break;
	case	10:
		PRECACHE_SOUND ("doors/doormove10.wav");
		pev->noiseClosing = ALLOC_STRING("doors/doormove10.wav");
		break;
	default:
		pev->noiseClosing = ALLOC_STRING("common/null.wav");
		break;
	}
Думаю, тут всё понятно. Теперь найдём функцию DoorGoDown и в ней в самом начале этот кусок
Code:
if ( !FBitSet( pev->spawnflags, SF_DOOR_SILENT ) )
		EMIT_SOUND(ENT(pev), CHAN_STATIC, (char*)STRING(pev->noiseMoving), 1, ATTN_NORM);
Заменим на этот:
Code:
if ( !FBitSet( pev->spawnflags, SF_DOOR_SILENT ) )
	{
		if( FBitSet( pev->spawnflags, SF_DOOR_OPENCLOSE ) ) // door tutorial
			EMIT_SOUND(ENT(pev), CHAN_STATIC, (char*)STRING(pev->noiseClosing), 1, ATTN_NORM);
		else
			EMIT_SOUND(ENT(pev), CHAN_STATIC, (char*)STRING(pev->noiseMoving), 1, ATTN_NORM);
	}
Ниже в функции DoorHitBottom после
Code:
STOP_SOUND(ENT(pev), CHAN_STATIC, (char*)STRING(pev->noiseMoving) );
добавим:
Code:
STOP_SOUND(ENT(pev), CHAN_STATIC, (char*)STRING(pev->noiseClosing) ); // door tutorial
Теперь закрываем doors.cpp и открываем doors.h. Добавим с остальными дефайнами этот:
Code:
#define SF_DOOR_OPENCLOSE			1024 // door tutorial
Сохраняем. Компилим.

Открываем ваш .fgd и ищем
Code:
@BaseClass base(Appearflags, Targetname, RenderFields, Global, Angles) = Door
В нём после
Code:
movesnd(choices) : "Move Sound" : 0 = 
	[
		0: "No Sound"
		1: "Servo (Sliding)"
		2: "Pneumatic (Sliding)"
		3: "Pneumatic (Rolling)"
		4: "Vacuum"
		5: "Power Hydraulic"
		6: "Large Rollers"
		7: "Track Door"
		8: "Snappy Metal Door"
		9: "Squeaky 1"
		10: "Squeaky 2"
	]
вставляем
Code:
	closesnd(choices) : "Move Sound (Closing)" : 0 = 
	[
		0: "No Sound"
		1: "Servo (Sliding)"
		2: "Pneumatic (Sliding)"
		3: "Pneumatic (Rolling)"
		4: "Vacuum"
		5: "Power Hydraulic"
		6: "Large Rollers"
		7: "Track Door"
		8: "Snappy Metal Door"
		9: "Squeaky 1"
		10: "Squeaky 2"
	]
Далее в
Code:
	spawnflags(flags) =
	[
		1 : "Starts Open" : 0
		4 : "Don't link" : 0
		8: "Passable" : 0
	    	32: "Toggle" : 0
		256:"Use Only" : 0
		512: "Monsters Can't" : 0
	]
Добавляем флаг
Code:
	1024: "Open/Close Sounds" : 0
Сохраняем. Готово.

Так, теперь, чтобы сделать эту самую дверь.
1) Создаем дверь
2) Отмечаем галочкой флаг "Open/Close Sounds"
3) Выбераем разные "Move Sound" и "Move Sound (Closing)"
4) Открываем карту и наслаждаемся.

Желательно не использовать стандартные халфовские звуки, а добавить в мод свои. Я, например, использовал парные звуки дверей из Дума, что выглядит неплохо.
 
  • Like
Reactions: JPEG
Я, лично, был бы тебе или кому нибудь еще, признателен если бы вы сделали тутор по настройке среды разработки и подключению SourceSDK.
Последний раз я кодировал на VC2005 (или VC2008 уже даже сам сомневаюсь), винда была XP 32
Новые студии я сколько не пробывал, выдает кучу ошибок. Все нервы вытрепиш себе и в сторону.
Только не нужно переключать на всякие ссылки, википедии и т.д. Я бы хотел от человека у которого реально среда разработки настроена услышать какие то тонкости, какие-то подсказки.
Может быть реально рабочий исходник SDK.