Исправление респавна Оружия

From Valve Developer Community
Jump to: navigation, search
English Deutsch

Введение

Когда оружие неправильно установлен на карте (т.е. когда "bounding box" оружия пересекается с entities (ентями) или геометрией уровня), то они будут появляться в неправильной месте на карте, после того, как их подобрал игрок. В большинстве случаев оружие будет появляться в координате 0 0 0 </ код> на карте, и дальше будет продолжаться вечный цикл падения, ожидая, сначала респавн и снова падения. К счастью, решение этой чрезвычайно распространенной ошибки является очень простым.

Note:Этот баг распространён только в модах базирующихся на HL2DM SDK коде, для синг мода это можно игнорировать.

Требования

  • Использовать последний OB SDK код

Решение

Откройте <code>game/shared/hl2mp/weapon_hl2mpbase.h и измените этот блок:

#ifdef GAME_DLL
	DECLARE_DATADESC();
	void Materialize( void );
	virtual	int	ObjectCaps( void );
#endif

such that it becomes:

#ifdef GAME_DLL
	DECLARE_DATADESC();
	void Materialize( void );
	virtual	int	ObjectCaps( void );
	virtual void	FallThink( void );						// make the weapon fall to the ground after spawning
#endif

Теперь измените game/shared/hl2mp/weapon_hl2mpbase.cpp в функции CWeaponHL2MPBase::FallInit( void ):

	SetThink(&CBaseCombatWeapon::FallThink);

На:

	SetThink(&CWeaponHL2MPBase::FallThink);

Добавьте вот это ниже функции CWeaponHL2MPBase::FallInit( void ):

#ifdef GAME_DLL
void CWeaponHL2MPBase::FallThink(void)
{
/*	Предотвращение общего HL2DM респауна оружия. Баг происходит
 	когда оружие спавнется, получается следующая цепочка событий:
	- Spawn () вызывается, который затем вызывает FallInit ()
	- FallInit () вызывается, и готовит функцию оружие "Think' т.е. (CBaseCombatWeapon :: FallThink ())
	- FallThink () вызывается, и выполняет несколько проверок, прежде чем решить добавлять ли оружие ()
	- Materialize () вызывается (HL2DM версии выше), который устанавливает расположение респауна оружия.
	Проблема возникает, когда оружие не устанавливается должным образом на карте.
	Если оружие не в состоянии двигаться,(например, если bounding box находится на половину внутри стены) от его местоположения, Materialize() никогда не вызовится.
	Поскольку Materialize () никогда не вызывается, респауна оружия никогда не произойдёт, поэтому, если игрок поднимает его, оружие начинает снова вечно появляться
	в координате 0 0 0 на карте (бесконечный цикл падения, ожидания, респауна, вообще не хорошо для повышения производительности и пропускной способности!) */
	if ( HasSpawnFlags( SF_NORESPAWN ) == false )
	{
		if ( GetOriginalSpawnOrigin() == vec3_origin )
		{
			m_vOriginalSpawnOrigin = GetAbsOrigin();
			m_vOriginalSpawnAngles = GetAbsAngles();
		}
	}
	return BaseClass::FallThink();
}
#endif // GAME_DLL

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

Перевод --Slam12f 20:50, 12 May 2013 (PDT)