Исправление шаблона Source 2007

From Valve Developer Community
Jump to: navigation, search
English

Это набор исправлений, повлияет только на шаблон Source 2007.

Ошибка Таблицы prediction (Прогнозирования) вход на клиентскую сторону игрока.

В Таблице prediction (прогнозирования) в game/client/sdk/c_sdk_player.cpp отсутствует запись для общих данных игрока, в результате чего некоторые значения, такие как количество выносливости, получаются неверными. ДОБАВЛЯЙТЕ ТОЛЬКО СТРОЧКУ ОБОЗНАЧЕННУЮ ПЛЮСОМ!

--- game\client\sdk\c_sdk_player.cpp	2010-03-28 17:00:41.000000000 -0600
+++ game\client\sdk\c_sdk_player.cpp	2011-07-14 19:06:20.000000000 -0600
@@ -149,12 +149,13 @@
 #if defined( SDK_USE_SPRINTING )
 	DEFINE_PRED_FIELD( m_bIsSprinting, FIELD_BOOLEAN, FTYPEDESC_INSENDTABLE ),
 #endif
 END_PREDICTION_DATA()
 
 BEGIN_PREDICTION_DATA( C_SDKPlayer )
 +	DEFINE_PRED_TYPEDESCRIPTION( m_Shared, CSDKPlayerShared ), //Добавте эту строчку
 	DEFINE_PRED_FIELD( m_flCycle, FIELD_FLOAT, FTYPEDESC_OVERRIDE | FTYPEDESC_PRIVATE | FTYPEDESC_NOERRORCHECK ),
 	DEFINE_PRED_FIELD( m_iShotsFired, FIELD_INTEGER, FTYPEDESC_INSENDTABLE ),   
 END_PREDICTION_DATA()
 
 LINK_ENTITY_TO_CLASS( player, C_SDKPlayer );

SDK спринт

Нам нужно применить новые значение в этой таблице. Изначально даже "MaxSpeed" вызывает с неверным значением. ТО ЧТО МИНУС КОМЕНТИРУЕМ(удаляем), ТО ЧТО + ДОБАВЛЯЕМ. все изменения в файле game\shared\sdk\sdk_player_shared.cpp

--- game\shared\sdk\sdk_player_shared.cpp	2010-03-28 17:00:44.000000000 -0600
+++ game\shared\sdk\sdk_player_shared.cpp	2011-07-14 18:52:55.000000000 -0600
@@ -213,13 +213,13 @@
 }
 
 bool CSDKPlayer::IsSprinting( void )
 {
 	float flVelSqr = GetAbsVelocity().LengthSqr();
 
-	return m_Shared.m_bIsSprinting && ( flVelSqr > 0.5f );
+	return m_Shared.IsSprinting() && ( flVelSqr > 0.5f );
 }
 #endif // SDK_USE_SPRINTING
 
 bool CSDKPlayer::CanAttack( void )
 {
 #if defined ( SDK_USE_SPRINTING )
@@ -424,24 +424,20 @@
 
 #endif
 
 #if defined ( SDK_USE_SPRINTING )
 void CSDKPlayerShared::SetSprinting( bool bSprinting )
 {
-	if ( bSprinting && !m_bIsSprinting )
+	if ( bSprinting && !IsSprinting())
 	{
 		StartSprinting();
 
-		// only one penalty per key press
-		if ( m_bGaveSprintPenalty == false )
-		{
-			m_flStamina -= INITIAL_SPRINT_STAMINA_PENALTY;
-			m_bGaveSprintPenalty = true;
-		}
+		// always apply this penalty as we're predicting m_bSprinting
+		m_flStamina -= INITIAL_SPRINT_STAMINA_PENALTY;
 	}
-	else if ( !bSprinting && m_bIsSprinting )
+	else if ( !bSprinting && IsSprinting() )
 	{
 		StopSprinting();
 	}
 }
 
 // this is reset when we let go of the sprint key
@@ -568,13 +564,13 @@
 {
 #if !defined ( SDK_USE_PLAYERCLASSES )
 	m_Shared.m_flRunSpeed = SDK_DEFAULT_PLAYER_RUNSPEED;
 	m_Shared.m_flSprintSpeed = SDK_DEFAULT_PLAYER_SPRINTSPEED;
 	m_Shared.m_flProneSpeed = SDK_DEFAULT_PLAYER_PRONESPEED;
 	// Set the absolute max to sprint speed
-	SetMaxSpeed( m_Shared.m_flSprintSpeed ); 
+	SetMaxSpeed( m_Shared.m_flRunSpeed ); 
 	return;
 #endif
 #if defined ( SDK_USE_PLAYERCLASSES )
 		int playerclass = m_Shared.PlayerClass();
 
 		//Tony; error checkings.

Зависание игры, вместо закрытия

Note: Не работает с исходниками эпизодов. ( читайте пост Fuzz ) Fuzz 05:40, 20 November 2012 (PST)

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

1. Откройте src/game/server/gameinterface.cpp

2. Найдите CServerGameDLL::DLLShutdown

3. В конце этой функции, добавьте строку выше вызова DisconnectTier3Libraries():

+	SteamClient()->ReleaseUser( GetHSteamPipe(), GetHSteamUser() );
+	SteamClient()->BReleaseSteamPipe( GetHSteamPipe() );

	DisconnectTier3Libraries();
	DisconnectTier2Libraries();
	ConVar_Unregister();
	DisconnectTier1Libraries();

Исправление CSDKPlayer::OnTakeDamage()

Исправление логической ошибки, которая мешает вам получать повреждения от падения и т.п., если не используются команды. ГДЕ МИНУС УДАЛЯЕМ СТРОКУ, ГДЕ ПЛЮС ПИШЕМ СТРОКУ. Все изменения в файле game\server\sdk\sdk_player.cpp

--- game\server\sdk\sdk_player.cpp	2012-09-22 23:20:43.000000000 +0900
+++ game\server\sdk\sdk_player.cpp	2012-09-22 23:22:00.000000000 +0900
@@ -574,19 +574,21 @@
 		return 0;
 
 	float flArmorBonus = 0.5f;
 	float flArmorRatio = 0.5f;
 	float flDamage = info.GetDamage();
 
+	//Tony; re-work this so if you're not dealing with teams at all, you can still be hurt by the world.
+	//and that it always runs through here if friendly fire is off.
 	bool bCheckFriendlyFire = false;
 	bool bFriendlyFire = friendlyfire.GetBool();
 	//Tony; only check teams in teamplay
-	if ( gpGlobals->teamplay )
+	if ( gpGlobals->teamplay && bFriendlyFire )
 		bCheckFriendlyFire = true;
 
-	if ( bFriendlyFire || ( bCheckFriendlyFire && pInflictor->GetTeamNumber() != GetTeamNumber() ) || pInflictor == this ||	info.GetAttacker() == this )
+	if ( !bCheckFriendlyFire || ( bCheckFriendlyFire && pInflictor->GetTeamNumber() != GetTeamNumber() ) || pInflictor == this || info.GetAttacker() == this )
 	{
 		if ( bFriendlyFire && (info.GetDamageType() & DMG_BLAST) == 0 )
 		{
 			if ( pInflictor->GetTeamNumber() == GetTeamNumber() && bCheckFriendlyFire)
 			{
 				flDamage *= 0.35; // bullets hurt teammates less

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