diff --git a/OpenMetaverse/ParcelManager.cs b/OpenMetaverse/ParcelManager.cs index b3173b85..f023e98b 100644 --- a/OpenMetaverse/ParcelManager.cs +++ b/OpenMetaverse/ParcelManager.cs @@ -682,6 +682,8 @@ namespace OpenMetaverse public int Count; /// true of OwnerID is currently online and is not a group public bool OnlineStatus; + /// The date of the most recent prim left by OwnerID + public DateTime NewestPrim; } @@ -802,13 +804,11 @@ namespace OpenMetaverse Client = client; // Setup the callbacks Client.Network.RegisterCallback(PacketType.ParcelInfoReply, new NetworkManager.PacketCallback(ParcelInfoReplyHandler)); - // UDP packet handler - Client.Network.RegisterCallback(PacketType.ParcelProperties, new NetworkManager.PacketCallback(ParcelPropertiesHandler)); + Client.Network.RegisterEventCallback("ParcelObjectOwnersReply", new Caps.EventQueueCallback(ParcelObjectOwnersReplyHandler)); // CAPS packet handler, to allow for Media Data not contained in the message template Client.Network.RegisterEventCallback("ParcelProperties", new Caps.EventQueueCallback(ParcelPropertiesReplyHandler)); Client.Network.RegisterCallback(PacketType.ParcelDwellReply, new NetworkManager.PacketCallback(ParcelDwellReplyHandler)); Client.Network.RegisterCallback(PacketType.ParcelAccessListReply, new NetworkManager.PacketCallback(ParcelAccessListReplyHandler)); - Client.Network.RegisterCallback(PacketType.ParcelObjectOwnersReply, new NetworkManager.PacketCallback(ParcelObjectOwnersReplyHandler)); Client.Network.RegisterCallback(PacketType.ForceObjectSelect, new NetworkManager.PacketCallback(SelectParcelObjectsReplyHandler)); Client.Network.RegisterCallback(PacketType.ParcelMediaUpdate, new NetworkManager.PacketCallback(ParcelMediaUpdateHandler)); Client.Network.RegisterCallback(PacketType.ParcelOverlay, new NetworkManager.PacketCallback(ParcelOverlayHandler)); @@ -1547,118 +1547,6 @@ namespace OpenMetaverse } } - /// - /// Parcel Properties reply handler for data that comes in over udp (deprecated) - /// - /// - /// - private void ParcelPropertiesHandler(Packet packet, Simulator simulator) - { - if (OnParcelProperties != null || Client.Settings.PARCEL_TRACKING == true) - { - ParcelPropertiesPacket properties = (ParcelPropertiesPacket)packet; - - Parcel parcel = new Parcel(properties.ParcelData.LocalID); - - parcel.AABBMax = properties.ParcelData.AABBMax; - parcel.AABBMin = properties.ParcelData.AABBMin; - parcel.Area = properties.ParcelData.Area; - parcel.AuctionID = properties.ParcelData.AuctionID; - parcel.AuthBuyerID = properties.ParcelData.AuthBuyerID; - parcel.Bitmap = Utils.CopyBytes(properties.ParcelData.Bitmap); - parcel.Category = (Parcel.ParcelCategory)(sbyte)properties.ParcelData.Category; - parcel.ClaimDate = Utils.UnixTimeToDateTime((uint)properties.ParcelData.ClaimDate); - // ClaimPrice seems to always be zero? - parcel.ClaimPrice = properties.ParcelData.ClaimPrice; - parcel.Desc = Utils.BytesToString(properties.ParcelData.Desc); - parcel.GroupID = properties.ParcelData.GroupID; - parcel.GroupPrims = properties.ParcelData.GroupPrims; - parcel.IsGroupOwned = properties.ParcelData.IsGroupOwned; - parcel.Landing = (Parcel.LandingType)properties.ParcelData.LandingType; - parcel.MaxPrims = properties.ParcelData.MaxPrims; - parcel.Media.MediaAutoScale = properties.ParcelData.MediaAutoScale; - parcel.Media.MediaID = properties.ParcelData.MediaID; - parcel.Media.MediaURL = Utils.BytesToString(properties.ParcelData.MediaURL); - parcel.MusicURL = Utils.BytesToString(properties.ParcelData.MusicURL); - parcel.Name = Utils.BytesToString(properties.ParcelData.Name); - parcel.OtherCleanTime = properties.ParcelData.OtherCleanTime; - parcel.OtherCount = properties.ParcelData.OtherCount; - parcel.OtherPrims = properties.ParcelData.OtherPrims; - parcel.OwnerID = properties.ParcelData.OwnerID; - parcel.OwnerPrims = properties.ParcelData.OwnerPrims; - parcel.Flags = (Parcel.ParcelFlags)properties.ParcelData.ParcelFlags; - parcel.ParcelPrimBonus = properties.ParcelData.ParcelPrimBonus; - parcel.PassHours = properties.ParcelData.PassHours; - parcel.PassPrice = properties.ParcelData.PassPrice; - parcel.PublicCount = properties.ParcelData.PublicCount; - parcel.RegionDenyAnonymous = properties.ParcelData.RegionDenyAnonymous; - parcel.RegionPushOverride = properties.ParcelData.RegionPushOverride; - parcel.RentPrice = properties.ParcelData.RentPrice; - parcel.SalePrice = properties.ParcelData.SalePrice; - int selectedPrims = properties.ParcelData.SelectedPrims; - parcel.SelfCount = properties.ParcelData.SelfCount; - parcel.SimWideMaxPrims = properties.ParcelData.SimWideMaxPrims; - parcel.SimWideTotalPrims = properties.ParcelData.SimWideTotalPrims; - parcel.SnapshotID = properties.ParcelData.SnapshotID; - parcel.Status = (Parcel.ParcelStatus)(sbyte)properties.ParcelData.Status; - parcel.TotalPrims = properties.ParcelData.TotalPrims; - parcel.UserLocation = properties.ParcelData.UserLocation; - parcel.UserLookAt = properties.ParcelData.UserLookAt; - parcel.RegionDenyAgeUnverified = properties.AgeVerificationBlock.RegionDenyAgeUnverified; - - // store parcel in dictionary - if (Client.Settings.PARCEL_TRACKING) - { - lock (simulator.Parcels.Dictionary) - simulator.Parcels.Dictionary[parcel.LocalID] = parcel; - - int y, x, index, bit; - for (y = 0; y < simulator.ParcelMap.GetLength(0); y++) - { - for (x = 0; x < simulator.ParcelMap.GetLength(1); x++) - { - if (simulator.ParcelMap[y, x] == 0) - { - index = (y * 64) + x; - bit = index % 8; - index >>= 3; - - if ((parcel.Bitmap[index] & (1 << bit)) != 0) - simulator.ParcelMap[y, x] = parcel.LocalID; - } - } - } - } - - // auto request acl, will be stored in parcel tracking dictionary if enabled - if (Client.Settings.ALWAYS_REQUEST_PARCEL_ACL) - Client.Parcels.AccessListRequest(simulator, properties.ParcelData.LocalID, - AccessList.Both, properties.ParcelData.SequenceID); - - // auto request dwell, will be stored in parcel tracking dictionary if enables - if (Client.Settings.ALWAYS_REQUEST_PARCEL_DWELL) - Client.Parcels.DwellRequest(simulator, properties.ParcelData.LocalID); - - // Fire the callback for parcel properties being received - if (OnParcelProperties != null) - { - try - { - OnParcelProperties(simulator, parcel, (ParcelResult)properties.ParcelData.RequestResult, - selectedPrims, properties.ParcelData.SequenceID, properties.ParcelData.SnapSelection); - } - catch (Exception e) { Logger.Log(e.Message, Helpers.LogLevel.Error, Client, e); } - } - - // Check if all of the simulator parcels have been retrieved, if so fire another callback - if (OnSimParcelsDownloaded != null && simulator.IsParcelMapFull()) - { - try { OnSimParcelsDownloaded(simulator, simulator.Parcels, simulator.ParcelMap); } - catch (Exception e) { Logger.Log(e.Message, Helpers.LogLevel.Error, Client, e); } - } - } - } - /// /// /// @@ -1703,29 +1591,61 @@ namespace OpenMetaverse } } - private void ParcelObjectOwnersReplyHandler(Packet packet, Simulator simulator) + /// + /// + /// + /// + /// + /// + private void ParcelObjectOwnersReplyHandler(string capsKey, LLSD llsd, Simulator simulator) { if (OnPrimOwnersListReply != null) { - ParcelObjectOwnersReplyPacket reply = (ParcelObjectOwnersReplyPacket)packet; + + LLSDMap map = (LLSDMap)llsd; List primOwners = new List(); - for (int i = 0; i < reply.Data.Length; i++) + if (map.ContainsKey("Data")) + { + LLSDArray dataBlock = (LLSDArray)map["Data"]; + LLSDArray dataExtendedBlock = (LLSDArray)map["DataExtended"]; + + for (int i = 0; i < dataBlock.Count; i++) + { + ParcelPrimOwners poe = new ParcelPrimOwners(); + poe.OwnerID = ((LLSDMap)dataBlock[i])["OwnerID"].AsUUID(); + poe.Count = ((LLSDMap)dataBlock[i])["Count"].AsInteger(); + poe.IsGroupOwned = ((LLSDMap)dataBlock[i])["IsGroupOwned"].AsBoolean(); + poe.OnlineStatus = ((LLSDMap)dataBlock[i])["OnlineStatus"].AsBoolean(); + if (((LLSDMap)dataExtendedBlock[i]).ContainsKey("TimeStamp")) + { + byte[] bytes = (((LLSDMap)dataExtendedBlock[i])["TimeStamp"].AsBinary()); + + if (BitConverter.IsLittleEndian) + Array.Reverse(bytes); + + uint value = Helpers.BytesToUInt(bytes); + + poe.NewestPrim = Utils.UnixTimeToDateTime(value); + } + + primOwners.Add(poe); + } + } + + if (OnPrimOwnersListReply != null) { - ParcelPrimOwners poe = new ParcelPrimOwners(); - - poe.OwnerID = reply.Data[i].OwnerID; - poe.IsGroupOwned = reply.Data[i].IsGroupOwned; - poe.Count = reply.Data[i].Count; - poe.OnlineStatus = reply.Data[i].OnlineStatus; - primOwners.Add(poe); + try { OnPrimOwnersListReply(simulator, primOwners); } + catch (Exception e) { Logger.Log(e.Message, Helpers.LogLevel.Error, Client, e); } } - try { OnPrimOwnersListReply(simulator, primOwners); } - catch (Exception e) { Logger.Log(e.Message, Helpers.LogLevel.Error, Client, e); } } - } + /// + /// + /// + /// + /// private void SelectParcelObjectsReplyHandler(Packet packet, Simulator simulator) { ForceObjectSelectPacket reply = (ForceObjectSelectPacket)packet;