/// <summary> /// Get a list of all scholars studying this artifact. /// </summary> /// <param name="artifactID"></param> /// <returns></returns> public static String[] GetScholars(String artifactID) { if (artifactID != null) { lock (m_artifacts) if (m_artifacts.ContainsKey(artifactID)) { return(Util.SplitCSV(m_artifacts[artifactID].ScholarID).ToArray()); } } return(null); }
/// <summary> /// Updates the current ability name /// </summary> private void UpdateCurrentName() { try { string name = m_serializedNames; var nameByLevel = new Dictionary <int, string>(); foreach (string levelNamePair in Util.SplitCSV(name.Trim())) { if (levelNamePair.Trim().Length <= 0) { continue; } string[] levelAndName = levelNamePair.Trim().Split('|'); if (levelAndName.Length < 2) { nameByLevel.Add(0, levelNamePair); } else { nameByLevel.Add(int.Parse(levelAndName[0]), levelAndName[1]); } } int level = Level; if (nameByLevel.ContainsKey(level)) { name = nameByLevel[level]; } else { var entry = nameByLevel.OrderBy(k => k.Key).FirstOrDefault(k => k.Key <= level); name = entry.Value ?? string.Format("??{0}", KeyName); // Warn about default value if (entry.Value == null && log.IsWarnEnabled) { log.WarnFormat("Parsing ability display name: keyname='{0}' m_serializedNames='{1}', No Value for Level {2}", KeyName, m_serializedNames, level); } } string roman = getRomanLevel(); m_name = name.Replace("%n", roman); } catch (Exception e) { log.ErrorFormat("Parsing ability display name: keyname='{0}' m_serializedNames='{1}'\n{2}", KeyName, m_serializedNames, e); } }
/// <summary> /// No trainer for disabled classes /// </summary> /// <returns></returns> public override bool AddToWorld() { if (!string.IsNullOrEmpty(ServerProperties.Properties.DISABLED_CLASSES)) { if (disabled_classes == null) { // creation of disabled_classes list. disabled_classes = Util.SplitCSV(ServerProperties.Properties.DISABLED_CLASSES).ToList(); } if (disabled_classes.Contains(TrainedClass.ToString())) { return(false); } } return(base.AddToWorld()); }
/// <summary> /// Create a hashtable containing all item templates that are valid for /// this class. /// </summary> /// <param name="artifactID"></param> /// <param name="charClass"></param> /// <param name="realm"></param> /// <returns></returns> public static Dictionary <String, ItemTemplate> GetArtifactVersions(String artifactID, eCharacterClass charClass, eRealm realm) { if (artifactID == null) { return(null); } List <ArtifactXItem> allVersions = GetArtifactVersions(artifactID, realm); Dictionary <String, ItemTemplate> classVersions = new Dictionary <String, ItemTemplate>(); lock (allVersions) { ItemTemplate itemTemplate; foreach (ArtifactXItem version in allVersions) { itemTemplate = GameServer.Database.FindObjectByKey <ItemTemplate>(version.ItemID); if (itemTemplate == null) { log.Warn(String.Format("Artifact item template '{0}' is missing", version.ItemID)); } else { foreach (String classID in Util.SplitCSV(itemTemplate.AllowedClasses, true)) { try { if (Int32.Parse(classID) == (int)charClass) { classVersions.Add(version.Version, itemTemplate); break; } } catch (Exception ex) { log.Error(String.Format("Invalid class ID '{0}' for item template '{1}', checked by class '{2}'", classID, itemTemplate.Id_nb, (int)charClass)); log.Error(ex.Message); } } } } } return(classVersions); }
/// <summary> /// Loads elements relating to the given instance keyname from the database and populates the instance. /// </summary> /// <param name="instanceName"></param> public virtual void LoadFromDatabase(string instanceName) { var objects = GameServer.Database.SelectObjects <DBInstanceXElement>("`InstanceID` = @InstanceID", new QueryParameter("@InstanceID", instanceName)); if (objects.Count == 0) { return; } int count = 0; //Now we have a list of DBElements, lets create the various entries //associated with them and populate the instance. foreach (DBInstanceXElement entry in objects) { if (entry == null) { continue; //an odd error, but experience knows best. } GameObject obj = null; string theType = "DOL.GS.GameNPC"; //Switch the classtype to see what we are making. switch (entry.ClassType) { case "entrance": { //create the entrance, then move to the next. m_entranceLocation = new GameLocation(instanceName + "entranceRegion" + ID, ID, entry.X, entry.Y, entry.Z, entry.Heading); //move to the next entry, nothing more to do here... continue; } case "region": continue; //This is used to save the regionID as NPCTemplate. case "DOL.GS.GameNPC": break; default: theType = entry.ClassType; break; } //Now we have the classtype to create, create it thus! //This is required to ensure we check scripts for the space aswell, such as quests! foreach (Assembly asm in ScriptMgr.GameServerScripts) { obj = (GameObject)(asm.CreateInstance(theType, false)); if (obj != null) { break; } } if (obj == null) { continue; } //We now have an object that isnt null. Lets place it at the location, in this region. obj.X = entry.X; obj.Y = entry.Y; obj.Z = entry.Z; obj.Heading = entry.Heading; obj.CurrentRegionID = ID; //If its an npc, load from the npc template about now. //By default, we ignore npctemplate if its set to 0. if ((GameNPC)obj != null && !Util.IsEmpty(entry.NPCTemplate, true)) { var listTemplate = Util.SplitCSV(entry.NPCTemplate, true); int template = 0; if (int.TryParse(listTemplate[Util.Random(listTemplate.Count - 1)], out template) && template > 0) { INpcTemplate npcTemplate = NpcTemplateMgr.GetTemplate(template); //we only want to load the template if one actually exists, or there could be trouble! if (npcTemplate != null) { ((GameNPC)obj).LoadTemplate(npcTemplate); } } } //Finally, add it to the world! obj.AddToWorld(); //Keep track of numbers. count++; } log.Info("Successfully loaded a db entry to " + Description + " - Region ID " + ID + ". Loaded Entities: " + count); }
/// <summary> /// Register a generator for the given parameters, /// If all parameters are null a global generaotr for all mobs will be registered /// </summary> /// <param name="generator"></param> /// <param name="mobname"></param> /// <param name="mobguild"></param> /// <param name="mobfaction"></param> /// <param name="mobregion"></param> public static void RegisterLootGenerator(ILootGenerator generator, string mobname, string mobguild, string mobfaction, int mobregion) { if (generator == null) { return; } // Loot Generator Name Indexed if (!Util.IsEmpty(mobname)) { // Parse CSV try { List <string> mobNames = Util.SplitCSV(mobname); foreach (string mob in mobNames) { if ((IList)m_mobNameGenerators[mob] == null) { m_mobNameGenerators[mob] = new ArrayList(); } ((IList)m_mobNameGenerators[mob]).Add(generator); } } catch { if (log.IsDebugEnabled) { log.Debug("Could not Parse mobNames for Registering LootGenerator : " + generator.GetType().FullName); } } } // Loot Generator Guild Indexed if (!Util.IsEmpty(mobguild)) { // Parse CSV try { List <string> mobGuilds = Util.SplitCSV(mobguild); foreach (string guild in mobGuilds) { if ((IList)m_mobGuildGenerators[guild] == null) { m_mobGuildGenerators[guild] = new ArrayList(); } ((IList)m_mobGuildGenerators[guild]).Add(generator); } } catch { if (log.IsDebugEnabled) { log.Debug("Could not Parse mobGuilds for Registering LootGenerator : " + generator.GetType().FullName); } } } // Loot Generator Region Indexed if (mobregion > 0) { IList regionList = (IList)m_mobRegionGenerators[mobregion]; if (regionList == null) { regionList = new ArrayList(); m_mobRegionGenerators[mobregion] = regionList; } regionList.Add(generator); } if (Util.IsEmpty(mobname) && Util.IsEmpty(mobguild) && Util.IsEmpty(mobfaction) && mobregion == 0) { m_globalGenerators.Add(generator); } }
/// <summary> /// Unregister a generator for the given parameters /// </summary> /// <param name="generator"></param> /// <param name="mobname"></param> /// <param name="mobguild"></param> /// <param name="mobfaction"></param> public static void UnRegisterLootGenerator(ILootGenerator generator, string mobname, string mobguild, string mobfaction, int mobregion) { if (generator == null) { return; } // Loot Generator Name Indexed if (!Util.IsEmpty(mobname)) { try { // Parse CSV List <string> mobNames = Util.SplitCSV(mobname); foreach (string mob in mobNames) { if ((IList)m_mobNameGenerators[mob] != null) { ((IList)m_mobNameGenerators[mob]).Remove(generator); } } } catch { if (log.IsDebugEnabled) { log.Debug("Could not Parse mobNames for Removing LootGenerator : " + generator.GetType().FullName); } } } // Loot Generator Guild Indexed if (!Util.IsEmpty(mobguild)) { try { // Parse CSV List <string> mobGuilds = Util.SplitCSV(mobguild); foreach (string guild in mobGuilds) { if ((IList)m_mobGuildGenerators[guild] != null) { ((IList)m_mobGuildGenerators[guild]).Remove(generator); } } } catch { if (log.IsDebugEnabled) { log.Debug("Could not Parse mobGuilds for Removing LootGenerator : " + generator.GetType().FullName); } } } // Loot Generator Faction Indexed if (!Util.IsEmpty(mobfaction)) { try { // Parse CSV List <string> mobFactions = Util.SplitCSV(mobfaction); foreach (string sfaction in mobFactions) { try { int ifaction = int.Parse(sfaction); if ((IList)m_mobFactionGenerators[ifaction] != null) { ((IList)m_mobFactionGenerators[ifaction]).Remove(generator); } } catch { if (log.IsDebugEnabled) { log.Debug("Could not parse faction [" + sfaction + "] into an integer."); } } } } catch { if (log.IsDebugEnabled) { log.Debug("Could not Parse mobFactions for Removing LootGenerator : " + generator.GetType().FullName); } } } // Loot Generator Region Indexed if (mobregion > 0) { IList regionList = (IList)m_mobRegionGenerators[mobregion]; if (regionList != null) { regionList.Remove(generator); } } if (Util.IsEmpty(mobname) && Util.IsEmpty(mobguild) && Util.IsEmpty(mobfaction) && mobregion == 0) { m_globalGenerators.Remove(generator); } }
/// <summary> /// Constructs a new NpcTemplate /// </summary> /// <param name="data">The source npc template data</param> public NpcTemplate(DBNpcTemplate data) { if (data == null) { throw new ArgumentNullException("data"); } m_templateId = data.TemplateId; m_translationId = data.TranslationId; m_name = data.Name; m_suffix = data.Suffix; m_classType = data.ClassType; m_guildName = data.GuildName; m_examineArticle = data.ExamineArticle; m_messageArticle = data.MessageArticle; m_model = data.Model; m_gender = data.Gender; m_size = data.Size; if (m_size == null) { m_size = "50"; } m_level = data.Level; if (m_level == null) { m_level = "0"; } m_equipmentTemplateID = data.EquipmentTemplateID; m_itemsListTemplateID = data.ItemsListTemplateID; m_maxSpeed = data.MaxSpeed; m_parryChance = data.ParryChance; m_evadeChance = data.EvadeChance; m_blockChance = data.BlockChance; m_leftHandSwingChance = data.LeftHandSwingChance; m_strength = data.Strength; m_constitution = data.Constitution; m_dexterity = data.Dexterity; m_quickness = data.Quickness; m_intelligence = data.Intelligence; m_piety = data.Piety; m_charisma = data.Charisma; m_empathy = data.Empathy; WeaponDps = data.WeaponDps; WeaponSpd = data.WeaponSpd; ArmorFactor = data.ArmorFactor; ArmorAbsorb = data.ArmorAbsorb; //Time to add Spells/Styles and Abilties to the templates m_abilities = new ArrayList(); m_spelllines = new ArrayList(); m_spells = new ArrayList(); //Adding the spells to an Arraylist here if (data.Spells != null && data.Spells.Length > 0) { string[] spells = data.Spells.Split(';'); for (int k = 0; k < spells.Length; k++) { int id = int.Parse(spells[k]); Spell sp = SkillBase.GetSpellByID(id); if (sp != null) { m_spells.Add(sp); } else { log.Error("Tried to load a null spell into NPC template " + m_templateId + " spell ID: " + id); } } } // Adding Style list to Template NPC m_styles = new ArrayList(); if (data.Styles != null && data.Styles.Length > 0) { string[] styles = data.Styles.Split(';'); for (int i = 0; i < styles.Length; i++) { if (styles[i].Trim().Length == 0) { continue; } string[] styleAndClass = styles[i].Split('|'); if (styleAndClass.Length != 2) { continue; } string stylePart = styleAndClass[0].Trim(); string classPart = styleAndClass[1].Trim(); if (stylePart.Length == 0 || classPart.Length == 0) { continue; } int styleID = int.Parse(stylePart); int classID = int.Parse(classPart); Style style = SkillBase.GetStyleByID(styleID, classID); m_styles.Add(style); } } //Adding Abilities to Template NPC. //Certain Abilities have levels will need to fix that down the road. -Batlas if (data.Abilities != null && data.Abilities.Length > 0) { foreach (string splitab in Util.SplitCSV(data.Abilities)) { string[] ab = splitab.Split('|'); if (splitab.Trim().Length == 0) { continue; } int id = 1; if (ab.Length > 1) { id = int.Parse(ab[1]); } Ability abil = SkillBase.GetAbility(ab[0], id); if (abil != null) { m_abilities.Add(abil); } } } m_flags = data.Flags; m_meleeDamageType = (eDamageType)data.MeleeDamageType; if (data.MeleeDamageType == 0) { m_meleeDamageType = eDamageType.Slash; } m_inventory = data.EquipmentTemplateID; m_aggroLevel = data.AggroLevel; m_aggroRange = data.AggroRange; m_race = (ushort)data.Race; m_bodyType = (ushort)data.BodyType; m_maxdistance = data.MaxDistance; m_tetherRange = data.TetherRange; m_visibleActiveWeaponSlot = data.VisibleWeaponSlots; m_replaceMobValues = data.ReplaceMobValues; }