summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorMichael Smith <mikesmiffy128@gmail.com>2022-04-26 04:43:02 +0100
committerMichael Smith <mikesmiffy128@gmail.com>2022-04-26 14:49:29 +0100
commitbdb4453a8fbe87247bfd6caf19a7d643144c0f84 (patch)
treed3362cf95afdb05f16d2cec00940a904b384dcba
parent1ceb3c78135c03f76209a0032baed3ed669d6b9e (diff)
Reorganise sst.c, add Portal 1 game type
-rw-r--r--src/gametype.h5
-rw-r--r--src/sst.c199
2 files changed, 102 insertions, 102 deletions
diff --git a/src/gametype.h b/src/gametype.h
index 3ad93b7..ff39785 100644
--- a/src/gametype.h
+++ b/src/gametype.h
@@ -29,8 +29,9 @@ extern u32 _gametype_tag;
#define _gametype_tag_L4D1 8
#define _gametype_tag_L4D2 16
#define _gametype_tag_L4DS 32
-#define _gametype_tag_Portal2 64
-#define _gametype_tag_2013 128
+#define _gametype_tag_Portal1 64
+#define _gametype_tag_Portal2 128
+#define _gametype_tag_2013 256
#define _gametype_tag_L4D (_gametype_tag_L4D1 | _gametype_tag_L4D2)
// XXX: *stupid* naming, refactor later (damn Survivors ruining everything)
diff --git a/src/sst.c b/src/sst.c
index 733e127..2ba0f90 100644
--- a/src/sst.c
+++ b/src/sst.c
@@ -42,104 +42,18 @@
#define fS "s"
#endif
-#define RGBA(r, g, b, a) (&(struct con_colour){(r), (g), (b), (a)})
-
u32 _gametype_tag = 0; // spaghetti: no point making a .c file for 1 variable
-static int ifacever;
-// this is where we start dynamically adding virtual functions, see vtable[]
-// array below
-static const void **vtable_firstdiff;
-static const void *const *const plugin_obj;
+ifacefactory factory_client = 0, factory_server = 0, factory_engine = 0,
+ factory_inputsystem = 0;
-// most plugin callbacks are unused - define dummy functions for each signature
-static void VCALLCONV nop_v_v(void *this) {}
-static void VCALLCONV nop_b_v(void *this, bool b) {}
-static void VCALLCONV nop_p_v(void *this, void *p) {}
-static void VCALLCONV nop_pp_v(void *this, void *p1, void *p2) {}
-static void VCALLCONV nop_pii_v(void *this, void *p, int i1, int i2) {}
-static int VCALLCONV nop_p_i(void *this, void *p) { return 0; }
-static int VCALLCONV nop_pp_i(void *this, void *p1, void *p2) { return 0; }
-static int VCALLCONV nop_5pi_i(void *this, void *p1, void *p2, void *p3,
- void *p4, void *p5, int i) { return 0; }
-static void VCALLCONV nop_ipipp_v(void *this, int i1, void *p1, int i2,
- void *p2, void *p3) {}
+static int ifacever;
#ifdef __linux__
// we need to keep this reference to dlclose() it later - see below
static void *clientlib = 0;
#endif
-// more source spaghetti wow!
-static void VCALLCONV SetCommandClient(void *this, int i) { con_cmdclient = i; }
-
-ifacefactory factory_client = 0, factory_server = 0, factory_engine = 0,
- factory_inputsystem = 0;
-
-// TODO(featgen): I wanted some nice fancy automatic feature system that
-// figures out the dependencies at build time and generates all the init glue
-// but we want to actually release the plugin this decade so for now I'm just
-// plonking some bools here and worrying about it later. :^)
-static bool has_autojump = false;
-static bool has_demorec = false;
-static bool has_demorec_custom = false;
-static bool has_nosleep = false;
-#ifdef _WIN32
-static bool has_rinput = false;
-#endif
-
-// since this is static/global, it only becomes false again when the plugin SO
-// is unloaded/reloaded
-static bool already_loaded = false;
-static bool skip_unload = false;
-
-// HACK: later versions of L4D2 show an annoying dialog on every plugin_load.
-// We can suppress this by catching the message string that's passed from
-// engine.dll to gameui.dll through KeyValuesSystem in vstdlib.dll and just
-// replacing it with some other arbitrary garbage string. This makes gameui fail
-// to match the message and thus do nothing. :)
-static void **kvsvt;
-typedef const char *(*VCALLCONV GetStringForSymbol_func)(void *this, int s);
-static GetStringForSymbol_func orig_GetStringForSymbol = 0;
-static const char *VCALLCONV GetStringForSymbol_hook(void *this, int s) {
- const char *ret = orig_GetStringForSymbol(this, s);
- if (!strcmp(ret, "OnClientPluginWarning")) ret = "sstBlockedThisEvent";
- return ret;
-}
-
-// vstdlib symbol, only currently used in l4d2 but exists everywhere so oh well
-IMPORT void *KeyValuesSystem(void);
-
-// XXX: not sure if all this stuff should, like, go somewhere?
-
-struct CUtlMemory {
- void *mem;
- int alloccnt;
- int growsz;
-};
-
-struct CUtlVector {
- struct CUtlMemory m;
- int sz;
- void *mem_again_for_some_reason;
-};
-
-struct CServerPlugin /* : IServerPluginHelpers */ {
- void **vtable;
- struct CUtlVector plugins;
- /*IPluginHelpersCheck*/ void *pluginhlpchk;
-};
-
-struct CPlugin {
- char description[128];
- bool paused;
- void *theplugin; // our own "this" pointer (or whichever other plugin it is)
- int ifacever;
- // should be the plugin library, but in old Source branches it's just null,
- // because CServerPlugin::Load() erroneously shadows this field with a local
- void *module;
-};
-
#ifdef _WIN32
extern long __ImageBase; // this is actually the PE header struct but don't care
#define ownhandle() ((void *)&__ImageBase)
@@ -231,6 +145,65 @@ DEF_CCMD_HERE(sst_autoload_disable, "Stop loading SST on game startup", 0) {
}
}
+DEF_CCMD_HERE(sst_printversion, "Display plugin version information", 0) {
+ con_msg("v" VERSION "\n");
+}
+
+// HACK: later versions of L4D2 show an annoying dialog on every plugin_load.
+// We can suppress this by catching the message string that's passed from
+// engine.dll to gameui.dll through KeyValuesSystem in vstdlib.dll and just
+// replacing it with some other arbitrary garbage string. This makes gameui fail
+// to match the message and thus do nothing. :)
+static void **kvsvt;
+typedef const char *(*VCALLCONV GetStringForSymbol_func)(void *this, int s);
+static GetStringForSymbol_func orig_GetStringForSymbol = 0;
+static const char *VCALLCONV GetStringForSymbol_hook(void *this, int s) {
+ const char *ret = orig_GetStringForSymbol(this, s);
+ if (!strcmp(ret, "OnClientPluginWarning")) ret = "sstBlockedThisEvent";
+ return ret;
+}
+
+// vstdlib symbol, only currently used in l4d2 but exists everywhere so oh well
+IMPORT void *KeyValuesSystem(void);
+
+// most plugin callbacks are unused - define dummy functions for each signature
+static void VCALLCONV nop_v_v(void *this) {}
+static void VCALLCONV nop_b_v(void *this, bool b) {}
+static void VCALLCONV nop_p_v(void *this, void *p) {}
+static void VCALLCONV nop_pp_v(void *this, void *p1, void *p2) {}
+static void VCALLCONV nop_pii_v(void *this, void *p, int i1, int i2) {}
+static int VCALLCONV nop_p_i(void *this, void *p) { return 0; }
+static int VCALLCONV nop_pp_i(void *this, void *p1, void *p2) { return 0; }
+static int VCALLCONV nop_5pi_i(void *this, void *p1, void *p2, void *p3,
+ void *p4, void *p5, int i) { return 0; }
+static void VCALLCONV nop_ipipp_v(void *this, int i1, void *p1, int i2,
+ void *p2, void *p3) {}
+
+// more source spaghetti wow!
+static void VCALLCONV SetCommandClient(void *this, int i) { con_cmdclient = i; }
+
+// this is where we start dynamically adding virtual functions, see vtable[]
+// array below
+static const void **vtable_firstdiff;
+static const void *const *const plugin_obj;
+
+// TODO(featgen): I wanted some nice fancy automatic feature system that
+// figures out the dependencies at build time and generates all the init glue
+// but we want to actually release the plugin this decade so for now I'm just
+// plonking some bools here and worrying about it later. :^)
+static bool has_autojump = false, has_demorec = false,
+ has_demorec_custom = false, has_nosleep = false;
+#ifdef _WIN32
+static bool has_rinput = false;
+#endif
+
+// since this is static/global, it only becomes false again when the plugin SO
+// is unloaded/reloaded
+static bool already_loaded = false;
+static bool skip_unload = false;
+
+#define RGBA(r, g, b, a) (&(struct con_colour){(r), (g), (b), (a)})
+
static bool do_load(ifacefactory enginef, ifacefactory serverf) {
factory_engine = enginef; factory_server = serverf;
if (!con_init(enginef, ifacever)) return false;
@@ -283,6 +256,10 @@ static bool do_load(ifacefactory enginef, ifacefactory serverf) {
con_warn("sst: warning: couldn't get input system's CreateInterface\n");
}
+ // detect p1 for the benefit of specific features
+ if (!GAMETYPE_MATCHES(Portal2) && con_findcmd("upgrade_portalgun")) {
+ _gametype_tag |= _gametype_tag_Portal1;
+ }
gamedata_init();
has_autojump = autojump_init();
has_demorec = demorec_init();
@@ -314,6 +291,34 @@ e: con_colourmsg(RGBA(64, 255, 64, 255),
return true;
}
+// XXX: not sure if all this stuff should, like, go somewhere?
+
+struct CUtlMemory {
+ void *mem;
+ int alloccnt, growsz;
+};
+struct CUtlVector {
+ struct CUtlMemory m;
+ int sz;
+ void *mem_again_for_some_reason;
+};
+
+struct CServerPlugin /* : IServerPluginHelpers */ {
+ void **vtable;
+ struct CUtlVector plugins;
+ /*IPluginHelpersCheck*/ void *pluginhlpchk;
+};
+
+struct CPlugin {
+ char description[128];
+ bool paused;
+ void *theplugin; // our own "this" pointer (or whichever other plugin it is)
+ int ifacever;
+ // should be the plugin library, but in old Source branches it's just null,
+ // because CServerPlugin::Load() erroneously shadows this field with a local
+ void *module;
+};
+
static void do_unload(void) {
struct CServerPlugin *pluginhandler =
factory_engine("ISERVERPLUGINHELPERS001", 0);
@@ -324,9 +329,10 @@ static void do_unload(void) {
if ((*pp)->theplugin == (void *)&plugin_obj) {
// see comment in CPlugin above. setting this to the real handle
// right before the engine tries to unload us allows it to
- // actually unload us instead of just doing nothing.
- // in newer branches that don't have this bug, this is still
- // correct anyway so no need to bother checking.
+ // actually do so. in newer branches this is redundant but
+ // doesn't do any harm so it's just unconditional.
+ // NOTE: old engines ALSO just leak the handle and never call
+ // Unload() if Load() fails; can't really do anything about that
(*pp)->module = ownhandle();
break;
}
@@ -365,10 +371,7 @@ static bool VCALLCONV Load(void *this, ifacefactory enginef,
static void VCALLCONV Unload(void *this) {
// the game tries to unload on a failed load, for some reason
- if (skip_unload) {
- skip_unload = false;
- return;
- }
+ if (skip_unload) { skip_unload = false; return; }
do_unload();
}
@@ -383,10 +386,6 @@ static const char *VCALLCONV GetPluginDescription(void *this) {
return LONGNAME " v" VERSION;
}
-DEF_CCMD_HERE(sst_printversion, "Display plugin version information", 0) {
- con_msg("v" VERSION "\n");
-}
-
#define MAX_VTABLE_FUNCS 21
static const void *vtable[MAX_VTABLE_FUNCS] = {
// start off with the members which (thankfully...) are totally stable