WIP networking updates from Jasper Foreman

git-svn-id: https://svn.eduke32.com/eduke32@3095 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
terminx 2012-10-28 22:27:53 +00:00
parent 067baf626a
commit a3fe057c0a
8 changed files with 1773 additions and 1553 deletions

View file

@ -532,7 +532,7 @@ void A_DeleteSprite(int32_t s)
void A_AddToDeleteQueue(int32_t i) void A_AddToDeleteQueue(int32_t i)
{ {
if (g_netClientPeer || g_spriteDeleteQueueSize == 0) if (g_spriteDeleteQueueSize == 0)
{ {
A_DeleteSprite(i); A_DeleteSprite(i);
return; return;

View file

@ -926,7 +926,7 @@ nextdemo_nomenu:
} }
else if (g_player[myconnectindex].ps->gm&MODE_TYPE) else if (g_player[myconnectindex].ps->gm&MODE_TYPE)
{ {
Net_EnterMessage(); Net_SendMessage();
if ((g_player[myconnectindex].ps->gm&MODE_TYPE) != MODE_TYPE) if ((g_player[myconnectindex].ps->gm&MODE_TYPE) != MODE_TYPE)
g_player[myconnectindex].ps->gm = MODE_MENU; g_player[myconnectindex].ps->gm = MODE_MENU;

View file

@ -3026,7 +3026,7 @@ void G_DisplayRest(int32_t smoothratio)
if (!Demo_IsProfiling()) if (!Demo_IsProfiling())
{ {
if (g_player[myconnectindex].ps->gm&MODE_TYPE) if (g_player[myconnectindex].ps->gm&MODE_TYPE)
Net_EnterMessage(); Net_SendMessage();
else else
M_DisplayMenus(); M_DisplayMenus();
} }
@ -7299,9 +7299,9 @@ FOUNDCHEAT:
i = Bstrlen(CheatStrings[k])-1; i = Bstrlen(CheatStrings[k])-1;
ud.m_player_skill = ud.player_skill = cheatbuf[i] - '1'; ud.m_player_skill = ud.player_skill = cheatbuf[i] - '1';
} }
if (numplayers > 1 && g_netServer) /*if (numplayers > 1 && g_netServer)
Net_NewGame(ud.m_volume_number,ud.m_level_number); Net_NewGame(ud.m_volume_number,ud.m_level_number);
else g_player[myconnectindex].ps->gm |= MODE_RESTART; else*/ g_player[myconnectindex].ps->gm |= MODE_RESTART;
end_cheat(); end_cheat();
return; return;
@ -7480,22 +7480,10 @@ void G_HandleLocalKeys(void)
{ {
if (KB_UnBoundKeyPressed(sc_F1) || KB_UnBoundKeyPressed(sc_F2) || ud.autovote) if (KB_UnBoundKeyPressed(sc_F1) || KB_UnBoundKeyPressed(sc_F2) || ud.autovote)
{ {
tempbuf[0] = PACKET_MAP_VOTE;
tempbuf[1] = myconnectindex;
tempbuf[2] = (KB_UnBoundKeyPressed(sc_F1) || ud.autovote ? ud.autovote-1 : 0);
tempbuf[3] = myconnectindex;
if (g_netClient)
enet_peer_send(g_netClientPeer, CHAN_GAMESTATE, enet_packet_create(tempbuf, 4, ENET_PACKET_FLAG_RELIABLE));
else if (g_netServer)
enet_host_broadcast(g_netServer, CHAN_GAMESTATE, enet_packet_create(tempbuf, 4, ENET_PACKET_FLAG_RELIABLE));
G_AddUserQuote("Vote Cast"); G_AddUserQuote("Vote Cast");
g_player[myconnectindex].gotvote = 1; Net_SendMapVote(KB_UnBoundKeyPressed(sc_F1) || ud.autovote ? ud.autovote-1 : 0);
KB_ClearKeyDown(sc_F1); KB_ClearKeyDown(sc_F1);
KB_ClearKeyDown(sc_F2); KB_ClearKeyDown(sc_F2);
voting = -1;
} }
} }
@ -10875,19 +10863,20 @@ int32_t G_DoMoveThings(void)
// Net_CorrectPrediction(); // Net_CorrectPrediction();
if (g_netServer) if (g_netServer)
Net_UpdateClients(); Net_SendServerUpdates();
if ((everyothertime&1) == 0) if ((everyothertime&1) == 0)
{ {
G_AnimateWalls(); G_AnimateWalls();
A_MoveCyclers(); A_MoveCyclers();
if (g_netServer) // Map updates are disabled for now
Net_StreamLevel(); // if (g_netServer && (everyothertime % 10) == 0)
// Net_SendMapUpdate();
} }
if (g_netClient) //Slave if (g_netClient) //Slave
Net_ClientMove(); Net_SendClientUpdate();
return 0; return 0;
} }

