mirror of
https://github.com/rehlds/rehlds.git
synced 2024-12-29 08:05:50 +03:00
Merge pull request #3 from theAsmodai/master
Fixed some Cmd_ functions, fixed messages sending in ClientPutInServer forward, added unrolled (un)munge2 functions, added one overflow preventing check, fixed fullupdate spam from not active clients, removed entity states reallocation in SV_WriteEntitiesToClient, packing players states separately from entities, added defines.
This commit is contained in:
commit
29aa669242
@ -232,10 +232,10 @@ typedef struct client_state_s
|
||||
local_state_t predicted_frames[64];
|
||||
int delta_sequence;
|
||||
int playernum;
|
||||
event_t event_precache[256];
|
||||
model_t *model_precache[512];
|
||||
event_t event_precache[HL_EVENT_MAX];
|
||||
model_t *model_precache[HL_MODEL_MAX];
|
||||
int model_precache_count;
|
||||
sfx_s *sound_precache[512];
|
||||
sfx_s *sound_precache[HL_SOUND_MAX];
|
||||
consistency_t consistency_list[512];
|
||||
int num_consistency;
|
||||
int highentity;
|
||||
|
@ -80,7 +80,9 @@ void Cbuf_AddText(char *text)
|
||||
// commands.
|
||||
void Cbuf_InsertText(char *text)
|
||||
{
|
||||
#ifndef REHLDS_FIXES
|
||||
char *temp = NULL;
|
||||
#endif // REHLDS_FIXES
|
||||
|
||||
int addLen = Q_strlen(text);
|
||||
int currLen = cmd_text.cursize;
|
||||
@ -93,24 +95,32 @@ void Cbuf_InsertText(char *text)
|
||||
|
||||
if (currLen)
|
||||
{
|
||||
#ifdef REHLDS_FIXES
|
||||
memmove(cmd_text.data + addLen, cmd_text.data, currLen);
|
||||
#else // REHLDS_FIXES
|
||||
temp = (char *)Z_Malloc(currLen); // TODO: Optimize: better use memmove without need for a temp buffer
|
||||
Q_memcpy(temp, cmd_text.data, currLen);
|
||||
SZ_Clear(&cmd_text);
|
||||
#endif // REHLDS_FIXES
|
||||
}
|
||||
|
||||
Cbuf_AddText(text);
|
||||
|
||||
#ifndef REHLDS_FIXES
|
||||
if (currLen)
|
||||
{
|
||||
SZ_Write(&cmd_text, temp, currLen);
|
||||
Z_Free(temp);
|
||||
}
|
||||
#endif // REHLDS_FIXES
|
||||
}
|
||||
|
||||
/* <4f05> ../engine/cmd.c:148 */
|
||||
void Cbuf_InsertTextLines(char *text)
|
||||
{
|
||||
#ifndef REHLDS_FIXES
|
||||
char *temp = NULL;
|
||||
#endif // REHLDS_FIXES
|
||||
|
||||
int addLen = Q_strlen(text);
|
||||
int currLen = cmd_text.cursize;
|
||||
@ -123,20 +133,26 @@ void Cbuf_InsertTextLines(char *text)
|
||||
|
||||
if (currLen)
|
||||
{
|
||||
#ifdef REHLDS_FIXES
|
||||
memmove(cmd_text.data + addLen, cmd_text.data, currLen);
|
||||
#else // REHLDS_FIXES
|
||||
temp = (char *)Z_Malloc(currLen);
|
||||
Q_memcpy(temp, cmd_text.data, currLen);
|
||||
SZ_Clear(&cmd_text);
|
||||
#endif // REHLDS_FIXES
|
||||
}
|
||||
|
||||
Cbuf_AddText("\n"); // TODO: Why we need leading \n, if there is no commands in the start?
|
||||
Cbuf_AddText(text);
|
||||
Cbuf_AddText("\n");
|
||||
|
||||
#ifndef REHLDS_FIXES
|
||||
if (currLen)
|
||||
{
|
||||
SZ_Write(&cmd_text, temp, currLen);
|
||||
Z_Free(temp);
|
||||
}
|
||||
#endif // REHLDS_FIXES
|
||||
}
|
||||
|
||||
/* <5d96> ../engine/cmd.c:193 */
|
||||
@ -167,6 +183,18 @@ void Cbuf_Execute(void)
|
||||
break;
|
||||
}
|
||||
|
||||
#ifdef REHLDS_FIXES
|
||||
// save `i` if we truncate command
|
||||
int len;
|
||||
|
||||
if (i > MAX_CMD_LINE - 1)
|
||||
len = MAX_CMD_LINE - 1;
|
||||
else
|
||||
len = i;
|
||||
|
||||
Q_memcpy(line, text, len);
|
||||
line[len] = 0;
|
||||
#else // REHLDS_FIXES
|
||||
if (i > MAX_CMD_LINE - 1)
|
||||
{
|
||||
i = MAX_CMD_LINE - 1;
|
||||
@ -174,6 +202,7 @@ void Cbuf_Execute(void)
|
||||
|
||||
Q_memcpy(line, text, i);
|
||||
line[i] = 0;
|
||||
#endif // REHLDS_FIXES
|
||||
|
||||
// delete the text from the command buffer and move remaining commands down
|
||||
// this is necessary because commands (exec, alias) can insert data at the
|
||||
@ -187,7 +216,12 @@ void Cbuf_Execute(void)
|
||||
{
|
||||
i++;
|
||||
cmd_text.cursize -= i;
|
||||
#ifdef REHLDS_FIXES
|
||||
// dst overlaps src
|
||||
memmove(text, text + i, cmd_text.cursize);
|
||||
#else // REHLDS_FIXES
|
||||
Q_memcpy(text, text + i, cmd_text.cursize);
|
||||
#endif // REHLDS_FIXES
|
||||
}
|
||||
|
||||
// execute the command line
|
||||
|
@ -2509,6 +2509,73 @@ void COM_UnMunge(unsigned char *data, int len, int seq)
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef REHLDS_FIXES
|
||||
// unrolled version
|
||||
void COM_Munge2(unsigned char *data, int len, int seq)
|
||||
{
|
||||
unsigned int *pc;
|
||||
unsigned int *end;
|
||||
unsigned int mSeq;
|
||||
|
||||
mSeq = _byteswap_ulong(~seq) ^ seq;
|
||||
len /= 4;
|
||||
end = (unsigned int *)data + (len & ~15);
|
||||
|
||||
for (pc = (unsigned int *)data; pc < end; pc += 16)
|
||||
{
|
||||
pc[0] = _byteswap_ulong(pc[0]) ^ mSeq ^ 0xFFFFE7A5;
|
||||
pc[1] = _byteswap_ulong(pc[1]) ^ mSeq ^ 0xBFEFFFE5;
|
||||
pc[2] = _byteswap_ulong(pc[2]) ^ mSeq ^ 0xFFBFEFFF;
|
||||
pc[3] = _byteswap_ulong(pc[3]) ^ mSeq ^ 0xBFEFBFED;
|
||||
pc[4] = _byteswap_ulong(pc[4]) ^ mSeq ^ 0xBFAFEFBF;
|
||||
pc[5] = _byteswap_ulong(pc[5]) ^ mSeq ^ 0xFFBFAFEF;
|
||||
pc[6] = _byteswap_ulong(pc[6]) ^ mSeq ^ 0xFFEFBFAD;
|
||||
pc[7] = _byteswap_ulong(pc[7]) ^ mSeq ^ 0xFFFFEFBF;
|
||||
pc[8] = _byteswap_ulong(pc[8]) ^ mSeq ^ 0xFFEFF7EF;
|
||||
pc[9] = _byteswap_ulong(pc[9]) ^ mSeq ^ 0xBFEFE7F5;
|
||||
pc[10] = _byteswap_ulong(pc[10]) ^ mSeq ^ 0xBFBFE7E5;
|
||||
pc[11] = _byteswap_ulong(pc[11]) ^ mSeq ^ 0xFFAFB7E7;
|
||||
pc[12] = _byteswap_ulong(pc[12]) ^ mSeq ^ 0xBFFFAFB5;
|
||||
pc[13] = _byteswap_ulong(pc[13]) ^ mSeq ^ 0xBFAFFFAF;
|
||||
pc[14] = _byteswap_ulong(pc[14]) ^ mSeq ^ 0xFFAFA7FF;
|
||||
pc[15] = _byteswap_ulong(pc[15]) ^ mSeq ^ 0xFFEFA7A5;
|
||||
}
|
||||
|
||||
switch(len & 15)
|
||||
{
|
||||
case 15:
|
||||
pc[14] = _byteswap_ulong(pc[14]) ^ mSeq ^ 0xFFAFA7FF;
|
||||
case 14:
|
||||
pc[13] = _byteswap_ulong(pc[13]) ^ mSeq ^ 0xBFAFFFAF;
|
||||
case 13:
|
||||
pc[12] = _byteswap_ulong(pc[12]) ^ mSeq ^ 0xBFFFAFB5;
|
||||
case 12:
|
||||
pc[11] = _byteswap_ulong(pc[11]) ^ mSeq ^ 0xFFAFB7E7;
|
||||
case 11:
|
||||
pc[10] = _byteswap_ulong(pc[10]) ^ mSeq ^ 0xBFBFE7E5;
|
||||
case 10:
|
||||
pc[9] = _byteswap_ulong(pc[9]) ^ mSeq ^ 0xBFEFE7F5;
|
||||
case 9:
|
||||
pc[8] = _byteswap_ulong(pc[8]) ^ mSeq ^ 0xFFEFF7EF;
|
||||
case 8:
|
||||
pc[7] = _byteswap_ulong(pc[7]) ^ mSeq ^ 0xFFFFEFBF;
|
||||
case 7:
|
||||
pc[6] = _byteswap_ulong(pc[6]) ^ mSeq ^ 0xFFEFBFAD;
|
||||
case 6:
|
||||
pc[5] = _byteswap_ulong(pc[5]) ^ mSeq ^ 0xFFBFAFEF;
|
||||
case 5:
|
||||
pc[4] = _byteswap_ulong(pc[4]) ^ mSeq ^ 0xBFAFEFBF;
|
||||
case 4:
|
||||
pc[3] = _byteswap_ulong(pc[3]) ^ mSeq ^ 0xBFEFBFED;
|
||||
case 3:
|
||||
pc[2] = _byteswap_ulong(pc[2]) ^ mSeq ^ 0xFFBFEFFF;
|
||||
case 2:
|
||||
pc[1] = _byteswap_ulong(pc[1]) ^ mSeq ^ 0xBFEFFFE5;
|
||||
case 1:
|
||||
pc[0] = _byteswap_ulong(pc[0]) ^ mSeq ^ 0xFFFFE7A5;
|
||||
}
|
||||
}
|
||||
#else // REHLDS_FIXES
|
||||
/* <124de> ../engine/common.c:3104 */
|
||||
void COM_Munge2(unsigned char *data, int len, int seq)
|
||||
{
|
||||
@ -2539,7 +2606,75 @@ void COM_Munge2(unsigned char *data, int len, int seq)
|
||||
*pc = c;
|
||||
}
|
||||
}
|
||||
#endif // REHLDS_FIXES
|
||||
|
||||
#ifdef REHLDS_FIXES
|
||||
// unrolled version
|
||||
void COM_UnMunge2(unsigned char *data, int len, int seq)
|
||||
{
|
||||
unsigned int *pc;
|
||||
unsigned int *end;
|
||||
unsigned int mSeq;
|
||||
|
||||
mSeq = _byteswap_ulong(~seq) ^ seq;
|
||||
len /= 4;
|
||||
end = (unsigned int *)data + (len & ~15);
|
||||
|
||||
for (pc = (unsigned int *)data; pc < end; pc += 16)
|
||||
{
|
||||
pc[0] = _byteswap_ulong(pc[0] ^ mSeq ^ 0xFFFFE7A5);
|
||||
pc[1] = _byteswap_ulong(pc[1] ^ mSeq ^ 0xBFEFFFE5);
|
||||
pc[2] = _byteswap_ulong(pc[2] ^ mSeq ^ 0xFFBFEFFF);
|
||||
pc[3] = _byteswap_ulong(pc[3] ^ mSeq ^ 0xBFEFBFED);
|
||||
pc[4] = _byteswap_ulong(pc[4] ^ mSeq ^ 0xBFAFEFBF);
|
||||
pc[5] = _byteswap_ulong(pc[5] ^ mSeq ^ 0xFFBFAFEF);
|
||||
pc[6] = _byteswap_ulong(pc[6] ^ mSeq ^ 0xFFEFBFAD);
|
||||
pc[7] = _byteswap_ulong(pc[7] ^ mSeq ^ 0xFFFFEFBF);
|
||||
pc[8] = _byteswap_ulong(pc[8] ^ mSeq ^ 0xFFEFF7EF);
|
||||
pc[9] = _byteswap_ulong(pc[9] ^ mSeq ^ 0xBFEFE7F5);
|
||||
pc[10] = _byteswap_ulong(pc[10] ^ mSeq ^ 0xBFBFE7E5);
|
||||
pc[11] = _byteswap_ulong(pc[11] ^ mSeq ^ 0xFFAFB7E7);
|
||||
pc[12] = _byteswap_ulong(pc[12] ^ mSeq ^ 0xBFFFAFB5);
|
||||
pc[13] = _byteswap_ulong(pc[13] ^ mSeq ^ 0xBFAFFFAF);
|
||||
pc[14] = _byteswap_ulong(pc[14] ^ mSeq ^ 0xFFAFA7FF);
|
||||
pc[15] = _byteswap_ulong(pc[15] ^ mSeq ^ 0xFFEFA7A5);
|
||||
}
|
||||
|
||||
switch(len & 15)
|
||||
{
|
||||
case 15:
|
||||
pc[14] = _byteswap_ulong(pc[14] ^ mSeq ^ 0xFFAFA7FF);
|
||||
case 14:
|
||||
pc[13] = _byteswap_ulong(pc[13] ^ mSeq ^ 0xBFAFFFAF);
|
||||
case 13:
|
||||
pc[12] = _byteswap_ulong(pc[12] ^ mSeq ^ 0xBFFFAFB5);
|
||||
case 12:
|
||||
pc[11] = _byteswap_ulong(pc[11] ^ mSeq ^ 0xFFAFB7E7);
|
||||
case 11:
|
||||
pc[10] = _byteswap_ulong(pc[10] ^ mSeq ^ 0xBFBFE7E5);
|
||||
case 10:
|
||||
pc[9] = _byteswap_ulong(pc[9] ^ mSeq ^ 0xBFEFE7F5);
|
||||
case 9:
|
||||
pc[8] = _byteswap_ulong(pc[8] ^ mSeq ^ 0xFFEFF7EF);
|
||||
case 8:
|
||||
pc[7] = _byteswap_ulong(pc[7] ^ mSeq ^ 0xFFFFEFBF);
|
||||
case 7:
|
||||
pc[6] = _byteswap_ulong(pc[6] ^ mSeq ^ 0xFFEFBFAD);
|
||||
case 6:
|
||||
pc[5] = _byteswap_ulong(pc[5] ^ mSeq ^ 0xFFBFAFEF);
|
||||
case 5:
|
||||
pc[4] = _byteswap_ulong(pc[4] ^ mSeq ^ 0xBFAFEFBF);
|
||||
case 4:
|
||||
pc[3] = _byteswap_ulong(pc[3] ^ mSeq ^ 0xBFEFBFED);
|
||||
case 3:
|
||||
pc[2] = _byteswap_ulong(pc[2] ^ mSeq ^ 0xFFBFEFFF);
|
||||
case 2:
|
||||
pc[1] = _byteswap_ulong(pc[1] ^ mSeq ^ 0xBFEFFFE5);
|
||||
case 1:
|
||||
pc[0] = _byteswap_ulong(pc[0] ^ mSeq ^ 0xFFFFE7A5);
|
||||
}
|
||||
}
|
||||
#else // REHLDS_FIXES
|
||||
/* <125b5> ../engine/common.c:3146 */
|
||||
void COM_UnMunge2(unsigned char *data, int len, int seq)
|
||||
{
|
||||
@ -2570,6 +2705,7 @@ void COM_UnMunge2(unsigned char *data, int len, int seq)
|
||||
*pc = c;
|
||||
}
|
||||
}
|
||||
#endif // REHLDS_FIXES
|
||||
|
||||
/* <1269c> ../engine/common.c:3190 */
|
||||
void COM_Munge3(unsigned char *data, int len, int seq)
|
||||
|
@ -134,7 +134,7 @@ void PF_setmodel_I(edict_t *e, const char *m)
|
||||
int i = 0;
|
||||
|
||||
#ifdef REHLDS_CHECKS
|
||||
for (; *check && i < 512; i++, check++)
|
||||
for (; *check && i < HL_MODEL_MAX; i++, check++)
|
||||
#else
|
||||
for (; *check; i++, check++)
|
||||
#endif
|
||||
@ -273,7 +273,6 @@ void PF_particle_I(const float *org, const float *dir, float color, float count)
|
||||
/* <786e7> ../engine/pr_cmds.c:390 */
|
||||
void PF_ambientsound_I(edict_t *entity, float *pos, const char *samp, float vol, float attenuation, int fFlags, int pitch)
|
||||
{
|
||||
char **check;
|
||||
int i;
|
||||
int soundnum;
|
||||
int ent;
|
||||
@ -291,19 +290,20 @@ void PF_ambientsound_I(edict_t *entity, float *pos, const char *samp, float vol,
|
||||
}
|
||||
else
|
||||
{
|
||||
i = 0;
|
||||
check = g_psv.sound_precache;
|
||||
while (*check && Q_stricmp(*check, samp)) {
|
||||
i++;
|
||||
check++;
|
||||
for (i = 0; i < HL_SOUND_MAX; i++)
|
||||
{
|
||||
if (g_psv.sound_precache[i] && !Q_stricmp(g_psv.sound_precache[i], samp))
|
||||
{
|
||||
soundnum = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!check[0])
|
||||
|
||||
if (i == HL_SOUND_MAX)
|
||||
{
|
||||
Con_Printf("no precache: %s\n", samp);
|
||||
return;
|
||||
}
|
||||
|
||||
soundnum = i;
|
||||
}
|
||||
|
||||
ent = NUM_FOR_EDICT(entity);
|
||||
@ -1059,41 +1059,37 @@ int PF_precache_sound_I(char *s)
|
||||
if (g_psv.state == ss_loading)
|
||||
{
|
||||
g_psv.sound_precache_hashedlookup_built = 0;
|
||||
i = 0;
|
||||
while (1)
|
||||
|
||||
for (i = 0; i < HL_SOUND_MAX; i++)
|
||||
{
|
||||
if (!g_psv.sound_precache[i])
|
||||
break;
|
||||
{
|
||||
g_psv.sound_precache[i] = s;
|
||||
return i;
|
||||
}
|
||||
|
||||
if (!Q_stricmp(g_psv.sound_precache[i], s))
|
||||
return i;
|
||||
|
||||
++i;
|
||||
if (i >= 512)
|
||||
Host_Error(
|
||||
"PF_precache_sound_I: Sound '%s' failed to precache because the item count is over the %d limit.\nReduce the number of brush models and/or regular models in the map to correct this.",
|
||||
s,
|
||||
512);
|
||||
}
|
||||
g_psv.sound_precache[i] = s;
|
||||
|
||||
Host_Error(
|
||||
"PF_precache_sound_I: Sound '%s' failed to precache because the item count is over the %d limit.\nReduce the number of brush models and/or regular models in the map to correct this.",
|
||||
s,
|
||||
HL_SOUND_MAX);
|
||||
}
|
||||
else
|
||||
{
|
||||
i = 0;
|
||||
while (1)
|
||||
// precaching not enabled. check if already exists.
|
||||
for (i = 0; i < HL_SOUND_MAX; i++)
|
||||
{
|
||||
if (g_psv.sound_precache[i])
|
||||
{
|
||||
if (!Q_stricmp(g_psv.sound_precache[i], s))
|
||||
break;
|
||||
}
|
||||
++i;
|
||||
if (i >= 512)
|
||||
Host_Error("PF_precache_sound_I: '%s' Precache can only be done in spawn functions", s);
|
||||
if (g_psv.sound_precache[i] && !Q_stricmp(g_psv.sound_precache[i], s))
|
||||
return i;
|
||||
}
|
||||
|
||||
Host_Error("PF_precache_sound_I: '%s' Precache can only be done in spawn functions", s);
|
||||
}
|
||||
|
||||
return i;
|
||||
return -1; // unreach
|
||||
}
|
||||
|
||||
/* <79609> ../engine/pr_cmds.c:1455 */
|
||||
@ -1107,7 +1103,7 @@ short unsigned int EV_Precache(int type, const char *psz)
|
||||
|
||||
if (g_psv.state == ss_loading)
|
||||
{
|
||||
for (int i = 1; i < 256; i++)
|
||||
for (int i = 1; i < HL_EVENT_MAX; i++)
|
||||
{
|
||||
struct event_s* ev = &g_psv.event_precache[i];
|
||||
if (!ev->filename)
|
||||
@ -1115,8 +1111,8 @@ short unsigned int EV_Precache(int type, const char *psz)
|
||||
if (type != 1)
|
||||
Host_Error("EV_Precache: only file type 1 supported currently\n");
|
||||
|
||||
char szpath[260];
|
||||
_snprintf(szpath, 0x104u, "%s", psz);
|
||||
char szpath[MAX_PATH];
|
||||
_snprintf(szpath, sizeof(szpath), "%s", psz);
|
||||
COM_FixSlashes(szpath);
|
||||
|
||||
int scriptSize = 0;
|
||||
@ -1139,7 +1135,7 @@ short unsigned int EV_Precache(int type, const char *psz)
|
||||
}
|
||||
else
|
||||
{
|
||||
for (int i = 1; i < 256; i++)
|
||||
for (int i = 1; i < HL_EVENT_MAX; i++)
|
||||
{
|
||||
struct event_s* ev = &g_psv.event_precache[i];
|
||||
if (!Q_stricmp(ev->filename, psz))
|
||||
@ -1235,7 +1231,7 @@ void EV_Playback(int flags, const edict_t *pInvoker, short unsigned int eventind
|
||||
eargs.bparam1 = bparam1;
|
||||
eargs.bparam2 = bparam2;
|
||||
|
||||
if (eventindex < 1u || eventindex >= 0x100u)
|
||||
if (eventindex < 1u || eventindex >= HL_EVENT_MAX)
|
||||
{
|
||||
Con_DPrintf("EV_Playback: index out of range %i\n", eventindex);
|
||||
return;
|
||||
@ -1400,7 +1396,7 @@ int PF_precache_model_I(char *s)
|
||||
|
||||
if (g_psv.state == ss_loading)
|
||||
{
|
||||
for (int i = 0; i < 512; i++)
|
||||
for (int i = 0; i < HL_MODEL_MAX; i++)
|
||||
{
|
||||
if (!g_psv.model_precache[i])
|
||||
{
|
||||
@ -1421,7 +1417,7 @@ int PF_precache_model_I(char *s)
|
||||
}
|
||||
else
|
||||
{
|
||||
for (int i = 0; i < 512; i++)
|
||||
for (int i = 0; i < HL_MODEL_MAX; i++)
|
||||
{
|
||||
if (!Q_stricmp(g_psv.model_precache[i], s))
|
||||
return i;
|
||||
@ -1442,7 +1438,7 @@ int PF_precache_generic_I(char *s)
|
||||
|
||||
if (g_psv.state == ss_loading)
|
||||
{
|
||||
for (int i = 0; i < 512; i++)
|
||||
for (int i = 0; i < HL_GENERIC_MAX; i++)
|
||||
{
|
||||
if (!g_psv.generic_precache[i])
|
||||
{
|
||||
@ -1456,11 +1452,11 @@ int PF_precache_generic_I(char *s)
|
||||
Host_Error(
|
||||
"PF_precache_generic_I: Generic item '%s' failed to precache because the item count is over the %d limit.\nReduce the number of brush models and/or regular models in the map to correct this.",
|
||||
s,
|
||||
512);
|
||||
HL_GENERIC_MAX);
|
||||
}
|
||||
else
|
||||
{
|
||||
for (int i = 0; i < 512; i++)
|
||||
for (int i = 0; i < HL_GENERIC_MAX; i++)
|
||||
{
|
||||
if (!Q_stricmp(g_psv.generic_precache[i], s))
|
||||
return i;
|
||||
|
@ -34,10 +34,12 @@
|
||||
|
||||
#include "maintypes.h"
|
||||
|
||||
#define MAX_CLIENTS 32
|
||||
#define MAX_EDICTS 900
|
||||
#define MAX_NAME 32
|
||||
// TODO: I think this defines must be in /common/
|
||||
#define MAX_CLIENTS 32
|
||||
#define MAX_EDICTS 900
|
||||
#define MAX_NAME 32
|
||||
#define MAX_LIGHTSTYLES 64
|
||||
#define MAX_PACKET_ENTITIES 256
|
||||
|
||||
#include "custom_int.h"
|
||||
#include "crc.h"
|
||||
@ -86,6 +88,8 @@
|
||||
#define HL_SOUND_HASHLOOKUP_SIZE (HL_SOUND_MAX * 2 - 1)
|
||||
|
||||
#define HL_MODEL_MAX 512
|
||||
#define HL_GENERIC_MAX 512
|
||||
#define HL_EVENT_MAX 256
|
||||
|
||||
// Authentication types
|
||||
#define AUTH_IDTYPE_UNKNOWN 0
|
||||
@ -131,15 +135,15 @@ typedef struct server_s
|
||||
int num_resources;
|
||||
consistency_t consistency_list[512];
|
||||
int num_consistency;
|
||||
char *model_precache[512];
|
||||
struct model_s *models[512];
|
||||
unsigned char model_precache_flags[512];
|
||||
struct event_s event_precache[256];
|
||||
char *sound_precache[512];
|
||||
char *model_precache[HL_MODEL_MAX];
|
||||
struct model_s *models[HL_MODEL_MAX];
|
||||
unsigned char model_precache_flags[HL_MODEL_MAX];
|
||||
struct event_s event_precache[HL_EVENT_MAX];
|
||||
char *sound_precache[HL_SOUND_MAX];
|
||||
short int sound_precache_hashedlookup[HL_SOUND_HASHLOOKUP_SIZE];
|
||||
qboolean sound_precache_hashedlookup_built;
|
||||
char *generic_precache[512];
|
||||
char generic_precache_names[512][64];
|
||||
char *generic_precache[HL_GENERIC_MAX];
|
||||
char generic_precache_names[HL_GENERIC_MAX][64];
|
||||
int num_generic_names;
|
||||
char *lightstyles[MAX_LIGHTSTYLES];
|
||||
int num_edicts;
|
||||
|
@ -32,7 +32,7 @@
|
||||
typedef struct full_packet_entities_s
|
||||
{
|
||||
int num_entities;
|
||||
entity_state_t entities[256];
|
||||
entity_state_t entities[MAX_PACKET_ENTITIES];
|
||||
} full_packet_entities_t;
|
||||
|
||||
/* <a59b9> ../engine/sv_main.c:102 */
|
||||
@ -493,6 +493,13 @@ void SV_AllocPacketEntities(client_frame_t *frame, int numents)
|
||||
{
|
||||
if (frame)
|
||||
{
|
||||
#ifdef REHLDS_FIXES
|
||||
frame->entities.num_entities = numents;
|
||||
|
||||
// only alloc for max possible numents
|
||||
if (!frame->entities.entities)
|
||||
frame->entities.entities = (entity_state_t *)Mem_ZeroMalloc(sizeof(entity_state_t) * MAX_PACKET_ENTITIES);
|
||||
#else // REHLDS_FIXES
|
||||
if (frame->entities.entities)
|
||||
SV_ClearPacketEntities(frame);
|
||||
|
||||
@ -502,6 +509,7 @@ void SV_AllocPacketEntities(client_frame_t *frame, int numents)
|
||||
|
||||
frame->entities.num_entities = numents;
|
||||
frame->entities.entities = (entity_state_t *)Mem_ZeroMalloc(sizeof(entity_state_t) * allocatedslots);
|
||||
#endif // REHLDS_FIXES
|
||||
}
|
||||
}
|
||||
|
||||
@ -853,14 +861,10 @@ int SV_LookupSoundIndex(const char *sample)
|
||||
{
|
||||
if (g_psv.state == ss_loading)
|
||||
{
|
||||
index = 1;
|
||||
while (g_psv.sound_precache[index])
|
||||
for (index = 1; index < HL_SOUND_MAX && g_psv.sound_precache[index]; index++) // TODO: why from 1?
|
||||
{
|
||||
if (!Q_stricmp(sample, g_psv.sound_precache[index]))
|
||||
return index;
|
||||
index++;
|
||||
if (index >= HL_SOUND_MAX)
|
||||
return 0;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@ -1401,6 +1405,12 @@ void SV_WriteSpawn(sizebuf_t *msg)
|
||||
int i = 0;
|
||||
client_t *client = g_psvs.clients;
|
||||
|
||||
#ifdef REHLDS_FIXES
|
||||
// do it before PutInServer to allow mods send messages from forward
|
||||
SZ_Clear( &host_client->netchan.message );
|
||||
SZ_Clear( &host_client->datagram );
|
||||
#endif // REHLDS_FIXES
|
||||
|
||||
if (g_psv.loadgame)
|
||||
{
|
||||
if (host_client->proxy)
|
||||
@ -1429,8 +1439,10 @@ void SV_WriteSpawn(sizebuf_t *msg)
|
||||
g_psv.state = ss_active;
|
||||
}
|
||||
|
||||
#ifndef REHLDS_FIXES
|
||||
SZ_Clear(&host_client->netchan.message);
|
||||
SZ_Clear(&host_client->datagram);
|
||||
#endif // REHLDS_FIXES
|
||||
|
||||
MSG_WriteByte(msg, svc_time);
|
||||
MSG_WriteFloat(msg, g_psv.time);
|
||||
@ -1443,7 +1455,7 @@ void SV_WriteSpawn(sizebuf_t *msg)
|
||||
SV_FullClientUpdate(client, msg);
|
||||
}
|
||||
|
||||
for (i = 0; i < 64; i++)
|
||||
for (i = 0; i < ARRAYSIZE( g_psv.lightstyles ); i++)
|
||||
{
|
||||
MSG_WriteByte(msg, svc_lightstyle);
|
||||
MSG_WriteByte(msg, i);
|
||||
@ -1714,6 +1726,7 @@ int SV_GetFragmentSize(void *state)
|
||||
const char *val = Info_ValueForKey(cl->userinfo, "cl_dlmax");
|
||||
if (val[0] != 0)
|
||||
{
|
||||
size = Q_atoi( val );
|
||||
size = clamp(size, 256, 1024);
|
||||
}
|
||||
}
|
||||
@ -1736,7 +1749,7 @@ qboolean SV_FilterUser(USERID_t *userid)
|
||||
else
|
||||
{
|
||||
if (i + 1 < j)
|
||||
memcpy(filter, &filter[1], sizeof(userfilter_t) * (j - i + 1));
|
||||
memmove(filter, &filter[1], sizeof(userfilter_t) * (j - i + 1));
|
||||
|
||||
numuserfilters = --j;
|
||||
}
|
||||
@ -4375,7 +4388,10 @@ void SV_WriteEntitiesToClient(client_t *client, sizebuf_t *msg)
|
||||
gEntityInterface.pfnSetupVisibility((edict_t*)client->pViewEntity, client->edict, &pvs, &pas);
|
||||
unsigned char *pSet = pvs;
|
||||
|
||||
#ifndef REHLDS_FIXES
|
||||
// don't reallocate entity states
|
||||
SV_ClearPacketEntities(frame);
|
||||
#endif // REHLDS_FIXES
|
||||
packet_entities_t *pack = &frame->entities;
|
||||
fullpack.num_entities = 0;
|
||||
|
||||
@ -4383,6 +4399,33 @@ void SV_WriteEntitiesToClient(client_t *client, sizebuf_t *msg)
|
||||
|
||||
int flags = client->lw != 0;
|
||||
|
||||
#ifdef REHLDS_FIXES
|
||||
int e;
|
||||
|
||||
for (e = 1; e <= g_psvs.maxclients; e++)
|
||||
{
|
||||
client_t *cl = &g_psvs.clients[e - 1];
|
||||
if( ( !cl->active && !cl->spawned ) || cl->proxy )
|
||||
continue;
|
||||
|
||||
qboolean add = gEntityInterface.pfnAddToFullPack(&fullpack.entities[fullpack.num_entities], e, &g_psv.edicts[e], host_client->edict, flags, TRUE, pSet);
|
||||
if (add)
|
||||
++fullpack.num_entities;
|
||||
}
|
||||
|
||||
for (; e < g_psv.num_edicts; e++)
|
||||
{
|
||||
if (fullpack.num_entities >= MAX_PACKET_ENTITIES)
|
||||
{
|
||||
Con_DPrintf("Too many entities in visible packet list.\n");
|
||||
break;
|
||||
}
|
||||
|
||||
qboolean add = gEntityInterface.pfnAddToFullPack(&fullpack.entities[fullpack.num_entities], e, &g_psv.edicts[e], host_client->edict, flags, FALSE, pSet);
|
||||
if (add)
|
||||
++fullpack.num_entities;
|
||||
}
|
||||
#else // REHLDS_FIXES
|
||||
for (int e = 1; e < g_psv.num_edicts; e++)
|
||||
{
|
||||
edict_t *ent = &g_psv.edicts[e];
|
||||
@ -4396,7 +4439,7 @@ void SV_WriteEntitiesToClient(client_t *client, sizebuf_t *msg)
|
||||
player = 1;
|
||||
}
|
||||
|
||||
if (fullpack.num_entities >= 256)
|
||||
if (fullpack.num_entities >= MAX_PACKET_ENTITIES)
|
||||
{
|
||||
Con_DPrintf("Too many entities in visible packet list.\n");
|
||||
break;
|
||||
@ -4406,6 +4449,7 @@ void SV_WriteEntitiesToClient(client_t *client, sizebuf_t *msg)
|
||||
if (add)
|
||||
++fullpack.num_entities;
|
||||
}
|
||||
#endif // REHLDS_FIXES
|
||||
|
||||
SV_AllocPacketEntities(frame, fullpack.num_entities);
|
||||
if (pack->num_entities)
|
||||
@ -4490,7 +4534,12 @@ void SV_UpdateToReliableMessages(void)
|
||||
|
||||
host_client = client;
|
||||
|
||||
#ifdef REHLDS_FIXES
|
||||
// skip update in this frame if would overflow
|
||||
if (client->sendinfo && client->sendinfo_time <= realtime && ( 1 + 1 + 4 + ( int )strlen( client->userinfo ) + 1 + 16 + g_psv.reliable_datagram.cursize <= g_psv.reliable_datagram.maxsize ) )
|
||||
#else // REHLDS_FIXES
|
||||
if (client->sendinfo && client->sendinfo_time <= realtime)
|
||||
#endif // REHLDS_FIXES
|
||||
{
|
||||
client->sendinfo = FALSE;
|
||||
client->sendinfo_time = realtime + 1.0;
|
||||
@ -4800,7 +4849,7 @@ int SV_ModelIndex(const char *name)
|
||||
if (!name || !name[0])
|
||||
return 0;
|
||||
|
||||
for (int i = 0; i < 512; i++)
|
||||
for (int i = 0; i < HL_MODEL_MAX; i++)
|
||||
{
|
||||
if (!g_psv.model_precache[i])
|
||||
break;
|
||||
@ -4896,7 +4945,11 @@ void SV_CreateResourceList(void)
|
||||
event_t *ep;
|
||||
|
||||
g_psv.num_resources = 0;
|
||||
#ifdef REHLDS_CHECKS
|
||||
for (i = 1, s = &g_psv.generic_precache[1]; i < HL_GENERIC_MAX && *s != NULL; i++, s++)
|
||||
#else // REHLDS_CHECKS
|
||||
for (i = 1, s = &g_psv.generic_precache[1]; *s != NULL; i++, s++)
|
||||
#endif // REHLDS_CHECKS
|
||||
{
|
||||
if (g_psvs.maxclients > 1)
|
||||
nSize = FS_FileSize(*s);
|
||||
@ -4905,7 +4958,11 @@ void SV_CreateResourceList(void)
|
||||
|
||||
SV_AddResource(t_generic, *s, nSize, 1, i);
|
||||
}
|
||||
#ifdef REHLDS_CHECKS
|
||||
for (i = 1, s = &g_psv.sound_precache[1]; i < HL_SOUND_MAX && *s != NULL; i++, s++)
|
||||
#else // REHLDS_CHECKS
|
||||
for (i = 1, s = &g_psv.sound_precache[1]; *s != NULL; i++, s++)
|
||||
#endif // REHLDS_CHECKS
|
||||
{
|
||||
if (**s == '!')
|
||||
{
|
||||
@ -4923,7 +4980,11 @@ void SV_CreateResourceList(void)
|
||||
SV_AddResource(t_sound, *s, nSize, 0, i);
|
||||
}
|
||||
}
|
||||
#ifdef REHLDS_CHECKS
|
||||
for (i = 1, s = &g_psv.model_precache[1]; i < HL_MODEL_MAX && *s != NULL; i++, s++)
|
||||
#else // REHLDS_CHECKS
|
||||
for (i = 1, s = &g_psv.model_precache[1]; *s != NULL; i++, s++)
|
||||
#endif // REHLDS_CHECKS
|
||||
{
|
||||
if (g_psvs.maxclients > 1 && **s != '*')
|
||||
nSize = FS_FileSize(*s);
|
||||
@ -4935,7 +4996,7 @@ void SV_CreateResourceList(void)
|
||||
for (i = 0; i < sv_decalnamecount; i++)
|
||||
SV_AddResource(t_decal, sv_decalnames[i].name, Draw_DecalSize(i), 0, i);
|
||||
|
||||
for (i = 1; i < 255; i++)
|
||||
for (i = 1; i < HL_EVENT_MAX; i++)
|
||||
{
|
||||
ep = &g_psv.event_precache[i];
|
||||
if (!ep->filename)
|
||||
@ -4950,7 +5011,7 @@ void SV_ClearCaches(void)
|
||||
{
|
||||
int i;
|
||||
event_t *ep;
|
||||
for (i = 1; i < 255; i++)
|
||||
for (i = 1; i < HL_EVENT_MAX; i++)
|
||||
{
|
||||
ep = &g_psv.event_precache[i];
|
||||
if (ep->filename == NULL)
|
||||
|
@ -215,12 +215,26 @@ void SV_ParseConsistencyResponse(client_t *pSenderClient)
|
||||
if (c > 0)
|
||||
{
|
||||
char dropmessage[256];
|
||||
#ifdef REHLDS_FIXES
|
||||
dropmessage[0] = '\0';
|
||||
|
||||
if (gEntityInterface.pfnInconsistentFile(host_client->edict, g_psv.resourcelist[c - 1].szFileName, dropmessage))
|
||||
{
|
||||
if (dropmessage[0])
|
||||
SV_ClientPrintf("%s", dropmessage);
|
||||
|
||||
SV_DropClient(host_client, 0, "Bad file %s", g_psv.resourcelist[c - 1].szFileName); // only filename. reason was printed in console if exists.
|
||||
}
|
||||
#else // REHLDS_FIXES
|
||||
if (gEntityInterface.pfnInconsistentFile(host_client->edict, g_psv.resourcelist[c - 1].szFileName, dropmessage))
|
||||
{
|
||||
if (Q_strlen(dropmessage) > 0)
|
||||
SV_ClientPrintf("%s", dropmessage);
|
||||
|
||||
SV_DropClient(host_client, 0, "Bad file %s", dropmessage);
|
||||
}
|
||||
#endif // REHLDS_FIXES
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
@ -230,7 +244,7 @@ void SV_ParseConsistencyResponse(client_t *pSenderClient)
|
||||
/* <bf937> ../engine/sv_user.c:267 */
|
||||
qboolean SV_FileInConsistencyList(const char *filename, consistency_t **ppconsist)
|
||||
{
|
||||
for (int i = 0; i < 512; i++)
|
||||
for (int i = 0; i < ARRAYSIZE(g_psv.consistency_list); i++)
|
||||
{
|
||||
if (!g_psv.consistency_list[i].filename)
|
||||
return 0;
|
||||
@ -277,10 +291,6 @@ int SV_TransferConsistencyInfo(void)
|
||||
|
||||
if (r->type == t_model)
|
||||
{
|
||||
if (pc->check_type <= 0 || pc->check_type > 3)
|
||||
{
|
||||
|
||||
}
|
||||
if (pc->check_type == force_model_samebounds)
|
||||
{
|
||||
vec3_t mins;
|
||||
@ -1784,8 +1794,16 @@ void SV_FullUpdate_f(void)
|
||||
return;
|
||||
}
|
||||
s_LastFullUpdate[entIndex] = g_psv.time;
|
||||
|
||||
#ifdef REHLDS_FIXES
|
||||
// it's not need until not active
|
||||
SV_ForceFullClientsUpdate();
|
||||
gEntityInterface.pfnClientCommand( sv_player );
|
||||
#endif // REHLDS_FIXES
|
||||
}
|
||||
|
||||
#ifndef REHLDS_FIXES
|
||||
SV_ForceFullClientsUpdate();
|
||||
gEntityInterface.pfnClientCommand(sv_player);
|
||||
#endif // REHLDS_FIXES
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user