/// <summary> /// Sends a chat message to the specified tag. /// </summary> /// <param name="tag">The ID of the player to send the message to</param> public static void sendChatMessage(String tag) { SapiSpeech.speak("Enter message", SapiSpeech.SpeakFlag.interruptable); String chatMsg = Common.mainGUI.receiveInput(); if (!chatMsg.Equals("")) { SapiSpeech.speak("You say: " + chatMsg, SapiSpeech.SpeakFlag.interruptable); sendCommand(CSCommon.cmd_chat, true, tag, chatMsg); } else //canceled chat { SapiSpeech.speak("Canceled", SapiSpeech.SpeakFlag.interruptable); } }
/// <summary> /// Sends destroyed indication to server /// </summary> /// <param name="name">The name of the killer</param> /// <param name="tag">The tag of the killer</param> public void indicateDestroyedBy(String name, String tag) { if (doneDestroyedBy) { return; } doneDestroyedBy = true; if (isSender()) { if (!id.StartsWith("B-", StringComparison.OrdinalIgnoreCase)) { SapiSpeech.speak("Vous avez été détruit par " + name, SapiSpeech.SpeakFlag.interruptable); } Client.sendCommand(CSCommon.cmd_serverMessage, this.name + " was poned by " + name); if (!isBot() && tag != null) { Client.sendCommand(CSCommon.cmd_updatePoints, tag); } } }
private static void processRCV() { try { while (live) { if (!CSCommon.isLiveConnection(client)) { live = false; SapiSpeech.speak("Error: Server crash.", SapiSpeech.SpeakFlag.noInterrupt); Common.exitMenus = true; Common.repop(); return; } MemoryStream stream = null; //Bytes have to be explicitly copied into new stream since cmds is closed to save memory later on, so we'll lose rcvPauseData. stream = CSCommon.getData(client); BinaryReader cmds = null; if (stream != null) { cmds = new BinaryReader(stream); } if (cmds != null) { sbyte t; long start = 0; //start position of current packet while (cmds.BaseStream.Length > cmds.BaseStream.Position) { start = cmds.BaseStream.Position; System.Diagnostics.Trace.WriteLine(String.Format("S: {0}, L: {1}", start, cmds.BaseStream.Length)); t = cmds.ReadSByte(); if (t == 1) { byte command = cmds.ReadByte(); System.Diagnostics.Trace.WriteLine("co " + command); switch (command) { case CSCommon.cmd_addMember: addMember(cmds.ReadString(), cmds.ReadString()); break; case CSCommon.cmd_removeMember: removeMember(cmds.ReadString()); break; case CSCommon.cmd_resp: int respLength = cmds.ReadInt32(); responseStream = new byte[respLength]; cmds.BaseStream.Read(responseStream, 0, respLength); waitingForResponse.Set(); break; case CSCommon.cmd_notifyDemo: DSound.PlaySound(DSound.LoadSound(DSound.NSoundPath + "\\cd3.wav"), true, false); break; case CSCommon.cmd_newval: SelfVoice.purge(true); int amount = cmds.ReadInt32(); SelfVoice.NLS("#" + amount + "&points.wav", true, true); addChatMessage(String.Format("You earned {0} point{1}", amount, (amount == 1) ? "" : "s")); break; case CSCommon.cmd_position: next = cmds.ReadInt64(); addOns = processAddOns(cmds); break; case CSCommon.cmd_chat: MessageType type = (MessageType)cmds.ReadByte(); if (type == MessageType.normal) { DSound.PlaySound(chatSound, true, false); } else if (type == MessageType.enterRoom) { DSound.PlaySound(chatEnterSound, true, false); } else if (type == MessageType.leaveRoom) { DSound.PlaySound(chatLeaveSound, true, false); } else if (type == MessageType.privateMessage) { DSound.PlaySound(privateMessageSound, true, false); } else { DSound.PlaySound(serverMessageSound, true, false); } String incomingChatMessage = cmds.ReadString(); SapiSpeech.speak(incomingChatMessage, SapiSpeech.SpeakFlag.interruptable); addChatMessage(incomingChatMessage); Common.mainGUI.addToHistory(incomingChatMessage); break; case CSCommon.cmd_serverMessage: String incomingServerMessage = cmds.ReadString(); SapiSpeech.speak(incomingServerMessage, SapiSpeech.SpeakFlag.interruptable); addChatMessage(incomingServerMessage); break; case CSCommon.cmd_forceDisconnect: //Player was disconnected from the server //By the server itself and not through an in-game event, //so if we receive this command, we are being told to wipe our copy of the player in question. //Still, the server will send forceDisconnect even if object has already been disconnected //due to in-game event. This is ok since if the object is already gone, //this command will do nothing. It is just a redundancy check, more or less. String idToTerminate = cmds.ReadString(); Projector pToTerm = Interaction.objectAt(idToTerminate); if (pToTerm != null) { pToTerm.requestingTerminate(); } Interaction.clearLocks(idToTerminate); break; case CSCommon.cmd_requestCreate: //Response from server for requestCreate command sent by client. Interaction.createPlayer(cmds.ReadString(), cmds.ReadInt32()); addSender(Mission.player.id); if (addOns != null) { Mission.player.setAddOns(addOns); } addOns = null; if (Options.mode == Options.Modes.teamDeath) { Mission.player.team = Options.team; } Interaction.startMultiplayerGame(); break; case CSCommon.cmd_distributeServerTag: Projector o = Interaction.createObjectFromServer(cmds.ReadString(), cmds.ReadString(), OnlineRole.receiver, (ObjectType)cmds.ReadByte()); System.Diagnostics.Trace.WriteLine("Received request to create opponent " + o.name); if (Options.mode == Options.Modes.teamDeath) { o.team = (Projector.TeamColors)cmds.ReadInt32(); } AddOnArgs[] distAdd = processAddOns(cmds); if (distAdd != null) { o.setAddOns(distAdd); } break; case CSCommon.cmd_createBot: String createBotId = cmds.ReadString(); String createBotName = cmds.ReadString(); Projector bot = Interaction.createObjectFromServer(createBotId, createBotName, OnlineRole.bot, (ObjectType)cmds.ReadByte()); //will create bot or update current receiver to bot status. addSender(bot.id); break; case CSCommon.cmd_startGame: hostStartedGame = true; System.Diagnostics.Trace.WriteLine("Host started game"); break; case CSCommon.cmd_gameEnded: Options.serverEndedGame = true; break; } //switch System.Diagnostics.Trace.WriteLine("Command: " + t); continue; } //if command System.Diagnostics.Trace.Write(String.Format("Stream position: {0}, start: {1}, Char: {2} ", (int)cmds.BaseStream.Position, start, t)); int size = cmds.ReadInt32(); //total update size System.Diagnostics.Trace.WriteLine("Size: " + size); int temSize = size; String tag = cmds.ReadString(); System.Diagnostics.Trace.WriteLine(tag + " queuing data..."); Projector p = null; size = size - (int)(cmds.BaseStream.Position - start); byte[] buffer = null; try { buffer = new byte[size]; } catch (OverflowException) { throw new OverflowException(String.Format("Size: {0}, Stream position: {1}, start: {2}, original size: {3} Char: {4}", size, (int)cmds.BaseStream.Position, start, temSize, t)); } cmds.BaseStream.Read(buffer, 0, size); //Object could have been deleted by the time this command is reached if ((p = Interaction.objectAt(tag)) != null) { System.Diagnostics.Trace.WriteLine("Object found. sending queue"); p.queueData(t, buffer); } //if object exists else { System.Diagnostics.Trace.WriteLine("Object not found."); } } //while more data to read cmds.Close(); } //if got data Thread.Sleep(50); } //while live connection } catch (Exception e) { Common.handleError(e); } //catch finally { releaseConnection(); } }
public static bool connect(String host, String callSign, int port) { ports = new int[] { 4444, 4445, 4567, 6969, 32000 }; if (dataLocker == null) { dataLocker = new object(); } if (chatLocker == null) { chatLocker = new object(); } if (chatMessages == null) { chatMessages = new List <String>(); } if (members == null) { members = new List <ChatRoomMember>(); } chatPointer = 0; chatSound = DSound.LoadSound(DSound.SoundPath + "\\chat1.wav"); chatEnterSound = DSound.LoadSound(DSound.SoundPath + "\\chat2.wav"); chatLeaveSound = DSound.LoadSound(DSound.SoundPath + "\\chat3.wav"); privateMessageSound = DSound.LoadSound(DSound.SoundPath + "\\chat4.wav"); serverMessageSound = DSound.LoadSound(DSound.SoundPath + "\\chat5.wav"); senders = new Dictionary <string, ClientRecord>(); waitingForResponse = new AutoResetEvent(false); isConnected = false; error = false; live = false; client = new TcpClient(); int i = (port != 0) ? Array.IndexOf(ports, port) : 0; int time = 0; while (i < ports.Length) { error = false; time = 0; client.BeginConnect(host, port = ports[i++], new AsyncCallback(connectedEvent), null); while (!isConnected && !error) { Application.DoEvents(); if (time >= 3000) { endConnect(); //stop trying to connect on this port break; } time += 100; Thread.Sleep(100); } if (isConnected) { break; } } //search ports if (!isConnected || error) { return(false); } Options.writeToFile(); try { using (BinaryWriter writer = new BinaryWriter(new MemoryStream())) { writer.Write(callSign); writer.Flush(); CSCommon.sendData(client, writer); } //using LoginMessages resp = LoginMessages.none; using (BinaryReader reader = new BinaryReader(CSCommon.getData(client, 5000))) { resp = (LoginMessages)reader.ReadInt32(); m_messages = resp; if ((resp & LoginMessages.serverAssignedTag) == LoginMessages.serverAssignedTag) { serverTag = reader.ReadString(); String messageOfTheDay = reader.ReadString(); if ((resp & LoginMessages.messageOfTheDay) == LoginMessages.messageOfTheDay) { // We now need to speak the message and then show an input box for the user to // press ENTER to continue. This is because some screen readers // Don't have a way to stop the running thread. SapiSpeech.speak("[Welcome message]: " + messageOfTheDay + " (press ENTER to continue)", SapiSpeech.SpeakFlag.interruptable); Common.mainGUI.receiveInput().Trim(); } System.Diagnostics.Trace.WriteLine("Server sent tag: " + serverTag); } } //using if ((resp & LoginMessages.demo) == LoginMessages.demo) { BPCSharedComponent.ExtendedAudio.DSound.playAndWait(BPCSharedComponent.ExtendedAudio.DSound.NSoundPath + "\\cd" + Common.getRandom(1, 2) + ".wav"); } if ((resp & LoginMessages.noCallSign) == LoginMessages.noCallSign) { BPCSharedComponent.ExtendedAudio.DSound.playAndWait(BPCSharedComponent.ExtendedAudio.DSound.NSoundPath + "\\ncs.wav"); } if ((resp & LoginMessages.badVersion) == LoginMessages.badVersion) { SapiSpeech.speak("There is a newer version of TDV available. Please update before logging on.", SapiSpeech.SpeakFlag.noInterrupt); return(false); } if ((resp & LoginMessages.wrongCredentials) == LoginMessages.wrongCredentials) { BPCSharedComponent.ExtendedAudio.DSound.playAndWait(BPCSharedComponent.ExtendedAudio.DSound.NSoundPath + "\\pw2.wav"); return(false); } } catch (IOException) { error = true; } catch (TimeoutException) { error = true; } if (error) { return(false); } if (log) { theFile = new StreamWriter(Addendums.File.appPath + "\\server_output.log"); } live = true; processThread = new Thread(processRCV); processThread.Start(); return(true); }
public static bool connect(String host, String password, int port, String tag) { System.Diagnostics.Trace.WriteLine("Server tag is " + tag); // ports = new int[]{4444, 4445, 4567, 6969, 32000 }; ports = new int[] { 31111 }; if (dataLocker == null) { dataLocker = new object(); } if (chatLocker == null) { chatLocker = new object(); } if (chatMessages == null) { chatMessages = new List <String>(); } if (members == null) { members = new List <ChatRoomMember>(); } chatPointer = 0; chatSound = DSound.LoadSound(DSound.SoundPath + "\\chat1.wav"); chatEnterSound = DSound.LoadSound(DSound.SoundPath + "\\chat2.wav"); chatLeaveSound = DSound.LoadSound(DSound.SoundPath + "\\chat3.wav"); privateMessageSound = DSound.LoadSound(DSound.SoundPath + "\\chat4.wav"); serverMessageSound = DSound.LoadSound(DSound.SoundPath + "\\chat5.wav"); senders = new Dictionary <string, ClientRecord>(); waitingForResponse = new AutoResetEvent(false); isConnected = false; error = false; live = false; client = new TcpClient(); serverTag = tag; int i = (port != 0) ? Array.IndexOf(ports, port) : 0; int time = 0; while (i < ports.Length) { error = false; time = 0; client.BeginConnect(host, port = ports[i++], new AsyncCallback(connectedEvent), null); while (!isConnected && !error) { Application.DoEvents(); if (time >= 3000) { endConnect(); //stop trying to connect on this port break; } time += 100; Thread.Sleep(100); } if (isConnected) { break; } } //search ports if (!isConnected || error) { return(false); } Options.writeToFile(); try { SslStream ssl = null; using (BinaryWriter writer = new BinaryWriter(new MemoryStream())) { writer.Write((int)0); System.Diagnostics.Trace.WriteLine("After int: " + writer.BaseStream.Length); writer.Write(Convert.ToSingle(Common.applicationVersion)); writer.Write(tag); System.Diagnostics.Trace.WriteLine("Tag is now " + tag); if (password != null) { writer.Write(password); } writer.Flush(); System.Diagnostics.Trace.WriteLine("After password: "******"bpcprograms.com"); writer.BaseStream.Position = 0; writer.Write((int)(writer.BaseStream.Length - 4)); writer.Flush(); System.Diagnostics.Trace.WriteLine("After data size print " + writer.BaseStream.Length); System.Diagnostics.Trace.WriteLine("SSL packet size: " + (writer.BaseStream.Length - 4)); writer.BaseStream.Position = 0; ((MemoryStream)writer.BaseStream).WriteTo(ssl); } //using LoginMessages resp = LoginMessages.none; using (BinaryReader reader = new BinaryReader(CSCommon.getData(client, 5000))) { resp = (LoginMessages)reader.ReadInt32(); m_messages = resp; if ((resp & LoginMessages.serverAssignedTag) == LoginMessages.serverAssignedTag) { serverTag = reader.ReadString(); System.Diagnostics.Trace.WriteLine("Server sent tag: " + serverTag); } } //using if ((resp & LoginMessages.demo) == LoginMessages.demo) { BPCSharedComponent.ExtendedAudio.DSound.playAndWait(BPCSharedComponent.ExtendedAudio.DSound.NSoundPath + "\\cd" + Common.getRandom(1, 2) + ".wav"); } if ((resp & LoginMessages.noCallSign) == LoginMessages.noCallSign) { BPCSharedComponent.ExtendedAudio.DSound.playAndWait(BPCSharedComponent.ExtendedAudio.DSound.NSoundPath + "\\ncs.wav"); } if ((resp & LoginMessages.badVersion) == LoginMessages.badVersion) { SapiSpeech.speak("There is a newer version of TDV available. Please update before logging on.", SapiSpeech.SpeakFlag.noInterrupt); return(false); } if ((resp & LoginMessages.wrongCredentials) == LoginMessages.wrongCredentials) { BPCSharedComponent.ExtendedAudio.DSound.playAndWait(BPCSharedComponent.ExtendedAudio.DSound.NSoundPath + "\\pw2.wav"); return(false); } } catch (IOException) { error = true; } catch (TimeoutException) { error = true; } if (error) { return(false); } if (log) { theFile = new StreamWriter(Addendums.File.appPath + "\\server_output.log"); } live = true; processThread = new Thread(processRCV); processThread.Start(); return(true); }
public static void readFromFile() { if (!File.Exists(Addendums.File.appPath + "\\settings.tdv")) { return; } BinaryReader s = null; try { s = new BinaryReader(new FileStream(Addendums.File.appPath + "\\settings.tdv", FileMode.Open)); //dump file data into dummy vars so if there's an error, the game options won't contain strange data //caused by the stream erroring out unexpectedly. //if player is running outdated config, don't error out, just ignore the rest float musicVol = s.ReadSingle(); Common.musicVolume = musicVol; musicVol = s.ReadSingle(); Common.cutSceneVolume = musicVol; bool announceCourse = s.ReadBoolean(); bool rp = s.ReadBoolean(); int announceV = s.ReadInt32(); byte en = s.ReadByte(); int launchC = s.ReadInt32(); int port = s.ReadInt32(); int speechSource = s.ReadInt32(); int ho = s.ReadInt32(); int da = s.ReadInt32(); int ye = s.ReadInt32(); String ip = s.ReadString(); String callSign = s.ReadString(); announceCourseChange = announceCourse; RPAutoTrigger = rp; verticalRangeAnnounceTime = announceV; enabled = (Device)en; launchCount = launchC; Client.port = port; if (speechSource > 2) { speechSource = (int)SapiSpeech.SpeechSource.auto; } SapiSpeech.setSource((SapiSpeech.SpeechSource)speechSource); hour = ho; day = da; year = ye; Options.ipOrDomain = ip; Options.callSign = callSign; bool pr = s.ReadBoolean(); playRIO = pr; byte sv = s.ReadByte(); menuVoiceMode = (VoiceModes)sv; sv = s.ReadByte(); statusVoiceMode = (VoiceModes)sv; float readerRate = s.ReadSingle(); SapiSpeech.screenReaderRate = readerRate; } catch (Exception e) { //Ignore the error } finally { s.Close(); } }
public static void readFromFile() { if (!File.Exists(Addendums.File.appPath + "\\settings.tdv")) { return; } BinaryReader s = null; try { s = new BinaryReader(new FileStream(Addendums.File.appPath + "\\settings.tdv", FileMode.Open)); //dump file data into dummy vars so if there's an error, the game options won't contain strange data //caused by the stream erroring out unexpectedly. //if player is running outdated config, don't error out, just ignore the rest float musicVol = s.ReadSingle(); bool announceCourse = s.ReadBoolean(); bool rp = s.ReadBoolean(); int announceV = s.ReadInt32(); int bufferS = s.ReadInt32(); byte en = s.ReadByte(); int launchC = s.ReadInt32(); int port = s.ReadInt32(); float menuVol = s.ReadSingle(); float onlineVol = s.ReadSingle(); int speechSource = s.ReadInt32(); int ho = s.ReadInt32(); int da = s.ReadInt32(); int ye = s.ReadInt32(); String ip = s.ReadString(); String callSign = s.ReadString(); Common.currentMusicVol = musicVol; announceCourseChange = announceCourse; RPAutoTrigger = rp; verticalRangeAnnounceTime = announceV; bufferSize = (DSound.BufferSize)bufferS; enabled = (Device)en; launchCount = launchC; Client.port = port; Common.menuMusicVol = menuVol; Common.onlineMusicVol = onlineVol; if (speechSource > 2) { speechSource = (int)SapiSpeech.SpeechSource.auto; } SapiSpeech.setSource((SapiSpeech.SpeechSource)speechSource); hour = ho; day = da; year = ye; Options.ipOrDomain = ip; Options.callSign = callSign; } catch (Exception e) { //Ignore the error System.Diagnostics.Trace.WriteLine("Error while reading options: " + e.GetBaseException()); return; } finally { s.Close(); } }