public static Monster Create(MonsterTemplate template, Area map) { if (template.CastSpeed == 0) { template.CastSpeed = 2000; } if (template.AttackSpeed == 0) { template.AttackSpeed = 1000; } if (template.MovementSpeed == 0) { template.MovementSpeed = 2000; } if (template.Level <= 0) { template.Level = 1; } var obj = new Monster { Template = template, CastTimer = new GameServerTimer(TimeSpan.FromMilliseconds(1 + template.CastSpeed)), BashTimer = new GameServerTimer(TimeSpan.FromMilliseconds(1 + template.AttackSpeed)), WalkTimer = new GameServerTimer(TimeSpan.FromMilliseconds(1 + template.MovementSpeed)), CastEnabled = template.MaximumMP > 0, TaggedAislings = new HashSet <int>() }; if (obj.Template.Grow) { obj.Template.Level++; } var mod = (obj.Template.Level + 1) * 0.01; var rate = mod * 250 * obj.Template.Level; var exp = obj.Template.Level * rate / 1; var hp = mod + 50 + obj.Template.Level * (obj.Template.Level + 40); var mp = hp / 3; var dmg = hp / 1 * mod * 1; obj.Template.MaximumHP = (int)hp; obj.Template.MaximumMP = (int)mp; var stat = RandomEnumValue <PrimaryStat>(); obj._Str = 3; obj._Int = 3; obj._Wis = 3; obj._Con = 3; obj._Dex = 3; switch (stat) { case PrimaryStat.STR: obj._Str += (byte)(obj.Template.Level * 0.5 * 2); break; case PrimaryStat.INT: obj._Int += (byte)(obj.Template.Level * 0.5 * 2); break; case PrimaryStat.WIS: obj._Wis += (byte)(obj.Template.Level * 0.5 * 2); break; case PrimaryStat.CON: obj._Con += (byte)(obj.Template.Level * 0.5 * 2); break; case PrimaryStat.DEX: obj._Dex += (byte)(obj.Template.Level * 0.5 * 2); break; } obj.MajorAttribute = stat; obj.BonusAc = (int)(70 - obj.Template.Level * 0.5 / 1.0); if (obj.BonusAc < -70) { obj.BonusAc = -70; } obj.DefenseElement = ElementManager.Element.None; obj.OffenseElement = ElementManager.Element.None; if (obj.Template.ElementType == ElementQualifer.Random) { obj.DefenseElement = RandomEnumValue <ElementManager.Element>(); obj.OffenseElement = RandomEnumValue <ElementManager.Element>(); } else if (obj.Template.ElementType == ElementQualifer.Defined) { obj.DefenseElement = template?.DefenseElement == ElementManager.Element.None ? RandomEnumValue <ElementManager.Element>() : template.DefenseElement; obj.OffenseElement = template?.OffenseElement == ElementManager.Element.None ? RandomEnumValue <ElementManager.Element>() : template.OffenseElement; } obj.BonusMr = (byte)(10 * (template.Level / 20)); if (obj.BonusMr > ServerContextBase.Config.BaseMR) { obj.BonusMr = ServerContextBase.Config.BaseMR; } if ((template.PathQualifer & PathQualifer.Wander) == PathQualifer.Wander) { obj.WalkEnabled = true; } else if ((template.PathQualifer & PathQualifer.Fixed) == PathQualifer.Fixed) { obj.WalkEnabled = false; } else if ((template.PathQualifer & PathQualifer.Patrol) == PathQualifer.Patrol) { obj.WalkEnabled = true; } if (template.MoodType.HasFlag(MoodQualifer.Aggressive)) { obj.Aggressive = true; } else if (template.MoodType.HasFlag(MoodQualifer.Unpredicable)) { lock (Generator.Random) { obj.Aggressive = Generator.Random.Next(1, 101) > 50; } } else { obj.Aggressive = false; } if (template.SpawnType == SpawnQualifer.Random) { var x = Generator.Random.Next(1, map.Cols); var y = Generator.Random.Next(1, map.Rows); obj.XPos = x; obj.YPos = y; if (map.IsWall(x, y)) { return(null); } } else if (template.SpawnType == SpawnQualifer.Defined) { obj.XPos = template.DefinedX; obj.YPos = template.DefinedY; } lock (Generator.Random) { obj.Serial = GenerateNumber(); } obj.CurrentMapId = map.ID; obj.CurrentHp = template.MaximumHP; obj.CurrentMp = template.MaximumMP; obj._MaximumHp = template.MaximumHP; obj._MaximumMp = template.MaximumMP; obj.AbandonedDate = DateTime.UtcNow; lock (Generator.Random) { obj.Image = template.ImageVarience > 0 ? (ushort)Generator.Random.Next(template.Image, template.Image + template.ImageVarience) : template.Image; } obj.Scripts = ScriptManager.Load <MonsterScript>(template.ScriptName, obj, map); if (obj.Template.LootType.HasFlag(LootQualifer.Table)) { obj.LootManager = new LootDropper(); obj.LootTable = new LootTable(template.Name); obj.UpgradeTable = new LootTable("Probabilities"); foreach (var drop in obj.Template.Drops) { if (drop.Equals("random", StringComparison.OrdinalIgnoreCase)) { lock (Generator.Random) { var available = ServerContextBase.GlobalItemTemplateCache.Select(i => i.Value) .Where(i => Math.Abs(i.LevelRequired - obj.Template.Level) <= 10).ToList(); if (available.Count > 0) { obj.LootTable.Add(available[GenerateNumber() % available.Count]); } } } else { if (ServerContextBase.GlobalItemTemplateCache.ContainsKey(drop)) { obj.LootTable.Add(ServerContextBase.GlobalItemTemplateCache[drop]); } } } obj.UpgradeTable.Add(new Common()); obj.UpgradeTable.Add(new Uncommon()); obj.UpgradeTable.Add(new Rare()); obj.UpgradeTable.Add(new Epic()); obj.UpgradeTable.Add(new Legendary()); obj.UpgradeTable.Add(new Mythical()); obj.UpgradeTable.Add(new Godly()); obj.UpgradeTable.Add(new Forsaken()); } return(obj); }
public void Rewards(Aisling user, bool equipLoot) { foreach (var items in SkillRewards) { if (!Skill.GiveTo(user.Client, items)) { } } foreach (var items in SpellRewards) { if (!Spell.GiveTo(user, items)) { } } foreach (var items in ItemRewards) { if (ServerContext.GlobalItemTemplateCache.ContainsKey(items)) { var template = ServerContext.GlobalItemTemplateCache[items]; var obj = Item.Create(user, template); if (!obj.GiveTo(user, true)) { obj.Release(user, user.Position); } } } foreach (var legends in LegendRewards) { user.LegendBook.AddLegend(new Legend.LegendItem { Category = "Quest Reward", Color = legends.Color, Icon = legends.Icon, Value = legends.Value }); } if (ExpRewards.Count > 0) { ExpRewards.ForEach(i => Monster.DistributeExperience(user, i)); } if (GoldReward > 0) { user.GoldPoints += (int)GoldReward; user.Client.SendMessage(0x02, string.Format("You are awarded {0} gold.", GoldReward)); } if (equipLoot) { EquipRewards(user); user.Client.Refresh(); } user.Client.SendStats(StatusFlags.All); }