Health Grenade

Плагин АМХХ Health Grenade Устаревший

Нет прав для скачивания
C++:
#include <amxmodx>
#include <fakemeta>
#include <engine>
#include <fun>
#include <csx>

#pragma semicolon 1

new const szPluginInfo[][] = {"Smoke HealthNade", "1.1", "medusa + ApXuTekToR"};

#define SUPPORT_GAMECMS

#if defined SUPPORT_GAMECMS
native Array:cmsapi_get_user_services(const index, const szAuth[] = "", const szService[] = "", serviceID = 0, bool:part = false);
#endif

#define MODEL_V        "models/health_nade/v_he_mk_nade.mdl"
#define MODEL_P        "models/health_nade/p_he_mk_nade.mdl"
#define MODEL_W        "models/health_nade/w_he_mk_nade.mdl"

new const SPRITE_EXPLODE1[]    = "sprites/health_nade/heal_explode.spr";
new const SPRITE_PROS[]        = "sprites/health_nade/heal_shape.spr";

new const SOUND_HEAL[]        = "health_nade/woomen_expr.wav";

enum {
    XO_WEAPON    = 4,
    XO_CGRENADE     = 5,
    m_pPlayer    = 41,
    m_usEvent    = 114
}

new const EXCLASS[] = "grenade";

enum { STATUSICON_HIDE = 0, STATUSICON_FLASH = 2 };

const flagSmokeEvent    = (1 << 1);

#define IsSgGrenade(%1)            (get_pdata_int(%1, m_usEvent, XO_CGRENADE) & flagSmokeEvent)

#define _GetEntOwner(%1)        pev(%1, pev_owner)
#define _GetEntOrigin(%1,%2)    pev(%1, pev_origin, %2)

#define _SetViewModel(%1,%2)    set_pev(%1, pev_viewmodel2, %2)
#define _SetWeaponModel(%1,%2)    set_pev(%1, pev_weaponmodel2, %2)
#define _SetWorldModel(%1,%2)    engfunc(EngFunc_SetModel, %1, %2)

#define _RemoveEntity(%1)        engfunc(EngFunc_RemoveEntity, %1)

#define _get_blindStartTime(%1)    get_ent_data_float(%1, "CBasePlayer", "m_blindStartTime")
#define _get_blindFadeTime(%1)    get_ent_data_float(%1, "CBasePlayer", "m_blindFadeTime")

#if AMXX_VERSION_NUM < 183
#error [ERROR]: AMXX 1.8.2 - not supported (cuz use new fakemeta natives)!
#endif

new g_MsgId_StatusIcon, g_MsgId_ScreenFade;

new g_pFirstExplosion,
g_pPros,
g_pCircle;

enum status_s { status_DISABLED = 0, status_ENABLED = 1 };
new status_s: g_bCanUseItem = status_ENABLED;

enum e_cvars {
    c_AccessUse_Nade,
    c_AccessFlags[16],
    c_AccessServices[32],
    c_HealTeammates_Or_All,

    c_GiveHealth_Num,
    c_GiveHealth_Limite,
    c_GiveHealth_Radius,

    c_ScreenFade_Effects,
}
new cvars[e_cvars];

public plugin_natives()
{
    register_native("SHN_SetStatus", "native__SetStatus", .style = 0);
    register_native("SHN_GetStatus", "native__GetStatus", .style = 0);
}

public plugin_init() {
    g_MsgId_StatusIcon = get_user_msgid("StatusIcon");
    g_MsgId_ScreenFade = get_user_msgid("ScreenFade");
    register_touch(EXCLASS, "*", "CGrenade_ExplodeTouch");
    register_event("CurWeapon", "Event_CurWeapon", "be", "1=1");
    initCvars();
    new szConfigsDir[256];
    get_localinfo("amxx_configsdir", szConfigsDir, charsmax(szConfigsDir));
    server_cmd("exec %s/SevCorp/HelthNade.cfg", szConfigsDir);
    server_exec();
}

#if defined SUPPORT_GAMECMS
public plugin_cfg() {
    if(is_plugin_loaded("GameCMS_API") == INVALID_PLUGIN_ID)
    {
        log_amx("WARNING: gamecms_api.amxx isn't loaded! Plugin Stopped.");
        pause("a");
        return;
    }
}
#endif

public plugin_precache() {
    register_plugin(szPluginInfo[0], szPluginInfo[1], szPluginInfo[2]);
    precache_model(MODEL_V);
    precache_model(MODEL_P);
    precache_model(MODEL_W);
    g_pFirstExplosion = precache_model(SPRITE_EXPLODE1);
    g_pPros = precache_model(SPRITE_PROS);
    g_pCircle = precache_model("sprites/shockwave.spr");
    precache_sound(SOUND_HEAL);

}

