diff --git a/config/menus.cfg b/config/menus.cfg index a66ada7a..4111cf08 100755 --- a/config/menus.cfg +++ b/config/menus.cfg @@ -100,8 +100,8 @@ gencrosshairs "default.png cube.png dot.png dot_wide.png o.png o_dot.png o_x.png newmenu multiplayer -menuitem "Join Game" "servermenu" -menuitem "Update Servers" "updatefrommaster" +menuitem "Join Game" "showmenu server" +menuitem "Update Servers" "updatefrommaster;showmenu server" menuitem "Vote" "showmenu gamemode" menuitem "Disconnect" "disconnect" @@ -538,4 +538,4 @@ menuitem "addpath2way2" menuitem "delpath1way1" menuitem "delpath1way2" menuitem "delpath2way1" -menuitem "delpath2way2" \ No newline at end of file +menuitem "delpath2way2" diff --git a/source/src/main.cpp b/source/src/main.cpp index 23b3ea15..fe11d55d 100644 --- a/source/src/main.cpp +++ b/source/src/main.cpp @@ -253,13 +253,13 @@ int main(int argc, char **argv) initsound(); log("cfg"); - extern void *scoremenu, *teammenu, *servmenu, *ctfmenu, *kickmenu, *banmenu; - scoremenu = addmenu("frags\tpj\tping\tname\tcn", false, false, renderscores); - teammenu = addmenu("frags\tpj\tping\tteam\tname\tcn", false, false, renderscores); - servmenu = addmenu("ping\tplr\tserver", true, false, refreshservers); - ctfmenu = addmenu("flags\tfrags\tpj\tping\tteam\tname\tcn", false, false, renderscores); - kickmenu = addmenu("kick player", true, false); - banmenu = addmenu("ban player", true, false); + extern void *scoremenu, *teammenu, *ctfmenu, *servmenu, *kickmenu, *banmenu; + scoremenu = addmenu("score", "frags\tpj\tping\tname\tcn", false, renderscores); + teammenu = addmenu("team score", "frags\tpj\tping\tteam\tname\tcn", false, renderscores); + ctfmenu = addmenu("ctf score", "flags\tfrags\tpj\tping\tteam\tname\tcn", false, renderscores); + servmenu = addmenu("server", "ping\tplr\tserver", true, refreshservers); + kickmenu = addmenu("kick player"); + banmenu = addmenu("ban player"); persistidents = false; exec("config/keymap.cfg"); diff --git a/source/src/menus.cpp b/source/src/menus.cpp index e2a1ff5e..5e4fe127 100644 --- a/source/src/menus.cpp +++ b/source/src/menus.cpp @@ -6,14 +6,14 @@ struct mitem { char *text, *action, *hoveraction; }; struct gmenu { - char *name; + char *name, *title; vector items; int mwidth; int menusel; char *mdl; // (optional) md2 mdl int anim, rotspeed, scale; - bool allowinput, hastitle; - void (__cdecl *refreshfunc)(); + bool allowinput, inited; + void (__cdecl *refreshfunc)(bool); }; hashtable menus; @@ -23,10 +23,14 @@ vector menustack; void menuset(void *m) { + if(curmenu==m) return; curmenu = (gmenu *)m; - if(!curmenu) return; - if(curmenu->allowinput) player1->stopmoving(); - else curmenu->menusel = 0; + if(curmenu) + { + curmenu->inited = false; + if(curmenu->allowinput) player1->stopmoving(); + else curmenu->menusel = 0; + } } void showmenu(char *name) @@ -67,10 +71,16 @@ bool rendermenu() setscope(false); gmenu &m = *curmenu; - if(m.refreshfunc) (*m.refreshfunc)(); - s_sprintfd(title)(m.hastitle ? "[ %s menu ]" : "%s", m.name); + if(m.refreshfunc) + { + (*m.refreshfunc)(!m.inited); + m.inited = true; + if(m.menusel>=m.items.length()) m.menusel = max(m.items.length()-1, 0); + } + char *title = m.title; + if(!title) { static string buf; s_sprintf(buf)("[ %s menu ]", m.name); title = buf; } int offset = m.menusel - (m.menusel%MAXMENU), mdisp = min(m.items.length(), MAXMENU), cdisp = min(m.items.length()-offset, MAXMENU); - if(!m.hastitle) text_startcolumns(); + if(m.title) text_startcolumns(); int w = 0; loopv(m.items) { @@ -100,7 +110,7 @@ bool rendermenu() draw_text(m.items[offset+j].text, x, y); y += step; } - if(!m.hastitle) text_endcolumns(); + if(m.title) text_endcolumns(); return true; } @@ -139,15 +149,16 @@ void rendermenumdl() glPopMatrix(); } -void *addmenu(char *name, bool allowinput, bool hastitle, void (__cdecl *refreshfunc)()) +void *addmenu(char *name, char *title, bool allowinput, void (__cdecl *refreshfunc)(bool)) { name = newstring(name); gmenu &menu = menus[name]; menu.name = name; + menu.title = title ? newstring(title) : NULL; menu.menusel = 0; menu.mdl = NULL; menu.allowinput = allowinput; - menu.hastitle = hastitle; + menu.inited = false; menu.refreshfunc = refreshfunc; lastmenu = &menu; return &menu; @@ -205,10 +216,29 @@ COMMAND(newmenu, ARG_1STR); COMMAND(menumdl, ARG_5STR); COMMAND(chmenumdl, ARG_6STR); +void menuselect(void *menu, int sel) +{ + gmenu &m = *(gmenu *)menu; + + if(sel<0) sel = m.items.length()>0 ? m.items.length()-1 : 0; + else if(sel>=m.items.length()) sel = 0; + + if(m.items.inrange(sel)) + { + int oldsel = m.menusel; + m.menusel = sel; + if(m.allowinput) + { + char *haction = m.items[sel].hoveraction; + if(sel!=oldsel && haction) execute(haction); + } + } +} + bool menukey(int code, bool isdown) { if(!curmenu) return false; - int n = curmenu->items.length(), menusel = curmenu->menusel, oldmenusel = menusel; + int n = curmenu->items.length(), menusel = curmenu->menusel; if(isdown) { if(code==SDLK_PAGEUP) menusel -= MAXMENU; @@ -229,17 +259,7 @@ bool menukey(int code, bool isdown) else if(code==SDLK_UP || code==-4) menusel--; else if(code==SDLK_DOWN || code==-5) menusel++; - if(menusel<0) menusel = n>0 ? n-1 : 0; - else if(menusel>=n) menusel = 0; - if(curmenu->items.inrange(menusel)) - { - curmenu->menusel = menusel; - if(curmenu->allowinput) - { - char *haction = curmenu->items[menusel].hoveraction; - if(menusel!=oldmenusel && haction) execute(haction); - } - } + menuselect(curmenu, menusel); } else { diff --git a/source/src/protos.h b/source/src/protos.h index 1ba79c00..e129e3cd 100644 --- a/source/src/protos.h +++ b/source/src/protos.h @@ -29,16 +29,17 @@ extern void conoutf(const char *s, ...); extern bool rendermenu(); extern void menumanual(void *menu, int n, char *text, char *action=NULL); extern bool menukey(int code, bool isdown); -extern void *addmenu(char *name, bool allowinput = true, bool hastitle = true, void (__cdecl *refreshfunc)() = NULL); +extern void *addmenu(char *name, char *title = NULL, bool allowinput = true, void (__cdecl *refreshfunc)(bool) = NULL); extern void rendermenumdl(); extern void menuset(void *m); +extern void menuselect(void *menu, int sel); // serverbrowser extern void addserver(char *servername); extern char *getservername(int n); extern bool resolverwait(const char *name, ENetAddress *address); extern void writeservercfg(); -extern void refreshservers(); +extern void refreshservers(bool init); // rendergl extern void gl_init(int w, int h, int bpp, int depth, int fsaa); @@ -137,7 +138,7 @@ extern void mastercommand(int cmd, int arg1); // scoreboard extern void showscores(bool on); -extern void renderscores(); +extern void renderscores(bool init); // world extern void setupworld(int factor); diff --git a/source/src/scoreboard.cpp b/source/src/scoreboard.cpp index a7e8e617..86c57e6d 100644 --- a/source/src/scoreboard.cpp +++ b/source/src/scoreboard.cpp @@ -67,7 +67,7 @@ void addteamscore(playerent *d) teamscores.add(teamscore(d->team, d->frags, m_ctf ? d->flagscore : 0)); } -void renderscores() +void renderscores(bool init) { void *menu = m_ctf ? ctfmenu : (m_teammode ? teammenu : scoremenu); scorelines.setsize(0); @@ -78,6 +78,12 @@ void renderscores() scores.sort(scorecmp); loopv(scores) renderscore(menu, scores[i], scores[i]->clientnum); + if(init) + { + int sel = scores.find(player1); + if(sel>=0) menuselect(menu, sel); + } + if(m_teammode) { menumanual(menu, scorelines.length(), ""); diff --git a/source/src/serverbrowser.cpp b/source/src/serverbrowser.cpp index 0d1bf7cf..7dd53913 100644 --- a/source/src/serverbrowser.cpp +++ b/source/src/serverbrowser.cpp @@ -321,13 +321,23 @@ int sicompare(const serverinfo *a, const serverinfo *b) void *servmenu = NULL; -void refreshservers() +void refreshservers(bool init) { + if(init) + { + if(pingsock == ENET_SOCKET_NULL) + { + pingsock = enet_socket_create(ENET_SOCKET_TYPE_DATAGRAM, NULL); + resolverinit(); + } + resolverclear(); + loopv(servers) resolverquery(servers[i].name); + } + checkresolver(); checkpings(); if(lastmillis - lastinfo >= 5000) pingservers(); servers.sort(sicompare); - int maxmenu = 16; loopv(servers) { serverinfo &si = servers[i]; @@ -343,23 +353,9 @@ void refreshservers() si.full[50] = 0; // cut off too long server descriptions s_sprintf(si.cmd)("connect %s", si.name); menumanual(servmenu, i, si.full, si.cmd); - if(!--maxmenu) return; } } -void servermenu() -{ - if(pingsock == ENET_SOCKET_NULL) - { - pingsock = enet_socket_create(ENET_SOCKET_TYPE_DATAGRAM, NULL); - resolverinit(); - } - resolverclear(); - loopv(servers) resolverquery(servers[i].name); - refreshservers(); - menuset(servmenu); -} - void updatefrommaster() { const int MAXUPD = 32000; @@ -372,11 +368,9 @@ void updatefrommaster() servers.setsize(0); execute((char *)reply); } - servermenu(); } COMMAND(addserver, ARG_1STR); -COMMAND(servermenu, ARG_NONE); COMMAND(updatefrommaster, ARG_NONE); void writeservercfg()