Ejemplo n.º 1
0
        /// <summary>
        /// Enqueues event that have to be done on target object.
        /// </summary>
        /// <param name="stream">Stream with event data.</param>
        /// <param name="targetObjectId">Object id that is a target of the event.</param>
        /// <param name="blockingObjectId">Object id that is blocking target to be processed. 'NetworkId.Invalid' if none.</param>
        /// <param name="eventId">Event id.</param>
        /// <param name="sender">Endpoint.</param>
        public void EnqueueEvent(BitStream stream, NetworkId targetObjectId, NetworkId blockingObjectId, uint eventId, EndpointId sender)
        {
            int requiredByteSize = stream.ByteLength - stream.BytePosition + 1;

            var e = ObtainEvent();

            e.Stream.ResetWrite();
            e.Stream.WriteBitStream(stream);
            e.Stream.ResetRead();
            e.TargetObjectId   = targetObjectId;
            e.BlockingObjectId = blockingObjectId;
            e.EventId          = eventId;
            e.Sender           = sender;
            e.IsBarrier        = false;

            MyObjectEventsBuffer eventBuffer;

            if (!m_buffer.TryGetValue(targetObjectId, out eventBuffer))
            {
                eventBuffer        = new MyObjectEventsBuffer();
                eventBuffer.Events = ObtainList();
                m_buffer.Add(targetObjectId, eventBuffer);
            }
            eventBuffer.IsProcessing = false;
            eventBuffer.Events.Enqueue(e);
        }
