2
0
mirror of https://github.com/rehlds/metamod-r.git synced 2025-01-14 23:57:57 +03:00
2016-07-04 12:07:29 +06:00

210 lines
5.8 KiB
C++

// vi: set ts=4 sw=4 :
// vim: set tw=75 :
// plugin.cpp - generic plugin operation
/*
* Copyright (c) 2001-2006 Will Day <willday@hpgx.net>
*
* This file is part of Metamod.
*
* Metamod is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* Metamod is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Metamod; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game Engine ("HL
* Engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL Engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*
*/
#include <extdll.h> // always
#include <meta_api.h> //
#include <vdate.h> // COMPILE_TIME,
#include <support_meta.h> // STRNCPY,
#include "wdmisc.h" // me
#include "plugin.h" // generic routines
#include "log_plugin.h" // MAX_LOGMSG_LEN
// Must provide at least one of these..
META_FUNCTIONS gMetaFunctionTable = {
NULL, // pfnGetEntityAPI HL SDK; called before game DLL
NULL, // pfnGetEntityAPI_Post META; called after game DLL
GetEntityAPI2, // pfnGetEntityAPI2 HL SDK2; called before game DLL
NULL, // pfnGetEntityAPI2_Post META; called after game DLL
NULL, // pfnGetNewDLLFunctions HL SDK2; called before game DLL
NULL, // pfnGetNewDLLFunctions_Post META; called after game DLL
GetEngineFunctions, // pfnGetEngineFunctions META; called before HL engine
NULL, // pfnGetEngineFunctions_Post META; called after HL engine
};
cvar_t init_plugin_debug = {"wd_debug", "0", FCVAR_EXTDLL, 0, NULL};
cvar_t bounce = {"bounce", "0", FCVAR_EXTDLL, 0, NULL};
// Meta_Query, any desired checks for valid use.
int plugin_query(void) {
return(TRUE);
}
// Meta_Attach. Plugin startup. Register commands and cvars.
int plugin_attach(void) {
log_init("wd_debug");
bounce_init();
do_my_getengfuncs();
REG_SVR_COMMAND("msglist", &wd_msglist);
REG_SVR_COMMAND("msgid", &wd_msgid);
REG_SVR_COMMAND("testit", &wd_testit);
return(TRUE);
}
// Meta_Detach. Cleaning up.
int plugin_detach(void) {
return(TRUE);
}
void bounce_init(void) {
CVAR_REGISTER(&bounce);
}
void bounce_check(void) {
if((int)CVAR_GET_FLOAT("bounce")==1) {
LOG_MESSAGE(PLID, "Exiting server at end of map (bounce==1)");
SERVER_COMMAND("quit\n");
}
}
void do_my_getengfuncs(void) {
memset(&meta_engfuncs, 0, sizeof(meta_engfuncs));
meta_engfuncs.pfnAlertMessage = wd_AlertMessage;
}
// The below was done basically as a proof-of-concept for catching certain
// game-events that aren't otherwise triggered by the HL API. It works only
// by examining every log message that the server generates, and checking
// to see if it includes the string indicating the particular event in
// question (in this case "Planted_The_Bomb").
//
// Although this works, it is really a rather poor solution to the problem,
// as it assumes a lot of string-compares, which can seriously degrade the
// performance of the server. I did try to take as many short-cuts as
// reasonable in the code, to decrease the amount of string-comparing going
// on, which makes the code a bit less readable than doing just a "strstr"
// on the log line.
void wd_AlertMessage(ALERT_TYPE atype, char *szFmt, ...) {
va_list ap;
static char buf[MAX_LOGMSG_LEN];
char *cp, *ep;
int found=0;
size_t len=0;
if(atype != at_logged)
RETURN_META(MRES_IGNORED);
va_start(ap, szFmt);
vsnprintf(buf, sizeof(buf), szFmt, ap);
va_end(ap);
// Team "...." triggered ...
if((cp=buf) && (cp[0]=='T')
&& (cp=strchr(cp+1, '"'))
&& (cp=strchr(cp+1, '"'))
&& !strncmp(cp+2, "triggered", 9))
{
cp+=2;
found=1;
}
// World triggered ...
else if((cp=buf) && (cp[0]=='W')
&& !strncmp(cp+6, "triggered", 9))
{
cp+=6;
found=1;
}
// "player<444><44444><...>" triggered ...
else if((cp=buf) && (cp[0]=='"')
&& (cp=strchr(cp+1, '"'))
&& !strncmp(cp+2, "triggered", 9))
{
cp+=2;
found=1;
}
if(found) {
// past 'triggered "'
cp+=11;
if((ep=strchr(cp, '"')))
len=ep-cp-1;
}
if(len && !strncmp(cp, "Planted_The_Bomb", len)) {
char name[128];
char *beg, *end;
beg=buf + 1;
end=strchr(buf, '<') + 1;
if(!beg || !end)
RETURN_META(MRES_IGNORED);
len=end-beg;
if(len > sizeof(name))
len=sizeof(name);
STRNCPY(name, beg, len);
CENTER_SAY(PLID, "%s set up us the bomb!", name);
}
RETURN_META(MRES_HANDLED);
}
void wd_msglist(void) {
int i, size;
const char *cp;
LOG_CONSOLE(PLID, "registered user msgs:");
for(i=0; i < MAX_REG_MSGS; i++) {
cp=GET_USER_MSG_NAME(PLID, i, &size);
if(cp)
LOG_CONSOLE(PLID, "%d %s %d", i, cp, size);
}
}
void wd_msgid(void) {
const char *msgname;
int id;
msgname=CMD_ARGV(1);
id=GET_USER_MSG_ID(PLID, msgname, NULL);
if(id)
LOG_CONSOLE(PLID, "%s = %d", msgname, id);
else
LOG_CONSOLE(PLID, "msg not found: %s", msgname);
}
void wd_testit(void) {
cvar_t *cv;
cv=CVAR_GET_POINTER("csguard_version");
if(cv)
LOG_CONSOLE(PLID, "csguard_version found!: %d", cv);
else
LOG_CONSOLE(PLID, "csguard_version not found!");
}