Смена типа патронов у оружия

Статус
В этой теме нельзя размещать новые ответы.
Сообщения
2,143
Реакции
1,225
Помог
44 раз(а)
Я конечно не из разряда глупых людей, которые при открытии дверцы холодильника не понимают откуда холодом тянет, но чёт не могу понять, можно ли вообще сменить тип патронов оружию. Пытался сделать для USP использование патронов 50AE, которые у Deagle, но всё четно. Ham_Item_GetItemInfo не дал ожидаемых результатов, как и использование ItemInfo_pszAmmo1 в rg_set_iteminfo().
 
Сообщения
2,491
Реакции
2,794
Помог
61 раз(а)
Minni, тебе сам урон от этих патронов или иконку и количество?
 
Сообщения
1,698
Реакции
1,510
Помог
26 раз(а)
Minni, в AddToPlayer сет m_Weapon_iPrimaryAmmoType. Ну ещё веапонлист послать с таким же аммо индексом.
 
Последнее редактирование:
Сообщения
2,143
Реакции
1,225
Помог
44 раз(а)
Пробовал очевидные методы:
Код:
public plugin_init() {
    RegisterHam(Ham_Item_GetItemInfo, "weapon_usp", "hamfwd_GetItemInfo_Post", .Post = true);
}

public hamfwd_GetItemInfo_Post(pWeapon, iteminfo) {
    SetHamItemInfo(iteminfo, Ham_ItemInfo_pszAmmo1, "50AE");
}
Код:
public hack_u_ass(pPlayer) {
    new pWeapon = rg_give_custom_item(pPlayer, "weapon_usp", GT_DROP_AND_REPLACE, 43622);

    if(is_entity(pWeapon)) {
        rg_set_iteminfo(pWeapon, ItemInfo_pszAmmo1, "50AE");
        rg_set_iteminfo(pWeapon, ItemInfo_iMaxAmmo1, 50);
    }
}
27 Апр 2020
Minni, тебе сам урон от этих патронов или иконку и количество?
Да урон я сам тыкаю через rg_fire_bullets3, иконок нет))
 
Сообщения
2,491
Реакции
2,794
Помог
61 раз(а)
public hamfwd_GetItemInfo_Post(pWeapon, iteminfo) { SetHamItemInfo(iteminfo, Ham_ItemInfo_pszAmmo1, "50AE"); }
хукать не имеет смысла.
rg_set_iteminfo(pWeapon, ItemInfo_pszAmmo1, "50AE");
это отвечает за выдачу аммо, и его учет. отправляй WeaponList (если меняешь всегда и у всех можно в MSG_INIT единожды отправить). Ну и про m_Weapon_iPrimaryAmmoType не стоит забыть. Хотя если от дигла, и сменить имя аммо до самой выдачи, то оно само заполнится нужным индексом.
 
Сообщения
2,143
Реакции
1,225
Помог
44 раз(а)
Допустим... Индекс сменился, но патрончиков-то нет в запасе. В пре и пост пробовал.

Код:
public hamfwd_AddToPlayer_Post(pWeapon, pPlayer) {
    set_member(pWeapon, m_Weapon_iPrimaryAmmoType, 8);
    rg_set_iteminfo(pWeapon, ItemInfo_pszAmmo1, "50AE");
    rg_set_user_bpammo(pPlayer, WEAPON_DEAGLE, 50);
   
    message_begin(MSG_ONE, g_iMsgWeaponList, .player = pPlayer);
    write_string(WEAPON_HUD);
    write_byte(8);
    write_byte(50);
    write_byte(-1);
    write_byte(-1);
    write_byte(1);
    write_byte(4);
    write_byte(any:WEAPON_USP);
    write_byte(0);
    message_end();
}
 
Последнее редактирование:
Сообщения
847
Реакции
530
Помог
13 раз(а)
Аммо айди в веапонлисте тоже укажи
Я думаю патроны тебе выдались , но веапонлист не отображает значение, и.к. айди другой
 
