aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Framework/Scenes
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--OpenSim/Region/Framework/Scenes/EventManager.cs29
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.cs38
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs11
-rw-r--r--OpenSim/Region/Framework/Scenes/ScenePresence.cs18
4 files changed, 70 insertions, 26 deletions
diff --git a/OpenSim/Region/Framework/Scenes/EventManager.cs b/OpenSim/Region/Framework/Scenes/EventManager.cs
index 473920e..9f74b2a 100644
--- a/OpenSim/Region/Framework/Scenes/EventManager.cs
+++ b/OpenSim/Region/Framework/Scenes/EventManager.cs
@@ -205,6 +205,12 @@ namespace OpenSim.Region.Framework.Scenes
205 public delegate void OnMakeRootAgentDelegate(ScenePresence presence); 205 public delegate void OnMakeRootAgentDelegate(ScenePresence presence);
206 public event OnMakeRootAgentDelegate OnMakeRootAgent; 206 public event OnMakeRootAgentDelegate OnMakeRootAgent;
207 207
208 /// <summary>
209 /// Triggered when an object or attachment enters a scene
210 /// </summary>
211 public event OnIncomingSceneObjectDelegate OnIncomingSceneObject;
212 public delegate void OnIncomingSceneObjectDelegate(SceneObjectGroup so);
213
208 public delegate void NewInventoryItemUploadComplete(UUID avatarID, UUID assetID, string name, int userlevel); 214 public delegate void NewInventoryItemUploadComplete(UUID avatarID, UUID assetID, string name, int userlevel);
209 215
210 public event NewInventoryItemUploadComplete OnNewInventoryItemUploadComplete; 216 public event NewInventoryItemUploadComplete OnNewInventoryItemUploadComplete;
@@ -407,7 +413,7 @@ namespace OpenSim.Region.Framework.Scenes
407 } 413 }
408 } 414 }
409 } 415 }
410 } 416 }
411 417
412 public void TriggerGetScriptRunning(IClientAPI controllingClient, UUID objectID, UUID itemID) 418 public void TriggerGetScriptRunning(IClientAPI controllingClient, UUID objectID, UUID itemID)
413 { 419 {
@@ -1206,6 +1212,27 @@ namespace OpenSim.Region.Framework.Scenes
1206 } 1212 }
1207 } 1213 }
1208 1214
1215 public void TriggerOnIncomingSceneObject(SceneObjectGroup so)
1216 {
1217 OnIncomingSceneObjectDelegate handlerIncomingSceneObject = OnIncomingSceneObject;
1218 if (handlerIncomingSceneObject != null)
1219 {
1220 foreach (OnIncomingSceneObjectDelegate d in handlerIncomingSceneObject.GetInvocationList())
1221 {
1222 try
1223 {
1224 d(so);
1225 }
1226 catch (Exception e)
1227 {
1228 m_log.ErrorFormat(
1229 "[EVENT MANAGER]: Delegate for TriggerOnIncomingSceneObject failed - continuing. {0} {1}",
1230 e.Message, e.StackTrace);
1231 }
1232 }
1233 }
1234 }
1235
1209 public void TriggerOnRegisterCaps(UUID agentID, Caps caps) 1236 public void TriggerOnRegisterCaps(UUID agentID, Caps caps)
1210 { 1237 {
1211 RegisterCapsEvent handlerRegisterCaps = OnRegisterCaps; 1238 RegisterCapsEvent handlerRegisterCaps = OnRegisterCaps;
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index f109589..669720a 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -2239,9 +2239,14 @@ namespace OpenSim.Region.Framework.Scenes
2239 } 2239 }
2240 2240
2241 2241
2242 /// <summary>
2243 /// Called when objects or attachments cross the border between regions.
2244 /// </summary>
2245 /// <param name="sog"></param>
2246 /// <returns></returns>
2242 public bool IncomingCreateObject(ISceneObject sog) 2247 public bool IncomingCreateObject(ISceneObject sog)
2243 { 2248 {
2244 //m_log.Debug(" >>> IncomingCreateObject <<< " + ((SceneObjectGroup)sog).AbsolutePosition + " deleted? " + ((SceneObjectGroup)sog).IsDeleted); 2249 //m_log.Debug(" >>> IncomingCreateObject(sog) <<< " + ((SceneObjectGroup)sog).AbsolutePosition + " deleted? " + ((SceneObjectGroup)sog).IsDeleted);
2245 SceneObjectGroup newObject; 2250 SceneObjectGroup newObject;
2246 try 2251 try
2247 { 2252 {
@@ -2258,7 +2263,12 @@ namespace OpenSim.Region.Framework.Scenes
2258 m_log.DebugFormat("[SCENE]: Problem adding scene object {0} in {1} ", sog.UUID, RegionInfo.RegionName); 2263 m_log.DebugFormat("[SCENE]: Problem adding scene object {0} in {1} ", sog.UUID, RegionInfo.RegionName);
2259 return false; 2264 return false;
2260 } 2265 }
2266
2261 newObject.RootPart.ParentGroup.CreateScriptInstances(0, false, DefaultScriptEngine, 1); 2267 newObject.RootPart.ParentGroup.CreateScriptInstances(0, false, DefaultScriptEngine, 1);
2268
2269 // Do this as late as possible so that listeners have full access to the incoming object
2270 EventManager.TriggerOnIncomingSceneObject(newObject);
2271
2262 return true; 2272 return true;
2263 } 2273 }
2264 2274
@@ -2270,6 +2280,8 @@ namespace OpenSim.Region.Framework.Scenes
2270 /// <returns>False</returns> 2280 /// <returns>False</returns>
2271 public virtual bool IncomingCreateObject(UUID userID, UUID itemID) 2281 public virtual bool IncomingCreateObject(UUID userID, UUID itemID)
2272 { 2282 {
2283 //m_log.DebugFormat(" >>> IncomingCreateObject(userID, itemID) <<< {0} {1}", userID, itemID);
2284
2273 ScenePresence sp = GetScenePresence(userID); 2285 ScenePresence sp = GetScenePresence(userID);
2274 if (sp != null) 2286 if (sp != null)
2275 { 2287 {
@@ -2307,7 +2319,7 @@ namespace OpenSim.Region.Framework.Scenes
2307 foreach (SceneObjectPart p in sceneObject.Children.Values) 2319 foreach (SceneObjectPart p in sceneObject.Children.Values)
2308 p.LocalId = 0; 2320 p.LocalId = 0;
2309 2321
2310 if ((sceneObject.RootPart.Shape.PCode == (byte)PCode.Prim) && (sceneObject.RootPart.Shape.State != 0)) // Attachment 2322 if (sceneObject.IsAttachmentCheckFull()) // Attachment
2311 { 2323 {
2312 sceneObject.RootPart.AddFlag(PrimFlags.TemporaryOnRez); 2324 sceneObject.RootPart.AddFlag(PrimFlags.TemporaryOnRez);
2313 sceneObject.RootPart.AddFlag(PrimFlags.Phantom); 2325 sceneObject.RootPart.AddFlag(PrimFlags.Phantom);
@@ -2332,29 +2344,23 @@ namespace OpenSim.Region.Framework.Scenes
2332 2344
2333 //RootPrim.SetParentLocalId(parentLocalID); 2345 //RootPrim.SetParentLocalId(parentLocalID);
2334 2346
2335 m_log.DebugFormat("[ATTACHMENT]: Received " + 2347 m_log.DebugFormat(
2336 "attachment {0}, inworld asset id {1}", 2348 "[ATTACHMENT]: Received attachment {0}, inworld asset id {1}", grp.GetFromItemID(), grp.UUID);
2337 //grp.RootPart.LastOwnerID.ToString(),
2338 grp.GetFromItemID(),
2339 grp.UUID.ToString());
2340 2349
2341 //grp.SetFromAssetID(grp.RootPart.LastOwnerID); 2350 //grp.SetFromAssetID(grp.RootPart.LastOwnerID);
2342 m_log.DebugFormat("[ATTACHMENT]: Attach " + 2351 m_log.DebugFormat(
2343 "to avatar {0} at position {1}", 2352 "[ATTACHMENT]: Attach to avatar {0} at position {1}", sp.UUID, grp.AbsolutePosition);
2344 sp.UUID.ToString(), grp.AbsolutePosition); 2353
2345 AttachObject(sp.ControllingClient, 2354 AttachObject(
2346 grp.LocalId, (uint)0, 2355 sp.ControllingClient, grp.LocalId, (uint)0, grp.GroupRotation, grp.AbsolutePosition, false);
2347 grp.GroupRotation,
2348 grp.AbsolutePosition, false);
2349 RootPrim.RemFlag(PrimFlags.TemporaryOnRez); 2356 RootPrim.RemFlag(PrimFlags.TemporaryOnRez);
2350 grp.SendGroupFullUpdate(); 2357 grp.SendGroupFullUpdate();
2351 } 2358 }
2352 else 2359 else
2353 { 2360 {
2354 RootPrim.RemFlag(PrimFlags.TemporaryOnRez); 2361 RootPrim.RemFlag(PrimFlags.TemporaryOnRez);
2355 RootPrim.AddFlag(PrimFlags.TemporaryOnRez); 2362 RootPrim.AddFlag(PrimFlags.TemporaryOnRez);
2356 } 2363 }
2357
2358 } 2364 }
2359 else 2365 else
2360 { 2366 {
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index 8c56870..af46659 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -268,7 +268,16 @@ namespace OpenSim.Region.Framework.Scenes
268 } 268 }
269 } 269 }
270 270
271 private bool IsAttachmentCheckFull() 271 /// <summary>
272 /// Check both the attachment property and the relevant properties of the underlying root part.
273 /// </summary>
274 /// This is necessary in some cases, particularly when a scene object has just crossed into a region and doesn't
275 /// have the IsAttachment property yet checked.
276 ///
277 /// FIXME: However, this should be fixed so that this property
278 /// propertly reflects the underlying status.
279 /// <returns></returns>
280 public bool IsAttachmentCheckFull()
272 { 281 {
273 return (IsAttachment || (m_rootPart.Shape.PCode == 9 && m_rootPart.Shape.State != 0)); 282 return (IsAttachment || (m_rootPart.Shape.PCode == 9 && m_rootPart.Shape.State != 0));
274 } 283 }
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 29f607b..b8a937a 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -104,6 +104,14 @@ namespace OpenSim.Region.Framework.Scenes
104 } 104 }
105 protected ScenePresenceAnimator m_animator; 105 protected ScenePresenceAnimator m_animator;
106 106
107 /// <value>
108 /// The scene objects attached to this avatar. Do not change this list directly - use methods such as
109 /// AddAttachment() and RemoveAttachment(). Lock this list when performing any read operations upon it.
110 /// </value>
111 public List<SceneObjectGroup> Attachments
112 {
113 get { return m_attachments; }
114 }
107 protected List<SceneObjectGroup> m_attachments = new List<SceneObjectGroup>(); 115 protected List<SceneObjectGroup> m_attachments = new List<SceneObjectGroup>();
108 116
109 private Dictionary<UUID, ScriptControllers> scriptedcontrols = new Dictionary<UUID, ScriptControllers>(); 117 private Dictionary<UUID, ScriptControllers> scriptedcontrols = new Dictionary<UUID, ScriptControllers>();
@@ -219,11 +227,6 @@ namespace OpenSim.Region.Framework.Scenes
219 227
220 protected AvatarAppearance m_appearance; 228 protected AvatarAppearance m_appearance;
221 229
222 public List<SceneObjectGroup> Attachments
223 {
224 get { return m_attachments; }
225 }
226
227 // neighbouring regions we have enabled a child agent in 230 // neighbouring regions we have enabled a child agent in
228 // holds the seed cap for the child agent in that region 231 // holds the seed cap for the child agent in that region
229 private Dictionary<ulong, string> m_knownChildRegions = new Dictionary<ulong, string>(); 232 private Dictionary<ulong, string> m_knownChildRegions = new Dictionary<ulong, string>();
@@ -3210,8 +3213,7 @@ namespace OpenSim.Region.Framework.Scenes
3210 m_physicsActor.OnCollisionUpdate += PhysicsCollisionUpdate; 3213 m_physicsActor.OnCollisionUpdate += PhysicsCollisionUpdate;
3211 m_physicsActor.OnOutOfBounds += OutOfBoundsCall; // Called for PhysicsActors when there's something wrong 3214 m_physicsActor.OnOutOfBounds += OutOfBoundsCall; // Called for PhysicsActors when there's something wrong
3212 m_physicsActor.SubscribeEvents(500); 3215 m_physicsActor.SubscribeEvents(500);
3213 m_physicsActor.LocalID = LocalId; 3216 m_physicsActor.LocalID = LocalId;
3214
3215 } 3217 }
3216 3218
3217 private void OutOfBoundsCall(Vector3 pos) 3219 private void OutOfBoundsCall(Vector3 pos)
@@ -3221,7 +3223,7 @@ namespace OpenSim.Region.Framework.Scenes
3221 3223
3222 //AddToPhysicalScene(flying); 3224 //AddToPhysicalScene(flying);
3223 if (ControllingClient != null) 3225 if (ControllingClient != null)
3224 ControllingClient.SendAgentAlertMessage("Physics is having a problem with your avatar. You may not be able to move until you relog.",true); 3226 ControllingClient.SendAgentAlertMessage("Physics is having a problem with your avatar. You may not be able to move until you relog.", true);
3225 } 3227 }
3226 3228
3227 // Event called by the physics plugin to tell the avatar about a collision. 3229 // Event called by the physics plugin to tell the avatar about a collision.