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; } } }