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

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

Статьи или фрагменты кода для новичков и уже опытных скриптеров по 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: Смена модели оружия

Сообщение Kuprijan » 15 ноя 2011, 17:17

Не знаете где описывается как заменить например звуки шагов, вкл\выкл фонаря и тд?
Мужик обманул Мужика - Жулик
Купец обманул Купца - Коммерсант
Генерал обманул Генерала - Стратег
Король обманул Короля - Политик
Из этих строк можно понять одно, что все зависит от обстоятельств, но обстоятельства делаем мы - люди. Так что дерзайте...
Аватара пользователя
Kuprijan
 
Сообщения: 8
Зарегистрирован: 15 ноя 2011, 17:13
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Опыт программирования: Меньше недели
Языки программирования: Counter-Strike 1.6

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

Сообщение артист666 » 04 янв 2014, 02:31

jiunnwoei2629 писал(а):Я не хотел бы использовать формата INI
Я хотел бы
new WORLD_SOUND[] = "sound/<武器>.wav


Вааааа :ROFL: :ROFL: :ROFL: :ROFL:
Если вы хотите чему-то научиться, пробуйте, задавайте вопросы.
Иначе компенсируйте потраченное время на ваши "проблемы".
Аватара пользователя
артист666
 
Сообщения: 2706
Зарегистрирован: 09 апр 2013, 17:46
Благодарил (а): 284 раз.
Поблагодарили: 639 раз.
Опыт программирования: Больше трех лет
Языки программирования: С, C++
Delphi
HTML, CSS, Java Script
Pawn

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

Сообщение FeTiD » 07 мар 2016, 12:53

а как поймать индекс выброшенного оружия, дабы в последствии поменять только его world модель, а не аналогичных выброшенных
Аватара пользователя
FeTiD
 
Сообщения: 5
Зарегистрирован: 07 мар 2016, 12:44
Благодарил (а): 1 раз.
Поблагодарили: 0 раз.
Опыт программирования: Около 3 месяцев
Языки программирования: Counter-Strike 1.6

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

Сообщение FeirFor » 11 мар 2016, 00:47

FeTiD писал(а):а как поймать индекс выброшенного оружия, дабы в последствии поменять только его world модель, а не аналогичных выброшенных

насколько я помню, то в кс нету такого понятия, как индексы оружию, есть только их точные название, например: w_ak47.mdl и т.д.
Написание легких, средних плагинов на заказ. Обращаться в лс

Теперь можно мне написать и Вконтакте
Аватара пользователя
FeirFor
 
Сообщения: 42
Зарегистрирован: 10 мар 2016, 23:06
Благодарил (а): 0 раз.
Поблагодарили: 24 раз.
Опыт программирования: Около года
Языки программирования: Counter-Strike

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

Сообщение Subb98 » 11 мар 2016, 07:14

«Очень хорошо. Лучше вы, чем я» © Donald J. Trump
Аватара пользователя
Subb98
Модератор
 
Сообщения: 5485
Зарегистрирован: 24 мар 2011, 19:42
Откуда: г. Пермь
Благодарил (а): 1329 раз.
Поблагодарили: 2343 раз.
Опыт программирования: Больше трех лет
Языки программирования: PHP

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

Сообщение FeTiD » 14 мар 2016, 10:27

FeirFor писал(а):
FeTiD писал(а):а как поймать индекс выброшенного оружия, дабы в последствии поменять только его world модель, а не аналогичных выброшенных

насколько я помню, то в кс нету такого понятия, как индексы оружию, есть только их точные название, например: w_ak47.mdl и т.д.

под индексом я имел ввиду айди энтити.
Еще такой вопрос. При покупке (читай создании) оружия игроком ему присваивается айди как энтити с моделькой p_, верно?
И, если игрок выбрасывает оружие на землю, это всё то же энтити с замененной p_ моделью на world модель или создается новая энтити ворлд модели?
Если да, то получается, что при подборе оружия с земли это энтити полностью уничтожается, и если игрок снова выбросит это же оружие, то будет новое энтити с ворлд моделькой и соответственно новый айди?
Нету времени всё это самому проверить, может кто тестил и знает?
Аватара пользователя
FeTiD
 
Сообщения: 5
Зарегистрирован: 07 мар 2016, 12:44
Благодарил (а): 1 раз.
Поблагодарили: 0 раз.
Опыт программирования: Около 3 месяцев
Языки программирования: Counter-Strike 1.6

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

Сообщение L4D2 » 14 мар 2016, 11:06

FeTiD писал(а):
FeirFor писал(а):
FeTiD писал(а):а как поймать индекс выброшенного оружия, дабы в последствии поменять только его world модель, а не аналогичных выброшенных

насколько я помню, то в кс нету такого понятия, как индексы оружию, есть только их точные название, например: w_ak47.mdl и т.д.

под индексом я имел ввиду айди энтити.
Еще такой вопрос. При покупке (читай создании) оружия игроком ему присваивается айди как энтити с моделькой p_, верно?
И, если игрок выбрасывает оружие на землю, это всё то же энтити с замененной p_ моделью на world модель или создается новая энтити ворлд модели?
Если да, то получается, что при подборе оружия с земли это энтити полностью уничтожается, и если игрок снова выбросит это же оружие, то будет новое энтити с ворлд моделькой и соответственно новый айди?
Нету времени всё это самому проверить, может кто тестил и знает?


Разве не это тебе нужно?

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  

==============================================
|| Пишу не большие плагины под заказ: Заказ онлайн (Кликабельно)
|| Ссылка на официальный топик: заказ плагинов.
|| Желаешь оставить отзыв: тебе сюда(кликни).
==============================================
Аватара пользователя
L4D2
 
