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

Смена модели оружия

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

Модератор: Chuvi

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

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

Смена модели оружия

Сообщение DJ_WEST » 05 окт 2009, 10:39

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

Данная статья рассказывает простой метод смены модели оружия игрока в Counter-Strike 1.6. Данный метод поможет вам изменить все 3 типа модели: v_, p_ и w_.

Метод с использованием модулей Engine и Fakemeta
Код: Выделить всё
#include <amxmodx> 
#include <engine> 
#include <fakemeta> 

new VIEW_MODEL[]        = "models/v_<имя модели>.mdl" 
new PLAYER_MODEL
[]        = "models/p_<имя модели>.mdl" 
new WORLD_MODEL
[]    = "models/w_<имя модели>.mdl"

new OLDWORLD_MODEL[]    = "models/w_<имя модели>.mdl" // имя модели, которую мы хотим заменить

new PLUGIN_NAME[]    = "Custom Weapon Model" 
new PLUGIN_AUTHOR
[]         = "Cheap_Suit" 
new PLUGIN_VERSION
[]        = "1.0" 

public plugin_init
() 
{
    register_plugin(PLUGIN_NAME, PLUGIN_VERSION, PLUGIN_AUTHOR)     
    register_event
("CurWeapon", "Event_CurWeapon", "be","1=1")
    register_forward(FM_SetModel, "fw_SetModel")
}
 

public plugin_precache
() 
{    
    precache_model
(VIEW_MODEL)     
    precache_model
(PLAYER_MODEL) 
    precache_model
(WORLD_MODEL)
}
 

public Event_CurWeapon
(id) 
{     
    
// Получаем ID оружия, может не работать для других модов
    new weaponID = read_data(2) 
        
    
// Если оружие не AK47, то возвращаем PLUGIN_CONTINUE
    if (weaponID != CSW_AK47)
        return PLUGIN_CONTINUE
    
    
// Установка v_ модели, которая отображается в руках игрока
    entity_set_string(id, EV_SZ_viewmodel, VIEW_MODEL)  
    
    
// Установка p_ модели, которая отображается, когда мы смотрим на игрока
    entity_set_string(id, EV_SZ_weaponmodel, PLAYER_MODEL)         
    
    return PLUGIN_CONTINUE 
}

public fw_SetModel(entity, model[])
{
    // Проверяем существует ли объект
    if (!is_valid_ent(entity)) 
        return FMRES_IGNORED

    
// Проверяем та ли это w_ модель, которую му хотим изменить 
    if (!equali(model, OLDWORLD_MODEL)) 
        return FMRES_IGNORED

    new className
[33]

    // Получаем класс объекта
    entity_get_string(entity, EV_SZ_classname, className, 32)

    // Сравниваем равняется ли полученный класс объекта weaponbox (выкинутое оружие) или armoury_entity (оружие, которое лежит на карте), или grenade (C4 и гранаты)
    if (equal(className, "weaponbox") || equal(className, "armoury_entity") || equal(className, "grenade"))
    {
        // Установка w_ модели, которая отображается на земле
        entity_set_model(entity, WORLD_MODEL)
        return FMRES_SUPERCEDE
    
}
    return FMRES_IGNORED
}
 


Метод с использованием только модуля Fakemeta
Код: Выделить всё

public Event_CurWeapon
(id) 
{     
    
// Получаем ID оружия, может не работать для других модов
    new weaponID = read_data(2) 
        
    
// Если оружие не AK47, то возвращаем PLUGIN_CONTINUE
    if (weaponID != CSW_AK47)
        return PLUGIN_CONTINUE
    
    
// Установка v_ модели, которая отображается в руках игрока
    set_pev(id, pev_viewmodel, engfunc(EngFunc_AllocString, VIEW_MODEL))
    
    
// Установка p_ модели, которая отображается, когда мы смотрим на игрока
    set_pev(id, pev_weaponmodel, engfunc(EngFunc_AllocString, PLAYER_MODEL))
    
    return PLUGIN_CONTINUE 
}

