[ReAPI] Пример кастомного оружия с дополнительними свойствами

Сообщения
192
Реакции
148
Помог
1 раз(а)
met, нужно спрашивать это здесь или достаточно самому проверить?
 

met

Сообщения
171
Реакции
42
Ruby, лучше спросить, а то мало ли ни то ни другое не подойдет.

P.S. сейчас проверить не смогу, так как комп а другом городе. На будущее спросил
 

RockTheStreet

Саппорт года
Сообщения
1,743
Реакции
346
Помог
40 раз(а)
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован
Сообщения
219
Реакции
42
fl0wer, согласен
2 Фев 2019
Код:
#include <amxmodx>
#include <hamsandwich>
#include <reapi>

#define WEAPON_CMD "give_m4a1" // Команда по которой будет выдано оружие
#define WEAPON_ID WEAPON_M4A1 // ID оружия
#define WEAPON_NAME "weapon_m4a1" // Название оружия
#define ACCESS_FLAG ADMIN_LEVEL_H // Флаг которому доступно оружие. Закоментировать чтобы было доступно всем
#define WEAPON_DAMAGE 1.2 // Множитель урона. Закоментировать если не нужно
#define WEAPON_CLIP 35 // Количество патронов в обойме. Закоментировать если количество по умолчанию
#define WEAPON_AMMO 120 // Количество патронов в запасе
#define WEAPON_SPEED 300.0 // Скорость бега. Закоментировать если количество по умолчанию
// #define WEAPON_GRAVITY 0.8 // Гравитация (1.0 == sv_gravity). Закоментировать если количество по умолчанию.
#define MODELS // Включить модели оружия. Закоментировать чтобы отключить
#if defined MODELS
#define MODEL_V "models/gold/v_m4a1.mdl" // Модель V оружия.
#define MODEL_P "models/gold/p_m4a1.mdl" // Модель P оружия.
#define MODEL_W "models/gold/w_m4a1.mdl" // Модель W оружия.
#endif
// #define WEAPON_CAN_TOUCH_ONLY_OWNER // Поднять сможет только владелец. Закоментировать если не нужно

#define WEAPON_UID 1
#define GetWeponID(%1) WeaponIdType:get_member(%1, m_iId)
#define IsCustomWeapon(%1) bool:(get_entvar(%1, var_impulse) == WEAPON_UID)

#if defined MODELS
public plugin_precache() {
    precache_model(MODEL_V);
    precache_model(MODEL_P);

    #if defined MODEL_W
    precache_model(MODEL_W);
    #endif
}
#endif

public plugin_init() {
    register_clcmd(WEAPON_CMD, "CmdGive");

#if defined MODELS || defined WEAPON_GRAVITY
    RegisterHam(Ham_Item_Deploy, WEAPON_NAME, "Item_Deploy_Post", true);
#endif

#if defined WEAPON_GRAVITY
    RegisterHam(Ham_Item_Holster, WEAPON_NAME, "Item_Holster_Post", true);
#endif

#if defined MODEL_W
    RegisterHookChain(RG_CWeaponBox_SetModel, "CWeaponBox_SetModel_Pre", false);
#endif

#if defined WEAPON_CLIP
    RegisterHam(Ham_Weapon_Reload, WEAPON_NAME, "Weapon_Reload_Pre", false);
#endif

#if defined WEAPON_SPEED
    RegisterHam(Ham_CS_Item_GetMaxSpeed, WEAPON_NAME, "CS_Item_GetMaxSpeed_Pre", false);
#endif

#if defined WEAPON_CAN_TOUCH_ONLY_OWNER
    RegisterHam(Ham_Touch, "weaponbox", "Weaponbox_Touch_Pre", false);
#endif
}

