Русское сообщество по скриптингу

Доработка плагина reapi_healthnade

Все вопросы по скриптингу для AMXX, помощь в редактировании плагинов.

Модераторы: Subb98, liFe iS GoOD

Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела "Болтовня".
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.

В данном разделе форума разрешено создавать темы, касающие только скриптинга для AMX Mod X.

Правила при создании новой темы:
1. При вставке кода плагина необходимо использовать тег [code=php].
2. Любые изображения должны быть загружены, как вложения к вашему сообщению.
3. При описании проблемы или запросе на помощь в редактировании плагина обязательно выкладывайте исходник sma плагина.

Доработка плагина reapi_healthnade

Сообщение nikolay.zimin.71 » 18 авг 2021, 21:56

Всем привет. Помогите доработать плагин сма файл прилогаю. В общем ситуация такая всё нормально работает, но есть один нюанс подскажите как можно сделать чтоб обычному игроку выдавалась одна граната хил а випу две, или сделать разделение допустим пусть по одной гранате так и выдаёт только обычному игроку 50 хп а випу 100. Заранее спасибо.
Код: Выделить всё
#pragma semicolon 1

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

const Float:HEAL_RADIUS 300.0;    // Радиус
const Float:HEAL_AMOUNT 50.0;     // Кол-ва восстанавливаемого хп
const MAXHEALTH 100;                 // Порог хп
const ACCESS_FLAG ADMIN_LEVEL_H;    // Флаг VIP(a)

const GRENADE_COUNT_USER 1;        // Кол-во гранат для пользователя
const GRENADE_COUNT_VIP 2;        // Кол-во гранат для "ACCESS_FLAG"

new RESPWAN_GIVE 2;                 // Выдача при спавне [0] - только для игрока, [1] - только для "ACCESS_FLAG", [2] - выдать всем

const WeaponIdType:WEAPON_ID WEAPON_SMOKEGRENADE;
const 
WeaponIdType:WEAPON_NEW_ID WEAPON_GLOCK;
const 
WeaponIdType:WEAPON_FAKE_ID WeaponIdType:75;
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";
const 
AMMO_ID 16;

new 
SpriteCylinderSpriteExplodeSpriteShape;
new 
MsgIdWeaponListMsgIdAmmoPickupMsgIdStatusIconMsgIdScreenFade;
#if WEAPON_NEW_ID != WEAPON_GLOCK
new FwdRegUserMsgMsgHookWeaponList;
#endif

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

    
precache_generic("sprites/reapi_healthnade/weapon_healthnade.txt");
    
precache_generic("sprites/reapi_healthnade/640hud128.spr");

    
precache_model("models/reapi_healthnade/v_healthnade.mdl");
    
precache_model("models/reapi_healthnade/p_healthnade.mdl");
    
precache_model("models/reapi_healthnade/w_healthnade.mdl");

    
precache_sound("weapons/reapi_healthnade/deploy.wav");
    
precache_sound("weapons/reapi_healthnade/pullpin.wav");

    
SpriteExplode precache_model("sprites/reapi_healthnade/heal_explode.spr");
    
SpriteShape precache_model("sprites/reapi_healthnade/heal_shape.spr");
    
SpriteCylinder precache_model("sprites/shockwave.spr");

    
precache_sound("weapons/reapi_healthnade/heal.wav");

#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_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_DeployWEAPON_NAME"Item_Deploy_Post"true);
    
RegisterHam(Ham_Item_HolsterWEAPON_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_INIT0,
        
WEAPON_NEW_NAME,
        
AMMO_ID1,
        -
1, -1GRENADE_SLOT4WEAPON_NEW_ID,
        
ITEM_FLAG_LIMITINWORLD ITEM_FLAG_EXHAUSTIBLE
    
);
#else
    
if (FwdRegUserMsg) {
        
unregister_forward(FM_RegUserMsgFwdRegUserMsgtrue);
    }
    
unregister_message(MsgIdWeaponListMsgHookWeaponList);
#endif
}

#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 
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_ammo1ARG_BYTEAMMO_ID);
    
set_msg_arg_int(arg_ammo1_maxARG_BYTE1);
    
set_msg_arg_int(arg_ammo2ARG_BYTE, -1);
    
set_msg_arg_int(arg_ammo2_maxARG_BYTE, -1);
    
set_msg_arg_int(arg_slotARG_BYTE_:GRENADE_SLOT 1);
    
set_msg_arg_int(arg_positionARG_BYTE4);
    
set_msg_arg_int(arg_flagsARG_BYTEITEM_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)
        {
            if (
RESPWAN_GIVE == || RESPWAN_GIVE == 2)
                
giveNade(idGRENADE_COUNT_USER);
        }
        else
        {
            if(
RESPWAN_GIVE == || RESPWAN_GIVE == 2)
                
giveNade(idGRENADE_COUNT_VIP);
        }
        
    
#endif
}

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

    new 
