*** empty log message ***
git-svn-id: svn://svn.code.sf.net/p/actiongame/code/trunk/ac@919 e016b1c5-ed68-44aa-a2f7-31cac88cffde
This commit is contained in:
+3
-3
@@ -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"
|
||||
menuitem "delpath2way2"
|
||||
|
||||
+7
-7
@@ -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");
|
||||
|
||||
+44
-24
@@ -6,14 +6,14 @@ struct mitem { char *text, *action, *hoveraction; };
|
||||
|
||||
struct gmenu
|
||||
{
|
||||
char *name;
|
||||
char *name, *title;
|
||||
vector<mitem> 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<char *, gmenu> menus;
|
||||
@@ -23,10 +23,14 @@ vector<gmenu *> 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
|
||||
{
|
||||
|
||||
+4
-3
@@ -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);
|
||||
|
||||
@@ -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(), "");
|
||||
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user