Добавить квар

DURILKA

Пользователь
Регистрация
2 Сен 2017
Сообщения
131
Симпатии
15
Пол
Мужской
OS
Linux
Amx Mod X
AMXX 1.9.0
Билд
Protocol version 48 Exe version 1.1.2.7/Stdio (cstrike) ReHLDS version: 3.7.0.692-dev-mpatch Build date: 18:13:20 Sep 30 2019 (1997) Build from: https://github.com/dreamstalker/rehlds/commit/e7232be
ReGamedll
ReGameDLL version: 5.12.0.425-dev Build date: 08:48:23 Nov 2 2019 Build from: https://github.com/s1lentq/ReGameDLL_CS/commit/fd06d65
Metamod
Metamod v1.21p37 2013/05/30 (5:13) by Will Day http://www.metamod.org/ Patch: Metamod-P (mm-p) v37 by Jussi Kivilinna http://metamod-p.sourceforge.net/ compiled: May 30 2013, 11:41:16 EET (optimized)
Meta модули
Код:
-
Плагины
Код:
-
Amxx Модули
Код:
-
Ошибка
Код:
Хочу запретить на некоторых картах её. И хотелось бы делать это через квар.
Можно попросить у вас помощи. В плагин нужно добавить квар Вкл|Выкл выдавание хилки.

Хилка:
#pragma semicolon 1

#include <amxmodx>
#include <fakemeta>
#include <hamsandwich>
#include <reapi>

const Float:HEAL_RADIUS = 300.0;
const Float:HEAL_AMOUNT = 20.0;

const ACCESS_FLAG = ADMIN_LEVEL_H;
const AMMO_ID = 16;

const WeaponIdType:WEAPON_ID = WEAPON_SMOKEGRENADE;
const WeaponIdType:WEAPON_NEW_ID = WEAPON_GLOCK;
const WeaponIdType:WEAPON_FAKE_ID = WeaponIdType:75;

new const GRENADE_VIEW_MODEL[] = "models/reapi_healthnade/v_healthnade.mdl";
new const GRENADE_PLAYER_MODEL[] = "models/reapi_healthnade/p_healthnade.mdl";
new const GRENADE_WORLD_MODEL[] = "models/reapi_healthnade/w_healthnade.mdl";
new const GRENADE_EXPLODE_SOUND[] = "weapons/reapi_healthnade/heal.wav";
new const GRENADE_EXPLODE_SPRITE[] = "sprites/reapi_healthnade/heal_explode.spr";
new const GUNPICKUP_SOUND[] = "items/gunpickup2.wav";
new const SHAPE_SPRITE[] = "sprites/reapi_healthnade/heal_shape.spr";
new const WEAPON_NAME[] = "weapon_smokegrenade";
new const AMMO_NAME[] = "HealthNade";
new const WEAPON_NEW_NAME[] = "reapi_healthnade/weapon_healthnade";
new const ITEM_CLASSNAME[] = "weapon_healthnade";
new const GRENADE_CLASSNAME[] = "healthnade";

new SpriteCylinder, SpriteExplode, SpriteShape, g_pCvarNadeDrops;
new MsgIdWeaponList, MsgIdAmmoPickup, MsgIdStatusIcon, MsgIdScreenFade;
#if WEAPON_NEW_ID != WEAPON_GLOCK
new FwdRegUserMsg, MsgHookWeaponList;
#endif

public plugin_precache() {
    register_plugin("[ReAPI] Healthnade", "0.0.3", "F@nt0M");

    precache_model(GRENADE_VIEW_MODEL);
    precache_model(GRENADE_PLAYER_MODEL);
    precache_model(GRENADE_WORLD_MODEL);
    precache_sound(GRENADE_EXPLODE_SOUND);
    precache_sound(GUNPICKUP_SOUND);

    SpriteExplode = precache_model(GRENADE_EXPLODE_SPRITE);
    SpriteShape = precache_model(SHAPE_SPRITE);
    SpriteCylinder = precache_model("sprites/shockwave.spr");

    if(get_cvar_num("sv_auto_precache_sounds_in_models") == 0)
    {
        UTIL_PrecacheSoundsFromModel(GRENADE_VIEW_MODEL);
    }
    UTIL_PrecacheSpritesFromTxt(WEAPON_NEW_NAME);

#if WEAPON_NEW_ID != WEAPON_GLOCK
    MsgIdWeaponList = get_user_msgid("WeaponList");
    if (MsgIdWeaponList) {
        MsgHookWeaponList = register_message(MsgIdWeaponList, "HookWeaponList");
    } else {
        FwdRegUserMsg = register_forward(FM_RegUserMsg, "RegUserMsg_Post", true);
    }
#endif
}

public plugin_init() {
    register_clcmd(WEAPON_NEW_NAME, "CmdSelect");

    RegisterHookChain(RG_CBasePlayer_OnSpawnEquip, "CBasePlayer_OnSpawnEquip_Post", true);
    RegisterHookChain(RG_CBasePlayer_Killed, "CPlayer_Killed_Post", .post = true);

    RegisterHookChain(RG_CSGameRules_CleanUpMap, "CSGameRules_CleanUpMap_Post", true);
    RegisterHookChain(RG_CBasePlayer_GiveAmmo, "CBasePlayer_GiveAmmo_Pre", false);
    RegisterHookChain(RG_CBasePlayerWeapon_DefaultDeploy, "CBasePlayerWeapon_DefaultDeploy_Pre", false);

    RegisterHam(Ham_Item_Deploy, WEAPON_NAME, "Item_Deploy_Post", true);
    RegisterHam(Ham_Item_Holster, WEAPON_NAME, "Item_Holster_Post", true);

    RegisterHookChain(RG_CBasePlayer_ThrowGrenade, "CBasePlayer_ThrowGrenade_Pre", false);

    MsgIdAmmoPickup = get_user_msgid("AmmoPickup");
    MsgIdStatusIcon = get_user_msgid("StatusIcon");
    MsgIdScreenFade = get_user_msgid("ScreenFade");

#if WEAPON_NEW_ID == WEAPON_GLOCK
    MsgIdWeaponList = get_user_msgid("WeaponList");
    UTIL_WeapoList(
        MSG_INIT, 0,
        WEAPON_NEW_NAME,
        AMMO_ID, 1,
        -1, -1, GRENADE_SLOT, 4, WEAPON_NEW_ID,
        ITEM_FLAG_LIMITINWORLD | ITEM_FLAG_EXHAUSTIBLE
    );
#else
    if (FwdRegUserMsg) {
        unregister_forward(FM_RegUserMsg, FwdRegUserMsg, true);
    }
    unregister_message(MsgIdWeaponList, MsgHookWeaponList);
#endif

    g_pCvarNadeDrops = get_cvar_pointer("mp_nadedrops");
}

#if WEAPON_NEW_ID != WEAPON_GLOCK
public RegUserMsg_Post(const name[]) {
    if (strcmp(name, "WeaponList") == 0) {
        MsgIdWeaponList = get_orig_retval();
        MsgHookWeaponList = register_message(MsgIdWeaponList, "HookWeaponList");
    }
}

public plugin_natives()
{
    register_native("IsUserHasHealthNade", "Native_IsUserHasHealthNade", false);
    register_native("GiveUserHealthNade", "Native_GiveUserHealthNade", false);
}

public Native_GiveUserHealthNade(iPlugin, iParams)
{
    enum { arg_player = 1 };

    new iPlayer = get_param(arg_player);

    if(!is_user_connected(iPlayer))
    {
        return false;
    }

    giveNade(iPlayer);

    return true;
}

public Native_IsUserHasHealthNade(iPlugin, iParams)
{
    enum { arg_player = 1 };

    new iPlayer = get_param(arg_player);

    if(!is_user_connected(iPlayer))
    {
        return false;
    }

    return bool:(get_member(iPlayer, m_rgAmmo, AMMO_ID));
}

