示例#1
0
        private bool Join_Instance(Player player, ushort Instanceid, Zone_jump Jump, ushort InstancemainID)
        {
            lock (_instances)
            {
                _instances.TryGetValue(Instanceid, out Instance inst);

                if (inst.EncounterInProgress)
                {
                    player.SendClientMessage("There is an Encounter in progress you cannot enter now", ChatLogFilters.CHATLOGFILTERS_USER_ERROR);
                    return(false);
                }

                if (_maxplayers == 0 || inst.Players.Count < _maxplayers)
                {
                    if (Jump != null && Jump.ZoneID == 179)
                    {
                        ((TOTVL)inst).AddPlayer(player, Jump);
                    }
                    else
                    {
                        inst.AddPlayer(player, Jump);
                    }
                }
                else
                {
                    player.SendClientMessage("Instance is full.", ChatLogFilters.CHATLOGFILTERS_USER_ERROR);
                    return(false);
                }
            }
            return(true);
        }
        public void AddPlayer(Player player, Zone_jump jump)
        {
            lock (_Players)
            {
                if (!_Players.Contains(player.Name))
                {
                    _Players.Add(player.Name);
                }
            }

            player.InstanceID = ID;

            /*
             * Thread thread = new Thread(delegate ()
             * {
             *  Thread.Sleep(5000);
             */
            if (jump != null)
            {
                player.Teleport(Region, jump.ZoneID, jump.WorldX, jump.WorldY, jump.WorldZ, jump.WorldO);
            }
            else
            {
                player.Teleport(Region, player._Value.ZoneId, (uint)player._Value.WorldX, (uint)player._Value.WorldY, (ushort)player._Value.WorldZ, (ushort)player._Value.WorldO);
            }
            //});
            //  thread.Start();
        }
示例#3
0
        static public void F_ZONEJUMP(BaseClient client, PacketIn packet)
        {
            GameClient cclient = client as GameClient;

            if (cclient.Plr == null || !cclient.Plr.IsInWorld())
            {
                return;
            }

            //Log.Dump("Jump", packet, true);
            UInt32 Id = packet.GetUint32();

            Log.Info("Jump", "Jump to :" + Id);

            Zone_jump Jump = WorldMgr.GetZoneJump(Id);

            if (Jump != null)
            {
                cclient.Plr.Teleport(Jump.ZoneID, Jump.WorldX, Jump.WorldY, Jump.WorldZ, Jump.WorldO);
            }
            else
            {
                Log.Error("Jump", "Invalid Jump");
            }
        }
        private void ZoneJump(Player player)
        {
            #if DEBUG
            Log.Info("Jump", "Jump to :" + Spawn.Guid);
            #endif

            Zone_jump jump = ZoneService.GetZoneJump(Spawn.Guid);

            if (jump == null)
            {
                return;
            }

            if (jump.Type == 3)
            {
                if (!player.GldInterface.IsInGuild() || player.GldInterface.GetGuildLevel() < 6)
                {
                    player.SendClientMessage("A Guild Rank of 6 is required to use this portal.");
                    player.SendLocalizeString("", ChatLogFilters.CHATLOGFILTERS_USER_ERROR, GameData.Localized_text.TEXT_PLAYER_REGION_NOT_AVAILABLE);
                    return;
                }
            }
            if (jump.Enabled || Utils.HasFlag(player.GmLevel, (int)EGmLevel.DatabaseDev))
            {
                player.Teleport(jump.ZoneID, jump.WorldX, jump.WorldY, jump.WorldZ, jump.WorldO);
            }
        }
