[ZP] Как сделать кастомную модель игрокам?
начать игру
Как сделать кастомную модель игрокам?

В данной статье я вам расскажу как можно сделать кастомную модель игрока путём обычного прописывания через натив, так-же рассмотрим примеры

Автор статьи: Mort3m
Вообще, сама задумка статьи с зм сру, но так как это мертвый сайт, кого это волнует?

В данной статье я вам расскажу как можно добавить собственные ( кастомные ) модели игрокам.
Многие делают эти самые модели через мод, как по мне, легче сделать так, как я опишу в этом гайде.
И так, для начала нам нужен Zombie Plague Fix5a. Потому что в этом фиксе есть натив на установку кастомной модели.

Если данного фикса у вас на моде нету, берём обычный Zombie Plague.

ВНИМАНИЕ! Следующий блок статьи пойдет о том, как добавить натив на установку кастомной модели. Т.е для тех, у кого нет Fix5a.
Приступим.

1. Открываем исходник мода.

2. Ищем строку
public plugin_natives()

3. Ищем свободное место для добавления натива. Либо место, куда вы бы хотели поместить сам натив.
Лично я это буду делать после натива zp_force_buy_extra_item
Добавляем строку:
register_native("zp_override_user_model", "native_override_user_model", 1);

Должно получиться так:
4. Теперь нам надо добавить саму функцию установки кастомной модели.
Спускаемся до строки:
/*================================================================================
 [Custom Natives]
=================================================================================*/

И в любом удобном месте вставляем этот блок кода:
// Native: zp_override_user_model
public native_override_user_model(id, const newmodel[], modelindex)
{
    // ZP disabled
    if (!g_pluginenabled)
        return false;
    
    if (!is_user_valid_connected(id))
    {
        log_error(AMX_ERR_NATIVE, "[ZP] Invalid Player (%d)", id)
        return false;
    }
    
    // Strings passed byref
    param_convert(2)
    
    // Remove previous tasks
    remove_task(id+TASK_MODEL)
    
    // Custom models stuff
    static currentmodel[32]
    
    if (g_handle_models_on_separate_ent)
    {
        // Set the right model
        copy(g_playermodel[id], charsmax(g_playermodel[]), newmodel)
        if (g_set_modelindex_offset && modelindex) fm_cs_set_user_model_index(id, modelindex)
        
        // Set model on player model entity
        fm_set_playermodel_ent(id)
    }
    else
    {
        // Get current model for comparing it with the current one
        fm_cs_get_user_model(id, currentmodel, charsmax(currentmodel))
        
        // Set the right model, after checking that we don't already have it
        if (!equal(currentmodel, newmodel))
        {
            copy(g_playermodel[id], charsmax(g_playermodel[]), newmodel)
            if (g_set_modelindex_offset && modelindex) fm_cs_set_user_model_index(id, modelindex)
            
            // An additional delay is offset at round start
            // since SVC_BAD is more likely to be triggered there
            if (g_newround)
                set_task(5.0 * g_modelchange_delay, "fm_user_model_update", id+TASK_MODEL)
            else
                fm_user_model_update(id+TASK_MODEL)
        }
    }
    return true;
}

Должно получиться так: ( Шрифт уменьшил чтобы код влез полностью )

Если вы всё сделали правильно, компиляция должна пройти успешно:

ВНИМАНИЕ! Следующий блок статьи пойдет для всех пользователей, имеющих как обычный Zombie Plague так и Fix5a.
Итак, перейдем к основному.
Теперь нам надо будет написать маленький плагин, добавляющий вашу модель игрокам. Сам плагин я выложу в этой статье. 

1. Создаём файл формата .sma с любым угодным вам названием

2. Заходим в файл любым текстовым редактором.

3. Подключаем инклуды + Оффсеты.
#include <amxmodx>
#include <fakemeta>
#include <hamsandwich>
#include <zombieplague>

// Оффсеты
#define linux_diff_player 5
#define m_modelIndexPlayer 491

4. Вписываем натив + некоторые макросы + создаём переменную.
Важно! ПАПКА С МОДЕЛЬЮ И САМА МОДЕЛЬ ДОЛЖНЫ БЫТЬ С ОДИНАКОВЫМИ НАЗВАНИЯМИ
// Сам натив
native zp_override_user_model(pPlayer, szModel[], iModelIndex = 0);

#define MODEL_NAME "tommy" // Название модели
#define MODEL_PATH "models/player/%s/%s.mdl" // Оригинальный путь до моделей.
#define MODEL_ACCESS_ADMIN ADMIN_BAN // Установка модели только Админу. Закомментируйте, если не нужно

// Создаём переменную для хранения в ней индекса модели
new g_iszModelIndex;

5. Теперь нам надо вписать два форварда. plugin_precache и plugin_init
И в них зарегистрировать нужное нам событие и регистрацию плагина ( по желанию )
// Прекеш модели
public plugin_precache()
{
    static szModelPath[128];
    formatex(szModelPath, charsmax(szModelPath), MODEL_PATH, MODEL_NAME, MODEL_NAME);
    // Присваиваем индекс модели переменной
    g_iszModelIndex = engfunc(EngFunc_PrecacheModel, szModelPath);
}

// Регистрация нужных нам событий ( register_plugin по желанию )
public plugin_init()
{
    // Регистрируем плагин
    register_plugin("[AMXX] Custom Model", "0.0.1", "m0rt3m/тут может быть ваш ник");

    // Ловим эвент спавна игрока
    RegisterHam(Ham_Spawn, "player", "HamHook__PlayerSpawn_Post", 1);
}