item rg_get_player_item(idITEM_CLASSNAMEGRENADE_SLOT);
    if (
item != && get_member(idm_pActiveItem) != item) {
        
rg_switch_weapon(iditem);
    }
    return 
PLUGIN_HANDLED;
}

public 
CSGameRules_CleanUpMap_Post() {
    new 
ent rg_find_ent_by_class(NULLENTGRENADE_CLASSNAMEfalse);
    while (
ent 0) {
        
destroyNade(ent);
        
ent rg_find_ent_by_class(entGRENADE_CLASSNAMEfalse);
    }
}

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

    
#if defined ACCESS_FLAG
    
        
if (~get_user_flags(id) & ACCESS_FLAG
            
giveAmmo(idGRENADE_COUNT_USERAMMO_ID1);
        else
            
giveAmmo(idGRENADE_COUNT_VIPAMMO_ID1);
    
    
#endif
    
    
SetHookChainReturn(ATYPE_INTEGERAMMO_ID);
    return 
HC_SUPERCEDE;
}


public 
CBasePlayerWeapon_DefaultDeploy_Pre(const item, const szViewModel[], const szWeaponModel[], const iAnim, const szAnimExt[], const skiplocal) {
    if (
FClassnameIs(itemITEM_CLASSNAME)) {
        
SetHookChainArg(2ATYPE_STRING"models/reapi_healthnade/v_healthnade.mdl");
        
SetHookChainArg(3ATYPE_STRING"models/reapi_healthnade/p_healthnade.mdl");
    }

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

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

    if (
WeaponIdType:rg_get_iteminfo(lastItemItemInfo_iId) == WEAPON_ID) {
        
SetHookChainArg(6ATYPE_INTEGER0);
    }

    return 
HC_CONTINUE;
}

public 
Item_Deploy_Post(const item) {
    if (
WeaponIdType:rg_get_iteminfo(itemItemInfo_iId) == WEAPON_FAKE_ID) {
        
rg_set_iteminfo(itemItemInfo_iIdWEAPON_ID);
    }

    new 
other get_member(get_member(itemm_pPlayer), m_rgpPlayerItemsGRENADE_SLOT);
    while (!
is_nullent(other)) {
        if (
item != other && WeaponIdType:rg_get_iteminfo(otherItemInfo_iId) == WEAPON_ID) {
            
rg_set_iteminfo(otherItemInfo_iIdWEAPON_FAKE_ID);
        }
        
other get_member(otherm_pNext);
    }
}

