diff options
author | Melanie | 2010-02-08 21:42:23 +0000 |
---|---|---|
committer | Melanie | 2010-02-08 21:42:23 +0000 |
commit | def8f8166a0ce1d6727e1621d434e8f6251bccff (patch) | |
tree | a57a9c5e03b014093a63b48e9b441369fc9e22bc /OpenSim/Region | |
parent | Bug fix in configger (diff) | |
parent | Merge branch 'master' of ssh://justincc@opensimulator.org/var/git/opensim (diff) | |
download | opensim-SC-def8f8166a0ce1d6727e1621d434e8f6251bccff.zip opensim-SC-def8f8166a0ce1d6727e1621d434e8f6251bccff.tar.gz opensim-SC-def8f8166a0ce1d6727e1621d434e8f6251bccff.tar.bz2 opensim-SC-def8f8166a0ce1d6727e1621d434e8f6251bccff.tar.xz |
Merge branch 'master' of melanie@opensimulator.org:/var/git/opensim
Diffstat (limited to 'OpenSim/Region')
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. |