diff options
Diffstat (limited to 'OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs')
-rw-r--r-- | OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs | 78 |
1 files changed, 49 insertions, 29 deletions
diff --git a/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs b/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs index 9232db9..d40fa48 100644 --- a/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs +++ b/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs | |||
@@ -52,6 +52,11 @@ namespace OpenSim.Region.OptionalModules.World.NPC | |||
52 | private Dictionary<UUID, NPCAvatar> m_avatars = | 52 | private Dictionary<UUID, NPCAvatar> m_avatars = |
53 | new Dictionary<UUID, NPCAvatar>(); | 53 | new Dictionary<UUID, NPCAvatar>(); |
54 | 54 | ||
55 | |||
56 | |||
57 | private NPCOptionsFlags m_NPCOptionFlags; | ||
58 | public NPCOptionsFlags NPCOptionFlags {get {return m_NPCOptionFlags;}} | ||
59 | |||
55 | public bool Enabled { get; private set; } | 60 | public bool Enabled { get; private set; } |
56 | 61 | ||
57 | public void Initialise(IConfigSource source) | 62 | public void Initialise(IConfigSource source) |
@@ -59,6 +64,21 @@ namespace OpenSim.Region.OptionalModules.World.NPC | |||
59 | IConfig config = source.Configs["NPC"]; | 64 | IConfig config = source.Configs["NPC"]; |
60 | 65 | ||
61 | Enabled = (config != null && config.GetBoolean("Enabled", false)); | 66 | Enabled = (config != null && config.GetBoolean("Enabled", false)); |
67 | m_NPCOptionFlags = NPCOptionsFlags.None; | ||
68 | if(Enabled) | ||
69 | { | ||
70 | if(config.GetBoolean("AllowNotOwned", true)) | ||
71 | m_NPCOptionFlags |= NPCOptionsFlags.AllowNotOwned; | ||
72 | |||
73 | if(config.GetBoolean("AllowSenseAsAvatar", true)) | ||
74 | m_NPCOptionFlags |= NPCOptionsFlags.AllowSenseAsAvatar; | ||
75 | |||
76 | if(config.GetBoolean("AllowCloneOtherAvatars", true)) | ||
77 | m_NPCOptionFlags |= NPCOptionsFlags.AllowCloneOtherAvatars; | ||
78 | |||
79 | if(config.GetBoolean("NoNPCGroup", true)) | ||
80 | m_NPCOptionFlags |= NPCOptionsFlags.NoNPCGroup; | ||
81 | } | ||
62 | } | 82 | } |
63 | 83 | ||
64 | public void AddRegion(Scene scene) | 84 | public void AddRegion(Scene scene) |
@@ -167,10 +187,9 @@ namespace OpenSim.Region.OptionalModules.World.NPC | |||
167 | npcAvatar.CircuitCode = (uint)Util.RandomClass.Next(0, | 187 | npcAvatar.CircuitCode = (uint)Util.RandomClass.Next(0, |
168 | int.MaxValue); | 188 | int.MaxValue); |
169 | 189 | ||
170 | m_log.DebugFormat( | 190 | // m_log.DebugFormat( |
171 | "[NPC MODULE]: Creating NPC {0} {1} {2}, owner={3}, senseAsAgent={4} at {5} in {6}", | 191 | // "[NPC MODULE]: Creating NPC {0} {1} {2}, owner={3}, senseAsAgent={4} at {5} in {6}", |
172 | firstname, lastname, npcAvatar.AgentId, owner, | 192 | // firstname, lastname, npcAvatar.AgentId, owner, senseAsAgent, position, scene.RegionInfo.RegionName); |
173 | senseAsAgent, position, scene.RegionInfo.RegionName); | ||
174 | 193 | ||
175 | AgentCircuitData acd = new AgentCircuitData(); | 194 | AgentCircuitData acd = new AgentCircuitData(); |
176 | acd.AgentID = npcAvatar.AgentId; | 195 | acd.AgentID = npcAvatar.AgentId; |
@@ -192,36 +211,31 @@ namespace OpenSim.Region.OptionalModules.World.NPC | |||
192 | } | 211 | } |
193 | */ | 212 | */ |
194 | 213 | ||
195 | lock (m_avatars) | 214 | // ManualResetEvent ev = new ManualResetEvent(false); |
196 | { | ||
197 | scene.AuthenticateHandler.AddNewCircuit(npcAvatar.CircuitCode, | ||
198 | acd); | ||
199 | scene.AddNewAgent(npcAvatar, PresenceType.Npc); | ||
200 | 215 | ||
201 | ScenePresence sp; | 216 | // Util.FireAndForget(delegate(object x) { |
202 | if (scene.TryGetScenePresence(npcAvatar.AgentId, out sp)) | 217 | lock (m_avatars) |
203 | { | 218 | { |
204 | /* | 219 | scene.AuthenticateHandler.AddNewCircuit(npcAvatar.CircuitCode, acd); |
205 | m_log.DebugFormat( | 220 | scene.AddNewAgent(npcAvatar, PresenceType.Npc); |
206 | "[NPC MODULE]: Successfully retrieved scene presence for NPC {0} {1}", | ||
207 | sp.Name, sp.UUID); | ||
208 | */ | ||
209 | |||
210 | sp.CompleteMovement(npcAvatar, false); | ||
211 | m_avatars.Add(npcAvatar.AgentId, npcAvatar); | ||
212 | m_log.DebugFormat("[NPC MODULE]: Created NPC {0} {1}", npcAvatar.AgentId, sp.Name); | ||
213 | 221 | ||
214 | return npcAvatar.AgentId; | 222 | ScenePresence sp; |
223 | if (scene.TryGetScenePresence(npcAvatar.AgentId, out sp)) | ||
224 | { | ||
225 | |||
226 | sp.CompleteMovement(npcAvatar, false); | ||
227 | m_avatars.Add(npcAvatar.AgentId, npcAvatar); | ||
228 | // m_log.DebugFormat("[NPC MODULE]: Created NPC {0} {1}", npcAvatar.AgentId, sp.Name); | ||
229 | } | ||
215 | } | 230 | } |
216 | else | 231 | // ev.Set(); |
217 | { | 232 | // }); |
218 | m_log.WarnFormat( | ||
219 | "[NPC MODULE]: Could not find scene presence for NPC {0} {1}", | ||
220 | sp.Name, sp.UUID); | ||
221 | 233 | ||
222 | return UUID.Zero; | 234 | // ev.WaitOne(); |
223 | } | 235 | |
224 | } | 236 | // m_log.DebugFormat("[NPC MODULE]: Created NPC with id {0}", npcAvatar.AgentId); |
237 | |||
238 | return npcAvatar.AgentId; | ||
225 | } | 239 | } |
226 | 240 | ||
227 | public bool MoveToTarget(UUID agentID, Scene scene, Vector3 pos, | 241 | public bool MoveToTarget(UUID agentID, Scene scene, Vector3 pos, |
@@ -436,9 +450,15 @@ namespace OpenSim.Region.OptionalModules.World.NPC | |||
436 | { | 450 | { |
437 | NPCAvatar av; | 451 | NPCAvatar av; |
438 | if (m_avatars.TryGetValue(npcID, out av)) | 452 | if (m_avatars.TryGetValue(npcID, out av)) |
453 | { | ||
454 | if (npcID == callerID) | ||
455 | return true; | ||
439 | return CheckPermissions(av, callerID); | 456 | return CheckPermissions(av, callerID); |
457 | } | ||
440 | else | 458 | else |
459 | { | ||
441 | return false; | 460 | return false; |
461 | } | ||
442 | } | 462 | } |
443 | } | 463 | } |
444 | 464 | ||