Как избавится от *T.mdl в моделях

Сообщения
263
Реакции
335
Помог
4 раз(а)
Попал мне в руки архив с 2-мя модельками, инфа больше для себя что бы не забыть, но может еще кому пригодится. (Если ребята которые работают с модельками подскажут другие варианты, то подскажите, а не кидайте камнями :pardon:
  1. Закидываем модель и Тмодель в папку "MDL_tools"
  2. Декомпилируем модели "decompile_all.bat"
  3. Копируем файл "studiomdl.exe" из корня в папку с моделью
  4. В папке с моделью находим файл с расширением *.qc
  5. Открываем текстовым редактором, стираем оттуда строку "$externaltextures"
  6. Закидываем *.qc файл в "studiomdl.exe"
  7. Ждем, готово, в папке появится одна моделька без *T.mdl
 

Вложения

Сообщения
723
Реакции
610
Помог
13 раз(а)
вот после этого появится небольшой баг с анимациями игрока когда у него elite (dualpistols)
 
Сообщения
263
Реакции
335
Помог
4 раз(а)
Vaqtincha, С удовольствием выслушаю еще варианты от более опытных ребят) Я не говорю что этот вариант правильный и единственный, если есть решения лучше, только ЗА, что бы его озвучили здесь)
 
Сообщения
222
Реакции
146
Помог
4 раз(а)
выше описанным методом, можно создать submodels например из 4 моделей сделать 1, (большая экономия места), но нормальных плагинов для работы с submodels нет, по крайне мере я не встречал.
В своё время делали плагин для этого, но он так и остался не доработанным:

Код:

#include <amxmodx>
#include <amxmisc>
#include <cstrike>
#include <hamsandwich>
#include <fakemeta>
#include <csx>

new const admin = ADMIN_IMMUNITY
new const vip   = ADMIN_LEVEL_H
new const vipg   = ADMIN_LEVEL_F

public plugin_init()
{
   RegisterHam( Ham_Spawn, "player", "hamSpawn", 1 )
  
   register_logevent( "round_end", 2, "1=Round_End" )
  
   register_event( "BombDrop",   "BombCheck","be" )
   register_event( "BombPickup", "BombCheck","be" )
}

public bomb_planted(planter)
{
   if(is_user_connected(planter) || is_user_alive(planter))
   {
     ReloadModels(planter)
   }
}

public BombCheck(id)
{
   if(is_user_connected(id) || is_user_alive(id))
   {
     ReloadModels(id)
   }
   return PLUGIN_CONTINUE
}

public hamSpawn(id)
{
   if(is_user_connected(id) || is_user_alive(id) )
   {
     set_task( 0.1, "ReloadModels" ,id )
   }
}

public round_end(id)
{
   if(is_user_connected(id))
   {
     cs_reset_user_model(id)
   }
}


public ReloadModels(id)
{
   if( is_user_connected(id) || is_user_alive(id) )
   {
     if (get_user_flags(id) & admin)
     {
       cs_set_user_model(id, "admin")
       switch(get_user_team(id))
       {
         case 1: set_pev(id, pev_body, 1)
         case 2: set_pev(id, pev_body, 2)
       }
     }
     else  if (get_user_flags(id) & vip)
     {
       cs_set_user_model(id, "admin_vip")
       switch(get_user_team(id))
       {
         case 1: set_pev(id, pev_body, 1)
         case 2: set_pev(id, pev_body, 2)
       }
     }
     else  if (get_user_flags(id) & vipg)
     {
       cs_set_user_model(id, "admin_vipg")
       switch(get_user_team(id))
       {
         case 1: set_pev(id, pev_skin, 2)
         case 2: set_pev(id, pev_skin, 1)
       }
     }
   }
}

public plugin_precache()
{
   precache_model("models/player/admin/admin.mdl")
   precache_model("models/player/admin_vip/admin_vip.mdl")
   precache_model("models/player/admin_vipg/admin_vipg.mdl")
}
C++
 
Последнее редактирование модератором:
Сообщения
222
Реакции
146
Помог
4 раз(а)
Vaqtincha, в других модах, только submodels используют и норм. Может кто реализует на reapi для public
 
Сообщения
222
Реакции
146
Помог
4 раз(а)
Vaqtincha, если я правильно понимаю, нужно просто прохукать все события с моделей, бомбу и дефузер в исключение.
Когда делали плагин, на разных событиях он не работал, от сюда можно сделать вывод, нужно проверять события.
 
Сообщения
2,752
Реакции
3,020
Помог
61 раз(а)
DimaS, у меня есть наработка. BaJIepbI4 поделишься?

Там не до конца доделано из за этих частых смен
 
Сообщения
28
Реакции
14
wopox1337, конечно :)

Код:

#include <amxmodx>
#include <fakemeta>
#include <hamsandwich>

    // Настройки    //
// Имя модели
new const MODEL[] = "model";

// Права
const ADMIN    = ADMIN_BAN;
const VIP    = ADMIN_LEVEL_H;
    // Настройки    //



#define Bit_Set(%0,%1)         ((%0) |= (1 << (%1)))
#define Bit_Clear(%0,%1)     ((%0) &= ~(1 << (%1)))
#define Bit_Toggle(%0,%1)    ((%0) ^= (1 << (%1)))
#define IsSetBit(%0,%1)     ((%0) & (1 << (%1)))

