📄 bloodclientshell.cpp
字号:
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 + -