Сообщения
847
Реакции
530
Помог
13 раз(а)
попробуй "50ae"

1587944563707.png

конечно не гарант., но все же

раз индекс сменился, значит дело в чем-то другом

stock weaponlist
JavaScript:
stock reShowWeaponList(pPlayer, pItem)
{
    new szWeaponName[32];
    //get_entvar(pItem, var_classname, szWeaponName, charsmax(szWeaponName));
    rg_get_iteminfo(pItem, ItemInfo_pszName, szWeaponName, charsmax(szWeaponName));

    new iPriAmmoType = get_member(pItem, m_Weapon_iPrimaryAmmoType);
    new iMaxPriAmmo = rg_get_iteminfo(pItem, ItemInfo_iMaxAmmo1);
    new iSecAmmoType = get_member(pItem, m_Weapon_iSecondaryAmmoType);
    new iMaxSecAmmo = rg_get_iteminfo(pItem, ItemInfo_iMaxAmmo2);
    new iSlot = rg_get_iteminfo(pItem, ItemInfo_iSlot);
    new iPosition = rg_get_iteminfo(pItem, ItemInfo_iPosition);
    new iId = rg_get_iteminfo(pItem, ItemInfo_iId);
    new iFlags = rg_get_iteminfo(pItem, ItemInfo_iFlags);

    static msgWeaponList;

    if (!msgWeaponList) msgWeaponList = get_user_msgid("WeaponList");

    message_begin(MSG_ONE, msgWeaponList, _, pPlayer);
    write_string(szWeaponName)
    write_byte(iPriAmmoType)
    write_byte(iMaxPriAmmo)
    write_byte(iSecAmmoType)
    write_byte(iMaxSecAmmo)
    write_byte(iSlot)
    write_byte(iPosition)
    write_byte(iId)
    write_byte(iFlags)
    message_end()
}
 
Сообщения
847
Реакции
530
Помог
13 раз(а)
rg set user bpammo крутит цикл по инвентарю, насколько я помню
У тебя нет дигла
 
Сообщения
847
Реакции
530
Помог
13 раз(а)
ExecuteHamB(Ham_GiveAmmo, id, rg_get_iteminfo(iWeapon, ItemInfo_iMaxClip), "50ae", rg_get_iteminfo(iWeapon, ItemInfo_iMaxAmmo1));
 
Сообщения
2,143
Реакции
1,225
Помог
44 раз(а)
ExecuteHamB(Ham_GiveAmmo, id, rg_get_iteminfo(iWeapon, ItemInfo_iMaxClip), "50ae", rg_get_iteminfo(iWeapon, ItemInfo_iMaxAmmo1));
Не знаю, что должно было изменится, использовав я такую конструкцию, но она тоже не решила проблему.
 
Сообщения
847
Реакции
530
Помог
13 раз(а)
покажи весь код
не понятно что у тебя там вообще
 
Сообщения
2,143
Реакции
1,225
Помог
44 раз(а)
BalbuR, типо, это и есть весь код, который отвечает за выдачу оружия и управлением патронами.

Код:
public plugin_init() {
    RegisterHam(Ham_Item_AddToPlayer, "weapon_usp", "hamfwd_AddToPlayer_Pre", .Post = false);
}

public hack_u_ass(pPlayer) {
    rg_give_custom_item(pPlayer, "weapon_usp", GT_DROP_AND_REPLACE, 43622);
}

public hamfwd_AddToPlayer_Pre(pWeapon, pPlayer) {
    set_member(pWeapon, m_Weapon_iPrimaryAmmoType, 8);
    rg_set_iteminfo(pWeapon, ItemInfo_pszAmmo1, "50ae");
    ExecuteHamB(Ham_GiveAmmo, pPlayer, 50, "50ae", 50);

    message_begin(MSG_ONE, g_iMsgWeaponList, .player = pPlayer);
    write_string(WEAPON_HUD);
    write_byte(8);
    write_byte(50);
    write_byte(-1);
    write_byte(-1);
    write_byte(1);
    write_byte(4);
    write_byte(any:WEAPON_USP);
    write_byte(0);
    message_end();
}
 
