diff options
author | MW | 2007-05-17 10:24:10 +0000 |
---|---|---|
committer | MW | 2007-05-17 10:24:10 +0000 |
commit | aae0222f8154a32d71112a8a468412efa5b857da (patch) | |
tree | 30342f61cf94448396b87794bf25c40522417403 /OpenSim.RegionServer/world | |
parent | Implemented initial login code for the management agent (diff) | |
download | opensim-SC-aae0222f8154a32d71112a8a468412efa5b857da.zip opensim-SC-aae0222f8154a32d71112a8a468412efa5b857da.tar.gz opensim-SC-aae0222f8154a32d71112a8a468412efa5b857da.tar.bz2 opensim-SC-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.cs | 1 | ||||
-rw-r--r-- | OpenSim.RegionServer/world/World.cs | 302 | ||||
-rw-r--r-- | OpenSim.RegionServer/world/WorldBase.cs | 176 |
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 | ||
19 | namespace OpenSim.world | 19 | namespace 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 @@ | |||
1 | using System; | ||
2 | using libsecondlife; | ||
3 | using libsecondlife.Packets; | ||
4 | using System.Collections.Generic; | ||
5 | using System.Text; | ||
6 | using System.Reflection; | ||
7 | using System.IO; | ||
8 | using System.Threading; | ||
9 | using OpenSim.Physics.Manager; | ||
10 | using OpenSim.Framework.Interfaces; | ||
11 | using OpenSim.Framework.Types; | ||
12 | using OpenSim.Framework.Terrain; | ||
13 | using OpenSim.Framework.Inventory; | ||
14 | using OpenSim.Assets; | ||
15 | using OpenSim.RegionServer.world.scripting; | ||
16 | using OpenSim.Terrain; | ||
17 | |||
18 | namespace 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 | } | ||