/// <summary>
        /// Checks if <see cref="Player"/> meets the required conditions for this quest to be added to their communicator.
        /// </summary>
        public bool Meets(Player player)
        {
            if (entry.WorldId != 0u && entry.WorldId != player.Map.Entry.Id)
            {
                return(false);
            }

            if (entry.WorldZoneId != 0u && entry.WorldZoneId != player.Zone.Id)
            {
                return(false);
            }

            if (entry.MinLevel != 0u && player.Level < entry.MaxLevel)
            {
                return(false);
            }

            if (entry.MaxLevel != 0u && player.Level > entry.MaxLevel)
            {
                return(false);
            }

            for (int i = 0; i < entry.Quests.Length; i++)
            {
                ushort questId = (ushort)entry.Quests[i];
                if (questId == 0)
                {
                    continue;
                }

                if (player.QuestManager.GetQuestState(questId) != (QuestState)entry.States[i])
                {
                    return(false);
                }
            }

            if (entry.FactionId != 0u && (Faction)entry.FactionId != player.Faction1)
            {
                return(false);
            }

            if (entry.ClassId != 0u && (Class)entry.ClassId != player.Class)
            {
                return(false);
            }

            // TODO: reputation

            if (entry.PrerequisiteId != 0u && !PrerequisiteManager.Meets(player, entry.PrerequisiteId))
            {
                return(false);
            }

            return(true);
        }
Example #2
0
        private bool MeetsPrerequisites(QuestInfo info)
        {
            if (info.Entry.QuestPlayerFactionEnum == 0u && player.Faction1 != Faction.Exile)
            {
                return(false);
            }
            if (info.Entry.QuestPlayerFactionEnum == 1u && player.Faction1 != Faction.Dominion)
            {
                return(false);
            }
            if (info.Entry.PrerequisiteRace != 0u && player.Race != (Race)info.Entry.PrerequisiteRace)
            {
                return(false);
            }
            if (info.Entry.PrerequisiteClass != 0u && player.Class != (Class)info.Entry.PrerequisiteClass)
            {
                return(false);
            }
            if (player.Level < info.Entry.PrerequisiteLevel)
            {
                return(false);
            }

            // ReSharper disable once PossibleInvalidCastExceptionInForeachLoop
            foreach (ushort questId in info.Entry.PrerequisiteQuests.Where(q => q != 0u))
            {
                if (GetQuestState(questId) != QuestState.Completed)
                {
                    return(false);
                }
            }

            if (info.Entry.PrerequisiteId != 0u && !PrerequisiteManager.Meets(player, info.Entry.PrerequisiteId))
            {
                return(false);
            }

            if (!info.IsContract())
            {
                GameFormulaEntry entry = GameTableManager.GameFormula.GetEntry(655);
                // client also hard codes 40 if entry doesn't exist
                if (completedQuests.Count > (entry?.Dataint0 ?? 40u))
                {
                    return(false);
                }
            }
            else
            {
                // TODO: contracts use reward property for max slots, RewardProperty.ActiveContractSlots
            }

            return(true);
        }
Example #3
0
        private static void Main()
        {
            Directory.SetCurrentDirectory(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location));

            Console.Title = Title;
            log.Info("Initialising...");

            ConfigurationManager <WorldServerConfiguration> .Initialise("WorldServer.json");

            DatabaseManager.Initialise(ConfigurationManager <WorldServerConfiguration> .Config.Database);

            DisableManager.Instance.Initialise();

            GameTableManager.Initialise();
            MapManager.Initialise();
            SearchManager.Initialise();
            EntityManager.Initialise();
            EntityCommandManager.Initialise();
            GlobalMovementManager.Initialise();

            AssetManager.Initialise();
            PrerequisiteManager.Initialise();
            GlobalSpellManager.Initialise();
            GlobalQuestManager.Initialise();
            ServerManager.Initialise();

            ResidenceManager.Initialise();
            GlobalStorefrontManager.Initialise();

            // make sure the assigned realm id in the configuration file exists in the database
            RealmId = ConfigurationManager <WorldServerConfiguration> .Config.RealmId;
            if (ServerManager.Servers.All(s => s.Model.Id != RealmId))
            {
                throw new ConfigurationException($"Realm id {RealmId} in configuration file doesn't exist in the database!");
            }

            MessageManager.Initialise();
            SocialManager.Initialise();
            CommandManager.Initialise();
            NetworkManager <WorldSession> .Initialise(ConfigurationManager <WorldServerConfiguration> .Config.Network);

            WorldManager.Initialise(lastTick =>
            {
                NetworkManager <WorldSession> .Update(lastTick);
                MapManager.Update(lastTick);
                ResidenceManager.Update(lastTick);
                BuybackManager.Update(lastTick);
                GlobalQuestManager.Update(lastTick);
            });

            using (WorldServerEmbeddedWebServer.Initialise())
            {
                log.Info("Ready!");

                while (true)
                {
                    Console.Write(">> ");
                    string line = Console.ReadLine();
                    if (!CommandManager.HandleCommand(new ConsoleCommandContext(), line, false))
                    {
                        Console.WriteLine("Invalid command");
                    }
                }
            }
        }