6. Теперь нам осталось создать публичную функцию и вписать форвард когда игрок превращается в человека.
public HamHook__PlayerSpawn_Post(iPlayer)
{
    // Проверяем на коннект
    if(!is_user_connected(iPlayer))
        return;

    // Проверяем на зомби и выжившего
    if(zp_get_user_zombie(iPlayer) || zp_get_user_survivor(iPlayer))
        return;

    // Проверяем на наличие флага, если макрос не закомментирован
    #if defined MODEL_ACCESS_ADMIN
        if(~get_user_flags(iPlayer) & MODEL_ACCESS_ADMIN)
            return;
    #endif

    // Выставляем модель
    zp_override_user_model(iPlayer, MODEL_NAME, g_iszModelIndex);

    // Выставляем нужный индекс модели, чтобы не слетал
    set_pdata_int(iPlayer, m_modelIndexPlayer, g_iszModelIndex, linux_diff_player);
}

public zp_user_humanized_post(iPlayer, iSurvivor)
{
    // Проверяем на выжившего
    if(iSurvivor)
        return;

    // Проверяем на наличие флага, если макрос не закомментирован
    #if defined MODEL_ACCESS_ADMIN
        if(~get_user_flags(iPlayer) & MODEL_ACCESS_ADMIN)
            return;
    #endif

    // Выставляем модель
    zp_override_user_model(iPlayer, MODEL_NAME, g_iszModelIndex);

    // Выставляем нужный индекс модели, чтобы не слетал
    set_pdata_int(iPlayer, m_modelIndexPlayer, g_iszModelIndex, linux_diff_player);
}

Вот и готов наш плагин. Ставим его на сервер, и наслаждаемся жизнью.
Плагин можно довести до ума, и сделать выставление моделей по ини и т.д, собственно, если вы шарите в павне, для вас это не будет особой проблемой.

У вас нет доступа к скачиванию файлов с нашего сервера


Привет, наша адмнистрация публикует только пушечный контент, поставь лайк под постом ниже и напишите самый топовый комментарий, мы готовим материал только для тебя, любимый Гость.

Пожертвовать Вы можете сделать автору Mort3m, подарок в виде пожертвования на его электронную копилку ;)


Комментариев 5
  1. xUnicorn
    • 23 декабря 2018 20:48
    1. Universe
      а может ты?А?А77?А?7?

      Why i'm not from Ukraine?
      -------------------------------------------------------------------------------------------------------------------------
      Группа VK: vk.com/forumbz
      • 26 декабря 2018 21:04
  2. ipman11223
    А как сделать так , что бы было для привилегий : вип , админ и босс ?

    • 24 августа 2019 13:06
    1. Mort3m
      Mort3m
      • -1
      самый простой вариант:
      распределять модели по флагам, всё
      • 24 августа 2019 13:10
  3. KocT9N
    KocT9N
    • -1
    error 021: symbol already defined: "zp_override_user_model"
    • 3 мая 2020 10:11
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.
Наши партнеры
Основа для вашей сборки
ReHLDS 3.4.0.654

ReHLDS (Reverse-engineered) - это новый шаг вперед, который дает второе дыхание нашим серверам. ReHLDS работает в 2 раза быстрей, чем HLDS.

AmxModx 1.8.3

AMXModX - это Metamod дополнение, которое позволяет создавать новые модификации для Half-Life на языке Pawn

Reunion 0.1.92

Reunion является продолжением Dproto для ReHLDS. Это metamod плагин, который позволяет заходить 47/48 Non-Steam на сервер.

Revoice 0.1.0.32

Revoice - это Metamod plugin, который дает возможность общения голосовым чатом между non-steam и steam клиентами.

Metamod-r 1.3.0.127

Новый Metamod-r содержит огромное количество оптимизаций производительности и намного более чистый код. Ядро было написано с использованием JIT-компилятора.

Ultimate Unprecacher 1.1

Ultimate Unprecacher являет плагином для MetaMod, работает он по принципу отключение не нужных ресурсов на вашем сервере, тем самым вы сможете освободить места для ресурсов под ваши плагины, с помощью данного модуля можно избавиться от ошибки 512!

ReAuthCheck 0.1.6

ReAuthCheck - это Metamod плагин, который занимается проверкой ваших игроков на валидность, с помощью данного модуля для REHLDS вы сможете защитить свой сервер от ботов, которые постоянно спамят рекламу или просто забивают слот на сервере!

NetBufExtender (NBEX) 1.0

NetBufExtender или NBEX - это метамод-плагин, который расширяет "интернет-буфер": буферы сервера и клиента(гарантия не 100%). Расширяет до 64 кб. Это значит, что у игроков уменьшается вероятность быть кикнутыми с ошибкой "Reliable channel overflowed".

UserInfoNetOptimizer (UINO) 1.0

UINO — metamod-плагин, который позволяет удалять ненужные поля из userinfo(setinfo) когда движок передаёт его другим игрокам на сервере. Данная мера уменьшает объём передаваемых данных и немного сокращает шанс быть кикнутым с "Reliable channel overflowed".

Информация

Добро пожаловать на CS-FADE.RU!

Для того чтобы стать полноценным пользователем нашего портала, вам необходимо пройти регистрацию.
Зарегистрироваться
Создайте собственную учетную запить!

Пройти регистрацию
Авторизоваться
Уже зарегистрированны? А ну-ка живо авторизуйтесь!

Войти на сайт