141 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			SourcePawn
		
	
	
	
	
	
			
		
		
	
	
			141 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			SourcePawn
		
	
	
	
	
	
#pragma newdecls required
 | 
						|
 | 
						|
#include <sourcemod>
 | 
						|
#include <sdktools>
 | 
						|
#include <dhooks>
 | 
						|
 | 
						|
Handle hAcceptInput;
 | 
						|
 | 
						|
//----------------------------------------------------------------------------------------------------
 | 
						|
// Purpose:
 | 
						|
//----------------------------------------------------------------------------------------------------
 | 
						|
public Plugin myinfo =
 | 
						|
{
 | 
						|
	name         = "GameTextManager",
 | 
						|
	author       = "zaCade",
 | 
						|
	description  = "",
 | 
						|
	version      = "1.0.0",
 | 
						|
};
 | 
						|
 | 
						|
//----------------------------------------------------------------------------------------------------
 | 
						|
// Purpose:
 | 
						|
//----------------------------------------------------------------------------------------------------
 | 
						|
public void OnPluginStart()
 | 
						|
{
 | 
						|
	Handle hGameConf;
 | 
						|
	if ((hGameConf = LoadGameConfigFile("sdktools.games")) == INVALID_HANDLE)
 | 
						|
	{
 | 
						|
		SetFailState("Couldn't load \"sdktools.games\" game config!");
 | 
						|
		return;
 | 
						|
	}
 | 
						|
 | 
						|
	// CBaseEntity::AcceptInput( const char *szInputName, CBaseEntity *pActivator, CBaseEntity *pCaller, variant_t Value, int outputID )
 | 
						|
	int iOffset;
 | 
						|
	if ((iOffset = GameConfGetOffset(hGameConf, "AcceptInput")) == -1)
 | 
						|
	{
 | 
						|
		CloseHandle(hGameConf);
 | 
						|
		SetFailState("GameConfGetOffset(hGameConf, \"AcceptInput\") failed!");
 | 
						|
		return;
 | 
						|
	}
 | 
						|
 | 
						|
	if ((hAcceptInput = DHookCreate(iOffset, HookType_Entity, ReturnType_Bool, ThisPointer_CBaseEntity, OnAcceptInput)) == INVALID_HANDLE)
 | 
						|
	{
 | 
						|
		CloseHandle(hGameConf);
 | 
						|
		SetFailState("DHookCreate(iOffset, HookType_Entity, ReturnType_Bool, ThisPointer_CBaseEntity, OnAcceptInput) failed!");
 | 
						|
		return;
 | 
						|
	}
 | 
						|
 | 
						|
	DHookAddParam(hAcceptInput, HookParamType_CharPtr);
 | 
						|
	DHookAddParam(hAcceptInput, HookParamType_CBaseEntity);
 | 
						|
	DHookAddParam(hAcceptInput, HookParamType_CBaseEntity);
 | 
						|
	DHookAddParam(hAcceptInput, HookParamType_Object, 20, DHookPass_ByVal|DHookPass_ODTOR|DHookPass_OCTOR|DHookPass_OASSIGNOP);
 | 
						|
	DHookAddParam(hAcceptInput, HookParamType_Int);
 | 
						|
 | 
						|
	// Late load.
 | 
						|
	int entity = INVALID_ENT_REFERENCE;
 | 
						|
	while ((entity = FindEntityByClassname(entity, "game_text")) != INVALID_ENT_REFERENCE)
 | 
						|
	{
 | 
						|
		OnEntityCreated(entity, "game_text");
 | 
						|
	}
 | 
						|
 | 
						|
	CloseHandle(hGameConf);
 | 
						|
}
 | 
						|
 | 
						|
//----------------------------------------------------------------------------------------------------
 | 
						|
// Purpose:
 | 
						|
//----------------------------------------------------------------------------------------------------
 | 
						|