public HookWeaponList(const msg_id, const msg_dest, const msg_entity) {
    enum {
        arg_name = 1,
        arg_ammo1,
        arg_ammo1_max,
        arg_ammo2,
        arg_ammo2_max,
        arg_slot,
        arg_position,
        arg_id,
        arg_flags,
    };

    if (msg_dest != MSG_INIT || WeaponIdType:get_msg_arg_int(arg_id) != WEAPON_NEW_ID) {
        return PLUGIN_CONTINUE;
    }

    set_msg_arg_string(arg_name,WEAPON_NEW_NAME);
    set_msg_arg_int(arg_ammo1, ARG_BYTE, AMMO_ID);
    set_msg_arg_int(arg_ammo1_max, ARG_BYTE, 1);
    set_msg_arg_int(arg_ammo2, ARG_BYTE, -1);
    set_msg_arg_int(arg_ammo2_max, ARG_BYTE, -1);
    set_msg_arg_int(arg_slot, ARG_BYTE, _:GRENADE_SLOT - 1);
    set_msg_arg_int(arg_position, ARG_BYTE, 4);
    set_msg_arg_int(arg_flags, ARG_BYTE, ITEM_FLAG_LIMITINWORLD | ITEM_FLAG_EXHAUSTIBLE);

    return PLUGIN_CONTINUE;
}
#endif

public CBasePlayer_OnSpawnEquip_Post(const id) {
#if defined ACCESS_FLAG
    if (~get_user_flags(id) & ACCESS_FLAG) {
        return;
    }
#endif
    giveNade(id);
}

public CmdSelect(const id) {
    if (!is_user_alive(id)) {
        return PLUGIN_HANDLED;
    }

    new item = rg_get_player_item(id, ITEM_CLASSNAME, GRENADE_SLOT);
    if (item != 0 && get_member(id, m_pActiveItem) != item) {
        rg_switch_weapon(id, item);
    }
    return PLUGIN_HANDLED;
}

public CSGameRules_CleanUpMap_Post() {
    new ent = rg_find_ent_by_class(NULLENT, GRENADE_CLASSNAME, false);
    while (ent > 0) {
        destroyNade(ent);
        ent = rg_find_ent_by_class(ent, GRENADE_CLASSNAME, false);
    }
}

public CBasePlayer_GiveAmmo_Pre(const id, const amount, const name[]) {
    if (strcmp(name, AMMO_NAME) != 0) {
        return HC_CONTINUE;
    }

    giveAmmo(id, amount, AMMO_ID, 1);
    SetHookChainReturn(ATYPE_INTEGER, AMMO_ID);
    return HC_SUPERCEDE;
}


public CBasePlayerWeapon_DefaultDeploy_Pre(const item, const szViewModel[], const szWeaponModel[], const iAnim, const szAnimExt[], const skiplocal) {
    if (FClassnameIs(item, ITEM_CLASSNAME)) {
        SetHookChainArg(2, ATYPE_STRING, GRENADE_VIEW_MODEL);
        SetHookChainArg(3, ATYPE_STRING, GRENADE_PLAYER_MODEL);
    }

    new WeaponIdType:wid = WeaponIdType:rg_get_iteminfo(item, ItemInfo_iId);
    if (wid != WEAPON_ID && wid != WEAPON_FAKE_ID) {
        return HC_CONTINUE;
    }

    new lastItem = get_member(get_member(item, m_pPlayer), m_pLastItem);
    if (is_nullent(lastItem) || item == lastItem) {
        return HC_CONTINUE;
    }

    if (WeaponIdType:rg_get_iteminfo(lastItem, ItemInfo_iId) == WEAPON_ID) {
        SetHookChainArg(6, ATYPE_INTEGER, 0);
    }

    return HC_CONTINUE;
}

public Item_Deploy_Post(const item) {
    if (WeaponIdType:rg_get_iteminfo(item, ItemInfo_iId) == WEAPON_FAKE_ID) {
        rg_set_iteminfo(item, ItemInfo_iId, WEAPON_ID);
    }

    new other = get_member(get_member(item, m_pPlayer), m_rgpPlayerItems, GRENADE_SLOT);
    while (!is_nullent(other)) {
        if (item != other && WeaponIdType:rg_get_iteminfo(other, ItemInfo_iId) == WEAPON_ID) {
            rg_set_iteminfo(other, ItemInfo_iId, WEAPON_FAKE_ID);
        }
        other = get_member(other, m_pNext);
    }
}

public Item_Holster_Post(const item) {
    new other = get_member(get_member(item, m_pPlayer), m_rgpPlayerItems, GRENADE_SLOT);
    while (!is_nullent(other)) {
        if (item != other && WeaponIdType:rg_get_iteminfo(other, ItemInfo_iId) == WEAPON_FAKE_ID) {
            rg_set_iteminfo(other, ItemInfo_iId, WEAPON_ID);
        }
        other = get_member(other, m_pNext);
    }
}

public CBasePlayer_ThrowGrenade_Pre(const id, const item, const Float:vecSrc[3], const Float:vecThrow[3], const Float:time, const const usEvent) {
    if (!FClassnameIs(item, ITEM_CLASSNAME)) {
        return HC_CONTINUE;
    }

    new grenade = throwNade(id, vecSrc, vecThrow, time);
    SetHookChainReturn(ATYPE_INTEGER, grenade);
    return HC_SUPERCEDE;
}

public GrenadeTouch(const grenade, const other) {
    if (!is_nullent(grenade)) {
        explodeNade(grenade);
    }
}

public GrenadeThink(const grenade) {
    if (!is_nullent(grenade)) {
        explodeNade(grenade);
    }
}

giveNade(const id) {
    new item = rg_get_player_item(id, ITEM_CLASSNAME, GRENADE_SLOT);
    if (item != 0) {
        giveAmmo(id, 1, AMMO_ID, 1);
        return item;
    }

    item = rg_create_entity(WEAPON_NAME, false);
    if (is_nullent(item)) {
        return NULLENT;
    }

    new Float:origin[3];
    get_entvar(id, var_origin, origin);
    set_entvar(item, var_origin, origin);
    set_entvar(item, var_spawnflags, get_entvar(item, var_spawnflags) | SF_NORESPAWN);

    set_member(item, m_Weapon_iPrimaryAmmoType, AMMO_ID);
    set_member(item, m_Weapon_iSecondaryAmmoType, -1);

    set_entvar(item, var_classname, ITEM_CLASSNAME);
 
    dllfunc(DLLFunc_Spawn, item);
 
    set_member(item, m_iId, WEAPON_NEW_ID);

    rg_set_iteminfo(item, ItemInfo_pszName, WEAPON_NEW_NAME);
    rg_set_iteminfo(item, ItemInfo_pszAmmo1, AMMO_NAME);
    rg_set_iteminfo(item, ItemInfo_iMaxAmmo1, 1);
    rg_set_iteminfo(item, ItemInfo_iId, WEAPON_FAKE_ID);
    rg_set_iteminfo(item, ItemInfo_iPosition, 4);
    rg_set_iteminfo(item, ItemInfo_iWeight, 1);
 
    dllfunc(DLLFunc_Touch, item, id);

    if (get_entvar(item, var_owner) != id) {
        set_entvar(item, var_flags, FL_KILLME);
        return NULLENT;
    }

    return item;
}

public CPlayer_Killed_Post(iVictim, iAttacker, iGib)
{
    if(!is_user_connected(iVictim))
    {
        return;
    }

    if(!get_pcvar_num(g_pCvarNadeDrops))
    {
        return;
    }

    if(!get_member(iVictim, m_rgAmmo, AMMO_ID))
    {
        return;
    }

    dropNade(iVictim);
}


dropNade(const iPlayer)
{
    if(!is_user_connected(iPlayer))
    {
        return;
    }

    new iEntity = rg_create_entity("info_target");

    if(is_nullent(iEntity))
    {
        return;
    }

    new Float: vecOrigin[3];
    new Float: vecVelocity[3];

    ExecuteHam(Ham_Player_GetGunPosition, iPlayer, vecOrigin);

    vecVelocity[0] = random_float(-45.0, 45.0);
    vecVelocity[1] = random_float(-45.0, 45.0);

    engfunc(EngFunc_SetModel, iEntity, GRENADE_WORLD_MODEL);
    engfunc(EngFunc_SetOrigin, iEntity, vecOrigin);

    set_entvar(iEntity, var_classname, GRENADE_CLASSNAME);
    set_entvar(iEntity, var_velocity, vecVelocity);
    set_entvar(iEntity, var_movetype, MOVETYPE_TOSS);
    set_entvar(iEntity, var_solid, SOLID_TRIGGER);

    SetTouch(iEntity, "touchNade");
}


