Beispiel #1
0
            public override void OnResponse(NetState sender, RelayInfo info)
            {
                if (m_Panel.Deleted || info.ButtonID == 0 || !m_From.CheckAlive())
                {
                    m_Panel.m_User = null;
                    return;
                }

                if (m_From.Map != m_Panel.Map || !m_From.InRange(m_Panel, 3))
                {
                    m_From.SendLocalizedMessage(500446);                       // That is too far away.
                    m_Panel.m_User = null;
                    return;
                }

                Node nextNode = m_Panel.Path[m_Step + 1];

                if (info.ButtonID == 5)                   // Attempt to Decipher
                {
                    double lockpicking = m_From.Skills.Lockpicking.Value;

                    if (lockpicking < 65.0)
                    {
                        return;
                    }

                    m_From.PlaySound(0x241);

                    if (40.0 + Utility.RandomDouble() * 80.0 < lockpicking)
                    {
                        m_From.SendGump(new GameGump(m_Panel, m_From, m_Step, true));
                        m_Panel.m_LastUse = DateTime.UtcNow;
                    }
                    else
                    {
                        m_Panel.DoDamage(m_From);
                        m_Panel.m_User = null;
                    }
                }
                else
                {
                    Node curNode = m_Panel.Path[m_Step];

                    int newX, newY;
                    switch (info.ButtonID)
                    {
                    case 1:                             // Left
                        newX = curNode.X - 1;
                        newY = curNode.Y;
                        break;

                    case 2:                             // Up
                        newX = curNode.X;
                        newY = curNode.Y - 1;
                        break;

                    case 3:                             // Right
                        newX = curNode.X + 1;
                        newY = curNode.Y;
                        break;

                    case 4:                             // Down
                        newX = curNode.X;
                        newY = curNode.Y + 1;
                        break;

                    default:
                        return;
                    }

                    if (nextNode.X == newX && nextNode.Y == newY)
                    {
                        if (m_Step + 1 == m_Panel.Path.Length - 1)
                        {
                            m_Panel.Solve(m_From);
                            m_Panel.m_User = null;
                        }
                        else
                        {
                            m_From.PlaySound(0x1F4);
                            m_From.SendGump(new GameGump(m_Panel, m_From, m_Step + 1, false));
                            m_Panel.m_LastUse = DateTime.UtcNow;
                        }
                    }
                    else
                    {
                        m_Panel.DoDamage(m_From);
                        m_Panel.m_User = null;
                    }
                }
            }