From 8fd8c2b54617d669cc36a884f1a3a9dc8d78b484 Mon Sep 17 00:00:00 2001 From: Denis Pauk Date: Sat, 8 Jun 2024 23:21:00 +0300 Subject: [PATCH 1/3] menu: support long player skin name --- src/client/menu/menu.c | 52 +++++++++++++++++++++++------------------- 1 file changed, 29 insertions(+), 23 deletions(-) diff --git a/src/client/menu/menu.c b/src/client/menu/menu.c index c5baadf2..0065d0ec 100644 --- a/src/client/menu/menu.c +++ b/src/client/menu/menu.c @@ -2468,7 +2468,7 @@ Options_MenuInit(void) s_options_crosshair_box.generic.name = "crosshair"; s_options_crosshair_box.generic.callback = CrosshairFunc; s_options_crosshair_box.itemnames = crosshair_names; - + s_options_pauseonfocus_box.generic.type = MTYPE_SPINCONTROL; s_options_pauseonfocus_box.generic.x = 0; s_options_pauseonfocus_box.generic.y = (y += 10); @@ -2988,7 +2988,7 @@ M_Credits_MenuDraw(void) } } -const char * +static const char * M_Credits_Key(int key) { key = Key_GetMenuKey(key); @@ -5253,7 +5253,6 @@ static menuseparator_s s_player_hand_title; static menuseparator_s s_player_rate_title; static menuaction_s s_player_download_action; -#define MAX_DISPLAYNAME 16 #define MAX_PLAYERMODELS 1024 typedef struct _stringlist @@ -5321,7 +5320,8 @@ static qboolean IconOfSkinExists(char* skin, char** pcxfiles, int npcxfiles) } // strip file extension -void StripExtension(char* path) +static void +StripExtension(char* path) { int length; @@ -5370,7 +5370,8 @@ ContainsFile(char* path, char* file) } // replace characters in string -void ReplaceCharacters(char* s, char r, char c) +static void +ReplaceCharacters(char* s, char r, char c) { char* p = s; @@ -5423,7 +5424,7 @@ dircmp_func(const void* _a, const void* _b) static void PlayerModelFree() { - char* s = 0; + char* s = NULL; // there should be no valid skin names if there is no valid model if (s_modelname.num != 0) @@ -5505,13 +5506,14 @@ PlayerDirectoryList(void) int num = 0; // get a list of "players" subdirectories - if ((list = FS_ListFiles2(findname, &num, 0, 0)) == 0) + if ((list = FS_ListFiles2(findname, &num, 0, 0)) == NULL) { return false; } if (num > MAX_PLAYERMODELS) { + Com_Printf("Too many player models (%d)!\n", num); num = MAX_PLAYERMODELS - 1; } @@ -5536,11 +5538,11 @@ PlayerDirectoryList(void) char* t = list[i]; YQ2_COM_CHECK_OOM(s, "malloc()", MAX_QPATH * sizeof(char)) - + Q_strlcpy(s, t, MAX_QPATH); data[i] = s; } - + // free file list FS_FreeList(list, num); @@ -5559,8 +5561,6 @@ PlayerModelList(void) char findname[MAX_QPATH]; char** list = 0; char** data = 0; - char* s = 0; - char* t = 0; int num = 0; int mdl = 0; qboolean result = true; @@ -5575,6 +5575,10 @@ PlayerModelList(void) // verify the existence of at least one pcx skin for (int i = 0; i < s_directory.num; ++i) { + char* s = NULL; + char* t = NULL; + int l; + if (s_directory.data[i] == 0) { continue; @@ -5591,7 +5595,7 @@ PlayerModelList(void) // contains triangle .md2 model s = s_directory.data[i]; - + if (ContainsFile(s, "tris.md2") == false) { continue; // invalid player model @@ -5628,7 +5632,7 @@ PlayerModelList(void) data = (char**)malloc((s_skinnames[mdl].num + 1) * sizeof(char*)); YQ2_COM_CHECK_OOM(data, "malloc()", (s_skinnames[mdl].num + 1) * sizeof(char*)) memset(data, 0, (s_skinnames[mdl].num + 1) * sizeof(char*)); - + s_skinnames[mdl].data = data; s_skinnames[mdl].num = 0; @@ -5647,13 +5651,14 @@ PlayerModelList(void) { ReplaceCharacters(list[k], '\\', '/'); - s = (char*)malloc(MAX_DISPLAYNAME); t = strrchr(list[k], '/'); - YQ2_COM_CHECK_OOM(s, "malloc()", MAX_DISPLAYNAME * sizeof(char)) + l = strlen(t) + 1; + s = (char*)malloc(l); + YQ2_COM_CHECK_OOM(s, "malloc()", l * sizeof(char)) StripExtension(t); - Q_strlcpy(s, t + 1, MAX_DISPLAYNAME); + Q_strlcpy(s, t + 1, l); data[s_skinnames[mdl].num++] = s; } @@ -5664,12 +5669,13 @@ PlayerModelList(void) qsort(s_skinnames[mdl].data, s_skinnames[mdl].num, sizeof(char**), Q_sort_stricmp); // at this point we have a valid player model - s = (char*)malloc(MAX_DISPLAYNAME); t = strrchr(s_directory.data[i], '/'); + l = strlen(t) + 1; + s = (char*)malloc(l); - YQ2_COM_CHECK_OOM(s, "malloc()", MAX_DISPLAYNAME * sizeof(char)) + YQ2_COM_CHECK_OOM(s, "malloc()", l * sizeof(char)) - Q_strlcpy(s, t + 1, MAX_DISPLAYNAME); + Q_strlcpy(s, t + 1, l); s_modelname.data[s_modelname.num++] = s; mdl = s_modelname.num; @@ -5733,8 +5739,8 @@ PlayerConfig_MenuInit(void) extern cvar_t *skin; cvar_t *hand = Cvar_Get( "hand", "0", CVAR_USERINFO | CVAR_ARCHIVE ); static const char *handedness[] = { "right", "left", "center", 0 }; - char mdlname[MAX_DISPLAYNAME * 2]; - char imgname[MAX_DISPLAYNAME]; + char mdlname[MAX_QPATH]; + char imgname[MAX_QPATH]; int mdlindex = 0; int imgindex = 0; int i = 0; @@ -5745,12 +5751,12 @@ PlayerConfig_MenuInit(void) return false; } - Q_strlcpy(mdlname, skin->string, MAX_DISPLAYNAME * 2); + Q_strlcpy(mdlname, skin->string, sizeof(mdlname)); ReplaceCharacters(mdlname, '\\', '/' ); if (strchr(mdlname, '/')) { - Q_strlcpy(imgname, strchr(mdlname, '/') + 1, MAX_DISPLAYNAME); + Q_strlcpy(imgname, strchr(mdlname, '/') + 1, sizeof(imgname)); *strchr(mdlname, '/') = 0; } else From 28aeb68826c000829d07d7b4302e86149f23917b Mon Sep 17 00:00:00 2001 From: Denis Pauk Date: Sat, 8 Jun 2024 23:36:57 +0300 Subject: [PATCH 2/3] menu: show weapon in player model preview --- src/client/menu/menu.c | 174 +++++++++++++++++++++++++---------------- 1 file changed, 105 insertions(+), 69 deletions(-) diff --git a/src/client/menu/menu.c b/src/client/menu/menu.c index 0065d0ec..3c15f5b1 100644 --- a/src/client/menu/menu.c +++ b/src/client/menu/menu.c @@ -5908,92 +5908,128 @@ extern float CalcFov(float fov_x, float w, float h); * Model animation */ static void -PlayerConfig_AnimateModel(entity_t *entity, int curTime) +PlayerConfig_AnimateModel(entity_t *entity, int count, int curTime) { - cvar_t *cl_start_frame, *cl_end_frame; - int startFrame, endFrame; + const cvar_t *cl_start_frame, *cl_end_frame; + int startFrame, endFrame; - cl_start_frame = Cvar_Get("cl_model_preview_start", "84", CVAR_ARCHIVE); - cl_end_frame = Cvar_Get("cl_model_preview_end", "94", CVAR_ARCHIVE); - startFrame = cl_start_frame->value; - endFrame = cl_end_frame->value; + cl_start_frame = Cvar_Get("cl_model_preview_start", "84", CVAR_ARCHIVE); + cl_end_frame = Cvar_Get("cl_model_preview_end", "94", CVAR_ARCHIVE); + startFrame = cl_start_frame->value; + endFrame = cl_end_frame->value; - if (startFrame >= 0 && endFrame > startFrame) - { - /* salute male 84..94 frame */ - entity->frame = (curTime / 100) % (endFrame - startFrame) + startFrame; - } + if (startFrame >= 0 && endFrame > startFrame) + { + int i; + + for (i = 0; i < count; i ++) + { + /* salute male 84..94 frame */ + entity[i].frame = (curTime / 100) % (endFrame - startFrame) + startFrame; + } + } } static void PlayerConfig_MenuDraw(void) { - refdef_t refdef; - float scale = SCR_GetMenuScale(); + refdef_t refdef; + float scale = SCR_GetMenuScale(); - memset(&refdef, 0, sizeof(refdef)); + memset(&refdef, 0, sizeof(refdef)); - refdef.x = viddef.width / 2; - refdef.y = viddef.height / 2 - 72 * scale; - refdef.width = 144 * scale; - refdef.height = 168 * scale; - refdef.fov_x = 40; - refdef.fov_y = CalcFov(refdef.fov_x, (float)refdef.width, (float)refdef.height); - refdef.time = cls.realtime * 0.001f; + refdef.x = viddef.width / 2; + refdef.y = viddef.height / 2 - 72 * scale; + refdef.width = 144 * scale; + refdef.height = 168 * scale; + refdef.fov_x = 40; + refdef.fov_y = CalcFov(refdef.fov_x, (float)refdef.width, (float)refdef.height); + refdef.time = cls.realtime * 0.001f; - // could remove this, there should be a valid set of models - if ((s_player_model_box.curvalue >= 0 && s_player_model_box.curvalue < s_modelname.num) - && (s_player_skin_box.curvalue >= 0 - && s_player_skin_box.curvalue < s_skinnames[s_player_model_box.curvalue].num)) - { - entity_t entity; - char scratch[MAX_QPATH]; - char* mdlname = s_modelname.data[s_player_model_box.curvalue]; - char* imgname = s_skinnames[s_player_model_box.curvalue].data[s_player_skin_box.curvalue]; + // could remove this, there should be a valid set of models + if ((s_player_model_box.curvalue >= 0 && s_player_model_box.curvalue < s_modelname.num) + && (s_player_skin_box.curvalue >= 0 + && s_player_skin_box.curvalue < s_skinnames[s_player_model_box.curvalue].num)) + { + entity_t entities[2]; + char scratch[MAX_QPATH]; + char* mdlname = s_modelname.data[s_player_model_box.curvalue]; + char* imgname = s_skinnames[s_player_model_box.curvalue].data[s_player_skin_box.curvalue]; + int i, curTime; - memset(&entity, 0, sizeof(entity)); + memset(&entities, 0, sizeof(entities)); - Com_sprintf(scratch, sizeof(scratch), "players/%s/tris.md2", mdlname); - entity.model = R_RegisterModel(scratch); - Com_sprintf(scratch, sizeof(scratch), "players/%s/%s.pcx", mdlname, - imgname); - entity.skin = R_RegisterSkin(scratch); - entity.flags = RF_FULLBRIGHT; - entity.origin[0] = 80; - entity.origin[1] = 0; - entity.origin[2] = 0; - VectorCopy(entity.origin, entity.oldorigin); - entity.frame = 0; - entity.oldframe = 0; - entity.backlerp = 0.0; + Com_sprintf(scratch, sizeof(scratch), "players/%s/tris.md2", mdlname); + entities[0].model = R_RegisterModel(scratch); - int curTime = Sys_Milliseconds(); - PlayerConfig_AnimateModel(&entity, curTime); - // one full turn is 3s = 3000ms => 3000/360 deg per millisecond - curTime = curTime % 3000; - entity.angles[1] = (float)curTime/(3000.0f/360.0f); + Com_sprintf(scratch, sizeof(scratch), "players/%s/%s.pcx", mdlname, + imgname); + entities[0].skin = R_RegisterSkin(scratch); - refdef.areabits = 0; - refdef.num_entities = 1; - refdef.entities = &entity; - refdef.lightstyles = 0; - refdef.rdflags = RDF_NOWORLDMODEL; + curTime = Sys_Milliseconds(); - Com_sprintf(scratch, sizeof(scratch), "/players/%s/%s_i.pcx", mdlname, - imgname); + /* multiplayer weapons loaded */ + if (num_cl_weaponmodels) + { + int weapon_id; - // icon bitmap to draw - s_player_icon_bitmap.generic.name = scratch; + /* change weapon every 3 rounds */ + weapon_id = curTime / 9000; - Menu_Draw(&s_player_config_menu); + weapon_id = weapon_id % num_cl_weaponmodels; + /* show weapon also */ + Com_sprintf(scratch, sizeof(scratch), + "players/%s/%s", mdlname, cl_weaponmodels[weapon_id]); + entities[1].model = R_RegisterModel(scratch); + } - M_DrawTextBox(((int)(refdef.x) * (320.0F / viddef.width) - 8), - (int)((viddef.height / 2) * (240.0F / viddef.height) - 77), - refdef.width / (8 * scale), refdef.height / (8 * scale)); - refdef.height += 4 * scale; + /* no such weapon model */ + if (!entities[1].model) + { + /* show weapon also */ + Com_sprintf(scratch, sizeof(scratch), + "players/%s/weapon.md2", mdlname); + entities[1].model = R_RegisterModel(scratch); + } - R_RenderFrame(&refdef); - } + curTime = curTime % 3000; + for (i = 0; i < 2; i++) + { + entities[i].flags = RF_FULLBRIGHT; + entities[i].origin[0] = 80; + entities[i].origin[1] = 0; + entities[i].origin[2] = 0; + VectorCopy(entities[i].origin, entities[i].oldorigin); + entities[i].frame = 0; + entities[i].oldframe = 0; + entities[i].backlerp = 0.0; + // one full turn is 3s = 3000ms => 3000/360 deg per millisecond + entities[i].angles[1] = (float)curTime/(3000.0f/360.0f); + } + + PlayerConfig_AnimateModel(entities, 2, curTime); + + refdef.areabits = 0; + refdef.num_entities = (entities[1].model) ? 2 : 1; + refdef.entities = entities; + refdef.lightstyles = 0; + refdef.rdflags = RDF_NOWORLDMODEL; + + Com_sprintf(scratch, sizeof(scratch), "/players/%s/%s_i.pcx", mdlname, + imgname); + + // icon bitmap to draw + s_player_icon_bitmap.generic.name = scratch; + + Menu_Draw(&s_player_config_menu); + + M_DrawTextBox(((int)(refdef.x) * (320.0F / viddef.width) - 8), + (int)((viddef.height / 2) * (240.0F / viddef.height) - 77), + refdef.width / (8 * scale), refdef.height / (8 * scale)); + refdef.height += 4 * scale; + + R_RenderFrame(&refdef); + } } static const char * @@ -6003,9 +6039,9 @@ PlayerConfig_MenuKey(int key) if (key == K_ESCAPE) { char skin[MAX_QPATH]; - char* name = 0; - char* mdl = 0; - char* img = 0; + char* name = NULL; + char* mdl = NULL; + char* img = NULL; name = s_player_name_field.buffer; mdl = s_modelname.data[s_player_model_box.curvalue]; From e7dc4f3b2c7321948cf3157f9929becc577c2265 Mon Sep 17 00:00:00 2001 From: Denis Pauk Date: Tue, 11 Jun 2024 23:28:50 +0300 Subject: [PATCH 3/3] menu: Fix default NULL --- src/client/menu/menu.c | 14 +++++++------- src/common/cmdparser.c | 2 +- src/server/sv_cmd.c | 8 ++++---- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/client/menu/menu.c b/src/client/menu/menu.c index 3c15f5b1..0c8d0e54 100644 --- a/src/client/menu/menu.c +++ b/src/client/menu/menu.c @@ -121,7 +121,7 @@ M_ForceMenuOff(void) Cvar_Set("paused", "0"); } - void +void M_PopMenu(void) { S_StartLocalSound(menu_out_sound); @@ -726,7 +726,7 @@ InitMainMenu(void) static void M_Main_Draw(void) { - menucommon_s * item = 0; + menucommon_s * item = NULL; int x = 0; int y = 0; @@ -752,7 +752,7 @@ M_Main_Key(int key) void M_Menu_Main_f(void) { - menucommon_s * item = 0; + menucommon_s * item = NULL; InitMainMenu(); @@ -5502,7 +5502,7 @@ static qboolean PlayerDirectoryList(void) { char* findname = "players/*"; - char** list = 0; + char** list = NULL; int num = 0; // get a list of "players" subdirectories @@ -5559,8 +5559,8 @@ static qboolean PlayerModelList(void) { char findname[MAX_QPATH]; - char** list = 0; - char** data = 0; + char** list = NULL; + char** data = NULL; int num = 0; int mdl = 0; qboolean result = true; @@ -5588,7 +5588,7 @@ PlayerModelList(void) strcat(findname, "/*.pcx"); // get a list of pcx files - if ((list = FS_ListFiles2(findname, &num, 0, 0)) == 0) + if ((list = FS_ListFiles2(findname, &num, 0, 0)) == NULL) { continue; } diff --git a/src/common/cmdparser.c b/src/common/cmdparser.c index 6c4c82a1..f28d6aed 100644 --- a/src/common/cmdparser.c +++ b/src/common/cmdparser.c @@ -912,7 +912,7 @@ Cmd_CompleteMapCommand(char *partial) char *pmatch[1024]; qboolean partialFillContinue = true; - if ((mapNames = FS_ListFiles2("maps/*.bsp", &nMaps, 0, 0)) != 0) + if ((mapNames = FS_ListFiles2("maps/*.bsp", &nMaps, 0, 0)) != NULL) { len = strlen(partial); nbMatches = 0; diff --git a/src/server/sv_cmd.c b/src/server/sv_cmd.c index 3fc321ed..4f1fe70a 100644 --- a/src/server/sv_cmd.c +++ b/src/server/sv_cmd.c @@ -321,7 +321,7 @@ void SV_ListMaps_f(void) Com_Printf("\n"); - if ((userMapNames = FS_ListFiles2("maps/*.bsp", &nUserMaps, 0, 0)) != 0) + if ((userMapNames = FS_ListFiles2("maps/*.bsp", &nUserMaps, 0, 0)) != NULL) { for (i = 0; i < nUserMaps - 1; i++) { @@ -371,7 +371,7 @@ SV_Kick_f(void) SV_BroadcastPrintf(PRINT_HIGH, "%s was kicked\n", sv_client->name); } - /* print directly, because the dropped client + /* print directly, because the dropped client won't get the SV_BroadcastPrintf message */ SV_ClientPrintf(sv_client, PRINT_HIGH, "You were kicked from the game\n"); SV_DropClient(sv_client); @@ -564,8 +564,8 @@ SV_ServerRecord_f(void) return; } - if (strstr(Cmd_Argv(1), "..") || - strstr(Cmd_Argv(1), "/") || + if (strstr(Cmd_Argv(1), "..") || + strstr(Cmd_Argv(1), "/") || strstr(Cmd_Argv(1), "\\")) { Com_Printf("Illegal filename.\n");