129 lines
4.2 KiB
C#
129 lines
4.2 KiB
C#
using System;
|
|
using Server.Factions;
|
|
using Server.Items;
|
|
using Server.Network;
|
|
using Server.Targeting;
|
|
|
|
namespace Server.SkillHandlers
|
|
{
|
|
public static class RemoveTrap
|
|
{
|
|
public static void Initialize()
|
|
{
|
|
SkillInfo.Table[(int)SkillName.RemoveTrap].Callback = OnUse;
|
|
}
|
|
|
|
public static TimeSpan OnUse(Mobile m)
|
|
{
|
|
if (m.Skills.Lockpicking.Value < 50)
|
|
{
|
|
m.SendLocalizedMessage(502366); // You do not know enough about locks. Become better at picking locks.
|
|
}
|
|
else if (m.Skills.DetectHidden.Value < 50)
|
|
{
|
|
m.SendLocalizedMessage(502367); // You are not perceptive enough. Become better at detect hidden.
|
|
}
|
|
else
|
|
{
|
|
m.Target = new InternalTarget();
|
|
|
|
m.SendLocalizedMessage(502368); // Which trap will you attempt to disarm?
|
|
}
|
|
|
|
return TimeSpan.FromSeconds(10.0); // 10 second delay before being able to re-use a skill
|
|
}
|
|
|
|
private class InternalTarget : Target
|
|
{
|
|
public InternalTarget() : base(2, false, TargetFlags.None)
|
|
{
|
|
}
|
|
|
|
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 TrappableContainer targ)
|
|
{
|
|
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))
|
|
{
|
|
targ.TrapPower = 0;
|
|
targ.TrapLevel = 0;
|
|
targ.TrapType = TrapType.None;
|
|
from.SendLocalizedMessage(502377); // You successfully render the trap harmless
|
|
}
|
|
else
|
|
{
|
|
from.SendLocalizedMessage(502372); // You fail to disarm the trap... but you don't set it off
|
|
}
|
|
}
|
|
else if (targeted is BaseFactionTrap trap)
|
|
{
|
|
Faction faction = Faction.Find(from);
|
|
FactionTrapRemovalKit kit = from.Backpack?.FindItemByType<FactionTrapRemovalKit>();
|
|
|
|
bool isOwner = trap.Placer == from || trap.Faction?.IsCommander(from) == true;
|
|
|
|
if (faction == null)
|
|
{
|
|
from.SendLocalizedMessage(
|
|
1010538); // You may not disarm faction traps unless you are in an opposing faction
|
|
}
|
|
else if (trap.Faction != null && faction == trap.Faction && !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 ((Core.ML && 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.NetState);
|
|
|
|
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.ConsumeCharge(from);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
from.SendLocalizedMessage(502373); // That doesn't appear to be trapped
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|