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
- 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.Chìa khóa thứ hai là WeaponName và SlotID.
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
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í.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ó ở đó 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.
Nó chứa các sprite để sử dụng cho mỗi loại.Chìa khóa thứ tư là để chuẩn bị cho tập tin cần thiết.
Một danh sách đầy đủ các kiểu sẽ là: weapon, weapon_s, ammo, ammo2, autoaim, crosshair, zoom, zoom_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.
Cả txt và .spr / .tga. tập tin cần thiếtChú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
Advanced examples topHã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 topTấ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í topChú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"); // WeaponNamewrite_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 topNhiề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"); // WeaponNamewrite_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í topBâ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ụ topNhư 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()
{
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_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)
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;
}
Coming... Probably.API top
Coming... Probably.
0 nhận xét:
Post a Comment