public touchNade(iEntity, iOther)
{
    if(is_nullent(iEntity) || is_nullent(iOther))
    {
        return;
    }

    if(!ExecuteHam(Ham_IsPlayer, iOther))
    {
        return;
    }

    // todo add cvar - pickup nade to access users
 
    if(!get_member(iOther, m_rgAmmo, AMMO_ID))
    {
        giveNade(iOther);
        rh_emit_sound2(iOther, 0, CHAN_ITEM, GUNPICKUP_SOUND);
    }
    else
    {
        return;
    }

    engfunc(EngFunc_RemoveEntity, iEntity);
}


giveAmmo(const id, const amount, const ammo, const max) {
    if (get_entvar(id, var_flags) & FL_SPECTATOR) {
        return;
    }

    new count = get_member(id, m_rgAmmo, ammo);
    new add = min(amount, max - count);
    if (add < 1) {
        return;
    }

    set_member(id, m_rgAmmo, count + add, ammo);

    emessage_begin(MSG_ONE, MsgIdAmmoPickup, .player = id);
    ewrite_byte(ammo);
    ewrite_byte(add);
    emessage_end();
}

throwNade(const id, const Float:vecSrc[3], const Float:vecThrow[3], const Float:time) {
    new grenade = rg_create_entity("info_target", false);
    if (is_nullent(grenade)) {
        return 0;
    }

    set_entvar(grenade, var_classname, GRENADE_CLASSNAME);

    set_entvar(grenade, var_movetype, MOVETYPE_BOUNCE);
    set_entvar(grenade, var_solid, SOLID_BBOX);

    engfunc(EngFunc_SetOrigin, grenade, vecSrc);

    new Float:angles[3];
    get_entvar(id, var_angles, angles);
    set_entvar(grenade, var_angles, angles);

    set_entvar(grenade, var_owner, id);
 
    if (time < 0.1) {
        set_entvar(grenade, var_nextthink, get_gametime());
        set_entvar(grenade, var_velocity, Float:{0.0, 0.0, 0.0});
    } else {
        set_entvar(grenade, var_nextthink, get_gametime() + time);
        set_entvar(grenade, var_velocity, vecThrow);
    }

    set_entvar(grenade, var_sequence, random_num(3, 6));
    set_entvar(grenade, var_framerate, 1.0);
    set_entvar(grenade, var_gravity, 0.5);
    set_entvar(grenade, var_friction, 0.8);
    engfunc(EngFunc_SetModel, grenade, GRENADE_WORLD_MODEL);
    set_entvar(grenade, var_dmg, 30.0);
    set_entvar(grenade, var_dmgtime, get_gametime() + time);

    SetTouch(grenade, "GrenadeTouch");
    SetThink(grenade, "GrenadeThink");
    return grenade;
}

explodeNade(const grenade) {
    new Float:origin[3];
    get_entvar(grenade, var_origin, origin);

    UTIL_BeamCylinder(origin, SpriteCylinder, 1, 5, 30, 1, {10, 255, 40}, 255, 5, HEAL_RADIUS);
    UTIL_CreateExplosion(origin, 65.0, SpriteExplode, 30, 20, (TE_EXPLFLAG_NOSOUND | TE_EXPLFLAG_NOPARTICLES));
    UTIL_SpriteTrail(origin, SpriteShape);

    rh_emit_sound2(grenade, 0, CHAN_WEAPON, GRENADE_EXPLODE_SOUND, VOL_NORM, ATTN_NORM, 0, PITCH_NORM);

    new id = get_entvar(grenade, var_owner);
    new team = get_member(id, m_iTeam);

    for (new player = 1, Float:playerOrigin[3]; player <= MaxClients; player++) {
        if (!is_user_alive(player) || get_member(player, m_iTeam) != team) {
            continue;
        }

        get_entvar(player, var_origin, playerOrigin);
        if (get_distance_f(origin, playerOrigin) < HEAL_RADIUS) {
            ExecuteHamB(Ham_TakeHealth, player, HEAL_AMOUNT, DMG_GENERIC);
            UTIL_ScreenFade(player);
        }
    }

    destroyNade(grenade);
}

destroyNade(const grenade) {
    SetTouch(grenade, "");
    SetThink(grenade, "");
    set_entvar(grenade, var_flags, FL_KILLME);
}

stock rg_get_player_item(const id, const classname[], const InventorySlotType:slot = NONE_SLOT) {
    new item = get_member(id, m_rgpPlayerItems, slot);
    while (!is_nullent(item)) {
        if (FClassnameIs(item, classname)) {
            return item;
        }
        item = get_member(item, m_pNext);
    }

    return 0;
}

stock bool:IsBlind(const player) {
    return bool:(Float:get_member(player, m_blindUntilTime) > get_gametime());
}

stock UTIL_WeapoList(
    const type,
    const player,
    const name[],
    const ammo1,
    const maxAmmo1,
    const ammo2,
    const maxammo2,
    const InventorySlotType:slot,
    const position,
    const WeaponIdType:id,
    const flags
) {
    message_begin(type, MsgIdWeaponList, .player = player);
    write_string(name);
    write_byte(ammo1);
    write_byte(maxAmmo1);
    write_byte(ammo2);
    write_byte(maxammo2);
    write_byte(_:slot - 1);
    write_byte(position);
    write_byte(_:id);
    write_byte(flags);
    message_end();
}

stock UTIL_StatusIcon(const player, const type, const sprite[], const color[3]) {
    message_begin(MSG_ONE, MsgIdStatusIcon, .player = player);
    write_byte(type); // 0 - hide 1 - show 2 - flash
    write_string(sprite);
    write_byte(color[0]);
    write_byte(color[1]);
    write_byte(color[2]);
    message_end();
}

stock UTIL_ScreenFade(const player, const Float:fxTime = 1.0, const Float:holdTime = 0.3, const color[3] = {170, 255, 0}, const alpha = 80) {
    if (IsBlind(player)) {
        return;
    }

    const FFADE_IN = 0x0000;

    message_begin(MSG_ONE_UNRELIABLE, MsgIdScreenFade, .player = player);
    write_short(FixedUnsigned16(fxTime));
    write_short(FixedUnsigned16(holdTime));
    write_short(FFADE_IN);
    write_byte(color[0]);
    write_byte(color[1]);
    write_byte(color[2]);
    write_byte(alpha);
    message_end();
}

stock UTIL_BeamCylinder(const Float:origin[3], const sprite, const framerate, const life, const width, const amplitude, const color[3], const bright, const speed, const Float:size) {
    message_begin_f(MSG_PVS, SVC_TEMPENTITY, origin, 0);
    write_byte(TE_BEAMCYLINDER);
    write_coord_f(origin[0]);
    write_coord_f(origin[1]);
    write_coord_f(origin[2]);
    write_coord_f(origin[0]);
    write_coord_f(origin[1]);
    write_coord_f(origin[2] + size);
    write_short(sprite);
    write_byte(0);
    write_byte(framerate);
    write_byte(life);
    write_byte(width);
    write_byte(amplitude);
    write_byte(color[0]);
    write_byte(color[1]);
    write_byte(color[2]);
    write_byte(bright);
    write_byte(speed);
    message_end();
}

stock UTIL_CreateExplosion(const Float:origin[3], const Float:vecUp, const modelIndex, const scale, const frameRate, const flags) {
    message_begin_f(MSG_PVS, SVC_TEMPENTITY, origin, 0);
    write_byte(TE_EXPLOSION);
    write_coord_f(origin[0]);
    write_coord_f(origin[1]);
    write_coord_f(origin[2] + vecUp);
    write_short(modelIndex);
    write_byte(scale);
    write_byte(frameRate);
    write_byte(flags);
    message_end();
}

stock UTIL_SpriteTrail(Float:origin[3], const sprite, const cound = 20, const life = 20, const scale = 4, const noise = 20, const speed = 10) {
    message_begin(MSG_BROADCAST, SVC_TEMPENTITY); // MSG_PVS
    write_byte(TE_SPRITETRAIL);
    write_coord_f(origin[0]);
    write_coord_f(origin[1]);
    write_coord_f(origin[2] + 20.0);
    write_coord_f(origin[0]);
    write_coord_f(origin[1]);
    write_coord_f(origin[2] + 80.0);
    write_short(sprite);
    write_byte(cound);
    write_byte(life);
    write_byte(scale);
    write_byte(noise);
    write_byte(speed);
    message_end();
}

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

stock UTIL_PrecacheSoundsFromModel(const szModelPath[])
{
    new iFile;

    if((iFile = fopen(szModelPath, "rt")))
    {
        new szSoundPath[64];

        new iNumSeq, iSeqIndex;
        new iEvent, iNumEvents, iEventIndex;

        fseek(iFile, 164, SEEK_SET);
        fread(iFile, iNumSeq, BLOCK_INT);
        fread(iFile, iSeqIndex, BLOCK_INT);

        for(new k, i = 0; i < iNumSeq; i++)
        {
            fseek(iFile, iSeqIndex + 48 + 176 * i, SEEK_SET);
            fread(iFile, iNumEvents, BLOCK_INT);
            fread(iFile, iEventIndex, BLOCK_INT);
            fseek(iFile, iEventIndex + 176 * i, SEEK_SET);

            for(k = 0; k < iNumEvents; k++)
            {
                fseek(iFile, iEventIndex + 4 + 76 * k, SEEK_SET);
                fread(iFile, iEvent, BLOCK_INT);
                fseek(iFile, 4, SEEK_CUR);

                if(iEvent != 5004)
                    continue;

                fread_blocks(iFile, szSoundPath, 64, BLOCK_CHAR);

                if(strlen(szSoundPath))
                {
                    strtolower(szSoundPath);
                    engfunc(EngFunc_PrecacheSound, szSoundPath);
                }
            }
        }
    }

    fclose(iFile);
}

stock UTIL_PrecacheSpritesFromTxt(const szWeaponList[])
{
    new szTxtDir[64], szSprDir[64];
    new szFileData[128], szSprName[48], temp[1];

    format(szTxtDir, charsmax(szTxtDir), "sprites/%s.txt", szWeaponList);
    engfunc(EngFunc_PrecacheGeneric, szTxtDir);

    new iFile = fopen(szTxtDir, "rb");
    while(iFile && !feof(iFile))
    {
        fgets(iFile, szFileData, charsmax(szFileData));
        trim(szFileData);

        if(!strlen(szFileData))
            continue;

        new pos = containi(szFileData, "640");

        if(pos == -1)
            continue;

        format(szFileData, charsmax(szFileData), "%s", szFileData[pos+3]);
        trim(szFileData);

        strtok(szFileData, szSprName, charsmax(szSprName), temp, charsmax(temp), ' ', 1);
        trim(szSprName);

        format(szSprDir, charsmax(szSprDir), "sprites/%s.spr", szSprName);
        engfunc(EngFunc_PrecacheGeneric, szSprDir);
    }

    if(iFile) fclose(iFile);
}
 

ThePhoenix

Пользователь
Регистрация
8 Июл 2017
Сообщения
205
Симпатии
38
Пол
Мужской
DURILKA, Вам нужно заблокировать выдавание хилки на некоторых картах? или только на одной? И вы хотите, чтобы название карты вписывалось в квар?
 

DURILKA

Пользователь
Регистрация
2 Сен 2017
Сообщения
131
Симпатии
15
Пол
Мужской
ThePhoenix, я не знаю как это точно называется. Вот может так поймёте. Я в плагине cvar_on_map вписываю квары которые нкжно изменить на некоторых картах. Вот пример.
; Напишите название карты, на которой нужно изменить какие ни будь квары или прописать команду сервера
; Карту можно не писать целиком, квары и команды разделяются символом |
; Вместо карты можете использовать идентификаторы от других наших плагинов, чтобы изменить квары в момент наступления какого ни будь события
; Смотрите примеры ниже и делайте по аналогии, в консоли сервера будет написано какие квары и команды менял плагин
;
; ВАЖНО! Плагин должен быть расположен в plugins.ini в самом верху! По крайней мере выше тех плагинов, чьи квары Вы будете писать в этом файле


; Отключит на awp картах действие плагина Snipers RBS
awp_ mp_freezetime "0" | change_gamename "AWP тебе не палец"

aim_ mp_freezetime "0" | change_gamename "Присоединяйся"

$2000$ mp_freezetime "0" | change_gamename "Присоединяйся"

$2000_meat$ mp_freezetime "0" | change_gamename "Присоединяйся"

; Отключит на картах 35hp и 35hp_2 и других начинающихся на 35hp, все бонусы от Army Ranks Ultimate
35hp_ uk_duel_hit "0" | uk_firstround_type "0" | uk_throw_enable "0" | change_gamename "Взял нож, реж"

cs_ mp_roundtime "4" | change_gamename "Умные заложники"

; Включит на этой карте CSDM, при условии что есть плагин CSDM Lite
;awp_india csdm_enable "1"



; Можно указать диапазон времени, в течении которого, при каждой смене карты будут выполняться команды
; Например можно отключать ночью скачку моделей от плагина ultimate_models.amxx(чтобы немного увеличить онлайн), и заменить имя игры
;time:23:00-09:00 models_disable "bd" | change_gamename "Ночной режим"


; Как только начнется ночной режим от плагина MapChooser RBS, продолжительность карты изменится на 120 минут
;nightmode mp_timelimit "120"


; Плагин Night DM. Если включен ночной режим, то включится поддержка csdm в наших других плагинах,
; отключится проверка на awp и выключится подсчет статистики и скилла
;ndm_on mp_roundtime 10|mp_timelimit 0|csstats_enable 0|skill_enable 0|ar_xp_enable 0|vip_menu_csdm 1|bonusmenu_csdm 1|ar_csdm 1|snipers_enable 0|change_gamename "Режим NightDM" | break "1"
; Когда ночной режим выключится, квары выставятся по умолчанию из server.cfg. Другие квары которые меняли сами примут значения по умолчанию из своих конфигов
;ndm_off break "0" | exec "server.cfg" | snipers_enable "1" | change_gamename ""


; Вызовется при включении режима CSDM в плагине CSDM Lite
;csdm_on mp_roundtime 10
; Вызовется при отключении режима кваром csdm_enable "0"
;csdm_off exec "server.cfg"


; Вызовется при включении режима FunDM в плагине Admin Fun DM
;afundm_on csstats_enable "0" | skill_enable "0" | ar_xp_enable "0" | ar_anew_enable "0" | snipers_enable "0" | change_gamename "Режим FunDM"
; Вызовется при отключении режима
;afundm_off csstats_enable "1" | skill_enable "1" | ar_xp_enable "1" | ar_anew_enable "1" | snipers_enable "1" | change_gamename ""


; Вызовется когда начнется разминочный раунд на ножах плагина Ultimate Knife
;knife_on csstats_enable "0" | skill_enable "0" | ar_xp_enable "0" | ar_anew_enable "0"
; Вызовется при окончании разминки
;knife_off csstats_enable "1" | skill_enable "1" | ar_xp_enable "1" | ar_anew_enable "1"


; Вызовется когда начнутся /voteknife раунды(раунды на ножах плагина Ultimate Knife)
;knife_vote_on csstats_enable "0" | skill_enable "0" | ar_xp_enable "0" | ar_anew_enable "0"
; Вызовется при окончании /voteknife
;knife_vote_off csstats_enable "1" | skill_enable "1" | ar_xp_enable "1" | ar_anew_enable "1"


; Вызовется когда начнется дуэль на ножах (плагин Ultimate Knife)
;knife_duel_on csstats_enable "0" | skill_enable "0" | ar_xp_enable "0" | ar_anew_enable "0"
; Вызовется при окончании дуэли
;knife_duel_off csstats_enable "1" | skill_enable "1" | ar_xp_enable "1" | ar_anew_enable "1"


; Вызовется когда начнется разминочный раунд плагина Warmup RBS
;warmup_on csstats_enable "0" | skill_enable "0" | ar_xp_enable "0" | ar_anew_enable "0" | change_gamename "Идет Разминка"
; Вызовется при окончании разминки
;warmup_off csstats_enable "1" | skill_enable "1" | ar_xp_enable "1" | ar_anew_enable "1" | change_gamename ""


; События плагина ultimate_flags.amxx
; Вызовется при старте ночного вип
;flags_night_on change_gamename "Ночной VIP"
; Вызовется при окончании ночного вип
;flags_night_off change_gamename ""
; Вызовется при старте праздника
;flags_holiday_on change_gamename "Бесплатный VIP"
; Вызовется при окончании праздника
;flags_holiday_off change_gamename ""


