OSDN Git Service

RAD-343: Configure/disable LookAt Beacon (client identification possible)
authorLatif Khalifa <latifer@streamgrid.net>
Sun, 25 Mar 2012 01:47:54 +0000 (01:47 +0000)
committerLatif Khalifa <latifer@streamgrid.net>
Sun, 25 Mar 2012 01:47:54 +0000 (01:47 +0000)
git-svn-id: https://radegast.googlecode.com/svn/trunk@1256 f7a694da-4d33-11de-9ad6-1127a62b9fcd

Radegast/Core/StateManager.cs
Radegast/GUI/Dialogs/Settings.Designer.cs
Radegast/GUI/Dialogs/Settings.cs

index 96027ab..3276b84 100644 (file)
-// 
-// Radegast Metaverse Client
-// Copyright (c) 2009-2012, Radegast Development 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.
-//     * 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 application "Radegast", 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 HOLDER 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.
-//
-// $Id$
-//
-using System;
-using System.Collections.Generic;
-using System.Timers;
-using System.Threading;
-using OpenMetaverse;
-using Radegast.Netcom;
-
-namespace Radegast
-{
-    public class KnownHeading
-    {
-        public string ID { get; set; }
-        public string Name { get; set; }
-        public Quaternion Heading { get; set; }
-        public KnownHeading(string id, string name, Quaternion heading)
-        {
-            this.ID = id;
-            this.Name = name;
-            this.Heading = heading;
-        }
-
-        public override string ToString()
-        {
-            return Name;
-        }
-    }
-
-    public class StateManager : IDisposable
-    {
-        public Parcel Parcel { get; set; }
-
-        private RadegastInstance instance;
-        private GridClient client { get { return instance.Client; } }
-        private RadegastNetcom netcom { get { return instance.Netcom; } }
-
-        private bool typing = false;
-        private bool away = false;
-        private bool busy = false;
-        private bool flying = false;
-        private bool alwaysrun = false;
-        private bool sitting = false;
-
-        private bool following = false;
-        private string followName = string.Empty;
-        private float followDistance = 3.0f;
-        private UUID followID;
-
-        private UUID awayAnimationID = new UUID("fd037134-85d4-f241-72c6-4f42164fedee");
-        private UUID busyAnimationID = new UUID("efcf670c2d188128973a034ebc806b67");
-        private UUID typingAnimationID = new UUID("c541c47f-e0c0-058b-ad1a-d6ae3a4584d9");
-        internal static Random rnd = new Random();
-        private System.Threading.Timer lookAtTimer;
-
-        /// <summary>
-        /// Passes walk state
-        /// </summary>
-        /// <param name="walking">True if we are walking towards a targer</param>
-        public delegate void WalkStateCanged(bool walking);
-
-        /// <summary>
-        /// Fires when we start or stop walking towards a target
-        /// </summary>
-        public event WalkStateCanged OnWalkStateCanged;
-
-        /// <summary>
-        /// Fires when avatar stands
-        /// </summary>
-        public event EventHandler<SitEventArgs> SitStateChanged;
-
-        static List<KnownHeading> m_Headings;
-        public static List<KnownHeading> KnownHeadings
-        {
-            get
-            {
-                if (m_Headings == null)
-                {
-                    m_Headings = new List<KnownHeading>(16);
-                    m_Headings.Add(new KnownHeading("E", "East", new Quaternion(0.00000f, 0.00000f, 0.00000f, 1.00000f)));
-                    m_Headings.Add(new KnownHeading("ENE", "East by Northeast", new Quaternion(0.00000f, 0.00000f, 0.19509f, 0.98079f)));
-                    m_Headings.Add(new KnownHeading("NE", "Northeast", new Quaternion(0.00000f, 0.00000f, 0.38268f, 0.92388f)));
-                    m_Headings.Add(new KnownHeading("NNE", "North by Northeast", new Quaternion(0.00000f, 0.00000f, 0.55557f, 0.83147f)));
-                    m_Headings.Add(new KnownHeading("N", "North", new Quaternion(0.00000f, 0.00000f, 0.70711f, 0.70711f)));
-                    m_Headings.Add(new KnownHeading("NNW", "North by Northwest", new Quaternion(0.00000f, 0.00000f, 0.83147f, 0.55557f)));
-                    m_Headings.Add(new KnownHeading("NW", "Nortwest", new Quaternion(0.00000f, 0.00000f, 0.92388f, 0.38268f)));
-                    m_Headings.Add(new KnownHeading("WNW", "West by Northwest", new Quaternion(0.00000f, 0.00000f, 0.98079f, 0.19509f)));
-                    m_Headings.Add(new KnownHeading("W", "West", new Quaternion(0.00000f, 0.00000f, 1.00000f, -0.00000f)));
-                    m_Headings.Add(new KnownHeading("WSW", "West by Southwest", new Quaternion(0.00000f, 0.00000f, 0.98078f, -0.19509f)));
-                    m_Headings.Add(new KnownHeading("SW", "Southwest", new Quaternion(0.00000f, 0.00000f, 0.92388f, -0.38268f)));
-                    m_Headings.Add(new KnownHeading("SSW", "South by Southwest", new Quaternion(0.00000f, 0.00000f, 0.83147f, -0.55557f)));
-                    m_Headings.Add(new KnownHeading("S", "South", new Quaternion(0.00000f, 0.00000f, 0.70711f, -0.70711f)));
-                    m_Headings.Add(new KnownHeading("SSE", "South by Southeast", new Quaternion(0.00000f, 0.00000f, 0.55557f, -0.83147f)));
-                    m_Headings.Add(new KnownHeading("SE", "Southeast", new Quaternion(0.00000f, 0.00000f, 0.38268f, -0.92388f)));
-                    m_Headings.Add(new KnownHeading("ESE", "East by Southeast", new Quaternion(0.00000f, 0.00000f, 0.19509f, -0.98078f)));
-                }
-                return m_Headings;
-            }
-        }
-
-        public static Vector3 RotToEuler(Quaternion r)
-        {
-            Quaternion t = new Quaternion(r.X * r.X, r.Y * r.Y, r.Z * r.Z, r.W * r.W);
-
-            float m = (t.X + t.Y + t.Z + t.W);
-            if (Math.Abs(m) < 0.001) return Vector3.Zero;
-            float n = 2 * (r.Y * r.W + r.X * r.Z);
-            float p = m * m - n * n;
-
-            if (p > 0)
-                return new Vector3(
-                    (float)Math.Atan2(2.0 * (r.X * r.W - r.Y * r.Z), (-t.X - t.Y + t.Z + t.W)),
-                    (float)Math.Atan2(n, Math.Sqrt(p)),
-                    (float)Math.Atan2(2.0 * (r.Z * r.W - r.X * r.Y), t.X - t.Y - t.Z + t.W)
-                    );
-            else if (n > 0)
-                return new Vector3(
-                    0f,
-                    (float)(Math.PI / 2d),
-                    (float)Math.Atan2((r.Z * r.W + r.X * r.Y), 0.5 - t.X - t.Y)
-                    );
-            else
-                return new Vector3(
-                    0f,
-                    -(float)(Math.PI / 2d),
-                    (float)Math.Atan2((r.Z * r.W + r.X * r.Y), 0.5 - t.X - t.Z)
-                    );
-        }
-
-        public static KnownHeading ClosestKnownHeading(int degrees)
-        {
-            KnownHeading ret = KnownHeadings[0];
-            int facing = (int)(57.2957795d * RotToEuler(KnownHeadings[0].Heading).Z);
-            if (facing < 0) facing += 360;
-            int minDistance = Math.Abs(degrees - facing);
-
-            for (int i = 1; i < KnownHeadings.Count; i++)
-            {
-                facing = (int)(57.2957795d * RotToEuler(KnownHeadings[i].Heading).Z);
-                if (facing < 0) facing += 360;
-
-                int distance = Math.Abs(degrees - facing);
-                if (distance < minDistance)
-                {
-                    ret = KnownHeadings[i];
-                    minDistance = distance;
-                }
-            }
-
-            return ret;
-        }
-
-        public Dictionary<UUID, string> KnownAnimations;
-
-        public StateManager(RadegastInstance instance)
-        {
-            this.instance = instance;
-            this.instance.ClientChanged += new EventHandler<ClientChangedEventArgs>(instance_ClientChanged);
-            KnownAnimations = Animations.ToDictionary();
-
-            beamTimer = new System.Timers.Timer();
-            beamTimer.Enabled = false;
-            beamTimer.Elapsed += new ElapsedEventHandler(beamTimer_Elapsed);
-
-            // Callbacks
-            netcom.ClientConnected += new EventHandler<EventArgs>(netcom_ClientConnected);
-            netcom.ClientDisconnected += new EventHandler<DisconnectedEventArgs>(netcom_ClientDisconnected);
-            netcom.ChatReceived += new EventHandler<ChatEventArgs>(netcom_ChatReceived);
-            RegisterClientEvents(client);
-        }
-
-
-        private void RegisterClientEvents(GridClient client)
-        {
-            client.Objects.TerseObjectUpdate += new EventHandler<TerseObjectUpdateEventArgs>(Objects_TerseObjectUpdate);
-            client.Objects.AvatarSitChanged += new EventHandler<AvatarSitChangedEventArgs>(Objects_AvatarSitChanged);
-            client.Self.AlertMessage += new EventHandler<AlertMessageEventArgs>(Self_AlertMessage);
-            client.Self.TeleportProgress += new EventHandler<TeleportEventArgs>(Self_TeleportProgress);
-            client.Network.EventQueueRunning += new EventHandler<EventQueueRunningEventArgs>(Network_EventQueueRunning);
-        }
-
-        private void UnregisterClientEvents(GridClient client)
-        {
-            client.Objects.TerseObjectUpdate -= new EventHandler<TerseObjectUpdateEventArgs>(Objects_TerseObjectUpdate);
-            client.Objects.AvatarSitChanged -= new EventHandler<AvatarSitChangedEventArgs>(Objects_AvatarSitChanged);
-            client.Self.AlertMessage -= new EventHandler<AlertMessageEventArgs>(Self_AlertMessage);
-            client.Self.TeleportProgress -= new EventHandler<TeleportEventArgs>(Self_TeleportProgress);
-            client.Network.EventQueueRunning -= new EventHandler<EventQueueRunningEventArgs>(Network_EventQueueRunning);
-        }
-
-        public void Dispose()
-        {
-            netcom.ClientConnected -= new EventHandler<EventArgs>(netcom_ClientConnected);
-            netcom.ClientDisconnected -= new EventHandler<DisconnectedEventArgs>(netcom_ClientDisconnected);
-            netcom.ChatReceived -= new EventHandler<ChatEventArgs>(netcom_ChatReceived);
-            UnregisterClientEvents(client);
-            beamTimer.Dispose();
-            beamTimer = null;
-
-            if (lookAtTimer != null)
-            {
-                lookAtTimer.Dispose();
-                lookAtTimer = null;
-            }
-
-            if (walkTimer != null)
-            {
-                walkTimer.Dispose();
-                walkTimer = null;
-            }
-        }
-
-        void instance_ClientChanged(object sender, ClientChangedEventArgs e)
-        {
-            UnregisterClientEvents(e.OldClient);
-            RegisterClientEvents(client);
-        }
-
-        void Objects_AvatarSitChanged(object sender, AvatarSitChangedEventArgs e)
-        {
-            if (e.Avatar.LocalID != client.Self.LocalID) return;
-
-            this.sitting = e.SittingOn != 0;
-            if (SitStateChanged != null)
-            {
-                SitStateChanged(this, new SitEventArgs(this.sitting));
-            }
-        }
-
-        /// <summary>
-        /// Locates avatar in the current sim, or adjacents sims
-        /// </summary>
-        /// <param name="person">Avatar UUID</param>
-        /// <param name="sim">Simulator avatar is in</param>
-        /// <param name="position">Position within sim</param>
-        /// <returns>True if managed to find the avatar</returns>
-        public bool TryFindAvatar(UUID person, out Simulator sim, out Vector3 position)
-        {
-            sim = null;
-            position = Vector3.Zero;
-
-            Avatar avi = null;
-
-            // First try the objecct tracker
-            for (int i = 0; i < client.Network.Simulators.Count; i++)
-            {
-                avi = client.Network.Simulators[i].ObjectsAvatars.Find((Avatar av) => { return av.ID == person; });
-                if (avi != null)
-                {
-                    sim = client.Network.Simulators[i];
-                    break;
-                }
-            }
-
-            if (avi != null)
-            {
-                if (avi.ParentID == 0)
-                {
-                    position = avi.Position;
-                }
-                else
-                {
-                    Primitive seat;
-                    if (sim.ObjectsPrimitives.TryGetValue(avi.ParentID, out seat))
-                    {
-                        position = seat.Position + avi.Position;
-                    }
-                }
-            }
-            else
-            {
-                for (int i = 0; i < client.Network.Simulators.Count; i++)
-                {
-                    if (client.Network.Simulators[i].AvatarPositions.ContainsKey(person))
-                    {
-                        sim = client.Network.Simulators[i];
-                        position = sim.AvatarPositions[person];
-                        break;
-                    }
-                }
-            }
-
-            if (position.Z > 0.1f)
-                return true;
-            else
-                return false;
-        }
-
-        public void SetRandomHeading()
-        {
-            client.Self.Movement.UpdateFromHeading(Utils.TWO_PI * rnd.NextDouble(), true);
-            LookInFront();
-        }
-
-        void Network_EventQueueRunning(object sender, EventQueueRunningEventArgs e)
-        {
-            if (e.Simulator == client.Network.CurrentSim)
-            {
-                SetRandomHeading();
-            }
-        }
-
-        private UUID teleportEffect = UUID.Random();
-
-        void Self_TeleportProgress(object sender, TeleportEventArgs e)
-        {
-            if (!client.Network.Connected) return;
-
-            if (e.Status == TeleportStatus.Progress)
-            {
-                client.Self.SphereEffect(client.Self.GlobalPosition, Color4.White, 4f, teleportEffect);
-            }
-
-            if (e.Status == TeleportStatus.Finished)
-            {
-                client.Self.SphereEffect(Vector3d.Zero, Color4.White, 0f, teleportEffect);
-                SetRandomHeading();
-            }
-
-            if (e.Status == TeleportStatus.Failed)
-            {
-                client.Self.SphereEffect(Vector3d.Zero, Color4.White, 0f, teleportEffect);
-            }
-        }
-
-        void netcom_ClientDisconnected(object sender, DisconnectedEventArgs e)
-        {
-            typing = away = busy = walking = false;
-
-            if (lookAtTimer != null)
-            {
-                lookAtTimer.Dispose();
-                lookAtTimer = null;
-            }
-
-        }
-
-        void netcom_ClientConnected(object sender, EventArgs e)
-        {
-            if (!instance.GlobalSettings.ContainsKey("draw_distance"))
-            {
-                instance.GlobalSettings["draw_distance"] = 48;
-            }
-
-            client.Self.Movement.Camera.Far = instance.GlobalSettings["draw_distance"];
-
-            if (lookAtTimer == null)
-                lookAtTimer = new System.Threading.Timer(new TimerCallback(lookAtTimerTick), null, Timeout.Infinite, Timeout.Infinite);
-        }
-
-        void Objects_TerseObjectUpdate(object sender, TerseObjectUpdateEventArgs e)
-        {
-            if (!e.Update.Avatar) return;
-            if (!following) return;
-
-            Avatar av;
-            client.Network.CurrentSim.ObjectsAvatars.TryGetValue(e.Update.LocalID, out av);
-            if (av == null) return;
-
-            if (av.ID == followID)
-            {
-                Vector3 pos = AvatarPosition(client.Network.CurrentSim, av);
-
-                FollowUpdate(pos);
-            }
-        }
-
-        void FollowUpdate(Vector3 pos)
-        {
-            if (Vector3.Distance(pos, client.Self.SimPosition) > followDistance)
-            {
-                Vector3 target = pos + Vector3.Normalize(client.Self.SimPosition - pos) * (followDistance - 1f);
-                client.Self.AutoPilotCancel();
-                Vector3d glb = GlobalPosition(client.Network.CurrentSim, target);
-                client.Self.AutoPilot(glb.X, glb.Y, glb.Z);
-            }
-            else
-            {
-                client.Self.AutoPilotCancel();
-                client.Self.Movement.TurnToward(pos);
-            }
-        }
-
-        public Quaternion AvatarRotation(Simulator sim, UUID avID)
-        {
-            Quaternion rot = Quaternion.Identity;
-            Avatar av = sim.ObjectsAvatars.Find((Avatar a) => { return a.ID == avID; });
-
-            if (av == null)
-                return rot;
-
-            if (av.ParentID == 0)
-            {
-                rot = av.Rotation;
-            }
-            else
-            {
-                Primitive prim;
-                if (sim.ObjectsPrimitives.TryGetValue(av.ParentID, out prim))
-                {
-                    rot = prim.Rotation + av.Rotation;
-                }
-            }
-
-            return rot;
-        }
-
-
-        public Vector3 AvatarPosition(Simulator sim, UUID avID)
-        {
-            Vector3 pos = Vector3.Zero;
-            Avatar av = sim.ObjectsAvatars.Find((Avatar a) => { return a.ID == avID; });
-            if (av != null)
-            {
-                return AvatarPosition(sim, av);
-            }
-            else
-            {
-                Vector3 coarse;
-                if (sim.AvatarPositions.TryGetValue(avID, out coarse))
-                {
-                    if (coarse.Z > 0.01)
-                        return coarse;
-                }
-            }
-            return pos;
-        }
-
-        public Vector3 AvatarPosition(Simulator sim, Avatar av)
-        {
-            Vector3 pos = Vector3.Zero;
-
-            if (av.ParentID == 0)
-            {
-                pos = av.Position;
-            }
-            else
-            {
-                Primitive prim;
-                if (sim.ObjectsPrimitives.TryGetValue(av.ParentID, out prim))
-                {
-                    pos = prim.Position + av.Position;
-                }
-            }
-
-            return pos;
-        }
-
-        public void Follow(string name, UUID id)
-        {
-            followName = name;
-            followID = id;
-            following = followID != UUID.Zero;
-
-            if (following)
-            {
-                walking = false;
-
-                Vector3 target = AvatarPosition(client.Network.CurrentSim, id);
-                if (Vector3.Zero != target)
-                {
-                    client.Self.Movement.TurnToward(target);
-                    FollowUpdate(target);
-                }
-
-            }
-        }
-
-        public void StopFollowing()
-        {
-            following = false;
-            followName = string.Empty;
-            followID = UUID.Zero;
-        }
-
-        #region Look at effect
-        private int lastLookAtEffect = 0;
-        private UUID lookAtEffect = UUID.Random();
-
-        /// <summary>
-        /// Set eye focus 3m in front of us
-        /// </summary>
-        public void LookInFront()
-        {
-            if (!client.Network.Connected) return;
-
-            client.Self.LookAtEffect(client.Self.AgentID, client.Self.AgentID,
-                new Vector3d(new Vector3(3, 0, 0) * Quaternion.Identity),
-                LookAtType.Idle, lookAtEffect);
-        }
-
-        void lookAtTimerTick(object state)
-        {
-            LookInFront();
-        }
-
-        void netcom_ChatReceived(object sender, ChatEventArgs e)
-        {
-            if (e.SourceID != client.Self.AgentID && (e.SourceType == ChatSourceType.Agent || e.Type == ChatType.StartTyping))
-            {
-                // change focus max every 4 seconds
-                if (Environment.TickCount - lastLookAtEffect > 4000)
-                {
-                    lastLookAtEffect = Environment.TickCount;
-                    client.Self.LookAtEffect(client.Self.AgentID, e.SourceID, Vector3d.Zero, LookAtType.Respond, lookAtEffect);
-                    // keep looking at the speaker for 10 seconds
-                    if (lookAtTimer != null)
-                    {
-                        lookAtTimer.Change(10000, Timeout.Infinite);
-                    }
-                }
-            }
-        }
-        #endregion Look at effect
-
-        #region Walking (move to)
-        private bool walking = false;
-        private System.Threading.Timer walkTimer;
-        private int walkChekInterval = 500;
-        private Vector3d walkToTarget;
-        int lastDistance = 0;
-        int lastDistanceChanged = 0;
-
-        public void WalkTo(Primitive prim)
-        {
-            WalkTo(GlobalPosition(prim));
-        }
-
-        public void WalkTo(Vector3d globalPos)
-        {
-            walkToTarget = globalPos;
-
-            if (following)
-            {
-                following = false;
-                followName = string.Empty;
-            }
-
-            if (walkTimer == null)
-            {
-                walkTimer = new System.Threading.Timer(new TimerCallback(walkTimerElapsed), null, walkChekInterval, Timeout.Infinite);
-            }
-
-            lastDistanceChanged = System.Environment.TickCount;
-            client.Self.AutoPilotCancel();
-            walking = true;
-            client.Self.AutoPilot(walkToTarget.X, walkToTarget.Y, walkToTarget.Z);
-            FireWalkStateCanged();
-        }
-
-        void walkTimerElapsed(object sender)
-        {
-
-            double distance = Vector3d.Distance(client.Self.GlobalPosition, walkToTarget);
-
-            if (distance < 2d)
-            {
-                // We're there
-                EndWalking();
-            }
-            else
-            {
-                if (lastDistance != (int)distance)
-                {
-                    lastDistanceChanged = System.Environment.TickCount;
-                    lastDistance = (int)distance;
-                }
-                else if ((System.Environment.TickCount - lastDistanceChanged) > 10000)
-                {
-                    // Our distance to the target has not changed in 10s, give up
-                    EndWalking();
-                    return;
-                }
-                walkTimer.Change(walkChekInterval, Timeout.Infinite);
-            }
-        }
-
-        void Self_AlertMessage(object sender, AlertMessageEventArgs e)
-        {
-            if (e.Message.Contains("Autopilot cancel"))
-            {
-                if (walking)
-                {
-                    EndWalking();
-                }
-            }
-        }
-
-        void FireWalkStateCanged()
-        {
-            if (OnWalkStateCanged != null)
-            {
-                try { OnWalkStateCanged(walking); }
-                catch (Exception) { }
-            }
-        }
-
-        public void EndWalking()
-        {
-            if (walking)
-            {
-                walking = false;
-                Logger.Log("Finished walking.", Helpers.LogLevel.Debug, client);
-                walkTimer.Dispose();
-                walkTimer = null;
-                client.Self.AutoPilotCancel();
-                FireWalkStateCanged();
-            }
-        }
-        #endregion
-
-        public void SetTyping(bool typing)
-        {
-            if (!client.Network.Connected) return;
-
-            Dictionary<UUID, bool> typingAnim = new Dictionary<UUID, bool>();
-            typingAnim.Add(typingAnimationID, typing);
-
-            client.Self.Animate(typingAnim, false);
-
-            if (typing)
-                client.Self.Chat(string.Empty, 0, ChatType.StartTyping);
-            else
-                client.Self.Chat(string.Empty, 0, ChatType.StopTyping);
-
-            this.typing = typing;
-        }
-
-        public void SetAway(bool away)
-        {
-            Dictionary<UUID, bool> awayAnim = new Dictionary<UUID, bool>();
-            awayAnim.Add(awayAnimationID, away);
-
-            client.Self.Animate(awayAnim, true);
-            this.away = away;
-        }
-
-        public void SetBusy(bool busy)
-        {
-            Dictionary<UUID, bool> busyAnim = new Dictionary<UUID, bool>();
-            busyAnim.Add(busyAnimationID, busy);
-
-            client.Self.Animate(busyAnim, true);
-            this.busy = busy;
-        }
-
-        public void SetFlying(bool flying)
-        {
-            this.flying = client.Self.Movement.Fly = flying;
-        }
-
-        public void SetAlwaysRun(bool alwaysrun)
-        {
-            this.alwaysrun = client.Self.Movement.AlwaysRun = alwaysrun;
-        }
-
-        public void SetSitting(bool sitting, UUID target)
-        {
-            this.sitting = sitting;
-
-            if (sitting)
-            {
-                client.Self.RequestSit(target, Vector3.Zero);
-                client.Self.Sit();
-            }
-            else
-            {
-                client.Self.Stand();
-            }
-
-            if (SitStateChanged != null)
-            {
-                SitStateChanged(this, new SitEventArgs(this.sitting));
-            }
-
-            if (!this.sitting)
-            {
-                StopAllAnimations();
-            }
-        }
-
-        public void StopAllAnimations()
-        {
-            Dictionary<UUID, bool> stop = new Dictionary<UUID, bool>();
-
-            client.Self.SignaledAnimations.ForEach((UUID anim) =>
-            {
-                if (!KnownAnimations.ContainsKey(anim))
-                {
-                    stop.Add(anim, false);
-                }
-            });
-
-            if (stop.Count > 0)
-            {
-                client.Self.Animate(stop, true);
-            }
-        }
-
-        public Vector3d GlobalPosition(Simulator sim, Vector3 pos)
-        {
-            uint globalX, globalY;
-            Utils.LongToUInts(sim.Handle, out globalX, out globalY);
-
-            return new Vector3d(
-                (double)globalX + (double)pos.X,
-                (double)globalY + (double)pos.Y,
-                (double)pos.Z);
-        }
-
-        public Vector3d GlobalPosition(Primitive prim)
-        {
-            return GlobalPosition(client.Network.CurrentSim, prim.Position);
-        }
-
-        private System.Timers.Timer beamTimer;
-        private List<Vector3d> beamTarget;
-        private Random beamRandom = new Random();
-        private UUID pointID;
-        private UUID sphereID;
-        private List<UUID> beamID;
-        private int numBeans;
-        private Color4[] beamColors = new Color4[3] { new Color4(0, 255, 0, 255), new Color4(255, 0, 0, 255), new Color4(0, 0, 255, 255) };
-        private Primitive targetPrim;
-
-        public void UnSetPointing()
-        {
-            beamTimer.Enabled = false;
-            if (pointID != UUID.Zero)
-            {
-                client.Self.PointAtEffect(client.Self.AgentID, UUID.Zero, Vector3d.Zero, PointAtType.None, pointID);
-                pointID = UUID.Zero;
-            }
-
-            if (beamID != null)
-            {
-                foreach (UUID id in beamID)
-                {
-                    client.Self.BeamEffect(UUID.Zero, UUID.Zero, Vector3d.Zero, new Color4(255, 255, 255, 255), 0, id);
-                }
-                beamID = null;
-            }
-
-            if (sphereID != UUID.Zero)
-            {
-                client.Self.SphereEffect(Vector3d.Zero, Color4.White, 0, sphereID);
-                sphereID = UUID.Zero;
-            }
-
-        }
-
-        void beamTimer_Elapsed(object sender, EventArgs e)
-        {
-            if (beamID == null) return;
-
-            try
-            {
-                client.Self.SphereEffect(GlobalPosition(targetPrim), beamColors[beamRandom.Next(0, 3)], 0.85f, sphereID);
-                int i = 0;
-                for (i = 0; i < numBeans; i++)
-                {
-                    UUID newBeam = UUID.Random();
-                    Vector3d scatter;
-
-                    if (i == 0)
-                    {
-                        scatter = GlobalPosition(targetPrim);
-                    }
-                    else
-                    {
-                        Vector3d direction = client.Self.GlobalPosition - GlobalPosition(targetPrim);
-                        Vector3d cross = direction % new Vector3d(0, 0, 1);
-                        cross.Normalize();
-                        scatter = GlobalPosition(targetPrim) + cross * (i * 0.2d) * (i % 2 == 0 ? 1 : -1);
-                    }
-                    client.Self.BeamEffect(client.Self.AgentID, UUID.Zero, scatter, beamColors[beamRandom.Next(0, 3)], 1.0f, beamID[i]);
-                }
-
-                for (int j = 1; j < numBeans; j++)
-                {
-                    UUID newBeam = UUID.Random();
-                    Vector3d scatter;
-                    Vector3d cross = new Vector3d(0, 0, 1);
-                    cross.Normalize();
-                    scatter = GlobalPosition(targetPrim) + cross * (j * 0.2d) * (j % 2 == 0 ? 1 : -1);
-
-                    client.Self.BeamEffect(client.Self.AgentID, UUID.Zero, scatter, beamColors[beamRandom.Next(0, 3)], 1.0f, beamID[j + i - 1]);
-                }
-            }
-            catch (Exception) { };
-
-        }
-
-        public void SetPointing(Primitive prim, int numBeans)
-        {
-            UnSetPointing();
-            client.Self.Movement.TurnToward(prim.Position);
-            pointID = UUID.Random();
-            sphereID = UUID.Random();
-            beamID = new List<UUID>();
-            beamTarget = new List<Vector3d>();
-            targetPrim = prim;
-            this.numBeans = numBeans;
-
-            client.Self.PointAtEffect(client.Self.AgentID, prim.ID, Vector3d.Zero, PointAtType.Select, pointID);
-
-            for (int i = 0; i < numBeans; i++)
-            {
-                UUID newBeam = UUID.Random();
-                beamID.Add(newBeam);
-                beamTarget.Add(Vector3d.Zero);
-            }
-
-            for (int i = 1; i < numBeans; i++)
-            {
-                UUID newBeam = UUID.Random();
-                beamID.Add(newBeam);
-                beamTarget.Add(Vector3d.Zero);
-            }
-
-            beamTimer.Interval = 1000;
-            beamTimer.Enabled = true;
-        }
-
-        public UUID TypingAnimationID
-        {
-            get { return typingAnimationID; }
-            set { typingAnimationID = value; }
-        }
-
-        public UUID AwayAnimationID
-        {
-            get { return awayAnimationID; }
-            set { awayAnimationID = value; }
-        }
-
-        public UUID BusyAnimationID
-        {
-            get { return busyAnimationID; }
-            set { busyAnimationID = value; }
-        }
-
-        public bool IsTyping
-        {
-            get { return typing; }
-        }
-
-        public bool IsAway
-        {
-            get { return away; }
-        }
-
-        public bool IsBusy
-        {
-            get { return busy; }
-        }
-
-        public bool IsFlying
-        {
-            get { return flying; }
-        }
-
-        public bool IsSitting
-        {
-            get { return sitting; }
-        }
-
-        public bool IsPointing
-        {
-            get { return pointID != UUID.Zero; }
-        }
-
-        public bool IsFollowing
-        {
-            get { return following; }
-        }
-
-        public string FollowName
-        {
-            get { return followName; }
-            set { followName = value; }
-        }
-
-        public float FollowDistance
-        {
-            get { return followDistance; }
-            set { followDistance = value; }
-        }
-
-        public bool IsWalking
-        {
-            get { return walking; }
-        }
-    }
-
-    public class SitEventArgs : EventArgs
-    {
-        public bool Sitting;
-
-        public SitEventArgs(bool sitting)
-        {
-            this.Sitting = sitting;
-        }
-    }
-}
+// \r
+// Radegast Metaverse Client\r
+// Copyright (c) 2009-2012, Radegast Development Team\r
+// All rights reserved.\r
+// \r
+// Redistribution and use in source and binary forms, with or without\r
+// modification, are permitted provided that the following conditions are met:\r
+// \r
+//     * Redistributions of source code must retain the above copyright notice,\r
+//       this list of conditions and the following disclaimer.\r
+//     * Redistributions in binary form must reproduce the above copyright\r
+//       notice, this list of conditions and the following disclaimer in the\r
+//       documentation and/or other materials provided with the distribution.\r
+//     * Neither the name of the application "Radegast", nor the names of its\r
+//       contributors may be used to endorse or promote products derived from\r
+//       this software without specific prior written permission.\r
+// \r
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"\r
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\r
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\r
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\r
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\r
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\r
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// $Id$\r
+//\r
+using System;\r
+using System.Collections.Generic;\r
+using System.Timers;\r
+using System.Threading;\r
+using OpenMetaverse;\r
+using Radegast.Netcom;\r
+\r
+namespace Radegast\r
+{\r
+    public class KnownHeading\r
+    {\r
+        public string ID { get; set; }\r
+        public string Name { get; set; }\r
+        public Quaternion Heading { get; set; }\r
+        public KnownHeading(string id, string name, Quaternion heading)\r
+        {\r
+            this.ID = id;\r
+            this.Name = name;\r
+            this.Heading = heading;\r
+        }\r
+\r
+        public override string ToString()\r
+        {\r
+            return Name;\r
+        }\r
+    }\r
+\r
+    public class StateManager : IDisposable\r
+    {\r
+        public Parcel Parcel { get; set; }\r
+\r
+        private RadegastInstance instance;\r
+        private GridClient client { get { return instance.Client; } }\r
+        private RadegastNetcom netcom { get { return instance.Netcom; } }\r
+\r
+        private bool typing = false;\r
+        private bool away = false;\r
+        private bool busy = false;\r
+        private bool flying = false;\r
+        private bool alwaysrun = false;\r
+        private bool sitting = false;\r
+\r
+        private bool following = false;\r
+        private string followName = string.Empty;\r
+        private float followDistance = 3.0f;\r
+        private UUID followID;\r
+\r
+        private UUID awayAnimationID = new UUID("fd037134-85d4-f241-72c6-4f42164fedee");\r
+        private UUID busyAnimationID = new UUID("efcf670c2d188128973a034ebc806b67");\r
+        private UUID typingAnimationID = new UUID("c541c47f-e0c0-058b-ad1a-d6ae3a4584d9");\r
+        internal static Random rnd = new Random();\r
+        private System.Threading.Timer lookAtTimer;\r
+\r
+        /// <summary>\r
+        /// Passes walk state\r
+        /// </summary>\r
+        /// <param name="walking">True if we are walking towards a targer</param>\r
+        public delegate void WalkStateCanged(bool walking);\r
+\r
+        /// <summary>\r
+        /// Fires when we start or stop walking towards a target\r
+        /// </summary>\r
+        public event WalkStateCanged OnWalkStateCanged;\r
+\r
+        /// <summary>\r
+        /// Fires when avatar stands\r
+        /// </summary>\r
+        public event EventHandler<SitEventArgs> SitStateChanged;\r
+\r
+        static List<KnownHeading> m_Headings;\r
+        public static List<KnownHeading> KnownHeadings\r
+        {\r
+            get\r
+            {\r
+                if (m_Headings == null)\r
+                {\r
+                    m_Headings = new List<KnownHeading>(16);\r
+                    m_Headings.Add(new KnownHeading("E", "East", new Quaternion(0.00000f, 0.00000f, 0.00000f, 1.00000f)));\r
+                    m_Headings.Add(new KnownHeading("ENE", "East by Northeast", new Quaternion(0.00000f, 0.00000f, 0.19509f, 0.98079f)));\r
+                    m_Headings.Add(new KnownHeading("NE", "Northeast", new Quaternion(0.00000f, 0.00000f, 0.38268f, 0.92388f)));\r
+                    m_Headings.Add(new KnownHeading("NNE", "North by Northeast", new Quaternion(0.00000f, 0.00000f, 0.55557f, 0.83147f)));\r
+                    m_Headings.Add(new KnownHeading("N", "North", new Quaternion(0.00000f, 0.00000f, 0.70711f, 0.70711f)));\r
+                    m_Headings.Add(new KnownHeading("NNW", "North by Northwest", new Quaternion(0.00000f, 0.00000f, 0.83147f, 0.55557f)));\r
+                    m_Headings.Add(new KnownHeading("NW", "Nortwest", new Quaternion(0.00000f, 0.00000f, 0.92388f, 0.38268f)));\r
+                    m_Headings.Add(new KnownHeading("WNW", "West by Northwest", new Quaternion(0.00000f, 0.00000f, 0.98079f, 0.19509f)));\r
+                    m_Headings.Add(new KnownHeading("W", "West", new Quaternion(0.00000f, 0.00000f, 1.00000f, -0.00000f)));\r
+                    m_Headings.Add(new KnownHeading("WSW", "West by Southwest", new Quaternion(0.00000f, 0.00000f, 0.98078f, -0.19509f)));\r
+                    m_Headings.Add(new KnownHeading("SW", "Southwest", new Quaternion(0.00000f, 0.00000f, 0.92388f, -0.38268f)));\r
+                    m_Headings.Add(new KnownHeading("SSW", "South by Southwest", new Quaternion(0.00000f, 0.00000f, 0.83147f, -0.55557f)));\r
+                    m_Headings.Add(new KnownHeading("S", "South", new Quaternion(0.00000f, 0.00000f, 0.70711f, -0.70711f)));\r
+                    m_Headings.Add(new KnownHeading("SSE", "South by Southeast", new Quaternion(0.00000f, 0.00000f, 0.55557f, -0.83147f)));\r
+                    m_Headings.Add(new KnownHeading("SE", "Southeast", new Quaternion(0.00000f, 0.00000f, 0.38268f, -0.92388f)));\r
+                    m_Headings.Add(new KnownHeading("ESE", "East by Southeast", new Quaternion(0.00000f, 0.00000f, 0.19509f, -0.98078f)));\r
+                }\r
+                return m_Headings;\r
+            }\r
+        }\r
+\r
+        public static Vector3 RotToEuler(Quaternion r)\r
+        {\r
+            Quaternion t = new Quaternion(r.X * r.X, r.Y * r.Y, r.Z * r.Z, r.W * r.W);\r
+\r
+            float m = (t.X + t.Y + t.Z + t.W);\r
+            if (Math.Abs(m) < 0.001) return Vector3.Zero;\r
+            float n = 2 * (r.Y * r.W + r.X * r.Z);\r
+            float p = m * m - n * n;\r
+\r
+            if (p > 0)\r
+                return new Vector3(\r
+                    (float)Math.Atan2(2.0 * (r.X * r.W - r.Y * r.Z), (-t.X - t.Y + t.Z + t.W)),\r
+                    (float)Math.Atan2(n, Math.Sqrt(p)),\r
+                    (float)Math.Atan2(2.0 * (r.Z * r.W - r.X * r.Y), t.X - t.Y - t.Z + t.W)\r
+                    );\r
+            else if (n > 0)\r
+                return new Vector3(\r
+                    0f,\r
+                    (float)(Math.PI / 2d),\r
+                    (float)Math.Atan2((r.Z * r.W + r.X * r.Y), 0.5 - t.X - t.Y)\r
+                    );\r
+            else\r
+                return new Vector3(\r
+                    0f,\r
+                    -(float)(Math.PI / 2d),\r
+                    (float)Math.Atan2((r.Z * r.W + r.X * r.Y), 0.5 - t.X - t.Z)\r
+                    );\r
+        }\r
+\r
+        public static KnownHeading ClosestKnownHeading(int degrees)\r
+        {\r
+            KnownHeading ret = KnownHeadings[0];\r
+            int facing = (int)(57.2957795d * RotToEuler(KnownHeadings[0].Heading).Z);\r
+            if (facing < 0) facing += 360;\r
+            int minDistance = Math.Abs(degrees - facing);\r
+\r
+            for (int i = 1; i < KnownHeadings.Count; i++)\r
+            {\r
+                facing = (int)(57.2957795d * RotToEuler(KnownHeadings[i].Heading).Z);\r
+                if (facing < 0) facing += 360;\r
+\r
+                int distance = Math.Abs(degrees - facing);\r
+                if (distance < minDistance)\r
+                {\r
+                    ret = KnownHeadings[i];\r
+                    minDistance = distance;\r
+                }\r
+            }\r
+\r
+            return ret;\r
+        }\r
+\r
+        public Dictionary<UUID, string> KnownAnimations;\r
+\r
+        public StateManager(RadegastInstance instance)\r
+        {\r
+            this.instance = instance;\r
+            this.instance.ClientChanged += new EventHandler<ClientChangedEventArgs>(instance_ClientChanged);\r
+            KnownAnimations = Animations.ToDictionary();\r
+\r
+            beamTimer = new System.Timers.Timer();\r
+            beamTimer.Enabled = false;\r
+            beamTimer.Elapsed += new ElapsedEventHandler(beamTimer_Elapsed);\r
+\r
+            // Callbacks\r
+            netcom.ClientConnected += new EventHandler<EventArgs>(netcom_ClientConnected);\r
+            netcom.ClientDisconnected += new EventHandler<DisconnectedEventArgs>(netcom_ClientDisconnected);\r
+            netcom.ChatReceived += new EventHandler<ChatEventArgs>(netcom_ChatReceived);\r
+            RegisterClientEvents(client);\r
+        }\r
+\r
+\r
+        private void RegisterClientEvents(GridClient client)\r
+        {\r
+            client.Objects.TerseObjectUpdate += new EventHandler<TerseObjectUpdateEventArgs>(Objects_TerseObjectUpdate);\r
+            client.Objects.AvatarSitChanged += new EventHandler<AvatarSitChangedEventArgs>(Objects_AvatarSitChanged);\r
+            client.Self.AlertMessage += new EventHandler<AlertMessageEventArgs>(Self_AlertMessage);\r
+            client.Self.TeleportProgress += new EventHandler<TeleportEventArgs>(Self_TeleportProgress);\r
+            client.Network.EventQueueRunning += new EventHandler<EventQueueRunningEventArgs>(Network_EventQueueRunning);\r
+        }\r
+\r
+        private void UnregisterClientEvents(GridClient client)\r
+        {\r
+            client.Objects.TerseObjectUpdate -= new EventHandler<TerseObjectUpdateEventArgs>(Objects_TerseObjectUpdate);\r
+            client.Objects.AvatarSitChanged -= new EventHandler<AvatarSitChangedEventArgs>(Objects_AvatarSitChanged);\r
+            client.Self.AlertMessage -= new EventHandler<AlertMessageEventArgs>(Self_AlertMessage);\r
+            client.Self.TeleportProgress -= new EventHandler<TeleportEventArgs>(Self_TeleportProgress);\r
+            client.Network.EventQueueRunning -= new EventHandler<EventQueueRunningEventArgs>(Network_EventQueueRunning);\r
+        }\r
+\r
+        public void Dispose()\r
+        {\r
+            netcom.ClientConnected -= new EventHandler<EventArgs>(netcom_ClientConnected);\r
+            netcom.ClientDisconnected -= new EventHandler<DisconnectedEventArgs>(netcom_ClientDisconnected);\r
+            netcom.ChatReceived -= new EventHandler<ChatEventArgs>(netcom_ChatReceived);\r
+            UnregisterClientEvents(client);\r
+            beamTimer.Dispose();\r
+            beamTimer = null;\r
+\r
+            if (lookAtTimer != null)\r
+            {\r
+                lookAtTimer.Dispose();\r
+                lookAtTimer = null;\r
+            }\r
+\r
+            if (walkTimer != null)\r
+            {\r
+                walkTimer.Dispose();\r
+                walkTimer = null;\r
+            }\r
+        }\r
+\r
+        void instance_ClientChanged(object sender, ClientChangedEventArgs e)\r
+        {\r
+            UnregisterClientEvents(e.OldClient);\r
+            RegisterClientEvents(client);\r
+        }\r
+\r
+        void Objects_AvatarSitChanged(object sender, AvatarSitChangedEventArgs e)\r
+        {\r
+            if (e.Avatar.LocalID != client.Self.LocalID) return;\r
+\r
+            this.sitting = e.SittingOn != 0;\r
+            if (SitStateChanged != null)\r
+            {\r
+                SitStateChanged(this, new SitEventArgs(this.sitting));\r
+            }\r
+        }\r
+\r
+        /// <summary>\r
+        /// Locates avatar in the current sim, or adjacents sims\r
+        /// </summary>\r
+        /// <param name="person">Avatar UUID</param>\r
+        /// <param name="sim">Simulator avatar is in</param>\r
+        /// <param name="position">Position within sim</param>\r
+        /// <returns>True if managed to find the avatar</returns>\r
+        public bool TryFindAvatar(UUID person, out Simulator sim, out Vector3 position)\r
+        {\r
+            sim = null;\r
+            position = Vector3.Zero;\r
+\r
+            Avatar avi = null;\r
+\r
+            // First try the objecct tracker\r
+            for (int i = 0; i < client.Network.Simulators.Count; i++)\r
+            {\r
+                avi = client.Network.Simulators[i].ObjectsAvatars.Find((Avatar av) => { return av.ID == person; });\r
+                if (avi != null)\r
+                {\r
+                    sim = client.Network.Simulators[i];\r
+                    break;\r
+                }\r
+            }\r
+\r
+            if (avi != null)\r
+            {\r
+                if (avi.ParentID == 0)\r
+                {\r
+                    position = avi.Position;\r
+                }\r
+                else\r
+                {\r
+                    Primitive seat;\r
+                    if (sim.ObjectsPrimitives.TryGetValue(avi.ParentID, out seat))\r
+                    {\r
+                        position = seat.Position + avi.Position;\r
+                    }\r
+                }\r
+            }\r
+            else\r
+            {\r
+                for (int i = 0; i < client.Network.Simulators.Count; i++)\r
+                {\r
+                    if (client.Network.Simulators[i].AvatarPositions.ContainsKey(person))\r
+                    {\r
+                        sim = client.Network.Simulators[i];\r
+                        position = sim.AvatarPositions[person];\r
+                        break;\r
+                    }\r
+                }\r
+            }\r
+\r
+            if (position.Z > 0.1f)\r
+                return true;\r
+            else\r
+                return false;\r
+        }\r
+\r
+        public void SetRandomHeading()\r
+        {\r
+            client.Self.Movement.UpdateFromHeading(Utils.TWO_PI * rnd.NextDouble(), true);\r
+            LookInFront();\r
+        }\r
+\r
+        void Network_EventQueueRunning(object sender, EventQueueRunningEventArgs e)\r
+        {\r
+            if (e.Simulator == client.Network.CurrentSim)\r
+            {\r
+                SetRandomHeading();\r
+            }\r
+        }\r
+\r
+        private UUID teleportEffect = UUID.Random();\r
+\r
+        void Self_TeleportProgress(object sender, TeleportEventArgs e)\r
+        {\r
+            if (!client.Network.Connected) return;\r
+\r
+            if (e.Status == TeleportStatus.Progress)\r
+            {\r
+                client.Self.SphereEffect(client.Self.GlobalPosition, Color4.White, 4f, teleportEffect);\r
+            }\r
+\r
+            if (e.Status == TeleportStatus.Finished)\r
+            {\r
+                client.Self.SphereEffect(Vector3d.Zero, Color4.White, 0f, teleportEffect);\r
+                SetRandomHeading();\r
+            }\r
+\r
+            if (e.Status == TeleportStatus.Failed)\r
+            {\r
+                client.Self.SphereEffect(Vector3d.Zero, Color4.White, 0f, teleportEffect);\r
+            }\r
+        }\r
+\r
+        void netcom_ClientDisconnected(object sender, DisconnectedEventArgs e)\r
+        {\r
+            typing = away = busy = walking = false;\r
+\r
+            if (lookAtTimer != null)\r
+            {\r
+                lookAtTimer.Dispose();\r
+                lookAtTimer = null;\r
+            }\r
+\r
+        }\r
+\r
+        void netcom_ClientConnected(object sender, EventArgs e)\r
+        {\r
+            if (!instance.GlobalSettings.ContainsKey("draw_distance"))\r
+            {\r
+                instance.GlobalSettings["draw_distance"] = 48;\r
+            }\r
+\r
+            client.Self.Movement.Camera.Far = instance.GlobalSettings["draw_distance"];\r
+\r
+            if (lookAtTimer == null)\r
+            {\r
+                lookAtTimer = new System.Threading.Timer(new TimerCallback(lookAtTimerTick), null, Timeout.Infinite, Timeout.Infinite);\r
+            }\r
+        }\r
+\r
+        void Objects_TerseObjectUpdate(object sender, TerseObjectUpdateEventArgs e)\r
+        {\r
+            if (!e.Update.Avatar) return;\r
+            if (!following) return;\r
+\r
+            Avatar av;\r
+            client.Network.CurrentSim.ObjectsAvatars.TryGetValue(e.Update.LocalID, out av);\r
+            if (av == null) return;\r
+\r
+            if (av.ID == followID)\r
+            {\r
+                Vector3 pos = AvatarPosition(client.Network.CurrentSim, av);\r
+\r
+                FollowUpdate(pos);\r
+            }\r
+        }\r
+\r
+        void FollowUpdate(Vector3 pos)\r
+        {\r
+            if (Vector3.Distance(pos, client.Self.SimPosition) > followDistance)\r
+            {\r
+                Vector3 target = pos + Vector3.Normalize(client.Self.SimPosition - pos) * (followDistance - 1f);\r
+                client.Self.AutoPilotCancel();\r
+                Vector3d glb = GlobalPosition(client.Network.CurrentSim, target);\r
+                client.Self.AutoPilot(glb.X, glb.Y, glb.Z);\r
+            }\r
+            else\r
+            {\r
+                client.Self.AutoPilotCancel();\r
+                client.Self.Movement.TurnToward(pos);\r
+            }\r
+        }\r
+\r
+        public Quaternion AvatarRotation(Simulator sim, UUID avID)\r
+        {\r
+            Quaternion rot = Quaternion.Identity;\r
+            Avatar av = sim.ObjectsAvatars.Find((Avatar a) => { return a.ID == avID; });\r
+\r
+            if (av == null)\r
+                return rot;\r
+\r
+            if (av.ParentID == 0)\r
+            {\r
+                rot = av.Rotation;\r
+            }\r
+            else\r
+            {\r
+                Primitive prim;\r
+                if (sim.ObjectsPrimitives.TryGetValue(av.ParentID, out prim))\r
+                {\r
+                    rot = prim.Rotation + av.Rotation;\r
+                }\r
+            }\r
+\r
+            return rot;\r
+        }\r
+\r
+\r
+        public Vector3 AvatarPosition(Simulator sim, UUID avID)\r
+        {\r
+            Vector3 pos = Vector3.Zero;\r
+            Avatar av = sim.ObjectsAvatars.Find((Avatar a) => { return a.ID == avID; });\r
+            if (av != null)\r
+            {\r
+                return AvatarPosition(sim, av);\r
+            }\r
+            else\r
+            {\r
+                Vector3 coarse;\r
+                if (sim.AvatarPositions.TryGetValue(avID, out coarse))\r
+                {\r
+                    if (coarse.Z > 0.01)\r
+                        return coarse;\r
+                }\r
+            }\r
+            return pos;\r
+        }\r
+\r
+        public Vector3 AvatarPosition(Simulator sim, Avatar av)\r
+        {\r
+            Vector3 pos = Vector3.Zero;\r
+\r
+            if (av.ParentID == 0)\r
+            {\r
+                pos = av.Position;\r
+            }\r
+            else\r
+            {\r
+                Primitive prim;\r
+                if (sim.ObjectsPrimitives.TryGetValue(av.ParentID, out prim))\r
+                {\r
+                    pos = prim.Position + av.Position;\r
+                }\r
+            }\r
+\r
+            return pos;\r
+        }\r
+\r
+        public void Follow(string name, UUID id)\r
+        {\r
+            followName = name;\r
+            followID = id;\r
+            following = followID != UUID.Zero;\r
+\r
+            if (following)\r
+            {\r
+                walking = false;\r
+\r
+                Vector3 target = AvatarPosition(client.Network.CurrentSim, id);\r
+                if (Vector3.Zero != target)\r
+                {\r
+                    client.Self.Movement.TurnToward(target);\r
+                    FollowUpdate(target);\r
+                }\r
+\r
+            }\r
+        }\r
+\r
+        public void StopFollowing()\r
+        {\r
+            following = false;\r
+            followName = string.Empty;\r
+            followID = UUID.Zero;\r
+        }\r
+\r
+        #region Look at effect\r
+        private int lastLookAtEffect = 0;\r
+        private UUID lookAtEffect = UUID.Random();\r
+\r
+        /// <summary>\r
+        /// Set eye focus 3m in front of us\r
+        /// </summary>\r
+        public void LookInFront()\r
+        {\r
+            if (!client.Network.Connected || instance.GlobalSettings["disable_look_at"]) return;\r
+\r
+            client.Self.LookAtEffect(client.Self.AgentID, client.Self.AgentID,\r
+                new Vector3d(new Vector3(3, 0, 0) * Quaternion.Identity),\r
+                LookAtType.Idle, lookAtEffect);\r
+        }\r
+\r
+        void lookAtTimerTick(object state)\r
+        {\r
+            LookInFront();\r
+        }\r
+\r
+        void netcom_ChatReceived(object sender, ChatEventArgs e)\r
+        {\r
+            if (!instance.GlobalSettings["disable_look_at"]\r
+                && e.SourceID != client.Self.AgentID\r
+                && (e.SourceType == ChatSourceType.Agent || e.Type == ChatType.StartTyping))\r
+            {\r
+                // change focus max every 4 seconds\r
+                if (Environment.TickCount - lastLookAtEffect > 4000)\r
+                {\r
+                    lastLookAtEffect = Environment.TickCount;\r
+                    client.Self.LookAtEffect(client.Self.AgentID, e.SourceID, Vector3d.Zero, LookAtType.Respond, lookAtEffect);\r
+                    // keep looking at the speaker for 10 seconds\r
+                    if (lookAtTimer != null)\r
+                    {\r
+                        lookAtTimer.Change(10000, Timeout.Infinite);\r
+                    }\r
+                }\r
+            }\r
+        }\r
+        #endregion Look at effect\r
+\r
+        #region Walking (move to)\r
+        private bool walking = false;\r
+        private System.Threading.Timer walkTimer;\r
+        private int walkChekInterval = 500;\r
+        private Vector3d walkToTarget;\r
+        int lastDistance = 0;\r
+        int lastDistanceChanged = 0;\r
+\r
+        public void WalkTo(Primitive prim)\r
+        {\r
+            WalkTo(GlobalPosition(prim));\r
+        }\r
+\r
+        public void WalkTo(Vector3d globalPos)\r
+        {\r
+            walkToTarget = globalPos;\r
+\r
+            if (following)\r
+            {\r
+                following = false;\r
+                followName = string.Empty;\r
+            }\r
+\r
+            if (walkTimer == null)\r
+            {\r
+                walkTimer = new System.Threading.Timer(new TimerCallback(walkTimerElapsed), null, walkChekInterval, Timeout.Infinite);\r
+            }\r
+\r
+            lastDistanceChanged = System.Environment.TickCount;\r
+            client.Self.AutoPilotCancel();\r
+            walking = true;\r
+            client.Self.AutoPilot(walkToTarget.X, walkToTarget.Y, walkToTarget.Z);\r
+            FireWalkStateCanged();\r
+        }\r
+\r
+        void walkTimerElapsed(object sender)\r
+        {\r
+\r
+            double distance = Vector3d.Distance(client.Self.GlobalPosition, walkToTarget);\r
+\r
+            if (distance < 2d)\r
+            {\r
+                // We're there\r
+                EndWalking();\r
+            }\r
+            else\r
+            {\r
+                if (lastDistance != (int)distance)\r
+                {\r
+                    lastDistanceChanged = System.Environment.TickCount;\r
+                    lastDistance = (int)distance;\r
+                }\r
+                else if ((System.Environment.TickCount - lastDistanceChanged) > 10000)\r
+                {\r
+                    // Our distance to the target has not changed in 10s, give up\r
+                    EndWalking();\r
+                    return;\r
+                }\r
+                walkTimer.Change(walkChekInterval, Timeout.Infinite);\r
+            }\r
+        }\r
+\r
+        void Self_AlertMessage(object sender, AlertMessageEventArgs e)\r
+        {\r
+            if (e.Message.Contains("Autopilot cancel"))\r
+            {\r
+                if (walking)\r
+                {\r
+                    EndWalking();\r
+                }\r
+            }\r
+        }\r
+\r
+        void FireWalkStateCanged()\r
+        {\r
+            if (OnWalkStateCanged != null)\r
+            {\r
+                try { OnWalkStateCanged(walking); }\r
+                catch (Exception) { }\r
+            }\r
+        }\r
+\r
+        public void EndWalking()\r
+        {\r
+            if (walking)\r
+            {\r
+                walking = false;\r
+                Logger.Log("Finished walking.", Helpers.LogLevel.Debug, client);\r
+                walkTimer.Dispose();\r
+                walkTimer = null;\r
+                client.Self.AutoPilotCancel();\r
+                FireWalkStateCanged();\r
+            }\r
+        }\r
+        #endregion\r
+\r
+        public void SetTyping(bool typing)\r
+        {\r
+            if (!client.Network.Connected) return;\r
+\r
+            Dictionary<UUID, bool> typingAnim = new Dictionary<UUID, bool>();\r
+            typingAnim.Add(typingAnimationID, typing);\r
+\r
+            client.Self.Animate(typingAnim, false);\r
+\r
+            if (typing)\r
+                client.Self.Chat(string.Empty, 0, ChatType.StartTyping);\r
+            else\r
+                client.Self.Chat(string.Empty, 0, ChatType.StopTyping);\r
+\r
+            this.typing = typing;\r
+        }\r
+\r
+        public void SetAway(bool away)\r
+        {\r
+            Dictionary<UUID, bool> awayAnim = new Dictionary<UUID, bool>();\r
+            awayAnim.Add(awayAnimationID, away);\r
+\r
+            client.Self.Animate(awayAnim, true);\r
+            this.away = away;\r
+        }\r
+\r
+        public void SetBusy(bool busy)\r
+        {\r
+            Dictionary<UUID, bool> busyAnim = new Dictionary<UUID, bool>();\r
+            busyAnim.Add(busyAnimationID, busy);\r
+\r
+            client.Self.Animate(busyAnim, true);\r
+            this.busy = busy;\r
+        }\r
+\r
+        public void SetFlying(bool flying)\r
+        {\r
+            this.flying = client.Self.Movement.Fly = flying;\r
+        }\r
+\r
+        public void SetAlwaysRun(bool alwaysrun)\r
+        {\r
+            this.alwaysrun = client.Self.Movement.AlwaysRun = alwaysrun;\r
+        }\r
+\r
+        public void SetSitting(bool sitting, UUID target)\r
+        {\r
+            this.sitting = sitting;\r
+\r
+            if (sitting)\r
+            {\r
+                client.Self.RequestSit(target, Vector3.Zero);\r
+                client.Self.Sit();\r
+            }\r
+            else\r
+            {\r
+                client.Self.Stand();\r
+            }\r
+\r
+            if (SitStateChanged != null)\r
+            {\r
+                SitStateChanged(this, new SitEventArgs(this.sitting));\r
+            }\r
+\r
+            if (!this.sitting)\r
+            {\r
+                StopAllAnimations();\r
+            }\r
+        }\r
+\r
+        public void StopAllAnimations()\r
+        {\r
+            Dictionary<UUID, bool> stop = new Dictionary<UUID, bool>();\r
+\r
+            client.Self.SignaledAnimations.ForEach((UUID anim) =>\r
+            {\r
+                if (!KnownAnimations.ContainsKey(anim))\r
+                {\r
+                    stop.Add(anim, false);\r
+                }\r
+            });\r
+\r
+            if (stop.Count > 0)\r
+            {\r
+                client.Self.Animate(stop, true);\r
+            }\r
+        }\r
+\r
+        public Vector3d GlobalPosition(Simulator sim, Vector3 pos)\r
+        {\r
+            uint globalX, globalY;\r
+            Utils.LongToUInts(sim.Handle, out globalX, out globalY);\r
+\r
+            return new Vector3d(\r
+                (double)globalX + (double)pos.X,\r
+                (double)globalY + (double)pos.Y,\r
+                (double)pos.Z);\r
+        }\r
+\r
+        public Vector3d GlobalPosition(Primitive prim)\r
+        {\r
+            return GlobalPosition(client.Network.CurrentSim, prim.Position);\r
+        }\r
+\r
+        private System.Timers.Timer beamTimer;\r
+        private List<Vector3d> beamTarget;\r
+        private Random beamRandom = new Random();\r
+        private UUID pointID;\r
+        private UUID sphereID;\r
+        private List<UUID> beamID;\r
+        private int numBeans;\r
+        private Color4[] beamColors = new Color4[3] { new Color4(0, 255, 0, 255), new Color4(255, 0, 0, 255), new Color4(0, 0, 255, 255) };\r
+        private Primitive targetPrim;\r
+\r
+        public void UnSetPointing()\r
+        {\r
+            beamTimer.Enabled = false;\r
+            if (pointID != UUID.Zero)\r
+            {\r
+                client.Self.PointAtEffect(client.Self.AgentID, UUID.Zero, Vector3d.Zero, PointAtType.None, pointID);\r
+                pointID = UUID.Zero;\r
+            }\r
+\r
+            if (beamID != null)\r
+            {\r
+                foreach (UUID id in beamID)\r
+                {\r
+                    client.Self.BeamEffect(UUID.Zero, UUID.Zero, Vector3d.Zero, new Color4(255, 255, 255, 255), 0, id);\r
+                }\r
+                beamID = null;\r
+            }\r
+\r
+            if (sphereID != UUID.Zero)\r
+            {\r
+                client.Self.SphereEffect(Vector3d.Zero, Color4.White, 0, sphereID);\r
+                sphereID = UUID.Zero;\r
+            }\r
+\r
+        }\r
+\r
+        void beamTimer_Elapsed(object sender, EventArgs e)\r
+        {\r
+            if (beamID == null) return;\r
+\r
+            try\r
+            {\r
+                client.Self.SphereEffect(GlobalPosition(targetPrim), beamColors[beamRandom.Next(0, 3)], 0.85f, sphereID);\r
+                int i = 0;\r
+                for (i = 0; i < numBeans; i++)\r
+                {\r
+                    UUID newBeam = UUID.Random();\r
+                    Vector3d scatter;\r
+\r
+                    if (i == 0)\r
+                    {\r
+                        scatter = GlobalPosition(targetPrim);\r
+                    }\r
+                    else\r
+                    {\r
+                        Vector3d direction = client.Self.GlobalPosition - GlobalPosition(targetPrim);\r
+                        Vector3d cross = direction % new Vector3d(0, 0, 1);\r
+                        cross.Normalize();\r
+                        scatter = GlobalPosition(targetPrim) + cross * (i * 0.2d) * (i % 2 == 0 ? 1 : -1);\r
+                    }\r
+                    client.Self.BeamEffect(client.Self.AgentID, UUID.Zero, scatter, beamColors[beamRandom.Next(0, 3)], 1.0f, beamID[i]);\r
+                }\r
+\r
+                for (int j = 1; j < numBeans; j++)\r
+                {\r
+                    UUID newBeam = UUID.Random();\r
+                    Vector3d scatter;\r
+                    Vector3d cross = new Vector3d(0, 0, 1);\r
+                    cross.Normalize();\r
+                    scatter = GlobalPosition(targetPrim) + cross * (j * 0.2d) * (j % 2 == 0 ? 1 : -1);\r
+\r
+                    client.Self.BeamEffect(client.Self.AgentID, UUID.Zero, scatter, beamColors[beamRandom.Next(0, 3)], 1.0f, beamID[j + i - 1]);\r
+                }\r
+            }\r
+            catch (Exception) { };\r
+\r
+        }\r
+\r
+        public void SetPointing(Primitive prim, int numBeans)\r
+        {\r
+            UnSetPointing();\r
+            client.Self.Movement.TurnToward(prim.Position);\r
+            pointID = UUID.Random();\r
+            sphereID = UUID.Random();\r
+            beamID = new List<UUID>();\r
+            beamTarget = new List<Vector3d>();\r
+            targetPrim = prim;\r
+            this.numBeans = numBeans;\r
+\r
+            client.Self.PointAtEffect(client.Self.AgentID, prim.ID, Vector3d.Zero, PointAtType.Select, pointID);\r
+\r
+            for (int i = 0; i < numBeans; i++)\r
+            {\r
+                UUID newBeam = UUID.Random();\r
+                beamID.Add(newBeam);\r
+                beamTarget.Add(Vector3d.Zero);\r
+            }\r
+\r
+            for (int i = 1; i < numBeans; i++)\r
+            {\r
+                UUID newBeam = UUID.Random();\r
+                beamID.Add(newBeam);\r
+                beamTarget.Add(Vector3d.Zero);\r
+            }\r
+\r
+            beamTimer.Interval = 1000;\r
+            beamTimer.Enabled = true;\r
+        }\r
+\r
+        public UUID TypingAnimationID\r
+        {\r
+            get { return typingAnimationID; }\r
+            set { typingAnimationID = value; }\r
+        }\r
+\r
+        public UUID AwayAnimationID\r
+        {\r
+            get { return awayAnimationID; }\r
+            set { awayAnimationID = value; }\r
+        }\r
+\r
+        public UUID BusyAnimationID\r
+        {\r
+            get { return busyAnimationID; }\r
+            set { busyAnimationID = value; }\r
+        }\r
+\r
+        public bool IsTyping\r
+        {\r
+            get { return typing; }\r
+        }\r
+\r
+        public bool IsAway\r
+        {\r
+            get { return away; }\r
+        }\r
+\r
+        public bool IsBusy\r
+        {\r
+            get { return busy; }\r
+        }\r
+\r
+        public bool IsFlying\r
+        {\r
+            get { return flying; }\r
+        }\r
+\r
+        public bool IsSitting\r
+        {\r
+            get { return sitting; }\r
+        }\r
+\r
+        public bool IsPointing\r
+        {\r
+            get { return pointID != UUID.Zero; }\r
+        }\r
+\r
+        public bool IsFollowing\r
+        {\r
+            get { return following; }\r
+        }\r
+\r
+        public string FollowName\r
+        {\r
+            get { return followName; }\r
+            set { followName = value; }\r
+        }\r
+\r
+        public float FollowDistance\r
+        {\r
+            get { return followDistance; }\r
+            set { followDistance = value; }\r
+        }\r
+\r
+        public bool IsWalking\r
+        {\r
+            get { return walking; }\r
+        }\r
+    }\r
+\r
+    public class SitEventArgs : EventArgs\r
+    {\r
+        public bool Sitting;\r
+\r
+        public SitEventArgs(bool sitting)\r
+        {\r
+            this.Sitting = sitting;\r
+        }\r
+    }\r
+}\r
index 5c7635f..dc6bb0c 100644 (file)
@@ -58,524 +58,536 @@ namespace Radegast
         /// </summary>
         private void InitializeComponent()
         {
-            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(frmSettings));
-            this.tcGraphics = new System.Windows.Forms.TabControl();
-            this.tbpGeneral = new System.Windows.Forms.TabPage();
-            this.cbRadegastLogToFile = new System.Windows.Forms.CheckBox();
-            this.Chat = new System.Windows.Forms.GroupBox();
-            this.cbChatTimestamps = new System.Windows.Forms.CheckBox();
-            this.cbIMTimeStamps = new System.Windows.Forms.CheckBox();
-            this.cbFriendsHighlight = new System.Windows.Forms.CheckBox();
-            this.cbMUEmotes = new System.Windows.Forms.CheckBox();
-            this.cbNoTyping = new System.Windows.Forms.CheckBox();
-            this.cbTaskBarHighLight = new System.Windows.Forms.CheckBox();
-            this.cbFontSize = new System.Windows.Forms.ComboBox();
-            this.label1 = new System.Windows.Forms.Label();
-            this.txtReconnectTime = new System.Windows.Forms.TextBox();
-            this.label2 = new System.Windows.Forms.Label();
-            this.gbDisplayNames = new System.Windows.Forms.GroupBox();
-            this.rbDNOnlyDN = new System.Windows.Forms.RadioButton();
-            this.rbDNDandUsernme = new System.Windows.Forms.RadioButton();
-            this.rbDNSmart = new System.Windows.Forms.RadioButton();
-            this.rbDNOff = new System.Windows.Forms.RadioButton();
-            this.cbRadegastClientTag = new System.Windows.Forms.CheckBox();
-            this.cbSyntaxHighlight = new System.Windows.Forms.CheckBox();
-            this.cbMinToTrey = new System.Windows.Forms.CheckBox();
-            this.cbRLV = new System.Windows.Forms.CheckBox();
-            this.cbHideLoginGraphics = new System.Windows.Forms.CheckBox();
-            this.cbAutoReconnect = new System.Windows.Forms.CheckBox();
-            this.cbFriendsNotifications = new System.Windows.Forms.CheckBox();
-            this.cbTrasactChat = new System.Windows.Forms.CheckBox();
-            this.cbTrasactDialog = new System.Windows.Forms.CheckBox();
-            this.tbpAutoResponse = new System.Windows.Forms.TabPage();
-            this.gnAutoInventory = new System.Windows.Forms.GroupBox();
-            this.cbOnInvOffer = new System.Windows.Forms.ComboBox();
-            this.txtAutoResponse = new System.Windows.Forms.TextBox();
-            this.gbAutoResponse = new System.Windows.Forms.GroupBox();
-            this.rbAutoAlways = new System.Windows.Forms.RadioButton();
-            this.rbAutoNonFriend = new System.Windows.Forms.RadioButton();
-            this.rbAutobusy = new System.Windows.Forms.RadioButton();
-            this.tbpGraphics = new System.Windows.Forms.TabPage();
-            this.cbDisableChatIMLog = new System.Windows.Forms.CheckBox();
-            this.tcGraphics.SuspendLayout();
-            this.tbpGeneral.SuspendLayout();
-            this.Chat.SuspendLayout();
-            this.gbDisplayNames.SuspendLayout();
-            this.tbpAutoResponse.SuspendLayout();
-            this.gnAutoInventory.SuspendLayout();
-            this.gbAutoResponse.SuspendLayout();
-            this.SuspendLayout();
-            // 
-            // tcGraphics
-            // 
-            this.tcGraphics.Controls.Add(this.tbpGeneral);
-            this.tcGraphics.Controls.Add(this.tbpAutoResponse);
-            this.tcGraphics.Controls.Add(this.tbpGraphics);
-            this.tcGraphics.Dock = System.Windows.Forms.DockStyle.Fill;
-            this.tcGraphics.Location = new System.Drawing.Point(0, 0);
-            this.tcGraphics.Multiline = true;
-            this.tcGraphics.Name = "tcGraphics";
-            this.tcGraphics.SelectedIndex = 0;
-            this.tcGraphics.Size = new System.Drawing.Size(496, 324);
-            this.tcGraphics.TabIndex = 0;
-            // 
-            // tbpGeneral
-            // 
-            this.tbpGeneral.Controls.Add(this.cbRadegastLogToFile);
-            this.tbpGeneral.Controls.Add(this.Chat);
-            this.tbpGeneral.Controls.Add(this.txtReconnectTime);
-            this.tbpGeneral.Controls.Add(this.label2);
-            this.tbpGeneral.Controls.Add(this.gbDisplayNames);
-            this.tbpGeneral.Controls.Add(this.cbRadegastClientTag);
-            this.tbpGeneral.Controls.Add(this.cbSyntaxHighlight);
-            this.tbpGeneral.Controls.Add(this.cbMinToTrey);
-            this.tbpGeneral.Controls.Add(this.cbRLV);
-            this.tbpGeneral.Controls.Add(this.cbHideLoginGraphics);
-            this.tbpGeneral.Controls.Add(this.cbAutoReconnect);
-            this.tbpGeneral.Controls.Add(this.cbFriendsNotifications);
-            this.tbpGeneral.Controls.Add(this.cbTrasactChat);
-            this.tbpGeneral.Controls.Add(this.cbTrasactDialog);
-            this.tbpGeneral.Location = new System.Drawing.Point(4, 22);
-            this.tbpGeneral.Name = "tbpGeneral";
-            this.tbpGeneral.Padding = new System.Windows.Forms.Padding(3);
-            this.tbpGeneral.Size = new System.Drawing.Size(488, 298);
-            this.tbpGeneral.TabIndex = 1;
-            this.tbpGeneral.Text = "General";
-            this.tbpGeneral.UseVisualStyleBackColor = true;
-            // 
-            // cbRadegastLogToFile
-            // 
-            this.cbRadegastLogToFile.AutoSize = true;
-            this.cbRadegastLogToFile.Location = new System.Drawing.Point(275, 220);
-            this.cbRadegastLogToFile.Name = "cbRadegastLogToFile";
-            this.cbRadegastLogToFile.Size = new System.Drawing.Size(72, 17);
-            this.cbRadegastLogToFile.TabIndex = 14;
-            this.cbRadegastLogToFile.Text = "Log to file";
-            this.cbRadegastLogToFile.UseVisualStyleBackColor = true;
-            this.cbRadegastLogToFile.CheckedChanged += new System.EventHandler(this.cbRadegastLogToFile_CheckedChanged);
-            // 
-            // Chat
-            // 
-            this.Chat.Controls.Add(this.cbDisableChatIMLog);
-            this.Chat.Controls.Add(this.cbChatTimestamps);
-            this.Chat.Controls.Add(this.cbIMTimeStamps);
-            this.Chat.Controls.Add(this.cbFriendsHighlight);
-            this.Chat.Controls.Add(this.cbMUEmotes);
-            this.Chat.Controls.Add(this.cbNoTyping);
-            this.Chat.Controls.Add(this.cbTaskBarHighLight);
-            this.Chat.Controls.Add(this.cbFontSize);
-            this.Chat.Controls.Add(this.label1);
-            this.Chat.Location = new System.Drawing.Point(8, 5);
-            this.Chat.Name = "Chat";
-            this.Chat.Size = new System.Drawing.Size(256, 181);
-            this.Chat.TabIndex = 0;
-            this.Chat.TabStop = false;
-            this.Chat.Text = "Chat";
-            // 
-            // cbChatTimestamps
-            // 
-            this.cbChatTimestamps.AutoSize = true;
-            this.cbChatTimestamps.Location = new System.Drawing.Point(8, 12);
-            this.cbChatTimestamps.Name = "cbChatTimestamps";
-            this.cbChatTimestamps.Size = new System.Drawing.Size(143, 17);
-            this.cbChatTimestamps.TabIndex = 0;
-            this.cbChatTimestamps.Text = "Show timestamps in chat";
-            this.cbChatTimestamps.UseVisualStyleBackColor = true;
-            // 
-            // cbIMTimeStamps
-            // 
-            this.cbIMTimeStamps.AutoSize = true;
-            this.cbIMTimeStamps.Location = new System.Drawing.Point(8, 35);
-            this.cbIMTimeStamps.Name = "cbIMTimeStamps";
-            this.cbIMTimeStamps.Size = new System.Drawing.Size(137, 17);
-            this.cbIMTimeStamps.TabIndex = 1;
-            this.cbIMTimeStamps.Text = "Show timestamps in  IM";
-            this.cbIMTimeStamps.UseVisualStyleBackColor = true;
-            // 
-            // cbFriendsHighlight
-            // 
-            this.cbFriendsHighlight.AutoSize = true;
-            this.cbFriendsHighlight.Location = new System.Drawing.Point(8, 75);
-            this.cbFriendsHighlight.Name = "cbFriendsHighlight";
-            this.cbFriendsHighlight.Size = new System.Drawing.Size(248, 17);
-            this.cbFriendsHighlight.TabIndex = 4;
-            this.cbFriendsHighlight.Text = "Highlight chat tab on friends online notifications";
-            this.cbFriendsHighlight.UseVisualStyleBackColor = true;
-            this.cbFriendsHighlight.CheckedChanged += new System.EventHandler(this.cbTrasactChat_CheckedChanged);
-            // 
-            // cbMUEmotes
-            // 
-            this.cbMUEmotes.AutoSize = true;
-            this.cbMUEmotes.Location = new System.Drawing.Point(8, 95);
-            this.cbMUEmotes.Name = "cbMUEmotes";
-            this.cbMUEmotes.Size = new System.Drawing.Size(108, 17);
-            this.cbMUEmotes.TabIndex = 5;
-            this.cbMUEmotes.Text = "MU* style emotes";
-            this.cbMUEmotes.UseVisualStyleBackColor = true;
-            this.cbMUEmotes.CheckedChanged += new System.EventHandler(this.cbTrasactChat_CheckedChanged);
-            // 
-            // cbNoTyping
-            // 
-            this.cbNoTyping.AutoSize = true;
-            this.cbNoTyping.Location = new System.Drawing.Point(8, 115);
-            this.cbNoTyping.Name = "cbNoTyping";
-            this.cbNoTyping.Size = new System.Drawing.Size(150, 17);
-            this.cbNoTyping.TabIndex = 6;
-            this.cbNoTyping.Text = "Don\'t use typing animation";
-            this.cbNoTyping.UseVisualStyleBackColor = true;
-            this.cbNoTyping.CheckedChanged += new System.EventHandler(this.cbTrasactChat_CheckedChanged);
-            // 
-            // cbTaskBarHighLight
-            // 
-            this.cbTaskBarHighLight.AutoSize = true;
-            this.cbTaskBarHighLight.Location = new System.Drawing.Point(8, 135);
-            this.cbTaskBarHighLight.Name = "cbTaskBarHighLight";
-            this.cbTaskBarHighLight.Size = new System.Drawing.Size(155, 17);
-            this.cbTaskBarHighLight.TabIndex = 7;
-            this.cbTaskBarHighLight.Text = "Highlight in taskbar on chat";
-            this.cbTaskBarHighLight.UseVisualStyleBackColor = true;
-            // 
-            // cbFontSize
-            // 
-            this.cbFontSize.FormatString = "N2";
-            this.cbFontSize.FormattingEnabled = true;
-            this.cbFontSize.Items.AddRange(new object[] {
-            "8.25",
-            "9",
-            "10",
-            "12",
-            "14",
-            "16",
-            "20"});
-            this.cbFontSize.Location = new System.Drawing.Point(97, 51);
-            this.cbFontSize.Name = "cbFontSize";
-            this.cbFontSize.Size = new System.Drawing.Size(54, 21);
-            this.cbFontSize.TabIndex = 3;
-            this.cbFontSize.Text = "8.25";
-            this.cbFontSize.SelectedIndexChanged += new System.EventHandler(this.cbFontSize_SelectedIndexChanged);
-            this.cbFontSize.Leave += new System.EventHandler(this.cbFontSize_Leave);
-            this.cbFontSize.KeyDown += new System.Windows.Forms.KeyEventHandler(this.cbFontSize_KeyDown);
-            // 
-            // label1
-            // 
-            this.label1.AutoSize = true;
-            this.label1.Location = new System.Drawing.Point(24, 54);
-            this.label1.Name = "label1";
-            this.label1.Size = new System.Drawing.Size(73, 13);
-            this.label1.TabIndex = 2;
-            this.label1.Text = "Chat text size:";
-            // 
-            // txtReconnectTime
-            // 
-            this.txtReconnectTime.Location = new System.Drawing.Point(420, 97);
-            this.txtReconnectTime.Name = "txtReconnectTime";
-            this.txtReconnectTime.Size = new System.Drawing.Size(53, 20);
-            this.txtReconnectTime.TabIndex = 8;
-            this.txtReconnectTime.Text = "120";
-            this.txtReconnectTime.TextChanged += new System.EventHandler(this.txtReconnectTime_TextChanged);
-            // 
-            // label2
-            // 
-            this.label2.AutoSize = true;
-            this.label2.Location = new System.Drawing.Point(291, 100);
-            this.label2.Name = "label2";
-            this.label2.Size = new System.Drawing.Size(128, 13);
-            this.label2.TabIndex = 7;
-            this.label2.Text = "Auto reconnect time (sec)";
-            // 
-            // gbDisplayNames
-            // 
-            this.gbDisplayNames.Controls.Add(this.rbDNOnlyDN);
-            this.gbDisplayNames.Controls.Add(this.rbDNDandUsernme);
-            this.gbDisplayNames.Controls.Add(this.rbDNSmart);
-            this.gbDisplayNames.Controls.Add(this.rbDNOff);
-            this.gbDisplayNames.Location = new System.Drawing.Point(8, 192);
-            this.gbDisplayNames.Name = "gbDisplayNames";
-            this.gbDisplayNames.Size = new System.Drawing.Size(256, 100);
-            this.gbDisplayNames.TabIndex = 1;
-            this.gbDisplayNames.TabStop = false;
-            this.gbDisplayNames.Text = "Display names";
-            // 
-            // rbDNOnlyDN
-            // 
-            this.rbDNOnlyDN.AutoSize = true;
-            this.rbDNOnlyDN.Location = new System.Drawing.Point(6, 75);
-            this.rbDNOnlyDN.Name = "rbDNOnlyDN";
-            this.rbDNOnlyDN.Size = new System.Drawing.Size(110, 17);
-            this.rbDNOnlyDN.TabIndex = 3;
-            this.rbDNOnlyDN.TabStop = true;
-            this.rbDNOnlyDN.Text = "Only display name";
-            this.rbDNOnlyDN.UseVisualStyleBackColor = true;
-            this.rbDNOnlyDN.CheckedChanged += new System.EventHandler(this.rbDNOnlyDN_CheckedChanged);
-            // 
-            // rbDNDandUsernme
-            // 
-            this.rbDNDandUsernme.AutoSize = true;
-            this.rbDNDandUsernme.Location = new System.Drawing.Point(6, 55);
-            this.rbDNDandUsernme.Name = "rbDNDandUsernme";
-            this.rbDNDandUsernme.Size = new System.Drawing.Size(143, 17);
-            this.rbDNDandUsernme.TabIndex = 2;
-            this.rbDNDandUsernme.TabStop = true;
-            this.rbDNDandUsernme.Text = "Display name (username)";
-            this.rbDNDandUsernme.UseVisualStyleBackColor = true;
-            this.rbDNDandUsernme.CheckedChanged += new System.EventHandler(this.rbDNDandUsernme_CheckedChanged);
-            // 
-            // rbDNSmart
-            // 
-            this.rbDNSmart.AutoSize = true;
-            this.rbDNSmart.Location = new System.Drawing.Point(6, 35);
-            this.rbDNSmart.Name = "rbDNSmart";
-            this.rbDNSmart.Size = new System.Drawing.Size(52, 17);
-            this.rbDNSmart.TabIndex = 1;
-            this.rbDNSmart.TabStop = true;
-            this.rbDNSmart.Text = "Smart";
-            this.rbDNSmart.UseVisualStyleBackColor = true;
-            this.rbDNSmart.CheckedChanged += new System.EventHandler(this.rbDNSmart_CheckedChanged);
-            // 
-            // rbDNOff
-            // 
-            this.rbDNOff.AutoSize = true;
-            this.rbDNOff.Location = new System.Drawing.Point(6, 15);
-            this.rbDNOff.Name = "rbDNOff";
-            this.rbDNOff.Size = new System.Drawing.Size(39, 17);
-            this.rbDNOff.TabIndex = 0;
-            this.rbDNOff.TabStop = true;
-            this.rbDNOff.Text = "Off";
-            this.rbDNOff.UseVisualStyleBackColor = true;
-            this.rbDNOff.CheckedChanged += new System.EventHandler(this.rbDNOff_CheckedChanged);
-            // 
-            // cbRadegastClientTag
-            // 
-            this.cbRadegastClientTag.AutoSize = true;
-            this.cbRadegastClientTag.Location = new System.Drawing.Point(275, 200);
-            this.cbRadegastClientTag.Name = "cbRadegastClientTag";
-            this.cbRadegastClientTag.Size = new System.Drawing.Size(146, 17);
-            this.cbRadegastClientTag.TabIndex = 13;
-            this.cbRadegastClientTag.Text = "Send Radegast client tag";
-            this.cbRadegastClientTag.UseVisualStyleBackColor = true;
-            // 
-            // cbSyntaxHighlight
-            // 
-            this.cbSyntaxHighlight.AutoSize = true;
-            this.cbSyntaxHighlight.Location = new System.Drawing.Point(275, 60);
-            this.cbSyntaxHighlight.Name = "cbSyntaxHighlight";
-            this.cbSyntaxHighlight.Size = new System.Drawing.Size(134, 17);
-            this.cbSyntaxHighlight.TabIndex = 5;
-            this.cbSyntaxHighlight.Text = "LSL syntax highlighting";
-            this.cbSyntaxHighlight.UseVisualStyleBackColor = true;
-            // 
-            // cbMinToTrey
-            // 
-            this.cbMinToTrey.AutoSize = true;
-            this.cbMinToTrey.Location = new System.Drawing.Point(275, 40);
-            this.cbMinToTrey.Name = "cbMinToTrey";
-            this.cbMinToTrey.Size = new System.Drawing.Size(133, 17);
-            this.cbMinToTrey.TabIndex = 4;
-            this.cbMinToTrey.Text = "Minimize to system tray";
-            this.cbMinToTrey.UseVisualStyleBackColor = true;
-            this.cbMinToTrey.CheckedChanged += new System.EventHandler(this.cbTrasactChat_CheckedChanged);
-            // 
-            // cbRLV
-            // 
-            this.cbRLV.AutoSize = true;
-            this.cbRLV.Location = new System.Drawing.Point(275, 180);
-            this.cbRLV.Name = "cbRLV";
-            this.cbRLV.Size = new System.Drawing.Size(85, 17);
-            this.cbRLV.TabIndex = 12;
-            this.cbRLV.Text = "RLV support";
-            this.cbRLV.UseVisualStyleBackColor = true;
-            this.cbRLV.CheckedChanged += new System.EventHandler(this.cbTrasactChat_CheckedChanged);
-            // 
-            // cbHideLoginGraphics
-            // 
-            this.cbHideLoginGraphics.AutoSize = true;
-            this.cbHideLoginGraphics.Location = new System.Drawing.Point(275, 20);
-            this.cbHideLoginGraphics.Name = "cbHideLoginGraphics";
-            this.cbHideLoginGraphics.Size = new System.Drawing.Size(141, 17);
-            this.cbHideLoginGraphics.TabIndex = 3;
-            this.cbHideLoginGraphics.Text = "Hide login slpash screen";
-            this.cbHideLoginGraphics.UseVisualStyleBackColor = true;
-            this.cbHideLoginGraphics.CheckedChanged += new System.EventHandler(this.cbTrasactChat_CheckedChanged);
-            // 
-            // cbAutoReconnect
-            // 
-            this.cbAutoReconnect.AutoSize = true;
-            this.cbAutoReconnect.Location = new System.Drawing.Point(275, 80);
-            this.cbAutoReconnect.Name = "cbAutoReconnect";
-            this.cbAutoReconnect.Size = new System.Drawing.Size(169, 17);
-            this.cbAutoReconnect.TabIndex = 6;
-            this.cbAutoReconnect.Text = "Auto reconnect on disconnect";
-            this.cbAutoReconnect.UseVisualStyleBackColor = true;
-            this.cbAutoReconnect.CheckedChanged += new System.EventHandler(this.cbTrasactChat_CheckedChanged);
-            // 
-            // cbFriendsNotifications
-            // 
-            this.cbFriendsNotifications.AutoSize = true;
-            this.cbFriendsNotifications.Location = new System.Drawing.Point(275, 160);
-            this.cbFriendsNotifications.Name = "cbFriendsNotifications";
-            this.cbFriendsNotifications.Size = new System.Drawing.Size(184, 17);
-            this.cbFriendsNotifications.TabIndex = 11;
-            this.cbFriendsNotifications.Text = "Display friends online notifications";
-            this.cbFriendsNotifications.UseVisualStyleBackColor = true;
-            this.cbFriendsNotifications.CheckedChanged += new System.EventHandler(this.cbTrasactChat_CheckedChanged);
-            // 
-            // cbTrasactChat
-            // 
-            this.cbTrasactChat.AutoSize = true;
-            this.cbTrasactChat.Location = new System.Drawing.Point(275, 140);
-            this.cbTrasactChat.Name = "cbTrasactChat";
-            this.cbTrasactChat.Size = new System.Drawing.Size(170, 17);
-            this.cbTrasactChat.TabIndex = 10;
-            this.cbTrasactChat.Text = "Display L$ transactions in chat";
-            this.cbTrasactChat.UseVisualStyleBackColor = true;
-            this.cbTrasactChat.CheckedChanged += new System.EventHandler(this.cbTrasactChat_CheckedChanged);
-            // 
-            // cbTrasactDialog
-            // 
-            this.cbTrasactDialog.AutoSize = true;
-            this.cbTrasactDialog.Location = new System.Drawing.Point(275, 120);
-            this.cbTrasactDialog.Name = "cbTrasactDialog";
-            this.cbTrasactDialog.Size = new System.Drawing.Size(176, 17);
-            this.cbTrasactDialog.TabIndex = 9;
-            this.cbTrasactDialog.Text = "Display dialog on L$ transaction";
-            this.cbTrasactDialog.UseVisualStyleBackColor = true;
-            this.cbTrasactDialog.CheckedChanged += new System.EventHandler(this.cbTrasactDialog_CheckedChanged);
-            // 
-            // tbpAutoResponse
-            // 
-            this.tbpAutoResponse.Controls.Add(this.gnAutoInventory);
-            this.tbpAutoResponse.Controls.Add(this.txtAutoResponse);
-            this.tbpAutoResponse.Controls.Add(this.gbAutoResponse);
-            this.tbpAutoResponse.Location = new System.Drawing.Point(4, 22);
-            this.tbpAutoResponse.Name = "tbpAutoResponse";
-            this.tbpAutoResponse.Padding = new System.Windows.Forms.Padding(3);
-            this.tbpAutoResponse.Size = new System.Drawing.Size(488, 298);
-            this.tbpAutoResponse.TabIndex = 2;
-            this.tbpAutoResponse.Text = "Auto Response";
-            this.tbpAutoResponse.UseVisualStyleBackColor = true;
-            // 
-            // gnAutoInventory
-            // 
-            this.gnAutoInventory.Controls.Add(this.cbOnInvOffer);
-            this.gnAutoInventory.Location = new System.Drawing.Point(9, 156);
-            this.gnAutoInventory.Name = "gnAutoInventory";
-            this.gnAutoInventory.Size = new System.Drawing.Size(281, 54);
-            this.gnAutoInventory.TabIndex = 2;
-            this.gnAutoInventory.TabStop = false;
-            this.gnAutoInventory.Text = "On inventory offers";
-            // 
-            // cbOnInvOffer
-            // 
-            this.cbOnInvOffer.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
-            this.cbOnInvOffer.FormattingEnabled = true;
-            this.cbOnInvOffer.Items.AddRange(new object[] {
-            "Ask",
-            "Auto Accept",
-            "Auto Discard"});
-            this.cbOnInvOffer.Location = new System.Drawing.Point(6, 19);
-            this.cbOnInvOffer.Name = "cbOnInvOffer";
-            this.cbOnInvOffer.Size = new System.Drawing.Size(121, 21);
-            this.cbOnInvOffer.TabIndex = 0;
-            // 
-            // txtAutoResponse
-            // 
-            this.txtAutoResponse.AccessibleName = "Auto response text";
-            this.txtAutoResponse.Location = new System.Drawing.Point(8, 63);
-            this.txtAutoResponse.Multiline = true;
-            this.txtAutoResponse.Name = "txtAutoResponse";
-            this.txtAutoResponse.Size = new System.Drawing.Size(282, 87);
-            this.txtAutoResponse.TabIndex = 1;
-            // 
-            // gbAutoResponse
-            // 
-            this.gbAutoResponse.Controls.Add(this.rbAutoAlways);
-            this.gbAutoResponse.Controls.Add(this.rbAutoNonFriend);
-            this.gbAutoResponse.Controls.Add(this.rbAutobusy);
-            this.gbAutoResponse.Location = new System.Drawing.Point(3, 6);
-            this.gbAutoResponse.Name = "gbAutoResponse";
-            this.gbAutoResponse.Size = new System.Drawing.Size(287, 51);
-            this.gbAutoResponse.TabIndex = 0;
-            this.gbAutoResponse.TabStop = false;
-            this.gbAutoResponse.Text = "Send auto response when:";
-            // 
-            // rbAutoAlways
-            // 
-            this.rbAutoAlways.AutoSize = true;
-            this.rbAutoAlways.Location = new System.Drawing.Point(216, 19);
-            this.rbAutoAlways.Name = "rbAutoAlways";
-            this.rbAutoAlways.Size = new System.Drawing.Size(58, 17);
-            this.rbAutoAlways.TabIndex = 2;
-            this.rbAutoAlways.Text = "Always";
-            this.rbAutoAlways.UseVisualStyleBackColor = true;
-            this.rbAutoAlways.CheckedChanged += new System.EventHandler(this.rbAutoAlways_CheckedChanged);
-            // 
-            // rbAutoNonFriend
-            // 
-            this.rbAutoNonFriend.AutoSize = true;
-            this.rbAutoNonFriend.Location = new System.Drawing.Point(100, 19);
-            this.rbAutoNonFriend.Name = "rbAutoNonFriend";
-            this.rbAutoNonFriend.Size = new System.Drawing.Size(110, 17);
-            this.rbAutoNonFriend.TabIndex = 1;
-            this.rbAutoNonFriend.Text = "IM from non-friend";
-            this.rbAutoNonFriend.UseVisualStyleBackColor = true;
-            this.rbAutoNonFriend.CheckedChanged += new System.EventHandler(this.rbAutoNonFriend_CheckedChanged);
-            // 
-            // rbAutobusy
-            // 
-            this.rbAutobusy.AutoSize = true;
-            this.rbAutobusy.Checked = true;
-            this.rbAutobusy.Location = new System.Drawing.Point(6, 19);
-            this.rbAutobusy.Name = "rbAutobusy";
-            this.rbAutobusy.Size = new System.Drawing.Size(88, 17);
-            this.rbAutobusy.TabIndex = 0;
-            this.rbAutobusy.TabStop = true;
-            this.rbAutobusy.Text = "In busy mode";
-            this.rbAutobusy.UseVisualStyleBackColor = true;
-            this.rbAutobusy.CheckedChanged += new System.EventHandler(this.rbAutobusy_CheckedChanged);
-            // 
-            // tbpGraphics
-            // 
-            this.tbpGraphics.Location = new System.Drawing.Point(4, 22);
-            this.tbpGraphics.Name = "tbpGraphics";
-            this.tbpGraphics.Padding = new System.Windows.Forms.Padding(3);
-            this.tbpGraphics.Size = new System.Drawing.Size(488, 298);
-            this.tbpGraphics.TabIndex = 3;
-            this.tbpGraphics.Text = "Graphics Settings";
-            this.tbpGraphics.UseVisualStyleBackColor = true;
-            // 
-            // cbDisableChatIMLog
-            // 
-            this.cbDisableChatIMLog.AutoSize = true;
-            this.cbDisableChatIMLog.Location = new System.Drawing.Point(8, 155);
-            this.cbDisableChatIMLog.Name = "cbDisableChatIMLog";
-            this.cbDisableChatIMLog.Size = new System.Drawing.Size(138, 17);
-            this.cbDisableChatIMLog.TabIndex = 8;
-            this.cbDisableChatIMLog.Text = "Disable chat and IM log";
-            this.cbDisableChatIMLog.UseVisualStyleBackColor = true;
-            // 
-            // frmSettings
-            // 
-            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
-            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
-            this.ClientSize = new System.Drawing.Size(496, 324);
-            this.Controls.Add(this.tcGraphics);
-            this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
-            this.Name = "frmSettings";
-            this.Text = "Settings - Radegast";
-            this.tcGraphics.ResumeLayout(false);
-            this.tbpGeneral.ResumeLayout(false);
-            this.tbpGeneral.PerformLayout();
-            this.Chat.ResumeLayout(false);
-            this.Chat.PerformLayout();
-            this.gbDisplayNames.ResumeLayout(false);
-            this.gbDisplayNames.PerformLayout();
-            this.tbpAutoResponse.ResumeLayout(false);
-            this.tbpAutoResponse.PerformLayout();
-            this.gnAutoInventory.ResumeLayout(false);
-            this.gbAutoResponse.ResumeLayout(false);
-            this.gbAutoResponse.PerformLayout();
-            this.ResumeLayout(false);
-
+            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(frmSettings));\r
+            this.tcGraphics = new System.Windows.Forms.TabControl();\r
+            this.tbpGeneral = new System.Windows.Forms.TabPage();\r
+            this.cbRadegastLogToFile = new System.Windows.Forms.CheckBox();\r
+            this.Chat = new System.Windows.Forms.GroupBox();\r
+            this.cbDisableChatIMLog = new System.Windows.Forms.CheckBox();\r
+            this.cbChatTimestamps = new System.Windows.Forms.CheckBox();\r
+            this.cbIMTimeStamps = new System.Windows.Forms.CheckBox();\r
+            this.cbFriendsHighlight = new System.Windows.Forms.CheckBox();\r
+            this.cbMUEmotes = new System.Windows.Forms.CheckBox();\r
+            this.cbNoTyping = new System.Windows.Forms.CheckBox();\r
+            this.cbTaskBarHighLight = new System.Windows.Forms.CheckBox();\r
+            this.cbFontSize = new System.Windows.Forms.ComboBox();\r
+            this.label1 = new System.Windows.Forms.Label();\r
+            this.txtReconnectTime = new System.Windows.Forms.TextBox();\r
+            this.label2 = new System.Windows.Forms.Label();\r
+            this.gbDisplayNames = new System.Windows.Forms.GroupBox();\r
+            this.rbDNOnlyDN = new System.Windows.Forms.RadioButton();\r
+            this.rbDNDandUsernme = new System.Windows.Forms.RadioButton();\r
+            this.rbDNSmart = new System.Windows.Forms.RadioButton();\r
+            this.rbDNOff = new System.Windows.Forms.RadioButton();\r
+            this.cbRadegastClientTag = new System.Windows.Forms.CheckBox();\r
+            this.cbSyntaxHighlight = new System.Windows.Forms.CheckBox();\r
+            this.cbMinToTrey = new System.Windows.Forms.CheckBox();\r
+            this.cbRLV = new System.Windows.Forms.CheckBox();\r
+            this.cbHideLoginGraphics = new System.Windows.Forms.CheckBox();\r
+            this.cbAutoReconnect = new System.Windows.Forms.CheckBox();\r
+            this.cbFriendsNotifications = new System.Windows.Forms.CheckBox();\r
+            this.cbTrasactChat = new System.Windows.Forms.CheckBox();\r
+            this.cbTrasactDialog = new System.Windows.Forms.CheckBox();\r
+            this.tbpAutoResponse = new System.Windows.Forms.TabPage();\r
+            this.gnAutoInventory = new System.Windows.Forms.GroupBox();\r
+            this.cbOnInvOffer = new System.Windows.Forms.ComboBox();\r
+            this.txtAutoResponse = new System.Windows.Forms.TextBox();\r
+            this.gbAutoResponse = new System.Windows.Forms.GroupBox();\r
+            this.rbAutoAlways = new System.Windows.Forms.RadioButton();\r
+            this.rbAutoNonFriend = new System.Windows.Forms.RadioButton();\r
+            this.rbAutobusy = new System.Windows.Forms.RadioButton();\r
+            this.tbpGraphics = new System.Windows.Forms.TabPage();\r
+            this.cbDisableLookAt = new System.Windows.Forms.CheckBox();\r
+            this.tcGraphics.SuspendLayout();\r
+            this.tbpGeneral.SuspendLayout();\r
+            this.Chat.SuspendLayout();\r
+            this.gbDisplayNames.SuspendLayout();\r
+            this.tbpAutoResponse.SuspendLayout();\r
+            this.gnAutoInventory.SuspendLayout();\r
+            this.gbAutoResponse.SuspendLayout();\r
+            this.SuspendLayout();\r
+            // \r
+            // tcGraphics\r
+            // \r
+            this.tcGraphics.Controls.Add(this.tbpGeneral);\r
+            this.tcGraphics.Controls.Add(this.tbpAutoResponse);\r
+            this.tcGraphics.Controls.Add(this.tbpGraphics);\r
+            this.tcGraphics.Dock = System.Windows.Forms.DockStyle.Fill;\r
+            this.tcGraphics.Location = new System.Drawing.Point(0, 0);\r
+            this.tcGraphics.Multiline = true;\r
+            this.tcGraphics.Name = "tcGraphics";\r
+            this.tcGraphics.SelectedIndex = 0;\r
+            this.tcGraphics.Size = new System.Drawing.Size(496, 324);\r
+            this.tcGraphics.TabIndex = 0;\r
+            // \r
+            // tbpGeneral\r
+            // \r
+            this.tbpGeneral.Controls.Add(this.cbDisableLookAt);\r
+            this.tbpGeneral.Controls.Add(this.cbRadegastLogToFile);\r
+            this.tbpGeneral.Controls.Add(this.Chat);\r
+            this.tbpGeneral.Controls.Add(this.txtReconnectTime);\r
+            this.tbpGeneral.Controls.Add(this.label2);\r
+            this.tbpGeneral.Controls.Add(this.gbDisplayNames);\r
+            this.tbpGeneral.Controls.Add(this.cbRadegastClientTag);\r
+            this.tbpGeneral.Controls.Add(this.cbSyntaxHighlight);\r
+            this.tbpGeneral.Controls.Add(this.cbMinToTrey);\r
+            this.tbpGeneral.Controls.Add(this.cbRLV);\r
+            this.tbpGeneral.Controls.Add(this.cbHideLoginGraphics);\r
+            this.tbpGeneral.Controls.Add(this.cbAutoReconnect);\r
+            this.tbpGeneral.Controls.Add(this.cbFriendsNotifications);\r
+            this.tbpGeneral.Controls.Add(this.cbTrasactChat);\r
+            this.tbpGeneral.Controls.Add(this.cbTrasactDialog);\r
+            this.tbpGeneral.Location = new System.Drawing.Point(4, 22);\r
+            this.tbpGeneral.Name = "tbpGeneral";\r
+            this.tbpGeneral.Padding = new System.Windows.Forms.Padding(3);\r
+            this.tbpGeneral.Size = new System.Drawing.Size(488, 298);\r
+            this.tbpGeneral.TabIndex = 1;\r
+            this.tbpGeneral.Text = "General";\r
+            this.tbpGeneral.UseVisualStyleBackColor = true;\r
+            // \r
+            // cbRadegastLogToFile\r
+            // \r
+            this.cbRadegastLogToFile.AutoSize = true;\r
+            this.cbRadegastLogToFile.Location = new System.Drawing.Point(275, 220);\r
+            this.cbRadegastLogToFile.Name = "cbRadegastLogToFile";\r
+            this.cbRadegastLogToFile.Size = new System.Drawing.Size(72, 17);\r
+            this.cbRadegastLogToFile.TabIndex = 14;\r
+            this.cbRadegastLogToFile.Text = "Log to file";\r
+            this.cbRadegastLogToFile.UseVisualStyleBackColor = true;\r
+            this.cbRadegastLogToFile.CheckedChanged += new System.EventHandler(this.cbRadegastLogToFile_CheckedChanged);\r
+            // \r
+            // Chat\r
+            // \r
+            this.Chat.Controls.Add(this.cbDisableChatIMLog);\r
+            this.Chat.Controls.Add(this.cbChatTimestamps);\r
+            this.Chat.Controls.Add(this.cbIMTimeStamps);\r
+            this.Chat.Controls.Add(this.cbFriendsHighlight);\r
+            this.Chat.Controls.Add(this.cbMUEmotes);\r
+            this.Chat.Controls.Add(this.cbNoTyping);\r
+            this.Chat.Controls.Add(this.cbTaskBarHighLight);\r
+            this.Chat.Controls.Add(this.cbFontSize);\r
+            this.Chat.Controls.Add(this.label1);\r
+            this.Chat.Location = new System.Drawing.Point(8, 5);\r
+            this.Chat.Name = "Chat";\r
+            this.Chat.Size = new System.Drawing.Size(256, 181);\r
+            this.Chat.TabIndex = 0;\r
+            this.Chat.TabStop = false;\r
+            this.Chat.Text = "Chat";\r
+            // \r
+            // cbDisableChatIMLog\r
+            // \r
+            this.cbDisableChatIMLog.AutoSize = true;\r
+            this.cbDisableChatIMLog.Location = new System.Drawing.Point(8, 155);\r
+            this.cbDisableChatIMLog.Name = "cbDisableChatIMLog";\r
+            this.cbDisableChatIMLog.Size = new System.Drawing.Size(138, 17);\r
+            this.cbDisableChatIMLog.TabIndex = 8;\r
+            this.cbDisableChatIMLog.Text = "Disable chat and IM log";\r
+            this.cbDisableChatIMLog.UseVisualStyleBackColor = true;\r
+            // \r
+            // cbChatTimestamps\r
+            // \r
+            this.cbChatTimestamps.AutoSize = true;\r
+            this.cbChatTimestamps.Location = new System.Drawing.Point(8, 12);\r
+            this.cbChatTimestamps.Name = "cbChatTimestamps";\r
+            this.cbChatTimestamps.Size = new System.Drawing.Size(143, 17);\r
+            this.cbChatTimestamps.TabIndex = 0;\r
+            this.cbChatTimestamps.Text = "Show timestamps in chat";\r
+            this.cbChatTimestamps.UseVisualStyleBackColor = true;\r
+            // \r
+            // cbIMTimeStamps\r
+            // \r
+            this.cbIMTimeStamps.AutoSize = true;\r
+            this.cbIMTimeStamps.Location = new System.Drawing.Point(8, 35);\r
+            this.cbIMTimeStamps.Name = "cbIMTimeStamps";\r
+            this.cbIMTimeStamps.Size = new System.Drawing.Size(137, 17);\r
+            this.cbIMTimeStamps.TabIndex = 1;\r
+            this.cbIMTimeStamps.Text = "Show timestamps in  IM";\r
+            this.cbIMTimeStamps.UseVisualStyleBackColor = true;\r
+            // \r
+            // cbFriendsHighlight\r
+            // \r
+            this.cbFriendsHighlight.AutoSize = true;\r
+            this.cbFriendsHighlight.Location = new System.Drawing.Point(8, 75);\r
+            this.cbFriendsHighlight.Name = "cbFriendsHighlight";\r
+            this.cbFriendsHighlight.Size = new System.Drawing.Size(248, 17);\r
+            this.cbFriendsHighlight.TabIndex = 4;\r
+            this.cbFriendsHighlight.Text = "Highlight chat tab on friends online notifications";\r
+            this.cbFriendsHighlight.UseVisualStyleBackColor = true;\r
+            this.cbFriendsHighlight.CheckedChanged += new System.EventHandler(this.cbTrasactChat_CheckedChanged);\r
+            // \r
+            // cbMUEmotes\r
+            // \r
+            this.cbMUEmotes.AutoSize = true;\r
+            this.cbMUEmotes.Location = new System.Drawing.Point(8, 95);\r
+            this.cbMUEmotes.Name = "cbMUEmotes";\r
+            this.cbMUEmotes.Size = new System.Drawing.Size(108, 17);\r
+            this.cbMUEmotes.TabIndex = 5;\r
+            this.cbMUEmotes.Text = "MU* style emotes";\r
+            this.cbMUEmotes.UseVisualStyleBackColor = true;\r
+            this.cbMUEmotes.CheckedChanged += new System.EventHandler(this.cbTrasactChat_CheckedChanged);\r
+            // \r
+            // cbNoTyping\r
+            // \r
+            this.cbNoTyping.AutoSize = true;\r
+            this.cbNoTyping.Location = new System.Drawing.Point(8, 115);\r
+            this.cbNoTyping.Name = "cbNoTyping";\r
+            this.cbNoTyping.Size = new System.Drawing.Size(150, 17);\r
+            this.cbNoTyping.TabIndex = 6;\r
+            this.cbNoTyping.Text = "Don\'t use typing animation";\r
+            this.cbNoTyping.UseVisualStyleBackColor = true;\r
+            this.cbNoTyping.CheckedChanged += new System.EventHandler(this.cbTrasactChat_CheckedChanged);\r
+            // \r
+            // cbTaskBarHighLight\r
+            // \r
+            this.cbTaskBarHighLight.AutoSize = true;\r
+            this.cbTaskBarHighLight.Location = new System.Drawing.Point(8, 135);\r
+            this.cbTaskBarHighLight.Name = "cbTaskBarHighLight";\r
+            this.cbTaskBarHighLight.Size = new System.Drawing.Size(155, 17);\r
+            this.cbTaskBarHighLight.TabIndex = 7;\r
+            this.cbTaskBarHighLight.Text = "Highlight in taskbar on chat";\r
+            this.cbTaskBarHighLight.UseVisualStyleBackColor = true;\r
+            // \r
+            // cbFontSize\r
+            // \r
+            this.cbFontSize.FormatString = "N2";\r
+            this.cbFontSize.FormattingEnabled = true;\r
+            this.cbFontSize.Items.AddRange(new object[] {\r
+            "8.25",\r
+            "9",\r
+            "10",\r
+            "12",\r
+            "14",\r
+            "16",\r
+            "20"});\r
+            this.cbFontSize.Location = new System.Drawing.Point(97, 51);\r
+            this.cbFontSize.Name = "cbFontSize";\r
+            this.cbFontSize.Size = new System.Drawing.Size(54, 21);\r
+            this.cbFontSize.TabIndex = 3;\r
+            this.cbFontSize.Text = "8.25";\r
+            this.cbFontSize.SelectedIndexChanged += new System.EventHandler(this.cbFontSize_SelectedIndexChanged);\r
+            this.cbFontSize.KeyDown += new System.Windows.Forms.KeyEventHandler(this.cbFontSize_KeyDown);\r
+            this.cbFontSize.Leave += new System.EventHandler(this.cbFontSize_Leave);\r
+            // \r
+            // label1\r
+            // \r
+            this.label1.AutoSize = true;\r
+            this.label1.Location = new System.Drawing.Point(24, 54);\r
+            this.label1.Name = "label1";\r
+            this.label1.Size = new System.Drawing.Size(73, 13);\r
+            this.label1.TabIndex = 2;\r
+            this.label1.Text = "Chat text size:";\r
+            // \r
+            // txtReconnectTime\r
+            // \r
+            this.txtReconnectTime.Location = new System.Drawing.Point(420, 97);\r
+            this.txtReconnectTime.Name = "txtReconnectTime";\r
+            this.txtReconnectTime.Size = new System.Drawing.Size(53, 20);\r
+            this.txtReconnectTime.TabIndex = 8;\r
+            this.txtReconnectTime.Text = "120";\r
+            this.txtReconnectTime.TextChanged += new System.EventHandler(this.txtReconnectTime_TextChanged);\r
+            // \r
+            // label2\r
+            // \r
+            this.label2.AutoSize = true;\r
+            this.label2.Location = new System.Drawing.Point(291, 100);\r
+            this.label2.Name = "label2";\r
+            this.label2.Size = new System.Drawing.Size(128, 13);\r
+            this.label2.TabIndex = 7;\r
+            this.label2.Text = "Auto reconnect time (sec)";\r
+            // \r
+            // gbDisplayNames\r
+            // \r
+            this.gbDisplayNames.Controls.Add(this.rbDNOnlyDN);\r
+            this.gbDisplayNames.Controls.Add(this.rbDNDandUsernme);\r
+            this.gbDisplayNames.Controls.Add(this.rbDNSmart);\r
+            this.gbDisplayNames.Controls.Add(this.rbDNOff);\r
+            this.gbDisplayNames.Location = new System.Drawing.Point(8, 192);\r
+            this.gbDisplayNames.Name = "gbDisplayNames";\r
+            this.gbDisplayNames.Size = new System.Drawing.Size(256, 100);\r
+            this.gbDisplayNames.TabIndex = 1;\r
+            this.gbDisplayNames.TabStop = false;\r
+            this.gbDisplayNames.Text = "Display names";\r
+            // \r
+            // rbDNOnlyDN\r
+            // \r
+            this.rbDNOnlyDN.AutoSize = true;\r
+            this.rbDNOnlyDN.Location = new System.Drawing.Point(6, 75);\r
+            this.rbDNOnlyDN.Name = "rbDNOnlyDN";\r
+            this.rbDNOnlyDN.Size = new System.Drawing.Size(110, 17);\r
+            this.rbDNOnlyDN.TabIndex = 3;\r
+            this.rbDNOnlyDN.TabStop = true;\r
+            this.rbDNOnlyDN.Text = "Only display name";\r
+            this.rbDNOnlyDN.UseVisualStyleBackColor = true;\r
+            this.rbDNOnlyDN.CheckedChanged += new System.EventHandler(this.rbDNOnlyDN_CheckedChanged);\r
+            // \r
+            // rbDNDandUsernme\r
+            // \r
+            this.rbDNDandUsernme.AutoSize = true;\r
+            this.rbDNDandUsernme.Location = new System.Drawing.Point(6, 55);\r
+            this.rbDNDandUsernme.Name = "rbDNDandUsernme";\r
+            this.rbDNDandUsernme.Size = new System.Drawing.Size(143, 17);\r
+            this.rbDNDandUsernme.TabIndex = 2;\r
+            this.rbDNDandUsernme.TabStop = true;\r
+            this.rbDNDandUsernme.Text = "Display name (username)";\r
+            this.rbDNDandUsernme.UseVisualStyleBackColor = true;\r
+            this.rbDNDandUsernme.CheckedChanged += new System.EventHandler(this.rbDNDandUsernme_CheckedChanged);\r
+            // \r
+            // rbDNSmart\r
+            // \r
+            this.rbDNSmart.AutoSize = true;\r
+            this.rbDNSmart.Location = new System.Drawing.Point(6, 35);\r
+            this.rbDNSmart.Name = "rbDNSmart";\r
+            this.rbDNSmart.Size = new System.Drawing.Size(52, 17);\r
+            this.rbDNSmart.TabIndex = 1;\r
+            this.rbDNSmart.TabStop = true;\r
+            this.rbDNSmart.Text = "Smart";\r
+            this.rbDNSmart.UseVisualStyleBackColor = true;\r
+            this.rbDNSmart.CheckedChanged += new System.EventHandler(this.rbDNSmart_CheckedChanged);\r
+            // \r
+            // rbDNOff\r
+            // \r
+            this.rbDNOff.AutoSize = true;\r
+            this.rbDNOff.Location = new System.Drawing.Point(6, 15);\r
+            this.rbDNOff.Name = "rbDNOff";\r
+            this.rbDNOff.Size = new System.Drawing.Size(39, 17);\r
+            this.rbDNOff.TabIndex = 0;\r
+            this.rbDNOff.TabStop = true;\r
+            this.rbDNOff.Text = "Off";\r
+            this.rbDNOff.UseVisualStyleBackColor = true;\r
+            this.rbDNOff.CheckedChanged += new System.EventHandler(this.rbDNOff_CheckedChanged);\r
+            // \r
+            // cbRadegastClientTag\r
+            // \r
+            this.cbRadegastClientTag.AutoSize = true;\r
+            this.cbRadegastClientTag.Location = new System.Drawing.Point(275, 200);\r
+            this.cbRadegastClientTag.Name = "cbRadegastClientTag";\r
+            this.cbRadegastClientTag.Size = new System.Drawing.Size(146, 17);\r
+            this.cbRadegastClientTag.TabIndex = 13;\r
+            this.cbRadegastClientTag.Text = "Send Radegast client tag";\r
+            this.cbRadegastClientTag.UseVisualStyleBackColor = true;\r
+            // \r
+            // cbSyntaxHighlight\r
+            // \r
+            this.cbSyntaxHighlight.AutoSize = true;\r
+            this.cbSyntaxHighlight.Location = new System.Drawing.Point(275, 60);\r
+            this.cbSyntaxHighlight.Name = "cbSyntaxHighlight";\r
+            this.cbSyntaxHighlight.Size = new System.Drawing.Size(134, 17);\r
+            this.cbSyntaxHighlight.TabIndex = 5;\r
+            this.cbSyntaxHighlight.Text = "LSL syntax highlighting";\r
+            this.cbSyntaxHighlight.UseVisualStyleBackColor = true;\r
+            // \r
+            // cbMinToTrey\r
+            // \r
+            this.cbMinToTrey.AutoSize = true;\r
+            this.cbMinToTrey.Location = new System.Drawing.Point(275, 40);\r
+            this.cbMinToTrey.Name = "cbMinToTrey";\r
+            this.cbMinToTrey.Size = new System.Drawing.Size(133, 17);\r
+            this.cbMinToTrey.TabIndex = 4;\r
+            this.cbMinToTrey.Text = "Minimize to system tray";\r
+            this.cbMinToTrey.UseVisualStyleBackColor = true;\r
+            this.cbMinToTrey.CheckedChanged += new System.EventHandler(this.cbTrasactChat_CheckedChanged);\r
+            // \r
+            // cbRLV\r
+            // \r
+            this.cbRLV.AutoSize = true;\r
+            this.cbRLV.Location = new System.Drawing.Point(275, 180);\r
+            this.cbRLV.Name = "cbRLV";\r
+            this.cbRLV.Size = new System.Drawing.Size(85, 17);\r
+            this.cbRLV.TabIndex = 12;\r
+            this.cbRLV.Text = "RLV support";\r
+            this.cbRLV.UseVisualStyleBackColor = true;\r
+            this.cbRLV.CheckedChanged += new System.EventHandler(this.cbTrasactChat_CheckedChanged);\r
+            // \r
+            // cbHideLoginGraphics\r
+            // \r
+            this.cbHideLoginGraphics.AutoSize = true;\r
+            this.cbHideLoginGraphics.Location = new System.Drawing.Point(275, 20);\r
+            this.cbHideLoginGraphics.Name = "cbHideLoginGraphics";\r
+            this.cbHideLoginGraphics.Size = new System.Drawing.Size(141, 17);\r
+            this.cbHideLoginGraphics.TabIndex = 3;\r
+            this.cbHideLoginGraphics.Text = "Hide login slpash screen";\r
+            this.cbHideLoginGraphics.UseVisualStyleBackColor = true;\r
+            this.cbHideLoginGraphics.CheckedChanged += new System.EventHandler(this.cbTrasactChat_CheckedChanged);\r
+            // \r
+            // cbAutoReconnect\r
+            // \r
+            this.cbAutoReconnect.AutoSize = true;\r
+            this.cbAutoReconnect.Location = new System.Drawing.Point(275, 80);\r
+            this.cbAutoReconnect.Name = "cbAutoReconnect";\r
+            this.cbAutoReconnect.Size = new System.Drawing.Size(169, 17);\r
+            this.cbAutoReconnect.TabIndex = 6;\r
+            this.cbAutoReconnect.Text = "Auto reconnect on disconnect";\r
+            this.cbAutoReconnect.UseVisualStyleBackColor = true;\r
+            this.cbAutoReconnect.CheckedChanged += new System.EventHandler(this.cbTrasactChat_CheckedChanged);\r
+            // \r
+            // cbFriendsNotifications\r
+            // \r
+            this.cbFriendsNotifications.AutoSize = true;\r
+            this.cbFriendsNotifications.Location = new System.Drawing.Point(275, 160);\r
+            this.cbFriendsNotifications.Name = "cbFriendsNotifications";\r
+            this.cbFriendsNotifications.Size = new System.Drawing.Size(184, 17);\r
+            this.cbFriendsNotifications.TabIndex = 11;\r
+            this.cbFriendsNotifications.Text = "Display friends online notifications";\r
+            this.cbFriendsNotifications.UseVisualStyleBackColor = true;\r
+            this.cbFriendsNotifications.CheckedChanged += new System.EventHandler(this.cbTrasactChat_CheckedChanged);\r
+            // \r
+            // cbTrasactChat\r
+            // \r
+            this.cbTrasactChat.AutoSize = true;\r
+            this.cbTrasactChat.Location = new System.Drawing.Point(275, 140);\r
+            this.cbTrasactChat.Name = "cbTrasactChat";\r
+            this.cbTrasactChat.Size = new System.Drawing.Size(170, 17);\r
+            this.cbTrasactChat.TabIndex = 10;\r
+            this.cbTrasactChat.Text = "Display L$ transactions in chat";\r
+            this.cbTrasactChat.UseVisualStyleBackColor = true;\r
+            this.cbTrasactChat.CheckedChanged += new System.EventHandler(this.cbTrasactChat_CheckedChanged);\r
+            // \r
+            // cbTrasactDialog\r
+            // \r
+            this.cbTrasactDialog.AutoSize = true;\r
+            this.cbTrasactDialog.Location = new System.Drawing.Point(275, 120);\r
+            this.cbTrasactDialog.Name = "cbTrasactDialog";\r
+            this.cbTrasactDialog.Size = new System.Drawing.Size(176, 17);\r
+            this.cbTrasactDialog.TabIndex = 9;\r
+            this.cbTrasactDialog.Text = "Display dialog on L$ transaction";\r
+            this.cbTrasactDialog.UseVisualStyleBackColor = true;\r
+            this.cbTrasactDialog.CheckedChanged += new System.EventHandler(this.cbTrasactDialog_CheckedChanged);\r
+            // \r
+            // tbpAutoResponse\r
+            // \r
+            this.tbpAutoResponse.Controls.Add(this.gnAutoInventory);\r
+            this.tbpAutoResponse.Controls.Add(this.txtAutoResponse);\r
+            this.tbpAutoResponse.Controls.Add(this.gbAutoResponse);\r
+            this.tbpAutoResponse.Location = new System.Drawing.Point(4, 22);\r
+            this.tbpAutoResponse.Name = "tbpAutoResponse";\r
+            this.tbpAutoResponse.Padding = new System.Windows.Forms.Padding(3);\r
+            this.tbpAutoResponse.Size = new System.Drawing.Size(488, 298);\r
+            this.tbpAutoResponse.TabIndex = 2;\r
+            this.tbpAutoResponse.Text = "Auto Response";\r
+            this.tbpAutoResponse.UseVisualStyleBackColor = true;\r
+            // \r
+            // gnAutoInventory\r
+            // \r
+            this.gnAutoInventory.Controls.Add(this.cbOnInvOffer);\r
+            this.gnAutoInventory.Location = new System.Drawing.Point(9, 156);\r
+            this.gnAutoInventory.Name = "gnAutoInventory";\r
+            this.gnAutoInventory.Size = new System.Drawing.Size(281, 54);\r
+            this.gnAutoInventory.TabIndex = 2;\r
+            this.gnAutoInventory.TabStop = false;\r
+            this.gnAutoInventory.Text = "On inventory offers";\r
+            // \r
+            // cbOnInvOffer\r
+            // \r
+            this.cbOnInvOffer.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\r
+            this.cbOnInvOffer.FormattingEnabled = true;\r
+            this.cbOnInvOffer.Items.AddRange(new object[] {\r
+            "Ask",\r
+            "Auto Accept",\r
+            "Auto Discard"});\r
+            this.cbOnInvOffer.Location = new System.Drawing.Point(6, 19);\r
+            this.cbOnInvOffer.Name = "cbOnInvOffer";\r
+            this.cbOnInvOffer.Size = new System.Drawing.Size(121, 21);\r
+            this.cbOnInvOffer.TabIndex = 0;\r
+            // \r
+            // txtAutoResponse\r
+            // \r
+            this.txtAutoResponse.AccessibleName = "Auto response text";\r
+            this.txtAutoResponse.Location = new System.Drawing.Point(8, 63);\r
+            this.txtAutoResponse.Multiline = true;\r
+            this.txtAutoResponse.Name = "txtAutoResponse";\r
+            this.txtAutoResponse.Size = new System.Drawing.Size(282, 87);\r
+            this.txtAutoResponse.TabIndex = 1;\r
+            // \r
+            // gbAutoResponse\r
+            // \r
+            this.gbAutoResponse.Controls.Add(this.rbAutoAlways);\r
+            this.gbAutoResponse.Controls.Add(this.rbAutoNonFriend);\r
+            this.gbAutoResponse.Controls.Add(this.rbAutobusy);\r
+            this.gbAutoResponse.Location = new System.Drawing.Point(3, 6);\r
+            this.gbAutoResponse.Name = "gbAutoResponse";\r
+            this.gbAutoResponse.Size = new System.Drawing.Size(287, 51);\r
+            this.gbAutoResponse.TabIndex = 0;\r
+            this.gbAutoResponse.TabStop = false;\r
+            this.gbAutoResponse.Text = "Send auto response when:";\r
+            // \r
+            // rbAutoAlways\r
+            // \r
+            this.rbAutoAlways.AutoSize = true;\r
+            this.rbAutoAlways.Location = new System.Drawing.Point(216, 19);\r
+            this.rbAutoAlways.Name = "rbAutoAlways";\r
+            this.rbAutoAlways.Size = new System.Drawing.Size(58, 17);\r
+            this.rbAutoAlways.TabIndex = 2;\r
+            this.rbAutoAlways.Text = "Always";\r
+            this.rbAutoAlways.UseVisualStyleBackColor = true;\r
+            this.rbAutoAlways.CheckedChanged += new System.EventHandler(this.rbAutoAlways_CheckedChanged);\r
+            // \r
+            // rbAutoNonFriend\r
+            // \r
+            this.rbAutoNonFriend.AutoSize = true;\r
+            this.rbAutoNonFriend.Location = new System.Drawing.Point(100, 19);\r
+            this.rbAutoNonFriend.Name = "rbAutoNonFriend";\r
+            this.rbAutoNonFriend.Size = new System.Drawing.Size(110, 17);\r
+            this.rbAutoNonFriend.TabIndex = 1;\r
+            this.rbAutoNonFriend.Text = "IM from non-friend";\r
+            this.rbAutoNonFriend.UseVisualStyleBackColor = true;\r
+            this.rbAutoNonFriend.CheckedChanged += new System.EventHandler(this.rbAutoNonFriend_CheckedChanged);\r
+            // \r
+            // rbAutobusy\r
+            // \r
+            this.rbAutobusy.AutoSize = true;\r
+            this.rbAutobusy.Checked = true;\r
+            this.rbAutobusy.Location = new System.Drawing.Point(6, 19);\r
+            this.rbAutobusy.Name = "rbAutobusy";\r
+            this.rbAutobusy.Size = new System.Drawing.Size(88, 17);\r
+            this.rbAutobusy.TabIndex = 0;\r
+            this.rbAutobusy.TabStop = true;\r
+            this.rbAutobusy.Text = "In busy mode";\r
+            this.rbAutobusy.UseVisualStyleBackColor = true;\r
+            this.rbAutobusy.CheckedChanged += new System.EventHandler(this.rbAutobusy_CheckedChanged);\r
+            // \r
+            // tbpGraphics\r
+            // \r
+            this.tbpGraphics.Location = new System.Drawing.Point(4, 22);\r
+            this.tbpGraphics.Name = "tbpGraphics";\r
+            this.tbpGraphics.Padding = new System.Windows.Forms.Padding(3);\r
+            this.tbpGraphics.Size = new System.Drawing.Size(488, 298);\r
+            this.tbpGraphics.TabIndex = 3;\r
+            this.tbpGraphics.Text = "Graphics Settings";\r
+            this.tbpGraphics.UseVisualStyleBackColor = true;\r
+            // \r
+            // cbDisableLookAt\r
+            // \r
+            this.cbDisableLookAt.AutoSize = true;\r
+            this.cbDisableLookAt.Location = new System.Drawing.Point(275, 243);\r
+            this.cbDisableLookAt.Name = "cbDisableLookAt";\r
+            this.cbDisableLookAt.Size = new System.Drawing.Size(140, 17);\r
+            this.cbDisableLookAt.TabIndex = 15;\r
+            this.cbDisableLookAt.Text = "Disable Look At beacon";\r
+            this.cbDisableLookAt.UseVisualStyleBackColor = true;\r
+            // \r
+            // frmSettings\r
+            // \r
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\r
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\r
+            this.ClientSize = new System.Drawing.Size(496, 324);\r
+            this.Controls.Add(this.tcGraphics);\r
+            this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));\r
+            this.Name = "frmSettings";\r
+            this.Text = "Settings - Radegast";\r
+            this.tcGraphics.ResumeLayout(false);\r
+            this.tbpGeneral.ResumeLayout(false);\r
+            this.tbpGeneral.PerformLayout();\r
+            this.Chat.ResumeLayout(false);\r
+            this.Chat.PerformLayout();\r
+            this.gbDisplayNames.ResumeLayout(false);\r
+            this.gbDisplayNames.PerformLayout();\r
+            this.tbpAutoResponse.ResumeLayout(false);\r
+            this.tbpAutoResponse.PerformLayout();\r
+            this.gnAutoInventory.ResumeLayout(false);\r
+            this.gbAutoResponse.ResumeLayout(false);\r
+            this.gbAutoResponse.PerformLayout();\r
+            this.ResumeLayout(false);\r
+\r
         }
 
         #endregion