Ejemplo n.º 2
0
        private bool ProcessEventsBuffer(MyObjectEventsBuffer eventsBuffer, NetworkId targetObjectId, Handler eventHandler,
                                         IsBlockedHandler isBlockedHandler, NetworkId caller, ref Queue <NetworkId> postProcessQueue)
        {
            while (eventsBuffer.Events.Count > 0)
            {
                bool            success = true;
                MyBufferedEvent e       = eventsBuffer.Events.Peek();

                if (e.IsBarrier)
                {
                    success = this.ProcessBarrierEvent(targetObjectId, e, eventHandler, isBlockedHandler);
                }
                else
                {
                    // If you have blocking entity id, than try to check if it has your barrier on top,
                    // If yes, than process yourself, and put the other id to process later.
                    // If no, than process that id first, as you cannot proceede without it.
                    if (e.BlockingObjectId.IsValid)
                    {
                        success = this.ProcessBlockingEvent(targetObjectId, e, caller, eventHandler, isBlockedHandler, ref postProcessQueue);
                    }
                    else
                    {
                        eventHandler(e.Stream, e.TargetObjectId, e.BlockingObjectId, e.EventId, e.Sender);
                    }

                    if (success)
                    {
                        e.Stream.CheckTerminator();
                        eventsBuffer.Events.Dequeue();
                        ReturnEvent(e);
                    }
                }

                if (!success)
                {
                    eventsBuffer.IsProcessing = false;
                    return(false);
                }
            }

            return(true);
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Enqueues barrier for an entity that is targeting network object with blocking event. WARNING: Have to be in
        /// pair with blocking event!
        /// </summary>
        /// <param name="targetObjectId">Network object id that will get barrier event.</param>
        /// <param name="blockingObjectId">Network object that have blocking event.</param>
        public void EnqueueBarrier(NetworkId targetObjectId, NetworkId blockingObjectId)
        {
            var e = ObtainEvent();

            e.TargetObjectId   = targetObjectId;
            e.BlockingObjectId = blockingObjectId;
            e.IsBarrier        = true;

            MyObjectEventsBuffer eventsBuffer;

            if (!m_buffer.TryGetValue(targetObjectId, out eventsBuffer))
            {
                eventsBuffer        = new MyObjectEventsBuffer();
                eventsBuffer.Events = ObtainList();
                m_buffer.Add(targetObjectId, eventsBuffer);
            }
            eventsBuffer.IsProcessing = false;
            eventsBuffer.Events.Enqueue(e);
        }
Ejemplo n.º 4
0
        private bool ProcessEventsBuffer(MyObjectEventsBuffer eventsBuffer, NetworkId targetObjectId, Handler eventHandler, 
            IsBlockedHandler isBlockedHandler, NetworkId caller, ref Queue<NetworkId> postProcessQueue)
        {
            while (eventsBuffer.Events.Count > 0)
            {

                bool success = true;
                MyBufferedEvent e = eventsBuffer.Events.Peek();

                if (e.IsBarrier)
                {
                    success = this.ProcessBarrierEvent(targetObjectId, e, eventHandler, isBlockedHandler);
                }
                else
                {
                    // If you have blocking entity id, than try to check if it has your barrier on top,
                    // If yes, than process yourself, and put the other id to process later.
                    // If no, than process that id first, as you cannot proceede without it.
                    if (e.BlockingObjectId.IsValid)
                    {
                        success = this.ProcessBlockingEvent(targetObjectId, e, caller, eventHandler, isBlockedHandler, ref postProcessQueue);
                    }
                    else
                    {
                        eventHandler(e.Stream, e.TargetObjectId, e.BlockingObjectId, e.EventId, e.Sender);
                    }

                    if (success)
                    {
                        eventsBuffer.Events.Dequeue();
                        ReturnEvent(e);
                    }

                }

                if(!success)
                {
                    eventsBuffer.IsProcessing = false;
                    return false;
                }

            }

            return true;

        }
Ejemplo n.º 5
0
        /// <summary>
        /// Enqueues barrier for an entity that is targeting network object with blocking event. WARNING: Have to be in
        /// pair with blocking event!
        /// </summary>
        /// <param name="targetObjectId">Network object id that will get barrier event.</param>
        /// <param name="blockingObjectId">Network object that have blocking event.</param>
        public void EnqueueBarrier(NetworkId targetObjectId, NetworkId blockingObjectId)
        {
            var e = ObtainEvent();
            e.TargetObjectId = targetObjectId;
            e.BlockingObjectId = blockingObjectId;
            e.IsBarrier = true;

            MyObjectEventsBuffer eventsBuffer;
            if (!m_buffer.TryGetValue(targetObjectId, out eventsBuffer))
            {
                eventsBuffer = new MyObjectEventsBuffer();
                eventsBuffer.Events = ObtainList();
                m_buffer.Add(targetObjectId, eventsBuffer);
            }
            eventsBuffer.IsProcessing = false;
            eventsBuffer.Events.Enqueue(e);

        }
Ejemplo n.º 6
0
        /// <summary>
        /// Enqueues event that have to be done on target object.
        /// </summary>
        /// <param name="stream">Stream with event data.</param>
        /// <param name="targetObjectId">Object id that is a target of the event.</param>
        /// <param name="blockingObjectId">Object id that is blocking target to be processed. 'NetworkId.Invalid' if none.</param>
        /// <param name="eventId">Event id.</param>
        /// <param name="sender">Endpoint.</param>
        public void EnqueueEvent(BitStream stream, NetworkId targetObjectId, NetworkId blockingObjectId, uint eventId, EndpointId sender)
        {
            int requiredByteSize = stream.ByteLength - stream.BytePosition + 1;

            var e = ObtainEvent();
            e.Stream.ResetWrite();
            e.Stream.WriteBitStream(stream);
            e.Stream.ResetRead();
            e.TargetObjectId = targetObjectId;
            e.BlockingObjectId = blockingObjectId;
            e.EventId = eventId;
            e.Sender = sender;
            e.IsBarrier = false;

            MyObjectEventsBuffer eventBuffer;
            if (!m_buffer.TryGetValue(targetObjectId, out eventBuffer))
            {
                eventBuffer = new MyObjectEventsBuffer();
                eventBuffer.Events = ObtainList();
                m_buffer.Add(targetObjectId, eventBuffer);
            }
            eventBuffer.IsProcessing = false;
            eventBuffer.Events.Enqueue(e);

        }