Plugins: Use our own plugins.txt listing to decide which plugins get loaded...

This commit is contained in:
Marco Cawthorne 2020-08-14 21:16:47 +02:00
parent bb22097203
commit 96c3590a08
2 changed files with 123 additions and 34 deletions

View file

@ -32,6 +32,11 @@ void
ChatPlay(int id)
{
int r, count, flags;
if (!emitter) {
emitter = spawn();
}
count = tokenizebyseparator(g_table[id].sample, ";");
r = random(0, count);
flags = SOUNDFLAG_NOREVERB; /* this should be enough for now */
@ -56,17 +61,23 @@ ChatLookUp(string cmd)
return autocvar_chatplug_suppresschat == 1 ? TRUE : FALSE;
}
void
initents(void)
/* plugin hook */
int
FMX_ParseClientCommand(string cmd)
{
/* why waste entity slots? */
if (g_sounds > 0) {
emitter = spawn();
tokenize(cmd);
switch (argv(0)) {
case "say":
return ChatLookUp(strtolower(argv(1)));
break;
default:
return FALSE;
}
return TRUE;
}
void
init(float prevprogs)
FMX_Init(void)
{
string temp;
int i = 0;
@ -74,11 +85,11 @@ init(float prevprogs)
filestream chatfile;
searchhandle list;
list = search_begin("plugins/chatsounds/*.txt", TRUE, TRUE);
/*list = search_begin("plugins/chatsounds/*.txt", TRUE, TRUE);
for (int i = 0; i < search_getsize(list); i++) {
print(sprintf("Found %s\n", search_getfilename(list, i)));
}
search_end(list);
search_end(list);*/
chatfile = fopen("chatsounds.txt", FILE_READ);
@ -114,18 +125,3 @@ init(float prevprogs)
}
fclose(chatfile);
}
/* plugin hook */
int
FMX_ParseClientCommand(string cmd)
{
tokenize(cmd);
switch (argv(0)) {
case "say":
return ChatLookUp(strtolower(argv(1)));
break;
default:
return FALSE;
}
return TRUE;
}

View file

@ -17,14 +17,73 @@
var int g_plugins_enabled;
var int autocvar_sv_plugins = 1;
void Plugin_Init(void)
typedef struct
{
string m_strPath;
float m_flProgsID;
} plugin_t;
plugin_t *g_plugindb;
var int g_plugincount;
void
Plugin_Init(void)
{
filestream pdb;
string tmp;
int i;
if (autocvar_sv_plugins) {
iprint("Initializing Plugins");
g_plugins_enabled = 1;
} else {
g_plugins_enabled = 0;
return;
}
pdb = fopen("plugins.txt", FILE_READ);
if (pdb < 0) {
print("^2Plugins^7: No plugins.txt found. Disabling.\n");
g_plugins_enabled = 0;
return;
}
/* count valid progs */
g_plugincount = 0;
while ((tmp = fgets(pdb))) {
g_plugincount++;
}
g_plugindb = memalloc(sizeof(plugin_t) * g_plugincount);
fseek(pdb, 0);
i = 0;
while ((tmp = fgets(pdb))) {
g_plugindb[i].m_strPath = tmp;
g_plugindb[i].m_flProgsID = addprogs(tmp);
i++;
}
fclose(pdb);
void(void) vFunc;
for (i = 0; i < g_plugincount; i++) {
vFunc = externvalue(g_plugindb[i].m_flProgsID, "FMX_Init");
if (vFunc) {
vFunc();
}
}
print(sprintf("^1Plugins^7: Initialized %i plugins\n", g_plugincount));
}
void
Plugin_Shutdown(void)
{
memfree(g_plugindb);
g_plugincount = 0;
}
/*
@ -34,15 +93,32 @@ Plugin_RunClientCommand
Funtion that can interrupt client commands before physics are run
=================
*/
int Plugin_RunClientCommand(void)
int
Plugin_RunClientCommand(void)
{
int(void) vFunc = externvalue(-2, "FMX_RunClientCommand");
int rval;
int tval;
int(void) vFunc;
if (vFunc || g_plugins_enabled == 0) {
return vFunc();
if (g_plugins_enabled == 0)
return FALSE;
/* rval = final return value, tval = temporary return value.
if at least one of the plugins returns TRUE, then RunClientCommand
will not be called by the engine, as it should be */
rval = FALSE;
tval = FALSE;
for (int i = 0; i < g_plugincount; i++) {
vFunc = externvalue(g_plugindb[i].m_flProgsID, "FMX_RunClientCommand");
if (vFunc) {
tval = vFunc();
rval |= tval;
}
}
return FALSE;
return rval;
}
/*
@ -53,13 +129,30 @@ Intercepts 'cmd' calls. We use it to intercept
chat messages and handle distribution ourselves.
=================
*/
int Plugin_ParseClientCommand(string msg)
int
Plugin_ParseClientCommand(string msg)
{
int(string msg) vFunc = externvalue(-2, "FMX_ParseClientCommand");
int rval;
int tval;
int(string msg) vFunc;
if (vFunc || g_plugins_enabled == 0) {
return vFunc(msg);
if (g_plugins_enabled == 0)
return FALSE;
/* rval = final return value, tval = temporary return value.
if at least one of the plugins returns TRUE, then RunClientCommand
will not be called by the engine, as it should be */
rval = FALSE;
tval = FALSE;
for (int i = 0; i < g_plugincount; i++) {
vFunc = externvalue(g_plugindb[i].m_flProgsID, "FMX_ParseClientCommand");
if (vFunc) {
tval = vFunc(msg);
rval |= tval;
}
}
return FALSE;
return rval;
}