Saturday, June 7, 2014

Custom Weapon Hud Sprites + Slot Redirection - Tùy Chọn HUD vũ khí


Custom Weapon Hud Sprites + Slot Redirection
Updated January 6th, 2012





Bao giờ muốn thấy vũ khí mới của bạn trên thanh?
Nó thực sự ngạc nhiên và dễ dàng để hiển thị một sprite mới.

Các phương pháp sau đây có các tính năng:

  • Có thể thay đổi sprites vài loại - vũ khí, weapon_s (chọn), đạn, crosshair, zoom
  • Có thể chuyển hướng slots - bạn có thể quyết định làm thế nào để sắp xếp danh sách vũ khí của bạn
  • Năng động - bạn không cần phải khởi động lại, chờ đợi, hoặc một cái gì đó
  • Mỗi người chơi - bạn có thể xử lý các loại vũ khí mới mỗi người chơi có điều kiện
Những hạn chế là:

  • Phải căn cứ vào một vũ khí ban đầu - Có nghĩa là bạn thay thế một loại vũ khí hiện có, bạn không thể thêm
  • Do đó bạn có thể chỉ có 29 loại vũ khí mới cùng một lúc - mà thực sự là tốt và bạn có thể xử lý bộ vũ khí khác nhau mỗi người chơi
  • Slot chuyển hướng có thể không làm việc luôn luôn đúng - phát hiện trong khi viết hướng dẫn, nó không làm việc tốt


Tôi muốn chờ đợi bằng cách làm cho một API trước khi gửi bài, nhưng đó không phải là thực sự hữu ích. Mặc dù vậy, tôi sẽ làm điều đó, một số người có thể thấy rằng hữu ích. 

Functionnality như vậy sẽ xứng đáng được tích hợp trong một plugin trong đó quản lý vũ khí tùy chỉnh, như WeaponMod, vì vậy đối với từng loại vũ khí mới, một vũ khí ban đầu là distribuated sẽ được sử dụng để thay thế. 
Mục đích là để tránh bội plugin sử dụng phương pháp khác nhau để tạo ra một vũ khí mới, sử dụng vũ khí ban đầu tương tự.


Quan trọng: Trong khi viết các hướng dẫn và kiểm tra, tôi đã nhận thấy sự chuyển hướng slot không làm việc tốt cho tất cả các loại vũ khí. Ví dụ, ak47 không muốn được chuyển hướng, hoặc con dao không muốn đi vào slot 1/2. Tôi không biết tại sao, vẫn cần phải được tìm ra. Tôi đã không được thử nghiệm nhiều và không có nhiều thời gian, vì vậy nó sẽ được vào bạn để cung cấp cho người feebacks và do đó cải tiến cách làm thay đổi thanh trạng thái. Mặc dù không có sự chuyển hướng, bạn có thể gặp vấn đề. Hãy hiểu đó là cái gì đó sẽ là cần thiết để kiểm tra. Tôi đã đăng mặc dù tôi không chắc chắn nó sẽ hoạt động tất cả các thời gian, vì lợi ích của kiến thức và bởi vì càng có nhiều người nhìn vào đó, cơ hội tốt hơn để có được một phương pháp mạnh mẽ hơn.
Hãy ghi nhớ những hướng dẫn có mục đích duy nhất cho bây giờ để hiển thị các cơ sở của phương pháp.



nội dung:

  • Nó hoạt động như thế nào ?
  • Mã ví dụ trong các bước
    • Chuẩn bị tập tin của bạn
    • Hooking khi người chơi có một vũ khí
    • Hooking khi người chơi có một vũ khí và chuyển hướng một slot
    • Hooking lựa chọn vũ khí
    • Đầy đủ mã ví dụ
  • ví dụ chi tiết (coming...)
  • API (coming...)



Nó hoạt động như thế nào ? top

Chìa khóa chính là sự kiện trò chơi : WeaponList
Tin nhắn này về cơ bản cấu hình danh sách vũ khí HUD.  
Đó là điều bạn nên gửi với các giá trị ngay khi vũ khí được thêm vào balo của người chơi. 
Giá trị mà bạn có thể tìm thấy here.

Cấu trúc trông giống như:


