Lockpicking Gump Added
This commit is contained in:
155
Scripts/SubSystem/LockpickingGump/LockpickingGump.cs
Normal file
155
Scripts/SubSystem/LockpickingGump/LockpickingGump.cs
Normal file
@@ -0,0 +1,155 @@
|
||||
using System;
|
||||
using System.Linq;
|
||||
using Server.Items;
|
||||
using Server.Mobiles;
|
||||
|
||||
namespace Server.Gumps
|
||||
{
|
||||
public class LockpickingGump : BaseGump
|
||||
{
|
||||
private const int PinUpId = 116;
|
||||
private const int PinDownId = 115;
|
||||
private const int LockpickId = 114;
|
||||
|
||||
private const int PinWidth = 520;
|
||||
private const int PinHeight = 65;
|
||||
private const int LockpickWidth = 52;
|
||||
private const int LockpickHeight = 184;
|
||||
|
||||
private const int MaxPins = 10;
|
||||
private const int MinPins = 3;
|
||||
|
||||
private int PinsToPick;
|
||||
private int[] PressedPins;
|
||||
private int[] Combination;
|
||||
private int CurrentPinIndex;
|
||||
|
||||
private ILockpickable Lpable;
|
||||
private Lockpick Lpick;
|
||||
|
||||
public LockpickingGump(PlayerMobile pm, ILockpickable lpable, Lockpick lp)
|
||||
: base(pm)
|
||||
{
|
||||
Lpable = lpable;
|
||||
Lpick = lp;
|
||||
double requiredSkill = lpable.RequiredSkill;
|
||||
double lockpickSkill = pm.Skills[SkillName.Lockpicking].Value;
|
||||
PinsToPick = MinPins + (int)Math.Max(0, Math.Floor((1 - lockpickSkill / requiredSkill) * (MaxPins - MinPins)));
|
||||
|
||||
int i;
|
||||
Combination = new int[10];
|
||||
PressedPins = new int[10];
|
||||
|
||||
Random rnd = new Random();
|
||||
for (i = 0; i < Combination.Length; i++)
|
||||
Combination[i] = i+1;
|
||||
|
||||
Combination = Combination.OrderBy(x => rnd.Next()).ToArray();
|
||||
|
||||
for (i = 0; i < 10 - PinsToPick; i++)
|
||||
PressedPins[i] = Combination[i];
|
||||
|
||||
CurrentPinIndex = i;
|
||||
|
||||
AddGumpLayout();
|
||||
}
|
||||
|
||||
public override void AddGumpLayout()
|
||||
{
|
||||
User.CloseGump(this.GetType());
|
||||
|
||||
if (!Lpable.Locked)
|
||||
{
|
||||
User.SendMessage("This lock is already unlocked.");
|
||||
return;
|
||||
}
|
||||
|
||||
int borders = 16;
|
||||
int title = 0;
|
||||
|
||||
AddBackground(0, 0, PinWidth + 2 * borders, PinHeight + LockpickHeight + 2 * borders + title, 2620);
|
||||
|
||||
int i = 0;
|
||||
|
||||
for (i = 1; i <= 10 ; i++)
|
||||
{
|
||||
if (PressedPins.Contains(i))
|
||||
AddButton((i - 1) * LockpickWidth + borders, borders + title, PinUpId, PinUpId, i, GumpButtonType.Reply, 0);
|
||||
else
|
||||
AddButton((i - 1) * LockpickWidth + borders, borders + title, PinDownId, PinDownId, i, GumpButtonType.Reply, 0);
|
||||
}
|
||||
|
||||
AddImage(borders, borders + title + LockpickHeight, LockpickId, 0);
|
||||
}
|
||||
|
||||
public override void OnResponse(RelayInfo info)
|
||||
{
|
||||
Item lpable = Lpable as Item;
|
||||
if(lpable == null || lpable.Deleted || !lpable.IsAccessibleTo(User) || !lpable.InRange(User.Location, 1))
|
||||
{
|
||||
this.Close();
|
||||
return;
|
||||
}
|
||||
|
||||
int id = info.ButtonID;
|
||||
|
||||
if (id == 0)
|
||||
{
|
||||
this.Close();
|
||||
return;
|
||||
}
|
||||
|
||||
if (!PressedPins.Contains(id))
|
||||
{
|
||||
if (Lpick.Amount < 1)
|
||||
{
|
||||
User.SendMessage("You are out of lockpicks!");
|
||||
this.Close();
|
||||
return;
|
||||
}
|
||||
|
||||
int rnd = Utility.Random(4);
|
||||
|
||||
if (rnd == 0)
|
||||
{
|
||||
User.PlaySound(0x3A4);
|
||||
Lpick.Consume();
|
||||
}
|
||||
else
|
||||
User.PlaySound(0x3B9 + rnd);
|
||||
|
||||
PressedPins[CurrentPinIndex] = id;
|
||||
CurrentPinIndex++;
|
||||
}
|
||||
|
||||
if (CurrentPinIndex >= 10)
|
||||
{
|
||||
User.PlaySound(0x241);
|
||||
Timer.DelayCall(TimeSpan.FromMilliseconds(500.0), CheckCombination);
|
||||
}
|
||||
|
||||
Refresh();
|
||||
}
|
||||
|
||||
public void CheckCombination()
|
||||
{
|
||||
if (Combination.SequenceEqual(PressedPins))
|
||||
{
|
||||
User.PlaySound(0x0EA);
|
||||
Lpable.LockPick(User);
|
||||
User.SendMessage("You successfully pick the lock!");
|
||||
this.Close();
|
||||
}
|
||||
else //retry
|
||||
{
|
||||
int i;
|
||||
PressedPins = new int[10];
|
||||
User.SendMessage("You failed to pick the lock.");
|
||||
for (i = 0; i < 10 - PinsToPick; ++i)
|
||||
PressedPins[i] = Combination[i];
|
||||
CurrentPinIndex = i;
|
||||
Refresh();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user