示例#5
0
 private ushort Create_new_instance(Player player, Zone_jump Jump)
 {
     lock (_instances)
     {
         for (ushort i = 1; i < ushort.MaxValue; i++)
         {
             if (!_instances.ContainsKey(i))
             {
                 if (Jump.ZoneID == 179)
                 {
                     TOTVL             ints       = null;
                     Instance_Lockouts deadbosses = null;
                     if (player._Value.GetLockout(Jump.InstanceID) != null)
                     {
                         if (player.PriorityGroup == null)                                 // solo player gets his own lockouts
                         {
                             InstanceService._InstanceLockouts.TryGetValue(player._Value.GetLockout(Jump.InstanceID), out deadbosses);
                         }
                         else                                 // group players gets the lockout of the leader
                         {
                             InstanceService._InstanceLockouts.TryGetValue(player.PriorityGroup.GetLeader()._Value.GetLockout(Jump.InstanceID), out deadbosses);
                         }
                     }
                     ints = new TOTVL(Jump.ZoneID, i, 0, deadbosses);
                     _instances.Add(i, ints);
                     return(i);
                 }
                 else
                 {
                     Instance          ints       = null;
                     Instance_Lockouts deadbosses = null;
                     if (player._Value.GetLockout(Jump.InstanceID) != null)
                     {
                         if (player.PriorityGroup == null)                                 // solo player gets his own lockouts
                         {
                             InstanceService._InstanceLockouts.TryGetValue(player._Value.GetLockout(Jump.InstanceID), out deadbosses);
                         }
                         else if (player.PriorityGroup.GetLeader()._Value.GetLockout(Jump.InstanceID) != null)                                 // group players gets the lockout of the leader
                         {
                             InstanceService._InstanceLockouts.TryGetValue(player.PriorityGroup.GetLeader()._Value.GetLockout(Jump.InstanceID), out deadbosses);
                         }
                     }
                     ints = new Instance(Jump.ZoneID, i, 0, deadbosses);
                     _instances.Add(i, ints);
                     return(i);
                 }
             }
         }
     }
     return(0);
 }
示例#6
0
        public void AddPlayer(Player player, Zone_jump jump)
        {
            lock (Players)
            {
                if (!Players.Contains(player))
                {
                    Players.Add(player);
                }

                player.InstanceID = ZoneID + ":" + ID;

                if (jump != null)
                {
                    player.Teleport(Region, jump.ZoneID, jump.WorldX, jump.WorldY, jump.WorldZ, jump.WorldO);
                }
                else
                {
                    player.Teleport(Region, player._Value.ZoneId, (uint)player._Value.WorldX, (uint)player._Value.WorldY, (ushort)player._Value.WorldZ, (ushort)player._Value.WorldO);
                }

                Region.CheckZone(player);

                InstanceService.SavePlayerIDs(ZoneID + ":" + ID, Players);

                player.SendClientMessage("Instance ID: " + ID, SystemData.ChatLogFilters.CHATLOGFILTERS_TELL_RECEIVE);

                string players = string.Empty;
                foreach (Player plr in Players)
                {
                    players += plr.Name + ",";
                }
                if (players.EndsWith(","))
                {
                    players = players.Substring(0, players.Length - 1);
                }

                player.SendClientMessage("Registered players: " + players, SystemData.ChatLogFilters.CHATLOGFILTERS_TELL_RECEIVE);
                player.SendClientMessage("Note: Wait for your party leader to get into the instance if you find yourself in another instance ID.", SystemData.ChatLogFilters.CHATLOGFILTERS_TELL_RECEIVE);
            }
        }
示例#7
0
        private bool Join_Instance(Player player, ushort Instanceid, Zone_jump Jump, int maxplayers, ushort InstancemainID)
        {
            lock (_instances)
            {
                Instance inst;
                _instances.TryGetValue(Instanceid, out inst);

                if (player._Value.GetLockout(InstancemainID) != null && inst.Lockout != null && inst.Lockout.InstanceID != player._Value.GetLockout(InstancemainID))
                {
                    player.SendClientMessage("Your Instance Lockout dont match the Instance you are trying to enter", ChatLogFilters.CHATLOGFILTERS_USER_ERROR);
                    return(false);
                }

                if (inst.Encounterinprogress)
                {
                    player.SendClientMessage("There is an Encounter in progress you cannot enter now", ChatLogFilters.CHATLOGFILTERS_USER_ERROR);
                    return(false);
                }

                if (maxplayers == 0 || inst.Region.Players.Count <= maxplayers)
                {
                    if (Jump != null && Jump.ZoneID == 179)
                    {
                        ((TOTVL)inst).AddPlayer(player, Jump);
                    }
                    else
                    {
                        inst.AddPlayer(player, Jump);
                    }
                }
                else
                {
                    player.SendClientMessage("Instance is full", ChatLogFilters.CHATLOGFILTERS_USER_ERROR);
                    return(false);
                }
            }
            return(true);
        }
