a couple of multiplayer fixes

git-svn-id: https://svn.eduke32.com/eduke32@1826 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
terminx 2011-03-05 01:41:38 +00:00
parent b774cfb9ff
commit 1a8f02a07b
4 changed files with 124 additions and 49 deletions

View file

@ -2900,13 +2900,19 @@ nullquote:
if (g_netServer) if (g_netServer)
{ {
int32_t jj = 0;
P_ResetPlayer(vm.g_p); P_ResetPlayer(vm.g_p);
packbuf[0] = PACKET_PLAYER_SPAWN; packbuf[jj++] = PACKET_PLAYER_SPAWN;
packbuf[1] = vm.g_p; packbuf[jj++] = vm.g_p;
packbuf[2] = 0;
enet_host_broadcast(g_netServer, CHAN_GAMESTATE , enet_packet_create(packbuf, 3, ENET_PACKET_FLAG_RELIABLE)); Bmemcpy(&packbuf[jj], &g_player[vm.g_p].ps->pos.x, sizeof(vec3_t) * 2);
jj += sizeof(vec3_t) * 2;
packbuf[jj++] = 0;
enet_host_broadcast(g_netServer, CHAN_GAMESTATE , enet_packet_create(packbuf, jj, ENET_PACKET_FLAG_RELIABLE));
} }
} }
P_UpdateScreenPal(g_player[vm.g_p].ps); P_UpdateScreenPal(g_player[vm.g_p].ps);

View file

