aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim.RegionServer/world
diff options
context:
space:
mode:
authorMW2007-05-17 10:24:10 +0000
committerMW2007-05-17 10:24:10 +0000
commitaae0222f8154a32d71112a8a468412efa5b857da (patch)
tree30342f61cf94448396b87794bf25c40522417403 /OpenSim.RegionServer/world
parentImplemented initial login code for the management agent (diff)
downloadopensim-SC_OLD-aae0222f8154a32d71112a8a468412efa5b857da.zip
opensim-SC_OLD-aae0222f8154a32d71112a8a468412efa5b857da.tar.gz
opensim-SC_OLD-aae0222f8154a32d71112a8a468412efa5b857da.tar.bz2
opensim-SC_OLD-aae0222f8154a32d71112a8a468412efa5b857da.tar.xz
More OO and abstract goodness for Gareth to drool over. Cleaned up the World class a bit and added a WorldBase class (that World now inherits from)
Diffstat (limited to 'OpenSim.RegionServer/world')
-rw-r--r--OpenSim.RegionServer/world/World.PacketHandlers.cs1
-rw-r--r--OpenSim.RegionServer/world/World.cs302
-rw-r--r--OpenSim.RegionServer/world/WorldBase.cs176
3 files changed, 296 insertions, 183 deletions
diff --git a/OpenSim.RegionServer/world/World.PacketHandlers.cs b/OpenSim.RegionServer/world/World.PacketHandlers.cs
index 362bc14..175b777 100644
--- a/OpenSim.RegionServer/world/World.PacketHandlers.cs
+++ b/OpenSim.RegionServer/world/World.PacketHandlers.cs
@@ -15,6 +15,7 @@ namespace OpenSim.world
15{ 15{
16 public partial class World 16 public partial class World
17 { 17 {
18
18 public bool ModifyTerrain(SimClient simClient, Packet packet) 19 public bool ModifyTerrain(SimClient simClient, Packet packet)
19 { 20 {
20 ModifyLandPacket modify = (ModifyLandPacket)packet; 21 ModifyLandPacket modify = (ModifyLandPacket)packet;
diff --git a/OpenSim.RegionServer/world/World.cs b/OpenSim.RegionServer/world/World.cs
index 640ab81..72214d4 100644
--- a/OpenSim.RegionServer/world/World.cs
+++ b/OpenSim.RegionServer/world/World.cs
@@ -18,33 +18,39 @@ using OpenSim.Terrain;
18 18
19namespace OpenSim.world 19namespace OpenSim.world
20{ 20{
21 public partial class World : ILocalStorageReceiver, IScriptAPI 21 public partial class World : WorldBase, ILocalStorageReceiver, IScriptAPI
22 { 22 {
23 public object LockPhysicsEngine = new object(); 23 public object LockPhysicsEngine = new object();
24 public Dictionary<libsecondlife.LLUUID, Entity> Entities;
25 public Dictionary<libsecondlife.LLUUID, Avatar> Avatars; 24 public Dictionary<libsecondlife.LLUUID, Avatar> Avatars;
26 public Dictionary<libsecondlife.LLUUID, Primitive> Prims; 25 public Dictionary<libsecondlife.LLUUID, Primitive> Prims;
27 //public ScriptEngine Scripts; 26 //public ScriptEngine Scripts;
28 public TerrainEngine Terrain; //TODO: Replace TerrainManager with this.
29 public uint _localNumber = 0; 27 public uint _localNumber = 0;
30 private PhysicsScene phyScene; 28 private PhysicsScene phyScene;
31 private float timeStep = 0.1f; 29 private float timeStep = 0.1f;
32 private libsecondlife.TerrainManager TerrainManager; // To be referenced via TerrainEngine
33 public ILocalStorage localStorage; 30 public ILocalStorage localStorage;
34 private Random Rand = new Random(); 31 private Random Rand = new Random();
35 private uint _primCount = 702000; 32 private uint _primCount = 702000;
36 private int storageCount; 33 private int storageCount;
37 private Dictionary<uint, SimClient> m_clientThreads;
38 private Dictionary<LLUUID, ScriptHandler> m_scriptHandlers; 34 private Dictionary<LLUUID, ScriptHandler> m_scriptHandlers;
39 private Dictionary<string, ScriptFactory> m_scripts; 35 private Dictionary<string, ScriptFactory> m_scripts;
40 private ulong m_regionHandle;
41 private string m_regionName;
42 private InventoryCache _inventoryCache;
43 private AssetCache _assetCache;
44 private Mutex updateLock; 36 private Mutex updateLock;
45 private RegionInfo m_regInfo;
46 public string m_datastore; 37 public string m_datastore;
47 38
39 #region Properties
40 public PhysicsScene PhysScene
41 {
42 set
43 {
44 this.phyScene = value;
45 }
46 get
47 {
48 return (this.phyScene);
49 }
50 }
51 #endregion
52
53 #region Constructors
48 /// <summary> 54 /// <summary>
49 /// Creates a new World class, and a region to go with it. 55 /// Creates a new World class, and a region to go with it.
50 /// </summary> 56 /// </summary>
@@ -85,7 +91,9 @@ namespace OpenSim.world
85 OpenSim.Framework.Console.MainConsole.Instance.WriteLine(OpenSim.Framework.Console.LogPriority.CRITICAL,"World.cs: Constructor failed with exception " + e.ToString()); 91 OpenSim.Framework.Console.MainConsole.Instance.WriteLine(OpenSim.Framework.Console.LogPriority.CRITICAL,"World.cs: Constructor failed with exception " + e.ToString());
86 } 92 }
87 } 93 }
94 #endregion
88 95
96 #region Script Methods
89 /// <summary> 97 /// <summary>
90 /// Loads a new script into the specified entity 98 /// Loads a new script into the specified entity
91 /// </summary> 99 /// </summary>
@@ -156,37 +164,13 @@ namespace OpenSim.world
156 } 164 }
157 } 165 }
158 166
159 public InventoryCache InventoryCache 167 #endregion
160 {
161 set
162 {
163 this._inventoryCache = value;
164 }
165 }
166
167 public AssetCache AssetCache
168 {
169 set
170 {
171 this._assetCache = value;
172 }
173 }
174 public PhysicsScene PhysScene
175 {
176 set
177 {
178 this.phyScene = value;
179 }
180 get
181 {
182 return (this.phyScene);
183 }
184 }
185 168
169 #region Update Methods
186 /// <summary> 170 /// <summary>
187 /// Performs per-frame updates on the world, this should be the central world loop 171 /// Performs per-frame updates on the world, this should be the central world loop
188 /// </summary> 172 /// </summary>
189 public void Update() 173 public override void Update()
190 { 174 {
191 updateLock.WaitOne(); 175 updateLock.WaitOne();
192 try 176 try
@@ -235,6 +219,40 @@ namespace OpenSim.world
235 updateLock.ReleaseMutex(); 219 updateLock.ReleaseMutex();
236 } 220 }
237 221
222 public bool Backup()
223 {
224 try
225 {
226 // Terrain backup routines
227 if (Terrain.tainted > 0)
228 {
229 Terrain.tainted = 0;
230 OpenSim.Framework.Console.MainConsole.Instance.WriteLine(OpenSim.Framework.Console.LogPriority.LOW, "World.cs: Backup() - Terrain tainted, saving.");
231 localStorage.SaveMap(Terrain.getHeights1D());
232 OpenSim.Framework.Console.MainConsole.Instance.WriteLine(OpenSim.Framework.Console.LogPriority.LOW, "World.cs: Backup() - Terrain saved, informing Physics.");
233 phyScene.SetTerrain(Terrain.getHeights1D());
234 }
235
236 // Primitive backup routines
237 OpenSim.Framework.Console.MainConsole.Instance.WriteLine(OpenSim.Framework.Console.LogPriority.LOW, "World.cs: Backup() - Backing up Primitives");
238 foreach (libsecondlife.LLUUID UUID in Entities.Keys)
239 {
240 Entities[UUID].BackUp();
241 }
242
243 // Backup successful
244 return true;
245 }
246 catch (Exception e)
247 {
248 // Backup failed
249 OpenSim.Framework.Console.MainConsole.Instance.WriteLine(OpenSim.Framework.Console.LogPriority.HIGH, "World.cs: Backup() - Backup Failed with exception " + e.ToString());
250 return false;
251 }
252 }
253 #endregion
254
255 #region Setup Methods
238 /// <summary> 256 /// <summary>
239 /// Loads a new storage subsystem from a named library 257 /// Loads a new storage subsystem from a named library
240 /// </summary> 258 /// </summary>
@@ -279,6 +297,16 @@ namespace OpenSim.world
279 } 297 }
280 } 298 }
281 299
300 public void SetDefaultScripts()
301 {
302 this.m_scripts.Add("FollowRandomAvatar", delegate()
303 {
304 return new OpenSim.RegionServer.world.scripting.FollowRandomAvatar();
305 });
306 }
307
308 #endregion
309
282 #region Regenerate Terrain 310 #region Regenerate Terrain
283 311
284 /// <summary> 312 /// <summary>
@@ -375,10 +403,11 @@ namespace OpenSim.world
375 403
376 #endregion 404 #endregion
377 405
406 #region Load Terrain
378 /// <summary> 407 /// <summary>
379 /// Loads the World heightmap 408 /// Loads the World heightmap
380 /// </summary> 409 /// </summary>
381 public void LoadWorldMap() 410 public override void LoadWorldMap()
382 { 411 {
383 try 412 try
384 { 413 {
@@ -400,6 +429,32 @@ namespace OpenSim.world
400 OpenSim.Framework.Console.MainConsole.Instance.WriteLine(OpenSim.Framework.Console.LogPriority.MEDIUM,"World.cs: LoadWorldMap() - Failed with exception " + e.ToString()); 429 OpenSim.Framework.Console.MainConsole.Instance.WriteLine(OpenSim.Framework.Console.LogPriority.MEDIUM,"World.cs: LoadWorldMap() - Failed with exception " + e.ToString());
401 } 430 }
402 } 431 }
432 #endregion
433
434 #region Primitives Methods
435
436 /// <summary>
437 /// Sends prims to a client
438 /// </summary>
439 /// <param name="RemoteClient">Client to send to</param>
440 public void GetInitialPrims(SimClient RemoteClient)
441 {
442 try
443 {
444 foreach (libsecondlife.LLUUID UUID in Entities.Keys)
445 {
446 if (Entities[UUID] is Primitive)
447 {
448 Primitive primitive = Entities[UUID] as Primitive;
449 primitive.UpdateClient(RemoteClient);
450 }
451 }
452 }
453 catch (Exception e)
454 {
455 OpenSim.Framework.Console.MainConsole.Instance.WriteLine(OpenSim.Framework.Console.LogPriority.MEDIUM, "World.cs: GetInitialPrims() - Failed with exception " + e.ToString());
456 }
457 }
403 458
404 /// <summary> 459 /// <summary>
405 /// Loads the World's objects 460 /// Loads the World's objects
@@ -440,108 +495,37 @@ namespace OpenSim.world
440 } 495 }
441 } 496 }
442 497
443 /// <summary> 498 public void AddNewPrim(ObjectAddPacket addPacket, SimClient AgentClient)
444 /// Tidy before shutdown
445 /// </summary>
446 public void Close()
447 {
448 try
449 {
450 this.localStorage.ShutDown();
451 }
452 catch (Exception e)
453 {
454 OpenSim.Framework.Console.MainConsole.Instance.WriteLine(OpenSim.Framework.Console.LogPriority.HIGH,"World.cs: Close() - Failed with exception " + e.ToString());
455 }
456 }
457
458 /// <summary>
459 /// Send the region heightmap to the client
460 /// </summary>
461 /// <param name="RemoteClient">Client to send to</param>
462 public void SendLayerData(SimClient RemoteClient)
463 { 499 {
464 try 500 try
465 { 501 {
466 int[] patches = new int[4]; 502 OpenSim.Framework.Console.MainConsole.Instance.WriteLine(OpenSim.Framework.Console.LogPriority.LOW, "World.cs: AddNewPrim() - Creating new prim");
467 503 Primitive prim = new Primitive(m_clientThreads, m_regionHandle, this);
468 for (int y = 0; y < 16; y++) 504 prim.CreateFromPacket(addPacket, AgentClient.AgentID, this._primCount);
505 PhysicsVector pVec = new PhysicsVector(prim.Pos.X, prim.Pos.Y, prim.Pos.Z);
506 PhysicsVector pSize = new PhysicsVector(0.255f, 0.255f, 0.255f);
507 if (OpenSim.world.Avatar.PhysicsEngineFlying)
469 { 508 {
470 for (int x = 0; x < 16; x = x + 4) 509 lock (this.LockPhysicsEngine)
471 { 510 {
472 patches[0] = x + 0 + y * 16; 511 prim.PhysActor = this.phyScene.AddPrim(pVec, pSize);
473 patches[1] = x + 1 + y * 16;
474 patches[2] = x + 2 + y * 16;
475 patches[3] = x + 3 + y * 16;
476
477 Packet layerpack = TerrainManager.CreateLandPacket(Terrain.getHeights1D(), patches);
478 RemoteClient.OutPacket(layerpack);
479 } 512 }
480 } 513 }
481 }
482 catch (Exception e)
483 {
484 OpenSim.Framework.Console.MainConsole.Instance.WriteLine(OpenSim.Framework.Console.LogPriority.MEDIUM,"World.cs: SendLayerData() - Failed with exception " + e.ToString());
485 }
486 }
487
488 /// <summary>
489 /// Sends a specified patch to a client
490 /// </summary>
491 /// <param name="px">Patch coordinate (x) 0..16</param>
492 /// <param name="py">Patch coordinate (y) 0..16</param>
493 /// <param name="RemoteClient">The client to send to</param>
494 public void SendLayerData(int px, int py, SimClient RemoteClient)
495 {
496 try
497 {
498 int[] patches = new int[1];
499 int patchx, patchy;
500 patchx = px / 16;
501 /* if (patchx > 12)
502 {
503 patchx = 12;
504 }*/
505 patchy = py / 16;
506 514
507 patches[0] = patchx + 0 + patchy * 16; 515 this.Entities.Add(prim.uuid, prim);
508 //patches[1] = patchx + 1 + patchy * 16; 516 this._primCount++;
509 //patches[2] = patchx + 2 + patchy * 16;
510 //patches[3] = patchx + 3 + patchy * 16;
511
512 Packet layerpack = TerrainManager.CreateLandPacket(Terrain.getHeights1D(), patches);
513 RemoteClient.OutPacket(layerpack);
514 } 517 }
515 catch (Exception e) 518 catch (Exception e)
516 { 519 {
517 OpenSim.Framework.Console.MainConsole.Instance.WriteLine(OpenSim.Framework.Console.LogPriority.MEDIUM,"World.cs: SendLayerData() - Failed with exception " + e.ToString()); 520 OpenSim.Framework.Console.MainConsole.Instance.WriteLine(OpenSim.Framework.Console.LogPriority.MEDIUM, "World.cs: AddNewPrim() - Failed with exception " + e.ToString());
518 } 521 }
519 } 522 }
520 523
521 /// <summary> 524 #endregion
522 /// Sends prims to a client 525
523 /// </summary> 526 #region Add/Remove Avatar Methods
524 /// <param name="RemoteClient">Client to send to</param>
525 public void GetInitialPrims(SimClient RemoteClient)
526 {
527 try
528 {
529 foreach (libsecondlife.LLUUID UUID in Entities.Keys)
530 {
531 if (Entities[UUID] is Primitive)
532 {
533 Primitive primitive = Entities[UUID] as Primitive;
534 primitive.UpdateClient(RemoteClient);
535 }
536 }
537 }
538 catch (Exception e)
539 {
540 OpenSim.Framework.Console.MainConsole.Instance.WriteLine(OpenSim.Framework.Console.LogPriority.MEDIUM,"World.cs: GetInitialPrims() - Failed with exception " + e.ToString());
541 }
542 }
543 527
544 public void AddViewerAgent(SimClient agentClient) 528 public override void AddViewerAgent(SimClient agentClient)
545 { 529 {
546 try 530 try
547 { 531 {
@@ -587,7 +571,7 @@ namespace OpenSim.world
587 } 571 }
588 } 572 }
589 573
590 public void RemoveViewerAgent(SimClient agentClient) 574 public override void RemoveViewerAgent(SimClient agentClient)
591 { 575 {
592 try 576 try
593 { 577 {
@@ -609,72 +593,24 @@ namespace OpenSim.world
609 OpenSim.Framework.Console.MainConsole.Instance.WriteLine(OpenSim.Framework.Console.LogPriority.MEDIUM,"World.cs: RemoveViewerAgent() - Failed with exception " + e.ToString()); 593 OpenSim.Framework.Console.MainConsole.Instance.WriteLine(OpenSim.Framework.Console.LogPriority.MEDIUM,"World.cs: RemoveViewerAgent() - Failed with exception " + e.ToString());
610 } 594 }
611 } 595 }
596 #endregion
612 597
613 public void AddNewPrim(ObjectAddPacket addPacket, SimClient AgentClient) 598 #region ShutDown
614 { 599 /// <summary>
615 try 600 /// Tidy before shutdown
616 { 601 /// </summary>
617 OpenSim.Framework.Console.MainConsole.Instance.WriteLine(OpenSim.Framework.Console.LogPriority.LOW,"World.cs: AddNewPrim() - Creating new prim"); 602 public override void Close()
618 Primitive prim = new Primitive(m_clientThreads, m_regionHandle, this);
619 prim.CreateFromPacket(addPacket, AgentClient.AgentID, this._primCount);
620 PhysicsVector pVec = new PhysicsVector(prim.Pos.X, prim.Pos.Y, prim.Pos.Z);
621 PhysicsVector pSize = new PhysicsVector(0.255f, 0.255f, 0.255f);
622 if (OpenSim.world.Avatar.PhysicsEngineFlying)
623 {
624 lock (this.LockPhysicsEngine)
625 {
626 prim.PhysActor = this.phyScene.AddPrim(pVec, pSize);
627 }
628 }
629
630 this.Entities.Add(prim.uuid, prim);
631 this._primCount++;
632 }
633 catch (Exception e)
634 {
635 OpenSim.Framework.Console.MainConsole.Instance.WriteLine(OpenSim.Framework.Console.LogPriority.MEDIUM,"World.cs: AddNewPrim() - Failed with exception " + e.ToString());
636 }
637 }
638
639 public bool Backup()
640 { 603 {
641 try 604 try
642 { 605 {
643 // Terrain backup routines 606 this.localStorage.ShutDown();
644 if (Terrain.tainted > 0)
645 {
646 Terrain.tainted = 0;
647 OpenSim.Framework.Console.MainConsole.Instance.WriteLine(OpenSim.Framework.Console.LogPriority.LOW,"World.cs: Backup() - Terrain tainted, saving.");
648 localStorage.SaveMap(Terrain.getHeights1D());
649 OpenSim.Framework.Console.MainConsole.Instance.WriteLine(OpenSim.Framework.Console.LogPriority.LOW,"World.cs: Backup() - Terrain saved, informing Physics.");
650 phyScene.SetTerrain(Terrain.getHeights1D());
651 }
652
653 // Primitive backup routines
654 OpenSim.Framework.Console.MainConsole.Instance.WriteLine(OpenSim.Framework.Console.LogPriority.LOW,"World.cs: Backup() - Backing up Primitives");
655 foreach (libsecondlife.LLUUID UUID in Entities.Keys)
656 {
657 Entities[UUID].BackUp();
658 }
659
660 // Backup successful
661 return true;
662 } 607 }
663 catch (Exception e) 608 catch (Exception e)
664 { 609 {
665 // Backup failed 610 OpenSim.Framework.Console.MainConsole.Instance.WriteLine(OpenSim.Framework.Console.LogPriority.HIGH, "World.cs: Close() - Failed with exception " + e.ToString());
666 OpenSim.Framework.Console.MainConsole.Instance.WriteLine(OpenSim.Framework.Console.LogPriority.HIGH,"World.cs: Backup() - Backup Failed with exception " + e.ToString());
667 return false;
668 } 611 }
669 } 612 }
670 613 #endregion
671 public void SetDefaultScripts()
672 {
673 this.m_scripts.Add("FollowRandomAvatar", delegate()
674 {
675 return new OpenSim.RegionServer.world.scripting.FollowRandomAvatar();
676 });
677 }
678 614
679 } 615 }
680} 616}
diff --git a/OpenSim.RegionServer/world/WorldBase.cs b/OpenSim.RegionServer/world/WorldBase.cs
new file mode 100644
index 0000000..b8c086d
--- /dev/null
+++ b/OpenSim.RegionServer/world/WorldBase.cs
@@ -0,0 +1,176 @@
1using System;
2using libsecondlife;
3using libsecondlife.Packets;
4using System.Collections.Generic;
5using System.Text;
6using System.Reflection;
7using System.IO;
8using System.Threading;
9using OpenSim.Physics.Manager;
10using OpenSim.Framework.Interfaces;
11using OpenSim.Framework.Types;
12using OpenSim.Framework.Terrain;
13using OpenSim.Framework.Inventory;
14using OpenSim.Assets;
15using OpenSim.RegionServer.world.scripting;
16using OpenSim.Terrain;
17
18namespace OpenSim.world
19{
20 public class WorldBase
21 {
22 public Dictionary<libsecondlife.LLUUID, Entity> Entities;
23 protected Dictionary<uint, SimClient> m_clientThreads;
24 protected ulong m_regionHandle;
25 protected string m_regionName;
26 protected InventoryCache _inventoryCache;
27 protected AssetCache _assetCache;
28 protected RegionInfo m_regInfo;
29
30 public TerrainEngine Terrain; //TODO: Replace TerrainManager with this.
31 protected libsecondlife.TerrainManager TerrainManager; // To be referenced via TerrainEngine
32
33 #region Properties
34 public InventoryCache InventoryCache
35 {
36 set
37 {
38 this._inventoryCache = value;
39 }
40 }
41
42 public AssetCache AssetCache
43 {
44 set
45 {
46 this._assetCache = value;
47 }
48 }
49 #endregion
50
51 #region Constructors
52 public WorldBase()
53 {
54
55 }
56 #endregion
57
58 #region Setup Methods
59 /// <summary>
60 /// Register Packet handler Methods with the packet server (which will register them with the SimClient)
61 /// </summary>
62 /// <param name="packetServer"></param>
63 public virtual void RegisterPacketHandlers(PacketServer packetServer)
64 {
65
66 }
67 #endregion
68
69 #region Update Methods
70 /// <summary>
71 /// Normally called once every frame/tick to let the world preform anything required (like running the physics simulation)
72 /// </summary>
73 public virtual void Update()
74 {
75
76 }
77 #endregion
78
79 #region Terrain Methods
80
81 /// <summary>
82 /// Loads the World heightmap
83 /// </summary>
84 public virtual void LoadWorldMap()
85 {
86
87 }
88
89 /// <summary>
90 /// Send the region heightmap to the client
91 /// </summary>
92 /// <param name="RemoteClient">Client to send to</param>
93 public virtual void SendLayerData(SimClient RemoteClient)
94 {
95 try
96 {
97 int[] patches = new int[4];
98
99 for (int y = 0; y < 16; y++)
100 {
101 for (int x = 0; x < 16; x = x + 4)
102 {
103 patches[0] = x + 0 + y * 16;
104 patches[1] = x + 1 + y * 16;
105 patches[2] = x + 2 + y * 16;
106 patches[3] = x + 3 + y * 16;
107
108 Packet layerpack = TerrainManager.CreateLandPacket(Terrain.getHeights1D(), patches);
109 RemoteClient.OutPacket(layerpack);
110 }
111 }
112 }
113 catch (Exception e)
114 {
115 OpenSim.Framework.Console.MainConsole.Instance.WriteLine(OpenSim.Framework.Console.LogPriority.MEDIUM, "World.cs: SendLayerData() - Failed with exception " + e.ToString());
116 }
117 }
118
119 /// <summary>
120 /// Sends a specified patch to a client
121 /// </summary>
122 /// <param name="px">Patch coordinate (x) 0..16</param>
123 /// <param name="py">Patch coordinate (y) 0..16</param>
124 /// <param name="RemoteClient">The client to send to</param>
125 public void SendLayerData(int px, int py, SimClient RemoteClient)
126 {
127 try
128 {
129 int[] patches = new int[1];
130 int patchx, patchy;
131 patchx = px / 16;
132 patchy = py / 16;
133
134 patches[0] = patchx + 0 + patchy * 16;
135
136 Packet layerpack = TerrainManager.CreateLandPacket(Terrain.getHeights1D(), patches);
137 RemoteClient.OutPacket(layerpack);
138 }
139 catch (Exception e)
140 {
141 OpenSim.Framework.Console.MainConsole.Instance.WriteLine(OpenSim.Framework.Console.LogPriority.MEDIUM, "World.cs: SendLayerData() - Failed with exception " + e.ToString());
142 }
143 }
144 #endregion
145
146 #region Add/Remove Agent/Avatar
147 /// <summary>
148 /// Add a new Agent's avatar
149 /// </summary>
150 /// <param name="agentClient"></param>
151 public virtual void AddViewerAgent(SimClient agentClient)
152 {
153
154 }
155
156 /// <summary>
157 /// Remove a Agent's avatar
158 /// </summary>
159 /// <param name="agentClient"></param>
160 public virtual void RemoveViewerAgent(SimClient agentClient)
161 {
162
163 }
164 #endregion
165
166 #region Shutdown
167 /// <summary>
168 /// Tidy before shutdown
169 /// </summary>
170 public virtual void Close()
171 {
172
173 }
174 #endregion
175 }
176}