X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fmenu%2Fmenu.qc;h=8bff8c4c67eec298b31f2ea589872a23575e6069;hb=90ac5f4f1f4aa420546283c58953f387b82e33ba;hp=9331364108cd5a2cfd17429178a5035c69e7793b;hpb=bbf5a4323eaf9de74aa9b5259dee6a922a0f2cfc;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/menu/menu.qc b/qcsrc/menu/menu.qc index 933136410..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; @@ -675,13 +686,14 @@ void m_tooltip(vector pos) } const int MIN_DISCONNECTION_TIME = 1; -float autocvar_menu_force_on_disconnection; bool autocvar_g_campaign; void m_draw(float width, float height) { 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) @@ -692,10 +704,18 @@ void m_draw(float width, float height) cvar_set("g_campaign", "0"); m_sync(); } - if (autocvar_menu_force_on_disconnection > 0) - m_toggle(true); + + // 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 @@ -717,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(); @@ -894,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 @@ -910,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)