171 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			SourcePawn
		
	
	
	
	
	
			
		
		
	
	
			171 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			SourcePawn
		
	
	
	
	
	
| #pragma newdecls required
 | |
| 
 | |
| #include <sourcemod>
 | |
| #include <sdktools>
 | |
| #include <dhooks>
 | |
| 
 | |
| Handle g_hGetMaxClip;
 | |
| Handle g_hGetMaxReserve;
 | |
| 
 | |
| KeyValues g_aKeyValues;
 | |
| 
 | |
| //----------------------------------------------------------------------------------------------------
 | |
| // Purpose:
 | |
| //----------------------------------------------------------------------------------------------------
 | |
| public Plugin myinfo =
 | |
| {
 | |
| 	name         = "AmmoManager",
 | |
| 	author       = "zaCade",
 | |
| 	description  = "",
 | |
| 	version      = "1.0.0"
 | |
| };
 | |
| 
 | |
| //----------------------------------------------------------------------------------------------------
 | |
| // Purpose:
 | |
| //----------------------------------------------------------------------------------------------------
 | |
| public void OnPluginStart()
 | |
| {
 | |
| 	Handle hGameConf;
 | |
| 	if ((hGameConf = LoadGameConfigFile("AmmoManager.games")) == INVALID_HANDLE)
 | |
| 	{
 | |
| 		SetFailState("Couldn't load \"AmmoManager.games\" game config!");
 | |
| 		return;
 | |
| 	}
 | |
| 
 | |
| 	// CBaseCombatWeapon::GetMaxClip1() const
 | |
| 	int iMaxClipOffset;
 | |
| 	if ((iMaxClipOffset = GameConfGetOffset(hGameConf, "GetMaxClip")) == -1)
 | |
| 	{
 | |
| 		delete hGameConf;
 | |
| 		SetFailState("GameConfGetOffset(hGameConf, \"GetMaxClip\") failed!");
 | |
| 		return;
 | |
| 	}
 | |
| 
 | |
| 	if ((g_hGetMaxClip = DHookCreate(iMaxClipOffset, HookType_Entity, ReturnType_Int, ThisPointer_CBaseEntity, OnGetMaxClip)) == INVALID_HANDLE)
 | |
| 	{
 | |
| 		delete hGameConf;
 | |
| 		SetFailState("DHookCreate(iMaxClipOffset, HookType_Entity, ReturnType_Int, ThisPointer_CBaseEntity, OnGetMaxClip) failed!");
 | |
| 		return;
 | |
| 	}
 | |
| 
 | |
| 	// CBaseCombatWeapon::GetMaxReserve1() const
 | |
| 	if (GetEngineVersion() == Engine_CSGO)
 | |
| 	{
 | |
| 		int iMaxReserveOffset;
 | |
| 		if ((iMaxReserveOffset = GameConfGetOffset(hGameConf, "GetMaxReserve")) == -1)
 | |
| 		{
 | |
| 			delete hGameConf;
 | |
| 			SetFailState("GameConfGetOffset(hGameConf, \"GetMaxReserve\") failed!");
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		if ((g_hGetMaxReserve = DHookCreate(iMaxReserveOffset, HookType_Entity, ReturnType_Int, ThisPointer_CBaseEntity, OnGetMaxReserve)) == INVALID_HANDLE)
 | |
| 		{
 | |
| 			delete hGameConf;
 | |
| 			SetFailState("DHookCreate(iMaxReserveOffset, HookType_Entity, ReturnType_Int, ThisPointer_CBaseEntity, OnGetMaxReserve) failed!");
 | |
| 			return;
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	// Late load.
 | |
| 	int entity = INVALID_ENT_REFERENCE;
 | |
| 	while ((entity = FindEntityByClassname(entity, "weapon_*")) != INVALID_ENT_REFERENCE)
 | |
| 	{
 | |
| 		OnEntityCreated(entity, "weapon_*");
 | |
| 	}
 | |
| 
 | |
| 	delete hGameConf;
 | |
| }
 | |
| 
 | |
| //----------------------------------------------------------------------------------------------------
 | |
| // Purpose:
 | |
| //----------------------------------------------------------------------------------------------------
 | |
| public void OnMapStart()
 | |
| {
 | |
| 	char sFilePath[PLATFORM_MAX_PATH];
 | |
| 	BuildPath(Path_SM, sFilePath, sizeof(sFilePath), "configs/AmmoManager.cfg");
 | |
| 
 | |
| 	if (!FileExists(sFilePath))
 | |
| 	{
 | |
| 		LogMessage("Config file doesn't exist: \"%s\"!", sFilePath);
 | |
| 		return;
 | |
| 	}
 | |
| 
 | |
| 	g_aKeyValues = new KeyValues("weapons");
 | |
| 
 | |
| 	if (!g_aKeyValues.ImportFromFile(sFilePath))
 | |
| 	{
 | |
| 		LogMessage("Couldn't load config file: \"%s\"!", sFilePath);
 | |
| 		delete g_aKeyValues;
 | |
| 		return;
 | |
| 	}
 | |
| }
 | |
| 
 | |
| //----------------------------------------------------------------------------------------------------
 | |
| // Purpose:
 | |
| //----------------------------------------------------------------------------------------------------
 | |
| public void OnEntityCreated(int entity, const char[] classname)
 | |
| {
 | |
| 	if (strncmp(classname, "weapon_", 7, false) == 0)
 | |
| 	{
 | |
| 		if (g_hGetMaxClip != INVALID_HANDLE)
 | |
| 			DHookEntity(g_hGetMaxClip, true, entity);
 | |
| 
 | |
| 		if (g_hGetMaxReserve != INVALID_HANDLE)
 | |
| 			DHookEntity(g_hGetMaxReserve, true, entity);
 | |
| 	}
 | |
| }
 | |
| 
 | |
| //----------------------------------------------------------------------------------------------------
 | |
| // Purpose:
 | |
| //----------------------------------------------------------------------------------------------------
 | |
| public MRESReturn OnGetMaxClip(int entity, Handle hReturn)
 | |
| {
 | |
| 	if (!IsValidEntity(entity))
 | |
| 		return MRES_Ignored;
 | |
| 
 | |
| 	bool bChanged;
 | |
| 	char sClassname[128];
 | |
| 	GetEntityClassname(entity, sClassname, sizeof(sClassname))
 | |
| 
 | |
| 	if (g_aKeyValues && g_aKeyValues.JumpToKey(sClassname, false))
 | |
| 	{
 | |
| 		int iClip;
 | |
| 		if ((iClip = g_aKeyValues.GetNum("primary clip", -1)) != -1)
 | |
| 		{
 | |
| 			DHookSetReturn(hReturn, iClip);
 | |
| 			bChanged = true;
 | |
| 		}
 | |
| 
 | |
| 		g_aKeyValues.Rewind();
 | |
| 	}
 | |
| 
 | |
| 	return (bChanged) ? MRES_Supercede : MRES_Ignored;
 | |
| }
 | |
| 
 | |
| //----------------------------------------------------------------------------------------------------
 | |
| // Purpose:
 | |
| //----------------------------------------------------------------------------------------------------
 | |
| public MRESReturn OnGetMaxReserve(int entity, Handle hReturn)
 | |
| {
 | |
| 	if (!IsValidEntity(entity))
 | |
| 		return MRES_Ignored;
 | |
| 
 | |
| 	bool bChanged;
 | |
| 	char sClassname[128];
 | |
| 	GetEntityClassname(entity, sClassname, sizeof(sClassname))
 | |
| 
 | |
| 	if (g_aKeyValues && g_aKeyValues.JumpToKey(sClassname, false))
 | |
| 	{
 | |
| 		int iReserve;
 | |
| 		if ((iReserve = g_aKeyValues.GetNum("primary reserve", -1)) != -1)
 | |
| 		{
 | |
| 			DHookSetReturn(hReturn, iReserve);
 | |
| 			bChanged = true;
 | |
| 		}
 | |
| 
 | |
| 		g_aKeyValues.Rewind();
 | |
| 	}
 | |
| 
 | |
| 	return (bChanged) ? MRES_Supercede : MRES_Ignored;
 | |
| } | 
