From 8c015f48f31339aaa0fdd8e03ea3c6ac742d8b88 Mon Sep 17 00:00:00 2001 From: terminx Date: Thu, 17 Dec 2009 11:17:48 +0000 Subject: [PATCH] Cleaning out tree in case I can't work on anything for a while... more multiplay fixes git-svn-id: https://svn.eduke32.com/eduke32@1573 1a8010ca-5511-0410-912e-c29ae57300e0 --- polymer/eduke32/build/src/winlayer.c | 2 + polymer/eduke32/source/duke3d.h | 13 +- .../eduke32/source/enet/include/enet/enet.h | 2 +- polymer/eduke32/source/funct.h | 2 +- polymer/eduke32/source/game.c | 351 ++++++++---------- polymer/eduke32/source/global.c | 8 +- polymer/eduke32/source/menus.c | 2 +- polymer/eduke32/source/osdcmds.c | 86 ++++- 8 files changed, 251 insertions(+), 215 deletions(-) diff --git a/polymer/eduke32/build/src/winlayer.c b/polymer/eduke32/build/src/winlayer.c index 230269709..14c516da0 100644 --- a/polymer/eduke32/build/src/winlayer.c +++ b/polymer/eduke32/build/src/winlayer.c @@ -3415,6 +3415,8 @@ static int32_t SetupOpenGL(int32_t width, int32_t height, int32_t bitspp) err = 0; else if (!Bstrcmp(glinfo.renderer,"Intel Cantiga")) err = 0; + else if (!Bstrcmp(glinfo.renderer,"Mobile Intel(R) 4 Series Express Chipset Family")) + err = 0; else err = 1; } #ifdef POLYMER diff --git a/polymer/eduke32/source/duke3d.h b/polymer/eduke32/source/duke3d.h index 998ab5a82..fa4474cc6 100644 --- a/polymer/eduke32/source/duke3d.h +++ b/polymer/eduke32/source/duke3d.h @@ -1102,7 +1102,6 @@ enum DukePacket_t PACKET_PLAYER_SPAWN, PACKET_FRAG, PACKET_REQUEST_GAMESTATE, - PACKET_NEW_GAME, PACKET_LOAD_GAME, PACKET_VERSION, PACKET_AUTH, @@ -1112,10 +1111,9 @@ enum DukePacket_t // to send them to everyone PACKET_BROADCAST, + PACKET_NEW_GAME, PACKET_RTS, - PACKET_WEAPON_CHOICE, - PACKET_PLAYER_OPTIONS, - PACKET_PLAYER_NAME, + PACKET_CLIENT_INFO, PACKET_MESSAGE, PACKET_USER_MAP, @@ -1127,6 +1125,13 @@ enum DukePacket_t PACKET_QUIT = 255 }; +enum NetDisconnect_t +{ + DISC_BAD_PASSWORD = 1, + DISC_KICKED, + DISC_BANNED +}; + #pragma pack(pop) #ifdef __cplusplus diff --git a/polymer/eduke32/source/enet/include/enet/enet.h b/polymer/eduke32/source/enet/include/enet/enet.h index 27427b5ed..cf7b2d078 100644 --- a/polymer/eduke32/source/enet/include/enet/enet.h +++ b/polymer/eduke32/source/enet/include/enet/enet.h @@ -199,7 +199,7 @@ enum ENET_PEER_TIMEOUT_LIMIT = 32, ENET_PEER_TIMEOUT_MINIMUM = 5000, ENET_PEER_TIMEOUT_MAXIMUM = 30000, - ENET_PEER_PING_INTERVAL = 150, + ENET_PEER_PING_INTERVAL = 500, ENET_PEER_UNSEQUENCED_WINDOWS = 64, ENET_PEER_UNSEQUENCED_WINDOW_SIZE = 1024, ENET_PEER_FREE_UNSEQUENCED_WINDOWS = 32, diff --git a/polymer/eduke32/source/funct.h b/polymer/eduke32/source/funct.h index 38e106b1a..ac8a30a09 100644 --- a/polymer/eduke32/source/funct.h +++ b/polymer/eduke32/source/funct.h @@ -243,7 +243,7 @@ extern void X_OnEvent(register int32_t iEventID, register int32_t sActor, regist extern int32_t A_CheckSoundPlaying(int32_t i, int32_t num); extern int32_t S_CheckSoundPlaying(int32_t i, int32_t num); extern void G_UpdatePlayerFromMenu(void); -extern void Net_SendPlayerName(void); +extern void Net_SendClientInfo(void); extern void Net_SendUserMapName(void); extern void G_GameQuit(void); diff --git a/polymer/eduke32/source/game.c b/polymer/eduke32/source/game.c index 4435c3168..51a4a9be4 100644 --- a/polymer/eduke32/source/game.c +++ b/polymer/eduke32/source/game.c @@ -57,13 +57,6 @@ int32_t g_netDisconnect = 0; int32_t net_lists[] = { STAT_PROJECTILE, STAT_STANDABLE, STAT_ACTIVATOR, STAT_TRANSPORT, STAT_EFFECTOR, STAT_ACTOR, STAT_ZOMBIEACTOR }; char g_networkPassword[32]; -enum NetDisconnect_t -{ - DISC_BAD_PASSWORD = 1, - DISC_KICKED, - DISC_BANNED -}; - #ifdef _WIN32 #define WIN32_LEAN_AND_MEAN #include @@ -710,27 +703,7 @@ void G_GameQuit(void) G_GameExit("Timed out."); } -static void Net_SendWeaponChoice(void) -{ - int32_t i,l; - - buf[0] = PACKET_WEAPON_CHOICE; - l = 1; - - for (i=0; i<10; i++) - { - g_player[myconnectindex].wchoice[i] = g_player[0].wchoice[i]; - buf[l++] = (uint8_t)g_player[0].wchoice[i]; - } - - buf[l++] = myconnectindex; - if (net_client) - enet_peer_send(net_peer, 0, enet_packet_create(&buf[0], l, ENET_PACKET_FLAG_RELIABLE)); - else if (net_server) - enet_host_broadcast(net_server, 0, enet_packet_create(&buf[0], l, ENET_PACKET_FLAG_RELIABLE)); -} - -static void Net_SendVersion(void) +static void Net_SendVersion(ENetPeer * client) { if (!net_server) return; @@ -739,36 +712,10 @@ static void Net_SendVersion(void) buf[2] = (uint8_t)atoi(s_buildDate); buf[3] = myconnectindex; - enet_host_broadcast(net_server, 0, enet_packet_create(&buf[0], 4, ENET_PACKET_FLAG_RELIABLE)); + enet_peer_send(client, 0, enet_packet_create(&buf[0], 4, ENET_PACKET_FLAG_RELIABLE)); } -static void Net_SendPlayerOptions(void) -{ - int32_t l; - - buf[0] = PACKET_PLAYER_OPTIONS; - l = 1; - - //null terminated player name to send - // for (i=0;szPlayerName[i];i++) buf[l++] = Btoupper(szPlayerName[i]); - // buf[l++] = 0; - - buf[l++] = g_player[myconnectindex].ps->aim_mode = ud.mouseaiming; - buf[l++] = g_player[myconnectindex].ps->auto_aim = ud.config.AutoAim; - buf[l++] = g_player[myconnectindex].ps->weaponswitch = ud.weaponswitch; - buf[l++] = g_player[myconnectindex].ps->palookup = g_player[myconnectindex].pcolor = ud.color; - - buf[l++] = g_player[myconnectindex].pteam = ud.team; - - buf[l++] = myconnectindex; - - if (net_client) - enet_peer_send(net_peer, 0, enet_packet_create(&buf[0], l, ENET_PACKET_FLAG_RELIABLE)); - else if (net_server) - enet_host_broadcast(net_server, 0, enet_packet_create(&buf[0], l, ENET_PACKET_FLAG_RELIABLE)); -} - -void Net_SendPlayerName(void) +void Net_SendClientInfo(void) { int32_t i,l; @@ -777,13 +724,26 @@ void Net_SendPlayerName(void) if (numplayers < 2) return; - buf[0] = PACKET_PLAYER_NAME; + buf[0] = PACKET_CLIENT_INFO; l = 1; //null terminated player name to send for (i=0; szPlayerName[i]; i++) buf[l++] = Btoupper(szPlayerName[i]); buf[l++] = 0; + buf[l++] = g_player[myconnectindex].ps->aim_mode = ud.mouseaiming; + buf[l++] = g_player[myconnectindex].ps->auto_aim = ud.config.AutoAim; + buf[l++] = g_player[myconnectindex].ps->weaponswitch = ud.weaponswitch; + buf[l++] = g_player[myconnectindex].ps->palookup = g_player[myconnectindex].pcolor = ud.color; + + buf[l++] = g_player[myconnectindex].pteam = ud.team; + + for (i=0; i<10; i++) + { + g_player[myconnectindex].wchoice[i] = g_player[0].wchoice[i]; + buf[l++] = (uint8_t)g_player[0].wchoice[i]; + } + buf[l++] = myconnectindex; if (net_client) @@ -794,27 +754,26 @@ void Net_SendPlayerName(void) void Net_SendUserMapName(void) { - if (numplayers > 1) - { - int32_t j; + int32_t j; - packbuf[0] = PACKET_USER_MAP; - packbuf[1] = 0; + if (numplayers < 2) + return; - Bcorrectfilename(boardfilename,0); + packbuf[0] = PACKET_USER_MAP; + packbuf[1] = 0; - j = Bstrlen(boardfilename); - boardfilename[j++] = 0; - Bstrcat(packbuf+1,boardfilename); + Bcorrectfilename(boardfilename,0); - packbuf[j++] = myconnectindex; + j = Bstrlen(boardfilename); + boardfilename[j++] = 0; + Bstrcat(packbuf+1,boardfilename); - if (net_client) - enet_peer_send(net_peer, 0, enet_packet_create(packbuf, j, ENET_PACKET_FLAG_RELIABLE)); - else if (net_server) - enet_host_broadcast(net_server, 0, enet_packet_create(packbuf, j, ENET_PACKET_FLAG_RELIABLE)); + packbuf[j++] = myconnectindex; - } + if (net_client) + enet_peer_send(net_peer, 0, enet_packet_create(packbuf, j, ENET_PACKET_FLAG_RELIABLE)); + else if (net_server) + enet_host_broadcast(net_server, 0, enet_packet_create(packbuf, j, ENET_PACKET_FLAG_RELIABLE)); } void Net_NewGame(int32_t volume, int32_t level) @@ -947,9 +906,7 @@ void Net_SyncPlayer(ENetEvent * event) packbuf[2] = myconnectindex; enet_peer_send(event->peer, 0, enet_packet_create(packbuf, 3, ENET_PACKET_FLAG_RELIABLE)); - Net_SendPlayerName(); - Net_SendPlayerOptions(); - Net_SendWeaponChoice(); + Net_SendClientInfo(); Net_SendUserMapName(); if (g_player[0].ps->gm & MODE_GAME) @@ -1020,12 +977,14 @@ void Net_ParsePacket(ENetEvent * event) { if (g_player[i].playerquitflag == 0) continue; - Bmemcpy(&g_player[i].ps->dead_flag, &packbuf[j], sizeof(int16_t)); + g_player[i].ps->dead_flag = *(int16_t *)&packbuf[j]; j += sizeof(int16_t); if (i == myconnectindex && !g_player[i].ps->dead_flag) { - j += sizeof(input_t)-sizeof(loc.filler)+(sizeof(vec3_t)*3) + sizeof(int16_t)*6; + j += (sizeof(input_t) - sizeof(loc.filler)) + + (sizeof(vec3_t) * 3) + // position + (sizeof(int16_t) * 6); // ang and horiz goto process; } @@ -1042,27 +1001,18 @@ void Net_ParsePacket(ENetEvent * event) Bmemcpy(&sprite[g_player[i].ps->i], &packbuf[j], sizeof(vec3_t)); sprite[g_player[i].ps->i].z += PHEIGHT; j += sizeof(vec3_t) * 3; + Bmemcpy(&g_player[i].ps->ang, &packbuf[j], sizeof(int16_t) * 2); - Bmemcpy(&sprite[g_player[i].ps->i].ang, &packbuf[j], sizeof(int16_t)); + sprite[g_player[i].ps->i].ang = *(int16_t *)&packbuf[j]; j += sizeof(int16_t) * 2; + Bmemcpy(&g_player[i].ps->horiz, &packbuf[j], sizeof(int16_t) * 4); j += sizeof(int16_t) * 4; process: - Bmemcpy(&sprite[g_player[i].ps->i].extra, &packbuf[j], sizeof(int16_t)); - j += sizeof(int16_t); - Bmemcpy(&sprite[g_player[i].ps->i].cstat, &packbuf[j], sizeof(int16_t)); - j += sizeof(int16_t); - Bmemcpy(&g_player[i].ps->kickback_pic, &packbuf[j], sizeof(int16_t)); - j += sizeof(int16_t); - Bmemcpy(&ActorExtra[g_player[i].ps->i].owner, &packbuf[j], sizeof(int16_t)); - j += sizeof(int16_t); - Bmemcpy(&ActorExtra[g_player[i].ps->i].picnum, &packbuf[j], sizeof(int16_t)); - j += sizeof(int16_t); + Bmemcpy(&g_player[i].ps->gotweapon[0], &packbuf[j], sizeof(g_player[i].ps->gotweapon)); j += sizeof(g_player[i].ps->gotweapon); - Bmemcpy(&g_player[i].ps->curr_weapon, &packbuf[j], sizeof(int16_t)); - j += sizeof(int16_t); Bmemcpy(&g_player[i].ps->ammo_amount[0], &packbuf[j], sizeof(g_player[i].ps->ammo_amount)); j += sizeof(g_player[i].ps->ammo_amount); @@ -1070,22 +1020,41 @@ process: Bmemcpy(&g_player[i].ps->inv_amount[0], &packbuf[j], sizeof(g_player[i].ps->inv_amount)); j += sizeof(g_player[i].ps->inv_amount); - Bmemcpy(&g_player[i].ps->last_weapon, &packbuf[j], sizeof(int16_t)); - j += sizeof(int16_t); - Bmemcpy(&g_player[i].ps->wantweaponfire, &packbuf[j], sizeof(int16_t)); - j += sizeof(int16_t); - Bmemcpy(&g_player[i].ps->frag_ps, &packbuf[j], sizeof(int16_t)); - j += sizeof(int16_t); - Bmemcpy(&g_player[i].ps->frag, &packbuf[j], sizeof(int16_t)); - j += sizeof(int16_t); - Bmemcpy(&g_player[i].ps->fraggedself, &packbuf[j], sizeof(int16_t)); - j += sizeof(int16_t); - Bmemcpy(&g_player[i].ps->last_extra, &packbuf[j], sizeof(int16_t)); - j += sizeof(int16_t); Bmemcpy(g_player[i].frags, &packbuf[j], sizeof(g_player[i].frags)); j += sizeof(g_player[i].frags); - Bmemcpy(&g_player[i].ping, &packbuf[j], sizeof(int16_t)); + + sprite[g_player[i].ps->i].extra = *(int16_t *)&packbuf[j]; j += sizeof(int16_t); + + sprite[g_player[i].ps->i].cstat = *(int16_t *)&packbuf[j]; + j += sizeof(int16_t); + + g_player[i].ps->kickback_pic = *(int16_t *)&packbuf[j]; + j += sizeof(int16_t); + + ActorExtra[g_player[i].ps->i].owner = *(int16_t *)&packbuf[j]; + j += sizeof(int16_t); + + ActorExtra[g_player[i].ps->i].picnum = *(int16_t *)&packbuf[j]; + j += sizeof(int16_t); + + g_player[i].ps->curr_weapon = (int8_t)packbuf[j++]; + g_player[i].ps->last_weapon = (int8_t)packbuf[j++]; + g_player[i].ps->wantweaponfire = (int8_t)packbuf[j++]; + g_player[i].ps->frag_ps = (int8_t)packbuf[j++]; + + g_player[i].ps->frag = *(int16_t *)&packbuf[j]; + j += sizeof(int16_t); + + g_player[i].ps->fraggedself = *(int16_t *)&packbuf[j]; + j += sizeof(int16_t); + + g_player[i].ps->last_extra = *(int16_t *)&packbuf[j]; + j += sizeof(int16_t); + + g_player[i].ping = *(int16_t *)&packbuf[j]; + j += sizeof(int16_t); + sprite[g_player[i].ps->i].pal = packbuf[j++]; l = i; @@ -1135,29 +1104,7 @@ process: } { -/* - int16_t ahead, zhead, phead; - - Bmemcpy(&ahead, &packbuf[j], sizeof(int16_t)); - j += sizeof(int16_t); - - Bmemcpy(&zhead, &packbuf[j], sizeof(int16_t)); - j += sizeof(int16_t); - - Bmemcpy(&phead, &packbuf[j], sizeof(int16_t)); - j += sizeof(int16_t); - - if (ahead != -1 && sprite[ahead].statnum != STAT_ACTOR && sprite[ahead].statnum != STAT_ZOMBIEACTOR) - deletesprite(ahead); - - if (zhead != -1 && sprite[zhead].statnum != STAT_ACTOR && sprite[zhead].statnum != STAT_ZOMBIEACTOR) - deletesprite(zhead); - - if (phead != -1 && sprite[phead].statnum != STAT_PROJECTILE) - deletesprite(phead); -*/ - - // sprite updates tacked on to the end of the packet + // sprite/sector/wall updates tacked on to the end of the packet l = packbuf[j++]; while (l--) @@ -1187,14 +1134,10 @@ process: // doesn't exist on the client yet if (ostatnum == MAXSTATUS || osect == MAXSECTORS) { - int16_t sprs[MAXSPRITES], j = 0; - while ((sprs[j++] = insertsprite(sect, statnum)) != i); - if (j != 1) - { - j--; - while (--j) deletesprite(sprs[j]); - deletesprite(sprs[0]); - } + int16_t sprs[MAXSPRITES], z = 0; + while ((sprs[z++] = insertsprite(sect, statnum)) != i); + z--; + while (z--) deletesprite(sprs[z]); } else { @@ -1430,11 +1373,7 @@ process: // myconnectindex is 0 until we get PACKET_PLAYER_INDEX if (net_client && myconnectindex != 0) - { - Net_SendPlayerName(); - Net_SendPlayerOptions(); - Net_SendWeaponChoice(); - } + Net_SendClientInfo(); break; @@ -1444,9 +1383,7 @@ process: clearbufbyte(&g_player[myconnectindex].playerquitflag,1,0x01010101); - Net_SendPlayerName(); - Net_SendPlayerOptions(); - Net_SendWeaponChoice(); + Net_SendClientInfo(); break; @@ -1468,8 +1405,11 @@ process: P_FragPlayer(packbuf[1]); break; - case PACKET_PLAYER_OPTIONS: - i = 1; + case PACKET_CLIENT_INFO: + for (i=1; packbuf[i]; i++) + g_player[other].user_name[i-1] = packbuf[i]; + g_player[other].user_name[i-1] = 0; + i++; g_player[other].ps->aim_mode = packbuf[i++]; g_player[other].ps->auto_aim = packbuf[i++]; @@ -1477,24 +1417,12 @@ process: g_player[other].ps->palookup = g_player[other].pcolor = packbuf[i++]; g_player[other].pteam = packbuf[i++]; - break; - - case PACKET_PLAYER_NAME: - for (i=1; packbuf[i]; i++) - g_player[other].user_name[i-1] = packbuf[i]; - g_player[other].user_name[i-1] = 0; - i++; - - break; - - case PACKET_WEAPON_CHOICE: - i = 1; - - j = i; //This used to be Duke packet #9... now concatenated with Duke packet #6 + j = i; for (; i-j<10; i++) g_player[other].wchoice[i-j] = packbuf[i]; break; + case PACKET_RTS: if (numlumps == 0) break; @@ -1645,16 +1573,20 @@ void Net_GetPackets(void) { ENetEvent event; - while (enet_host_service (net_server, & event, 0) > 0) + while (enet_host_service (net_server, & event, 1) > 0) { switch (event.type) { case ENET_EVENT_TYPE_CONNECT: - initprintf ("A new client connected from %x:%u.\n", - event.peer -> address.host, - event.peer -> address.port); + { + char ipaddr[32]; - Net_SendVersion(); + enet_address_get_host_ip(&event.peer->address, ipaddr, sizeof(ipaddr)); + + initprintf ("A new client connected from %s:%u.\n", + ipaddr, event.peer -> address.port); + } + Net_SendVersion(event.peer); break; case ENET_EVENT_TYPE_RECEIVE: /* @@ -1702,7 +1634,7 @@ void Net_GetPackets(void) { ENetEvent event; - while (enet_host_service (net_client, & event, 0) > 0) + while (enet_host_service (net_client, & event, 1) > 0) { switch (event.type) { @@ -1762,6 +1694,7 @@ void Net_GetPackets(void) } } else Net_ParsePacket(&event); + enet_packet_destroy (event.packet); break; case ENET_EVENT_TYPE_DISCONNECT: @@ -1910,50 +1843,65 @@ void faketimerhandler(void) Bmemcpy(&osyn[i], &nsyn[i], sizeof(input_t)); - Bmemcpy(&packbuf[j], &g_player[i].ps->dead_flag, sizeof(int16_t)); + *(int16_t *)&packbuf[j] = g_player[i].ps->dead_flag; j += sizeof(int16_t); + Bmemcpy(&packbuf[j], &nsyn[i], sizeof(input_t)); j += sizeof(input_t)-sizeof(loc.filler); + Bmemcpy(&packbuf[j], &g_player[i].ps->posx, sizeof(vec3_t) * 3); j += sizeof(vec3_t) * 3; + Bmemcpy(&packbuf[j], &g_player[i].ps->ang, sizeof(int16_t) * 2); j += sizeof(int16_t) * 2; + Bmemcpy(&packbuf[j], &g_player[i].ps->horiz, sizeof(int16_t) * 4); j += sizeof(int16_t) * 4; - Bmemcpy(&packbuf[j], &sprite[g_player[i].ps->i].extra, sizeof(int16_t)); - j += sizeof(int16_t); - Bmemcpy(&packbuf[j], &sprite[g_player[i].ps->i].cstat, sizeof(int16_t)); - j += sizeof(int16_t); - Bmemcpy(&packbuf[j], &g_player[i].ps->kickback_pic, sizeof(int16_t)); - j += sizeof(int16_t); - Bmemcpy(&packbuf[j], &ActorExtra[g_player[i].ps->i].owner, sizeof(int16_t)); - j += sizeof(int16_t); - Bmemcpy(&packbuf[j], &ActorExtra[g_player[i].ps->i].picnum, sizeof(int16_t)); - j += sizeof(int16_t); + Bmemcpy(&packbuf[j], &g_player[i].ps->gotweapon[0], sizeof(g_player[i].ps->gotweapon)); j += sizeof(g_player[i].ps->gotweapon); - Bmemcpy(&packbuf[j], &g_player[i].ps->curr_weapon, sizeof(int16_t)); - j += sizeof(int16_t); + Bmemcpy(&packbuf[j], &g_player[i].ps->ammo_amount[0], sizeof(g_player[i].ps->ammo_amount)); j += sizeof(g_player[i].ps->ammo_amount); + Bmemcpy(&packbuf[j], &g_player[i].ps->inv_amount[0], sizeof(g_player[i].ps->inv_amount)); j += sizeof(g_player[i].ps->inv_amount); - Bmemcpy(&packbuf[j], &g_player[i].ps->last_weapon, sizeof(int16_t)); - j += sizeof(int16_t); - Bmemcpy(&packbuf[j], &g_player[i].ps->wantweaponfire, sizeof(int16_t)); - j += sizeof(int16_t); - Bmemcpy(&packbuf[j], &g_player[i].ps->frag_ps, sizeof(int16_t)); - j += sizeof(int16_t); - Bmemcpy(&packbuf[j], &g_player[i].ps->frag, sizeof(int16_t)); - j += sizeof(int16_t); - Bmemcpy(&packbuf[j], &g_player[i].ps->fraggedself, sizeof(int16_t)); - j += sizeof(int16_t); - Bmemcpy(&packbuf[j], &g_player[i].ps->last_extra, sizeof(int16_t)); - j += sizeof(int16_t); + Bmemcpy(&packbuf[j], g_player[i].frags, sizeof(g_player[i].frags)); j += sizeof(g_player[i].frags); - Bmemcpy(&packbuf[j], &g_player[i].ping, sizeof(int16_t)); + + *(int16_t *)&packbuf[j] = sprite[g_player[i].ps->i].extra; j += sizeof(int16_t); + + *(int16_t *)&packbuf[j] = sprite[g_player[i].ps->i].cstat; + j += sizeof(int16_t); + + *(int16_t *)&packbuf[j] = g_player[i].ps->kickback_pic; + j += sizeof(int16_t); + + *(int16_t *)&packbuf[j] = ActorExtra[g_player[i].ps->i].owner; + j += sizeof(int16_t); + + *(int16_t *)&packbuf[j] = ActorExtra[g_player[i].ps->i].picnum; + j += sizeof(int16_t); + + packbuf[j++] = (uint8_t) g_player[i].ps->curr_weapon; + packbuf[j++] = (uint8_t) g_player[i].ps->last_weapon; + packbuf[j++] = (uint8_t) g_player[i].ps->wantweaponfire; + packbuf[j++] = (uint8_t) g_player[i].ps->frag_ps; + + *(int16_t *)&packbuf[j] = g_player[i].ps->frag; + j += sizeof(int16_t); + + *(int16_t *)&packbuf[j] = g_player[i].ps->fraggedself; + j += sizeof(int16_t); + + *(int16_t *)&packbuf[j] = g_player[i].ps->last_extra; + j += sizeof(int16_t); + + *(int16_t *)&packbuf[j] = g_player[i].ping; + j += sizeof(int16_t); + packbuf[j++] = sprite[g_player[i].ps->i].pal; l = i; @@ -2034,17 +1982,6 @@ void faketimerhandler(void) } } -/* - Bmemcpy(&packbuf[j], &headspritestat[STAT_ACTOR], sizeof(int16_t)); - j += sizeof(int16_t); - - Bmemcpy(&packbuf[j], &headspritestat[STAT_ZOMBIEACTOR], sizeof(int16_t)); - j += sizeof(int16_t); - - Bmemcpy(&packbuf[j], &headspritestat[STAT_PROJECTILE], sizeof(int16_t)); - j += sizeof(int16_t); -*/ - k = 0; { @@ -10085,6 +10022,16 @@ static void G_CheckCommandLine(int32_t argc, const char **argv) i++; continue; } + if (!Bstrcasecmp(c+1,"password")) + { + if (argc > i+1) + { + Bstrncpy(g_networkPassword, (char *)argv[i+1], sizeof(g_networkPassword)-1); + i++; + } + i++; + continue; + } if (!Bstrcasecmp(c+1,"name")) { if (argc > i+1) @@ -10945,7 +10892,7 @@ void G_UpdatePlayerFromMenu(void) if (numplayers > 1) { - Net_SendPlayerOptions(); + Net_SendClientInfo(); if (sprite[g_player[myconnectindex].ps->i].picnum == APLAYER && sprite[g_player[myconnectindex].ps->i].pal != 1) sprite[g_player[myconnectindex].ps->i].pal = g_player[myconnectindex].pcolor; } diff --git a/polymer/eduke32/source/global.c b/polymer/eduke32/source/global.c index a7e5417b2..b82eef88c 100644 --- a/polymer/eduke32/source/global.c +++ b/polymer/eduke32/source/global.c @@ -67,11 +67,11 @@ char GametypeNames[MAXGAMETYPES][33] = { "DUKEMATCH (SPAWN)","COOPERATIVE PLAY", int32_t GametypeFlags[MAXGAMETYPES] = { - 4+8+16+1024+2048+16384, + /*4+*/8+16+1024+2048+16384, 1+2+32+64+128+256+512+4096+8192+32768, - 2+4+8+16+16384, - 4+8+16+1024+2048+16384+65536+131072, - 2+4+8+16+16384+65536+131072 + 2+/*4+*/8+16+16384, + /*4+*/8+16+1024+2048+16384+65536+131072, + 2+/*4+*/8+16+16384+65536+131072 }; char g_numGametypes = 5; diff --git a/polymer/eduke32/source/menus.c b/polymer/eduke32/source/menus.c index a2995f720..a52f19339 100644 --- a/polymer/eduke32/source/menus.c +++ b/polymer/eduke32/source/menus.c @@ -854,7 +854,7 @@ void M_DisplayMenus(void) if (buf[0] && Bstrcmp(szPlayerName,buf)) { Bstrcpy(szPlayerName,buf); - Net_SendPlayerName(); + Net_SendClientInfo(); } // send name update } diff --git a/polymer/eduke32/source/osdcmds.c b/polymer/eduke32/source/osdcmds.c index abec46a12..66e23f245 100644 --- a/polymer/eduke32/source/osdcmds.c +++ b/polymer/eduke32/source/osdcmds.c @@ -810,7 +810,7 @@ static int32_t osdcmd_name(const osdfuncparm_t *parm) OSD_Printf("name %s\n",szPlayerName); - Net_SendPlayerName(); + Net_SendClientInfo(); return OSDCMD_OK; } @@ -1183,6 +1183,7 @@ static int32_t osdcmd_password(const osdfuncparm_t *parm) static int32_t osdcmd_listplayers(const osdfuncparm_t *parm) { ENetPeer * currentPeer; + char ipaddr[32]; if (parm->numparms != 0) return OSDCMD_SHOWHELP; @@ -1200,12 +1201,90 @@ static int32_t osdcmd_listplayers(const osdfuncparm_t *parm) if (currentPeer -> state != ENET_PEER_STATE_CONNECTED) continue; - initprintf("%d %s\n", currentPeer, g_player[(intptr_t)currentPeer->data].user_name); + enet_address_get_host_ip(¤tPeer->address, ipaddr, sizeof(ipaddr)); + initprintf("%x %s %s\n", currentPeer->address.host, ipaddr, + g_player[(intptr_t)currentPeer->data].user_name); } return OSDCMD_OK; } +static int32_t osdcmd_kick(const osdfuncparm_t *parm) +{ + ENetPeer * currentPeer; + uint32_t hexaddr; + + if (parm->numparms != 1) + return OSDCMD_SHOWHELP; + + if (!net_server) + { + initprintf("You are not the server.\n"); + return OSDCMD_OK; + } + + for (currentPeer = net_server -> peers; + currentPeer < & net_server -> peers [net_server -> peerCount]; + ++ currentPeer) + { + if (currentPeer -> state != ENET_PEER_STATE_CONNECTED) + continue; + + sscanf (parm->parms[0],"%" PRIxPTR "", &hexaddr); + + if (currentPeer->address.host == hexaddr) + { + initprintf("Kicking %x (%s)\n", currentPeer->address.host, + g_player[(intptr_t)currentPeer->data].user_name); + enet_peer_disconnect (currentPeer, DISC_KICKED); + return OSDCMD_OK; + } + } + + initprintf("Player %s not found!\n", parm->parms[0]); + return OSDCMD_OK; +} + +static int32_t osdcmd_kickban(const osdfuncparm_t *parm) +{ + ENetPeer * currentPeer; + uint32_t hexaddr; + + if (parm->numparms != 1) + return OSDCMD_SHOWHELP; + + if (!net_server) + { + initprintf("You are not the server.\n"); + return OSDCMD_OK; + } + + for (currentPeer = net_server -> peers; + currentPeer < & net_server -> peers [net_server -> peerCount]; + ++ currentPeer) + { + if (currentPeer -> state != ENET_PEER_STATE_CONNECTED) + continue; + + sscanf (parm->parms[0],"%" PRIxPTR "", &hexaddr); + + if (currentPeer->address.host == hexaddr) + { + char ipaddr[32]; + + enet_address_get_host_ip(¤tPeer->address, ipaddr, sizeof(ipaddr)); + initprintf("Host %s is now banned.\n", ipaddr); + initprintf("Kicking %x (%s)\n", currentPeer->address.host, + g_player[(intptr_t)currentPeer->data].user_name); + enet_peer_disconnect (currentPeer, DISC_BANNED); + return OSDCMD_OK; + } + } + + initprintf("Player %s not found!\n", parm->parms[0]); + return OSDCMD_OK; +} + static int32_t osdcmd_cvar_set_multi(const osdfuncparm_t *parm) { int32_t r = osdcmd_cvar_set(parm); @@ -1413,6 +1492,9 @@ int32_t registerosdcommands(void) OSD_RegisterFunction("initgroupfile","initgroupfile : adds a grp file into the game filesystem", osdcmd_initgroupfile); OSD_RegisterFunction("inittimer","debug", osdcmd_inittimer); + OSD_RegisterFunction("kick","kick : kicks a multiplayer client. See listplayers.", osdcmd_kick); + OSD_RegisterFunction("kickban","kickban : kicks a multiplayer client and prevents them from reconnecting. See listplayers.", osdcmd_kickban); + OSD_RegisterFunction("listplayers","listplayers: lists currently connected multiplayer clients", osdcmd_listplayers); OSD_RegisterFunction("name","name: change your multiplayer nickname", osdcmd_name);