Пример #1
0
        public void SendID(int id, string name)
        {
            NameAndID nameid = new NameAndID(id, name);

            lock (_clientSocket.GetStream())
            {
                //Get stream
                NetworkStream str    = _clientSocket.GetStream();
                IFormatter    fmt    = new BinaryFormatter();
                MemoryStream  memStr = new MemoryStream();
                //Serialize object to the memorystream for sizing
                fmt.Serialize(memStr, nameid);
                byte[] data = memStr.GetBuffer();
                //get header info in bytes
                int    memSize = (int)memStr.Length;
                byte[] size    = BitConverter.GetBytes(memSize);
                byte[] type    = BitConverter.GetBytes((int)MsgType.PlayerID);
                byte[] header  = new Byte[8];
                size.CopyTo(header, 0);
                type.CopyTo(header, 4);

                //send header
                str.Write(header, 0, 8);
                //send data
                str.Write(data, 0, memSize);
                str.Flush();
                memStr.Close();
            }
        }
        public static SmartPropertyDefinition Parse(string definition, string groupID, int extraArgumentsAfterID = 0)
        {
            int idx = -1, count = 0, prevIdx = 0;

            definition = definition.Trim();

            List <string> allArgs = new List <string>();

            for (; count < (extraArgumentsAfterID + 1); count++, prevIdx = idx)
            {
                idx = definition.IndexOf('|', prevIdx);
                if (idx == -1)
                {
                    break;
                }

                allArgs.Add(definition.Substring(prevIdx, idx - prevIdx));
                idx++;
            }

            if (allArgs.Count < (extraArgumentsAfterID + 1) || idx == -1)
            {
                throw new Exception("Insufficient initial arguments in smart property definition");
            }


            bool?defaultOn        = null;

            if (allArgs[0].StartsWith("-"))
            {
                defaultOn = false;
            }
            else if (allArgs[0].StartsWith("+"))
            {
                defaultOn = true;
            }

            NameAndID name = new NameAndID(allArgs[0].TrimStart('-', '+'));

            string idWithoutPrefix, idWithPrefix;

            if (string.IsNullOrEmpty(groupID))
            {
                idWithoutPrefix = idWithPrefix = "com.sysprogs.bspoptions." + name.ID;
            }
            else
            {
                idWithoutPrefix = name.ID;
                idWithPrefix    = groupID + idWithoutPrefix;
            }

            string[] values = definition.Substring(idx).Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries);

            List <Item> items        = new List <Item>();
            int         defaultIndex = 0;

            foreach (var rawVal in values)
            {
                string val = rawVal.Trim();
                string regex, itemName;

                idx = val.IndexOf("=>");
                if (idx == -1)
                {
                    regex    = val;
                    itemName = "1";
                }
                else
                {
                    regex    = val.Substring(0, idx);
                    itemName = val.Substring(idx + 2);
                    if (itemName.StartsWith("+"))
                    {
                        defaultIndex = items.Count;
                    }
                }

                items.Add(new Item(regex, new NameAndID(itemName.TrimStart('+'))));
            }

            return(new SmartPropertyDefinition(name.Name, idWithoutPrefix, idWithPrefix, allArgs.Skip(1).ToArray(), defaultOn, items, defaultIndex));
        }
 public Item(string key, NameAndID value)
 {
     Key   = key;
     Value = value;
 }
Пример #4
0
        private void ProcessMessage(byte [] data)
        {
            //Deserialize message
            IFormatter   fmt       = new BinaryFormatter();
            MemoryStream memHolder = new MemoryStream(data, 0, data.Length);

            memHolder.Position = 0;
            switch (_msgType)
            {
            case MsgType.Ping:
            {
                Console.WriteLine("Pong");
                break;
            }

            case MsgType.Text:
            {
                MsgText msg = (MsgText)fmt.Deserialize(memHolder);
                //if this is the first message assign it to client name
                if (_firstTime)
                {
                    _userName  = msg.Text;
                    _firstTime = false;
                    _connected = true;
                    if (eConnected != null)
                    {
                        EventArgs e = new EventArgs();
                        eConnected(this, e);
                    }
                }
                else if (eMessageReceived != null && _connected)
                {
                    //Else raise the MessageReceived Event
                    //and pass the message along
                    MessageEventArgs e = new MessageEventArgs(msg);
                    eMessageReceived(this, e);
                }
                break;
            }

            case MsgType.Orders:
            {
                //
                //	TODO: make sure it isn't possible to get more
                //     than one set of orders in the list for a
                //		single player
                //

                //accept fleet data from player and add to
                //arraylist of fleetdata
                if (_fleet != null && _orders.Contains(_fleet))
                {
                    Console.WriteLine("Old fleet orders removed for player " + this._clientID);
                    _orders.Remove(_fleet);
                }
                Console.WriteLine("Attempting to Deserialize Orders from player");
                this._fleet = (Fleet)fmt.Deserialize(memHolder);
                ClientHost._orders.Add(_fleet);
                Console.WriteLine("Fleet added to server orders");
                this._ready = true;
                if (eReady != null)
                {
                    EventArgs e = new EventArgs();
                    eReady(this, e);
                }
                break;
            }

            case MsgType.Cancel:
            {
                ClientHost._orders.Remove(this._fleet);
                Console.WriteLine("Fleet orders removed for player " + this._clientID);
                this._ready = false;
                break;
            }

            case MsgType.PlayerIDRequest:
            {
                NameAndID nameAndID = (NameAndID)fmt.Deserialize(memHolder);
                int       id        = nameAndID.ID;
                string    password  = nameAndID.Password;
                if (eIDRequest != null)
                {
                    Console.WriteLine(_userName + " requests player ID(event fired)");
                    IDRequestEventArgs e = new IDRequestEventArgs(id, password);
                    eIDRequest(this, e);
                }
                break;
            }

            case MsgType.SystemName:
            {
                MsgSystemName sysName = (MsgSystemName)fmt.Deserialize(memHolder);
                if (this.eRenameSystem != null)
                {
                    SystemNameEventArgs mea = new SystemNameEventArgs(sysName);
                    this.eRenameSystem(this, mea);
                }
                break;
            }

            case MsgType.Trade:
            {
                MsgTrade tradeMsg = (MsgTrade)fmt.Deserialize(memHolder);
                if (this.eTradeMessage != null)
                {
                    TradeMessageEventArgs ea = new TradeMessageEventArgs(tradeMsg);
                    this.eTradeMessage(this, ea);
                }
                break;
            }
            }
            memHolder.Close();
            //Determine message type
            //Carry out message instructions
        }