diff options
Diffstat (limited to '')
24 files changed, 546 insertions, 49 deletions
diff --git a/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/EventQueueGetModule.cs b/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/EventQueueGetModule.cs index 37285e3..eb40eb1 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/EventQueueGetModule.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/EventQueueGetModule.cs | |||
@@ -376,7 +376,7 @@ namespace OpenSim.Region.ClientStack.Linden | |||
376 | // TODO: Add EventQueueGet name/description for diagnostics | 376 | // TODO: Add EventQueueGet name/description for diagnostics |
377 | MainServer.Instance.AddPollServiceHTTPHandler( | 377 | MainServer.Instance.AddPollServiceHTTPHandler( |
378 | eventQueueGetPath, | 378 | eventQueueGetPath, |
379 | new PollServiceEventArgs(null, HasEvents, GetEvents, NoEvents, agentID, 1000)); | 379 | new PollServiceEventArgs(null, HasEvents, GetEvents, NoEvents, agentID, 40000)); |
380 | 380 | ||
381 | // m_log.DebugFormat( | 381 | // m_log.DebugFormat( |
382 | // "[EVENT QUEUE GET MODULE]: Registered EQG handler {0} for {1} in {2}", | 382 | // "[EVENT QUEUE GET MODULE]: Registered EQG handler {0} for {1} in {2}", |
diff --git a/OpenSim/Region/ClientStack/Linden/Caps/GetTextureModule.cs b/OpenSim/Region/ClientStack/Linden/Caps/GetTextureModule.cs index d4dbfb9..a42c96c 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/GetTextureModule.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/GetTextureModule.cs | |||
@@ -56,6 +56,7 @@ namespace OpenSim.Region.ClientStack.Linden | |||
56 | public PollServiceTextureEventArgs thepoll; | 56 | public PollServiceTextureEventArgs thepoll; |
57 | public UUID reqID; | 57 | public UUID reqID; |
58 | public Hashtable request; | 58 | public Hashtable request; |
59 | public bool send503; | ||
59 | } | 60 | } |
60 | 61 | ||
61 | public class aPollResponse | 62 | public class aPollResponse |
@@ -244,7 +245,19 @@ namespace OpenSim.Region.ClientStack.Linden | |||
244 | reqinfo.thepoll = this; | 245 | reqinfo.thepoll = this; |
245 | reqinfo.reqID = x; | 246 | reqinfo.reqID = x; |
246 | reqinfo.request = y; | 247 | reqinfo.request = y; |
248 | reqinfo.send503 = false; | ||
247 | 249 | ||
250 | lock (responses) | ||
251 | { | ||
252 | if (responses.Count > 0) | ||
253 | { | ||
254 | if (m_queue.Count >= 4) | ||
255 | { | ||
256 | // Never allow more than 4 fetches to wait | ||
257 | reqinfo.send503 = true; | ||
258 | } | ||
259 | } | ||
260 | } | ||
248 | m_queue.Enqueue(reqinfo); | 261 | m_queue.Enqueue(reqinfo); |
249 | }; | 262 | }; |
250 | 263 | ||
@@ -276,6 +289,22 @@ namespace OpenSim.Region.ClientStack.Linden | |||
276 | 289 | ||
277 | UUID requestID = requestinfo.reqID; | 290 | UUID requestID = requestinfo.reqID; |
278 | 291 | ||
292 | if (requestinfo.send503) | ||
293 | { | ||
294 | response = new Hashtable(); | ||
295 | |||
296 | response["int_response_code"] = 503; | ||
297 | response["str_response_string"] = "Throttled"; | ||
298 | response["content_type"] = "text/plain"; | ||
299 | response["keepalive"] = false; | ||
300 | response["reusecontext"] = false; | ||
301 | |||
302 | lock (responses) | ||
303 | responses[requestID] = new aPollResponse() {bytes = 0, response = response}; | ||
304 | |||
305 | return; | ||
306 | } | ||
307 | |||
279 | // If the avatar is gone, don't bother to get the texture | 308 | // If the avatar is gone, don't bother to get the texture |
280 | if (m_scene.GetScenePresence(Id) == null) | 309 | if (m_scene.GetScenePresence(Id) == null) |
281 | { | 310 | { |
@@ -385,6 +414,9 @@ namespace OpenSim.Region.ClientStack.Linden | |||
385 | GetTextureModule.aPollResponse response; | 414 | GetTextureModule.aPollResponse response; |
386 | if (responses.TryGetValue(key, out response)) | 415 | if (responses.TryGetValue(key, out response)) |
387 | { | 416 | { |
417 | // This is any error response | ||
418 | if (response.bytes == 0) | ||
419 | return true; | ||
388 | 420 | ||
389 | // Normal | 421 | // Normal |
390 | if (BytesSent + response.bytes <= ThrottleBytes) | 422 | if (BytesSent + response.bytes <= ThrottleBytes) |
@@ -411,12 +443,12 @@ namespace OpenSim.Region.ClientStack.Linden | |||
411 | 443 | ||
412 | return haskey; | 444 | return haskey; |
413 | } | 445 | } |
446 | |||
414 | public void ProcessTime() | 447 | public void ProcessTime() |
415 | { | 448 | { |
416 | PassTime(); | 449 | PassTime(); |
417 | } | 450 | } |
418 | 451 | ||
419 | |||
420 | private void PassTime() | 452 | private void PassTime() |
421 | { | 453 | { |
422 | currenttime = Util.EnvironmentTickCount(); | 454 | currenttime = Util.EnvironmentTickCount(); |
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs index ef1d803..c78d552 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs | |||
@@ -1741,7 +1741,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
1741 | newBlock.CreationDate = item.CreationDate; | 1741 | newBlock.CreationDate = item.CreationDate; |
1742 | newBlock.SalePrice = item.SalePrice; | 1742 | newBlock.SalePrice = item.SalePrice; |
1743 | newBlock.SaleType = item.SaleType; | 1743 | newBlock.SaleType = item.SaleType; |
1744 | newBlock.Flags = item.Flags; | 1744 | newBlock.Flags = item.Flags & 0xff; |
1745 | 1745 | ||
1746 | newBlock.CRC = | 1746 | newBlock.CRC = |
1747 | Helpers.InventoryCRC(newBlock.CreationDate, newBlock.SaleType, | 1747 | Helpers.InventoryCRC(newBlock.CreationDate, newBlock.SaleType, |
@@ -1995,7 +1995,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
1995 | itemBlock.GroupID = item.GroupID; | 1995 | itemBlock.GroupID = item.GroupID; |
1996 | itemBlock.GroupOwned = item.GroupOwned; | 1996 | itemBlock.GroupOwned = item.GroupOwned; |
1997 | itemBlock.GroupMask = item.GroupPermissions; | 1997 | itemBlock.GroupMask = item.GroupPermissions; |
1998 | itemBlock.Flags = item.Flags; | 1998 | itemBlock.Flags = item.Flags & 0xff; |
1999 | itemBlock.SalePrice = item.SalePrice; | 1999 | itemBlock.SalePrice = item.SalePrice; |
2000 | itemBlock.SaleType = item.SaleType; | 2000 | itemBlock.SaleType = item.SaleType; |
2001 | itemBlock.CreationDate = item.CreationDate; | 2001 | itemBlock.CreationDate = item.CreationDate; |
@@ -2062,7 +2062,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
2062 | bulkUpdate.ItemData[0].GroupID = item.GroupID; | 2062 | bulkUpdate.ItemData[0].GroupID = item.GroupID; |
2063 | bulkUpdate.ItemData[0].GroupOwned = item.GroupOwned; | 2063 | bulkUpdate.ItemData[0].GroupOwned = item.GroupOwned; |
2064 | bulkUpdate.ItemData[0].GroupMask = item.GroupPermissions; | 2064 | bulkUpdate.ItemData[0].GroupMask = item.GroupPermissions; |
2065 | bulkUpdate.ItemData[0].Flags = item.Flags; | 2065 | bulkUpdate.ItemData[0].Flags = item.Flags & 0xff; |
2066 | bulkUpdate.ItemData[0].SalePrice = item.SalePrice; | 2066 | bulkUpdate.ItemData[0].SalePrice = item.SalePrice; |
2067 | bulkUpdate.ItemData[0].SaleType = item.SaleType; | 2067 | bulkUpdate.ItemData[0].SaleType = item.SaleType; |
2068 | 2068 | ||
@@ -2116,7 +2116,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
2116 | InventoryReply.InventoryData[0].GroupID = Item.GroupID; | 2116 | InventoryReply.InventoryData[0].GroupID = Item.GroupID; |
2117 | InventoryReply.InventoryData[0].GroupOwned = Item.GroupOwned; | 2117 | InventoryReply.InventoryData[0].GroupOwned = Item.GroupOwned; |
2118 | InventoryReply.InventoryData[0].GroupMask = Item.GroupPermissions; | 2118 | InventoryReply.InventoryData[0].GroupMask = Item.GroupPermissions; |
2119 | InventoryReply.InventoryData[0].Flags = Item.Flags; | 2119 | InventoryReply.InventoryData[0].Flags = Item.Flags & 0xff; |
2120 | InventoryReply.InventoryData[0].SalePrice = Item.SalePrice; | 2120 | InventoryReply.InventoryData[0].SalePrice = Item.SalePrice; |
2121 | InventoryReply.InventoryData[0].SaleType = Item.SaleType; | 2121 | InventoryReply.InventoryData[0].SaleType = Item.SaleType; |
2122 | InventoryReply.InventoryData[0].CreationDate = Item.CreationDate; | 2122 | InventoryReply.InventoryData[0].CreationDate = Item.CreationDate; |
@@ -5137,6 +5137,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
5137 | 5137 | ||
5138 | data.CollisionPlane.ToBytes(objectData, 0); | 5138 | data.CollisionPlane.ToBytes(objectData, 0); |
5139 | offsetPosition.ToBytes(objectData, 16); | 5139 | offsetPosition.ToBytes(objectData, 16); |
5140 | Vector3 velocity = new Vector3(0, 0, 0); | ||
5141 | Vector3 acceleration = new Vector3(0, 0, 0); | ||
5142 | velocity.ToBytes(objectData, 28); | ||
5143 | acceleration.ToBytes(objectData, 40); | ||
5140 | // data.Velocity.ToBytes(objectData, 28); | 5144 | // data.Velocity.ToBytes(objectData, 28); |
5141 | // data.Acceleration.ToBytes(objectData, 40); | 5145 | // data.Acceleration.ToBytes(objectData, 40); |
5142 | rotation.ToBytes(objectData, 52); | 5146 | rotation.ToBytes(objectData, 52); |
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs index fab66ce..d008702 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs | |||
@@ -1135,7 +1135,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
1135 | 1135 | ||
1136 | if (!udpClient.IsConnected) | 1136 | if (!udpClient.IsConnected) |
1137 | { | 1137 | { |
1138 | // m_log.Debug("[LLUDPSERVER]: Received a " + packet.Type + " packet for a unConnected client in " + m_scene.RegionInfo.RegionName); | 1138 | m_log.Debug("[LLUDPSERVER]: Received a " + packet.Type + " packet for a unConnected client in " + m_scene.RegionInfo.RegionName); |
1139 | return; | 1139 | return; |
1140 | } | 1140 | } |
1141 | 1141 | ||
diff --git a/OpenSim/Region/CoreModules/Avatar/Gods/GodsModule.cs b/OpenSim/Region/CoreModules/Avatar/Gods/GodsModule.cs index d22f3f4..5b12ecb 100644 --- a/OpenSim/Region/CoreModules/Avatar/Gods/GodsModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Gods/GodsModule.cs | |||
@@ -65,9 +65,6 @@ namespace OpenSim.Region.CoreModules.Avatar.Gods | |||
65 | protected Scene m_scene; | 65 | protected Scene m_scene; |
66 | protected IDialogModule m_dialogModule; | 66 | protected IDialogModule m_dialogModule; |
67 | 67 | ||
68 | protected Dictionary<UUID, string> m_capsDict = | ||
69 | new Dictionary<UUID, string>(); | ||
70 | |||
71 | protected IDialogModule DialogModule | 68 | protected IDialogModule DialogModule |
72 | { | 69 | { |
73 | get | 70 | get |
@@ -89,7 +86,6 @@ namespace OpenSim.Region.CoreModules.Avatar.Gods | |||
89 | m_scene.RegisterModuleInterface<IGodsModule>(this); | 86 | m_scene.RegisterModuleInterface<IGodsModule>(this); |
90 | m_scene.EventManager.OnNewClient += SubscribeToClientEvents; | 87 | m_scene.EventManager.OnNewClient += SubscribeToClientEvents; |
91 | m_scene.EventManager.OnRegisterCaps += OnRegisterCaps; | 88 | m_scene.EventManager.OnRegisterCaps += OnRegisterCaps; |
92 | m_scene.EventManager.OnClientClosed += OnClientClosed; | ||
93 | scene.EventManager.OnIncomingInstantMessage += | 89 | scene.EventManager.OnIncomingInstantMessage += |
94 | OnIncomingInstantMessage; | 90 | OnIncomingInstantMessage; |
95 | } | 91 | } |
@@ -125,15 +121,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Gods | |||
125 | client.OnRequestGodlikePowers -= RequestGodlikePowers; | 121 | client.OnRequestGodlikePowers -= RequestGodlikePowers; |
126 | } | 122 | } |
127 | 123 | ||
128 | private void OnClientClosed(UUID agentID, Scene scene) | ||
129 | { | ||
130 | m_capsDict.Remove(agentID); | ||
131 | } | ||
132 | |||
133 | private void OnRegisterCaps(UUID agentID, Caps caps) | 124 | private void OnRegisterCaps(UUID agentID, Caps caps) |
134 | { | 125 | { |
135 | string uri = "/CAPS/" + UUID.Random(); | 126 | string uri = "/CAPS/" + UUID.Random(); |
136 | m_capsDict[agentID] = uri; | ||
137 | 127 | ||
138 | caps.RegisterHandler("UntrustedSimulatorMessage", | 128 | caps.RegisterHandler("UntrustedSimulatorMessage", |
139 | new RestStreamHandler("POST", uri, | 129 | new RestStreamHandler("POST", uri, |
diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs index 6b90097..b9c88d4 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs | |||
@@ -1113,14 +1113,14 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1113 | ((Scene)(client.Scene)).RequestTeleportLocation( | 1113 | ((Scene)(client.Scene)).RequestTeleportLocation( |
1114 | client, regionInfo.RegionHandle, uinfo.HomePosition, uinfo.HomeLookAt, | 1114 | client, regionInfo.RegionHandle, uinfo.HomePosition, uinfo.HomeLookAt, |
1115 | (uint)(Constants.TeleportFlags.SetLastToTarget | Constants.TeleportFlags.ViaHome)); | 1115 | (uint)(Constants.TeleportFlags.SetLastToTarget | Constants.TeleportFlags.ViaHome)); |
1116 | return true; | ||
1116 | } | 1117 | } |
1117 | else | 1118 | else |
1118 | { | 1119 | { |
1119 | // can't find the Home region: Tell viewer and abort | 1120 | // can't find the Home region: Tell viewer and abort |
1120 | client.SendTeleportFailed("Your home region could not be found."); | 1121 | client.SendTeleportFailed("Your home region could not be found."); |
1121 | return false; | ||
1122 | } | 1122 | } |
1123 | return true; | 1123 | return false; |
1124 | } | 1124 | } |
1125 | 1125 | ||
1126 | #endregion | 1126 | #endregion |
diff --git a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs index f5b509f..d5c2661 100644 --- a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs +++ b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs | |||
@@ -387,7 +387,12 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | |||
387 | inventoryStoredPosition = objectGroup.RootPart.AttachOffset; | 387 | inventoryStoredPosition = objectGroup.RootPart.AttachOffset; |
388 | inventoryStoredRotation = objectGroup.RootPart.AttachRotation; | 388 | inventoryStoredRotation = objectGroup.RootPart.AttachRotation; |
389 | } | 389 | } |
390 | objectGroup.RootPart.Shape.State = objectGroup.RootPart.AttachPoint; | 390 | |
391 | // Trees could be attached and it's been done, but it makes | ||
392 | // no sense. State must be preserved because it's the tree type | ||
393 | if (objectGroup.RootPart.Shape.PCode != (byte)PCode.Tree && | ||
394 | objectGroup.RootPart.Shape.PCode != (byte)PCode.NewTree) | ||
395 | objectGroup.RootPart.Shape.State = objectGroup.RootPart.AttachPoint; | ||
391 | 396 | ||
392 | objectGroup.AbsolutePosition = inventoryStoredPosition; | 397 | objectGroup.AbsolutePosition = inventoryStoredPosition; |
393 | objectGroup.RootPart.RotationOffset = inventoryStoredRotation; | 398 | objectGroup.RootPart.RotationOffset = inventoryStoredRotation; |
@@ -797,7 +802,9 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | |||
797 | g.RootPart.AttachPoint = g.RootPart.Shape.State; | 802 | g.RootPart.AttachPoint = g.RootPart.Shape.State; |
798 | g.RootPart.AttachOffset = g.AbsolutePosition; | 803 | g.RootPart.AttachOffset = g.AbsolutePosition; |
799 | g.RootPart.AttachRotation = g.GroupRotation; | 804 | g.RootPart.AttachRotation = g.GroupRotation; |
800 | g.RootPart.Shape.State = 0; | 805 | if (g.RootPart.Shape.PCode != (byte)PCode.NewTree && |
806 | g.RootPart.Shape.PCode != (byte)PCode.Tree) | ||
807 | g.RootPart.Shape.State = 0; | ||
801 | } | 808 | } |
802 | 809 | ||
803 | objlist.Add(g); | 810 | objlist.Add(g); |
@@ -831,7 +838,9 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | |||
831 | g.RootPart.AttachPoint = g.RootPart.Shape.State; | 838 | g.RootPart.AttachPoint = g.RootPart.Shape.State; |
832 | g.RootPart.AttachOffset = g.AbsolutePosition; | 839 | g.RootPart.AttachOffset = g.AbsolutePosition; |
833 | g.RootPart.AttachRotation = g.GroupRotation; | 840 | g.RootPart.AttachRotation = g.GroupRotation; |
834 | g.RootPart.Shape.State = 0; | 841 | if (g.RootPart.Shape.PCode != (byte)PCode.NewTree && |
842 | g.RootPart.Shape.PCode != (byte)PCode.Tree) | ||
843 | g.RootPart.Shape.State = 0; | ||
835 | 844 | ||
836 | objlist.Add(g); | 845 | objlist.Add(g); |
837 | XmlElement el = (XmlElement)n; | 846 | XmlElement el = (XmlElement)n; |
diff --git a/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs b/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs index f2922d6..2a4d440 100644 --- a/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs +++ b/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs | |||
@@ -51,6 +51,7 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp | |||
51 | public UUID urlcode; | 51 | public UUID urlcode; |
52 | public Dictionary<UUID, RequestData> requests; | 52 | public Dictionary<UUID, RequestData> requests; |
53 | public bool isSsl; | 53 | public bool isSsl; |
54 | public Scene scene; | ||
54 | } | 55 | } |
55 | 56 | ||
56 | public class RequestData | 57 | public class RequestData |
@@ -66,6 +67,9 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp | |||
66 | public int startTime; | 67 | public int startTime; |
67 | public bool responseSent; | 68 | public bool responseSent; |
68 | public string uri; | 69 | public string uri; |
70 | public bool allowResponseType = false; | ||
71 | public UUID hostID; | ||
72 | public Scene scene; | ||
69 | } | 73 | } |
70 | 74 | ||
71 | /// <summary> | 75 | /// <summary> |
@@ -171,6 +175,17 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp | |||
171 | 175 | ||
172 | public void RemoveRegion(Scene scene) | 176 | public void RemoveRegion(Scene scene) |
173 | { | 177 | { |
178 | // Drop references to that scene | ||
179 | foreach (KeyValuePair<string, UrlData> kvp in m_UrlMap) | ||
180 | { | ||
181 | if (kvp.Value.scene == scene) | ||
182 | kvp.Value.scene = null; | ||
183 | } | ||
184 | foreach (KeyValuePair<UUID, UrlData> kvp in m_RequestMap) | ||
185 | { | ||
186 | if (kvp.Value.scene == scene) | ||
187 | kvp.Value.scene = null; | ||
188 | } | ||
174 | } | 189 | } |
175 | 190 | ||
176 | public void Close() | 191 | public void Close() |
@@ -198,6 +213,7 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp | |||
198 | urlData.urlcode = urlcode; | 213 | urlData.urlcode = urlcode; |
199 | urlData.isSsl = false; | 214 | urlData.isSsl = false; |
200 | urlData.requests = new Dictionary<UUID, RequestData>(); | 215 | urlData.requests = new Dictionary<UUID, RequestData>(); |
216 | urlData.scene = host.ParentGroup.Scene; | ||
201 | 217 | ||
202 | m_UrlMap[url] = urlData; | 218 | m_UrlMap[url] = urlData; |
203 | 219 | ||
@@ -316,6 +332,11 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp | |||
316 | if (!urlData.requests[request].responseSent) | 332 | if (!urlData.requests[request].responseSent) |
317 | { | 333 | { |
318 | string responseBody = body; | 334 | string responseBody = body; |
335 | |||
336 | // If we have no OpenID from built-in browser, disable this | ||
337 | if (!urlData.requests[request].allowResponseType) | ||
338 | urlData.requests[request].responseType = "text/plain"; | ||
339 | |||
319 | if (urlData.requests[request].responseType.Equals("text/plain")) | 340 | if (urlData.requests[request].responseType.Equals("text/plain")) |
320 | { | 341 | { |
321 | string value; | 342 | string value; |
@@ -532,7 +553,7 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp | |||
532 | //put response | 553 | //put response |
533 | response["int_response_code"] = requestData.responseCode; | 554 | response["int_response_code"] = requestData.responseCode; |
534 | response["str_response_string"] = requestData.responseBody; | 555 | response["str_response_string"] = requestData.responseBody; |
535 | response["content_type"] = "text/plain"; | 556 | response["content_type"] = requestData.responseType; |
536 | response["keepalive"] = false; | 557 | response["keepalive"] = false; |
537 | response["reusecontext"] = false; | 558 | response["reusecontext"] = false; |
538 | 559 | ||
@@ -600,6 +621,8 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp | |||
600 | requestData.requestDone = false; | 621 | requestData.requestDone = false; |
601 | requestData.startTime = System.Environment.TickCount; | 622 | requestData.startTime = System.Environment.TickCount; |
602 | requestData.uri = uri; | 623 | requestData.uri = uri; |
624 | requestData.hostID = url.hostID; | ||
625 | requestData.scene = url.scene; | ||
603 | if (requestData.headers == null) | 626 | if (requestData.headers == null) |
604 | requestData.headers = new Dictionary<string, string>(); | 627 | requestData.headers = new Dictionary<string, string>(); |
605 | 628 | ||
@@ -608,6 +631,32 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp | |||
608 | string key = (string)header.Key; | 631 | string key = (string)header.Key; |
609 | string value = (string)header.Value; | 632 | string value = (string)header.Value; |
610 | requestData.headers.Add(key, value); | 633 | requestData.headers.Add(key, value); |
634 | if (key == "cookie") | ||
635 | { | ||
636 | string[] parts = value.Split(new char[] {'='}); | ||
637 | if (parts[0] == "agni_sl_session_id" && parts.Length > 1) | ||
638 | { | ||
639 | string cookie = Uri.UnescapeDataString(parts[1]); | ||
640 | string[] crumbs = cookie.Split(new char[] {':'}); | ||
641 | UUID owner; | ||
642 | if (crumbs.Length == 2 && UUID.TryParse(crumbs[0], out owner)) | ||
643 | { | ||
644 | if (crumbs[1].Length == 32) | ||
645 | { | ||
646 | Scene scene = requestData.scene; | ||
647 | if (scene != null) | ||
648 | { | ||
649 | SceneObjectPart host = scene.GetSceneObjectPart(requestData.hostID); | ||
650 | if (host != null) | ||
651 | { | ||
652 | if (host.OwnerID == owner) | ||
653 | requestData.allowResponseType = true; | ||
654 | } | ||
655 | } | ||
656 | } | ||
657 | } | ||
658 | } | ||
659 | } | ||
611 | } | 660 | } |
612 | foreach (DictionaryEntry de in request) | 661 | foreach (DictionaryEntry de in request) |
613 | { | 662 | { |
diff --git a/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs b/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs index 317dfd8..dbc9296 100644 --- a/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs +++ b/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs | |||
@@ -940,6 +940,8 @@ namespace OpenSim.Region.CoreModules.World.Land | |||
940 | newLand.LandData.Name = newLand.LandData.Name; | 940 | newLand.LandData.Name = newLand.LandData.Name; |
941 | newLand.LandData.GlobalID = UUID.Random(); | 941 | newLand.LandData.GlobalID = UUID.Random(); |
942 | newLand.LandData.Dwell = 0; | 942 | newLand.LandData.Dwell = 0; |
943 | // Clear "Show in search" on the cut out parcel to prevent double-charging | ||
944 | newLand.LandData.Flags &= ~(uint)ParcelFlags.ShowDirectory; | ||
943 | 945 | ||
944 | newLand.SetLandBitmap(newLand.GetSquareLandBitmap(start_x, start_y, end_x, end_y)); | 946 | newLand.SetLandBitmap(newLand.GetSquareLandBitmap(start_x, start_y, end_x, end_y)); |
945 | 947 | ||
diff --git a/OpenSim/Region/CoreModules/World/WorldMap/MapSearchModule.cs b/OpenSim/Region/CoreModules/World/WorldMap/MapSearchModule.cs index 4c96a50..14deeb6 100644 --- a/OpenSim/Region/CoreModules/World/WorldMap/MapSearchModule.cs +++ b/OpenSim/Region/CoreModules/World/WorldMap/MapSearchModule.cs | |||
@@ -211,8 +211,8 @@ namespace OpenSim.Region.CoreModules.World.WorldMap | |||
211 | { | 211 | { |
212 | if (regionInfos.Count == 0) | 212 | if (regionInfos.Count == 0) |
213 | remoteClient.SendAgentAlertMessage("No regions found with that name.", true); | 213 | remoteClient.SendAgentAlertMessage("No regions found with that name.", true); |
214 | else if (regionInfos.Count == 1) | 214 | // else if (regionInfos.Count == 1) |
215 | remoteClient.SendAgentAlertMessage("Region found!", false); | 215 | // remoteClient.SendAgentAlertMessage("Region found!", false); |
216 | } | 216 | } |
217 | }); | 217 | }); |
218 | } | 218 | } |
diff --git a/OpenSim/Region/Framework/Interfaces/IDynamicFloaterModule.cs b/OpenSim/Region/Framework/Interfaces/IDynamicFloaterModule.cs new file mode 100644 index 0000000..7684ce3 --- /dev/null +++ b/OpenSim/Region/Framework/Interfaces/IDynamicFloaterModule.cs | |||
@@ -0,0 +1,52 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSimulator Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using System.Collections.Generic; | ||
29 | using OpenMetaverse; | ||
30 | using OpenSim.Framework; | ||
31 | using OpenSim.Region.Framework.Scenes; | ||
32 | |||
33 | namespace OpenSim.Region.Framework.Interfaces | ||
34 | { | ||
35 | public delegate bool HandlerDelegate(IClientAPI client, FloaterData data, string[] msg); | ||
36 | |||
37 | public abstract class FloaterData | ||
38 | { | ||
39 | public abstract int Channel { get; } | ||
40 | public abstract string FloaterName { get; set; } | ||
41 | public virtual string XmlName { get; set; } | ||
42 | public virtual string XmlText { get; set; } | ||
43 | public virtual HandlerDelegate Handler { get; set; } | ||
44 | } | ||
45 | |||
46 | |||
47 | public interface IDynamicFloaterModule | ||
48 | { | ||
49 | void DoUserFloater(UUID agentID, FloaterData dialogData, string configuration); | ||
50 | void FloaterControl(ScenePresence sp, FloaterData d, string msg); | ||
51 | } | ||
52 | } | ||
diff --git a/OpenSim/Region/Framework/Interfaces/IDynamicMenuModule.cs b/OpenSim/Region/Framework/Interfaces/IDynamicMenuModule.cs index 08b71e4..4d000b6 100644 --- a/OpenSim/Region/Framework/Interfaces/IDynamicMenuModule.cs +++ b/OpenSim/Region/Framework/Interfaces/IDynamicMenuModule.cs | |||
@@ -43,6 +43,7 @@ namespace OpenSim.Region.Framework.Interfaces | |||
43 | public enum UserMode : int | 43 | public enum UserMode : int |
44 | { | 44 | { |
45 | Normal = 0, | 45 | Normal = 0, |
46 | RegionManager = 2, | ||
46 | God = 3 | 47 | God = 3 |
47 | } | 48 | } |
48 | 49 | ||
diff --git a/OpenSim/Region/Framework/Scenes/KeyframeMotion.cs b/OpenSim/Region/Framework/Scenes/KeyframeMotion.cs index b102e48..d773ee7 100644 --- a/OpenSim/Region/Framework/Scenes/KeyframeMotion.cs +++ b/OpenSim/Region/Framework/Scenes/KeyframeMotion.cs | |||
@@ -645,7 +645,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
645 | m_nextPosition = m_group.AbsolutePosition + motionThisFrame; | 645 | m_nextPosition = m_group.AbsolutePosition + motionThisFrame; |
646 | m_group.AbsolutePosition = m_nextPosition; | 646 | m_group.AbsolutePosition = m_nextPosition; |
647 | 647 | ||
648 | m_group.RootPart.Velocity = v; | 648 | //m_group.RootPart.Velocity = v; |
649 | update = true; | 649 | update = true; |
650 | } | 650 | } |
651 | 651 | ||
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 6ef83fb..436a544 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs | |||
@@ -2454,6 +2454,14 @@ namespace OpenSim.Region.Framework.Scenes | |||
2454 | else | 2454 | else |
2455 | group.StopScriptInstances(); | 2455 | group.StopScriptInstances(); |
2456 | 2456 | ||
2457 | List<UUID> avatars = group.GetSittingAvatars(); | ||
2458 | foreach (UUID av in avatars) | ||
2459 | { | ||
2460 | ScenePresence p = GetScenePresence(av); | ||
2461 | if (p != null) | ||
2462 | p.StandUp(); | ||
2463 | } | ||
2464 | |||
2457 | SceneObjectPart[] partList = group.Parts; | 2465 | SceneObjectPart[] partList = group.Parts; |
2458 | 2466 | ||
2459 | foreach (SceneObjectPart part in partList) | 2467 | foreach (SceneObjectPart part in partList) |
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index 155e450..02a8935 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | |||
@@ -272,6 +272,11 @@ namespace OpenSim.Region.Framework.Scenes | |||
272 | { | 272 | { |
273 | AttachmentPoint = 0; | 273 | AttachmentPoint = 0; |
274 | 274 | ||
275 | // Don't zap trees | ||
276 | if (RootPart.Shape.PCode == (byte)PCode.Tree || | ||
277 | RootPart.Shape.PCode == (byte)PCode.NewTree) | ||
278 | return; | ||
279 | |||
275 | // Even though we don't use child part state parameters for attachments any more, we still need to set | 280 | // Even though we don't use child part state parameters for attachments any more, we still need to set |
276 | // these to zero since having them non-zero in rezzed scene objects will crash some clients. Even if | 281 | // these to zero since having them non-zero in rezzed scene objects will crash some clients. Even if |
277 | // we store them correctly, scene objects that we receive from elsewhere might not. | 282 | // we store them correctly, scene objects that we receive from elsewhere might not. |
diff --git a/OpenSim/Region/Framework/Scenes/TerrainChannel.cs b/OpenSim/Region/Framework/Scenes/TerrainChannel.cs index c0ca48e..b6e0a97 100644 --- a/OpenSim/Region/Framework/Scenes/TerrainChannel.cs +++ b/OpenSim/Region/Framework/Scenes/TerrainChannel.cs | |||
@@ -131,7 +131,15 @@ namespace OpenSim.Region.Framework.Scenes | |||
131 | 131 | ||
132 | public double this[int x, int y] | 132 | public double this[int x, int y] |
133 | { | 133 | { |
134 | get { return map[x, y]; } | 134 | get |
135 | { | ||
136 | if (x < 0) x = 0; | ||
137 | if (y < 0) y = 0; | ||
138 | if (x >= (int)Constants.RegionSize) x = (int)Constants.RegionSize - 1; | ||
139 | if (y >= (int)Constants.RegionSize) y = (int)Constants.RegionSize - 1; | ||
140 | |||
141 | return map[x, y]; | ||
142 | } | ||
135 | set | 143 | set |
136 | { | 144 | { |
137 | // Will "fix" terrain hole problems. Although not fantastically. | 145 | // Will "fix" terrain hole problems. Although not fantastically. |
diff --git a/OpenSim/Region/OptionalModules/ViewerSupport/DynamicFloaterModule.cs b/OpenSim/Region/OptionalModules/ViewerSupport/DynamicFloaterModule.cs new file mode 100644 index 0000000..e76e8f2 --- /dev/null +++ b/OpenSim/Region/OptionalModules/ViewerSupport/DynamicFloaterModule.cs | |||
@@ -0,0 +1,238 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSimulator Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using System; | ||
29 | using System.IO; | ||
30 | using System.Reflection; | ||
31 | using System.Text; | ||
32 | using System.Collections.Generic; | ||
33 | using OpenMetaverse; | ||
34 | using OpenMetaverse.StructuredData; | ||
35 | using OpenSim; | ||
36 | using OpenSim.Region; | ||
37 | using OpenSim.Region.Framework; | ||
38 | using OpenSim.Region.Framework.Scenes; | ||
39 | using OpenSim.Region.Framework.Interfaces; | ||
40 | using OpenSim.Framework; | ||
41 | using OpenSim.Framework.Servers; | ||
42 | using OpenSim.Framework.Servers.HttpServer; | ||
43 | using Nini.Config; | ||
44 | using log4net; | ||
45 | using Mono.Addins; | ||
46 | using Caps = OpenSim.Framework.Capabilities.Caps; | ||
47 | using OSDMap = OpenMetaverse.StructuredData.OSDMap; | ||
48 | |||
49 | namespace OpenSim.Region.OptionalModules.ViewerSupport | ||
50 | { | ||
51 | [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "DynamicFloater")] | ||
52 | public class DynamicFloaterModule : INonSharedRegionModule, IDynamicFloaterModule | ||
53 | { | ||
54 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
55 | |||
56 | private Scene m_scene; | ||
57 | |||
58 | private Dictionary<UUID, Dictionary<int, FloaterData>> m_floaters = new Dictionary<UUID, Dictionary<int, FloaterData>>(); | ||
59 | |||
60 | public string Name | ||
61 | { | ||
62 | get { return "DynamicFloaterModule"; } | ||
63 | } | ||
64 | |||
65 | public Type ReplaceableInterface | ||
66 | { | ||
67 | get { return null; } | ||
68 | } | ||
69 | |||
70 | public void Initialise(IConfigSource config) | ||
71 | { | ||
72 | } | ||
73 | |||
74 | public void Close() | ||
75 | { | ||
76 | } | ||
77 | |||
78 | public void AddRegion(Scene scene) | ||
79 | { | ||
80 | m_scene = scene; | ||
81 | scene.EventManager.OnNewClient += OnNewClient; | ||
82 | scene.EventManager.OnClientClosed += OnClientClosed; | ||
83 | m_scene.RegisterModuleInterface<IDynamicFloaterModule>(this); | ||
84 | } | ||
85 | |||
86 | public void RegionLoaded(Scene scene) | ||
87 | { | ||
88 | } | ||
89 | |||
90 | public void RemoveRegion(Scene scene) | ||
91 | { | ||
92 | } | ||
93 | |||
94 | private void OnNewClient(IClientAPI client) | ||
95 | { | ||
96 | client.OnChatFromClient += OnChatFromClient; | ||
97 | } | ||
98 | |||
99 | private void OnClientClosed(UUID agentID, Scene scene) | ||
100 | { | ||
101 | m_floaters.Remove(agentID); | ||
102 | } | ||
103 | |||
104 | private void SendToClient(ScenePresence sp, string msg) | ||
105 | { | ||
106 | sp.ControllingClient.SendChatMessage(msg, | ||
107 | (byte)ChatTypeEnum.Owner, | ||
108 | sp.AbsolutePosition, | ||
109 | "Server", | ||
110 | UUID.Zero, | ||
111 | UUID.Zero, | ||
112 | (byte)ChatSourceType.Object, | ||
113 | (byte)ChatAudibleLevel.Fully); | ||
114 | } | ||
115 | |||
116 | public void DoUserFloater(UUID agentID, FloaterData dialogData, string configuration) | ||
117 | { | ||
118 | ScenePresence sp = m_scene.GetScenePresence(agentID); | ||
119 | if (sp == null || sp.IsChildAgent) | ||
120 | return; | ||
121 | |||
122 | if (!m_floaters.ContainsKey(agentID)) | ||
123 | m_floaters[agentID] = new Dictionary<int, FloaterData>(); | ||
124 | |||
125 | if (m_floaters[agentID].ContainsKey(dialogData.Channel)) | ||
126 | return; | ||
127 | |||
128 | m_floaters[agentID].Add(dialogData.Channel, dialogData); | ||
129 | |||
130 | string xml; | ||
131 | if (dialogData.XmlText != null && dialogData.XmlText != String.Empty) | ||
132 | { | ||
133 | xml = dialogData.XmlText; | ||
134 | } | ||
135 | else | ||
136 | { | ||
137 | using (FileStream fs = File.Open(dialogData.XmlName + ".xml", FileMode.Open)) | ||
138 | { | ||
139 | using (StreamReader sr = new StreamReader(fs)) | ||
140 | xml = sr.ReadToEnd().Replace("\n", ""); | ||
141 | } | ||
142 | } | ||
143 | |||
144 | List<string> xparts = new List<string>(); | ||
145 | |||
146 | while (xml.Length > 0) | ||
147 | { | ||
148 | string x = xml; | ||
149 | if (x.Length > 600) | ||
150 | { | ||
151 | x = x.Substring(0, 600); | ||
152 | xml = xml.Substring(600); | ||
153 | } | ||
154 | else | ||
155 | { | ||
156 | xml = String.Empty; | ||
157 | } | ||
158 | |||
159 | xparts.Add(x); | ||
160 | } | ||
161 | |||
162 | for (int i = 0 ; i < xparts.Count ; i++) | ||
163 | SendToClient(sp, String.Format("># floater {2} create {0}/{1} " + xparts[i], i + 1, xparts.Count, dialogData.FloaterName)); | ||
164 | |||
165 | SendToClient(sp, String.Format("># floater {0} {{notify:1}} {{channel: {1}}} {{node:cancel {{notify:1}}}} {{node:ok {{notify:1}}}} {2}", dialogData.FloaterName, (uint)dialogData.Channel, configuration)); | ||
166 | } | ||
167 | |||
168 | private void OnChatFromClient(object sender, OSChatMessage msg) | ||
169 | { | ||
170 | if (msg.Sender == null) | ||
171 | return; | ||
172 | |||
173 | //m_log.DebugFormat("chan {0} msg {1}", msg.Channel, msg.Message); | ||
174 | |||
175 | IClientAPI client = msg.Sender; | ||
176 | |||
177 | if (!m_floaters.ContainsKey(client.AgentId)) | ||
178 | return; | ||
179 | |||
180 | string[] parts = msg.Message.Split(new char[] {':'}); | ||
181 | if (parts.Length == 0) | ||
182 | return; | ||
183 | |||
184 | ScenePresence sp = m_scene.GetScenePresence(client.AgentId); | ||
185 | if (sp == null || sp.IsChildAgent) | ||
186 | return; | ||
187 | |||
188 | Dictionary<int, FloaterData> d = m_floaters[client.AgentId]; | ||
189 | |||
190 | // Work around a viewer bug - VALUE from any | ||
191 | // dialog can appear on this channel and needs to | ||
192 | // be dispatched to ALL open dialogs for the user | ||
193 | if (msg.Channel == 427169570) | ||
194 | { | ||
195 | if (parts[0] == "VALUE") | ||
196 | { | ||
197 | foreach (FloaterData dd in d.Values) | ||
198 | { | ||
199 | if(dd.Handler(client, dd, parts)) | ||
200 | { | ||
201 | m_floaters[client.AgentId].Remove(dd.Channel); | ||
202 | SendToClient(sp, String.Format("># floater {0} destroy", dd.FloaterName)); | ||
203 | break; | ||
204 | } | ||
205 | } | ||
206 | } | ||
207 | return; | ||
208 | } | ||
209 | |||
210 | if (!d.ContainsKey(msg.Channel)) | ||
211 | return; | ||
212 | |||
213 | FloaterData data = d[msg.Channel]; | ||
214 | |||
215 | if (parts[0] == "NOTIFY") | ||
216 | { | ||
217 | if (parts[1] == "cancel" || parts[1] == data.FloaterName) | ||
218 | { | ||
219 | m_floaters[client.AgentId].Remove(data.Channel); | ||
220 | SendToClient(sp, String.Format("># floater {0} destroy", data.FloaterName)); | ||
221 | } | ||
222 | } | ||
223 | |||
224 | if (data.Handler != null && data.Handler(client, data, parts)) | ||
225 | { | ||
226 | m_floaters[client.AgentId].Remove(data.Channel); | ||
227 | SendToClient(sp, String.Format("># floater {0} destroy", data.FloaterName)); | ||
228 | } | ||
229 | } | ||
230 | |||
231 | public void FloaterControl(ScenePresence sp, FloaterData d, string msg) | ||
232 | { | ||
233 | string sendData = String.Format("># floater {0} {1}", d.FloaterName, msg); | ||
234 | SendToClient(sp, sendData); | ||
235 | |||
236 | } | ||
237 | } | ||
238 | } | ||
diff --git a/OpenSim/Region/OptionalModules/ViewerSupport/DynamicMenuModule.cs b/OpenSim/Region/OptionalModules/ViewerSupport/DynamicMenuModule.cs index 917911f..c68fe99 100644 --- a/OpenSim/Region/OptionalModules/ViewerSupport/DynamicMenuModule.cs +++ b/OpenSim/Region/OptionalModules/ViewerSupport/DynamicMenuModule.cs | |||
@@ -110,8 +110,11 @@ namespace OpenSim.Region.OptionalModules.ViewerSupport | |||
110 | { | 110 | { |
111 | foreach (MenuItemData d in m_menuItems[UUID.Zero]) | 111 | foreach (MenuItemData d in m_menuItems[UUID.Zero]) |
112 | { | 112 | { |
113 | if (d.Mode == UserMode.God && (!m_scene.Permissions.IsGod(agentID))) | 113 | if (!m_scene.Permissions.IsGod(agentID)) |
114 | continue; | 114 | { |
115 | if (d.Mode == UserMode.RegionManager && (!m_scene.Permissions.IsAdministrator(agentID))) | ||
116 | continue; | ||
117 | } | ||
115 | 118 | ||
116 | OSDMap loc = null; | 119 | OSDMap loc = null; |
117 | switch (d.Location) | 120 | switch (d.Location) |
diff --git a/OpenSim/Region/Physics/UbitOdePlugin/ODECharacter.cs b/OpenSim/Region/Physics/UbitOdePlugin/ODECharacter.cs index bea34d4..e912997 100644 --- a/OpenSim/Region/Physics/UbitOdePlugin/ODECharacter.cs +++ b/OpenSim/Region/Physics/UbitOdePlugin/ODECharacter.cs | |||
@@ -1045,12 +1045,37 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1045 | if (me == midbox) | 1045 | if (me == midbox) |
1046 | { | 1046 | { |
1047 | if (Math.Abs(contact.normal.Z) > 0.95f) | 1047 | if (Math.Abs(contact.normal.Z) > 0.95f) |
1048 | { | ||
1048 | offset.Z = contact.pos.Z - _position.Z; | 1049 | offset.Z = contact.pos.Z - _position.Z; |
1050 | offset.X = (float)Math.Abs(offset.X) * 0.5f + contact.depth; | ||
1051 | offset.Y = (float)Math.Abs(offset.Y) * 0.5f + contact.depth; | ||
1052 | offset.Z = (float)Math.Abs(offset.Z) * 0.5f + contact.depth; | ||
1053 | |||
1054 | if (reverse) | ||
1055 | { | ||
1056 | offset.X *= -contact.normal.X; | ||
1057 | offset.Y *= -contact.normal.Y; | ||
1058 | offset.Z *= -contact.normal.Z; | ||
1059 | } | ||
1060 | else | ||
1061 | { | ||
1062 | offset.X *= contact.normal.X; | ||
1063 | offset.Y *= contact.normal.Y; | ||
1064 | offset.Z *= contact.normal.Z; | ||
1065 | } | ||
1066 | |||
1067 | offset.X += contact.pos.X; | ||
1068 | offset.Y += contact.pos.Y; | ||
1069 | offset.Z += contact.pos.Z; | ||
1070 | _position = offset; | ||
1071 | return true; | ||
1072 | } | ||
1049 | else | 1073 | else |
1050 | offset.Z = contact.normal.Z; | 1074 | offset.Z = contact.normal.Z; |
1051 | 1075 | ||
1052 | offset.Normalize(); | 1076 | offset.Normalize(); |
1053 | 1077 | ||
1078 | /* | ||
1054 | if (reverse) | 1079 | if (reverse) |
1055 | { | 1080 | { |
1056 | contact.normal.X = offset.X; | 1081 | contact.normal.X = offset.X; |
@@ -1063,7 +1088,8 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1063 | contact.normal.Y = -offset.Y; | 1088 | contact.normal.Y = -offset.Y; |
1064 | contact.normal.Z = -offset.Z; | 1089 | contact.normal.Z = -offset.Z; |
1065 | } | 1090 | } |
1066 | 1091 | */ | |
1092 | //_position.Z = offset.Z; | ||
1067 | return true; | 1093 | return true; |
1068 | } | 1094 | } |
1069 | 1095 | ||
@@ -1071,8 +1097,20 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1071 | { | 1097 | { |
1072 | float h = contact.pos.Z - _position.Z; | 1098 | float h = contact.pos.Z - _position.Z; |
1073 | 1099 | ||
1100 | // Only do this if the normal is sufficiently pointing in the 'up' direction | ||
1074 | if (Math.Abs(contact.normal.Z) > 0.95f) | 1101 | if (Math.Abs(contact.normal.Z) > 0.95f) |
1075 | { | 1102 | { |
1103 | // We Only want to do this if we're sunk into the object a bit and we're stuck and we're trying to move and feetcollision is false | ||
1104 | if ((contact.depth > 0.0010f && _velocity.X == 0f && _velocity.Y == 0 && _velocity.Z == 0) | ||
1105 | && (_target_velocity.X > 0 || _target_velocity.Y > 0 || _target_velocity.Z > 0) | ||
1106 | && (!feetcollision) ) | ||
1107 | { | ||
1108 | m_collisionException = true; // Stop looping, do this only once not X times Contacts | ||
1109 | _position.Z += contact.depth + 0.01f; // Move us Up the amount that we sank in, and add 0.01 meters to gently lift avatar up. | ||
1110 | |||
1111 | return true; | ||
1112 | } | ||
1113 | |||
1076 | if (contact.normal.Z > 0) | 1114 | if (contact.normal.Z > 0) |
1077 | contact.normal.Z = 1.0f; | 1115 | contact.normal.Z = 1.0f; |
1078 | else | 1116 | else |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 0199461..7c375e6 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | |||
@@ -4643,20 +4643,31 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
4643 | ScenePresence presence = World.GetScenePresence(agentId); | 4643 | ScenePresence presence = World.GetScenePresence(agentId); |
4644 | if (presence != null && presence.PresenceType != PresenceType.Npc) | 4644 | if (presence != null && presence.PresenceType != PresenceType.Npc) |
4645 | { | 4645 | { |
4646 | // agent must not be a god | ||
4647 | if (presence.GodLevel >= 200) return; | ||
4648 | |||
4649 | if (destination == String.Empty) | 4646 | if (destination == String.Empty) |
4650 | destination = World.RegionInfo.RegionName; | 4647 | destination = World.RegionInfo.RegionName; |
4651 | 4648 | ||
4652 | // agent must be over the owners land | 4649 | if (m_item.PermsGranter == agentId) |
4653 | if (m_host.OwnerID == World.LandChannel.GetLandObject(presence.AbsolutePosition).LandData.OwnerID) | 4650 | { |
4651 | if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_TELEPORT) != 0) | ||
4652 | { | ||
4653 | DoLLTeleport(presence, destination, targetPos, targetLookAt); | ||
4654 | } | ||
4655 | } | ||
4656 | |||
4657 | // agent must be wearing the object | ||
4658 | if (m_host.ParentGroup.AttachmentPoint != 0 && m_host.OwnerID == presence.UUID) | ||
4654 | { | 4659 | { |
4655 | DoLLTeleport(presence, destination, targetPos, targetLookAt); | 4660 | DoLLTeleport(presence, destination, targetPos, targetLookAt); |
4656 | } | 4661 | } |
4657 | else // or must be wearing the prim | 4662 | else |
4658 | { | 4663 | { |
4659 | if (m_host.ParentGroup.AttachmentPoint != 0 && m_host.OwnerID == presence.UUID) | 4664 | // agent must not be a god |
4665 | if (presence.GodLevel >= 200) return; | ||
4666 | |||
4667 | // agent must be over the owners land | ||
4668 | ILandObject agentLand = World.LandChannel.GetLandObject(presence.AbsolutePosition); | ||
4669 | ILandObject objectLand = World.LandChannel.GetLandObject(m_host.AbsolutePosition); | ||
4670 | if (m_host.OwnerID == objectLand.LandData.OwnerID && m_host.OwnerID == agentLand.LandData.OwnerID) | ||
4660 | { | 4671 | { |
4661 | DoLLTeleport(presence, destination, targetPos, targetLookAt); | 4672 | DoLLTeleport(presence, destination, targetPos, targetLookAt); |
4662 | } | 4673 | } |
@@ -4670,24 +4681,29 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
4670 | m_host.AddScriptLPS(1); | 4681 | m_host.AddScriptLPS(1); |
4671 | UUID agentId = new UUID(); | 4682 | UUID agentId = new UUID(); |
4672 | 4683 | ||
4673 | ulong regionHandle = Utils.UIntsToLong((uint)global_coords.x, (uint)global_coords.y); | 4684 | ulong regionHandle = Utils.UIntsToLong((uint)(global_coords.x / 256) * 256, (uint)(global_coords.y / 256) * 256); |
4674 | 4685 | ||
4675 | if (UUID.TryParse(agent, out agentId)) | 4686 | if (UUID.TryParse(agent, out agentId)) |
4676 | { | 4687 | { |
4688 | // This function is owner only! | ||
4689 | if (m_host.OwnerID != agentId) | ||
4690 | return; | ||
4691 | |||
4677 | ScenePresence presence = World.GetScenePresence(agentId); | 4692 | ScenePresence presence = World.GetScenePresence(agentId); |
4693 | |||
4694 | // Can't TP sitting avatars | ||
4695 | if (presence.ParentID != 0) // Sitting | ||
4696 | return; | ||
4697 | |||
4678 | if (presence != null && presence.PresenceType != PresenceType.Npc) | 4698 | if (presence != null && presence.PresenceType != PresenceType.Npc) |
4679 | { | 4699 | { |
4680 | // agent must not be a god | 4700 | if (m_item.PermsGranter == agentId) |
4681 | if (presence.GodLevel >= 200) return; | ||
4682 | |||
4683 | // agent must be over the owners land | ||
4684 | if (m_host.OwnerID == World.LandChannel.GetLandObject(presence.AbsolutePosition).LandData.OwnerID) | ||
4685 | { | ||
4686 | World.RequestTeleportLocation(presence.ControllingClient, regionHandle, targetPos, targetLookAt, (uint)TeleportFlags.ViaLocation); | ||
4687 | } | ||
4688 | else // or must be wearing the prim | ||
4689 | { | 4701 | { |
4690 | if (m_host.ParentGroup.AttachmentPoint != 0 && m_host.OwnerID == presence.UUID) | 4702 | // If attached using llAttachToAvatarTemp, cowardly refuse |
4703 | if (m_host.ParentGroup.AttachmentPoint != 0 && m_host.ParentGroup.FromItemID == UUID.Zero) | ||
4704 | return; | ||
4705 | |||
4706 | if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_TELEPORT) != 0) | ||
4691 | { | 4707 | { |
4692 | World.RequestTeleportLocation(presence.ControllingClient, regionHandle, targetPos, targetLookAt, (uint)TeleportFlags.ViaLocation); | 4708 | World.RequestTeleportLocation(presence.ControllingClient, regionHandle, targetPos, targetLookAt, (uint)TeleportFlags.ViaLocation); |
4693 | } | 4709 | } |
@@ -7853,6 +7869,18 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
7853 | } | 7869 | } |
7854 | } | 7870 | } |
7855 | 7871 | ||
7872 | public LSL_List llGetPhysicsMaterial() | ||
7873 | { | ||
7874 | LSL_List result = new LSL_List(); | ||
7875 | |||
7876 | result.Add(new LSL_Float(m_host.GravityModifier)); | ||
7877 | result.Add(new LSL_Float(m_host.Restitution)); | ||
7878 | result.Add(new LSL_Float(m_host.Friction)); | ||
7879 | result.Add(new LSL_Float(m_host.Density)); | ||
7880 | |||
7881 | return result; | ||
7882 | } | ||
7883 | |||
7856 | private void SetPhysicsMaterial(SceneObjectPart part, int material_bits, | 7884 | private void SetPhysicsMaterial(SceneObjectPart part, int material_bits, |
7857 | float material_density, float material_friction, | 7885 | float material_density, float material_friction, |
7858 | float material_restitution, float material_gravity_modifier) | 7886 | float material_restitution, float material_gravity_modifier) |
@@ -13379,6 +13407,18 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
13379 | 13407 | ||
13380 | return null; | 13408 | return null; |
13381 | } | 13409 | } |
13410 | |||
13411 | public void llSetContentType(LSL_Key id, LSL_Integer content_type) | ||
13412 | { | ||
13413 | if (m_UrlModule != null) | ||
13414 | { | ||
13415 | string type = "text.plain"; | ||
13416 | if (content_type == (int)ScriptBaseClass.CONTENT_TYPE_HTML) | ||
13417 | type = "text/html"; | ||
13418 | |||
13419 | m_UrlModule.HttpContentType(new UUID(id),type); | ||
13420 | } | ||
13421 | } | ||
13382 | } | 13422 | } |
13383 | 13423 | ||
13384 | public class NotecardCache | 13424 | public class NotecardCache |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs index 884f07c..a47e452 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs | |||
@@ -398,7 +398,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins | |||
398 | objtype = 0; | 398 | objtype = 0; |
399 | 399 | ||
400 | part = ((SceneObjectGroup)ent).RootPart; | 400 | part = ((SceneObjectGroup)ent).RootPart; |
401 | if (part.ParentGroup.AttachmentPoint != 0) // Attached so ignore | 401 | if (part.ParentGroup.RootPart.Shape.PCode != (byte)PCode.Tree && |
402 | part.ParentGroup.RootPart.Shape.PCode != (byte)PCode.NewTree && | ||
403 | part.ParentGroup.AttachmentPoint != 0) // Attached so ignore | ||
402 | continue; | 404 | continue; |
403 | 405 | ||
404 | if (part.Inventory.ContainsScripts()) | 406 | if (part.Inventory.ContainsScripts()) |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs index 9bf6f9b..daf89e5 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs | |||
@@ -433,5 +433,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces | |||
433 | void SetPrimitiveParamsEx(LSL_Key prim, LSL_List rules, string originFunc); | 433 | void SetPrimitiveParamsEx(LSL_Key prim, LSL_List rules, string originFunc); |
434 | void llSetKeyframedMotion(LSL_List frames, LSL_List options); | 434 | void llSetKeyframedMotion(LSL_List frames, LSL_List options); |
435 | LSL_List GetPrimitiveParamsEx(LSL_Key prim, LSL_List rules); | 435 | LSL_List GetPrimitiveParamsEx(LSL_Key prim, LSL_List rules); |
436 | LSL_List llGetPhysicsMaterial(); | ||
437 | void llSetContentType(LSL_Key id, LSL_Integer content_type); | ||
436 | } | 438 | } |
437 | } | 439 | } |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs index 2f8154d..6efa73f 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs | |||
@@ -80,6 +80,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase | |||
80 | public const int PERMISSION_CHANGE_PERMISSIONS = 512; | 80 | public const int PERMISSION_CHANGE_PERMISSIONS = 512; |
81 | public const int PERMISSION_TRACK_CAMERA = 1024; | 81 | public const int PERMISSION_TRACK_CAMERA = 1024; |
82 | public const int PERMISSION_CONTROL_CAMERA = 2048; | 82 | public const int PERMISSION_CONTROL_CAMERA = 2048; |
83 | public const int PERMISSION_TELEPORT = 4096; | ||
83 | 84 | ||
84 | public const int AGENT_FLYING = 1; | 85 | public const int AGENT_FLYING = 1; |
85 | public const int AGENT_ATTACHMENTS = 2; | 86 | public const int AGENT_ATTACHMENTS = 2; |
@@ -771,5 +772,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase | |||
771 | /// process message parameter as regex | 772 | /// process message parameter as regex |
772 | /// </summary> | 773 | /// </summary> |
773 | public const int OS_LISTEN_REGEX_MESSAGE = 0x2; | 774 | public const int OS_LISTEN_REGEX_MESSAGE = 0x2; |
775 | |||
776 | public const int CONTENT_TYPE_TEXT = 0; | ||
777 | public const int CONTENT_TYPE_HTML = 1; | ||
774 | } | 778 | } |
775 | } | 779 | } |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs index 8ecc4f8..6f3677c 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs | |||
@@ -2009,5 +2009,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase | |||
2009 | { | 2009 | { |
2010 | m_LSL_Functions.llSetPhysicsMaterial(material_bits, material_gravity_modifier, material_restitution, material_friction, material_density); | 2010 | m_LSL_Functions.llSetPhysicsMaterial(material_bits, material_gravity_modifier, material_restitution, material_friction, material_density); |
2011 | } | 2011 | } |
2012 | |||
2013 | public LSL_List llGetPhysicsMaterial() | ||
2014 | { | ||
2015 | return m_LSL_Functions.llGetPhysicsMaterial(); | ||
2016 | } | ||
2017 | |||
2018 | public void llSetContentType(LSL_Key id, LSL_Integer content_type) | ||
2019 | { | ||
2020 | m_LSL_Functions.llSetContentType(id, content_type); | ||
2021 | } | ||
2012 | } | 2022 | } |
2013 | } | 2023 | } |