Example #1
0
        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();
            }
        }