|
|
@ -104,18 +104,28 @@ gamesrv_getserver ()
|
|
|
|
keypressed = 1;
|
|
|
|
keypressed = 1;
|
|
|
|
ds = 1;
|
|
|
|
ds = 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (keys[SDLK_RETURN] && (!keypressed)) {
|
|
|
|
if (keys[SDLK_RETURN] && (!keypressed)) {
|
|
|
|
if (menuselect == 0 && !gserv) {
|
|
|
|
if (menuselect == 0 && !gserv) {
|
|
|
|
gserv = 1;
|
|
|
|
gserv = 1;
|
|
|
|
if (gamesrv_startudp () == -1)
|
|
|
|
if (gamesrv_startudp () == -1)
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
gamesrv_browse (1);
|
|
|
|
gamesrv_browse (1);
|
|
|
|
} else done=1;
|
|
|
|
}
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
done = 1;
|
|
|
|
keypressed = 1;
|
|
|
|
keypressed = 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (keys[SDLK_F3] && (!keypressed) && gserv && menuselect > 0 && menuselect < 10) {
|
|
|
|
|
|
|
|
gamesrv_browse (0);
|
|
|
|
|
|
|
|
i = menuselect - 1;
|
|
|
|
|
|
|
|
gamesrv_playerinfo (gse);
|
|
|
|
|
|
|
|
gamesrv_browse (1);
|
|
|
|
|
|
|
|
i++;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (event.type == SDL_KEYUP)
|
|
|
|
if (event.type == SDL_KEYUP)
|
|
|
|
keypressed = 0;
|
|
|
|
keypressed = 0;
|
|
|
|
else if (event.type == SDL_KEYDOWN)
|
|
|
|
else if (event.type == SDL_KEYDOWN)
|
|
|
@ -140,8 +150,7 @@ gamesrv_getserver ()
|
|
|
|
if (menuselect > 0 && menuselect < 10) {
|
|
|
|
if (menuselect > 0 && menuselect < 10) {
|
|
|
|
i = (menuselect - 1);
|
|
|
|
i = (menuselect - 1);
|
|
|
|
if (gse[i].name[0] != 0 && gse[i].host[0] != 0 && gse[i].port[0] != 0 &&
|
|
|
|
if (gse[i].name[0] != 0 && gse[i].host[0] != 0 && gse[i].port[0] != 0 &&
|
|
|
|
(gse[i].state == GS_wait || gse[i].state == GS_running
|
|
|
|
(gse[i].state == GS_wait || gse[i].state == GS_running || gse[i].state == GS_ready)) {
|
|
|
|
|| gse[i].state == GS_ready)) {
|
|
|
|
|
|
|
|
/* add if we are on Linux + and Windows and ai_family == PF_INET */
|
|
|
|
/* add if we are on Linux + and Windows and ai_family == PF_INET */
|
|
|
|
#ifdef _WIN32
|
|
|
|
#ifdef _WIN32
|
|
|
|
if (gse[i].ai_family == PF_INET) {
|
|
|
|
if (gse[i].ai_family == PF_INET) {
|
|
|
@ -150,17 +159,19 @@ gamesrv_getserver ()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#else
|
|
|
|
#else
|
|
|
|
sprintf (bman.servername, "%s:%s", gse[i].host, gse[i].port);
|
|
|
|
sprintf (bman.servername, "%s:%s", gse[i].host, gse[i].port);
|
|
|
|
d_printf("%s xxx %s xxx %s",gse[i].host,gse[i].port,bman.servername);
|
|
|
|
d_printf ("%s xxx %s xxx %s", gse[i].host, gse[i].port, bman.servername);
|
|
|
|
bman.net_ai_family = gse[i].ai_family;
|
|
|
|
bman.net_ai_family = gse[i].ai_family;
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else if (menuselect >= 11 && menuselect < 19)
|
|
|
|
}
|
|
|
|
|
|
|
|
else if (menuselect >= 11 && menuselect < 19)
|
|
|
|
/* User defined Servers */
|
|
|
|
/* User defined Servers */
|
|
|
|
strncpy (bman.servername, bman.serverlist[menuselect - 11].name,
|
|
|
|
strncpy (bman.servername, bman.serverlist[menuselect - 11].name,
|
|
|
|
LEN_SERVERNAME + LEN_PORT + 2);
|
|
|
|
LEN_SERVERNAME + LEN_PORT + 2);
|
|
|
|
else if (menuselect == 20) {
|
|
|
|
else if (menuselect == 20) {
|
|
|
|
/* enter address */
|
|
|
|
/* enter address */
|
|
|
|
menu_get_text ("Enter Address", bman.servername, LEN_SERVERNAME + LEN_PORT + 2);}
|
|
|
|
menu_get_text ("Enter Address", bman.servername, LEN_SERVERNAME + LEN_PORT + 2);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (gserv) {
|
|
|
|
if (gserv) {
|
|
|
@ -200,14 +211,15 @@ gamesrv_getglist ()
|
|
|
|
gse[i].host[0] = 0;
|
|
|
|
gse[i].host[0] = 0;
|
|
|
|
gse[i].port[0] = 0;
|
|
|
|
gse[i].port[0] = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
for (i = 0; i < 10; i++ ) {
|
|
|
|
for (i = 0; i < 10; i++) {
|
|
|
|
menu[i].index = 0;
|
|
|
|
menu[i].index = 0;
|
|
|
|
menu[i].text[0] = 0;
|
|
|
|
menu[i].text[0] = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
sprintf (menu[0].text, "No Games found on Masterserver");
|
|
|
|
sprintf (menu[0].text, "No Games found on Masterserver");
|
|
|
|
menu[0].index = 1;
|
|
|
|
menu[0].index = 1;
|
|
|
|
rebuild = 1;
|
|
|
|
rebuild = 1;
|
|
|
|
if (menuselect<10) menuselect=0;
|
|
|
|
if (menuselect < 10)
|
|
|
|
|
|
|
|
menuselect = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
else {
|
|
|
|
for (pos = buf; pos != 0;) {
|
|
|
|
for (pos = buf; pos != 0;) {
|
|
|
@ -244,19 +256,19 @@ gamesrv_getglist ()
|
|
|
|
for (i = 1; (i - 1 < LEN_GAMENAME) && (pos[i] != 0)
|
|
|
|
for (i = 1; (i - 1 < LEN_GAMENAME) && (pos[i] != 0)
|
|
|
|
&& (pos[i] != '\n'); i++)
|
|
|
|
&& (pos[i] != '\n'); i++)
|
|
|
|
entry.name[i - 1] = pos[i];
|
|
|
|
entry.name[i - 1] = pos[i];
|
|
|
|
entry.name[i-1]=0;
|
|
|
|
entry.name[i - 1] = 0;
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
case ('H'):
|
|
|
|
case ('H'):
|
|
|
|
for (i = 1; (i - 1 < LEN_SERVERNAME) && (pos[i] != 0)
|
|
|
|
for (i = 1; (i - 1 < LEN_SERVERNAME) && (pos[i] != 0)
|
|
|
|
&& (pos[i] != '\n'); i++)
|
|
|
|
&& (pos[i] != '\n'); i++)
|
|
|
|
entry.host[i - 1] = pos[i];
|
|
|
|
entry.host[i - 1] = pos[i];
|
|
|
|
entry.host[i-1]=0;
|
|
|
|
entry.host[i - 1] = 0;
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
case ('O'):
|
|
|
|
case ('O'):
|
|
|
|
for (i = 1; (i - 1 < LEN_PORT) && (pos[i] != 0)
|
|
|
|
for (i = 1; (i - 1 < LEN_PORT) && (pos[i] != 0)
|
|
|
|
&& (pos[i] != '\n'); i++)
|
|
|
|
&& (pos[i] != '\n'); i++)
|
|
|
|
entry.port[i - 1] = pos[i];
|
|
|
|
entry.port[i - 1] = pos[i];
|
|
|
|
entry.port[i-1]=0;
|
|
|
|
entry.port[i - 1] = 0;
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
pos = strchr (pos, '\n');
|
|
|
|
pos = strchr (pos, '\n');
|
|
|
@ -294,7 +306,7 @@ gamesrv_getglist ()
|
|
|
|
gse[nr].version.sub);
|
|
|
|
gse[nr].version.sub);
|
|
|
|
for (y = 0; y < 255; y++)
|
|
|
|
for (y = 0; y < 255; y++)
|
|
|
|
menu[nr + 1].text[y] = 0;
|
|
|
|
menu[nr + 1].text[y] = 0;
|
|
|
|
strncpy (menu[nr + 1].text, txt, strlen(txt));
|
|
|
|
strncpy (menu[nr + 1].text, txt, strlen (txt));
|
|
|
|
rebuild = 1;
|
|
|
|
rebuild = 1;
|
|
|
|
sprintf (menu[0].text, "Games on the Masterserver");
|
|
|
|
sprintf (menu[0].text, "Games on the Masterserver");
|
|
|
|
menu[0].index = 0;
|
|
|
|
menu[0].index = 0;
|
|
|
@ -306,6 +318,85 @@ gamesrv_getglist ()
|
|
|
|
return rebuild;
|
|
|
|
return rebuild;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
|
|
|
gamesrv_playerinfo (struct game_entry *gse)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
char data[511];
|
|
|
|
|
|
|
|
char buf[BUF_SIZE];
|
|
|
|
|
|
|
|
struct _sockaddr addr;
|
|
|
|
|
|
|
|
char host[LEN_SERVERNAME];
|
|
|
|
|
|
|
|
char port[LEN_PORT];
|
|
|
|
|
|
|
|
SDL_Event event;
|
|
|
|
|
|
|
|
int i,
|
|
|
|
|
|
|
|
j,x,y,
|
|
|
|
|
|
|
|
pl,eventstate;
|
|
|
|
|
|
|
|
char *pos;
|
|
|
|
|
|
|
|
_keybinput ki;
|
|
|
|
|
|
|
|
// send request
|
|
|
|
|
|
|
|
sprintf (data, "IH%s\nO%s\n", gse->host, gse->port);
|
|
|
|
|
|
|
|
network_server_port (bman.gamemaster, host, LEN_SERVERNAME, port, LEN_PORT);
|
|
|
|
|
|
|
|
dns_filladdr (host, LEN_SERVERNAME, port, LEN_PORT, bman.net_ai_family, &addr);
|
|
|
|
|
|
|
|
udp_send (sock, data, strlen (data), &addr, bman.net_ai_family);
|
|
|
|
|
|
|
|
d_printf ("Send: %s\n", data);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
i = 0;
|
|
|
|
|
|
|
|
// wait 3 secs for result
|
|
|
|
|
|
|
|
while ((udp_get (sock, buf, BUF_SIZE, &addr, PF_INET) == 0) && (i++ < 300))
|
|
|
|
|
|
|
|
s_delay (10);
|
|
|
|
|
|
|
|
if (i == 300)
|
|
|
|
|
|
|
|
return; // no result
|
|
|
|
|
|
|
|
pos = buf;
|
|
|
|
|
|
|
|
sscanf (pos, "%d", &pl);
|
|
|
|
|
|
|
|
d_printf ("Got %d Players active after %d\n", pl, i );
|
|
|
|
|
|
|
|
if (!pl)
|
|
|
|
|
|
|
|
return; // game not found
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for (j = 0; j < pl; j++) {
|
|
|
|
|
|
|
|
pos++;
|
|
|
|
|
|
|
|
for (i = 1; (i - 1 < LEN_GAMENAME) && (pos[i] != 0)
|
|
|
|
|
|
|
|
&& (pos[i] != '\n'); i++)
|
|
|
|
|
|
|
|
bman.players[j].name[i - 1] = pos[i];
|
|
|
|
|
|
|
|
bman.players[j].name[i - 1] = 0;pos+=i-1;
|
|
|
|
|
|
|
|
d_printf ("Name: %s\n", bman.players[j].name);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
j=pl*font[0].size.y+font[1].size.y+50;
|
|
|
|
|
|
|
|
draw_menubox (400, j);
|
|
|
|
|
|
|
|
x = gfx.res.x / 2;
|
|
|
|
|
|
|
|
y = gfx.res.y / 2 - j / 2;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
sprintf (data, "Players in this game");
|
|
|
|
|
|
|
|
font_setcolor (128,128,0,1);
|
|
|
|
|
|
|
|
font_draw (x - (font[1].size.x * strlen (data) / 2), y, data, 1);
|
|
|
|
|
|
|
|
font_setcolor (255,255,0,1);
|
|
|
|
|
|
|
|
font_draw (1 + x - (font[1].size.x * strlen (data) / 2),1 + y, data, 1);
|
|
|
|
|
|
|
|
y = y + 2 + (font[1].size.y << 1);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for(i=0;i<pl;i++) {
|
|
|
|
|
|
|
|
sprintf (data, "%s", bman.players[i].name);
|
|
|
|
|
|
|
|
font_setcolor (128,128,128,0);
|
|
|
|
|
|
|
|
font_draw (x - (font[0].size.x * strlen (data) / 2), y, data, 0);
|
|
|
|
|
|
|
|
font_setcolor (255,255,255,0);
|
|
|
|
|
|
|
|
font_draw (1 + x - (font[0].size.x * strlen (data) / 2),1 + y, data, 0);
|
|
|
|
|
|
|
|
y = y + 2 + font[0].size.y;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
SDL_Flip (gfx.screen);
|
|
|
|
|
|
|
|
keybinput_new (&ki);
|
|
|
|
|
|
|
|
eventstate=0;
|
|
|
|
|
|
|
|
while (event.type!=SDL_KEYDOWN) {
|
|
|
|
|
|
|
|
eventstate = SDL_WaitEvent (&event);
|
|
|
|
|
|
|
|
if (eventstate != 0)
|
|
|
|
|
|
|
|
switch (event.type) {
|
|
|
|
|
|
|
|
case (SDL_QUIT):
|
|
|
|
|
|
|
|
bman.state = GS_quit;
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
keybinput_loop (&ki, &event);}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int
|
|
|
|
int
|
|
|
|
gamesrv_startudp ()
|
|
|
|
gamesrv_startudp ()
|
|
|
|
{
|
|
|
|
{
|
|
|
@ -419,8 +510,9 @@ gamesrv_quit ()
|
|
|
|
void
|
|
|
|
void
|
|
|
|
gamesrv_sendmode (int maxplayer, int curplayers)
|
|
|
|
gamesrv_sendmode (int maxplayer, int curplayers)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
char data[255];
|
|
|
|
char data[511];
|
|
|
|
int len = 0;
|
|
|
|
int len = 0,
|
|
|
|
|
|
|
|
i;
|
|
|
|
struct _sockaddr addr;
|
|
|
|
struct _sockaddr addr;
|
|
|
|
char host[LEN_SERVERNAME];
|
|
|
|
char host[LEN_SERVERNAME];
|
|
|
|
char port[LEN_PORT];
|
|
|
|
char port[LEN_PORT];
|
|
|
@ -435,18 +527,17 @@ gamesrv_sendmode (int maxplayer, int curplayers)
|
|
|
|
else
|
|
|
|
else
|
|
|
|
sprintf (data, "%sI6\n", data);
|
|
|
|
sprintf (data, "%sI6\n", data);
|
|
|
|
sprintf (data, "%sN%s\n", data, bman.gamename);
|
|
|
|
sprintf (data, "%sN%s\n", data, bman.gamename);
|
|
|
|
|
|
|
|
for (i = 0; i < curplayers; i++)
|
|
|
|
|
|
|
|
sprintf (data, "%sR%s\n", data, bman.players[i].name);
|
|
|
|
len = strlen (data);
|
|
|
|
len = strlen (data);
|
|
|
|
|
|
|
|
|
|
|
|
network_server_port (bman.gamemaster, host, LEN_SERVERNAME, port, LEN_PORT);
|
|
|
|
network_server_port (bman.gamemaster, host, LEN_SERVERNAME, port, LEN_PORT);
|
|
|
|
dns_filladdr (host, LEN_SERVERNAME, port, LEN_PORT, bman.net_ai_family, &addr);
|
|
|
|
dns_filladdr (host, LEN_SERVERNAME, port, LEN_PORT, bman.net_ai_family, &addr);
|
|
|
|
|
|
|
|
|
|
|
|
host[0] = 0;
|
|
|
|
|
|
|
|
port[0] = 0;
|
|
|
|
|
|
|
|
dns_filladdr (host, LEN_SERVERNAME, port, LEN_PORT, bman.net_ai_family, &addr);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
udp_send (bman.sock, data, len, &addr, bman.net_ai_family);
|
|
|
|
udp_send (bman.sock, data, len, &addr, bman.net_ai_family);
|
|
|
|
d_printf ("** Send To (%s[:%s])\n\n%s\n\n", host, port, data);
|
|
|
|
d_printf ("** Send To (%s[:%s])\n\n%s\n\n", host, port, data);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|