public static Component GetPlateLocationComponent(ClientPlate plate)
        {
            Component locationComponent = GetObjectLocationComponent(plate);

            if (locationComponent != null)
            {
                return(locationComponent);
            }

            ClientPlateReturnStation[] plateReturnStations = Object.FindObjectsOfType <ClientPlateReturnStation>();

            foreach (ClientPlateReturnStation plateReturnStation in plateReturnStations)
            {
                ClientPlateStackBase plateStackBase =
                    (ClientPlateStackBase)ReflectionUtil.GetValue(plateReturnStation, "m_stack");

                ClientStack clientStack = (ClientStack)ReflectionUtil.GetValue(plateStackBase, "m_stack");

                List <GameObject> stackItems = (List <GameObject>)ReflectionUtil.GetValue(clientStack, "m_stackItems");

                if (stackItems.Contains(plate.gameObject))
                {
                    return(plateReturnStation);
                }
            }

            return(null);
        }
        public bool Pump()
        {
            List <MockStack> serverStacks;

            if (Queue.Count == 0)
            {
                return(false);
            }

            MockQueueItem item = Queue.Peek();

            switch (item.ItemType)
            {
            //  state #1 - client requested a send of a request
            case MockQueueItem.QueueType.ClientSendRequest:
                Queue.Dequeue();
                if (item.Request.Destination == null)
                {
                    item.Request.Destination = ServerAddress;
                }

                ClientStack.SendRequest(item.Request);
                break;

            //  state #2 - client ready for network send
            case MockQueueItem.QueueType.ClientSendRequestNetwork:
                Queue.Dequeue();
                MessageEncoder encoder        = new Spec.MessageEncoder18();
                byte[]         encodedRequest = encoder.Encode(item.Request);
                EndPoint       destination    = item.Request.Destination;

                item             = new MockQueueItem(MockQueueItem.QueueType.ServerSendRequestNetwork, encodedRequest);
                item.Source      = ClientAddress;
                item.Destination = destination;
                Queue.Enqueue(item);
                break;

            //  state #3 - server receives network send
            case MockQueueItem.QueueType.ServerSendRequestNetwork:
                Queue.Dequeue();
                serverStacks = ServerStacks[item.Destination];
                foreach (MockStack s in serverStacks)
                {
                    s.MyEndPoint.ReceiveData(item);
                }

                break;

            //  state #4 - server application receives request
            case MockQueueItem.QueueType.ServerSendRequest:
                break;


            // state #5 - server sends an response
            case MockQueueItem.QueueType.ServerSendResponse:
                Queue.Dequeue();
                serverStacks = ServerStacks[item.Source];
                Assert.AreEqual(1, serverStacks.Count);
                foreach (MockStack s in serverStacks)
                {
                    s.SendResponse(item.Exchange, item.Response);
                }

                break;

            // state #6 - server ready to send over network
            case MockQueueItem.QueueType.ServerSendResponseNetwork:
                Queue.Dequeue();
                encoder = new Spec.MessageEncoder18();
                byte[] encodedResponse = encoder.Encode(item.Response);

                MockQueueItem item2 = new MockQueueItem(MockQueueItem.QueueType.ClientSendResponseNetwork, encodedResponse);
                item2.Source      = item.Response.Source;
                item2.Destination = item.Response.Destination;
                Queue.Enqueue(item2);
                break;

            // state #7 - client receives response over network
            case MockQueueItem.QueueType.ClientSendResponseNetwork:
                Queue.Dequeue();

                serverStacks = ServerStacks[item.Destination];
                Assert.AreEqual(1, serverStacks.Count);
                foreach (MockStack s in serverStacks)
                {
                    s.MyEndPoint.ReceiveData(item);
                }

                break;

            case MockQueueItem.QueueType.ClientSendResponse:
                break;

            // state #8 - client application to process response
            case MockQueueItem.QueueType.ClientSendEmptyMessageNetwork:
                Queue.Dequeue();
                encoder        = new Spec.MessageEncoder18();
                encodedRequest = encoder.Encode(item.EmptyMessage);

                item2             = new MockQueueItem(MockQueueItem.QueueType.ServerSendEmptyMessageNetwork, encodedRequest);
                item2.Source      = item.Source;
                item2.Destination = item.EmptyMessage.Destination;
                Queue.Enqueue(item2);
                break;

            //  state #3 - server receives network send
            case MockQueueItem.QueueType.ServerSendEmptyMessageNetwork:
                Queue.Dequeue();
                serverStacks = ServerStacks[item.Destination];
                foreach (MockStack s in serverStacks)
                {
                    s.MyEndPoint.ReceiveData(item);
                }
                break;

            case MockQueueItem.QueueType.NetworkSend:
                Queue.Dequeue();
                List <MockChannel> channels = ChannelsByEndpoint[item.Destination];

                foreach (MockChannel c in channels)
                {
                    c.ReceiveData(item);
                }

                break;


            default:
                Assert.Fail("Unknown item in the pump");
                break;
            }

            return(Queue.Count > 0);
        }