private void ParcelAccessListUpdateHandler(Packet packet, LLAgent agent) { ParcelAccessListUpdatePacket update = (ParcelAccessListUpdatePacket)packet; ParcelAccessFlags flags = (ParcelAccessFlags)update.Data.Flags; SceneParcel parcel; if (m_parcels.TryGetParcel(update.Data.LocalID, out parcel)) { // Initialize the white/black lists if they are not already if (parcel.AccessWhiteList == null) { parcel.AccessWhiteList = new List <ParcelAccessEntry>(); } if (parcel.AccessBlackList == null) { parcel.AccessBlackList = new List <ParcelAccessEntry>(); } List <ParcelAccessEntry> list = (flags == ParcelAccessFlags.Access) ? parcel.AccessWhiteList : parcel.AccessBlackList; lock (list) { for (int i = 0; i < update.List.Length; i++) { UUID newEntry = update.List[i].ID; bool found = false; foreach (ParcelAccessEntry pae in list) { if (pae.AgentID == newEntry) { found = true; break; } } if (!found) { list.Add(new ParcelAccessEntry { AgentID = newEntry, Created = DateTime.UtcNow }); } } } } else { m_log.Warn(agent.Name + " tried to update access list for unknown parcel" + update.Data.LocalID); } }
private void ParcelAccessListRequestHandler(Packet packet, LLAgent agent) { ParcelAccessListRequestPacket request = (ParcelAccessListRequestPacket)packet; ParcelAccessFlags flags = (ParcelAccessFlags)request.Data.Flags; SceneParcel parcel; if (m_parcels.TryGetParcel(request.Data.LocalID, out parcel)) { ParcelAccessListReplyPacket reply = new ParcelAccessListReplyPacket(); reply.Data.AgentID = agent.ID; reply.Data.Flags = request.Data.Flags; reply.Data.LocalID = request.Data.LocalID; reply.Data.SequenceID = request.Data.SequenceID; List <ParcelAccessEntry> list = (flags == ParcelAccessFlags.Access) ? parcel.AccessWhiteList : parcel.AccessBlackList; if (list != null) { lock (list) { reply.List = new ParcelAccessListReplyPacket.ListBlock[list.Count]; for (int i = 0; i < list.Count; i++) { reply.List[i] = new ParcelAccessListReplyPacket.ListBlock { Flags = request.Data.Flags, ID = list[i].AgentID, Time = (int)Utils.DateTimeToUnixTime(list[i].Created) }; } } } else { reply.List = new ParcelAccessListReplyPacket.ListBlock[0]; } m_udp.SendPacket(agent, reply, ThrottleCategory.Task, true); } else { m_log.Warn(agent.Name + " requested access list for unknown parcel " + request.Data.LocalID); } }