Как сделать что б Кастомное оружие не исчезало после смерти

Сообщения
95
Реакции
6
Помог
2 раз(а)
Пытаюсь сделать что б нож не исчезал после смерти но чет не выходит. Не работает функция PlayerSpawn, подскажите где я допускаю ошибку
Код:
#include <amxmodx>
#include <hamsandwich>
#include <reapi>

#define WEAPON_ID WEAPON_KNIFE // ID оружия
#define WEAPON_NAME "weapon_knife" // Название оружия
#define WEAPON_GRAVITY 0.7 // Гравитация (1.0 == sv_gravity). Закоментировать если количество по умолчанию.
#define MODEL_V "models/Knife/Gravity/v_shiner.mdl" // Модель V оружия.
#define MODEL_P "models/Knife/Gravity/p_shiner.mdl" // Модель P оружия.

#define WEAPON_UID 2
#define ActiveWeapon(%0) get_member(%0, m_pActiveItem)
#define GetWeponID(%1) WeaponIdType:get_member(%1, m_iId)
#define IsCustomWeapon(%1) bool:(get_entvar(%1, var_impulse) == WEAPON_UID)
#define IsUserValid(%0) (1 <= %0 <= MaxClients)

public plugin_precache() {
    precache_model(MODEL_V);
    precache_model(MODEL_P);
}

public plugin_init() {
    RegisterHam(Ham_Item_Deploy, WEAPON_NAME, "Item_Deploy_Post", true);
    RegisterHookChain(RG_CBasePlayer_Spawn, "PlayerSpawn", true);
    RegisterHam(Ham_Item_Holster, WEAPON_NAME, "HookHolster", 1);
}

public CmdGive(id) {
    rg_remove_item(id, WEAPON_NAME)
    new weapon = rg_give_custom_item(id, WEAPON_NAME, GT_REPLACE, WEAPON_UID);
    if (is_nullent(weapon)) {
        return PLUGIN_HANDLED;
    }
    return PLUGIN_HANDLED;
}

public Item_Deploy_Post(weapon) {
        if (!IsCustomWeapon(weapon)) {
           return HAM_IGNORED;
        }

       new id = get_member(weapon, m_pPlayer);
    set_entvar(id, var_viewmodel, MODEL_V);
    set_entvar(id, var_weaponmodel, MODEL_P);
    set_entvar(id, var_gravity, WEAPON_GRAVITY);
    return HAM_IGNORED;
}

public HookHolster(weapon) {
       new id = get_member(weapon, m_pPlayer);
       if (!is_user_connected(id) || !IsCustomWeapon(weapon)) {
            return HAM_IGNORED;
        }
        set_entvar(id, var_gravity, 1.0);
        return HAM_IGNORED;
}

public PlayerSpawn(weapon){
    new id = get_member(weapon, m_pPlayer);
    if (!is_user_connected(id) || !IsCustomWeapon(weapon)) {
            return PLUGIN_HANDLED;
        }
    CmdGive(id)
    return PLUGIN_HANDLED;
}

public plugin_natives()
{
        register_native("CustomWeaponKnifeGravity",    "__CustomWeaponKnifeGravity");
}

public __CustomWeaponKnifeGravity(iPlugin, iParams)
{
    enum { player = 1 };

    new id = get_param(player);
    if(!IsUserValid(id))
        abort(AMX_ERR_NATIVE, "Player out of range (%i)", id);
    CmdGive(id);
}
 

Ayk

Сообщения
763
Реакции
476
Помог
19 раз(а)
По факту, в КС, чтобы что то не исчезало после смерти, это что то нужно повторно выдать при респавне. (При смерти там куча ресетов всего, при респавне тоже несколько).
До смерти, сохрани где то инфу о том что у игрока есть этот итем, и при респавне выдай его повторно.
Код:
RegisterHookChain(RG_CBasePlayer_Spawn, "PlayerSpawn", true);
Код:
public PlayerSpawn(weapon){
    new id = get_member(weapon, m_pPlayer);
    if (!is_user_connected(id) || !IsCustomWeapon(weapon)) {
            return PLUGIN_HANDLED;
        }
    CmdGive(id)
    return PLUGIN_HANDLED;
}
Параметр данной функции является ИД игрока, а не оружие.
 