示例#8
0
 private ushort Create_new_instance(Player player, Zone_jump Jump)
 {
     lock (_instances)
     {
         for (ushort i = 1; i < ushort.MaxValue; i++)
         {
             if (!_instances.ContainsKey(i))
             {
                 if (Jump.ZoneID == 179)
                 {
                     TOTVL             ints       = null;
                     Instance_Lockouts deadbosses = null;
                     if (player._Value.GetLockout(Jump.InstanceID) != null)
                     {
                         InstanceService._InstanceLockouts.TryGetValue(player._Value.GetLockout(Jump.InstanceID), out deadbosses);
                     }
                     ints = new TOTVL(Jump.ZoneID, i, 0, deadbosses);
                     _instances.Add(i, ints);
                     return(i);
                 }
                 else
                 {
                     Instance          ints       = null;
                     Instance_Lockouts deadbosses = null;
                     if (player._Value.GetLockout(Jump.InstanceID) != null)
                     {
                         InstanceService._InstanceLockouts.TryGetValue(player._Value.GetLockout(Jump.InstanceID), out deadbosses);
                     }
                     ints = new Instance(Jump.ZoneID, i, 0, deadbosses);
                     _instances.Add(i, ints);
                     return(i);
                 }
             }
         }
     }
     return(0);
 }
        public static void F_INIT_PLAYER(BaseClient client, PacketIn packet)
        {
            GameClient cclient = (GameClient)client;

            Player Plr = cclient.Plr;

            if (Plr == null)
            {
                return;
            }

            if (!Plr.IsInWorld()) // If the player is not on a map, then we add it to the map
            {
                ushort zoneId   = Plr.Info.Value.ZoneId;
                ushort regionId = (ushort)Plr.Info.Value.RegionId;

                Zone_Info info = ZoneService.GetZone_Info(zoneId);
                if (info?.Type == 0)
                {
                    RegionMgr region = WorldMgr.GetRegion(regionId, true);
                    if (region.AddObject(Plr, zoneId, true))
                    {
                        return;
                    }
                }
                else if (info?.Type == 4 || info?.Type == 5 || info?.Type == 6) // login into a instance
                {
                    if (!WorldMgr.InstanceMgr.ZoneIn(Plr, (byte)info?.Type))    // cant login into the instace port to exit
                    {
                        Instance_Info II;
                        InstanceService._InstanceInfo.TryGetValue(zoneId, out II);
                        Zone_jump ExitJump = ZoneService.GetZoneJump(II.exitzonejup);
                        if (ExitJump == null)
                        {
                            Log.Error("Exit Jump in Instance", " " + zoneId + " missing!");
                        }
                        else
                        {
                            if (ExitJump.Type == 4)
                            {
                                WorldMgr.InstanceMgr.ZoneIn(Plr, 4, ExitJump);
                            }
                            else
                            {
                                Plr.Teleport(ExitJump.ZoneID, ExitJump.WorldX, ExitJump.WorldY, ExitJump.WorldZ, ExitJump.WorldO);
                            }
                        }
                    }
                    return;
                }

                // Warp a player to their bind point if they attempt to load into a scenario map.
                RallyPoint rallyPoint = RallyPointService.GetRallyPoint(Plr.Info.Value.RallyPoint);

                if (rallyPoint != null)
                {
                    Plr.Teleport(rallyPoint.ZoneID, rallyPoint.WorldX, rallyPoint.WorldY, rallyPoint.WorldZ, rallyPoint.WorldO);
                }

                else
                {
                    CharacterInfo cInfo = CharMgr.GetCharacterInfo(Plr.Info.Career);
                    Plr.Teleport(cInfo.ZoneId, (uint)cInfo.WorldX, (uint)cInfo.WorldY, (ushort)cInfo.WorldZ,
                                 (ushort)cInfo.WorldO);
                }
            }
            else
            {
                Plr.Loaded = false;
                Plr.StartInit();
            }
        }
        public static void F_ZONEJUMP(BaseClient client, PacketIn packet)
        {
            GameClient cclient = client as GameClient;

            if (cclient.Plr == null || !cclient.Plr.IsInWorld())
            {
                return;
            }

            //Log.Dump("Jump", packet, true);
            uint destinationId = packet.GetUint32();
            byte responseType  = packet.GetUint8();

            //Log.Info("Jump", "Jump to :" + Id);

            if (cclient.Plr.Zone.Info.Type == 1)
            {
                if (responseType == 0)
                {
                    cclient.Plr.SendDialog(Dialog.ScenarioLeave, 586);
                }
                else
                {
                    Scenario sc = cclient.Plr.ScnInterface.Scenario;
                    if (sc == null)
                    {
                        cclient.Plr.SendClientMessage("No active scenario.", ChatLogFilters.CHATLOGFILTERS_USER_ERROR);
                    }
                    else
                    {
                        sc.EnqueueScenarioAction(new ScenarioQueueAction(EScenarioQueueAction.RemovePlayer, cclient.Plr));
                    }
                }
                return;
            }

            Zone_jump Jump = ZoneService.GetZoneJump(destinationId);

            if (Jump == null)
            {
                cclient.Plr.SendClientMessage("This portal's jump destination (" + destinationId + ") does not exist.");
                SendJumpFailed(cclient.Plr);
                return;
            }
            if (cclient.Plr.GmLevel > 0)
            {
                cclient.Plr.SendClientMessage("Portal Id: " + destinationId);
            }
            if (cclient.Plr.CbtInterface.IsInCombat)
            {
                cclient.Plr.SendClientMessage("You can't use a portal while in combat." + destinationId);
                cclient.Plr.SendLocalizeString("", ChatLogFilters.CHATLOGFILTERS_USER_ERROR, GameData.Localized_text.TEXT_PLAYER_REGION_NOT_AVAILABLE);
                SendJumpFailed(cclient.Plr);
                return;
            }

            if (Jump.Type == 1 && cclient.Plr.WorldGroup == null)
            {
                cclient.Plr.SendClientMessage("You must be a member of a group in order to use this portal." + destinationId);
                cclient.Plr.SendLocalizeString("", ChatLogFilters.CHATLOGFILTERS_USER_ERROR, GameData.Localized_text.TEXT_PLAYER_REGION_NOT_AVAILABLE);
                SendJumpFailed(cclient.Plr);
                return;
            }
            if (Jump.Type == 2 && cclient.Plr.Level < 30)
            {
                cclient.Plr.SendClientMessage("A Career Rank of 30 is required to use this portal." + destinationId);
                cclient.Plr.SendLocalizeString("", ChatLogFilters.CHATLOGFILTERS_USER_ERROR, GameData.Localized_text.TEXT_PLAYER_REGION_NOT_AVAILABLE);
                SendJumpFailed(cclient.Plr);
                return;
            }
            if (Jump.Type == 3 && cclient.Plr.GldInterface.GetGuildLevel() < 6)
            {
                cclient.Plr.SendClientMessage("A Guild Rank of 6 is required to use this portal." + destinationId);
                cclient.Plr.SendLocalizeString("", ChatLogFilters.CHATLOGFILTERS_USER_ERROR, GameData.Localized_text.TEXT_PLAYER_REGION_NOT_AVAILABLE);
                SendJumpFailed(cclient.Plr);
                return;
            }
            if (Jump.Type >= 4 && Jump.Type <= 6)
            {
                if (!WorldMgr.InstanceMgr.ZoneIn(cclient.Plr, Jump.Type, Jump))
                {
                    ;
                }
                SendJumpFailed(cclient.Plr);
                return;
            }

            if (Jump.Enabled || cclient.Plr.GmLevel > 1)
            {
                cclient.Plr.Teleport(Jump.ZoneID, Jump.WorldX, Jump.WorldY, Jump.WorldZ, Jump.WorldO);
            }
            else
            {
                cclient.Plr.SendLocalizeString("", ChatLogFilters.CHATLOGFILTERS_USER_ERROR, GameData.Localized_text.TEXT_PLAYER_REGION_NOT_AVAILABLE);
                SendJumpFailed(cclient.Plr);
            }
        }
