Исправление респавна Оружия
Введение
Когда оружие неправильно установлен на карте (т.е. когда "bounding box" оружия пересекается с entities (ентями) или геометрией уровня), то они будут появляться в неправильной месте на карте, после того, как их подобрал игрок. В большинстве случаев оружие будет появляться в координате 0 0 0 </ код> на карте, и дальше будет продолжаться вечный цикл падения, ожидая, сначала респавн и снова падения. К счастью, решение этой чрезвычайно распространенной ошибки является очень простым.
Примечание:Этот баг распространён только в модах базирующихся на HL2DM SDK коде, для синг мода это можно игнорировать.
Требования
- Использовать последний OB SDK код
Решение
Откройте 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)