⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bloodclientshell.cpp

📁 Blood 2全套源码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
						b2cFile.dwSpeed		= 3;
						b2cFile.dwResist	= 3;
						b2cFile.dwFocus		= 1;
						b2cFile.dwWeap1		= 1;
						b2cFile.dwWeap2		= 2;
						b2cFile.dwWeap3		= 3;
						b2cFile.dwWeap4		= 4;
						b2cFile.dwWeap5		= 5;
						b2cFile.dwWeap6		= 6;
						b2cFile.dwWeap7		= 7;
						b2cFile.dwWeap8		= 8;
						b2cFile.dwWeap9		= 9;
					}

					m_Config.nCharacter = (DBYTE)b2cFile.dwCharacter;
					m_Config.nSkin = (DBYTE)b2cFile.dwColor;
					m_Config.nStrength = (DBYTE)b2cFile.dwStrength;
					m_Config.nSpeed = (DBYTE)b2cFile.dwSpeed;
					m_Config.nResistance = (DBYTE)b2cFile.dwResist;
					m_Config.nMagic = (DBYTE)b2cFile.dwFocus;
					m_Config.nWeaponSlots[1] = (DBYTE)b2cFile.dwWeap1;
					m_Config.nWeaponSlots[2] = (DBYTE)b2cFile.dwWeap2;
					m_Config.nWeaponSlots[3] = (DBYTE)b2cFile.dwWeap3;
					m_Config.nWeaponSlots[4] = (DBYTE)b2cFile.dwWeap4;
					m_Config.nWeaponSlots[5] = (DBYTE)b2cFile.dwWeap5;
					m_Config.nWeaponSlots[6] = (DBYTE)b2cFile.dwWeap6;
					m_Config.nWeaponSlots[7] = (DBYTE)b2cFile.dwWeap7;
					m_Config.nWeaponSlots[8] = (DBYTE)b2cFile.dwWeap8;
					m_Config.nWeaponSlots[9] = (DBYTE)b2cFile.dwWeap9;
				}
				else
				{
					// first gun is the beretta
					m_Config.nWeaponSlots[1] = WEAP_BERETTA;
					m_Config.nWeaponSlots[2] = WEAP_NONE;
					m_Config.nWeaponSlots[3] = WEAP_NONE;
					m_Config.nWeaponSlots[4] = WEAP_NONE;
					m_Config.nWeaponSlots[5] = WEAP_NONE;
					m_Config.nWeaponSlots[6] = WEAP_NONE;
					m_Config.nWeaponSlots[7] = WEAP_NONE;
					m_Config.nWeaponSlots[8] = WEAP_NONE;
					m_Config.nWeaponSlots[9] = WEAP_NONE;
					hstrName = pClientDE->CreateString(m_Config.szName);
				}
				if (!hstrName) return;

				pClientDE->WriteToMessageHString(hMsg, hstrName);
				pClientDE->FreeString(hstrName);
				pClientDE->WriteToMessageByte(hMsg, m_Config.nCharacter);
				pClientDE->WriteToMessageByte(hMsg, m_Config.nSkin);
				pClientDE->WriteToMessageByte(hMsg, m_Config.nStrength);
				pClientDE->WriteToMessageByte(hMsg, m_Config.nSpeed);
				pClientDE->WriteToMessageByte(hMsg, m_Config.nResistance);
				pClientDE->WriteToMessageByte(hMsg, m_Config.nMagic);

//				for(i = 0; i < 3; i++)
//					pClientDE->WriteToMessageByte(hMsg, m_Config.nBindingSlots[i]);
				for (i=1;i<SLOTCOUNT_WEAPONS;i++)	// Skip slot 0, it's melee
					pClientDE->WriteToMessageByte(hMsg, m_Config.nWeaponSlots[i]);
