public static void server_OnPlayerLeave(this RoomServer roomServer, DuelServer server, string name, string room)
        {
            if (server != null && string.IsNullOrEmpty(room))
            {
                lock (server.AsyncLock)
                {
                    server.Count--;
                }
            }
            if (string.IsNullOrEmpty(name))
            {
                return;
            }

            lock (roomServer.Clients)
            {
                Session player = null;
                if (roomServer.Clients.TryGetValue(name, out player))
                {
                    player.RoomName = null;
                }
            }
            using (PacketWriter writer = new PacketWriter(2))
            {
                writer.Write((byte)RoomMessage.PlayerLeave);
                writer.Write(server == null ? 0 : server.Port);
                writer.WriteUnicode(name, 20);
                writer.WriteUnicode(room, 20);
                roomServer.SendAll(writer.Content);
            }
        }
        public static void OnChatMessage(this RoomServer roomServer, string name, string toname, string msg)
        {
            using (PacketWriter writer = new PacketWriter(2))
            {
                writer.Write((byte)RoomMessage.OnChat);
                writer.Write((short)0x11);
                writer.WriteUnicode(name + ":" + msg);
                if (string.IsNullOrEmpty(toname))
                {
                    Logger.Debug("send to client");
                    roomServer.SendAllClient(writer.Content, name: name);
                }
            }
            using (PacketWriter writer = new PacketWriter(2))
            {
                writer.Write((byte)RoomMessage.Chat);
                writer.WriteUnicode(name, 20);
                writer.WriteUnicode(toname, 20);
                writer.WriteUnicode(msg, msg.Length + 1);
                if (!string.IsNullOrEmpty(toname))
                {
                    lock (roomServer.Clients)
                    {
                        Session sender = null;
                        if (roomServer.Clients.TryGetValue(name, out sender))
                        {
                            sender.Send(writer.Content, true);
                        }
                        else
                        {
#if DEBUG
                            Console.WriteLine("no find " + name);
#endif
                        }
                        if (name != toname)
                        {
                            Session recevicer = null;
                            if (roomServer.Clients.TryGetValue(toname, out recevicer))
                            {
                                recevicer.Send(writer.Content, true);
                            }
                            else
                            {
                                if (sender != null)
                                {
                                    sender.SendError("[err]" + toname + " Not online。");
                                }
#if DEBUG
                                Console.WriteLine("no find " + toname);
#endif
                            }
                        }
                    }
                }
                else
                {
                    roomServer.SendAll(writer.Content, true, true);
                }
            }
        }
 public static void OnServerStop(this RoomServer roomServer)
 {
     using (PacketWriter writer = new PacketWriter(2))
     {
         writer.Write((byte)RoomMessage.ServerStop);
         roomServer.SendAll(writer.Content);
     }
 }
 public static void OnError(this RoomServer roomServer, string err)
 {
     using (PacketWriter writer = new PacketWriter(2))
     {
         writer.Write((byte)RoomMessage.Error);
         writer.WriteUnicode(err, err.Length + 1);
         roomServer.SendAll(writer.Content);
     }
 }
 public static void server_OnRoomClose(this RoomServer roomServer, DuelServer server, string name)
 {
     using (PacketWriter writer = new PacketWriter(2))
     {
         writer.Write((byte)RoomMessage.RoomClose);
         writer.Write(server.Port);
         writer.WriteUnicode(name, 20);
         roomServer.SendAll(writer.Content);
     }
 }
 public static void server_OnRoomCreate(this RoomServer roomServer, DuelServer server, string name, string banlist, string gameinfo)
 {
     using (PacketWriter writer = new PacketWriter(2))
     {
         writer.Write((byte)RoomMessage.RoomCreate);
         writer.Write(server.Port);
         writer.Write(server.NeedAuth);
         writer.WriteUnicode(name, 20);
         writer.WriteUnicode(banlist, 20);
         writer.WriteUnicode(gameinfo, gameinfo.Length + 1);
         //start duel
         writer.Write(false);
         roomServer.SendAll(writer.Content);
     }
 }
 public static void server_OnPlayerJoin(this RoomServer roomServer, DuelServer server, string name, string room)
 {
     if (string.IsNullOrEmpty(name))
     {
         return;
     }
     lock (roomServer.Clients)
     {
         Session player = null;
         if (roomServer.Clients.TryGetValue(name, out player))
         {
             player.RoomName = room;
         }
     }
     using (PacketWriter writer = new PacketWriter(2))
     {
         writer.Write((byte)RoomMessage.PlayerEnter);
         writer.Write(server.Port);
         writer.WriteUnicode(name, 20);
         writer.WriteUnicode(room, 20);
         roomServer.SendAll(writer.Content);
     }
 }