public static bool CheckThinkTrigger(BaseCreature bc) { var combatant = bc.Combatant; if (combatant is Mobile) { var profile = PetTrainingHelper.GetAbilityProfile(bc); if (profile != null) { AreaEffect effect = null; var effects = profile.GetAreaEffects().Where(a => !a.IsInCooldown(bc)).ToArray(); if (effects != null && effects.Length > 0) { effect = effects[Utility.Random(effects.Length)]; } if (effect != null) { return(effect.Trigger(bc, (Mobile)combatant)); } } } return(false); }
public override void DoEffects(BaseCreature creature, Mobile defender, ref int damage) { if (creature.Map == null) { return; } List <Mobile> list = new List <Mobile>(); IPooledEnumerable eable = creature.GetMobilesInRange(8); foreach (Mobile m in eable) { if (AreaEffect.ValidTarget(creature, m)) { list.Add(m); } } eable.Free(); foreach (Mobile m in list) { creature.DoHarmful(m, false); m.FixedParticles(0x374A, 10, 15, 5013, 0x496, 0, EffectLayer.Waist); m.PlaySound(0x231); m.SendMessage("You feel the mana drain out of you!"); int toDrain = Utility.RandomMinMax(40, 60); creature.Mana += toDrain; m.Mana -= toDrain; } }
public IEnumerable <AreaEffect> EnumerateAreaEffects() { if (AreaEffects == null) { yield break; } for (var index = 0; index < AreaEffects.Length; index++) { AreaEffect ability = AreaEffects[index]; yield return(ability); } }
public void RemoveAbility(AreaEffect ability) { if (AreaEffects == null || !AreaEffects.Any(a => a == ability)) { return; } var list = AreaEffects.ToList(); list.Remove(ability); RemovePetAdvancement(ability); AreaEffects = list.ToArray(); ColUtility.Free(list); }
public bool HasAreaEffect(AreaEffect ability) { bool any = false; for (var index = 0; index < AreaEffects.Length; index++) { var a = AreaEffects[index]; if (a == ability) { any = true; break; } } return(AreaEffects != null && any); }
public override void DoEffects(BaseCreature creature, Mobile defender, ref int damage) { IPooledEnumerable eable = creature.GetMobilesInRange(3); List <Mobile> list = new List <Mobile>(); list.Add(defender); foreach (Mobile m in eable) { if (AreaEffect.ValidTarget(creature, m)) { list.Add(m); } } eable.Free(); Poison p = creature.GetHitPoison(); if (p == null) { return; } foreach (var m in list) { defender.PlaySound(0xDD); defender.FixedParticles(0x3728, 244, 25, 9941, 1266, 0, EffectLayer.Waist); m.SendLocalizedMessage(1008097, false, creature.Name); // : poisoned you! m.ApplyPoison(creature, p); } if (creature.Controlled && list.Count > 0) { var profile = PetTrainingHelper.GetAbilityProfile(creature); if ((profile != null && profile.HasAbility(MagicalAbility.Poisoning)) || 0.2 > Utility.RandomDouble()) { creature.CheckSkill(SkillName.Poisoning, 0, creature.Skills[SkillName.Poisoning].Cap); } } ColUtility.Free(list); }
public IEnumerable <object> EnumerateAllAbilities() { if (MagicalAbility != MagicalAbility.None) { for (var index = 0; index < PetTrainingHelper.MagicalAbilities.Length; index++) { MagicalAbility abil = PetTrainingHelper.MagicalAbilities[index]; if ((MagicalAbility & abil) != 0) { yield return(abil); } } } if (SpecialAbilities != null) { for (var index = 0; index < SpecialAbilities.Length; index++) { SpecialAbility abil = SpecialAbilities[index]; yield return(abil); } } if (AreaEffects != null) { for (var index = 0; index < AreaEffects.Length; index++) { AreaEffect effect = AreaEffects[index]; yield return(effect); } } if (WeaponAbilities != null) { for (var index = 0; index < WeaponAbilities.Length; index++) { WeaponAbility abil = WeaponAbilities[index]; yield return(abil); } } }
public bool AddAbility(AreaEffect ability, bool advancement = true) { if (AreaEffects == null) { AreaEffects = new[] { ability }; } else { bool any = false; for (var index = 0; index < AreaEffects.Length; index++) { var a = AreaEffects[index]; if (a == ability) { any = true; break; } } if (!any) { AreaEffect[] temp = AreaEffects; AreaEffects = new AreaEffect[temp.Length + 1]; for (int i = 0; i < temp.Length; i++) { AreaEffects[i] = temp[i]; } AreaEffects[temp.Length] = ability; } } OnAddAbility(ability, advancement); return(true); }
public static bool CheckThinkTrigger(BaseCreature bc) { AbilityProfile profile = PetTrainingHelper.GetAbilityProfile(bc); if (profile != null) { AreaEffect effect = null; List <AreaEffect> list = new List <AreaEffect>(); var af = profile.GetAreaEffects(); for (var index = 0; index < af.Length; index++) { var a = af[index]; if (!a.IsInCooldown(bc)) { list.Add(a); } } AreaEffect[] effects = list.ToArray(); if (effects.Length > 0) { effect = effects[Utility.Random(effects.Length)]; } if (effect != null) { return(effect.Trigger(bc, bc.Combatant as Mobile)); } } return(false); }
public bool AddAbility(AreaEffect ability, bool advancement = true) { if (AreaEffects == null) { AreaEffects = new AreaEffect[] { ability }; } else if (!AreaEffects.Any(a => a == ability)) { var temp = AreaEffects; AreaEffects = new AreaEffect[temp.Length + 1]; for (int i = 0; i < temp.Length; i++) { AreaEffects[i] = temp[i]; } AreaEffects[temp.Length] = ability; } OnAddAbility(ability, advancement); return(true); }
public void RemoveAbility(AreaEffect ability) { bool any = false; for (var index = 0; index < AreaEffects.Length; index++) { var a = AreaEffects[index]; if (a == ability) { any = true; break; } } if (AreaEffects == null || !any) { return; } List <AreaEffect> list = new List <AreaEffect>(); for (var index = 0; index < AreaEffects.Length; index++) { var effect = AreaEffects[index]; list.Add(effect); } list.Remove(ability); RemovePetAdvancement(ability); AreaEffects = list.ToArray(); ColUtility.Free(list); }
public bool HasAreaEffect(AreaEffect ability) { return(AreaEffects != null && AreaEffects.Any(a => a == ability)); }
public AbilityProfile(BaseCreature bc, GenericReader reader) { int version = reader.ReadInt(); Creature = bc; switch (version) { case 0: DamageIndex = -1; break; case 1: DamageIndex = reader.ReadInt(); break; } MagicalAbility = (MagicalAbility)reader.ReadInt(); TokunoTame = reader.ReadBool(); RegenHits = reader.ReadInt(); RegenStam = reader.ReadInt(); RegenMana = reader.ReadInt(); int count = reader.ReadInt(); SpecialAbilities = new SpecialAbility[count]; for (int i = 0; i < count; i++) { SpecialAbilities[i] = SpecialAbility.Abilities[reader.ReadInt()]; } count = reader.ReadInt(); AreaEffects = new AreaEffect[count]; for (int i = 0; i < count; i++) { AreaEffects[i] = AreaEffect.Effects[reader.ReadInt()]; } count = reader.ReadInt(); WeaponAbilities = new WeaponAbility[count]; for (int i = 0; i < count; i++) { WeaponAbilities[i] = WeaponAbility.Abilities[reader.ReadInt()]; } count = reader.ReadInt(); for (int i = 0; i < count; i++) { if (Advancements == null) { Advancements = new List <object>(); } switch (reader.ReadInt()) { case 1: Advancements.Add((MagicalAbility)reader.ReadInt()); break; case 2: Advancements.Add(SpecialAbility.Abilities[reader.ReadInt()]); break; case 3: Advancements.Add(AreaEffect.Effects[reader.ReadInt()]); break; case 4: Advancements.Add(WeaponAbility.Abilities[reader.ReadInt()]); break; case 5: Advancements.Add((SkillName)reader.ReadInt()); break; } } }
public virtual void Serialize(GenericWriter writer) { writer.Write(1); writer.Write(DamageIndex); writer.Write((int)MagicalAbility); writer.Write(TokunoTame); writer.Write(RegenHits); writer.Write(RegenStam); writer.Write(RegenMana); writer.Write(SpecialAbilities != null ? SpecialAbilities.Length : 0); if (SpecialAbilities != null) { for (var index = 0; index < SpecialAbilities.Length; index++) { SpecialAbility abil = SpecialAbilities[index]; writer.Write(Array.IndexOf(SpecialAbility.Abilities, abil)); } } writer.Write(AreaEffects != null ? AreaEffects.Length : 0); if (AreaEffects != null) { for (var index = 0; index < AreaEffects.Length; index++) { AreaEffect abil = AreaEffects[index]; writer.Write(Array.IndexOf(AreaEffect.Effects, abil)); } } writer.Write(WeaponAbilities != null ? WeaponAbilities.Length : 0); if (WeaponAbilities != null) { for (var index = 0; index < WeaponAbilities.Length; index++) { WeaponAbility abil = WeaponAbilities[index]; writer.Write(Array.IndexOf(WeaponAbility.Abilities, abil)); } } writer.Write(Advancements != null ? Advancements.Count : 0); if (Advancements != null) { for (var index = 0; index < Advancements.Count; index++) { object o = Advancements[index]; if (o is MagicalAbility ability) { writer.Write(1); writer.Write((int)ability); } else if (o is SpecialAbility specialAbility) { writer.Write(2); writer.Write(Array.IndexOf(SpecialAbility.Abilities, specialAbility)); } else if (o is AreaEffect effect) { writer.Write(3); writer.Write(Array.IndexOf(AreaEffect.Effects, effect)); } else if (o is WeaponAbility weaponAbility) { writer.Write(4); writer.Write(Array.IndexOf(WeaponAbility.Abilities, weaponAbility)); } else if (o is SkillName skillName) { writer.Write(5); writer.Write((int)skillName); } else { writer.Write(0); } } } }