109 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			SourcePawn
		
	
	
	
	
	
			
		
		
	
	
			109 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			SourcePawn
		
	
	
	
	
	
| #pragma semicolon 1
 | |
| 
 | |
| #define PLUGIN_AUTHOR "Cloud Strife"
 | |
| #define PLUGIN_VERSION "1.0"
 | |
| 
 | |
| #include <sourcemod>
 | |
| #include <sdktools>
 | |
| #include <dhooks>
 | |
| 
 | |
| #pragma newdecls required
 | |
| 
 | |
| public Plugin myinfo = 
 | |
| {
 | |
| 	name = "FixFuncRotating",
 | |
| 	author = PLUGIN_AUTHOR,
 | |
| 	description = "Fixes func_rotating`s StartForward and StopAtStartPos inputs",
 | |
| 	version = PLUGIN_VERSION,
 | |
| 	url = ""
 | |
| };
 | |
| 
 | |
| Handle g_CFuncRotating_StartForward = null;
 | |
| Handle g_CFuncRotating_UpdateSpeed = null;
 | |
| 
 | |
| stock float FloatMod(float num, float denom)
 | |
| {
 | |
|     return num - denom * RoundToFloor(num / denom);
 | |
| }
 | |
| 
 | |
| stock float operator%(float oper1, float oper2)
 | |
| {
 | |
|     return FloatMod(oper1, oper2);
 | |
| }
 | |
| 
 | |
| // Set m_bStopAtStartPos to false
 | |
| public MRESReturn CFuncRotating_InputStartForward(int entity)
 | |
| {
 | |
| 	SetEntProp(entity, Prop_Data, "m_bStopAtStartPos", false, 1);
 | |
| 	return MRES_Ignored;
 | |
| }
 | |
| 
 | |
| public MRESReturn CFuncRotating_UpdateSpeed(int entity, Handle hParams)
 | |
| {
 | |
| 	if(GetEntProp(entity, Prop_Data, "m_bStopAtStartPos", 1))
 | |
| 	{
 | |
| 		float flNewSpeed = view_as<float>(DHookGetParam(hParams, 1));
 | |
| 		if(flNewSpeed <= 25)
 | |
| 		{
 | |
| 			float vecMoveAng[3], angStart[3], angRotation[3], avelpertick[3];
 | |
| 			
 | |
| 			GetEntPropVector(entity, Prop_Data, "m_vecMoveAng", vecMoveAng);
 | |
| 			GetEntPropVector(entity, Prop_Data, "m_angStart", angStart);
 | |
| 			GetEntPropVector(entity, Prop_Data, "m_angRotation", angRotation);
 | |
| 			GetEntPropVector(entity, Prop_Data, "m_vecAngVelocity", avelpertick);
 | |
| 			ScaleVector(avelpertick, GetTickInterval());
 | |
| 		
 | |
| 			int checkAxis = 2;
 | |
| 			if (vecMoveAng[0] != 0) checkAxis = 0;
 | |
| 			else if ( vecMoveAng[1] != 0 ) checkAxis = 1;
 | |
| 			
 | |
| 			float angDelta = ( angRotation[ checkAxis ] - angStart[ checkAxis ] )%360.0;
 | |
| 			if ( angDelta > 180.0 ) angDelta -= 360.0;
 | |
| 			
 | |
| 			if(FloatAbs(angDelta) < FloatAbs(avelpertick[ checkAxis ]))
 | |
|         	{
 | |
|         		SetEntPropVector(entity, Prop_Data, "m_angRotation", angStart);
 | |
|         		return MRES_Ignored;
 | |
|         	}
 | |
|         }
 | |
| 	}
 | |
| 	return MRES_Ignored;
 | |
| }
 | |
| 
 | |
| public void OnPluginStart()
 | |
| {
 | |
| 	Handle hGameConf = LoadGameConfigFile("FixFuncRotating.games");
 | |
| 	if(hGameConf == INVALID_HANDLE)
 | |
| 	{
 | |
| 		LogError("Couldn't load FixFuncRotating.games game config!");
 | |
| 		return;
 | |
| 	}
 | |
| 	
 | |
| 	Address pStartForward = GameConfGetAddress(hGameConf, "CFuncRotating::InputStartForward");
 | |
| 	if(pStartForward)
 | |
| 	{
 | |
| 		g_CFuncRotating_StartForward = DHookCreateDetour(pStartForward, CallConv_THISCALL, ReturnType_Void, ThisPointer_CBaseEntity);
 | |
| 	
 | |
| 		if(!DHookEnableDetour(g_CFuncRotating_StartForward, false, CFuncRotating_InputStartForward))
 | |
| 		{
 | |
| 			LogError("Could not enable detour for CFuncRotating::InputStartForward");
 | |
| 		}
 | |
| 	}
 | |
| 	else LogError("Could not find CFuncRotating::InputStartForward address");
 | |
| 	
 | |
| 	
 | |
| 	Address pUpdateSpeed = GameConfGetAddress(hGameConf, "CFuncRotating::UpdateSpeed");
 | |
| 	if(!pUpdateSpeed)
 | |
| 	{
 | |
| 		LogError("Could not find CFuncRotating::UpdateSpeed address");
 | |
| 		return;
 | |
| 	}
 | |
| 
 | |
| 	g_CFuncRotating_UpdateSpeed = DHookCreateDetour(pUpdateSpeed, CallConv_THISCALL, ReturnType_Void, ThisPointer_CBaseEntity);
 | |
| 	DHookAddParam(g_CFuncRotating_UpdateSpeed, HookParamType_Float);
 | |
| 	
 | |
| 	if(!DHookEnableDetour(g_CFuncRotating_UpdateSpeed, false, CFuncRotating_UpdateSpeed))
 | |
| 	{
 | |
| 		LogError("Could not enable detour for CFuncRotating::UpdateSpeed");
 | |
| 	}
 | |
| } |