public CmdGive(id) {
#if defined ACCESS_FLAG
    if (~get_user_flags(id) & ACCESS_FLAG) {
        return PLUGIN_HANDLED;
    }
#endif

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

#if defined WEAPON_CLIP
    rg_set_iteminfo(weapon, ItemInfo_iMaxClip, WEAPON_CLIP);
    rg_set_user_ammo(id, WEAPON_ID, WEAPON_CLIP);
#endif

#if defined WEAPON_AMMO
    rg_set_user_bpammo(id, WEAPON_ID, WEAPON_AMMO);
#endif

#if defined WEAPON_DAMAGE
    set_member(weapon, m_Weapon_flBaseDamage, Float:get_member(weapon, m_Weapon_flBaseDamage) * WEAPON_DAMAGE);
    #if WEAPON_ID == WEAPON_M4A1
    set_member(weapon, m_M4A1_flBaseDamageSil, Float:get_member(weapon, m_M4A1_flBaseDamageSil) * WEAPON_DAMAGE);
    #elseif WEAPON_ID == WEAPON_USP
    set_member(weapon, m_USP_flBaseDamageSil, Float:get_member(weapon, m_USP_flBaseDamageSil) * WEAPON_DAMAGE);
    #elseif WEAPON_ID == WEAPON_FAMAS
    set_member(weapon, m_Famas_flBaseDamageBurst, Float:get_member(weapon, m_Famas_flBaseDamageBurst) * WEAPON_DAMAGE);
    #endif
#endif
    return PLUGIN_HANDLED;
}

#if defined MODELS || defined WEAPON_GRAVITY
public Item_Deploy_Post(weapon) {
    if (!IsCustomWeapon(weapon)) {
        return HAM_IGNORED;
    }

    new id = get_member(weapon, m_pPlayer);

    #if defined MODELS
    set_entvar(id, var_viewmodel, MODEL_V);
    set_entvar(id, var_weaponmodel, MODEL_P);
    #endif

    #if defined WEAPON_GRAVITY
    set_entvar(id, var_gravity, WEAPON_GRAVITY);
    #endif

    return HAM_IGNORED;
}
#endif

#if defined WEAPON_GRAVITY
public Item_Holster_Post(weapon) {
    if (IsCustomWeapon(weapon)) {
        new id = get_member(weapon, m_pPlayer);
        set_entvar(id, var_gravity, 1.0);
    }
}
#endif

#if defined MODEL_W
public CWeaponBox_SetModel_Pre(const weaponbox, const model[]) {
    new weapon = getWeaponBoxWeapon(weaponbox);
    if (weapon != NULLENT && IsCustomWeapon(weapon)) {
        SetHookChainArg(2, ATYPE_STRING, MODEL_W);
    }
}
#endif

#if defined WEAPON_CLIP
public Weapon_Reload_Pre(weapon) {
    if (!IsCustomWeapon(weapon) || get_member(weapon, m_Weapon_iClip) < WEAPON_CLIP) {
        return HAM_IGNORED;
    }

    new id = get_member(weapon, m_pPlayer);
    #if WEAPON_ID == WEAPON_M4A1
    sendWeaponAmimation(id, get_member(weapon, m_Weapon_iWeaponState) & WPNSTATE_M4A1_SILENCED ? 0 : 7);
    #elseif WEAPON_ID == WEAPON_USP
    sendWeaponAmimation(id, get_member(weapon, m_Weapon_iWeaponState) & WPNSTATE_USP_SILENCED ? 0 : 8);
    #else
    sendWeaponAmimation(id, 0);
    #endif

    return HAM_SUPERCEDE;
}
#endif

#if defined WEAPON_SPEED
public CS_Item_GetMaxSpeed_Pre(const weapon) {
    if (IsCustomWeapon(weapon)) {
        SetHamReturnFloat(WEAPON_SPEED);
        return HAM_SUPERCEDE;
    }

    return HAM_IGNORED;
}
#endif

