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> /// /// </summary> public void FillParcels() { // Begins filling parcels ParcelDownloading = true; ParcelPropertiesRequestPacket tPacket = new ParcelPropertiesRequestPacket(); tPacket.AgentData.AgentID = Client.Self.ID; tPacket.AgentData.SessionID = Client.Network.SessionID; tPacket.ParcelData.SequenceID = -10000; tPacket.ParcelData.West = 0.0f; tPacket.ParcelData.South = 0.0f; tPacket.ParcelData.East = 0.0f; tPacket.ParcelData.North = 0.0f; Client.Network.SendPacket((Packet)tPacket); }
/// <summary> /// Request properties of parcels using a bounding box selection /// </summary> /// <param name="simulator">Simulator containing the parcel</param> /// <param name="north">Northern boundary of the parcel selection</param> /// <param name="east">Eastern boundary of the parcel selection</param> /// <param name="south">Southern boundary of the parcel selection</param> /// <param name="west">Western boundary of the parcel selection</param> /// <param name="sequenceID">An arbitrary integer that will be returned /// with the ParcelProperties reply, useful for distinguishing between /// different types of parcel property requests</param> /// <param name="snapSelection">A boolean that is returned with the /// ParcelProperties reply, useful for snapping focus to a single /// parcel</param> public void RequestParcelProperties(Simulator simulator, float north, float east, float south, float west, int sequenceID, bool snapSelection) { ParcelPropertiesRequestPacket request = new ParcelPropertiesRequestPacket(); request.AgentData.AgentID = Client.Self.AgentID; request.AgentData.SessionID = Client.Self.SessionID; request.ParcelData.North = north; request.ParcelData.East = east; request.ParcelData.South = south; request.ParcelData.West = west; request.ParcelData.SequenceID = sequenceID; request.ParcelData.SnapSelection = snapSelection; Client.Network.SendPacket(request, simulator); }
private void ParcelPropertiesHandler(Packet packet, Simulator simulator) { ParcelPropertiesPacket properties = (ParcelPropertiesPacket)packet; byte[] Bitmap = properties.ParcelData.Bitmap; int LocalID = properties.ParcelData.LocalID; // Mark this area as downloaded int x, y, index, subindex; byte val; for (x = 0; x < 64; x++) { for (y = 0; y < 64; y++) { if (simulator.Region.ParcelMarked[y, x] == 0) { index = ((x * 64) + y); subindex = index % 8; index /= 8; val = Bitmap[index]; simulator.Region.ParcelMarked[y, x] = ((val >> subindex) & 1) == 1 ? LocalID : 0; } } } // Fire off the next request, if we are downloading the whole sim bool hasTriggered = false; if (simulator.Region.ParcelDownloading) { for (x = 0; x < 64; x++) { for (y = 0; y < 64; y++) { if (simulator.Region.ParcelMarked[x, y] == 0) { ParcelPropertiesRequestPacket tPacket = new ParcelPropertiesRequestPacket(); tPacket.AgentData.AgentID = Client.Network.AgentID; tPacket.AgentData.SessionID = Client.Network.SessionID; tPacket.ParcelData.SequenceID = -10000; tPacket.ParcelData.West = (x * 4.0f); tPacket.ParcelData.South = (y * 4.0f); tPacket.ParcelData.East = (x * 4.0f) + 4.0f; tPacket.ParcelData.North = (y * 4.0f) + 4.0f; Client.Network.SendPacket(tPacket, simulator); hasTriggered = true; goto exit; } } } exit: ; } // This map is complete, fire callback if (!hasTriggered) { simulator.Region.FilledParcels(); } Parcel parcel = null; lock (simulator.Region.Parcels) { if (!simulator.Region.Parcels.ContainsKey(LocalID)) { simulator.Region.Parcels[LocalID] = new Parcel(simulator); } parcel = simulator.Region.Parcels[LocalID]; } // Save this parcels data // TODO: Lots of values are not being stored, Parcel needs to be expanded to take all the data. // August2006: God help me should I have to type this out again... argh. // October2006: I really shouldnt have typed that. parcel.RequestResult = properties.ParcelData.RequestResult; parcel.SequenceID = properties.ParcelData.SequenceID; parcel.SnapSelection = properties.ParcelData.SnapSelection; parcel.SelfCount = properties.ParcelData.SelfCount; parcel.OtherCount = properties.ParcelData.OtherCount; parcel.PublicCount = properties.ParcelData.PublicCount; parcel.LocalID = LocalID; parcel.OwnerID = properties.ParcelData.OwnerID; parcel.IsGroupOwned = properties.ParcelData.IsGroupOwned; parcel.AuctionID = properties.ParcelData.AuctionID; // parcel.ReservedNewbie = properties.ParcelData.ReservedNewbie; // FIXME FIXME FIXME parcel.ClaimDate = properties.ParcelData.ClaimDate; parcel.ClaimPrice = properties.ParcelData.ClaimPrice; parcel.RentPrice = properties.ParcelData.RentPrice; parcel.AABBMin = properties.ParcelData.AABBMin; parcel.AABBMax = properties.ParcelData.AABBMax; parcel.Bitmap = properties.ParcelData.Bitmap; parcel.Area = properties.ParcelData.Area; parcel.Status = properties.ParcelData.Status; parcel.SimWideMaxObjects = properties.ParcelData.SimWideMaxPrims; parcel.SimWideTotalObjects = properties.ParcelData.SimWideTotalPrims; parcel.MaxObjects = properties.ParcelData.MaxPrims; parcel.TotalObjects = properties.ParcelData.TotalPrims; parcel.OwnerObjects = properties.ParcelData.OwnerPrims; parcel.GroupObjects = properties.ParcelData.GroupPrims; parcel.OtherObjects = properties.ParcelData.OtherPrims; parcel.ParcelObjectBonus = properties.ParcelData.ParcelPrimBonus; parcel.OtherCleanTime = properties.ParcelData.OtherCleanTime; parcel.ParcelFlags = properties.ParcelData.ParcelFlags; parcel.SalePrice = properties.ParcelData.SalePrice; parcel.Name = Helpers.FieldToString(properties.ParcelData.Name); parcel.Desc = Helpers.FieldToString(properties.ParcelData.Desc); parcel.MusicURL = Helpers.FieldToString(properties.ParcelData.MusicURL); parcel.MediaURL = Helpers.FieldToString(properties.ParcelData.MediaURL); parcel.MediaID = properties.ParcelData.MediaID; parcel.MediaAutoScale = properties.ParcelData.MediaAutoScale; parcel.GroupID = properties.ParcelData.GroupID; parcel.PassPrice = properties.ParcelData.PassPrice; parcel.PassHours = properties.ParcelData.PassHours; parcel.Category = properties.ParcelData.Category; parcel.AuthBuyerID = properties.ParcelData.AuthBuyerID; parcel.SnapshotID = properties.ParcelData.SnapshotID; parcel.UserLocation = properties.ParcelData.UserLocation; parcel.UserLookAt = properties.ParcelData.UserLookAt; parcel.LandingType = properties.ParcelData.LandingType; }