public 
Item_Holster_Post(const item) {
    new 
other get_member(get_member(itemm_pPlayer), m_rgpPlayerItemsGRENADE_SLOT);
    while (!
is_nullent(other)) {
        if (
item != other && WeaponIdType:rg_get_iteminfo(otherItemInfo_iId) == WEAPON_FAKE_ID) {
            
rg_set_iteminfo(otherItemInfo_iIdWEAPON_ID);
        }
        
other get_member(otherm_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(itemITEM_CLASSNAME)) {
        return 
HC_CONTINUE;
    }

    new 
grenade throwNade(idvecSrcvecThrowtime);
    
SetHookChainReturn(ATYPE_INTEGERgrenade);
    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, const ammo
{
    new 
item rg_get_player_item(idITEM_CLASSNAMEGRENADE_SLOT);
    if (
item != 0) {
        
giveAmmo(idammoAMMO_ID1);
        return 
item;
    }

    
item rg_create_entity(WEAPON_NAMEfalse);
    if (
is_nullent(item)) {
        return 
NULLENT;
    }

    new 
Float:origin[3];
    
get_entvar(idvar_originorigin);
    
set_entvar(itemvar_originorigin);
    
set_entvar(itemvar_spawnflagsget_entvar(itemvar_spawnflags) | SF_NORESPAWN);

    
set_member(itemm_Weapon_iPrimaryAmmoTypeAMMO_ID);
    
set_member(itemm_Weapon_iSecondaryAmmoType, -1);

    
set_entvar(itemvar_classnameITEM_CLASSNAME);
    
    
dllfunc(DLLFunc_Spawnitem);
    
    
set_member(itemm_iIdWEAPON_NEW_ID);

    
rg_set_iteminfo(itemItemInfo_pszNameWEAPON_NEW_NAME);
    
rg_set_iteminfo(itemItemInfo_pszAmmo1AMMO_NAME);
    
rg_set_iteminfo(itemItemInfo_iMaxAmmo11);
    
rg_set_iteminfo(itemItemInfo_iIdWEAPON_FAKE_ID);
    
rg_set_iteminfo(itemItemInfo_iPosition4);
    
rg_set_iteminfo(itemItemInfo_iWeight1);
    
    
dllfunc(DLLFunc_Touchitemid);

    if (
get_entvar(itemvar_owner) != id) {
        
set_entvar(itemvar_flagsFL_KILLME);
        return 
NULLENT;
    }

    return 
item;
}

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

    new 
count get_member(idm_rgAmmoammo);
    new 
add min(amountmax count);
    if (
add 1) {
        return;
    }

    
set_member(idm_rgAmmocount addammo);

    
emessage_begin(MSG_ONEMsgIdAmmoPickup, .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(grenadevar_classnameGRENADE_CLASSNAME);

    
set_entvar(grenadevar_movetypeMOVETYPE_BOUNCE);
    
set_entvar(grenadevar_solidSOLID_BBOX);

    
engfunc(EngFunc_SetOrigingrenadevecSrc);

    new 
Float:angles[3];
    
get_entvar(idvar_anglesangles);
    
set_entvar(grenadevar_anglesangles);

    
set_entvar(grenadevar_ownerid);
    
    if (
time 0.1) {
        
set_entvar(grenadevar_nextthinkget_gametime());
        
set_entvar(grenadevar_velocityFloat:{0.00.00.0});
    } else {
        
set_entvar(grenadevar_nextthinkget_gametime() + time);
        
set_entvar(grenadevar_velocityvecThrow);
    }

    
set_entvar(grenadevar_sequencerandom_num(36));
    
set_entvar(grenadevar_framerate1.0);
    
set_entvar(grenadevar_gravity0.5);
    
set_entvar(grenadevar_friction0.8);
    
engfunc(EngFunc_SetModelgrenade"models/reapi_healthnade/w_healthnade.mdl");
    
set_entvar(grenadevar_dmg30.0);
    
set_entvar(grenadevar_dmgtimeget_gametime() + time);

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

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

    
UTIL_BeamCylinder(originSpriteCylinder15301, {1025540}, 2555HEAL_RADIUS);
    
UTIL_CreateExplosion(origin65.0SpriteExplode3020, (TE_EXPLFLAG_NOSOUND TE_EXPLFLAG_NOPARTICLES));
    
UTIL_SpriteTrail(originSpriteShape);

    
rh_emit_sound2(grenade0CHAN_WEAPON"weapons/reapi_healthnade/heal.wav"VOL_NORMATTN_NORM0PITCH_NORM);

    new 
id get_entvar(grenadevar_owner);
    new 
team get_member(idm_iTeam);

    for (new 
player 1Float:playerOrigin[3]; player <= MaxClientsplayer++) 
    {
        if (!
is_user_alive(player) || get_member(playerm_iTeam) != team || get_user_health(player) >= MAXHEALTH
        {
            continue;
        }

        
get_entvar(playervar_originplayerOrigin);
        
        if (
get_distance_f(originplayerOrigin) < HEAL_RADIUS
        {
            new 
Float:set_health HEAL_AMOUNT;

            while(
set_health 0.0)
            {
                if(
get_user_health(player) > MAXHEALTH)
                    break;
                
                
ExecuteHamB(Ham_TakeHealthplayerset_healthDMG_GENERIC);
                
set_health-=1.0;
            }
            
UTIL_ScreenFade(player);
        }
    }
    
destroyNade(grenade);
}

destroyNade(const grenade) {
    
SetTouch(grenade"");
    
SetThink(grenade"");
    
set_entvar(grenadevar_flagsFL_KILLME);
}

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

    return 
0;
}

stock bool:IsBlind(const player) {
    return 
bool:(Float:get_member(playerm_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(typeMsgIdWeaponList, .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_ONEMsgIdStatusIcon, .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] = {1702550}, const alpha 80) {
    if (
IsBlind(player)) {
        return;
    }

    const 
FFADE_IN 0x0000;

    
message_begin(MSG_ONE_UNRELIABLEMsgIdScreenFade, .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_PVSSVC_TEMPENTITYorigin0);
    
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_PVSSVC_TEMPENTITYorigin0);
    
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_BROADCASTSVC_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:valuescale = (<< 12)) {
    return 
clamp(floatround(value scale), 00xFFFF);
}

 
Аватара пользователя
nikolay.zimin.71
 
Сообщения: 6
Зарегистрирован: 12 янв 2020, 17:10
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Языки программирования: Я ничего не знаю

Re: Доработка плагина reapi_healthnade

Сообщение thezolotoi » 11 сен 2021, 05:14

Почему люди должны сами догадываться какой у тебя флаг для випки и что-то делать (не подсказывать) бесплатно.Прочитай про
Код: Выделить всё
get_user_flags(index) & flag
- функция которая делает проверку на флаг игрока

И подставь проверку в функцию где происходит взрыв гранат
Код: Выделить всё
explodeNade(const grenade)  
Аватара пользователя
thezolotoi
 
Сообщения: 75
Зарегистрирован: 17 янв 2019, 13:04
Благодарил (а): 4 раз.
Поблагодарили: 4 раз.
Опыт программирования: Около 3 месяцев
Языки программирования: AMXX / PAWN


Вернуться в Скриптинг

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8