public initCvars() {
    register_cvar("HelthGrenade_AccessUse_Nade",        "0");
    register_cvar("HelthGrenade_AccessFlags",            "m");
#if defined SUPPORT_GAMECMS
    register_cvar("HelthGrenade_AccessServices",        "_healthnade");
#endif
    register_cvar("HelthGrenade_HealTeammates_Or_All",    "0");

    register_cvar("HelthGrenade_GiveHealth_Num",        "50");
    register_cvar("HelthGrenade_GiveHealth_Limite",        "110");
    register_cvar("HelthGrenade_GiveHealth_Radius",        "300");
    register_cvar("HelthGrenade_ScreenFade_Effects",    "1");

    get_cvar_string("HelthGrenade_AccessFlags", cvars[c_AccessFlags], charsmax(cvars[c_AccessFlags]));
#if defined SUPPORT_GAMECMS
    get_cvar_string("HelthGrenade_AccessServices", cvars[c_AccessServices], charsmax(cvars[c_AccessServices]));
#endif
    cvars[c_AccessUse_Nade]            = get_cvar_num("HelthGrenade_AccessUse_Nade");
    cvars[c_HealTeammates_Or_All]    = get_cvar_num("HelthGrenade_HealTeammates_Or_All");

    cvars[c_GiveHealth_Num]            = get_cvar_num("HelthGrenade_GiveHealth_Num");
    cvars[c_GiveHealth_Limite]        = get_cvar_num("HelthGrenade_GiveHealth_Limite");
    cvars[c_GiveHealth_Radius]        = get_cvar_num("HelthGrenade_GiveHealth_Radius");
    cvars[c_ScreenFade_Effects]        = get_cvar_num("HelthGrenade_ScreenFade_Effects");
}

public Event_CurWeapon(pPlayer) {
    enum { WeaponID = 2 };
    if(read_data(WeaponID) == CSW_SMOKEGRENADE)    {
        if(!IsAllowedToUse(pPlayer)) return;
        OnPlayer_SetViewModels(pPlayer);
        Send_StatusIcon__Cross(pPlayer);
    } else Send_StatusIcon__Cross(pPlayer, .status = STATUSICON_HIDE);
}

public grenade_throw(pPlayer, pEnt, w_id) {
    if(w_id != CSW_SMOKEGRENADE)
    return;

    if(!IsAllowedToUse(pPlayer))
    return;

    OnGrenade_SetWorldModel(pEnt);
}

public CGrenade_ExplodeTouch(const pEnt, const pOther) {
    if(!IsSgGrenade(pEnt))
    return;

    static iOwner; iOwner = _GetEntOwner(pEnt);

    if(!IsAllowedToUse(iOwner))
    return;

    static Float: fOrigin[3], iOrigin[3];
    _GetEntOrigin(pEnt, fOrigin);
    FVecIVec(fOrigin, iOrigin);
    Send_Explode(iOrigin);
    Send_Pros(iOrigin);
    Send_ShockWave(iOrigin);
    OnGrenade_PlaySound(pEnt);
    OnGrenade_RemoveByTouch(pEnt);
    HealPlayersOnRadius(iOwner, fOrigin);
}

stock HealPlayersOnRadius(pInflictor, Float: fOrigin[3]) {
    for(new pPlayer = 1; pPlayer <= MaxClients; pPlayer++) {
        if(is_user_alive(pPlayer)) {

            if(cvars[c_HealTeammates_Or_All] == 1) {
                if(get_user_team(pInflictor) != get_user_team(pPlayer))
                continue;
            }

            #pragma unused pInflictor

            static Float: playerOrigin[3];
            _GetEntOrigin(pPlayer, playerOrigin);

            if(get_distance_f(fOrigin, playerOrigin) < cvars[c_GiveHealth_Radius])
            OnPlayer_HealEvent(pPlayer);
        }
    }
}

stock OnPlayer_HealEvent(const pPlayer) {
    if((get_user_health(pPlayer) + cvars[c_GiveHealth_Num]) < cvars[c_GiveHealth_Limite]) {
        set_user_health(pPlayer, (get_user_health(pPlayer) + cvars[c_GiveHealth_Num]));
    } else if((get_user_health(pPlayer) + cvars[c_GiveHealth_Num]) >= cvars[c_GiveHealth_Limite]) {
        set_user_health(pPlayer, cvars[c_GiveHealth_Limite]);
    }

    if(cvars[c_ScreenFade_Effects] == 1) {
        if(!IsBlind(pPlayer)) __UTIL_ScreenFade(pPlayer);
    }
}

stock OnPlayer_SetViewModels(const pPlayer) {
    _SetViewModel(pPlayer, MODEL_V);
    _SetWeaponModel(pPlayer, MODEL_P);
}

stock OnGrenade_SetWorldModel(const pEnt)
_SetWorldModel(pEnt, MODEL_W);

stock OnGrenade_RemoveByTouch(const pEnt)
_RemoveEntity(pEnt);

stock Send_StatusIcon__Cross(const pPlayer, status = STATUSICON_FLASH) {
    message_begin(MSG_ONE_UNRELIABLE, g_MsgId_StatusIcon, .player = pPlayer);
    write_byte(status);
    write_string("cross");
    write_byte(0);
    write_byte(255);
    write_byte(0);
    message_end();
}

