public override void OnPositionChanging(Point3D oldPos) { if (!IsGhost) { StealthSteps.OnMove(); } AutoOpenDoors(false); List <Mobile> mlist = new List <Mobile>(World.Mobiles.Values); for (int i = 0; i < mlist.Count; i++) { Mobile m = mlist[i]; if (m != this) { if (!Utility.InRange(m.Position, Position, VisRange)) { m.Remove(); } else { Targeting.CheckLastTargetRange(m); } } } mlist = null; List <Item> ilist = new List <Item>(World.Items.Values); ScavengerAgent s = ScavengerAgent.Instance; for (int i = 0; i < ilist.Count; i++) { Item item = ilist[i]; if (item.Deleted || item.Container != null) { continue; } int dist = Utility.Distance(item.GetWorldPosition(), Position); if (item != DragDropManager.Holding && (dist > MultiVisRange || (!item.IsMulti && dist > VisRange))) { item.Remove(); } else if (!IsGhost && Visible && dist <= 2 && s.Enabled && item.Movable) { s.Scavenge(item); } } ilist = null; if (Engine.MainWindow != null && Engine.MainWindow.MapWindow != null) { Engine.MainWindow.SafeAction(f => f.MapWindow.PlayerMoved()); } base.OnPositionChanging(oldPos); }
public static ProcStatus ProcessNext(int numPending) { if (m_Pending != Serial.Zero) { if (m_Lifted + TimeSpan.FromMinutes(2) < DateTime.UtcNow) { Item i = World.FindItem(m_Pending); Log("Lift timeout, forced drop to pack for {0}", m_Pending); if (World.Player != null) { World.Player.SendMessage(MsgLevel.Force, LocString.ForceEndHolding); if (World.Player.Backpack != null) { Client.Instance.SendToServer(new DropRequest(m_Pending, Point3D.MinusOne, World.Player.Backpack.Serial)); } else { Client.Instance.SendToServer(new DropRequest(m_Pending, World.Player.Position, Serial.Zero)); } } m_Holding = m_Pending = Serial.Zero; m_HoldingItem = null; m_Lifted = DateTime.MinValue; } else { return(ProcStatus.KeepWaiting); } } if (m_Front == m_Back) { m_Front = m_Back = 0; return(ProcStatus.Nothing); } LiftReq lr = m_LiftReqs[m_Front]; if (numPending > 0 && lr != null && lr.DoLast) { return(ProcStatus.ReQueue); } m_LiftReqs[m_Front] = null; m_Front++; if (lr != null) { Log("Lifting {0}", lr); Item item = World.FindItem(lr.Serial); if (item != null && item.Container == null) { // if the item is on the ground and out of range then dont grab it if (Utility.Distance(item.GetWorldPosition(), World.Player.Position) > 3) { Log("Item is too far away... uncaching."); ScavengerAgent.Instance.Uncache(item.Serial); return(ProcStatus.Nothing); } } Client.Instance.SendToServer(new LiftRequest(lr.Serial, lr.Amount)); m_LastID = lr.Id; m_Holding = lr.Serial; m_HoldingItem = World.FindItem(lr.Serial); m_ClientLiftReq = lr.FromClient; DropReq dr = DequeueDropFor(lr.Serial); if (dr != null) { m_Pending = Serial.Zero; m_Lifted = DateTime.MinValue; Log("Dropping {0} to {1}", lr, dr.Serial); if (dr.Serial.IsMobile && dr.Layer > Layer.Invalid && dr.Layer <= Layer.LastUserValid) { Client.Instance.SendToServer(new EquipRequest(lr.Serial, dr.Serial, dr.Layer)); } else { Client.Instance.SendToServer(new DropRequest(lr.Serial, dr.Point, dr.Serial)); } } else { m_Pending = lr.Serial; m_Lifted = DateTime.UtcNow; } return(ProcStatus.Success); } else { Log("No lift to be done?!"); return(ProcStatus.Nothing); } }
private static void MobileIncoming(PacketReader p) { Serial serial = p.ReadUInt32(); ushort body = p.ReadUInt16(); Point3D position = new Point3D(p.ReadUInt16(), p.ReadUInt16(), p.ReadSByte()); if (Utility.Distance(World.Player.Position, position) > 18) { return; } Mobile m = World.FindMobile(serial); if (m == null) { World.AddMobile(m = new Mobile(serial)); } bool wasHidden = !m.Visible; m.Body = body; m.Position = position; m.Direction = (Direction)p.ReadByte(); m.Hue = p.ReadUInt16(); bool wasPoisoned = m.Poisoned; m.ProcessPacketFlags(p.ReadByte()); byte oldNoto = m.Notoriety; m.Notoriety = p.ReadByte(); while (true) { serial = p.ReadUInt32(); if (!serial.IsItem) { break; } Item item = World.FindItem(serial); if (item == null) { World.AddItem(item = new Item(serial)); } if (World.Player.Holding == item) { World.Player.Holding = null; } ushort id = p.ReadUInt16(); item.ItemID = (ushort)(id & 0x3FFF); item.Layer = p.ReadByte(); if ((id & 0x8000) != 0) { item.Hue = p.ReadUInt16(); } else { item.Hue = 0; } item.Container = m; } Item.UpdateContainers(); }