📄 ui_playermodel.c
字号:
=================
*/
static void PlayerModel_DrawPlayer( void *self )
{
menubitmap_s* b;
b = (menubitmap_s*) self;
if( trap_MemoryRemaining() <= LOW_MEMORY ) {
UI_DrawProportionalString( b->generic.x, b->generic.y + b->height / 2, "LOW MEMORY", UI_LEFT, color_red );
return;
}
UI_DrawPlayer( b->generic.x, b->generic.y, b->width, b->height, &s_playermodel.playerinfo, uis.realtime/2 );
}
/*
=================
PlayerModel_BuildList
=================
*/
static void PlayerModel_BuildList( void )
{
int numdirs;
int numfiles;
char dirlist[2048];
char filelist[2048];
char skinname[64];
char* dirptr;
char* fileptr;
int i;
int j;
int dirlen;
int filelen;
qboolean precache;
precache = trap_Cvar_VariableValue("com_buildscript");
s_playermodel.modelpage = 0;
s_playermodel.nummodels = 0;
// iterate directory of all player models
numdirs = trap_FS_GetFileList("models/players", "/", dirlist, 2048 );
dirptr = dirlist;
for (i=0; i<numdirs && s_playermodel.nummodels < MAX_PLAYERMODELS; i++,dirptr+=dirlen+1)
{
dirlen = strlen(dirptr);
if (dirlen && dirptr[dirlen-1]=='/') dirptr[dirlen-1]='\0';
if (!strcmp(dirptr,".") || !strcmp(dirptr,".."))
continue;
// iterate all skin files in directory
numfiles = trap_FS_GetFileList( va("models/players/%s",dirptr), "tga", filelist, 2048 );
fileptr = filelist;
for (j=0; j<numfiles && s_playermodel.nummodels < MAX_PLAYERMODELS;j++,fileptr+=filelen+1)
{
filelen = strlen(fileptr);
COM_StripExtension(fileptr,skinname);
// look for icon_????
if (!Q_stricmpn(skinname,"icon_",5))
{
Com_sprintf( s_playermodel.modelnames[s_playermodel.nummodels++],
sizeof( s_playermodel.modelnames[s_playermodel.nummodels] ),
"models/players/%s/%s", dirptr, skinname );
//if (s_playermodel.nummodels >= MAX_PLAYERMODELS)
// return;
}
if( precache ) {
trap_S_RegisterSound( va( "sound/player/announce/%s_wins.wav", skinname), qfalse );
}
}
}
//APSFIXME - Degenerate no models case
s_playermodel.numpages = s_playermodel.nummodels/MAX_MODELSPERPAGE;
if (s_playermodel.nummodels % MAX_MODELSPERPAGE)
s_playermodel.numpages++;
}
/*
=================
PlayerModel_SetMenuItems
=================
*/
static void PlayerModel_SetMenuItems( void )
{
int i;
int maxlen;
char modelskin[64];
char* buffptr;
char* pdest;
// name
trap_Cvar_VariableStringBuffer( "name", s_playermodel.playername.string, 16 );
Q_CleanStr( s_playermodel.playername.string );
// model
trap_Cvar_VariableStringBuffer( "model", s_playermodel.modelskin, 64 );
// find model in our list
for (i=0; i<s_playermodel.nummodels; i++)
{
// strip icon_
buffptr = s_playermodel.modelnames[i] + strlen("models/players/");
pdest = strstr(buffptr,"icon_");
if (pdest)
{
Q_strncpyz(modelskin,buffptr,pdest-buffptr+1);
strcat(modelskin,pdest + 5);
}
else
continue;
if (!Q_stricmp( s_playermodel.modelskin, modelskin ))
{
// found pic, set selection here
s_playermodel.selectedmodel = i;
s_playermodel.modelpage = i/MAX_MODELSPERPAGE;
// seperate the model name
maxlen = pdest-buffptr;
if (maxlen > 16)
maxlen = 16;
Q_strncpyz( s_playermodel.modelname.string, buffptr, maxlen );
Q_strupr( s_playermodel.modelname.string );
// seperate the skin name
maxlen = strlen(pdest+5)+1;
if (maxlen > 16)
maxlen = 16;
Q_strncpyz( s_playermodel.skinname.string, pdest+5, maxlen );
Q_strupr( s_playermodel.skinname.string );
break;
}
}
}
/*
=================
PlayerModel_MenuInit
=================
*/
static void PlayerModel_MenuInit( void )
{
int i;
int j;
int k;
int x;
int y;
static char playername[32];
static char modelname[32];
static char skinname[32];
// zero set all our globals
memset( &s_playermodel, 0 ,sizeof(playermodel_t) );
PlayerModel_Cache();
s_playermodel.menu.key = PlayerModel_MenuKey;
s_playermodel.menu.wrapAround = qtrue;
s_playermodel.menu.fullscreen = qtrue;
s_playermodel.banner.generic.type = MTYPE_BTEXT;
s_playermodel.banner.generic.x = 320;
s_playermodel.banner.generic.y = 16;
s_playermodel.banner.string = "PLAYER MODEL";
s_playermodel.banner.color = color_white;
s_playermodel.banner.style = UI_CENTER;
s_playermodel.framel.generic.type = MTYPE_BITMAP;
s_playermodel.framel.generic.name = MODEL_FRAMEL;
s_playermodel.framel.generic.flags = QMF_LEFT_JUSTIFY|QMF_INACTIVE;
s_playermodel.framel.generic.x = 0;
s_playermodel.framel.generic.y = 78;
s_playermodel.framel.width = 256;
s_playermodel.framel.height = 329;
s_playermodel.framer.generic.type = MTYPE_BITMAP;
s_playermodel.framer.generic.name = MODEL_FRAMER;
s_playermodel.framer.generic.flags = QMF_LEFT_JUSTIFY|QMF_INACTIVE;
s_playermodel.framer.generic.x = 376;
s_playermodel.framer.generic.y = 76;
s_playermodel.framer.width = 256;
s_playermodel.framer.height = 334;
s_playermodel.ports.generic.type = MTYPE_BITMAP;
s_playermodel.ports.generic.name = MODEL_PORTS;
s_playermodel.ports.generic.flags = QMF_LEFT_JUSTIFY|QMF_INACTIVE;
s_playermodel.ports.generic.x = 50;
s_playermodel.ports.generic.y = 59;
s_playermodel.ports.width = 274;
s_playermodel.ports.height = 274;
y = 59;
for (i=0,k=0; i<PLAYERGRID_ROWS; i++)
{
x = 50;
for (j=0; j<PLAYERGRID_COLS; j++,k++)
{
s_playermodel.pics[k].generic.type = MTYPE_BITMAP;
s_playermodel.pics[k].generic.flags = QMF_LEFT_JUSTIFY|QMF_INACTIVE;
s_playermodel.pics[k].generic.x = x;
s_playermodel.pics[k].generic.y = y;
s_playermodel.pics[k].width = 64;
s_playermodel.pics[k].height = 64;
s_playermodel.pics[k].focuspic = MODEL_SELECTED;
s_playermodel.pics[k].focuscolor = colorRed;
s_playermodel.picbuttons[k].generic.type = MTYPE_BITMAP;
s_playermodel.picbuttons[k].generic.flags = QMF_LEFT_JUSTIFY|QMF_NODEFAULTINIT|QMF_PULSEIFFOCUS;
s_playermodel.picbuttons[k].generic.id = ID_PLAYERPIC0+k;
s_playermodel.picbuttons[k].generic.callback = PlayerModel_PicEvent;
s_playermodel.picbuttons[k].generic.x = x - 16;
s_playermodel.picbuttons[k].generic.y = y - 16;
s_playermodel.picbuttons[k].generic.left = x;
s_playermodel.picbuttons[k].generic.top = y;
s_playermodel.picbuttons[k].generic.right = x + 64;
s_playermodel.picbuttons[k].generic.bottom = y + 64;
s_playermodel.picbuttons[k].width = 128;
s_playermodel.picbuttons[k].height = 128;
s_playermodel.picbuttons[k].focuspic = MODEL_SELECT;
s_playermodel.picbuttons[k].focuscolor = colorRed;
x += 64+6;
}
y += 64+6;
}
s_playermodel.playername.generic.type = MTYPE_PTEXT;
s_playermodel.playername.generic.flags = QMF_CENTER_JUSTIFY|QMF_INACTIVE;
s_playermodel.playername.generic.x = 320;
s_playermodel.playername.generic.y = 440;
s_playermodel.playername.string = playername;
s_playermodel.playername.style = UI_CENTER;
s_playermodel.playername.color = text_color_normal;
s_playermodel.modelname.generic.type = MTYPE_PTEXT;
s_playermodel.modelname.generic.flags = QMF_CENTER_JUSTIFY|QMF_INACTIVE;
s_playermodel.modelname.generic.x = 497;
s_playermodel.modelname.generic.y = 54;
s_playermodel.modelname.string = modelname;
s_playermodel.modelname.style = UI_CENTER;
s_playermodel.modelname.color = text_color_normal;
s_playermodel.skinname.generic.type = MTYPE_PTEXT;
s_playermodel.skinname.generic.flags = QMF_CENTER_JUSTIFY|QMF_INACTIVE;
s_playermodel.skinname.generic.x = 497;
s_playermodel.skinname.generic.y = 394;
s_playermodel.skinname.string = skinname;
s_playermodel.skinname.style = UI_CENTER;
s_playermodel.skinname.color = text_color_normal;
s_playermodel.player.generic.type = MTYPE_BITMAP;
s_playermodel.player.generic.flags = QMF_INACTIVE;
s_playermodel.player.generic.ownerdraw = PlayerModel_DrawPlayer;
s_playermodel.player.generic.x = 400;
s_playermodel.player.generic.y = -40;
s_playermodel.player.width = 32*10;
s_playermodel.player.height = 56*10;
s_playermodel.arrows.generic.type = MTYPE_BITMAP;
s_playermodel.arrows.generic.name = MODEL_ARROWS;
s_playermodel.arrows.generic.flags = QMF_INACTIVE;
s_playermodel.arrows.generic.x = 125;
s_playermodel.arrows.generic.y = 340;
s_playermodel.arrows.width = 128;
s_playermodel.arrows.height = 32;
s_playermodel.left.generic.type = MTYPE_BITMAP;
s_playermodel.left.generic.flags = QMF_LEFT_JUSTIFY|QMF_PULSEIFFOCUS;
s_playermodel.left.generic.callback = PlayerModel_MenuEvent;
s_playermodel.left.generic.id = ID_PREVPAGE;
s_playermodel.left.generic.x = 125;
s_playermodel.left.generic.y = 340;
s_playermodel.left.width = 64;
s_playermodel.left.height = 32;
s_playermodel.left.focuspic = MODEL_ARROWSL;
s_playermodel.right.generic.type = MTYPE_BITMAP;
s_playermodel.right.generic.flags = QMF_LEFT_JUSTIFY|QMF_PULSEIFFOCUS;
s_playermodel.right.generic.callback = PlayerModel_MenuEvent;
s_playermodel.right.generic.id = ID_NEXTPAGE;
s_playermodel.right.generic.x = 125+61;
s_playermodel.right.generic.y = 340;
s_playermodel.right.width = 64;
s_playermodel.right.height = 32;
s_playermodel.right.focuspic = MODEL_ARROWSR;
s_playermodel.back.generic.type = MTYPE_BITMAP;
s_playermodel.back.generic.name = MODEL_BACK0;
s_playermodel.back.generic.flags = QMF_LEFT_JUSTIFY|QMF_PULSEIFFOCUS;
s_playermodel.back.generic.callback = PlayerModel_MenuEvent;
s_playermodel.back.generic.id = ID_BACK;
s_playermodel.back.generic.x = 0;
s_playermodel.back.generic.y = 480-64;
s_playermodel.back.width = 128;
s_playermodel.back.height = 64;
s_playermodel.back.focuspic = MODEL_BACK1;
Menu_AddItem( &s_playermodel.menu, &s_playermodel.banner );
Menu_AddItem( &s_playermodel.menu, &s_playermodel.framel );
Menu_AddItem( &s_playermodel.menu, &s_playermodel.framer );
Menu_AddItem( &s_playermodel.menu, &s_playermodel.ports );
Menu_AddItem( &s_playermodel.menu, &s_playermodel.playername );
Menu_AddItem( &s_playermodel.menu, &s_playermodel.modelname );
Menu_AddItem( &s_playermodel.menu, &s_playermodel.skinname );
for (i=0; i<MAX_MODELSPERPAGE; i++)
{
Menu_AddItem( &s_playermodel.menu, &s_playermodel.pics[i] );
Menu_AddItem( &s_playermodel.menu, &s_playermodel.picbuttons[i] );
}
Menu_AddItem( &s_playermodel.menu, &s_playermodel.player );
Menu_AddItem( &s_playermodel.menu, &s_playermodel.arrows );
Menu_AddItem( &s_playermodel.menu, &s_playermodel.left );
Menu_AddItem( &s_playermodel.menu, &s_playermodel.right );
Menu_AddItem( &s_playermodel.menu, &s_playermodel.back );
// find all available models
// PlayerModel_BuildList();
// set initial states
PlayerModel_SetMenuItems();
// update user interface
PlayerModel_UpdateGrid();
PlayerModel_UpdateModel();
}
/*
=================
PlayerModel_Cache
=================
*/
void PlayerModel_Cache( void )
{
int i;
for( i = 0; playermodel_artlist[i]; i++ ) {
trap_R_RegisterShaderNoMip( playermodel_artlist[i] );
}
PlayerModel_BuildList();
for( i = 0; i < s_playermodel.nummodels; i++ ) {
trap_R_RegisterShaderNoMip( s_playermodel.modelnames[i] );
}
}
void UI_PlayerModelMenu(void)
{
PlayerModel_MenuInit();
UI_PushMenu( &s_playermodel.menu );
Menu_SetCursorToItem( &s_playermodel.menu, &s_playermodel.pics[s_playermodel.selectedmodel % MAX_MODELSPERPAGE] );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -