diff options
-rw-r--r-- | OpenSim/Region/Framework/Scenes/SceneBase.cs | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/OpenSim/Region/Framework/Scenes/SceneBase.cs b/OpenSim/Region/Framework/Scenes/SceneBase.cs index 6f172e7..a928db4 100644 --- a/OpenSim/Region/Framework/Scenes/SceneBase.cs +++ b/OpenSim/Region/Framework/Scenes/SceneBase.cs | |||
@@ -82,6 +82,13 @@ namespace OpenSim.Region.Framework.Scenes | |||
82 | /// </value> | 82 | /// </value> |
83 | protected Dictionary<Type, List<object>> ModuleInterfaces = new Dictionary<Type, List<object>>(); | 83 | protected Dictionary<Type, List<object>> ModuleInterfaces = new Dictionary<Type, List<object>>(); |
84 | 84 | ||
85 | /// <summary> | ||
86 | /// These two objects hold the information about any formats used | ||
87 | /// by modules that hold agent specific data. | ||
88 | /// </summary> | ||
89 | protected List<UUID> FormatsOffered = new List<UUID>(); | ||
90 | protected Dictionary<object, List<UUID>> FormatsWanted = new Dictionary<object, List<UUID>>(); | ||
91 | |||
85 | protected Dictionary<string, object> ModuleAPIMethods = new Dictionary<string, object>(); | 92 | protected Dictionary<string, object> ModuleAPIMethods = new Dictionary<string, object>(); |
86 | 93 | ||
87 | /// <value> | 94 | /// <value> |
@@ -367,6 +374,31 @@ namespace OpenSim.Region.Framework.Scenes | |||
367 | return m_moduleCommanders; | 374 | return m_moduleCommanders; |
368 | } | 375 | } |
369 | 376 | ||
377 | protected void CheckAndAddAgentDataFormats(object mod) | ||
378 | { | ||
379 | if (!(mod is IAgentStatefulModule)) | ||
380 | return; | ||
381 | |||
382 | IAgentStatefulModule m = (IAgentStatefulModule)mod; | ||
383 | |||
384 | List<UUID> renderFormats = m.GetRenderStateFormats(); | ||
385 | List<UUID> acceptFormats = m.GetAcceptStateFormats(); | ||
386 | |||
387 | foreach (UUID render in renderFormats) | ||
388 | { | ||
389 | if (!(FormatsOffered.Contains(render))) | ||
390 | FormatsOffered.Add(render); | ||
391 | } | ||
392 | |||
393 | if (acceptFormats.Count == 0) | ||
394 | return; | ||
395 | |||
396 | if (FormatsWanted.ContainsKey(mod)) | ||
397 | return; | ||
398 | |||
399 | FormatsWanted[mod] = acceptFormats; | ||
400 | } | ||
401 | |||
370 | /// <summary> | 402 | /// <summary> |
371 | /// Register an interface to a region module. This allows module methods to be called directly as | 403 | /// Register an interface to a region module. This allows module methods to be called directly as |
372 | /// well as via events. If there is already a module registered for this interface, it is not replaced | 404 | /// well as via events. If there is already a module registered for this interface, it is not replaced |
@@ -389,6 +421,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
389 | 421 | ||
390 | l.Add(mod); | 422 | l.Add(mod); |
391 | 423 | ||
424 | CheckAndAddAgentDataFormats(mod); | ||
425 | |||
392 | if (mod is IEntityCreator) | 426 | if (mod is IEntityCreator) |
393 | { | 427 | { |
394 | IEntityCreator entityCreator = (IEntityCreator)mod; | 428 | IEntityCreator entityCreator = (IEntityCreator)mod; |
@@ -401,6 +435,14 @@ namespace OpenSim.Region.Framework.Scenes | |||
401 | 435 | ||
402 | public void UnregisterModuleInterface<M>(M mod) | 436 | public void UnregisterModuleInterface<M>(M mod) |
403 | { | 437 | { |
438 | // We can't unregister agent stateful modules because | ||
439 | // that would require much more data to be held about formats | ||
440 | // and would make that code slower and less efficient. | ||
441 | // No known modules are unregistered anyway, ever, unless | ||
442 | // the simulator shuts down anyway. | ||
443 | if (mod is IAgentStatefulModule) | ||
444 | return; | ||
445 | |||
404 | List<Object> l; | 446 | List<Object> l; |
405 | if (ModuleInterfaces.TryGetValue(typeof(M), out l)) | 447 | if (ModuleInterfaces.TryGetValue(typeof(M), out l)) |
406 | { | 448 | { |
@@ -431,6 +473,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
431 | 473 | ||
432 | l.Add(mod); | 474 | l.Add(mod); |
433 | 475 | ||
476 | CheckAndAddAgentDataFormats(mod); | ||
477 | |||
434 | if (mod is IEntityCreator) | 478 | if (mod is IEntityCreator) |
435 | { | 479 | { |
436 | IEntityCreator entityCreator = (IEntityCreator)mod; | 480 | IEntityCreator entityCreator = (IEntityCreator)mod; |