#include <amxmodx>
#include <engine>
#include <reapi>
#pragma semicolon 1
native Array:cmsapi_get_user_services(const index, const szAuth[] = "", const szService[] = "", serviceID = 0, bool:part = false);
new const szPluginInfo[][] = {"[ReAPI] Parachute", "1.0", "Leo_[BH] + ApXuTekToR"};
enum e_cvars { c_ParashuteAll, c_ParashuteFall_Speed, c_ParashuteFlag[16], c_ParashuteName_Service[32] }
new cvars[e_cvars];
new bool:g_is_alive[33];
new bool:g_has_parachute[33];
public plugin_init()
{
RegisterHookChain(RG_CBasePlayer_Spawn, "RG_Spawn_Post", 1);
RegisterHookChain(RG_CBasePlayer_Killed, "RG_Player_Killed", 0);
RegisterHookChain(RG_CBasePlayer_PreThink, "RG_client_PreThink");
}
public plugin_precache(){
register_plugin(szPluginInfo[0], szPluginInfo[1], szPluginInfo[2]);
initCvars();
}
public initCvars()
{
bind_pcvar_num(create_cvar( "Parachute_ParachuteAll", "3", FCVAR_NONE, "Доступ к парашюту:^n\
'0' - Доступен всем^n\
'1' - Доступен по флагу^n\
'2' - По названию услуги^n\
'3' - По флагу и услуге" ), cvars[c_ParashuteAll]);
bind_pcvar_num(create_cvar( "Parachute_c_ParachuteFall_Speed", "90", FCVAR_NONE, "Скорость падения при открытом парашюте" ), cvars[c_ParashuteFall_Speed]);
bind_pcvar_string(create_cvar( "Parachute_gFade_VaultName", "t", FCVAR_NONE, "Флаг доступа для парашюта" ), cvars[c_ParashuteFlag], charsmax(cvars[c_ParashuteFlag]));
bind_pcvar_string(create_cvar( "Parachute_gCommandOpen", "_parashute", FCVAR_NONE, "Название услуги для продажи через сайт^n\
в начале обязательно должен быть знак:^n\
'_' - нижнее подчеркивание" ), cvars[c_ParashuteName_Service], charsmax(cvars[c_ParashuteName_Service]));
AutoExecConfig(true, "Parachute", "SevCorp");
}
public RG_client_PreThink(id)
{
if(!g_is_alive[id]) return;
if(!g_has_parachute[id]) return;
new Float:fallspeed = cvars[c_ParashuteFall_Speed] * -1.0;
new button = get_entvar(id, EntVars:var_button);
new oldbutton = get_entvar(id, EntVars:var_oldbuttons);
if (get_entvar(id, EntVars:var_gravity) == 0.1) set_entvar(id, EntVars:var_gravity, 1.0);
if (button & IN_USE)
{
new Float:velocity[3];
entity_get_vector(id, EV_VEC_velocity, velocity);
if (velocity[2] < 0.0) {
set_entvar(id, EntVars:var_gravity, 0.1);
velocity[2] = (velocity[2] + 40.0 < fallspeed) ? velocity[2] + 40.0 : fallspeed;
entity_set_vector(id, EV_VEC_velocity, velocity);
}
}
else if ((oldbutton & IN_USE)) {
set_entvar(id, EntVars:var_gravity, 1.0);
}
}
public client_putinserver(id)
{
recheck_flags(id);
}
public client_disconnected(id)
{
g_is_alive[id] = false;
g_has_parachute[id] = false;
}
public RG_Spawn_Post(id)
{
if(is_user_alive(id)) { g_is_alive[id] = true; }
recheck_flags(id);
}
public RG_Player_Killed(victim, attacker)
{
g_is_alive[victim] = false;
}
public recheck_flags(id)
{
static Array:Services;
Services = cmsapi_get_user_services(id, "", cvars[c_ParashuteName_Service]);
if(cvars[c_ParashuteAll] == 0) {
g_has_parachute[id] = true;
} else if(cvars[c_ParashuteAll] == 1) {
if(access_parachute(id)) {
g_has_parachute[id] = true;
} else {
g_has_parachute[id] = false;
}
} else if(cvars[c_ParashuteAll] == 2) {
if(Services) {
g_has_parachute[id] = true;
} else {
g_has_parachute[id] = false;
}
} else if(cvars[c_ParashuteAll] == 3) {
if(access_parachute(id) || Services) {
g_has_parachute[id] = true;
} else {
g_has_parachute[id] = false;
}
}
}
stock bool:access_parachute(id)
{
new flags, u_flags[32];
flags = get_user_flags(id);
get_flags(flags, u_flags, charsmax(u_flags));
return (containi(u_flags, cvars[c_ParashuteFlag]) != -1) ? true : false;
}