diff options
4 files changed, 90 insertions, 13 deletions
diff --git a/OpenSim/Region/CoreModules/Avatar/NPC/INPCModule.cs b/OpenSim/Region/CoreModules/Avatar/NPC/INPCModule.cs new file mode 100644 index 0000000..7d5c310 --- /dev/null +++ b/OpenSim/Region/CoreModules/Avatar/NPC/INPCModule.cs | |||
@@ -0,0 +1,13 @@ | |||
1 | using OpenMetaverse; | ||
2 | using OpenSim.Region.Framework.Scenes; | ||
3 | |||
4 | namespace OpenSim.Region.CoreModules.Avatar.NPC | ||
5 | { | ||
6 | public interface INPCModule | ||
7 | { | ||
8 | UUID CreateNPC(string firstname, string lastname, Vector3 position, Scene scene, UUID cloneAppearanceFrom); | ||
9 | void Autopilot(UUID agentID, Scene scene, Vector3 pos); | ||
10 | void Say(UUID agentID, Scene scene, string text); | ||
11 | void DeleteNPC(UUID agentID, Scene scene); | ||
12 | } | ||
13 | } \ No newline at end of file | ||
diff --git a/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs b/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs index a3cefc9..94349f6 100644 --- a/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs +++ b/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs | |||
@@ -30,18 +30,11 @@ using OpenMetaverse; | |||
30 | using Nini.Config; | 30 | using Nini.Config; |
31 | using OpenSim.Region.Framework.Interfaces; | 31 | using OpenSim.Region.Framework.Interfaces; |
32 | using OpenSim.Region.Framework.Scenes; | 32 | using OpenSim.Region.Framework.Scenes; |
33 | using OpenSim.Region.CoreModules.Avatar.NPC; | ||
33 | using OpenSim.Framework; | 34 | using OpenSim.Framework; |
34 | 35 | ||
35 | namespace OpenSim.Region.OptionalModules.World.NPC | 36 | namespace OpenSim.Region.OptionalModules.World.NPC |
36 | { | 37 | { |
37 | public interface INPCModule | ||
38 | { | ||
39 | UUID CreateNPC(string firstname, string lastname,Vector3 position, Scene scene, UUID cloneAppearanceFrom); | ||
40 | void Autopilot(UUID agentID, Scene scene, Vector3 pos); | ||
41 | void Say(UUID agentID, Scene scene, string text); | ||
42 | void DeleteNPC(UUID agentID, Scene scene); | ||
43 | } | ||
44 | |||
45 | public class NPCModule : IRegionModule, INPCModule | 38 | public class NPCModule : IRegionModule, INPCModule |
46 | { | 39 | { |
47 | // private const bool m_enabled = false; | 40 | // private const bool m_enabled = false; |
@@ -74,19 +67,32 @@ namespace OpenSim.Region.OptionalModules.World.NPC | |||
74 | 67 | ||
75 | public void Autopilot(UUID agentID, Scene scene, Vector3 pos) | 68 | public void Autopilot(UUID agentID, Scene scene, Vector3 pos) |
76 | { | 69 | { |
77 | ScenePresence sp; | 70 | lock (m_avatars) |
78 | scene.TryGetAvatar(agentID, out sp); | 71 | if (m_avatars.ContainsKey(agentID)) |
79 | sp.DoAutoPilot(0,pos,m_avatars[agentID]); | 72 | { |
73 | ScenePresence sp; | ||
74 | scene.TryGetAvatar(agentID, out sp); | ||
75 | sp.DoAutoPilot(0, pos, m_avatars[agentID]); | ||
76 | } | ||
80 | } | 77 | } |
81 | 78 | ||
82 | public void Say(UUID agentID, Scene scene, string text) | 79 | public void Say(UUID agentID, Scene scene, string text) |
83 | { | 80 | { |
84 | m_avatars[agentID].Say(text); | 81 | lock (m_avatars) |
82 | if (m_avatars.ContainsKey(agentID)) | ||
83 | { | ||
84 | m_avatars[agentID].Say(text); | ||
85 | } | ||
85 | } | 86 | } |
86 | 87 | ||
87 | public void DeleteNPC(UUID agentID, Scene scene) | 88 | public void DeleteNPC(UUID agentID, Scene scene) |
88 | { | 89 | { |
89 | scene.RemoveClient(agentID); | 90 | lock(m_avatars) |
91 | if (m_avatars.ContainsKey(agentID)) | ||
92 | { | ||
93 | scene.RemoveClient(agentID); | ||
94 | m_avatars.Remove(agentID); | ||
95 | } | ||
90 | } | 96 | } |
91 | 97 | ||
92 | 98 | ||
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs index 6e3a3ab..fcfa9fc 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs | |||
@@ -37,6 +37,7 @@ using OpenSim; | |||
37 | using OpenSim.Framework; | 37 | using OpenSim.Framework; |
38 | using OpenSim.Framework.Communications.Cache; | 38 | using OpenSim.Framework.Communications.Cache; |
39 | using OpenSim.Framework.Console; | 39 | using OpenSim.Framework.Console; |
40 | using OpenSim.Region.CoreModules.Avatar.NPC; | ||
40 | using OpenSim.Region.Framework.Interfaces; | 41 | using OpenSim.Region.Framework.Interfaces; |
41 | using OpenSim.Region.Framework.Scenes; | 42 | using OpenSim.Region.Framework.Scenes; |
42 | using OpenSim.Region.Framework.Scenes.Hypergrid; | 43 | using OpenSim.Region.Framework.Scenes.Hypergrid; |
@@ -1762,5 +1763,56 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1762 | return retVal; | 1763 | return retVal; |
1763 | } | 1764 | } |
1764 | 1765 | ||
1766 | public LSL_Key osNpcCreate(string firstname, string lastname, LSL_Vector position, LSL_Key cloneFrom) | ||
1767 | { | ||
1768 | CheckThreatLevel(ThreatLevel.High, "osNpcCreate"); | ||
1769 | |||
1770 | INPCModule module = World.RequestModuleInterface<INPCModule>(); | ||
1771 | if (module != null) | ||
1772 | { | ||
1773 | UUID x = module.CreateNPC(firstname, | ||
1774 | lastname, | ||
1775 | new Vector3((float) position.x, (float) position.y, (float) position.z), | ||
1776 | World, | ||
1777 | new UUID(cloneFrom)); | ||
1778 | |||
1779 | return new LSL_Key(x.ToString()); | ||
1780 | } | ||
1781 | return new LSL_Key(UUID.Zero.ToString()); | ||
1782 | } | ||
1783 | |||
1784 | public void osNpcMoveTo(LSL_Key npc, LSL_Vector position) | ||
1785 | { | ||
1786 | CheckThreatLevel(ThreatLevel.High, "osNpcMoveTo"); | ||
1787 | |||
1788 | INPCModule module = World.RequestModuleInterface<INPCModule>(); | ||
1789 | if (module != null) | ||
1790 | { | ||
1791 | Vector3 pos = new Vector3((float) position.x, (float) position.y, (float) position.z); | ||
1792 | module.Autopilot(new UUID(npc.m_string), World, pos); | ||
1793 | } | ||
1794 | } | ||
1795 | |||
1796 | public void osNpcSay(LSL_Key npc, string message) | ||
1797 | { | ||
1798 | CheckThreatLevel(ThreatLevel.High, "osNpcSay"); | ||
1799 | |||
1800 | INPCModule module = World.RequestModuleInterface<INPCModule>(); | ||
1801 | if (module != null) | ||
1802 | { | ||
1803 | module.Say(new UUID(npc.m_string), World, message); | ||
1804 | } | ||
1805 | } | ||
1806 | |||
1807 | public void osNpcRemove(LSL_Key npc) | ||
1808 | { | ||
1809 | CheckThreatLevel(ThreatLevel.High, "osNpcRemove"); | ||
1810 | |||
1811 | INPCModule module = World.RequestModuleInterface<INPCModule>(); | ||
1812 | if (module != null) | ||
1813 | { | ||
1814 | module.DeleteNPC(new UUID(npc.m_string), World); | ||
1815 | } | ||
1816 | } | ||
1765 | } | 1817 | } |
1766 | } | 1818 | } |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs index 0be29f2..c24dae8 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs | |||
@@ -149,5 +149,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces | |||
149 | 149 | ||
150 | LSL_List osGetLinkPrimitiveParams(int linknumber, LSL_List rules); | 150 | LSL_List osGetLinkPrimitiveParams(int linknumber, LSL_List rules); |
151 | 151 | ||
152 | |||
153 | key osNpcCreate(string user, string name, vector position, key cloneFrom); | ||
154 | void osNpcMoveTo(key npc, vector position); | ||
155 | void osNpcSay(key npc, string message); | ||
156 | void osNpcRemove(key npc); | ||
157 | |||
152 | } | 158 | } |
153 | } | 159 | } |