From 22bf7ee4050333fc9f4985621e4ee95e5f1512c2 Mon Sep 17 00:00:00 2001 From: Daniel Svensson Date: Wed, 20 Nov 2024 19:24:31 +0100 Subject: [PATCH 1/3] SYSCALL: Add SetSendNeeded. --- include/g_local.h | 1 + include/g_syscalls.h | 2 ++ src/g_main.c | 1 + src/g_syscalls.asm | 1 + src/g_syscalls.c | 5 +++++ src/g_syscalls_extra.c | 10 ++++++++++ 6 files changed, 20 insertions(+) diff --git a/include/g_local.h b/include/g_local.h index 4b9514f2..121f488e 100644 --- a/include/g_local.h +++ b/include/g_local.h @@ -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]; diff --git a/include/g_syscalls.h b/include/g_syscalls.h index 65da7cd6..d82cd9a5 100644 --- a/include/g_syscalls.h +++ b/include/g_syscalls.h @@ -149,11 +149,13 @@ 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 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); diff --git a/src/g_main.c b/src/g_main.c index 32b95051..61eb07c1 100644 --- a/src/g_main.c +++ b/src/g_main.c @@ -649,6 +649,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++) diff --git a/src/g_syscalls.asm b/src/g_syscalls.asm index f4d178ed..4c2d0ac8 100644 --- a/src/g_syscalls.asm +++ b/src/g_syscalls.asm @@ -119,3 +119,4 @@ equ trap_pointerstat -265 equ trap_MapExtFieldPtr -266 equ trap_SetExtFieldPtr -267 equ trap_GetExtFieldPtr -268 +equ trap_SetSendNeeded -269 diff --git a/src/g_syscalls.c b/src/g_syscalls.c index babcd72b..405f00d5 100644 --- a/src/g_syscalls.c +++ b/src/g_syscalls.c @@ -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); +} diff --git a/src/g_syscalls_extra.c b/src/g_syscalls_extra.c index 835ef5ba..1d2c395c 100644 --- a/src/g_syscalls_extra.c +++ b/src/g_syscalls_extra.c @@ -75,3 +75,13 @@ 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 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); +} From 44fa0b287a087edff7fd8c047114a887ab58d698 Mon Sep 17 00:00:00 2001 From: Daniel Svensson Date: Wed, 20 Nov 2024 20:09:51 +0100 Subject: [PATCH 2/3] PR2: Add support for CSQCSEND via SendEntity. --- include/g_public.h | 2 ++ include/progs.h | 4 ++++ src/g_main.c | 11 +++++++++++ 3 files changed, 17 insertions(+) diff --git a/include/g_public.h b/include/g_public.h index 91d09bbe..af27bfa3 100644 --- a/include/g_public.h +++ b/include/g_public.h @@ -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 diff --git a/include/progs.h b/include/progs.h index 47ff16bf..cbdfa1d8 100644 --- a/include/progs.h +++ b/include/progs.h @@ -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 diff --git a/src/g_main.c b/src/g_main.c index 61eb07c1..415564fa 100644 --- a/src/g_main.c +++ b/src/g_main.c @@ -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; } From 1d5aa36e78859da0ad81fce7f9bbd57fb1b90ed1 Mon Sep 17 00:00:00 2001 From: Daniel Svensson Date: Wed, 20 Nov 2024 20:21:06 +0100 Subject: [PATCH 3/3] FIELD: Add support for SendEntity and pvsflags. --- include/g_syscalls.h | 2 ++ src/g_syscalls_extra.c | 48 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+) diff --git a/include/g_syscalls.h b/include/g_syscalls.h index d82cd9a5..43fa285a 100644 --- a/include/g_syscalls.h +++ b/include/g_syscalls.h @@ -155,6 +155,8 @@ intptr_t trap_SetSendNeeded(intptr_t subject, intptr_t flags, intptr_t to); 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); diff --git a/src/g_syscalls_extra.c b/src/g_syscalls_extra.c index 1d2c395c..508f0845 100644 --- a/src/g_syscalls_extra.c +++ b/src/g_syscalls_extra.c @@ -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) { @@ -76,6 +78,52 @@ void ExtFieldSetColorMod(gedict_t *ed, float r, float g, float b) } } +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))