示例#11
0
        public static void F_ZONEJUMP(BaseClient client, PacketIn packet)
        {
            GameClient cclient = client as GameClient;

            if (cclient.Plr == null || !cclient.Plr.IsInWorld())
            {
                return;
            }

            //Log.Dump("Jump", packet, true);
            uint destinationId = packet.GetUint32();
            byte responseType  = packet.GetUint8();

            //Log.Info("Jump", "Jump to :" + Id);

            if (cclient.Plr.Zone.Info.Type == 1)
            {
                if (responseType == 0)
                {
                    cclient.Plr.SendDialog(Dialog.ScenarioLeave, 586);
                }
                else
                {
                    Scenario sc = cclient.Plr.ScnInterface.Scenario;
                    if (sc == null)
                    {
                        cclient.Plr.SendClientMessage("No active scenario.", ChatLogFilters.CHATLOGFILTERS_USER_ERROR);
                    }
                    else
                    {
                        sc.EnqueueScenarioAction(new ScenarioQueueAction(EScenarioQueueAction.RemovePlayer, cclient.Plr));
                    }
                }
                return;
            }

            Zone_jump Jump = null;

            // ZARU: zone jump out hackaround for LV leave
            if (destinationId == 272804328)
            {
                Instance_Info II;
                InstanceService._InstanceInfo.TryGetValue(260, out II);

                if (cclient.Plr.Realm == Realms.REALMS_REALM_ORDER)
                {
                    Jump = ZoneService.GetZoneJump(II.OrderExitZoneJumpID);
                }
                else if (cclient.Plr.Realm == Realms.REALMS_REALM_DESTRUCTION)
                {
                    Jump = ZoneService.GetZoneJump(II.DestrExitZoneJumpID);
                }

                if (Jump == null)
                {
                    Jump = ZoneService.GetZoneJump(destinationId);
                }
            }
            else
            {
                Jump = ZoneService.GetZoneJump(destinationId);
            }

            if (Jump == null)
            {
                cclient.Plr.SendClientMessage("This portal's jump destination (" + destinationId + ") does not exist.");
                SendJumpFailed(cclient.Plr);
                return;
            }
            if (cclient.Plr.GmLevel > 0)
            {
                cclient.Plr.SendClientMessage("Portal Id: " + destinationId);
            }
            if (cclient.Plr.CbtInterface.IsInCombat)
            {
                cclient.Plr.SendClientMessage("You can't use a portal while in combat." + destinationId);
                cclient.Plr.SendLocalizeString("", ChatLogFilters.CHATLOGFILTERS_USER_ERROR, GameData.Localized_text.TEXT_PLAYER_REGION_NOT_AVAILABLE);
                SendJumpFailed(cclient.Plr);
                return;
            }

            if (Jump.Type == 1 && cclient.Plr.WorldGroup == null)
            {
                cclient.Plr.SendClientMessage("You must be a member of a group in order to use this portal." + destinationId);
                cclient.Plr.SendLocalizeString("", ChatLogFilters.CHATLOGFILTERS_USER_ERROR, GameData.Localized_text.TEXT_PLAYER_REGION_NOT_AVAILABLE);
                SendJumpFailed(cclient.Plr);
                return;
            }
            if (Jump.Type == 2 && cclient.Plr.Level < 30)
            {
                cclient.Plr.SendClientMessage("A Career Rank of 30 is required to use this portal." + destinationId);
                cclient.Plr.SendLocalizeString("", ChatLogFilters.CHATLOGFILTERS_USER_ERROR, GameData.Localized_text.TEXT_PLAYER_REGION_NOT_AVAILABLE);
                SendJumpFailed(cclient.Plr);
                return;
            }
            if (Jump.Type == 3 && cclient.Plr.GldInterface.GetGuildLevel() < 6)
            {
                cclient.Plr.SendClientMessage("A Guild Rank of 6 is required to use this portal." + destinationId);
                cclient.Plr.SendLocalizeString("", ChatLogFilters.CHATLOGFILTERS_USER_ERROR, GameData.Localized_text.TEXT_PLAYER_REGION_NOT_AVAILABLE);
                SendJumpFailed(cclient.Plr);
                return;
            }
            if (Jump.Type >= 4 && Jump.Type <= 6)
            {
#pragma warning disable CS0642 // Возможно, ошибочный пустой оператор
                if (!WorldMgr.InstanceMgr.ZoneIn(cclient.Plr, Jump.Type, Jump))
                {
                    ;
                }
#pragma warning restore CS0642 // Возможно, ошибочный пустой оператор
                SendJumpFailed(cclient.Plr);
                return;
            }

            if (Jump.Enabled || cclient.Plr.GmLevel > 1)
            {
                cclient.Plr.Teleport(Jump.ZoneID, Jump.WorldX, Jump.WorldY, Jump.WorldZ, Jump.WorldO);
            }
            else
            {
                cclient.Plr.SendLocalizeString("", ChatLogFilters.CHATLOGFILTERS_USER_ERROR, GameData.Localized_text.TEXT_PLAYER_REGION_NOT_AVAILABLE);
                SendJumpFailed(cclient.Plr);
            }
        }
