diff options
author | Teravus Ovares | 2007-11-25 04:52:14 +0000 |
---|---|---|
committer | Teravus Ovares | 2007-11-25 04:52:14 +0000 |
commit | d263a044b1ebb13477b2b391637ccc2da4368838 (patch) | |
tree | 6288ef8e8f2a1c073705b23db8aba8603a28c34d /OpenSim/Region/Environment | |
parent | Ignore nullreferenceexception in removeclient. The avatar is already gone. (diff) | |
download | opensim-SC-d263a044b1ebb13477b2b391637ccc2da4368838.zip opensim-SC-d263a044b1ebb13477b2b391637ccc2da4368838.tar.gz opensim-SC-d263a044b1ebb13477b2b391637ccc2da4368838.tar.bz2 opensim-SC-d263a044b1ebb13477b2b391637ccc2da4368838.tar.xz |
* Added the ability to restart your individual sims from within them using the estate tools.
* The sims properly restart, however they don't yet notify the existing avatars that they are up. To see the sim again, you'll need to log-out and back in until I can figure out how to get the proper data to the sims and to the avatar so they reconnect again.
Diffstat (limited to 'OpenSim/Region/Environment')
-rw-r--r-- | OpenSim/Region/Environment/EstateManager.cs | 19 | ||||
-rw-r--r-- | OpenSim/Region/Environment/PermissionManager.cs | 8 | ||||
-rw-r--r-- | OpenSim/Region/Environment/Scenes/Scene.cs | 101 | ||||
-rw-r--r-- | OpenSim/Region/Environment/Scenes/SceneBase.cs | 34 | ||||
-rw-r--r-- | OpenSim/Region/Environment/Scenes/SceneCommunicationService.cs | 14 | ||||
-rw-r--r-- | OpenSim/Region/Environment/Scenes/SceneManager.cs | 56 |
6 files changed, 228 insertions, 4 deletions
diff --git a/OpenSim/Region/Environment/EstateManager.cs b/OpenSim/Region/Environment/EstateManager.cs index c569fc5..b847e4f 100644 --- a/OpenSim/Region/Environment/EstateManager.cs +++ b/OpenSim/Region/Environment/EstateManager.cs | |||
@@ -171,6 +171,12 @@ namespace OpenSim.Region.Environment | |||
171 | if (m_scene.PermissionsMngr.CanEditEstateTerrain(remote_client.AgentId)) | 171 | if (m_scene.PermissionsMngr.CanEditEstateTerrain(remote_client.AgentId)) |
172 | estateSetRegionTerrainHandler(packet); | 172 | estateSetRegionTerrainHandler(packet); |
173 | break; | 173 | break; |
174 | case "restart": | ||
175 | if (m_scene.PermissionsMngr.CanRestartSim(remote_client.AgentId)) | ||
176 | { | ||
177 | estateRestartSim(packet); | ||
178 | } | ||
179 | break; | ||
174 | default: | 180 | default: |
175 | MainLog.Instance.Error("EstateOwnerMessage: Unknown method requested\n" + packet.ToString()); | 181 | MainLog.Instance.Error("EstateOwnerMessage: Unknown method requested\n" + packet.ToString()); |
176 | break; | 182 | break; |
@@ -322,6 +328,19 @@ namespace OpenSim.Region.Environment | |||
322 | } | 328 | } |
323 | } | 329 | } |
324 | } | 330 | } |
331 | private void estateRestartSim(EstateOwnerMessagePacket packet) | ||
332 | { | ||
333 | // There's only 1 block in the estateResetSim.. and that's the number of seconds till restart. | ||
334 | foreach (EstateOwnerMessagePacket.ParamListBlock block in packet.ParamList) | ||
335 | { | ||
336 | float timeSeconds = 0; | ||
337 | timeSeconds = BitConverter.ToInt16(block.Parameter, 1); | ||
338 | timeSeconds = (int)((timeSeconds / 100) - 3); | ||
339 | m_scene.Restart(timeSeconds); | ||
340 | |||
341 | } | ||
342 | } | ||
343 | |||
325 | 344 | ||
326 | #endregion | 345 | #endregion |
327 | 346 | ||
diff --git a/OpenSim/Region/Environment/PermissionManager.cs b/OpenSim/Region/Environment/PermissionManager.cs index 412c6e7..6efa116 100644 --- a/OpenSim/Region/Environment/PermissionManager.cs +++ b/OpenSim/Region/Environment/PermissionManager.cs | |||
@@ -306,6 +306,14 @@ namespace OpenSim.Region.Environment | |||
306 | return GenericEstatePermission(user); | 306 | return GenericEstatePermission(user); |
307 | } | 307 | } |
308 | 308 | ||
309 | public virtual bool CanRestartSim(LLUUID user) | ||
310 | { | ||
311 | // Since this is potentially going on a grid... | ||
312 | |||
313 | //return GenericEstatePermission(AgentId); | ||
314 | return m_scene.RegionInfo.MasterAvatarAssignedUUID == user; | ||
315 | } | ||
316 | |||
309 | #endregion | 317 | #endregion |
310 | 318 | ||
311 | #region Parcel Permissions | 319 | #region Parcel Permissions |
diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs index 735dddb..9cdb49b 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.cs | |||
@@ -70,6 +70,10 @@ namespace OpenSim.Region.Environment.Scenes | |||
70 | private readonly Mutex updateLock; | 70 | private readonly Mutex updateLock; |
71 | public bool m_physicalPrim; | 71 | public bool m_physicalPrim; |
72 | public bool m_sendTasksToChild; | 72 | public bool m_sendTasksToChild; |
73 | private int m_RestartTimerCounter; | ||
74 | private Timer t_restartTimer = new Timer(15000); // Wait before firing | ||
75 | private int m_incrementsof15seconds = 0; | ||
76 | |||
73 | protected ModuleLoader m_moduleLoader; | 77 | protected ModuleLoader m_moduleLoader; |
74 | protected StorageManager m_storageManager; | 78 | protected StorageManager m_storageManager; |
75 | protected AgentCircuitManager m_authenticateHandler; | 79 | protected AgentCircuitManager m_authenticateHandler; |
@@ -253,15 +257,80 @@ namespace OpenSim.Region.Environment.Scenes | |||
253 | m_eventManager.OnPermissionError += SendPermissionAlert; | 257 | m_eventManager.OnPermissionError += SendPermissionAlert; |
254 | } | 258 | } |
255 | 259 | ||
260 | public override void OtherRegionUp(RegionInfo otherRegion) | ||
261 | { | ||
262 | // Another region is up. We have to tell all our ScenePresences about it | ||
263 | // This fails to get the desired effect and needs further work. | ||
264 | |||
265 | ForEachScenePresence(delegate(ScenePresence agent) | ||
266 | { | ||
267 | if (!(agent.IsChildAgent)) | ||
268 | { | ||
269 | InformClientOfNeighbor(agent, otherRegion); | ||
270 | this.CommsManager.InterRegion.InformRegionOfChildAgent(otherRegion.RegionHandle, agent.ControllingClient.RequestClientInfo()); | ||
271 | |||
272 | } | ||
273 | } | ||
274 | ); | ||
275 | } | ||
276 | public virtual void Restart(float seconds) | ||
277 | { | ||
278 | if (seconds < 100) | ||
279 | { | ||
280 | t_restartTimer.Stop(); | ||
281 | SendGeneralAlert("Restart Aborted"); | ||
282 | } | ||
283 | else | ||
284 | { | ||
285 | t_restartTimer.Interval = 15000; | ||
286 | m_incrementsof15seconds = (int) seconds/15; | ||
287 | m_RestartTimerCounter = 0; | ||
288 | t_restartTimer.AutoReset = true; | ||
289 | t_restartTimer.Elapsed += new ElapsedEventHandler(restartTimer_Elapsed); | ||
290 | MainLog.Instance.Error("REGION", "Restarting Region in " + (seconds / 60) + " minutes"); | ||
291 | t_restartTimer.Start(); | ||
292 | SendGeneralAlert("Restarting in 2 Minutes"); | ||
293 | } | ||
294 | |||
295 | |||
296 | } | ||
297 | public void restartTimer_Elapsed(object sender, ElapsedEventArgs e) | ||
298 | { | ||
299 | m_RestartTimerCounter++; | ||
300 | if (m_RestartTimerCounter <= m_incrementsof15seconds) | ||
301 | { | ||
302 | if (m_RestartTimerCounter == 4 || m_RestartTimerCounter == 6 || m_RestartTimerCounter == 7) | ||
303 | SendGeneralAlert("Restarting in " + ((8-m_RestartTimerCounter) * 15) + " seconds"); | ||
304 | } | ||
305 | else | ||
306 | { | ||
307 | t_restartTimer.Stop(); | ||
308 | MainLog.Instance.Error("REGION", "Closing"); | ||
309 | Close(); | ||
310 | MainLog.Instance.Error("REGION", "Firing Region Restart Message"); | ||
311 | base.Restart(0); | ||
312 | } | ||
313 | |||
314 | } | ||
256 | public override void Close() | 315 | public override void Close() |
257 | { | 316 | { |
258 | ForEachScenePresence(delegate(ScenePresence avatar) | 317 | ForEachScenePresence(delegate(ScenePresence avatar) |
259 | { | 318 | { |
260 | avatar.ControllingClient.Kick("The region is going down."); | 319 | if (avatar.KnownChildRegions.Contains(RegionInfo.RegionHandle)) |
320 | avatar.KnownChildRegions.Remove(RegionInfo.RegionHandle); | ||
321 | |||
322 | if (!avatar.IsChildAgent) | ||
323 | avatar.ControllingClient.Kick("The simulator is going down."); | ||
324 | |||
325 | avatar.ControllingClient.OutPacket(new libsecondlife.Packets.DisableSimulatorPacket(), ThrottleOutPacketType.Task); | ||
261 | 326 | ||
262 | }); | 327 | }); |
328 | |||
329 | Thread.Sleep(500); | ||
330 | |||
263 | ForEachScenePresence(delegate(ScenePresence avatar) | 331 | ForEachScenePresence(delegate(ScenePresence avatar) |
264 | { | 332 | { |
333 | |||
265 | avatar.ControllingClient.Stop(); | 334 | avatar.ControllingClient.Stop(); |
266 | 335 | ||
267 | }); | 336 | }); |
@@ -269,7 +338,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
269 | 338 | ||
270 | m_heartbeatTimer.Close(); | 339 | m_heartbeatTimer.Close(); |
271 | m_innerScene.Close(); | 340 | m_innerScene.Close(); |
272 | m_sceneGridService.Close(); | 341 | UnRegisterReginWithComms(); |
273 | 342 | ||
274 | foreach (IRegionModule module in this.Modules.Values) | 343 | foreach (IRegionModule module in this.Modules.Values) |
275 | { | 344 | { |
@@ -992,6 +1061,14 @@ namespace OpenSim.Region.Environment.Scenes | |||
992 | m_sceneGridService.OnAvatarCrossingIntoRegion += AgentCrossing; | 1061 | m_sceneGridService.OnAvatarCrossingIntoRegion += AgentCrossing; |
993 | m_sceneGridService.OnCloseAgentConnection += CloseConnection; | 1062 | m_sceneGridService.OnCloseAgentConnection += CloseConnection; |
994 | } | 1063 | } |
1064 | public void UnRegisterReginWithComms() | ||
1065 | { | ||
1066 | m_sceneGridService.OnExpectUser -= NewUserConnection; | ||
1067 | m_sceneGridService.OnAvatarCrossingIntoRegion -= AgentCrossing; | ||
1068 | m_sceneGridService.OnCloseAgentConnection -= CloseConnection; | ||
1069 | |||
1070 | m_sceneGridService.Close(); | ||
1071 | } | ||
995 | 1072 | ||
996 | /// <summary> | 1073 | /// <summary> |
997 | /// | 1074 | /// |
@@ -1060,6 +1137,10 @@ namespace OpenSim.Region.Environment.Scenes | |||
1060 | { | 1137 | { |
1061 | m_sceneGridService.EnableNeighbourChildAgents(presence); | 1138 | m_sceneGridService.EnableNeighbourChildAgents(presence); |
1062 | } | 1139 | } |
1140 | public void InformClientOfNeighbor(ScenePresence presence, RegionInfo region) | ||
1141 | { | ||
1142 | m_sceneGridService.InformNeighborChildAgent(presence, region); | ||
1143 | } | ||
1063 | 1144 | ||
1064 | /// <summary> | 1145 | /// <summary> |
1065 | /// | 1146 | /// |
@@ -1258,9 +1339,15 @@ namespace OpenSim.Region.Environment.Scenes | |||
1258 | 1339 | ||
1259 | ClientManager.ForEachClient(delegate (IClientAPI controller) | 1340 | ClientManager.ForEachClient(delegate (IClientAPI controller) |
1260 | { | 1341 | { |
1261 | if (controller.AgentId != godid) // Do we really want to kick the initiator of this madness? | 1342 | ScenePresence p = GetScenePresence(controller.AgentId); |
1343 | bool childagent = false; | ||
1344 | if (!p.Equals(null)) | ||
1345 | if (p.IsChildAgent) | ||
1346 | childagent=true; | ||
1347 | if (controller.AgentId != godid && !childagent) // Do we really want to kick the initiator of this madness? | ||
1262 | { | 1348 | { |
1263 | controller.Kick(Helpers.FieldToUTF8String(reason)); | 1349 | controller.Kick(Helpers.FieldToUTF8String(reason)); |
1350 | |||
1264 | } | 1351 | } |
1265 | } | 1352 | } |
1266 | ); | 1353 | ); |
@@ -1269,7 +1356,13 @@ namespace OpenSim.Region.Environment.Scenes | |||
1269 | // Is there another way to make sure *all* clients get this 'inter region' message? | 1356 | // Is there another way to make sure *all* clients get this 'inter region' message? |
1270 | ClientManager.ForEachClient(delegate (IClientAPI controller) | 1357 | ClientManager.ForEachClient(delegate (IClientAPI controller) |
1271 | { | 1358 | { |
1272 | if (controller.AgentId != godid) // Do we really want to kick the initiator of this madness? | 1359 | ScenePresence p = GetScenePresence(controller.AgentId); |
1360 | bool childagent = false; | ||
1361 | if (!p.Equals(null)) | ||
1362 | if (p.IsChildAgent) | ||
1363 | childagent = true; | ||
1364 | |||
1365 | if (controller.AgentId != godid && !childagent) // Do we really want to kick the initiator of this madness? | ||
1273 | { | 1366 | { |
1274 | controller.Close(); | 1367 | controller.Close(); |
1275 | } | 1368 | } |
diff --git a/OpenSim/Region/Environment/Scenes/SceneBase.cs b/OpenSim/Region/Environment/Scenes/SceneBase.cs index 1bb7d10..4359374 100644 --- a/OpenSim/Region/Environment/Scenes/SceneBase.cs +++ b/OpenSim/Region/Environment/Scenes/SceneBase.cs | |||
@@ -27,6 +27,7 @@ | |||
27 | */ | 27 | */ |
28 | using System; | 28 | using System; |
29 | using System.Collections.Generic; | 29 | using System.Collections.Generic; |
30 | using System.Timers; | ||
30 | using libsecondlife; | 31 | using libsecondlife; |
31 | using OpenSim.Framework; | 32 | using OpenSim.Framework; |
32 | using OpenSim.Framework.Communications.Cache; | 33 | using OpenSim.Framework.Communications.Cache; |
@@ -37,6 +38,13 @@ namespace OpenSim.Region.Environment.Scenes | |||
37 | { | 38 | { |
38 | public abstract class SceneBase : IScene | 39 | public abstract class SceneBase : IScene |
39 | { | 40 | { |
41 | #region Events | ||
42 | |||
43 | public event restart OnRestart; | ||
44 | public event regionup OnRegionUp; | ||
45 | |||
46 | #endregion | ||
47 | |||
40 | #region Fields | 48 | #region Fields |
41 | private readonly ClientManager m_clientManager = new ClientManager(); | 49 | private readonly ClientManager m_clientManager = new ClientManager(); |
42 | 50 | ||
@@ -48,6 +56,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
48 | protected ulong m_regionHandle; | 56 | protected ulong m_regionHandle; |
49 | protected string m_regionName; | 57 | protected string m_regionName; |
50 | protected RegionInfo m_regInfo; | 58 | protected RegionInfo m_regInfo; |
59 | protected RegionStatus m_regStatus; | ||
51 | 60 | ||
52 | public TerrainEngine Terrain; | 61 | public TerrainEngine Terrain; |
53 | 62 | ||
@@ -69,6 +78,12 @@ namespace OpenSim.Region.Environment.Scenes | |||
69 | set { m_assetCache = value; } | 78 | set { m_assetCache = value; } |
70 | } | 79 | } |
71 | 80 | ||
81 | public RegionStatus Region_Status | ||
82 | { | ||
83 | get { return m_regStatus; } | ||
84 | set { m_regStatus = value; } | ||
85 | } | ||
86 | |||
72 | #endregion | 87 | #endregion |
73 | 88 | ||
74 | #region Update Methods | 89 | #region Update Methods |
@@ -78,6 +93,8 @@ namespace OpenSim.Region.Environment.Scenes | |||
78 | /// </summary> | 93 | /// </summary> |
79 | public abstract void Update(); | 94 | public abstract void Update(); |
80 | 95 | ||
96 | |||
97 | |||
81 | #endregion | 98 | #endregion |
82 | 99 | ||
83 | #region Terrain Methods | 100 | #region Terrain Methods |
@@ -130,6 +147,23 @@ namespace OpenSim.Region.Environment.Scenes | |||
130 | get { return m_nextLocalId++; } | 147 | get { return m_nextLocalId++; } |
131 | } | 148 | } |
132 | 149 | ||
150 | #region admin stuff | ||
151 | |||
152 | /// <summary> | ||
153 | /// Region Restart - Seconds till restart. | ||
154 | /// </summary> | ||
155 | /// <param name="seconds"></param> | ||
156 | public virtual void Restart(int seconds) | ||
157 | { | ||
158 | MainLog.Instance.Error("REGION", "passing Restart Message up the namespace"); | ||
159 | OnRestart(RegionInfo); | ||
160 | } | ||
161 | |||
162 | |||
163 | public abstract void OtherRegionUp(RegionInfo thisRegion); | ||
164 | |||
165 | |||
166 | #endregion | ||
133 | #region Shutdown | 167 | #region Shutdown |
134 | 168 | ||
135 | /// <summary> | 169 | /// <summary> |
diff --git a/OpenSim/Region/Environment/Scenes/SceneCommunicationService.cs b/OpenSim/Region/Environment/Scenes/SceneCommunicationService.cs index ad7ff58..9a10c51 100644 --- a/OpenSim/Region/Environment/Scenes/SceneCommunicationService.cs +++ b/OpenSim/Region/Environment/Scenes/SceneCommunicationService.cs | |||
@@ -149,6 +149,20 @@ namespace OpenSim.Region.Environment.Scenes | |||
149 | } | 149 | } |
150 | } | 150 | } |
151 | } | 151 | } |
152 | public void InformNeighborChildAgent(ScenePresence avatar, RegionInfo region) | ||
153 | { | ||
154 | AgentCircuitData agent = avatar.ControllingClient.RequestClientInfo(); | ||
155 | agent.BaseFolder = LLUUID.Zero; | ||
156 | agent.InventoryFolder = LLUUID.Zero; | ||
157 | agent.startpos = new LLVector3(128, 128, 70); | ||
158 | agent.child = true; | ||
159 | |||
160 | InformClientOfNeighbourDelegate d = InformClientOfNeighbourAsync; | ||
161 | d.BeginInvoke(avatar, agent, region.RegionHandle, region.ExternalEndPoint, | ||
162 | InformClientOfNeighbourCompleted, | ||
163 | d); | ||
164 | } | ||
165 | |||
152 | #endregion | 166 | #endregion |
153 | 167 | ||
154 | /// <summary> | 168 | /// <summary> |
diff --git a/OpenSim/Region/Environment/Scenes/SceneManager.cs b/OpenSim/Region/Environment/Scenes/SceneManager.cs index e71d946..4360d97 100644 --- a/OpenSim/Region/Environment/Scenes/SceneManager.cs +++ b/OpenSim/Region/Environment/Scenes/SceneManager.cs | |||
@@ -34,8 +34,12 @@ using OpenSim.Framework.Console; | |||
34 | 34 | ||
35 | namespace OpenSim.Region.Environment.Scenes | 35 | namespace OpenSim.Region.Environment.Scenes |
36 | { | 36 | { |
37 | public delegate void ReStartSim(RegionInfo thisregion); | ||
38 | |||
37 | public class SceneManager | 39 | public class SceneManager |
38 | { | 40 | { |
41 | public event ReStartSim OnReStartSim; | ||
42 | |||
39 | private readonly List<Scene> m_localScenes; | 43 | private readonly List<Scene> m_localScenes; |
40 | private Scene m_currentScene = null; | 44 | private Scene m_currentScene = null; |
41 | 45 | ||
@@ -72,11 +76,63 @@ namespace OpenSim.Region.Environment.Scenes | |||
72 | } | 76 | } |
73 | } | 77 | } |
74 | 78 | ||
79 | public void Close(Scene cscene) | ||
80 | { | ||
81 | if (m_localScenes.Contains(cscene)) | ||
82 | { | ||
83 | for (int i = 0; i < m_localScenes.Count; i++) | ||
84 | { | ||
85 | if (m_localScenes[i].Equals(cscene)) | ||
86 | { | ||
87 | |||
88 | m_localScenes[i].Close(); | ||
89 | } | ||
90 | } | ||
91 | } | ||
92 | } | ||
93 | |||
75 | public void Add(Scene scene) | 94 | public void Add(Scene scene) |
76 | { | 95 | { |
96 | scene.OnRestart += handleRestart; | ||
77 | m_localScenes.Add(scene); | 97 | m_localScenes.Add(scene); |
98 | |||
78 | } | 99 | } |
79 | 100 | ||
101 | public void handleRestart(RegionInfo rdata) | ||
102 | { | ||
103 | MainLog.Instance.Error("SCENEMANAGER", "Got Restart message for region:" + rdata.RegionName +" Sending up to main"); | ||
104 | int RegionSceneElement = -1; | ||
105 | for (int i = 0; i < m_localScenes.Count; i++) | ||
106 | { | ||
107 | |||
108 | if (rdata.RegionName == m_localScenes[i].RegionInfo.RegionName) | ||
109 | RegionSceneElement = i; | ||
110 | } | ||
111 | |||
112 | // Now we make sure the region is no longer known about by the SceneManager | ||
113 | // Prevents Duplicates. | ||
114 | |||
115 | if (RegionSceneElement >= 0) | ||
116 | m_localScenes.RemoveAt(RegionSceneElement); | ||
117 | |||
118 | // Send signal to main that we're restarting this sim. | ||
119 | OnReStartSim(rdata); | ||
120 | } | ||
121 | |||
122 | public void SendSimOnlineNotification(ulong regionHandle) | ||
123 | { | ||
124 | |||
125 | for (int i = 0; i < m_localScenes.Count; i++) | ||
126 | { | ||
127 | if (m_localScenes[i].RegionInfo.RegionHandle != regionHandle) | ||
128 | { | ||
129 | // Inform other regions to tell their avatar about me | ||
130 | m_localScenes[i].OtherRegionUp(m_localScenes[i].RegionInfo); | ||
131 | } | ||
132 | } | ||
133 | |||
134 | |||
135 | } | ||
80 | public void SaveCurrentSceneToXml(string filename) | 136 | public void SaveCurrentSceneToXml(string filename) |
81 | { | 137 | { |
82 | CurrentOrFirstScene.SavePrimsToXml(filename); | 138 | CurrentOrFirstScene.SavePrimsToXml(filename); |