#pragma semicolon 1
#include <sdkhooks>
#define PLUGIN_VERSION "0.6.3 (rewritten by Grey83)"
new bool:bLate,
iAdmin,
iMode;
public Plugin:myinfo =
{
name = "No Fall Damage",
version = PLUGIN_VERSION,
description = "Prevents players from taking damage by falling to the ground",
author = "Impact"
}
public APLRes:AskPluginLoad2(Handle:myself, bool:late, String:error[], err_max)
{
bLate = late;
}
public OnPluginStart()
{
CreateConVar("sm_nofalldamage_version", PLUGIN_VERSION, "Version of this plugin (Not changeable)", FCVAR_DONTRECORD|FCVAR_NOTIFY|FCVAR_SPONLY);
new Handle:cvar;
cvar = CreateConVar("sm_nofalldamage_mode", "0", "Team that should be protected from falldamage, 0 = disabled, 1 = Any, 2 = RED, 3 = BLUE", _, true, _, true, 3.0);
HookConVarChange(cvar, CVarChanged_Team);
iMode = GetConVarInt(cvar);
cvar = CreateConVar("sm_nofalldamage_admin", "az", "Clients that should be protected from falldamage: empty = any, flag letters = only admins with these flags", FCVAR_PRINTABLEONLY);
HookConVarChange(cvar, CVarChanged_Admin);
CVarChanged_Admin(cvar, NULL_STRING, NULL_STRING);
AutoExecConfig(true, "nofalldamage");
if(bLate) for(new i; i <= MaxClients; i++) OnClientPostAdminCheck(i);
}
public CVarChanged_Team(Handle:cvar, const String:oldValue[], const String:newValue[])
{
iMode = GetConVarInt(cvar);
}
public CVarChanged_Admin(Handle:cvar, const String:oldValue[], const String:newValue[])
{
new String:flags[24];
GetConVarString(cvar, flags, sizeof(flags));
iAdmin = ReadFlagString(flags);
}
public OnClientPostAdminCheck(client)
{
if(0 < client && client <= MaxClients && IsClientInGame(client)) SDKHook(client, SDKHook_OnTakeDamage, OnTakeDamage);
}
public Action:OnTakeDamage(victim, &attacker, &inflictor, &Float:damage, &damagetype)
{
if(!iMode || !(damagetype & DMG_FALL))
return Plugin_Continue;
if((iMode == 1 || GetClientTeam(victim) == iMode)
&& (IsFakeClient(victim) || !iAdmin || iAdmin & GetUserFlagBits(victim)))
return Plugin_Handled;
return Plugin_Continue;
}