示例#12
0
        public static void F_INIT_PLAYER(BaseClient client, PacketIn packet)
        {
            GameClient cclient = (GameClient)client;

            Player Plr = cclient.Plr;

            if (Plr == null)
            {
                return;
            }

            // clear all lockouts if they are expired
            InstanceService.ClearLockouts(Plr);

            if (!Plr.IsInWorld()) // If the player is not on a map, then we add it to the map
            {
                ushort zoneId   = Plr.Info.Value.ZoneId;
                ushort regionId = (ushort)Plr.Info.Value.RegionId;

                Zone_Info info = ZoneService.GetZone_Info(zoneId);
                if (info?.Type == 0)
                {
                    RegionMgr region = WorldMgr.GetRegion(regionId, true);
                    if (region.AddObject(Plr, zoneId, true))
                    {
                        return;
                    }
                }
                else if (info?.Type == 4 || info?.Type == 5 || info?.Type == 6)  // login into a instance results in teleport outside
                {
                    if (InstanceService._InstanceInfo.TryGetValue(zoneId, out Instance_Info II))
                    {
                        Zone_jump ExitJump = null;
                        if (Plr.Realm == Realms.REALMS_REALM_ORDER)
                        {
                            ExitJump = ZoneService.GetZoneJump(II.OrderExitZoneJumpID);
                        }
                        else if (Plr.Realm == Realms.REALMS_REALM_DESTRUCTION)
                        {
                            ExitJump = ZoneService.GetZoneJump(II.DestrExitZoneJumpID);
                        }

                        if (ExitJump == null)
                        {
                            Log.Error("Exit Jump in Instance", " " + zoneId + " missing!");
                        }
                        else
                        {
                            Plr.Teleport(ExitJump.ZoneID, ExitJump.WorldX, ExitJump.WorldY, ExitJump.WorldZ, ExitJump.WorldO);
                        }
                    }
                    return;
                }

                // Warp a player to their bind point if they attempt to load into a scenario map.
                RallyPoint rallyPoint = RallyPointService.GetRallyPoint(Plr.Info.Value.RallyPoint);

                if (rallyPoint != null)
                {
                    Plr.Teleport(rallyPoint.ZoneID, rallyPoint.WorldX, rallyPoint.WorldY, rallyPoint.WorldZ, rallyPoint.WorldO);
                }
                else
                {
                    CharacterInfo cInfo = CharMgr.GetCharacterInfo(Plr.Info.Career);
                    Plr.Teleport(cInfo.ZoneId, (uint)cInfo.WorldX, (uint)cInfo.WorldY, (ushort)cInfo.WorldZ,
                                 (ushort)cInfo.WorldO);
                }
            }
            else
            {
                Plr.Loaded = false;
                Plr.StartInit();
            }
        }
