From e83b00a3dfc5410f5ca6bd2eed3d8565ebbffecf Mon Sep 17 00:00:00 2001
From: Adam Frisby
Date: Fri, 21 Aug 2009 08:51:43 +1000
Subject: * Implements a bunch of stuff in NPCModule

---
 .../Region/OptionalModules/World/NPC/NPCModule.cs  | 64 +++++++++++++++++++---
 .../Shared/Api/Implementation/LSL_Api.cs           | 48 ++++++++--------
 2 files changed, 80 insertions(+), 32 deletions(-)

(limited to 'OpenSim')

diff --git a/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs b/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs
index 8c9717c..a3cefc9 100644
--- a/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs
+++ b/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs
@@ -25,26 +25,74 @@
  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
+using System.Collections.Generic;
 using OpenMetaverse;
 using Nini.Config;
 using OpenSim.Region.Framework.Interfaces;
 using OpenSim.Region.Framework.Scenes;
+using OpenSim.Framework;
 
 namespace OpenSim.Region.OptionalModules.World.NPC
 {
-    public class NPCModule : IRegionModule
+    public interface INPCModule
+    {
+        UUID CreateNPC(string firstname, string lastname,Vector3 position, Scene scene, UUID cloneAppearanceFrom);
+        void Autopilot(UUID agentID, Scene scene, Vector3 pos);
+        void Say(UUID agentID, Scene scene, string text);
+        void DeleteNPC(UUID agentID, Scene scene);
+    }
+
+    public class NPCModule : IRegionModule, INPCModule
     {
         // private const bool m_enabled = false;
 
+        private Dictionary<UUID,NPCAvatar> m_avatars = new Dictionary<UUID, NPCAvatar>();
+
+        public UUID CreateNPC(string firstname, string lastname,Vector3 position, Scene scene, UUID cloneAppearanceFrom)
+        {
+            NPCAvatar npcAvatar = new NPCAvatar(firstname, lastname, position, scene);
+            scene.AddNewClient(npcAvatar);
+
+            ScenePresence sp;
+            if(scene.TryGetAvatar(npcAvatar.AgentId, out sp))
+            {
+                AvatarAppearance x = scene.CommsManager.AvatarService.GetUserAppearance(cloneAppearanceFrom);
+
+                List<byte> wearbyte = new List<byte>();
+                for (int i = 0; i < x.VisualParams.Length; i++)
+                {
+                    wearbyte.Add(x.VisualParams[i]);
+                }
+
+                sp.SetAppearance(x.Texture.GetBytes(), wearbyte);
+            }
+
+            m_avatars.Add(npcAvatar.AgentId, npcAvatar);
+
+            return npcAvatar.AgentId;
+        }
+
+        public void Autopilot(UUID agentID, Scene scene, Vector3 pos)
+        {
+            ScenePresence sp;
+            scene.TryGetAvatar(agentID, out sp);
+            sp.DoAutoPilot(0,pos,m_avatars[agentID]);
+        }
+
+        public void Say(UUID agentID, Scene scene, string text)
+        {
+            m_avatars[agentID].Say(text);
+        }
+
+        public void DeleteNPC(UUID agentID, Scene scene)
+        {
+            scene.RemoveClient(agentID);
+        }
+
+
         public void Initialise(Scene scene, IConfigSource source)
         {
-            // if (m_enabled)
-            // {
-            //     NPCAvatar testAvatar = new NPCAvatar("Jack", "NPC", new Vector3(128, 128, 40), scene);
-            //     NPCAvatar testAvatar2 = new NPCAvatar("Jill", "NPC", new Vector3(136, 128, 40), scene);
-            //     scene.AddNewClient(testAvatar);
-            //     scene.AddNewClient(testAvatar2);
-            // }
+            scene.RegisterModuleInterface<INPCModule>(this);
         }
 
         public void PostInitialise()
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index 4e665e9..972e71c 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -1978,30 +1978,30 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
             return new LSL_Rotation(q.X, q.Y, q.Z, q.W);
         }
 
-        private LSL_Rotation GetPartRot( SceneObjectPart part )
-        {
-            Quaternion q;
-            if (part.LinkNum == 0 || part.LinkNum == 1) // unlinked or root prim
-            {
-	            if (part.ParentGroup.RootPart.AttachmentPoint != 0)
-	            {
-	                ScenePresence avatar = World.GetScenePresence(part.AttachedAvatar);
-	                if (avatar != null)
-	                    if ((avatar.AgentControlFlags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_MOUSELOOK) != 0)
-	                        q = avatar.CameraRotation; // Mouselook
-	                    else
-	                        q = avatar.Rotation; // Currently infrequently updated so may be inaccurate
-	                else
-	                    q = part.ParentGroup.GroupRotation; // Likely never get here but just in case
-	            }
-	            else
-	                q = part.ParentGroup.GroupRotation; // just the group rotation
-	            return new LSL_Rotation(q.X, q.Y, q.Z, q.W);
-            }
-            q = part.GetWorldRotation();
-            return new LSL_Rotation(q.X, q.Y, q.Z, q.W);
-        }
-
+        private LSL_Rotation GetPartRot( SceneObjectPart part )
+        {
+            Quaternion q;
+            if (part.LinkNum == 0 || part.LinkNum == 1) // unlinked or root prim
+            {
+	            if (part.ParentGroup.RootPart.AttachmentPoint != 0)
+	            {
+	                ScenePresence avatar = World.GetScenePresence(part.AttachedAvatar);
+	                if (avatar != null)
+	                    if ((avatar.AgentControlFlags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_MOUSELOOK) != 0)
+	                        q = avatar.CameraRotation; // Mouselook
+	                    else
+	                        q = avatar.Rotation; // Currently infrequently updated so may be inaccurate
+	                else
+	                    q = part.ParentGroup.GroupRotation; // Likely never get here but just in case
+	            }
+	            else
+	                q = part.ParentGroup.GroupRotation; // just the group rotation
+	            return new LSL_Rotation(q.X, q.Y, q.Z, q.W);
+            }
+            q = part.GetWorldRotation();
+            return new LSL_Rotation(q.X, q.Y, q.Z, q.W);
+        }
+
         public LSL_Rotation llGetLocalRot()
         {
             m_host.AddScriptLPS(1);
-- 
cgit v1.1