Итак начнем.
Откроем исходник extra предмета и добавим новую переменную
Теперь добавим в plugin_init:
Quote
gmsgWeaponList = get_user_msgid("WeaponList")
Теперь необходимо чтобы наши спрайты и .txt файлы закачались на клиент, для этого добавим в
plugin_precache Quote
precache_generic("sprites/название_txt_файла .txt") precache_generic("sprites/спрайт .spr") precache_generic("sprites/спрайт .spr") precache_generic("sprites/спрайт .spr")
Теперь надо добавить команду посылаемую при поднятие(покупки) оружия в
plugin_precache :
Quote
register_clcmd("название_txt_файла ", "weapon_hook")
Добавляем после
plugin_precache задачу
weapon_hook :
Quote
public weapon_hook(id) { engclient_cmd(id, "название оружия заменяемое на другой спрайт ") return PLUGIN_HANDLED }
*
название оружия заменяемое на другой спрайт - укажите название оружия на которое будет установлен новый спрайт(Пример: для Калаша
weapon_ak47 ; для Эмки
weapon_m4a1 ; для Дигла
weapon_deagle )
Ищем конец функции выдачи оружия(обычно это
public give_.... и добавляем следующее:
Quote
message_begin(MSG_ONE, gmsgWeaponList, _, id) write_string("название_txt_файла ") write_byte() write_byte() write_byte() write_byte() write_byte() write_byte() write_byte(Название оружия вида CSW_...) message_end()
Нужно зайти на сайт
http://wiki.alliedmods.net/CS_WeaponList_Message_Dump и посмотреть на weapon list заменяемого оружия .
Пояснение:
Покажу пример на оружие AK47
Находим
weapon_ak47 и видим следующие:
Quote
1 STRN weapon_ak47 2 BYTE 2 3 BYTE 90 4 BYTE -1 5 BYTE -1 6 BYTE 0 7 BYTE 1 8 BYTE 28 9 BYTE 0
Нам нужно будет взять первые 6(отсчет начинаем с 2ой строки, так как первую мы поменяли на свою) значений и вставить их в пустые скобки, будет это выглядеть примерно так:
Quote
message_begin(MSG_ONE, gmsgWeaponList, _, id) write_string("название_txt_файла ") write_byte(2) write_byte(90) write_byte(-1) write_byte(-1) write_byte(0) write_byte(1) write_byte(CSW_AK47) message_end()
Надеюсь понятно, если не, то в конце тутора будет полный пример.
Теперь нужно прикрепить спрайт к выдаче оружия, для этого ищем функцию выдачи оружия(по станд. это
public give_...(id) )
Code
public give_...(id) { drop_weapons(id, 2) new iWep2 = give_item(id,"weapon_ak47") if( iWep2 > 0 ) { cs_set_weapon_ammo(iWep2, get_pcvar_num(cvar_clip_...)) cs_set_user_bpammo (id, CSW_P228, get_pcvar_num(cvar_...._ammo)) UTIL_PlayWeaponAnimation(id, AK47long_DRAW) set_pdata_float(id, m_flNextAttack, 1.0, PLAYER_LINUX_XTRA_OFF) [color=white]message_begin(MSG_ONE, gmsgWeaponList, _, id) write_string("[color=red]название_txt_файла [/color]") write_byte(2) write_byte(90) write_byte(-1) write_byte(-1) write_byte(0) write_byte(1) write_byte(CSW_AK47) message_end()[/color] } g_has_aklong[id] = true }
Ну и наконец завершающий этапы, где нужно будет вернуть оружию свой стандартный спрайт если оружие не поменяло спрайт для этого ищем
public fw_...._AddToPlayer(..., id) (пример привожу на aklong)
Quote
public fw_aklong_AddToPlayer(aklong, id) { if(!is_valid_ent(aklong) || !is_user_connected(id)) return HAM_IGNORED if(entity_get_int(aklong, EV_INT_WEAPONKEY) == AKLONG_WEAPONKEY) { g_has_aklong[id] = true entity_set_int(luger, EV_INT_WEAPONKEY, 0) message_begin(MSG_ONE, gmsgWeaponList, _, id) write_string("название_txt_файла ") write_byte(2) write_byte(90) write_byte(-1) write_byte(-1) write_byte(0) write_byte(1) write_byte(Название оружия вида CSW_...) message_end() return HAM_HANDLED } else { message_begin(MSG_ONE, gmsgWeaponList, _, id) write_string("weapon_ak47") write_byte(2) write_byte(90) write_byte(-1) write_byte(-1) write_byte(0) write_byte(1) write_byte(CSW_AK47) message_end() } return HAM_IGNORED }
Нужно заставить воспроизводить спрайт на экране у игрока при поднятии оружия(покупки) для этого ищем
replace_weapon_models(id, weaponid) и привяжем спрайт к оружию:
Code
replace_weapon_models(id, weaponid) { switch (weaponid) { case CSW_....: { if (zp_get_user_zombie(id) || zp_get_user_survivor(id)) return if(g_has_....[id]) { set_pev(id, pev_viewmodel2, ...r_V_MODEL) set_pev(id, pev_weaponmodel2, ...._P_MODEL) if(oldweap[id] != CSW_....) { UTIL_PlayWeaponAnimation(id, ..l.._DRAW) set_pdata_float(id, m_flNextAttack, 1.0, PLAYER_LINUX_XTRA_OFF) message_begin(MSG_ONE, gmsgWeaponList, _, id) write_string("[color=red]название_txt_файла [/color]") write_byte(2) write_byte(90) write_byte(-1) write_byte(-1) write_byte(0) write_byte(1) write_byte(Название оружия вида CSW_...) message_end() } } } } oldweap[id] = weaponid }
На этом все, как и обещал весь код на примере
AKLONG :
Code
new gmsgWeaponList public plugin_init() { gmsgWeaponList = get_user_msgid("WeaponList") } public plugin_precache() { precache_generic("sprites/weapon_aklong.txt") precache_generic("sprites/aklong/640hud1.spr") precache_generic("sprites/aklong/640hud2.spr") register_clcmd("weapon_aklong", "weapon_hook") } public weapon_hook(id) { engclient_cmd(id, "weapon_ak47") return PLUGIN_HANDLED } public give_aklong(id) { drop_weapons(id, 2) new iWep2 = give_item(id,"weapon_ak47") if( iWep2 > 0 ) { cs_set_weapon_ammo(iWep2, get_pcvar_num(cvar_clip_aklong)) cs_set_user_bpammo (id, CSW_AK47, get_pcvar_num(cvar_aklong_ammo)) UTIL_PlayWeaponAnimation(id, aklong_DRAW) set_pdata_float(id, m_flNextAttack, 1.0, PLAYER_LINUX_XTRA_OFF) message_begin(MSG_ONE, gmsgWeaponList, _, id) write_string("weapon_aklong") write_byte(2) write_byte(90) write_byte(-1) write_byte(-1) write_byte(0) write_byte(1) write_byte(CSW_AK47) message_end() } g_has_aklong[id] = true } public fw_aklong_AddToPlayer(aklong, id) { if(!is_valid_ent(aklong) || !is_user_connected(id)) return HAM_IGNORED if(entity_get_int(aklong, EV_INT_WEAPONKEY) == aklong_WEAPONKEY) { g_has_aklong[id] = true entity_set_int(luger, EV_INT_WEAPONKEY, 0) message_begin(MSG_ONE, gmsgWeaponList, {0,0,0}, id) write_string("weapon_aklong") write_byte(2) write_byte(90) write_byte(-1) write_byte(-1) write_byte(0) write_byte(1) write_byte(CSW_AK47) message_end() return HAM_HANDLED } else { message_begin(MSG_ONE, gmsgWeaponList, {0,0,0}, id) write_string("weapon_ak47") write_byte(2) write_byte(90) write_byte(-1) write_byte(-1) write_byte(0) write_byte(1) write_byte(CSW_AK47) message_end() } return HAM_IGNORED } replace_weapon_models(id, weaponid) { switch (weaponid) { case CSW_AK47: { if (zp_get_user_zombie(id) || zp_get_user_survivor(id)) return if(g_has_aklong[id]) { set_pev(id, pev_viewmodel2, aklong_V_MODEL) set_pev(id, pev_weaponmodel2, aklong_P_MODEL) if(oldweap[id] != CSW_AK47) { UTIL_PlayWeaponAnimation(id, aklong_DRAW) set_pdata_float(id, m_flNextAttack, 1.0, PLAYER_LINUX_XTRA_OFF) message_begin(MSG_ONE, gmsgWeaponList, _, id) write_string("weapon_aklong") write_byte(2) write_byte(90) write_byte(-1) write_byte(-1) write_byte(0) write_byte(1) write_byte(CSW_AK47) message_end() } } } } oldweap[id] = weaponid }