core/smn_gameconfigs.cpp
author David Anderson <dvander@alliedmods.net>
Sat Dec 19 18:16:41 2009 -0800 (2009-12-19)
changeset 2883 1d7b415cef73
parent 2289 44045ead61cd
child 2901 f5a1cf24f505
permissions -rw-r--r--
Add ability to change dontBroadcast status on hooked events (bug 3886, r=ds).
     1 /**
     2  * vim: set ts=4 :
     3  * =============================================================================
     4  * SourceMod
     5  * Copyright (C) 2004-2008 AlliedModders LLC.  All rights reserved.
     6  * =============================================================================
     7  *
     8  * This program is free software; you can redistribute it and/or modify it under
     9  * the terms of the GNU General Public License, version 3.0, as published by the
    10  * Free Software Foundation.
    11  * 
    12  * This program is distributed in the hope that it will be useful, but WITHOUT
    13  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
    14  * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
    15  * details.
    16  *
    17  * You should have received a copy of the GNU General Public License along with
    18  * this program.  If not, see <http://www.gnu.org/licenses/>.
    19  *
    20  * As a special exception, AlliedModders LLC gives you permission to link the
    21  * code of this program (as well as its derivative works) to "Half-Life 2," the
    22  * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
    23  * by the Valve Corporation.  You must obey the GNU General Public License in
    24  * all respects for all other code used.  Additionally, AlliedModders LLC grants
    25  * this exception to all derivative works.  AlliedModders LLC defines further
    26  * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
    27  * or <http://www.sourcemod.net/license.php>.
    28  *
    29  * Version: $Id$
    30  */
    31 
    32 #include "sourcemod.h"
    33 #include "HandleSys.h"
    34 #include "GameConfigs.h"
    35 
    36 HandleType_t g_GameConfigsType;
    37 
    38 class GameConfigsNatives :
    39 	public IHandleTypeDispatch, 
    40 	public SourceModBase
    41 {
    42 public:
    43 	void OnSourceModAllInitialized()
    44 	{
    45 		g_GameConfigsType = g_HandleSys.CreateType("GameConfigs", this, 0, NULL, NULL, g_pCoreIdent, NULL);
    46 	}
    47 	void OnSourceModShutdown()
    48 	{
    49 		g_HandleSys.RemoveType(g_GameConfigsType, g_pCoreIdent);
    50 		g_GameConfigsType = 0;
    51 	}
    52 	void OnHandleDestroy(HandleType_t type, void *object)
    53 	{
    54 		g_GameConfigs.CloseGameConfigFile(reinterpret_cast<IGameConfig *>(object));
    55 	}
    56 };
    57 
    58 static cell_t smn_LoadGameConfigFile(IPluginContext *pCtx, const cell_t *params)
    59 {
    60 	IGameConfig *gc;
    61 	char *filename;
    62 	char error[128];
    63 
    64 	pCtx->LocalToString(params[1], &filename);
    65 	if (!g_GameConfigs.LoadGameConfigFile(filename, &gc, error, sizeof(error)))
    66 	{
    67 		return pCtx->ThrowNativeError("Unable to open %s: %s", filename, error);
    68 	}
    69 
    70 	return g_HandleSys.CreateHandle(g_GameConfigsType, gc, pCtx->GetIdentity(), g_pCoreIdent, NULL);
    71 }
    72 
    73 static cell_t smn_GameConfGetOffset(IPluginContext *pCtx, const cell_t *params)
    74 {
    75 	Handle_t hndl = static_cast<Handle_t>(params[1]);
    76 	HandleError herr;
    77 	HandleSecurity sec;
    78 	IGameConfig *gc;
    79 
    80 	sec.pOwner = NULL;
    81 	sec.pIdentity = g_pCoreIdent;
    82 
    83 	if ((herr=g_HandleSys.ReadHandle(hndl, g_GameConfigsType, &sec, (void **)&gc))
    84 		!= HandleError_None)
    85 	{
    86 		return pCtx->ThrowNativeError("Invalid game config handle %x (error %d)", hndl, herr);
    87 	}
    88 
    89 	char *key;
    90 	int val;
    91 	pCtx->LocalToString(params[2], &key);
    92 
    93 	if (!gc->GetOffset(key, &val))
    94 	{
    95 		return -1;
    96 	}
    97 
    98 	return val;
    99 }
   100 
   101 static cell_t smn_GameConfGetKeyValue(IPluginContext *pCtx, const cell_t *params)
   102 {
   103 	Handle_t hndl = static_cast<Handle_t>(params[1]);
   104 	HandleError herr;
   105 	HandleSecurity sec;
   106 	IGameConfig *gc;
   107 
   108 	sec.pOwner = NULL;
   109 	sec.pIdentity = g_pCoreIdent;
   110 
   111 	if ((herr=g_HandleSys.ReadHandle(hndl, g_GameConfigsType, &sec, (void **)&gc))
   112 		!= HandleError_None)
   113 	{
   114 		return pCtx->ThrowNativeError("Invalid game config handle %x (error %d)", hndl, herr);
   115 	}
   116 
   117 	char *key;
   118 	const char *val;
   119 	pCtx->LocalToString(params[2], &key);
   120 
   121 	if ((val=gc->GetKeyValue(key)) == NULL)
   122 	{
   123 		return 0;
   124 	}
   125 
   126 	pCtx->StringToLocalUTF8(params[3], params[4], val, NULL);
   127 
   128 	return 1;
   129 }
   130 
   131 static GameConfigsNatives s_GameConfigsNatives;
   132 
   133 REGISTER_NATIVES(gameconfignatives)
   134 {
   135 	{"LoadGameConfigFile",			smn_LoadGameConfigFile},
   136 	{"GameConfGetOffset",			smn_GameConfGetOffset},
   137 	{"GameConfGetKeyValue",			smn_GameConfGetKeyValue},
   138 	{NULL,							NULL}
   139 };