OSDN Git Service

Silence too verbose debug
[radegast/radegast.git] / Radegast / Core / StateManager.cs
index 188ed47..4387a57 100644 (file)
@@ -1,6 +1,6 @@
 // 
 // Radegast Metaverse Client
-// Copyright (c) 2009-2013, Radegast Development Team
+// Copyright (c) 2009-2014, Radegast Development Team
 // All rights reserved.
 // 
 // Redistribution and use in source and binary forms, with or without
@@ -35,7 +35,7 @@ using System.Threading;
 
 using OpenMetaverse;
 
-using Radegast.Bot;
+using Radegast.Automation;
 using Radegast.Netcom;
 
 namespace Radegast
@@ -45,6 +45,7 @@ namespace Radegast
         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;
@@ -85,6 +86,8 @@ namespace Radegast
         internal static Random rnd = new Random();
         private System.Threading.Timer lookAtTimer;
 
+        public float FOVVerticalAngle = Utils.TWO_PI - 0.05f;
+
         /// <summary>
         /// Passes walk state
         /// </summary>
@@ -183,6 +186,8 @@ namespace Radegast
         }
 
         public Dictionary<UUID, string> KnownAnimations;
+        public bool CameraTracksOwnAvatar = true;
+        public Vector3 DefaultCameraOffset = new Vector3(-5, 0, 0);
 
         public StateManager(RadegastInstance instance)
         {
@@ -191,6 +196,7 @@ namespace Radegast
             KnownAnimations = Animations.ToDictionary();
             autosit = new AutoSit(this.instance);
             pseudohome = new PseudoHome(this.instance);
+            lslHelper = new LSLHelper(this.instance);
 
             beamTimer = new System.Timers.Timer();
             beamTimer.Enabled = false;
@@ -206,6 +212,7 @@ namespace Radegast
 
         private void RegisterClientEvents(GridClient client)
         {
+            client.Objects.AvatarUpdate += new EventHandler<AvatarUpdateEventArgs>(Objects_AvatarUpdate);
             client.Objects.TerseObjectUpdate += new EventHandler<TerseObjectUpdateEventArgs>(Objects_TerseObjectUpdate);
             client.Objects.AvatarSitChanged += new EventHandler<AvatarSitChangedEventArgs>(Objects_AvatarSitChanged);
             client.Self.AlertMessage += new EventHandler<AlertMessageEventArgs>(Self_AlertMessage);
@@ -216,6 +223,7 @@ namespace Radegast
 
         private void UnregisterClientEvents(GridClient client)
         {
+            client.Objects.AvatarUpdate -= new EventHandler<AvatarUpdateEventArgs>(Objects_AvatarUpdate);
             client.Objects.TerseObjectUpdate -= new EventHandler<TerseObjectUpdateEventArgs>(Objects_TerseObjectUpdate);
             client.Objects.AvatarSitChanged -= new EventHandler<AvatarSitChangedEventArgs>(Objects_AvatarSitChanged);
             client.Self.AlertMessage -= new EventHandler<AlertMessageEventArgs>(Self_AlertMessage);
@@ -244,6 +252,18 @@ namespace Radegast
                 walkTimer.Dispose();
                 walkTimer = null;
             }
+
+            if (autosit != null)
+            {
+                autosit.Dispose();
+                autosit = null;
+            }
+
+            if (lslHelper == null)
+            {
+                lslHelper.Dispose();
+                lslHelper = null;
+            }
         }
 
         void instance_ClientChanged(object sender, ClientChangedEventArgs e)
@@ -256,7 +276,13 @@ namespace Radegast
         {
             if (e.Avatar.LocalID != client.Self.LocalID) return;
 
-            this.sitting = e.SittingOn != 0;
+            sitting = e.SittingOn != 0;
+
+            if (client.Self.SittingOn != 0 && !client.Network.CurrentSim.ObjectsPrimitives.ContainsKey(client.Self.SittingOn))
+            {
+                client.Objects.RequestObject(client.Network.CurrentSim, client.Self.SittingOn);
+            }
+
             if (SitStateChanged != null)
             {
                 SitStateChanged(this, new SitEventArgs(this.sitting));
@@ -466,8 +492,13 @@ namespace Radegast
 
         void Network_SimChanged(object sender, SimChangedEventArgs e)
         {
-            autosit.TrySit();
-            pseudohome.ETGoHome();
+            WorkPool.QueueUserWorkItem(sync =>
+            {
+                Thread.Sleep(15 * 1000);
+                autosit.TrySit();
+                pseudohome.ETGoHome();
+            });
+            client.Self.Movement.SetFOVVerticalAngle(FOVVerticalAngle);
         }
 
         private UUID teleportEffect = UUID.Random();
@@ -520,9 +551,23 @@ namespace Radegast
             }
         }
 
+        void Objects_AvatarUpdate(object sender, AvatarUpdateEventArgs e)
+        {
+            if (e.Avatar.LocalID == client.Self.LocalID)
+            {
+                SetDefaultCamera();
+            }
+        }
+
         void Objects_TerseObjectUpdate(object sender, TerseObjectUpdateEventArgs e)
         {
             if (!e.Update.Avatar) return;
+            
+            if (e.Prim.LocalID == client.Self.LocalID)
+            {
+                SetDefaultCamera();
+            }
+
             if (!following) return;
 
             Avatar av;
@@ -553,6 +598,28 @@ namespace Radegast
             }
         }
 
+        public void SetDefaultCamera()
+        {
+            if (CameraTracksOwnAvatar)
+            {
+                if (client.Self.SittingOn != 0 && !client.Network.CurrentSim.ObjectsPrimitives.ContainsKey(client.Self.SittingOn))
+                {
+                    // We are sitting but don't have the information about the object we are sitting on
+                    // Sim seems to ignore RequestMutlipleObjects message
+                    // client.Objects.RequestObject(client.Network.CurrentSim, client.Self.SittingOn);
+                }
+                else
+                {
+                    Vector3 pos = client.Self.SimPosition + DefaultCameraOffset * client.Self.Movement.BodyRotation;
+                    //Logger.Log("Setting camera position to " + pos.ToString(), Helpers.LogLevel.Debug);
+                    client.Self.Movement.Camera.LookAt(
+                        pos,
+                        client.Self.SimPosition
+                    );
+                }
+            }
+        }
+
         public Quaternion AvatarRotation(Simulator sim, UUID avID)
         {
             Quaternion rot = Quaternion.Identity;
@@ -1125,6 +1192,12 @@ namespace Radegast
             get { return autosit; }
         }
 
+        private LSLHelper lslHelper;
+        public LSLHelper LSLHelper
+        {
+            get { return lslHelper; }
+        }
+
         private PseudoHome pseudohome;
 
         /// <summary>