X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;ds=sidebyside;f=qcsrc%2Fmenu%2Fmenu.qc;h=9331364108cd5a2cfd17429178a5035c69e7793b;hb=HEAD;hp=f374b0a10b2ec780c1252e1afc5ef348c0fe0b35;hpb=415aa53e6a5e50a97d95e14f48fb3589f04f64d5;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/menu/menu.qc b/qcsrc/menu/menu.qc index f374b0a10..8bff8c4c6 100644 --- a/qcsrc/menu/menu.qc +++ b/qcsrc/menu/menu.qc @@ -17,6 +17,7 @@ #include "xonotic/util.qh" +#include #include #include #include @@ -30,9 +31,13 @@ float menuAlpha; float menuLogoAlpha; float prevMenuAlpha; bool menuInitialized; -bool menuNotTheFirstFrame; int menuMouseMode; +// Used for having effects only execute once in main menu, not for every reload +// 0: never been in main menu before. 1: coming back to main menu. 2: in main menu. +int menuNotTheFirstFrame; +bool autocvar_menu_no_music_nor_welcome; + float conwidth_s, conheight_s; float vidwidth_s, vidheight_s, vidpixelheight_s; float realconwidth, realconheight; @@ -72,6 +77,8 @@ void m_init() LOG_TRACEF("^4MQC Build information: ^1%s", WATERMARK); #endif + CheckEngineExtensions(); + // list all game dirs (TEST) if (cvar("developer") > 0) { @@ -83,6 +90,9 @@ void m_init() } } + registercvar("_menu_cmd_closemenu_available", "0", 0); + cvar_set("_menu_cmd_closemenu_available", "1"); + // needs to be done so early because of the constants they create static_init(); static_init_late(); @@ -119,7 +129,8 @@ void UpdateConWidthHeight(float w, float h, float p) { if (w != vidwidth_s || h != vidheight_s || p != vidpixelheight_s) { - if (updateConwidths(w, h, p)) localcmd(sprintf("\nexec %s\n", cvar_string("menu_font_cfg"))); + if (updateConwidths(w, h, p) && menuNotTheFirstFrame) + localcmd(sprintf("\nexec %s\n", cvar_string("menu_font_cfg"))); vidwidth_s = w; vidheight_s = h; vidpixelheight_s = p; @@ -221,6 +232,8 @@ void m_init_delayed() } if (Menu_Active) m_display(); // delayed menu display + + cvar_set("_menu_initialized", "2"); } void m_keyup(float key, float ascii) @@ -672,14 +685,16 @@ void m_tooltip(vector pos) } } -float autocvar_menu_force_on_disconnection; +const int MIN_DISCONNECTION_TIME = 1; bool autocvar_g_campaign; void m_draw(float width, float height) { - if (autocvar_menu_force_on_disconnection > 0) + static float connected_time; + if (clientstate() == CS_DISCONNECTED) { - static float connected_time; - if (clientstate() == CS_DISCONNECTED) + // avoid a bug where the main menu re-opens when changing maps + // potentially exclusive to `map ` cmd? + if (connected_time && time - connected_time > MIN_DISCONNECTION_TIME) { if (autocvar_g_campaign) { @@ -689,15 +704,22 @@ void m_draw(float width, float height) cvar_set("g_campaign", "0"); m_sync(); } - if (connected_time && time - connected_time > autocvar_menu_force_on_disconnection) - { - m_toggle(true); - connected_time = 0; - } + + // reload the menu so that disconnecting players don't + // have to press ESC to open it again + m_toggle(true); + + localcmd("\nmenu_cmd directmenu Welcome RESET\n"); + connected_time = 0; + + // reset main menu + // FIXME?: find out if anything should be done to reset it more, + // this is just a fix to make main menu music replay nicely + menuNotTheFirstFrame = 1; } - else - connected_time = time; } + else + connected_time = time; m_gamestatus(); @@ -715,18 +737,24 @@ void m_draw(float width, float height) m_init_delayed(); return; } - if (!menuNotTheFirstFrame) + + if (menuNotTheFirstFrame == 0) // only fade the menu in once ever + menuLogoAlpha = -0.8; // no idea why, but when I start this at zero, it jumps instead of fading FIXME + + if (menuNotTheFirstFrame <= 1) // only once per menu reload { - menuNotTheFirstFrame = true; - if (Menu_Active && !cvar("menu_video_played")) - { - localcmd("cd loop $menu_cdtrack\n"); - // TODO: use this when we have a welcome sound - //localcmd("cd loop $menu_cdtrack; play sound/announcer/default/welcome.wav\n"); - menuLogoAlpha = -0.8; // no idea why, but when I start this at zero, it jumps instead of fading FIXME - } - // ALWAYS set this cvar; if we start but menu is not active, this means we want no background music! - localcmd("set menu_video_played 1\n"); + if (Menu_Active && !autocvar_menu_no_music_nor_welcome) + { + localcmd("cd loop $menu_cdtrack\n"); + + // TODO: enable this when we have a welcome sound + // FIXME: change the file used according to the selected announcer + // Only play the welcome announcement once, not on any menu reloads + //if (menuNotTheFirstFrame == 0) + //localcmd("play sound/announcer/default/welcome.wav\n"); + } + + menuNotTheFirstFrame = 2; } float t = gettime(); @@ -892,6 +920,10 @@ void m_toggle(int mode) if (Menu_Active) { if (mode == 1) return; + // when togglemenu is called without arguments (mode is -1) + // the menu is closed only when connected + if (mode == -1 && !(gamestatus & GAME_CONNECTED)) return; + // togglemenu 0 always closes the menu m_hide(); } else @@ -908,6 +940,7 @@ void Shutdown() if (it.classname == "vtbl") continue; it.destroy(it); }); + cvar_set("_menu_cmd_closemenu_available", "0"); } void m_focus_item_chain(entity outermost, entity innermost) @@ -969,12 +1002,16 @@ void m_goto(string itemname) if (gamestatus & (GAME_ISSERVER | GAME_CONNECTED)) { m_hide(); + return; } - else - { - m_activate_window(main.mainNexposee); - m_display(); - } + itemname = "nexposee"; + } + + if (itemname == "nexposee") + { + // unlike 'togglemenu 1', this closes modal and root dialogs if opened + m_activate_window(main.mainNexposee); + m_display(); } else {