diff options
-rw-r--r-- | gamedata/engine.kv | 1 | ||||
-rw-r--r-- | src/sst.c | 24 |
2 files changed, 25 insertions, 0 deletions
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 @@ -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 |