Syncing campaign state & save files with clients (WIP)
This commit is contained in:
@@ -142,14 +142,18 @@ namespace Barotrauma.Networking
|
||||
|
||||
private List<FileTransferIn> activeTransfers;
|
||||
|
||||
private string downloadFolder;
|
||||
private Dictionary<FileTransferType, string> downloadFolders = new Dictionary<FileTransferType, string>()
|
||||
{
|
||||
{ FileTransferType.Submarine, "Submarines/Downloaded" },
|
||||
{ FileTransferType.CampaignSave, "Data/Saves/Multiplayer" }
|
||||
};
|
||||
|
||||
public List<FileTransferIn> ActiveTransfers
|
||||
{
|
||||
get { return activeTransfers; }
|
||||
}
|
||||
|
||||
public FileReceiver(string downloadFolder)
|
||||
public FileReceiver()
|
||||
{
|
||||
if (GameMain.Server != null)
|
||||
{
|
||||
@@ -157,8 +161,6 @@ namespace Barotrauma.Networking
|
||||
}
|
||||
|
||||
activeTransfers = new List<FileTransferIn>();
|
||||
|
||||
this.downloadFolder = downloadFolder;
|
||||
}
|
||||
|
||||
public void ReadMessage(NetIncomingMessage inc)
|
||||
@@ -201,11 +203,13 @@ namespace Barotrauma.Networking
|
||||
if (GameSettings.VerboseLogging)
|
||||
{
|
||||
DebugConsole.Log("Received file transfer initiation message: ");
|
||||
DebugConsole.Log(" File: "+fileName);
|
||||
DebugConsole.Log(" File: " + fileName);
|
||||
DebugConsole.Log(" Size: " + fileSize);
|
||||
DebugConsole.Log(" Sequence channel: " + inc.SequenceChannel);
|
||||
}
|
||||
|
||||
string downloadFolder = downloadFolders[(FileTransferType)fileType];
|
||||
|
||||
if (!Directory.Exists(downloadFolder))
|
||||
{
|
||||
try
|
||||
@@ -214,7 +218,7 @@ namespace Barotrauma.Networking
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
DebugConsole.ThrowError("Could not start a file transfer: failed to create the folder \""+downloadFolder+"\".", e);
|
||||
DebugConsole.ThrowError("Could not start a file transfer: failed to create the folder \"" + downloadFolder + "\".", e);
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -322,6 +326,13 @@ namespace Barotrauma.Networking
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
case (byte)FileTransferType.CampaignSave:
|
||||
if (Path.GetExtension(fileName) != ".save")
|
||||
{
|
||||
errorMessage = "Wrong file extension ''" + Path.GetExtension(fileName) + "''! (Expected .save)";
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
return true;
|
||||
@@ -376,6 +387,9 @@ namespace Barotrauma.Networking
|
||||
stream.Close();
|
||||
stream.Dispose();
|
||||
break;
|
||||
case FileTransferType.CampaignSave:
|
||||
//TODO: verify that the received file is a valid save file
|
||||
break;
|
||||
}
|
||||
|
||||
return true;
|
||||
|
||||
@@ -89,7 +89,7 @@ namespace Barotrauma.Networking
|
||||
|
||||
entityEventManager = new ClientEntityEventManager(this);
|
||||
|
||||
fileReceiver = new FileReceiver("Submarines/Downloaded");
|
||||
fileReceiver = new FileReceiver();
|
||||
fileReceiver.OnFinished += OnFileReceived;
|
||||
|
||||
characterInfo = new CharacterInfo(Character.HumanConfigFile, name,Gender.None,null);
|
||||
@@ -703,8 +703,11 @@ namespace Barotrauma.Networking
|
||||
|
||||
Rand.SetSyncedSeed(seed);
|
||||
|
||||
GameMain.GameSession = new GameSession(GameMain.NetLobbyScreen.SelectedSub, "", gameMode, Mission.MissionTypes[missionTypeIndex]);
|
||||
GameMain.GameSession.StartRound(levelSeed,loadSecondSub);
|
||||
if (gameMode.Name != "Campaign")
|
||||
{
|
||||
GameMain.GameSession = new GameSession(GameMain.NetLobbyScreen.SelectedSub, "", gameMode, Mission.MissionTypes[missionTypeIndex]);
|
||||
}
|
||||
GameMain.GameSession.StartRound(levelSeed, loadSecondSub);
|
||||
|
||||
if (respawnAllowed) respawnManager = new RespawnManager(this, GameMain.NetLobbyScreen.SelectedShuttle);
|
||||
|
||||
@@ -896,7 +899,16 @@ namespace Barotrauma.Networking
|
||||
Voting.AllowModeVoting = allowModeVoting;
|
||||
}
|
||||
}
|
||||
|
||||
bool campaignUpdated = inc.ReadBoolean();
|
||||
inc.ReadPadBits();
|
||||
if (campaignUpdated)
|
||||
{
|
||||
MultiplayerCampaign.ClientRead(inc);
|
||||
}
|
||||
|
||||
lastSentChatMsgID = inc.ReadUInt16();
|
||||
|
||||
break;
|
||||
case ServerNetObject.CHAT_MESSAGE:
|
||||
ChatMessage.ClientRead(inc);
|
||||
@@ -961,6 +973,9 @@ namespace Barotrauma.Networking
|
||||
outmsg.Write(GameMain.NetLobbyScreen.LastUpdateID);
|
||||
outmsg.Write(ChatMessage.LastID);
|
||||
|
||||
var campaign = GameMain.GameSession?.GameMode as MultiplayerCampaign;
|
||||
outmsg.Write(campaign == null ? 0 : campaign.LastUpdateID);
|
||||
|
||||
chatMsgQueue.RemoveAll(cMsg => !NetIdUtils.IdMoreRecent(cMsg.NetStateID, lastSentChatMsgID));
|
||||
for (int i = 0; i < chatMsgQueue.Count && i < ChatMessage.MaxMessagesPerPacket; i++)
|
||||
{
|
||||
@@ -1038,8 +1053,8 @@ namespace Barotrauma.Networking
|
||||
msg.Write((byte)ClientPacketHeader.FILE_REQUEST);
|
||||
msg.Write((byte)FileTransferMessageType.Initiate);
|
||||
msg.Write((byte)fileType);
|
||||
msg.Write(file);
|
||||
msg.Write(fileHash);
|
||||
if (file != null) msg.Write(file);
|
||||
if (fileHash != null) msg.Write(fileHash);
|
||||
client.SendMessage(msg, NetDeliveryMethod.ReliableUnordered);
|
||||
}
|
||||
|
||||
@@ -1083,6 +1098,22 @@ namespace Barotrauma.Networking
|
||||
textBlock.UserData = newSub;
|
||||
textBlock.ToolTip = newSub.Description;
|
||||
}
|
||||
break;
|
||||
case FileTransferType.CampaignSave:
|
||||
var campaign = GameMain.GameSession?.GameMode as MultiplayerCampaign;
|
||||
if (campaign == null) return;
|
||||
|
||||
GameMain.GameSession.SavePath = transfer.FilePath;
|
||||
campaign.LastSaveID = campaign.PendingSaveID;
|
||||
|
||||
if (GameMain.GameSession.Submarine == null)
|
||||
{
|
||||
var gameSessionDoc = SaveUtil.LoadGameSessionDoc(GameMain.GameSession.SavePath);
|
||||
string subPath = Path.Combine(SaveUtil.TempPath, ToolBox.GetAttributeString(gameSessionDoc.Root, "submarine", "")) + ".sub";
|
||||
|
||||
GameMain.GameSession.Submarine = new Submarine(subPath, "");
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user