public static (bool Result, string Message) MessagePrompt(string message, string initialText = "", bool closable = false) { MessagePromptGump gump = new MessagePromptGump(message, initialText, closable); PacketFilterInfo pfi = new PacketFilterInfo(0xB1, new[] { PacketFilterConditions.UIntAtPositionCondition(gump.ID, 7) }); Engine.AddSendPostFilter(pfi); gump.SendGump(); gump.AutoResetEvent.WaitOne(); Engine.RemoveSendPostFilter(pfi); return(gump.Result, gump.Message); }
public static bool ConfirmPrompt(string message, bool closable = false) { ConfirmPromptGump gump = new ConfirmPromptGump(message, closable); PacketFilterInfo pfi = new PacketFilterInfo(0xB1, new[] { PacketFilterConditions.UIntAtPositionCondition(gump.ID, 7) }); Engine.AddSendPostFilter(pfi); gump.SendGump(); gump.AutoResetEvent.WaitOne(); Engine.RemoveSendPostFilter(pfi); return(gump.Result); }
public static bool WaitForGump(uint gumpId, int timeout = 30000) { PacketFilterInfo pfi = new PacketFilterInfo(0xDD); if (gumpId != 0) { pfi = new PacketFilterInfo(0xDD, new[] { PacketFilterConditions.UIntAtPositionCondition(gumpId, 7) }); } PacketWaitEntry packetWaitEntry = Engine.PacketWaitEntries.Add(pfi, PacketDirection.Incoming, true); try { bool result = packetWaitEntry.Lock.WaitOne(timeout); return(result); } finally { Engine.PacketWaitEntries.Remove(packetWaitEntry); } }
public static async Task <int> GetTargeSerialAsync(string message = "", int timeout = 30000) { if (string.IsNullOrEmpty(message)) { message = Strings.Target_object___; } SystemMessage(message); Random random = new Random(); return(await Task.Run(() => { bool wasTargetting = Engine.TargetExists; uint value = (uint)random.Next(1, int.MaxValue); //TODO PacketWriter pw = new PacketWriter(19); pw.Write((byte)0x6C); pw.Write((byte)0); pw.Write(value); pw.Write((byte)0); pw.Fill(); AutoResetEvent are = new AutoResetEvent(false); int serial = -1; PacketFilterInfo pfi = new PacketFilterInfo(0x6C, new[] { PacketFilterConditions.UIntAtPositionCondition(value, 2) }, (packet, info) => { serial = (packet[7] << 24) | (packet[8] << 16) | (packet[9] << 8) | packet[10]; are.Set(); }); try { Engine.AddSendFilter(pfi); Engine.SendPacketToClient(pw); bool result = are.WaitOne(timeout); if (result) { return serial; } Engine.SendPacketToClient(new CancelTargetCursor(value)); SystemMessage(Strings.Timeout___); return serial; } finally { Engine.RemoveSendFilter(pfi); if (wasTargetting) { ResendTargetToClient(); } } })); }
public static async Task <(TargetType, TargetFlags, int, int, int, int, int)> GetTargetInfoAsync( string message = "", int timeout = 30000) { if (string.IsNullOrEmpty(message)) { message = Strings.Target_object___; } SystemMessage(message); Random random = new Random(); return(await Task.Run(() => { bool wasTargetting = Engine.TargetExists; uint value = (uint)random.Next(1, int.MaxValue); //TODO PacketWriter pw = new PacketWriter(19); pw.Write((byte)0x6C); pw.Write((byte)1); pw.Write(value); pw.Write((byte)0); pw.Fill(); AutoResetEvent are = new AutoResetEvent(false); TargetType targetType = TargetType.Object; TargetFlags targetFlags = TargetFlags.None; int serial = 0; int x = 0; int y = 0; int z = 0; int itemID = 0; PacketFilterInfo pfi = new PacketFilterInfo(0x6C, new[] { PacketFilterConditions.UIntAtPositionCondition(value, 2) }, (packet, info) => { targetType = (TargetType)packet[1]; targetFlags = (TargetFlags)packet[6]; serial = (packet[7] << 24) | (packet[8] << 16) | (packet[9] << 8) | packet[10]; x = (packet[11] << 8) | packet[12]; y = (packet[13] << 8) | packet[14]; z = (packet[15] << 8) | packet[16]; itemID = (packet[17] << 8) | packet[18]; are.Set(); }); try { Engine.AddSendPreFilter(pfi); Engine.SendPacketToClient(pw); bool result = are.WaitOne(timeout); if (result) { return (targetType, targetFlags, serial, x, y, z, itemID); } Engine.SendPacketToClient(new CancelTargetCursor(value)); SystemMessage(Strings.Timeout___); return (targetType, targetFlags, serial, x, y, z, itemID); } finally { Engine.RemoveSendPreFilter(pfi); if (wasTargetting) { ResendTargetToClient(); } } })); }
public DemiseSearchGump(string message = "", string searchTerm = "", IReadOnlyCollection <VendorItem> results = null) : base(100, 100) { _results = results; _message = message; _searchTerm = searchTerm; Movable = true; Closable = true; Resizable = false; Disposable = false; AddPage(0); AddBackground(100, 0, 600, 600, 30536); AddLabel(140, 45, 2100, "Search Term:"); AddBackground(220, 40, 339, 30, 3000); AddTextEntry(225, 45, 340, 30, 0, SEARCH_ENTRY_ID, searchTerm); AddButton(620, 45, 4005, 4006, SEARCH_BUTTON, GumpButtonType.Reply, 0); AddLabel(140, 80, 2100, message); _pfi = new PacketFilterInfo(0xB1, new[] { PacketFilterConditions.UIntAtPositionCondition(ID, 7) }); Engine.AddSendPostFilter(_pfi); if (_results == null) { return; } // ReSharper disable once PossibleLossOfFraction int pages = (int)Math.Ceiling((double)(_results.Count / PER_PAGE)) + 1; for (int i = 1; i < pages + 1; i++) { AddPage(i); VendorItem[] items = _results.Skip((i - 1) * PER_PAGE).Take(PER_PAGE).ToArray(); int startY = 110; foreach (VendorItem item in items) { SendProperties(item); Bitmap art = Art.GetStatic(item.ItemID); AddImageTiledButton(140, startY, 2328, 2328, 0, GumpButtonType.Page, i, item.ItemID, item.Hue, 40 - art.Width / 2, 30 - art.Height / 2); AddItemProperty(item.Serial); AddLabel(240, startY, 2100, $"Name: {item.Name}"); AddLabel(240, startY + 20, 2100, $"Shop Name: {item.ShopName}"); AddLabel(240, startY + 40, 2100, $"Price: {item.Price}"); AddButton(620, startY + 20, 4005, 4006, item.Serial, GumpButtonType.Reply, 0); AddLabel(540, startY + 20, 2100, $"{(Map) item.Map}"); AddHtml(140, 520, 460, 20, $"<A HREF=\"https://demisesearch.azurewebsites.net/search/{Uri.EscapeUriString( searchTerm )}\">Open results on website</A>", false, false); startY += 70; } if (i > 1) { AddButton(140, 540, 5603, 5607, PREVIOUS_BUTTON, GumpButtonType.Page, i - 1); } if (i < pages) { AddButton(640, 540, 5601, 5605, NEXT_BUTTON, GumpButtonType.Page, i + 1); } } }