/*				for (i=0;i<INV_LASTINVITEM;i++)
					pClientDE->WriteToMessageByte(hMsg, m_Config.nItemSlots[i]);
				pClientDE->WriteToMessageByte(hMsg, m_Config.nProximityBombs);
				pClientDE->WriteToMessageByte(hMsg, m_Config.nRemoteBombs);
				pClientDE->WriteToMessageByte(hMsg, m_Config.nTimeBombs);
//				for (i=0;i<6;i++)
//					pClientDE->WriteToMessageByte(hMsg, m_Config.nSpellSlots[i]);
*/
			}
			break;
	}

	// Finish it off..
	pClientDE->EndMessage(hMsg);
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CBloodClientShell::UpdateSoundReverb
//
//	PURPOSE:	Update the reverb info
//
// ----------------------------------------------------------------------- //
void CBloodClientShell::UpdateSoundReverb( )
{
	DVector vPlayerDims;
	ClientIntersectInfo info;
	ClientIntersectQuery query;
	DVector vPos[6], vSegs[6];
	int i;
	float fVolume, fReverbLevel;
	DBOOL bOpen;
	HLOCALOBJ hPlayerObj;
	ReverbProperties reverbProperties;
	HCONSOLEVAR hVar;

	if( !m_bUseReverb )
		return;

	hPlayerObj = g_pClientDE->GetClientObject();
	if( !hPlayerObj )
		return;

	hVar = g_pClientDE->GetConsoleVar( "ReverbLevel" );
	if( hVar )
	{
		fReverbLevel = g_pClientDE->GetVarValueFloat( hVar );
	}
	else
		fReverbLevel = 1.0f;

	// Check if reverb was off and is still off
	if( fReverbLevel < 0.001f && m_fReverbLevel < 0.001f )
		return;

	m_fReverbLevel = fReverbLevel;

	// Check if it's time yet
	if( g_pClientDE->GetTime( ) < m_fNextSoundReverbTime )
		return;

	// Update timer
	m_fNextSoundReverbTime = g_pClientDE->GetTime( ) + SOUND_REVERB_UPDATE_PERIOD;

	HOBJECT hFilterList[] = {hPlayerObj, m_pMoveMgr->GetObject(), DNULL};

	memset( &query, 0, sizeof( query ));
	query.m_Flags = INTERSECT_OBJECTS | IGNORE_NONSOLID;
	query.m_FilterFn = ObjListFilterFn;
	query.m_pUserData = hFilterList;

	g_pClientDE->GetObjectPos( hPlayerObj, &query.m_From );
	g_pClientDE->Physics( )->GetObjectDims( hPlayerObj, &vPlayerDims );

	// Player must move at least 2x his dims mag before reverb is checked again.
	if( VEC_DISTSQR( query.m_From, m_vLastReverbPos ) < 4 * VEC_MAGSQR( vPlayerDims ))
		return;

	VEC_COPY( m_vLastReverbPos, query.m_From );

	VEC_SET( vSegs[0], query.m_From.x + 2000.0f,	query.m_From.y,				query.m_From.z );
	VEC_SET( vSegs[1], query.m_From.x - 2000.0f,	query.m_From.y,				query.m_From.z );
	VEC_SET( vSegs[2], query.m_From.x,				query.m_From.y + 2000.0f,	query.m_From.z );
	VEC_SET( vSegs[3], query.m_From.x,				query.m_From.y - 2000.0f,	query.m_From.z );
	VEC_SET( vSegs[4], query.m_From.x,				query.m_From.y,				query.m_From.z + 2000.0f );
	VEC_SET( vSegs[5], query.m_From.x,				query.m_From.y,				query.m_From.z - 2000.0f );

	bOpen = DFALSE;
	for( i = 0; i < 6; i++ )
	{
		VEC_COPY( query.m_To, vSegs[i] );

		if( g_pClientDE->IntersectSegment( &query, &info ))
		{
			VEC_COPY( vPos[i], info.m_Point );
			if( info.m_SurfaceFlags == SURFTYPE_SKY )
			{
				bOpen = DTRUE;
			}
		}
		else
		{
			VEC_COPY( vPos[i], vSegs[i] );
			bOpen = DTRUE;
		}
	}

	fVolume = VEC_DIST( vPos[0], vPos[1] );
	fVolume *= VEC_DIST( vPos[2], vPos[3] );
	fVolume *= VEC_DIST( vPos[4], vPos[5] );

	// Use room types that are not completely enclosed rooms
	if( bOpen )
	{
		if( fVolume < 100.0f*100.0f*100.0f )
		{
			reverbProperties.m_dwAcoustics = REVERB_ACOUSTICS_SEWERPIPE;
			reverbProperties.m_fReflectTime		= 0.005f;
			reverbProperties.m_fDecayTime		= 1.493f;
			reverbProperties.m_fVolume			= 0.1f * m_fReverbLevel;
		}
		else if( fVolume < 500.0f*500.0f*500.0f )
		{
			reverbProperties.m_dwAcoustics = REVERB_ACOUSTICS_PLAIN;
			reverbProperties.m_fReflectTime		= 0.005f;
			reverbProperties.m_fDecayTime		= 1.493f;
			reverbProperties.m_fVolume			= 0.2f * m_fReverbLevel;
		}
		else if( fVolume < 1000.0f*1000.0f*1000.0f )
		{
			reverbProperties.m_dwAcoustics = REVERB_ACOUSTICS_ARENA;
			reverbProperties.m_fReflectTime		= 0.01f;
			reverbProperties.m_fDecayTime		= 4.236f;
			reverbProperties.m_fVolume			= 0.1f * m_fReverbLevel;
		}
		else
		{
			reverbProperties.m_dwAcoustics = REVERB_ACOUSTICS_MOUNTAINS;
			reverbProperties.m_fReflectTime		= 0.0f;
			reverbProperties.m_fDecayTime		= 3.0f;
			reverbProperties.m_fVolume			= 0.1f * m_fReverbLevel;
		}
	} 
	// Use room types that are enclosed rooms
	else
	{
		if( fVolume < 100.0f*100.0f*100.0f )
		{
			reverbProperties.m_dwAcoustics = REVERB_ACOUSTICS_STONEROOM;
			reverbProperties.m_fReflectTime		= 0.005f;
			reverbProperties.m_fDecayTime		= 0.6f;
			reverbProperties.m_fVolume			= 0.3f * m_fReverbLevel;
		}
		else if( fVolume < 500.0f*500.0f*500.0f )
		{
			reverbProperties.m_dwAcoustics = REVERB_ACOUSTICS_HALLWAY;
			reverbProperties.m_fReflectTime		= 0.01f;
			reverbProperties.m_fDecayTime		= 1.3f;
			reverbProperties.m_fVolume			= 0.1f * m_fReverbLevel;
		}
		else if( fVolume < 1500.0f*1500.0f*1500.0f )
		{
			reverbProperties.m_dwAcoustics = REVERB_ACOUSTICS_CONCERTHALL;
			reverbProperties.m_fReflectTime		= 0.02f;
			reverbProperties.m_fDecayTime		= 2.2f;
			reverbProperties.m_fVolume			= 0.1f * m_fReverbLevel;
		}
		else
		{
			reverbProperties.m_dwAcoustics = REVERB_ACOUSTICS_AUDITORIUM;
			reverbProperties.m_fReflectTime		= 0.02f;
			reverbProperties.m_fDecayTime		= 3.5f;
			reverbProperties.m_fVolume			= 0.1f * m_fReverbLevel;
		}
	}

	// Override to water if in it.
	if( IsLiquid( m_eCurContainerCode ))
		reverbProperties.m_dwAcoustics = REVERB_ACOUSTICS_UNDERWATER;

	reverbProperties.m_dwParams = REVERBPARAM_VOLUME | REVERBPARAM_ACOUSTICS | REVERBPARAM_REFLECTTIME | REVERBPARAM_DECAYTIME;
	g_pClientDE->SetReverbProperties( &reverbProperties );

}