@ -279,12 +279,11 @@ void Net_NewGame(int32_t volume, int32_t level)
static void Net_SendChallenge(void) static void Net_SendChallenge(void)
{ {
int32_t l = 1; int32_t l = 1;
uint32_t crc = crc32once((uint8_t *)g_netPassword, Bstrlen(g_netPassword));
if (!g_netClientPeer) return; if (!g_netClientPeer) return;
buf[0] = PACKET_AUTH; buf[0] = PACKET_AUTH;
*(uint32_t *)&buf[1] = crc; *(uint32_t *)&buf[1] = crc32once((uint8_t *)g_netPassword, Bstrlen(g_netPassword));
l += sizeof(int32_t); l += sizeof(int32_t);
buf[l++] = myconnectindex; buf[l++] = myconnectindex;
@ -343,11 +342,8 @@ void Net_SyncPlayer(ENetEvent *event)
S_PlaySound(DUKE_GETWEAPON2); S_PlaySound(DUKE_GETWEAPON2);
TRAVERSE_CONNECT(i) // open a new slot if necessary and save off the resulting slot # for future reference
if (g_player[i].playerquitflag == 0) TRAVERSE_CONNECT(i) if (g_player[i].playerquitflag == 0) break;
break;
// open a new slot if necessary
event->peer->data = (void *)((intptr_t)(i = (i == -1 ? playerswhenstarted++ : i))); event->peer->data = (void *)((intptr_t)(i = (i == -1 ? playerswhenstarted++ : i)));
g_player[i].netsynctime = totalclock; g_player[i].netsynctime = totalclock;
@ -356,11 +352,11 @@ void Net_SyncPlayer(ENetEvent *event)
for (j=0; j<playerswhenstarted-1; j++) connectpoint2[j] = j+1; for (j=0; j<playerswhenstarted-1; j++) connectpoint2[j] = j+1;
connectpoint2[playerswhenstarted-1] = -1; connectpoint2[playerswhenstarted-1] = -1;
TRAVERSE_CONNECT(j) // TRAVERSE_CONNECT(j)
{ // {
if (!g_player[j].ps) g_player[j].ps = (DukePlayer_t *) Bcalloc(1, sizeof(DukePlayer_t)); if (!g_player[i].ps) g_player[i].ps = (DukePlayer_t *) Bcalloc(1, sizeof(DukePlayer_t));
if (!g_player[j].sync) g_player[j].sync = (input_t *) Bcalloc(1, sizeof(input_t)); if (!g_player[i].sync) g_player[i].sync = (input_t *) Bcalloc(1, sizeof(input_t));
} // }
packbuf[0] = PACKET_NUM_PLAYERS; packbuf[0] = PACKET_NUM_PLAYERS;
packbuf[1] = ++numplayers; packbuf[1] = ++numplayers;
@ -393,18 +389,22 @@ void Net_SyncPlayer(ENetEvent *event)
G_SaveMapState(g_multiMapState); G_SaveMapState(g_multiMapState);
if ((j = qlz_compress((char *)g_multiMapState, buf, sizeof(mapstate_t), state_compress))) if ((j = qlz_compress((char *)g_multiMapState, buf, sizeof(mapstate_t), state_compress)))
{ {
size_t csize = qlz_size_compressed(buf);
// all of these packets are SYNCPACKETSIZE // all of these packets are SYNCPACKETSIZE
do do
{ {
enet_peer_send(event->peer, CHAN_SYNC, enet_peer_send(event->peer, CHAN_SYNC,
enet_packet_create((char *)(buf)+qlz_size_compressed(buf)-j, SYNCPACKETSIZE, ENET_PACKET_FLAG_RELIABLE)); enet_packet_create((char *)(buf)+csize-j, SYNCPACKETSIZE, ENET_PACKET_FLAG_RELIABLE));
j -= SYNCPACKETSIZE; j -= SYNCPACKETSIZE;
enet_host_service(g_netServer, NULL, 0);
} }
while (j >= SYNCPACKETSIZE); while (j >= SYNCPACKETSIZE);
// ...except for this one. A non-SYNCPACKETSIZE packet on CHAN_SYNC doubles as the signal that the transfer is done. // ...except for this one. A non-SYNCPACKETSIZE packet on CHAN_SYNC doubles as the signal that the transfer is done.
enet_peer_send(event->peer, CHAN_SYNC, enet_peer_send(event->peer, CHAN_SYNC,
enet_packet_create((char *)(buf)+qlz_size_compressed(buf)-j, j, ENET_PACKET_FLAG_RELIABLE)); enet_packet_create((char *)(buf)+csize-j, j, ENET_PACKET_FLAG_RELIABLE));
enet_host_service(g_netServer, NULL, 0);
} }
else else
initprintf("Error compressing map state for transfer!\n"); initprintf("Error compressing map state for transfer!\n");
@ -1960,7 +1960,22 @@ void Net_ParseServerPacket(ENetEvent *event)
G_NewGame(ud.volume_number,ud.level_number,ud.player_skill); G_NewGame(ud.volume_number,ud.level_number,ud.player_skill);
ud.coop = ud.m_coop; ud.coop = ud.m_coop;
if (G_EnterLevel(MODE_GAME)) G_BackToMenu(); if (G_EnterLevel(MODE_GAME))
{
G_BackToMenu();
break;
}
if (g_netSync)
{
packbuf[0] = PACKET_PLAYER_READY;
packbuf[1] = myconnectindex;
if (g_netClientPeer)
enet_peer_send(g_netClientPeer, CHAN_GAMESTATE, enet_packet_create(packbuf, 2, ENET_PACKET_FLAG_RELIABLE));
g_netSync = 0;
}
break; break;
case PACKET_VERSION: case PACKET_VERSION:
@ -2017,10 +2032,13 @@ void Net_ParseServerPacket(ENetEvent *event)
case PACKET_PLAYER_SPAWN: case PACKET_PLAYER_SPAWN:
if (!(g_player[myconnectindex].ps->gm & MODE_GAME) || g_netSync) break; if (!(g_player[myconnectindex].ps->gm & MODE_GAME) || g_netSync) break;
P_ResetPlayer(pbuf[1]); P_ResetPlayer(pbuf[1]);
Bmemcpy(&g_player[pbuf[1]].ps->pos.x, &pbuf[2], sizeof(vec3_t) * 2);
Bmemcpy(&sprite[g_player[pbuf[1]].ps->i], &pbuf[2], sizeof(vec3_t));
break; break;
case PACKET_PLAYER_READY: case PACKET_PLAYER_PING:
g_player[0].playerreadyflag++; g_player[0].playerreadyflag++;
return; return;
@ -2196,9 +2214,36 @@ void Net_ParseClientPacket(ENetEvent *event)
break; break;
case PACKET_PLAYER_READY: case PACKET_PLAYER_READY:
j = g_player[other].ps->i;
Bmemcpy(g_player[other].ps, g_player[0].ps, sizeof(DukePlayer_t));
g_player[other].ps->i = j;
changespritestat(j, STAT_PLAYER);
g_player[other].ps->last_extra = sprite[g_player[other].ps->i].extra = g_player[other].ps->max_player_health;
sprite[g_player[other].ps->i].cstat = 1+256;
actor[g_player[other].ps->i].t_data[2] = actor[g_player[other].ps->i].t_data[3] = actor[g_player[other].ps->i].t_data[4] = 0;
P_ResetPlayer(other);
j = 0;
packbuf[j++] = PACKET_PLAYER_SPAWN;
packbuf[j++] = other;
Bmemcpy(&packbuf[j], &g_player[other].ps->pos.x, sizeof(vec3_t) * 2);
j += sizeof(vec3_t) * 2;
packbuf[j++] = 0;
enet_host_broadcast(g_netServer, CHAN_GAMESTATE , enet_packet_create(packbuf, j, ENET_PACKET_FLAG_RELIABLE));
break;
case PACKET_PLAYER_PING:
if (g_player[myconnectindex].ps->gm & MODE_GAME) if (g_player[myconnectindex].ps->gm & MODE_GAME)
{ {
packbuf[0] = PACKET_PLAYER_READY; packbuf[0] = PACKET_PLAYER_PING;
packbuf[1] = myconnectindex; packbuf[1] = myconnectindex;
enet_peer_send(event->peer, CHAN_GAMESTATE, enet_packet_create(packbuf, 2, ENET_PACKET_FLAG_RELIABLE)); enet_peer_send(event->peer, CHAN_GAMESTATE, enet_packet_create(packbuf, 2, ENET_PACKET_FLAG_RELIABLE));
} }
@ -2371,19 +2416,11 @@ void Net_ParseClientPacket(ENetEvent *event)
enet_peer_send(event->peer, CHAN_GAMESTATE, enet_packet_create(packbuf, 13, ENET_PACKET_FLAG_RELIABLE)); enet_peer_send(event->peer, CHAN_GAMESTATE, enet_packet_create(packbuf, 13, ENET_PACKET_FLAG_RELIABLE));
j = g_player[other].ps->i; /*
Bmemcpy(g_player[other].ps, g_player[0].ps, sizeof(DukePlayer_t));
g_player[other].ps->i = j;
changespritestat(j, STAT_PLAYER);
P_ResetStatus(other); P_ResetStatus(other);
P_ResetWeapons(other); P_ResetWeapons(other);
P_ResetInventory(other); P_ResetInventory(other);
*/
g_player[other].ps->last_extra = sprite[g_player[other].ps->i].extra = g_player[other].ps->max_player_health;
sprite[g_player[other].ps->i].cstat = 1+256;
actor[g_player[other].ps->i].t_data[2] = actor[g_player[other].ps->i].t_data[3] = actor[g_player[other].ps->i].t_data[4] = 0;
g_netPlayersWaiting--; g_netPlayersWaiting--;
@ -2540,15 +2577,26 @@ void Net_GetPackets(void)
if (buf && event.packet->dataLength == SYNCPACKETSIZE) if (buf && event.packet->dataLength == SYNCPACKETSIZE)
{ {
char tbuf[64];
Bmemcpy((uint8_t *)(buf)+datasiz, event.packet->data, event.packet->dataLength); Bmemcpy((uint8_t *)(buf)+datasiz, event.packet->data, event.packet->dataLength);
datasiz += SYNCPACKETSIZE; datasiz += SYNCPACKETSIZE;
rotatesprite(0,0,65536L,0,BETASCREEN,0,0,2+8+16+64,0,0,xdim-1,ydim-1);
rotatesprite(160<<16,(104)<<16,60<<10,0,DUKENUKEM,0,0,2+8,0,0,xdim-1,ydim-1);
rotatesprite(160<<16,(129)<<16,30<<11,0,THREEDEE,0,0,2+8,0,0,xdim-1,ydim-1);
if (PLUTOPAK) // JBF 20030804
rotatesprite(160<<16,(151)<<16,30<<11,0,PLUTOPAKSPRITE+1,0,0,2+8,0,0,xdim-1,ydim-1);
Bsprintf(tbuf, "RECEIVED %d BYTES\n", datasiz);
gametext(160,190,tbuf,14,2);
} }
// last packet of mapstate sequence // last packet of mapstate sequence
else if (buf) else if (buf)
{ {
Bmemcpy((uint8_t *)(buf)+datasiz, event.packet->data, event.packet->dataLength); Bmemcpy((uint8_t *)(buf)+datasiz, event.packet->data, event.packet->dataLength);
datasiz = 0; datasiz = 0;
g_netSync = 0; // g_netSync = 0;
if (qlz_size_decompressed((const char *)buf) == sizeof(mapstate_t)) if (qlz_size_decompressed((const char *)buf) == sizeof(mapstate_t))
{ {
@ -2559,6 +2607,15 @@ void Net_GetPackets(void)
packbuf[0] = PACKET_REQUEST_GAMESTATE; packbuf[0] = PACKET_REQUEST_GAMESTATE;
packbuf[1] = myconnectindex; packbuf[1] = myconnectindex;
enet_peer_send(g_netClientPeer, CHAN_GAMESTATE, enet_packet_create(&packbuf[0], 2, ENET_PACKET_FLAG_RELIABLE)); enet_peer_send(g_netClientPeer, CHAN_GAMESTATE, enet_packet_create(&packbuf[0], 2, ENET_PACKET_FLAG_RELIABLE));
rotatesprite(0,0,65536L,0,BETASCREEN,0,0,2+8+16+64,0,0,xdim-1,ydim-1);
rotatesprite(160<<16,(104)<<16,60<<10,0,DUKENUKEM,0,0,2+8,0,0,xdim-1,ydim-1);
rotatesprite(160<<16,(129)<<16,30<<11,0,THREEDEE,0,0,2+8,0,0,xdim-1,ydim-1);
if (PLUTOPAK) // JBF 20030804
rotatesprite(160<<16,(151)<<16,30<<11,0,PLUTOPAKSPRITE+1,0,0,2+8,0,0,xdim-1,ydim-1);
gametext(160,190,"TRANSFER COMPLETE",14,2);
} }
else else
{ {
@ -2566,6 +2623,15 @@ void Net_GetPackets(void)
Bfree(buf); Bfree(buf);
buf = NULL; buf = NULL;
g_netDisconnect = 1; g_netDisconnect = 1;
rotatesprite(0,0,65536L,0,BETASCREEN,0,0,2+8+16+64,0,0,xdim-1,ydim-1);
rotatesprite(160<<16,(104)<<16,60<<10,0,DUKENUKEM,0,0,2+8,0,0,xdim-1,ydim-1);
rotatesprite(160<<16,(129)<<16,30<<11,0,THREEDEE,0,0,2+8,0,0,xdim-1,ydim-1);
if (PLUTOPAK) // JBF 20030804
rotatesprite(160<<16,(151)<<16,30<<11,0,PLUTOPAKSPRITE+1,0,0,2+8,0,0,xdim-1,ydim-1);
gametext(160,190,"TRANSFER ERROR",14,2);
} }
} }
else else
@ -2573,6 +2639,8 @@ void Net_GetPackets(void)
initprintf("Error allocating buffer for map state!\n"); initprintf("Error allocating buffer for map state!\n");
g_netDisconnect = 1; g_netDisconnect = 1;
} }
nextpage();
} }
else Net_ParseServerPacket(&event); else Net_ParseServerPacket(&event);
@ -2593,7 +2661,7 @@ void Net_GetPackets(void)
initprintf("You have been kicked from the server.\n"); initprintf("You have been kicked from the server.\n");
return; return;
case DISC_BANNED: case DISC_BANNED:
initprintf("You have been banned from this server.\n"); initprintf("You are banned from this server.\n");
return; return;
default: default:
initprintf("Disconnected.\n"); initprintf("Disconnected.\n");
@ -2970,10 +3038,9 @@ void Net_StreamLevel(void)
void faketimerhandler(void) void faketimerhandler(void)
{ {
if (g_netServer) if (((uintptr_t)g_netServer|(uintptr_t)g_netClient) == (uintptr_t)NULL) return;
enet_host_service(g_netServer, NULL, 0);
else if (g_netClient) enet_host_service(g_netServer ? g_netServer : g_netClient, NULL, 0);
enet_host_service(g_netClient, NULL, 0);
} }
void Net_EnterMessage(void) void Net_EnterMessage(void)
@ -3134,25 +3201,23 @@ void Net_WaitForServer(void)
if (numplayers < 2 || g_netServer) return; if (numplayers < 2 || g_netServer) return;
if ((g_netServer || ud.multimode > 1)) P_SetGamePalette(g_player[myconnectindex].ps, TITLEPAL, 11);
{
P_SetGamePalette(g_player[myconnectindex].ps, TITLEPAL, 11);
rotatesprite(0,0,65536L,0,BETASCREEN,0,0,2+8+16+64,0,0,xdim-1,ydim-1);
rotatesprite(160<<16,(104)<<16,60<<10,0,DUKENUKEM,0,0,2+8,0,0,xdim-1,ydim-1); rotatesprite(0,0,65536L,0,BETASCREEN,0,0,2+8+16+64,0,0,xdim-1,ydim-1);
rotatesprite(160<<16,(129)<<16,30<<11,0,THREEDEE,0,0,2+8,0,0,xdim-1,ydim-1);
if (PLUTOPAK) // JBF 20030804
rotatesprite(160<<16,(151)<<16,30<<11,0,PLUTOPAKSPRITE+1,0,0,2+8,0,0,xdim-1,ydim-1);
gametext(160,190,"WAITING FOR SERVER",14,2); rotatesprite(160<<16,(104)<<16,60<<10,0,DUKENUKEM,0,0,2+8,0,0,xdim-1,ydim-1);
nextpage(); rotatesprite(160<<16,(129)<<16,30<<11,0,THREEDEE,0,0,2+8,0,0,xdim-1,ydim-1);
} if (PLUTOPAK) // JBF 20030804
rotatesprite(160<<16,(151)<<16,30<<11,0,PLUTOPAKSPRITE+1,0,0,2+8,0,0,xdim-1,ydim-1);
gametext(160,170,"WAITING FOR SERVER",14,2);
nextpage();
do do
{ {
if (quitevent || keystatus[1]) G_GameExit(""); if (quitevent || keystatus[1]) G_GameExit("");
packbuf[0] = PACKET_PLAYER_READY; packbuf[0] = PACKET_PLAYER_PING;
packbuf[1] = myconnectindex; packbuf[1] = myconnectindex;
if (g_netClientPeer) if (g_netClientPeer)

View file

@ -134,6 +134,7 @@ enum DukePacket_t
PACKET_REQUEST_GAMESTATE, PACKET_REQUEST_GAMESTATE,
PACKET_VERSION, PACKET_VERSION,
PACKET_AUTH, PACKET_AUTH,
PACKET_PLAYER_PING,
PACKET_PLAYER_READY, PACKET_PLAYER_READY,
PACKET_MAP_STREAM, PACKET_MAP_STREAM,

View file

@ -4485,6 +4485,9 @@ void P_ProcessInput(int32_t snum)
uint8_t *kb = &p->kickback_pic; uint8_t *kb = &p->kickback_pic;
int16_t tempsect; int16_t tempsect;
if (g_player[snum].playerquitflag == 0)
return;
p->player_par++; p->player_par++;
VM_OnEvent(EVENT_PROCESSINPUT, p->i, snum, -1); VM_OnEvent(EVENT_PROCESSINPUT, p->i, snum, -1);