public void Remove(Entities.User u)
        {
            if (u.Room != null)
            {
                if (u.Room.ID == this.ID)
                {
                    lock (this.RoomLock) {
                        Player p;
                        byte   oldSlot = 0;

                        lock (_playerLock) {
                            if (Players.ContainsKey(u.RoomSlot))
                            {
                                Players.TryRemove(u.RoomSlot, out p);

                                if (p != null)
                                {
                                    oldSlot = u.RoomSlot;
                                    p.User.SetRoom(null, 0);
                                }
                                else
                                {
                                    u.SetRoom(null, 0);
                                }

                                if (Players.Count > 0)
                                {
                                    // Asign new master //
                                    if (oldSlot == Master)
                                    {
                                        // Remove the suppermaster buff :)
                                        this.Supermaster = false;

                                        // Calculate the priority level.
                                        int[] priority = new int[MaximumPlayers];
                                        for (byte i = 0; i < MaximumPlayers; i++)
                                        {
                                            if (Players.ContainsKey(i))
                                            {
                                                if (Players[i] != null)
                                                {
                                                    priority[i] = 1 + (int)Players[i].User.Premium;
                                                }
                                                else
                                                {
                                                    priority[i] = 0; // no priority.
                                                }
                                            }
                                            else
                                            {
                                                priority[i] = 0; // no priority.
                                            }
                                        }

                                        // Find the new master.
                                        sbyte newMaster   = -1;
                                        int   masterPrior = 0;
                                        for (byte j = 0; j < MaximumPlayers; j++)
                                        {
                                            if (priority[j] > masterPrior) // A player with higher piority has been found.
                                            {
                                                newMaster   = (sbyte)j;    // set the master slot
                                                masterPrior = priority[j]; // store the piority.
                                            }
                                        }

                                        // We have found a new master!
                                        if (newMaster >= 0)
                                        {
                                            Master = (byte)newMaster;
                                            Players[Master].Ready = true;
                                        }
                                        else
                                        {
                                            Destroy();
                                        }
                                    }
                                }
                                else
                                {
                                    Destroy();
                                }

                                byte[] pBuffer = new Packets.RoomLeave(u, oldSlot, this).BuildEncrypted();
                                if (Players.Count > 0)
                                {
                                    Send(pBuffer);
                                }

                                u.Send(pBuffer);

                                //tell the players
                                if (State == RoomState.Playing)
                                {
                                    //     string _playerLeft = Cristina.Core.Cristina.Localization.GetLocMessageFrom("PLAYER_LEFT");

                                    //   if (_playerLeft.Contains("%/nickname/%"))
                                    //    _playerLeft = _playerLeft.Replace("/nickname/%", u.Displayname);

                                    Cristina.Core.Cristina.Chat.SaytoRoom(u.Displayname + " ha salido de la sala", this);
                                }
                            }
                        }
                    }
                }
            }
        }
Example #2
0
        public void Remove(Entities.User u)
        {
            if (u.Room != null)
            {
                if (u.Room.ID == this.ID)
                {
                    lock (this.RoomLock) {
                        Player p;
                        byte   oldSlot = 0;

                        lock (_playerLock) {
                            if (Players.ContainsKey(u.RoomSlot))
                            {
                                Players.TryRemove(u.RoomSlot, out p);

                                if (p != null)
                                {
                                    oldSlot = u.RoomSlot;
                                    p.User.SetRoom(null, 0);
                                }
                                else
                                {
                                    u.SetRoom(null, 0);
                                }

                                if (Players.Count > 0)
                                {
                                    // Asign new master //
                                    if (u.RoomSlot == Master)
                                    {
                                        // Remove the suppermaster buff :)
                                        this.Supermaster = false;

                                        // Calculate the priority level.
                                        int[] priority = new int[MaximumPlayers];
                                        for (byte i = 0; i < MaximumPlayers; i++)
                                        {
                                            if (Players.ContainsKey(i))
                                            {
                                                if (Players[i] != null)
                                                {
                                                    priority[i] = 1 + (int)Players[i].User.Premium;
                                                }
                                                else
                                                {
                                                    priority[i] = 0; // no priority.
                                                }
                                            }
                                            else
                                            {
                                                priority[i] = 0; // no priority.
                                            }
                                        }

                                        // Find the new master.
                                        sbyte newMaster   = -1;
                                        int   masterPrior = 0;
                                        for (byte j = 0; j < MaximumPlayers; j++)
                                        {
                                            if (priority[j] > masterPrior) // A player with higher piority has been found.
                                            {
                                                newMaster   = (sbyte)j;    // set the master slot
                                                masterPrior = priority[j]; // store the piority.
                                            }
                                        }

                                        // We have found a new master!
                                        if (newMaster >= 0)
                                        {
                                            Master = (byte)newMaster;
                                        }
                                        else
                                        {
                                            Destory();
                                        }
                                    }
                                }
                                else
                                {
                                    Destory();
                                }

                                byte[] pBuffer = new Packets.RoomLeave(u, oldSlot, this).BuildEncrypted();
                                if (Players.Count > 0)
                                {
                                    Send(pBuffer);
                                }

                                u.Send(pBuffer);
                            }
                        }
                    }
                }
            }
        }