@@ -617,7 +629,8 @@ namespace Radegast
         public System.Windows.Forms.ComboBox cbOnInvOffer;
         public System.Windows.Forms.CheckBox cbDisableChatIMLog;
         public System.Windows.Forms.GroupBox Chat;
-        public System.Windows.Forms.CheckBox cbRadegastLogToFile;
+        public System.Windows.Forms.CheckBox cbRadegastLogToFile;\r
+        protected System.Windows.Forms.CheckBox cbDisableLookAt;
 
 
     }
index 14143d1..f4d9970 100644 (file)
@@ -115,7 +115,9 @@ namespace Radegast
 
             if (!s.ContainsKey("log_to_file")) s["log_to_file"] = true;
 
-            if (!s.ContainsKey("disable_chat_im_log")) s["disable_chat_im_log"] = false;
+            if (!s.ContainsKey("disable_chat_im_log")) s["disable_chat_im_log"] = false;\r
+\r
+            if (!s.ContainsKey("disable_look_at")) s["disable_look_at"] = false;
         }
 
         public frmSettings(RadegastInstance instance)
@@ -242,6 +244,12 @@ namespace Radegast
             {
                 s["disable_chat_im_log"] = cbDisableChatIMLog.Checked;
             };
+
+            cbDisableLookAt.Checked = s["disable_look_at"];\r
+            cbDisableLookAt.CheckedChanged += (sender, e) =>
+            {\r
+                s["disable_look_at"] = cbDisableLookAt.Checked;
+            };
         }
 
         void cbHideLoginGraphics_CheckedChanged(object sender, EventArgs e)