void ParcelPropertiesRequestHandler(Packet packet, Agent agent) { ParcelPropertiesRequestPacket request = (ParcelPropertiesRequestPacket)packet; // TODO: Replace with HashSet when we switch to .NET 3.5 List <int> parcels = new List <int>(); // Convert the boundaries to integers int north = (int)Math.Round(request.ParcelData.North) / 4; int east = (int)Math.Round(request.ParcelData.East) / 4; int south = (int)Math.Round(request.ParcelData.South) / 4; int west = (int)Math.Round(request.ParcelData.West) / 4; // Find all of the parcels within the given boundaries int xLen = east - west; int yLen = north - south; for (int x = 0; x < xLen; x++) { for (int y = 0; y < yLen; y++) { if (west + x < 64 && south + y < 64) { int currentParcelID = parcelOverlay[(south + y) * 64 + (west + x)]; if (!parcels.Contains(currentParcelID)) { parcels.Add(currentParcelID); } } } } ParcelResult result = ParcelResult.NoData; if (parcels.Count == 1) { result = ParcelResult.Single; } else if (parcels.Count > 1) { result = ParcelResult.Multiple; } for (int i = 0; i < parcels.Count; i++) { SendParcelProperties(parcels[i], request.ParcelData.SequenceID, request.ParcelData.SnapSelection, result, agent); } }
private void ParcelPropertiesRequestHandler(Packet packet, LLAgent agent) { ParcelPropertiesRequestPacket request = (ParcelPropertiesRequestPacket)packet; HashSet <int> parcels = new HashSet <int>(); // Convert the boundaries to integers int north = (int)Math.Round(request.ParcelData.North) / 4; int east = (int)Math.Round(request.ParcelData.East) / 4; int south = (int)Math.Round(request.ParcelData.South) / 4; int west = (int)Math.Round(request.ParcelData.West) / 4; // Find all of the parcels within the given boundaries int xLen = east - west; int yLen = north - south; for (int x = 0; x < xLen; x++) { for (int y = 0; y < yLen; y++) { if (west + x < 64 && south + y < 64) { int currentParcelID = m_parcels.GetParcelID(west + x, south + y); if (!parcels.Contains(currentParcelID)) { parcels.Add(currentParcelID); } } } } ParcelResult result = ParcelResult.NoData; if (parcels.Count == 1) { result = ParcelResult.Single; } else if (parcels.Count > 1) { result = ParcelResult.Multiple; } foreach (int parcelID in parcels) { SendParcelProperties(parcelID, request.ParcelData.SequenceID, request.ParcelData.SnapSelection, result, agent); } }
/// <summary> /// Deserialize the message /// </summary> /// <param name="map">An <see cref="OSDMap"/> containing the data</param> public void Deserialize(OSDMap map) { OSDMap parcelDataMap = (OSDMap)((OSDArray)map["ParcelData"])[0]; LocalID = parcelDataMap["LocalID"].AsInteger(); AABBMax = parcelDataMap["AABBMax"].AsVector3(); AABBMin = parcelDataMap["AABBMin"].AsVector3(); Area = parcelDataMap["Area"].AsInteger(); AuctionID = (uint)parcelDataMap["AuctionID"].AsInteger(); AuthBuyerID = parcelDataMap["AuthBuyerID"].AsUUID(); Bitmap = parcelDataMap["Bitmap"].AsBinary(); Category = (ParcelCategory)parcelDataMap["Category"].AsInteger(); ClaimDate = Utils.UnixTimeToDateTime((uint)parcelDataMap["ClaimDate"].AsInteger()); ClaimPrice = parcelDataMap["ClaimPrice"].AsInteger(); Desc = parcelDataMap["Desc"].AsString(); // LL sends this as binary, we'll convert it here if (parcelDataMap["ParcelFlags"].Type == OSDType.Binary) { byte[] bytes = parcelDataMap["ParcelFlags"].AsBinary(); if (BitConverter.IsLittleEndian) Array.Reverse(bytes); ParcelFlags = (ParcelFlags)BitConverter.ToUInt32(bytes, 0); } else { ParcelFlags = (ParcelFlags)parcelDataMap["ParcelFlags"].AsUInteger(); } GroupID = parcelDataMap["GroupID"].AsUUID(); GroupPrims = parcelDataMap["GroupPrims"].AsInteger(); IsGroupOwned = parcelDataMap["IsGroupOwned"].AsBoolean(); LandingType = (LandingType)parcelDataMap["LandingType"].AsInteger(); MaxPrims = parcelDataMap["MaxPrims"].AsInteger(); MediaID = parcelDataMap["MediaID"].AsUUID(); MediaURL = parcelDataMap["MediaURL"].AsString(); MediaAutoScale = parcelDataMap["MediaAutoScale"].AsBoolean(); // 0x1 = yes MusicURL = parcelDataMap["MusicURL"].AsString(); Name = parcelDataMap["Name"].AsString(); OtherCleanTime = parcelDataMap["OtherCleanTime"].AsInteger(); OtherCount = parcelDataMap["OtherCount"].AsInteger(); OtherPrims = parcelDataMap["OtherPrims"].AsInteger(); OwnerID = parcelDataMap["OwnerID"].AsUUID(); OwnerPrims = parcelDataMap["OwnerPrims"].AsInteger(); ParcelPrimBonus = (float)parcelDataMap["ParcelPrimBonus"].AsReal(); PassHours = (float)parcelDataMap["PassHours"].AsReal(); PassPrice = parcelDataMap["PassPrice"].AsInteger(); PublicCount = parcelDataMap["PublicCount"].AsInteger(); Privacy = parcelDataMap["Privacy"].AsBoolean(); RegionDenyAnonymous = parcelDataMap["RegionDenyAnonymous"].AsBoolean(); RegionDenyIdentified = parcelDataMap["RegionDenyIdentified"].AsBoolean(); RegionDenyTransacted = parcelDataMap["RegionDenyTransacted"].AsBoolean(); RegionPushOverride = parcelDataMap["RegionPushOverride"].AsBoolean(); RentPrice = parcelDataMap["RentPrice"].AsInteger(); RequestResult = (ParcelResult)parcelDataMap["RequestResult"].AsInteger(); SalePrice = parcelDataMap["SalePrice"].AsInteger(); SelectedPrims = parcelDataMap["SelectedPrims"].AsInteger(); SelfCount = parcelDataMap["SelfCount"].AsInteger(); SequenceID = parcelDataMap["SequenceID"].AsInteger(); SimWideMaxPrims = parcelDataMap["SimWideMaxPrims"].AsInteger(); SimWideTotalPrims = parcelDataMap["SimWideTotalPrims"].AsInteger(); SnapSelection = parcelDataMap["SnapSelection"].AsBoolean(); SnapshotID = parcelDataMap["SnapshotID"].AsUUID(); Status = (ParcelStatus)parcelDataMap["Status"].AsInteger(); TotalPrims = parcelDataMap["TotalPrims"].AsInteger(); UserLocation = parcelDataMap["UserLocation"].AsVector3(); UserLookAt = parcelDataMap["UserLookAt"].AsVector3(); if (map.ContainsKey("MediaData")) // temporary, OpenSim doesn't send this block { OSDMap mediaDataMap = (OSDMap)((OSDArray)map["MediaData"])[0]; MediaDesc = mediaDataMap["MediaDesc"].AsString(); MediaHeight = mediaDataMap["MediaHeight"].AsInteger(); MediaWidth = mediaDataMap["MediaWidth"].AsInteger(); MediaLoop = mediaDataMap["MediaLoop"].AsBoolean(); MediaType = mediaDataMap["MediaType"].AsString(); ObscureMedia = mediaDataMap["ObscureMedia"].AsBoolean(); ObscureMusic = mediaDataMap["ObscureMusic"].AsBoolean(); } OSDMap ageVerificationBlockMap = (OSDMap)((OSDArray)map["AgeVerificationBlock"])[0]; RegionDenyAgeUnverified = ageVerificationBlockMap["RegionDenyAgeUnverified"].AsBoolean(); }
/// <summary> /// Construct a new instance of the ParcelPropertiesEventArgs class /// </summary> /// <param name="simulator">The <see cref="Parcel"/> object containing the details</param> /// <param name="parcel">The <see cref="Parcel"/> object containing the details</param> /// <param name="result">The result of the request</param> /// <param name="selectedPrims">The number of primitieves your agent is /// currently selecting and or sitting on in this parcel</param> /// <param name="sequenceID">The user assigned ID used to correlate a request with /// these results</param> /// <param name="snapSelection">TODO:</param> public ParcelPropertiesEventArgs(Simulator simulator, Parcel parcel, ParcelResult result, int selectedPrims, int sequenceID, bool snapSelection) { this.m_Simulator = simulator; this.m_Parcel = parcel; this.m_Result = result; this.m_SelectedPrims = selectedPrims; this.m_SequenceID = sequenceID; this.m_SnapSelection = snapSelection; }
private void Parcels_OnParcelProperties(Simulator simulator, Parcel parcel, ParcelResult result, int selectedPrims, int sequenceID, bool snapSelection) { string pcl = parcel.Name; //this.parcel = parcel; //BeginInvoke(new MethodInvoker(UpdateLand)); }
private void Parcels_OnParcelProperties(Simulator simulator, Parcel parcel, ParcelResult result, int selectedPrims, int sequenceID, bool snapSelection) { // Check if this is for a simulator we're concerned with if (!active_sims.Contains(simulator)) { return; } // Warn about parcel property request errors and bail out if (result == ParcelResult.NoData) { Logger.Log("ParcelDownloader received a NoData response, sequenceID " + sequenceID, Helpers.LogLevel.Warning, Client); return; } // Warn about unexpected data and bail out if (!ParcelMarked.ContainsKey(simulator)) { Logger.Log("ParcelDownloader received unexpected parcel data for " + simulator, Helpers.LogLevel.Warning, Client); return; } int x, y, index, bit; int[,] markers = ParcelMarked[simulator]; // Add this parcel to the dictionary of LocalID -> Parcel mappings lock (Parcels[simulator]) if (!Parcels[simulator].ContainsKey(parcel.LocalID)) { Parcels[simulator][parcel.LocalID] = parcel; } // Request the access list for this parcel Client.Parcels.AccessListRequest(simulator, parcel.LocalID, 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(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(simulator); if (OnParcelsDownloaded != null) { // This map is complete, fire callback try { OnParcelsDownloaded(simulator, Parcels[simulator], markers); } catch (Exception e) { Logger.Log(e.Message, Helpers.LogLevel.Error, Client, e); } } } }
private void SendParcelProperties(int parcelID, int sequenceID, bool snapSelection, ParcelResult result, LLAgent agent) { SceneParcel parcel; if (m_parcels.TryGetParcel(parcelID, out parcel)) { // Owner sanity check if (parcel.OwnerID == UUID.Zero) { m_log.Warn("Assigning parcel " + parcel.Name + " to " + agent.Name); parcel.OwnerID = agent.ID; m_parcels.AddOrUpdateParcel(parcel); } // Claim date sanity check if (parcel.ClaimDate <= Utils.Epoch) { m_log.Warn("Resetting invalid parcel claim date"); parcel.ClaimDate = DateTime.UtcNow; m_parcels.AddOrUpdateParcel(parcel); } ParcelPropertiesMessage properties = new ParcelPropertiesMessage(); properties.Area = ParcelManager.GetParcelArea(parcel, out properties.AABBMin, out properties.AABBMax); properties.AuctionID = 0; // Unused properties.AuthBuyerID = parcel.AuthBuyerID; properties.Bitmap = parcel.Bitmap; properties.Category = parcel.Category; properties.ClaimDate = parcel.ClaimDate; properties.ClaimPrice = 0; // Deprecated properties.Desc = parcel.Desc; properties.GroupID = parcel.GroupID; properties.IsGroupOwned = parcel.IsGroupOwned; properties.LandingType = parcel.Landing; properties.LocalID = parcel.LocalID; properties.MaxPrims = parcel.MaxPrims; properties.MediaAutoScale = parcel.Media.MediaAutoScale; properties.MediaDesc = parcel.Media.MediaDesc; properties.MediaHeight = parcel.Media.MediaHeight; properties.MediaID = parcel.Media.MediaID; properties.MediaLoop = parcel.Media.MediaLoop; properties.MediaType = parcel.Media.MediaType; properties.MediaURL = parcel.Media.MediaURL; properties.MediaWidth = parcel.Media.MediaWidth; properties.MusicURL = parcel.Media.MediaURL; properties.Name = parcel.Name; properties.ObscureMedia = parcel.ObscureMedia; properties.ObscureMusic = parcel.ObscureMusic; properties.OtherCleanTime = parcel.AutoReturnTime; properties.OwnerID = parcel.OwnerID; properties.ParcelFlags = parcel.Flags; properties.ParcelPrimBonus = 1f; properties.PassHours = parcel.PassHours; properties.PassPrice = parcel.PassPrice; properties.RegionDenyAgeUnverified = parcel.DenyAgeUnverified; properties.RegionDenyAnonymous = parcel.DenyAnonymous; properties.RegionDenyIdentified = false; properties.RegionDenyTransacted = false; properties.RegionPushOverride = parcel.PushOverride; properties.RentPrice = 0; // Deprecated properties.RequestResult = result; properties.SalePrice = parcel.SalePrice; properties.SequenceID = sequenceID; properties.SnapSelection = snapSelection; properties.SnapshotID = parcel.SnapshotID; properties.Status = parcel.Status; properties.UserLocation = parcel.LandingLocation; properties.UserLookAt = parcel.LandingLookAt; int ownerPrims = 0; int groupPrims = 0; int otherPrims = 0; int selectedPrims = 0; lock (parcel.ParcelEntities) { foreach (ISceneEntity entity in parcel.ParcelEntities.Values) { // TODO: We don't currently track whether objects have been shared/deeded to group? if (entity.OwnerID == parcel.OwnerID) { ++ownerPrims; } else { ++otherPrims; } // TODO: We don't currently track selected prims } } properties.OwnerPrims = ownerPrims; properties.GroupPrims = groupPrims; properties.OtherPrims = otherPrims; properties.TotalPrims = ownerPrims + groupPrims + otherPrims; properties.SelectedPrims = selectedPrims; // TODO: Implement these properties.SimWideMaxPrims = 0; properties.SimWideTotalPrims = 0; // TODO: What are these? properties.SelfCount = 0; properties.PublicCount = 0; properties.OtherCount = 0; agent.EventQueue.QueueEvent("ParcelProperties", properties.Serialize()); } else { m_log.Warn("SendParcelProperties() called for unknown parcel " + parcelID); } }
public void Parcels_OnParcelProperties(Simulator simulator, Parcel parcel, ParcelResult result, int selectedPrims, int sequenceID, bool snapSelection) { lock (parcels) { if (parcels.ContainsKey(parcel.LocalID)) return; parcels[parcel.LocalID] = parcel; } simulator.Client.Parcels.RequestSelectObjects(parcel.LocalID, (ObjectReturnType)31, parcel.OwnerID); //ParcelSelectObjects(simulator, parcel.LocalID, parcel.OwnerID); //SimRegion r = SimRegion.GetRegion(simulator); //r.Parcels_OnParcelProperties(simulator, parcel, result, selectedPrims, sequenceID, snapSelection); }
private void Parcels_OnParcelProperties(Simulator simulator, Parcel parcel, ParcelResult result, int selectedPrims, int sequenceID, bool snapSelection) { // Check if this is for a simulator we're concerned with if (!active_sims.Contains(simulator)) return; // Warn about parcel property request errors and bail out if (result == ParcelResult.NoData) { Logger.Log("ParcelDownloader received a NoData response, sequenceID " + sequenceID, Helpers.LogLevel.Warning, Client); return; } // Warn about unexpected data and bail out if (!ParcelMarked.ContainsKey(simulator)) { Logger.Log("ParcelDownloader received unexpected parcel data for " + simulator, Helpers.LogLevel.Warning, Client); return; } int x, y, index, bit; int[,] markers = ParcelMarked[simulator]; // Add this parcel to the dictionary of LocalID -> Parcel mappings lock (Parcels[simulator]) if (!Parcels[simulator].ContainsKey(parcel.LocalID)) Parcels[simulator][parcel.LocalID] = parcel; // Request the access list for this parcel Client.Parcels.AccessListRequest(simulator, parcel.LocalID, 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(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(simulator); if (OnParcelsDownloaded != null) { // This map is complete, fire callback try { OnParcelsDownloaded(simulator, Parcels[simulator], markers); } catch (Exception e) { Logger.Log(e.Message, Helpers.LogLevel.Error, Client, e); } } } }
private void SendParcelProperties(int parcelID, int sequenceID, bool snapSelection, ParcelResult result, LLAgent agent) { SceneParcel parcel; if (m_parcels.TryGetParcel(parcelID, out parcel)) { // Owner sanity check if (parcel.OwnerID == UUID.Zero) { m_log.Warn("Assigning parcel " + parcel.Name + " to " + agent.Name); parcel.OwnerID = agent.ID; m_parcels.AddOrUpdateParcel(parcel); } // Claim date sanity check if (parcel.ClaimDate <= Utils.Epoch) { m_log.Warn("Resetting invalid parcel claim date"); parcel.ClaimDate = DateTime.UtcNow; m_parcels.AddOrUpdateParcel(parcel); } ParcelPropertiesMessage properties = new ParcelPropertiesMessage(); properties.Area = ParcelManager.GetParcelArea(parcel, out properties.AABBMin, out properties.AABBMax); properties.AuctionID = 0; // Unused properties.AuthBuyerID = parcel.AuthBuyerID; properties.Bitmap = parcel.Bitmap; properties.Category = parcel.Category; properties.ClaimDate = parcel.ClaimDate; properties.ClaimPrice = 0; // Deprecated properties.Desc = parcel.Desc; properties.GroupID = parcel.GroupID; properties.IsGroupOwned = parcel.IsGroupOwned; properties.LandingType = parcel.Landing; properties.LocalID = parcel.LocalID; properties.MaxPrims = parcel.MaxPrims; properties.MediaAutoScale = parcel.Media.MediaAutoScale; properties.MediaDesc = parcel.Media.MediaDesc; properties.MediaHeight = parcel.Media.MediaHeight; properties.MediaID = parcel.Media.MediaID; properties.MediaLoop = parcel.Media.MediaLoop; properties.MediaType = parcel.Media.MediaType; properties.MediaURL = parcel.Media.MediaURL; properties.MediaWidth = parcel.Media.MediaWidth; properties.MusicURL = parcel.Media.MediaURL; properties.Name = parcel.Name; properties.ObscureMedia = parcel.ObscureMedia; properties.ObscureMusic = parcel.ObscureMusic; properties.OtherCleanTime = parcel.AutoReturnTime; properties.OwnerID = parcel.OwnerID; properties.ParcelFlags = parcel.Flags; properties.ParcelPrimBonus = 1f; properties.PassHours = parcel.PassHours; properties.PassPrice = parcel.PassPrice; properties.RegionDenyAgeUnverified = parcel.DenyAgeUnverified; properties.RegionDenyAnonymous = parcel.DenyAnonymous; properties.RegionDenyIdentified = false; properties.RegionDenyTransacted = false; properties.RegionPushOverride = parcel.PushOverride; properties.RentPrice = 0; // Deprecated properties.RequestResult = result; properties.SalePrice = parcel.SalePrice; properties.SequenceID = sequenceID; properties.SnapSelection = snapSelection; properties.SnapshotID = parcel.SnapshotID; properties.Status = parcel.Status; properties.UserLocation = parcel.LandingLocation; properties.UserLookAt = parcel.LandingLookAt; int ownerPrims = 0; int groupPrims = 0; int otherPrims = 0; int selectedPrims = 0; lock (parcel.ParcelEntities) { foreach (ISceneEntity entity in parcel.ParcelEntities.Values) { // TODO: We don't currently track whether objects have been shared/deeded to group? if (entity.OwnerID == parcel.OwnerID) ++ownerPrims; else ++otherPrims; // TODO: We don't currently track selected prims } } properties.OwnerPrims = ownerPrims; properties.GroupPrims = groupPrims; properties.OtherPrims = otherPrims; properties.TotalPrims = ownerPrims + groupPrims + otherPrims; properties.SelectedPrims = selectedPrims; // TODO: Implement these properties.SimWideMaxPrims = 0; properties.SimWideTotalPrims = 0; // TODO: What are these? properties.SelfCount = 0; properties.PublicCount = 0; properties.OtherCount = 0; agent.EventQueue.QueueEvent("ParcelProperties", properties.Serialize()); } else { m_log.Warn("SendParcelProperties() called for unknown parcel " + parcelID); } }
void SendParcelProperties(int parcelID, int sequenceID, bool snapSelection, ParcelResult result, Agent agent) { Parcel parcel; if (parcels.TryGetValue(parcelID, out parcel)) { ParcelPropertiesPacket properties = new ParcelPropertiesPacket(); properties.AgeVerificationBlock.RegionDenyAgeUnverified = false; properties.ParcelData.AABBMax = parcel.AABBMax; properties.ParcelData.AABBMin = parcel.AABBMin; properties.ParcelData.Area = parcel.Area; properties.ParcelData.AuctionID = parcel.AuctionID; properties.ParcelData.AuthBuyerID = parcel.AuthBuyerID; properties.ParcelData.Bitmap = parcel.Bitmap; properties.ParcelData.Category = (byte)parcel.Category; properties.ParcelData.ClaimDate = (int)Utils.DateTimeToUnixTime(parcel.ClaimDate); properties.ParcelData.ClaimPrice = parcel.ClaimPrice; properties.ParcelData.Desc = Utils.StringToBytes(parcel.Desc); properties.ParcelData.GroupID = parcel.GroupID; properties.ParcelData.GroupPrims = parcel.GroupPrims; properties.ParcelData.IsGroupOwned = parcel.IsGroupOwned; properties.ParcelData.LandingType = (byte)parcel.Landing; properties.ParcelData.LocalID = parcel.LocalID; properties.ParcelData.MaxPrims = parcel.MaxPrims; properties.ParcelData.MediaAutoScale = parcel.Media.MediaAutoScale; properties.ParcelData.MediaID = parcel.Media.MediaID; properties.ParcelData.MediaURL = Utils.StringToBytes(parcel.Media.MediaURL); properties.ParcelData.MusicURL = Utils.StringToBytes(parcel.MusicURL); properties.ParcelData.Name = Utils.StringToBytes(parcel.Name); properties.ParcelData.OtherCleanTime = parcel.OtherCleanTime; properties.ParcelData.OtherCount = parcel.OtherCount; properties.ParcelData.OtherPrims = parcel.OtherPrims; properties.ParcelData.OwnerID = parcel.OwnerID; properties.ParcelData.OwnerPrims = parcel.OwnerPrims; properties.ParcelData.ParcelFlags = (uint)parcel.Flags; properties.ParcelData.ParcelPrimBonus = parcel.ParcelPrimBonus; properties.ParcelData.PassHours = parcel.PassHours; properties.ParcelData.PassPrice = parcel.PassPrice; properties.ParcelData.PublicCount = parcel.PublicCount; properties.ParcelData.RegionDenyAnonymous = parcel.RegionDenyAnonymous; properties.ParcelData.RegionDenyIdentified = false; // Deprecated properties.ParcelData.RegionDenyTransacted = false; // Deprecated properties.ParcelData.RegionPushOverride = parcel.RegionPushOverride; properties.ParcelData.RentPrice = parcel.RentPrice; properties.ParcelData.RequestResult = (int)result; properties.ParcelData.SalePrice = parcel.SalePrice; properties.ParcelData.SelectedPrims = 0; // TODO: properties.ParcelData.SelfCount = parcel.SelfCount; properties.ParcelData.SequenceID = sequenceID; properties.ParcelData.SimWideMaxPrims = parcel.SimWideMaxPrims; properties.ParcelData.SimWideTotalPrims = parcel.SimWideTotalPrims; properties.ParcelData.SnapSelection = snapSelection; properties.ParcelData.SnapshotID = parcel.SnapshotID; properties.ParcelData.Status = (byte)parcel.Status; properties.ParcelData.TotalPrims = parcel.TotalPrims; properties.ParcelData.UserLocation = parcel.UserLocation; properties.ParcelData.UserLookAt = parcel.UserLookAt; // HACK: Make everyone think they are the owner of this parcel properties.ParcelData.OwnerID = agent.AgentID; server.UDP.SendPacket(agent.AgentID, properties, PacketCategory.Transaction); } else { Logger.Log("SendParcelProperties() called for unknown parcel " + parcelID, Helpers.LogLevel.Warning); } }