public void OnEntityCreated(int entity, const char[] classname)
 | 
						|
{
 | 
						|
	if (StrEqual(classname, "game_text", false) == 0)
 | 
						|
	{
 | 
						|
		DHookEntity(hAcceptInput, false, entity);
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
//----------------------------------------------------------------------------------------------------
 | 
						|
// Purpose:
 | 
						|
//
 | 
						|
// <int>    m_textParms.channel
 | 
						|
// <float>  m_textParms.x
 | 
						|
// <float>  m_textParms.y
 | 
						|
// <int>    m_textParms.r1
 | 
						|
// <int>    m_textParms.g1
 | 
						|
// <int>    m_textParms.b1
 | 
						|
// <int>    m_textParms.a1
 | 
						|
// <int>    m_textParms.r2
 | 
						|
// <int>    m_textParms.g2
 | 
						|
// <int>    m_textParms.b2
 | 
						|
// <int>    m_textParms.a2
 | 
						|
// <int>    m_textParms.effect
 | 
						|
// <float>  m_textParms.fadeinTime
 | 
						|
// <float>  m_textParms.fadeoutTime
 | 
						|
// <float>  m_textParms.holdTime
 | 
						|
// <float>  m_textParms.fxTime
 | 
						|
// <char>   m_iszMessage
 | 
						|
//----------------------------------------------------------------------------------------------------
 | 
						|
public MRESReturn OnAcceptInput(int entity, Handle hReturn, Handle hParams)
 | 
						|
{
 | 
						|
	char sInputName[128];
 | 
						|
	DHookGetParamString(hParams, 1, sInputName, sizeof(sInputName));
 | 
						|
 | 
						|
	if(!StrEqual(sInputName, "Display", false))
 | 
						|
		return MRES_Ignored;
 | 
						|
 | 
						|
	char sMessage[512];
 | 
						|
	GetEntPropString(entity, Prop_Data, "m_iszMessage", sMessage, sizeof(sMessage));
 | 
						|
 | 
						|
	if (!sMessage[0])
 | 
						|
		return MRES_Ignored;
 | 
						|
 | 
						|
	CMessage Message = new CMessage(sMessage);
 | 
						|
 | 
						|
	Message.hPlugin         = INVALID_HANDLE;
 | 
						|
	Message.iEntity         = EntIndexToEntRef(entity);
 | 
						|
	Message.iChannel        = GetEntProp(entity, Prop_Data, "m_textParms.channel");
 | 
						|
 | 
						|
	Message.fPositionX      = GetEntPropFloat(entity, Prop_Data, "m_textParms.x");
 | 
						|
	Message.fPositionY      = GetEntPropFloat(entity, Prop_Data, "m_textParms.y");
 | 
						|
 | 
						|
	Message.iColorOneR      = GetEntProp(entity, Prop_Data, "m_textParms.r1");
 | 
						|
	Message.iColorOneG      = GetEntProp(entity, Prop_Data, "m_textParms.g1");
 | 
						|
	Message.iColorOneB      = GetEntProp(entity, Prop_Data, "m_textParms.b1");
 | 
						|
	Message.iColorOneA      = GetEntProp(entity, Prop_Data, "m_textParms.a1");
 | 
						|
 | 
						|
	Message.iColorTwoR      = GetEntProp(entity, Prop_Data, "m_textParms.r2");
 | 
						|
	Message.iColorTwoG      = GetEntProp(entity, Prop_Data, "m_textParms.g2");
 | 
						|
	Message.iColorTwoB      = GetEntProp(entity, Prop_Data, "m_textParms.b2");
 | 
						|
	Message.iColorTwoA      = GetEntProp(entity, Prop_Data, "m_textParms.a2");
 | 
						|
 | 
						|
	Message.iEffect         = GetEntProp(entity, Prop_Data, "m_textParms.effect");
 | 
						|
 | 
						|
	Message.fFadeInTime     = GetEntPropFloat(entity, Prop_Data, "m_textParms.fadeinTime");
 | 
						|
	Message.fFadeOutTime    = GetEntPropFloat(entity, Prop_Data, "m_textParms.fadeoutTime");
 | 
						|
	Message.fHoldTime       = GetEntPropFloat(entity, Prop_Data, "m_textParms.holdTime");
 | 
						|
	Message.fFXTime         = GetEntPropFloat(entity, Prop_Data, "m_textParms.fxTime");
 | 
						|
 | 
						|
	g_hMessageQueue.Push(Message);
 | 
						|
 | 
						|
	DHookSetReturn(hReturn, false);
 | 
						|
	return MRES_Supercede;
 | 
						|
}
 |