示例#13
0
        public bool ZoneIn(Player player, byte instancetyp, Zone_jump Jump = null)
        {
            // jump type 4 = realm 5 = raid 6 = group instances
            ushort zoneID;

            if (Jump == null)
            {
                zoneID = player.Info.Value.ZoneId;
            }
            else
            {
                zoneID = Jump.ZoneID;
            }

            Instance_Info II;

            InstanceService._InstanceInfo.TryGetValue(zoneID, out II);
            ushort InstanceMainID = II.Entry;

            ushort instanceid = 0;

            // Group Raid Instance
            if (instancetyp == 5)
            {
                _maxplayers = 24;
            }

            // instance handling
            lock (_instances)
            {
                foreach (KeyValuePair <ushort, Instance> ii in _instances)
                {
                    if (ii.Value.ZoneID == zoneID)
                    {
                        // solo
                        if (player.PriorityGroup == null)
                        {
                            // enter if instance with name found
                            if (ii.Value.Players.Contains(player))
                            {
                                instanceid = ii.Key; // enter
                                break;
                            }
                            else // create new instance if not
                            {
                                instanceid = 0; // create new instance
                                break;
                            }
                        }
                        else // group
                        {
                            // player == leader
                            if (player == player.PriorityGroup.GetLeader())
                            {
                                // instance found with leaders name in it
                                if (ii.Value.Players.Contains(player.PriorityGroup.GetLeader()))
                                {
                                    instanceid = ii.Key; // enter
                                    break;
                                }
                                else // create new instance if not
                                {
                                    instanceid = 0; // create new instance
                                    break;
                                }
                            }
                            else
                            {
                                // instance found with leaders name in it
                                if (ii.Value.Players.Contains(player.PriorityGroup.GetLeader()))
                                {
                                    if (ii.Value.Players.Contains(player))
                                    {
                                        instanceid = ii.Key; // enter
                                        break;
                                    }
                                    else
                                    {
                                        if (ii.Value.Players.Count < _maxplayers)
                                        {
                                            instanceid = ii.Key; // enter
                                            break;
                                        }
                                        else
                                        {
                                            player.SendClientMessage("This instance is already full. Please find another group or switch the group leader to open a new instance.", ChatLogFilters.CHATLOGFILTERS_USER_ERROR);
                                            return(false);
                                        }
                                    }
                                }
                                else
                                {
                                    continue;
                                }
                            }
                        }
                    }
                }
            }

            if (instanceid == 0 && Jump == null)
            {
                return(false);
            }

            // create new instance
            if (instanceid == 0)
            {
                instanceid = Create_new_instance(player, Jump);
            }

            if (!Join_Instance(player, instanceid, Jump, InstanceMainID))
            {
                return(false);
            }

            return(true);
        }