#if defined WEAPON_CAN_TOUCH_ONLY_OWNER
public Weaponbox_Touch_Pre(const weaponbox, const id) {
    new weapon = getWeaponBoxWeapon(weaponbox);
    if (weapon == NULLENT || GetWeponID(weapon) != WEAPON_ID || !IsCustomWeapon(weapon) {
        return HAM_IGNORED;
    }

    return get_entvar(weaponbox, var_owner) == id ? HAM_IGNORED : HAM_SUPERCEDE;
}
#endif

stock getWeaponBoxWeapon(const weaponbox) {
    for (new i = 0, weapon; i < MAX_ITEM_TYPES; i++) {
        weapon = get_member(weaponbox, m_WeaponBox_rgpPlayerItems, i);
        if (!is_nullent(weapon)) {
            return weapon;
        }
    }
    return NULLENT;
}

stock sendWeaponAmimation(const id, const animation) {
    set_entvar(id, var_weaponanim, animation);

    message_begin(MSG_ONE_UNRELIABLE, SVC_WEAPONANIM, .player = id);
    write_byte(animation);
    write_byte(0);
    message_end();
}
That's the last example code.

Should be updated on the first post
 
Сообщения
94
Реакции
10
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован
raulitop, по белому черным расписано
 
Сообщения
19
Реакции
0
Что насчёт возможности добавления альтернативного режима огня на ПКМ, используя ReAPI-шный m_bHasSecondaryAttack, вместо известного FM_CmdStart с выставлением uc_handle? В частности, для оружия у которого нет активного действия на ПКМ. Это так, скорее просто идея на будущее... :dntknw:
 
Сообщения
219
Реакции
42
Что насчёт возможности добавления альтернативного режима огня на ПКМ, используя ReAPI-шный m_bHasSecondaryAttack, вместо известного FM_CmdStart с выставлением uc_handle? В частности, для оружия у которого нет активного действия на ПКМ. Это так, скорее просто идея на будущее... :dntknw:
Yes, you can enable that member on entity when you give it to the player.
Then use Ham_Weapon_SecondaryAttack
 
Сообщения
19
Реакции
0
raulitop, I am glad that it was you who wrote about this, because I have questions for you after viewing this topic regarding this opportunity - https://dev-cs.ru/threads/17416/.
I wanted to write to you in private messages, but the account level does not allow it yet.
 
Сообщения
219
Реакции
42
Сообщения
19
Реакции
0
raulitop,
Which .inc library did you connect?
When compiling .sma, my compiler did not recognize the "set_member" and "m_Weapon_bHasSecondaryAttack from registered Ham" command, although I tried to connect both <reapi> and <reapi_gamedll>.
However, when I read the documentation of this command, it was undoubtedly part of the include reapi_gamedll
 
Сообщения
219
Реакции
42
raulitop,
Which .inc library did you connect?
When compiling .sma, my compiler did not recognize the "set_member" and "m_Weapon_bHasSecondaryAttack from registered Ham" command, although I tried to connect both <reapi> and <reapi_gamedll>.
However, when I read the documentation of this command, it was undoubtedly part of the include reapi_gamedll
Код:
#include <reapi>
That's all. It will include reapi_gamedll and other reapi' includes automatically.

The Ham hook is Ham_Weapon_SecondaryAttack.

Check code and copy.

Update includes from last version. Probably you have old versions there.
 
Последнее редактирование:
Сообщения
2,491
Реакции
2,790
Помог
61 раз(а)
R1ner, даный топик мной заброшен. В примерах указаных тут есть много мест, которые можно улучшить. Но делать я этого уже не буду. Вы можете продолжать топик постами со своими улучшениями/реализациями. Собственно для этого тема и создавалась.
П.С. это не готовый плагин для использования, а пример.
 
Последнее редактирование:
Сообщения
3
Реакции
0
TTox421, Можем ли мы использовать этот метод, чтобы поставить 2 разные модели на одно и то же оружие? Я попробовал 2 разные модели на M4a1, и у меня это сработало (v_model), но когда я бросаю обе пушки m4a1 на землю, в меню появляется последняя выбранная мной (w_model). 2 разных (w_model) не бывает.

 
Сообщения
857
Реакции
144
Помог
25 раз(а)
TTox421, Можем ли мы использовать этот метод, чтобы поставить 2 разные модели на одно и то же оружие? Я попробовал 2 разные модели на M4a1, и у меня это сработало (v_model), но когда я бросаю обе пушки m4a1 на землю, в меню появляется последняя выбранная мной (w_model). 2 разных (w_model) не бывает.

можно сделать легко, вам нужно рандомным образом выбрать модель?
 
Сообщения
3
Реакции
0
можно сделать легко, вам нужно рандомным образом выбрать модель?
Я решил это. Я использовал те же коды, что и 2 плагина. Я сделал WEAPON_UID 1 в первом плагине и WEAPON_UID 2 во втором плагине. Таким образом, когда я поднял орудия с земли (w_model), используя 2 разные модели в орудии m4a1, модели были разными, когда орудие пришло ко мне (v_model).
 
Сообщения
452
Реакции
78
Помог
4 раз(а)
Shel, не подскажешь, этот баг убран в нынешних Re-продукциях или тут только сторонний модуль решит эту проблему?
 
Сообщения
1,015
Реакции
818
Помог
10 раз(а)

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

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