using System; using System.Runtime.CompilerServices; using Server.Engines.ConPVP; using Server.Factions; using Server.Gumps; using Server.Menus.Questions; using Server.Mobiles; using Server.Multis; using Server.Network; using Server.Regions; namespace Server.Engines.Help; public class ContainedMenu : QuestionMenu { private static readonly string[] _options = [ "Leave my old help request like it is.", "Remove my help request from the queue." ]; private readonly Mobile _from; public ContainedMenu(Mobile from) : base( "You already have an open help request. We will have someone assist you as soon as possible. What would you like to do?", _options ) => _from = from; public override void OnCancel(NetState state) { _from.SendLocalizedMessage(1005306, "", 0x35); // Help request unchanged. } public override void OnResponse(NetState state, int index) { if (index == 0) { _from.SendLocalizedMessage(1005306, "", 0x35); // Help request unchanged. } else if (index == 1) { var entry = PageQueue.GetEntry(_from); if (entry != null && entry.Handler == null) { _from.SendLocalizedMessage(1005307, "", 0x35); // Removed help request. // entry.AddResponse(entry.Sender, "[Canceled]"); PageQueue.Remove(entry); } else { _from.SendLocalizedMessage(1005306, "", 0x35); // Help request unchanged. } } } } public sealed class HelpGump : DynamicGump { private readonly Mobile _from; public override bool Singleton => true; public HelpGump(Mobile from) : base(0, 0) => _from = from; protected override void BuildLayout(ref DynamicGumpBuilder builder) { var isYoung = IsYoung(_from); var totalHeight = 110 + (isYoung ? 64 : 0) + 4 * 80; builder.AddBackground(50, 25, 540, totalHeight, 2600); builder.AddPage(); builder.AddHtmlLocalized(150, 50, 360, 40, 1001002); //
Ultima Online Help Menu
builder.AddButton(425, totalHeight - 15, 2073, 2072, 0); // Close builder.AddPage(1); var delta = 80; int y; const int height = 74; if (isYoung) { // Young player haven transport: Select this option if you want to be transported to Haven. AddOption(ref builder, 90, 48, 9, 1041525, page: 2); y = 90 + 54; } else { y = 90; } /* General question about Ultima Online: * Select this option if you are having difficulties learning to use a skill, * if you have a general gameplay question, or you would like to search the UO Knowledge Base. */ AddOption(ref builder, y, height, 1, 1001003, page: 2); /* * My character is physically stuck: * This choice only covers cases where your character is physically stuck in a location they cannot move out of. */ AddOption(ref builder, y += delta, height, 2, 1001004); /* * Another player is harassing me: * Another player is harassing me verbally or physically, or is breaking the Terms of Service Agreement. * To see what constitutes harassment please visit * * - How do I report someone for Harassment in UO? -. */ AddOption(ref builder, y += delta, height, 0, 1001005, GumpButtonType.Page, 3); /* * Other: If you are experiencing a problem in the game that does not fall into one of the other categories * or is not addressed on the Support web page * (located at https://help.ea.com/en/ultima-online/) and * requires in-game assistance please use this option. */ AddOption(ref builder, y + delta, height, 0, 1001006, GumpButtonType.Page, 2); builder.AddPage(2); y = 90; /* * Report a bug: * Use this option to launch your web browser submit a bug report. * Your report will be read by our Quality Assurance staff * We apologize for not being able to reply to individual bug reports. */ AddOption(ref builder, y, 3, 1001009); /* * Suggestion for the Game: * If you'd like to make a suggestion for the game it should be directed to the Development Team Members who * participate in the discussion forums. * Choosing this option will take you to the discussion forums. */ AddOption(ref builder, y += delta, 4, 1074795); /* * Visit the Ultima Online Knowledge Base: * You can find detailed answers to many of the most frequently asked questions in our Knowledge Base. * This selection will launch your web browser and take you to those answers. */ AddOption(ref builder, y += delta, 5, 1074796); /* * Other: If you are experiencing a problem in the game that does not fall into one of the other categories * or is not addressed on the Support web page * (located at https://help.ea.com/en/ultima-online/) and * requires in-game assistance please use this option. */ AddOption(ref builder, y + delta, 6, 1001006); builder.AddPage(3); y = 90; delta = 150; /*
Another player is harassing me (or Exploiting).

* VERBAL HARASSMENT
* Use this option when another player is verbally harassing your character. * Verbal harassment behaviors include but are not limited to, using bad language, threats etc.. * Before you submit a complaint be sure you understand what constitutes harassment * - what is verbal harassment? - * and that you have followed these steps:
* 1. You have asked the player to stop and they have continued.
* 2. You have tried to remove yourself from the situation.
* 3. You have done nothing to instigate or further encourage the harassment.
* 4. You have added the player to your ignore list. * - How do I ignore a player?
* 5. You have read and understand Origin's definition of harassment.
* 6. Your account information is up to date. (Including a current email address)
* *If these steps have not been taken, GMs may be unable to take action against the offending player.
* **A chat log will be review by a GM to assess the validity of this complaint. * Abuse of this system is a violation of the Rules of Conduct.
* EXPLOITING
* Use this option to report someone who may be exploiting or cheating. * - What constitutes an exploit? */ AddOption(ref builder, y, 145, 7, 1062572); /*
Another player is harassing me using game mechanics.

*
* PHYSICAL HARASSMENT
* Use this option when another player is harassing your character using game mechanics. * Physical harassment includes but is not limited to luring, Kill Stealing, and any act that causes a players death in Underworld. * Before you submit a complaint be sure you understand what constitutes harassment * - what is physical harassment? * and that you have followed these steps:
* 1. You have asked the player to stop and they have continued.
* 2. You have tried to remove yourself from the situation.
* 3. You have done nothing to instigate or further encourage the harassment.
* 4. You have added the player to your ignore list. * - how do I ignore a player?
* 5. You have read and understand Origin's definition of harassment.
* 6. Your account information is up to date. (Including a current email address)
* *If these steps have not been taken, GMs may be unable to take action against the offending player.
* **This issue will be reviewed by a GM to assess the validity of this complaint. * Abuse of this system is a violation of the Rules of Conduct. */ AddOption(ref builder, y += delta, 145, 8, 1062573); builder.AddButton(150, y + 150, 5540, 5541, 0, GumpButtonType.Page, 1); builder.AddHtmlLocalized(180, y + 150, 335, 40, 1001015); // NO - I meant to ask for help with another matter. } [MethodImpl(MethodImplOptions.AggressiveInlining)] private static void AddOption( ref DynamicGumpBuilder builder, int y, int buttonId, int localizedName, GumpButtonType type = GumpButtonType.Reply, int page = 0 ) => AddOption(ref builder, y, 74, buttonId, localizedName, type, page); private static void AddOption( ref DynamicGumpBuilder builder, int y, int height, int buttonId, int localizedName, GumpButtonType type = GumpButtonType.Reply, int page = 0 ) { builder.AddButton(80, y, 5540, 5541, buttonId, type, page); builder.AddHtmlLocalized( 110, y, 450, height, localizedName, true, true ); } public static void HelpRequest(Mobile m) { if (m.HasGump()) { return; } if (!PageQueue.CheckAllowedToPage(m)) { return; } if (PageQueue.Contains(m)) { m.SendMenu(new ContainedMenu(m)); } else { m.SendGump(new HelpGump(m)); } } private static bool IsYoung(Mobile m) => m is PlayerMobile mobile && mobile.Young; public static bool CheckCombat(Mobile m) { for (var i = 0; i < m.Aggressed.Count; ++i) { var info = m.Aggressed[i]; if (Core.Now - info.LastCombatTime < TimeSpan.FromSeconds(30.0)) { return true; } } return false; } public override void OnResponse(NetState state, in RelayInfo info) { var from = state.Mobile; var type = (PageType)(-1); switch (info.ButtonID) { case 0: // Close/Cancel { from.SendLocalizedMessage(501235, "", 0x35); // Help request aborted. break; } case 1: // General question { type = PageType.Question; break; } case 2: // Stuck { var house = BaseHouse.FindHouseAt(from); if (house?.IsAosRules == true && !from.Region.IsPartOf()) // Dueling { from.Location = house.BanLocation; } else if (from.Region.IsPartOf()) { from.SendLocalizedMessage(1114345, "", 0x35); // You'll need a better jailbreak plan than that! } else if (Sigil.ExistsOn(from)) { from.SendLocalizedMessage(1061632); // You can't do that while carrying the sigil. } else if (from is PlayerMobile mobile && mobile.CanUseStuckMenu() && mobile.Region.CanUseStuckMenu(mobile) && !CheckCombat(mobile) && !mobile.Frozen && !mobile.Criminal && (Core.AOS || !mobile.Murderer)) { var menu = new StuckMenu(mobile, mobile, true); menu.BeginClose(); mobile.SendGump(menu); } else { type = PageType.Stuck; } break; } case 3: // Report bug { type = PageType.Bug; break; } case 4: // Game suggestion { type = PageType.Suggestion; break; } case 5: // Account management { type = PageType.Account; break; } case 6: // Other { type = PageType.Other; break; } case 7: // Harassment: verbal/exploit { type = PageType.VerbalHarassment; break; } case 8: // Harassment: physical { type = PageType.PhysicalHarassment; break; } case 9: // Young player transport { if (IsYoung(from)) { if (from.Region.IsPartOf()) { // You'll need a better jailbreak plan than that! from.SendLocalizedMessage(1114345, "", 0x35); } else if (from.Region.IsPartOf("Haven Island")) { from.SendLocalizedMessage(1041529); // You're already in Haven } else { from.MoveToWorld(new Point3D(3503, 2574, 14), Map.Underworld); } } break; } } if (type != (PageType)(-1) && PageQueue.CheckAllowedToPage(from)) { from.SendGump(new PagePromptGump(from, type)); } } }