> > > >

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

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

Вложения

6  
Сообщения
212
Рейтинг
231
#2
вот после этого появится небольшой баг с анимациями игрока когда у него elite (dualpistols)
 
3  
Сообщения
260
Рейтинг
301
#3
Vaqtincha, С удовольствием выслушаю еще варианты от более опытных ребят) Я не говорю что этот вариант правильный и единственный, если есть решения лучше, только ЗА, что бы его озвучили здесь)
 
1  

DimaS

Web Design
Сообщения
206
Рейтинг
129
#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")
}
 
Последнее редактирование модератором:
 

DimaS

Web Design
Сообщения
206
Рейтинг
129
#6
Vaqtincha, в других модах, только submodels используют и норм. Может кто реализует на reapi для public
 
 

DimaS

Web Design
Сообщения
206
Рейтинг
129
#8
Vaqtincha, если я правильно понимаю, нужно просто прохукать все события с моделей, бомбу и дефузер в исключение.
Когда делали плагин, на разных событиях он не работал, от сюда можно сделать вывод, нужно проверять события.
 
 
Сообщения
1.866
Рейтинг
1640
#9
DimaS, у меня есть наработка. BaJIepbI4 поделишься?

Там не до конца доделано из за этих частых смен
 
1  
Сообщения
28
Рейтинг
14
#10
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;
}
28 Фев 2017
DimaS, я пока сделал отдельную модель со скинами для КТ и отдельную модель со скинами для Т. Ибо с субмоделями из-за бомбы и щипчиков проблемы - при взятии бомбы/щипчиков автоматически ставится первая субмодель.
 
1  
Сообщения
212
Рейтинг
231
#12
DimaS, Мы тут говорили про моделку самого игрока. А шапки, костюмы и пр. с сабмоделями это изи.
 
1  
Сообщения
260
Рейтинг
301
#13
DimaS, я пока сделал отдельную модель со скинами для КТ и отдельную модель со скинами для Т. Ибо с субмоделями из-за бомбы и щипчиков проблемы - при взятии бомбы/щипчиков автоматически ставится первая субмодель.
Как успехи?)
 
 
> > > >