public fw_SetModel(entity, model[])
{
    // Проверяем существует ли объект
    if (!pev_valid(entity)) 
        return FMRES_IGNORED

    
// Проверяем та ли это w_ модель, которую му хотим изменить 
    if (!equali(model, OLDWORLD_MODEL)) 
        return FMRES_IGNORED

    new className
[33]

    // Получаем класс объекта
    pev(entity, pev_classname, className, 32)
    
    
// Сравниваем равняется ли полученный класс объекта weaponbox (выкинутое оружие) или armoury_entity (оружие, которое лежит на карте), или grenade (C4 и гранаты)
    if(equal(className, "weaponbox") || equal(className, "armoury_entity") || equal(className, "grenade"))
    {
        // Установка w_ модели, которая отображается на земле
        engfunc(EngFunc_SetModel, entity, WORLD_MODEL)
        return FMRES_SUPERCEDE
    
}
    return FMRES_IGNORED
} 


Примечание:
Для второго метода, там где используется:
Код: Выделить всё

    
// Установка v_ модели, которая отображается в руках игрока
    set_pev(id, pev_viewmodel, engfunc(EngFunc_AllocString, VIEW_MODEL))
    
    
// Установка p_ модели, которая отображается, когда мы смотрим на игрока
    set_pev(id, pev_weaponmodel, engfunc(EngFunc_AllocString, PLAYER_MODEL))
 

Можно использовать:
Код: Выделить всё

    
// Установка v_ модели, которая отображается в руках игрока
    set_pev(id, pev_viewmodel2, VIEW_MODEL)

    // Установка p_ модели, которая отображается, когда мы смотрим на игрока
    set_pev(id, pev_weaponmodel2, PLAYER_MODEL)
 

Тем самым не использовав EngFunc_AllocString.

ID оружия:
Код: Выделить всё
#define CSW_P228        1
#define CSW_SCOUT        3
#define CSW_HEGRENADE        4
#define CSW_XM1014        5
#define CSW_C4            6
#define CSW_MAC10        7
#define CSW_AUG            8
#define CSW_SMOKEGRENADE    9
#define CSW_ELITE        10
#define CSW_FIVESEVEN        11
#define CSW_UMP45        12
#define CSW_SG550        13
#define CSW_GALI        14
#define CSW_GALIL        14
#define CSW_FAMAS        15
#define CSW_USP            16
#define CSW_GLOCK18        17
#define CSW_AWP            18
#define CSW_MP5NAVY        19
#define CSW_M249        20
#define CSW_M3            21
#define CSW_M4A1        22
#define CSW_TMP            23
#define CSW_G3SG1        24
#define CSW_FLASHBANG        25
#define CSW_DEAGLE        26
#define CSW_SG552        27
#define CSW_AK47        28
#define CSW_KNIFE        29
#define CSW_P90            30
 


Пример для смены модели ножа:
Код: Выделить всё
#include <amxmodx> 
#include <fakemeta> 

new VIEW_MODEL[]    = "models/v_newKnife.mdl" 
new PLAYER_MODEL
[]    = "models/p_newKnife.mdl" 
new WORLD_MODEL
[]    = "models/w_knife.mdl"

new OLDWORLD_MODEL[]    = "models/w_knife.mdl"

new PLUGIN_NAME[]        = "Custom Knife Model" 
new PLUGIN_AUTHOR
[]    = "Cheap_Suit" 
new PLUGIN_VERSION
[]     = "1.0" 

public plugin_init
() 
{
    register_plugin(PLUGIN_NAME, PLUGIN_VERSION, PLUGIN_AUTHOR)     
    register_event
("CurWeapon", "Event_CurWeapon", "be","1=1")
    register_forward(FM_SetModel, "fw_SetModel")
}
 

public plugin_precache
() 
{    
    precache_model
(VIEW_MODEL)     
    precache_model
(PLAYER_MODEL) 
    precache_model
(WORLD_MODEL)
}
 

public Event_CurWeapon
(id) 
{     
    new weaponID 
= read_data(2) 

    if
(weaponID != CSW_KNIFE)
        return PLUGIN_CONTINUE

    set_pev
(id, pev_viewmodel2, VIEW_MODEL)
    set_pev(id, pev_weaponmodel2, PLAYER_MODEL)
    
    return PLUGIN_CONTINUE 
}

public fw_SetModel(entity, model[])
{
    if (!pev_valid(entity)) 
        return FMRES_IGNORED

    if 
(!equali(model, OLDWORLD_MODEL)) 
        return FMRES_IGNORED

    new className
[33]
    pev(entity, pev_classname, className, 32)
    
    if 
(equal(className, "weaponbox") || equal(className, "armoury_entity") || equal(className, "grenade"))
    {
        engfunc(EngFunc_SetModel, entity, WORLD_MODEL)
        return FMRES_SUPERCEDE
    
}
    return FMRES_IGNORED
}
 
