private static async Task <Item[]> FindWands(WandTypes wandType, int containerSerial, int minimumCharges) { // Hybrid has FeatureFlags.AOS, think of better solution if (!Engine.Features.HasFlag(FeatureFlags.AOS) || Engine.CurrentShard.Name.Equals("UOHybrid")) { Item[] allWands = Engine.Items.SelectEntities(i => _wandIds.Contains(i.ID) && (containerSerial == -1 || i.IsDescendantOf(containerSerial))); if (allWands == null) { return(null); } foreach (Item wand in allWands) { Engine.SendPacketToServer(new LookRequest(wand.Serial)); await UOC.WaitForIncomingPacketFilterAsync( new PacketFilterInfo( 0xBF, new[] { PacketFilterConditions.ShortAtPositionCondition(0x10, 3), PacketFilterConditions.IntAtPositionCondition(wand.Serial, 5) } ), 2500); } } Item[] matches = Engine.Items.SelectEntities(i => _wandIds.Contains(i.ID) && (containerSerial == -1 || i.IsDescendantOf(containerSerial)) && i.Properties != null && i.Properties.Any(p => _wandClilocs[wandType].Contains(p.Cliloc) && (minimumCharges == -1 || int.Parse(p.Arguments[0]) >= minimumCharges))); return(matches); }
private static async Task <Item[]> FindWands(WandTypes wandType, int containerSerial, int minimumCharges) { if (!Engine.TooltipsEnabled) { Item[] allWands = Engine.Items.SelectEntities(i => _wandIds.Contains(i.ID) && !ObjectCommands.InIgnoreList(i.Serial) && (containerSerial == -1 || i.IsDescendantOf(containerSerial))); if (allWands == null) { return(null); } foreach (Item wand in allWands) { Engine.SendPacketToServer(new LookRequest(wand.Serial)); await UOC.WaitForIncomingPacketFilterAsync( new PacketFilterInfo( 0xBF, new[] { PacketFilterConditions.ShortAtPositionCondition(0x10, 3), PacketFilterConditions.IntAtPositionCondition(wand.Serial, 5) } ), 2500); } } Item[] matches = Engine.Items.SelectEntities(i => _wandIds.Contains(i.ID) && !ObjectCommands.InIgnoreList(i.Serial) && (containerSerial == -1 || i.IsDescendantOf(containerSerial)) && i.Properties != null && i.Properties.Any(p => _wandClilocs[wandType].Contains(p.Cliloc) && (minimumCharges == -1 || int.Parse(p.Arguments[0]) >= minimumCharges))); return(matches); }
public static bool WaitForTargetOrFizzle(int timeout) { PacketFilterInfo targetPfi = new PacketFilterInfo(0x6C); PacketFilterInfo fizzPfi = new PacketFilterInfo(0xC0, new[] { PacketFilterConditions.IntAtPositionCondition(Engine.Player.Serial, 2), PacketFilterConditions.ShortAtPositionCondition(0x3735, 10) }); Engine.WaitingForTarget = true; PacketWaitEntry targetWe = Engine.PacketWaitEntries.Add(targetPfi, PacketDirection.Incoming); PacketWaitEntry fizzWe = Engine.PacketWaitEntries.Add(fizzPfi, PacketDirection.Incoming); try { Task <bool> targetTask = Task.Run(() => { do { bool result = targetWe.Lock.WaitOne(timeout); if (!result) { return(false); } if (targetWe.Packet[6] == 0x03) { continue; } return(true); }while (true); }); Task fizzTask = Task.Run(() => fizzWe.Lock.WaitOne(timeout)); int index = Task.WaitAny(targetTask, fizzTask); return(index == 0 && targetTask.Result); } finally { Engine.PacketWaitEntries.Remove(targetWe); Engine.PacketWaitEntries.Remove(fizzWe); Engine.WaitingForTarget = false; } }
public static bool WaitForContext(object obj, string entryName, int timeout) { int serial = AliasCommands.ResolveSerial(obj); if (serial == 0) { UOC.SystemMessage(Strings.Invalid_or_unknown_object_id, true); return(false); } AutoResetEvent are = new AutoResetEvent(false); PacketFilterInfo pfi = new PacketFilterInfo(0xBF, new[] { PacketFilterConditions.ShortAtPositionCondition(0x14, 3), PacketFilterConditions.IntAtPositionCondition(serial, 7) }, (bytes, info) => { IEnumerable <ContextMenuEntry> entries = ParseContextMenuEntries(bytes); ContextMenuEntry entry = entries.FirstOrDefault(e => e.Text.Trim().ToLower().Equals(entryName.Trim().ToLower())); if (entry == null) { UOC.SystemMessage(Strings.Context_menu_entry_not_found___, (int)UOC.SystemMessageHues.Yellow, true, true); return; } Engine.SendPacketToServer(new ContextMenuClick(serial, entry.Index)); are.Set(); }); Engine.AddReceiveFilter(pfi); Engine.SendPacketToServer(new ContextMenuRequest(serial)); try { bool result = are.WaitOne(timeout); return(result); } finally { Engine.RemoveReceiveFilter(pfi); } }
public static bool WaitForContext(object obj, int entry, int timeout) { int serial = AliasCommands.ResolveSerial(obj); if (serial == 0) { UOC.SystemMessage(Strings.Invalid_or_unknown_object_id); return(false); } AutoResetEvent are = new AutoResetEvent(false); PacketFilterInfo pfi = new PacketFilterInfo(0xBF, new[] { PacketFilterConditions.ShortAtPositionCondition(0x14, 3), PacketFilterConditions.IntAtPositionCondition(serial, 7) }, (bytes, info) => { Engine.SendPacketToServer(new ContextMenuClick(serial, entry)); are.Set(); }); Engine.AddReceiveFilter(pfi); Engine.SendPacketToServer(new ContextMenuRequest(serial)); try { bool result = are.WaitOne(timeout); return(result); } finally { Engine.RemoveReceiveFilter(pfi); } }
public static bool WaitForMenu(int gumpId, int timeout = 30000) { PacketFilterInfo pfi = new PacketFilterInfo(0x7C); if (gumpId != 0) { pfi = new PacketFilterInfo(0x7C, new[] { PacketFilterConditions.ShortAtPositionCondition(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 (int, bool) WaitForTargetOrFizzle(int timeout) { PacketWaitEntry targetWe = CreateWaitEntry(new PacketFilterInfo(0x6C)); PacketWaitEntry fizzWe = CreateWaitEntry(new PacketFilterInfo(0xC0, new[] { PacketFilterConditions.IntAtPositionCondition(Engine.Player.Serial, 2), PacketFilterConditions.ShortAtPositionCondition(0x3735, 10) })); PacketWaitEntry fizzMessageWe = CreateWaitEntry(new PacketFilterInfo(0xC1, new[] { PacketFilterConditions.IntAtPositionCondition(502632, 14) /* The spell fizzles. */ })); PacketWaitEntry recoveredMessageWe = CreateWaitEntry(new PacketFilterInfo(0xC1, new[] { PacketFilterConditions.IntAtPositionCondition(502644, 14) /* You have not yet recovered from casting a spell. */ })); PacketWaitEntry alreadyCastingWe = CreateWaitEntry(new PacketFilterInfo(0xC1, new[] { PacketFilterConditions.IntAtPositionCondition(502642, 14) /* You are already casting a spell. */ })); PacketWaitEntry alreadyCasting2We = CreateWaitEntry(new PacketFilterInfo(0xC1, new[] { PacketFilterConditions.IntAtPositionCondition(502645, 14) /* You are already casting a spell. */ })); PacketWaitEntry concentrationWe = CreateWaitEntry(new PacketFilterInfo(0xC1, new[] { PacketFilterConditions.IntAtPositionCondition(500641, 14) /* Your concentration is disturbed, thus ruining thy spell. */ })); PacketWaitEntry noManaWe = CreateWaitEntry(new PacketFilterInfo(0xC1, new[] { PacketFilterConditions.IntAtPositionCondition(502625, 14) /* Insufficient mana etc... */ })); PacketWaitEntry fizzChivWe = CreateWaitEntry(new PacketFilterInfo(0x54, new[] { PacketFilterConditions.ShortAtPositionCondition(0x1D6, 2), PacketFilterConditions.ShortAtPositionCondition(Engine.Player.X, 6), PacketFilterConditions.ShortAtPositionCondition(Engine.Player.Y, 8), PacketFilterConditions.ShortAtPositionCondition(Engine.Player.Z, 10) })); Engine.WaitingForTarget = true; List <Task> tasks = new List <Task>(); try { Task <bool> targetTask = Task.Run(() => { do { bool result = targetWe.Lock.WaitOne(timeout); if (!result) { return(false); } if (targetWe.Packet[6] == 0x03) { continue; } return(true); }while (true); }); Task fizzTask = Task.Factory.StartNew(() => fizzWe.Lock.WaitOne(timeout), TaskCreationOptions.LongRunning); Task fizzMessageTask = Task.Factory.StartNew(() => fizzMessageWe.Lock.WaitOne(timeout + 100), TaskCreationOptions.LongRunning); Task recoveredMessageTask = Task.Factory.StartNew(() => recoveredMessageWe.Lock.WaitOne(timeout + 100), TaskCreationOptions.LongRunning); Task alreadyCastingTask = Task.Factory.StartNew(() => alreadyCastingWe.Lock.WaitOne(timeout + 100), TaskCreationOptions.LongRunning); Task alreadyCasting2Task = Task.Factory.StartNew(() => alreadyCasting2We.Lock.WaitOne(timeout + 100), TaskCreationOptions.LongRunning); Task concentrationTask = Task.Factory.StartNew(() => concentrationWe.Lock.WaitOne(timeout + 100), TaskCreationOptions.LongRunning); Task noManaTask = Task.Factory.StartNew(() => noManaWe.Lock.WaitOne(timeout + 100), TaskCreationOptions.LongRunning); Task fizzChivTask = Task.Factory.StartNew(() => fizzChivWe.Lock.WaitOne(timeout + 100), TaskCreationOptions.LongRunning); int index; tasks.AddRange(new[] { targetTask, fizzTask, fizzMessageTask, recoveredMessageTask, alreadyCastingTask, alreadyCasting2Task, concentrationTask, noManaTask, fizzChivTask }); try { index = Task.WaitAny(tasks.ToArray()); } catch (OperationCanceledException) { return(-1, false); } catch (ThreadInterruptedException) { return(-1, false); } return(index, index == 0 && targetTask.Result); } finally { Engine.PacketWaitEntries.Remove(targetWe); Engine.PacketWaitEntries.Remove(fizzWe); Engine.PacketWaitEntries.Remove(fizzMessageWe); Engine.PacketWaitEntries.Remove(recoveredMessageWe); Engine.PacketWaitEntries.Remove(alreadyCastingWe); Engine.PacketWaitEntries.Remove(alreadyCasting2We); Engine.PacketWaitEntries.Remove(concentrationWe); Engine.PacketWaitEntries.Remove(noManaWe); Engine.PacketWaitEntries.Remove(fizzChivWe); Engine.WaitingForTarget = false; } }