diff options
Diffstat (limited to '')
27 files changed, 519 insertions, 371 deletions
diff --git a/OpenSim/Framework/IScene.cs b/OpenSim/Framework/IScene.cs index a9432c2..2c38e0f 100644 --- a/OpenSim/Framework/IScene.cs +++ b/OpenSim/Framework/IScene.cs | |||
@@ -66,6 +66,11 @@ namespace OpenSim.Framework | |||
66 | 66 | ||
67 | IConfigSource Config { get; } | 67 | IConfigSource Config { get; } |
68 | 68 | ||
69 | /// <summary> | ||
70 | /// Are logins enabled on this simulator? | ||
71 | /// </summary> | ||
72 | bool LoginsEnabled { get; set; } | ||
73 | |||
69 | float TimeDilation { get; } | 74 | float TimeDilation { get; } |
70 | 75 | ||
71 | bool AllowScriptCrossings { get; } | 76 | bool AllowScriptCrossings { get; } |
diff --git a/OpenSim/Region/Application/OpenSim.cs b/OpenSim/Region/Application/OpenSim.cs index e6b57c2..8a0b4ab 100644 --- a/OpenSim/Region/Application/OpenSim.cs +++ b/OpenSim/Region/Application/OpenSim.cs | |||
@@ -1145,8 +1145,8 @@ namespace OpenSim | |||
1145 | c => cdt.AddRow( | 1145 | c => cdt.AddRow( |
1146 | s.Name, | 1146 | s.Name, |
1147 | c.Name, | 1147 | c.Name, |
1148 | c.RemoteEndPoint.ToString(), | ||
1149 | c.CircuitCode.ToString(), | 1148 | c.CircuitCode.ToString(), |
1149 | c.RemoteEndPoint.ToString(), | ||
1150 | c.IsActive.ToString()))); | 1150 | c.IsActive.ToString()))); |
1151 | 1151 | ||
1152 | MainConsole.Instance.Output(cdt.ToString()); | 1152 | MainConsole.Instance.Output(cdt.ToString()); |
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs index ad9074c..098e4eb 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs | |||
@@ -355,8 +355,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
355 | private int m_animationSequenceNumber = 1; | 355 | private int m_animationSequenceNumber = 1; |
356 | private bool m_SendLogoutPacketWhenClosing = true; | 356 | private bool m_SendLogoutPacketWhenClosing = true; |
357 | private AgentUpdateArgs lastarg; | 357 | private AgentUpdateArgs lastarg; |
358 | private bool m_IsActive = true; | ||
359 | private bool m_IsLoggingOut = false; | ||
360 | 358 | ||
361 | protected Dictionary<PacketType, PacketProcessor> m_packetHandlers = new Dictionary<PacketType, PacketProcessor>(); | 359 | protected Dictionary<PacketType, PacketProcessor> m_packetHandlers = new Dictionary<PacketType, PacketProcessor>(); |
362 | protected Dictionary<string, GenericMessage> m_genericPacketHandlers = new Dictionary<string, GenericMessage>(); //PauPaw:Local Generic Message handlers | 360 | protected Dictionary<string, GenericMessage> m_genericPacketHandlers = new Dictionary<string, GenericMessage>(); //PauPaw:Local Generic Message handlers |
@@ -428,16 +426,19 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
428 | public uint CircuitCode { get { return m_circuitCode; } } | 426 | public uint CircuitCode { get { return m_circuitCode; } } |
429 | public int MoneyBalance { get { return m_moneyBalance; } } | 427 | public int MoneyBalance { get { return m_moneyBalance; } } |
430 | public int NextAnimationSequenceNumber { get { return m_animationSequenceNumber++; } } | 428 | public int NextAnimationSequenceNumber { get { return m_animationSequenceNumber++; } } |
431 | public bool IsActive | 429 | |
432 | { | 430 | /// <summary> |
433 | get { return m_IsActive; } | 431 | /// As well as it's function in IClientAPI, in LLClientView we are locking on this property in order to |
434 | set { m_IsActive = value; } | 432 | /// prevent race conditions by different threads calling Close(). |
435 | } | 433 | /// </summary> |
436 | public bool IsLoggingOut | 434 | public bool IsActive { get; set; } |
437 | { | 435 | |
438 | get { return m_IsLoggingOut; } | 436 | /// <summary> |
439 | set { m_IsLoggingOut = value; } | 437 | /// Used to synchronise threads when client is being closed. |
440 | } | 438 | /// </summary> |
439 | public Object CloseSyncLock { get; private set; } | ||
440 | |||
441 | public bool IsLoggingOut { get; set; } | ||
441 | 442 | ||
442 | public bool DisableFacelights | 443 | public bool DisableFacelights |
443 | { | 444 | { |
@@ -462,6 +463,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
462 | { | 463 | { |
463 | // DebugPacketLevel = 1; | 464 | // DebugPacketLevel = 1; |
464 | 465 | ||
466 | CloseSyncLock = new Object(); | ||
467 | |||
465 | RegisterInterface<IClientIM>(this); | 468 | RegisterInterface<IClientIM>(this); |
466 | RegisterInterface<IClientInventory>(this); | 469 | RegisterInterface<IClientInventory>(this); |
467 | RegisterInterface<IClientChat>(this); | 470 | RegisterInterface<IClientChat>(this); |
@@ -494,13 +497,15 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
494 | m_prioritizer = new Prioritizer(m_scene); | 497 | m_prioritizer = new Prioritizer(m_scene); |
495 | 498 | ||
496 | RegisterLocalPacketHandlers(); | 499 | RegisterLocalPacketHandlers(); |
500 | |||
501 | IsActive = true; | ||
497 | } | 502 | } |
498 | 503 | ||
499 | #region Client Methods | 504 | #region Client Methods |
500 | 505 | ||
501 | 506 | ||
502 | /// <summary> | 507 | /// <summary> |
503 | /// Shut down the client view | 508 | /// Close down the client view |
504 | /// </summary> | 509 | /// </summary> |
505 | public void Close() | 510 | public void Close() |
506 | { | 511 | { |
@@ -513,7 +518,29 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
513 | public void Close(bool sendStop) | 518 | public void Close(bool sendStop) |
514 | { | 519 | { |
515 | IsActive = false; | 520 | IsActive = false; |
521 | // We lock here to prevent race conditions between two threads calling close simultaneously (e.g. | ||
522 | // a simultaneous relog just as a client is being closed out due to no packet ack from the old connection. | ||
523 | lock (CloseSyncLock) | ||
524 | { | ||
525 | if (!IsActive) | ||
526 | return; | ||
527 | |||
528 | IsActive = false; | ||
529 | CloseWithoutChecks(sendStop); | ||
530 | } | ||
531 | } | ||
516 | 532 | ||
533 | /// <summary> | ||
534 | /// Closes down the client view without first checking whether it is active. | ||
535 | /// </summary> | ||
536 | /// <remarks> | ||
537 | /// This exists because LLUDPServer has to set IsActive = false in earlier synchronous code before calling | ||
538 | /// CloseWithoutIsActiveCheck asynchronously. | ||
539 | /// | ||
540 | /// Callers must lock ClosingSyncLock before calling. | ||
541 | /// </remarks> | ||
542 | public void CloseWithoutChecks(bool sendStop) | ||
543 | { | ||
517 | m_log.DebugFormat( | 544 | m_log.DebugFormat( |
518 | "[CLIENT]: Close has been called for {0} attached to scene {1}", | 545 | "[CLIENT]: Close has been called for {0} attached to scene {1}", |
519 | Name, m_scene.RegionInfo.RegionName); | 546 | Name, m_scene.RegionInfo.RegionName); |
@@ -3634,7 +3661,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
3634 | 3661 | ||
3635 | public void SendCoarseLocationUpdate(List<UUID> users, List<Vector3> CoarseLocations) | 3662 | public void SendCoarseLocationUpdate(List<UUID> users, List<Vector3> CoarseLocations) |
3636 | { | 3663 | { |
3637 | if (!IsActive) return; // We don't need to update inactive clients. | 3664 | // We don't need to update inactive clients. |
3665 | if (!IsActive) | ||
3666 | return; | ||
3638 | 3667 | ||
3639 | CoarseLocationUpdatePacket loc = (CoarseLocationUpdatePacket)PacketPool.Instance.GetPacket(PacketType.CoarseLocationUpdate); | 3668 | CoarseLocationUpdatePacket loc = (CoarseLocationUpdatePacket)PacketPool.Instance.GetPacket(PacketType.CoarseLocationUpdate); |
3640 | loc.Header.Reliable = false; | 3669 | loc.Header.Reliable = false; |
@@ -5267,7 +5296,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
5267 | AddLocalPacketHandler(PacketType.ChatFromViewer, HandleChatFromViewer); | 5296 | AddLocalPacketHandler(PacketType.ChatFromViewer, HandleChatFromViewer); |
5268 | AddLocalPacketHandler(PacketType.AvatarPropertiesUpdate, HandlerAvatarPropertiesUpdate); | 5297 | AddLocalPacketHandler(PacketType.AvatarPropertiesUpdate, HandlerAvatarPropertiesUpdate); |
5269 | AddLocalPacketHandler(PacketType.ScriptDialogReply, HandlerScriptDialogReply); | 5298 | AddLocalPacketHandler(PacketType.ScriptDialogReply, HandlerScriptDialogReply); |
5270 | AddLocalPacketHandler(PacketType.ImprovedInstantMessage, HandlerImprovedInstantMessage, false); | 5299 | AddLocalPacketHandler(PacketType.ImprovedInstantMessage, HandlerImprovedInstantMessage); |
5271 | AddLocalPacketHandler(PacketType.AcceptFriendship, HandlerAcceptFriendship); | 5300 | AddLocalPacketHandler(PacketType.AcceptFriendship, HandlerAcceptFriendship); |
5272 | AddLocalPacketHandler(PacketType.DeclineFriendship, HandlerDeclineFriendship); | 5301 | AddLocalPacketHandler(PacketType.DeclineFriendship, HandlerDeclineFriendship); |
5273 | AddLocalPacketHandler(PacketType.TerminateFriendship, HandlerTerminateFriendship); | 5302 | AddLocalPacketHandler(PacketType.TerminateFriendship, HandlerTerminateFriendship); |
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs index 79e35f4..140a953 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs | |||
@@ -1181,22 +1181,21 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
1181 | /// regular client pings. | 1181 | /// regular client pings. |
1182 | /// </remarks> | 1182 | /// </remarks> |
1183 | /// <param name='client'></param> | 1183 | /// <param name='client'></param> |
1184 | private void DeactivateClientDueToTimeout(IClientAPI client) | 1184 | private void DeactivateClientDueToTimeout(LLClientView client) |
1185 | { | 1185 | { |
1186 | // We must set IsActive synchronously so that we can stop the packet loop reinvoking this method, even | 1186 | lock (client.CloseSyncLock) |
1187 | // though it's set later on by LLClientView.Close() | 1187 | { |
1188 | client.IsActive = false; | 1188 | m_log.WarnFormat( |
1189 | 1189 | "[LLUDPSERVER]: Ack timeout, disconnecting {0} agent for {1} in {2}", | |
1190 | m_log.WarnFormat( | 1190 | client.SceneAgent.IsChildAgent ? "child" : "root", client.Name, m_scene.RegionInfo.RegionName); |
1191 | "[LLUDPSERVER]: Ack timeout, disconnecting {0} agent for {1} in {2}", | 1191 | |
1192 | client.SceneAgent.IsChildAgent ? "child" : "root", client.Name, m_scene.RegionInfo.RegionName); | 1192 | StatsManager.SimExtraStats.AddAbnormalClientThreadTermination(); |
1193 | 1193 | ||
1194 | StatsManager.SimExtraStats.AddAbnormalClientThreadTermination(); | 1194 | if (!client.SceneAgent.IsChildAgent) |
1195 | 1195 | client.Kick("Simulator logged you out due to connection timeout"); | |
1196 | if (!client.SceneAgent.IsChildAgent) | 1196 | |
1197 | client.Kick("Simulator logged you out due to connection timeout"); | 1197 | client.CloseWithoutChecks(true); |
1198 | 1198 | } | |
1199 | Util.FireAndForget(o => client.Close()); | ||
1200 | } | 1199 | } |
1201 | 1200 | ||
1202 | private void IncomingPacketHandler() | 1201 | private void IncomingPacketHandler() |
diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs index 394b90a..c679a7b 100644 --- a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs | |||
@@ -636,10 +636,12 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments | |||
636 | 636 | ||
637 | m_scene.InventoryService.UpdateItem(item); | 637 | m_scene.InventoryService.UpdateItem(item); |
638 | 638 | ||
639 | // this gets called when the agent logs off! | 639 | // If the name of the object has been changed whilst attached then we want to update the inventory |
640 | // item in the viewer. | ||
640 | if (sp.ControllingClient != null) | 641 | if (sp.ControllingClient != null) |
641 | sp.ControllingClient.SendInventoryItemCreateUpdate(item, 0); | 642 | sp.ControllingClient.SendInventoryItemCreateUpdate(item, 0); |
642 | } | 643 | } |
644 | |||
643 | grp.HasGroupChanged = false; // Prevent it being saved over and over | 645 | grp.HasGroupChanged = false; // Prevent it being saved over and over |
644 | } | 646 | } |
645 | // else | 647 | // else |
diff --git a/OpenSim/Region/CoreModules/Avatar/Groups/GroupsModule.cs b/OpenSim/Region/CoreModules/Avatar/Groups/GroupsModule.cs index 31363e5..b258e13 100644 --- a/OpenSim/Region/CoreModules/Avatar/Groups/GroupsModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Groups/GroupsModule.cs | |||
@@ -96,7 +96,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Groups | |||
96 | 96 | ||
97 | scene.EventManager.OnNewClient += OnNewClient; | 97 | scene.EventManager.OnNewClient += OnNewClient; |
98 | scene.EventManager.OnClientClosed += OnClientClosed; | 98 | scene.EventManager.OnClientClosed += OnClientClosed; |
99 | scene.EventManager.OnIncomingInstantMessage += OnGridInstantMessage; | 99 | // scene.EventManager.OnIncomingInstantMessage += OnGridInstantMessage; |
100 | } | 100 | } |
101 | 101 | ||
102 | public void PostInitialise() | 102 | public void PostInitialise() |
@@ -133,7 +133,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Groups | |||
133 | private void OnNewClient(IClientAPI client) | 133 | private void OnNewClient(IClientAPI client) |
134 | { | 134 | { |
135 | // Subscribe to instant messages | 135 | // Subscribe to instant messages |
136 | client.OnInstantMessage += OnInstantMessage; | 136 | // client.OnInstantMessage += OnInstantMessage; |
137 | client.OnAgentDataUpdateRequest += OnAgentDataUpdateRequest; | 137 | client.OnAgentDataUpdateRequest += OnAgentDataUpdateRequest; |
138 | client.OnUUIDGroupNameRequest += HandleUUIDGroupNameRequest; | 138 | client.OnUUIDGroupNameRequest += HandleUUIDGroupNameRequest; |
139 | lock (m_ClientMap) | 139 | lock (m_ClientMap) |
@@ -171,15 +171,15 @@ namespace OpenSim.Region.CoreModules.Avatar.Groups | |||
171 | ActiveGroupTitle); | 171 | ActiveGroupTitle); |
172 | } | 172 | } |
173 | 173 | ||
174 | private void OnInstantMessage(IClientAPI client, GridInstantMessage im) | 174 | // private void OnInstantMessage(IClientAPI client, GridInstantMessage im) |
175 | { | 175 | // { |
176 | } | 176 | // } |
177 | 177 | ||
178 | private void OnGridInstantMessage(GridInstantMessage msg) | 178 | // private void OnGridInstantMessage(GridInstantMessage msg) |
179 | { | 179 | // { |
180 | // Trigger the above event handler | 180 | // // Trigger the above event handler |
181 | OnInstantMessage(null, msg); | 181 | // OnInstantMessage(null, msg); |
182 | } | 182 | // } |
183 | 183 | ||
184 | private void HandleUUIDGroupNameRequest(UUID id,IClientAPI remote_client) | 184 | private void HandleUUIDGroupNameRequest(UUID id,IClientAPI remote_client) |
185 | { | 185 | { |
diff --git a/OpenSim/Region/CoreModules/Avatar/InstantMessage/MessageTransferModule.cs b/OpenSim/Region/CoreModules/Avatar/InstantMessage/MessageTransferModule.cs index 6064ddc..1406aae 100644 --- a/OpenSim/Region/CoreModules/Avatar/InstantMessage/MessageTransferModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/InstantMessage/MessageTransferModule.cs | |||
@@ -141,13 +141,15 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage | |||
141 | foreach (Scene scene in m_Scenes) | 141 | foreach (Scene scene in m_Scenes) |
142 | { | 142 | { |
143 | // m_log.DebugFormat( | 143 | // m_log.DebugFormat( |
144 | // "[INSTANT MESSAGE]: Looking for root agent {0} in {1}", | 144 | // "[INSTANT MESSAGE]: Looking for root agent {0} in {1}", |
145 | // toAgentID.ToString(), scene.RegionInfo.RegionName); | 145 | // toAgentID.ToString(), scene.RegionInfo.RegionName); |
146 | |||
146 | ScenePresence sp = scene.GetScenePresence(toAgentID); | 147 | ScenePresence sp = scene.GetScenePresence(toAgentID); |
147 | if (sp != null && !sp.IsChildAgent) | 148 | if (sp != null && !sp.IsChildAgent) |
148 | { | 149 | { |
149 | // Local message | 150 | // Local message |
150 | // m_log.DebugFormat("[INSTANT MESSAGE]: Delivering IM to root agent {0} {1}", user.Name, toAgentID); | 151 | m_log.DebugFormat("[INSTANT MESSAGE]: Delivering IM to root agent {0} {1}", sp.Name, toAgentID); |
152 | |||
151 | sp.ControllingClient.SendInstantMessage(im); | 153 | sp.ControllingClient.SendInstantMessage(im); |
152 | 154 | ||
153 | // Message sent | 155 | // Message sent |
@@ -159,13 +161,15 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage | |||
159 | // try child avatar second | 161 | // try child avatar second |
160 | foreach (Scene scene in m_Scenes) | 162 | foreach (Scene scene in m_Scenes) |
161 | { | 163 | { |
162 | // m_log.DebugFormat( | 164 | m_log.DebugFormat( |
163 | // "[INSTANT MESSAGE]: Looking for child of {0} in {1}", toAgentID, scene.RegionInfo.RegionName); | 165 | "[INSTANT MESSAGE]: Looking for child of {0} in {1}", toAgentID, scene.RegionInfo.RegionName); |
166 | |||
164 | ScenePresence sp = scene.GetScenePresence(toAgentID); | 167 | ScenePresence sp = scene.GetScenePresence(toAgentID); |
165 | if (sp != null) | 168 | if (sp != null) |
166 | { | 169 | { |
167 | // Local message | 170 | // Local message |
168 | // m_log.DebugFormat("[INSTANT MESSAGE]: Delivering IM to child agent {0} {1}", user.Name, toAgentID); | 171 | m_log.DebugFormat("[INSTANT MESSAGE]: Delivering IM to child agent {0} {1}", sp.Name, toAgentID); |
172 | |||
169 | sp.ControllingClient.SendInstantMessage(im); | 173 | sp.ControllingClient.SendInstantMessage(im); |
170 | 174 | ||
171 | // Message sent | 175 | // Message sent |
@@ -174,10 +178,9 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage | |||
174 | } | 178 | } |
175 | } | 179 | } |
176 | 180 | ||
177 | // m_log.DebugFormat("[INSTANT MESSAGE]: Delivering IM to {0} via XMLRPC", im.toAgentID); | 181 | m_log.DebugFormat("[INSTANT MESSAGE]: Delivering IM to {0} via XMLRPC", im.toAgentID); |
178 | SendGridInstantMessageViaXMLRPC(im, result); | ||
179 | 182 | ||
180 | return; | 183 | SendGridInstantMessageViaXMLRPC(im, result); |
181 | } | 184 | } |
182 | 185 | ||
183 | private void HandleUndeliveredMessage(GridInstantMessage im, MessageResultNotification result) | 186 | private void HandleUndeliveredMessage(GridInstantMessage im, MessageResultNotification result) |
diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs index 80554fb..81de29c 100644 --- a/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs | |||
@@ -313,8 +313,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer | |||
313 | m_TransferModule.SendInstantMessage(im, delegate(bool success) {}); | 313 | m_TransferModule.SendInstantMessage(im, delegate(bool success) {}); |
314 | } | 314 | } |
315 | } | 315 | } |
316 | else if (im.dialog == (byte) InstantMessageDialog.InventoryDeclined || | 316 | else if ( |
317 | im.dialog == (byte) InstantMessageDialog.TaskInventoryDeclined) | 317 | im.dialog == (byte)InstantMessageDialog.InventoryDeclined |
318 | || im.dialog == (byte)InstantMessageDialog.TaskInventoryDeclined) | ||
318 | { | 319 | { |
319 | // Here, the recipient is local and we can assume that the | 320 | // Here, the recipient is local and we can assume that the |
320 | // inventory is loaded. Courtesy of the above bulk update, | 321 | // inventory is loaded. Courtesy of the above bulk update, |
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/MapImage/MapImageServiceModule.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/MapImage/MapImageServiceModule.cs index 6cd077a..7ed1320 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/MapImage/MapImageServiceModule.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/MapImage/MapImageServiceModule.cs | |||
@@ -149,10 +149,9 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.MapImage | |||
149 | lock (m_scenes) | 149 | lock (m_scenes) |
150 | m_scenes[scene.RegionInfo.RegionID] = scene; | 150 | m_scenes[scene.RegionInfo.RegionID] = scene; |
151 | 151 | ||
152 | scene.EventManager.OnLoginsEnabled += OnLoginsEnabled; | 152 | scene.EventManager.OnRegionReady += s => UploadMapTile(s); |
153 | } | 153 | } |
154 | 154 | ||
155 | |||
156 | ///<summary> | 155 | ///<summary> |
157 | /// | 156 | /// |
158 | ///</summary> | 157 | ///</summary> |
@@ -166,21 +165,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.MapImage | |||
166 | } | 165 | } |
167 | 166 | ||
168 | #endregion ISharedRegionModule | 167 | #endregion ISharedRegionModule |
169 | 168 | ||
170 | void OnLoginsEnabled(string regionName) | ||
171 | { | ||
172 | Scene scene = null; | ||
173 | foreach (Scene s in m_scenes.Values) | ||
174 | if (s.RegionInfo.RegionName == regionName) | ||
175 | { | ||
176 | scene = s; | ||
177 | break; | ||
178 | } | ||
179 | if (scene != null) | ||
180 | UploadMapTile(scene); | ||
181 | } | ||
182 | |||
183 | |||
184 | ///<summary> | 169 | ///<summary> |
185 | /// | 170 | /// |
186 | ///</summary> | 171 | ///</summary> |
diff --git a/OpenSim/Region/CoreModules/World/Access/AccessModule.cs b/OpenSim/Region/CoreModules/World/Access/AccessModule.cs index 553a32d..e7b1454 100644 --- a/OpenSim/Region/CoreModules/World/Access/AccessModule.cs +++ b/OpenSim/Region/CoreModules/World/Access/AccessModule.cs | |||
@@ -129,18 +129,18 @@ namespace OpenSim.Region.CoreModules.World | |||
129 | switch (cmd[1]) | 129 | switch (cmd[1]) |
130 | { | 130 | { |
131 | case "enable": | 131 | case "enable": |
132 | scene.LoginsDisabled = false; | 132 | scene.LoginsEnabled = true; |
133 | MainConsole.Instance.Output(String.Format("Logins are enabled for region {0}", scene.RegionInfo.RegionName)); | 133 | MainConsole.Instance.Output(String.Format("Logins are enabled for region {0}", scene.RegionInfo.RegionName)); |
134 | break; | 134 | break; |
135 | case "disable": | 135 | case "disable": |
136 | scene.LoginsDisabled = true; | 136 | scene.LoginsEnabled = false; |
137 | MainConsole.Instance.Output(String.Format("Logins are disabled for region {0}", scene.RegionInfo.RegionName)); | 137 | MainConsole.Instance.Output(String.Format("Logins are disabled for region {0}", scene.RegionInfo.RegionName)); |
138 | break; | 138 | break; |
139 | case "status": | 139 | case "status": |
140 | if (scene.LoginsDisabled) | 140 | if (scene.LoginsEnabled) |
141 | MainConsole.Instance.Output(String.Format("Login in {0} are disabled", scene.RegionInfo.RegionName)); | ||
142 | else | ||
143 | MainConsole.Instance.Output(String.Format("Login in {0} are enabled", scene.RegionInfo.RegionName)); | 141 | MainConsole.Instance.Output(String.Format("Login in {0} are enabled", scene.RegionInfo.RegionName)); |
142 | else | ||
143 | MainConsole.Instance.Output(String.Format("Login in {0} are disabled", scene.RegionInfo.RegionName)); | ||
144 | break; | 144 | break; |
145 | default: | 145 | default: |
146 | MainConsole.Instance.Output("Syntax: login enable|disable|status"); | 146 | MainConsole.Instance.Output("Syntax: login enable|disable|status"); |
diff --git a/OpenSim/Region/Framework/Interfaces/IRegionReadyModule.cs b/OpenSim/Region/Framework/Interfaces/IRegionReadyModule.cs index aa4a757..136ca92 100644 --- a/OpenSim/Region/Framework/Interfaces/IRegionReadyModule.cs +++ b/OpenSim/Region/Framework/Interfaces/IRegionReadyModule.cs | |||
@@ -25,14 +25,23 @@ | |||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
26 | */ | 26 | */ |
27 | 27 | ||
28 | |||
29 | using System; | 28 | using System; |
29 | using OpenSim.Framework; | ||
30 | 30 | ||
31 | namespace OpenSim.Region.Framework.Interfaces | 31 | namespace OpenSim.Region.Framework.Interfaces |
32 | { | 32 | { |
33 | public interface IRegionReadyModule | 33 | public interface IRegionReadyModule |
34 | { | 34 | { |
35 | void OarLoadingAlert(string msg); | 35 | void OarLoadingAlert(string msg); |
36 | |||
37 | /// <summary> | ||
38 | /// Trigger region ready status manually. | ||
39 | /// </summary> | ||
40 | /// <remarks> | ||
41 | /// This should be called by the scene if the IRegionReadyModule has set Scene.LoginLock == true | ||
42 | /// </remarks> | ||
43 | /// <param name='scene'></param> | ||
44 | void TriggerRegionReady(IScene scene); | ||
36 | } | 45 | } |
37 | } | 46 | } |
38 | 47 | ||
diff --git a/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs b/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs index 9ddac19..50a176b 100644 --- a/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs +++ b/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs | |||
@@ -551,11 +551,5 @@ namespace OpenSim.Region.Framework.Scenes.Animation | |||
551 | 551 | ||
552 | SendAnimPack(animIDs, sequenceNums, objectIDs); | 552 | SendAnimPack(animIDs, sequenceNums, objectIDs); |
553 | } | 553 | } |
554 | |||
555 | public void Close() | ||
556 | { | ||
557 | m_animations = null; | ||
558 | m_scenePresence = null; | ||
559 | } | ||
560 | } | 554 | } |
561 | } | 555 | } \ No newline at end of file |
diff --git a/OpenSim/Region/Framework/Scenes/EventManager.cs b/OpenSim/Region/Framework/Scenes/EventManager.cs index d783e57..418904f 100644 --- a/OpenSim/Region/Framework/Scenes/EventManager.cs +++ b/OpenSim/Region/Framework/Scenes/EventManager.cs | |||
@@ -500,15 +500,25 @@ namespace OpenSim.Region.Framework.Scenes | |||
500 | public delegate void RegionHeartbeatEnd(Scene scene); | 500 | public delegate void RegionHeartbeatEnd(Scene scene); |
501 | public event RegionHeartbeatEnd OnRegionHeartbeatEnd; | 501 | public event RegionHeartbeatEnd OnRegionHeartbeatEnd; |
502 | 502 | ||
503 | public delegate void LoginsEnabled(string regionName); | 503 | /// <summary> |
504 | /// Fired when logins to a region are enabled or disabled. | ||
505 | /// </summary> | ||
506 | /// <remarks> | ||
507 | /// | ||
508 | /// </remarks> | ||
509 | /// Fired | ||
510 | public event RegionLoginsStatusChange OnRegionLoginsStatusChange; | ||
511 | public delegate void RegionLoginsStatusChange(IScene scene); | ||
504 | 512 | ||
505 | /// <summary> | 513 | /// <summary> |
506 | /// This should only fire in all circumstances if the RegionReady module is active. | 514 | /// Fired when a region is considered ready for use. |
507 | /// </summary> | 515 | /// </summary> |
508 | /// <remarks> | 516 | /// <remarks> |
509 | /// TODO: Fire this even when the RegionReady module is not active. | 517 | /// A region is considered ready when startup operations such as loading of scripts already on the region |
518 | /// have been completed. | ||
510 | /// </remarks> | 519 | /// </remarks> |
511 | public event LoginsEnabled OnLoginsEnabled; | 520 | public event RegionReady OnRegionReady; |
521 | public delegate void RegionReady(IScene scene); | ||
512 | 522 | ||
513 | public delegate void PrimsLoaded(Scene s); | 523 | public delegate void PrimsLoaded(Scene s); |
514 | public event PrimsLoaded OnPrimsLoaded; | 524 | public event PrimsLoaded OnPrimsLoaded; |
@@ -2502,21 +2512,42 @@ namespace OpenSim.Region.Framework.Scenes | |||
2502 | } | 2512 | } |
2503 | } | 2513 | } |
2504 | 2514 | ||
2505 | public void TriggerLoginsEnabled (string regionName) | 2515 | public void TriggerRegionLoginsStatusChange(IScene scene) |
2506 | { | 2516 | { |
2507 | LoginsEnabled handler = OnLoginsEnabled; | 2517 | RegionLoginsStatusChange handler = OnRegionLoginsStatusChange; |
2508 | 2518 | ||
2509 | if ( handler != null) | 2519 | if (handler != null) |
2510 | { | 2520 | { |
2511 | foreach (LoginsEnabled d in handler.GetInvocationList()) | 2521 | foreach (RegionLoginsStatusChange d in handler.GetInvocationList()) |
2512 | { | 2522 | { |
2513 | try | 2523 | try |
2514 | { | 2524 | { |
2515 | d(regionName); | 2525 | d(scene); |
2526 | } | ||
2527 | catch (Exception e) | ||
2528 | { | ||
2529 | m_log.ErrorFormat("[EVENT MANAGER]: Delegate for OnRegionLoginsStatusChange failed - continuing {0} - {1}", | ||
2530 | e.Message, e.StackTrace); | ||
2531 | } | ||
2532 | } | ||
2533 | } | ||
2534 | } | ||
2535 | |||
2536 | public void TriggerRegionReady(IScene scene) | ||
2537 | { | ||
2538 | RegionReady handler = OnRegionReady; | ||
2539 | |||
2540 | if (handler != null) | ||
2541 | { | ||
2542 | foreach (RegionReady d in handler.GetInvocationList()) | ||
2543 | { | ||
2544 | try | ||
2545 | { | ||
2546 | d(scene); | ||
2516 | } | 2547 | } |
2517 | catch (Exception e) | 2548 | catch (Exception e) |
2518 | { | 2549 | { |
2519 | m_log.ErrorFormat("[EVENT MANAGER]: Delegate for LoginsEnabled failed - continuing {0} - {1}", | 2550 | m_log.ErrorFormat("[EVENT MANAGER]: Delegate for OnRegionReady failed - continuing {0} - {1}", |
2520 | e.Message, e.StackTrace); | 2551 | e.Message, e.StackTrace); |
2521 | } | 2552 | } |
2522 | } | 2553 | } |
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index f501828..56c58b7 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs | |||
@@ -129,9 +129,10 @@ namespace OpenSim.Region.Framework.Scenes | |||
129 | public bool m_strictAccessControl = true; | 129 | public bool m_strictAccessControl = true; |
130 | public bool m_seeIntoBannedRegion = false; | 130 | public bool m_seeIntoBannedRegion = false; |
131 | public int MaxUndoCount = 5; | 131 | public int MaxUndoCount = 5; |
132 | |||
132 | // Using this for RegionReady module to prevent LoginsDisabled from changing under our feet; | 133 | // Using this for RegionReady module to prevent LoginsDisabled from changing under our feet; |
133 | public bool LoginLock = false; | 134 | public bool LoginLock = false; |
134 | public bool LoginsDisabled = true; | 135 | |
135 | public bool StartDisabled = false; | 136 | public bool StartDisabled = false; |
136 | public bool LoadingPrims; | 137 | public bool LoadingPrims; |
137 | public IXfer XferManager; | 138 | public IXfer XferManager; |
@@ -727,6 +728,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
727 | { | 728 | { |
728 | IConfig startupConfig = m_config.Configs["Startup"]; | 729 | IConfig startupConfig = m_config.Configs["Startup"]; |
729 | 730 | ||
731 | StartDisabled = startupConfig.GetBoolean("StartDisabled", false); | ||
732 | |||
730 | m_defaultDrawDistance = startupConfig.GetFloat("DefaultDrawDistance",m_defaultDrawDistance); | 733 | m_defaultDrawDistance = startupConfig.GetFloat("DefaultDrawDistance",m_defaultDrawDistance); |
731 | m_useBackup = startupConfig.GetBoolean("UseSceneBackup", m_useBackup); | 734 | m_useBackup = startupConfig.GetBoolean("UseSceneBackup", m_useBackup); |
732 | if (!m_useBackup) | 735 | if (!m_useBackup) |
@@ -1530,7 +1533,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1530 | // landMS = Util.EnvironmentTickCountSubtract(ldMS); | 1533 | // landMS = Util.EnvironmentTickCountSubtract(ldMS); |
1531 | //} | 1534 | //} |
1532 | 1535 | ||
1533 | if (LoginsDisabled && Frame == 20) | 1536 | if (!LoginsEnabled && Frame == 20) |
1534 | { | 1537 | { |
1535 | // m_log.DebugFormat("{0} {1} {2}", LoginsDisabled, m_sceneGraph.GetActiveScriptsCount(), LoginLock); | 1538 | // m_log.DebugFormat("{0} {1} {2}", LoginsDisabled, m_sceneGraph.GetActiveScriptsCount(), LoginLock); |
1536 | 1539 | ||
@@ -1538,31 +1541,34 @@ namespace OpenSim.Region.Framework.Scenes | |||
1538 | // this is a rare case where we know we have just went through a long cycle of heap | 1541 | // this is a rare case where we know we have just went through a long cycle of heap |
1539 | // allocations, and there is no more work to be done until someone logs in | 1542 | // allocations, and there is no more work to be done until someone logs in |
1540 | GC.Collect(); | 1543 | GC.Collect(); |
1541 | 1544 | ||
1542 | IConfig startupConfig = m_config.Configs["Startup"]; | 1545 | if (!LoginLock) |
1543 | if (startupConfig == null || !startupConfig.GetBoolean("StartDisabled", false)) | ||
1544 | { | 1546 | { |
1545 | // This handles a case of a region having no scripts for the RegionReady module | 1547 | if (!StartDisabled) |
1546 | if (m_sceneGraph.GetActiveScriptsCount() == 0) | ||
1547 | { | ||
1548 | // need to be able to tell these have changed in RegionReady | ||
1549 | LoginLock = false; | ||
1550 | EventManager.TriggerLoginsEnabled(RegionInfo.RegionName); | ||
1551 | } | ||
1552 | |||
1553 | // For RegionReady lockouts | ||
1554 | if (!LoginLock) | ||
1555 | { | 1548 | { |
1556 | m_log.InfoFormat("[REGION]: Enabling logins for {0}", RegionInfo.RegionName); | 1549 | m_log.InfoFormat("[REGION]: Enabling logins for {0}", RegionInfo.RegionName); |
1557 | LoginsDisabled = false; | 1550 | LoginsEnabled = true; |
1558 | } | 1551 | } |
1559 | 1552 | ||
1560 | m_sceneGridService.InformNeighborsThatRegionisUp(RequestModuleInterface<INeighbourService>(), RegionInfo); | 1553 | m_sceneGridService.InformNeighborsThatRegionisUp( |
1554 | RequestModuleInterface<INeighbourService>(), RegionInfo); | ||
1555 | |||
1556 | // Region ready should always be triggered whether logins are immediately enabled or not. | ||
1557 | EventManager.TriggerRegionReady(this); | ||
1561 | } | 1558 | } |
1562 | else | 1559 | else |
1563 | { | 1560 | { |
1564 | StartDisabled = true; | 1561 | // This handles a case of a region having no scripts for the RegionReady module |
1565 | LoginsDisabled = true; | 1562 | if (m_sceneGraph.GetActiveScriptsCount() == 0) |
1563 | { | ||
1564 | // In this case, we leave it to the IRegionReadyModule to enable logins | ||
1565 | |||
1566 | // LoginLock can currently only be set by a region module implementation. | ||
1567 | // If somehow this hasn't been done then the quickest way to bugfix is to see the | ||
1568 | // NullReferenceException | ||
1569 | IRegionReadyModule rrm = RequestModuleInterface<IRegionReadyModule>(); | ||
1570 | rrm.TriggerRegionReady(this); | ||
1571 | } | ||
1566 | } | 1572 | } |
1567 | } | 1573 | } |
1568 | } | 1574 | } |
@@ -3487,25 +3493,31 @@ namespace OpenSim.Region.Framework.Scenes | |||
3487 | if (AgentTransactionsModule != null) | 3493 | if (AgentTransactionsModule != null) |
3488 | AgentTransactionsModule.RemoveAgentAssetTransactions(agentID); | 3494 | AgentTransactionsModule.RemoveAgentAssetTransactions(agentID); |
3489 | 3495 | ||
3490 | avatar.Close(); | ||
3491 | |||
3492 | m_authenticateHandler.RemoveCircuit(avatar.ControllingClient.CircuitCode); | 3496 | m_authenticateHandler.RemoveCircuit(avatar.ControllingClient.CircuitCode); |
3493 | m_log.Debug("[Scene] The avatar has left the building"); | 3497 | m_log.Debug("[Scene] The avatar has left the building"); |
3494 | } | 3498 | } |
3495 | catch (Exception e) | 3499 | catch (Exception e) |
3496 | { | 3500 | { |
3497 | m_log.Error( | 3501 | m_log.Error( |
3498 | string.Format("[SCENE]: Exception removing {0} from {1}, ", avatar.Name, RegionInfo.RegionName), e); | 3502 | string.Format("[SCENE]: Exception removing {0} from {1}. Cleaning up. Exception ", avatar.Name, Name), e); |
3499 | } | 3503 | } |
3500 | finally | 3504 | finally |
3501 | { | 3505 | { |
3502 | // Always clean these structures up so that any failure above doesn't cause them to remain in the | 3506 | try |
3503 | // scene with possibly bad effects (e.g. continually timing out on unacked packets and triggering | 3507 | { |
3504 | // the same cleanup exception continually. | 3508 | // Always clean these structures up so that any failure above doesn't cause them to remain in the |
3505 | // TODO: This should probably extend to the whole method, but we don't want to also catch the NRE | 3509 | // scene with possibly bad effects (e.g. continually timing out on unacked packets and triggering |
3506 | // since this would hide the underlying failure and other associated problems. | 3510 | // the same cleanup exception continually. |
3507 | m_sceneGraph.RemoveScenePresence(agentID); | 3511 | m_sceneGraph.RemoveScenePresence(agentID); |
3508 | m_clientManager.Remove(agentID); | 3512 | m_clientManager.Remove(agentID); |
3513 | |||
3514 | avatar.Close(); | ||
3515 | } | ||
3516 | catch (Exception e) | ||
3517 | { | ||
3518 | m_log.Error( | ||
3519 | string.Format("[SCENE]: Exception in final clean up of {0} in {1}. Exception ", avatar.Name, Name), e); | ||
3520 | } | ||
3509 | } | 3521 | } |
3510 | 3522 | ||
3511 | //m_log.InfoFormat("[SCENE] Memory pre GC {0}", System.GC.GetTotalMemory(false)); | 3523 | //m_log.InfoFormat("[SCENE] Memory pre GC {0}", System.GC.GetTotalMemory(false)); |
@@ -3619,7 +3631,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
3619 | agent.startpos | 3631 | agent.startpos |
3620 | ); | 3632 | ); |
3621 | 3633 | ||
3622 | if (LoginsDisabled) | 3634 | if (!LoginsEnabled) |
3623 | { | 3635 | { |
3624 | reason = "Logins Disabled"; | 3636 | reason = "Logins Disabled"; |
3625 | return false; | 3637 | return false; |
@@ -3676,8 +3688,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
3676 | // We have a zombie from a crashed session. | 3688 | // We have a zombie from a crashed session. |
3677 | // Or the same user is trying to be root twice here, won't work. | 3689 | // Or the same user is trying to be root twice here, won't work. |
3678 | // Kill it. | 3690 | // Kill it. |
3679 | m_log.DebugFormat( | 3691 | m_log.WarnFormat( |
3680 | "[SCENE]: Zombie scene presence detected for {0} {1} in {2}", | 3692 | "[SCENE]: Existing root scene presence detected for {0} {1} in {2} when connecting. Removing existing presence.", |
3681 | sp.Name, sp.UUID, RegionInfo.RegionName); | 3693 | sp.Name, sp.UUID, RegionInfo.RegionName); |
3682 | 3694 | ||
3683 | sp.ControllingClient.Close(); | 3695 | sp.ControllingClient.Close(); |
@@ -4668,6 +4680,23 @@ namespace OpenSim.Region.Framework.Scenes | |||
4668 | } | 4680 | } |
4669 | 4681 | ||
4670 | /// <summary> | 4682 | /// <summary> |
4683 | /// Gets all the scene presences in this scene. | ||
4684 | /// </summary> | ||
4685 | /// <remarks> | ||
4686 | /// This method will return both root and child scene presences. | ||
4687 | /// | ||
4688 | /// Consider using ForEachScenePresence() or ForEachRootScenePresence() if possible since these will not | ||
4689 | /// involving creating a new List object. | ||
4690 | /// </remarks> | ||
4691 | /// <returns> | ||
4692 | /// A list of the scene presences. Adding or removing from the list will not affect the presences in the scene. | ||
4693 | /// </returns> | ||
4694 | public List<ScenePresence> GetScenePresences() | ||
4695 | { | ||
4696 | return new List<ScenePresence>(m_sceneGraph.GetScenePresences()); | ||
4697 | } | ||
4698 | |||
4699 | /// <summary> | ||
4671 | /// Performs action on all avatars in the scene (root scene presences) | 4700 | /// Performs action on all avatars in the scene (root scene presences) |
4672 | /// Avatars may be an NPC or a 'real' client. | 4701 | /// Avatars may be an NPC or a 'real' client. |
4673 | /// </summary> | 4702 | /// </summary> |
diff --git a/OpenSim/Region/Framework/Scenes/SceneBase.cs b/OpenSim/Region/Framework/Scenes/SceneBase.cs index 8db4397..d55b082 100644 --- a/OpenSim/Region/Framework/Scenes/SceneBase.cs +++ b/OpenSim/Region/Framework/Scenes/SceneBase.cs | |||
@@ -106,6 +106,24 @@ namespace OpenSim.Region.Framework.Scenes | |||
106 | 106 | ||
107 | protected readonly ClientManager m_clientManager = new ClientManager(); | 107 | protected readonly ClientManager m_clientManager = new ClientManager(); |
108 | 108 | ||
109 | public bool LoginsEnabled | ||
110 | { | ||
111 | get | ||
112 | { | ||
113 | return m_loginsEnabled; | ||
114 | } | ||
115 | |||
116 | set | ||
117 | { | ||
118 | if (m_loginsEnabled != value) | ||
119 | { | ||
120 | m_loginsEnabled = value; | ||
121 | EventManager.TriggerRegionLoginsStatusChange(this); | ||
122 | } | ||
123 | } | ||
124 | } | ||
125 | private bool m_loginsEnabled; | ||
126 | |||
109 | public float TimeDilation | 127 | public float TimeDilation |
110 | { | 128 | { |
111 | get { return 1.0f; } | 129 | get { return 1.0f; } |
diff --git a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs index 5d8447b..775a4c2 100644 --- a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs +++ b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs | |||
@@ -100,7 +100,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
100 | { | 100 | { |
101 | m_log.WarnFormat( | 101 | m_log.WarnFormat( |
102 | "[SCENE COMMUNICATION SERVICE]: Region {0} failed to inform neighbour at {1}-{2} that it is up.", | 102 | "[SCENE COMMUNICATION SERVICE]: Region {0} failed to inform neighbour at {1}-{2} that it is up.", |
103 | x / Constants.RegionSize, y / Constants.RegionSize); | 103 | m_scene.Name, x / Constants.RegionSize, y / Constants.RegionSize); |
104 | } | 104 | } |
105 | } | 105 | } |
106 | 106 | ||
diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs index c3d66eb..e0260e2 100644 --- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs +++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs | |||
@@ -848,7 +848,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
848 | /// pass a delegate to ForEachScenePresence. | 848 | /// pass a delegate to ForEachScenePresence. |
849 | /// </summary> | 849 | /// </summary> |
850 | /// <returns></returns> | 850 | /// <returns></returns> |
851 | private List<ScenePresence> GetScenePresences() | 851 | protected internal List<ScenePresence> GetScenePresences() |
852 | { | 852 | { |
853 | return m_scenePresenceArray; | 853 | return m_scenePresenceArray; |
854 | } | 854 | } |
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index 6ab0027..08c7a58 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | |||
@@ -1991,7 +1991,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1991 | try | 1991 | try |
1992 | { | 1992 | { |
1993 | if (!m_scene.ShuttingDown || // if shutting down then there will be nothing to handle the return so leave till next restart | 1993 | if (!m_scene.ShuttingDown || // if shutting down then there will be nothing to handle the return so leave till next restart |
1994 | m_scene.LoginsDisabled || // We're starting up or doing maintenance, don't mess with things | 1994 | !m_scene.LoginsEnabled || // We're starting up or doing maintenance, don't mess with things |
1995 | m_scene.LoadingPrims) // Land may not be valid yet | 1995 | m_scene.LoadingPrims) // Land may not be valid yet |
1996 | 1996 | ||
1997 | { | 1997 | { |
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index e27d309..5cff3f0 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs | |||
@@ -110,15 +110,10 @@ namespace OpenSim.Region.Framework.Scenes | |||
110 | 110 | ||
111 | public UUID currentParcelUUID = UUID.Zero; | 111 | public UUID currentParcelUUID = UUID.Zero; |
112 | 112 | ||
113 | protected ScenePresenceAnimator m_animator; | ||
114 | /// <value> | 113 | /// <value> |
115 | /// The animator for this avatar | 114 | /// The animator for this avatar |
116 | /// </value> | 115 | /// </value> |
117 | public ScenePresenceAnimator Animator | 116 | public ScenePresenceAnimator Animator { get; private set; } |
118 | { | ||
119 | get { return m_animator; } | ||
120 | private set { m_animator = value; } | ||
121 | } | ||
122 | 117 | ||
123 | /// <summary> | 118 | /// <summary> |
124 | /// Attachments recorded on this avatar. | 119 | /// Attachments recorded on this avatar. |
@@ -2761,8 +2756,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
2761 | //m_log.DebugFormat("[SCENE PRESENCE] SendAvatarDataToAgent from {0} ({1}) to {2} ({3})", Name, UUID, avatar.Name, avatar.UUID); | 2756 | //m_log.DebugFormat("[SCENE PRESENCE] SendAvatarDataToAgent from {0} ({1}) to {2} ({3})", Name, UUID, avatar.Name, avatar.UUID); |
2762 | 2757 | ||
2763 | avatar.ControllingClient.SendAvatarDataImmediate(this); | 2758 | avatar.ControllingClient.SendAvatarDataImmediate(this); |
2764 | if (Animator != null) | 2759 | Animator.SendAnimPackToClient(avatar.ControllingClient); |
2765 | Animator.SendAnimPackToClient(avatar.ControllingClient); | ||
2766 | } | 2760 | } |
2767 | 2761 | ||
2768 | /// <summary> | 2762 | /// <summary> |
@@ -3438,6 +3432,16 @@ namespace OpenSim.Region.Framework.Scenes | |||
3438 | if (IsChildAgent) | 3432 | if (IsChildAgent) |
3439 | return; | 3433 | return; |
3440 | 3434 | ||
3435 | //if ((Math.Abs(Velocity.X) > 0.1e-9f) || (Math.Abs(Velocity.Y) > 0.1e-9f)) | ||
3436 | // The Physics Scene will send updates every 500 ms grep: PhysicsActor.SubscribeEvents( | ||
3437 | // as of this comment the interval is set in AddToPhysicalScene | ||
3438 | |||
3439 | // if (m_updateCount > 0) | ||
3440 | // { | ||
3441 | Animator.UpdateMovementAnimations(); | ||
3442 | // m_updateCount--; | ||
3443 | // } | ||
3444 | |||
3441 | CollisionEventUpdate collisionData = (CollisionEventUpdate)e; | 3445 | CollisionEventUpdate collisionData = (CollisionEventUpdate)e; |
3442 | Dictionary<uint, ContactPoint> coldata = collisionData.m_objCollisionList; | 3446 | Dictionary<uint, ContactPoint> coldata = collisionData.m_objCollisionList; |
3443 | 3447 | ||
@@ -3451,7 +3455,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
3451 | // m_lastColCount = coldata.Count; | 3455 | // m_lastColCount = coldata.Count; |
3452 | // } | 3456 | // } |
3453 | 3457 | ||
3454 | if (coldata.Count != 0 && Animator != null) | 3458 | if (coldata.Count != 0) |
3455 | { | 3459 | { |
3456 | switch (Animator.CurrentMovementAnimation) | 3460 | switch (Animator.CurrentMovementAnimation) |
3457 | { | 3461 | { |
@@ -3563,7 +3567,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
3563 | ControllingClient.SendHealth(Health); | 3567 | ControllingClient.SendHealth(Health); |
3564 | } | 3568 | } |
3565 | 3569 | ||
3566 | public void Close() | 3570 | protected internal void Close() |
3567 | { | 3571 | { |
3568 | // Clear known regions | 3572 | // Clear known regions |
3569 | KnownRegions = new Dictionary<ulong, string>(); | 3573 | KnownRegions = new Dictionary<ulong, string>(); |
@@ -3579,9 +3583,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
3579 | // m_reprioritizationTimer.Dispose(); | 3583 | // m_reprioritizationTimer.Dispose(); |
3580 | 3584 | ||
3581 | RemoveFromPhysicalScene(); | 3585 | RemoveFromPhysicalScene(); |
3582 | if(Animator != null) | ||
3583 | Animator.Close(); | ||
3584 | Animator = null; | ||
3585 | } | 3586 | } |
3586 | 3587 | ||
3587 | public void AddAttachment(SceneObjectGroup gobj) | 3588 | public void AddAttachment(SceneObjectGroup gobj) |
diff --git a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAgentTests.cs b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAgentTests.cs index 02c45ef..5758869 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAgentTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAgentTests.cs | |||
@@ -53,62 +53,94 @@ namespace OpenSim.Region.Framework.Scenes.Tests | |||
53 | /// Scene presence tests | 53 | /// Scene presence tests |
54 | /// </summary> | 54 | /// </summary> |
55 | [TestFixture] | 55 | [TestFixture] |
56 | public class ScenePresenceAgentTests | 56 | public class ScenePresenceAgentTests : OpenSimTestCase |
57 | { | 57 | { |
58 | public Scene scene, scene2, scene3; | 58 | // public Scene scene, scene2, scene3; |
59 | public UUID agent1, agent2, agent3; | 59 | // public UUID agent1, agent2, agent3; |
60 | public static Random random; | 60 | // public static Random random; |
61 | public ulong region1,region2,region3; | 61 | // public ulong region1, region2, region3; |
62 | public AgentCircuitData acd1; | 62 | // public AgentCircuitData acd1; |
63 | public SceneObjectGroup sog1, sog2, sog3; | 63 | // public TestClient testclient; |
64 | public TestClient testclient; | 64 | |
65 | 65 | // [TestFixtureSetUp] | |
66 | [TestFixtureSetUp] | 66 | // public void Init() |
67 | public void Init() | 67 | // { |
68 | //// TestHelpers.InMethod(); | ||
69 | //// | ||
70 | //// SceneHelpers sh = new SceneHelpers(); | ||
71 | //// | ||
72 | //// scene = sh.SetupScene("Neighbour x", UUID.Random(), 1000, 1000); | ||
73 | //// scene2 = sh.SetupScene("Neighbour x+1", UUID.Random(), 1001, 1000); | ||
74 | //// scene3 = sh.SetupScene("Neighbour x-1", UUID.Random(), 999, 1000); | ||
75 | //// | ||
76 | //// ISharedRegionModule interregionComms = new LocalSimulationConnectorModule(); | ||
77 | //// interregionComms.Initialise(new IniConfigSource()); | ||
78 | //// interregionComms.PostInitialise(); | ||
79 | //// SceneHelpers.SetupSceneModules(scene, new IniConfigSource(), interregionComms); | ||
80 | //// SceneHelpers.SetupSceneModules(scene2, new IniConfigSource(), interregionComms); | ||
81 | //// SceneHelpers.SetupSceneModules(scene3, new IniConfigSource(), interregionComms); | ||
82 | // | ||
83 | //// agent1 = UUID.Random(); | ||
84 | //// agent2 = UUID.Random(); | ||
85 | //// agent3 = UUID.Random(); | ||
86 | // | ||
87 | //// region1 = scene.RegionInfo.RegionHandle; | ||
88 | //// region2 = scene2.RegionInfo.RegionHandle; | ||
89 | //// region3 = scene3.RegionInfo.RegionHandle; | ||
90 | // } | ||
91 | |||
92 | [Test] | ||
93 | public void TestCreateRootScenePresence() | ||
68 | { | 94 | { |
69 | TestHelpers.InMethod(); | 95 | TestHelpers.InMethod(); |
96 | // TestHelpers.EnableLogging(); | ||
97 | |||
98 | UUID spUuid = TestHelpers.ParseTail(0x1); | ||
70 | 99 | ||
71 | SceneHelpers sh = new SceneHelpers(); | 100 | TestScene scene = new SceneHelpers().SetupScene(); |
72 | 101 | SceneHelpers.AddScenePresence(scene, spUuid); | |
73 | scene = sh.SetupScene("Neighbour x", UUID.Random(), 1000, 1000); | 102 | |
74 | scene2 = sh.SetupScene("Neighbour x+1", UUID.Random(), 1001, 1000); | 103 | Assert.That(scene.AuthenticateHandler.GetAgentCircuitData(spUuid), Is.Not.Null); |
75 | scene3 = sh.SetupScene("Neighbour x-1", UUID.Random(), 999, 1000); | 104 | Assert.That(scene.AuthenticateHandler.GetAgentCircuits().Count, Is.EqualTo(1)); |
76 | 105 | ||
77 | ISharedRegionModule interregionComms = new LocalSimulationConnectorModule(); | 106 | ScenePresence sp = scene.GetScenePresence(spUuid); |
78 | interregionComms.Initialise(new IniConfigSource()); | 107 | Assert.That(sp, Is.Not.Null); |
79 | interregionComms.PostInitialise(); | 108 | Assert.That(sp.IsChildAgent, Is.False); |
80 | SceneHelpers.SetupSceneModules(scene, new IniConfigSource(), interregionComms); | 109 | Assert.That(sp.UUID, Is.EqualTo(spUuid)); |
81 | SceneHelpers.SetupSceneModules(scene2, new IniConfigSource(), interregionComms); | 110 | |
82 | SceneHelpers.SetupSceneModules(scene3, new IniConfigSource(), interregionComms); | 111 | Assert.That(scene.GetScenePresences().Count, Is.EqualTo(1)); |
83 | |||
84 | agent1 = UUID.Random(); | ||
85 | agent2 = UUID.Random(); | ||
86 | agent3 = UUID.Random(); | ||
87 | random = new Random(); | ||
88 | sog1 = SceneHelpers.CreateSceneObject(1, agent1); | ||
89 | scene.AddSceneObject(sog1); | ||
90 | sog2 = SceneHelpers.CreateSceneObject(1, agent1); | ||
91 | scene.AddSceneObject(sog2); | ||
92 | sog3 = SceneHelpers.CreateSceneObject(1, agent1); | ||
93 | scene.AddSceneObject(sog3); | ||
94 | |||
95 | region1 = scene.RegionInfo.RegionHandle; | ||
96 | region2 = scene2.RegionInfo.RegionHandle; | ||
97 | region3 = scene3.RegionInfo.RegionHandle; | ||
98 | } | 112 | } |
99 | 113 | ||
100 | [Test] | 114 | [Test] |
101 | public void TestCloseAgent() | 115 | public void TestCreateDuplicateRootScenePresence() |
102 | { | 116 | { |
103 | TestHelpers.InMethod(); | 117 | TestHelpers.InMethod(); |
104 | // TestHelpers.EnableLogging(); | 118 | // TestHelpers.EnableLogging(); |
105 | 119 | ||
120 | UUID spUuid = TestHelpers.ParseTail(0x1); | ||
121 | |||
106 | TestScene scene = new SceneHelpers().SetupScene(); | 122 | TestScene scene = new SceneHelpers().SetupScene(); |
107 | ScenePresence sp = SceneHelpers.AddScenePresence(scene, TestHelpers.ParseTail(0x1)); | 123 | SceneHelpers.AddScenePresence(scene, spUuid); |
124 | SceneHelpers.AddScenePresence(scene, spUuid); | ||
108 | 125 | ||
109 | Assert.That(scene.AuthenticateHandler.GetAgentCircuitData(sp.UUID), Is.Not.Null); | 126 | Assert.That(scene.AuthenticateHandler.GetAgentCircuitData(spUuid), Is.Not.Null); |
110 | Assert.That(scene.AuthenticateHandler.GetAgentCircuits().Count, Is.EqualTo(1)); | 127 | Assert.That(scene.AuthenticateHandler.GetAgentCircuits().Count, Is.EqualTo(1)); |
111 | 128 | ||
129 | ScenePresence sp = scene.GetScenePresence(spUuid); | ||
130 | Assert.That(sp, Is.Not.Null); | ||
131 | Assert.That(sp.IsChildAgent, Is.False); | ||
132 | Assert.That(sp.UUID, Is.EqualTo(spUuid)); | ||
133 | } | ||
134 | |||
135 | [Test] | ||
136 | public void TestCloseAgent() | ||
137 | { | ||
138 | TestHelpers.InMethod(); | ||
139 | // TestHelpers.EnableLogging(); | ||
140 | |||
141 | TestScene scene = new SceneHelpers().SetupScene(); | ||
142 | ScenePresence sp = SceneHelpers.AddScenePresence(scene, TestHelpers.ParseTail(0x1)); | ||
143 | |||
112 | scene.IncomingCloseAgent(sp.UUID); | 144 | scene.IncomingCloseAgent(sp.UUID); |
113 | 145 | ||
114 | Assert.That(scene.GetScenePresence(sp.UUID), Is.Null); | 146 | Assert.That(scene.GetScenePresence(sp.UUID), Is.Null); |
@@ -266,99 +298,99 @@ namespace OpenSim.Region.Framework.Scenes.Tests | |||
266 | // but things are synchronous among them. So there should be | 298 | // but things are synchronous among them. So there should be |
267 | // 3 threads in here. | 299 | // 3 threads in here. |
268 | //[Test] | 300 | //[Test] |
269 | public void T021_TestCrossToNewRegion() | 301 | // public void T021_TestCrossToNewRegion() |
270 | { | 302 | // { |
271 | TestHelpers.InMethod(); | 303 | // TestHelpers.InMethod(); |
272 | 304 | // | |
273 | scene.RegisterRegionWithGrid(); | 305 | // scene.RegisterRegionWithGrid(); |
274 | scene2.RegisterRegionWithGrid(); | 306 | // scene2.RegisterRegionWithGrid(); |
275 | 307 | // | |
276 | // Adding child agent to region 1001 | 308 | // // Adding child agent to region 1001 |
277 | string reason; | 309 | // string reason; |
278 | scene2.NewUserConnection(acd1,0, out reason); | 310 | // scene2.NewUserConnection(acd1,0, out reason); |
279 | scene2.AddNewClient(testclient, PresenceType.User); | 311 | // scene2.AddNewClient(testclient, PresenceType.User); |
280 | 312 | // | |
281 | ScenePresence presence = scene.GetScenePresence(agent1); | 313 | // ScenePresence presence = scene.GetScenePresence(agent1); |
282 | presence.MakeRootAgent(new Vector3(0,unchecked(Constants.RegionSize-1),0), true); | 314 | // presence.MakeRootAgent(new Vector3(0,unchecked(Constants.RegionSize-1),0), true); |
283 | 315 | // | |
284 | ScenePresence presence2 = scene2.GetScenePresence(agent1); | 316 | // ScenePresence presence2 = scene2.GetScenePresence(agent1); |
285 | 317 | // | |
286 | // Adding neighbour region caps info to presence2 | 318 | // // Adding neighbour region caps info to presence2 |
287 | 319 | // | |
288 | string cap = presence.ControllingClient.RequestClientInfo().CapsPath; | 320 | // string cap = presence.ControllingClient.RequestClientInfo().CapsPath; |
289 | presence2.AddNeighbourRegion(region1, cap); | 321 | // presence2.AddNeighbourRegion(region1, cap); |
290 | 322 | // | |
291 | Assert.That(presence.IsChildAgent, Is.False, "Did not start root in origin region."); | 323 | // Assert.That(presence.IsChildAgent, Is.False, "Did not start root in origin region."); |
292 | Assert.That(presence2.IsChildAgent, Is.True, "Is not a child on destination region."); | 324 | // Assert.That(presence2.IsChildAgent, Is.True, "Is not a child on destination region."); |
293 | 325 | // | |
294 | // Cross to x+1 | 326 | // // Cross to x+1 |
295 | presence.AbsolutePosition = new Vector3(Constants.RegionSize+1,3,100); | 327 | // presence.AbsolutePosition = new Vector3(Constants.RegionSize+1,3,100); |
296 | presence.Update(); | 328 | // presence.Update(); |
297 | 329 | // | |
298 | EventWaitHandle wh = new EventWaitHandle (false, EventResetMode.AutoReset, "Crossing"); | 330 | // EventWaitHandle wh = new EventWaitHandle (false, EventResetMode.AutoReset, "Crossing"); |
299 | 331 | // | |
300 | // Mimicking communication between client and server, by waiting OK from client | 332 | // // Mimicking communication between client and server, by waiting OK from client |
301 | // sent by TestClient.CrossRegion call. Originally, this is network comm. | 333 | // // sent by TestClient.CrossRegion call. Originally, this is network comm. |
302 | if (!wh.WaitOne(5000,false)) | 334 | // if (!wh.WaitOne(5000,false)) |
303 | { | 335 | // { |
304 | presence.Update(); | 336 | // presence.Update(); |
305 | if (!wh.WaitOne(8000,false)) | 337 | // if (!wh.WaitOne(8000,false)) |
306 | throw new ArgumentException("1 - Timeout waiting for signal/variable."); | 338 | // throw new ArgumentException("1 - Timeout waiting for signal/variable."); |
307 | } | 339 | // } |
308 | 340 | // | |
309 | // This is a TestClient specific method that fires OnCompleteMovementToRegion event, which | 341 | // // This is a TestClient specific method that fires OnCompleteMovementToRegion event, which |
310 | // would normally be fired after receiving the reply packet from comm. done on the last line. | 342 | // // would normally be fired after receiving the reply packet from comm. done on the last line. |
311 | testclient.CompleteMovement(); | 343 | // testclient.CompleteMovement(); |
312 | 344 | // | |
313 | // Crossings are asynchronous | 345 | // // Crossings are asynchronous |
314 | int timer = 10; | 346 | // int timer = 10; |
315 | 347 | // | |
316 | // Make sure cross hasn't already finished | 348 | // // Make sure cross hasn't already finished |
317 | if (!presence.IsInTransit && !presence.IsChildAgent) | 349 | // if (!presence.IsInTransit && !presence.IsChildAgent) |
318 | { | 350 | // { |
319 | // If not and not in transit yet, give it some more time | 351 | // // If not and not in transit yet, give it some more time |
320 | Thread.Sleep(5000); | 352 | // Thread.Sleep(5000); |
321 | } | 353 | // } |
322 | 354 | // | |
323 | // Enough time, should at least be in transit by now. | 355 | // // Enough time, should at least be in transit by now. |
324 | while (presence.IsInTransit && timer > 0) | 356 | // while (presence.IsInTransit && timer > 0) |
325 | { | 357 | // { |
326 | Thread.Sleep(1000); | 358 | // Thread.Sleep(1000); |
327 | timer-=1; | 359 | // timer-=1; |
328 | } | 360 | // } |
329 | 361 | // | |
330 | Assert.That(timer,Is.GreaterThan(0),"Timed out waiting to cross 2->1."); | 362 | // Assert.That(timer,Is.GreaterThan(0),"Timed out waiting to cross 2->1."); |
331 | Assert.That(presence.IsChildAgent, Is.True, "Did not complete region cross as expected."); | 363 | // Assert.That(presence.IsChildAgent, Is.True, "Did not complete region cross as expected."); |
332 | Assert.That(presence2.IsChildAgent, Is.False, "Did not receive root status after receiving agent."); | 364 | // Assert.That(presence2.IsChildAgent, Is.False, "Did not receive root status after receiving agent."); |
333 | 365 | // | |
334 | // Cross Back | 366 | // // Cross Back |
335 | presence2.AbsolutePosition = new Vector3(-10, 3, 100); | 367 | // presence2.AbsolutePosition = new Vector3(-10, 3, 100); |
336 | presence2.Update(); | 368 | // presence2.Update(); |
337 | 369 | // | |
338 | if (!wh.WaitOne(5000,false)) | 370 | // if (!wh.WaitOne(5000,false)) |
339 | { | 371 | // { |
340 | presence2.Update(); | 372 | // presence2.Update(); |
341 | if (!wh.WaitOne(8000,false)) | 373 | // if (!wh.WaitOne(8000,false)) |
342 | throw new ArgumentException("2 - Timeout waiting for signal/variable."); | 374 | // throw new ArgumentException("2 - Timeout waiting for signal/variable."); |
343 | } | 375 | // } |
344 | testclient.CompleteMovement(); | 376 | // testclient.CompleteMovement(); |
345 | 377 | // | |
346 | if (!presence2.IsInTransit && !presence2.IsChildAgent) | 378 | // if (!presence2.IsInTransit && !presence2.IsChildAgent) |
347 | { | 379 | // { |
348 | // If not and not in transit yet, give it some more time | 380 | // // If not and not in transit yet, give it some more time |
349 | Thread.Sleep(5000); | 381 | // Thread.Sleep(5000); |
350 | } | 382 | // } |
351 | 383 | // | |
352 | // Enough time, should at least be in transit by now. | 384 | // // Enough time, should at least be in transit by now. |
353 | while (presence2.IsInTransit && timer > 0) | 385 | // while (presence2.IsInTransit && timer > 0) |
354 | { | 386 | // { |
355 | Thread.Sleep(1000); | 387 | // Thread.Sleep(1000); |
356 | timer-=1; | 388 | // timer-=1; |
357 | } | 389 | // } |
358 | 390 | // | |
359 | Assert.That(timer,Is.GreaterThan(0),"Timed out waiting to cross 1->2."); | 391 | // Assert.That(timer,Is.GreaterThan(0),"Timed out waiting to cross 1->2."); |
360 | Assert.That(presence2.IsChildAgent, Is.True, "Did not return from region as expected."); | 392 | // Assert.That(presence2.IsChildAgent, Is.True, "Did not return from region as expected."); |
361 | Assert.That(presence.IsChildAgent, Is.False, "Presence was not made root in old region again."); | 393 | // Assert.That(presence.IsChildAgent, Is.False, "Presence was not made root in old region again."); |
362 | } | 394 | // } |
363 | } | 395 | } |
364 | } \ No newline at end of file | 396 | } \ No newline at end of file |
diff --git a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTeleportTests.cs b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTeleportTests.cs index a407f01..37b5184 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTeleportTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTeleportTests.cs | |||
@@ -301,7 +301,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests | |||
301 | sp.AbsolutePosition = preTeleportPosition; | 301 | sp.AbsolutePosition = preTeleportPosition; |
302 | 302 | ||
303 | // Make sceneB refuse CreateAgent | 303 | // Make sceneB refuse CreateAgent |
304 | sceneB.LoginsDisabled = true; | 304 | sceneB.LoginsEnabled = false; |
305 | 305 | ||
306 | sceneA.RequestTeleportLocation( | 306 | sceneA.RequestTeleportLocation( |
307 | sp.ControllingClient, | 307 | sp.ControllingClient, |
diff --git a/OpenSim/Region/OptionalModules/PhysicsParameters/PhysicsParameters.cs b/OpenSim/Region/OptionalModules/PhysicsParameters/PhysicsParameters.cs index e452124..40f7fbc 100755 --- a/OpenSim/Region/OptionalModules/PhysicsParameters/PhysicsParameters.cs +++ b/OpenSim/Region/OptionalModules/PhysicsParameters/PhysicsParameters.cs | |||
@@ -47,7 +47,7 @@ namespace OpenSim.Region.OptionalModules.PhysicsParameters | |||
47 | [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "PhysicsParameters")] | 47 | [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "PhysicsParameters")] |
48 | public class PhysicsParameters : ISharedRegionModule | 48 | public class PhysicsParameters : ISharedRegionModule |
49 | { | 49 | { |
50 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 50 | // private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
51 | // private static string LogHeader = "[PHYSICS PARAMETERS]"; | 51 | // private static string LogHeader = "[PHYSICS PARAMETERS]"; |
52 | 52 | ||
53 | private List<Scene> m_scenes = new List<Scene>(); | 53 | private List<Scene> m_scenes = new List<Scene>(); |
diff --git a/OpenSim/Region/OptionalModules/Scripting/RegionReadyModule/RegionReadyModule.cs b/OpenSim/Region/OptionalModules/Scripting/RegionReadyModule/RegionReadyModule.cs index 600cafb..f459b8c 100644 --- a/OpenSim/Region/OptionalModules/Scripting/RegionReadyModule/RegionReadyModule.cs +++ b/OpenSim/Region/OptionalModules/Scripting/RegionReadyModule/RegionReadyModule.cs | |||
@@ -31,16 +31,14 @@ using System.Reflection; | |||
31 | using System.Net; | 31 | using System.Net; |
32 | using System.IO; | 32 | using System.IO; |
33 | using System.Text; | 33 | using System.Text; |
34 | |||
35 | using log4net; | 34 | using log4net; |
36 | using Nini.Config; | 35 | using Nini.Config; |
37 | using OpenMetaverse; | 36 | using OpenMetaverse; |
38 | using OpenMetaverse.StructuredData; | 37 | using OpenMetaverse.StructuredData; |
39 | using OpenSim.Services.Interfaces; | ||
40 | |||
41 | using OpenSim.Framework; | 38 | using OpenSim.Framework; |
42 | using OpenSim.Region.Framework.Interfaces; | 39 | using OpenSim.Region.Framework.Interfaces; |
43 | using OpenSim.Region.Framework.Scenes; | 40 | using OpenSim.Region.Framework.Scenes; |
41 | using OpenSim.Services.Interfaces; | ||
44 | 42 | ||
45 | namespace OpenSim.Region.OptionalModules.Scripting.RegionReady | 43 | namespace OpenSim.Region.OptionalModules.Scripting.RegionReady |
46 | { | 44 | { |
@@ -50,16 +48,15 @@ namespace OpenSim.Region.OptionalModules.Scripting.RegionReady | |||
50 | LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 48 | LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
51 | 49 | ||
52 | private IConfig m_config = null; | 50 | private IConfig m_config = null; |
53 | private bool m_ScriptRez; | ||
54 | private bool m_firstEmptyCompileQueue; | 51 | private bool m_firstEmptyCompileQueue; |
55 | private bool m_oarFileLoading; | 52 | private bool m_oarFileLoading; |
56 | private bool m_lastOarLoadedOk; | 53 | private bool m_lastOarLoadedOk; |
57 | private int m_channelNotify = -1000; | 54 | private int m_channelNotify = -1000; |
58 | private bool m_enabled = false; | 55 | private bool m_enabled = false; |
59 | private bool m_disable_logins = false; | 56 | private bool m_disable_logins; |
60 | private string m_uri = string.Empty; | 57 | private string m_uri = string.Empty; |
61 | 58 | ||
62 | Scene m_scene = null; | 59 | Scene m_scene; |
63 | 60 | ||
64 | #region INonSharedRegionModule interface | 61 | #region INonSharedRegionModule interface |
65 | 62 | ||
@@ -93,53 +90,40 @@ namespace OpenSim.Region.OptionalModules.Scripting.RegionReady | |||
93 | 90 | ||
94 | m_scene.RegisterModuleInterface<IRegionReadyModule>(this); | 91 | m_scene.RegisterModuleInterface<IRegionReadyModule>(this); |
95 | 92 | ||
96 | m_ScriptRez = false; | ||
97 | m_firstEmptyCompileQueue = true; | 93 | m_firstEmptyCompileQueue = true; |
98 | m_oarFileLoading = false; | 94 | m_oarFileLoading = false; |
99 | m_lastOarLoadedOk = true; | 95 | m_lastOarLoadedOk = true; |
100 | 96 | ||
101 | m_scene.EventManager.OnOarFileLoaded += OnOarFileLoaded; | 97 | m_scene.EventManager.OnOarFileLoaded += OnOarFileLoaded; |
102 | m_scene.EventManager.OnRezScript += OnRezScript; | ||
103 | m_scene.EventManager.OnLoginsEnabled += OnLoginsEnabled; | ||
104 | 98 | ||
105 | m_log.DebugFormat("[RegionReady]: Enabled for region {0}", scene.RegionInfo.RegionName); | 99 | m_log.DebugFormat("[RegionReady]: Enabled for region {0}", scene.RegionInfo.RegionName); |
106 | 100 | ||
107 | if (m_disable_logins == true) | 101 | if (m_disable_logins) |
108 | { | 102 | { |
109 | scene.LoginLock = true; | 103 | m_scene.LoginLock = true; |
110 | scene.LoginsDisabled = true; | 104 | m_scene.EventManager.OnEmptyScriptCompileQueue += OnEmptyScriptCompileQueue; |
111 | m_log.InfoFormat("[RegionReady]: Region {0} - logins disabled during initialization.",m_scene.RegionInfo.RegionName); | 105 | |
106 | m_log.InfoFormat("[RegionReady]: Region {0} - LOGINS DISABLED DURING INITIALIZATION.", m_scene.Name); | ||
112 | 107 | ||
113 | if(m_uri != string.Empty) | 108 | if (m_uri != string.Empty) |
114 | { | 109 | { |
115 | RRAlert("disabled"); | 110 | RRAlert("disabled"); |
116 | } | 111 | } |
117 | } | 112 | } |
118 | } | 113 | } |
119 | 114 | ||
120 | void OnRezScript (uint localID, UUID itemID, string script, int startParam, bool postOnRez, string engine, int stateSource) | ||
121 | { | ||
122 | if (!m_ScriptRez) | ||
123 | { | ||
124 | m_ScriptRez = true; | ||
125 | m_scene.EventManager.OnEmptyScriptCompileQueue += OnEmptyScriptCompileQueue; | ||
126 | m_scene.EventManager.OnRezScript -= OnRezScript; | ||
127 | } | ||
128 | } | ||
129 | |||
130 | public void RemoveRegion(Scene scene) | 115 | public void RemoveRegion(Scene scene) |
131 | { | 116 | { |
132 | if (!m_enabled) | 117 | if (!m_enabled) |
133 | return; | 118 | return; |
134 | 119 | ||
135 | m_scene.EventManager.OnEmptyScriptCompileQueue -= OnEmptyScriptCompileQueue; | ||
136 | m_scene.EventManager.OnOarFileLoaded -= OnOarFileLoaded; | 120 | m_scene.EventManager.OnOarFileLoaded -= OnOarFileLoaded; |
137 | m_scene.EventManager.OnLoginsEnabled -= OnLoginsEnabled; | ||
138 | 121 | ||
139 | if(m_uri != string.Empty) | 122 | if (m_disable_logins) |
140 | { | 123 | m_scene.EventManager.OnEmptyScriptCompileQueue -= OnEmptyScriptCompileQueue; |
124 | |||
125 | if (m_uri != string.Empty) | ||
141 | RRAlert("shutdown"); | 126 | RRAlert("shutdown"); |
142 | } | ||
143 | 127 | ||
144 | m_scene = null; | 128 | m_scene = null; |
145 | } | 129 | } |
@@ -159,7 +143,6 @@ namespace OpenSim.Region.OptionalModules.Scripting.RegionReady | |||
159 | 143 | ||
160 | #endregion | 144 | #endregion |
161 | 145 | ||
162 | |||
163 | void OnEmptyScriptCompileQueue(int numScriptsFailed, string message) | 146 | void OnEmptyScriptCompileQueue(int numScriptsFailed, string message) |
164 | { | 147 | { |
165 | m_log.DebugFormat("[RegionReady]: Script compile queue empty!"); | 148 | m_log.DebugFormat("[RegionReady]: Script compile queue empty!"); |
@@ -193,75 +176,80 @@ namespace OpenSim.Region.OptionalModules.Scripting.RegionReady | |||
193 | m_scene.RegionInfo.RegionName, c.Message, m_channelNotify); | 176 | m_scene.RegionInfo.RegionName, c.Message, m_channelNotify); |
194 | 177 | ||
195 | m_scene.EventManager.TriggerOnChatBroadcast(this, c); | 178 | m_scene.EventManager.TriggerOnChatBroadcast(this, c); |
196 | m_scene.EventManager.TriggerLoginsEnabled(m_scene.RegionInfo.RegionName); | 179 | |
197 | m_scene.SceneGridService.InformNeighborsThatRegionisUp(m_scene.RequestModuleInterface<INeighbourService>(), m_scene.RegionInfo); | 180 | TriggerRegionReady(m_scene); |
198 | } | 181 | } |
199 | } | 182 | } |
200 | 183 | ||
201 | void OnOarFileLoaded(Guid requestId, string message) | 184 | void OnOarFileLoaded(Guid requestId, string message) |
202 | { | 185 | { |
203 | m_oarFileLoading = true; | 186 | m_oarFileLoading = true; |
187 | |||
204 | if (message==String.Empty) | 188 | if (message==String.Empty) |
205 | { | 189 | { |
206 | m_lastOarLoadedOk = true; | 190 | m_lastOarLoadedOk = true; |
207 | } else { | 191 | } |
192 | else | ||
193 | { | ||
208 | m_log.WarnFormat("[RegionReady]: Oar file load errors: {0}", message); | 194 | m_log.WarnFormat("[RegionReady]: Oar file load errors: {0}", message); |
209 | m_lastOarLoadedOk = false; | 195 | m_lastOarLoadedOk = false; |
210 | } | 196 | } |
211 | } | 197 | } |
212 | 198 | ||
213 | // This will be triggerd by Scene if we have no scripts | 199 | /// <summary> |
214 | // m_ScriptsRezzing will be false if there were none | 200 | /// This will be triggered by Scene directly if it contains no scripts on startup. Otherwise it is triggered |
215 | // else it will be true and we should wait on the | 201 | /// when the script compile queue is empty after initial region startup. |
216 | // empty compile queue | 202 | /// </summary> |
217 | void OnLoginsEnabled(string regionName) | 203 | /// <param name='scene'></param> |
204 | public void TriggerRegionReady(IScene scene) | ||
218 | { | 205 | { |
219 | if (m_disable_logins == true) | 206 | m_scene.EventManager.OnEmptyScriptCompileQueue -= OnEmptyScriptCompileQueue; |
207 | m_scene.LoginLock = false; | ||
208 | |||
209 | if (!m_scene.StartDisabled) | ||
220 | { | 210 | { |
221 | if (m_scene.StartDisabled == false) | 211 | m_scene.LoginsEnabled = true; |
222 | { | ||
223 | m_scene.LoginsDisabled = false; | ||
224 | m_scene.LoginLock = false; | ||
225 | 212 | ||
226 | m_scene.EventManager.OnEmptyScriptCompileQueue -= OnEmptyScriptCompileQueue; | 213 | // m_log.InfoFormat("[RegionReady]: Logins enabled for {0}, Oar {1}", |
214 | // m_scene.RegionInfo.RegionName, m_oarFileLoading.ToString()); | ||
227 | 215 | ||
228 | // m_log.InfoFormat("[RegionReady]: Logins enabled for {0}, Oar {1}", | 216 | m_log.InfoFormat( |
229 | // m_scene.RegionInfo.RegionName, m_oarFileLoading.ToString()); | 217 | "[RegionReady]: INITIALIZATION COMPLETE FOR {0} - LOGINS ENABLED", m_scene.Name); |
218 | } | ||
230 | 219 | ||
231 | m_log.InfoFormat( | 220 | m_scene.SceneGridService.InformNeighborsThatRegionisUp( |
232 | "[RegionReady]: INITIALIZATION COMPLETE FOR {0} - LOGINS ENABLED", m_scene.Name); | 221 | m_scene.RequestModuleInterface<INeighbourService>(), m_scene.RegionInfo); |
233 | 222 | ||
234 | if (m_uri != string.Empty) | 223 | if (m_uri != string.Empty) |
235 | { | 224 | { |
236 | RRAlert("enabled"); | 225 | RRAlert("enabled"); |
237 | } | ||
238 | } | ||
239 | } | 226 | } |
227 | |||
228 | m_scene.EventManager.TriggerRegionReady(m_scene); | ||
240 | } | 229 | } |
241 | 230 | ||
242 | public void OarLoadingAlert(string msg) | 231 | public void OarLoadingAlert(string msg) |
243 | { | 232 | { |
244 | // Let's bypass this for now until some better feedback can be established | 233 | // Let's bypass this for now until some better feedback can be established |
245 | // | 234 | // |
246 | return; | ||
247 | 235 | ||
248 | if (msg == "load") | 236 | // if (msg == "load") |
249 | { | 237 | // { |
250 | m_scene.EventManager.OnEmptyScriptCompileQueue += OnEmptyScriptCompileQueue; | 238 | // m_scene.EventManager.OnEmptyScriptCompileQueue += OnEmptyScriptCompileQueue; |
251 | m_scene.EventManager.OnOarFileLoaded += OnOarFileLoaded; | 239 | // m_scene.EventManager.OnOarFileLoaded += OnOarFileLoaded; |
252 | m_scene.EventManager.OnLoginsEnabled += OnLoginsEnabled; | 240 | // m_scene.EventManager.OnLoginsEnabled += OnLoginsEnabled; |
253 | m_scene.EventManager.OnRezScript += OnRezScript; | 241 | // m_scene.EventManager.OnRezScript += OnRezScript; |
254 | m_oarFileLoading = true; | 242 | // m_oarFileLoading = true; |
255 | m_firstEmptyCompileQueue = true; | 243 | // m_firstEmptyCompileQueue = true; |
256 | 244 | // | |
257 | m_scene.LoginsDisabled = true; | 245 | // m_scene.LoginsDisabled = true; |
258 | m_scene.LoginLock = true; | 246 | // m_scene.LoginLock = true; |
259 | if ( m_uri != string.Empty ) | 247 | // if ( m_uri != string.Empty ) |
260 | { | 248 | // { |
261 | RRAlert("loading oar"); | 249 | // RRAlert("loading oar"); |
262 | RRAlert("disabled"); | 250 | // RRAlert("disabled"); |
263 | } | 251 | // } |
264 | } | 252 | // } |
265 | } | 253 | } |
266 | 254 | ||
267 | public void RRAlert(string status) | 255 | public void RRAlert(string status) |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 977f39e..070ba57 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | |||
@@ -6887,22 +6887,22 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
6887 | if (folderID == UUID.Zero) | 6887 | if (folderID == UUID.Zero) |
6888 | return; | 6888 | return; |
6889 | 6889 | ||
6890 | byte[] bucket = new byte[1]; | ||
6891 | bucket[0] = (byte)AssetType.Folder; | ||
6892 | //byte[] objBytes = folderID.GetBytes(); | ||
6893 | //Array.Copy(objBytes, 0, bucket, 1, 16); | ||
6894 | |||
6895 | GridInstantMessage msg = new GridInstantMessage(World, | ||
6896 | m_host.OwnerID, m_host.Name, destID, | ||
6897 | (byte)InstantMessageDialog.TaskInventoryOffered, | ||
6898 | false, category+". "+m_host.Name+" is located at "+ | ||
6899 | World.RegionInfo.RegionName+" "+ | ||
6900 | m_host.AbsolutePosition.ToString(), | ||
6901 | folderID, true, m_host.AbsolutePosition, | ||
6902 | bucket); | ||
6903 | |||
6904 | if (m_TransferModule != null) | 6890 | if (m_TransferModule != null) |
6891 | { | ||
6892 | byte[] bucket = new byte[] { (byte)AssetType.Folder }; | ||
6893 | |||
6894 | GridInstantMessage msg = new GridInstantMessage(World, | ||
6895 | m_host.UUID, m_host.Name + ", an object owned by " + | ||
6896 | resolveName(m_host.OwnerID) + ",", destID, | ||
6897 | (byte)InstantMessageDialog.TaskInventoryOffered, | ||
6898 | false, category + "\n" + m_host.Name + " is located at " + | ||
6899 | World.RegionInfo.RegionName + " " + | ||
6900 | m_host.AbsolutePosition.ToString(), | ||
6901 | folderID, true, m_host.AbsolutePosition, | ||
6902 | bucket); | ||
6903 | |||
6905 | m_TransferModule.SendInstantMessage(msg, delegate(bool success) {}); | 6904 | m_TransferModule.SendInstantMessage(msg, delegate(bool success) {}); |
6905 | } | ||
6906 | } | 6906 | } |
6907 | 6907 | ||
6908 | public void llSetVehicleType(int type) | 6908 | public void llSetVehicleType(int type) |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs index 983eed2..771db0c 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs | |||
@@ -312,11 +312,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance | |||
312 | part.SetScriptEvents(ItemID, | 312 | part.SetScriptEvents(ItemID, |
313 | (int)m_Script.GetStateEventFlags(State)); | 313 | (int)m_Script.GetStateEventFlags(State)); |
314 | 314 | ||
315 | Running = false; | 315 | if (!Running) |
316 | |||
317 | if (ShuttingDown) | ||
318 | m_startOnInit = false; | 316 | m_startOnInit = false; |
319 | 317 | ||
318 | Running = false; | ||
319 | |||
320 | // we get new rez events on sim restart, too | 320 | // we get new rez events on sim restart, too |
321 | // but if there is state, then we fire the change | 321 | // but if there is state, then we fire the change |
322 | // event | 322 | // event |
@@ -352,12 +352,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance | |||
352 | 352 | ||
353 | public void Init() | 353 | public void Init() |
354 | { | 354 | { |
355 | if (!m_startOnInit) | 355 | if (ShuttingDown) |
356 | return; | 356 | return; |
357 | 357 | ||
358 | if (m_startedFromSavedState) | 358 | if (m_startedFromSavedState) |
359 | { | 359 | { |
360 | Start(); | 360 | if (m_startOnInit) |
361 | Start(); | ||
361 | if (m_postOnRez) | 362 | if (m_postOnRez) |
362 | { | 363 | { |
363 | PostEvent(new EventParams("on_rez", | 364 | PostEvent(new EventParams("on_rez", |
@@ -389,7 +390,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance | |||
389 | } | 390 | } |
390 | else | 391 | else |
391 | { | 392 | { |
392 | Start(); | 393 | if (m_startOnInit) |
394 | Start(); | ||
393 | PostEvent(new EventParams("state_entry", | 395 | PostEvent(new EventParams("state_entry", |
394 | new Object[0], new DetectParams[0])); | 396 | new Object[0], new DetectParams[0])); |
395 | if (m_postOnRez) | 397 | if (m_postOnRez) |
diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs index 35a0200..79a6e09 100644 --- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs +++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs | |||
@@ -109,6 +109,8 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
109 | private bool m_KillTimedOutScripts; | 109 | private bool m_KillTimedOutScripts; |
110 | private string m_ScriptEnginesPath = null; | 110 | private string m_ScriptEnginesPath = null; |
111 | 111 | ||
112 | private ExpiringCache<UUID, bool> m_runFlags = new ExpiringCache<UUID, bool>(); | ||
113 | |||
112 | /// <summary> | 114 | /// <summary> |
113 | /// Is the entire simulator in the process of shutting down? | 115 | /// Is the entire simulator in the process of shutting down? |
114 | /// </summary> | 116 | /// </summary> |
@@ -715,6 +717,10 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
715 | m_Scene.EventManager.OnGetScriptRunning += OnGetScriptRunning; | 717 | m_Scene.EventManager.OnGetScriptRunning += OnGetScriptRunning; |
716 | m_Scene.EventManager.OnShutdown += OnShutdown; | 718 | m_Scene.EventManager.OnShutdown += OnShutdown; |
717 | 719 | ||
720 | // If region ready has been triggered, then the region had no scripts to compile and completed its other | ||
721 | // work. | ||
722 | m_Scene.EventManager.OnRegionReady += s => m_InitialStartup = false; | ||
723 | |||
718 | if (m_SleepTime > 0) | 724 | if (m_SleepTime > 0) |
719 | { | 725 | { |
720 | m_ThreadPool.QueueWorkItem(new WorkItemCallback(this.DoMaintenance), | 726 | m_ThreadPool.QueueWorkItem(new WorkItemCallback(this.DoMaintenance), |
@@ -1269,7 +1275,15 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
1269 | 1275 | ||
1270 | if (instance!=null) | 1276 | if (instance!=null) |
1271 | instance.Init(); | 1277 | instance.Init(); |
1272 | 1278 | ||
1279 | bool runIt; | ||
1280 | if (m_runFlags.TryGetValue(itemID, out runIt)) | ||
1281 | { | ||
1282 | if (!runIt) | ||
1283 | StopScript(itemID); | ||
1284 | m_runFlags.Remove(itemID); | ||
1285 | } | ||
1286 | |||
1273 | return true; | 1287 | return true; |
1274 | } | 1288 | } |
1275 | 1289 | ||
@@ -1660,6 +1674,8 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
1660 | IScriptInstance instance = GetInstance(itemID); | 1674 | IScriptInstance instance = GetInstance(itemID); |
1661 | if (instance != null) | 1675 | if (instance != null) |
1662 | instance.Start(); | 1676 | instance.Start(); |
1677 | else | ||
1678 | m_runFlags.AddOrUpdate(itemID, true, 240); | ||
1663 | } | 1679 | } |
1664 | 1680 | ||
1665 | public void StopScript(UUID itemID) | 1681 | public void StopScript(UUID itemID) |
@@ -1671,6 +1687,10 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
1671 | // cause issues on mono 2.6, 2.10 and possibly later where locks are not released properly on abort. | 1687 | // cause issues on mono 2.6, 2.10 and possibly later where locks are not released properly on abort. |
1672 | instance.Stop(1000); | 1688 | instance.Stop(1000); |
1673 | } | 1689 | } |
1690 | else | ||
1691 | { | ||
1692 | m_runFlags.AddOrUpdate(itemID, false, 240); | ||
1693 | } | ||
1674 | } | 1694 | } |
1675 | 1695 | ||
1676 | public DetectParams GetDetectParams(UUID itemID, int idx) | 1696 | public DetectParams GetDetectParams(UUID itemID, int idx) |
diff --git a/OpenSim/Tests/Common/Helpers/SceneHelpers.cs b/OpenSim/Tests/Common/Helpers/SceneHelpers.cs index 769de83..7598cc3 100644 --- a/OpenSim/Tests/Common/Helpers/SceneHelpers.cs +++ b/OpenSim/Tests/Common/Helpers/SceneHelpers.cs | |||
@@ -190,7 +190,7 @@ namespace OpenSim.Tests.Common | |||
190 | = physicsPluginManager.GetPhysicsScene("basicphysics", "ZeroMesher", new IniConfigSource(), "test"); | 190 | = physicsPluginManager.GetPhysicsScene("basicphysics", "ZeroMesher", new IniConfigSource(), "test"); |
191 | 191 | ||
192 | testScene.RegionInfo.EstateSettings = new EstateSettings(); | 192 | testScene.RegionInfo.EstateSettings = new EstateSettings(); |
193 | testScene.LoginsDisabled = false; | 193 | testScene.LoginsEnabled = true; |
194 | testScene.RegisterRegionWithGrid(); | 194 | testScene.RegisterRegionWithGrid(); |
195 | 195 | ||
196 | SceneManager.Add(testScene); | 196 | SceneManager.Add(testScene); |