Code:
string  WeaponName
byte  PrimaryAmmoID
byte  PrimaryAmmoMaxAmount
byte  SecondaryAmmoID
byte  SecondaryAmmoMaxAmount
byte  SlotID
byte  NumberInSlot
byte  WeaponID
byte  Flags
Chìa khóa thứ hai là WeaponName và SlotID.
Tham số đầu tiên được sử dụng ví dụ như khi bạn chọn một vũ khí, nó giống như bước vào trong giao diện điều khiển tên vũ khí.
Nó ở đó bạn thay đổi nó theo tên vũ khí mới của bạn, như weapon_flare.
Để lựa chọn các loại vũ khí, bạn sẽ cần phải hook tên vũ khí này để chuyển hướng nó vào vũ khí ban đầu.

Lập luận sau này sẽ giúp bạn thay đổi các khe của một vũ khí.
Nó sẽ cần thêm một số mã để làm việc đúng cách.
Chìa khóa thứ ba là tham số đầu tiên mà còn đề cập đến tập tin có tên weapon_ * txt (* = tên). Trong / sprites thư mục.
Nó chứa các sprite để sử dụng cho mỗi loại.
Một danh sách đầy đủ các kiểu sẽ là: weaponweapon_sammoammo2autoaimcrosshairzoomzoom_aim.
(Mặc dù tôi không chắc chắn ammo2, autoaim hoặc zoom_aim có thể được sử dụng.)

So, in this file you can define your new sprites.
Here the format of such file :


Code:
numberOfSprites
<type> <resolution> <spriteFile> <shiftX> <shiftY> <width> <height>
...

Ví Dụ với File weapon_knife.txt :


Code:
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

Tôi nghĩ đó là tự giải thích. Chỉ cần nhìn vào một tập tin sprite xem.
Chìa khóa thứ tư là để chuẩn bị cho tập tin cần thiết.
Cả txt và .spr / .tga. tập tin cần thiết
Chúng có thể được chuẩn bị mà không vấn đề sử dụng precache_generic ().

Đừng ngần ngại để làm cho tên công phu cho tên vũ khí, vì vậy tập tin sẽ được somewhow độc đáo. 
Bởi vì nếu có một plugin sử dụng tên vũ khí tương tự, các tập tin hiện có trên máy khách sẽ không được ghi đè lên. 
Ngoài ra, đối với các sprite, bạn có thể muốn tạo các thư mục tùy chỉnh.

Mã ví dụ trong các bướctop

Hãy nói rằng bạn muốn thay thế con dao với một ngọn lửa, và bạn muốn thay đổi khe của nó quá.

Vì vậy, bạn có một tập tin với weapon_ArkFlare.txt như nội dung:

Code:
2
weapon   640 640hud19 0 0 170 45
weapon_s  640 640hud20 0 0 170 45

Nó sẽ sử dụng sprites/640hud19.spr và các tập tin sprites/640hud20.spr.


Chuẩn bị tập tin của bạn top
Tất cả bạn cần là làm cho khách hàng tải về các tập tin. Đó là precache_generic được sử dụng.

Code:
public plugin_precache() {     precache_generic( "sprites/weapon_ArkFlare.txt" );     precache_generic( "sprites/640hud19.spr" );     precache_generic( "sprites/640hud20.spr" ); }
Hooking khi người chơi có một vũ khí top
Chúng ta cần phải hook khi một cầu thủ được một con dao. 
Vì vậy, chúng ta có thể gửi một tin nhắn WeaponList nói với các khách hàng sử dụng "weapon_ArkFlare".

Chúng ta có thể sử dụng forwards Ham_Item_AddToPlayer cho điều đó.

Code:
RegisterHam( Ham_Item_AddToPlayer, "weapon_knife", "OnAddToPlayerKnife", .Post = true );

Sau đó chúng ta có thể gửi tin nhắn của chúng tôi.

