FixFuncRotating: initial commit
This commit is contained in:
		
							parent
							
								
									2b35849922
								
							
						
					
					
						commit
						0aaac71d5b
					
				
							
								
								
									
										36
									
								
								FixFuncRotating/gamedata/FixFuncRotating.games.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								FixFuncRotating/gamedata/FixFuncRotating.games.txt
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,36 @@ | |||||||
|  | "Games" | ||||||
|  | { | ||||||
|  | 	"cstrike" | ||||||
|  | 	{ | ||||||
|  | 		"Addresses" | ||||||
|  | 		{ | ||||||
|  | 			"CFuncRotating::UpdateSpeed" | ||||||
|  | 			{ | ||||||
|  | 				"linux" | ||||||
|  | 				{ | ||||||
|  | 					"signature" "CFuncRotating::UpdateSpeed" | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 			"CFuncRotating::InputStartForward" | ||||||
|  | 			{ | ||||||
|  | 				"linux" | ||||||
|  | 				{ | ||||||
|  | 					"signature"	"CFuncRotating::InputStartForward" | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		"Signatures" | ||||||
|  | 		{ | ||||||
|  | 			"CFuncRotating::UpdateSpeed" | ||||||
|  | 			{ | ||||||
|  | 				"library"	"server" | ||||||
|  | 				"linux"		"@_ZN13CFuncRotating11UpdateSpeedEf" | ||||||
|  | 			} | ||||||
|  | 			"CFuncRotating::InputStartForward" | ||||||
|  | 			{ | ||||||
|  | 				"library"	"server" | ||||||
|  | 				"linux"		"@_ZN13CFuncRotating17InputStartForwardER11inputdata_t" | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										109
									
								
								FixFuncRotating/scripting/FixFuncRotating.sp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										109
									
								
								FixFuncRotating/scripting/FixFuncRotating.sp
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,109 @@ | |||||||
|  | #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"); | ||||||
|  | 	} | ||||||
|  | } | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user