stock OnGrenade_PlaySound(const pEnt)
engfunc(EngFunc_EmitSound, pEnt, CHAN_WEAPON, SOUND_HEAL, VOL_NORM, ATTN_NORM, 0, PITCH_NORM);


stock Send_Explode(iOrigin[3]) {
    emessage_begin(MSG_PVS, SVC_TEMPENTITY);
    ewrite_byte(TE_EXPLOSION);
    ewrite_coord(iOrigin[0]);
    ewrite_coord(iOrigin[1]);
    ewrite_coord(iOrigin[2] + 65);
    ewrite_short(g_pFirstExplosion);
    ewrite_byte(30);
    ewrite_byte(20);
    ewrite_byte(TE_EXPLFLAG_NOSOUND | TE_EXPLFLAG_NOPARTICLES);
    emessage_end();
}

stock Send_Pros(iOrigin[3]) {
    emessage_begin(MSG_PVS, SVC_TEMPENTITY);
    ewrite_byte(TE_SPRITETRAIL);
    ewrite_coord(iOrigin[0]);
    ewrite_coord(iOrigin[1]);
    ewrite_coord(iOrigin[2] + 20);
    ewrite_coord(iOrigin[0]);
    ewrite_coord(iOrigin[1]);
    ewrite_coord(iOrigin[2] + 80);
    ewrite_short(g_pPros);
    ewrite_byte(20);
    ewrite_byte(20);
    ewrite_byte(4);
    ewrite_byte(20);
    ewrite_byte(10);
    emessage_end();
}

stock Send_ShockWave(iOrigin[3]) {
    emessage_begin(MSG_PVS, SVC_TEMPENTITY);
    ewrite_byte(TE_BEAMCYLINDER);
    ewrite_coord(iOrigin[0]);
    ewrite_coord(iOrigin[1]);
    ewrite_coord(iOrigin[2]);
    ewrite_coord(iOrigin[0]);
    ewrite_coord(iOrigin[1]);
    ewrite_coord(iOrigin[2] + cvars[c_GiveHealth_Radius]);
    ewrite_short(g_pCircle);
    ewrite_byte(0);
    ewrite_byte(1);
    ewrite_byte(5);
    ewrite_byte(30);
    ewrite_byte(1);
    ewrite_byte(10);
    ewrite_byte(255);
    ewrite_byte(40);
    ewrite_byte(255);
    ewrite_byte(5);
    emessage_end();
}

stock __UTIL_ScreenFade(const pPlayer, iColor[3] = {170, 255, 0}, iAlpha = 80, Float: flFxTime = 1.0, Float: flHoldTime = 0.3) {
    const FFADE_IN = 0x0000;

    emessage_begin(MSG_ONE_UNRELIABLE, g_MsgId_ScreenFade, .player = pPlayer);
    ewrite_short(FixedUnsigned16(flFxTime));
    ewrite_short(FixedUnsigned16(flHoldTime));
    ewrite_short(FFADE_IN);
    ewrite_byte(iColor[0]);
    ewrite_byte(iColor[1]);
    ewrite_byte(iColor[2]);
    ewrite_byte(iAlpha);
    emessage_end();
}

stock FixedUnsigned16(Float:flValue, iScale = (1 << 12)) {
    return clamp(floatround(flValue * iScale), 0, 0xFFFF);
}

bool: IsAllowedToUse(pPlayer) {
#pragma unused pPlayer

    if(cvars[c_AccessUse_Nade] == 1) {
        if(!(checkAccess(pPlayer, cvars[c_AccessFlags]))) {
            return false;
        }
    }
#if defined SUPPORT_GAMECMS
    else if(cvars[c_AccessUse_Nade] == 2) {
        static Array:Services;
        Services = cmsapi_get_user_services(pPlayer, "", cvars[c_AccessServices]);
        if(!Services) {
            return false;
        }
    }
#endif

    if(g_bCanUseItem == status_DISABLED) {
        client_print_color(pPlayer, print_team_default, "^3[^4Nade^3] ^1Лечебная граната выключена^4!");
        return false;
    }
    return true;
}

stock bool: IsBlind(pPlayer) {
    return bool:(Float: _get_blindStartTime(pPlayer) + Float: _get_blindFadeTime(pPlayer) >= get_gametime());
}

checkAccess(const pPlayer, const flags[]){
    return (get_user_flags(pPlayer) & read_flags(flags));
}

/* API?! */

/**
* Set item status to use.
*
* @note Usage examples:
*       SHN_SetStatus(1);
*
* @param status: 1 - enabled / 0 - disabled
*
* @noreturn
*/
// native SHN_SetStatus(status)
public native__SetStatus(plugin_id, argc)
{
    enum { arg_status = 1 };

    g_bCanUseItem = get_param(arg_status) == 1 ? status_ENABLED : status_DISABLED;
}

/**
* Retrieves the item status to use.
*
* @note Usage examples:
*       SHN_GetStatus();
*
* @return Current status: 1 - enabled / 0 - disabled
*/
// native SHN_GetStatus()
public native__GetStatus(plugin_id, argc)
{
    return g_bCanUseItem == status_ENABLED ? status_ENABLED : status_DISABLED;
}
Назад
Сверху