Как выдать кастомное оружие?

Сообщения
5
Реакции
0
Баллы
1
Приветствую! Хочу выдать игроку кастомное оружие, но вот закрепить за данным оружием патроны 45 и в запасе 250 никак не выходит. Подходящего примера не нашел, подскажите пожалуйста способ реализации.

Код:
#include <amxmodx>
#include <fakemeta>
#include <hamsandwich>
#include <reapi>

new const g_szReferance[] = "weapon_ak47";
new const g_iWeaponID = 7634191;

/** iWeapon */
#define IsCustomItem(%0) (bool:(get_entvar(%0, var_impulse) == g_iWeaponID))

/** Cvar ---> */
#define MODEL_V_2           "models/v_golden_ak47.mdl"
#define MODEL_P_2           "models/p_golden_ak47.mdl"
#define MODEL_W_2           "models/w_golden_ak47.mdl"
/** <--- */

public plugin_init()
{
    register_plugin("ak-47: Golden", "0.1", "unknown");
    register_clcmd("say /akg", "ClCmd_GiveAk47Golden");
    
    RegisterHam(Ham_Item_Deploy, g_szReferance, "HamHook_Item_Deploy_Post", true);
    RegisterHookChain(RG_CWeaponBox_SetModel, "@CWeaponBox_SetModel_Pre");
}

public plugin_precache()
{
    engfunc(EngFunc_PrecacheModel, MODEL_V_2);
    engfunc(EngFunc_PrecacheModel, MODEL_P_2);
    engfunc(EngFunc_PrecacheModel, MODEL_W_2);
}

public ClCmd_GiveAk47Golden(const pId)
{
    if(!is_user_alive(pId))
        return;

    new iWeapon = rg_give_custom_item(pId, g_szReferance, GT_REPLACE, g_iWeaponID);
    set_member(iWeapon, m_Weapon_iClip, 45);
    //rg_set_user_bpammo(pId, g_szReferance, 250); // ???
}

@CWeaponBox_SetModel_Pre(const iWeaponBox)
{
    new iEnt = func_GetWeaponBoxWeapon(iWeaponBox);
    
    if(iEnt == NULLENT)
        return HC_CONTINUE;

    if(is_entity(iEnt) && get_entvar(iEnt, var_impulse) == g_iWeaponID)
        SetHookChainArg(2, ATYPE_STRING, MODEL_W_2);
    
    return HC_CONTINUE;
}

stock func_GetWeaponBoxWeapon(const iWeaponBox)
{
    for (new i, iWeapon; i < MAX_ITEM_TYPES; i++)
    {
        iWeapon = get_member(iWeaponBox, m_WeaponBox_rgpPlayerItems, i);
        if (!is_nullent(iWeapon)) return iWeapon;
    }

    return NULLENT;
}

public HamHook_Item_Deploy_Post(const iItem)
{
    static pId;
    
    if(CheckItem(iItem, pId))
    {
        set_entvar(pId, var_viewmodel, MODEL_V_2);
        set_entvar(pId, var_weaponmodel, MODEL_P_2);
    }
}

bool:CheckItem(const iItem, &iPlayer)
{
    if(!IsCustomItem(iItem))
        return false;

    iPlayer = get_member(iItem, m_pPlayer);

    return true;
}
 
C++:
rg_set_iteminfo( ent, ItemInfo_iMaxClip, data[ W_MAX_AMMO ] );
rg_set_user_ammo( user, weaponid, data[ W_MAX_AMMO ] );


rg_set_iteminfo( ent, ItemInfo_iMaxAmmo1, data[ W_MAX_BPAMMO ] );
rg_set_user_bpammo( user, weaponid, data[ W_MAX_BPAMMO ] );
 
@Javekson
Код:
new iWeapon = rg_give_custom_item(pId, g_szReferance, GT_REPLACE, WEAPON_UID);
new iWeaponID = get_member(iWeapon, m_iId);
rg_set_iteminfo(iWeapon, ItemInfo_iMaxClip, 45);
rg_set_user_ammo(pId, iWeaponID, 45);
rg_set_iteminfo(iWeapon, ItemInfo_iMaxAmmo1, 250);
rg_set_user_bpammo(pId, iWeaponID, 250);
 
@Javekson
Код:
new iWeapon = rg_give_custom_item(pId, g_szReferance, GT_REPLACE, WEAPON_UID);
new iWeaponID = get_member(iWeapon, m_iId);
rg_set_iteminfo(iWeapon, ItemInfo_iMaxClip, 45);
rg_set_user_ammo(pId, iWeaponID, 45);
rg_set_iteminfo(iWeapon, ItemInfo_iMaxAmmo1, 250);
rg_set_user_bpammo(pId, iWeaponID, 250);
Я укажу WEAPON_AK47, но ведь выдав он будет не только на кастомном, а просто на ак-47, при поднятии другого ака у него будет 250 патрон в запасе..
 
Я укажу WEAPON_AK47, но ведь выдав он будет не только на кастомном, а просто на ак-47, при поднятии другого ака у него будет 250 патрон в запасе..
Проверяли? rg_set_user_bpammo(pId, iWeaponID, 250); выдается на игрока а не на оружия
 
Я укажу WEAPON_AK47, но ведь выдав он будет не только на кастомном, а просто на ак-47, при поднятии другого ака у него будет 250 патрон в запасе..
Потому-что запас пт хранится в m_rgAmmo на игроке в указанном индексе m_Weapon_iPrimaryAmmoType. У твоего кастомного и дефолтного оружия одинаковый m_Weapon_iPrimaryAmmoType, поэтому такая проблема. Либо меняй кастомному оружию m_Weapon_iPrimaryAmmoType, либо делай отдельную систему которая будет очищать у игрока m_rgAmmo при дропе оружия и выдавать при поднятии, либо после поднятия уменьшай m_rgAmmo игрока по ItemInfo_iMaxAmmo1 от оружия если вышел за предел
 
Именно на оружие нужно установить)
Понял, да, запас храниться всегда на игроке, отдельно на оружия его не повесить, решение проблемы выше описали, я при поднятие оружия смотрел на то, кастом оно или нет, принадлежало оно ранее мне или нет, затем смотрел на ItemInfo_iMaxAmmo1 и если у меня патрон больше чем ItemInfo_iMaxAmmo1 оружия, то урезал до этого состояния
 

Кто просматривает тему

Назад
Верх