Не пишите мне в ЛС: если вам нужна помощь на бесплатной основе. Любые вопросы на форум.
Аватара пользователя
DJ_WEST
Администратор
 
Сообщения: 3641
Зарегистрирован: 22 авг 2009, 00:38
Благодарил (а): 48 раз.
Поблагодарили: 2209 раз.
Опыт программирования: Больше трех лет
Языки программирования: Counter-Strike 1.6
Counter-Strike: Source
Left 4 Dead
Left 4 Dead 2

Re: Смена модели оружия

Сообщение jiunnwoei2629 » 03 дек 2009, 11:36

Я не хотел бы использовать формата INI
Я хотел бы
new WORLD_SOUND[] = "sound/<武器>.wav
Аватара пользователя
jiunnwoei2629
 
Сообщения: 28
Зарегистрирован: 28 авг 2009, 17:15
Откуда: Военный
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
Языки программирования: Counter-Strike 1.6
Counter-Strike: Source
Left 4 Dead
Left 4 Dead 2
Call of Duty:Modern Warfare 2

Re: Смена модели оружия

Сообщение DJ_WEST » 04 дек 2009, 00:08

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

Re: Смена модели оружия

Сообщение Fedcomp » 04 дек 2009, 14:49

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


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

Re: Смена модели оружия

Сообщение DJ_WEST » 04 дек 2009, 22:31

Прости за флуд но почему?

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

Re: Смена модели оружия

Сообщение DjUm » 04 дек 2009, 22:57

спс, афигенный сайт! :yahoo: :thumbs_up :thumbs_up


p.s. Будь хозяином своей жизни...
Аватара пользователя
DjUm
 
Сообщения: 13
Зарегистрирован: 04 дек 2009, 22:09
Откуда: Омск
Благодарил (а): 2 раз.
Поблагодарили: 1 раз.
Языки программирования: Counter-Strike 1.6

Re: Смена модели оружия

Сообщение mTuk » 08 апр 2010, 12:38

