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

Изменение HUD оружия и слотов

Статьи или фрагменты кода для новичков и уже опытных скриптеров по AMXX.

Модератор: Chuvi

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

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

Изменение HUD оружия и слотов

Сообщение DJ_WEST » 08 авг 2012, 11:44

Автор: Arkshine
Перевод: DJ_WEST

hud_changer.png


Описание
Данная статья расскажет Вам о том, как сменить спрайт HUD оружия. Данный метод обладает следующими преимуществами:
  • Можно менять некоторые типы спрайтов: weapon, weapon_s (select), ammo, crosshair, zoom
  • Можно изменить слот для оружия
  • Динамическое обновление: не нужно перезапускать клиент, сервер или делать что-то еще
  • Вы можете делать все изменения для одного конкретного игрока

У метода также есть и свои недостатки:
  • Можно заменить только какое-то оригинальное оружие, нельзя добавить свое
  • Вы можете иметь только 29 новых оружий одновременно
  • Перенаправление слотов оружий не всегда работает корректно

Такая функциональность должна быть интегрирована в отдельный плагин или модуль, который будет управлять нестандартным оружием, к примеру, как WeaponMod.

Как это работает?
Первым ключом является игровое событие: Вы должны зарегистрироваться, чтобы видеть ссылки.
Данное событие непосредственно настраивает список HUD оружия. Поэтому для корректной работы необходимо отправлять сообщение с правильными значениями. Правильные значения можно найти Вы должны зарегистрироваться, чтобы видеть ссылки..

Структура сообщения имеет следующий вид:
string WeaponName
byte PrimaryAmmoID
byte PrimaryAmmoMaxAmount
byte SecondaryAmmoID
byte SecondaryAmmoMaxAmount
byte SlotID
byte NumberInSlot
byte WeaponID
byte Flags


Второй ключ - это WeaponName и SlotID.
Первый аргумент используется, к примеру, когда игрок выбирает оружие, что равносильно тому, когда клиент набирает название оружия в консоли.
Необходимо изменить его на название вашего нового оружия, к примеру, weapon_flare.
Чтобы выбрать оружие, необходимо хукнуть новое название оружия и затем перенаправить на оригинальное оружие.
Второй аргумент позволяет изменить слот оружия.

Третий ключ - это опять же первый аргумент (WeaponName), который связан также с файлом weapon_*.txt (* = название оружия) в директории sprites на клиенте.
Данный файл содержит спрайты для каждого типа. Полный список типов: weapon, weapon_s, ammo, ammo2, autoaim, crosshair, zoom, zoom_aim (автор не уверен, что ammo2, autoaim или zoom_aim можно использовать).

Формат файла:
количество_спрайтов
<тип> <разрешение> <спрайт> <смещение_по_X> <смещение_по_Y> <ширина> <высота>


В данном файле вы можете прописать ваши новые спрайты. К примеру, файл weapon_knife.txt:
Код: Выделить всё
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().

Лучше всего делать для оружия уникальные названия, потому что если другой плагин будет использовать точно такое же название, то файлы на клиенте не буду перезаписаны. Также для спрайтов можно создавать свои директории.

Примеры в деталях
1. Создаем свой файл настроек.
Допустим вы хотите заменить оружие knife на flare, а также изменить его слот.
Вы должны создать файл weapon_ArkFlare.txt:
Код: Выделить всё
2
weapon         640 640hud19   0   0   170   45
weapon_s      640 640hud20   0   0   170   45

Будем использовать следующие спрайты: sprites/640hud19.spr и sprites/640hud20.spr.

640hud19.gif
640hud20.gif


2. Предварительное кеширование файлов.
Для этого нам необходимо прописать в нашем плагине:
Код: Выделить всё
public plugin_precache()
{
    precache_generic"sprites/weapon_ArkFlare.txt" );
    precache_generic"sprites/640hud19.spr" );
    precache_generic"sprites/640hud20.spr" );