// --------------------------------------------------------------------------- //
//
//	ROUTINE:	CBloodClientShell::UpdateCamera()
//
//	PURPOSE:	Updates the camera position and status
//
// --------------------------------------------------------------------------- //
void CBloodClientShell::UpdateCamera()
{
	CClientDE* pClientDE = GetClientDE();
	if (!pClientDE) return;

	HLOCALOBJ hPlayerObj = pClientDE->GetClientObject();
	if (!hPlayerObj || !m_hCamera) return;

	if (!m_bHandledStartup)
	{
		m_bRenderCamera = DTRUE;
//		pClientDE->SetCameraZOrder(m_hCamera, 0);  // Okay, we can render now
		m_bHandledStartup = DTRUE;
	}

	// Update the player camera...

	if (!UpdatePlayerCamera()) return;


	m_pExternalCamera = DNULL;

	// See if we should use a cutscene camera...

	if (!m_hSeeingEyeObj && !m_hOrbObj)
	{
		CSpecialFXList* pCameraList = m_sfxMgr.GetCameraFXList();
		if (pCameraList)
		{
			int nNumCameras = pCameraList->GetNumItems();

			for (int i=0; i < nNumCameras; i++)
			{
				CCameraFX* pCameraFX = (CCameraFX*)(*pCameraList)[i];
				if (!pCameraFX) continue;

				if ( HOBJECT hObj = pCameraFX->GetServerObj() )
				{
					DDWORD dwUsrFlags;
					pClientDE->GetObjectUserFlags(hObj, &dwUsrFlags);
					
					// USRFLG_VISIBLE means the camera is active
					if (dwUsrFlags & USRFLG_VISIBLE)
					{
						m_pExternalCamera = pCameraFX;
						break;
					}
				}
			}
		}
	}

	if ((m_pExternalCamera && !m_pExternalCamera->GetHidePlayer()) || m_hSeeingEyeObj || m_hOrbObj)
	{
		ShowPlayer(DTRUE);
	}
	else
	{
		if (m_bDead && m_bDeadNoHide)
		{
			ShowPlayer(TRUE);
		}
		else
		{
			ShowPlayer((m_bDead) ? DFALSE : !m_playerCamera.IsFirstPerson());
		}
	}

	CalculateCameraRotation();
	UpdateCameraPosition();
	UpdateCameraRotation();

	// Adjust camera for current resolution
	SetCameraStuff(hPlayerObj, m_hCamera);
}



