using System; using Server; using Server.Mobiles; namespace Server.Items { public class CrystalOfKnowledge : Item { private SkillName _Skill; // The curated list of AOS skills. Delete or comment out any skills you don't want dropping! private static readonly SkillName[] _ValidSkills = new SkillName[] { SkillName.Anatomy, SkillName.AnimalLore, SkillName.ItemID, SkillName.ArmsLore, SkillName.Parry, SkillName.Begging, SkillName.Peacemaking, SkillName.Camping, SkillName.Cartography, SkillName.DetectHidden, SkillName.Discordance, SkillName.EvalInt, SkillName.Healing, SkillName.Fishing, SkillName.Forensics, SkillName.Herding, SkillName.Hiding, SkillName.Provocation, SkillName.Lockpicking, SkillName.Magery, SkillName.MagicResist, SkillName.Tactics, SkillName.Snooping, SkillName.Musicianship, SkillName.Poisoning, SkillName.Archery, SkillName.SpiritSpeak, SkillName.Stealing, SkillName.AnimalTaming, SkillName.TasteID, SkillName.Tracking, SkillName.Veterinary, SkillName.Swords, SkillName.Macing, SkillName.Fencing, SkillName.Wrestling, SkillName.Lumberjacking, SkillName.Mining, SkillName.Meditation, SkillName.Stealth, SkillName.RemoveTrap, SkillName.Necromancy, SkillName.Focus, SkillName.Chivalry }; [CommandProperty(AccessLevel.GameMaster)] public SkillName Skill { get => _Skill; set { _Skill = value; UpdateName(); } } // Now pulls exclusively from the _ValidSkills array [Constructible] public CrystalOfKnowledge() : this(_ValidSkills[Utility.Random(_ValidSkills.Length)]) { } [Constructible] public CrystalOfKnowledge(SkillName skill) : base(0x1F19) { _Skill = skill; Hue = 0x501; Weight = 1.0; UpdateName(); } private void UpdateName() { Name = $"a crystalline shard of {_Skill}"; } public override void OnDoubleClick(Mobile from) { if (!IsChildOf(from.Backpack)) { from.SendLocalizedMessage(1042001); return; } Skill targetSkill = from.Skills[_Skill]; if (targetSkill == null) return; int maxCap = 120; int capIncrease = 1; if (targetSkill.Cap >= maxCap) { from.SendMessage(38, $"Your mastery of {_Skill} is already at its absolute limit."); return; } targetSkill.Cap += capIncrease; if (targetSkill.Cap > maxCap) { targetSkill.Cap = maxCap; } from.SendMessage(0x501, $"The crystal dissolves, permanently increasing your {_Skill} cap by 1.0!"); from.PlaySound(0x243); from.FixedParticles(0x373A, 10, 15, 5012, EffectLayer.Waist); Delete(); } public CrystalOfKnowledge(Serial serial) : base(serial) { } public override void Serialize(IGenericWriter writer) { base.Serialize(writer); writer.Write(0); writer.Write((int)_Skill); } public override void Deserialize(IGenericReader reader) { base.Deserialize(reader); int version = reader.ReadInt(); _Skill = (SkillName)reader.ReadInt(); } } }