// //////////////////////////////////////////////////////////////////////////// // Network File packet processor. bool recvMapFileRequested(NETQUEUE queue) { //char mapStr[256],mapName[256],fixedname[256]; uint32_t player; PHYSFS_sint64 fileSize_64; PHYSFS_file *pFileHandle; if(!NetPlay.isHost) // only host should act { ASSERT(false, "Host only routine detected for client!"); return false; } // Check to see who wants the file NETbeginDecode(queue, NET_FILE_REQUESTED); NETuint32_t(&player); NETend(); if (!NetPlay.players[player].wzFile.isSending) { NetPlay.players[player].needFile = true; NetPlay.players[player].wzFile.isCancelled = false; NetPlay.players[player].wzFile.isSending = true; LEVEL_DATASET *mapData = levFindDataSet(game.map, &game.hash); addConsoleMessage("Map was requested: SENDING MAP!",DEFAULT_JUSTIFY, SYSTEM_MESSAGE); char *mapStr = mapData->realFileName; debug(LOG_NET, "Map was requested. Looking for %s", mapStr); // Checking to see if file is available... pFileHandle = PHYSFS_openRead(mapStr); if (pFileHandle == NULL) { debug(LOG_ERROR, "Failed to open %s for reading: %s", mapStr, PHYSFS_getLastError()); debug(LOG_FATAL, "You have a map (%s) that can't be located.\n\nMake sure it is in the correct directory and or format! (No map packs!)", mapStr); // NOTE: if we get here, then the game is basically over, The host can't send the file for whatever reason... // Which also means, that we can't continue. debug(LOG_NET, "***Host has a file issue, and is being forced to quit!***"); NETbeginEncode(NETbroadcastQueue(), NET_HOST_DROPPED); NETend(); abort(); } // get the file's size. fileSize_64 = PHYSFS_fileLength(pFileHandle); debug(LOG_NET, "File is valid, sending [directory: %s] %s to client %u", PHYSFS_getRealDir(mapStr), mapStr, player); NetPlay.players[player].wzFile.pFileHandle = pFileHandle; NetPlay.players[player].wzFile.fileSize_32 = (int32_t) fileSize_64; //we don't support 64bit int nettypes. NetPlay.players[player].wzFile.currPos = 0; NETsendFile(game.map, game.hash, player); } return true; }
// continue sending the map void sendMap(void) { int i = 0; for (i = 0; i < MAX_PLAYERS; i++) { if (NetPlay.players[i].wzFile.isSending) { int done = NETsendFile(game.map, game.hash, i); if (done == 100) { addConsoleMessage("MAP SENT!",DEFAULT_JUSTIFY, SYSTEM_MESSAGE); debug(LOG_NET, "=== File has been sent to player %d ===", i); NetPlay.players[i].wzFile.isSending = false; NetPlay.players[i].needFile = false; } } } }
// //////////////////////////////////////////////////////////////////////////// // Network File packet processor. bool recvMapFileRequested(NETQUEUE queue) { char mapStr[256],mapName[256],fixedname[256]; uint32_t player; PHYSFS_sint64 fileSize_64; PHYSFS_file *pFileHandle; if(!NetPlay.isHost) // only host should act { ASSERT(false, "Host only routine detected for client!"); return false; } // Check to see who wants the file NETbeginDecode(queue, NET_FILE_REQUESTED); NETuint32_t(&player); NETend(); if (!NetPlay.players[player].wzFile.isSending) { NetPlay.players[player].needFile = true; NetPlay.players[player].wzFile.isCancelled = false; NetPlay.players[player].wzFile.isSending = true; memset(mapStr,0,256); memset(mapName,0,256); memset(fixedname,0,256); addConsoleMessage("Map was requested: SENDING MAP!",DEFAULT_JUSTIFY, SYSTEM_MESSAGE); sstrcpy(mapName, game.map); if ( strstr(mapName,"-T1") != 0 || strstr(mapName,"-T2") != 0 || strstr(mapName,"-T3") != 0) { // chop off the -T1 *only when needed!* mapName[strlen(game.map)-3] = 0; // chop off the -T1 etc.. } // chop off the sk- if required. if(strncmp(mapName,"Sk-",3) == 0) { sstrcpy(mapStr, &(mapName[3])); sstrcpy(mapName, mapStr); } snprintf(mapStr, sizeof(mapStr), "%dc-%s.wz", game.maxPlayers, mapName); snprintf(fixedname, sizeof(fixedname), "maps/%s", mapStr); //We know maps are in /maps dir...now. fix for linux -Q sstrcpy(mapStr, fixedname); debug(LOG_NET, "Map was requested. Looking for %s", mapStr); // Checking to see if file is available... pFileHandle = PHYSFS_openRead(mapStr); if (pFileHandle == NULL) { debug(LOG_ERROR, "Failed to open %s for reading: %s", mapStr, PHYSFS_getLastError()); debug(LOG_FATAL, "You have a map (%s) that can't be located.\n\nMake sure it is in the correct directory and or format! (No map packs!)", mapStr); // NOTE: if we get here, then the game is basically over, The host can't send the file for whatever reason... // Which also means, that we can't continue. debug(LOG_NET, "***Host has a file issue, and is being forced to quit!***"); NETbeginEncode(NETbroadcastQueue(), NET_HOST_DROPPED); NETend(); abort(); } // get the file's size. fileSize_64 = PHYSFS_fileLength(pFileHandle); debug(LOG_NET, "File is valid, sending [directory: %s] %s to client %u", PHYSFS_getRealDir(mapStr), mapStr, player); NetPlay.players[player].wzFile.pFileHandle = pFileHandle; NetPlay.players[player].wzFile.fileSize_32 = (int32_t) fileSize_64; //we don't support 64bit int nettypes. NetPlay.players[player].wzFile.currPos = 0; NETsendFile(mapStr, player); } return true; }