// --------------------------------------------------------------------------- //
//
//	ROUTINE:	CBloodClientShell::FirstUpdate()
//
//	PURPOSE:	Special stuff to do on the first update after entering a world.
//
// --------------------------------------------------------------------------- //
void CBloodClientShell::FirstUpdate()
{
	CClientDE* pClientDE = GetClientDE();
	if (!pClientDE) return;

	char buf[100];
	char *pStrParam;

	ShowPlayer(m_b3rdPerson ? DTRUE : DFALSE);

	// Check for add-on special case stuff...

#ifdef _ADDON
	if (g_bPlayerInvReset)
	{
		ResetPlayerInventory();
		g_bPlayerInvReset = DFALSE;
	}
#endif
	
	// Display the world name if any
//	if (pStrParam = pClientDE->GetServerConVarValueString("WorldName"))
//	{
//		CSPrint("Entering %s", pStrParam);
//	}

	// Set the FarZ setting for the world...
	DFLOAT fVal = pClientDE->GetServerConVarValueFloat("FarZ");

	if (fVal > 0.0f)
	{
		sprintf(buf, "FarZ %d", (int)fVal);
		pClientDE->RunConsoleString(buf);
	}

	ResetGlobalFog();

	// Set up the environment map texture...

	pStrParam = pClientDE->GetServerConVarValueString("EnvironmentMap");
	if (pStrParam && (m_nGlobalDetail == DETAIL_HIGH))
	{
		sprintf(buf, "EnvMap %s", pStrParam);
		pClientDE->RunConsoleString(buf);
		pClientDE->RunConsoleString("EnvMapEnable 1");
	}
	else
	{
		pClientDE->RunConsoleString("EnvMapEnable 0");
	}

	pClientDE->RunConsoleString("ModelWarble 0");
	pClientDE->RunConsoleString("WarbleSpeed 15");
	pClientDE->RunConsoleString("WarbleScale .95");

	// Sky panning...

	m_bPanSky = (DBOOL) pClientDE->GetServerConVarValueFloat("PanSky");
	m_fPanSkyOffsetX = pClientDE->GetServerConVarValueFloat("PanSkyOffsetX");
	m_fPanSkyOffsetZ = pClientDE->GetServerConVarValueFloat("PanSkyOffsetZ");
	m_fPanSkyScaleX = pClientDE->GetServerConVarValueFloat("PanSkyScaleX");
	m_fPanSkyScaleZ = pClientDE->GetServerConVarValueFloat("PanSkyScaleZ");
	pStrParam  = pClientDE->GetServerConVarValueString("PanSkyTexture");

	if (m_bPanSky)
	{
		pClientDE->SetGlobalPanTexture(GLOBALPAN_SKYSHADOW, pStrParam);
	}

	// Initialize the music playlists...

	if ( m_Music.IsInitialized( ) )
	{
//		CMusic::EMusicLevel level;
//		level = m_Music.GetMusicLevel( );
/*		m_Music.TermPlayLists();
		m_Music.InitPlayLists( );
		if ( !m_Music.UsingIMA( ))
			m_Music.PlayCDList( );
		else
			m_Music.PlayMusicLevel( m_eMusicLevel );
*/
	}

	// Set up the soft renderer sky map...

	char* pSoftSky = pClientDE->GetServerConVarValueString("SoftSky");
	if (pSoftSky)
	{
		sprintf(buf, "SoftSky %s", pSoftSky);
		pClientDE->RunConsoleString(buf);
	}

	// Send initial update message
	SendPlayerUpdateMessage(DTRUE);

	m_bFirstUpdate = DFALSE;
}