; Вызовется при старте hostage_mod.amxx (если на карте есть заложники и hostage_enable "1")
;hostage_mod change_gamename "Hostage Mod"





; Плагин умеет менять имя игры(в поиске, вместо "Counter-Strike") командой: change_gamename "что ни будь"
; В примерах выше могли увидеть, как при Ночном ДМ, имя игры сменится на "Режим NightDM"
; Чтобы вернуть имя игры по умолчанию, оставьте пустое значение: change_gamename ""
; Чтобы навсегда изменить имя игры, впишите эту команду в amxx.cfg

; Чтобы отключить какой ни будь сторонний плагин, используйте команду amx_pausecfg pause "plugin.amxx"
; Это стандартная команда в амхх от плагина pausecfg.amxx, чтобы снять с паузы, используйте amx_pausecfg enable "plugin.amxx"

; Используйте специальный для этого плагина квар: break "1"
; После его включения, все остальные команды или квары, введенные этим плагином, не будут выполнены
; Для чего это нужно?
; Например при включении nightdm(см. идентификатор ndm_on) вы отключаете ведение статистики(csstats_enable "0")
; Но если вызовется событие knife_vote_off(закончился раунд на ножах), то будет выполнен csstats_enable "1" и статистика будет писаться
; Так вот, чтобы этого не произошло, при включении ночного ДМ, в самом конце строки выполняется break "1". После чего, при раунде на ножах, никакие квары не выполнятся.
; При завершении ночного ДМ(ndm_off), надо отключить break "0", чтобы разрешить выполнять другие квары и команды
; Как то так ;)

И мне хотелось бы что бы я смог туда вписать квар о выключении плагина или запретить выдавать вообще хилку.
 

ThePhoenix

Пользователь
Регистрация
8 Июл 2017
Сообщения
205
Симпатии
38
Пол
Мужской
DURILKA, аааа)
ну тогда надо просто зарегать квар, установить условие, что при значении таком-то работает выдача, при другом нет и всё) Ну или проверять квар при старте карты и ставить на паузу

p.s. Дошпилю, покажу как.
 

DURILKA

Пользователь
Регистрация
2 Сен 2017
Сообщения
131
Симпатии
15
Пол
Мужской
ThePhoenix, спасибо. Буду ждать )
 

ThePhoenix

Пользователь
Регистрация
8 Июл 2017
Сообщения
205
Симпатии
38
Пол
Мужской
DURILKA, перед
Код:
new SpriteCylinder, SpriteExplode, SpriteShape, g_pCvarNadeDrops;
добавь
Код:
new cvar_healthnade;
после
Код:
register_plugin("[ReAPI] Healthnade", "0.0.3", "F@nt0M");
добавь
Код:
cvar_healthnade = register_cvar("heathnade_mode", "1");

if(get_pcvar_num(cvar_healthnade) == 1)
{
    pause("ad");
}
Вот собсна и будет отключение.
А в конфигах, где не нужна работа плагина устанавливай значение 1, квара "heathnade_mode", а если нужно, то 0.
Как попробуешь, отпишешь
 
Последнее редактирование:

DURILKA

Пользователь
Регистрация
2 Сен 2017
Сообщения
131
Симпатии
15
Пол
Мужской
ThePhoenix, при компилировании какой то варнинг
1598130351544.png

1598130378271.png
А так работает. То есть на тех картах на которых запретил. Он не работает.
Хотя нет. не сработало это все.... Я просто забыл удалить папку maps из конфига где я запретил работу плагина.
 
Последнее редактирование:

ThePhoenix

Пользователь
Регистрация
8 Июл 2017
Сообщения
205
Симпатии
38
Пол
Мужской
DURILKA, проверяй amxx plugins в консоли, чекай на паузе плагин или нет, а так же значение квара в консоли проверяй + плагин выдачи грены должен быть ниже, чем плагин смены кваров
 

DURILKA

Пользователь
Регистрация
2 Сен 2017
Сообщения
131
Симпатии
15
Пол
Мужской
ThePhoenix, Все сделал как ты говорил. На карте 35hp_ я его отключил, а он работает и теперь на некоторых картах de_dust2_2x2 начал криво работать. Не всегда выдается она.
Код:
[ 35] [ReAPI] Healthnade      0.0.3       F@nt0M            reapi_healthnad  running
Консоль выбивает "heathnade_mode" is "0" , а он всё равно выдает её
Видать что то не так
 

DURILKA

Пользователь
Регистрация
2 Сен 2017
Сообщения
131
Симпатии
15
Пол
Мужской
ааа все понял. Я не внимательно прочитал. 1 значит выкл, а 0 - ВКЛ
Но что делать с варнингом.
 

ThePhoenix

Пользователь
Регистрация
8 Июл 2017
Сообщения
205
Симпатии
38
Пол
Мужской
DURILKA, поправь просто на == 0 и будет тебе счастье, чтобы не путаться))
Варнинги на работу не влияют, если это не "tag mismatch", просто табуляции где-то не хватает, забей.
 

DURILKA

Пользователь
Регистрация
2 Сен 2017
Сообщения
131
Симпатии
15
Пол
Мужской
ThePhoenix, Все разобрался по поводу табуляции. Поискал в интернете и кое как разобрался. Что есть два варианта табуляции или скорее всего больше. Наткнулся только на два. Просто напросто нужно было пробелами сделать отступы, а не кнопкой ТАБ. Для таких как я, нигде не написано про это. Кое как догадался. :) Спасибо тебе за помощь. Пытаюсь добавить еще в один плагин такое, но там код немного другой, И сразу же для меня тупик )
 

fantom

Разработчик
Регистрация
11 Июн 2017
Сообщения
426
Симпатии
293
Пол
Мужской
DURILKA, редакторы давно научились раставлять проблелы при нажатии ТАБ. Другое дело что tab vs spaces древнейший холивар в мире программирования.
 

DURILKA

Пользователь
Регистрация
2 Сен 2017
Сообщения
131
Симпатии
15
Пол
Мужской
fantom, я в программирование вообще не силен, для меня всё это, новое и непонятное. Видео уроков нет грамотных, по написанию плагинов или объяснению даже той самой Табуляции. Слово для меня новое и сразу знак вопроса в голове. А на самом деле если разобраться, то это все просто. Компилятор еще такой привереда оказался. )))
 

Defau1t

Скриптер
Постоялец
Регистрация
22 Июл 2020
Сообщения
61
Симпатии
12
C++:
#pragma semicolon 1

#include <amxmodx>
#include <fakemeta>
#include <hamsandwich>
#include <reapi>

const Float:HEAL_RADIUS = 300.0;
const Float:HEAL_AMOUNT = 20.0;

const ACCESS_FLAG = ADMIN_LEVEL_H;
const AMMO_ID = 16;

const WeaponIdType:WEAPON_ID = WEAPON_SMOKEGRENADE;
const WeaponIdType:WEAPON_NEW_ID = WEAPON_GLOCK;
const WeaponIdType:WEAPON_FAKE_ID = WeaponIdType:75;

new const GRENADE_VIEW_MODEL[] = "models/reapi_healthnade/v_healthnade.mdl";
new const GRENADE_PLAYER_MODEL[] = "models/reapi_healthnade/p_healthnade.mdl";
new const GRENADE_WORLD_MODEL[] = "models/reapi_healthnade/w_healthnade.mdl";
new const GRENADE_EXPLODE_SOUND[] = "weapons/reapi_healthnade/heal.wav";
new const GRENADE_EXPLODE_SPRITE[] = "sprites/reapi_healthnade/heal_explode.spr";
new const GUNPICKUP_SOUND[] = "items/gunpickup2.wav";
new const SHAPE_SPRITE[] = "sprites/reapi_healthnade/heal_shape.spr";
new const WEAPON_NAME[] = "weapon_smokegrenade";
new const AMMO_NAME[] = "HealthNade";
new const WEAPON_NEW_NAME[] = "reapi_healthnade/weapon_healthnade";
new const ITEM_CLASSNAME[] = "weapon_healthnade";
new const GRENADE_CLASSNAME[] = "healthnade";

