📄 clientutilities.cpp
字号:
// ----------------------------------------------------------------------- //
//
// MODULE : ClientUtilities.cpp
//
// PURPOSE : Utility functions
//
// CREATED : 9/25/97
//
// ----------------------------------------------------------------------- //
#include <stdlib.h>
#include <stdio.h>
#include <stdarg.h>
#include "ClientUtilities.h"
#include "BloodClientShell.h"
// Stolen from gamework.h...
int GetRandom()
{
return(rand());
}
int GetRandom(int range)
{
if (range == -1) // check for divide-by-zero case
{
return((rand() % 2) - 1);
}
return(rand() % (range + 1));
}
int GetRandom(int lo, int hi)
{
if ((hi - lo + 1) == 0) // check for divide-by-zero case
{
if (rand() & 1) return(lo);
else return(hi);
}
return((rand() % (hi - lo + 1)) + lo);
}
float GetRandom(float min, float max)
{
float randNum = (float)rand() / RAND_MAX;
float num = min + (max - min) * randNum;
return num;
}
// ----------------------------------------------------------------------- //
//
// ROUTINE: PrintError()
//
// PURPOSE: Display an error to the end-user
//
// ----------------------------------------------------------------------- //
void PrintError(char* pError, ...)
{
if (!g_pClientDE) return;
va_list marker;
char msg[500];
va_start(marker, pError);
vsprintf(msg, pError, marker);
va_end(marker);
CBloodClientShell *pShell = (CBloodClientShell*)g_pClientDE->GetClientShell();
if (pShell) return;
pShell->CSPrint (msg);
}
//-------------------------------------------------------------------------------------------
// PlaySoundFromObject
//
// Plays sound attached to object.
// Arguments:
// hObject - Handle to object
// pSoundName - path of sound file.
// fRadius - max radius of sound.
// bLoop - Loop the sound (default: false)
// bHandle - Return handle to sound (default: false)
// bTime - Have server keep track of time (default: false)
// Return:
// Handle to sound, if bHandle was set to TRUE.
//-------------------------------------------------------------------------------------------
HSOUNDDE PlaySoundFromObject(HOBJECT hObject, char *pSoundName, DFLOAT fRadius,
DBYTE nSoundPriority, DBOOL bLoop, DBOOL bHandle, DBOOL bTime, DBYTE nVolume )
{
CBloodClientShell *pShell = (CBloodClientShell*)g_pClientDE->GetClientShell();
if (!pShell || !pShell->GetClientDE()) return DNULL;
PlaySoundInfo playSoundInfo;
PLAYSOUNDINFO_INIT( playSoundInfo );
playSoundInfo.m_dwFlags = PLAYSOUND_3D | PLAYSOUND_ATTACHED | PLAYSOUND_REVERB;
if ( bLoop )
playSoundInfo.m_dwFlags |= PLAYSOUND_LOOP;
if ( bHandle )
playSoundInfo.m_dwFlags |= PLAYSOUND_GETHANDLE;
if ( bTime )
playSoundInfo.m_dwFlags |= PLAYSOUND_TIME;
if ( nVolume < 100 )
playSoundInfo.m_dwFlags |= PLAYSOUND_CTRL_VOL;
_mbsncpy((unsigned char*)playSoundInfo.m_szSoundName, (const unsigned char*)pSoundName, _MAX_PATH );
// TEMP - NOT SURE HOW TO SET OBJECT!!!!
// playSoundInfo.m_hObject = hObject;
playSoundInfo.m_nPriority = nSoundPriority;
playSoundInfo.m_fOuterRadius = fRadius;
playSoundInfo.m_fInnerRadius = fRadius * 0.1f;
playSoundInfo.m_nVolume = nVolume;
pShell->GetClientDE()->PlaySound( &playSoundInfo );
return playSoundInfo.m_hSound;
}
//-------------------------------------------------------------------------------------------
// PlaySoundFromPos
//
// Plays sound at a position
// Arguments:
// vPos - position of sound
// pSoundName - path of sound file.
// fRadius - max radius of sound.
// bLoop - Loop the sound (default: false)
// bHandle - Return handle to sound (default: false)
// bTime - Have server keep track of time (default: false)
// Return:
// Handle to sound, if bHandle was set to TRUE.
//-------------------------------------------------------------------------------------------
HSOUNDDE PlaySoundFromPos(DVector *vPos, char *pSoundName, DFLOAT fRadius,
DBYTE nSoundPriority, DBOOL bLoop, DBOOL bHandle, DBOOL bTime, DBYTE nVolume )
{
CBloodClientShell *pShell = (CBloodClientShell*)g_pClientDE->GetClientShell();
if (!pShell || !pShell->GetClientDE()) return DNULL;
PlaySoundInfo playSoundInfo;
PLAYSOUNDINFO_INIT( playSoundInfo );
playSoundInfo.m_dwFlags = PLAYSOUND_3D | PLAYSOUND_REVERB;
if ( bLoop )
playSoundInfo.m_dwFlags |= PLAYSOUND_LOOP;
if ( bHandle )
playSoundInfo.m_dwFlags |= PLAYSOUND_GETHANDLE;
if ( bTime )
playSoundInfo.m_dwFlags |= PLAYSOUND_TIME;
if ( nVolume < 100 )
playSoundInfo.m_dwFlags |= PLAYSOUND_CTRL_VOL;
_mbsncpy((unsigned char*)playSoundInfo.m_szSoundName, (const unsigned char*)pSoundName, _MAX_PATH );
VEC_COPY( playSoundInfo.m_vPosition, *vPos );
playSoundInfo.m_nPriority = nSoundPriority;
playSoundInfo.m_fOuterRadius = fRadius;
playSoundInfo.m_fInnerRadius = fRadius * 0.1f;
playSoundInfo.m_nVolume = nVolume;
pShell->GetClientDE()->PlaySound( &playSoundInfo );
return playSoundInfo.m_hSound;
}
//-------------------------------------------------------------------------------------------
// PlaySoundLocal
//
// Plays a local sound
// Arguments:
// pSoundName - path of sound file.
// nSoundPriority - priority
// bLoop - Loop the sound
// bHandle - Return handle to sound
// bTime - Have server keep track of time
// bStream - use file streaming
// nVolume - volume to play the sound (0-100)
// Return:
// Handle to sound, if bHandle was set to TRUE.
//-------------------------------------------------------------------------------------------
HSOUNDDE PlaySoundLocal(char *pSoundName, BYTE nSoundPriority, DBOOL bLoop, DBOOL bHandle,
DBOOL bTime, DBOOL bStream, DBYTE nVolume)
{
CBloodClientShell *pShell = (CBloodClientShell*)g_pClientDE->GetClientShell();
if (!pShell || !pShell->GetClientDE()) return DNULL;
PlaySoundInfo playSoundInfo;
PLAYSOUNDINFO_INIT( playSoundInfo );
playSoundInfo.m_dwFlags = PLAYSOUND_LOCAL;
if ( bLoop )
playSoundInfo.m_dwFlags |= PLAYSOUND_LOOP;
if ( bHandle )
playSoundInfo.m_dwFlags |= PLAYSOUND_GETHANDLE;
if ( bTime )
playSoundInfo.m_dwFlags |= PLAYSOUND_TIME;
if ( bStream )
playSoundInfo.m_dwFlags |= PLAYSOUND_FILESTREAM;
if ( nVolume < 100 )
playSoundInfo.m_dwFlags |= PLAYSOUND_CTRL_VOL;
_mbsncpy((unsigned char*)playSoundInfo.m_szSoundName, (const unsigned char*)pSoundName, _MAX_PATH );
playSoundInfo.m_nPriority = nSoundPriority;
playSoundInfo.m_nVolume = nVolume;
pShell->GetClientDE()->PlaySound( &playSoundInfo );
return playSoundInfo.m_hSound;
}
// ----------------------------------------------------------------------- //
//
// ROUTINE: GetSurfaceType
//
// PURPOSE: Determines the surface type of an object
//
// ----------------------------------------------------------------------- //
SurfaceType GetSurfaceType(HOBJECT hObject, HPOLY hPoly)
{
if (!g_pClientDE) return SURFTYPE_UNKNOWN;
SurfaceType eType = SURFTYPE_UNKNOWN;
// First see if we hit the world
DDWORD dwFlags;
if (hPoly && g_pClientDE->GetPolyTextureFlags(hPoly, &dwFlags) == DE_OK)
{
eType = (SurfaceType)dwFlags;
}
// Now check for object types
if (eType == SURFTYPE_UNKNOWN)
{
DDWORD dwFlags;
g_pClientDE->GetObjectUserFlags(hObject, &dwFlags);
// Upper byte of UserFlags should be a surface type
eType = (SurfaceType)( dwFlags >> 24);
}
return eType;
}
// ----------------------------------------------------------------------- //
//
// ROUTINE: TiltVectorToPlane
//
// PURPOSE: Tilts a vector so that it is perpendicular to a plane's normal.
//
// ----------------------------------------------------------------------- //
void TiltVectorToPlane(DVector *pVec, DVector *pNormal)
{
DVector q, slope;
// Get slope along vector...
VEC_CROSS(q, *pNormal, *pVec);
if(VEC_MAGSQR(q) > 0.001f)
{
VEC_NORM(q);
VEC_CROSS(slope, q, *pNormal);
// Fix vector along slope...
VEC_MULSCALAR(*pVec, slope, VEC_MAG(*pVec));
}
}
// ----------------------------------------------------------------------- //
//
// ROUTINE: ObjListFilterFn()
//
// PURPOSE: Filter specific objects out of CastRay and/or
// IntersectSegment calls.
//
// ----------------------------------------------------------------------- //
DBOOL ObjListFilterFn(HLOCALOBJ hTest, void *pUserData)
{
HOBJECT *hList;
// Filters out objects for a raycast. pUserData is a list of HOBJECTS terminated
// with a NULL HOBJECT.
hList = (HOBJECT*)pUserData;
while(*hList)
{
if(hTest == *hList)
return DFALSE;
++hList;
}
return DTRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -