/* * Copyright (c) 2006-2007, Second Life Reverse Engineering Team * All rights reserved. * * - 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. * - Neither the name of the Second Life Reverse Engineering Team 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 COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR 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.Net; using System.Collections.Generic; using System.Threading; using libsecondlife.Packets; namespace libsecondlife { /// /// Represents an avatar in Second Life (other than your own) /// public class Avatar : LLObject { /// /// Avatar profile flags /// [Flags] public enum ProfileFlags { ALLOW_PUBLISH = 1, MATURE_PUBLISH = 2, IDENTIFIED = 4, TRANSACTED = 8, ONLINE = 16 } #region Avatar Structs /// /// Positive and negative ratings /// public struct Statistics { /// Positive ratings for Behavior public int BehaviorPositive; /// Negative ratings for Behavior public int BehaviorNegative; /// Positive ratings for Appearance public int AppearancePositive; /// Negative ratings for Appearance public int AppearanceNegative; /// Positive ratings for Building public int BuildingPositive; /// Negative ratings for Building public int BuildingNegative; /// Positive ratings given by this avatar public int GivenPositive; /// Negative ratings given by this avatar public int GivenNegative; } /// /// Avatar properties including about text, profile URL, image IDs and /// publishing settings /// public struct AvatarProperties { /// First Life about text public string FirstLifeText; /// First Life image ID public LLUUID FirstLifeImage; /// public LLUUID Partner; /// public string AboutText; /// public string BornOn; /// public string CharterMember; /// Profile image ID public LLUUID ProfileImage; /// Flags of the profile public ProfileFlags Flags; /// Web URL for this profile public string ProfileURL; #region Properties /// Should this profile be published on the web public bool AllowPublish { get { return ((Flags & ProfileFlags.ALLOW_PUBLISH) != 0); } set { if (value == true) { Flags |= ProfileFlags.ALLOW_PUBLISH; } else { Flags &= ~ProfileFlags.ALLOW_PUBLISH; } } } /// Avatar Online Status public bool Online { get { return ((Flags & ProfileFlags.ONLINE) != 0); } set { if (value == true) { Flags |= ProfileFlags.ONLINE; } else { Flags &= ~ProfileFlags.ONLINE; } } } /// Is this a mature profile public bool MaturePublish { get { return ((Flags & ProfileFlags.MATURE_PUBLISH) != 0); } set { if (value == true) { Flags |= ProfileFlags.MATURE_PUBLISH; } else { Flags &= ~ProfileFlags.MATURE_PUBLISH; } } } /// public bool Identified { get { return ((Flags & ProfileFlags.IDENTIFIED) != 0); } set { if (value == true) { Flags |= ProfileFlags.IDENTIFIED; } else { Flags &= ~ProfileFlags.IDENTIFIED; } } } ///// public bool Transacted { get { return ((Flags & ProfileFlags.TRANSACTED) != 0); } set { if (value == true) { Flags |= ProfileFlags.TRANSACTED; } else { Flags &= ~ProfileFlags.TRANSACTED; } } } #endregion Properties } /// /// Avatar interests including spoken languages, skills, and "want to" /// choices /// public struct Interests { /// Languages profile field public string LanguagesText; /// // FIXME: public uint SkillsMask; /// public string SkillsText; /// // FIXME: public uint WantToMask; /// public string WantToText; } #endregion Avatar Structs #region Public Members /// Groups that this avatar is a member of public List Groups = new List(); /// Positive and negative ratings public Statistics ProfileStatistics = new Statistics(); /// Avatar properties including about text, profile URL, image IDs and /// publishing settings public AvatarProperties ProfileProperties = new AvatarProperties(); /// Avatar interests including spoken languages, skills, and "want to" /// choices public Interests ProfileInterests = new Interests(); /// Simulator the avatar is in public Simulator CurrentSim = null; #endregion Public Members /// Full name public string Name { get { if (name.Length > 0) { return name; } else if (NameValues == null || NameValues.Length == 0) { return String.Empty; } else { string firstName = String.Empty; string lastName = String.Empty; for (int i = 0; i < NameValues.Length; i++) { if (NameValues[i].Name == "FirstName" && NameValues[i].Type == NameValue.ValueType.String) firstName = (string)NameValues[i].Value; else if (NameValues[i].Name == "LastName" && NameValues[i].Type == NameValue.ValueType.String) lastName = (string)NameValues[i].Value; } if (firstName != String.Empty && lastName != String.Empty) { name = String.Format("{0} {1}", firstName, lastName); return name; } else { return String.Empty; } } } } /// Active group public string GroupName { get { for (int i = 0; i < NameValues.Length; i++) { if (NameValues[i].Name == "Title" && NameValues[i].Type == NameValue.ValueType.String) { groupName = (string)NameValues[i].Value; break; } } return groupName; } } /// Gets the local ID of the prim the avatar is sitting on, /// zero if the avatar is not currently sitting public uint SittingOn { get { return sittingOn; } } internal string name = String.Empty; internal string groupName = String.Empty; internal uint sittingOn { get { return ParentID; } set { ParentID = value; } } /// /// Default constructor /// public Avatar() { } } }