1. maFFyoZZyk Черный Жнец ^_^ Команда форума

    Регистрация:
    14.01.16
    Сообщения:
    1.238
    Симпатии:
    544
    Пол:
    Мужской
    Автор: Arkshine
    Перевод и редактирование: Weltgericht
    Оригинальная статья: https://forums.alliedmods.net/showthread.php?t=175632

    [​IMG]
    Данная статья поможет вам сделать новые спрайты для ваших ксо-говнопушек вашего оружия.

    Возможности:
    • Замена некоторых стандартных спрайтов (weapon, weapon_s (select), ammo, crosshair, zoom)
    Ограничения:

    • Возможна только замена стандартного оружия.
    • Максмальное количество заменяемого оружия: 29.
    * Возможно, автор сделает API систему, при наличии времени.
    * Возможно, автор сделает примеры, в которых заменяются еще и худы патронов и т.п. опять же, при наличии времени.

    Замена спрайтов происходит с помощью сообщения: WeaponList. Это сообщение (разумеется, с правильными значениями) нужно отправить клиенту, когда у него появляется определенное оружие. Значения можно найти здесь.
    Структура сообщения:
    PHP:
    string     WeaponName
    byte     PrimaryAmmoID
    byte     PrimaryAmmoMaxAmount
    byte     SecondaryAmmoID
    byte     SecondaryAmmoMaxAmount
    byte     SlotID
    byte     NumberInSlot
    byte     WeaponID
    byte     Flags

    В первом аргументе нужо указать файл (weapon_***.txt) с информацией о спрайтах. Файл должен находиться в папке /sprites.
    Структура файла:
    PHP:
    Кол-во спрайтов
    <тип спрайта> <разрешение> <файл спрайта> <ось X> <ость Y> <ширина> <высота>
    Пример из weapon_knife.txt:
    PHP:
    10
    weapon            320 320hud1    0    0    80    20
    weapon_s         320 320hud1    0    20    80    20
    ammo              320 320hud2    0    16    18    18
    crosshair          320 crosshairs    24    0    24    24
    autoaim           320 crosshairs    0    72    24    24
    weapon            640 640hud10    0    135    170    45
    weapon_s         640 640hud11    0    135    170    45
    ammo              640 640hud7    0    72    24    24
    crosshair          640 crosshairs    24    0    24    24
    autoaim            640 crosshairs    0    72    24    24

    Все файлы (.txt | .spr | .tga) нужно закачать клиенту.
    Для этого подойдет функция: precache_generic.


    Имя файла со спрайтами (weapon_***.txt) должно быть уникальным, так как, если у клиента уже будет файл с таким названием, он не будет перезаписан.

    Примеры использования:
    Предположем, мы хотим заменить нож на факел (flare).
    Для этого создадим файл
    weapon_ArkFlare.txt. В нем должны быть следующие строки:
    PHP:
    2
    weapon            640 640hud19    0    0    170    45
    weapon_s        640 640hud20    0    0    170    45
    В файлах sprites/640hud19.spr и sprites/640hud20.spr хранятся нужные нам спрайты.
    [​IMG][​IMG]
    Дальше, закачиваем клиенту необходимые файлы:
    PHP:
    public plugin_precache()
    {
    precache_generic"sprites/weapon_ArkFlare.txt" );
    precache_generic"sprites/640hud19.spr" );
    precache_generic"sprites/640hud20.spr" );
    }

    Теперь, нужно поймать событие, когда у клиента в руках появляется нож. Для этого подойдет 'forward Ham_Item_AddToPlayer'.
    PHP:
    RegisterHamHam_Item_AddToPlayer"weapon_knife""OnAddToPlayerKnife", .Post true );

    А затем, нужно отправить сообщения WeaponList клиенту:
    PHP:
    MsgIndexWeaponList get_user_msgid"WeaponList" );

    message_beginMSG_ONEMsgIndexWeaponList, .player player );
    {
    write_string("weapon_ArkFlare");    // WeaponName
    write_byte( -);                   // PrimaryAmmoID
    write_byte( -);                   // PrimaryAmmoMaxAmount
    write_byte( -);                   // SecondaryAmmoID
    write_byte( -);                   // SecondaryAmmoMaxAmount
    write_byte);                    // SlotID (0...N)
    write_byte);                    // NumberInSlot (1...N)
    write_byteCSW_KNIFE );            // WeaponID
    write_byte);                    // Flags
    }
    message_end();
    Вот, что получается в конце:
    PHP:
    #include < amxmodx >

    new MsgIndexWeaponList;

    public 
    plugin_init()
    {
    RegisterHamHam_Item_AddToPlayer"weapon_knife""OnAddToPlayerKnife", .Post true );


    MsgIndexWeaponList get_user_msgid"WeaponList" );
    }


    public 
    OnAddToPlayerKnife( const item, const player )
    {
    if( 
    pev_validitem ) && is_user_aliveplayer ) ) // just for safety.
    {
    message_beginMSG_ONEMsgIndexWeaponList, .player player );
    {
    write_string("weapon_ArkFlare");    // WeaponName
    write_byte( -);                   // PrimaryAmmoID
    write_byte( -);                   // PrimaryAmmoMaxAmount
    write_byte( -);                   // SecondaryAmmoID
    write_byte( -);                   // SecondaryAmmoMaxAmount
    write_byte);                    // SlotID (0...N)
    write_byte);                    // NumberInSlot (1...N)
    write_byteCSW_KNIFE );            // WeaponID
    write_byte);                    // Flags
    }
    message_end();
    }
    }
    Результат:

    [​IMG]
    Теперь, нужно поймать выбор этого оружия.

    Это можно сделать с помощью этого кода:
    PHP:
    public plugin_init()
    {
    register_clcmd"weapon_ArkFlare""ClientCommand_SelectFlare" );
    }


    public 
    ClientCommand_SelectFlare( const client )
    {
    engclient_cmdclient"weapon_knife" );
    }

    weapon_ArkFlare нужно заменить на то, что вы писали в первом аргументе (без расширения .txt) сообщения.
     

    Вложения:

    Последнее редактирование: 13.02.16
    Next^, LeninChan^^ и neygomon нравится это.