public bool CanCreateAt(IScenePresence presence, Vector3 location) { if (m_parcels == null) { return(true); } SceneParcel parcel; if (m_parcels.TryGetParcel(location, out parcel)) { // If we can't enter the parcel we can't create anything there either if (!CanEnterParcel(presence, parcel)) { return(false); } // CreateObjects flag set? We're good if ((parcel.Flags & ParcelFlags.CreateObjects) == ParcelFlags.CreateObjects) { return(true); } // CreateGroupObjects flag set and we're a member of the parcel group? We're good if ((parcel.Flags & ParcelFlags.CreateGroupObjects) == ParcelFlags.CreateGroupObjects && IsInGroup(presence, parcel.GroupID)) { return(true); } return(false); } else { m_log.Warn("No parcel found at " + location); return(true); } }
private void ParcelInfoRequestHandler(Packet packet, LLAgent agent) { ParcelInfoRequestPacket request = (ParcelInfoRequestPacket)packet; SceneParcel parcel; if (m_parcels.TryGetParcel(request.Data.ParcelID, out parcel)) { Vector3d scenePosition = m_scene.MinPosition; Vector3 aabbMin, aabbMax; ParcelInfoReplyPacket reply = new ParcelInfoReplyPacket(); reply.AgentData.AgentID = agent.ID; reply.Data.ActualArea = ParcelManager.GetParcelArea(parcel, out aabbMin, out aabbMax); reply.Data.AuctionID = 0; reply.Data.BillableArea = reply.Data.ActualArea; reply.Data.Desc = Utils.StringToBytes(parcel.Desc); reply.Data.Dwell = parcel.Dwell; reply.Data.Flags = (byte)parcel.Flags; reply.Data.GlobalX = (float)scenePosition.X + aabbMin.X; reply.Data.GlobalY = (float)scenePosition.Y + aabbMin.Y; reply.Data.GlobalZ = 0f; // FIXME: reply.Data.Name = Utils.StringToBytes(parcel.Name); reply.Data.OwnerID = parcel.OwnerID; reply.Data.ParcelID = parcel.ID; reply.Data.SalePrice = parcel.SalePrice; reply.Data.SimName = Utils.StringToBytes(m_scene.Name); reply.Data.SnapshotID = parcel.SnapshotID; m_udp.SendPacket(agent, reply, ThrottleCategory.Task, false); } else { m_log.Warn(agent.Name + " requested info for unknown parcel " + request.Data.ParcelID); } }