Последнее редактирование:
Сообщения
95
Реакции
6
Помог
2 раз(а)
Ayk, Подскажите тогда как сохранять данное оружие, массив я создал, а вот в какой момент нужно записывать наше кастомное оружие в массив я не могу понять, ведь массив надо еще и вернуть в положение false если оружие сменено
new bool:iKnifeHas[MAX_PLAYERS + 1] Надеюсь поможете мне
 
Последнее редактирование модератором:
Сообщения
1,419
Реакции
2,509
Помог
59 раз(а)
Skiptik, зачем что-то куда-то сохранять? Всё что нужно это заново выдать. В PlayerSpawn у Вас 3 ошибки: как сказал Ayk, нужно указать ID игрока а не оружия; Вы не сделали проверку на жив ли игрок; Вы используете PLUGIN_HANDLED.
 
Сообщения
95
Реакции
6
Помог
2 раз(а)
w0w, вот изменил, не совсем уверен что правльно возвращаю return значение, ибо не совсем понимаю какое нужно возвратить, и какая замена PLUGIN_HANDLED, и такой вопрос а как плагин поймет какое оружие мне надо выдать при спавне, если я его не сохраню где то?
Код:
public PlayerSpawn(id){
    if(!is_user_alive(id)){
        return HC_SUPERCEDE;
    }
    rg_remove_item(id, WEAPON_NAME)
    new weapon = rg_give_custom_item(id, WEAPON_NAME, GT_REPLACE, WEAPON_UID);
    if (is_nullent(weapon)) {
        return HC_SUPERCEDE;
    }
    return HC_CONTINUE;
}
 
Последнее редактирование:
Сообщения
2,491
Реакции
2,790
Помог
61 раз(а)
Skiptik, нож убирается после смерти или каждую смену раунда?
Если каждую смену, то на всех картах или например на awp_india или 35hp только?
 
Сообщения
95
Реакции
6
Помог
2 раз(а)
fantom, Сейчас ножик выдается всегда даже если ты его не выбираешь, а так же он выдается даже если выбрал другой нож вот код что сейчас

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

#define WEAPON_ID WEAPON_KNIFE // ID оружия
#define WEAPON_NAME "weapon_knife" // Название оружия
#define WEAPON_GRAVITY 0.7 // Гравитация (1.0 == sv_gravity). Закоментировать если количество по умолчанию.
#define MODEL_V "models/Knife/Gravity/v_shiner.mdl" // Модель V оружия.
#define MODEL_P "models/Knife/Gravity/p_shiner.mdl" // Модель P оружия.

#define WEAPON_UID 2
#define GetWeponID(%1) WeaponIdType:get_member(%1, m_iId)
#define IsCustomWeapon(%1) bool:(get_entvar(%1, var_impulse) == WEAPON_UID)
#define IsUserValid(%0) (1 <= %0 <= MaxClients)

public plugin_precache() {
    precache_model(MODEL_V);
    precache_model(MODEL_P);
}

public plugin_init() {
    RegisterHam(Ham_Item_Deploy, WEAPON_NAME, "Item_Deploy_Post", 1);
    RegisterHookChain(RG_CBasePlayer_Spawn, "PlayerSpawn", 1);
    RegisterHam(Ham_Item_Holster, WEAPON_NAME, "HookHolster", 1);
}

public CmdGive(id) {
    rg_remove_item(id, WEAPON_NAME)
    new weapon = rg_give_custom_item(id, WEAPON_NAME, GT_REPLACE, WEAPON_UID);
    if (is_nullent(weapon)) {
        return HC_CONTINUE;
    }
    return HC_CONTINUE;
}

