Skip to content

Commit

Permalink
Merge pull request #392 from qw-ctf/csqc-bits-and-pieces
Browse files Browse the repository at this point in the history
CSQC: Add some building blocks to reduce antilag diff.
  • Loading branch information
dsvensson authored Feb 2, 2025
2 parents 93d80e4 + 1d5aa36 commit 91cf808
Show file tree
Hide file tree
Showing 8 changed files with 87 additions and 0 deletions.
1 change: 1 addition & 0 deletions include/g_local.h
Original file line number Diff line number Diff line change
Expand Up @@ -221,6 +221,7 @@ enum
G_MAPEXTFIELDPTR,
G_SETEXTFIELDPTR,
G_GETEXTFIELDPTR,
G_SETSENDNEEDED,
G_EXTENSIONS_LAST
};
extern qbool haveextensiontab[G_EXTENSIONS_LAST-G_EXTENSIONS_FIRST];
Expand Down
2 changes: 2 additions & 0 deletions include/g_public.h
Original file line number Diff line number Diff line change
Expand Up @@ -189,6 +189,8 @@ typedef enum
GAME_CLIENT_SAY, // ( int isTeamSay );
GAME_PAUSED_TIC, // ( int duration_msec ); // duration is in msecs
GAME_CLEAR_EDICT, // (self)

GAME_EDICT_CSQCSEND = 200, //entrypoint, called when using SendEntity
} gameExport_t;

typedef enum
Expand Down
4 changes: 4 additions & 0 deletions include/g_syscalls.h
Original file line number Diff line number Diff line change
Expand Up @@ -149,11 +149,15 @@ int trap_GetExtField(gedict_t *ed, const char *fieldname);
intptr_t trap_MapExtFieldPtr(const char *fieldname);
intptr_t trap_SetExtFieldPtr(gedict_t *ed, intptr_t fieldref, intptr_t *data, intptr_t size);
intptr_t trap_GetExtFieldPtr(gedict_t *ed, intptr_t fieldref, intptr_t *data, intptr_t size);
intptr_t trap_SetSendNeeded(intptr_t subject, intptr_t flags, intptr_t to);

// Checks for server support before call
void ExtFieldSetAlpha(gedict_t *ed, float alpha);
float ExtFieldGetAlpha(gedict_t *ed);
void ExtFieldSetColorMod(gedict_t *ed, float r, float g, float b);
void ExtFieldSetSendEntity(gedict_t *ed, func_t callback);
void ExtFieldSetPvsFlags(gedict_t *ed, float pvsflags);
void SetSendNeeded(gedict_t *ed, int sendflags, int unicast);

void trap_changelevelHub(const char *name, const char *entityname, const char *startspot);
int trap_URI_Query(const char *uri, int vmentry/*GAME_...*/, void *cbcontext, const char *mimetype, const char *data, size_t datasize);
Expand Down
4 changes: 4 additions & 0 deletions include/progs.h
Original file line number Diff line number Diff line change
Expand Up @@ -1235,6 +1235,10 @@ typedef struct gedict_s
float healmax; // maximum health see triggers.c for defaults
float healtimer; // internal timer for tracking health replenishment interval
// }

// { csqc
func_t SendEntity;
// }
} gedict_t;

typedef enum
Expand Down
12 changes: 12 additions & 0 deletions src/g_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -428,6 +428,17 @@ intptr_t VISIBILITY_VISIBLE vmMain(
// Don't ClearGlobals() as this will be called during spawn()
initialise_spawned_ent(PROG_TO_EDICT(g_globalvars.self));

return 0;

case GAME_EDICT_CSQCSEND:
self = PROG_TO_EDICT(g_globalvars.self);
other = PROG_TO_EDICT(g_globalvars.other);

if (self->SendEntity)
{
return ((int(*)(int))(self->SendEntity))(arg0);
}

return 0;
}

