protected override void OnTarget(Mobile from, object targeted) { if (targeted is Mobile) { from.SendLocalizedMessage(502816); // You feel that such an action would be inappropriate } else if (targeted is TrapableContainer) { TrapableContainer targ = (TrapableContainer)targeted; from.Direction = from.GetDirectionTo(targ); if (targ.TrapType == TrapType.None) { from.SendLocalizedMessage(502373); // That doesn't appear to be trapped return; } from.PlaySound(0x241); if (from.CheckTargetSkill(SkillName.RemoveTrap, targ, targ.TrapPower, targ.TrapPower + 30)) { switch (targ.TrapType) { case TrapType.ExplosionTrap: from.LocalOverheadMessage(Network.MessageType.Regular, 0x78, 502374); // You carefully remove the trigger for the purple potion. break; case TrapType.DartTrap: from.LocalOverheadMessage(Network.MessageType.Regular, 0x62, 502375); // You carefully remove the dart from the firing mechanism. break; case TrapType.PoisonTrap: from.LocalOverheadMessage(Network.MessageType.Regular, 0x44, 502376); // The poison leaks harmlessly away due to your deft touch. break; default: from.LocalOverheadMessage(Network.MessageType.Regular, 0x53, 502377); // You successfully render the trap harmless break; } targ.TrapEnabled = false; targ.TrapPower = 0; targ.TrapLevel = 0; targ.TrapType = TrapType.None; } else { if (Utility.RandomDouble() <= 0.2) { from.SendLocalizedMessage(502370); // Oops. targ.ExecuteTrap(from); } else { from.SendLocalizedMessage(502371); // You breathe a sigh of relief, as you fail to disarm the trap, but don't set it off. } } } else if (targeted is BaseFactionTrap) { BaseFactionTrap trap = (BaseFactionTrap)targeted; Faction faction = Faction.Find(from); FactionTrapRemovalKit kit = (from.Backpack == null ? null : from.Backpack.FindItemByType(typeof(FactionTrapRemovalKit)) as FactionTrapRemovalKit); bool isOwner = (trap.Placer == from || (trap.Faction != null && trap.Faction.IsCommander(from))); if (faction == null) { from.SendLocalizedMessage(1010538); // You may not disarm faction traps unless you are in an opposing faction } else if (faction == trap.Faction && trap.Faction != null && !isOwner) { from.SendLocalizedMessage(1010537); // You may not disarm traps set by your own faction! } else if (!isOwner && kit == null) { from.SendLocalizedMessage(1042530); // You must have a trap removal kit at the base level of your pack to disarm a faction trap. } else { if (isOwner || (from.CheckTargetSkill(SkillName.RemoveTrap, trap, 80.0, 100.0) && from.CheckTargetSkill(SkillName.Tinkering, trap, 80.0, 100.0))) { from.PrivateOverheadMessage(MessageType.Regular, trap.MessageHue, trap.DisarmMessage, from.Client); if (!isOwner) { int silver = faction.AwardSilver(from, trap.SilverFromDisarm); if (silver > 0) { from.SendLocalizedMessage(1008113, true, silver.ToString("N0")); // You have been granted faction silver for removing the enemy trap : } } trap.Delete(); } else { from.SendLocalizedMessage(502372); // You fail to disarm the trap... but you don't set it off } if (!isOwner && kit != null) { kit.ConsumeCharge(from); } } } else if (targeted is GoblinTrap) { GoblinTrap targ = (GoblinTrap)targeted; from.Direction = from.GetDirectionTo(targ); from.PlaySound(0x241); if (from.CheckTargetSkill(SkillName.RemoveTrap, targ, 0.0, 100.0)) { from.LocalOverheadMessage(Network.MessageType.Regular, 0x53, 502377); // You successfully render the trap harmless GoblinTrapGenerator.DisableTrap(from, targ); } else { if (Utility.RandomDouble() <= 0.2) { from.SendLocalizedMessage(502370); // Oops. targ.ExecuteTrap(from); } else { from.SendLocalizedMessage(502371); // You breathe a sigh of relief, as you fail to disarm the trap, but don't set it off. } } } else if (targeted is FloorTrap) { FloorTrap targ = (FloorTrap)targeted; from.Direction = from.GetDirectionTo(targ); from.PlaySound(0x241); if (from.CheckTargetSkill(SkillName.RemoveTrap, targ, targ.TinkerLevel, 110.0)) { new FloorTrapKit().MoveToWorld(targ.Location, targ.Map); from.LocalOverheadMessage(Network.MessageType.Regular, 0x53, 502377); // You successfully render the trap harmless targ.Expire(); } else { if (Utility.RandomDouble() <= 0.2) { from.SendLocalizedMessage(502370); // Oops. targ.ExecuteTrap(from); } else { targ.FailedRemoveTrapAttempt(); from.SendLocalizedMessage(502371); // You breathe a sigh of relief, as you fail to disarm the trap, but don't set it off. } } } else { from.SendLocalizedMessage(502373); // That does'nt appear to be trapped } }
protected override void OnTarget(Mobile src, object targ) { bool foundAnyone = false; if (targ is TrapableContainer) { TrapableContainer cont = targ as TrapableContainer; if (cont.TrapEnabled && cont.TrapType != TrapType.None && cont.TrapPower > 0 && src.CheckSkill(SkillName.DetectHidden, 0.0, 100.0)) { int hue = 0; switch (cont.TrapType) { case TrapType.ExplosionTrap: hue = 0x78; break; case TrapType.DartTrap: hue = 0x5A; break; case TrapType.PoisonTrap: hue = 0x44; break; } cont.SendLocalizedMessageTo(src, 500813, hue); // [trapped] } } Point3D p; if (targ is Mobile) { p = ((Mobile)targ).Location; } else if (targ is Item) { p = ((Item)targ).Location; } else if (targ is IPoint3D) { p = new Point3D((IPoint3D)targ); } else { p = src.Location; } double srcSkill = src.Skills[SkillName.DetectHidden].Value; int range = (int)(srcSkill / 10.0); if (!src.CheckSkill(SkillName.DetectHidden, 0.0, 100.0)) { range /= 2; } var house = HousingHelper.FindHouseAt(p, src.Map, 16); bool inHouse = (house != null && house.IsFriend(src)); if (inHouse) { range = 22; } if (range > 0) { foreach (Mobile trg in src.Map.GetMobilesInRange(p, range)) { if (trg.Hidden && src != trg) { double ss = srcSkill + Utility.Random(21) - 10; double ts = trg.Skills[SkillName.Hiding].Value + Utility.Random(21) - 10; if (src.AccessLevel >= trg.AccessLevel && (ss >= ts || (inHouse && house.IsInside(trg)))) { if (trg is Mobiles.ShadowKnight && (trg.X != p.X || trg.Y != p.Y)) { continue; } // Detect Hidden does not work on players in secure facets. if (trg is Mobiles.PlayerMobile && src is Mobiles.PlayerMobile && !inHouse && src.Map.Rules == MapRules.TrammelRules) { continue; } trg.RevealingAction(); trg.SendLocalizedMessage(500814); // You have been revealed! foundAnyone = true; } } } if (Faction.Find(src) != null) { foreach (Item item in src.Map.GetItemsInRange(p, range)) { if (item is BaseFactionTrap) { BaseFactionTrap trap = (BaseFactionTrap)item; if (src.CheckTargetSkill(SkillName.DetectHidden, trap, 80.0, 100.0)) { src.SendLocalizedMessage(1042712, true, " " + (trap.Faction == null ? "" : trap.Faction.Definition.FriendlyName)); // You reveal a trap placed by a faction: trap.Visible = true; trap.BeginConceal(); foundAnyone = true; } } } } foreach (Item item in src.Map.GetItemsInRange(p, range)) { if (item is GoblinTrap) { GoblinTrap trap = (GoblinTrap)item; if (src.CheckTargetSkill(SkillName.DetectHidden, trap, 0.0, 100.0)) { trap.Visible = true; trap.BeginConceal(); trap.SendLocalizedMessageTo(src, 500813, 0); // [trapped] foundAnyone = true; } } if (item is FloorTrap) { FloorTrap trap = (FloorTrap)item; if (src.CheckTargetSkill(SkillName.DetectHidden, trap, (trap.HidingLevel + trap.TinkerLevel) / 2.0, 110.0)) { trap.Visible = true; trap.BeginConceal(); trap.SendLocalizedMessageTo(src, 500813, 0); // [trapped] foundAnyone = true; } } } } if (!foundAnyone) { src.SendLocalizedMessage(500817); // You can see nothing hidden there. } }