示例#1
0
        /// <summary>
        ///   Special handling for DirectionMessage objects.
        ///   This updates the collision volumes if needed.
        /// </summary>
        /// <param name="message">the message object from the server</param>
        public void HandleDirection(BaseWorldMessage message)
        {
            DirectionMessage dirMessage = message as DirectionMessage;
            ObjectNode       objNode    = worldManager.GetObjectNode(dirMessage.Oid);

            if (objNode != null)
            {
                bool static_object = true;
                if ((objNode.ObjectType == ObjectNodeType.Npc) ||
                    (objNode.ObjectType == ObjectNodeType.User))
                {
                    static_object = false;
                }
                if (static_object)
                {
                    RemoveCollisionObject(objNode);
                    AddCollisionObject(objNode);
                }
                else
                {
                    if (objNode.Collider != null)
                    {
                        objNode.Collider.Transform(objNode.SceneNode.DerivedScale,
                                                   objNode.SceneNode.DerivedOrientation,
                                                   objNode.SceneNode.DerivedPosition);
                    }
                }
            }
        }
示例#2
0
        private void OnMessageDirection(ref DirectionMessage directionMessage)
        {
            _userDirection = directionMessage;

            if (!_userDirection.Download && DownloadItem == null)
            {
                Logger.Warn("User {0} want to upload and we have no DownloadItem for him. Disconnecting.", _source.UserNickname);
                Dispose();
            }
        }
示例#3
0
        protected override void ParseRaw(byte[] buffer, int offset, int length)
        {
            if (_disposed)
            {
                return;
            }

            if (_tail != null)
            {
                var newBuffer = new byte[_tail.Length + length];

                Buffer.BlockCopy(_tail, 0, newBuffer, 0, _tail.Length);
                Buffer.BlockCopy(buffer, offset, newBuffer, _tail.Length, length);

                length = length + _tail.Length;
                buffer = newBuffer;
                offset = 0;
                _tail  = null;
            }

            if (_binaryMode)
            {
                ParseBinary(buffer, offset, length);
                return;
            }

            int cmdEndIndex = offset;

            while (true)
            {
                var prevPos = cmdEndIndex == offset ? offset : cmdEndIndex + 1;
                cmdEndIndex = Array.IndexOf(buffer, (byte)'|', prevPos, length - (cmdEndIndex - offset));

                if (cmdEndIndex == -1)
                {
                    if (prevPos < length)
                    {
                        _tail = new byte[length - prevPos];
                        Buffer.BlockCopy(buffer, prevPos, _tail, 0, _tail.Length);
                    }

                    break;
                }

                var command = _encoding.GetString(buffer, prevPos, cmdEndIndex - prevPos);

                if (IncomingMessage != null)
                {
                    OnIncomingMessage(new MessageEventArgs {
                        Message = command
                    });
                }

                if (command.Length > 0 && command[0] == '$')
                {
                    // command
                    var spaceIndex = command.IndexOf(' ');
                    var cmdName    = spaceIndex == -1 ? command : command.Substring(0, spaceIndex);

                    switch (cmdName)
                    {
                    case "$MyNick":
                    {
                        var arg = MyNickMessage.Parse(command);
                        OnMessageMyNick(ref arg);
                    }
                    break;

                    case "$Supports":
                    {
                        var arg = SupportsMessage.Parse(command);
                        OnMessageSupports(ref arg);
                    }
                    break;

                    case "$Lock":
                    {
                        var arg = LockMessage.Parse(command);
                        OnMessageLock(ref arg);
                    }
                    break;

                    case "$Direction":
                    {
                        var arg = DirectionMessage.Parse(command);
                        OnMessageDirection(ref arg);
                    }
                    break;

                    case "$Error":
                    {
                        var arg = ErrorMessage.Parse(command);
                        OnMessageError(ref arg);
                    }
                    break;

                    case "$Key":
                    {
                        var arg = KeyMessage.Parse(command);
                        OnMessageKey(ref arg);
                    }
                    break;

                    case "$ADCSND":
                    {
                        var arg = ADCSNDMessage.Parse(command);
                        if (OnMessageAdcsnd(ref arg))
                        {
                            prevPos = cmdEndIndex + 1;
                            if (prevPos < length + offset)
                            {
                                _tail = new byte[length - (prevPos - offset)];
                                Buffer.BlockCopy(buffer, prevPos, _tail, 0, _tail.Length);
                            }

                            _binaryMode = true;
                            return;
                        }

                        Dispose();
                    }
                    break;

                    case "$ADCGET":
                    {
                        var arg = ADCGETMessage.Parse(command);
                        OnMessageAdcget(arg);
                    }
                    break;
                    }
                }
            }
        }