Как модели игроков заменить на сервере а не оружий помогите :dntknw:
Забыть сказать я плохо писать плагины и даж не уметь :-[
Аватара пользователя
mTuk
 
Сообщения: 2
Зарегистрирован: 04 апр 2010, 19:37
Благодарил (а): 1 раз.
Поблагодарили: 0 раз.
Языки программирования: Counter-Strike 1.6

Re: Смена модели оружия

Сообщение ZETA » 08 апр 2010, 12:48

mTuk писал(а):Как модели игроков заменить на сервере а не оружий помогите :dntknw:


[pawn]cs_set_user_model ( index, const model[] )
entity_set_model ( entity, Model[] ) [/pawn]
Ну еще есть кучу способов...

mTuk писал(а):Забыть сказать я плохо писать плагины и даж не уметь :-[


Самый простой пример
[pawn]#include <amxmodx>
#include <cstrike>
#include <csx>

#define PLUGIN "TopModel"
#define VERSION "0.1"
#define AUTHOR "ZETA [M|E|N]"

new stats[8],rank

public plugin_init
() {
    register_plugin("TopModel","0.1","ZETA [M|E|N]")
    register_event("ResetHUD","resetModel","b")
    return PLUGIN_CONTINUE
}

public plugin_precache() {
    precache_model("models/player/Top3ModelCT/modelCT3.mdl")
    precache_model("models/player/Top3ModelT/modelT3.mdl")
    precache_model("models/player/Top10ModelCT/modelCT10.mdl")
    precache_model("models/player/Top10ModelT/modelT10.mdl")
}

public resetModel(id) {
    new CsTeams:userTeam = cs_get_user_team(id)
    rank=get_user_stats(id,stats,stats)
    
    if
(rank<=3) {
        if (userTeam == CS_TEAM_T) cs_set_user_model(id, "modelT3")
        else if(userTeam == CS_TEAM_CT) cs_set_user_model(id, "modelCT3")
    }
    else if(rank<=10) {
        if (userTeam == CS_TEAM_T) cs_set_user_model(id, "modelT10")
        else if(userTeam == CS_TEAM_CT) cs_set_user_model(id, "modelCT10")
    }
    else cs_reset_user_model(id)

    return PLUGIN_CONTINUE
} [/pawn]
Последний раз редактировалось DJ_WEST 08 апр 2010, 20:35, всего редактировалось 2 раз(а).
Причина: Вместо тега [code] лучше использовать [pawn]. С подсветкой синтаксиса код более приятно смотреть.
Говори что думаешь и думай что говоришь...
Аватара пользователя
ZETA
 
Сообщения: 4
Зарегистрирован: 05 апр 2010, 14:06
Откуда: Йошкар-Ола
Благодарил (а): 0 раз.
Поблагодарили: 3 раз.
Языки программирования: Counter-Strike 1.6

Re: Смена модели оружия

Сообщение PRoSToTeM@ » 12 июн 2010, 21:35

Насчёт замены моделей оружий, рекомендую использовать ещё Ham_Item_Deploy и Ham_Use:
взял из ZP
[pawn]
    RegisterHam
(Ham_Item_Deploy, "weapon_usp", "fw_Item_Deploy_Post", 1)
 [/pawn]
[pawn]
    RegisterHam
(Ham_Use, "func_tank", "fw_UseStationary_Post", 1)
    RegisterHam(Ham_Use, "func_tankmortar", "fw_UseStationary_Post", 1)
    RegisterHam(Ham_Use, "func_tankrocket", "fw_UseStationary_Post", 1)
    RegisterHam(Ham_Use, "func_tanklaser", "fw_UseStationary_Post", 1)
 [/pawn]
[pawn]
public fw_UseStationary_Post
(entity, caller, activator, use_type)
{
    // Someone stopped using a stationary gun
    if (use_type == USE_STOPPED && is_user_valid_connected(caller))
        replace_weapon_models(caller, g_currentweapon[caller]) // replace weapon models (bugfix)
}
 [/pawn]
[pawn]
public fw_Item_Deploy_Post
(weapon_ent)
{
    // Get weapon's owner
    static owner
    owner 
= fm_cs_get_weapon_ent_owner(weapon_ent)
    
    
// Get weapon's id
    static weaponid
    weaponid 
= cs_get_weapon_id(weapon_ent)
    
    
// Store current weapon's id for reference
    g_currentweapon[owner] = weaponid
    
    
// Replace weapon models with custom ones
    replace_weapon_models(owner, weaponid)
}
 [/pawn]
Можно ещё при спавне:
[pawn]
    RegisterHam
(Ham_Spawn, "player", "fw_PlayerSpawn_Post", 1)
 [/pawn]
[pawn]
public fw_PlayerSpawn_Post
(id)
{
    // Not alive or didn't join a team yet
    if (!is_user_alive(id) || !fm_cs_get_user_team(id))
        return;
        
    static weapon_ent
    weapon_ent 
= fm_cs_get_current_weapon_ent(id)
    if (pev_valid(weapon_ent)) replace_weapon_models(id, cs_get_weapon_id(weapon_ent))
}
 [/pawn]
Вот ещё нашёл:
[pawn]
public wpn_gi_reset_weapon
(id)
{
    // Replace knife model
    replace_weapon_models(id, CSW_KNIFE)
}
 [/pawn]
И сам заменитель:
[pawn]
replace_weapon_models
(id, weaponid)
{
    switch (weaponid)
}
 [/pawn]
Также CurWeapon в ZP не используется
Аватара пользователя
PRoSToTeM@
Скриптер
 
Сообщения: 2498
Зарегистрирован: 26 мар 2010, 00:12
Благодарил (а): 438 раз.
Поблагодарили: 1125 раз.

Re: Смена модели оружия

Сообщение noo00oob » 15 июн 2010, 20:22

Также CurWeapon в ZP не используется


Потому - что CurWeapon не всегда посылается при смене модели...
Сам с этим столкнулся, и пришлось юзать Ham_Item_Deploy
В gungame вставил свою модель ножа,
Но при убийстве с ножа моделька менялась на старую...
Также такой баг будет при покупке пистолетов, если активное оружие ну на пример калаш.
id игрока в хаме можно получить так:

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

Re: Смена модели оружия

Сообщение BaguM » 30 ноя 2010, 00:20

Столкнулся с проблеммой - все оружие заменяет методом, указанным в статье, в вот sg552 - нет. Виев модэл - стандарт, Плэер - не видел :-) , а Мировая моделька - просто исчезла. Т.е. выкидываешь sg552 - и нет ничего на земле. Никтто не сталкивался с подобным?
Мир уже умер(c)
Аватара пользователя
BaguM
 
Сообщения: 170
Зарегистрирован: 15 июл 2010, 17:30
Благодарил (а): 76 раз.
Поблагодарили: 13 раз.
Опыт программирования: Около 3 месяцев
Языки программирования: Counter-Strike 1.6

Пред.След.

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

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

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