[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);
}

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

You do not have access to download files from our Website.


Hello, Our administration publishes only cannon content, put like under the post below and write the top comment, we are preparing the material just for you, Darling Гость.

Donate You can make the author Mort3m, a gift in the form of a donation to his Paypal ;)


Comments 4
  1. xUnicorn
    д1мн лох кста
    • 23 December 2018 20:48
    1. Universe
      а может ты?А?А77?А?7?

      • 26 December 2018 21:04
  2. ipman11223
    А как сделать так , что бы было для привилегий : вип , админ и босс ?

    • 24 August 2019 13:06
    1. Mort3m
      Mort3m
      • 0
      самый простой вариант:
      распределять модели по флагам, всё
      • 24 August 2019 13:10
Users belonging to group Guests cannot add comments to this article.
Base for Your Build
Information

Welcome to TB-TEAM.COM!

To become a full-fledged user of our portal, you need to register.
Register
Create your own account!

Register Now
Log In
Already registered? Go ahead and log in!

Log In