new g_iCVar, SpriteCylinder, SpriteExplode, SpriteShape, g_pCvarNadeDrops;
new MsgIdWeaponList, MsgIdAmmoPickup, MsgIdStatusIcon, MsgIdScreenFade;
#if WEAPON_NEW_ID != WEAPON_GLOCK
new FwdRegUserMsg, MsgHookWeaponList;
#endif

public plugin_precache() {
    register_plugin("[ReAPI] Healthnade", "0.0.3", "F@nt0M");

    bind_pcvar_num(create_cvar("healthnade_enabled","1"), g_iCVar);

    precache_model(GRENADE_VIEW_MODEL);
    precache_model(GRENADE_PLAYER_MODEL);
    precache_model(GRENADE_WORLD_MODEL);
    precache_sound(GRENADE_EXPLODE_SOUND);
    precache_sound(GUNPICKUP_SOUND);

    SpriteExplode = precache_model(GRENADE_EXPLODE_SPRITE);
    SpriteShape = precache_model(SHAPE_SPRITE);
    SpriteCylinder = precache_model("sprites/shockwave.spr");

    if(get_cvar_num("sv_auto_precache_sounds_in_models") == 0)
    {
        UTIL_PrecacheSoundsFromModel(GRENADE_VIEW_MODEL);
    }
    UTIL_PrecacheSpritesFromTxt(WEAPON_NEW_NAME);

#if WEAPON_NEW_ID != WEAPON_GLOCK
    MsgIdWeaponList = get_user_msgid("WeaponList");
    if (MsgIdWeaponList) {
        MsgHookWeaponList = register_message(MsgIdWeaponList, "HookWeaponList");
    } else {
        FwdRegUserMsg = register_forward(FM_RegUserMsg, "RegUserMsg_Post", true);
    }
#endif
}

public plugin_init() {
    register_clcmd(WEAPON_NEW_NAME, "CmdSelect");

    RegisterHookChain(RG_CBasePlayer_OnSpawnEquip, "CBasePlayer_OnSpawnEquip_Post", true);
    RegisterHookChain(RG_CBasePlayer_Killed, "CPlayer_Killed_Post", .post = true);

    RegisterHookChain(RG_CSGameRules_CleanUpMap, "CSGameRules_CleanUpMap_Post", true);
    RegisterHookChain(RG_CBasePlayer_GiveAmmo, "CBasePlayer_GiveAmmo_Pre", false);
    RegisterHookChain(RG_CBasePlayerWeapon_DefaultDeploy, "CBasePlayerWeapon_DefaultDeploy_Pre", false);

    RegisterHam(Ham_Item_Deploy, WEAPON_NAME, "Item_Deploy_Post", true);
    RegisterHam(Ham_Item_Holster, WEAPON_NAME, "Item_Holster_Post", true);

    RegisterHookChain(RG_CBasePlayer_ThrowGrenade, "CBasePlayer_ThrowGrenade_Pre", false);

    MsgIdAmmoPickup = get_user_msgid("AmmoPickup");
    MsgIdStatusIcon = get_user_msgid("StatusIcon");
    MsgIdScreenFade = get_user_msgid("ScreenFade");

#if WEAPON_NEW_ID == WEAPON_GLOCK
    MsgIdWeaponList = get_user_msgid("WeaponList");
    UTIL_WeapoList(
        MSG_INIT, 0,
        WEAPON_NEW_NAME,
        AMMO_ID, 1,
        -1, -1, GRENADE_SLOT, 4, WEAPON_NEW_ID,
        ITEM_FLAG_LIMITINWORLD | ITEM_FLAG_EXHAUSTIBLE
    );
#else
    if (FwdRegUserMsg) {
        unregister_forward(FM_RegUserMsg, FwdRegUserMsg, true);
    }
    unregister_message(MsgIdWeaponList, MsgHookWeaponList);
#endif

    g_pCvarNadeDrops = get_cvar_pointer("mp_nadedrops");
}

#if WEAPON_NEW_ID != WEAPON_GLOCK
public RegUserMsg_Post(const name[]) {
    if (strcmp(name, "WeaponList") == 0) {
        MsgIdWeaponList = get_orig_retval();
        MsgHookWeaponList = register_message(MsgIdWeaponList, "HookWeaponList");
    }
}

public plugin_natives()
{
    register_native("IsUserHasHealthNade", "Native_IsUserHasHealthNade", false);
    register_native("GiveUserHealthNade", "Native_GiveUserHealthNade", false);
}

public Native_GiveUserHealthNade(iPlugin, iParams)
{
    enum { arg_player = 1 };

    new iPlayer = get_param(arg_player);

    if(!is_user_connected(iPlayer))
    {
        return false;
    }

    giveNade(iPlayer);

    return true;
}

public Native_IsUserHasHealthNade(iPlugin, iParams)
{
    enum { arg_player = 1 };

    new iPlayer = get_param(arg_player);

    if(!is_user_connected(iPlayer))
    {
        return false;
    }

    return bool:(get_member(iPlayer, m_rgAmmo, AMMO_ID));
}

public HookWeaponList(const msg_id, const msg_dest, const msg_entity) {
    enum {
        arg_name = 1,
        arg_ammo1,
        arg_ammo1_max,
        arg_ammo2,
        arg_ammo2_max,
        arg_slot,
        arg_position,
        arg_id,
        arg_flags,
    };

    if (msg_dest != MSG_INIT || WeaponIdType:get_msg_arg_int(arg_id) != WEAPON_NEW_ID) {
        return PLUGIN_CONTINUE;
    }

    set_msg_arg_string(arg_name,WEAPON_NEW_NAME);
    set_msg_arg_int(arg_ammo1, ARG_BYTE, AMMO_ID);
    set_msg_arg_int(arg_ammo1_max, ARG_BYTE, 1);
    set_msg_arg_int(arg_ammo2, ARG_BYTE, -1);
    set_msg_arg_int(arg_ammo2_max, ARG_BYTE, -1);
    set_msg_arg_int(arg_slot, ARG_BYTE, _:GRENADE_SLOT - 1);
    set_msg_arg_int(arg_position, ARG_BYTE, 4);
    set_msg_arg_int(arg_flags, ARG_BYTE, ITEM_FLAG_LIMITINWORLD | ITEM_FLAG_EXHAUSTIBLE);

    return PLUGIN_CONTINUE;
}
#endif

public CBasePlayer_OnSpawnEquip_Post(const id) {
#if defined ACCESS_FLAG
    if (~get_user_flags(id) & ACCESS_FLAG) {
        return;
    }
#endif
    giveNade(id);
}

public CmdSelect(const id) {
    if (!is_user_alive(id)) {
        return PLUGIN_HANDLED;
    }

    new item = rg_get_player_item(id, ITEM_CLASSNAME, GRENADE_SLOT);
    if (item != 0 && get_member(id, m_pActiveItem) != item) {
        rg_switch_weapon(id, item);
    }
    return PLUGIN_HANDLED;
}

public CSGameRules_CleanUpMap_Post() {
    new ent = rg_find_ent_by_class(NULLENT, GRENADE_CLASSNAME, false);
    while (ent > 0) {
        destroyNade(ent);
        ent = rg_find_ent_by_class(ent, GRENADE_CLASSNAME, false);
    }
}

public CBasePlayer_GiveAmmo_Pre(const id, const amount, const name[]) {
    if (strcmp(name, AMMO_NAME) != 0) {
        return HC_CONTINUE;
    }

    giveAmmo(id, amount, AMMO_ID, 1);
    SetHookChainReturn(ATYPE_INTEGER, AMMO_ID);
    return HC_SUPERCEDE;
}


public CBasePlayerWeapon_DefaultDeploy_Pre(const item, const szViewModel[], const szWeaponModel[], const iAnim, const szAnimExt[], const skiplocal) {
    if (FClassnameIs(item, ITEM_CLASSNAME)) {
        SetHookChainArg(2, ATYPE_STRING, GRENADE_VIEW_MODEL);
        SetHookChainArg(3, ATYPE_STRING, GRENADE_PLAYER_MODEL);
    }

    new WeaponIdType:wid = WeaponIdType:rg_get_iteminfo(item, ItemInfo_iId);
    if (wid != WEAPON_ID && wid != WEAPON_FAKE_ID) {
        return HC_CONTINUE;
    }

    new lastItem = get_member(get_member(item, m_pPlayer), m_pLastItem);
    if (is_nullent(lastItem) || item == lastItem) {
        return HC_CONTINUE;
    }

    if (WeaponIdType:rg_get_iteminfo(lastItem, ItemInfo_iId) == WEAPON_ID) {
        SetHookChainArg(6, ATYPE_INTEGER, 0);
    }

    return HC_CONTINUE;
}

