...
 
Commits (4)
......@@ -59,6 +59,7 @@ Bugfixed version of rehlds contains an additional cvars:
<li>sv_rehlds_userinfo_transmitted_fields // Userinfo fields only with these keys will be transmitted to clients via network. If not set then all fields will be transmitted (except prefixed with underscore). Each key must be prefixed by backslash, for example "\name\model\*sid\*hltv\bottomcolor\topcolor". See [wiki](https://github.com/dreamstalker/rehlds/wiki/Userinfo-keys) to collect sufficient set of keys for your server. Default: ""
<li>sv_rehlds_attachedentities_playeranimationspeed_fix // Fixes bug with gait animation speed increase when player has some attached entities (aiments). Can cause animation lags when cl_updaterate is low. Default: 0
<li>sv_rehlds_maxclients_from_single_ip // Limit number of connections from the single ip address. Default: 5
<li>sv_use_entity_file // Use custom entity file for a map. Path to an entity file will be "maps/[map name].ent". Default: 0
</ul>
## Commands
......
majorVersion=3
minorVersion=4
minorVersion=6
maintenanceVersion=0
......@@ -83,7 +83,7 @@ task publishPrepareFiles {
copy {
from 'rehlds/public'
into 'publish/publishRoot/hlsdk/public'
exclude '**/rehlds/*', '**/tier0/*'
exclude '**/rehlds/*'
}
copy {
from 'rehlds/public/rehlds'
......
......@@ -531,10 +531,8 @@ void MSG_WriteBits(uint32 data, int numbits)
#endif //defined(REHLDS_FIXES)
NOXREF qboolean MSG_IsBitWriting(void)
qboolean MSG_IsBitWriting(void)
{
NOXREFCHECK;
return bfwrite.pbuf != 0;
}
......@@ -622,10 +620,8 @@ int MSG_CurrentBit(void)
return nbits;
}
NOXREF qboolean MSG_IsBitReading(void)
qboolean MSG_IsBitReading(void)
{
NOXREFCHECK;
return bfread.pbuf != 0;
}
......@@ -758,10 +754,8 @@ uint32 MSG_ReadBits(int numbits)
return result;
}
NOXREF uint32 MSG_PeekBits(int numbits)
uint32 MSG_PeekBits(int numbits)
{
NOXREFCHECK;
bf_read_t savebf = bfread;
uint32 r = MSG_ReadBits(numbits);
bfread = savebf;
......@@ -782,10 +776,8 @@ int MSG_ReadSBits(int numbits)
return result;
}
NOXREF char *MSG_ReadBitString(void)
char *MSG_ReadBitString(void)
{
NOXREFCHECK;
static char buf[8192];
char *p = &buf[0];
......@@ -825,10 +817,8 @@ int MSG_ReadBitData(void *dest, int length)
return length;
}
NOXREF float MSG_ReadBitCoord(void)
float MSG_ReadBitCoord(void)
{
NOXREFCHECK;
float value = 0;
int intval = MSG_ReadOneBit();
......@@ -878,10 +868,8 @@ void MSG_WriteBitCoord(const float f)
}
}
NOXREF void MSG_ReadBitVec3Coord(vec3_t fa)
void MSG_ReadBitVec3Coord(vec3_t fa)
{
NOXREFCHECK;
int xflag = MSG_ReadOneBit();
int yflag = MSG_ReadOneBit();
int zflag = MSG_ReadOneBit();
......@@ -912,10 +900,8 @@ void MSG_WriteBitVec3Coord(const vec3_t fa)
MSG_WriteBitCoord(fa[2]);
}
NOXREF float MSG_ReadCoord(void)
float MSG_ReadCoord(void)
{
NOXREFCHECK;
return (float)(MSG_ReadShort() * (1.0 / 8));
}
......@@ -924,10 +910,8 @@ void MSG_WriteCoord(sizebuf_t *sb, const float f)
MSG_WriteShort(sb, (int)(f * 8.0));
}
NOXREF void MSG_ReadVec3Coord(sizebuf_t *sb, vec3_t fa)
void MSG_ReadVec3Coord(sizebuf_t *sb, vec3_t fa)
{
NOXREFCHECK;
if (MSG_IsBitReading())
{
MSG_ReadBitVec3Coord(fa);
......@@ -940,10 +924,8 @@ NOXREF void MSG_ReadVec3Coord(sizebuf_t *sb, vec3_t fa)
}
}
NOXREF void MSG_WriteVec3Coord(sizebuf_t *sb, const vec3_t fa)
void MSG_WriteVec3Coord(sizebuf_t *sb, const vec3_t fa)
{
NOXREFCHECK;
MSG_StartBitWriting(sb);
MSG_WriteBitVec3Coord(fa);
MSG_EndBitWriting(sb);
......@@ -1047,10 +1029,8 @@ int MSG_ReadLong(void)
return c;
}
NOXREF float MSG_ReadFloat(void)
float MSG_ReadFloat(void)
{
NOXREFCHECK;
float f;
if (msg_readcount + 4 <= net_message.cursize)
......@@ -1109,10 +1089,8 @@ char *MSG_ReadStringLine(void)
return string;
}
NOXREF float MSG_ReadAngle(void)
float MSG_ReadAngle(void)
{
NOXREFCHECK;
int c = MSG_ReadChar();
#ifdef REHLDS_FIXES
if (c == -1) // FIXED: Added check for wrong value, but just return 0 instead of -1 * (360.0 / 256)
......@@ -1123,10 +1101,8 @@ NOXREF float MSG_ReadAngle(void)
return (float)(c * (360.0 / 256));
}
NOXREF float MSG_ReadHiresAngle(void)
float MSG_ReadHiresAngle(void)
{
NOXREFCHECK;
int c = MSG_ReadShort();
#ifdef REHLDS_FIXES
if (c == -1) // FIXED: Added check for wrong value, but just return 0 instead of -1 * (360.0 / 65536)
......
......@@ -117,7 +117,7 @@ void MSG_WriteUsercmd(sizebuf_t *buf, usercmd_t *to, usercmd_t *from);
void COM_BitOpsInit(void);
void MSG_WriteOneBit(int nValue);
void MSG_StartBitWriting(sizebuf_t *buf);
NOXREF qboolean MSG_IsBitWriting(void);
qboolean MSG_IsBitWriting(void);
void MSG_EndBitWriting(sizebuf_t *buf);
void MSG_WriteBits(uint32 data, int numbits);
void MSG_WriteSBits(int data, int numbits);
......@@ -126,35 +126,35 @@ void MSG_WriteBitData(void *src, int length);
void MSG_WriteBitAngle(float fAngle, int numbits);
float MSG_ReadBitAngle(int numbits);
int MSG_CurrentBit(void);
NOXREF qboolean MSG_IsBitReading(void);
qboolean MSG_IsBitReading(void);
void MSG_StartBitReading(sizebuf_t *buf);
void MSG_EndBitReading(sizebuf_t *buf);
int MSG_ReadOneBit(void);
uint32 MSG_ReadBits(int numbits);
NOXREF uint32 MSG_PeekBits(int numbits);
uint32 MSG_PeekBits(int numbits);
int MSG_ReadSBits(int numbits);
NOXREF char *MSG_ReadBitString(void);
char *MSG_ReadBitString(void);
int MSG_ReadBitData(void *dest, int length);
NOXREF float MSG_ReadBitCoord(void);
float MSG_ReadBitCoord(void);
void MSG_WriteBitCoord(const float f);
NOXREF void MSG_ReadBitVec3Coord(vec3_t fa);
void MSG_ReadBitVec3Coord(vec3_t fa);
void MSG_WriteBitVec3Coord(const vec3_t fa);
NOXREF float MSG_ReadCoord(void);
float MSG_ReadCoord(void);
void MSG_WriteCoord(sizebuf_t *sb, const float f);
NOXREF void MSG_ReadVec3Coord(sizebuf_t *sb, vec3_t fa);
NOXREF void MSG_WriteVec3Coord(sizebuf_t *sb, const vec3_t fa);
void MSG_ReadVec3Coord(sizebuf_t *sb, vec3_t fa);
void MSG_WriteVec3Coord(sizebuf_t *sb, const vec3_t fa);
void MSG_BeginReading(void);
int MSG_ReadChar(void);
int MSG_ReadByte(void);
int MSG_ReadShort(void);
NOXREF int MSG_ReadWord(void);
int MSG_ReadLong(void);
NOXREF float MSG_ReadFloat(void);
float MSG_ReadFloat(void);
int MSG_ReadBuf(int iSize, void *pbuf);
char *MSG_ReadString(void);
char *MSG_ReadStringLine(void);
NOXREF float MSG_ReadAngle(void);
NOXREF float MSG_ReadHiresAngle(void);
float MSG_ReadAngle(void);
float MSG_ReadHiresAngle(void);
void MSG_ReadUsercmd(usercmd_t *to, usercmd_t *from);
void SZ_Alloc(const char *name, sizebuf_t *buf, int startsize);
......
......@@ -203,6 +203,7 @@ cvar_t sv_rehlds_attachedentities_playeranimationspeed_fix = {"sv_rehlds_attache
cvar_t sv_rehlds_local_gametime = {"sv_rehlds_local_gametime", "0", 0, 0.0f, nullptr};
cvar_t sv_rehlds_send_mapcycle = { "sv_rehlds_send_mapcycle", "0", 0, 0.0f, nullptr };
cvar_t sv_rehlds_maxclients_from_single_ip = { "sv_rehlds_maxclients_from_single_ip", "5", 0, 5.0f, nullptr };
cvar_t sv_use_entity_file = { "sv_use_entity_file", "0", 0, 0.0f, nullptr };
#endif
delta_t *SV_LookupDelta(char *name)
......@@ -6126,6 +6127,49 @@ int SV_SpawnServer(qboolean bIsDemo, char *server, char *startspot)
void SV_LoadEntities(void)
{
#ifdef REHLDS_FIXES
if (sv_use_entity_file.value > 0.0f)
{
char name[MAX_PATH];
Q_snprintf(name, sizeof(name), "maps/%s.ent", g_psv.name);
if (!FS_FileExists(name))
{
FILE *f = FS_Open(name, "wb");
if (f)
{
FS_Write(g_psv.worldmodel->entities, Q_strlen(g_psv.worldmodel->entities), 1, f);
FS_Close(f);
}
}
else
{
FILE *f = FS_Open(name, "rb");
if (f)
{
Con_Printf("Using custom entity file: %s\n", name);
unsigned int nFileSize = FS_Size(f);
char *pszInputStream = (char *)Mem_Malloc(nFileSize + 1);
if (!pszInputStream)
{
Sys_Error("%s: Could not allocate space for entity file of %i bytes", __func__, nFileSize + 1);
}
FS_Read(pszInputStream, nFileSize, 1, f);
pszInputStream[nFileSize] = '\0';
ED_LoadFromFile(pszInputStream);
Mem_Free(pszInputStream);
FS_Close(f);
return;
}
}
Con_Printf("Using default entities...\n");
}
#endif // REHLDS_FIXES
ED_LoadFromFile(g_psv.worldmodel->entities);
}
......@@ -7863,6 +7907,7 @@ void SV_Init(void)
Cvar_RegisterVariable(&sv_rollspeed);
Cvar_RegisterVariable(&sv_rollangle);
Cvar_RegisterVariable(&sv_use_entity_file);
#endif
for (int i = 0; i < MAX_MODELS; i++)
......
......@@ -37,7 +37,7 @@
#include "pr_dlls.h"
#define REHLDS_API_VERSION_MAJOR 3
#define REHLDS_API_VERSION_MINOR 5
#define REHLDS_API_VERSION_MINOR 6
//Steam_NotifyClientConnect hook
typedef IHookChain<qboolean, IGameClient*, const void*, unsigned int> IRehldsHook_Steam_NotifyClientConnect;
......@@ -301,6 +301,55 @@ struct RehldsFuncs_t {
void(*RemoveExtDll)(void *hModule);
void(*RemoveCvarListener)(const char *var_name, cvar_callback_t func);
ENTITYINIT(*GetEntityInit)(char *pszClassName);
// Read functions
int(*MSG_ReadChar)();
int(*MSG_ReadByte)();
int(*MSG_ReadLong)();
float(*MSG_ReadFloat)();
char*(*MSG_ReadString)();
char*(*MSG_ReadStringLine)();
float(*MSG_ReadAngle)();
float(*MSG_ReadHiresAngle)();
void(*MSG_ReadUsercmd)(usercmd_t *to, usercmd_t *from);
float(*MSG_ReadCoord)();
void(*MSG_ReadVec3Coord)(sizebuf_t *sb, vec3_t fa);
// Read bit functions
bool(*MSG_IsBitReading)();
void(*MSG_StartBitReading)(sizebuf_t *buf);
void(*MSG_EndBitReading)(sizebuf_t *buf);
uint32(*MSG_PeekBits)(int numbits);
int(*MSG_ReadOneBit)();
uint32(*MSG_ReadBits)(int numbits);
int(*MSG_ReadSBits)(int numbits);
float(*MSG_ReadBitCoord)();
void(*MSG_ReadBitVec3Coord)(vec_t *fa);
float(*MSG_ReadBitAngle)(int numbits);
int(*MSG_ReadBitData)(void *dest, int length);
char*(*MSG_ReadBitString)();
int(*MSG_CurrentBit)();
// Write functions
void(*MSG_WriteLong)(sizebuf_t *sb, int c);
void(*MSG_WriteFloat)(sizebuf_t *sb, float f);
void(*MSG_WriteAngle)(sizebuf_t *sb, float f);
void(*MSG_WriteHiresAngle)(sizebuf_t *sb, float f);
void(*MSG_WriteUsercmd)(sizebuf_t *sb, usercmd_t *to, usercmd_t *from);
void(*MSG_WriteCoord)(sizebuf_t *sb, float f);
void(*MSG_WriteVec3Coord)(sizebuf_t *sb, const vec3_t fa);
// Write bit functions
bool(*MSG_IsBitWriting)();
void(*MSG_WriteOneBit)(int nValue);
void(*MSG_WriteSBits)(uint32 data, int numbits);
void(*MSG_WriteBitCoord)(float f);
void(*MSG_WriteBitAngle)(float fAngle, int numbits);
void(*MSG_WriteBitData)(void *src, int length);
void(*MSG_WriteBitString)(const char *p);
void(*SZ_Write)(sizebuf_t *buf, const void *data, int length);
void(*SZ_Print)(sizebuf_t *buf, const char *data);
void(*SZ_Clear)(sizebuf_t *buf);
};
class IRehldsApi {
......
......@@ -262,6 +262,7 @@ void CUtlMemory<T, I>::Grow(int num)
// Make sure we have at least numallocated + num allocations.
// Use the grow rules specified for this memory (in m_nGrowSize)
int nAllocationRequested = m_nAllocationCount + num;
bool needToReallocate = false;
while (m_nAllocationCount < nAllocationRequested)
{
if (m_nAllocationCount != 0)
......@@ -274,6 +275,7 @@ void CUtlMemory<T, I>::Grow(int num)
{
m_nAllocationCount += m_nAllocationCount;
}
needToReallocate = true;
}
else
{
......@@ -283,11 +285,11 @@ void CUtlMemory<T, I>::Grow(int num)
}
}
if (m_pMemory)
if (m_pMemory && needToReallocate)
{
m_pMemory = (T *)realloc(m_pMemory, m_nAllocationCount * sizeof(T));
}
else
else if (!m_pMemory)
{
m_pMemory = (T *)malloc(m_nAllocationCount * sizeof(T));
}
......
......@@ -43,10 +43,10 @@ public:
// features C++11 ranged based for
T *begin() { return &m_Memory[0]; }
T *end() { return &m_Memory[m_Size - 1]; }
T *end() { return &m_Memory[m_Size]; }
T const *begin() const { return &m_Memory[0]; }
T const *end() const { return &m_Memory[m_Size - 1]; }
T const *end() const { return &m_Memory[m_Size]; }
// Copy the array.
CUtlVector<T> &operator=(const CUtlVector<T> &other);
......
......@@ -85,24 +85,126 @@ DLL_FUNCTIONS* EXT_FUNC GetEntityInterface_api() {
return &gEntityInterface;
}
void EXT_FUNC MSG_StartBitWriting_api(sizebuf_t *buf) {
MSG_StartBitWriting(buf);
//
// Read functions API
//
int EXT_FUNC MSG_ReadChar_api() {
return MSG_ReadChar();
}
void EXT_FUNC MSG_WriteBits_api(uint32 data, int numbits) {
MSG_WriteBits(data, numbits);
int EXT_FUNC MSG_ReadByte_api() {
return MSG_ReadByte();
}
int EXT_FUNC MSG_ReadShort_api() {
return MSG_ReadShort();
}
int EXT_FUNC MSG_ReadLong_api() {
return MSG_ReadLong();
}
float EXT_FUNC MSG_ReadFloat_api() {
return MSG_ReadFloat();
}
char* EXT_FUNC MSG_ReadString_api() {
return MSG_ReadString();
}
char* EXT_FUNC MSG_ReadStringLine_api() {
return MSG_ReadStringLine();
}
int EXT_FUNC MSG_ReadBuf_api(int iSize, void *pbuf) {
return MSG_ReadBuf(iSize, pbuf);
}
void EXT_FUNC MSG_WriteBuf_api(sizebuf_t *sb, int iSize, void *buf) {
MSG_WriteBuf(sb, iSize, buf);
float EXT_FUNC MSG_ReadAngle_api() {
return MSG_ReadAngle();
}
float EXT_FUNC MSG_ReadHiresAngle_api() {
return MSG_ReadHiresAngle();
}
void EXT_FUNC MSG_ReadUsercmd_api(usercmd_t *to, usercmd_t *from) {
MSG_ReadUsercmd(to, from);
}
float EXT_FUNC MSG_ReadCoord_api() {
return MSG_ReadCoord();
}
void EXT_FUNC MSG_ReadVec3Coord_api(sizebuf_t *sb, vec3_t fa) {
MSG_ReadVec3Coord(sb, fa);
}
//
// Read bit functions API
//
bool EXT_FUNC MSG_IsBitReading_api() {
return MSG_IsBitReading() ? true : false;
}
void EXT_FUNC MSG_StartBitReading_api(sizebuf_t *buf) {
MSG_StartBitReading(buf);
}
void EXT_FUNC MSG_EndBitReading_api(sizebuf_t *buf) {
MSG_EndBitReading(buf);
}
uint32 EXT_FUNC MSG_PeekBits_api(int numbits) {
return MSG_PeekBits(numbits);
}
int EXT_FUNC MSG_ReadOneBit_api() {
return MSG_ReadOneBit();
}
uint32 EXT_FUNC MSG_ReadBits_api(int numbits) {
return MSG_ReadBits(numbits);
}
int EXT_FUNC MSG_ReadSBits_api(int numbits) {
return MSG_ReadSBits(numbits);
}
float EXT_FUNC MSG_ReadBitCoord_api() {
return MSG_ReadBitCoord();
}
void EXT_FUNC MSG_ReadBitVec3Coord_api(vec_t *fa) {
MSG_ReadBitVec3Coord(fa);
}
float EXT_FUNC MSG_ReadBitAngle_api(int numbits) {
return MSG_ReadBitAngle(numbits);
}
int EXT_FUNC MSG_ReadBitData_api(void *dest, int length) {
return MSG_ReadBitData(dest, length);
}
char* EXT_FUNC MSG_ReadBitString_api() {
return MSG_ReadBitString();
}
int EXT_FUNC MSG_CurrentBit_api() {
return MSG_CurrentBit();
}
//
// Write functions API
//
void EXT_FUNC MSG_WriteChar_api(sizebuf_t *sb, int c) {
MSG_WriteChar(sb, c);
}
void EXT_FUNC MSG_WriteByte_api(sizebuf_t *sb, int c) {
......@@ -113,18 +215,103 @@ void EXT_FUNC MSG_WriteShort_api(sizebuf_t *sb, int c) {
MSG_WriteShort(sb, c);
}
void EXT_FUNC MSG_WriteLong_api(sizebuf_t *sb, int c) {
MSG_WriteLong(sb, c);
}
void EXT_FUNC MSG_WriteFloat_api(sizebuf_t *sb, float f) {
MSG_WriteFloat(sb, f);
}
void EXT_FUNC MSG_WriteString_api(sizebuf_t *sb, const char *s) {
MSG_WriteString(sb, s);
}
void EXT_FUNC MSG_WriteBitVec3Coord_api(const vec3_t fa) {
MSG_WriteBitVec3Coord(fa);
void EXT_FUNC MSG_WriteBuf_api(sizebuf_t *sb, int iSize, void *buf) {
MSG_WriteBuf(sb, iSize, buf);
}
void EXT_FUNC MSG_WriteAngle_api(sizebuf_t *sb, float f) {
MSG_WriteAngle(sb, f);
}
void EXT_FUNC MSG_WriteHiresAngle_api(sizebuf_t *sb, float f) {
MSG_WriteHiresAngle(sb, f);
}
void EXT_FUNC MSG_WriteUsercmd_api(sizebuf_t *sb, usercmd_t *to, usercmd_t *from) {
MSG_WriteUsercmd(sb, to, from);
}
void EXT_FUNC MSG_WriteCoord_api(sizebuf_t *sb, float f) {
MSG_WriteCoord(sb, f);
}
void EXT_FUNC MSG_WriteVec3Coord_api(sizebuf_t *sb, const vec3_t fa) {
MSG_WriteVec3Coord(sb, fa);
}
//
// Write bit functions API
//
bool EXT_FUNC MSG_IsBitWriting_api() {
return MSG_IsBitWriting() ? true : false;
}
void EXT_FUNC MSG_StartBitWriting_api(sizebuf_t *buf) {
MSG_StartBitWriting(buf);
}
void EXT_FUNC MSG_EndBitWriting_api(sizebuf_t *buf) {
MSG_EndBitWriting(buf);
}
void EXT_FUNC MSG_WriteOneBit_api(int nValue) {
MSG_WriteOneBit(nValue);
}
void EXT_FUNC MSG_WriteBits_api(uint32 data, int numbits) {
MSG_WriteBits(data, numbits);
}
void EXT_FUNC MSG_WriteSBits_api(uint32 data, int numbits) {
MSG_WriteSBits(data, numbits);
}
void EXT_FUNC MSG_WriteBitCoord_api(float f) {
MSG_WriteBitCoord(f);
}
void EXT_FUNC MSG_WriteBitVec3Coord_api(const vec3_t fa) {
MSG_WriteBitVec3Coord(fa);
}
void EXT_FUNC MSG_WriteBitAngle_api(float fAngle, int numbits) {
MSG_WriteBitAngle(fAngle, numbits);
}
void EXT_FUNC MSG_WriteBitData_api(void *src, int length) {
MSG_WriteBitData(src, length);
}
void EXT_FUNC MSG_WriteBitString_api(const char *p) {
MSG_WriteBitString(p);
}
void EXT_FUNC SZ_Write_api(sizebuf_t *buf, const void *data, int length) {
SZ_Write(buf, data, length);
}
void EXT_FUNC SZ_Print_api(sizebuf_t *buf, const char *data) {
SZ_Print(buf, data);
}
void EXT_FUNC SZ_Clear_api(sizebuf_t *buf) {
SZ_Clear(buf);
}
cvar_t* EXT_FUNC GetCvarVars_api() {
return cvar_vars;
}
......@@ -316,7 +503,48 @@ RehldsFuncs_t g_RehldsApiFuncs =
&AddCvarListener_api,
&RemoveExtDll_api,
&RemoveCvarListener_api,
&GetEntityInit
&GetEntityInit,
&MSG_ReadChar_api,
&MSG_ReadByte_api,
&MSG_ReadLong_api,
&MSG_ReadFloat_api,
&MSG_ReadString_api,
&MSG_ReadStringLine_api,
&MSG_ReadAngle_api,
&MSG_ReadHiresAngle_api,
&MSG_ReadUsercmd_api,
&MSG_ReadCoord_api,
&MSG_ReadVec3Coord_api,
&MSG_IsBitReading_api,
&MSG_StartBitReading_api,
&MSG_EndBitReading_api,
&MSG_PeekBits_api,
&MSG_ReadOneBit_api,
&MSG_ReadBits_api,
&MSG_ReadSBits_api,
&MSG_ReadBitCoord_api,
&MSG_ReadBitVec3Coord_api,
&MSG_ReadBitAngle_api,
&MSG_ReadBitData_api,
&MSG_ReadBitString_api,
&MSG_CurrentBit_api,
&MSG_WriteLong_api,
&MSG_WriteFloat_api,
&MSG_WriteAngle_api,
&MSG_WriteHiresAngle_api,
&MSG_WriteUsercmd_api,
&MSG_WriteCoord_api,
&MSG_WriteVec3Coord_api,
&MSG_IsBitWriting_api,
&MSG_WriteOneBit_api,
&MSG_WriteSBits_api,
&MSG_WriteBitCoord_api,
&MSG_WriteBitAngle_api,
&MSG_WriteBitData_api,
&MSG_WriteBitString_api,
&SZ_Write_api,
&SZ_Print_api,
&SZ_Clear_api,
};
bool EXT_FUNC SV_EmitSound2_internal(edict_t *entity, IGameClient *pReceiver, int channel, const char *sample, float volume, float attenuation, int flags, int pitch, int emitFlags, const float *pOrigin)
......