public static bool ValidTarget(BaseCreature caster, Mobile m) { bool validTarget = false; if (m.AccessLevel > AccessLevel.Player) // can not hurt staff { validTarget = false; } else if (caster == null) // nobody cast the AOE, it hurts everybody { validTarget = true; } // player can not use this AOE /* * else if (m_Caster.Player && m_Caster == m) // player can use AOE to hurt themselves under any condition * validTarget = true; */ else if (Core.AOS && caster == m) // NPC never hurt themselves with AOE in AOS context { validTarget = false; } else if (!caster.Controlled && !caster.Summoned) { // potion thrown by a wild creature (the most typical case for now) if (m is BaseCreature) { BaseCreature target = (BaseCreature)m; if (target.Blessed) { validTarget = false; // obvious } else if (!target.Controlled && !target.Summoned) { // wild NPC can not hurt another wild NPC of same alliance (good can not hurt good, bad can not hurt bad, but can hurt across) if (target.InitialInnocent == caster.InitialInnocent) { validTarget = false; } else { validTarget = true; } } else if (!caster.InitialInnocent && ((target.Controlled && target.ControlMaster != null && target.ControlMaster.Player && !target.IsDeadPet) || (target.Summoned && target.SummonMaster != null && target.SummonMaster.Player))) { validTarget = true; // wild non-good NPC can always hurt player controlled/summoned NPC } } else if (m.Player && !caster.InitialInnocent && !(m.AccessLevel > AccessLevel.Player && m.Hidden)) { validTarget = true; // wild NPC of non-good alliance can always hurt a player, given it is not a hidden GM } } else { validTarget = (SpellHelper.ValidIndirectTarget(caster, m) && caster.CanBeHarmful(m, false)); } return(validTarget); }
private static void AttemptFireBreath(BaseCreature creature, Mobile target) { if (!creature.InLOS(target)) { creature.SendMessage("Target cannot be seen."); return; } if (!target.InRange(creature, creature.BreathRange)) { creature.SendMessage("That is too far away."); return; } if (target != null && target.Alive && !target.IsDeadBondedPet && creature.CanBeHarmful(target) && target.Map == creature.Map && !creature.IsDeadBondedPet && !creature.BardPacified) { creature.BreathStart(target); creature.SetNextBreathTime(); } else { creature.SendMessage("You can't breathe fire on that!"); } }
public void Provoke(Mobile target) { if (target == null || Deleted || !Alive || m_NextProvoke > DateTime.UtcNow || 0.05 < Utility.RandomDouble()) { return; } foreach (Mobile m in GetMobilesInRange(RangePerception)) { if (m is BaseCreature) { BaseCreature c = (BaseCreature)m; if (c == this || c == target || c.Unprovokable || c.IsParagon || c.BardProvoked || c.AccessLevel != AccessLevel.Player || !c.CanBeHarmful(target)) { continue; } c.Provoke(this, target, true); if (target.Player) { target.SendLocalizedMessage(1072062); // You hear angry music, and start to fight. } PlaySound(0x58A); break; } } m_NextProvoke = DateTime.UtcNow + TimeSpan.FromSeconds(10); }