public Item_Deploy_Post(const item) {
    if (WeaponIdType:rg_get_iteminfo(item, ItemInfo_iId) == WEAPON_FAKE_ID) {
        rg_set_iteminfo(item, ItemInfo_iId, WEAPON_ID);
    }

    new other = get_member(get_member(item, m_pPlayer), m_rgpPlayerItems, GRENADE_SLOT);
    while (!is_nullent(other)) {
        if (item != other && WeaponIdType:rg_get_iteminfo(other, ItemInfo_iId) == WEAPON_ID) {
            rg_set_iteminfo(other, ItemInfo_iId, WEAPON_FAKE_ID);
        }
        other = get_member(other, m_pNext);
    }
}

public Item_Holster_Post(const item) {
    new other = get_member(get_member(item, m_pPlayer), m_rgpPlayerItems, GRENADE_SLOT);
    while (!is_nullent(other)) {
        if (item != other && WeaponIdType:rg_get_iteminfo(other, ItemInfo_iId) == WEAPON_FAKE_ID) {
            rg_set_iteminfo(other, ItemInfo_iId, WEAPON_ID);
        }
        other = get_member(other, m_pNext);
    }
}

public CBasePlayer_ThrowGrenade_Pre(const id, const item, const Float:vecSrc[3], const Float:vecThrow[3], const Float:time, const const usEvent) {
    if (!FClassnameIs(item, ITEM_CLASSNAME)) {
        return HC_CONTINUE;
    }

    new grenade = throwNade(id, vecSrc, vecThrow, time);
    SetHookChainReturn(ATYPE_INTEGER, grenade);
    return HC_SUPERCEDE;
}

public GrenadeTouch(const grenade, const other) {
    if (!is_nullent(grenade)) {
        explodeNade(grenade);
    }
}

public GrenadeThink(const grenade) {
    if (!is_nullent(grenade)) {
        explodeNade(grenade);
    }
}

giveNade(const id) {
    if(!g_iCVar) return NULLENT;

    new item = rg_get_player_item(id, ITEM_CLASSNAME, GRENADE_SLOT);
    if (item != 0) {
        giveAmmo(id, 1, AMMO_ID, 1);
        return item;
    }

    item = rg_create_entity(WEAPON_NAME, false);
    if (is_nullent(item)) {
        return NULLENT;
    }

    new Float:origin[3];
    get_entvar(id, var_origin, origin);
    set_entvar(item, var_origin, origin);
    set_entvar(item, var_spawnflags, get_entvar(item, var_spawnflags) | SF_NORESPAWN);

    set_member(item, m_Weapon_iPrimaryAmmoType, AMMO_ID);
    set_member(item, m_Weapon_iSecondaryAmmoType, -1);

    set_entvar(item, var_classname, ITEM_CLASSNAME);
 
    dllfunc(DLLFunc_Spawn, item);
 
    set_member(item, m_iId, WEAPON_NEW_ID);

    rg_set_iteminfo(item, ItemInfo_pszName, WEAPON_NEW_NAME);
    rg_set_iteminfo(item, ItemInfo_pszAmmo1, AMMO_NAME);
    rg_set_iteminfo(item, ItemInfo_iMaxAmmo1, 1);
    rg_set_iteminfo(item, ItemInfo_iId, WEAPON_FAKE_ID);
    rg_set_iteminfo(item, ItemInfo_iPosition, 4);
    rg_set_iteminfo(item, ItemInfo_iWeight, 1);
 
    dllfunc(DLLFunc_Touch, item, id);

    if (get_entvar(item, var_owner) != id) {
        set_entvar(item, var_flags, FL_KILLME);
        return NULLENT;
    }

    return item;
}

public CPlayer_Killed_Post(iVictim, iAttacker, iGib)
{
    if(!is_user_connected(iVictim))
    {
        return;
    }

    if(!get_pcvar_num(g_pCvarNadeDrops))
    {
        return;
    }

    if(!get_member(iVictim, m_rgAmmo, AMMO_ID))
    {
        return;
    }

    dropNade(iVictim);
}


dropNade(const iPlayer)
{
    if(!is_user_connected(iPlayer))
    {
        return;
    }

    new iEntity = rg_create_entity("info_target");

    if(is_nullent(iEntity))
    {
        return;
    }

    new Float: vecOrigin[3];
    new Float: vecVelocity[3];

    ExecuteHam(Ham_Player_GetGunPosition, iPlayer, vecOrigin);

    vecVelocity[0] = random_float(-45.0, 45.0);
    vecVelocity[1] = random_float(-45.0, 45.0);

    engfunc(EngFunc_SetModel, iEntity, GRENADE_WORLD_MODEL);
    engfunc(EngFunc_SetOrigin, iEntity, vecOrigin);

    set_entvar(iEntity, var_classname, GRENADE_CLASSNAME);
    set_entvar(iEntity, var_velocity, vecVelocity);
    set_entvar(iEntity, var_movetype, MOVETYPE_TOSS);
    set_entvar(iEntity, var_solid, SOLID_TRIGGER);

    SetTouch(iEntity, "touchNade");
}


public touchNade(iEntity, iOther)
{
    if(is_nullent(iEntity) || is_nullent(iOther))
    {
        return;
    }

    if(!ExecuteHam(Ham_IsPlayer, iOther))
    {
        return;
    }

    // todo add cvar - pickup nade to access users
 
    if(!get_member(iOther, m_rgAmmo, AMMO_ID))
    {
        giveNade(iOther);
        rh_emit_sound2(iOther, 0, CHAN_ITEM, GUNPICKUP_SOUND);
    }
    else
    {
        return;
    }

    engfunc(EngFunc_RemoveEntity, iEntity);
}


giveAmmo(const id, const amount, const ammo, const max) {
    if (get_entvar(id, var_flags) & FL_SPECTATOR) {
        return;
    }

    new count = get_member(id, m_rgAmmo, ammo);
    new add = min(amount, max - count);
    if (add < 1) {
        return;
    }

    set_member(id, m_rgAmmo, count + add, ammo);

    emessage_begin(MSG_ONE, MsgIdAmmoPickup, .player = id);
    ewrite_byte(ammo);
    ewrite_byte(add);
    emessage_end();
}

throwNade(const id, const Float:vecSrc[3], const Float:vecThrow[3], const Float:time) {
    new grenade = rg_create_entity("info_target", false);
    if (is_nullent(grenade)) {
        return 0;
    }

    set_entvar(grenade, var_classname, GRENADE_CLASSNAME);

    set_entvar(grenade, var_movetype, MOVETYPE_BOUNCE);
    set_entvar(grenade, var_solid, SOLID_BBOX);

    engfunc(EngFunc_SetOrigin, grenade, vecSrc);

    new Float:angles[3];
    get_entvar(id, var_angles, angles);
    set_entvar(grenade, var_angles, angles);

    set_entvar(grenade, var_owner, id);
 
    if (time < 0.1) {
        set_entvar(grenade, var_nextthink, get_gametime());
        set_entvar(grenade, var_velocity, Float:{0.0, 0.0, 0.0});
    } else {
        set_entvar(grenade, var_nextthink, get_gametime() + time);
        set_entvar(grenade, var_velocity, vecThrow);
    }

    set_entvar(grenade, var_sequence, random_num(3, 6));
    set_entvar(grenade, var_framerate, 1.0);
    set_entvar(grenade, var_gravity, 0.5);
    set_entvar(grenade, var_friction, 0.8);
    engfunc(EngFunc_SetModel, grenade, GRENADE_WORLD_MODEL);
    set_entvar(grenade, var_dmg, 30.0);
    set_entvar(grenade, var_dmgtime, get_gametime() + time);

    SetTouch(grenade, "GrenadeTouch");
    SetThink(grenade, "GrenadeThink");
    return grenade;
}