public Item_Deploy_Post(weapon) {
        if (!IsCustomWeapon(weapon)) {
           return HAM_IGNORED;
        }
    new id = get_member(weapon, m_pPlayer);
    set_entvar(id, var_viewmodel, MODEL_V);
    set_entvar(id, var_weaponmodel, MODEL_P);
    set_entvar(id, var_gravity, WEAPON_GRAVITY);
    return HAM_IGNORED;
}

public HookHolster(weapon) {
       new id = get_member(weapon, m_pPlayer);
       if (!is_user_connected(id)) {
            return HAM_IGNORED;
        }
        set_entvar(id, var_gravity, 1.0);
        return HAM_IGNORED;
}

public PlayerSpawn(id){
    if(!is_user_alive(id)){
        return HC_SUPERCEDE;
    }
    rg_remove_item(id, WEAPON_NAME)
    new weapon = rg_give_custom_item(id, WEAPON_NAME, GT_REPLACE, WEAPON_UID);
    if (is_nullent(weapon)) {
        return HC_SUPERCEDE;
    }
    return HC_CONTINUE;
}

public plugin_natives()
{
        register_native("CustomWeaponKnifeGravity",    "__CustomWeaponKnifeGravity");
}

public __CustomWeaponKnifeGravity(iPlugin, iParams)
{
    enum { player = 1 };

    new id = get_param(player);
    if(!IsUserValid(id))
        abort(AMX_ERR_NATIVE, "Player out of range (%i)", id);
    CmdGive(id);
}
ps я понимаю что можно через bool функцию записать при вызове функции CmdGive что нож взят, но у меня возникает вопрос как поставить bool функцию в false когда выбрали другой нож
И если эта тема расширилась от изначальной, не создавать же +100500 тем с похожими вопросами
 
Последнее редактирование:
Сообщения
2,491
Реакции
2,790
Помог
61 раз(а)
Код:
public PlayerSpawn(id){
    if(!is_user_alive(id)){
        return HC_SUPERCEDE;
    }
    rg_remove_item(id, WEAPON_NAME)
    new weapon = rg_give_custom_item(id, WEAPON_NAME, GT_REPLACE, WEAPON_UID);
    if (is_nullent(weapon)) {
        return HC_SUPERCEDE;
    }
    return HC_CONTINUE;
}
Ничего тут смущает? Вы же на каждом спавне выдаете сами всем. И так и не ответили на вопрос который я задал выше. А именно на момент вашего первого сообщения когда пропадал ножик?
 
Сообщения
95
Реакции
6
Помог
2 раз(а)
fantom, нож пропадает и при смерти и при смене карты, при смене карты он и должен пропадать, а вот при смерти он должен остаться, до момента смены карты или смены ножа на другой. Смущает, что выдаю всем, но по другому как это сделать пока я не знаю, был бы благодарен если вы поможете мне в этом вопросе.
 
Сообщения
2,491
Реакции
2,790
Помог
61 раз(а)
Код:
#include <amxmodx>
#include <hamsandwich>
#include <reapi>

#define WEAPON_ID WEAPON_KNIFE // ID оружия
#define WEAPON_NAME "weapon_knife" // Название оружия
#define WEAPON_SLOT KNIFE_SLOT
#define WEAPON_GRAVITY 0.7 // Гравитация (1.0 == sv_gravity). Закоментировать если количество по умолчанию.
#define MODEL_V "models/Knife/Gravity/v_shiner.mdl" // Модель V оружия.
#define MODEL_P "models/Knife/Gravity/p_shiner.mdl" // Модель P оружия.

#define WEAPON_UID 2
#define ActiveWeapon(%0) get_member(%0, m_pActiveItem)
#define GetWeponID(%1) WeaponIdType:get_member(%1, m_iId)
#define IsCustomWeapon(%1) bool:(get_entvar(%1, var_impulse) == WEAPON_UID)
#define IsUserValid(%0) (1 <= %0 <= MaxClients)
new bool:HasWeapon[MAX_PLAYERS + 1];

