public static bool WaitForProperties(object obj, int timeout) { int serial = AliasCommands.ResolveSerial(obj); if (serial == 0) { UOC.SystemMessage(Strings.Invalid_or_unknown_object_id); return(false); } PacketFilterInfo pfi = new PacketFilterInfo(0xD6, new[] { PacketFilterConditions.IntAtPositionCondition(serial, 5) }); PacketWaitEntry we = Engine.PacketWaitEntries.Add(pfi, PacketDirection.Incoming, true); Engine.SendPacketToServer(new BatchQueryProperties(serial)); try { bool result = we.Lock.WaitOne(timeout); return(result); } finally { Engine.PacketWaitEntries.Remove(we); } }
public static long Ping() { Random random = new Random(); byte value = (byte)random.Next(1, byte.MaxValue); Stopwatch sw = new Stopwatch(); sw.Start(); PacketWaitEntry we = Engine.PacketWaitEntries.Add( new PacketFilterInfo(0x73, new[] { new PacketFilterCondition(1, new[] { value }, 1) }), PacketDirection.Incoming, true); Engine.SendPacketToServer(new Ping(value)); bool result = we.Lock.WaitOne(5000); sw.Stop(); if (result) { return(sw.ElapsedMilliseconds); } return(-1); }
public static bool WaitForTarget(int timeout) { PacketFilterInfo pfi = new PacketFilterInfo(0x6C); Engine.WaitingForTarget = true; PacketWaitEntry we = Engine.PacketWaitEntries.Add(pfi, PacketDirection.Incoming); try { do { bool result = we.Lock.WaitOne(timeout); if (!result) { return(false); } if (we.Packet[6] == 0x03) { continue; } return(true); }while (true); } finally { Engine.PacketWaitEntries.Remove(we); Engine.WaitingForTarget = false; } }
public static bool WaitForContainerContentsUse(int serial, int timeout) { int pos = 19; if (Engine.ClientVersion < new Version(6, 0, 1, 7)) { pos = 18; } PacketFilterInfo pfi = new PacketFilterInfo(0x3C, new[] { PacketFilterConditions.IntAtPositionCondition(serial, pos) }); PacketWaitEntry we = Engine.PacketWaitEntries.Add(pfi, PacketDirection.Incoming, true); Engine.SendPacketToServer(new UseObject(serial)); try { bool result = we.Lock.WaitOne(timeout); return(result); } finally { Engine.PacketWaitEntries.Remove(we); } }
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 WaitForPrompt(int timeout) { PacketFilterInfo pfi = new PacketFilterInfo(0xC2); 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 bool BandageSelf() { PlayerMobile player = Engine.Player; if (player == null) { SystemMessage(Strings.Error__No_Player); return(false); } Item backpack = player.Backpack; if (backpack == null) { SystemMessage(Strings.Error__Cannot_find_player_backpack); return(false); } Item bandage = backpack.Container?.SelectEntity(i => _bandageTypes.Contains(i.ID)); if (bandage == null) { SystemMessage(Strings.Error__Cannot_find_type); return(false); } ObjectCommands.UseObject(bandage.Serial); PacketWaitEntry we = Engine.PacketWaitEntries.Add(new PacketFilterInfo(0x6C), PacketDirection.Incoming); bool result = we.Lock.WaitOne(TIMEOUT); if (!result) { SystemMessage(Strings.Target_timeout___); return(false); } byte[] packet = we.Packet; int senderSerial = (packet[2] << 24) | (packet[3] << 16) | (packet[4] << 8) | packet[5]; Engine.SendPacketToServer(new Target(senderSerial, player, true)); return(true); }
public static bool WaitForContainerContents(int serial, int timeout) { PacketFilterInfo pfi = new PacketFilterInfo(0x3C, new[] { PacketFilterConditions.IntAtPositionCondition(serial, 19) }); PacketWaitEntry we = Engine.PacketWaitEntries.Add(pfi, PacketDirection.Incoming, true); try { bool result = we.Lock.WaitOne(timeout); return(result); } finally { Engine.PacketWaitEntries.Remove(we); } }
public static bool WaitForIncomingPacket(PacketFilterInfo pfi, int timeout, Action beforeWait = null) { PacketWaitEntry we = Engine.PacketWaitEntries.Add(pfi, PacketDirection.Incoming, true); bool result; beforeWait?.Invoke(); try { result = we.Lock.WaitOne(timeout); } finally { Engine.PacketWaitEntries.Remove(we); } return(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 (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; } }