Exemple #1
0
        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);
        }
Exemple #2
0
 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!");
     }
 }
Exemple #3
0
        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);
        }