new g_szPlayerModel[33][sizeof MODEL];

new g_bitVIPaccess,
    g_bitADMINaccess,
    g_bitModelInstalled;

public plugin_precache()
{
    new szBuffer[256];
    formatex(szBuffer, charsmax(szBuffer), "models/player/%s/%s.mdl", MODEL, MODEL);

    if(file_exists(szBuffer))
    {
        precache_model(szBuffer);
    }
    else
    {
        set_fail_state("ERROR! File '%s' not found!", szBuffer);
    }
}

public plugin_init()
{
    register_plugin("ADMIN&VIP Sub-Models", "0.0.1", "wopox1337");
   
    RegisterHam(Ham_Spawn, "player", "CBasePlayer_Spawn", .Post = true);
    register_forward(FM_SetClientKeyValue, "FM_SetClientKeyValue_Pre", ._post=false);
}

public client_putinserver(iPlayerId)
{
    static szFlags;
    szFlags = get_user_flags(iPlayerId);

    if(szFlags & ADMIN)
    {
        Bit_Set(g_bitADMINaccess,iPlayerId);
        Bit_Set(g_bitModelInstalled,iPlayerId);

    }
    if(szFlags & VIP)
    {
        Bit_Set(g_bitVIPaccess,iPlayerId);
        Bit_Set(g_bitModelInstalled,iPlayerId);
    }
}

public client_disconnected(iPlayerId)
{
    Bit_Clear(g_bitADMINaccess,iPlayerId);
    Bit_Clear(g_bitVIPaccess,iPlayerId);
    Bit_Clear(g_bitModelInstalled,iPlayerId);
}

public CBasePlayer_Spawn(iPlayerId)
{
    if(IsSetBit(g_bitModelInstalled,iPlayerId))
    {
        fm_set_user_model(iPlayerId, MODEL);
    }
}

enum TEAMSBODY
{
    TEAM_CT,
    TEAM_T
}

enum SKINS
{
    SKIN_ADMIN,
    SKIN_VIP
}

stock fm_set_user_model(iPlayerId, const szModelName[])
{
    if(IsSetBit(g_bitModelInstalled,iPlayerId))
    {
        engfunc(EngFunc_SetClientKeyValue, iPlayerId, engfunc(EngFunc_GetInfoKeyBuffer, iPlayerId), "model", szModelName);
        copy(g_szPlayerModel[iPlayerId], charsmax(g_szPlayerModel[]), szModelName);
   
        static szTeamName[2];
        get_user_team(iPlayerId, szTeamName, charsmax(szTeamName));

        static bool:bTeam_T, bool:bVIP;

        switch(szTeamName[0])
        {
            case 'T': bTeam_T = true;
            case 'C': bTeam_T = false;
            case 'U', 'S': return;
        }
       
        if(IsSetBit(g_bitADMINaccess,iPlayerId))
        {
            bVIP = false;
        }
        else /*if(IsSetBit(g_bitVIPaccess,iPlayerId))*/
        {
            bVIP = true;
        }
        /*
        log_amx("id: %d,Team: %s, VIP: %s",
            iPlayerId,
            bTeam_T ? "T" : "CT",
            bVIP ?  "Yes" : "No"
            );
        */
       
        SetModels_BodyAndSkin(
            iPlayerId,
            .bTeam = bTeam_T,
            .bAccess = bVIP
        );
    }
}

SetModels_BodyAndSkin(iPlayerId, bTeam, bAccess)
{
    set_pev(iPlayerId, pev_body, bTeam);
    set_pev(iPlayerId, pev_skin, bAccess);
}

stock fm_get_user_model(id, szModel[], szLen)
{
    engfunc(EngFunc_InfoKeyValue, engfunc(EngFunc_GetInfoKeyBuffer, id), "model", szModel, szLen);
}

public FM_SetClientKeyValue_Pre(id, const szInfobuffer[], const szKey[])
{  
    if(IsSetBit(g_bitModelInstalled,id) && equal(szKey, "model"))
    {
        static szCurrentModel[sizeof MODEL];
        fm_get_user_model(id, szCurrentModel, charsmax(szCurrentModel));
       
        if(!equal(szCurrentModel, g_szPlayerModel[id]))
        {
            fm_set_user_model(id, g_szPlayerModel[id]);
        }
       
       
        fm_set_user_model(id, MODEL);

        return FMRES_SUPERCEDE;
    }
    return FMRES_IGNORED;
}
C++
28 Фев 2017
DimaS, я пока сделал отдельную модель со скинами для КТ и отдельную модель со скинами для Т. Ибо с субмоделями из-за бомбы и щипчиков проблемы - при взятии бомбы/щипчиков автоматически ставится первая субмодель.
 
Сообщения
723
Реакции
610
Помог
13 раз(а)
DimaS, Мы тут говорили про моделку самого игрока. А шапки, костюмы и пр. с сабмоделями это изи.
 
Сообщения
263
Реакции
335
Помог
4 раз(а)
DimaS, я пока сделал отдельную модель со скинами для КТ и отдельную модель со скинами для Т. Ибо с субмоделями из-за бомбы и щипчиков проблемы - при взятии бомбы/щипчиков автоматически ставится первая субмодель.
Как успехи?)
 

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу