X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=blobdiff_plain;f=qcsrc%2Fclient%2Fhud%2Fpanel%2Fquickmenu.qc;h=0b9c102f7908d830c1a137b9bdb059cee64ce521;hp=2b2f8ad0db779b54dc80e70a525e173ff87d34b6;hb=991de5e6922cd3c283de56c3249624f0f1bfe767;hpb=ae104b5ca1b2fccc934cfda6e562029858186975 diff --git a/qcsrc/client/hud/panel/quickmenu.qc b/qcsrc/client/hud/panel/quickmenu.qc index 2b2f8ad0d..0b9c102f7 100644 --- a/qcsrc/client/hud/panel/quickmenu.qc +++ b/qcsrc/client/hud/panel/quickmenu.qc @@ -4,6 +4,7 @@ #include #include #include +#include #include #include @@ -43,32 +44,35 @@ float QuickMenu_TimeOut; // if s1 is not empty s will be displayed as command otherwise as submenu void QuickMenu_Page_LoadEntry(int i, string s, string s1) { - TC(int, i); - //printf("^xc80 entry %d: %s, %s\n", i, s, s1); - if (QuickMenu_Page_Description[i]) - strunzone(QuickMenu_Page_Description[i]); - QuickMenu_Page_Description[i] = strzone(s); - if (QuickMenu_Page_Command[i]) - strunzone(QuickMenu_Page_Command[i]); - QuickMenu_Page_Command[i] = strzone(s1); + TC(int, i); + //LOG_INFOF("^xc80 entry %d: %s, %s\n", i, s, s1); + strcpy(QuickMenu_Page_Description[i], s); + strcpy(QuickMenu_Page_Command[i], s1); } void QuickMenu_Page_ClearEntry(int i) { - TC(int, i); - if (QuickMenu_Page_Description[i]) - strunzone(QuickMenu_Page_Description[i]); - QuickMenu_Page_Description[i] = string_null; - if (QuickMenu_Page_Command[i]) - strunzone(QuickMenu_Page_Command[i]); - QuickMenu_Page_Command[i] = string_null; + TC(int, i); + strfree(QuickMenu_Page_Description[i]); + strfree(QuickMenu_Page_Command[i]); QuickMenu_Page_Command_Type[i] = 0; } -float QuickMenu_Page_Load(string target_submenu, float new_page); -void QuickMenu_Default(string submenu); +bool HUD_QuickMenu_Forbidden() +{ + return (mv_active + || (hud_configure_prev && hud_configure_prev != -1) + || HUD_MinigameMenu_IsOpened() + || (QuickMenu_TimeOut && time > QuickMenu_TimeOut)); +} + +// returns true if succeded, false otherwise bool QuickMenu_Open(string mode, string submenu, string file) { + QuickMenu_TimeOut = 0; + if (HUD_QuickMenu_Forbidden()) + return false; + int fh = -1; string s; @@ -83,7 +87,7 @@ bool QuickMenu_Open(string mode, string submenu, string file) if(mode == "file") { if(file == "" || file == "0") - LOG_INFO("No file name is set in hud_panel_quickmenu_file, loading default quickmenu\n"); + LOG_INFO("No file name is set in hud_panel_quickmenu_file, loading default quickmenu"); else { fh = fopen(file, FILE_READ); @@ -115,7 +119,7 @@ bool QuickMenu_Open(string mode, string submenu, string file) while((s = fgets(fh)) && QuickMenu_Buffer_Size < QUICKMENU_BUFFER_MAXENTRIES) { // first skip invalid entries, so we don't check them anymore - float argc; + int argc; argc = tokenize_console(s); if(argc == 0 || argv(0) == "") continue; @@ -176,9 +180,6 @@ bool QuickMenu_Open(string mode, string submenu, string file) else QuickMenu_Page_Load("", 0); - hud_panel_quickmenu = 1; - if(autocvar_hud_cursormode) - setcursormode(1); hudShiftState = 0; QuickMenu_TimeOut = ((autocvar_hud_panel_quickmenu_time > 0) ? time + autocvar_hud_panel_quickmenu_time : 0); @@ -197,38 +198,30 @@ void QuickMenu_Buffer_Close() void QuickMenu_Close() { - if (QuickMenu_CurrentSubMenu) - strunzone(QuickMenu_CurrentSubMenu); - QuickMenu_CurrentSubMenu = string_null; + strfree(QuickMenu_CurrentSubMenu); int i; for (i = 0; i < QUICKMENU_MAXLINES; ++i) QuickMenu_Page_ClearEntry(i); QuickMenu_Page_Entries = 0; - hud_panel_quickmenu = 0; mouseClicked = 0; prevMouseClicked = 0; QuickMenu_Buffer_Close(); - - if(autocvar_hud_cursormode) - if(!mv_active) - setcursormode(0); } // It assumes submenu open tag is already detected void QuickMenu_skip_submenu(string submenu) { - string s, z_submenu; - z_submenu = strzone(submenu); + string z_submenu = string_null; strcpy(z_submenu, submenu); for(++QuickMenu_Buffer_Index ; QuickMenu_Buffer_Index < QuickMenu_Buffer_Size; ++QuickMenu_Buffer_Index) { - s = QuickMenu_Buffer_Get(); + string s = QuickMenu_Buffer_Get(); if(substring(s, 0, 1) != QM_TAG_SUBMENU) continue; if(substring(s, 1, -1) == z_submenu) // submenu end break; QuickMenu_skip_submenu(substring(s, 1, -1)); } - strunzone(z_submenu); + strfree(z_submenu); } bool QuickMenu_IsOpened() @@ -236,10 +229,9 @@ bool QuickMenu_IsOpened() return (QuickMenu_Page_Entries > 0); } -void HUD_Quickmenu_PlayerListEntries(string cmd, int teamplayers, bool without_me); bool HUD_Quickmenu_PlayerListEntries_Create(string cmd, int teamplayers, bool without_me) { - TC(int, teamplayers); TC(bool, without_me); + TC(int, teamplayers); TC(bool, without_me); int i; for(i = 0; i < QUICKMENU_MAXLINES; ++i) QuickMenu_Page_ClearEntry(i); @@ -264,18 +256,17 @@ bool HUD_Quickmenu_PlayerListEntries_Create(string cmd, int teamplayers, bool wi int QuickMenu_Buffer_Index_Prev; bool QuickMenu_Page_Load(string target_submenu, bool new_page) { - TC(bool, new_page); + TC(bool, new_page); string s = string_null, cmd = string_null, z_submenu; + QuickMenu_Page_ActivatedEntry = -1; if (new_page == 0) QuickMenu_Page = 0; else ++QuickMenu_Page; z_submenu = strzone(target_submenu); - if (QuickMenu_CurrentSubMenu) - strunzone(QuickMenu_CurrentSubMenu); - QuickMenu_CurrentSubMenu = strzone(z_submenu); + strcpy(QuickMenu_CurrentSubMenu, z_submenu); QuickMenu_IsLastPage = true; QuickMenu_Page_Entries = 0; @@ -289,11 +280,11 @@ bool QuickMenu_Page_Load(string target_submenu, bool new_page) s = QuickMenu_Buffer_Get(); if(substring(s, 0, 1) == QM_TAG_SUBMENU && substring(s, 1, -1) == z_submenu) { - // printf("^3 beginning of %s\n", z_submenu); + //LOG_INFOF("^3 beginning of %s\n", z_submenu); ++QuickMenu_Buffer_Index; break; // target_submenu found! } - // printf("^1 skipping %s\n", s); + //LOG_INFOF("^1 skipping %s\n", s); } if(QuickMenu_Buffer_Index == QuickMenu_Buffer_Size) LOG_WARNF("Couldn't find submenu \"%s\"", z_submenu); @@ -310,7 +301,7 @@ bool QuickMenu_Page_Load(string target_submenu, bool new_page) if(z_submenu != "" && substring(s, 1, -1) == z_submenu) { - // printf("^3 end of %s\n", z_submenu); + //LOG_INFOF("^3 end of %s\n", z_submenu); break; } @@ -335,28 +326,32 @@ bool QuickMenu_Page_Load(string target_submenu, bool new_page) QuickMenu_Page_LoadEntry(QuickMenu_Page_Entries, substring(s, 1, -1), ""); QuickMenu_skip_submenu(substring(s, 1, -1)); } - else if(entry_num >= first_entry && substring(s, 0, 1) == QM_TAG_TITLE) + else if(substring(s, 0, 1) == QM_TAG_TITLE) { ++QuickMenu_Buffer_Index; - cmd = QuickMenu_Buffer_Get(); - string command_code = substring(cmd, 0, 1); - if(command_code == QM_TAG_COMMAND) - cmd = substring(cmd, 1, -1); - else if(command_code == QM_TAG_PLCOMMAND) + if(entry_num >= first_entry) { - // throw away the current quickmenu buffer and load a new one - cmd = substring(cmd, 1, -1); - strunzone(z_submenu); - if(HUD_Quickmenu_PlayerListEntries_Create(cmd, stof(substring(s, 1, 1)), stof(substring(s, 2, 1)))) - return QuickMenu_Page_Load("", 0); - QuickMenu_Close(); - return false; - } + cmd = QuickMenu_Buffer_Get(); + string command_code = substring(cmd, 0, 1); + if(command_code == QM_TAG_COMMAND) + cmd = substring(cmd, 1, -1); + else if(command_code == QM_TAG_PLCOMMAND) + { + // throw away the current quickmenu buffer and load a new one + cmd = substring(cmd, 1, -1); + strunzone(z_submenu); + if(HUD_Quickmenu_PlayerListEntries_Create(cmd, stof(substring(s, 1, 1)), stof(substring(s, 2, 1)))) + return QuickMenu_Page_Load("", 0); + QuickMenu_Close(); + return false; + } + + tokenize_console(cmd); + QuickMenu_Page_Command_Type[QuickMenu_Page_Entries] = (argv(1) && argv(0) == "toggle"); - tokenize_console(cmd); - QuickMenu_Page_Command_Type[QuickMenu_Page_Entries] = (argv(1) && argv(0) == "toggle"); + QuickMenu_Page_LoadEntry(QuickMenu_Page_Entries, substring(s, 1, -1), cmd); + } - QuickMenu_Page_LoadEntry(QuickMenu_Page_Entries, substring(s, 1, -1), cmd); } ++entry_num; @@ -373,7 +368,7 @@ bool QuickMenu_Page_Load(string target_submenu, bool new_page) bool QuickMenu_ActionForNumber(int num) { - TC(int, num); + TC(int, num); if (!QuickMenu_IsLastPage) { if (num < 0 || num >= QUICKMENU_MAXLINES) @@ -390,6 +385,7 @@ bool QuickMenu_ActionForNumber(int num) if (QuickMenu_Page_Command[num] != "") { + QuickMenu_Page_ActivatedEntry_Time = time + 0.1; localcmd(strcat("\n", QuickMenu_Page_Command[num], "\n")); QuickMenu_TimeOut = ((autocvar_hud_panel_quickmenu_time > 0) ? time + autocvar_hud_panel_quickmenu_time : 0); return true; @@ -401,9 +397,8 @@ bool QuickMenu_ActionForNumber(int num) void QuickMenu_Page_ActiveEntry(int entry_num) { - TC(int, entry_num); + TC(int, entry_num); QuickMenu_Page_ActivatedEntry = entry_num; - QuickMenu_Page_ActivatedEntry_Time = time + 0.1; if(QuickMenu_Page_Command[QuickMenu_Page_ActivatedEntry]) { bool f = QuickMenu_ActionForNumber(QuickMenu_Page_ActivatedEntry); @@ -419,7 +414,7 @@ void QuickMenu_Page_ActiveEntry(int entry_num) bool QuickMenu_InputEvent(int bInputType, float nPrimary, float nSecondary) { - TC(int, bInputType); + TC(int, bInputType); // we only care for keyboard events if(bInputType == 2) return false; @@ -499,9 +494,6 @@ void QuickMenu_Mouse() return; } - if (!autocvar_hud_cursormode) - update_mousepos(); - panel = HUD_PANEL(QUICKMENU); HUD_Panel_LoadCvars(); @@ -519,28 +511,27 @@ void QuickMenu_Mouse() if (mousepos.x >= panel_pos.x && mousepos.y >= first_entry_pos && mousepos.x <= panel_pos.x + panel_size.x && mousepos.y <= first_entry_pos + entries_height) { - float entry_num; - entry_num = floor((mousepos.y - first_entry_pos) / fontsize.y); + int entry_num = min(QuickMenu_Page_Entries - 1, floor((mousepos.y - first_entry_pos) / fontsize.y)); if (QuickMenu_IsLastPage || entry_num != QUICKMENU_MAXLINES - 2) { - panel_pos.y = first_entry_pos + entry_num * fontsize.y; - vector color; - if(mouseClicked & S_MOUSE1) - color = '0.5 1 0.5'; - else if(hudShiftState & S_CTRL) - color = '1 1 0.3'; - else - color = '1 1 1'; - drawfill(panel_pos, vec2(panel_size.x, fontsize.y), color, .2, DRAWFLAG_NORMAL); - if(!mouseClicked && (prevMouseClicked & S_MOUSE1)) QuickMenu_Page_ActiveEntry((entry_num < QUICKMENU_MAXLINES - 1) ? entry_num + 1 : 0); + + if (time > QuickMenu_Page_ActivatedEntry_Time) + { + vector entry_pos = panel_pos; + entry_pos.y = first_entry_pos + entry_num * fontsize.y; + vector color; + if (mouseClicked & S_MOUSE1) + color = '0.5 1 0.5'; + else if (hudShiftState & S_CTRL) + color = '1 1 0.3'; + else + color = '1 1 1'; + drawfill(entry_pos, vec2(panel_size.x, fontsize.y), color, .2, DRAWFLAG_NORMAL); + } } } - - draw_cursor_normal(mousepos, '1 1 1', 0.8); - - prevMouseClicked = mouseClicked; } void HUD_Quickmenu_DrawEntry(vector pos, string desc, string option, vector fontsize) @@ -583,16 +574,10 @@ void HUD_QuickMenu() { if(!autocvar__hud_configure) { - if (hud_configure_prev && hud_configure_prev != -1) - QuickMenu_Close(); - - if(!hud_draw_maximized) return; - if(mv_active) return; - //if(!autocvar_hud_panel_quickmenu) return; - if(!hud_panel_quickmenu) return; + if (!hud_draw_maximized || !QuickMenu_IsOpened()) + return; - if(QuickMenu_TimeOut) - if(time > QuickMenu_TimeOut) + if (HUD_QuickMenu_Forbidden()) { QuickMenu_Close(); return; @@ -683,8 +668,7 @@ void HUD_QuickMenu() } HUD_Quickmenu_DrawEntry(panel_pos, sprintf("%d: %s%s", i, color, QuickMenu_Page_Description[i]), option, fontsize); - if(QuickMenu_Page_ActivatedEntry_Time && time < QuickMenu_Page_ActivatedEntry_Time - && QuickMenu_Page_ActivatedEntry == i) + if (time < QuickMenu_Page_ActivatedEntry_Time && QuickMenu_Page_ActivatedEntry == i) drawfill(panel_pos, vec2(panel_size.x, fontsize.y), '0.5 1 0.5', .2, DRAWFLAG_NORMAL); panel_pos.y += fontsize.y; @@ -760,7 +744,7 @@ void HUD_QuickMenu() void HUD_Quickmenu_PlayerListEntries(string cmd, int teamplayers, bool without_me) { - TC(int, teamplayers); TC(bool, without_me); + TC(int, teamplayers); TC(bool, without_me); entity pl; if(teamplayers && !team_count) return; @@ -795,9 +779,12 @@ void QuickMenu_Default(string target_submenu) string tc_cmd; QUICKMENU_SMENU(_("Chat"), "Chat") + QUICKMENU_SMENU_PL(CTX(_("QMCMD^Send public message to")), "Send public message to", "commandmode say %s:^7", 0, 1) QUICKMENU_ENTRY_TC(CTX(_("QMCMD^nice one")), "say %s", ":-) / nice one", CTX(_("QMCMD^:-) / nice one"))) QUICKMENU_ENTRY_TC(CTX(_("QMCMD^good game")), "say %s", "good game", CTX(_("QMCMD^good game"))) QUICKMENU_ENTRY_TC(CTX(_("QMCMD^hi / good luck")), "say %s", "hi / good luck and have fun", CTX(_("QMCMD^hi / good luck and have fun"))) + if(prvm_language != "en") + QUICKMENU_ENTRY(CTX(_("QMCMD^Send in English")), "toggle hud_panel_quickmenu_translatecommands 0 1; quickmenu; wait; quickmenu default Chat") QUICKMENU_SMENU(_("Chat"), "Chat") if(teamplay) @@ -858,8 +845,6 @@ void QuickMenu_Default(string target_submenu) } QUICKMENU_ENTRY(CTX(_("QMCMD^Fullscreen")), "toggle vid_fullscreen; vid_restart") - if(prvm_language != "en") - QUICKMENU_ENTRY(CTX(_("QMCMD^Translate chat messages")), "toggle hud_panel_quickmenu_translatecommands") QUICKMENU_SMENU(CTX(_("QMCMD^Settings")), "Settings") QUICKMENU_SMENU(CTX(_("QMCMD^Call a vote")), "Call a vote") @@ -876,9 +861,9 @@ void QuickMenu_Default(string target_submenu) if(target_submenu != "" && !target_submenu_found) { - LOG_WARNF("Couldn't find submenu \"%s\"", target_submenu); + LOG_INFOF("Couldn't find submenu \"%s\"", target_submenu); if(prvm_language != "en") - LOG_WARNF("^3Warning: submenu must be in English", target_submenu); + LOG_INFOF("^3Warning: submenu title must be in English", target_submenu); QuickMenu_Buffer_Size = 0; } }