Code:
new MsgIndexWeaponList; public plugin_init() {     RegisterHam( Ham_Item_AddToPlayer, "weapon_knife", "OnAddToPlayerKnife", .Post = true );     MsgIndexWeaponList = get_user_msgid( "WeaponList" ); } public OnAddToPlayerKnife( const item, const player ) {     if( pev_valid( item ) && is_user_alive( player ) ) // just for safety.     {         message_begin( MSG_ONE, MsgIndexWeaponList, .player = player );         {
            write_string("weapon_ArkFlare");    // WeaponName
            write_byte( -1 );                   // PrimaryAmmoID             write_byte( -1 );                   // PrimaryAmmoMaxAmount             write_byte( -1 );                   // SecondaryAmmoID             write_byte( -1 );                   // SecondaryAmmoMaxAmount             write_byte( 2 );                    // SlotID (0...N)             write_byte( 1 );                    // NumberInSlot (1...N)             write_byte( CSW_KNIFE );            // WeaponID             write_byte( 0 );                    // Flags         }         message_end();     } }



Hooking khi người chơi có một vũ khí và chuyển hướng một slot top
Nhiều hơn hoặc ít hơn cùng một mã. Bạn sẽ cần phải sửa đổi các khe cắm trong tin nhắn.
Ngoài ra, hooking Ham_Item_ItemSlot vì các giá trị được lưu trữ trong CKnife :: GetItemInfo) chức năng không thay đổi và khi ItemSlot () sẽ được gọi, nó sẽ trở lại giá trị ban đầu
.Do đó chúng tôi cần phải thay đổi giá trị trả về.

Code:
RegisterHam( Ham_Item_ItemSlot, "weapon_knife", "OnItemSlotKnife" );

Hãy nói rằng chúng tôi muốn chuyển hướng slot vào thứ 5. 
Hãy cẩn thận, giá trị slot trong thông báo bắt đầu từ 0, trong khi ở ItemSlot từ 1.

Code:
new MsgIndexWeaponList; public plugin_init() {     RegisterHam( Ham_Item_AddToPlayer, "weapon_knife", "OnAddToPlayerKnife", .Post = true );     RegisterHam( Ham_Item_ItemSlot, "weapon_knife", "OnItemSlotKnife" );         MsgIndexWeaponList = get_user_msgid( "WeaponList" ); } public OnAddToPlayerKnife( const item, const player ) {     if( pev_valid( item ) && is_user_alive( player ) ) // just for safety.     {         message_begin( MSG_ONE, MsgIndexWeaponList, .player = player );         {
            write_string("weapon_ArkFlare");    // WeaponName
            write_byte( -1 );                   // PrimaryAmmoID             write_byte( -1 );                   // PrimaryAmmoMaxAmount             write_byte( -1 );                   // SecondaryAmmoID             write_byte( -1 );                   // SecondaryAmmoMaxAmount
            write_byte(4);                    // SlotID (0...N)    <== Changed here (was 2)
            write_byte( 1 );                    // NumberInSlot (1...N)             write_byte( CSW_KNIFE );            // WeaponID             write_byte( 0 );                    // Flags         }         message_end();     } } public OnItemSlotKnife( const item ) {
    SetHamReturnInteger(5);
    return HAM_SUPERCEDE; }


Hooking lựa chọn vũ khí top
Bây giờ, bạn đã thay đổi tên vũ khí, bạn sẽ cần phải hook khi bạn chọn nó. 
Lý do là khi bạn sẽ cho các khách hàng mà bạn chọn vũ khí này, "weapon_ArkFlare" sẽ được sử dụng. 
Có nghĩa là bạn sẽ không thể chọn nó từ tên loại vũ khí như vậy là không được biết đến. 

Giải pháp rất đơn giản: hooking tên vũ khí và chuyển hướng đến tên ban đầu.
Code:
public plugin_init() {     register_clcmd( "weapon_ArkFlare", "ClientCommand_SelectFlare" ); } public ClientCommand_SelectFlare( const client ) {     engclient_cmd( client, "weapon_knife" ); }
Đầy đủ mã ví dụ top
Như nó có, nó sẽ thực sự là một ví dụ cơ bản. 
Mục đích là để cho bạn thấy chỉ là cách mà không có bất kỳ mã lập.

PHP Code:
#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()
{
    
RegisterHamHam_Item_AddToPlayer"weapon_knife""OnAddToPlayerKnife", .Post true );
    
RegisterHamHam_Item_ItemSlot"weapon_knife""OnItemSlotKnife" );

    
register_clcmd"weapon_ArkFlare""ClientCommand_SelectFlare" );

    
MsgIndexWeaponList get_user_msgid"WeaponList" );
}

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

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();
    }
}

public 
OnItemSlotKnife( const item )
{
    
SetHamReturnInteger);
    return 
HAM_SUPERCEDE;
}  
Advanced examples top

Coming... Probably.
API top

Coming... Probably.

0 nhận xét:

Post a Comment