aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region')
-rw-r--r--OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs6
-rw-r--r--OpenSim/Region/Framework/Interfaces/IDynamicTextureManager.cs61
-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/SceneCommunicationService.cs1
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs11
-rw-r--r--OpenSim/Region/Framework/Scenes/ScenePresence.cs14
7 files changed, 133 insertions, 27 deletions
diff --git a/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs b/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs
index 35c59aa..144c8d1 100644
--- a/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs
@@ -115,7 +115,6 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
115 // client.OnAvatarNowWearing -= AvatarIsWearing; 115 // client.OnAvatarNowWearing -= AvatarIsWearing;
116 } 116 }
117 117
118
119 public void SetAppearanceAssets(UUID userID, ref AvatarAppearance appearance) 118 public void SetAppearanceAssets(UUID userID, ref AvatarAppearance appearance)
120 { 119 {
121 IInventoryService invService = m_scene.InventoryService; 120 IInventoryService invService = m_scene.InventoryService;
@@ -139,7 +138,10 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
139 } 138 }
140 else 139 else
141 { 140 {
142 m_log.ErrorFormat("[APPEARANCE]: Can't find inventory item {0}, setting to default", appearance.Wearables[i].ItemID); 141 m_log.ErrorFormat(
142 "[APPEARANCE]: Can't find inventory item {0} for {1}, setting to default",
143 appearance.Wearables[i].ItemID, (WearableType)i);
144
143 appearance.Wearables[i].AssetID = def.Wearables[i].AssetID; 145 appearance.Wearables[i].AssetID = def.Wearables[i].AssetID;
144 } 146 }
145 } 147 }
diff --git a/OpenSim/Region/Framework/Interfaces/IDynamicTextureManager.cs b/OpenSim/Region/Framework/Interfaces/IDynamicTextureManager.cs
index abcaf91..c289cdb 100644
--- a/OpenSim/Region/Framework/Interfaces/IDynamicTextureManager.cs
+++ b/OpenSim/Region/Framework/Interfaces/IDynamicTextureManager.cs
@@ -43,10 +43,67 @@ namespace OpenSim.Region.Framework.Interfaces
43 int updateTimer, bool SetBlending, int disp, byte AlphaValue, int face); 43 int updateTimer, bool SetBlending, int disp, byte AlphaValue, int face);
44 UUID AddDynamicTextureData(UUID simID, UUID primID, string contentType, string data, string extraParams, 44 UUID AddDynamicTextureData(UUID simID, UUID primID, string contentType, string data, string extraParams,
45 int updateTimer); 45 int updateTimer);
46
47 /// Apply a dynamically generated texture to all sides of the given prim. The texture is not persisted to the
48 /// asset service.
49 /// </summary>
50 /// <param name="simID">The simulator in which the texture is being generated</param>
51 /// <param name="primID">The prim to which to apply the texture.</param>
52 /// <param name="contentType">The content type to create. Current choices are "vector" to create a vector
53 /// based texture or "image" to create a texture from an image at a particular URL</param>
54 /// <param name="data">The data for the generator</param>
55 /// <param name="extraParams">Parameters for the generator that don't form part of the main data.</param>
56 /// <param name="updateTimer">If zero, the image is never updated after the first generation. If positive
57 /// the image is updated at the given interval. Not implemented for </param>
58 /// <param name="SetBlending">
59 /// If true, the newly generated texture is blended with the appropriate existing ones on the prim
60 /// </param>
61 /// <param name="AlphaValue">
62 /// The alpha value of the generated texture.
63 /// </param>
64 /// <returns>
65 /// The UUID of the texture updater, not the texture UUID. If you need the texture UUID then you will need
66 /// to obtain it directly from the SceneObjectPart. For instance, if ALL_SIDES is set then this texture
67 /// can be obtained as SceneObjectPart.Shape.Textures.DefaultTexture.TextureID
68 /// </returns>
46 UUID AddDynamicTextureData(UUID simID, UUID primID, string contentType, string data, string extraParams, 69 UUID AddDynamicTextureData(UUID simID, UUID primID, string contentType, string data, string extraParams,
47 int updateTimer, bool SetBlending, byte AlphaValue); 70 int updateTimer, bool SetBlending, byte AlphaValue);
48 UUID AddDynamicTextureData(UUID simID, UUID primID, string contentType, string data, string extraParams, 71
49 int updateTimer, bool SetBlending, int disp, byte AlphaValue, int face); 72 /// <summary>
73 /// Apply a dynamically generated texture to the given prim.
74 /// </summary>
75 /// <param name="simID">The simulator in which the texture is being generated</param>
76 /// <param name="primID">The prim to which to apply the texture.</param>
77 /// <param name="contentType">The content type to create. Current choices are "vector" to create a vector
78 /// based texture or "image" to create a texture from an image at a particular URL</param>
79 /// <param name="data">The data for the generator</param>
80 /// <param name="extraParams">Parameters for the generator that don't form part of the main data.</param>
81 /// <param name="updateTimer">If zero, the image is never updated after the first generation. If positive
82 /// the image is updated at the given interval. Not implemented for </param>
83 /// <param name="SetBlending">
84 /// If true, the newly generated texture is blended with the appropriate existing ones on the prim
85 /// </param>
86 /// <param name="disp">
87 /// Display flags. If DISP_EXPIRE then the old texture is deleted if it is replaced by a
88 /// newer generated texture (may not currently be implemented). If DISP_TEMP then the asset is flagged as
89 /// temporary, which often means that it is not persisted to the database.
90 /// </param>
91 /// <param name="AlphaValue">
92 /// The alpha value of the generated texture.
93 /// </param>
94 /// <param name="face">
95 /// The face of the prim on which to put the generated texture. If ALL_SIDES then all sides of the prim are
96 /// set
97 /// </param>
98 /// <returns>
99 /// The UUID of the texture updater, not the texture UUID. If you need the texture UUID then you will need
100 /// to obtain it directly from the SceneObjectPart. For instance, if ALL_SIDES is set then this texture
101 /// can be obtained as SceneObjectPart.Shape.Textures.DefaultTexture.TextureID
102 /// </returns>
103 UUID AddDynamicTextureData(
104 UUID simID, UUID primID, string contentType, string data, string extraParams,
105 int updateTimer, bool SetBlending, int disp, byte AlphaValue, int face);
106
50 void GetDrawStringSize(string contentType, string text, string fontName, int fontSize, 107 void GetDrawStringSize(string contentType, string text, string fontName, int fontSize,
51 out double xSize, out double ySize); 108 out double xSize, out double ySize);
52 } 109 }
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 73b0b3e..ddebd0b 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -2406,9 +2406,14 @@ namespace OpenSim.Region.Framework.Scenes
2406 return successYN; 2406 return successYN;
2407 } 2407 }
2408 2408
2409 /// <summary>
2410 /// Called when objects or attachments cross the border between regions.
2411 /// </summary>
2412 /// <param name="sog"></param>
2413 /// <returns></returns>
2409 public bool IncomingCreateObject(ISceneObject sog) 2414 public bool IncomingCreateObject(ISceneObject sog)
2410 { 2415 {
2411 //m_log.Debug(" >>> IncomingCreateObject <<< " + ((SceneObjectGroup)sog).AbsolutePosition + " deleted? " + ((SceneObjectGroup)sog).IsDeleted); 2416 //m_log.Debug(" >>> IncomingCreateObject(sog) <<< " + ((SceneObjectGroup)sog).AbsolutePosition + " deleted? " + ((SceneObjectGroup)sog).IsDeleted);
2412 SceneObjectGroup newObject; 2417 SceneObjectGroup newObject;
2413 try 2418 try
2414 { 2419 {
@@ -2425,7 +2430,12 @@ namespace OpenSim.Region.Framework.Scenes
2425 m_log.DebugFormat("[SCENE]: Problem adding scene object {0} in {1} ", sog.UUID, RegionInfo.RegionName); 2430 m_log.DebugFormat("[SCENE]: Problem adding scene object {0} in {1} ", sog.UUID, RegionInfo.RegionName);
2426 return false; 2431 return false;
2427 } 2432 }
2433
2428 newObject.RootPart.ParentGroup.CreateScriptInstances(0, false, DefaultScriptEngine, 1); 2434 newObject.RootPart.ParentGroup.CreateScriptInstances(0, false, DefaultScriptEngine, 1);
2435
2436 // Do this as late as possible so that listeners have full access to the incoming object
2437 EventManager.TriggerOnIncomingSceneObject(newObject);
2438
2429 return true; 2439 return true;
2430 } 2440 }
2431 2441
@@ -2437,6 +2447,8 @@ namespace OpenSim.Region.Framework.Scenes
2437 /// <returns>False</returns> 2447 /// <returns>False</returns>
2438 public virtual bool IncomingCreateObject(UUID userID, UUID itemID) 2448 public virtual bool IncomingCreateObject(UUID userID, UUID itemID)
2439 { 2449 {
2450 //m_log.DebugFormat(" >>> IncomingCreateObject(userID, itemID) <<< {0} {1}", userID, itemID);
2451
2440 ScenePresence sp = GetScenePresence(userID); 2452 ScenePresence sp = GetScenePresence(userID);
2441 if (sp != null) 2453 if (sp != null)
2442 { 2454 {
@@ -2471,7 +2483,7 @@ namespace OpenSim.Region.Framework.Scenes
2471 foreach (SceneObjectPart p in sceneObject.Children.Values) 2483 foreach (SceneObjectPart p in sceneObject.Children.Values)
2472 p.LocalId = 0; 2484 p.LocalId = 0;
2473 2485
2474 if ((sceneObject.RootPart.Shape.PCode == (byte)PCode.Prim) && (sceneObject.RootPart.Shape.State != 0)) // Attachment 2486 if (sceneObject.IsAttachmentCheckFull()) // Attachment
2475 { 2487 {
2476 sceneObject.RootPart.AddFlag(PrimFlags.TemporaryOnRez); 2488 sceneObject.RootPart.AddFlag(PrimFlags.TemporaryOnRez);
2477 sceneObject.RootPart.AddFlag(PrimFlags.Phantom); 2489 sceneObject.RootPart.AddFlag(PrimFlags.Phantom);
@@ -2496,29 +2508,23 @@ namespace OpenSim.Region.Framework.Scenes
2496 2508
2497 //RootPrim.SetParentLocalId(parentLocalID); 2509 //RootPrim.SetParentLocalId(parentLocalID);
2498 2510
2499 m_log.DebugFormat("[ATTACHMENT]: Received " + 2511 m_log.DebugFormat(
2500 "attachment {0}, inworld asset id {1}", 2512 "[ATTACHMENT]: Received attachment {0}, inworld asset id {1}", grp.GetFromItemID(), grp.UUID);
2501 //grp.RootPart.LastOwnerID.ToString(),
2502 grp.GetFromItemID(),
2503 grp.UUID.ToString());
2504 2513
2505 //grp.SetFromAssetID(grp.RootPart.LastOwnerID); 2514 //grp.SetFromAssetID(grp.RootPart.LastOwnerID);
2506 m_log.DebugFormat("[ATTACHMENT]: Attach " + 2515 m_log.DebugFormat(
2507 "to avatar {0} at position {1}", 2516 "[ATTACHMENT]: Attach to avatar {0} at position {1}", sp.UUID, grp.AbsolutePosition);
2508 sp.UUID.ToString(), grp.AbsolutePosition); 2517
2509 AttachObject(sp.ControllingClient, 2518 AttachObject(
2510 grp.LocalId, (uint)0, 2519 sp.ControllingClient, grp.LocalId, (uint)0, grp.GroupRotation, grp.AbsolutePosition, false);
2511 grp.GroupRotation,
2512 grp.AbsolutePosition, false);
2513 RootPrim.RemFlag(PrimFlags.TemporaryOnRez); 2520 RootPrim.RemFlag(PrimFlags.TemporaryOnRez);
2514 grp.SendGroupFullUpdate(); 2521 grp.SendGroupFullUpdate();
2515 } 2522 }
2516 else 2523 else
2517 { 2524 {
2518 RootPrim.RemFlag(PrimFlags.TemporaryOnRez); 2525 RootPrim.RemFlag(PrimFlags.TemporaryOnRez);
2519 RootPrim.AddFlag(PrimFlags.TemporaryOnRez); 2526 RootPrim.AddFlag(PrimFlags.TemporaryOnRez);
2520 } 2527 }
2521
2522 } 2528 }
2523 else 2529 else
2524 { 2530 {
diff --git a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs
index 6164368..2f6a0db 100644
--- a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs
@@ -191,7 +191,6 @@ namespace OpenSim.Region.Framework.Scenes
191 if (handlerChildAgentUpdate != null) 191 if (handlerChildAgentUpdate != null)
192 handlerChildAgentUpdate(cAgentData); 192 handlerChildAgentUpdate(cAgentData);
193 193
194
195 return true; 194 return true;
196 } 195 }
197 196
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 bcf22c3..6b95624 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>();
@@ -1105,7 +1113,6 @@ namespace OpenSim.Region.Framework.Scenes
1105 1113
1106 m_controllingClient.MoveAgentIntoRegion(m_regionInfo, AbsolutePosition, look); 1114 m_controllingClient.MoveAgentIntoRegion(m_regionInfo, AbsolutePosition, look);
1107 SendInitialData(); 1115 SendInitialData();
1108
1109 } 1116 }
1110 1117
1111 /// <summary> 1118 /// <summary>
@@ -3184,8 +3191,7 @@ namespace OpenSim.Region.Framework.Scenes
3184 m_physicsActor.OnCollisionUpdate += PhysicsCollisionUpdate; 3191 m_physicsActor.OnCollisionUpdate += PhysicsCollisionUpdate;
3185 m_physicsActor.OnOutOfBounds += OutOfBoundsCall; // Called for PhysicsActors when there's something wrong 3192 m_physicsActor.OnOutOfBounds += OutOfBoundsCall; // Called for PhysicsActors when there's something wrong
3186 m_physicsActor.SubscribeEvents(500); 3193 m_physicsActor.SubscribeEvents(500);
3187 m_physicsActor.LocalID = LocalId; 3194 m_physicsActor.LocalID = LocalId;
3188
3189 } 3195 }
3190 3196
3191 private void OutOfBoundsCall(Vector3 pos) 3197 private void OutOfBoundsCall(Vector3 pos)
@@ -3195,7 +3201,7 @@ namespace OpenSim.Region.Framework.Scenes
3195 3201
3196 //AddToPhysicalScene(flying); 3202 //AddToPhysicalScene(flying);
3197 if (ControllingClient != null) 3203 if (ControllingClient != null)
3198 ControllingClient.SendAgentAlertMessage("Physics is having a problem with your avatar. You may not be able to move until you relog.",true); 3204 ControllingClient.SendAgentAlertMessage("Physics is having a problem with your avatar. You may not be able to move until you relog.", true);
3199 } 3205 }
3200 3206
3201 // Event called by the physics plugin to tell the avatar about a collision. 3207 // Event called by the physics plugin to tell the avatar about a collision.