public void Parcels_OnParcelProperties(Parcel parcel, ParcelManager.ParcelResult result, int sequenceID, bool snapSelection) { if (result == ParcelManager.ParcelResult.NoData) { Hashtable message = new Hashtable(); message.Add("MessageType", "ParcelPropertiesFailed"); message.Add("LocalID", parcel.LocalID); message.Add("SequenceID", sequenceID); enqueue(message); } else { Hashtable message = new Hashtable(); message.Add("MessageType", "ParcelProperties"); message.Add("SequenceID", sequenceID); message.Add("LocalID", parcel.LocalID); message.Add("AABBMax", parcel.AABBMax); message.Add("AABBMin", parcel.AABBMin); message.Add("AccessList", parcel.AccessList); message.Add("Area", parcel.Area); message.Add("AuctionID", parcel.AuctionID); message.Add("AuthBuyerID", parcel.AuthBuyerID); message.Add("Category", parcel.Category); message.Add("ClaimDate", parcel.ClaimDate); message.Add("ClaimPrice", parcel.ClaimPrice); message.Add("Desc", parcel.Desc); message.Add("Dwell", parcel.Dwell); message.Add("Flags", (uint)parcel.Flags); message.Add("GroupID", parcel.GroupID); message.Add("GroupPrims", parcel.GroupPrims); message.Add("IsGroupOwned", parcel.IsGroupOwned); message.Add("LandingType", parcel.LandingType); message.Add("MaxPrims", parcel.MaxPrims); message.Add("MediaAutoScale", parcel.MediaAutoScale); message.Add("MediaDesc", parcel.MediaDesc); message.Add("MediaHeight", parcel.MediaHeight); message.Add("MediaID", parcel.MediaID); message.Add("MediaLoop", parcel.MediaLoop); message.Add("MediaType", parcel.MediaType); message.Add("MediaURL", parcel.MediaURL); message.Add("MediaWidth", parcel.MediaWidth); message.Add("MusicURL", parcel.MusicURL); message.Add("Name", parcel.Name); message.Add("ObscureMedia", parcel.ObscureMedia); message.Add("ObscureMusic", parcel.ObscureMusic); message.Add("OtherCleanTime", parcel.OtherCleanTime); message.Add("OtherPrims", parcel.OtherPrims); message.Add("OwnerPrims", parcel.OwnerPrims); message.Add("OwnerID", parcel.OwnerID); message.Add("PrimBonus", parcel.ParcelPrimBonus); message.Add("PassHours", parcel.PassHours); message.Add("PassPrice", parcel.PassPrice); message.Add("PublicCount", parcel.PublicCount); message.Add("RegionDenyAgeUnverified", parcel.RegionDenyAgeUnverified); message.Add("RegionDenyAnonymous", parcel.RegionDenyAnonymous); message.Add("RegionPushOverride", parcel.RegionPushOverride); message.Add("RentPrice", parcel.RentPrice); message.Add("SalePrice", parcel.SalePrice); message.Add("SelectedPrims", parcel.SelectedPrims); message.Add("SelfCount", parcel.SelfCount); message.Add("SimWideMaxPrims", parcel.SimWideMaxPrims); message.Add("SimWideTotalPrims", parcel.SimWideTotalPrims); message.Add("SnapshotID", parcel.SnapshotID); message.Add("Status", parcel.Status); message.Add("TotalPrims", parcel.TotalPrims); message.Add("UserLocation", parcel.UserLocation); message.Add("UserLookAt", parcel.UserLookAt); enqueue(message); } }
private void Parcels_OnParcelProperties(Parcel parcel, ParcelManager.ParcelResult result, int sequenceID, bool snapSelection) { // Check if this is for a simulator we're concerned with if (!active_sims.Contains(parcel.Simulator)) return; // Warn about parcel property request errors and bail out if (result == ParcelManager.ParcelResult.NoData) { Client.Log("ParcelDownloader received a NoData response, sequenceID " + sequenceID, Helpers.LogLevel.Warning); return; } // Warn about unexpected data and bail out if (!ParcelMarked.ContainsKey(parcel.Simulator)) { Client.Log("ParcelDownloader received unexpected parcel data for " + parcel.Simulator, Helpers.LogLevel.Warning); return; } int x, y, index, bit; int[,] markers = ParcelMarked[parcel.Simulator]; // Add this parcel to the dictionary of LocalID -> Parcel mappings lock (Parcels[parcel.Simulator]) if (!Parcels[parcel.Simulator].ContainsKey(parcel.LocalID)) Parcels[parcel.Simulator][parcel.LocalID] = parcel; // Request the access list for this parcel Client.Parcels.AccessListRequest(parcel.Simulator, parcel.LocalID, ParcelManager.AccessList.Both, 0); // Mark this area as downloaded for (y = 0; y < 64; y++) { for (x = 0; x < 64; x++) { if (markers[y, x] == 0) { index = (y * 64) + x; bit = index % 8; index >>= 3; if ((parcel.Bitmap[index] & (1 << bit)) != 0) markers[y, x] = parcel.LocalID; } } } // Request parcel information for the next missing area for (y = 0; y < 64; y++) { for (x = 0; x < 64; x++) { if (markers[y, x] == 0) { Client.Parcels.PropertiesRequest(parcel.Simulator, (y + 1) * 4.0f, (x + 1) * 4.0f, y * 4.0f, x * 4.0f, 0, false); return; } } } // If we get here, there are no more zeroes in the markers map lock (active_sims) { active_sims.Remove(parcel.Simulator); if (OnParcelsDownloaded != null) { // This map is complete, fire callback try { OnParcelsDownloaded(parcel.Simulator, Parcels[parcel.Simulator], markers); } catch (Exception e) { Client.Log(e.ToString(), Helpers.LogLevel.Error); } } } }