/// <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); }
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); }
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"); } } } }