/* * Copyright (c) Contributors, http://opensimulator.org/ * See CONTRIBUTORS.TXT for a full list of copyright holders. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the OpenSimulator Project nor the * names of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ using System; using System.Collections.Generic; using System.Xml; using System.Xml.Serialization; using OpenMetaverse; namespace OpenSim.Framework { public class LandAccessEntry { public UUID AgentID; public int Expires; public AccessList Flags; } /// /// Details of a Parcel of land /// public class LandData { private Vector3 _AABBMax = new(); private Vector3 _AABBMin = new(); private int _area = 0; private uint _auctionID = 0; //Unemplemented. If set to 0, not being auctioned private UUID _authBuyerID = UUID.Zero; //Unemplemented. Authorized Buyer's UUID private ParcelCategory _category = ParcelCategory.None; //Unemplemented. Parcel's chosen category private int _claimDate = 0; private int _claimPrice = 0; //Unemplemented private UUID _globalID = UUID.Zero; private UUID _groupID = UUID.Zero; private bool _isGroupOwned = false; private byte[] _bitmap = new byte[512]; private string _description = String.Empty; private uint _flags = (uint)ParcelFlags.AllowFly | (uint)ParcelFlags.AllowLandmark | (uint)ParcelFlags.AllowAPrimitiveEntry | (uint)ParcelFlags.AllowDeedToGroup | (uint)ParcelFlags.CreateObjects | (uint)ParcelFlags.AllowOtherScripts | (uint)ParcelFlags.AllowVoiceChat; private byte _landingType = (byte)OpenMetaverse.LandingType.Direct; private string _name = "Your Parcel"; private ParcelStatus _status = ParcelStatus.Leased; private int _localID = 0; private byte _mediaAutoScale = 0; private UUID _mediaID = UUID.Zero; private string _mediaURL = String.Empty; private string _musicURL = String.Empty; private UUID _ownerID = UUID.Zero; private List _parcelAccessList = new(); private float _passHours = 0; private int _passPrice = 0; private int _salePrice = 0; //Unemeplemented. Parcels price. private int _simwideArea = 0; private int _simwidePrims = 0; private UUID _snapshotID = UUID.Zero; private Vector3 _userLocation = new(); private Vector3 _userLookAt = new(); private int _otherCleanTime = 0; private string _mediaType = "none/none"; private string _mediaDescription = ""; private int _mediaHeight = 0; private int _mediaWidth = 0; private bool _mediaLoop = false; private bool _obscureMusic = false; private bool _obscureMedia = false; private float m_dwell = 0; public double LastDwellTimeMS; public bool SeeAVs { get; set; } public bool AnyAVSounds { get; set; } public bool GroupAVSounds { get; set; } private UUID m_fakeID = UUID.Zero; public UUID FakeID { get { return m_fakeID; } set { m_fakeID = value; } } /// /// Traffic count of parcel /// [XmlIgnore] public float Dwell { get { return m_dwell; } set { m_dwell = value; LastDwellTimeMS = Util.GetTimeStampMS(); } } /// /// Whether to obscure parcel media URL /// Now to obscure parcel MOAP /// [XmlIgnore] public bool ObscureMedia { get { return _obscureMedia; } set { _obscureMedia = value; } } /// /// Whether to obscure parcel music URL /// [XmlIgnore] public bool ObscureMusic { get { return _obscureMusic; } set { _obscureMusic = value; } } /// /// Whether to loop parcel media /// [XmlIgnore] public bool MediaLoop { get { return _mediaLoop; } set { _mediaLoop = value; } } /// /// Height of parcel media render /// [XmlIgnore] public int MediaHeight { get { return _mediaHeight; } set { _mediaHeight = value; } } /// /// Width of parcel media render /// [XmlIgnore] public int MediaWidth { get { return _mediaWidth; } set { _mediaWidth = value; } } /// /// Upper corner of the AABB for the parcel /// [XmlIgnore] public Vector3 AABBMax { get { return _AABBMax; } set { _AABBMax = value; } } /// /// Lower corner of the AABB for the parcel /// [XmlIgnore] public Vector3 AABBMin { get { return _AABBMin; } set { _AABBMin = value; } } /// /// Area in meters^2 the parcel contains /// public int Area { get { return _area; } set { _area = value; } } /// /// ID of auction (3rd Party Integration) when parcel is being auctioned /// public uint AuctionID { get { return _auctionID; } set { _auctionID = value; } } /// /// UUID of authorized buyer of parcel. This is UUID.Zero if anyone can buy it. /// public UUID AuthBuyerID { get { return _authBuyerID; } set { _authBuyerID = value; } } /// /// Category of parcel. Used for classifying the parcel in classified listings /// public ParcelCategory Category { get { return _category; } set { _category = value; } } /// /// Date that the current owner purchased or claimed the parcel /// public int ClaimDate { get { return _claimDate; } set { _claimDate = value; } } /// /// The last price that the parcel was sold at /// public int ClaimPrice { get { return _claimPrice; } set { _claimPrice = value; } } /// /// Global ID for the parcel. (3rd Party Integration) /// public UUID GlobalID { get { return _globalID; } set { _globalID = value; } } /// /// Unique ID of the Group that owns /// public UUID GroupID { get { return _groupID; } set { _groupID = value; } } /// /// Returns true if the Land Parcel is owned by a group /// public bool IsGroupOwned { get { return _isGroupOwned; } set { _isGroupOwned = value; } } /// /// parcel shape in bits per ocupied location /// public byte[] Bitmap { get { return _bitmap; } set { _bitmap = value; } } /// /// Parcel Description /// public string Description { get { return _description; } set { _description = value; } } /// /// Parcel settings. Access flags, Fly, NoPush, Voice, Scripts allowed, etc. ParcelFlags /// public uint Flags { get { return _flags; } set { _flags = value; } } /// /// Determines if people are able to teleport where they please on the parcel or if they /// get constrainted to a specific point on teleport within the parcel /// public byte LandingType { get { return _landingType; } set { _landingType = value; } } /// /// Parcel Name /// public string Name { get { return _name; } set { _name = value; } } /// /// Status of Parcel, Leased, Abandoned, For Sale /// public ParcelStatus Status { get { return _status; } set { _status = value; } } /// /// Internal ID of the parcel. Sometimes the client will try to use this value /// public int LocalID { get { return _localID; } set { _localID = value; } } /// /// Determines if we scale the media based on the surface it's on /// public byte MediaAutoScale { get { return _mediaAutoScale; } set { _mediaAutoScale = value; } } /// /// Texture Guid to replace with the output of the media stream /// public UUID MediaID { get { return _mediaID; } set { _mediaID = value; } } /// /// URL to the media file to display /// public string MediaURL { get { return _mediaURL; } set { _mediaURL = value; } } public string MediaType { get { return _mediaType; } set { _mediaType = value; } } /// /// URL to the shoutcast music stream to play on the parcel /// public string MusicURL { get { return _musicURL; } set { _musicURL = value; } } /// /// Owner Avatar or Group of the parcel. Naturally, all land masses must be /// owned by someone /// public UUID OwnerID { get { return _ownerID; } set { _ownerID = value; } } /// /// List of access data for the parcel. User data, some bitflags, and a time /// public List ParcelAccessList { get { return _parcelAccessList; } set { _parcelAccessList = value; } } /// /// How long in hours a Pass to the parcel is given /// public float PassHours { get { return _passHours; } set { _passHours = value; } } /// /// Price to purchase a Pass to a restricted parcel /// public int PassPrice { get { return _passPrice; } set { _passPrice = value; } } /// /// When the parcel is being sold, this is the price to purchase the parcel /// public int SalePrice { get { return _salePrice; } set { _salePrice = value; } } /// /// Number of meters^2 that the land owner has in the Simulator /// [XmlIgnore] public int SimwideArea { get { return _simwideArea; } set { _simwideArea = value; } } /// /// Number of SceneObjectPart in the Simulator /// [XmlIgnore] public int SimwidePrims { get { return _simwidePrims; } set { _simwidePrims = value; } } /// /// ID of the snapshot used in the client parcel dialog of the parcel /// public UUID SnapshotID { get { return _snapshotID; } set { _snapshotID = value; } } /// /// When teleporting is restricted to a certain point, this is the location /// that the user will be redirected to /// public Vector3 UserLocation { get { return _userLocation; } set { _userLocation = value; } } /// /// When teleporting is restricted to a certain point, this is the rotation /// that the user will be positioned /// public Vector3 UserLookAt { get { return _userLookAt; } set { _userLookAt = value; } } /// /// Autoreturn number of minutes to return SceneObjectGroup that are owned by someone who doesn't own /// the parcel and isn't set to the same 'group' as the parcel. /// public int OtherCleanTime { get { return _otherCleanTime; } set { _otherCleanTime = value; } } /// /// parcel media description /// public string MediaDescription { get { return _mediaDescription; } set { _mediaDescription = value; } } public int EnvironmentVersion = -1; [XmlIgnore] //this needs to be added by hand public ViewerEnvironment Environment { get; set;} public LandData() { _globalID = UUID.Random(); SeeAVs = true; AnyAVSounds = true; GroupAVSounds = true; LastDwellTimeMS = Util.GetTimeStampMS(); EnvironmentVersion = -1; Environment = null; } /// /// Make a new copy of the land data /// /// public LandData Copy() { LandData landData = new() { _AABBMax = _AABBMax, _AABBMin = _AABBMin, _area = _area, _auctionID = _auctionID, _authBuyerID = _authBuyerID, _category = _category, _claimDate = _claimDate, _claimPrice = _claimPrice, _globalID = _globalID, m_fakeID = m_fakeID, _groupID = _groupID, _isGroupOwned = _isGroupOwned, _localID = _localID, _landingType = _landingType, _mediaAutoScale = _mediaAutoScale, _mediaID = _mediaID, _mediaURL = _mediaURL, _musicURL = _musicURL, _ownerID = _ownerID, _bitmap = (byte[])_bitmap.Clone(), _description = _description, _flags = _flags, _name = _name, _status = _status, _passHours = _passHours, _passPrice = _passPrice, _salePrice = _salePrice, _snapshotID = _snapshotID, _userLocation = _userLocation, _userLookAt = _userLookAt, _otherCleanTime = _otherCleanTime, _mediaType = _mediaType, _mediaDescription = _mediaDescription, _mediaWidth = _mediaWidth, _mediaHeight = _mediaHeight, _mediaLoop = _mediaLoop, _obscureMusic = _obscureMusic, _obscureMedia = _obscureMedia, _simwideArea = _simwideArea, _simwidePrims = _simwidePrims, m_dwell = m_dwell, SeeAVs = SeeAVs, AnyAVSounds = AnyAVSounds, GroupAVSounds = GroupAVSounds }; landData._parcelAccessList.Clear(); foreach (LandAccessEntry entry in _parcelAccessList) { LandAccessEntry newEntry = new() { AgentID = entry.AgentID, Flags = entry.Flags, Expires = entry.Expires }; landData._parcelAccessList.Add(newEntry); } if (Environment == null) { landData.Environment = null; landData.EnvironmentVersion = -1; } else { landData.Environment = Environment.Clone(); landData.EnvironmentVersion = EnvironmentVersion; } return landData; } } }