Последнее редактирование:
Сообщения
1,698
Реакции
1,510
Помог
26 раз(а)
Minni, и зачем пре?
 
Сообщения
2,143
Реакции
1,225
Помог
44 раз(а)
fl0wer, писал же выше, что пробую в пре и пост.
 
Сообщения
1,698
Реакции
1,510
Помог
26 раз(а)
Minni, оно перезаписывается в аддтуплаере (не конкретно там, но когда подбираешь). Поэтому нужен пост. И достаточно поменять m_Weapon_iPrimaryAmmoType, выдать игроку патроны в m_rgAmmo, и послать веапонлист для отображения их.
 
Сообщения
1,698
Реакции
1,510
Помог
26 раз(а)
Код:
#pragma semicolon 1

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

public plugin_init()
{
    register_clcmd("weapon_deagle", "@Command_WeaponDeagle");

    RegisterHookChain(RG_CBasePlayer_GiveAmmo, "@CBasePlayer_GiveAmmo_Pre", false);

    RegisterHam(Ham_Spawn, "weapon_usp", "@CUSP_Spawn_Post", true);
    RegisterHam(Ham_Item_AddToPlayer, "weapon_usp", "@CUSP_AddToPlayer_Post", true);
    RegisterHam(Ham_Weapon_Reload, "weapon_usp", "@CUSP_Reload_Pre", false);
}

@Command_WeaponDeagle(id)
{
    engclient_cmd(id, "weapon_usp");
    return PLUGIN_HANDLED;
}

@CBasePlayer_GiveAmmo_Pre(id, amount, name[], max)
{
    // usp check
    SetHookChainArg(3, ATYPE_STRING, "50AE");
}

@CUSP_Spawn_Post(id)
{
    rg_set_iteminfo(id, ItemInfo_pszAmmo1, "50AE");
    rg_set_iteminfo(id, ItemInfo_iMaxAmmo1, 35);
    rg_set_iteminfo(id, ItemInfo_iMaxClip, 7);
}

@CUSP_AddToPlayer_Post(id, player)
{
    SendWeaponList
    (
        player,
        "weapon_deagle",
        get_member(id, m_Weapon_iPrimaryAmmoType),
        rg_get_iteminfo(id, ItemInfo_iMaxAmmo1),
        -1,
        -1,
        1,
        4,
        get_member(id, m_iId),
        0
    );
}

@CUSP_Reload_Pre(id)
{
    new player = get_member(id, m_pPlayer);

    // Avoid the check
    // https://github.com/s1lentq/ReGameDLL_CS/blob/master/regamedll/dlls/wpn_shared/wpn_usp.cpp#L248
    set_member(player, ammo_45acp, 1);
}

SendWeaponList(id, const name[], ammo1, maxAmmo1, ammo2, maxAmmo2, slot, position, any:weaponId, flags)
{
    static msg;

    if (!msg)
        msg = get_user_msgid("WeaponList");

    message_begin(MSG_ONE, msg, _, id);
    write_string(name);
    write_byte(ammo1);
    write_byte(maxAmmo1);
    write_byte(ammo2);
    write_byte(maxAmmo2);
    write_byte(slot);
    write_byte(position);
    write_byte(weaponId);
    write_byte(flags);
    message_end();
}
Меняет патроны юспа на патроны дигла.
Избегает проверку наличия патронов в хуке перезарядки.
Заменяет WeaponList для корректного отображения.
Меняет максимальное кол-во патронов (+ в запасе).
Позволяет для юсп покупать патроны дигла.
 
Последнее редактирование:
Статус
В этой теме нельзя размещать новые ответы.

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

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