private void OnRecvOtherPlayerEnter(IChannel channel, Message message)
        {
            SOtherPlayerEnter request = message as SOtherPlayerEnter;

            Debug.Log(string.Format("Player {0} enter", request.user));

            World.Instance.players.Add(request.user, request.id);
            World.Instance.chatHistory.Add(request.id, new List <ChatEntry>());
            //FriendUI friendui = (FriendUI)GameObject.FindGameObjectWithTag("FriedUI");
            //FriendUI friendui =  GameObject.FindObjectOfType<FriendUI>();
            //friendui.AddPlayer(request.user);
            //Debug.Log(string.Format("Player {0} enter",request.user));
        }
        private void OnRecvPlayerEnter(IChannel channel, Message message)
        {
            CPlayerEnter      request    = message as CPlayerEnter;
            SOtherPlayerEnter broundcast = new SOtherPlayerEnter();

            Player player = (Player)channel.GetContent();
            Scene  scene  = World.Instance.GetScene(player.scene);

            // add the player to the scene

            // broadcast a new player to all players
            broundcast.user  = player.token;
            broundcast.id    = player.entityId;
            broundcast.scene = player.scene;
            World.Instance.Broundcast(broundcast);

            // return all players online
            SOnlinePlayers onlinePlayers = new SOnlinePlayers();
            List <string>  names         = new List <string>();
            List <int>     ids           = new List <int>();
            List <string>  scenes_       = new List <string>();
            var            scenes        = World.Instance.Scenes;

            foreach (KeyValuePair <string, Scene> kv in scenes)
            {
                foreach (KeyValuePair <int, Player> p in kv.Value.Players)
                {
                    names.Add(p.Value.token);
                    ids.Add(p.Value.entityId);
                    scenes_.Add(p.Value.scene);
                }
            }
            onlinePlayers.users  = names.ToArray();
            onlinePlayers.ids    = ids.ToArray();
            onlinePlayers.scenes = scenes_.ToArray();
            channel.Send(onlinePlayers);

            // get attributes
            SPlayerAttribute attribute = new SPlayerAttribute();
            var attr_reader            = GameDataBase.SQLQuery(string.Format(
                                                                   "Select gold, silver, speed, damage, intelligence, defence, health, hp, pos_x, pos_y, pos_z From Player where player_id={0};", player.player_id
                                                                   ));

            attr_reader.Read();
            attribute.gold         = attr_reader.GetInt32(0);
            attribute.silver       = attr_reader.GetInt32(1);
            attribute.speed        = attr_reader.GetInt32(2);
            attribute.damage       = attr_reader.GetInt32(3);
            attribute.intelligence = attr_reader.GetInt32(4);
            attribute.defence      = attr_reader.GetInt32(5);
            attribute.health       = attr_reader.GetInt32(6);
            attribute.hp           = attr_reader.GetInt32(7);
            attribute.pos.x        = attr_reader.GetFloat(8);
            attribute.pos.y        = attr_reader.GetFloat(9);
            attribute.pos.z        = attr_reader.GetFloat(10);
            channel.Send(attribute);

            // get all items
            SPlayerInventory inventory = new SPlayerInventory();
            var reader = GameDataBase.SQLQuery(string.Format(
                                                   "Select * From Item Where player_id={0} And status!='Drop';", player.player_id
                                                   ));
            List <DItem> items = new List <DItem>();

            while (reader.Read())
            {
                var item = new DItem();
                item.item_id            = reader.GetInt32(0);
                item.status             = (ItemStatus)System.Enum.Parse(typeof(ItemStatus), reader.GetString(2));
                item.name               = reader.GetString(3);
                item.health_value       = reader.GetInt32(4);
                item.speed_value        = reader.GetInt32(5);
                item.damage_value       = reader.GetInt32(6);
                item.intelligence_value = reader.GetInt32(7);
                item.defence_value      = reader.GetInt32(8);
                item.icon_name          = reader.GetString(9);
                item.item_type          = (ItemType)System.Enum.Parse(typeof(ItemType), reader.GetString(10));
                item.silver_value       = reader.GetInt32(11);
                if (item.status != ItemStatus.Drop)
                {
                    items.Add(item);
                }
            }
            reader.Close();
            inventory.dItems = items.ToArray();
            channel.Send(inventory);

            System.Console.WriteLine("{0} Enter", player.token);
            System.Console.WriteLine("Get items {0}", items.Count);

            player.Position = Entity.V3ToPoint3d(attribute.pos);
            player.Spawn();
            player.maxHP             = attribute.health;
            player.currentHP         = attribute.hp;
            player.base_damage       = attribute.damage;
            player.base_speed        = attribute.speed;
            player.base_health       = attribute.health;
            player.base_intelligence = attribute.intelligence;
            player.base_defence      = attribute.defence;

            foreach (var ditem in items)
            {
                switch (ditem.status)
                {
                case ItemStatus.Storing:
                    player.inventory.Add(ditem.item_id, ditem);
                    break;

                case ItemStatus.Selling:
                    player.selling.Add(ditem.item_id, ditem);
                    break;

                case ItemStatus.Using:
                    player.wearing.Add(ditem.item_type, ditem);
                    break;
                }
            }
            player.refreshAttr();
            player.currentHP = attribute.hp;
            scene.AddEntity(player);

            // send triger status
            STrigerStatus sTriger = new STrigerStatus();

            sTriger.doors = new Door[World.Instance.Doors.Values.Count];
            World.Instance.Doors.Values.CopyTo(sTriger.doors, 0);
            sTriger.pressurePads = new PressurePad[World.Instance.PressurePads.Count];
            World.Instance.PressurePads.Values.CopyTo(sTriger.pressurePads, 0);
            sTriger.switchCrystals = new SwitchCrystal[World.Instance.SwitchCrystals.Count];
            World.Instance.SwitchCrystals.Values.CopyTo(sTriger.switchCrystals, 0);
            channel.Send(sTriger);
        }