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

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

[attachment=1078]



Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
CHEATS-CS.RU - Топовый контент по CS 1.6