explodeNade(const grenade) {
    new Float:origin[3];
    get_entvar(grenade, var_origin, origin);

    UTIL_BeamCylinder(origin, SpriteCylinder, 1, 5, 30, 1, {10, 255, 40}, 255, 5, HEAL_RADIUS);
    UTIL_CreateExplosion(origin, 65.0, SpriteExplode, 30, 20, (TE_EXPLFLAG_NOSOUND | TE_EXPLFLAG_NOPARTICLES));
    UTIL_SpriteTrail(origin, SpriteShape);

    rh_emit_sound2(grenade, 0, CHAN_WEAPON, GRENADE_EXPLODE_SOUND, VOL_NORM, ATTN_NORM, 0, PITCH_NORM);

    new id = get_entvar(grenade, var_owner);
    new team = get_member(id, m_iTeam);

    for (new player = 1, Float:playerOrigin[3]; player <= MaxClients; player++) {
        if (!is_user_alive(player) || get_member(player, m_iTeam) != team) {
            continue;
        }

        get_entvar(player, var_origin, playerOrigin);
        if (get_distance_f(origin, playerOrigin) < HEAL_RADIUS) {
            ExecuteHamB(Ham_TakeHealth, player, HEAL_AMOUNT, DMG_GENERIC);
            UTIL_ScreenFade(player);
        }
    }

    destroyNade(grenade);
}

destroyNade(const grenade) {
    SetTouch(grenade, "");
    SetThink(grenade, "");
    set_entvar(grenade, var_flags, FL_KILLME);
}

stock rg_get_player_item(const id, const classname[], const InventorySlotType:slot = NONE_SLOT) {
    new item = get_member(id, m_rgpPlayerItems, slot);
    while (!is_nullent(item)) {
        if (FClassnameIs(item, classname)) {
            return item;
        }
        item = get_member(item, m_pNext);
    }

    return 0;
}

stock bool:IsBlind(const player) {
    return bool:(Float:get_member(player, m_blindUntilTime) > get_gametime());
}

stock UTIL_WeapoList(
    const type,
    const player,
    const name[],
    const ammo1,
    const maxAmmo1,
    const ammo2,
    const maxammo2,
    const InventorySlotType:slot,
    const position,
    const WeaponIdType:id,
    const flags
) {
    message_begin(type, MsgIdWeaponList, .player = player);
    write_string(name);
    write_byte(ammo1);
    write_byte(maxAmmo1);
    write_byte(ammo2);
    write_byte(maxammo2);
    write_byte(_:slot - 1);
    write_byte(position);
    write_byte(_:id);
    write_byte(flags);
    message_end();
}

stock UTIL_StatusIcon(const player, const type, const sprite[], const color[3]) {
    message_begin(MSG_ONE, MsgIdStatusIcon, .player = player);
    write_byte(type); // 0 - hide 1 - show 2 - flash
    write_string(sprite);
    write_byte(color[0]);
    write_byte(color[1]);
    write_byte(color[2]);
    message_end();
}

stock UTIL_ScreenFade(const player, const Float:fxTime = 1.0, const Float:holdTime = 0.3, const color[3] = {170, 255, 0}, const alpha = 80) {
    if (IsBlind(player)) {
        return;
    }

    const FFADE_IN = 0x0000;

    message_begin(MSG_ONE_UNRELIABLE, MsgIdScreenFade, .player = player);
    write_short(FixedUnsigned16(fxTime));
    write_short(FixedUnsigned16(holdTime));
    write_short(FFADE_IN);
    write_byte(color[0]);
    write_byte(color[1]);
    write_byte(color[2]);
    write_byte(alpha);
    message_end();
}

stock UTIL_BeamCylinder(const Float:origin[3], const sprite, const framerate, const life, const width, const amplitude, const color[3], const bright, const speed, const Float:size) {
    message_begin_f(MSG_PVS, SVC_TEMPENTITY, origin, 0);
    write_byte(TE_BEAMCYLINDER);
    write_coord_f(origin[0]);
    write_coord_f(origin[1]);
    write_coord_f(origin[2]);
    write_coord_f(origin[0]);
    write_coord_f(origin[1]);
    write_coord_f(origin[2] + size);
    write_short(sprite);
    write_byte(0);
    write_byte(framerate);
    write_byte(life);
    write_byte(width);
    write_byte(amplitude);
    write_byte(color[0]);
    write_byte(color[1]);
    write_byte(color[2]);
    write_byte(bright);
    write_byte(speed);
    message_end();
}

stock UTIL_CreateExplosion(const Float:origin[3], const Float:vecUp, const modelIndex, const scale, const frameRate, const flags) {
    message_begin_f(MSG_PVS, SVC_TEMPENTITY, origin, 0);
    write_byte(TE_EXPLOSION);
    write_coord_f(origin[0]);
    write_coord_f(origin[1]);
    write_coord_f(origin[2] + vecUp);
    write_short(modelIndex);
    write_byte(scale);
    write_byte(frameRate);
    write_byte(flags);
    message_end();
}

stock UTIL_SpriteTrail(Float:origin[3], const sprite, const cound = 20, const life = 20, const scale = 4, const noise = 20, const speed = 10) {
    message_begin(MSG_BROADCAST, SVC_TEMPENTITY); // MSG_PVS
    write_byte(TE_SPRITETRAIL);
    write_coord_f(origin[0]);
    write_coord_f(origin[1]);
    write_coord_f(origin[2] + 20.0);
    write_coord_f(origin[0]);
    write_coord_f(origin[1]);
    write_coord_f(origin[2] + 80.0);
    write_short(sprite);
    write_byte(cound);
    write_byte(life);
    write_byte(scale);
    write_byte(noise);
    write_byte(speed);
    message_end();
}

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

stock UTIL_PrecacheSoundsFromModel(const szModelPath[])
{
    new iFile;

    if((iFile = fopen(szModelPath, "rt")))
    {
        new szSoundPath[64];

        new iNumSeq, iSeqIndex;
        new iEvent, iNumEvents, iEventIndex;

        fseek(iFile, 164, SEEK_SET);
        fread(iFile, iNumSeq, BLOCK_INT);
        fread(iFile, iSeqIndex, BLOCK_INT);

        for(new k, i = 0; i < iNumSeq; i++)
        {
            fseek(iFile, iSeqIndex + 48 + 176 * i, SEEK_SET);
            fread(iFile, iNumEvents, BLOCK_INT);
            fread(iFile, iEventIndex, BLOCK_INT);
            fseek(iFile, iEventIndex + 176 * i, SEEK_SET);

            for(k = 0; k < iNumEvents; k++)
            {
                fseek(iFile, iEventIndex + 4 + 76 * k, SEEK_SET);
                fread(iFile, iEvent, BLOCK_INT);
                fseek(iFile, 4, SEEK_CUR);

                if(iEvent != 5004)
                    continue;

                fread_blocks(iFile, szSoundPath, 64, BLOCK_CHAR);

                if(strlen(szSoundPath))
                {
                    strtolower(szSoundPath);
                    engfunc(EngFunc_PrecacheSound, szSoundPath);
                }
            }
        }
    }

    fclose(iFile);
}

stock UTIL_PrecacheSpritesFromTxt(const szWeaponList[])
{
    new szTxtDir[64], szSprDir[64];
    new szFileData[128], szSprName[48], temp[1];

    format(szTxtDir, charsmax(szTxtDir), "sprites/%s.txt", szWeaponList);
    engfunc(EngFunc_PrecacheGeneric, szTxtDir);

    new iFile = fopen(szTxtDir, "rb");
    while(iFile && !feof(iFile))
    {
        fgets(iFile, szFileData, charsmax(szFileData));
        trim(szFileData);

        if(!strlen(szFileData))
            continue;

        new pos = containi(szFileData, "640");

        if(pos == -1)
            continue;

        format(szFileData, charsmax(szFileData), "%s", szFileData[pos+3]);
        trim(szFileData);

        strtok(szFileData, szSprName, charsmax(szSprName), temp, charsmax(temp), ' ', 1);
        trim(szSprName);

        format(szSprDir, charsmax(szSprDir), "sprites/%s.spr", szSprName);
        engfunc(EngFunc_PrecacheGeneric, szSprDir);
    }

    if(iFile) fclose(iFile);
}
try this one.
 

ThePhoenix

Пользователь
Регистрация
8 Июл 2017
Сообщения
205
Симпатии
38
Пол
Мужской
Defau1t, был бы смысл отключать саму выдачу гранаты, а не полностью плагин, если бы это надо было делать в какой-то определённый момент, а у него целую карту не нужно выдавать.
 
Сверху Снизу