#include <sourcemod>
#include <sdktools>
#pragma semicolon 1
#define PARACHUTE_MODEL "models/parachute/parachute_carbon.mdl"
#define NO_PARACHUTE -1
new g_iParachute_Ent[MAXPLAYERS+1] = {NO_PARACHUTE, ...};
new g_iVelocity = -1;
public OnPluginStart() g_iVelocity = FindSendPropOffs("CBasePlayer", "m_vecVelocity[0]");
public OnMapStart() PrecacheModel(PARACHUTE_MODEL, true);
public Action:OnPlayerRunCmd(iClient, &buttons, &impulse, Float:vel[3], Float:angles[3], &weapon)
{
if (IsPlayerAlive(iClient))
{
static bool:_bInUse[MAXPLAYERS+1],
Float:_fVelocity[MAXPLAYERS+1][3];
GetEntDataVector(iClient, g_iVelocity, _fVelocity[iClient]);
if(!_bInUse[iClient] && (buttons & IN_USE) && !(GetEntityFlags(iClient) & FL_ONGROUND))
{
if(_fVelocity[iClient][2] < 0.0)
{
_fVelocity[iClient][2] = (_fVelocity[iClient][2] >= -100.0) ? -100.0:(_fVelocity[iClient][2] +50.0);
TeleportEntity(iClient, NULL_VECTOR, NULL_VECTOR, _fVelocity[iClient]);
SetEntDataVector(iClient, g_iVelocity, _fVelocity[iClient]);
SetEntityGravity(iClient, 0.1);
_bInUse[iClient] = true;
if(g_iParachute_Ent[iClient] == NO_PARACHUTE) g_iParachute_Ent[iClient] = CreateParachute(iClient);
} else KillParachute(iClient);
}
else if (!(buttons & IN_USE) && _bInUse[iClient])
{
SetEntityGravity(iClient, 1.0);
_bInUse[iClient] = false;
KillParachute(iClient);
}
else if(_fVelocity[iClient][2] >= 0.0)
{
SetEntityGravity(iClient, 1.0);
KillParachute(iClient);
}
}
return Plugin_Continue;
}
CreateParachute(iClient)
{
new iEntity = CreateEntityByName("prop_physics");
decl String:sBuffer[64];
FormatEx(sBuffer, sizeof(sBuffer), "%i_%i", iClient, iEntity);
DispatchKeyValue(iClient, "targetname", sBuffer);
DispatchKeyValue(iEntity, "model", PARACHUTE_MODEL);
SetEntityMoveType(iEntity, MOVETYPE_NOCLIP);
DispatchSpawn(iEntity);
decl Float:or[3],
Float:ang[3],
Float:fForward[3],
Float:fRight[3],
Float:fUp[3];
GetClientAbsOrigin(iClient, or);
GetClientAbsAngles(iClient, ang);
GetAngleVectors(ang, fForward, fRight, fUp);
new Float:dest_vector[3] = {0.0, -10.0, 0.0};
or[0] += fRight[0]*dest_vector[0] + fForward[0]*dest_vector[1] + fUp[0]*dest_vector[2];
or[1] += fRight[1]*dest_vector[0] + fForward[1]*dest_vector[1] + fUp[1]*dest_vector[2];
or[2] += fRight[2]*dest_vector[0] + fForward[2]*dest_vector[1] + fUp[2]*dest_vector[2];
TeleportEntity(iEntity, or, NULL_VECTOR, NULL_VECTOR);
ActivateEntity(iEntity);
SetVariantString(sBuffer);
AcceptEntityInput(iEntity, "SetParent", iEntity, iEntity, 0);
return iEntity;
}
KillParachute(iClient)
{
if(g_iParachute_Ent[iClient] != NO_PARACHUTE)
{
if(IsValidEntity(g_iParachute_Ent[iClient])) AcceptEntityInput(g_iParachute_Ent[iClient], "Kill");
g_iParachute_Ent[iClient] = NO_PARACHUTE;
}
}