Сообщения: 792
Зарегистрирован: 25 июн 2011, 19:26
Благодарил (а): 240 раз.
Поблагодарили: 100 раз.
Языки программирования: Counter-Strike 1.6

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

Сообщение FeTiD » 15 мар 2016, 01:27

Хм, как бы понятнее объяснить.
Мне нужно поменять ворлд модель (ну к примеру AWP) только что выброшенную конкретным игроком (ну к примеру админом). Т.е из всех w_awp.mdl валяющихся на карте поменять только эту.
Аватара пользователя
FeTiD
 
Сообщения: 5
Зарегистрирован: 07 мар 2016, 12:44
Благодарил (а): 1 раз.
Поблагодарили: 0 раз.
Опыт программирования: Около 3 месяцев
Языки программирования: Counter-Strike 1.6

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

Сообщение L4D2 » 15 мар 2016, 04:43

FeTiD писал(а):Хм, как бы понятнее объяснить.
Мне нужно поменять ворлд модель (ну к примеру AWP) только что выброшенную конкретным игроком (ну к примеру админом). Т.е из всех w_awp.mdl валяющихся на карте поменять только эту.


Если админ возьмет Ака, то модельку видят все, если он выбросит и др игрок подберет будет модель, которая прописана при замене.
Если игрок купит Ака через бай меню, то у него по дефолту стоит моделька.

Что то типо этого:
Код: Выделить всё
/* Admin Flag: ADMIN_LEVEL_A */

#include <amxmodx>
#include <hamsandwich>
#include <fakemeta_util>

// Модель P, V, W
new P_MODEL[] =    "models/ak_vulcane/p_ak47.mdl"
new V_MODEL[] =    "models/ak_vulcane/v_ak47.mdl"
new W_MODEL[] =    "models/ak_vulcane/w_ak47.mdl"

new bool:g_WeaponAka[33]
new 
wpn_id[64]

public 
plugin_init() {
    
register_plugin("Give Weapon Model AKA-47""0.2.1""L4D2 - Amx-x.ru")
    
register_clcmd"say /aka""GiveWeapon" )
    
RegisterHam(Ham_Item_Deploy"weapon_ak47""deploy_xmaka"1)
    
RegisterHam(Ham_Item_AddToPlayer"weapon_ak47""add_xmaka"1)
    
register_forward(FM_SetModel"fw_SetModel")
}

public 
plugin_precache( ) {
    
precache_modelP_MODEL )
    
precache_modelV_MODEL )
    
precache_modelW_MODEL )
}

public 
deploy_xmaka(wpn) {
    static 
idid get_pdata_cbase(wpn414)
    if(
g_WeaponAka[id]) {
        
set_pev(idpev_viewmodelengfunc(EngFunc_AllocStringV_MODEL))
        
set_pev(idpev_weaponmodelengfunc(EngFunc_AllocStringP_MODEL))
    }
}

public 
GiveWeapon(id) {
    if(
is_user_alive(id) && get_user_flags(id) & ADMIN_LEVEL_A) {
        
g_WeaponAka[id] = true
        fm_give_item
(id"weapon_ak47")
    }
}

public 
fw_SetModel(entmodel[]) {
    
/*if(pev_valid(ent) && equali(model, "models/ak_vulcane/w_ak47.mdl", 20))*/
    
if(!pev_valid(ent)) return FMRES_IGNORED
    
static idid pev(entpev_owner)
    if(
g_WeaponAka[id]) {
        new 
className[33]
        
pev(entpev_classnameclassName32)
        
        if(
equal(className"weaponbox") || equal(className"armoury_entity") || equal(className"grenade")) {
            
engfunc(EngFunc_SetModelentW_MODEL)
            return 
FMRES_SUPERCEDE
        
}
    }
    return 
FMRES_IGNORED
}

public 
add_xmaka(wpnid) {
    if(
g_WeaponAka[id]) {
        for(new 
0sizeof(wpn_id); i++) {
            if(!
wpn_id[i]){
                
wpn_id[i] = wpn
                
break
            }
        }
    } else {
        for(new 
0sizeof(wpn_id); i++) {
            if(
wpn == wpn_id[i]){
                
g_WeaponAka[id] = true
                
break
            }
        }
    }
    
    if(
wpn_id[charsmax(wpn_id)])
        
g_WeaponAka[id] = false

==============================================
|| Пишу не большие плагины под заказ: Заказ онлайн (Кликабельно)
|| Ссылка на официальный топик: заказ плагинов.
|| Желаешь оставить отзыв: тебе сюда(кликни).
==============================================
Аватара пользователя
L4D2
 
Сообщения: 792
Зарегистрирован: 25 июн 2011, 19:26
Благодарил (а): 240 раз.
Поблагодарили: 100 раз.
Языки программирования: Counter-Strike 1.6

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

Сообщение FeTiD » 15 мар 2016, 15:08

Да, что-то типо того, только
Код: Выделить всё
public fw_SetModel(ent, model[]) {
if(!
pev_valid(ent) || !equali(model, "models/w_ak47.mdl", 20)) return FMRES_IGNORED
.......
 

дабы менять только калаши, а не всё выброшенное подряд
ну и убрать из проверки armoury_entity и гранату
а потом допилить при смерти игрока принудительную установку g_WeaponAka в ложь, а при подборе измененного оружия в истину и будет конфетка :thumbs_up
Аватара пользователя
FeTiD
 
Сообщения: 5
Зарегистрирован: 07 мар 2016, 12:44
Благодарил (а): 1 раз.
Поблагодарили: 0 раз.
Опыт программирования: Около 3 месяцев
Языки программирования: Counter-Strike 1.6

Пред.След.

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

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

Сейчас этот форум просматривают: Yandex [Bot] и гости: 6