private void ParcelOverlayHandler(Packet packet, Simulator simulator) { ParcelOverlayPacket overlay = (ParcelOverlayPacket)packet; if (overlay.ParcelData.SequenceID >= 0 && overlay.ParcelData.SequenceID <= 3) { Buffer.BlockCopy(overlay.ParcelData.Data, 0, simulator.ParcelOverlay, overlay.ParcelData.SequenceID * 1024, 1024); simulator.ParcelOverlaysReceived++; if (simulator.ParcelOverlaysReceived > 3) { // TODO: ParcelOverlaysReceived should become internal, and reset to zero every // time it hits four. Also need a callback here } } else { Client.Log("Parcel overlay with sequence ID of " + overlay.ParcelData.SequenceID + " received from " + simulator.ToString(), Helpers.LogLevel.Warning); } }
private void SendParcelOverlay(IScenePresence presence) { const int LAND_BLOCKS_PER_PACKET = 1024; if (m_udp == null) return; if (!(presence is LLAgent) || presence.InterestList == null) return; LLAgent agent = (LLAgent)presence; byte[] byteArray = new byte[LAND_BLOCKS_PER_PACKET]; int byteArrayCount = 0; int sequenceID = 0; for (int y = 0; y < 64; y++) { for (int x = 0; x < 64; x++) { byte tempByte = 0; // The flags for the current 4x4m parcel square SceneParcel parcel; if (m_parcels.TryGetParcel(m_parcels.GetParcelID(x, y), out parcel)) { // Set the ownership/sale flag if (parcel.OwnerID == presence.ID) tempByte = (byte)ParcelOverlayType.OwnedBySelf; //else if (parcel.AuctionID != 0) // tempByte = (byte)ParcelOverlayType.Auction; else if (parcel.SalePrice > 0 && (parcel.AuthBuyerID == UUID.Zero || parcel.AuthBuyerID == presence.ID)) tempByte = (byte)ParcelOverlayType.ForSale; else if (parcel.GroupID != UUID.Zero) tempByte = (byte)ParcelOverlayType.OwnedByGroup; else if (parcel.OwnerID != UUID.Zero) tempByte = (byte)ParcelOverlayType.OwnedByOther; else tempByte = (byte)ParcelOverlayType.Public; // Set the border flags if (x == 0) tempByte |= (byte)ParcelOverlayType.BorderWest; else if (m_parcels.GetParcelID(x - 1, y) != parcel.LocalID) // Parcel to the west is different from the current parcel tempByte |= (byte)ParcelOverlayType.BorderWest; if (y == 0) tempByte |= (byte)ParcelOverlayType.BorderSouth; else if (m_parcels.GetParcelID(x, y - 1) != parcel.LocalID) // Parcel to the south is different from the current parcel tempByte |= (byte)ParcelOverlayType.BorderSouth; byteArray[byteArrayCount] = tempByte; ++byteArrayCount; if (byteArrayCount >= LAND_BLOCKS_PER_PACKET) { // Send a ParcelOverlay packet ParcelOverlayPacket overlay = new ParcelOverlayPacket(); overlay.ParcelData.SequenceID = sequenceID; overlay.ParcelData.Data = byteArray; m_udp.SendPacket(agent, overlay, ThrottleCategory.Task, false); byteArrayCount = 0; ++sequenceID; } } else { m_log.Warn("Parcel overlay references missing parcel " + m_parcels.GetParcelID(x, y)); } } } }
private void SendParcelOverlay(IScenePresence presence) { const int LAND_BLOCKS_PER_PACKET = 1024; if (m_udp == null) { return; } if (!(presence is LLAgent) || presence.InterestList == null) { return; } LLAgent agent = (LLAgent)presence; byte[] byteArray = new byte[LAND_BLOCKS_PER_PACKET]; int byteArrayCount = 0; int sequenceID = 0; for (int y = 0; y < 64; y++) { for (int x = 0; x < 64; x++) { byte tempByte = 0; // The flags for the current 4x4m parcel square SceneParcel parcel; if (m_parcels.TryGetParcel(m_parcels.GetParcelID(x, y), out parcel)) { // Set the ownership/sale flag if (parcel.OwnerID == presence.ID) { tempByte = (byte)ParcelOverlayType.OwnedBySelf; } //else if (parcel.AuctionID != 0) // tempByte = (byte)ParcelOverlayType.Auction; else if (parcel.SalePrice > 0 && (parcel.AuthBuyerID == UUID.Zero || parcel.AuthBuyerID == presence.ID)) { tempByte = (byte)ParcelOverlayType.ForSale; } else if (parcel.GroupID != UUID.Zero) { tempByte = (byte)ParcelOverlayType.OwnedByGroup; } else if (parcel.OwnerID != UUID.Zero) { tempByte = (byte)ParcelOverlayType.OwnedByOther; } else { tempByte = (byte)ParcelOverlayType.Public; } // Set the border flags if (x == 0) { tempByte |= (byte)ParcelOverlayType.BorderWest; } else if (m_parcels.GetParcelID(x - 1, y) != parcel.LocalID) { // Parcel to the west is different from the current parcel tempByte |= (byte)ParcelOverlayType.BorderWest; } if (y == 0) { tempByte |= (byte)ParcelOverlayType.BorderSouth; } else if (m_parcels.GetParcelID(x, y - 1) != parcel.LocalID) { // Parcel to the south is different from the current parcel tempByte |= (byte)ParcelOverlayType.BorderSouth; } byteArray[byteArrayCount] = tempByte; ++byteArrayCount; if (byteArrayCount >= LAND_BLOCKS_PER_PACKET) { // Send a ParcelOverlay packet ParcelOverlayPacket overlay = new ParcelOverlayPacket(); overlay.ParcelData.SequenceID = sequenceID; overlay.ParcelData.Data = byteArray; m_udp.SendPacket(agent, overlay, ThrottleCategory.Task, false); byteArrayCount = 0; ++sequenceID; } } else { m_log.Warn("Parcel overlay references missing parcel " + m_parcels.GetParcelID(x, y)); } } } }
public void SendParcelOverlay(Agent agent) { const int LAND_BLOCKS_PER_PACKET = 1024; byte[] byteArray = new byte[LAND_BLOCKS_PER_PACKET]; int byteArrayCount = 0; int sequenceID = 0; for (int y = 0; y < 64; y++) { for (int x = 0; x < 64; x++) { byte tempByte = 0; // The flags for the current 4x4m parcel square Parcel parcel; if (parcels.TryGetValue(parcelOverlay[y * 64 + x], out parcel)) { // Set the ownership/sale flag if (parcel.OwnerID == agent.AgentID) { tempByte = (byte)ParcelOverlayType.OwnedBySelf; } else if (parcel.AuctionID != 0) { tempByte = (byte)ParcelOverlayType.Auction; } else if (parcel.SalePrice > 0 && (parcel.AuthBuyerID == UUID.Zero || parcel.AuthBuyerID == agent.AgentID)) { tempByte = (byte)ParcelOverlayType.ForSale; } else if (parcel.GroupID != UUID.Zero) { tempByte = (byte)ParcelOverlayType.OwnedByGroup; } else if (parcel.OwnerID != UUID.Zero) { tempByte = (byte)ParcelOverlayType.OwnedByOther; } else { tempByte = (byte)ParcelOverlayType.Public; } // Set the border flags if (x == 0) { tempByte |= (byte)ParcelOverlayType.BorderWest; } else if (parcelOverlay[y * 64 + (x - 1)] != parcel.LocalID) { // Parcel to the west is different from the current parcel tempByte |= (byte)ParcelOverlayType.BorderWest; } if (y == 0) { tempByte |= (byte)ParcelOverlayType.BorderSouth; } else if (parcelOverlay[(y - 1) * 64 + x] != parcel.LocalID) { // Parcel to the south is different from the current parcel tempByte |= (byte)ParcelOverlayType.BorderSouth; } byteArray[byteArrayCount] = tempByte; ++byteArrayCount; if (byteArrayCount >= LAND_BLOCKS_PER_PACKET) { // Send a ParcelOverlay packet ParcelOverlayPacket overlay = new ParcelOverlayPacket(); overlay.ParcelData.SequenceID = sequenceID; overlay.ParcelData.Data = byteArray; server.UDP.SendPacket(agent.AgentID, overlay, PacketCategory.State); byteArrayCount = 0; ++sequenceID; } } else { Logger.Log("Parcel overlay references missing parcel " + parcelOverlay[y * 64 + x], Helpers.LogLevel.Warning); } } } }