FixPlayerGravity: Initial commit
This commit is contained in:
		
							parent
							
								
									8bc1c2f22c
								
							
						
					
					
						commit
						f455ab52c5
					
				
							
								
								
									
										100
									
								
								FixPlayerGravity/scripting/fixplayergravity.sp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										100
									
								
								FixPlayerGravity/scripting/fixplayergravity.sp
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,100 @@ | ||||
| #pragma semicolon 1 | ||||
| #pragma newdecls required | ||||
| 
 | ||||
| #include <sourcemod> | ||||
| 
 | ||||
| public Plugin myinfo =  | ||||
| { | ||||
| 	name = "Fix Player Gravity", | ||||
| 	author = "xen", | ||||
| 	description = "Enable prediction for gravity and fix ladders resetting it", | ||||
| 	version = "1.0", | ||||
| 	url = "" | ||||
| }; | ||||
| 
 | ||||
| ConVar g_CVar_sv_gravity; | ||||
| 
 | ||||
| float g_flClientGravity[MAXPLAYERS + 1]; | ||||
| float g_flClientActualGravity[MAXPLAYERS + 1]; | ||||
| 
 | ||||
| bool g_bLadder[MAXPLAYERS + 1]; | ||||
| 
 | ||||
| public void OnPluginStart() | ||||
| { | ||||
| 	g_CVar_sv_gravity = FindConVar("sv_gravity"); | ||||
| 
 | ||||
| 	HookEvent("round_prestart", OnRoundRestart); | ||||
| } | ||||
| 
 | ||||
| public void OnPluginEnd() | ||||
| { | ||||
| 	ResetGravityAll(); | ||||
| } | ||||
| 
 | ||||
| // If a player is on a ladder with modified gravity and the round restarts, | ||||
| // their gravity would be restored to what it was last round since they'd be no longer on a ladder | ||||
| public void OnRoundRestart(Handle event, const char[] name, bool dontBroadcast) | ||||
| { | ||||
| 	ResetGravityAll(); | ||||
| } | ||||
| 
 | ||||
| public void OnGameFrame() | ||||
| { | ||||
| 	float flSVGravity = GetConVarFloat(g_CVar_sv_gravity); | ||||
| 
 | ||||
| 	for (int client = 1; client < MaxClients; client++) | ||||
| 	{ | ||||
| 		if (!IsClientInGame(client) || !IsPlayerAlive(client)) | ||||
| 		{ | ||||
| 			g_flClientGravity[client] = 1.0; | ||||
| 			g_bLadder[client] = false; | ||||
| 			continue; | ||||
| 		} | ||||
| 
 | ||||
| 		if (GetEntityMoveType(client) == MOVETYPE_LADDER) | ||||
| 		{ | ||||
| 			// They're on a ladder, ignore current gravity modifier | ||||
| 			if (!g_bLadder[client]) | ||||
| 				g_bLadder[client] = true; | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			if (g_bLadder[client]) | ||||
| 			{ | ||||
| 				// Now that they're off, restore it | ||||
| 				g_bLadder[client] = false; | ||||
| 				SetEntityGravity(client, g_flClientGravity[client]); | ||||
| 			} | ||||
| 
 | ||||
| 			g_flClientGravity[client] = GetEntityGravity(client); | ||||
| 		} | ||||
| 
 | ||||
| 		float flClientActualGravity = g_flClientGravity[client] * flSVGravity; | ||||
| 
 | ||||
| 		// Some maps change sv_gravity while clients already have modified gravity | ||||
| 		// So we store the actual calculated gravity to catch such cases | ||||
| 		if (flClientActualGravity != g_flClientActualGravity[client]) | ||||
| 		{ | ||||
| 			char szGravity[8]; | ||||
| 			FloatToString(flClientActualGravity, szGravity, sizeof(szGravity)); | ||||
| 			g_CVar_sv_gravity.ReplicateToClient(client, szGravity); | ||||
| 
 | ||||
| 			g_flClientActualGravity[client] = flClientActualGravity; | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| public void ResetGravityAll() | ||||
| { | ||||
| 	char szGravity[8]; | ||||
| 	g_CVar_sv_gravity.GetString(szGravity, sizeof(szGravity)); | ||||
| 
 | ||||
| 	for (int client = 1; client < MaxClients; client++) | ||||
| 	{ | ||||
| 		g_flClientGravity[client] = 1.0; | ||||
| 		g_bLadder[client] = false; | ||||
| 
 | ||||
| 		if (IsClientInGame(client)) | ||||
| 			g_CVar_sv_gravity.ReplicateToClient(client, szGravity); | ||||
| 	} | ||||
| } | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user