Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

CSQC: Initial support. (aka antilag 1 stuffs) #147

Draft
wants to merge 4 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -170,6 +170,7 @@ target_compile_definitions(${PROJECT_NAME} PRIVATE USE_PR2)
target_compile_definitions(${PROJECT_NAME} PRIVATE MVD_PEXT1_SERVERSIDEWEAPON)
target_compile_definitions(${PROJECT_NAME} PRIVATE MVD_PEXT1_SERVERSIDEWEAPON2)
target_compile_definitions(${PROJECT_NAME} PRIVATE FTE_PEXT2_VOICECHAT)
target_compile_definitions(${PROJECT_NAME} PRIVATE FTE_PEXT_ACCURATETIMINGS=0x40)

include (TestBigEndian)
TEST_BIG_ENDIAN(IS_BIG_ENDIAN)
Expand Down
81 changes: 56 additions & 25 deletions src/pr2_cmds.c
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,9 @@
const char *pr2_ent_data_ptr;
vm_t *sv_vm = NULL;
extern gameData_t gamedata;
#ifdef FTE_PEXT_CSQC
extern sizebuf_t *csqcmsgbuffer;
#endif

static int PASSFLOAT(float f)
{
Expand Down Expand Up @@ -167,61 +170,64 @@ void PR2_CheckEmptyString(char *s)
PR2_RunError("Bad string");
}

void PF2_precache_sound(char *s)
int PF2_precache_sound(char *s)
{
int i;

if (sv.state != ss_loading)
PR2_RunError("PF_Precache_*: Precache can only be done in spawn "
"functions");
PR2_CheckEmptyString(s);

for (i = 0; i < MAX_SOUNDS; i++)
{
if (!sv.sound_precache[i])
{
if (sv.state != ss_loading)
{
PR2_RunError("PF_Precache_*: Precache can only add new sounds in spawn "
"functions");
}
sv.sound_precache[i] = s;
return;
return i;
}
if (!strcmp(sv.sound_precache[i], s))
return;
return i;
}

PR2_RunError ("PF_precache_sound: overflow");

return 0;
}

void PF2_precache_model(char *s)
int PF2_precache_model(char *s)
{
int i;

if (sv.state != ss_loading)
PR2_RunError("PF_Precache_*: Precache can only be done in spawn "
"functions");

PR2_CheckEmptyString(s);

for (i = 0; i < MAX_MODELS; i++)
{
if (!sv.model_precache[i])
{
if (sv.state != ss_loading)
{
PR2_RunError("PF_Precache_*: Precache can only add new models in spawn "
"functions");
}
sv.model_precache[i] = s;
return;
return i;
}
if (!strcmp(sv.model_precache[i], s))
return;
return i;
}

PR2_RunError ("PF_precache_model: overflow");

return 0;
}