Expand Down Expand Up @@ -649,6 +660,7 @@ static qbool G_InitExtensions(void)
{"MapExtFieldPtr", G_MAPEXTFIELDPTR},
{"SetExtFieldPtr", G_SETEXTFIELDPTR},
{"GetExtFieldPtr", G_GETEXTFIELDPTR},
{"setsendneeded", G_SETSENDNEEDED},
};
int i;
for (i = 0; i < sizeof(exttraps)/sizeof(exttraps[0]); i++)
Expand Down
1 change: 1 addition & 0 deletions src/g_syscalls.asm
Original file line number Diff line number Diff line change
Expand Up @@ -119,3 +119,4 @@ equ trap_pointerstat -265
equ trap_MapExtFieldPtr -266
equ trap_SetExtFieldPtr -267
equ trap_GetExtFieldPtr -268
equ trap_SetSendNeeded -269
5 changes: 5 additions & 0 deletions src/g_syscalls.c
Original file line number Diff line number Diff line change
Expand Up @@ -529,3 +529,8 @@ int trap_pointerstat(int statidx, int stattype, void *offset)
{
return syscall(G_POINTERSTAT, statidx, stattype, (intptr_t)offset);
}

intptr_t trap_SetSendNeeded(intptr_t subject, intptr_t flags, intptr_t to)
{
return syscall(G_SETSENDNEEDED, subject, flags, to);
}
58 changes: 58 additions & 0 deletions src/g_syscalls_extra.c
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ typedef union fi_s

static unsigned int field_ref_alpha = 0;
static unsigned int field_ref_colormod = 0;
static unsigned int field_ref_sendentity = 0;
static unsigned int field_ref_pvsflags = 0;

void ExtFieldSetAlpha(gedict_t *ed, float alpha)
{
Expand Down Expand Up @@ -75,3 +77,59 @@ void ExtFieldSetColorMod(gedict_t *ed, float r, float g, float b)
G_bprint(PRINT_HIGH, "colormod needs MapExtFieldPtr and SetExtFieldPtr support in server\n");
}
}

void ExtFieldSetSendEntity(gedict_t *ed, func_t callback)
{
if (!field_ref_sendentity && HAVEEXTENSION(G_MAPEXTFIELDPTR) && HAVEEXTENSION(G_SETEXTFIELDPTR))
{
field_ref_sendentity = trap_MapExtFieldPtr("SendEntity");
}
if (field_ref_sendentity)
{
int enable = 1;
trap_SetExtFieldPtr(ed, field_ref_sendentity, (void*)&enable, sizeof(int));
ed->SendEntity = callback; // invoked via GAME_EDICT_CSQCSEND

}
else if (HAVEEXTENSION(G_SETEXTFIELD))
{
trap_SetExtField(ed, "SendEntity", 1);
ed->SendEntity = callback; // invoked via GAME_EDICT_CSQCSEND
}
else if (cvar("developer"))
{
G_bprint(PRINT_HIGH, "SendEntity needs SetExtField or MapExtFieldPtr and SetExtFieldPtr support in server\n");
}
}

void ExtFieldSetPvsFlags(gedict_t *ed, float pvsflags)
{
if (!field_ref_pvsflags && HAVEEXTENSION(G_MAPEXTFIELDPTR) && HAVEEXTENSION(G_SETEXTFIELDPTR))
{
field_ref_pvsflags = trap_MapExtFieldPtr("pvsflags");
}
if (field_ref_pvsflags)
{
trap_SetExtFieldPtr(ed, field_ref_pvsflags, (void*)&pvsflags, sizeof(float));
}
else if (HAVEEXTENSION(G_SETEXTFIELD))
{
fi_t tmp;
tmp._float = pvsflags;
trap_SetExtField(ed, "pvsflags", tmp._int);
}
else if (cvar("developer"))
{
G_bprint(PRINT_HIGH, "pvsflags needs SetExtField or MapExtFieldPtr and SetExtFieldPtr support in server\n");
}
}

void SetSendNeeded(gedict_t *ed, int sendflags, int unicast)
{
if (!HAVEEXTENSION(G_SETSENDNEEDED))
{
G_bprint(PRINT_HIGH, "SetSendNeeded needs support in server\n");
return;
}
trap_SetSendNeeded(NUM_FOR_EDICT(ed), sendflags, unicast);
}

0 comments on commit 91cf808

Please sign in to comment.