3. Хук события, когда игрок получает оружие.
Нам необходимо хукнуть событие, когда игрок получает нож. Затем мы сможем послать сообщение WeaponList , где сообщим клиенту о том, что хотим использовать "weapon_ArkFlare".

Мы можем использовать Ham_Item_AddToPlayer для этого:
Код: Выделить всё
RegisterHamHam_Item_AddToPlayer"weapon_knife""OnAddToPlayerKnife", .Post true ); 

Затем мы можем послать наше сообщение:
Код: Выделить всё
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 ) ) // для безопасности
    {
        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();
    }

В результате получим:
knife_to_flare.png


4. Хукаем событие, когда игрок получает оружие и меняем ему слот.
Почти тоже самое, что в 3 пункту, но только теперь нам надо будет поменять номер слота. Также необходимо хукнуть Ham_Item_ItemSlot, потому что значения, которые хранятся в CKnife::GetItemInfo() не изменяются и когда ItemSlot() будет вызван, то он вернет оригинальное значение.
Код: Выделить всё
RegisterHamHam_Item_ItemSlot"weapon_knife""OnItemSlotKnife" ); 

Допустим мы хотим изменить слот оружия на 5. Будьте внимательны, потому что нумерация слотов в сообщение начинается с 0, когда же в ItemSlot идет с 1.
Код: Выделить всё
new MsgIndexWeaponList;
 
public plugin_init()
{
    RegisterHamHam_Item_AddToPlayer"weapon_knife""OnAddToPlayerKnife", .Post true );
    RegisterHamHam_Item_ItemSlot"weapon_knife""OnItemSlotKnife" );
    
    MsgIndexWeaponList 
get_user_msgid"WeaponList" );
}
 
public OnAddToPlayerKnife( const item, const player )
{
    if( pev_validitem ) && is_user_aliveplayer ) ) // для безопасности
    {
        message_beginMSG_ONEMsgIndexWeaponList, .player player );
        {
            write_string("weapon_ArkFlare");    // WeaponName
            write_byte( -);                   // PrimaryAmmoID
            write_byte( -);                   // PrimaryAmmoMaxAmount
            write_byte( -);                   // SecondaryAmmoID
            write_byte( -);                   // SecondaryAmmoMaxAmount
            write_byte(4);                    // SlotID (0...N)    <== Changed here (was 2)
            write_byte);                    // NumberInSlot (1...N)
            write_byteCSW_KNIFE );            // WeaponID
            write_byte);                    // Flags
        }
        message_end();
    }
}
 
public OnItemSlotKnife( const item )
{
    SetHamReturnInteger(5);
    return HAM_SUPERCEDE;

В результате получим:
knife_to_flare_with_slot.png


5. Хук выбора оружия.
После того, как вы изменили имя оружия, необходимо хукнуть его вызов. Потому что когда игрок выбирает ваше новое оружие, будет использовано weapon_ArkFlare, но такого оружия не существует фактически, поэтому нам нужно в хуке заставить использовать оригинальное.
Код: Выделить всё
public plugin_init()
{
    register_clcmd"weapon_ArkFlare""ClientCommand_SelectFlare" );
}
 
public ClientCommand_SelectFlare( const client )
{
    engclient_cmdclient"weapon_knife" );

6. Полностью рабочий код.
Код: Выделить всё
#include <amxmodx>  
#include <hamsandwich>  
#include <fakemeta>  
 
new MsgIndexWeaponList 
 
public plugin_precache()  
 
    precache_generic
"sprites/weapon_ArkFlare.txt" );  
    precache_generic
"sprites/640hud19.spr" );  
    precache_generic
"sprites/640hud20.spr" );  
 
 
public plugin_init()  
 
    RegisterHam
Ham_Item_AddToPlayer"weapon_knife""OnAddToPlayerKnife", .Post true );  
    RegisterHam
Ham_Item_ItemSlot"weapon_knife""OnItemSlotKnife" );  
 
    register_clcmd
"weapon_ArkFlare""ClientCommand_SelectFlare" );  
 
    MsgIndexWeaponList 
