public void SpawnPlayer(StarCollectorPeer peer)
    {
        Player player = new Player()
        {
            owner   = peer,
            actorID = AllocateActorID()
        };

        listPlayer.Add(player);

        //EventData evt = new EventData()
        //{
        //    Code = (byte)AckEventType.CreateActor,
        //    Parameters = new Dictionary<byte, object>()
        //    {
        //        {0, player.actorType},
        //        {1 , player.actorID},
        //        {2, player.posX},
        //        {3, player.posY},
        //        {4, peer.playerID}
        //    }
        //};

        //BroadcastEvent(evt, new SendParameters());
    }
 public void OnOperationRequest(StarCollectorPeer sender, OperationRequest operationRequest, SendParameters sendParameters)
 {
     executionFiber.Enqueue(() =>
     {
         this.ProcessMessage(sender,
             operationRequest, sendParameters);
     });
 }
 public void OnOperationRequest(StarCollectorPeer sender, OperationRequest operationRequest, SendParameters sendParameters)
 {
     executionFiber.Enqueue(() =>
     {
         this.ProcessMessage(sender,
                             operationRequest, sendParameters);
     });
 }
    public void ProcessMessage(StarCollectorPeer sender, OperationRequest operationRequest, SendParameters sendParameters)
    {
        if (operationRequest.OperationCode == (byte)AckRequestType.MoveCommand)
        {
            // move command from player
            long  actorID = (long)operationRequest.Parameters[0];
            float velX    = (float)operationRequest.Parameters[1];
            float velY    = (float)operationRequest.Parameters[2];

            // find actor
            Player player = (listPlayer.Find(pl =>
            {
                return(pl.actorID == actorID);
            }));

            player.velocityX = velX;
            player.velocityY = velY;

            //List<Player> listOtherPlayer =
        }
    }
    public void PeerLeft(StarCollectorPeer peer)
    {
        executionFiber.Enqueue(() =>
        {
            listPeer.Remove(peer);
        });

        Player player = listPlayer.Where(a => a.owner == peer).FirstOrDefault();

        if (player != null)
        {
            EventData evt = new EventData()
            {
                Code       = (byte)AckEventType.DestroyActor,
                Parameters = new Dictionary <byte, object>()
            };
            evt.Parameters[0] = player.actorID;
            BroadcastEvent(evt, new SendParameters());

            listPlayer.Remove(player);
        }
    }
    public void PeerJoined(StarCollectorPeer peer)
    {
        executionFiber.Enqueue( () =>
        {
            listPeer.Add(peer);
            SpawnPlayer(peer);
        });

        #region Test code
        //List<MPlayer> listTest = new List<MPlayer>()
        //{
        //    new MPlayer()
        //    {
        //        name = "ducanh",
        //        id =1
        //    },
        //    new MPlayer()
        //    {
        //        name = "hoanganh",
        //        id = 2
        //    }
        //};
        //EventData evtDataPlayer = new EventData()
        //{
        //    Code = (byte)AckEventType.TestData,
        //    Parameters = new Dictionary<byte, object>
        //    {
        //        {(byte)ActorType.Player,GeneralFunc.Serialize(listTest)}
        //    }
        //};
        //peer.SendEvent(evtDataPlayer, new SendParameters());
        #endregion

        // send player CreateActor events for players and stars which are in interest

        //foreach (var p in listPlayer)
        //{
        //    EventData evt = new EventData()
        //    {
        //        Code = (byte)AckEventType.CreateActor,
        //        Parameters = new Dictionary<byte, object>()
        //        {
        //            {0, p.actorType},
        //            {1, p.actorID},
        //            {2, p.posX},
        //            {3, p.posY},
        //            {4, (p.owner as StarCollectorPeer).playerID}
        //        }
        //    };

        //}
        //peer.SendEvent(evt, new SendParameters());
        //EventData evtDataPlayer = new EventData()
        //{
        //    Code = (byte)AckEventType.CreateActor,
        //    Parameters = new Dictionary<byte, object>
        //    {
        //        {(byte)ActorType.Player,listPlayer}
        //    }
        //};
        //peer.SendEvent(evtDataPlayer, new SendParameters());
        //peer.SendEvent()

        foreach (var s in listStar)
        {
            EventData evt = new EventData()
            {
                Code = (byte)AckEventType.CreateActor,
                Parameters = new Dictionary<byte, object>()
                {
                    {0, s.actorType},
                    {1, s.actorID},
                    {2, s.posX},
                    {3, s.posY}
                }
            };
            peer.SendEvent(evt, new SendParameters());
        }

        //EventData evtDataStar = new EventData()
        //{
        //    Code = (byte)AckEventType.CreateActor,
        //    Parameters = new Dictionary<byte, object>
        //    {
        //        {(byte)ActorType.Star,listStar}
        //    }
        //};
        //peer.SendEvent(evtDataStar, new SendParameters());
    }
    public void SpawnPlayer(StarCollectorPeer peer)
    {
        Player player = new Player()
        {
            owner = peer,
            actorID = AllocateActorID()
        };
        listPlayer.Add(player);

        //EventData evt = new EventData()
        //{
        //    Code = (byte)AckEventType.CreateActor,
        //    Parameters = new Dictionary<byte, object>()
        //    {
        //        {0, player.actorType},
        //        {1 , player.actorID},
        //        {2, player.posX},
        //        {3, player.posY},
        //        {4, peer.playerID}
        //    }
        //};

        //BroadcastEvent(evt, new SendParameters());
    }
    public void ProcessMessage(StarCollectorPeer sender, OperationRequest operationRequest, SendParameters sendParameters)
    {
        if(operationRequest.OperationCode == (byte)AckRequestType.MoveCommand)
        {
            // move command from player
            long actorID = (long)operationRequest.Parameters[0];
            float velX = (float)operationRequest.Parameters[1];
            float velY = (float)operationRequest.Parameters[2];

            // find actor
            Player player = (listPlayer.Find(pl =>
            {
                return pl.actorID == actorID;
            }));

            player.velocityX = velX;
            player.velocityY = velY;

            //List<Player> listOtherPlayer =
        }
    }
    public void PeerLeft(StarCollectorPeer peer)
    {
        executionFiber.Enqueue(() =>
        {
            listPeer.Remove(peer);
        });

        Player player = listPlayer.Where(a => a.owner == peer).FirstOrDefault();
        if (player != null)
        {
            EventData evt = new EventData()
            {
                Code = (byte)AckEventType.DestroyActor,
                Parameters = new Dictionary<byte, object>()
            };
            evt.Parameters[0] = player.actorID;
            BroadcastEvent(evt, new SendParameters());

            listPlayer.Remove(player);
        }
    }
    public void PeerJoined(StarCollectorPeer peer)
    {
        executionFiber.Enqueue(() =>
        {
            listPeer.Add(peer);
            SpawnPlayer(peer);
        });

        #region Test code
        //List<MPlayer> listTest = new List<MPlayer>()
        //{
        //    new MPlayer()
        //    {
        //        name = "ducanh",
        //        id =1
        //    },
        //    new MPlayer()
        //    {
        //        name = "hoanganh",
        //        id = 2
        //    }
        //};
        //EventData evtDataPlayer = new EventData()
        //{
        //    Code = (byte)AckEventType.TestData,
        //    Parameters = new Dictionary<byte, object>
        //    {
        //        {(byte)ActorType.Player,GeneralFunc.Serialize(listTest)}
        //    }
        //};
        //peer.SendEvent(evtDataPlayer, new SendParameters());
        #endregion

        // send player CreateActor events for players and stars which are in interest



        //foreach (var p in listPlayer)
        //{
        //    EventData evt = new EventData()
        //    {
        //        Code = (byte)AckEventType.CreateActor,
        //        Parameters = new Dictionary<byte, object>()
        //        {
        //            {0, p.actorType},
        //            {1, p.actorID},
        //            {2, p.posX},
        //            {3, p.posY},
        //            {4, (p.owner as StarCollectorPeer).playerID}
        //        }
        //    };

        //}
        //peer.SendEvent(evt, new SendParameters());
        //EventData evtDataPlayer = new EventData()
        //{
        //    Code = (byte)AckEventType.CreateActor,
        //    Parameters = new Dictionary<byte, object>
        //    {
        //        {(byte)ActorType.Player,listPlayer}
        //    }
        //};
        //peer.SendEvent(evtDataPlayer, new SendParameters());
        //peer.SendEvent()

        foreach (var s in listStar)
        {
            EventData evt = new EventData()
            {
                Code       = (byte)AckEventType.CreateActor,
                Parameters = new Dictionary <byte, object>()
                {
                    { 0, s.actorType },
                    { 1, s.actorID },
                    { 2, s.posX },
                    { 3, s.posY }
                }
            };
            peer.SendEvent(evt, new SendParameters());
        }

        //EventData evtDataStar = new EventData()
        //{
        //    Code = (byte)AckEventType.CreateActor,
        //    Parameters = new Dictionary<byte, object>
        //    {
        //        {(byte)ActorType.Star,listStar}
        //    }
        //};
        //peer.SendEvent(evtDataStar, new SendParameters());
    }