void NetworkSendRejoinSync (int nPlayer, tNetworkSyncData *syncP) { int i, j; gameData.multiplayer.players [nPlayer].connected = 1; // connect the new guy ResetPlayerTimeout (nPlayer, -1); if (gameStates.app.bEndLevelSequence || gameData.reactor.bDestroyed) { // Endlevel started before we finished sending the goods, we'll // have to stop and try again after the level. if (gameStates.multi.nGameType >= IPX_GAME) NetworkDumpPlayer ( syncP->player [1].player.network.ipx.server, syncP->player [1].player.network.ipx.node, DUMP_ENDLEVEL); syncP->nState = 0; syncP->nExtras = 0; return; } if (networkData.bPlayerAdded) { syncP->player [1].nType = PID_ADDPLAYER; syncP->player [1].player.connected = nPlayer; NetworkNewPlayer (&syncP->player [1]); for (i = 0; i < gameData.multiplayer.nPlayers; i++) { if ((i != nPlayer) && (i != gameData.multiplayer.nLocalPlayer) && gameData.multiplayer.players [i].connected && (gameStates.multi.nGameType >= IPX_GAME)) { SendSequencePacket ( syncP->player [1], netPlayers.m_info.players [i].network.ipx.server, netPlayers.m_info.players [i].network.ipx.node, gameData.multiplayer.players [i].netAddress); } } } // Send sync packet to the new guy NetworkUpdateNetGame (); // Fill in the kill list for (j = 0; j < MAX_PLAYERS; j++) { for (i = 0; i < MAX_PLAYERS; i++) *netGame.Kills (j, i) = gameData.multigame.kills.matrix [j][i]; *netGame.Killed (j) = gameData.multiplayer.players [j].netKilledTotal; *netGame.PlayerKills (j) = gameData.multiplayer.players [j].netKillsTotal; *netGame.PlayerScore (j) = gameData.multiplayer.players [j].score; } netGame.SetLevelTime (LOCALPLAYER.timeLevel); netGame.SetMonitorVector (NetworkCreateMonitorVector ()); if (gameStates.multi.nGameType >= IPX_GAME) { SendInternetFullNetGamePacket (syncP->player [1].player.network.ipx.server, syncP->player [1].player.network.ipx.node); SendNetPlayersPacket (syncP->player [1].player.network.ipx.server, syncP->player [1].player.network.ipx.node); MultiSendMonsterball (1, 1); } }
void NetworkSendGameInfo (tSequencePacket *their) { // Send game info to someone who requested it char oldType, old_status; fix timevar; int i; NetworkUpdateNetGame (); // Update the values in the netgame struct oldType = netGame.nType; old_status = netGame.gameStatus; netGame.nType = PID_GAME_INFO; netPlayers.nType = PID_PLAYERSINFO; netPlayers.nSecurity = netGame.nSecurity; netGame.versionMajor = D2X_MAJOR; netGame.versionMinor = D2X_MINOR; if (gameStates.app.bEndLevelSequence || gameData.reactor.bDestroyed) netGame.gameStatus = NETSTAT_ENDLEVEL; if (netGame.xPlayTimeAllowed) { timevar = i2f (netGame.xPlayTimeAllowed * 5 * 60); i = f2i (timevar - gameStates.app.xThisLevelTime); if (i < 30) netGame.gameStatus = NETSTAT_ENDLEVEL; } if (!their) { if (gameStates.multi.nGameType >= IPX_GAME) { SendBroadcastFullNetGamePacket (); SendBroadcastNetPlayersPacket (); } } else if (gameStates.multi.nGameType >= IPX_GAME) { SendInternetFullNetGamePacket ( their->player.network.ipx.server, their->player.network.ipx.node); SendNetPlayersPacket ( their->player.network.ipx.server, their->player.network.ipx.node); } netGame.nType = oldType; netGame.gameStatus = old_status; // if ((gameData.app.nGameMode & GM_ENTROPY) || extraGameInfo [0].bEnhancedCTF) //make half-way sure the client gets this data ... NetworkSendExtraGameInfo (their); MultiSendMonsterball (1, 1); }
int CheckMonsterballScore (void) { ubyte special; if (!(gameData.app.nGameMode & GM_MONSTERBALL)) return 0; if (!gameData.hoard.monsterballP) return 0; if (gameData.hoard.nLastHitter != LOCALPLAYER.nObject) return 0; special = gameData.segs.segment2s [gameData.hoard.monsterballP->nSegment].special; if ((special != SEGMENT_IS_GOAL_BLUE) && (special != SEGMENT_IS_GOAL_RED)) return 0; if ((GetTeam (gameData.multiplayer.nLocalPlayer) == TEAM_RED) == (special == SEGMENT_IS_GOAL_RED)) MultiSendCaptureBonus (gameData.multiplayer.nLocalPlayer); else MultiSendCaptureBonus (-gameData.multiplayer.nLocalPlayer - 1); CreatePlayerAppearanceEffect (gameData.hoard.monsterballP); RemoveMonsterball (); CreateMonsterball (); MultiSendMonsterball (1, 1); return 1; }
int FindMonsterball (void) { short i; tObject *objP; gameData.hoard.monsterballP = NULL; gameData.hoard.nMonsterballSeg = -1; gameData.hoard.nLastHitter = -1; for (i = 0, objP = gameData.objs.objects; i < gameData.objs.nObjects; i++, objP++) if ((objP->nType == OBJ_MONSTERBALL) || ((objP->nType == OBJ_POWERUP) && (objP->id == POW_MONSTERBALL))) { if (gameData.hoard.nMonsterballSeg < 0) gameData.hoard.nMonsterballSeg = objP->nSegment; ReleaseObject (i); } #ifndef _DEBUG if (!(NetworkIAmMaster () && IsMultiGame && (gameData.app.nGameMode & GM_MONSTERBALL))) return 0; #endif if (!CreateMonsterball ()) return 0; MultiSendMonsterball (1, 1); return 1; }