aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Tests
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Tests')
-rw-r--r--OpenSim/Tests/Common/Helpers/SceneHelpers.cs307
-rw-r--r--OpenSim/Tests/Common/Mock/MockRegionDataPlugin.cs35
-rw-r--r--OpenSim/Tests/Common/Mock/TestClient.cs39
-rw-r--r--OpenSim/Tests/Common/Mock/TestLandChannel.cs17
-rw-r--r--OpenSim/Tests/Common/TestHelpers.cs53
-rw-r--r--OpenSim/Tests/Torture/NPCTortureTests.cs2
-rw-r--r--OpenSim/Tests/Torture/ObjectTortureTests.cs2
-rw-r--r--OpenSim/Tests/Torture/ScriptTortureTests.cs2
8 files changed, 338 insertions, 119 deletions
diff --git a/OpenSim/Tests/Common/Helpers/SceneHelpers.cs b/OpenSim/Tests/Common/Helpers/SceneHelpers.cs
index 318758d..239afc0 100644
--- a/OpenSim/Tests/Common/Helpers/SceneHelpers.cs
+++ b/OpenSim/Tests/Common/Helpers/SceneHelpers.cs
@@ -58,57 +58,74 @@ namespace OpenSim.Tests.Common
58 /// </summary> 58 /// </summary>
59 public class SceneHelpers 59 public class SceneHelpers
60 { 60 {
61 public static TestScene SetupScene() 61 /// <summary>
62 /// We need a scene manager so that test clients can retrieve a scene when performing teleport tests.
63 /// </summary>
64 public SceneManager SceneManager { get; private set; }
65
66 private AgentCircuitManager m_acm = new AgentCircuitManager();
67 private ISimulationDataService m_simDataService
68 = OpenSim.Server.Base.ServerUtils.LoadPlugin<ISimulationDataService>("OpenSim.Tests.Common.dll", null);
69 private IEstateDataService m_estateDataService = null;
70
71 private LocalAssetServicesConnector m_assetService;
72 private LocalAuthenticationServicesConnector m_authenticationService;
73 private LocalInventoryServicesConnector m_inventoryService;
74 private LocalGridServicesConnector m_gridService;
75 private LocalUserAccountServicesConnector m_userAccountService;
76 private LocalPresenceServicesConnector m_presenceService;
77
78 private CoreAssetCache m_cache;
79
80 public SceneHelpers() : this(null) {}
81
82 public SceneHelpers(CoreAssetCache cache)
62 { 83 {
63 return SetupScene(null); 84 SceneManager = new SceneManager();
85
86 m_assetService = StartAssetService(cache);
87 m_authenticationService = StartAuthenticationService();
88 m_inventoryService = StartInventoryService();
89 m_gridService = StartGridService();
90 m_userAccountService = StartUserAccountService();
91 m_presenceService = StartPresenceService();
92
93 m_inventoryService.PostInitialise();
94 m_assetService.PostInitialise();
95 m_userAccountService.PostInitialise();
96 m_presenceService.PostInitialise();
97
98 m_cache = cache;
64 } 99 }
65 100
66 /// <summary> 101 /// <summary>
67 /// Set up a test scene 102 /// Set up a test scene
68 /// </summary> 103 /// </summary>
69 /// <remarks> 104 /// <remarks>
70 /// Automatically starts service threads, as would the normal runtime. 105 /// Automatically starts services, as would the normal runtime.
71 /// </remarks> 106 /// </remarks>
72 /// <returns></returns> 107 /// <returns></returns>
73 public static TestScene SetupScene(CoreAssetCache cache) 108 public TestScene SetupScene()
74 { 109 {
75 return SetupScene("Unit test region", UUID.Random(), 1000, 1000, cache); 110 return SetupScene("Unit test region", UUID.Random(), 1000, 1000);
76 } 111 }
77 112
78 public static TestScene SetupScene(string name, UUID id, uint x, uint y) 113 public TestScene SetupScene(string name, UUID id, uint x, uint y)
79 { 114 {
80 return SetupScene(name, id, x, y, null); 115 return SetupScene(name, id, x, y, new IniConfigSource());
81 } 116 }
82 117
83 /// <summary> 118 /// <summary>
84 /// Set up a scene. If it's more then one scene, use the same CommunicationsManager to link regions 119 /// Set up a scene.
85 /// or a different, to get a brand new scene with new shared region modules.
86 /// </summary> 120 /// </summary>
87 /// <param name="name">Name of the region</param> 121 /// <param name="name">Name of the region</param>
88 /// <param name="id">ID of the region</param> 122 /// <param name="id">ID of the region</param>
89 /// <param name="x">X co-ordinate of the region</param> 123 /// <param name="x">X co-ordinate of the region</param>
90 /// <param name="y">Y co-ordinate of the region</param> 124 /// <param name="y">Y co-ordinate of the region</param>
91 /// <param name="cache"></param>
92 /// <returns></returns>
93 public static TestScene SetupScene(
94 string name, UUID id, uint x, uint y, CoreAssetCache cache)
95 {
96 return SetupScene(name, id, x, y, cache, new IniConfigSource());
97 }
98
99 /// <summary>
100 /// Set up a scene. If it's more then one scene, use the same CommunicationsManager to link regions
101 /// or a different, to get a brand new scene with new shared region modules.
102 /// </summary>
103 /// <param name="name">Name of the region</param>
104 /// <param name="id">ID of the region</param>
105 /// <param name="x">X co-ordinate of the region</param>
106 /// <param name="y">Y co-ordinate of the region</param>
107 /// <param name="cache"></param>
108 /// <param name="configSource"></param> 125 /// <param name="configSource"></param>
109 /// <returns></returns> 126 /// <returns></returns>
110 public static TestScene SetupScene( 127 public TestScene SetupScene(
111 string name, UUID id, uint x, uint y, CoreAssetCache cache, IConfigSource configSource) 128 string name, UUID id, uint x, uint y, IConfigSource configSource)
112 { 129 {
113 Console.WriteLine("Setting up test scene {0}", name); 130 Console.WriteLine("Setting up test scene {0}", name);
114 131
@@ -119,30 +136,47 @@ namespace OpenSim.Tests.Common
119 regInfo.RegionName = name; 136 regInfo.RegionName = name;
120 regInfo.RegionID = id; 137 regInfo.RegionID = id;
121 138
122 AgentCircuitManager acm = new AgentCircuitManager();
123 SceneCommunicationService scs = new SceneCommunicationService(); 139 SceneCommunicationService scs = new SceneCommunicationService();
124 140
125 ISimulationDataService simDataService = OpenSim.Server.Base.ServerUtils.LoadPlugin<ISimulationDataService>("OpenSim.Tests.Common.dll", null);
126 IEstateDataService estateDataService = null;
127
128 TestScene testScene = new TestScene( 141 TestScene testScene = new TestScene(
129 regInfo, acm, scs, simDataService, estateDataService, null, false, configSource, null); 142 regInfo, m_acm, scs, m_simDataService, m_estateDataService, null, false, configSource, null);
130 143
131 IRegionModule godsModule = new GodsModule(); 144 IRegionModule godsModule = new GodsModule();
132 godsModule.Initialise(testScene, new IniConfigSource()); 145 godsModule.Initialise(testScene, new IniConfigSource());
133 testScene.AddModule(godsModule.Name, godsModule); 146 testScene.AddModule(godsModule.Name, godsModule);
134 147
135 LocalAssetServicesConnector assetService = StartAssetService(testScene, cache); 148 // Add scene to services
136 StartAuthenticationService(testScene); 149 m_assetService.AddRegion(testScene);
137 LocalInventoryServicesConnector inventoryService = StartInventoryService(testScene); 150
138 StartGridService(testScene); 151 if (m_cache != null)
139 LocalUserAccountServicesConnector userAccountService = StartUserAccountService(testScene); 152 {
140 LocalPresenceServicesConnector presenceService = StartPresenceService(testScene); 153 m_cache.AddRegion(testScene);
141 154 m_cache.RegionLoaded(testScene);
142 inventoryService.PostInitialise(); 155 testScene.AddRegionModule(m_cache.Name, m_cache);
143 assetService.PostInitialise(); 156 }
144 userAccountService.PostInitialise(); 157
145 presenceService.PostInitialise(); 158 m_assetService.RegionLoaded(testScene);
159 testScene.AddRegionModule(m_assetService.Name, m_assetService);
160
161 m_authenticationService.AddRegion(testScene);
162 m_authenticationService.RegionLoaded(testScene);
163 testScene.AddRegionModule(m_authenticationService.Name, m_authenticationService);
164
165 m_inventoryService.AddRegion(testScene);
166 m_inventoryService.RegionLoaded(testScene);
167 testScene.AddRegionModule(m_inventoryService.Name, m_inventoryService);
168
169 m_gridService.AddRegion(testScene);
170 m_gridService.RegionLoaded(testScene);
171 testScene.AddRegionModule(m_gridService.Name, m_gridService);
172
173 m_userAccountService.AddRegion(testScene);
174 m_userAccountService.RegionLoaded(testScene);
175 testScene.AddRegionModule(m_userAccountService.Name, m_userAccountService);
176
177 m_presenceService.AddRegion(testScene);
178 m_presenceService.RegionLoaded(testScene);
179 testScene.AddRegionModule(m_presenceService.Name, m_presenceService);
146 180
147 testScene.RegionInfo.EstateSettings.EstateOwner = UUID.Random(); 181 testScene.RegionInfo.EstateSettings.EstateOwner = UUID.Random();
148 testScene.SetModuleInterfaces(); 182 testScene.SetModuleInterfaces();
@@ -153,28 +187,28 @@ namespace OpenSim.Tests.Common
153 PhysicsPluginManager physicsPluginManager = new PhysicsPluginManager(); 187 PhysicsPluginManager physicsPluginManager = new PhysicsPluginManager();
154 physicsPluginManager.LoadPluginsFromAssembly("Physics/OpenSim.Region.Physics.BasicPhysicsPlugin.dll"); 188 physicsPluginManager.LoadPluginsFromAssembly("Physics/OpenSim.Region.Physics.BasicPhysicsPlugin.dll");
155 testScene.PhysicsScene 189 testScene.PhysicsScene
156 = physicsPluginManager.GetPhysicsScene("basicphysics", "ZeroMesher", new IniConfigSource(), "test"); 190 = physicsPluginManager.GetPhysicsScene("basicphysics", "ZeroMesher", new IniConfigSource(), "test");
157 191
158 testScene.RegionInfo.EstateSettings = new EstateSettings(); 192 testScene.RegionInfo.EstateSettings = new EstateSettings();
159 testScene.LoginsDisabled = false; 193 testScene.LoginsDisabled = false;
160 testScene.RegisterRegionWithGrid(); 194 testScene.RegisterRegionWithGrid();
161 195
196 SceneManager.Add(testScene);
197
162 return testScene; 198 return testScene;
163 } 199 }
164 200
165 private static LocalAssetServicesConnector StartAssetService(Scene testScene, CoreAssetCache cache) 201 private static LocalAssetServicesConnector StartAssetService(CoreAssetCache cache)
166 { 202 {
167 LocalAssetServicesConnector assetService = new LocalAssetServicesConnector();
168 IConfigSource config = new IniConfigSource(); 203 IConfigSource config = new IniConfigSource();
169
170 config.AddConfig("Modules"); 204 config.AddConfig("Modules");
171 config.Configs["Modules"].Set("AssetServices", "LocalAssetServicesConnector"); 205 config.Configs["Modules"].Set("AssetServices", "LocalAssetServicesConnector");
172 config.AddConfig("AssetService"); 206 config.AddConfig("AssetService");
173 config.Configs["AssetService"].Set("LocalServiceModule", "OpenSim.Services.AssetService.dll:AssetService"); 207 config.Configs["AssetService"].Set("LocalServiceModule", "OpenSim.Services.AssetService.dll:AssetService");
174 config.Configs["AssetService"].Set("StorageProvider", "OpenSim.Tests.Common.dll"); 208 config.Configs["AssetService"].Set("StorageProvider", "OpenSim.Tests.Common.dll");
175 209
210 LocalAssetServicesConnector assetService = new LocalAssetServicesConnector();
176 assetService.Initialise(config); 211 assetService.Initialise(config);
177 assetService.AddRegion(testScene);
178 212
179 if (cache != null) 213 if (cache != null)
180 { 214 {
@@ -184,56 +218,43 @@ namespace OpenSim.Tests.Common
184 cacheConfig.AddConfig("AssetCache"); 218 cacheConfig.AddConfig("AssetCache");
185 219
186 cache.Initialise(cacheConfig); 220 cache.Initialise(cacheConfig);
187 cache.AddRegion(testScene);
188 cache.RegionLoaded(testScene);
189 testScene.AddRegionModule(cache.Name, cache);
190 } 221 }
191
192 assetService.RegionLoaded(testScene);
193 testScene.AddRegionModule(assetService.Name, assetService);
194 222
195 return assetService; 223 return assetService;
196 } 224 }
197 225
198 private static void StartAuthenticationService(Scene testScene) 226 private static LocalAuthenticationServicesConnector StartAuthenticationService()
199 { 227 {
200 ISharedRegionModule service = new LocalAuthenticationServicesConnector();
201 IConfigSource config = new IniConfigSource(); 228 IConfigSource config = new IniConfigSource();
202
203 config.AddConfig("Modules"); 229 config.AddConfig("Modules");
204 config.AddConfig("AuthenticationService"); 230 config.AddConfig("AuthenticationService");
205 config.Configs["Modules"].Set("AuthenticationServices", "LocalAuthenticationServicesConnector"); 231 config.Configs["Modules"].Set("AuthenticationServices", "LocalAuthenticationServicesConnector");
206 config.Configs["AuthenticationService"].Set( 232 config.Configs["AuthenticationService"].Set(
207 "LocalServiceModule", "OpenSim.Services.AuthenticationService.dll:PasswordAuthenticationService"); 233 "LocalServiceModule", "OpenSim.Services.AuthenticationService.dll:PasswordAuthenticationService");
208 config.Configs["AuthenticationService"].Set("StorageProvider", "OpenSim.Data.Null.dll"); 234 config.Configs["AuthenticationService"].Set("StorageProvider", "OpenSim.Data.Null.dll");
209 235
236 LocalAuthenticationServicesConnector service = new LocalAuthenticationServicesConnector();
210 service.Initialise(config); 237 service.Initialise(config);
211 service.AddRegion(testScene); 238
212 service.RegionLoaded(testScene); 239 return service;
213 testScene.AddRegionModule(service.Name, service);
214 //m_authenticationService = service;
215 } 240 }
216 241
217 private static LocalInventoryServicesConnector StartInventoryService(Scene testScene) 242 private static LocalInventoryServicesConnector StartInventoryService()
218 { 243 {
219 LocalInventoryServicesConnector inventoryService = new LocalInventoryServicesConnector();
220
221 IConfigSource config = new IniConfigSource(); 244 IConfigSource config = new IniConfigSource();
222 config.AddConfig("Modules"); 245 config.AddConfig("Modules");
223 config.AddConfig("InventoryService"); 246 config.AddConfig("InventoryService");
224 config.Configs["Modules"].Set("InventoryServices", "LocalInventoryServicesConnector"); 247 config.Configs["Modules"].Set("InventoryServices", "LocalInventoryServicesConnector");
225 config.Configs["InventoryService"].Set("LocalServiceModule", "OpenSim.Services.InventoryService.dll:InventoryService"); 248 config.Configs["InventoryService"].Set("LocalServiceModule", "OpenSim.Services.InventoryService.dll:InventoryService");
226 config.Configs["InventoryService"].Set("StorageProvider", "OpenSim.Tests.Common.dll"); 249 config.Configs["InventoryService"].Set("StorageProvider", "OpenSim.Tests.Common.dll");
227 250
251 LocalInventoryServicesConnector inventoryService = new LocalInventoryServicesConnector();
228 inventoryService.Initialise(config); 252 inventoryService.Initialise(config);
229 inventoryService.AddRegion(testScene);
230 inventoryService.RegionLoaded(testScene);
231 testScene.AddRegionModule(inventoryService.Name, inventoryService);
232 253
233 return inventoryService; 254 return inventoryService;
234 } 255 }
235 256
236 private static LocalGridServicesConnector StartGridService(Scene testScene) 257 private static LocalGridServicesConnector StartGridService()
237 { 258 {
238 IConfigSource config = new IniConfigSource(); 259 IConfigSource config = new IniConfigSource();
239 config.AddConfig("Modules"); 260 config.AddConfig("Modules");
@@ -245,8 +266,6 @@ namespace OpenSim.Tests.Common
245 266
246 LocalGridServicesConnector gridService = new LocalGridServicesConnector(); 267 LocalGridServicesConnector gridService = new LocalGridServicesConnector();
247 gridService.Initialise(config); 268 gridService.Initialise(config);
248 gridService.AddRegion(testScene);
249 gridService.RegionLoaded(testScene);
250 269
251 return gridService; 270 return gridService;
252 } 271 }
@@ -256,7 +275,7 @@ namespace OpenSim.Tests.Common
256 /// </summary> 275 /// </summary>
257 /// <param name="testScene"></param> 276 /// <param name="testScene"></param>
258 /// <returns></returns> 277 /// <returns></returns>
259 private static LocalUserAccountServicesConnector StartUserAccountService(Scene testScene) 278 private static LocalUserAccountServicesConnector StartUserAccountService()
260 { 279 {
261 IConfigSource config = new IniConfigSource(); 280 IConfigSource config = new IniConfigSource();
262 config.AddConfig("Modules"); 281 config.AddConfig("Modules");
@@ -268,10 +287,6 @@ namespace OpenSim.Tests.Common
268 287
269 LocalUserAccountServicesConnector userAccountService = new LocalUserAccountServicesConnector(); 288 LocalUserAccountServicesConnector userAccountService = new LocalUserAccountServicesConnector();
270 userAccountService.Initialise(config); 289 userAccountService.Initialise(config);
271
272 userAccountService.AddRegion(testScene);
273 userAccountService.RegionLoaded(testScene);
274 testScene.AddRegionModule(userAccountService.Name, userAccountService);
275 290
276 return userAccountService; 291 return userAccountService;
277 } 292 }
@@ -280,7 +295,7 @@ namespace OpenSim.Tests.Common
280 /// Start a presence service 295 /// Start a presence service
281 /// </summary> 296 /// </summary>
282 /// <param name="testScene"></param> 297 /// <param name="testScene"></param>
283 private static LocalPresenceServicesConnector StartPresenceService(Scene testScene) 298 private static LocalPresenceServicesConnector StartPresenceService()
284 { 299 {
285 IConfigSource config = new IniConfigSource(); 300 IConfigSource config = new IniConfigSource();
286 config.AddConfig("Modules"); 301 config.AddConfig("Modules");
@@ -292,10 +307,6 @@ namespace OpenSim.Tests.Common
292 307
293 LocalPresenceServicesConnector presenceService = new LocalPresenceServicesConnector(); 308 LocalPresenceServicesConnector presenceService = new LocalPresenceServicesConnector();
294 presenceService.Initialise(config); 309 presenceService.Initialise(config);
295
296 presenceService.AddRegion(testScene);
297 presenceService.RegionLoaded(testScene);
298 testScene.AddRegionModule(presenceService.Name, presenceService);
299 310
300 return presenceService; 311 return presenceService;
301 } 312 }
@@ -313,19 +324,52 @@ namespace OpenSim.Tests.Common
313 /// <summary> 324 /// <summary>
314 /// Setup modules for a scene. 325 /// Setup modules for a scene.
315 /// </summary> 326 /// </summary>
316 /// <param name="scene"></param> 327 /// <remarks>
328 /// If called directly, then all the modules must be shared modules.
329 /// </remarks>
330 /// <param name="scenes"></param>
317 /// <param name="config"></param> 331 /// <param name="config"></param>
318 /// <param name="modules"></param> 332 /// <param name="modules"></param>
319 public static void SetupSceneModules(Scene scene, IConfigSource config, params object[] modules) 333 public static void SetupSceneModules(Scene scene, IConfigSource config, params object[] modules)
320 { 334 {
335 SetupSceneModules(new Scene[] { scene }, config, modules);
336 }
337
338 /// <summary>
339 /// Setup modules for a scene using their default settings.
340 /// </summary>
341 /// <param name="scenes"></param>
342 /// <param name="modules"></param>
343 public static void SetupSceneModules(Scene[] scenes, params object[] modules)
344 {
345 SetupSceneModules(scenes, new IniConfigSource(), modules);
346 }
347
348 /// <summary>
349 /// Setup modules for scenes.
350 /// </summary>
351 /// <remarks>
352 /// If called directly, then all the modules must be shared modules.
353 /// </remarks>
354 /// <param name="scenes"></param>
355 /// <param name="config"></param>
356 /// <param name="modules"></param>
357 public static void SetupSceneModules(Scene[] scenes, IConfigSource config, params object[] modules)
358 {
321 List<IRegionModuleBase> newModules = new List<IRegionModuleBase>(); 359 List<IRegionModuleBase> newModules = new List<IRegionModuleBase>();
322 foreach (object module in modules) 360 foreach (object module in modules)
323 { 361 {
362// Console.WriteLine("MODULE RAW {0}", module);
324 if (module is IRegionModule) 363 if (module is IRegionModule)
325 { 364 {
326 IRegionModule m = (IRegionModule)module; 365 IRegionModule m = (IRegionModule)module;
327 m.Initialise(scene, config); 366
328 scene.AddModule(m.Name, m); 367 foreach (Scene scene in scenes)
368 {
369 m.Initialise(scene, config);
370 scene.AddModule(m.Name, m);
371 }
372
329 m.PostInitialise(); 373 m.PostInitialise();
330 } 374 }
331 else if (module is IRegionModuleBase) 375 else if (module is IRegionModuleBase)
@@ -333,6 +377,7 @@ namespace OpenSim.Tests.Common
333 // for the new system, everything has to be initialised first, 377 // for the new system, everything has to be initialised first,
334 // shared modules have to be post-initialised, then all get an AddRegion with the scene 378 // shared modules have to be post-initialised, then all get an AddRegion with the scene
335 IRegionModuleBase m = (IRegionModuleBase)module; 379 IRegionModuleBase m = (IRegionModuleBase)module;
380// Console.WriteLine("MODULE {0}", m.Name);
336 m.Initialise(config); 381 m.Initialise(config);
337 newModules.Add(m); 382 newModules.Add(m);
338 } 383 }
@@ -345,15 +390,19 @@ namespace OpenSim.Tests.Common
345 390
346 foreach (IRegionModuleBase module in newModules) 391 foreach (IRegionModuleBase module in newModules)
347 { 392 {
348 module.AddRegion(scene); 393 foreach (Scene scene in scenes)
349 scene.AddRegionModule(module.Name, module); 394 {
395 module.AddRegion(scene);
396 scene.AddRegionModule(module.Name, module);
397 }
350 } 398 }
351 399
352 // RegionLoaded is fired after all modules have been appropriately added to all scenes 400 // RegionLoaded is fired after all modules have been appropriately added to all scenes
353 foreach (IRegionModuleBase module in newModules) 401 foreach (IRegionModuleBase module in newModules)
354 module.RegionLoaded(scene); 402 foreach (Scene scene in scenes)
403 module.RegionLoaded(scene);
355 404
356 scene.SetModuleInterfaces(); 405 foreach (Scene scene in scenes) { scene.SetModuleInterfaces(); }
357 } 406 }
358 407
359 /// <summary> 408 /// <summary>
@@ -388,6 +437,10 @@ namespace OpenSim.Tests.Common
388 /// <summary> 437 /// <summary>
389 /// Add a root agent where the details of the agent connection (apart from the id) are unimportant for the test 438 /// Add a root agent where the details of the agent connection (apart from the id) are unimportant for the test
390 /// </summary> 439 /// </summary>
440 /// <remarks>
441 /// This can be used for tests where there is only one region or where there are multiple non-neighbour regions
442 /// and teleport doesn't take place.
443 /// </remarks>
391 /// <param name="scene"></param> 444 /// <param name="scene"></param>
392 /// <param name="agentId"></param> 445 /// <param name="agentId"></param>
393 /// <returns></returns> 446 /// <returns></returns>
@@ -397,6 +450,18 @@ namespace OpenSim.Tests.Common
397 } 450 }
398 451
399 /// <summary> 452 /// <summary>
453 /// Add a root agent where the details of the agent connection (apart from the id) are unimportant for the test
454 /// </summary>
455 /// <param name="scene"></param>
456 /// <param name="agentId"></param>
457 /// <param name="sceneManager"></param>
458 /// <returns></returns>
459 public static ScenePresence AddScenePresence(Scene scene, UUID agentId, SceneManager sceneManager)
460 {
461 return AddScenePresence(scene, GenerateAgentData(agentId), sceneManager);
462 }
463
464 /// <summary>
400 /// Add a root agent. 465 /// Add a root agent.
401 /// </summary> 466 /// </summary>
402 /// <remarks> 467 /// <remarks>
@@ -416,6 +481,30 @@ namespace OpenSim.Tests.Common
416 /// <returns></returns> 481 /// <returns></returns>
417 public static ScenePresence AddScenePresence(Scene scene, AgentCircuitData agentData) 482 public static ScenePresence AddScenePresence(Scene scene, AgentCircuitData agentData)
418 { 483 {
484 return AddScenePresence(scene, agentData, null);
485 }
486
487 /// <summary>
488 /// Add a root agent.
489 /// </summary>
490 /// <remarks>
491 /// This function
492 ///
493 /// 1) Tells the scene that an agent is coming. Normally, the login service (local if standalone, from the
494 /// userserver if grid) would give initial login data back to the client and separately tell the scene that the
495 /// agent was coming.
496 ///
497 /// 2) Connects the agent with the scene
498 ///
499 /// This function performs actions equivalent with notifying the scene that an agent is
500 /// coming and then actually connecting the agent to the scene. The one step missed out is the very first
501 /// </remarks>
502 /// <param name="scene"></param>
503 /// <param name="agentData"></param>
504 /// <param name="sceneManager"></param>
505 /// <returns></returns>
506 public static ScenePresence AddScenePresence(Scene scene, AgentCircuitData agentData, SceneManager sceneManager)
507 {
419 // We emulate the proper login sequence here by doing things in four stages 508 // We emulate the proper login sequence here by doing things in four stages
420 509
421 // Stage 0: login 510 // Stage 0: login
@@ -425,7 +514,7 @@ namespace OpenSim.Tests.Common
425 lpsc.m_PresenceService.LoginAgent(agentData.AgentID.ToString(), agentData.SessionID, agentData.SecureSessionID); 514 lpsc.m_PresenceService.LoginAgent(agentData.AgentID.ToString(), agentData.SessionID, agentData.SecureSessionID);
426 515
427 // Stages 1 & 2 516 // Stages 1 & 2
428 ScenePresence sp = IntroduceClientToScene(scene, agentData, TeleportFlags.ViaLogin); 517 ScenePresence sp = IntroduceClientToScene(scene, sceneManager, agentData, TeleportFlags.ViaLogin);
429 518
430 // Stage 3: Complete the entrance into the region. This converts the child agent into a root agent. 519 // Stage 3: Complete the entrance into the region. This converts the child agent into a root agent.
431 sp.CompleteMovement(sp.ControllingClient, true); 520 sp.CompleteMovement(sp.ControllingClient, true);
@@ -433,7 +522,20 @@ namespace OpenSim.Tests.Common
433 return sp; 522 return sp;
434 } 523 }
435 524
436 private static ScenePresence IntroduceClientToScene(Scene scene, AgentCircuitData agentData, TeleportFlags tf) 525 /// <summary>
526 /// Introduce an agent into the scene by adding a new client.
527 /// </summary>
528 /// <returns>The scene presence added</returns>
529 /// <param name='sceneManager'>
530 /// Scene manager. Can be null if there is only one region in the test or multiple regions that are not
531 /// neighbours and where no teleporting takes place.
532 /// </param>
533 /// <param name='scene'></param>
534 /// <param name='sceneManager></param>
535 /// <param name='agentData'></param>
536 /// <param name='tf'></param>
537 private static ScenePresence IntroduceClientToScene(
538 Scene scene, SceneManager sceneManager, AgentCircuitData agentData, TeleportFlags tf)
437 { 539 {
438 string reason; 540 string reason;
439 541
@@ -442,7 +544,7 @@ namespace OpenSim.Tests.Common
442 Console.WriteLine("NewUserConnection failed: " + reason); 544 Console.WriteLine("NewUserConnection failed: " + reason);
443 545
444 // Stage 2: add the new client as a child agent to the scene 546 // Stage 2: add the new client as a child agent to the scene
445 TestClient client = new TestClient(agentData, scene); 547 TestClient client = new TestClient(agentData, scene, sceneManager);
446 scene.AddNewClient(client, PresenceType.User); 548 scene.AddNewClient(client, PresenceType.User);
447 549
448 return scene.GetScenePresence(agentData.AgentID); 550 return scene.GetScenePresence(agentData.AgentID);
@@ -454,7 +556,7 @@ namespace OpenSim.Tests.Common
454 acd.child = true; 556 acd.child = true;
455 557
456 // XXX: ViaLogin may not be correct for child agents 558 // XXX: ViaLogin may not be correct for child agents
457 return IntroduceClientToScene(scene, acd, TeleportFlags.ViaLogin); 559 return IntroduceClientToScene(scene, null, acd, TeleportFlags.ViaLogin);
458 } 560 }
459 561
460 /// <summary> 562 /// <summary>
@@ -464,7 +566,7 @@ namespace OpenSim.Tests.Common
464 /// <returns></returns> 566 /// <returns></returns>
465 public static SceneObjectPart AddSceneObject(Scene scene) 567 public static SceneObjectPart AddSceneObject(Scene scene)
466 { 568 {
467 return AddSceneObject(scene, "Test Object"); 569 return AddSceneObject(scene, "Test Object", UUID.Zero);
468 } 570 }
469 571
470 /// <summary> 572 /// <summary>
@@ -472,10 +574,11 @@ namespace OpenSim.Tests.Common
472 /// </summary> 574 /// </summary>
473 /// <param name="scene"></param> 575 /// <param name="scene"></param>
474 /// <param name="name"></param> 576 /// <param name="name"></param>
577 /// <param name="ownerId"></param>
475 /// <returns></returns> 578 /// <returns></returns>
476 public static SceneObjectPart AddSceneObject(Scene scene, string name) 579 public static SceneObjectPart AddSceneObject(Scene scene, string name, UUID ownerId)
477 { 580 {
478 SceneObjectPart part = CreateSceneObjectPart(name, UUID.Random(), UUID.Zero); 581 SceneObjectPart part = CreateSceneObjectPart(name, UUID.Random(), ownerId);
479 582
480 //part.UpdatePrimFlags(false, false, true); 583 //part.UpdatePrimFlags(false, false, true);
481 //part.ObjectFlags |= (uint)PrimFlags.Phantom; 584 //part.ObjectFlags |= (uint)PrimFlags.Phantom;
@@ -522,7 +625,7 @@ namespace OpenSim.Tests.Common
522 /// <param name="ownerId"></param> 625 /// <param name="ownerId"></param>
523 /// <param name="partNamePrefix"> 626 /// <param name="partNamePrefix">
524 /// The prefix to be given to part names. This will be suffixed with "Part<part no>" 627 /// The prefix to be given to part names. This will be suffixed with "Part<part no>"
525 /// (e.g. mynamePart0 for the root part) 628 /// (e.g. mynamePart1 for the root part)
526 /// </param> 629 /// </param>
527 /// <param name="uuidTail"> 630 /// <param name="uuidTail">
528 /// The hexadecimal last part of the UUID for parts created. A UUID of the form "00000000-0000-0000-0000-{0:XD12}" 631 /// The hexadecimal last part of the UUID for parts created. A UUID of the form "00000000-0000-0000-0000-{0:XD12}"
@@ -535,14 +638,14 @@ namespace OpenSim.Tests.Common
535 638
536 SceneObjectGroup sog 639 SceneObjectGroup sog
537 = new SceneObjectGroup( 640 = new SceneObjectGroup(
538 CreateSceneObjectPart(string.Format("{0}Part0", partNamePrefix), new UUID(rawSogId), ownerId)); 641 CreateSceneObjectPart(string.Format("{0}Part1", partNamePrefix), new UUID(rawSogId), ownerId));
539 642
540 if (parts > 1) 643 if (parts > 1)
541 for (int i = 1; i < parts; i++) 644 for (int i = 2; i <= parts; i++)
542 sog.AddPart( 645 sog.AddPart(
543 CreateSceneObjectPart( 646 CreateSceneObjectPart(
544 string.Format("{0}Part{1}", partNamePrefix, i), 647 string.Format("{0}Part{1}", partNamePrefix, i),
545 new UUID(string.Format("00000000-0000-0000-0000-{0:X12}", uuidTail + i)), 648 new UUID(string.Format("00000000-0000-0000-0000-{0:X12}", uuidTail + i - 1)),
546 ownerId)); 649 ownerId));
547 650
548 return sog; 651 return sog;
diff --git a/OpenSim/Tests/Common/Mock/MockRegionDataPlugin.cs b/OpenSim/Tests/Common/Mock/MockRegionDataPlugin.cs
index 579d41c..1845eb9 100644
--- a/OpenSim/Tests/Common/Mock/MockRegionDataPlugin.cs
+++ b/OpenSim/Tests/Common/Mock/MockRegionDataPlugin.cs
@@ -112,6 +112,21 @@ namespace OpenSim.Data.Null
112 { 112 {
113 m_store.StoreRegionWindlightSettings(wl); 113 m_store.StoreRegionWindlightSettings(wl);
114 } 114 }
115
116 public string LoadRegionEnvironmentSettings(UUID regionUUID)
117 {
118 return m_store.LoadRegionEnvironmentSettings(regionUUID);
119 }
120
121 public void StoreRegionEnvironmentSettings(UUID regionUUID, string settings)
122 {
123 m_store.StoreRegionEnvironmentSettings(regionUUID, settings);
124 }
125
126 public void RemoveRegionEnvironmentSettings(UUID regionUUID)
127 {
128 m_store.RemoveRegionEnvironmentSettings(regionUUID);
129 }
115 } 130 }
116 131
117 /// <summary> 132 /// <summary>
@@ -158,7 +173,25 @@ namespace OpenSim.Data.Null
158 { 173 {
159 //This connector doesn't support the windlight module yet 174 //This connector doesn't support the windlight module yet
160 } 175 }
161 176
177 #region Environment Settings
178 public string LoadRegionEnvironmentSettings(UUID regionUUID)
179 {
180 //This connector doesn't support the Environment module yet
181 return string.Empty;
182 }
183
184 public void StoreRegionEnvironmentSettings(UUID regionUUID, string settings)
185 {
186 //This connector doesn't support the Environment module yet
187 }
188
189 public void RemoveRegionEnvironmentSettings(UUID regionUUID)
190 {
191 //This connector doesn't support the Environment module yet
192 }
193 #endregion
194
162 public RegionSettings LoadRegionSettings(UUID regionUUID) 195 public RegionSettings LoadRegionSettings(UUID regionUUID)
163 { 196 {
164 RegionSettings rs = null; 197 RegionSettings rs = null;
diff --git a/OpenSim/Tests/Common/Mock/TestClient.cs b/OpenSim/Tests/Common/Mock/TestClient.cs
index b2c824c..8cea476f 100644
--- a/OpenSim/Tests/Common/Mock/TestClient.cs
+++ b/OpenSim/Tests/Common/Mock/TestClient.cs
@@ -46,12 +46,10 @@ namespace OpenSim.Tests.Common.Mock
46 46
47 EventWaitHandle wh = new EventWaitHandle (false, EventResetMode.AutoReset, "Crossing"); 47 EventWaitHandle wh = new EventWaitHandle (false, EventResetMode.AutoReset, "Crossing");
48 48
49 // TODO: This is a really nasty (and temporary) means of telling the test client which scene to invoke setup
50 // methods on when a teleport is requested
51 public Scene TeleportTargetScene;
52 private TestClient TeleportSceneClient; 49 private TestClient TeleportSceneClient;
53 50
54 private Scene m_scene; 51 private Scene m_scene;
52 private SceneManager m_sceneManager;
55 53
56 // Properties so that we can get at received data for test purposes 54 // Properties so that we can get at received data for test purposes
57 public List<UUID> ReceivedOfflineNotifications { get; private set; } 55 public List<UUID> ReceivedOfflineNotifications { get; private set; }
@@ -435,15 +433,29 @@ namespace OpenSim.Tests.Common.Mock
435 /// <summary> 433 /// <summary>
436 /// Constructor 434 /// Constructor
437 /// </summary> 435 /// </summary>
436 /// <remarks>
437 /// Can be used for a test where there is only one region or where there are multiple regions that are not
438 /// neighbours and where no teleporting takes place. In other situations, the constructor that takes in a
439 /// scene manager should be used.
440 /// </remarks>
438 /// <param name="agentData"></param> 441 /// <param name="agentData"></param>
439 /// <param name="scene"></param> 442 /// <param name="scene"></param>
440 public TestClient(AgentCircuitData agentData, Scene scene) 443 public TestClient(AgentCircuitData agentData, Scene scene) : this(agentData, scene, null) {}
444
445 /// <summary>
446 /// Constructor
447 /// </summary>
448 /// <param name="agentData"></param>
449 /// <param name="scene"></param>
450 /// <param name="sceneManager"></param>
451 public TestClient(AgentCircuitData agentData, Scene scene, SceneManager sceneManager)
441 { 452 {
442 m_agentId = agentData.AgentID; 453 m_agentId = agentData.AgentID;
443 m_firstName = agentData.firstname; 454 m_firstName = agentData.firstname;
444 m_lastName = agentData.lastname; 455 m_lastName = agentData.lastname;
445 m_circuitCode = agentData.circuitcode; 456 m_circuitCode = agentData.circuitcode;
446 m_scene = scene; 457 m_scene = scene;
458 m_sceneManager = sceneManager;
447 SessionId = agentData.SessionID; 459 SessionId = agentData.SessionID;
448 SecureSessionId = agentData.SecureSessionID; 460 SecureSessionId = agentData.SecureSessionID;
449 CapsSeedUrl = agentData.CapsPath; 461 CapsSeedUrl = agentData.CapsPath;
@@ -593,8 +605,16 @@ namespace OpenSim.Tests.Common.Mock
593 AgentCircuitData newAgent = RequestClientInfo(); 605 AgentCircuitData newAgent = RequestClientInfo();
594 606
595 // Stage 2: add the new client as a child agent to the scene 607 // Stage 2: add the new client as a child agent to the scene
596 TeleportSceneClient = new TestClient(newAgent, TeleportTargetScene); 608 uint x, y;
597 TeleportTargetScene.AddNewClient(TeleportSceneClient, PresenceType.User); 609 Utils.LongToUInts(neighbourHandle, out x, out y);
610 x /= Constants.RegionSize;
611 y /= Constants.RegionSize;
612
613 Scene neighbourScene;
614 m_sceneManager.TryGetScene(x, y, out neighbourScene);
615
616 TeleportSceneClient = new TestClient(newAgent, neighbourScene, m_sceneManager);
617 neighbourScene.AddNewClient(TeleportSceneClient, PresenceType.User);
598 } 618 }
599 619
600 public virtual void SendRegionTeleport(ulong regionHandle, byte simAccess, IPEndPoint regionExternalEndPoint, 620 public virtual void SendRegionTeleport(ulong regionHandle, byte simAccess, IPEndPoint regionExternalEndPoint,
@@ -604,6 +624,13 @@ namespace OpenSim.Tests.Common.Mock
604 624
605 CapsSeedUrl = capsURL; 625 CapsSeedUrl = capsURL;
606 626
627 // We don't do this here so that the source region can complete processing first in a single-threaded
628 // regression test scenario. The test itself will have to call CompleteTeleportClientSide() after a teleport
629 // CompleteTeleportClientSide();
630 }
631
632 public void CompleteTeleportClientSide()
633 {
607 TeleportSceneClient.CompleteMovement(); 634 TeleportSceneClient.CompleteMovement();
608 //TeleportTargetScene.AgentCrossing(newAgent.AgentID, new Vector3(90, 90, 90), false); 635 //TeleportTargetScene.AgentCrossing(newAgent.AgentID, new Vector3(90, 90, 90), false);
609 } 636 }
diff --git a/OpenSim/Tests/Common/Mock/TestLandChannel.cs b/OpenSim/Tests/Common/Mock/TestLandChannel.cs
index 0e4dfb9..4b4d52d 100644
--- a/OpenSim/Tests/Common/Mock/TestLandChannel.cs
+++ b/OpenSim/Tests/Common/Mock/TestLandChannel.cs
@@ -46,6 +46,14 @@ namespace OpenSim.Tests.Common.Mock
46 { 46 {
47 m_scene = scene; 47 m_scene = scene;
48 m_parcels = new List<ILandObject>(); 48 m_parcels = new List<ILandObject>();
49 SetupDefaultParcel();
50 }
51
52 private void SetupDefaultParcel()
53 {
54 ILandObject obj = new LandObject(UUID.Zero, false, m_scene);
55 obj.LandData.Name = "Your Parcel";
56 m_parcels.Add(obj);
49 } 57 }
50 58
51 public List<ILandObject> ParcelsNearPoint(Vector3 position) 59 public List<ILandObject> ParcelsNearPoint(Vector3 position)
@@ -63,11 +71,7 @@ namespace OpenSim.Tests.Common.Mock
63 m_parcels.Clear(); 71 m_parcels.Clear();
64 72
65 if (setupDefaultParcel) 73 if (setupDefaultParcel)
66 { 74 SetupDefaultParcel();
67 ILandObject obj = new LandObject(UUID.Zero, false, m_scene);
68 obj.LandData.Name = "Your Parcel";
69 m_parcels.Add(obj);
70 }
71 } 75 }
72 76
73 protected ILandObject GetNoLand() 77 protected ILandObject GetNoLand()
@@ -102,6 +106,5 @@ namespace OpenSim.Tests.Common.Mock
102 106
103 public void Join(int start_x, int start_y, int end_x, int end_y, UUID attempting_user_id) {} 107 public void Join(int start_x, int start_y, int end_x, int end_y, UUID attempting_user_id) {}
104 public void Subdivide(int start_x, int start_y, int end_x, int end_y, UUID attempting_user_id) {} 108 public void Subdivide(int start_x, int start_y, int end_x, int end_y, UUID attempting_user_id) {}
105
106 } 109 }
107} 110} \ No newline at end of file
diff --git a/OpenSim/Tests/Common/TestHelpers.cs b/OpenSim/Tests/Common/TestHelpers.cs
index ced06de..d38d692 100644
--- a/OpenSim/Tests/Common/TestHelpers.cs
+++ b/OpenSim/Tests/Common/TestHelpers.cs
@@ -27,6 +27,8 @@
27 27
28using System; 28using System;
29using System.Diagnostics; 29using System.Diagnostics;
30using System.IO;
31using System.Text;
30using NUnit.Framework; 32using NUnit.Framework;
31using OpenMetaverse; 33using OpenMetaverse;
32 34
@@ -34,6 +36,38 @@ namespace OpenSim.Tests.Common
34{ 36{
35 public class TestHelpers 37 public class TestHelpers
36 { 38 {
39 private static Stream EnableLoggingConfigStream
40 = new MemoryStream(
41 Encoding.UTF8.GetBytes(
42@"<log4net>
43 <!-- A1 is set to be a ConsoleAppender -->
44 <appender name=""A1"" type=""log4net.Appender.ConsoleAppender"">
45
46 <!-- A1 uses PatternLayout -->
47 <layout type=""log4net.Layout.PatternLayout"">
48 <!-- Print the date in ISO 8601 format -->
49 <!-- <conversionPattern value=""%date [%thread] %-5level %logger %ndc - %message%newline"" /> -->
50 <conversionPattern value=""%date %message%newline"" />
51 </layout>
52 </appender>
53
54 <!-- Set root logger level to DEBUG and its only appender to A1 -->
55 <root>
56 <level value=""DEBUG"" />
57 <appender-ref ref=""A1"" />
58 </root>
59</log4net>"));
60
61 private static Stream DisableLoggingConfigStream
62 = new MemoryStream(
63 Encoding.UTF8.GetBytes(
64// "<?xml version=\"1.0\" encoding=\"utf-8\" ?><configuration><log4net><root><level value=\"OFF\"/><appender-ref ref=\"A1\"/></root></log4net></configuration>"));
65 //"<?xml version=\"1.0\" encoding=\"utf-8\" ?><configuration><log4net><root><level value=\"OFF\"/></root></log4net></configuration>")));
66// "<configuration><log4net><root><level value=\"OFF\"/></root></log4net></configuration>"));
67// "<configuration><log4net><root></root></log4net></configuration>")));
68// "<configuration><log4net><root/></log4net></configuration>"));
69 "<log4net><root/></log4net>"));
70
37 public static bool AssertThisDelegateCausesArgumentException(TestDelegate d) 71 public static bool AssertThisDelegateCausesArgumentException(TestDelegate d)
38 { 72 {
39 try 73 try
@@ -58,6 +92,25 @@ namespace OpenSim.Tests.Common
58 Console.WriteLine("===> In Test Method : {0} <===", stackTrace.GetFrame(1).GetMethod().Name); 92 Console.WriteLine("===> In Test Method : {0} <===", stackTrace.GetFrame(1).GetMethod().Name);
59 } 93 }
60 94
95 public static void EnableLogging()
96 {
97 log4net.Config.XmlConfigurator.Configure(EnableLoggingConfigStream);
98 }
99
100 /// <summary>
101 /// Disable logging whilst running the tests.
102 /// </summary>
103 /// <remarks>
104 /// Remember, if a regression test throws an exception before completing this will not be invoked if it's at
105 /// the end of the test.
106 /// TODO: Always invoke this after every test - probably need to make all test cases inherit from a common
107 /// TestCase class where this can be done.
108 /// </remarks>
109 public static void DisableLogging()
110 {
111 log4net.Config.XmlConfigurator.Configure(DisableLoggingConfigStream);
112 }
113
61 /// <summary> 114 /// <summary>
62 /// Parse tail section into full UUID. 115 /// Parse tail section into full UUID.
63 /// </summary> 116 /// </summary>
diff --git a/OpenSim/Tests/Torture/NPCTortureTests.cs b/OpenSim/Tests/Torture/NPCTortureTests.cs
index 0224505..731df68 100644
--- a/OpenSim/Tests/Torture/NPCTortureTests.cs
+++ b/OpenSim/Tests/Torture/NPCTortureTests.cs
@@ -98,7 +98,7 @@ namespace OpenSim.Tests.Torture
98 umm = new UserManagementModule(); 98 umm = new UserManagementModule();
99 am = new AttachmentsModule(); 99 am = new AttachmentsModule();
100 100
101 scene = SceneHelpers.SetupScene(); 101 scene = new SceneHelpers().SetupScene();
102 SceneHelpers.SetupSceneModules(scene, config, afm, umm, am, new BasicInventoryAccessModule(), new NPCModule()); 102 SceneHelpers.SetupSceneModules(scene, config, afm, umm, am, new BasicInventoryAccessModule(), new NPCModule());
103 } 103 }
104 104
diff --git a/OpenSim/Tests/Torture/ObjectTortureTests.cs b/OpenSim/Tests/Torture/ObjectTortureTests.cs
index d0d2199..195d47b 100644
--- a/OpenSim/Tests/Torture/ObjectTortureTests.cs
+++ b/OpenSim/Tests/Torture/ObjectTortureTests.cs
@@ -126,7 +126,7 @@ namespace OpenSim.Tests.Torture
126 // Using a local variable for scene, at least on mono 2.6.7, means that it's much more likely to be garbage 126 // Using a local variable for scene, at least on mono 2.6.7, means that it's much more likely to be garbage
127 // collected when we teardown this test. If it's done in a member variable, even if that is subsequently 127 // collected when we teardown this test. If it's done in a member variable, even if that is subsequently
128 // nulled out, the garbage collect can be delayed. 128 // nulled out, the garbage collect can be delayed.
129 TestScene scene = SceneHelpers.SetupScene(); 129 TestScene scene = new SceneHelpers().SetupScene();
130 130
131// Process process = Process.GetCurrentProcess(); 131// Process process = Process.GetCurrentProcess();
132// long startProcessMemory = process.PrivateMemorySize64; 132// long startProcessMemory = process.PrivateMemorySize64;
diff --git a/OpenSim/Tests/Torture/ScriptTortureTests.cs b/OpenSim/Tests/Torture/ScriptTortureTests.cs
index 2ef55b3..24f278f 100644
--- a/OpenSim/Tests/Torture/ScriptTortureTests.cs
+++ b/OpenSim/Tests/Torture/ScriptTortureTests.cs
@@ -84,7 +84,7 @@ namespace OpenSim.Tests.Torture
84 // to AssemblyResolver.OnAssemblyResolve fails. 84 // to AssemblyResolver.OnAssemblyResolve fails.
85 xEngineConfig.Set("AppDomainLoading", "false"); 85 xEngineConfig.Set("AppDomainLoading", "false");
86 86
87 m_scene = SceneHelpers.SetupScene("My Test", UUID.Random(), 1000, 1000, null, configSource); 87 m_scene = new SceneHelpers().SetupScene("My Test", UUID.Random(), 1000, 1000, configSource);
88 SceneHelpers.SetupSceneModules(m_scene, configSource, m_xEngine, wcModule); 88 SceneHelpers.SetupSceneModules(m_scene, configSource, m_xEngine, wcModule);
89 89
90 m_scene.EventManager.OnChatFromWorld += OnChatFromWorld; 90 m_scene.EventManager.OnChatFromWorld += OnChatFromWorld;