From fb9720610488c2d8da1bd77739b01d8275735b49 Mon Sep 17 00:00:00 2001 From: Michael Smith Date: Mon, 16 May 2022 22:15:53 +0100 Subject: Add a quick stopgap hack for Portal purposes People want to be able to write a scheduled-release passphrase to demos to prove that said demos were recorded during a timeboxed event. Ideally this is something that'd be part of the custom demo data and general RTA run management stuff that's planned, but of course that doesn't exist yet. When it does exist, we'd probably want rid of this nonsense, so it's marked hidden and I don't plan to document it anywhere "official." It's just here for people who really need it in the short term. --- gamedata/engine.kv | 1 + src/sst.c | 24 ++++++++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/gamedata/engine.kv b/gamedata/engine.kv index 80caa74..840f9a1 100644 --- a/gamedata/engine.kv +++ b/gamedata/engine.kv @@ -40,6 +40,7 @@ vtidx_GetEngineBuildNumber { // VEngineServer vtidx_PEntityOfEntIndex { OrangeBox 19 } // probably OE too but??? +vtidx_ServerCommand { OrangeBoxbased 36 } sz_edict { default 20 diff --git a/src/sst.c b/src/sst.c index edd083f..3ad48cc 100644 --- a/src/sst.c +++ b/src/sst.c @@ -385,11 +385,35 @@ static const char *VCALLCONV GetPluginDescription(void *this) { return LONGNAME " v" VERSION; } +DECL_VFUNC_DYN(void, ServerCommand, const char *) + +// XXX: quick hack requested by Portal people for some timeboxed IL grind +// challenge they want to do. I think this is a terribly sad way to do this but +// at the same time it's easy and low-impact so put it in as hidden for now +// until we come up with something better later. +DEF_CVAR(_sst_onload_echo, "EXPERIMENTAL! Don't rely on this existing!", "", + CON_HIDDEN) + static void VCALLCONV ClientActive(void *this, struct edict *player) { // XXX: it's kind of dumb that we get handed the edict here then go look it // up again in fov.c but I can't be bothered refactoring any further now // that this finally works, do something later lol if (has_fov) fov_onload(); + + // continuing dumb portal hack. didn't even seem worth adding a feature for + if (has_vtidx_ServerCommand && con_getvarstr(_sst_onload_echo)[0]) { + char *s = malloc(8 + _sst_onload_echo->strlen); // dumb lol + if (s) { // if not, game probably exploded already + memcpy(s, "echo \"", 6); + // note: assume there's no quotes in the variable, because there + // should be no way to do this at least via console + memcpy(s + 6, con_getvarstr(_sst_onload_echo), + _sst_onload_echo->strlen); + memcpy(s + 6 + _sst_onload_echo->strlen - 1, "\"\n", 3); + VCALL(engserver, ServerCommand, s); + free(s); + } + } } #define MAX_VTABLE_FUNCS 21 -- cgit v1.2.3