// --------------------------------------------------------------------------- //
//
//	ROUTINE:	CBloodClientShell::ResetGlobalFog
//
//	PURPOSE:	Reset the global fog value...
//
// --------------------------------------------------------------------------- //

void CBloodClientShell::ResetGlobalFog()
{
	CClientDE* pClientDE = GetClientDE();
	if (!pClientDE) return;

	DFLOAT fVal = pClientDE->GetServerConVarValueFloat("FogEnable");
	
	char buf[30];
	sprintf(buf, "FogEnable %d", (int)fVal);
	pClientDE->RunConsoleString(buf);
	if (fVal)
	{
		fVal = pClientDE->GetServerConVarValueFloat("FogNearZ");
		sprintf(buf, "FogNearZ %d", (int)fVal);
		pClientDE->RunConsoleString(buf);

		fVal = pClientDE->GetServerConVarValueFloat("FogFarZ");
		sprintf(buf, "FogFarZ %d", (int)fVal);
		pClientDE->RunConsoleString(buf);

		fVal = pClientDE->GetServerConVarValueFloat("FogR");
		sprintf(buf, "FogR %d", (int)fVal);
		pClientDE->RunConsoleString(buf);

		fVal = pClientDE->GetServerConVarValueFloat("FogG");
		sprintf(buf, "FogG %d", (int)fVal);
		pClientDE->RunConsoleString(buf);

		fVal = pClientDE->GetServerConVarValueFloat("FogB");
		sprintf(buf, "FogB %d", (int)fVal);
		pClientDE->RunConsoleString(buf);
	}

	// ModelAdd
	DFLOAT fR, fG, fB;
	fR = pClientDE->GetServerConVarValueFloat("ModelAddR");
	fG = pClientDE->GetServerConVarValueFloat("ModelAddG");
	fB = pClientDE->GetServerConVarValueFloat("ModelAddB");
	sprintf(buf, "ModelAdd %d %d %d", (int)fR, (int)fG, (int)fB);
	pClientDE->RunConsoleString(buf);

	// ModelDirAdd
	fR = pClientDE->GetServerConVarValueFloat("ModelDirAddR");
	fG = pClientDE->GetServerConVarValueFloat("ModelDirAddG");
	fB = pClientDE->GetServerConVarV

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -