diff options
33 files changed, 506 insertions, 383 deletions
diff --git a/OpenSim/Data/MySQL/MySQLAuthenticationData.cs b/OpenSim/Data/MySQL/MySQLAuthenticationData.cs index 8d82f61..664ce84 100644 --- a/OpenSim/Data/MySQL/MySQLAuthenticationData.cs +++ b/OpenSim/Data/MySQL/MySQLAuthenticationData.cs | |||
@@ -79,14 +79,7 @@ namespace OpenSim.Data.MySQL | |||
79 | { | 79 | { |
80 | ret.PrincipalID = principalID; | 80 | ret.PrincipalID = principalID; |
81 | 81 | ||
82 | if (m_ColumnNames == null) | 82 | CheckColumnNames(result); |
83 | { | ||
84 | m_ColumnNames = new List<string>(); | ||
85 | |||
86 | DataTable schemaTable = result.GetSchemaTable(); | ||
87 | foreach (DataRow row in schemaTable.Rows) | ||
88 | m_ColumnNames.Add(row["ColumnName"].ToString()); | ||
89 | } | ||
90 | 83 | ||
91 | foreach (string s in m_ColumnNames) | 84 | foreach (string s in m_ColumnNames) |
92 | { | 85 | { |
@@ -105,6 +98,20 @@ namespace OpenSim.Data.MySQL | |||
105 | } | 98 | } |
106 | } | 99 | } |
107 | 100 | ||
101 | private void CheckColumnNames(IDataReader result) | ||
102 | { | ||
103 | if (m_ColumnNames != null) | ||
104 | return; | ||
105 | |||
106 | List<string> columnNames = new List<string>(); | ||
107 | |||
108 | DataTable schemaTable = result.GetSchemaTable(); | ||
109 | foreach (DataRow row in schemaTable.Rows) | ||
110 | columnNames.Add(row["ColumnName"].ToString()); | ||
111 | |||
112 | m_ColumnNames = columnNames; | ||
113 | } | ||
114 | |||
108 | public bool Store(AuthenticationData data) | 115 | public bool Store(AuthenticationData data) |
109 | { | 116 | { |
110 | if (data.Data.ContainsKey("UUID")) | 117 | if (data.Data.ContainsKey("UUID")) |
diff --git a/OpenSim/Data/MySQL/MySQLGenericTableHandler.cs b/OpenSim/Data/MySQL/MySQLGenericTableHandler.cs index 754cf72..da8e958 100644 --- a/OpenSim/Data/MySQL/MySQLGenericTableHandler.cs +++ b/OpenSim/Data/MySQL/MySQLGenericTableHandler.cs | |||
@@ -91,15 +91,17 @@ namespace OpenSim.Data.MySQL | |||
91 | if (m_ColumnNames != null) | 91 | if (m_ColumnNames != null) |
92 | return; | 92 | return; |
93 | 93 | ||
94 | m_ColumnNames = new List<string>(); | 94 | List<string> columnNames = new List<string>(); |
95 | 95 | ||
96 | DataTable schemaTable = reader.GetSchemaTable(); | 96 | DataTable schemaTable = reader.GetSchemaTable(); |
97 | foreach (DataRow row in schemaTable.Rows) | 97 | foreach (DataRow row in schemaTable.Rows) |
98 | { | 98 | { |
99 | if (row["ColumnName"] != null && | 99 | if (row["ColumnName"] != null && |
100 | (!m_Fields.ContainsKey(row["ColumnName"].ToString()))) | 100 | (!m_Fields.ContainsKey(row["ColumnName"].ToString()))) |
101 | m_ColumnNames.Add(row["ColumnName"].ToString()); | 101 | columnNames.Add(row["ColumnName"].ToString()); |
102 | } | 102 | } |
103 | |||
104 | m_ColumnNames = columnNames; | ||
103 | } | 105 | } |
104 | 106 | ||
105 | public virtual T[] Get(string field, string key) | 107 | public virtual T[] Get(string field, string key) |
diff --git a/OpenSim/Data/MySQL/MySQLRegionData.cs b/OpenSim/Data/MySQL/MySQLRegionData.cs index c20c392..d1f1932 100644 --- a/OpenSim/Data/MySQL/MySQLRegionData.cs +++ b/OpenSim/Data/MySQL/MySQLRegionData.cs | |||
@@ -162,17 +162,7 @@ namespace OpenSim.Data.MySQL | |||
162 | ret.sizeX = Convert.ToInt32(result["sizeX"]); | 162 | ret.sizeX = Convert.ToInt32(result["sizeX"]); |
163 | ret.sizeY = Convert.ToInt32(result["sizeY"]); | 163 | ret.sizeY = Convert.ToInt32(result["sizeY"]); |
164 | 164 | ||
165 | if (m_ColumnNames == null) | 165 | CheckColumnNames(result); |
166 | { | ||
167 | m_ColumnNames = new List<string>(); | ||
168 | |||
169 | DataTable schemaTable = result.GetSchemaTable(); | ||
170 | foreach (DataRow row in schemaTable.Rows) | ||
171 | { | ||
172 | if (row["ColumnName"] != null) | ||
173 | m_ColumnNames.Add(row["ColumnName"].ToString()); | ||
174 | } | ||
175 | } | ||
176 | 166 | ||
177 | foreach (string s in m_ColumnNames) | 167 | foreach (string s in m_ColumnNames) |
178 | { | 168 | { |
@@ -187,7 +177,11 @@ namespace OpenSim.Data.MySQL | |||
187 | if (s == "locY") | 177 | if (s == "locY") |
188 | continue; | 178 | continue; |
189 | 179 | ||
190 | ret.Data[s] = result[s].ToString(); | 180 | object value = result[s]; |
181 | if (value is DBNull) | ||
182 | ret.Data[s] = null; | ||
183 | else | ||
184 | ret.Data[s] = result[s].ToString(); | ||
191 | } | 185 | } |
192 | 186 | ||
193 | retList.Add(ret); | 187 | retList.Add(ret); |
@@ -198,6 +192,23 @@ namespace OpenSim.Data.MySQL | |||
198 | return retList; | 192 | return retList; |
199 | } | 193 | } |
200 | 194 | ||
195 | private void CheckColumnNames(IDataReader result) | ||
196 | { | ||
197 | if (m_ColumnNames != null) | ||
198 | return; | ||
199 | |||
200 | List<string> columnNames = new List<string>(); | ||
201 | |||
202 | DataTable schemaTable = result.GetSchemaTable(); | ||
203 | foreach (DataRow row in schemaTable.Rows) | ||
204 | { | ||
205 | if (row["ColumnName"] != null) | ||
206 | columnNames.Add(row["ColumnName"].ToString()); | ||
207 | } | ||
208 | |||
209 | m_ColumnNames = columnNames; | ||
210 | } | ||
211 | |||
201 | public bool Store(RegionData data) | 212 | public bool Store(RegionData data) |
202 | { | 213 | { |
203 | if (data.Data.ContainsKey("uuid")) | 214 | if (data.Data.ContainsKey("uuid")) |
diff --git a/OpenSim/Framework/Console/LocalConsole.cs b/OpenSim/Framework/Console/LocalConsole.cs index 7c8626d..f65813b 100644 --- a/OpenSim/Framework/Console/LocalConsole.cs +++ b/OpenSim/Framework/Console/LocalConsole.cs | |||
@@ -296,6 +296,10 @@ namespace OpenSim.Framework.Console | |||
296 | matches[0].Groups["Category"].Value); | 296 | matches[0].Groups["Category"].Value); |
297 | System.Console.Write("]:"); | 297 | System.Console.Write("]:"); |
298 | } | 298 | } |
299 | else | ||
300 | { | ||
301 | outText = outText.Trim(); | ||
302 | } | ||
299 | } | 303 | } |
300 | 304 | ||
301 | if (level == "error") | 305 | if (level == "error") |
diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs index faa413e..7200c4b 100644 --- a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs | |||
@@ -143,7 +143,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments | |||
143 | } | 143 | } |
144 | catch (Exception e) | 144 | catch (Exception e) |
145 | { | 145 | { |
146 | m_log.ErrorFormat("[ATTACHMENTS MODULE]: Unable to rez attachment: {0}{1}", e.Message, e.StackTrace); | 146 | UUID agentId = (sp.ControllingClient == null) ? (UUID)null : sp.ControllingClient.AgentId; |
147 | m_log.ErrorFormat("[ATTACHMENTS MODULE]: Unable to rez attachment with itemID {0}, assetID {1}, point {2} for {3}: {4}\n{5}", | ||
148 | attach.ItemID, attach.AssetID, p, agentId, e.Message, e.StackTrace); | ||
147 | } | 149 | } |
148 | } | 150 | } |
149 | } | 151 | } |
@@ -389,7 +391,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments | |||
389 | lock (sp.AttachmentsSyncLock) | 391 | lock (sp.AttachmentsSyncLock) |
390 | { | 392 | { |
391 | // Save avatar attachment information | 393 | // Save avatar attachment information |
392 | m_log.Debug("[ATTACHMENTS MODULE]: Detaching from UserID: " + sp.UUID + ", ItemID: " + itemID); | 394 | // m_log.Debug("[ATTACHMENTS MODULE]: Detaching from UserID: " + sp.UUID + ", ItemID: " + itemID); |
393 | 395 | ||
394 | bool changed = sp.Appearance.DetachAttachment(itemID); | 396 | bool changed = sp.Appearance.DetachAttachment(itemID); |
395 | if (changed && m_scene.AvatarFactory != null) | 397 | if (changed && m_scene.AvatarFactory != null) |
@@ -469,9 +471,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments | |||
469 | 471 | ||
470 | if (grp.HasGroupChanged || (saveAllScripted && grp.ContainsScripts())) | 472 | if (grp.HasGroupChanged || (saveAllScripted && grp.ContainsScripts())) |
471 | { | 473 | { |
472 | m_log.DebugFormat( | 474 | // m_log.DebugFormat( |
473 | "[ATTACHMENTS MODULE]: Updating asset for attachment {0}, attachpoint {1}", | 475 | // "[ATTACHMENTS MODULE]: Updating asset for attachment {0}, attachpoint {1}", |
474 | grp.UUID, grp.AttachmentPoint); | 476 | // grp.UUID, grp.AttachmentPoint); |
475 | 477 | ||
476 | string sceneObjectXml = SceneObjectSerializer.ToOriginalXmlFormat(grp); | 478 | string sceneObjectXml = SceneObjectSerializer.ToOriginalXmlFormat(grp); |
477 | 479 | ||
@@ -502,12 +504,12 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments | |||
502 | } | 504 | } |
503 | grp.HasGroupChanged = false; // Prevent it being saved over and over | 505 | grp.HasGroupChanged = false; // Prevent it being saved over and over |
504 | } | 506 | } |
505 | else | 507 | // else |
506 | { | 508 | // { |
507 | m_log.DebugFormat( | 509 | // m_log.DebugFormat( |
508 | "[ATTACHMENTS MODULE]: Don't need to update asset for unchanged attachment {0}, attachpoint {1}", | 510 | // "[ATTACHMENTS MODULE]: Don't need to update asset for unchanged attachment {0}, attachpoint {1}", |
509 | grp.UUID, grp.AttachmentPoint); | 511 | // grp.UUID, grp.AttachmentPoint); |
510 | } | 512 | // } |
511 | } | 513 | } |
512 | 514 | ||
513 | /// <summary> | 515 | /// <summary> |
@@ -889,13 +891,12 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments | |||
889 | // Calls attach with a Zero position | 891 | // Calls attach with a Zero position |
890 | if (AttachObject(sp, part.ParentGroup, AttachmentPt, false)) | 892 | if (AttachObject(sp, part.ParentGroup, AttachmentPt, false)) |
891 | { | 893 | { |
892 | m_scene.EventManager.TriggerOnAttach(objectLocalID, part.ParentGroup.FromItemID, remoteClient.AgentId); | 894 | // m_log.Debug( |
895 | // "[ATTACHMENTS MODULE]: Saving avatar attachment. AgentID: " + remoteClient.AgentId | ||
896 | // + ", AttachmentPoint: " + AttachmentPt); | ||
893 | 897 | ||
894 | // Save avatar attachment information | 898 | // Save avatar attachment information |
895 | m_log.Debug( | 899 | m_scene.EventManager.TriggerOnAttach(objectLocalID, part.ParentGroup.FromItemID, remoteClient.AgentId); |
896 | "[ATTACHMENTS MODULE]: Saving avatar attachment. AgentID: " + remoteClient.AgentId | ||
897 | + ", AttachmentPoint: " + AttachmentPt); | ||
898 | |||
899 | } | 900 | } |
900 | } | 901 | } |
901 | catch (Exception e) | 902 | catch (Exception e) |
diff --git a/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs b/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs index b0cee03..0ed10d2 100644 --- a/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs | |||
@@ -158,7 +158,7 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory | |||
158 | // Process the baked texture array | 158 | // Process the baked texture array |
159 | if (textureEntry != null) | 159 | if (textureEntry != null) |
160 | { | 160 | { |
161 | m_log.InfoFormat("[AVFACTORY]: Received texture update for {0} {1}", sp.Name, sp.UUID); | 161 | // m_log.DebugFormat("[AVFACTORY]: Received texture update for {0} {1}", sp.Name, sp.UUID); |
162 | 162 | ||
163 | // WriteBakedTexturesReport(sp, m_log.DebugFormat); | 163 | // WriteBakedTexturesReport(sp, m_log.DebugFormat); |
164 | 164 | ||
@@ -208,7 +208,8 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory | |||
208 | ScenePresence sp = m_scene.GetScenePresence(agentId); | 208 | ScenePresence sp = m_scene.GetScenePresence(agentId); |
209 | if (sp == null) | 209 | if (sp == null) |
210 | { | 210 | { |
211 | m_log.WarnFormat("[AVFACTORY]: Agent {0} no longer in the scene", agentId); | 211 | // This is expected if the user has gone away. |
212 | // m_log.DebugFormat("[AVFACTORY]: Agent {0} no longer in the scene", agentId); | ||
212 | return false; | 213 | return false; |
213 | } | 214 | } |
214 | 215 | ||
@@ -248,10 +249,10 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory | |||
248 | 249 | ||
249 | if (bakedTextureFace == null) | 250 | if (bakedTextureFace == null) |
250 | { | 251 | { |
251 | m_log.WarnFormat( | 252 | // This can happen legitimately, since some baked textures might not exist |
252 | "[AV FACTORY]: No texture ID set for {0} for {1} in {2} not found when trying to save permanently", | 253 | //m_log.WarnFormat( |
253 | bakeType, sp.Name, m_scene.RegionInfo.RegionName); | 254 | // "[AV FACTORY]: No texture ID set for {0} for {1} in {2} not found when trying to save permanently", |
254 | 255 | // bakeType, sp.Name, m_scene.RegionInfo.RegionName); | |
255 | continue; | 256 | continue; |
256 | } | 257 | } |
257 | 258 | ||
@@ -337,7 +338,7 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory | |||
337 | return false; | 338 | return false; |
338 | } | 339 | } |
339 | 340 | ||
340 | m_log.DebugFormat("[AVFACTORY]: Completed texture check for {0} {1}", sp.Name, sp.UUID); | 341 | // m_log.DebugFormat("[AVFACTORY]: Completed texture check for {0} {1}", sp.Name, sp.UUID); |
341 | 342 | ||
342 | // If we only found default textures, then the appearance is not cached | 343 | // If we only found default textures, then the appearance is not cached |
343 | return (defonly ? false : true); | 344 | return (defonly ? false : true); |
@@ -417,7 +418,8 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory | |||
417 | // acd.AgentID, i, acd.Appearance.Texture.FaceTextures[i]); | 418 | // acd.AgentID, i, acd.Appearance.Texture.FaceTextures[i]); |
418 | 419 | ||
419 | int ftIndex = (int)AppearanceManager.BakeTypeToAgentTextureIndex(bakeType); | 420 | int ftIndex = (int)AppearanceManager.BakeTypeToAgentTextureIndex(bakeType); |
420 | bakedTextures[bakeType] = faceTextures[ftIndex]; | 421 | Primitive.TextureEntryFace texture = faceTextures[ftIndex]; // this will be null if there's no such baked texture |
422 | bakedTextures[bakeType] = texture; | ||
421 | } | 423 | } |
422 | 424 | ||
423 | return bakedTextures; | 425 | return bakedTextures; |
@@ -482,7 +484,8 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory | |||
482 | ScenePresence sp = m_scene.GetScenePresence(agentid); | 484 | ScenePresence sp = m_scene.GetScenePresence(agentid); |
483 | if (sp == null) | 485 | if (sp == null) |
484 | { | 486 | { |
485 | m_log.WarnFormat("[AVFACTORY]: Agent {0} no longer in the scene", agentid); | 487 | // This is expected if the user has gone away. |
488 | // m_log.DebugFormat("[AVFACTORY]: Agent {0} no longer in the scene", agentid); | ||
486 | return; | 489 | return; |
487 | } | 490 | } |
488 | 491 | ||
diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs index fa9cd55..a36d0fe 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs | |||
@@ -61,8 +61,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
61 | set { m_MaxTransferDistance = value; } | 61 | set { m_MaxTransferDistance = value; } |
62 | } | 62 | } |
63 | 63 | ||
64 | private int m_levelHGTeleport = 0; | ||
65 | |||
66 | protected bool m_Enabled = false; | 64 | protected bool m_Enabled = false; |
67 | protected Scene m_aScene; | 65 | protected Scene m_aScene; |
68 | protected List<Scene> m_Scenes = new List<Scene>(); | 66 | protected List<Scene> m_Scenes = new List<Scene>(); |
@@ -106,7 +104,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
106 | if (transferConfig != null) | 104 | if (transferConfig != null) |
107 | { | 105 | { |
108 | MaxTransferDistance = transferConfig.GetInt("max_distance", 4095); | 106 | MaxTransferDistance = transferConfig.GetInt("max_distance", 4095); |
109 | m_levelHGTeleport = transferConfig.GetInt("LevelHGTeleport", 0); | ||
110 | } | 107 | } |
111 | 108 | ||
112 | m_agentsInTransit = new List<UUID>(); | 109 | m_agentsInTransit = new List<UUID>(); |
@@ -172,13 +169,17 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
172 | // Reset animations; the viewer does that in teleports. | 169 | // Reset animations; the viewer does that in teleports. |
173 | sp.Animator.ResetAnimations(); | 170 | sp.Animator.ResetAnimations(); |
174 | 171 | ||
172 | string destinationRegionName = "(not found)"; | ||
173 | |||
175 | try | 174 | try |
176 | { | 175 | { |
177 | if (regionHandle == sp.Scene.RegionInfo.RegionHandle) | 176 | if (regionHandle == sp.Scene.RegionInfo.RegionHandle) |
178 | { | 177 | { |
178 | destinationRegionName = sp.Scene.RegionInfo.RegionName; | ||
179 | |||
179 | m_log.DebugFormat( | 180 | m_log.DebugFormat( |
180 | "[ENTITY TRANSFER MODULE]: RequestTeleportToLocation {0} within {1}", | 181 | "[ENTITY TRANSFER MODULE]: RequestTeleportToLocation for {0} to {1} within existing region {2}", |
181 | position, sp.Scene.RegionInfo.RegionName); | 182 | sp.Name, position, destinationRegionName); |
182 | 183 | ||
183 | // Teleport within the same region | 184 | // Teleport within the same region |
184 | if (IsOutsideRegion(sp.Scene, position) || position.Z < 0) | 185 | if (IsOutsideRegion(sp.Scene, position) || position.Z < 0) |
@@ -188,6 +189,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
188 | m_log.WarnFormat( | 189 | m_log.WarnFormat( |
189 | "[ENTITY TRANSFER MODULE]: RequestTeleportToLocation() was given an illegal position of {0} for avatar {1}, {2}. Substituting {3}", | 190 | "[ENTITY TRANSFER MODULE]: RequestTeleportToLocation() was given an illegal position of {0} for avatar {1}, {2}. Substituting {3}", |
190 | position, sp.Name, sp.UUID, emergencyPos); | 191 | position, sp.Name, sp.UUID, emergencyPos); |
192 | |||
191 | position = emergencyPos; | 193 | position = emergencyPos; |
192 | } | 194 | } |
193 | 195 | ||
@@ -210,6 +212,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
210 | sp.ControllingClient.SendTeleportStart(teleportFlags); | 212 | sp.ControllingClient.SendTeleportStart(teleportFlags); |
211 | 213 | ||
212 | sp.ControllingClient.SendLocalTeleport(position, lookAt, teleportFlags); | 214 | sp.ControllingClient.SendLocalTeleport(position, lookAt, teleportFlags); |
215 | sp.Velocity = Vector3.Zero; | ||
213 | sp.Teleport(position); | 216 | sp.Teleport(position); |
214 | 217 | ||
215 | foreach (SceneObjectGroup grp in sp.GetAttachments()) | 218 | foreach (SceneObjectGroup grp in sp.GetAttachments()) |
@@ -233,15 +236,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
233 | return; | 236 | return; |
234 | } | 237 | } |
235 | 238 | ||
236 | // check if HyperGrid teleport is allowed, based on user level | 239 | destinationRegionName = finalDestination.RegionName; |
237 | int flags = m_aScene.GridService.GetRegionFlags(sp.Scene.RegionInfo.ScopeID, reg.RegionID); | ||
238 | |||
239 | if (((flags & (int)OpenSim.Data.RegionFlags.Hyperlink) != 0) && (sp.UserLevel < m_levelHGTeleport)) | ||
240 | { | ||
241 | m_log.WarnFormat("[ENTITY TRANSFER MODULE]: Final destination link is non permitted hypergrid region. Unable to teleport agent."); | ||
242 | sp.ControllingClient.SendTeleportFailed("HyperGrid teleport not permitted"); | ||
243 | return; | ||
244 | } | ||
245 | 240 | ||
246 | uint curX = 0, curY = 0; | 241 | uint curX = 0, curY = 0; |
247 | Utils.LongToUInts(sp.Scene.RegionInfo.RegionHandle, out curX, out curY); | 242 | Utils.LongToUInts(sp.Scene.RegionInfo.RegionHandle, out curX, out curY); |
@@ -307,7 +302,11 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
307 | } | 302 | } |
308 | catch (Exception e) | 303 | catch (Exception e) |
309 | { | 304 | { |
310 | m_log.WarnFormat("[ENTITY TRANSFER MODULE]: Exception on teleport: {0} {1}", e.Message, e.StackTrace); | 305 | m_log.ErrorFormat( |
306 | "[ENTITY TRANSFER MODULE]: Exception on teleport of {0} from {1}@{2} to {3}@{4}: {5}{6}", | ||
307 | sp.Name, sp.AbsolutePosition, sp.Scene.RegionInfo.RegionName, position, destinationRegionName, | ||
308 | e.Message, e.StackTrace); | ||
309 | |||
311 | sp.ControllingClient.SendTeleportFailed("Internal error"); | 310 | sp.ControllingClient.SendTeleportFailed("Internal error"); |
312 | } | 311 | } |
313 | } | 312 | } |
@@ -402,7 +401,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
402 | bool logout = false; | 401 | bool logout = false; |
403 | if (!CreateAgent(sp, reg, finalDestination, agentCircuit, teleportFlags, out reason, out logout)) | 402 | if (!CreateAgent(sp, reg, finalDestination, agentCircuit, teleportFlags, out reason, out logout)) |
404 | { | 403 | { |
405 | sp.ControllingClient.SendTeleportFailed(String.Format("Destination refused: {0}", | 404 | sp.ControllingClient.SendTeleportFailed(String.Format("Teleport refused: {0}", |
406 | reason)); | 405 | reason)); |
407 | return; | 406 | return; |
408 | } | 407 | } |
diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs index 7f9175d..634fb43 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs | |||
@@ -50,6 +50,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
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 | 51 | ||
52 | private bool m_Initialized = false; | 52 | private bool m_Initialized = false; |
53 | private int m_levelHGTeleport = 0; | ||
53 | 54 | ||
54 | private GatekeeperServiceConnector m_GatekeeperConnector; | 55 | private GatekeeperServiceConnector m_GatekeeperConnector; |
55 | 56 | ||
@@ -68,6 +69,10 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
68 | string name = moduleConfig.GetString("EntityTransferModule", ""); | 69 | string name = moduleConfig.GetString("EntityTransferModule", ""); |
69 | if (name == Name) | 70 | if (name == Name) |
70 | { | 71 | { |
72 | IConfig transferConfig = source.Configs["EntityTransfer"]; | ||
73 | if (transferConfig != null) | ||
74 | m_levelHGTeleport = transferConfig.GetInt("LevelHGTeleport", 0); | ||
75 | |||
71 | InitialiseCommon(source); | 76 | InitialiseCommon(source); |
72 | m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: {0} enabled.", Name); | 77 | m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: {0} enabled.", Name); |
73 | } | 78 | } |
@@ -164,6 +169,14 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
164 | if (flags == -1 /* no region in DB */ || (flags & (int)OpenSim.Data.RegionFlags.Hyperlink) != 0) | 169 | if (flags == -1 /* no region in DB */ || (flags & (int)OpenSim.Data.RegionFlags.Hyperlink) != 0) |
165 | { | 170 | { |
166 | // this user is going to another grid | 171 | // this user is going to another grid |
172 | // check if HyperGrid teleport is allowed, based on user level | ||
173 | if (sp.UserLevel < m_levelHGTeleport) | ||
174 | { | ||
175 | m_log.WarnFormat("[HG ENTITY TRANSFER MODULE]: Unable to HG teleport agent due to insufficient UserLevel."); | ||
176 | reason = "HyperGrid teleport not permitted"; | ||
177 | return false; | ||
178 | } | ||
179 | |||
167 | if (agentCircuit.ServiceURLs.ContainsKey("HomeURI")) | 180 | if (agentCircuit.ServiceURLs.ContainsKey("HomeURI")) |
168 | { | 181 | { |
169 | string userAgentDriver = agentCircuit.ServiceURLs["HomeURI"].ToString(); | 182 | string userAgentDriver = agentCircuit.ServiceURLs["HomeURI"].ToString(); |
diff --git a/OpenSim/Region/CoreModules/World/LegacyMap/MapImageModule.cs b/OpenSim/Region/CoreModules/World/LegacyMap/MapImageModule.cs index f86c790..aa306c7 100644 --- a/OpenSim/Region/CoreModules/World/LegacyMap/MapImageModule.cs +++ b/OpenSim/Region/CoreModules/World/LegacyMap/MapImageModule.cs | |||
@@ -225,7 +225,7 @@ namespace OpenSim.Region.CoreModules.World.LegacyMap | |||
225 | int tc = 0; | 225 | int tc = 0; |
226 | double[,] hm = whichScene.Heightmap.GetDoubles(); | 226 | double[,] hm = whichScene.Heightmap.GetDoubles(); |
227 | tc = Environment.TickCount; | 227 | tc = Environment.TickCount; |
228 | m_log.Info("[MAPTILE]: Generating Maptile Step 2: Object Volume Profile"); | 228 | m_log.Debug("[MAPTILE]: Generating Maptile Step 2: Object Volume Profile"); |
229 | EntityBase[] objs = whichScene.GetEntities(); | 229 | EntityBase[] objs = whichScene.GetEntities(); |
230 | Dictionary<uint, DrawStruct> z_sort = new Dictionary<uint, DrawStruct>(); | 230 | Dictionary<uint, DrawStruct> z_sort = new Dictionary<uint, DrawStruct>(); |
231 | //SortedList<float, RectangleDrawStruct> z_sort = new SortedList<float, RectangleDrawStruct>(); | 231 | //SortedList<float, RectangleDrawStruct> z_sort = new SortedList<float, RectangleDrawStruct>(); |
@@ -541,7 +541,7 @@ namespace OpenSim.Region.CoreModules.World.LegacyMap | |||
541 | g.Dispose(); | 541 | g.Dispose(); |
542 | } // lock entities objs | 542 | } // lock entities objs |
543 | 543 | ||
544 | m_log.Info("[MAPTILE]: Generating Maptile Step 2: Done in " + (Environment.TickCount - tc) + " ms"); | 544 | m_log.Debug("[MAPTILE]: Generating Maptile Step 2: Done in " + (Environment.TickCount - tc) + " ms"); |
545 | return mapbmp; | 545 | return mapbmp; |
546 | } | 546 | } |
547 | 547 | ||
diff --git a/OpenSim/Region/CoreModules/World/LegacyMap/ShadedMapTileRenderer.cs b/OpenSim/Region/CoreModules/World/LegacyMap/ShadedMapTileRenderer.cs index eb1a27f..992bff3 100644 --- a/OpenSim/Region/CoreModules/World/LegacyMap/ShadedMapTileRenderer.cs +++ b/OpenSim/Region/CoreModules/World/LegacyMap/ShadedMapTileRenderer.cs | |||
@@ -54,7 +54,7 @@ namespace OpenSim.Region.CoreModules.World.LegacyMap | |||
54 | public void TerrainToBitmap(Bitmap mapbmp) | 54 | public void TerrainToBitmap(Bitmap mapbmp) |
55 | { | 55 | { |
56 | int tc = Environment.TickCount; | 56 | int tc = Environment.TickCount; |
57 | m_log.Info("[MAPTILE]: Generating Maptile Step 1: Terrain"); | 57 | m_log.Debug("[MAPTILE]: Generating Maptile Step 1: Terrain"); |
58 | 58 | ||
59 | double[,] hm = m_scene.Heightmap.GetDoubles(); | 59 | double[,] hm = m_scene.Heightmap.GetDoubles(); |
60 | bool ShadowDebugContinue = true; | 60 | bool ShadowDebugContinue = true; |
@@ -238,7 +238,7 @@ namespace OpenSim.Region.CoreModules.World.LegacyMap | |||
238 | } | 238 | } |
239 | } | 239 | } |
240 | } | 240 | } |
241 | m_log.Info("[MAPTILE]: Generating Maptile Step 1: Done in " + (Environment.TickCount - tc) + " ms"); | 241 | m_log.Debug("[MAPTILE]: Generating Maptile Step 1: Done in " + (Environment.TickCount - tc) + " ms"); |
242 | } | 242 | } |
243 | } | 243 | } |
244 | } | 244 | } |
diff --git a/OpenSim/Region/CoreModules/World/LegacyMap/TexturedMapTileRenderer.cs b/OpenSim/Region/CoreModules/World/LegacyMap/TexturedMapTileRenderer.cs index 1d2141e..d13c2ef 100644 --- a/OpenSim/Region/CoreModules/World/LegacyMap/TexturedMapTileRenderer.cs +++ b/OpenSim/Region/CoreModules/World/LegacyMap/TexturedMapTileRenderer.cs | |||
@@ -278,7 +278,7 @@ namespace OpenSim.Region.CoreModules.World.LegacyMap | |||
278 | public void TerrainToBitmap(Bitmap mapbmp) | 278 | public void TerrainToBitmap(Bitmap mapbmp) |
279 | { | 279 | { |
280 | int tc = Environment.TickCount; | 280 | int tc = Environment.TickCount; |
281 | m_log.Info("[MAPTILE]: Generating Maptile Step 1: Terrain"); | 281 | m_log.Debug("[MAPTILE]: Generating Maptile Step 1: Terrain"); |
282 | 282 | ||
283 | // These textures should be in the AssetCache anyway, as every client conneting to this | 283 | // These textures should be in the AssetCache anyway, as every client conneting to this |
284 | // region needs them. Except on start, when the map is recreated (before anyone connected), | 284 | // region needs them. Except on start, when the map is recreated (before anyone connected), |
@@ -412,7 +412,7 @@ namespace OpenSim.Region.CoreModules.World.LegacyMap | |||
412 | } | 412 | } |
413 | } | 413 | } |
414 | } | 414 | } |
415 | m_log.Info("[MAPTILE]: Generating Maptile Step 1: Done in " + (Environment.TickCount - tc) + " ms"); | 415 | m_log.Debug("[MAPTILE]: Generating Maptile Step 1: Done in " + (Environment.TickCount - tc) + " ms"); |
416 | } | 416 | } |
417 | } | 417 | } |
418 | } | 418 | } |
diff --git a/OpenSim/Region/CoreModules/World/Warp3DMap/MapImageModule.cs b/OpenSim/Region/CoreModules/World/Warp3DMap/MapImageModule.cs index 6163fd1..4f4e296 100644 --- a/OpenSim/Region/CoreModules/World/Warp3DMap/MapImageModule.cs +++ b/OpenSim/Region/CoreModules/World/Warp3DMap/MapImageModule.cs | |||
@@ -88,11 +88,11 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap | |||
88 | if (renderers.Count > 0) | 88 | if (renderers.Count > 0) |
89 | { | 89 | { |
90 | m_primMesher = RenderingLoader.LoadRenderer(renderers[0]); | 90 | m_primMesher = RenderingLoader.LoadRenderer(renderers[0]); |
91 | m_log.Info("[MAPTILE]: Loaded prim mesher " + m_primMesher.ToString()); | 91 | m_log.Debug("[MAPTILE]: Loaded prim mesher " + m_primMesher.ToString()); |
92 | } | 92 | } |
93 | else | 93 | else |
94 | { | 94 | { |
95 | m_log.Info("[MAPTILE]: No prim mesher loaded, prim rendering will be disabled"); | 95 | m_log.Debug("[MAPTILE]: No prim mesher loaded, prim rendering will be disabled"); |
96 | } | 96 | } |
97 | 97 | ||
98 | m_scene.RegisterModuleInterface<IMapImageGenerator>(this); | 98 | m_scene.RegisterModuleInterface<IMapImageGenerator>(this); |
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs index 10b25ed..816d3b6 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | |||
@@ -1988,7 +1988,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1988 | } | 1988 | } |
1989 | } | 1989 | } |
1990 | 1990 | ||
1991 | if (permissionToTake) | 1991 | if (permissionToTake && (action != DeRezAction.Delete || this.m_useTrashOnDelete)) |
1992 | { | 1992 | { |
1993 | m_asyncSceneObjectDeleter.DeleteToInventory( | 1993 | m_asyncSceneObjectDeleter.DeleteToInventory( |
1994 | action, destinationID, deleteGroups, remoteClient, | 1994 | action, destinationID, deleteGroups, remoteClient, |
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index a87dfb7..7a2b2ed 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs | |||
@@ -103,6 +103,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
103 | public bool m_trustBinaries; | 103 | public bool m_trustBinaries; |
104 | public bool m_allowScriptCrossings; | 104 | public bool m_allowScriptCrossings; |
105 | public bool m_useFlySlow; | 105 | public bool m_useFlySlow; |
106 | public bool m_useTrashOnDelete = true; | ||
106 | 107 | ||
107 | /// <summary> | 108 | /// <summary> |
108 | /// Temporarily setting to trigger appearance resends at 60 second intervals. | 109 | /// Temporarily setting to trigger appearance resends at 60 second intervals. |
@@ -709,6 +710,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
709 | m_clampPrimSize = true; | 710 | m_clampPrimSize = true; |
710 | } | 711 | } |
711 | 712 | ||
713 | m_useTrashOnDelete = startupConfig.GetBoolean("UseTrashOnDelete",m_useTrashOnDelete); | ||
712 | m_trustBinaries = startupConfig.GetBoolean("TrustBinaries", m_trustBinaries); | 714 | m_trustBinaries = startupConfig.GetBoolean("TrustBinaries", m_trustBinaries); |
713 | m_allowScriptCrossings = startupConfig.GetBoolean("AllowScriptCrossing", m_allowScriptCrossings); | 715 | m_allowScriptCrossings = startupConfig.GetBoolean("AllowScriptCrossing", m_allowScriptCrossings); |
714 | m_dontPersistBefore = | 716 | m_dontPersistBefore = |
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index 49a3485..2686004 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | |||
@@ -1969,6 +1969,11 @@ namespace OpenSim.Region.Framework.Scenes | |||
1969 | /// <param name="objectGroup">The group of prims which should be linked to this group</param> | 1969 | /// <param name="objectGroup">The group of prims which should be linked to this group</param> |
1970 | public void LinkToGroup(SceneObjectGroup objectGroup) | 1970 | public void LinkToGroup(SceneObjectGroup objectGroup) |
1971 | { | 1971 | { |
1972 | LinkToGroup(objectGroup, false); | ||
1973 | } | ||
1974 | |||
1975 | public void LinkToGroup(SceneObjectGroup objectGroup, bool insert) | ||
1976 | { | ||
1972 | // m_log.DebugFormat( | 1977 | // m_log.DebugFormat( |
1973 | // "[SCENE OBJECT GROUP]: Linking group with root part {0}, {1} to group with root part {2}, {3}", | 1978 | // "[SCENE OBJECT GROUP]: Linking group with root part {0}, {1} to group with root part {2}, {3}", |
1974 | // objectGroup.RootPart.Name, objectGroup.RootPart.UUID, RootPart.Name, RootPart.UUID); | 1979 | // objectGroup.RootPart.Name, objectGroup.RootPart.UUID, RootPart.Name, RootPart.UUID); |
@@ -1979,6 +1984,10 @@ namespace OpenSim.Region.Framework.Scenes | |||
1979 | 1984 | ||
1980 | SceneObjectPart linkPart = objectGroup.m_rootPart; | 1985 | SceneObjectPart linkPart = objectGroup.m_rootPart; |
1981 | 1986 | ||
1987 | // physics flags from group to be applied to linked parts | ||
1988 | bool grpusephys = UsesPhysics; | ||
1989 | bool grptemporary = IsTemporary; | ||
1990 | |||
1982 | Vector3 oldGroupPosition = linkPart.GroupPosition; | 1991 | Vector3 oldGroupPosition = linkPart.GroupPosition; |
1983 | Quaternion oldRootRotation = linkPart.RotationOffset; | 1992 | Quaternion oldRootRotation = linkPart.RotationOffset; |
1984 | 1993 | ||
@@ -2002,15 +2011,35 @@ namespace OpenSim.Region.Framework.Scenes | |||
2002 | 2011 | ||
2003 | lock (m_parts.SyncRoot) | 2012 | lock (m_parts.SyncRoot) |
2004 | { | 2013 | { |
2005 | int linkNum = PrimCount + 1; | 2014 | int linkNum; |
2015 | if (insert) | ||
2016 | { | ||
2017 | linkNum = 2; | ||
2018 | foreach (SceneObjectPart part in Parts) | ||
2019 | { | ||
2020 | if (part.LinkNum > 1) | ||
2021 | part.LinkNum++; | ||
2022 | } | ||
2023 | } | ||
2024 | else | ||
2025 | { | ||
2026 | linkNum = PrimCount + 1; | ||
2027 | } | ||
2006 | 2028 | ||
2007 | m_parts.Add(linkPart.UUID, linkPart); | 2029 | m_parts.Add(linkPart.UUID, linkPart); |
2008 | 2030 | ||
2009 | linkPart.SetParent(this); | 2031 | linkPart.SetParent(this); |
2010 | linkPart.CreateSelected = true; | 2032 | linkPart.CreateSelected = true; |
2011 | 2033 | ||
2034 | // let physics know preserve part volume dtc messy since UpdatePrimFlags doesn't look to parent changes for now | ||
2035 | linkPart.UpdatePrimFlags(grpusephys, grptemporary, (IsPhantom || (linkPart.Flags & PrimFlags.Phantom) != 0), linkPart.VolumeDetectActive); | ||
2036 | if (linkPart.PhysActor != null && m_rootPart.PhysActor != null && m_rootPart.PhysActor.IsPhysical) | ||
2037 | { | ||
2038 | linkPart.PhysActor.link(m_rootPart.PhysActor); | ||
2039 | this.Scene.PhysicsScene.AddPhysicsActorTaint(linkPart.PhysActor); | ||
2040 | } | ||
2041 | |||
2012 | linkPart.LinkNum = linkNum++; | 2042 | linkPart.LinkNum = linkNum++; |
2013 | linkPart.UpdatePrimFlags(UsesPhysics, IsTemporary, IsPhantom, IsVolumeDetect); | ||
2014 | 2043 | ||
2015 | SceneObjectPart[] ogParts = objectGroup.Parts; | 2044 | SceneObjectPart[] ogParts = objectGroup.Parts; |
2016 | Array.Sort(ogParts, delegate(SceneObjectPart a, SceneObjectPart b) | 2045 | Array.Sort(ogParts, delegate(SceneObjectPart a, SceneObjectPart b) |
@@ -2022,7 +2051,16 @@ namespace OpenSim.Region.Framework.Scenes | |||
2022 | { | 2051 | { |
2023 | SceneObjectPart part = ogParts[i]; | 2052 | SceneObjectPart part = ogParts[i]; |
2024 | if (part.UUID != objectGroup.m_rootPart.UUID) | 2053 | if (part.UUID != objectGroup.m_rootPart.UUID) |
2054 | { | ||
2025 | LinkNonRootPart(part, oldGroupPosition, oldRootRotation, linkNum++); | 2055 | LinkNonRootPart(part, oldGroupPosition, oldRootRotation, linkNum++); |
2056 | // let physics know | ||
2057 | part.UpdatePrimFlags(grpusephys, grptemporary, (IsPhantom || (part.Flags & PrimFlags.Phantom) != 0), part.VolumeDetectActive); | ||
2058 | if (part.PhysActor != null && m_rootPart.PhysActor != null && m_rootPart.PhysActor.IsPhysical) | ||
2059 | { | ||
2060 | part.PhysActor.link(m_rootPart.PhysActor); | ||
2061 | this.Scene.PhysicsScene.AddPhysicsActorTaint(part.PhysActor); | ||
2062 | } | ||
2063 | } | ||
2026 | part.ClearUndoState(); | 2064 | part.ClearUndoState(); |
2027 | } | 2065 | } |
2028 | } | 2066 | } |
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index b5f789b..e8178ce 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs | |||
@@ -990,23 +990,24 @@ namespace OpenSim.Region.Framework.Scenes | |||
990 | /// <param name="pos"></param> | 990 | /// <param name="pos"></param> |
991 | public void Teleport(Vector3 pos) | 991 | public void Teleport(Vector3 pos) |
992 | { | 992 | { |
993 | bool isFlying = Flying; | 993 | TeleportWithMomentum(pos, null); |
994 | RemoveFromPhysicalScene(); | ||
995 | Velocity = Vector3.Zero; | ||
996 | CheckLandingPoint(ref pos); | ||
997 | AbsolutePosition = pos; | ||
998 | AddToPhysicalScene(isFlying); | ||
999 | |||
1000 | SendTerseUpdateToAllClients(); | ||
1001 | } | 994 | } |
1002 | 995 | ||
1003 | public void TeleportWithMomentum(Vector3 pos) | 996 | public void TeleportWithMomentum(Vector3 pos, Vector3? v) |
1004 | { | 997 | { |
1005 | bool isFlying = Flying; | 998 | bool isFlying = Flying; |
999 | Vector3 vel = Velocity; | ||
1006 | RemoveFromPhysicalScene(); | 1000 | RemoveFromPhysicalScene(); |
1007 | CheckLandingPoint(ref pos); | 1001 | CheckLandingPoint(ref pos); |
1008 | AbsolutePosition = pos; | 1002 | AbsolutePosition = pos; |
1009 | AddToPhysicalScene(isFlying); | 1003 | AddToPhysicalScene(isFlying); |
1004 | if (PhysicsActor != null) | ||
1005 | { | ||
1006 | if (v.HasValue) | ||
1007 | PhysicsActor.SetMomentum((Vector3)v); | ||
1008 | else | ||
1009 | PhysicsActor.SetMomentum(vel); | ||
1010 | } | ||
1010 | 1011 | ||
1011 | SendTerseUpdateToAllClients(); | 1012 | SendTerseUpdateToAllClients(); |
1012 | } | 1013 | } |
diff --git a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTeleportTests.cs b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTeleportTests.cs index bebc10c..eb7bfbd 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTeleportTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTeleportTests.cs | |||
@@ -33,6 +33,7 @@ using OpenMetaverse; | |||
33 | using OpenSim.Framework; | 33 | using OpenSim.Framework; |
34 | using OpenSim.Framework.Communications; | 34 | using OpenSim.Framework.Communications; |
35 | using OpenSim.Framework.Servers; | 35 | using OpenSim.Framework.Servers; |
36 | using OpenSim.Region.CoreModules.Framework.EntityTransfer; | ||
36 | using OpenSim.Region.Framework.Interfaces; | 37 | using OpenSim.Region.Framework.Interfaces; |
37 | using OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation; | 38 | using OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation; |
38 | using OpenSim.Tests.Common; | 39 | using OpenSim.Tests.Common; |
@@ -47,6 +48,41 @@ namespace OpenSim.Region.Framework.Scenes.Tests | |||
47 | [TestFixture] | 48 | [TestFixture] |
48 | public class ScenePresenceTeleportTests | 49 | public class ScenePresenceTeleportTests |
49 | { | 50 | { |
51 | [Test] | ||
52 | public void TestSameRegionTeleport() | ||
53 | { | ||
54 | TestHelpers.InMethod(); | ||
55 | // log4net.Config.XmlConfigurator.Configure(); | ||
56 | |||
57 | EntityTransferModule etm = new EntityTransferModule(); | ||
58 | |||
59 | IConfigSource config = new IniConfigSource(); | ||
60 | config.AddConfig("Modules"); | ||
61 | // Not strictly necessary since FriendsModule assumes it is the default (!) | ||
62 | config.Configs["Modules"].Set("EntityTransferModule", etm.Name); | ||
63 | |||
64 | TestScene scene = SceneHelpers.SetupScene("sceneA", TestHelpers.ParseTail(0x100), 1000, 1000); | ||
65 | SceneHelpers.SetupSceneModules(scene, config, etm); | ||
66 | |||
67 | Vector3 teleportPosition = new Vector3(10, 11, 12); | ||
68 | Vector3 teleportLookAt = new Vector3(20, 21, 22); | ||
69 | |||
70 | ScenePresence sp = SceneHelpers.AddScenePresence(scene, TestHelpers.ParseTail(0x1)); | ||
71 | sp.AbsolutePosition = new Vector3(30, 31, 32); | ||
72 | scene.RequestTeleportLocation( | ||
73 | sp.ControllingClient, | ||
74 | scene.RegionInfo.RegionHandle, | ||
75 | teleportPosition, | ||
76 | teleportLookAt, | ||
77 | (uint)TeleportFlags.ViaLocation); | ||
78 | |||
79 | Assert.That(sp.AbsolutePosition, Is.EqualTo(teleportPosition)); | ||
80 | |||
81 | // Lookat is sent to the client only - sp.Lookat does not yield the same thing (calculation from camera | ||
82 | // position instead). | ||
83 | // Assert.That(sp.Lookat, Is.EqualTo(teleportLookAt)); | ||
84 | } | ||
85 | |||
50 | /// <summary> | 86 | /// <summary> |
51 | /// Test a teleport between two regions that are not neighbours and do not share any neighbours in common. | 87 | /// Test a teleport between two regions that are not neighbours and do not share any neighbours in common. |
52 | /// </summary> | 88 | /// </summary> |
diff --git a/OpenSim/Region/OptionalModules/Avatar/Friends/FriendsCommandsModule.cs b/OpenSim/Region/OptionalModules/Avatar/Friends/FriendsCommandsModule.cs index e68f9d0..2602050 100644 --- a/OpenSim/Region/OptionalModules/Avatar/Friends/FriendsCommandsModule.cs +++ b/OpenSim/Region/OptionalModules/Avatar/Friends/FriendsCommandsModule.cs | |||
@@ -58,6 +58,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.Friends | |||
58 | private Scene m_scene; | 58 | private Scene m_scene; |
59 | private IFriendsModule m_friendsModule; | 59 | private IFriendsModule m_friendsModule; |
60 | private IUserManagement m_userManagementModule; | 60 | private IUserManagement m_userManagementModule; |
61 | private IPresenceService m_presenceService; | ||
61 | 62 | ||
62 | // private IAvatarFactoryModule m_avatarFactory; | 63 | // private IAvatarFactoryModule m_avatarFactory; |
63 | 64 | ||
@@ -99,8 +100,9 @@ namespace OpenSim.Region.OptionalModules.Avatar.Friends | |||
99 | 100 | ||
100 | m_friendsModule = m_scene.RequestModuleInterface<IFriendsModule>(); | 101 | m_friendsModule = m_scene.RequestModuleInterface<IFriendsModule>(); |
101 | m_userManagementModule = m_scene.RequestModuleInterface<IUserManagement>(); | 102 | m_userManagementModule = m_scene.RequestModuleInterface<IUserManagement>(); |
103 | m_presenceService = m_scene.RequestModuleInterface<IPresenceService>(); | ||
102 | 104 | ||
103 | if (m_friendsModule != null && m_userManagementModule != null) | 105 | if (m_friendsModule != null && m_userManagementModule != null && m_presenceService != null) |
104 | { | 106 | { |
105 | m_scene.AddCommand( | 107 | m_scene.AddCommand( |
106 | "Friends", this, "friends show", | 108 | "Friends", this, "friends show", |
@@ -162,7 +164,8 @@ namespace OpenSim.Region.OptionalModules.Avatar.Friends | |||
162 | 164 | ||
163 | MainConsole.Instance.OutputFormat("Friends for {0} {1} {2}:", firstName, lastName, userId); | 165 | MainConsole.Instance.OutputFormat("Friends for {0} {1} {2}:", firstName, lastName, userId); |
164 | 166 | ||
165 | MainConsole.Instance.OutputFormat("UUID, Name, MyFlags, TheirFlags"); | 167 | MainConsole.Instance.OutputFormat( |
168 | "{0,-36} {1,-36} {2,-7} {3,7} {4,10}", "UUID", "Name", "Status", "MyFlags", "TheirFlags"); | ||
166 | 169 | ||
167 | foreach (FriendInfo friend in friends) | 170 | foreach (FriendInfo friend in friends) |
168 | { | 171 | { |
@@ -175,14 +178,22 @@ namespace OpenSim.Region.OptionalModules.Avatar.Friends | |||
175 | 178 | ||
176 | UUID friendId; | 179 | UUID friendId; |
177 | string friendName; | 180 | string friendName; |
181 | string onlineText; | ||
178 | 182 | ||
179 | if (UUID.TryParse(friend.Friend, out friendId)) | 183 | if (UUID.TryParse(friend.Friend, out friendId)) |
180 | friendName = m_userManagementModule.GetUserName(friendId); | 184 | friendName = m_userManagementModule.GetUserName(friendId); |
181 | else | 185 | else |
182 | friendName = friend.Friend; | 186 | friendName = friend.Friend; |
183 | 187 | ||
188 | OpenSim.Services.Interfaces.PresenceInfo[] pi = m_presenceService.GetAgents(new string[] { friend.Friend }); | ||
189 | if (pi.Length > 0) | ||
190 | onlineText = "online"; | ||
191 | else | ||
192 | onlineText = "offline"; | ||
193 | |||
184 | MainConsole.Instance.OutputFormat( | 194 | MainConsole.Instance.OutputFormat( |
185 | "{0} {1} {2} {3}", friend.Friend, friendName, friend.MyFlags, friend.TheirFlags); | 195 | "{0,-36} {1,-36} {2,-7} {3,-7} {4,-10}", |
196 | friend.Friend, friendName, onlineText, friend.MyFlags, friend.TheirFlags); | ||
186 | } | 197 | } |
187 | } | 198 | } |
188 | } | 199 | } |
diff --git a/OpenSim/Region/OptionalModules/Scripting/JsonStore/JsonStoreScriptModule.cs b/OpenSim/Region/OptionalModules/Scripting/JsonStore/JsonStoreScriptModule.cs index eda2aef..4949097 100644 --- a/OpenSim/Region/OptionalModules/Scripting/JsonStore/JsonStoreScriptModule.cs +++ b/OpenSim/Region/OptionalModules/Scripting/JsonStore/JsonStoreScriptModule.cs | |||
@@ -163,28 +163,37 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore | |||
163 | return; | 163 | return; |
164 | } | 164 | } |
165 | 165 | ||
166 | m_comms.RegisterScriptInvocation(this,"JsonCreateStore"); | 166 | try |
167 | m_comms.RegisterScriptInvocation(this,"JsonDestroyStore"); | 167 | { |
168 | m_comms.RegisterScriptInvocation(this,"JsonCreateStore"); | ||
169 | m_comms.RegisterScriptInvocation(this,"JsonDestroyStore"); | ||
168 | 170 | ||
169 | m_comms.RegisterScriptInvocation(this,"JsonReadNotecard"); | 171 | m_comms.RegisterScriptInvocation(this,"JsonReadNotecard"); |
170 | m_comms.RegisterScriptInvocation(this,"JsonWriteNotecard"); | 172 | m_comms.RegisterScriptInvocation(this,"JsonWriteNotecard"); |
171 | 173 | ||
172 | m_comms.RegisterScriptInvocation(this,"JsonTestPath"); | 174 | m_comms.RegisterScriptInvocation(this,"JsonTestPath"); |
173 | m_comms.RegisterScriptInvocation(this,"JsonTestPathJson"); | 175 | m_comms.RegisterScriptInvocation(this,"JsonTestPathJson"); |
174 | 176 | ||
175 | m_comms.RegisterScriptInvocation(this,"JsonGetValue"); | 177 | m_comms.RegisterScriptInvocation(this,"JsonGetValue"); |
176 | m_comms.RegisterScriptInvocation(this,"JsonGetValueJson"); | 178 | m_comms.RegisterScriptInvocation(this,"JsonGetValueJson"); |
177 | 179 | ||
178 | m_comms.RegisterScriptInvocation(this,"JsonTakeValue"); | 180 | m_comms.RegisterScriptInvocation(this,"JsonTakeValue"); |
179 | m_comms.RegisterScriptInvocation(this,"JsonTakeValueJson"); | 181 | m_comms.RegisterScriptInvocation(this,"JsonTakeValueJson"); |
180 | 182 | ||
181 | m_comms.RegisterScriptInvocation(this,"JsonReadValue"); | 183 | m_comms.RegisterScriptInvocation(this,"JsonReadValue"); |
182 | m_comms.RegisterScriptInvocation(this,"JsonReadValueJson"); | 184 | m_comms.RegisterScriptInvocation(this,"JsonReadValueJson"); |
183 | 185 | ||
184 | m_comms.RegisterScriptInvocation(this,"JsonSetValue"); | 186 | m_comms.RegisterScriptInvocation(this,"JsonSetValue"); |
185 | m_comms.RegisterScriptInvocation(this,"JsonSetValueJson"); | 187 | m_comms.RegisterScriptInvocation(this,"JsonSetValueJson"); |
186 | 188 | ||
187 | m_comms.RegisterScriptInvocation(this,"JsonRemoveValue"); | 189 | m_comms.RegisterScriptInvocation(this,"JsonRemoveValue"); |
190 | } | ||
191 | catch (Exception e) | ||
192 | { | ||
193 | // See http://opensimulator.org/mantis/view.php?id=5971 for more information | ||
194 | m_log.WarnFormat("[JsonStroreScripts] script method registration failed; {0}",e.Message); | ||
195 | m_enabled = false; | ||
196 | } | ||
188 | } | 197 | } |
189 | } | 198 | } |
190 | 199 | ||
diff --git a/OpenSim/Region/OptionalModules/Scripting/Minimodule/SPAvatar.cs b/OpenSim/Region/OptionalModules/Scripting/Minimodule/SPAvatar.cs index 922eaaf..d192309 100644 --- a/OpenSim/Region/OptionalModules/Scripting/Minimodule/SPAvatar.cs +++ b/OpenSim/Region/OptionalModules/Scripting/Minimodule/SPAvatar.cs | |||
@@ -68,7 +68,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule | |||
68 | public Vector3 WorldPosition | 68 | public Vector3 WorldPosition |
69 | { | 69 | { |
70 | get { return GetSP().AbsolutePosition; } | 70 | get { return GetSP().AbsolutePosition; } |
71 | set { GetSP().TeleportWithMomentum(value); } | 71 | set { GetSP().Teleport(value); } |
72 | } | 72 | } |
73 | 73 | ||
74 | public bool IsChildAgent | 74 | public bool IsChildAgent |
diff --git a/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs b/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs index adc6f9c..3ac1eb1 100644 --- a/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs +++ b/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs | |||
@@ -157,7 +157,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC | |||
157 | 157 | ||
158 | sp.CompleteMovement(npcAvatar, false); | 158 | sp.CompleteMovement(npcAvatar, false); |
159 | m_avatars.Add(npcAvatar.AgentId, npcAvatar); | 159 | m_avatars.Add(npcAvatar.AgentId, npcAvatar); |
160 | m_log.DebugFormat("[NPC MODULE]: Created NPC with id {0}", npcAvatar.AgentId); | 160 | m_log.DebugFormat("[NPC MODULE]: Created NPC {0} {1}", npcAvatar.AgentId, sp.Name); |
161 | 161 | ||
162 | return npcAvatar.AgentId; | 162 | return npcAvatar.AgentId; |
163 | } | 163 | } |
@@ -340,7 +340,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC | |||
340 | scene.RemoveClient(agentID, false); | 340 | scene.RemoveClient(agentID, false); |
341 | m_avatars.Remove(agentID); | 341 | m_avatars.Remove(agentID); |
342 | 342 | ||
343 | // m_log.DebugFormat("[NPC MODULE]: Removed {0} {1}", agentID, av.Name); | 343 | m_log.DebugFormat("[NPC MODULE]: Removed NPC {0} {1}", agentID, av.Name); |
344 | return true; | 344 | return true; |
345 | } | 345 | } |
346 | } | 346 | } |
diff --git a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs index 3f88353..0716214 100644 --- a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs +++ b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs | |||
@@ -338,6 +338,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
338 | d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags); | 338 | d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags); |
339 | 339 | ||
340 | _parent_scene.geom_name_map[prim_geom] = Name; | 340 | _parent_scene.geom_name_map[prim_geom] = Name; |
341 | _parent_scene.actor_name_map[prim_geom] = this; | ||
341 | 342 | ||
342 | if (childPrim) | 343 | if (childPrim) |
343 | { | 344 | { |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/ApiManager.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/ApiManager.cs index 47ed6ba..684138f 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/ApiManager.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/ApiManager.cs | |||
@@ -29,42 +29,43 @@ using System; | |||
29 | using System.Collections; | 29 | using System.Collections; |
30 | using System.Collections.Generic; | 30 | using System.Collections.Generic; |
31 | using System.Reflection; | 31 | using System.Reflection; |
32 | using log4net; | ||
32 | using OpenSim.Region.ScriptEngine.Interfaces; | 33 | using OpenSim.Region.ScriptEngine.Interfaces; |
33 | 34 | ||
34 | namespace OpenSim.Region.ScriptEngine.Shared.Api | 35 | namespace OpenSim.Region.ScriptEngine.Shared.Api |
35 | { | 36 | { |
36 | public class ApiManager | 37 | public class ApiManager |
37 | { | 38 | { |
39 | // private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
40 | |||
38 | private Dictionary<string,Type> m_Apis = new Dictionary<string,Type>(); | 41 | private Dictionary<string,Type> m_Apis = new Dictionary<string,Type>(); |
39 | 42 | ||
40 | public string[] GetApis() | 43 | public string[] GetApis() |
41 | { | 44 | { |
42 | if (m_Apis.Count > 0) | 45 | if (m_Apis.Count <= 0) |
43 | { | 46 | { |
44 | List<string> l = new List<string>(m_Apis.Keys); | 47 | Assembly a = Assembly.GetExecutingAssembly(); |
45 | return l.ToArray(); | ||
46 | } | ||
47 | 48 | ||
48 | Assembly a = Assembly.GetExecutingAssembly(); | 49 | Type[] types = a.GetExportedTypes(); |
49 | 50 | ||
50 | Type[] types = a.GetExportedTypes(); | 51 | foreach (Type t in types) |
51 | |||
52 | foreach (Type t in types) | ||
53 | { | ||
54 | string name = t.ToString(); | ||
55 | int idx = name.LastIndexOf('.'); | ||
56 | if (idx != -1) | ||
57 | name = name.Substring(idx+1); | ||
58 | |||
59 | if (name.EndsWith("_Api")) | ||
60 | { | 52 | { |
61 | name = name.Substring(0, name.Length - 4); | 53 | string name = t.ToString(); |
62 | m_Apis[name] = t; | 54 | int idx = name.LastIndexOf('.'); |
55 | if (idx != -1) | ||
56 | name = name.Substring(idx+1); | ||
57 | |||
58 | if (name.EndsWith("_Api")) | ||
59 | { | ||
60 | name = name.Substring(0, name.Length - 4); | ||
61 | m_Apis[name] = t; | ||
62 | } | ||
63 | } | 63 | } |
64 | } | 64 | } |
65 | 65 | ||
66 | List<string> ret = new List<string>(m_Apis.Keys); | 66 | // m_log.DebugFormat("[API MANAGER]: Found {0} apis", m_Apis.Keys.Count); |
67 | return ret.ToArray(); | 67 | |
68 | return new List<string>(m_Apis.Keys).ToArray(); | ||
68 | } | 69 | } |
69 | 70 | ||
70 | public IScriptApi CreateApi(string api) | 71 | public IScriptApi CreateApi(string api) |
@@ -76,4 +77,4 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
76 | return ret; | 77 | return ret; |
77 | } | 78 | } |
78 | } | 79 | } |
79 | } | 80 | } \ No newline at end of file |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index a2176ba..d641958 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | |||
@@ -85,7 +85,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
85 | protected IScriptEngine m_ScriptEngine; | 85 | protected IScriptEngine m_ScriptEngine; |
86 | protected SceneObjectPart m_host; | 86 | protected SceneObjectPart m_host; |
87 | protected uint m_localID; | 87 | protected uint m_localID; |
88 | |||
89 | /// <summary> | ||
90 | /// The UUID of the item that hosts this script | ||
91 | /// </summary> | ||
88 | protected UUID m_itemID; | 92 | protected UUID m_itemID; |
93 | |||
89 | protected bool throwErrorOnNotImplemented = true; | 94 | protected bool throwErrorOnNotImplemented = true; |
90 | protected AsyncCommandManager AsyncCommands = null; | 95 | protected AsyncCommandManager AsyncCommands = null; |
91 | protected float m_ScriptDelayFactor = 1.0f; | 96 | protected float m_ScriptDelayFactor = 1.0f; |
@@ -267,23 +272,18 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
267 | } | 272 | } |
268 | } | 273 | } |
269 | 274 | ||
270 | protected UUID InventorySelf() | 275 | /// <summary> |
276 | /// Get the inventory item that hosts ourselves. | ||
277 | /// </summary> | ||
278 | /// <remarks> | ||
279 | /// FIXME: It would be far easier to pass in TaskInventoryItem rather than just m_itemID so that we don't need | ||
280 | /// to keep looking ourselves up. | ||
281 | /// </remarks> | ||
282 | /// <returns></returns> | ||
283 | protected TaskInventoryItem GetSelfInventoryItem() | ||
271 | { | 284 | { |
272 | UUID invItemID = new UUID(); | ||
273 | |||
274 | lock (m_host.TaskInventory) | 285 | lock (m_host.TaskInventory) |
275 | { | 286 | return m_host.TaskInventory[m_itemID]; |
276 | foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) | ||
277 | { | ||
278 | if (inv.Value.Type == 10 && inv.Value.ItemID == m_itemID) | ||
279 | { | ||
280 | invItemID = inv.Key; | ||
281 | break; | ||
282 | } | ||
283 | } | ||
284 | } | ||
285 | |||
286 | return invItemID; | ||
287 | } | 287 | } |
288 | 288 | ||
289 | protected UUID InventoryKey(string name, int type) | 289 | protected UUID InventoryKey(string name, int type) |
@@ -832,8 +832,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
832 | 832 | ||
833 | public void llRegionSayTo(string target, int channel, string msg) | 833 | public void llRegionSayTo(string target, int channel, string msg) |
834 | { | 834 | { |
835 | string error = String.Empty; | ||
836 | |||
837 | if (msg.Length > 1023) | 835 | if (msg.Length > 1023) |
838 | msg = msg.Substring(0, 1023); | 836 | msg = msg.Substring(0, 1023); |
839 | 837 | ||
@@ -2701,18 +2699,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
2701 | 2699 | ||
2702 | public LSL_Integer llGiveMoney(string destination, int amount) | 2700 | public LSL_Integer llGiveMoney(string destination, int amount) |
2703 | { | 2701 | { |
2704 | UUID invItemID=InventorySelf(); | ||
2705 | if (invItemID == UUID.Zero) | ||
2706 | return 0; | ||
2707 | |||
2708 | m_host.AddScriptLPS(1); | 2702 | m_host.AddScriptLPS(1); |
2709 | 2703 | ||
2710 | TaskInventoryItem item = m_host.TaskInventory[invItemID]; | 2704 | TaskInventoryItem item = GetSelfInventoryItem(); |
2711 | |||
2712 | lock (m_host.TaskInventory) | ||
2713 | { | ||
2714 | item = m_host.TaskInventory[invItemID]; | ||
2715 | } | ||
2716 | 2705 | ||
2717 | if (item.PermsGranter == UUID.Zero) | 2706 | if (item.PermsGranter == UUID.Zero) |
2718 | return 0; | 2707 | return 0; |
@@ -2955,15 +2944,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
2955 | 2944 | ||
2956 | public void llTakeControls(int controls, int accept, int pass_on) | 2945 | public void llTakeControls(int controls, int accept, int pass_on) |
2957 | { | 2946 | { |
2958 | TaskInventoryItem item; | 2947 | TaskInventoryItem item = GetSelfInventoryItem(); |
2959 | |||
2960 | lock (m_host.TaskInventory) | ||
2961 | { | ||
2962 | if (!m_host.TaskInventory.ContainsKey(InventorySelf())) | ||
2963 | return; | ||
2964 | else | ||
2965 | item = m_host.TaskInventory[InventorySelf()]; | ||
2966 | } | ||
2967 | 2948 | ||
2968 | if (item.PermsGranter != UUID.Zero) | 2949 | if (item.PermsGranter != UUID.Zero) |
2969 | { | 2950 | { |
@@ -2983,18 +2964,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
2983 | 2964 | ||
2984 | public void llReleaseControls() | 2965 | public void llReleaseControls() |
2985 | { | 2966 | { |
2986 | TaskInventoryItem item; | ||
2987 | |||
2988 | lock (m_host.TaskInventory) | ||
2989 | { | ||
2990 | if (!m_host.TaskInventory.ContainsKey(InventorySelf())) | ||
2991 | return; | ||
2992 | else | ||
2993 | item = m_host.TaskInventory[InventorySelf()]; | ||
2994 | } | ||
2995 | |||
2996 | m_host.AddScriptLPS(1); | 2967 | m_host.AddScriptLPS(1); |
2997 | 2968 | ||
2969 | TaskInventoryItem item = GetSelfInventoryItem(); | ||
2970 | |||
2998 | if (item.PermsGranter != UUID.Zero) | 2971 | if (item.PermsGranter != UUID.Zero) |
2999 | { | 2972 | { |
3000 | ScenePresence presence = World.GetScenePresence(item.PermsGranter); | 2973 | ScenePresence presence = World.GetScenePresence(item.PermsGranter); |
@@ -3019,36 +2992,62 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
3019 | m_UrlModule.ReleaseURL(url); | 2992 | m_UrlModule.ReleaseURL(url); |
3020 | } | 2993 | } |
3021 | 2994 | ||
3022 | public void llAttachToAvatar(int attachment) | 2995 | /// <summary> |
2996 | /// Attach the object containing this script to the avatar that owns it. | ||
2997 | /// </summary> | ||
2998 | /// <param name='attachment'>The attachment point (e.g. ATTACH_CHEST)</param> | ||
2999 | /// <returns>true if the attach suceeded, false if it did not</returns> | ||
3000 | public bool AttachToAvatar(int attachmentPoint) | ||
3001 | { | ||
3002 | SceneObjectGroup grp = m_host.ParentGroup; | ||
3003 | ScenePresence presence = World.GetScenePresence(m_host.OwnerID); | ||
3004 | |||
3005 | IAttachmentsModule attachmentsModule = m_ScriptEngine.World.AttachmentsModule; | ||
3006 | |||
3007 | if (attachmentsModule != null) | ||
3008 | return attachmentsModule.AttachObject(presence, grp, (uint)attachmentPoint, false); | ||
3009 | else | ||
3010 | return false; | ||
3011 | } | ||
3012 | |||
3013 | /// <summary> | ||
3014 | /// Detach the object containing this script from the avatar it is attached to. | ||
3015 | /// </summary> | ||
3016 | /// <remarks> | ||
3017 | /// Nothing happens if the object is not attached. | ||
3018 | /// </remarks> | ||
3019 | public void DetachFromAvatar() | ||
3020 | { | ||
3021 | Util.FireAndForget(DetachWrapper, m_host); | ||
3022 | } | ||
3023 | |||
3024 | private void DetachWrapper(object o) | ||
3025 | { | ||
3026 | SceneObjectPart host = (SceneObjectPart)o; | ||
3027 | |||
3028 | SceneObjectGroup grp = host.ParentGroup; | ||
3029 | UUID itemID = grp.FromItemID; | ||
3030 | ScenePresence presence = World.GetScenePresence(host.OwnerID); | ||
3031 | |||
3032 | IAttachmentsModule attachmentsModule = m_ScriptEngine.World.AttachmentsModule; | ||
3033 | if (attachmentsModule != null) | ||
3034 | attachmentsModule.DetachSingleAttachmentToInv(presence, itemID); | ||
3035 | } | ||
3036 | |||
3037 | public void llAttachToAvatar(int attachmentPoint) | ||
3023 | { | 3038 | { |
3024 | m_host.AddScriptLPS(1); | 3039 | m_host.AddScriptLPS(1); |
3025 | 3040 | ||
3026 | // if (m_host.ParentGroup.RootPart.AttachmentPoint == 0) | 3041 | // if (m_host.ParentGroup.RootPart.AttachmentPoint == 0) |
3027 | // return; | 3042 | // return; |
3028 | 3043 | ||
3029 | TaskInventoryItem item; | 3044 | TaskInventoryItem item = GetSelfInventoryItem(); |
3030 | |||
3031 | lock (m_host.TaskInventory) | ||
3032 | { | ||
3033 | if (!m_host.TaskInventory.ContainsKey(InventorySelf())) | ||
3034 | return; | ||
3035 | else | ||
3036 | item = m_host.TaskInventory[InventorySelf()]; | ||
3037 | } | ||
3038 | 3045 | ||
3039 | if (item.PermsGranter != m_host.OwnerID) | 3046 | if (item.PermsGranter != m_host.OwnerID) |
3040 | return; | 3047 | return; |
3041 | 3048 | ||
3042 | if ((item.PermsMask & ScriptBaseClass.PERMISSION_ATTACH) != 0) | 3049 | if ((item.PermsMask & ScriptBaseClass.PERMISSION_ATTACH) != 0) |
3043 | { | 3050 | AttachToAvatar(attachmentPoint); |
3044 | SceneObjectGroup grp = m_host.ParentGroup; | ||
3045 | |||
3046 | ScenePresence presence = World.GetScenePresence(m_host.OwnerID); | ||
3047 | |||
3048 | IAttachmentsModule attachmentsModule = m_ScriptEngine.World.AttachmentsModule; | ||
3049 | if (attachmentsModule != null) | ||
3050 | attachmentsModule.AttachObject(presence, grp, (uint)attachment, false); | ||
3051 | } | ||
3052 | } | 3051 | } |
3053 | 3052 | ||
3054 | public void llDetachFromAvatar() | 3053 | public void llDetachFromAvatar() |
@@ -3058,38 +3057,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
3058 | if (m_host.ParentGroup.AttachmentPoint == 0) | 3057 | if (m_host.ParentGroup.AttachmentPoint == 0) |
3059 | return; | 3058 | return; |
3060 | 3059 | ||
3061 | TaskInventoryItem item; | 3060 | TaskInventoryItem item = GetSelfInventoryItem(); |
3062 | |||
3063 | lock (m_host.TaskInventory) | ||
3064 | { | ||
3065 | if (!m_host.TaskInventory.ContainsKey(InventorySelf())) | ||
3066 | return; | ||
3067 | else | ||
3068 | item = m_host.TaskInventory[InventorySelf()]; | ||
3069 | } | ||
3070 | 3061 | ||
3071 | if (item.PermsGranter != m_host.OwnerID) | 3062 | if (item.PermsGranter != m_host.OwnerID) |
3072 | return; | 3063 | return; |
3073 | 3064 | ||
3074 | if ((item.PermsMask & ScriptBaseClass.PERMISSION_ATTACH) != 0) | 3065 | if ((item.PermsMask & ScriptBaseClass.PERMISSION_ATTACH) != 0) |
3075 | { | 3066 | DetachFromAvatar(); |
3076 | IAttachmentsModule attachmentsModule = m_ScriptEngine.World.AttachmentsModule; | ||
3077 | if (attachmentsModule != null) | ||
3078 | Util.FireAndForget(DetachWrapper, m_host); | ||
3079 | } | ||
3080 | } | ||
3081 | |||
3082 | private void DetachWrapper(object o) | ||
3083 | { | ||
3084 | SceneObjectPart host = (SceneObjectPart)o; | ||
3085 | |||
3086 | SceneObjectGroup grp = host.ParentGroup; | ||
3087 | UUID itemID = grp.FromItemID; | ||
3088 | ScenePresence presence = World.GetScenePresence(host.OwnerID); | ||
3089 | |||
3090 | IAttachmentsModule attachmentsModule = m_ScriptEngine.World.AttachmentsModule; | ||
3091 | if (attachmentsModule != null) | ||
3092 | attachmentsModule.DetachSingleAttachmentToInv(presence, itemID); | ||
3093 | } | 3067 | } |
3094 | 3068 | ||
3095 | public void llTakeCamera(string avatar) | 3069 | public void llTakeCamera(string avatar) |
@@ -3317,19 +3291,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
3317 | { | 3291 | { |
3318 | m_host.AddScriptLPS(1); | 3292 | m_host.AddScriptLPS(1); |
3319 | 3293 | ||
3320 | UUID invItemID = InventorySelf(); | 3294 | TaskInventoryItem item = GetSelfInventoryItem(); |
3321 | if (invItemID == UUID.Zero) | ||
3322 | return; | ||
3323 | |||
3324 | TaskInventoryItem item; | ||
3325 | |||
3326 | lock (m_host.TaskInventory) | ||
3327 | { | ||
3328 | if (!m_host.TaskInventory.ContainsKey(InventorySelf())) | ||
3329 | return; | ||
3330 | else | ||
3331 | item = m_host.TaskInventory[InventorySelf()]; | ||
3332 | } | ||
3333 | 3295 | ||
3334 | if (item.PermsGranter == UUID.Zero) | 3296 | if (item.PermsGranter == UUID.Zero) |
3335 | return; | 3297 | return; |
@@ -3354,19 +3316,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
3354 | { | 3316 | { |
3355 | m_host.AddScriptLPS(1); | 3317 | m_host.AddScriptLPS(1); |
3356 | 3318 | ||
3357 | UUID invItemID=InventorySelf(); | 3319 | TaskInventoryItem item = GetSelfInventoryItem(); |
3358 | if (invItemID == UUID.Zero) | ||
3359 | return; | ||
3360 | |||
3361 | TaskInventoryItem item; | ||
3362 | |||
3363 | lock (m_host.TaskInventory) | ||
3364 | { | ||
3365 | if (!m_host.TaskInventory.ContainsKey(InventorySelf())) | ||
3366 | return; | ||
3367 | else | ||
3368 | item = m_host.TaskInventory[InventorySelf()]; | ||
3369 | } | ||
3370 | 3320 | ||
3371 | if (item.PermsGranter == UUID.Zero) | 3321 | if (item.PermsGranter == UUID.Zero) |
3372 | return; | 3322 | return; |
@@ -3421,22 +3371,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
3421 | 3371 | ||
3422 | public void llRequestPermissions(string agent, int perm) | 3372 | public void llRequestPermissions(string agent, int perm) |
3423 | { | 3373 | { |
3424 | UUID agentID = new UUID(); | 3374 | UUID agentID; |
3425 | 3375 | ||
3426 | if (!UUID.TryParse(agent, out agentID)) | 3376 | if (!UUID.TryParse(agent, out agentID)) |
3427 | return; | 3377 | return; |
3428 | 3378 | ||
3429 | UUID invItemID = InventorySelf(); | 3379 | TaskInventoryItem item = GetSelfInventoryItem(); |
3430 | |||
3431 | if (invItemID == UUID.Zero) | ||
3432 | return; // Not in a prim? How?? | ||
3433 | |||
3434 | TaskInventoryItem item; | ||
3435 | |||
3436 | lock (m_host.TaskInventory) | ||
3437 | { | ||
3438 | item = m_host.TaskInventory[invItemID]; | ||
3439 | } | ||
3440 | 3380 | ||
3441 | if (agentID == UUID.Zero || perm == 0) // Releasing permissions | 3381 | if (agentID == UUID.Zero || perm == 0) // Releasing permissions |
3442 | { | 3382 | { |
@@ -3470,8 +3410,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
3470 | { | 3410 | { |
3471 | lock (m_host.TaskInventory) | 3411 | lock (m_host.TaskInventory) |
3472 | { | 3412 | { |
3473 | m_host.TaskInventory[invItemID].PermsGranter = agentID; | 3413 | m_host.TaskInventory[m_itemID].PermsGranter = agentID; |
3474 | m_host.TaskInventory[invItemID].PermsMask = perm; | 3414 | m_host.TaskInventory[m_itemID].PermsMask = perm; |
3475 | } | 3415 | } |
3476 | 3416 | ||
3477 | m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams( | 3417 | m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams( |
@@ -3494,8 +3434,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
3494 | { | 3434 | { |
3495 | lock (m_host.TaskInventory) | 3435 | lock (m_host.TaskInventory) |
3496 | { | 3436 | { |
3497 | m_host.TaskInventory[invItemID].PermsGranter = agentID; | 3437 | m_host.TaskInventory[m_itemID].PermsGranter = agentID; |
3498 | m_host.TaskInventory[invItemID].PermsMask = perm; | 3438 | m_host.TaskInventory[m_itemID].PermsMask = perm; |
3499 | } | 3439 | } |
3500 | 3440 | ||
3501 | m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams( | 3441 | m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams( |
@@ -3519,8 +3459,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
3519 | { | 3459 | { |
3520 | lock (m_host.TaskInventory) | 3460 | lock (m_host.TaskInventory) |
3521 | { | 3461 | { |
3522 | m_host.TaskInventory[invItemID].PermsGranter = agentID; | 3462 | m_host.TaskInventory[m_itemID].PermsGranter = agentID; |
3523 | m_host.TaskInventory[invItemID].PermsMask = 0; | 3463 | m_host.TaskInventory[m_itemID].PermsMask = 0; |
3524 | } | 3464 | } |
3525 | 3465 | ||
3526 | presence.ControllingClient.OnScriptAnswer += handleScriptAnswer; | 3466 | presence.ControllingClient.OnScriptAnswer += handleScriptAnswer; |
@@ -3528,7 +3468,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
3528 | } | 3468 | } |
3529 | 3469 | ||
3530 | presence.ControllingClient.SendScriptQuestion( | 3470 | presence.ControllingClient.SendScriptQuestion( |
3531 | m_host.UUID, m_host.ParentGroup.RootPart.Name, ownerName, invItemID, perm); | 3471 | m_host.UUID, m_host.ParentGroup.RootPart.Name, ownerName, m_itemID, perm); |
3532 | 3472 | ||
3533 | return; | 3473 | return; |
3534 | } | 3474 | } |
@@ -3545,20 +3485,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
3545 | if (taskID != m_host.UUID) | 3485 | if (taskID != m_host.UUID) |
3546 | return; | 3486 | return; |
3547 | 3487 | ||
3548 | UUID invItemID = InventorySelf(); | 3488 | client.OnScriptAnswer -= handleScriptAnswer; |
3549 | 3489 | m_waitingForScriptAnswer = false; | |
3550 | if (invItemID == UUID.Zero) | ||
3551 | return; | ||
3552 | |||
3553 | client.OnScriptAnswer-=handleScriptAnswer; | ||
3554 | m_waitingForScriptAnswer=false; | ||
3555 | 3490 | ||
3556 | if ((answer & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) == 0) | 3491 | if ((answer & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) == 0) |
3557 | llReleaseControls(); | 3492 | llReleaseControls(); |
3558 | 3493 | ||
3559 | lock (m_host.TaskInventory) | 3494 | lock (m_host.TaskInventory) |
3560 | { | 3495 | { |
3561 | m_host.TaskInventory[invItemID].PermsMask = answer; | 3496 | m_host.TaskInventory[m_itemID].PermsMask = answer; |
3562 | } | 3497 | } |
3563 | 3498 | ||
3564 | m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams( | 3499 | m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams( |
@@ -3571,39 +3506,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
3571 | { | 3506 | { |
3572 | m_host.AddScriptLPS(1); | 3507 | m_host.AddScriptLPS(1); |
3573 | 3508 | ||
3574 | lock (m_host.TaskInventory) | 3509 | return GetSelfInventoryItem().PermsGranter.ToString(); |
3575 | { | ||
3576 | foreach (TaskInventoryItem item in m_host.TaskInventory.Values) | ||
3577 | { | ||
3578 | if (item.Type == 10 && item.ItemID == m_itemID) | ||
3579 | { | ||
3580 | return item.PermsGranter.ToString(); | ||
3581 | } | ||
3582 | } | ||
3583 | } | ||
3584 | |||
3585 | return UUID.Zero.ToString(); | ||
3586 | } | 3510 | } |
3587 | 3511 | ||
3588 | public LSL_Integer llGetPermissions() | 3512 | public LSL_Integer llGetPermissions() |
3589 | { | 3513 | { |
3590 | m_host.AddScriptLPS(1); | 3514 | m_host.AddScriptLPS(1); |
3591 | 3515 | ||
3592 | lock (m_host.TaskInventory) | 3516 | int perms = GetSelfInventoryItem().PermsMask; |
3593 | { | ||
3594 | foreach (TaskInventoryItem item in m_host.TaskInventory.Values) | ||
3595 | { | ||
3596 | if (item.Type == 10 && item.ItemID == m_itemID) | ||
3597 | { | ||
3598 | int perms = item.PermsMask; | ||
3599 | if (m_automaticLinkPermission) | ||
3600 | perms |= ScriptBaseClass.PERMISSION_CHANGE_LINKS; | ||
3601 | return perms; | ||
3602 | } | ||
3603 | } | ||
3604 | } | ||
3605 | 3517 | ||
3606 | return 0; | 3518 | if (m_automaticLinkPermission) |
3519 | perms |= ScriptBaseClass.PERMISSION_CHANGE_LINKS; | ||
3520 | |||
3521 | return perms; | ||
3607 | } | 3522 | } |
3608 | 3523 | ||
3609 | public LSL_Integer llGetLinkNumber() | 3524 | public LSL_Integer llGetLinkNumber() |
@@ -3631,17 +3546,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
3631 | public void llCreateLink(string target, int parent) | 3546 | public void llCreateLink(string target, int parent) |
3632 | { | 3547 | { |
3633 | m_host.AddScriptLPS(1); | 3548 | m_host.AddScriptLPS(1); |
3634 | UUID invItemID = InventorySelf(); | ||
3635 | UUID targetID; | 3549 | UUID targetID; |
3636 | 3550 | ||
3637 | if (!UUID.TryParse(target, out targetID)) | 3551 | if (!UUID.TryParse(target, out targetID)) |
3638 | return; | 3552 | return; |
3639 | 3553 | ||
3640 | TaskInventoryItem item; | 3554 | TaskInventoryItem item = GetSelfInventoryItem(); |
3641 | lock (m_host.TaskInventory) | ||
3642 | { | ||
3643 | item = m_host.TaskInventory[invItemID]; | ||
3644 | } | ||
3645 | 3555 | ||
3646 | if ((item.PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0 | 3556 | if ((item.PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0 |
3647 | && !m_automaticLinkPermission) | 3557 | && !m_automaticLinkPermission) |
@@ -3659,11 +3569,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
3659 | 3569 | ||
3660 | if (targetPart.ParentGroup.AttachmentPoint != 0) | 3570 | if (targetPart.ParentGroup.AttachmentPoint != 0) |
3661 | return; // Fail silently if attached | 3571 | return; // Fail silently if attached |
3572 | |||
3573 | if (targetPart.ParentGroup.RootPart.OwnerID != m_host.ParentGroup.RootPart.OwnerID) | ||
3574 | return; | ||
3575 | |||
3662 | SceneObjectGroup parentPrim = null, childPrim = null; | 3576 | SceneObjectGroup parentPrim = null, childPrim = null; |
3663 | 3577 | ||
3664 | if (targetPart != null) | 3578 | if (targetPart != null) |
3665 | { | 3579 | { |
3666 | if (parent != 0) { | 3580 | if (parent != 0) |
3581 | { | ||
3667 | parentPrim = m_host.ParentGroup; | 3582 | parentPrim = m_host.ParentGroup; |
3668 | childPrim = targetPart.ParentGroup; | 3583 | childPrim = targetPart.ParentGroup; |
3669 | } | 3584 | } |
@@ -3675,7 +3590,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
3675 | 3590 | ||
3676 | // Required for linking | 3591 | // Required for linking |
3677 | childPrim.RootPart.ClearUpdateSchedule(); | 3592 | childPrim.RootPart.ClearUpdateSchedule(); |
3678 | parentPrim.LinkToGroup(childPrim); | 3593 | parentPrim.LinkToGroup(childPrim, true); |
3679 | } | 3594 | } |
3680 | 3595 | ||
3681 | parentPrim.TriggerScriptChangedEvent(Changed.LINK); | 3596 | parentPrim.TriggerScriptChangedEvent(Changed.LINK); |
@@ -3692,16 +3607,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
3692 | public void llBreakLink(int linknum) | 3607 | public void llBreakLink(int linknum) |
3693 | { | 3608 | { |
3694 | m_host.AddScriptLPS(1); | 3609 | m_host.AddScriptLPS(1); |
3695 | UUID invItemID = InventorySelf(); | ||
3696 | 3610 | ||
3697 | lock (m_host.TaskInventory) | 3611 | if ((GetSelfInventoryItem().PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0 |
3612 | && !m_automaticLinkPermission) | ||
3698 | { | 3613 | { |
3699 | if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0 | 3614 | ShoutError("Script trying to link but PERMISSION_CHANGE_LINKS permission not set!"); |
3700 | && !m_automaticLinkPermission) | 3615 | return; |
3701 | { | ||
3702 | ShoutError("Script trying to link but PERMISSION_CHANGE_LINKS permission not set!"); | ||
3703 | return; | ||
3704 | } | ||
3705 | } | 3616 | } |
3706 | 3617 | ||
3707 | if (linknum < ScriptBaseClass.LINK_THIS) | 3618 | if (linknum < ScriptBaseClass.LINK_THIS) |
@@ -4578,23 +4489,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
4578 | 4489 | ||
4579 | public LSL_String llGetScriptName() | 4490 | public LSL_String llGetScriptName() |
4580 | { | 4491 | { |
4581 | string result = String.Empty; | ||
4582 | |||
4583 | m_host.AddScriptLPS(1); | 4492 | m_host.AddScriptLPS(1); |
4584 | 4493 | ||
4585 | lock (m_host.TaskInventory) | 4494 | TaskInventoryItem item = GetSelfInventoryItem(); |
4586 | { | ||
4587 | foreach (TaskInventoryItem item in m_host.TaskInventory.Values) | ||
4588 | { | ||
4589 | if (item.Type == 10 && item.ItemID == m_itemID) | ||
4590 | { | ||
4591 | result = item.Name != null ? item.Name : String.Empty; | ||
4592 | break; | ||
4593 | } | ||
4594 | } | ||
4595 | } | ||
4596 | 4495 | ||
4597 | return result; | 4496 | return item.Name != null ? item.Name : String.Empty; |
4598 | } | 4497 | } |
4599 | 4498 | ||
4600 | public LSL_Integer llGetLinkNumberOfSides(int link) | 4499 | public LSL_Integer llGetLinkNumberOfSides(int link) |
@@ -9695,21 +9594,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
9695 | public LSL_Vector llGetCameraPos() | 9594 | public LSL_Vector llGetCameraPos() |
9696 | { | 9595 | { |
9697 | m_host.AddScriptLPS(1); | 9596 | m_host.AddScriptLPS(1); |
9698 | UUID invItemID = InventorySelf(); | ||
9699 | 9597 | ||
9700 | if (invItemID == UUID.Zero) | 9598 | TaskInventoryItem item = GetSelfInventoryItem(); |
9701 | return new LSL_Vector(); | ||
9702 | 9599 | ||
9703 | lock (m_host.TaskInventory) | 9600 | if (item.PermsGranter == UUID.Zero) |
9704 | { | 9601 | return new LSL_Vector(); |
9705 | if (m_host.TaskInventory[invItemID].PermsGranter == UUID.Zero) | ||
9706 | return new LSL_Vector(); | ||
9707 | 9602 | ||
9708 | if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_TRACK_CAMERA) == 0) | 9603 | if ((item.PermsMask & ScriptBaseClass.PERMISSION_TRACK_CAMERA) == 0) |
9709 | { | 9604 | { |
9710 | ShoutError("No permissions to track the camera"); | 9605 | ShoutError("No permissions to track the camera"); |
9711 | return new LSL_Vector(); | 9606 | return new LSL_Vector(); |
9712 | } | ||
9713 | } | 9607 | } |
9714 | 9608 | ||
9715 | ScenePresence presence = World.GetScenePresence(m_host.OwnerID); | 9609 | ScenePresence presence = World.GetScenePresence(m_host.OwnerID); |
@@ -9724,20 +9618,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
9724 | public LSL_Rotation llGetCameraRot() | 9618 | public LSL_Rotation llGetCameraRot() |
9725 | { | 9619 | { |
9726 | m_host.AddScriptLPS(1); | 9620 | m_host.AddScriptLPS(1); |
9727 | UUID invItemID = InventorySelf(); | ||
9728 | if (invItemID == UUID.Zero) | ||
9729 | return new LSL_Rotation(); | ||
9730 | 9621 | ||
9731 | lock (m_host.TaskInventory) | 9622 | TaskInventoryItem item = GetSelfInventoryItem(); |
9732 | { | ||
9733 | if (m_host.TaskInventory[invItemID].PermsGranter == UUID.Zero) | ||
9734 | return new LSL_Rotation(); | ||
9735 | 9623 | ||
9736 | if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_TRACK_CAMERA) == 0) | 9624 | if (item.PermsGranter == UUID.Zero) |
9737 | { | 9625 | return new LSL_Rotation(); |
9738 | ShoutError("No permissions to track the camera"); | 9626 | |
9739 | return new LSL_Rotation(); | 9627 | if ((item.PermsMask & ScriptBaseClass.PERMISSION_TRACK_CAMERA) == 0) |
9740 | } | 9628 | { |
9629 | ShoutError("No permissions to track the camera"); | ||
9630 | return new LSL_Rotation(); | ||
9741 | } | 9631 | } |
9742 | 9632 | ||
9743 | ScenePresence presence = World.GetScenePresence(m_host.OwnerID); | 9633 | ScenePresence presence = World.GetScenePresence(m_host.OwnerID); |
@@ -9911,23 +9801,21 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
9911 | { | 9801 | { |
9912 | m_host.AddScriptLPS(1); | 9802 | m_host.AddScriptLPS(1); |
9913 | 9803 | ||
9914 | // our key in the object we are in | ||
9915 | UUID invItemID = InventorySelf(); | ||
9916 | if (invItemID == UUID.Zero) return; | ||
9917 | |||
9918 | // the object we are in | 9804 | // the object we are in |
9919 | UUID objectID = m_host.ParentUUID; | 9805 | UUID objectID = m_host.ParentUUID; |
9920 | if (objectID == UUID.Zero) return; | 9806 | if (objectID == UUID.Zero) |
9807 | return; | ||
9921 | 9808 | ||
9922 | UUID agentID; | 9809 | TaskInventoryItem item = GetSelfInventoryItem(); |
9923 | lock (m_host.TaskInventory) | ||
9924 | { | ||
9925 | // we need the permission first, to know which avatar we want to set the camera for | ||
9926 | agentID = m_host.TaskInventory[invItemID].PermsGranter; | ||
9927 | 9810 | ||
9928 | if (agentID == UUID.Zero) return; | 9811 | // we need the permission first, to know which avatar we want to set the camera for |
9929 | if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_CONTROL_CAMERA) == 0) return; | 9812 | UUID agentID = item.PermsGranter; |
9930 | } | 9813 | |
9814 | if (agentID == UUID.Zero) | ||
9815 | return; | ||
9816 | |||
9817 | if ((item.PermsMask & ScriptBaseClass.PERMISSION_CONTROL_CAMERA) == 0) | ||
9818 | return; | ||
9931 | 9819 | ||
9932 | ScenePresence presence = World.GetScenePresence(agentID); | 9820 | ScenePresence presence = World.GetScenePresence(agentID); |
9933 | 9821 | ||
@@ -9967,27 +9855,27 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
9967 | { | 9855 | { |
9968 | m_host.AddScriptLPS(1); | 9856 | m_host.AddScriptLPS(1); |
9969 | 9857 | ||
9970 | // our key in the object we are in | ||
9971 | UUID invItemID=InventorySelf(); | ||
9972 | if (invItemID == UUID.Zero) return; | ||
9973 | |||
9974 | // the object we are in | 9858 | // the object we are in |
9975 | UUID objectID = m_host.ParentUUID; | 9859 | UUID objectID = m_host.ParentUUID; |
9976 | if (objectID == UUID.Zero) return; | 9860 | if (objectID == UUID.Zero) |
9861 | return; | ||
9862 | |||
9863 | TaskInventoryItem item = GetSelfInventoryItem(); | ||
9977 | 9864 | ||
9978 | // we need the permission first, to know which avatar we want to clear the camera for | 9865 | // we need the permission first, to know which avatar we want to clear the camera for |
9979 | UUID agentID; | 9866 | UUID agentID = item.PermsGranter; |
9980 | lock (m_host.TaskInventory) | 9867 | |
9981 | { | 9868 | if (agentID == UUID.Zero) |
9982 | agentID = m_host.TaskInventory[invItemID].PermsGranter; | 9869 | return; |
9983 | if (agentID == UUID.Zero) return; | 9870 | |
9984 | if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_CONTROL_CAMERA) == 0) return; | 9871 | if ((item.PermsMask & ScriptBaseClass.PERMISSION_CONTROL_CAMERA) == 0) |
9985 | } | 9872 | return; |
9986 | 9873 | ||
9987 | ScenePresence presence = World.GetScenePresence(agentID); | 9874 | ScenePresence presence = World.GetScenePresence(agentID); |
9988 | 9875 | ||
9989 | // we are not interested in child-agents | 9876 | // we are not interested in child-agents |
9990 | if (presence.IsChildAgent) return; | 9877 | if (presence.IsChildAgent) |
9878 | return; | ||
9991 | 9879 | ||
9992 | presence.ControllingClient.SendClearFollowCamProperties(objectID); | 9880 | presence.ControllingClient.SendClearFollowCamProperties(objectID); |
9993 | } | 9881 | } |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs index 890115d..893fda1 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs | |||
@@ -209,6 +209,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
209 | throw new Exception("OSSL Runtime Error: " + msg); | 209 | throw new Exception("OSSL Runtime Error: " + msg); |
210 | } | 210 | } |
211 | 211 | ||
212 | /// <summary> | ||
213 | /// Initialize the LSL interface. | ||
214 | /// </summary> | ||
215 | /// <remarks> | ||
216 | /// FIXME: This is an abomination. We should be able to set this up earlier but currently we have no | ||
217 | /// guarantee the interface is present on Initialize(). There needs to be another post initialize call from | ||
218 | /// ScriptInstance. | ||
219 | /// </remarks> | ||
212 | private void InitLSL() | 220 | private void InitLSL() |
213 | { | 221 | { |
214 | if (m_LSL_Api != null) | 222 | if (m_LSL_Api != null) |
@@ -1609,7 +1617,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1609 | 1617 | ||
1610 | public Object osParseJSONNew(string JSON) | 1618 | public Object osParseJSONNew(string JSON) |
1611 | { | 1619 | { |
1612 | CheckThreatLevel(ThreatLevel.None, "osParseJSON"); | 1620 | CheckThreatLevel(ThreatLevel.None, "osParseJSONNew"); |
1613 | 1621 | ||
1614 | m_host.AddScriptLPS(1); | 1622 | m_host.AddScriptLPS(1); |
1615 | 1623 | ||
@@ -3132,5 +3140,25 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
3132 | estate.setEstateTerrainTextureHeights(corner, (float)low, (float)high); | 3140 | estate.setEstateTerrainTextureHeights(corner, (float)low, (float)high); |
3133 | } | 3141 | } |
3134 | } | 3142 | } |
3143 | |||
3144 | public void osForceAttachToAvatar(int attachmentPoint) | ||
3145 | { | ||
3146 | CheckThreatLevel(ThreatLevel.High, "osForceAttachToAvatar"); | ||
3147 | |||
3148 | m_host.AddScriptLPS(1); | ||
3149 | |||
3150 | InitLSL(); | ||
3151 | ((LSL_Api)m_LSL_Api).AttachToAvatar(attachmentPoint); | ||
3152 | } | ||
3153 | |||
3154 | public void osForceDetachFromAvatar() | ||
3155 | { | ||
3156 | CheckThreatLevel(ThreatLevel.High, "osForceDetachFromAvatar"); | ||
3157 | |||
3158 | m_host.AddScriptLPS(1); | ||
3159 | |||
3160 | InitLSL(); | ||
3161 | ((LSL_Api)m_LSL_Api).DetachFromAvatar(); | ||
3162 | } | ||
3135 | } | 3163 | } |
3136 | } \ No newline at end of file | 3164 | } \ No newline at end of file |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs index 2d3e8e8..e92518d 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs | |||
@@ -98,6 +98,20 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces | |||
98 | void osAvatarPlayAnimation(string avatar, string animation); | 98 | void osAvatarPlayAnimation(string avatar, string animation); |
99 | void osAvatarStopAnimation(string avatar, string animation); | 99 | void osAvatarStopAnimation(string avatar, string animation); |
100 | 100 | ||
101 | // Attachment commands | ||
102 | |||
103 | /// <summary> | ||
104 | /// Attach the object containing this script to the avatar that owns it without checking for PERMISSION_ATTACH | ||
105 | /// </summary> | ||
106 | /// <param name='attachment'>The attachment point. For example, ATTACH_CHEST</param> | ||
107 | void osForceAttachToAvatar(int attachment); | ||
108 | |||
109 | /// <summary> | ||
110 | /// Detach the object containing this script from the avatar it is attached to without checking for PERMISSION_ATTACH | ||
111 | /// </summary> | ||
112 | /// <remarks>Nothing happens if the object is not attached.</remarks> | ||
113 | void osForceDetachFromAvatar(); | ||
114 | |||
101 | //texture draw functions | 115 | //texture draw functions |
102 | string osMovePen(string drawList, int x, int y); | 116 | string osMovePen(string drawList, int x, int y); |
103 | string osDrawLine(string drawList, int startX, int startY, int endX, int endY); | 117 | string osDrawLine(string drawList, int startX, int startY, int endX, int endY); |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs index e836959..d230662 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs | |||
@@ -289,8 +289,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase | |||
289 | m_OSSL_Functions.osAvatarStopAnimation(avatar, animation); | 289 | m_OSSL_Functions.osAvatarStopAnimation(avatar, animation); |
290 | } | 290 | } |
291 | 291 | ||
292 | // Avatar functions | ||
292 | 293 | ||
293 | //Texture Draw functions | 294 | public void osForceAttachToAvatar(int attachmentPoint) |
295 | { | ||
296 | m_OSSL_Functions.osForceAttachToAvatar(attachmentPoint); | ||
297 | } | ||
298 | |||
299 | public void osForceDetachFromAvatar() | ||
300 | { | ||
301 | m_OSSL_Functions.osForceDetachFromAvatar(); | ||
302 | } | ||
303 | |||
304 | // Texture Draw functions | ||
294 | 305 | ||
295 | public string osMovePen(string drawList, int x, int y) | 306 | public string osMovePen(string drawList, int x, int y) |
296 | { | 307 | { |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs index 6e36742..2c8af81 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs | |||
@@ -964,7 +964,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance | |||
964 | public IScriptApi GetApi(string name) | 964 | public IScriptApi GetApi(string name) |
965 | { | 965 | { |
966 | if (m_Apis.ContainsKey(name)) | 966 | if (m_Apis.ContainsKey(name)) |
967 | { | ||
968 | // m_log.DebugFormat("[SCRIPT INSTANCE]: Found api {0} in {1}@{2}", name, ScriptName, PrimName); | ||
969 | |||
967 | return m_Apis[name]; | 970 | return m_Apis[name]; |
971 | } | ||
972 | |||
973 | // m_log.DebugFormat("[SCRIPT INSTANCE]: Did not find api {0} in {1}@{2}", name, ScriptName, PrimName); | ||
974 | |||
968 | return null; | 975 | return null; |
969 | } | 976 | } |
970 | 977 | ||
diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs index 23a4cf9..a9b6e67 100644 --- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs +++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs | |||
@@ -1812,9 +1812,11 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
1812 | // if there already exists a file at that location, it may be locked. | 1812 | // if there already exists a file at that location, it may be locked. |
1813 | m_log.ErrorFormat("[XEngine]: File {0} already exists! {1}", path, ex.Message); | 1813 | m_log.ErrorFormat("[XEngine]: File {0} already exists! {1}", path, ex.Message); |
1814 | } | 1814 | } |
1815 | |||
1816 | string textpath = path + ".text"; | ||
1815 | try | 1817 | try |
1816 | { | 1818 | { |
1817 | using (FileStream fs = File.Create(path + ".text")) | 1819 | using (FileStream fs = File.Create(textpath)) |
1818 | { | 1820 | { |
1819 | using (StreamWriter sw = new StreamWriter(fs)) | 1821 | using (StreamWriter sw = new StreamWriter(fs)) |
1820 | { | 1822 | { |
@@ -1827,7 +1829,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
1827 | catch (IOException ex) | 1829 | catch (IOException ex) |
1828 | { | 1830 | { |
1829 | // if there already exists a file at that location, it may be locked. | 1831 | // if there already exists a file at that location, it may be locked. |
1830 | m_log.ErrorFormat("[XEngine]: File {0} already exists! {1}", path, ex.Message); | 1832 | m_log.ErrorFormat("[XEngine]: File {0} already exists! {1}", textpath, ex.Message); |
1831 | } | 1833 | } |
1832 | } | 1834 | } |
1833 | } | 1835 | } |
@@ -1876,7 +1878,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
1876 | catch (IOException ex) | 1878 | catch (IOException ex) |
1877 | { | 1879 | { |
1878 | // if there already exists a file at that location, it may be locked. | 1880 | // if there already exists a file at that location, it may be locked. |
1879 | m_log.ErrorFormat("[XEngine]: File {0} already exists! {1}", statepath, ex.Message); | 1881 | m_log.ErrorFormat("[XEngine]: File {0} already exists! {1}", mappath, ex.Message); |
1880 | } | 1882 | } |
1881 | } | 1883 | } |
1882 | 1884 | ||
diff --git a/OpenSim/Server/Base/ServerUtils.cs b/OpenSim/Server/Base/ServerUtils.cs index 8effdd2..0cc2a4b 100644 --- a/OpenSim/Server/Base/ServerUtils.cs +++ b/OpenSim/Server/Base/ServerUtils.cs | |||
@@ -117,7 +117,10 @@ namespace OpenSim.Server.Base | |||
117 | catch (Exception e) | 117 | catch (Exception e) |
118 | { | 118 | { |
119 | if (!(e is System.MissingMethodException)) | 119 | if (!(e is System.MissingMethodException)) |
120 | m_log.ErrorFormat("Error loading plugin from {0}, exception {1}", dllName, e.InnerException); | 120 | { |
121 | m_log.ErrorFormat("Error loading plugin {0} from {1}. Exception: {2}", | ||
122 | interfaceName, dllName, e.InnerException == null ? e.Message : e.InnerException.Message); | ||
123 | } | ||
121 | return null; | 124 | return null; |
122 | } | 125 | } |
123 | 126 | ||
diff --git a/OpenSim/Services/AvatarService/AvatarService.cs b/OpenSim/Services/AvatarService/AvatarService.cs index c59a9e0..423c781 100644 --- a/OpenSim/Services/AvatarService/AvatarService.cs +++ b/OpenSim/Services/AvatarService/AvatarService.cs | |||
@@ -93,7 +93,7 @@ namespace OpenSim.Services.AvatarService | |||
93 | if (kvp.Key.StartsWith("_")) | 93 | if (kvp.Key.StartsWith("_")) |
94 | count++; | 94 | count++; |
95 | 95 | ||
96 | m_log.DebugFormat("[AVATAR SERVICE]: SetAvatar for {0}, attachs={1}", principalID, count); | 96 | // m_log.DebugFormat("[AVATAR SERVICE]: SetAvatar for {0}, attachs={1}", principalID, count); |
97 | m_Database.Delete("PrincipalID", principalID.ToString()); | 97 | m_Database.Delete("PrincipalID", principalID.ToString()); |
98 | 98 | ||
99 | AvatarBaseData av = new AvatarBaseData(); | 99 | AvatarBaseData av = new AvatarBaseData(); |
diff --git a/OpenSim/Services/LLLoginService/LLLoginResponse.cs b/OpenSim/Services/LLLoginService/LLLoginResponse.cs index 844c5ae..01de159 100644 --- a/OpenSim/Services/LLLoginService/LLLoginResponse.cs +++ b/OpenSim/Services/LLLoginService/LLLoginResponse.cs | |||
@@ -349,7 +349,31 @@ namespace OpenSim.Services.LLLoginService | |||
349 | 349 | ||
350 | private void SetDefaultValues() | 350 | private void SetDefaultValues() |
351 | { | 351 | { |
352 | DST = TimeZone.CurrentTimeZone.IsDaylightSavingTime(DateTime.Now) ? "Y" : "N"; | 352 | TimeZoneInfo gridTimeZone; |
353 | |||
354 | // Disabled for now pending making timezone a config value, which can at some point have a default of | ||
355 | // a ; separated list of possible timezones. | ||
356 | // The problem here is that US/Pacific (or even the Olsen America/Los_Angeles) is not universal across | ||
357 | // windows, mac and various distributions of linux, introducing another element of consistency. | ||
358 | // The server operator needs to be able to control this setting | ||
359 | // try | ||
360 | // { | ||
361 | // // First try to fetch DST from Pacific Standard Time, because this is | ||
362 | // // the one expected by the viewer. "US/Pacific" is the string to search | ||
363 | // // on linux and mac, and should work also on Windows (to confirm) | ||
364 | // gridTimeZone = TimeZoneInfo.FindSystemTimeZoneById("US/Pacific"); | ||
365 | // } | ||
366 | // catch (Exception e) | ||
367 | // { | ||
368 | // m_log.WarnFormat( | ||
369 | // "[TIMEZONE]: {0} Falling back to system time. System time should be set to Pacific Standard Time to provide the expected time", | ||
370 | // e.Message); | ||
371 | |||
372 | gridTimeZone = TimeZoneInfo.Local; | ||
373 | // } | ||
374 | |||
375 | DST = gridTimeZone.IsDaylightSavingTime(DateTime.Now) ? "Y" : "N"; | ||
376 | |||
353 | StipendSinceLogin = "N"; | 377 | StipendSinceLogin = "N"; |
354 | Gendered = "Y"; | 378 | Gendered = "Y"; |
355 | EverLoggedIn = "Y"; | 379 | EverLoggedIn = "Y"; |
diff --git a/bin/OpenSimDefaults.ini b/bin/OpenSimDefaults.ini index 3f2f131..cb9ef22 100644 --- a/bin/OpenSimDefaults.ini +++ b/bin/OpenSimDefaults.ini | |||
@@ -337,6 +337,13 @@ | |||
337 | ; OpenJPEG if false | 337 | ; OpenJPEG if false |
338 | ; UseCSJ2K = true | 338 | ; UseCSJ2K = true |
339 | 339 | ||
340 | |||
341 | ; Use "Trash" folder for items deleted from the scene | ||
342 | ; When set to True (the default) items deleted from the scene will be | ||
343 | ; stored in the user's trash or lost and found folder. When set to | ||
344 | ; False items will be removed from the scene permanently | ||
345 | UseTrashOnDelete = True | ||
346 | |||
340 | ; Persist avatar baked textures | 347 | ; Persist avatar baked textures |
341 | ; Persisting baked textures can speed up login and region border | 348 | ; Persisting baked textures can speed up login and region border |
342 | ; crossings especially with large numbers of users, though it | 349 | ; crossings especially with large numbers of users, though it |