get_user_msgid"WeaponList" );  
 
 
public ClientCommand_SelectFlare( const client  
 
    engclient_cmd
client"weapon_knife" );  
 
 
public OnAddToPlayerKnife( const item, const player  
 
    
if( pev_validitem ) && is_user_aliveplayer ) ) // just for safety.  
     
        message_begin
MSG_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
();  
    
 
 
 
public OnItemSlotKnife( const item  
 
    SetHamReturnInteger
);  
    
return HAM_SUPERCEDE 
Не пишите мне в ЛС: если вам нужна помощь на бесплатной основе. Любые вопросы на форум.
Аватара пользователя
DJ_WEST
Администратор
 
Сообщения: 3641
Зарегистрирован: 22 авг 2009, 00:38
Благодарил (а): 48 раз.
Поблагодарили: 2198 раз.
Опыт программирования: Больше трех лет
Языки программирования: Counter-Strike 1.6
Counter-Strike: Source
Left 4 Dead
Left 4 Dead 2

Re: Изменение HUD оружия и слотов

Сообщение StRiKeR.csF » 08 авг 2012, 12:07

Спасибо, но такое я уже где-то читал)
Чего добился ты и бла, бла, бла
Тут, типа, посыл был, но админ его потёр :(

Skype: nestle.csf
-В чём сила, брат?
-Сила в Debug.log xD
Аватара пользователя
StRiKeR.csF
Скриптер
 
Сообщения: 771
Зарегистрирован: 03 июн 2011, 06:26
Откуда: Кубань
Благодарил (а): 126 раз.
Поблагодарили: 181 раз.
Опыт программирования: Больше трех лет
Языки программирования: C++
C#
JavaScript
PHP(+MySQL)
Assembler

Re: Изменение HUD оружия и слотов

Сообщение Fedcomp » 08 авг 2012, 13:23

на оленях и читал. Автора посмотри.
Не помогаю в ЛС - есть форум.
Плагины тоже не пишу, на форуме достаточно хороших скриптеров.


"я ставлю зависимости потому что мне приятно" - subb98 @ 2017
Аватара пользователя
Fedcomp
Администратор
 
Сообщения: 4687
Зарегистрирован: 28 авг 2009, 20:47
Благодарил (а): 762 раз.
Поблагодарили: 1249 раз.
Языки программирования: =>
pawn / php / python / ruby
javascript / rust

Re: Изменение HUD оружия и слотов

Сообщение BROWN » 09 авг 2012, 02:03

Видел такое на серверах, давно.
Brown_dev
Аватара пользователя
BROWN
 
Сообщения: 986
Зарегистрирован: 25 фев 2012, 23:19
Забанен
Благодарил (а): 39 раз.
Поблагодарили: 411 раз.

Re: Изменение HUD оружия и слотов

Сообщение StRiKeR.csF » 09 авг 2012, 07:06

BROWN писал(а):Видел такое на серверах, давно.

Я видел это на аленях, давно :-D
Чего добился ты и бла, бла, бла
Тут, типа, посыл был, но админ его потёр :(

Skype: nestle.csf
-В чём сила, брат?
-Сила в Debug.log xD
Аватара пользователя
StRiKeR.csF
Скриптер
 
Сообщения: 771
Зарегистрирован: 03 июн 2011, 06:26
Откуда: Кубань
Благодарил (а): 126 раз.
Поблагодарили: 181 раз.
Опыт программирования: Больше трех лет
Языки программирования: C++
C#
JavaScript
PHP(+MySQL)
Assembler

Re: Изменение HUD оружия и слотов

Сообщение DJ_WEST » 09 авг 2012, 07:09

Никто и не говорит, что это новое. Статья старая, но интересная. Поэтому была переведена и выложена. Хватит флудить.
Не пишите мне в ЛС: если вам нужна помощь на бесплатной основе. Любые вопросы на форум.
Аватара пользователя
DJ_WEST
Администратор
 
Сообщения: 3641
Зарегистрирован: 22 авг 2009, 00:38
Благодарил (а): 48 раз.
Поблагодарили: 2198 раз.
Опыт программирования: Больше трех лет
Языки программирования: Counter-Strike 1.6
Counter-Strike: Source
Left 4 Dead
Left 4 Dead 2

Re: Изменение HUD оружия и слотов

Сообщение noo00oob » 09 авг 2012, 09:00

StRiKeR.csF писал(а):
BROWN писал(а):Видел такое на серверах, давно.

Я видел это на аленях, давно :-D

А я видел это прям на этом сайте, очень давно, 2 года назад.
Вы должны зарегистрироваться, чтобы видеть ссылки.
Один фрукт, страдающий недостачей времени, нашел его ради меня любимого и писал(а):
noo00oob, зачем родился на свет вообще? срать на форумах это понятно.. больше изъеба не найти как бэ? а то, что ты недоношенная скотина, сдерживайся, детка.
noo00oob
 
Сообщения: 1061
Зарегистрирован: 09 янв 2010, 21:52
Благодарил (а): 258 раз.
Поблагодарили: 394 раз.
Опыт программирования: Больше трех лет
Языки программирования: Counter-Strike 1.6
Half-Life

Re: Изменение HUD оружия и слотов

Сообщение StRiKeR.csF » 11 авг 2012, 04:01

noo00oob писал(а):
StRiKeR.csF писал(а):
BROWN писал(а):Видел такое на серверах, давно.

Я видел это на аленях, давно :-D

А я видел это прям на этом сайте, очень давно, 2 года назад.
Вы должны зарегистрироваться, чтобы видеть ссылки.

Точно, эту я тоже читал :-)
Чего добился ты и бла, бла, бла
Тут, типа, посыл был, но админ его потёр :(

Skype: nestle.csf
-В чём сила, брат?
-Сила в Debug.log xD
Аватара пользователя
StRiKeR.csF
Скриптер
 
Сообщения: 771
Зарегистрирован: 03 июн 2011, 06:26
Откуда: Кубань
Благодарил (а): 126 раз.
Поблагодарили: 181 раз.
Опыт программирования: Больше трех лет
Языки программирования: C++
C#
JavaScript
PHP(+MySQL)
Assembler

Re: Изменение HUD оружия и слотов

Сообщение Bos93 » 12 авг 2012, 12:17

noo00oob писал(а):
StRiKeR.csF писал(а):
BROWN писал(а):Видел такое на серверах, давно.

Я видел это на аленях, давно :-D

А я видел это прям на этом сайте, очень давно, 2 года назад.
Вы должны зарегистрироваться, чтобы видеть ссылки.


DJ_WEST писал(а):Молодец, возьми пирожок с полочки =)


хД
Всем добра, любви и осознанности.

Nosce animum tuum.

А осознание и есть, что понял и осмыслил..
А коль не думал ты о том, то кто о том замыслил..?
Аватара пользователя
Bos93
 
Сообщения: 1425
Зарегистрирован: 03 апр 2010, 13:44
Благодарил (а): 149 раз.
Поблагодарили: 513 раз.

Re: Изменение HUD оружия и слотов

Сообщение noo00oob » 12 авг 2012, 19:20

Bos93 писал(а):хД

noo00oob писал(а):Он с капустой, а я хочу с картошкой :-D

:-D
Один фрукт, страдающий недостачей времени, нашел его ради меня любимого и писал(а):
noo00oob, зачем родился на свет вообще? срать на форумах это понятно.. больше изъеба не найти как бэ? а то, что ты недоношенная скотина, сдерживайся, детка.
noo00oob
 
Сообщения: 1061
Зарегистрирован: 09 янв 2010, 21:52
Благодарил (а): 258 раз.
Поблагодарили: 394 раз.
Опыт программирования: Больше трех лет
Языки программирования: Counter-Strike 1.6
Half-Life

След.

Вернуться в Статьи / фрагменты кода

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

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