View file

@ -1969,9 +1969,9 @@ nullquote:
ud.m_volume_number = ud.volume_number = volnume; ud.m_volume_number = ud.volume_number = volnume;
ud.m_level_number = ud.level_number = levnume; ud.m_level_number = ud.level_number = levnume;
if (numplayers > 1 && g_netServer) //if (numplayers > 1 && g_netServer)
Net_NewGame(volnume,levnume); // Net_NewGame(volnume,levnume);
else //else
{ {
g_player[myconnectindex].ps->gm |= MODE_EOL; g_player[myconnectindex].ps->gm |= MODE_EOL;
ud.display_bonus_screen = 0; ud.display_bonus_screen = 0;

View file

@ -804,22 +804,6 @@ void M_DisplayMenus(void)
Net_GetPackets(); Net_GetPackets();
if (g_netSync)
{
P_SetGamePalette(g_player[myconnectindex].ps, TITLEPAL, 8+2+1);
rotatesprite_fs(0,0,65536L,0,BETASCREEN,0,0,2+8+16+64);
rotatesprite_fs(160<<16,(104)<<16,60<<10,0,DUKENUKEM,0,0,2+8);
rotatesprite_fs(160<<16,(129)<<16,30<<11,0,THREEDEE,0,0,2+8);
if (PLUTOPAK) // JBF 20030804
rotatesprite_fs(160<<16,(151)<<16,30<<11,0,PLUTOPAKSPRITE+1,0,0,2+8);
gametext(160,190,"Transferring gamestate",14,2);
nextpage();
return;
}
{ {
if (buttonstat != 0 && !onbar) if (buttonstat != 0 && !onbar)
{ {
@ -5227,99 +5211,22 @@ VOLUME_ALL_40x:
case 603: case 603:
{ {
int32_t plrvotes = 0, j = 0;
x = M_Probe(186,124,0,0); x = M_Probe(186,124,0,0);
if (voting != myconnectindex) if (voting != myconnectindex)
{
g_player[myconnectindex].ps->gm &= ~MODE_MENU; g_player[myconnectindex].ps->gm &= ~MODE_MENU;
if (x == -1)
{
if (voting == myconnectindex)
{
for (i=0; i<MAXPLAYERS; i++)
{
g_player[i].vote = 0;
g_player[i].gotvote = 0;
}
tempbuf[0] = PACKET_MAP_VOTE_CANCEL;
tempbuf[1] = myconnectindex;
if (g_netClient)
enet_peer_send(g_netClientPeer, CHAN_GAMESTATE, enet_packet_create(tempbuf, 2, ENET_PACKET_FLAG_RELIABLE));
else if (g_netServer)
enet_host_broadcast(g_netServer, CHAN_GAMESTATE, enet_packet_create(tempbuf, 2, ENET_PACKET_FLAG_RELIABLE));
voting = -1;
} }
else if (x == -1)
{
Net_SendMapVoteCancel(0);
M_ChangeMenu(MENU_MAIN); M_ChangeMenu(MENU_MAIN);
} }
for (i=0; i<MAXPLAYERS; i++)
{
plrvotes += g_player[i].vote;
j += g_player[i].gotvote;
}
if (j == numplayers || !g_player[myconnectindex].ps->i || (plrvotes > (numplayers>>1)) || (g_netServer))
{
if (plrvotes > (numplayers>>1) || !g_player[myconnectindex].ps->i || (g_netServer))
{
if (ud.m_player_skill == 3) ud.m_respawn_monsters = 1;
else ud.m_respawn_monsters = 0;
if ((GametypeFlags[ud.m_coop] & GAMETYPE_ITEMRESPAWN)) ud.m_respawn_items = 1;
else ud.m_respawn_items = 0;
ud.m_respawn_inventory = 1;
for (TRAVERSE_CONNECT(margin))
{
P_ResetWeapons(margin);
P_ResetInventory(margin);
}
Net_NewGame(ud.m_volume_number,ud.m_level_number);
if (voting == myconnectindex && !(g_netServer))
G_AddUserQuote("Vote Succeeded");
G_NewGame(ud.m_volume_number,ud.m_level_number,ud.m_player_skill+1);
if (G_EnterLevel(MODE_GAME)) G_BackToMenu();
return;
}
else if (j == numplayers)
{
for (i=0; i<MAXPLAYERS; i++)
{
g_player[i].vote = 0;
g_player[i].gotvote = 0;
}
voting = -1;
tempbuf[0] = PACKET_MAP_VOTE_CANCEL;
tempbuf[1] = myconnectindex;
tempbuf[2] = 1;
tempbuf[3] = myconnectindex;
if (g_netClient)
enet_peer_send(g_netClientPeer, CHAN_GAMESTATE, enet_packet_create(tempbuf, 4, ENET_PACKET_FLAG_RELIABLE));
else if (g_netServer)
enet_host_broadcast(g_netServer, CHAN_GAMESTATE, enet_packet_create(tempbuf, 4, ENET_PACKET_FLAG_RELIABLE));
Bsprintf(ScriptQuotes[QUOTE_RESERVED2],"Vote Failed");
P_DoQuote(QUOTE_RESERVED2,g_player[myconnectindex].ps);
g_player[myconnectindex].ps->gm &= ~MODE_MENU;
}
}
else else
{ {
mgametext(160,90,"Waiting for votes",0,2); mgametext(160,90,"Waiting for votes",0,2);
} }
break; break;
} }
case 600: case 600:
@ -5436,35 +5343,14 @@ VOLUME_ALL_40x:
// master does whatever it wants // master does whatever it wants
if (g_netServer) if (g_netServer)
{ {
M_ChangeMenu(603); Net_FillNewGame(&pendingnewgame, 1);
Net_StartNewGame();
Net_SendNewGame(1, NULL);
break; break;
} }
if (voting == -1) if (voting == -1)
{ {
if (g_player[myconnectindex].ps->i) Net_SendMapVoteInitiate();
{
for (i=0; i<MAXPLAYERS; i++)
{
g_player[i].vote = 0;
g_player[i].gotvote = 0;
}
g_player[myconnectindex].vote = g_player[myconnectindex].gotvote = 1;
voting = myconnectindex;
tempbuf[0] = PACKET_MAP_VOTE_INITIATE;
tempbuf[1] = myconnectindex;
tempbuf[2] = ud.m_volume_number;
tempbuf[3] = ud.m_level_number;
tempbuf[4] = myconnectindex;
if (g_netClient)
enet_peer_send(g_netClientPeer, CHAN_GAMESTATE, enet_packet_create(tempbuf, 5, ENET_PACKET_FLAG_RELIABLE));
else if (g_netServer)
enet_host_broadcast(g_netServer, CHAN_GAMESTATE, enet_packet_create(tempbuf, 5, ENET_PACKET_FLAG_RELIABLE));
}
if ((GametypeFlags[ud.m_coop] & GAMETYPE_PLAYERSFRIENDLY) && !(GametypeFlags[ud.m_coop] & GAMETYPE_TDM))
ud.m_noexits = 0;
M_ChangeMenu(603); M_ChangeMenu(603);
} }
break; break;

File diff suppressed because it is too large Load diff

View file

@ -92,7 +92,6 @@ typedef struct {
uint32_t revision; uint32_t revision;
int32_t animategoal[MAXANIMATES], animatevel[MAXANIMATES], g_animateCount; int32_t animategoal[MAXANIMATES], animatevel[MAXANIMATES], g_animateCount;
int32_t animateptr[MAXANIMATES]; int32_t animateptr[MAXANIMATES];
// int32_t lockclock;
int32_t msx[2048], msy[2048]; int32_t msx[2048], msy[2048];
int32_t randomseed, g_globalRandom; int32_t randomseed, g_globalRandom;
@ -138,30 +137,118 @@ extern int32_t g_netDisconnect;
extern int32_t g_netPlayersWaiting; extern int32_t g_netPlayersWaiting;
extern int32_t g_netPort; extern int32_t g_netPort;
extern int32_t g_networkMode; extern int32_t g_networkMode;
extern int32_t g_netSync;
extern int32_t lastsectupdate[MAXSECTORS]; extern int32_t lastsectupdate[MAXSECTORS];
extern int32_t lastupdate[MAXSPRITES]; extern int32_t lastupdate[MAXSPRITES];
extern int32_t lastwallupdate[MAXWALLS]; extern int32_t lastwallupdate[MAXWALLS];
extern int16_t g_netStatnums[10]; extern int16_t g_netStatnums[10];
#pragma pack(push,1)
typedef struct {
vec3_t pos;
vec3_t opos;
vec3_t vel;
int16_t ang;
int16_t horiz;
int16_t horizoff;
int16_t ping;
int16_t playerindex;
int16_t deadflag;
int16_t playerquitflag;
} playerupdate_t;
#pragma pack(pop)
int32_t Net_PackSprite(int32_t i,uint8_t *pbuf); #pragma pack(push,1)
int32_t Net_UnpackSprite(int32_t i,uint8_t *pbuf); typedef struct {
void Net_ClientMove(void); int8_t header;
int8_t connection;
int8_t level_number;
int8_t volume_number;
int8_t player_skill;
int8_t monsters_off;
int8_t respawn_monsters;
int8_t respawn_items;
int8_t respawn_inventory;
int8_t marker;
int8_t ffire;
int8_t noexits;
int8_t coop;
} newgame_t;
#pragma pack(pop)
newgame_t pendingnewgame;
// Connect/Disconnect
void Net_Connect(const char *srvaddr); void Net_Connect(const char *srvaddr);
void Net_Disconnect(void); void Net_Disconnect(void);
void Net_EnterMessage(void); void Net_ReceiveDisconnect(ENetEvent *event);
// Packet Handlers
void Net_GetPackets(void); void Net_GetPackets(void);
void Net_NewGame(int32_t volume,int32_t level); void Net_HandleServerPackets(void);
void Net_HandleClientPackets(void);
void Net_ParseClientPacket(ENetEvent *event); void Net_ParseClientPacket(ENetEvent *event);
void Net_ParseServerPacket(ENetEvent *event); void Net_ParseServerPacket(ENetEvent *event);
void Net_ParsePacketCommon(uint8_t *pbuf, int32_t packbufleng, int32_t serverpacketp);
void Net_SendVersion(ENetPeer *client);
void Net_RecieveVersion(uint8_t *pbuf, int32_t packbufleng);
void Net_SendChallenge();
void Net_RecieveChallenge(uint8_t *pbuf, int32_t packbufleng, ENetEvent *event);
void Net_SendNewPlayer(int32_t newplayerindex);
void Net_RecieveNewPlayer(uint8_t *pbuf, int32_t packbufleng);
void Net_SendPlayerIndex(int32_t index, ENetPeer *peer);
void Net_RecievePlayerIndex(uint8_t *pbuf, int32_t packbufleng);
void Net_SendClientInfo(void);
void Net_ReceiveClientInfo(uint8_t *pbuf, int32_t packbufleng, int32_t fromserver);
void Net_SendUserMapName(void);
void Net_ReceiveUserMapName(uint8_t *pbuf, int32_t packbufleng);
void Net_SendClientSync(ENetEvent *event, int32_t player);
void Net_ReceiveClientSync(ENetEvent *event);
void Net_SendMapUpdate(void);
void Net_ReceiveMapUpdate(uint8_t *pbuf, int32_t packbufleng);
void Net_FillPlayerUpdate(playerupdate_t *update, int32_t player);
void Net_ExtractPlayerUpdate(playerupdate_t *update);
void Net_SendServerUpdates(void);
void Net_ReceiveServerUpdate(ENetEvent *event);
void Net_SendClientUpdate(void);
void Net_ReceiveClientUpdate(ENetEvent *event);
void Net_SendMessage(void);
void Net_ReceiveMessage(uint8_t *pbuf, int32_t packbufleng);
void Net_StartNewGame();
void Net_SendNewGame(int32_t frommenu, ENetPeer *peer);
void Net_ReceiveNewGame(ENetEvent *event);
void Net_FillNewGame(newgame_t* newgame, int32_t frommenu);
void Net_ExtractNewGame(newgame_t* newgame, int32_t menuonly);
void Net_SendMapVoteInitiate(void);
void Net_RecieveMapVoteInitiate(uint8_t *pbuf);
void Net_SendMapVote(int32_t votefor);
void Net_RecieveMapVote(uint8_t *pbuf);
void Net_CheckForEnoughVotes();
void Net_SendMapVoteCancel(int32_t failed);
void Net_RecieveMapVoteCancel(uint8_t *pbuf);
//////////
void Net_ResetPrediction(void); void Net_ResetPrediction(void);
void Net_RestoreMapState(netmapstate_t *save); void Net_RestoreMapState(netmapstate_t *save);
void Net_SendClientInfo(void);
void Net_SendUserMapName(void);
void Net_StreamLevel(void);
void Net_SyncPlayer(ENetEvent *event); void Net_SyncPlayer(ENetEvent *event);
void Net_UpdateClients(void);
void Net_WaitForServer(void); void Net_WaitForServer(void);
void faketimerhandler(void); void faketimerhandler(void);
#endif
#endif // __netplay_h__

View file

@ -98,6 +98,7 @@ static int32_t osdcmd_changelevel(const osdfuncparm_t *parm)
if (numplayers > 1) if (numplayers > 1)
{ {
/*
if (g_netServer) if (g_netServer)
Net_NewGame(volume,level); Net_NewGame(volume,level);
else if (voting == -1) else if (voting == -1)
@ -132,6 +133,7 @@ static int32_t osdcmd_changelevel(const osdfuncparm_t *parm)
g_player[myconnectindex].ps->gm |= MODE_MENU; g_player[myconnectindex].ps->gm |= MODE_MENU;
M_ChangeMenu(603); M_ChangeMenu(603);
} }
*/
return OSDCMD_OK; return OSDCMD_OK;
} }
if (g_player[myconnectindex].ps->gm & MODE_GAME) if (g_player[myconnectindex].ps->gm & MODE_GAME)
@ -227,6 +229,7 @@ static int32_t osdcmd_map(const osdfuncparm_t *parm)
if (numplayers > 1) if (numplayers > 1)
{ {
/*
if (g_netServer) if (g_netServer)
{ {
Net_SendUserMapName(); Net_SendUserMapName();
@ -267,6 +270,7 @@ static int32_t osdcmd_map(const osdfuncparm_t *parm)
g_player[myconnectindex].ps->gm |= MODE_MENU; g_player[myconnectindex].ps->gm |= MODE_MENU;
M_ChangeMenu(603); M_ChangeMenu(603);
} }
*/
return OSDCMD_OK; return OSDCMD_OK;
} }