intptr_t PF2_precache_vwep_model(char *s)
{
int i;

if (sv.state != ss_loading)
PR2_RunError("PF_Precache_*: Precache can only be done in spawn "
"functions");

PR2_CheckEmptyString(s);

// the strings are transferred via the stufftext mechanism, hence the stringency
Expand All @@ -231,9 +237,16 @@ intptr_t PF2_precache_vwep_model(char *s)
for (i = 0; i < MAX_VWEP_MODELS; i++)
{
if (!sv.vw_model_name[i]) {
if (sv.state != ss_loading)
{
PR2_RunError("PF_Precache_*: Precache can only add new vweps in spawn "
"functions");
}
sv.vw_model_name[i] = s;
return i;
}
if (!strcmp(sv.vw_model_name[i], s))
return i;
}
PR2_RunError ("PF_precache_vwep_model: overflow");
return 0;
Expand Down Expand Up @@ -1219,9 +1232,7 @@ sizebuf_t *WriteDest2(int dest)
return &sv.multicast;

case MSG_CSQC:
// Should return a reference to the CSQC message buffer managed in sv_ents.c
PR2_RunError("PF_Write_*: MSG_CSQC not implemented yet.");
return NULL;
return csqcmsgbuffer;

default:
PR2_RunError ("WriteDest: bad destination");
Expand Down Expand Up @@ -2003,7 +2014,29 @@ intptr_t PF2_FS_GetFileList(char *path, char *ext,
#ifdef FTE_PEXT_CSQC
intptr_t EXT_SetSendNeeded(intptr_t *args)
{
PR2_RunError("SetSendNeeded not implemented yet.");
unsigned int subject = args[1];
unsigned int fl = args[2];
unsigned int to = args[3];

if (!to)
{ //broadcast
for (to = 0; to < MAX_CLIENTS; to++)
{
svs.clients[to].csqcentitysendflags[subject] |= fl;
}
}
else
{
to--;
if (to >= MAX_CLIENTS)
{
; //some kind of error.
}
else
{
svs.clients[to].csqcentitysendflags[subject] |= fl;
}
}
return 0;
}
#endif
Expand Down Expand Up @@ -2578,11 +2611,9 @@ intptr_t PR2_GameSystemCalls(intptr_t *args) {
ED_Free(VME(1));
return 0;
case G_PRECACHE_SOUND:
PF2_precache_sound(VMA(1));
return 0;
return PF2_precache_sound(VMA(1));
case G_PRECACHE_MODEL:
PF2_precache_model(VMA(1));
return 0;
return PF2_precache_model(VMA(1));
case G_LIGHTSTYLE:
PF2_lightstyle(args[1], VMA(2));
return 0;
Expand Down
33 changes: 33 additions & 0 deletions src/server.h
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,7 @@ typedef struct
int static_entity_count;
#ifdef FTE_PEXT_CSQC
unsigned int csqcchecksum;
unsigned short csqcsendstates[MAX_EDICTS];
#endif
} server_t;

Expand Down Expand Up @@ -187,6 +188,24 @@ typedef struct
#define MAX_WEAPONSWITCH_OPTIONS 10
#endif

#ifdef FTE_PEXT_CSQC
// code adapted from Darkplaces
#define SCOPE_WANTREMOVE 1 // Set if a remove has been scheduled.
#define SCOPE_WANTUPDATE 2 // Set if an update has been scheduled.
#define SCOPE_WANTSEND (SCOPE_WANTREMOVE | SCOPE_WANTUPDATE)
#define SCOPE_EXISTED_ONCE 4 // Set if the entity once existed. All these get resent on a full loss.
#define SCOPE_ASSUMED_EXISTING 8 // Set if the entity is currently assumed existing and therefore needs removes.

#define NUM_CSQCENTITIES_PER_FRAME 256
typedef struct csqcentityframedb_s
{
int framenum;
int num;
unsigned short entno[NUM_CSQCENTITIES_PER_FRAME];
int sendflags[NUM_CSQCENTITIES_PER_FRAME];
} csqcentityframedb_t;
#endif

typedef struct client_s
{
sv_client_state_t state;
Expand Down Expand Up @@ -350,6 +369,16 @@ typedef struct client_s

#ifdef FTE_PEXT_CSQC
qbool csqcactive;
int csqc_framenum;
int csqc_latestverified;
int csqcnumedicts;
unsigned char csqcentityscope[MAX_EDICTS];
unsigned int csqcentitysendflags[MAX_EDICTS];

#define NUM_CSQCENTITYDB_FRAMES UPDATE_MASK//256
csqcentityframedb_t csqcentityframehistory[NUM_CSQCENTITYDB_FRAMES];
int csqcentityframehistory_next;
int csqcentityframe_lastreset;
#endif

//===== NETWORK ============
Expand Down Expand Up @@ -922,6 +951,10 @@ void SV_KickClient(client_t* client, const char* reason);
//
void SV_WriteEntitiesToClient (client_t *client, sizebuf_t *msg, qbool recorder);
void SV_SetVisibleEntitiesForBot (client_t* client);
#ifdef FTE_PEXT_CSQC
int SV_EmitCSQCUpdate(client_t *client, sizebuf_t *msg, int maxsize, int entlist_size, const unsigned short *entlist);
void EntityFrameCSQC_LostFrame(client_t *client, int framenum);
#endif

//
// sv_nchan.c
Expand Down
Loading