示例#14
0
        public bool ZoneIn(Player player, byte instancetyp, Zone_jump Jump = null)
        {
            // jump type 4 = realm 5 = raid 6= group instances
            Instance ints = null;
            ushort   zoneID;

            if (Jump == null)
            {
                zoneID = player.Info.Value.ZoneId;
            }
            else
            {
                zoneID = Jump.ZoneID;
            }

            Instance_Info II;

            InstanceService._InstanceInfo.TryGetValue(zoneID, out II);
            ushort InstanceMainID = II.Entry;
            ushort instanceid     = 0;
            byte   maxplayers     = 0;

            if (instancetyp == 4) // Realm instance
            {
                if (Jump == null && (player._Value.DisconcetTime == 0 || (player._Value.DisconcetTime + 600) < TCPManager.GetTimeStamp()))
                {
                    return(false);
                }

                if (player.Realm == GameData.Realms.REALMS_REALM_DESTRUCTION)
                {
                    realminstancesdestro.TryGetValue(zoneID, out instanceid);
                }
                else
                {
                    realminstancesorder.TryGetValue(zoneID, out instanceid);
                }
                if (instanceid == 0)
                {
                    lock (_instances)
                    {
                        for (ushort i = 1; i < ushort.MaxValue; i++)
                        {
                            if (!_instances.ContainsKey(i))
                            {
                                if (player.Realm == GameData.Realms.REALMS_REALM_DESTRUCTION)
                                {
                                    realminstancesdestro.Add(zoneID, i);
                                }
                                else
                                {
                                    realminstancesorder.Add(zoneID, i);
                                }
                                ints = new Instance(zoneID, i, (byte)player.Realm, null);
                                _instances.Add(i, ints);
                                instanceid = i;
                                break;
                            }
                        }
                    }
                }
            }
            else // Group Raid Instance
            {
                maxplayers = 6;
                if (instancetyp == 5)
                {
                    maxplayers = 24;
                }

                String plrlockout = player._Value.GetLockout(InstanceMainID);

                if (player.PriorityGroup != null && player.PriorityGroup.GetLeader() != player)
                {
                    instanceid = Find_OpenInstanceoftheplayer(player.PriorityGroup.GetLeader(), zoneID);
                }
                else
                {
                    instanceid = Find_OpenInstanceoftheplayer(player, zoneID);
                }
            }
            if (instanceid == 0 && Jump == null)
            {
                return(false);
            }


            if (instanceid == 0 && (player.PriorityGroup == null || player.PriorityGroup.GetLeader() == player))
            {
                instanceid = Create_new_instance(player, Jump);
            }

            if (instanceid == 0)
            {
                player.SendClientMessage("Your Groupleader needs to enter first", ChatLogFilters.CHATLOGFILTERS_USER_ERROR);
                return(false);
            }


            if (!Join_Instance(player, instanceid, Jump, maxplayers, InstanceMainID))
            {
                return(false);
            }

            return(true);
        }