public static TransferLogic instantiateTransfer(string[] parts) { if (parts [0] == String.Empty || parts [1] == String.Empty) { return(null); } string fileName = parts [0]; string gameFolder = parts [1]; int fileLength; if (int.TryParse(parts [2], out fileLength)) { FileType type; if (fileName.IndexOf("SPH") > -1) { type = FileType.SPH_CRAFT; fileName = fileName.Substring(fileName.IndexOf("/") + 1); } else if (fileName.IndexOf("persistent") > -1) { type = FileType.PERSISTENT; } else if (fileName.IndexOf("quicksave") > -1) { type = FileType.QUICKSAVE; } else { type = FileType.VAB_CRAFT; fileName = fileName.Substring(fileName.IndexOf("/") + 1); } TransferLogic logic = new TransferLogic(fileName, gameFolder, type, fileLength); TransferLogic.createGameStructure(gameFolder); return(logic); } return(null); }
public void messageStream() { while (isActive) { if (watch == null) { watch = Stopwatch.StartNew(); } else { watch.Reset(); } NetIncomingMessage msg; while ((msg = peer.ReadMessage()) != null) { switch (msg.MessageType) { case NetIncomingMessageType.DiscoveryRequest: addToLog("Discovery Request from ip: " + msg.SenderEndPoint.Address.ToString()); NetOutgoingMessage resp = peer.CreateMessage(); resp.Write(playerName); peer.SendDiscoveryResponse(resp, msg.SenderEndPoint); break; case NetIncomingMessageType.DiscoveryResponse: addToLog("Discovery Response from player: " + msg.ReadString()); peer.Connect(msg.SenderEndPoint); isConnected = true; break; case NetIncomingMessageType.ConnectionApproval: msg.SenderConnection.Approve(); NetOutgoingMessage send = this.createPeerInfo(msg.SenderEndPoint, ""); break; case NetIncomingMessageType.Data: try{ int messageType = (int)msg.ReadByte(); if (((MessageType)messageType) == MessageType.File) { string[] gameInfo = TransferLogic.getFileInfo(msg); //sets msg cursor at files contents TransferLogic logic = TransferLogic.instantiateTransfer(gameInfo); TransferLogic.createGameStructure(gameInfo[1]); user.CurrentGame = gameInfo[1]; if (logic != null) { byte[] contents = msg.ReadBytes(logic.length); logic.writeFile(contents); logic.copyToGameFile(); } } else if (((MessageType)messageType) == MessageType.FileUpdate) { string length = TransferLogic.getNextPart(msg); int len; if (int.TryParse(length, out len)) { TransferLogic logic = new TransferLogic("persistent.sfs", user.CurrentGame, FileType.PERSISTENT, len); logic.readSaveUpdate(msg); } } }catch (Exception e) { Console.WriteLine(e.Message); } break; case NetIncomingMessageType.UnconnectedData: break; case NetIncomingMessageType.StatusChanged: break; default: break; } } lock (_taskLock) { if (sendTasks.Count > 0) { MultiplayerTask send = sendTasks.Dequeue(); send.peer = new MultiplayerTask.Peer(); send.peer.playerName = this.playerName; send.peer.connect = false; NetOutgoingMessage snd = peer.CreateMessage(); snd.Write(JsonConvert.SerializeObject(send)); } } watch.Stop(); long elapsed = watch.ElapsedMilliseconds; Thread.Sleep(1000 / networkRate - (int)elapsed); } }