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

Выбора оружия в HUDе на клиенте

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

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

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

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

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

Выбора оружия в HUDе на клиенте

Сообщение Doc Batcon » 13 май 2018, 18:27

Доброго времени суток коллеги!
В процессе написания плагина понадобилось сэмулировать наличие у игрока определенного оружия в инвентаре поверх имеющего. Ок, это сделали, но вот как побороть ниже описанный баг не представляю.

cs_assault0004.jpg

cs_assault0006.jpg

cs_assault0008.jpg


Фото №1 - Игрок получил нож, но он не отображается в худе
Фото №2 - Игрок дополнительно получил пистолет, и нож отобразился
Фото №3 - Игрок дополнительно получает еще оружие, но оно не отображается(Как видим веапонлист корректно обновился, но в списке его нет оО)

Отсылка клиенту нового списка оружия:
Код: Выделить всё
public FM_Hook_UpdateClientData_Post(iClient, SendWeapons, CD_Handle) 
{
    static pView; pView = iClient;
    if(!IsUserAlive(pView))
    {
        if(!(pView = get_cd(CD_Handle, CD_iUser2)))
            return FMRES_IGNORED;
    }

    #if defined _zdt_wc_testfunc
        static Float:fDelayMsg[33]; //DEBUG 
        if(fDelayMsg[pView] <= get_gametime() && pView == iClient)
        {
            new Msg[128], i;
            static wpn[32], buf[2], name[32];
            for(= 1; i <= CSW_LAST_WEAPON+1; i++)
            {
                if(!(g_UserWeapons[pView] & BIT(i)))
                    continue;

                get_weaponname(i, wpn, 31);
                strtok(wpn, buf, charsmax(buf), name, charsmax(name), '_');
                format(Msg, charsmax(Msg), "%s|%s", Msg, name);
            }

            fDelayMsg[pView] = get_gametime() + 1.0;
            client_print(iClient, print_chat, "Weapons:%s", Msg);
        }
    
        static Weapons
; Weapons = get_cd(CD_Handle, CD_Weapons);

        if(Weapons & BIT(CSW_VEST))
            Weapons = BIT(CSW_VEST);

        Weapons |= g_UserWeapons[pView]

        set_cd(CD_Handle, CD_Weapons, Weapons);
    #endif

    return FMRES_IGNORED;

Отсылка клиенту обновленного веапонлиста:
Код: Выделить всё
stock ShowWeaponList(pPlayer, pItem)
{
    new szWeaponName[ML_WPN_WEAPONLIST]; 
    ITEM_GetWeaponlist
(pItem, szWeaponName, charsmax(szWeaponName));
    if(!szWeaponName[0])
        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);

    #if defined _zdt_wc_testfunc
        iId = ITEM_GetIconID(pItem); //Новый CSW_ID оружия 
    #endif

    message_begin(MSG_ONE, MSG_ID_WEAPONLIST, _, 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()


Смотрел исходники клиента HL, но кроме составления списка оружия на основании weapons ничего больше не заметил :dntknw:
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
Doc Batcon
 
Сообщения: 26
Зарегистрирован: 18 сен 2016, 12:36
Благодарил (а): 2 раз.
Поблагодарили: 7 раз.
Опыт программирования: Меньше недели
Языки программирования: Pawn
C++

Re: Выбора оружия в HUDе на клиенте

Сообщение DeMNiX » 13 май 2018, 19:16

Ну если я правильно понял, идея все та же что и с кастомной гранатой ЖЭ
Проблема-то в том, что клиент не знает твой новый CSW_VEST
Когда я пытался написать такую гранату, столкнулся с такой же проблемой, тут только неиспользуемые слоты искать у игрока и ставить свой предмет на этот ID (но тут уже нужно блочить всю логику деф.оружия и писать свою, что далеко не приятно)

Мне помог только хук-костыль в виде клиентской команды, позже я совсем отказался от слот-идеи
Работа с моделями для кс 1.6
Telegram @DeMNiX
vk com/sbalburov
Аватара пользователя
DeMNiX
 
Сообщения: 175
Зарегистрирован: 24 сен 2011, 17:48
Благодарил (а): 24 раз.
Поблагодарили: 37 раз.
Опыт программирования: Около года
Языки программирования: Counter-Strike 1.6

Re: Выбора оружия в HUDе на клиенте

Сообщение Doc Batcon » 13 май 2018, 20:12

DeMNiX писал(а):Проблема-то в том, что клиент не знает твой новый CSW_VEST

CSW_VEST известен, это WEAPON_SUIT(хз зачем его переименовали в кс) без него клиент не будет отрисовывать худ

Тут проблема в непостоянстве бага(при первом получение оружия худ не отобразиться, а при повторном поднятие того же оружия с тем же CSW все отлично работает), он возникает на различных известных CSW без ясной на то причины
Приложу весь код, может так быстрее решится проблема :-)
Код: Выделить всё
#if defined _zdt_wc_testfunc
    #endinput
#endif
#define _zdt_wc_testfunc

#define ICON_TIME        6.0
#define ICON_MAX        12

new const ICON_CSW[] =
{
    //CSW_P228,
    //CSW_SCOUT,
    //CSW_HEGRENADE,
    CSW_XM1014,
    //CSW_C4,
    CSW_MAC10,
    CSW_AUG,
    //CSW_SMOKEGRENADE,
    //CSW_ELITE,
    //CSW_FIVESEVEN,
    CSW_UMP45,
    //CSW_SG550,
    CSW_GALIL,
    CSW_FAMAS,
    //CSW_USP,
    //CSW_GLOCK18,
    //CSW_AWP,
    CSW_MP5NAVY,
    CSW_M249,
    CSW_M3,
    CSW_M4A1,
    CSW_TMP,
    //CSW_G3SG1,
    //CSW_FLASHBANG,
    CSW_DEAGLE,
    CSW_SG552,
    CSW_AK47,
    //CSW_KNIFE,
    CSW_P90
}

new g_iUseIconID[MAX_CLIENTS+1][ICON_MAX];
new g_iCurItemID[MAX_CLIENTS+1];
new g_iCurWpnID[MAX_CLIENTS+1];

new Float:g_fIconTime[MAX_CLIENTS+1][CSW_LAST_WEAPON+1];
new g_UserWeapons[MAX_CLIENTS+1];

new const WEAPONENTNAMES[][] = { "", "weapon_p228", "", "weapon_scout", "weapon_hegrenade", "weapon_xm1014", "weapon_c4", "weapon_mac10",
            "weapon_aug", "weapon_smokegrenade", "weapon_elite", "weapon_fiveseven", "weapon_ump45", "weapon_sg550",
            "weapon_galil", "weapon_famas", "weapon_usp", "weapon_glock18", "weapon_awp", "weapon_mp5navy", "weapon_m249",
            "weapon_m3", "weapon_m4a1", "weapon_tmp", "weapon_g3sg1", "weapon_flashbang", "weapon_deagle", "weapon_sg552",
            "weapon_ak47", "weapon_knife", "weapon_p90" }

public ResetIconData(pPlayer)
{
    for(new i; i < CSW_LAST_WEAPON+1; i++)
        g_fIconTime[pPlayer][i] = 0.0;

    for(new i; i < ICON_MAX; i++)
        g_iUseIconID[pPlayer][i] = 0;

    g_iCurItemID[pPlayer] = 0;
    g_UserWeapons[pPlayer] = 0;
}

stock GetNextIconID(pPlayer, Ignore = 0)
{
    new CSW;
    new Float:fGameTime = get_gametime();
    for(new i; i < sizeof ICON_CSW; i++)
    {
        CSW = ICON_CSW[i];

        if(Ignore && Ignore == CSW)
            continue;

        if(g_UserWeapons[pPlayer] & BIT(CSW))
            continue;

        if(g_fIconTime[pPlayer][CSW] > fGameTime)
            continue;

        return CSW;
    }
    return 0;
}
stock GetNextIconSlot(pPlayer)
{
    new IconSlot;
    new Float:temp = UNREAL_TIME;
    new CSW;
    for(new Slot = 0; Slot < ICON_MAX; Slot++)
    {
        CSW = g_iUseIconID[pPlayer][Slot];

        if(g_UserWeapons[pPlayer] & BIT(CSW))
            continue;

        if(g_fIconTime[pPlayer][CSW] < temp)
        {
            temp = g_fIconTime[pPlayer][CSW];
            IconSlot = Slot;
        }
    }

    return IconSlot;
}

public Init_TestFunc()
{
    for(new i = 1; i < sizeof WEAPONENTNAMES; i++)
    {
        if(!WEAPONENTNAMES[i][0]) continue;
        RegisterHam(Ham_Item_Deploy, WEAPONENTNAMES[i], "CBasePlayerWeapon_Deploy_Post", true);
        RegisterHam(Ham_Item_Holster, WEAPONENTNAMES[i], "CBasePlayerWeapon_Holster_Post", true);
        RegisterHam(Ham_Item_AttachToPlayer, WEAPONENTNAMES[i], "CBasePlayerWeapon_AttachToPlayer_Post", true);
    }

    RegisterHookChain(RG_CBasePlayer_RemovePlayerItem, "CBasePlayer_RemovePlayerItem_Post_", true);
    register_message(MSG_ID_CURWEAPON, "MsgHook_CurWeapon");
    set_msg_block(MSG_ID_WEAPPICKUP, BLOCK_SET);
}
//Вызывается в CBasePlayerWeapon_AttachToPlayer_Post перед ShowWeaponList
public CBasePlayer_AddPlayerItem_Post_TF(const pPlayer, const pItem)
{
    new CSW = GetNextIconID(pPlayer, get_member(pItem, m_iId));
    new Slot = GetNextIconSlot(pPlayer);

    g_fIconTime[pPlayer][CSW] = get_gametime() + ICON_TIME;
    g_iUseIconID[pPlayer][Slot] = CSW;

    g_UserWeapons[pPlayer] |= BIT(CSW);
    ITEM_SetIconID(pItem, CSW);

    message_begin(MSG_ONE, MSG_ID_WEAPPICKUP, _, pPlayer);
    write_byte(CSW);
    message_end();

    if(get_member(pPlayer, m_pActiveItem) == pItem)
    {
        g_iCurItemID[pPlayer] = ITEM_GetIconID(pItem);
        g_iCurWpnID[pPlayer] = get_member(pItem, m_iId);
        set_member(pPlayer, m_fWeapon, false);
    }

    new name[32]; get_weaponname(CSW, name, 31);
    client_print(pPlayer, print_chat, "AddPlayerItem %s", name);
}
public CBasePlayer_RemovePlayerItem_Post_(pPlayer, pItem)
{
    new CSW = ITEM_GetIconID(pItem);

    g_UserWeapons[pPlayer] &= ~BIT(CSW);
    ITEM_SetIconID(pItem, 0);

    new name[32]; get_weaponname(CSW, name, 31);
    client_print(pPlayer, print_chat, "RemovePlayerItem %s", name);
}
public MsgHook_CurWeapon(iMsgDest, iMsgID, pPlayer)
{
    if(!get_msg_arg_int(1))
        return;

    if(!g_iCurItemID[pPlayer])
        return;

    client_print(pPlayer, print_chat, "CSW %i", g_iCurItemID[pPlayer]);
    set_msg_arg_int(2, ARG_BYTE, g_iCurItemID[pPlayer]);
Аватара пользователя
Doc Batcon
 
Сообщения: 26
Зарегистрирован: 18 сен 2016, 12:36
Благодарил (а): 2 раз.
Поблагодарили: 7 раз.
Опыт программирования: Меньше недели
Языки программирования: Pawn
C++

Re: Выбора оружия в HUDе на клиенте

Сообщение DeMNiX » 13 май 2018, 22:10

Посмотрел код, идея и реализация крутая
Если есть тестовый сервер, то нужно пощупать самому, по логике сложно определить "как и когда"
Где-то что-то по дороге остается "не тронутым"
Веапонлист задается, а отображаться не хочет, это тоже интересно - где-то в этом месте стоит поискать
Работа с моделями для кс 1.6
Telegram @DeMNiX
vk com/sbalburov
Аватара пользователя
DeMNiX
 
Сообщения: 175
Зарегистрирован: 24 сен 2011, 17:48
Благодарил (а): 24 раз.
Поблагодарили: 37 раз.
Опыт программирования: Около года
Языки программирования: Counter-Strike 1.6

Re: Выбора оружия в HUDе на клиенте

Сообщение Doc Batcon » 17 май 2018, 17:42

ап
Аватара пользователя
Doc Batcon
 
Сообщения: 26
Зарегистрирован: 18 сен 2016, 12:36
Благодарил (а): 2 раз.
Поблагодарили: 7 раз.
Опыт программирования: Меньше недели
Языки программирования: Pawn
C++

Re: Выбора оружия в HUDе на клиенте

Сообщение Doc Batcon » 21 май 2018, 14:00

ап
Аватара пользователя
Doc Batcon
 
Сообщения: 26
Зарегистрирован: 18 сен 2016, 12:36
Благодарил (а): 2 раз.
Поблагодарили: 7 раз.
Опыт программирования: Меньше недели
Языки программирования: Pawn
C++

Re: Выбора оружия в HUDе на клиенте

Сообщение Doc Batcon » 25 май 2018, 20:12

ап
Аватара пользователя
Doc Batcon
 
Сообщения: 26
Зарегистрирован: 18 сен 2016, 12:36
Благодарил (а): 2 раз.
Поблагодарили: 7 раз.
Опыт программирования: Меньше недели
Языки программирования: Pawn
C++

Re: Выбора оружия в HUDе на клиенте

Сообщение Doc Batcon » 27 май 2018, 12:18

ап
Аватара пользователя
Doc Batcon
 
Сообщения: 26
Зарегистрирован: 18 сен 2016, 12:36
Благодарил (а): 2 раз.
Поблагодарили: 7 раз.
Опыт программирования: Меньше недели
Языки программирования: Pawn
C++

Re: Выбора оружия в HUDе на клиенте

Сообщение Vaqtincha » 27 май 2018, 13:01

в чем проблема ?
Аватара пользователя
Vaqtincha
 
Сообщения: 117
Зарегистрирован: 28 мар 2018, 15:05
Благодарил (а): 2 раз.
Поблагодарили: 31 раз.


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

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

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

cron