4 // meta_api.cpp - minimal implementation of metamod's plugin interface
6 // This is intended to illustrate the (more or less) bare minimum code
7 // required for a valid metamod plugin, and is targeted at those who want
8 // to port existing HL/SDK DLL code to run as a metamod plugin.
11 * Copyright (c) 2001-2003 Will Day <willday@hpgx.net>
13 * This file is part of Metamod.
15 * Metamod is free software; you can redistribute it and/or modify it
16 * under the terms of the GNU General Public License as published by the
17 * Free Software Foundation; either version 2 of the License, or (at
18 * your option) any later version.
20 * Metamod is distributed in the hope that it will be useful, but
21 * WITHOUT ANY WARRANTY; without even the implied warranty of
22 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
23 * General Public License for more details.
25 * You should have received a copy of the GNU General Public License
26 * along with Metamod; if not, write to the Free Software Foundation,
27 * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
29 * In addition, as a special exception, the author gives permission to
30 * link the code of this program with the Half-Life Game Engine ("HL
31 * Engine") and Modified Game Libraries ("MODs") developed by Valve,
32 * L.L.C ("Valve"). You must obey the GNU General Public License in all
33 * respects for all of the code used other than the HL Engine and MODs
34 * from Valve. If you modify this file, you may extend this exception
35 * to your version of the file, but you are not obligated to do so. If
36 * you do not wish to do so, delete this exception statement from your
41 #include <extdll.h> // always
43 #include <meta_api.h> // of course
45 #include "sdk_util.h" // UTIL_LogPrintf, etc
47 // Must provide at least one of these..
48 static META_FUNCTIONS gMetaFunctionTable
= {
49 NULL
, // pfnGetEntityAPI HL SDK; called before game DLL
50 NULL
, // pfnGetEntityAPI_Post META; called after game DLL
51 GetEntityAPI2
, // pfnGetEntityAPI2 HL SDK2; called before game DLL
52 NULL
, // pfnGetEntityAPI2_Post META; called after game DLL
53 NULL
, // pfnGetNewDLLFunctions HL SDK2; called before game DLL
54 NULL
, // pfnGetNewDLLFunctions_Post META; called after game DLL
55 GetEngineFunctions
, // pfnGetEngineFunctions META; called before HL engine
56 NULL
, // pfnGetEngineFunctions_Post META; called after HL engine
59 // Description of plugin
60 plugin_info_t Plugin_info
= {
61 META_INTERFACE_VERSION
, // ifvers
65 "MegaBrutal <megabrutal@gmail.com>", // author
66 "http://megabrutal.com/", // url
67 "PMPreCache", // logtag, all caps please
68 PT_ANYTIME
, // (when) loadable
69 PT_ANYPAUSE
, // (when) unloadable
72 // Global vars from metamod:
73 meta_globals_t
*gpMetaGlobals
; // metamod globals
74 gamedll_funcs_t
*gpGamedllFuncs
; // gameDLL function tables
75 mutil_funcs_t
*gpMetaUtilFuncs
; // metamod utility functions
78 // Metamod requesting info about this plugin:
79 // ifvers (given) interface_version metamod is using
80 // pPlugInfo (requested) struct with info about plugin
81 // pMetaUtilFuncs (given) table of utility functions provided by metamod
82 C_DLLEXPORT
int Meta_Query(char * /*ifvers */, plugin_info_t
**pPlugInfo
,
83 mutil_funcs_t
*pMetaUtilFuncs
)
85 // Give metamod our plugin_info struct
86 *pPlugInfo
=&Plugin_info
;
87 // Get metamod utility function table.
88 gpMetaUtilFuncs
=pMetaUtilFuncs
;
92 // Metamod attaching plugin to the server.
93 // now (given) current phase, ie during map, during changelevel, or at startup
94 // pFunctionTable (requested) table of function tables this plugin catches
95 // pMGlobals (given) global vars from metamod
96 // pGamedllFuncs (given) copy of function tables from game dll
97 C_DLLEXPORT
int Meta_Attach(PLUG_LOADTIME
/* now */,
98 META_FUNCTIONS
*pFunctionTable
, meta_globals_t
*pMGlobals
,
99 gamedll_funcs_t
*pGamedllFuncs
)
102 LOG_ERROR(PLID
, "Meta_Attach called with null pMGlobals");
105 gpMetaGlobals
=pMGlobals
;
106 if(!pFunctionTable
) {
107 LOG_ERROR(PLID
, "Meta_Attach called with null pFunctionTable");
110 memcpy(pFunctionTable
, &gMetaFunctionTable
, sizeof(META_FUNCTIONS
));
111 gpGamedllFuncs
=pGamedllFuncs
;
112 LOG_MESSAGE(PLID
, "%s v%s by %s", Plugin_info
.name
, Plugin_info
.version
, Plugin_info
.author
);
113 LOG_MESSAGE(PLID
, "Attached.");
114 strncpy(&gGamedir
[0], GET_GAME_INFO(PLID
, GINFO_GAMEDIR
), sizeof(gGamedir
));
118 // Metamod detaching plugin from the server.
119 // now (given) current phase, ie during map, etc
120 // reason (given) why detaching (refresh, console unload, forced unload, etc)
121 C_DLLEXPORT
int Meta_Detach(PLUG_LOADTIME
/* now */,
122 PL_UNLOAD_REASON
/* reason */)