public plugin_precache() {
    precache_model(MODEL_V);
    precache_model(MODEL_P);
}

public plugin_init() {
    RegisterHookChain(RG_CBasePlayer_GiveDefaultItems, "CBasePlayer_GiveDefaultItems_Post", true);
    RegisterHookChain(RG_CBasePlayer_Spawn, "CBasePlayer_Spawn_Post", true);
    RegisterHam(Ham_Item_Deploy, WEAPON_NAME, "Item_Deploy_Post", true);
    RegisterHam(Ham_Item_Holster, WEAPON_NAME, "HookHolster", 1);
}

public client_putinserver(id) {
    HasWeapon[id] = false;
}

public CBasePlayer_GiveDefaultItems_Post(const id) {
    if (!HasWeapon[id]) {
        return HC_CONTINUE;
    }

    new item = getItem(id);
    if (!item) {
        return HC_CONTINUE;
    }

    set_entvar(item, var_impulse, WEAPON_UID);

    new activeItem = get_member(id, m_pActiveItem);
    if (item == activeItem) {
        set_entvar(id, var_gravity, WEAPON_GRAVITY);
    }

    return HC_CONTINUE;
}

public CBasePlayer_Spawn_Post(const id) {
    if (!is_user_connected(id)) {
        return HC_CONTINUE;
    }

    new item = get_member(id, m_pActiveItem);
    if (!is_nullent(item) && IsCustomWeapon(item)) {
        set_entvar(id, var_gravity, WEAPON_GRAVITY);
    }
    return HC_CONTINUE;
}

public Item_Deploy_Post(weapon) {
    if (!IsCustomWeapon(weapon)) {
        return HAM_IGNORED;
    }

    new id = get_member(weapon, m_pPlayer);
    set_entvar(id, var_viewmodel, MODEL_V);
    set_entvar(id, var_weaponmodel, MODEL_P);
    set_entvar(id, var_gravity, WEAPON_GRAVITY);
    return HAM_IGNORED;
}

public HookHolster(weapon) {
    new id = get_member(weapon, m_pPlayer);
    if (!is_user_connected(id) || !IsCustomWeapon(weapon)) {
        return HAM_IGNORED;
    }
    set_entvar(id, var_gravity, 1.0);
    return HAM_IGNORED;
}

getItem(const id) {
    new item = get_member(id, m_rgpPlayerItems, WEAPON_SLOT);
    while (item) {
        if (get_member(item, m_iId) == WEAPON_ID) {
            return item;
        }

        item = get_member(item, m_pNext);
    }
    return 0;
}

public plugin_natives() {
    register_native("CustomWeaponKnifeGravity",    "__CustomWeaponKnifeGravity");
}

public __CustomWeaponKnifeGravity(iPlugin, iParams) {
    enum { player = 1 };

    new id = get_param(player);
    if (is_user_connected(id)) {
        new item = rg_give_custom_item(id, WEAPON_NAME, GT_REPLACE, WEAPON_UID);
        if (!is_nullent(item)) {
            HasWeapon[id] = true;
        }
    } else {
        abort(AMX_ERR_NATIVE, "Player out of range (%i)", id);
    }
}
 
Сообщения
95
Реакции
6
Помог
2 раз(а)
fantom, спасибо за помощь, в этом вопросе.
 
Сообщения
95
Реакции
6
Помог
2 раз(а)
fantom , в твоем примере найден баг, после смерти выдается нож последний который вписан в plugins.ini
CustomKnifeSpeed.amxx debug
CustomKnifeGravity.amxx debug
CustomKnifeGold.amxx debug
CustomKnifeUltra.amxx debug
Тоесть, если берешь последний нож CustomKnifeUltra в этом раунде меняешь его на любой другой, то при смерти в новом раунде тебе выдаст нож последний, то есть CustomKnifeUltra, попытался сам что то придумать, но что то в голову как это исправить ни чего не пришло, поэтому обращаюсь еще раз за помощью к тебе или другому скриптеру который поможет исправить эту проблему.
 

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу