diff options
Diffstat (limited to 'OpenSim/Region/Framework')
15 files changed, 467 insertions, 283 deletions
diff --git a/OpenSim/Region/Framework/Interfaces/IAttachmentsModule.cs b/OpenSim/Region/Framework/Interfaces/IAttachmentsModule.cs index d1b7dc1..a7770ad 100644 --- a/OpenSim/Region/Framework/Interfaces/IAttachmentsModule.cs +++ b/OpenSim/Region/Framework/Interfaces/IAttachmentsModule.cs | |||
@@ -27,8 +27,8 @@ | |||
27 | 27 | ||
28 | using System; | 28 | using System; |
29 | using System.Xml; | 29 | using System.Xml; |
30 | using System.Collections.Generic; | ||
30 | using OpenMetaverse; | 31 | using OpenMetaverse; |
31 | using OpenMetaverse.Packets; | ||
32 | using OpenSim.Framework; | 32 | using OpenSim.Framework; |
33 | using OpenSim.Region.Framework.Scenes; | 33 | using OpenSim.Region.Framework.Scenes; |
34 | 34 | ||
@@ -40,6 +40,7 @@ namespace OpenSim.Region.Framework.Interfaces | |||
40 | /// RezAttachments. This should only be called upon login on the first region. | 40 | /// RezAttachments. This should only be called upon login on the first region. |
41 | /// Attachment rezzings on crossings and TPs are done in a different way. | 41 | /// Attachment rezzings on crossings and TPs are done in a different way. |
42 | /// </summary> | 42 | /// </summary> |
43 | /// <param name="sp"></param> | ||
43 | void RezAttachments(IScenePresence sp); | 44 | void RezAttachments(IScenePresence sp); |
44 | 45 | ||
45 | /// <summary> | 46 | /// <summary> |
@@ -50,43 +51,21 @@ namespace OpenSim.Region.Framework.Interfaces | |||
50 | 51 | ||
51 | /// <summary> | 52 | /// <summary> |
52 | /// Delete all the presence's attachments from the scene | 53 | /// Delete all the presence's attachments from the scene |
53 | /// </summary> | ||
54 | /// <param name="sp"> | ||
55 | /// This is done when a root agent leaves/is demoted to child (for instance, on logout, teleport or region cross). | 54 | /// This is done when a root agent leaves/is demoted to child (for instance, on logout, teleport or region cross). |
56 | /// </param> | ||
57 | /// <param name="silent"></param> | ||
58 | void DeleteAttachmentsFromScene(IScenePresence sp, bool silent); | ||
59 | |||
60 | /// <summary> | ||
61 | /// Attach an object to an avatar from the world. | ||
62 | /// </summary> | 55 | /// </summary> |
63 | /// <param name="controllingClient"></param> | 56 | /// <param name="sp"></param> |
64 | /// <param name="localID"></param> | ||
65 | /// <param name="attachPoint"></param> | ||
66 | /// <param name="rot"></param> | ||
67 | /// <param name="silent"></param> | 57 | /// <param name="silent"></param> |
68 | void AttachObject( | 58 | void DeleteAttachmentsFromScene(IScenePresence sp, bool silent); |
69 | IClientAPI remoteClient, uint objectLocalID, uint AttachmentPt, bool silent); | ||
70 | 59 | ||
71 | /// <summary> | 60 | /// <summary> |
72 | /// Attach an object to an avatar | 61 | /// Attach an object to an avatar |
73 | /// </summary> | 62 | /// </summary> |
74 | /// <param name="remoteClient"></param> | 63 | /// <param name="sp"></param> |
75 | /// <param name="grp"></param> | 64 | /// <param name="grp"></param> |
76 | /// <param name="AttachmentPt"></param> | 65 | /// <param name="AttachmentPt"></param> |
77 | /// <param name="silent"></param> | 66 | /// <param name="silent"></param> |
78 | /// <returns>true if the object was successfully attached, false otherwise</returns> | 67 | /// <returns>true if the object was successfully attached, false otherwise</returns> |
79 | bool AttachObject( | 68 | bool AttachObject(IScenePresence sp, SceneObjectGroup grp, uint AttachmentPt, bool silent); |
80 | IClientAPI remoteClient, SceneObjectGroup grp, uint AttachmentPt, bool silent); | ||
81 | |||
82 | /// <summary> | ||
83 | /// Rez an attachment from user inventory and change inventory status to match. | ||
84 | /// </summary> | ||
85 | /// <param name="remoteClient"></param> | ||
86 | /// <param name="itemID"></param> | ||
87 | /// <param name="AttachmentPt"></param> | ||
88 | /// <returns>The scene object that was attached. Null if the scene object could not be found</returns> | ||
89 | ISceneEntity RezSingleAttachmentFromInventory(IClientAPI remoteClient, UUID itemID, uint AttachmentPt); | ||
90 | 69 | ||
91 | /// <summary> | 70 | /// <summary> |
92 | /// Rez an attachment from user inventory and change inventory status to match. | 71 | /// Rez an attachment from user inventory and change inventory status to match. |
@@ -95,51 +74,32 @@ namespace OpenSim.Region.Framework.Interfaces | |||
95 | /// <param name="itemID"></param> | 74 | /// <param name="itemID"></param> |
96 | /// <param name="AttachmentPt"></param> | 75 | /// <param name="AttachmentPt"></param> |
97 | /// <returns>The scene object that was attached. Null if the scene object could not be found</returns> | 76 | /// <returns>The scene object that was attached. Null if the scene object could not be found</returns> |
98 | ISceneEntity RezSingleAttachmentFromInventory(ScenePresence sp, UUID itemID, uint AttachmentPt); | 77 | ISceneEntity RezSingleAttachmentFromInventory(IScenePresence sp, UUID itemID, uint AttachmentPt); |
99 | 78 | ||
100 | // Same as above, but also load script states from a separate doc | 79 | // Same as above, but also load script states from a separate doc |
101 | ISceneEntity RezSingleAttachmentFromInventory( | 80 | ISceneEntity RezSingleAttachmentFromInventory( |
102 | IClientAPI remoteClient, UUID itemID, uint AttachmentPt, bool updateInventoryStatus, XmlDocument doc); | 81 | IScenePresence presence, UUID itemID, uint AttachmentPt, bool updateInventoryStatus, XmlDocument doc); |
103 | 82 | ||
104 | /// <summary> | 83 | /// <summary> |
105 | /// Rez multiple attachments from a user's inventory | 84 | /// Rez multiple attachments from a user's inventory |
106 | /// </summary> | 85 | /// </summary> |
107 | /// <param name="remoteClient"></param> | 86 | /// <param name="sp"></param> |
108 | /// <param name="header"></param> | 87 | /// <param name="rezlist"></param> |
109 | /// <param name="objects"></param> | 88 | void RezMultipleAttachmentsFromInventory(IScenePresence sp,List<KeyValuePair<UUID, uint>> rezlist); |
110 | void RezMultipleAttachmentsFromInventory( | ||
111 | IClientAPI remoteClient, | ||
112 | RezMultipleAttachmentsFromInvPacket.HeaderDataBlock header, | ||
113 | RezMultipleAttachmentsFromInvPacket.ObjectDataBlock[] objects); | ||
114 | |||
115 | /// <summary> | ||
116 | /// Detach an object from the avatar. | ||
117 | /// </summary> | ||
118 | /// <remarks> | ||
119 | /// This method is called in response to a client's detach request, so we only update the information in | ||
120 | /// inventory | ||
121 | /// </remarks> | ||
122 | /// <param name="objectLocalID"></param> | ||
123 | /// <param name="remoteClient"></param> | ||
124 | void DetachObject(uint objectLocalID, IClientAPI remoteClient); | ||
125 | 89 | ||
126 | /// <summary> | 90 | /// <summary> |
127 | /// Detach the given item to the ground. | 91 | /// Detach the given item to the ground. |
128 | /// </summary> | 92 | /// </summary> |
93 | /// <param name="sp"></param> | ||
129 | /// <param name="objectLocalID"></param> | 94 | /// <param name="objectLocalID"></param> |
130 | /// <param name="remoteClient"></param> | 95 | void DetachSingleAttachmentToGround(IScenePresence sp, uint objectLocalID); |
131 | void DetachSingleAttachmentToGround(uint objectLocalID, IClientAPI remoteClient); | ||
132 | 96 | ||
133 | /// <summary> | 97 | /// <summary> |
134 | /// Detach the given item so that it remains in the user's inventory. | 98 | /// Detach the given item so that it remains in the user's inventory. |
135 | /// </summary> | 99 | /// </summary> |
136 | /// <param name="itemID"> | 100 | /// <param name="sp">/param> |
137 | /// A <see cref="UUID"/> | 101 | /// <param name="itemID"></param> |
138 | /// </param> | 102 | void DetachSingleAttachmentToInv(IScenePresence sp, UUID itemID); |
139 | /// <param name="remoteClient"> | ||
140 | /// A <see cref="IClientAPI"/> | ||
141 | /// </param> | ||
142 | void DetachSingleAttachmentToInv(UUID itemID, IClientAPI remoteClient); | ||
143 | 103 | ||
144 | /// Update the position of an attachment. | 104 | /// Update the position of an attachment. |
145 | /// </summary> | 105 | /// </summary> |
diff --git a/OpenSim/Region/Framework/Interfaces/IEstateDataService.cs b/OpenSim/Region/Framework/Interfaces/IEstateDataService.cs index 7066cf2..35cc220 100644 --- a/OpenSim/Region/Framework/Interfaces/IEstateDataService.cs +++ b/OpenSim/Region/Framework/Interfaces/IEstateDataService.cs | |||
@@ -1,4 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (c) Contributors, http://opensimulator.org/ | 2 | * Copyright (c) Contributors, http://opensimulator.org/ |
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | 3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. |
4 | * | 4 | * |
@@ -48,6 +48,14 @@ namespace OpenSim.Region.Framework.Interfaces | |||
48 | /// <param name="estateID"></param> | 48 | /// <param name="estateID"></param> |
49 | /// <returns></returns> | 49 | /// <returns></returns> |
50 | EstateSettings LoadEstateSettings(int estateID); | 50 | EstateSettings LoadEstateSettings(int estateID); |
51 | |||
52 | /// <summary> | ||
53 | /// Create a new estate. | ||
54 | /// </summary> | ||
55 | /// <returns> | ||
56 | /// A <see cref="EstateSettings"/> | ||
57 | /// </returns> | ||
58 | EstateSettings CreateNewEstate(); | ||
51 | 59 | ||
52 | /// <summary> | 60 | /// <summary> |
53 | /// Load/Get all estate settings. | 61 | /// Load/Get all estate settings. |
diff --git a/OpenSim/Region/Framework/Interfaces/IEstateDataStore.cs b/OpenSim/Region/Framework/Interfaces/IEstateDataStore.cs index d790a30..8febb13 100644 --- a/OpenSim/Region/Framework/Interfaces/IEstateDataStore.cs +++ b/OpenSim/Region/Framework/Interfaces/IEstateDataStore.cs | |||
@@ -55,6 +55,14 @@ namespace OpenSim.Region.Framework.Interfaces | |||
55 | EstateSettings LoadEstateSettings(int estateID); | 55 | EstateSettings LoadEstateSettings(int estateID); |
56 | 56 | ||
57 | /// <summary> | 57 | /// <summary> |
58 | /// Create a new estate. | ||
59 | /// </summary> | ||
60 | /// <returns> | ||
61 | /// A <see cref="EstateSettings"/> | ||
62 | /// </returns> | ||
63 | EstateSettings CreateNewEstate(); | ||
64 | |||
65 | /// <summary> | ||
58 | /// Load/Get all estate settings. | 66 | /// Load/Get all estate settings. |
59 | /// </summary> | 67 | /// </summary> |
60 | /// <returns>An empty list if no estates were found.</returns> | 68 | /// <returns>An empty list if no estates were found.</returns> |
diff --git a/OpenSim/Region/Framework/Interfaces/IRegionModule.cs b/OpenSim/Region/Framework/Interfaces/IRegionModule.cs index e25a6e8..2bb0c75 100644 --- a/OpenSim/Region/Framework/Interfaces/IRegionModule.cs +++ b/OpenSim/Region/Framework/Interfaces/IRegionModule.cs | |||
@@ -35,7 +35,16 @@ namespace OpenSim.Region.Framework.Interfaces | |||
35 | /// </summary> | 35 | /// </summary> |
36 | public interface IRegionModule | 36 | public interface IRegionModule |
37 | { | 37 | { |
38 | /// <summary> | ||
39 | /// Initialize the module. | ||
40 | /// </summary> | ||
41 | /// <remarks> | ||
42 | /// For a shared module this can be called multiple times - once per scene. | ||
43 | /// </remarks> | ||
44 | /// <param name="scene"></param> | ||
45 | /// <param name="source">Configuration information. For a shared module this will be identical on every scene call</param> | ||
38 | void Initialise(Scene scene, IConfigSource source); | 46 | void Initialise(Scene scene, IConfigSource source); |
47 | |||
39 | void PostInitialise(); | 48 | void PostInitialise(); |
40 | void Close(); | 49 | void Close(); |
41 | string Name { get; } | 50 | string Name { get; } |
diff --git a/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs b/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs index 4925175..904a657 100644 --- a/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs +++ b/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs | |||
@@ -181,8 +181,8 @@ TrySetMovementAnimation("STAND"); | |||
181 | bool heldBack = ((controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG || (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_NEG); | 181 | bool heldBack = ((controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG || (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_NEG); |
182 | bool heldLeft = ((controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS) == AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS || (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_POS) == AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_POS); | 182 | bool heldLeft = ((controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS) == AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS || (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_POS) == AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_POS); |
183 | bool heldRight = ((controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG || (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_NEG); | 183 | bool heldRight = ((controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG || (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_NEG); |
184 | //bool heldTurnLeft = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_TURN_LEFT) == AgentManager.ControlFlags.AGENT_CONTROL_TURN_LEFT; | 184 | bool heldTurnLeft = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_TURN_LEFT) == AgentManager.ControlFlags.AGENT_CONTROL_TURN_LEFT; |
185 | //bool heldTurnRight = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_TURN_RIGHT) == AgentManager.ControlFlags.AGENT_CONTROL_TURN_RIGHT; | 185 | bool heldTurnRight = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_TURN_RIGHT) == AgentManager.ControlFlags.AGENT_CONTROL_TURN_RIGHT; |
186 | bool heldUp = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) == AgentManager.ControlFlags.AGENT_CONTROL_UP_POS; | 186 | bool heldUp = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) == AgentManager.ControlFlags.AGENT_CONTROL_UP_POS; |
187 | bool heldDown = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG; | 187 | bool heldDown = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG; |
188 | //bool flying = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_FLY) == AgentManager.ControlFlags.AGENT_CONTROL_FLY; | 188 | //bool flying = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_FLY) == AgentManager.ControlFlags.AGENT_CONTROL_FLY; |
@@ -404,7 +404,17 @@ TrySetMovementAnimation("STAND"); | |||
404 | else if (m_scenePresence.SetAlwaysRun) | 404 | else if (m_scenePresence.SetAlwaysRun) |
405 | return "RUN"; | 405 | return "RUN"; |
406 | else | 406 | else |
407 | return "WALK"; | 407 | { |
408 | // Not walking | ||
409 | if (move.Z < 0) | ||
410 | return "CROUCH"; | ||
411 | else if (heldTurnLeft) | ||
412 | return "TURNLEFT"; | ||
413 | else if (heldTurnRight) | ||
414 | return "TURNRIGHT"; | ||
415 | else | ||
416 | return "WALK"; | ||
417 | } | ||
408 | } | 418 | } |
409 | // rm for jumping else | 419 | // rm for jumping else |
410 | else if (!m_jumping) // add for jumping | 420 | else if (!m_jumping) // add for jumping |
diff --git a/OpenSim/Region/Framework/Scenes/AsyncSceneObjectGroupDeleter.cs b/OpenSim/Region/Framework/Scenes/AsyncSceneObjectGroupDeleter.cs index 088839d..12688bd 100644 --- a/OpenSim/Region/Framework/Scenes/AsyncSceneObjectGroupDeleter.cs +++ b/OpenSim/Region/Framework/Scenes/AsyncSceneObjectGroupDeleter.cs | |||
@@ -119,6 +119,11 @@ namespace OpenSim.Region.Framework.Scenes | |||
119 | private void InventoryRunDeleteTimer(object sender, ElapsedEventArgs e) | 119 | private void InventoryRunDeleteTimer(object sender, ElapsedEventArgs e) |
120 | { | 120 | { |
121 | m_log.Debug("[ASYNC DELETER]: Starting send to inventory loop"); | 121 | m_log.Debug("[ASYNC DELETER]: Starting send to inventory loop"); |
122 | |||
123 | // We must set appearance parameters in the en_US culture in order to avoid issues where values are saved | ||
124 | // in a culture where decimal points are commas and then reloaded in a culture which just treats them as | ||
125 | // number seperators. | ||
126 | Culture.SetCurrentCulture(); | ||
122 | 127 | ||
123 | while (InventoryDeQueueAndDelete()) | 128 | while (InventoryDeQueueAndDelete()) |
124 | { | 129 | { |
diff --git a/OpenSim/Region/Framework/Scenes/EntityBase.cs b/OpenSim/Region/Framework/Scenes/EntityBase.cs index 213431a..680a4a3 100644 --- a/OpenSim/Region/Framework/Scenes/EntityBase.cs +++ b/OpenSim/Region/Framework/Scenes/EntityBase.cs | |||
@@ -26,8 +26,10 @@ | |||
26 | */ | 26 | */ |
27 | 27 | ||
28 | using System; | 28 | using System; |
29 | using System.Reflection; | ||
29 | using System.Runtime.Serialization; | 30 | using System.Runtime.Serialization; |
30 | using System.Security.Permissions; | 31 | using System.Security.Permissions; |
32 | using log4net; | ||
31 | using OpenSim.Framework; | 33 | using OpenSim.Framework; |
32 | using OpenMetaverse; | 34 | using OpenMetaverse; |
33 | 35 | ||
@@ -35,6 +37,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
35 | { | 37 | { |
36 | public abstract class EntityBase : ISceneEntity | 38 | public abstract class EntityBase : ISceneEntity |
37 | { | 39 | { |
40 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
41 | |||
38 | /// <summary> | 42 | /// <summary> |
39 | /// The scene to which this entity belongs | 43 | /// The scene to which this entity belongs |
40 | /// </summary> | 44 | /// </summary> |
@@ -71,12 +75,15 @@ namespace OpenSim.Region.Framework.Scenes | |||
71 | protected Vector3 m_pos; | 75 | protected Vector3 m_pos; |
72 | 76 | ||
73 | /// <summary> | 77 | /// <summary> |
74 | /// | 78 | /// Absolute position of this entity in a scene. |
75 | /// </summary> | 79 | /// </summary> |
76 | public virtual Vector3 AbsolutePosition | 80 | public virtual Vector3 AbsolutePosition |
77 | { | 81 | { |
78 | get { return m_pos; } | 82 | get { return m_pos; } |
79 | set { m_pos = value; } | 83 | set |
84 | { | ||
85 | m_pos = value; | ||
86 | } | ||
80 | } | 87 | } |
81 | 88 | ||
82 | protected Vector3 m_velocity; | 89 | protected Vector3 m_velocity; |
@@ -108,11 +115,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
108 | } | 115 | } |
109 | 116 | ||
110 | /// <summary> | 117 | /// <summary> |
111 | /// | ||
112 | /// </summary> | ||
113 | public abstract void UpdateMovement(); | ||
114 | |||
115 | /// <summary> | ||
116 | /// Performs any updates that need to be done at each frame, as opposed to immediately. | 118 | /// Performs any updates that need to be done at each frame, as opposed to immediately. |
117 | /// These included scheduled updates and updates that occur due to physics processing. | 119 | /// These included scheduled updates and updates that occur due to physics processing. |
118 | /// </summary> | 120 | /// </summary> |
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs index c2ec5d0..53f0f2e 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | |||
@@ -261,7 +261,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
261 | item.AssetID = asset.FullID; | 261 | item.AssetID = asset.FullID; |
262 | group.UpdateInventoryItem(item); | 262 | group.UpdateInventoryItem(item); |
263 | 263 | ||
264 | part.GetProperties(remoteClient); | 264 | part.SendPropertiesToClient(remoteClient); |
265 | 265 | ||
266 | // Trigger rerunning of script (use TriggerRezScript event, see RezScript) | 266 | // Trigger rerunning of script (use TriggerRezScript event, see RezScript) |
267 | ArrayList errors = new ArrayList(); | 267 | ArrayList errors = new ArrayList(); |
@@ -316,6 +316,10 @@ namespace OpenSim.Region.Framework.Scenes | |||
316 | public void UpdateInventoryItemAsset(IClientAPI remoteClient, UUID transactionID, | 316 | public void UpdateInventoryItemAsset(IClientAPI remoteClient, UUID transactionID, |
317 | UUID itemID, InventoryItemBase itemUpd) | 317 | UUID itemID, InventoryItemBase itemUpd) |
318 | { | 318 | { |
319 | // m_log.DebugFormat( | ||
320 | // "[USER INVENTORY]: Updating asset for item {0} {1}, transaction ID {2} for {3}", | ||
321 | // itemID, itemUpd.Name, transactionID, remoteClient.Name); | ||
322 | |||
319 | // This one will let people set next perms on items in agent | 323 | // This one will let people set next perms on items in agent |
320 | // inventory. Rut-Roh. Whatever. Make this secure. Yeah. | 324 | // inventory. Rut-Roh. Whatever. Make this secure. Yeah. |
321 | // | 325 | // |
@@ -368,8 +372,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
368 | IAgentAssetTransactions agentTransactions = this.RequestModuleInterface<IAgentAssetTransactions>(); | 372 | IAgentAssetTransactions agentTransactions = this.RequestModuleInterface<IAgentAssetTransactions>(); |
369 | if (agentTransactions != null) | 373 | if (agentTransactions != null) |
370 | { | 374 | { |
371 | agentTransactions.HandleItemUpdateFromTransaction( | 375 | agentTransactions.HandleItemUpdateFromTransaction(remoteClient, transactionID, item); |
372 | remoteClient, transactionID, item); | ||
373 | } | 376 | } |
374 | } | 377 | } |
375 | } | 378 | } |
@@ -1005,7 +1008,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1005 | } | 1008 | } |
1006 | 1009 | ||
1007 | group.RemoveInventoryItem(localID, itemID); | 1010 | group.RemoveInventoryItem(localID, itemID); |
1008 | part.GetProperties(remoteClient); | 1011 | part.SendPropertiesToClient(remoteClient); |
1009 | } | 1012 | } |
1010 | } | 1013 | } |
1011 | 1014 | ||
@@ -1283,7 +1286,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1283 | 1286 | ||
1284 | if (TryGetScenePresence(srcTaskItem.OwnerID, out avatar)) | 1287 | if (TryGetScenePresence(srcTaskItem.OwnerID, out avatar)) |
1285 | { | 1288 | { |
1286 | destPart.GetProperties(avatar.ControllingClient); | 1289 | destPart.SendPropertiesToClient(avatar.ControllingClient); |
1287 | } | 1290 | } |
1288 | } | 1291 | } |
1289 | 1292 | ||
@@ -1446,7 +1449,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1446 | m_log.InfoFormat( | 1449 | m_log.InfoFormat( |
1447 | "[PRIM INVENTORY]: Update with item {0} requested of prim {1} for {2}", | 1450 | "[PRIM INVENTORY]: Update with item {0} requested of prim {1} for {2}", |
1448 | item.Name, primLocalID, remoteClient.Name); | 1451 | item.Name, primLocalID, remoteClient.Name); |
1449 | part.GetProperties(remoteClient); | 1452 | part.SendPropertiesToClient(remoteClient); |
1450 | if (!Permissions.BypassPermissions()) | 1453 | if (!Permissions.BypassPermissions()) |
1451 | { | 1454 | { |
1452 | if ((item.CurrentPermissions & (uint)PermissionMask.Copy) == 0) | 1455 | if ((item.CurrentPermissions & (uint)PermissionMask.Copy) == 0) |
@@ -1534,7 +1537,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1534 | 1537 | ||
1535 | if (part.Inventory.UpdateInventoryItem(itemInfo)) | 1538 | if (part.Inventory.UpdateInventoryItem(itemInfo)) |
1536 | { | 1539 | { |
1537 | part.GetProperties(remoteClient); | 1540 | part.SendPropertiesToClient(remoteClient); |
1538 | } | 1541 | } |
1539 | } | 1542 | } |
1540 | } | 1543 | } |
@@ -1586,7 +1589,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1586 | // m_log.InfoFormat("[PRIMINVENTORY]: " + | 1589 | // m_log.InfoFormat("[PRIMINVENTORY]: " + |
1587 | // "Rezzed script {0} into prim local ID {1} for user {2}", | 1590 | // "Rezzed script {0} into prim local ID {1} for user {2}", |
1588 | // item.inventoryName, localID, remoteClient.Name); | 1591 | // item.inventoryName, localID, remoteClient.Name); |
1589 | part.GetProperties(remoteClient); | 1592 | part.SendPropertiesToClient(remoteClient); |
1590 | part.ParentGroup.ResumeScripts(); | 1593 | part.ParentGroup.ResumeScripts(); |
1591 | } | 1594 | } |
1592 | else | 1595 | else |
@@ -1644,7 +1647,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1644 | taskItem.AssetID = asset.FullID; | 1647 | taskItem.AssetID = asset.FullID; |
1645 | 1648 | ||
1646 | part.Inventory.AddInventoryItem(taskItem, false); | 1649 | part.Inventory.AddInventoryItem(taskItem, false); |
1647 | part.GetProperties(remoteClient); | 1650 | part.SendPropertiesToClient(remoteClient); |
1648 | 1651 | ||
1649 | part.Inventory.CreateScriptInstance(taskItem, 0, false, DefaultScriptEngine, 0); | 1652 | part.Inventory.CreateScriptInstance(taskItem, 0, false, DefaultScriptEngine, 0); |
1650 | part.ParentGroup.ResumeScripts(); | 1653 | part.ParentGroup.ResumeScripts(); |
@@ -1758,7 +1761,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1758 | 1761 | ||
1759 | if (TryGetScenePresence(srcTaskItem.OwnerID, out avatar)) | 1762 | if (TryGetScenePresence(srcTaskItem.OwnerID, out avatar)) |
1760 | { | 1763 | { |
1761 | destPart.GetProperties(avatar.ControllingClient); | 1764 | destPart.SendPropertiesToClient(avatar.ControllingClient); |
1762 | } | 1765 | } |
1763 | } | 1766 | } |
1764 | 1767 | ||
@@ -2217,7 +2220,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
2217 | SceneObjectPart part = GetSceneObjectPart(localID); | 2220 | SceneObjectPart part = GetSceneObjectPart(localID); |
2218 | if (part == null) | 2221 | if (part == null) |
2219 | continue; | 2222 | continue; |
2220 | part.GetProperties(remoteClient); | 2223 | part.SendPropertiesToClient(remoteClient); |
2221 | } | 2224 | } |
2222 | } | 2225 | } |
2223 | 2226 | ||
diff --git a/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs b/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs index 9da57a8..575079f 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs | |||
@@ -144,7 +144,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
144 | { | 144 | { |
145 | if (((SceneObjectGroup) ent).LocalId == primLocalID) | 145 | if (((SceneObjectGroup) ent).LocalId == primLocalID) |
146 | { | 146 | { |
147 | ((SceneObjectGroup) ent).GetProperties(remoteClient); | 147 | ((SceneObjectGroup) ent).SendPropertiesToClient(remoteClient); |
148 | ((SceneObjectGroup) ent).IsSelected = true; | 148 | ((SceneObjectGroup) ent).IsSelected = true; |
149 | // A prim is only tainted if it's allowed to be edited by the person clicking it. | 149 | // A prim is only tainted if it's allowed to be edited by the person clicking it. |
150 | if (Permissions.CanEditObject(((SceneObjectGroup)ent).UUID, remoteClient.AgentId) | 150 | if (Permissions.CanEditObject(((SceneObjectGroup)ent).UUID, remoteClient.AgentId) |
@@ -167,7 +167,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
167 | { | 167 | { |
168 | if (part.LocalId == primLocalID) | 168 | if (part.LocalId == primLocalID) |
169 | { | 169 | { |
170 | part.GetProperties(remoteClient); | 170 | part.SendPropertiesToClient(remoteClient); |
171 | foundPrim = true; | 171 | foundPrim = true; |
172 | break; | 172 | break; |
173 | } | 173 | } |
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index c5bb2b2..b288c8a 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs | |||
@@ -896,6 +896,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
896 | 896 | ||
897 | if (dm != null) | 897 | if (dm != null) |
898 | m_eventManager.OnPermissionError += dm.SendAlertToUser; | 898 | m_eventManager.OnPermissionError += dm.SendAlertToUser; |
899 | |||
900 | m_eventManager.OnSignificantClientMovement += HandleOnSignificantClientMovement; | ||
899 | } | 901 | } |
900 | 902 | ||
901 | public override string GetSimulatorVersion() | 903 | public override string GetSimulatorVersion() |
@@ -1198,87 +1200,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
1198 | m_dialogModule = RequestModuleInterface<IDialogModule>(); | 1200 | m_dialogModule = RequestModuleInterface<IDialogModule>(); |
1199 | m_capsModule = RequestModuleInterface<ICapabilitiesModule>(); | 1201 | m_capsModule = RequestModuleInterface<ICapabilitiesModule>(); |
1200 | m_teleportModule = RequestModuleInterface<IEntityTransferModule>(); | 1202 | m_teleportModule = RequestModuleInterface<IEntityTransferModule>(); |
1201 | |||
1202 | // Shoving this in here for now, because we have the needed | ||
1203 | // interfaces at this point | ||
1204 | // | ||
1205 | // TODO: Find a better place for this | ||
1206 | // | ||
1207 | while (m_regInfo.EstateSettings.EstateOwner == UUID.Zero && MainConsole.Instance != null) | ||
1208 | { | ||
1209 | MainConsole.Instance.OutputFormat("Estate {0} has no owner set.", m_regInfo.EstateSettings.EstateName); | ||
1210 | List<char> excluded = new List<char>(new char[1]{' '}); | ||
1211 | string first = MainConsole.Instance.CmdPrompt("Estate owner first name", "Test", excluded); | ||
1212 | string last = MainConsole.Instance.CmdPrompt("Estate owner last name", "User", excluded); | ||
1213 | |||
1214 | UserAccount account = UserAccountService.GetUserAccount(m_regInfo.ScopeID, first, last); | ||
1215 | |||
1216 | if (account == null) | ||
1217 | { | ||
1218 | // Create a new account | ||
1219 | account = new UserAccount(m_regInfo.ScopeID, first, last, String.Empty); | ||
1220 | if (account.ServiceURLs == null || (account.ServiceURLs != null && account.ServiceURLs.Count == 0)) | ||
1221 | { | ||
1222 | account.ServiceURLs = new Dictionary<string, object>(); | ||
1223 | account.ServiceURLs["HomeURI"] = string.Empty; | ||
1224 | account.ServiceURLs["GatekeeperURI"] = string.Empty; | ||
1225 | account.ServiceURLs["InventoryServerURI"] = string.Empty; | ||
1226 | account.ServiceURLs["AssetServerURI"] = string.Empty; | ||
1227 | } | ||
1228 | |||
1229 | if (UserAccountService.StoreUserAccount(account)) | ||
1230 | { | ||
1231 | string password = MainConsole.Instance.PasswdPrompt("Password"); | ||
1232 | string email = MainConsole.Instance.CmdPrompt("Email", ""); | ||
1233 | |||
1234 | account.Email = email; | ||
1235 | UserAccountService.StoreUserAccount(account); | ||
1236 | |||
1237 | bool success = false; | ||
1238 | success = AuthenticationService.SetPassword(account.PrincipalID, password); | ||
1239 | if (!success) | ||
1240 | m_log.WarnFormat("[USER ACCOUNT SERVICE]: Unable to set password for account {0} {1}.", | ||
1241 | first, last); | ||
1242 | |||
1243 | GridRegion home = null; | ||
1244 | if (GridService != null) | ||
1245 | { | ||
1246 | List<GridRegion> defaultRegions = GridService.GetDefaultRegions(UUID.Zero); | ||
1247 | if (defaultRegions != null && defaultRegions.Count >= 1) | ||
1248 | home = defaultRegions[0]; | ||
1249 | |||
1250 | if (GridUserService != null && home != null) | ||
1251 | GridUserService.SetHome(account.PrincipalID.ToString(), home.RegionID, new Vector3(128, 128, 0), new Vector3(0, 1, 0)); | ||
1252 | else | ||
1253 | m_log.WarnFormat("[USER ACCOUNT SERVICE]: Unable to set home for account {0} {1}.", | ||
1254 | first, last); | ||
1255 | |||
1256 | } | ||
1257 | else | ||
1258 | m_log.WarnFormat("[USER ACCOUNT SERVICE]: Unable to retrieve home region for account {0} {1}.", | ||
1259 | first, last); | ||
1260 | |||
1261 | if (InventoryService != null) | ||
1262 | success = InventoryService.CreateUserInventory(account.PrincipalID); | ||
1263 | if (!success) | ||
1264 | m_log.WarnFormat("[USER ACCOUNT SERVICE]: Unable to create inventory for account {0} {1}.", | ||
1265 | first, last); | ||
1266 | |||
1267 | |||
1268 | m_log.InfoFormat("[USER ACCOUNT SERVICE]: Account {0} {1} created successfully", first, last); | ||
1269 | |||
1270 | m_regInfo.EstateSettings.EstateOwner = account.PrincipalID; | ||
1271 | m_regInfo.EstateSettings.Save(); | ||
1272 | } | ||
1273 | else | ||
1274 | m_log.ErrorFormat("[SCENE]: Unable to store account. If this simulator is connected to a grid, you must create the estate owner account first."); | ||
1275 | } | ||
1276 | else | ||
1277 | { | ||
1278 | m_regInfo.EstateSettings.EstateOwner = account.PrincipalID; | ||
1279 | m_regInfo.EstateSettings.Save(); | ||
1280 | } | ||
1281 | } | ||
1282 | } | 1203 | } |
1283 | 1204 | ||
1284 | #endregion | 1205 | #endregion |
@@ -1382,28 +1303,12 @@ namespace OpenSim.Region.Framework.Scenes | |||
1382 | tempOnRezMS = Util.EnvironmentTickCountSubtract(tmpTempOnRezMS); | 1303 | tempOnRezMS = Util.EnvironmentTickCountSubtract(tmpTempOnRezMS); |
1383 | } | 1304 | } |
1384 | 1305 | ||
1385 | if (RegionStatus != RegionStatus.SlaveScene) | 1306 | if (Frame % m_update_events == 0) |
1386 | { | 1307 | { |
1387 | if (Frame % m_update_events == 0) | 1308 | int evMS = Util.EnvironmentTickCount(); |
1388 | { | 1309 | UpdateEvents(); |
1389 | int evMS = Util.EnvironmentTickCount(); | 1310 | eventMS = Util.EnvironmentTickCountSubtract(evMS); ; |
1390 | UpdateEvents(); | 1311 | } |
1391 | eventMS = Util.EnvironmentTickCountSubtract(evMS); ; | ||
1392 | } | ||
1393 | |||
1394 | if (Frame % m_update_backup == 0) | ||
1395 | { | ||
1396 | int backMS = Util.EnvironmentTickCount(); | ||
1397 | UpdateStorageBackup(); | ||
1398 | backupMS = Util.EnvironmentTickCountSubtract(backMS); | ||
1399 | } | ||
1400 | |||
1401 | if (Frame % m_update_terrain == 0) | ||
1402 | { | ||
1403 | int terMS = Util.EnvironmentTickCount(); | ||
1404 | UpdateTerrain(); | ||
1405 | terrainMS = Util.EnvironmentTickCountSubtract(terMS); | ||
1406 | } | ||
1407 | 1312 | ||
1408 | // if (Frame % m_update_land == 0) | 1313 | // if (Frame % m_update_land == 0) |
1409 | // { | 1314 | // { |
@@ -1412,26 +1317,46 @@ namespace OpenSim.Region.Framework.Scenes | |||
1412 | // landMS = Util.EnvironmentTickCountSubtract(ldMS); | 1317 | // landMS = Util.EnvironmentTickCountSubtract(ldMS); |
1413 | // } | 1318 | // } |
1414 | 1319 | ||
1415 | frameMS = Util.EnvironmentTickCountSubtract(tmpFrameMS); | 1320 | if (Frame % m_update_backup == 0) |
1416 | otherMS = tempOnRezMS + eventMS + backupMS + terrainMS + landMS; | 1321 | { |
1417 | lastCompletedFrame = Util.EnvironmentTickCount(); | 1322 | int backMS = Util.EnvironmentTickCount(); |
1418 | 1323 | UpdateStorageBackup(); | |
1419 | // if (Frame%m_update_avatars == 0) | 1324 | backupMS = Util.EnvironmentTickCountSubtract(backMS); |
1420 | // UpdateInWorldTime(); | 1325 | } |
1421 | StatsReporter.AddPhysicsFPS(physicsFPS); | 1326 | |
1422 | StatsReporter.AddTimeDilation(TimeDilation); | 1327 | if (Frame % m_update_terrain == 0) |
1423 | StatsReporter.AddFPS(1); | 1328 | { |
1424 | StatsReporter.SetRootAgents(m_sceneGraph.GetRootAgentCount()); | 1329 | int terMS = Util.EnvironmentTickCount(); |
1425 | StatsReporter.SetChildAgents(m_sceneGraph.GetChildAgentCount()); | 1330 | UpdateTerrain(); |
1426 | StatsReporter.SetObjects(m_sceneGraph.GetTotalObjectsCount()); | 1331 | terrainMS = Util.EnvironmentTickCountSubtract(terMS); |
1427 | StatsReporter.SetActiveObjects(m_sceneGraph.GetActiveObjectsCount()); | ||
1428 | StatsReporter.addFrameMS(frameMS); | ||
1429 | StatsReporter.addPhysicsMS(physicsMS + physicsMS2); | ||
1430 | StatsReporter.addOtherMS(otherMS); | ||
1431 | StatsReporter.SetActiveScripts(m_sceneGraph.GetActiveScriptsCount()); | ||
1432 | StatsReporter.addScriptLines(m_sceneGraph.GetScriptLPS()); | ||
1433 | } | 1332 | } |
1434 | 1333 | ||
1334 | //if (Frame % m_update_land == 0) | ||
1335 | //{ | ||
1336 | // int ldMS = Util.EnvironmentTickCount(); | ||
1337 | // UpdateLand(); | ||
1338 | // landMS = Util.EnvironmentTickCountSubtract(ldMS); | ||
1339 | //} | ||
1340 | |||
1341 | frameMS = Util.EnvironmentTickCountSubtract(tmpFrameMS); | ||
1342 | otherMS = tempOnRezMS + eventMS + backupMS + terrainMS + landMS; | ||
1343 | lastCompletedFrame = Util.EnvironmentTickCount(); | ||
1344 | |||
1345 | // if (Frame%m_update_avatars == 0) | ||
1346 | // UpdateInWorldTime(); | ||
1347 | StatsReporter.AddPhysicsFPS(physicsFPS); | ||
1348 | StatsReporter.AddTimeDilation(TimeDilation); | ||
1349 | StatsReporter.AddFPS(1); | ||
1350 | StatsReporter.SetRootAgents(m_sceneGraph.GetRootAgentCount()); | ||
1351 | StatsReporter.SetChildAgents(m_sceneGraph.GetChildAgentCount()); | ||
1352 | StatsReporter.SetObjects(m_sceneGraph.GetTotalObjectsCount()); | ||
1353 | StatsReporter.SetActiveObjects(m_sceneGraph.GetActiveObjectsCount()); | ||
1354 | StatsReporter.addFrameMS(frameMS); | ||
1355 | StatsReporter.addPhysicsMS(physicsMS + physicsMS2); | ||
1356 | StatsReporter.addOtherMS(otherMS); | ||
1357 | StatsReporter.SetActiveScripts(m_sceneGraph.GetActiveScriptsCount()); | ||
1358 | StatsReporter.addScriptLines(m_sceneGraph.GetScriptLPS()); | ||
1359 | |||
1435 | if (LoginsDisabled && Frame == 20) | 1360 | if (LoginsDisabled && Frame == 20) |
1436 | { | 1361 | { |
1437 | // In 99.9% of cases it is a bad idea to manually force garbage collection. However, | 1362 | // In 99.9% of cases it is a bad idea to manually force garbage collection. However, |
@@ -2603,9 +2528,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
2603 | RootPrim.RemFlag(PrimFlags.TemporaryOnRez); | 2528 | RootPrim.RemFlag(PrimFlags.TemporaryOnRez); |
2604 | 2529 | ||
2605 | if (AttachmentsModule != null) | 2530 | if (AttachmentsModule != null) |
2606 | AttachmentsModule.AttachObject(sp.ControllingClient, grp, 0, false); | 2531 | AttachmentsModule.AttachObject(sp, grp, 0, false); |
2607 | |||
2608 | m_log.DebugFormat("[SCENE]: Attachment {0} arrived and scene presence was found, attaching", sceneObject.UUID); | ||
2609 | } | 2532 | } |
2610 | else | 2533 | else |
2611 | { | 2534 | { |
@@ -5477,7 +5400,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
5477 | return true; | 5400 | return true; |
5478 | } | 5401 | } |
5479 | 5402 | ||
5480 | public void StartTimerWatchdog() | 5403 | public void StartTimerWatchdog() |
5481 | { | 5404 | { |
5482 | m_timerWatchdog.Interval = 1000; | 5405 | m_timerWatchdog.Interval = 1000; |
5483 | m_timerWatchdog.Elapsed += TimerWatchdog; | 5406 | m_timerWatchdog.Elapsed += TimerWatchdog; |
@@ -5488,6 +5411,70 @@ namespace OpenSim.Region.Framework.Scenes | |||
5488 | public void TimerWatchdog(object sender, ElapsedEventArgs e) | 5411 | public void TimerWatchdog(object sender, ElapsedEventArgs e) |
5489 | { | 5412 | { |
5490 | CheckHeartbeat(); | 5413 | CheckHeartbeat(); |
5414 | } | ||
5415 | |||
5416 | /// This method deals with movement when an avatar is automatically moving (but this is distinct from the | ||
5417 | /// autopilot that moves an avatar to a sit target!. | ||
5418 | /// </summary> | ||
5419 | /// <remarks> | ||
5420 | /// This is not intended as a permament location for this method. | ||
5421 | /// </remarks> | ||
5422 | /// <param name="presence"></param> | ||
5423 | private void HandleOnSignificantClientMovement(ScenePresence presence) | ||
5424 | { | ||
5425 | if (presence.MovingToTarget) | ||
5426 | { | ||
5427 | double distanceToTarget = Util.GetDistanceTo(presence.AbsolutePosition, presence.MoveToPositionTarget); | ||
5428 | // m_log.DebugFormat( | ||
5429 | // "[SCENE]: Abs pos of {0} is {1}, target {2}, distance {3}", | ||
5430 | // presence.Name, presence.AbsolutePosition, presence.MoveToPositionTarget, distanceToTarget); | ||
5431 | |||
5432 | // Check the error term of the current position in relation to the target position | ||
5433 | if (distanceToTarget <= ScenePresence.SIGNIFICANT_MOVEMENT) | ||
5434 | { | ||
5435 | // We are close enough to the target | ||
5436 | // m_log.DebugFormat("[SCENEE]: Stopping autopilot of {0}", presence.Name); | ||
5437 | |||
5438 | presence.Velocity = Vector3.Zero; | ||
5439 | presence.AbsolutePosition = presence.MoveToPositionTarget; | ||
5440 | presence.ResetMoveToTarget(); | ||
5441 | |||
5442 | if (presence.PhysicsActor.Flying) | ||
5443 | { | ||
5444 | // A horrible hack to stop the avatar dead in its tracks rather than having them overshoot | ||
5445 | // the target if flying. | ||
5446 | // We really need to be more subtle (slow the avatar as it approaches the target) or at | ||
5447 | // least be able to set collision status once, rather than 5 times to give it enough | ||
5448 | // weighting so that that PhysicsActor thinks it really is colliding. | ||
5449 | for (int i = 0; i < 5; i++) | ||
5450 | presence.PhysicsActor.IsColliding = true; | ||
5451 | |||
5452 | if (presence.LandAtTarget) | ||
5453 | presence.PhysicsActor.Flying = false; | ||
5454 | |||
5455 | // Vector3 targetPos = presence.MoveToPositionTarget; | ||
5456 | // float terrainHeight = (float)presence.Scene.Heightmap[(int)targetPos.X, (int)targetPos.Y]; | ||
5457 | // if (targetPos.Z - terrainHeight < 0.2) | ||
5458 | // { | ||
5459 | // presence.PhysicsActor.Flying = false; | ||
5460 | // } | ||
5461 | } | ||
5462 | |||
5463 | // m_log.DebugFormat( | ||
5464 | // "[SCENE]: AgentControlFlags {0}, MovementFlag {1} for {2}", | ||
5465 | // presence.AgentControlFlags, presence.MovementFlag, presence.Name); | ||
5466 | } | ||
5467 | else | ||
5468 | { | ||
5469 | // m_log.DebugFormat( | ||
5470 | // "[SCENE]: Updating npc {0} at {1} for next movement to {2}", | ||
5471 | // presence.Name, presence.AbsolutePosition, presence.MoveToPositionTarget); | ||
5472 | |||
5473 | Vector3 agent_control_v3 = new Vector3(); | ||
5474 | presence.HandleMoveToTargetUpdate(ref agent_control_v3); | ||
5475 | presence.AddNewMovement(agent_control_v3); | ||
5476 | } | ||
5477 | } | ||
5491 | } | 5478 | } |
5492 | } | 5479 | } |
5493 | } | 5480 | } |
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index 3e1439d..7493368 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | |||
@@ -1312,13 +1312,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
1312 | part.ClearUndoState(); | 1312 | part.ClearUndoState(); |
1313 | } | 1313 | } |
1314 | 1314 | ||
1315 | public override void UpdateMovement() | ||
1316 | { | ||
1317 | SceneObjectPart[] parts = m_parts.GetArray(); | ||
1318 | for (int i = 0; i < parts.Length; i++) | ||
1319 | parts[i].UpdateMovement(); | ||
1320 | } | ||
1321 | |||
1322 | public ushort GetTimeDilation() | 1315 | public ushort GetTimeDilation() |
1323 | { | 1316 | { |
1324 | return Utils.FloatToUInt16(m_scene.TimeDilation, 0.0f, 1.0f); | 1317 | return Utils.FloatToUInt16(m_scene.TimeDilation, 0.0f, 1.0f); |
@@ -1486,7 +1479,15 @@ namespace OpenSim.Region.Framework.Scenes | |||
1486 | avatar.StandUp(); | 1479 | avatar.StandUp(); |
1487 | 1480 | ||
1488 | if (!silent) | 1481 | if (!silent) |
1482 | { | ||
1489 | part.UpdateFlag = 0; | 1483 | part.UpdateFlag = 0; |
1484 | if (part == m_rootPart) | ||
1485 | { | ||
1486 | if (!IsAttachment || (AttachedAvatar == avatar.ControllingClient.AgentId) || | ||
1487 | (AttachmentPoint < 31) || (AttachmentPoint > 38)) | ||
1488 | avatar.ControllingClient.SendKillObject(m_regionHandle, new List<uint>() {part.LocalId}); | ||
1489 | } | ||
1490 | } | ||
1490 | }); | 1491 | }); |
1491 | } | 1492 | } |
1492 | 1493 | ||
@@ -1939,7 +1940,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1939 | ScenePresence avatar = m_scene.GetScenePresence(AttachedAvatar); | 1940 | ScenePresence avatar = m_scene.GetScenePresence(AttachedAvatar); |
1940 | if (avatar != null) | 1941 | if (avatar != null) |
1941 | { | 1942 | { |
1942 | avatar.MoveToTarget(target, false); | 1943 | avatar.MoveToTarget(target, false, false); |
1943 | } | 1944 | } |
1944 | } | 1945 | } |
1945 | else | 1946 | else |
@@ -2104,8 +2105,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
2104 | 2105 | ||
2105 | #endregion | 2106 | #endregion |
2106 | 2107 | ||
2107 | #region Scheduling | ||
2108 | |||
2109 | public override void Update() | 2108 | public override void Update() |
2110 | { | 2109 | { |
2111 | // Check that the group was not deleted before the scheduled update | 2110 | // Check that the group was not deleted before the scheduled update |
@@ -2256,7 +2255,14 @@ namespace OpenSim.Region.Framework.Scenes | |||
2256 | parts[i].SendTerseUpdateToAllClients(); | 2255 | parts[i].SendTerseUpdateToAllClients(); |
2257 | } | 2256 | } |
2258 | 2257 | ||
2259 | #endregion | 2258 | /// <summary> |
2259 | /// Send metadata about the root prim (name, description, sale price, etc.) to a client. | ||
2260 | /// </summary> | ||
2261 | /// <param name="client"></param> | ||
2262 | public void SendPropertiesToClient(IClientAPI client) | ||
2263 | { | ||
2264 | m_rootPart.SendPropertiesToClient(client); | ||
2265 | } | ||
2260 | 2266 | ||
2261 | #region SceneGroupPart Methods | 2267 | #region SceneGroupPart Methods |
2262 | 2268 | ||
@@ -2752,15 +2758,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
2752 | } | 2758 | } |
2753 | 2759 | ||
2754 | /// <summary> | 2760 | /// <summary> |
2755 | /// Return metadata about a prim (name, description, sale price, etc.) | ||
2756 | /// </summary> | ||
2757 | /// <param name="client"></param> | ||
2758 | public void GetProperties(IClientAPI client) | ||
2759 | { | ||
2760 | m_rootPart.GetProperties(client); | ||
2761 | } | ||
2762 | |||
2763 | /// <summary> | ||
2764 | /// Set the name of a prim | 2761 | /// Set the name of a prim |
2765 | /// </summary> | 2762 | /// </summary> |
2766 | /// <param name="name"></param> | 2763 | /// <param name="name"></param> |
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index 0c3b404..1a96f1b 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | |||
@@ -804,7 +804,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
804 | if (av.LinkedPrim == m_uuid) | 804 | if (av.LinkedPrim == m_uuid) |
805 | { | 805 | { |
806 | Vector3 offset = (m_offsetPosition - oldpos); | 806 | Vector3 offset = (m_offsetPosition - oldpos); |
807 | av.OffsetPosition += offset; | 807 | av.AbsolutePosition += offset; |
808 | av.SendAvatarDataToAllAgents(); | 808 | av.SendAvatarDataToAllAgents(); |
809 | } | 809 | } |
810 | } | 810 | } |
@@ -1357,8 +1357,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
1357 | 1357 | ||
1358 | #endregion Public Properties with only Get | 1358 | #endregion Public Properties with only Get |
1359 | 1359 | ||
1360 | #region Private Methods | ||
1361 | |||
1362 | private uint ApplyMask(uint val, bool set, uint mask) | 1360 | private uint ApplyMask(uint val, bool set, uint mask) |
1363 | { | 1361 | { |
1364 | if (set) | 1362 | if (set) |
@@ -1371,14 +1369,35 @@ namespace OpenSim.Region.Framework.Scenes | |||
1371 | } | 1369 | } |
1372 | } | 1370 | } |
1373 | 1371 | ||
1374 | private void SendObjectPropertiesToClient(UUID AgentID) | 1372 | /// <summary> |
1373 | /// Clear all pending updates of parts to clients | ||
1374 | /// </summary> | ||
1375 | private void ClearUpdateSchedule() | ||
1376 | { | ||
1377 | m_updateFlag = 0; | ||
1378 | } | ||
1379 | |||
1380 | /// <summary> | ||
1381 | /// Send this part's properties (name, description, inventory serial, base mask, etc.) to a client | ||
1382 | /// </summary> | ||
1383 | /// <param name="client"></param> | ||
1384 | public void SendPropertiesToClient(IClientAPI client) | ||
1385 | { | ||
1386 | client.SendObjectPropertiesReply(this); | ||
1387 | } | ||
1388 | |||
1389 | /// <summary> | ||
1390 | /// For the scene object group to which this part belongs, send that scene object's root part properties to a client. | ||
1391 | /// </summary> | ||
1392 | /// <param name="AgentID"></param> | ||
1393 | private void SendRootPartPropertiesToClient(UUID AgentID) | ||
1375 | { | 1394 | { |
1376 | m_parentGroup.Scene.ForEachScenePresence(delegate(ScenePresence avatar) | 1395 | m_parentGroup.Scene.ForEachScenePresence(delegate(ScenePresence avatar) |
1377 | { | 1396 | { |
1378 | // Ugly reference :( | 1397 | // Ugly reference :( |
1379 | if (avatar.UUID == AgentID) | 1398 | if (avatar.UUID == AgentID) |
1380 | { | 1399 | { |
1381 | m_parentGroup.GetProperties(avatar.ControllingClient); | 1400 | m_parentGroup.SendPropertiesToClient(avatar.ControllingClient); |
1382 | } | 1401 | } |
1383 | }); | 1402 | }); |
1384 | } | 1403 | } |
@@ -1407,8 +1426,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
1407 | // } | 1426 | // } |
1408 | // } | 1427 | // } |
1409 | 1428 | ||
1410 | #endregion Private Methods | ||
1411 | |||
1412 | #region Public Methods | 1429 | #region Public Methods |
1413 | 1430 | ||
1414 | public void ResetExpire() | 1431 | public void ResetExpire() |
@@ -1752,20 +1769,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
1752 | Name, LocalId, id); | 1769 | Name, LocalId, id); |
1753 | } | 1770 | } |
1754 | 1771 | ||
1755 | public static SceneObjectPart Create() | ||
1756 | { | ||
1757 | SceneObjectPart part = new SceneObjectPart(); | ||
1758 | part.UUID = UUID.Random(); | ||
1759 | |||
1760 | PrimitiveBaseShape shape = PrimitiveBaseShape.Create(); | ||
1761 | part.Shape = shape; | ||
1762 | |||
1763 | part.Name = "Object"; | ||
1764 | part._ownerID = UUID.Random(); | ||
1765 | |||
1766 | return part; | ||
1767 | } | ||
1768 | |||
1769 | /// <summary> | 1772 | /// <summary> |
1770 | /// Do a physics property update for a NINJA joint. | 1773 | /// Do a physics property update for a NINJA joint. |
1771 | /// </summary> | 1774 | /// </summary> |
@@ -2077,11 +2080,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
2077 | return Vector3.Zero; | 2080 | return Vector3.Zero; |
2078 | } | 2081 | } |
2079 | 2082 | ||
2080 | public void GetProperties(IClientAPI client) | ||
2081 | { | ||
2082 | client.SendObjectPropertiesReply(this); | ||
2083 | } | ||
2084 | |||
2085 | /// <summary> | 2083 | /// <summary> |
2086 | /// Method for a prim to get it's world position from the group. | 2084 | /// Method for a prim to get it's world position from the group. |
2087 | /// </summary> | 2085 | /// </summary> |
@@ -3055,6 +3053,10 @@ namespace OpenSim.Region.Framework.Scenes | |||
3055 | if (ParentGroup.IsDeleted) | 3053 | if (ParentGroup.IsDeleted) |
3056 | return; | 3054 | return; |
3057 | 3055 | ||
3056 | if (ParentGroup.IsAttachment && (ParentGroup.AttachedAvatar != remoteClient.AgentId) && | ||
3057 | (ParentGroup.AttachmentPoint >= 31) && (ParentGroup.AttachmentPoint <= 38)) | ||
3058 | return; | ||
3059 | |||
3058 | clientFlags &= ~(uint) PrimFlags.CreateSelected; | 3060 | clientFlags &= ~(uint) PrimFlags.CreateSelected; |
3059 | 3061 | ||
3060 | if (remoteClient.AgentId == _ownerID) | 3062 | if (remoteClient.AgentId == _ownerID) |
@@ -3500,7 +3502,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
3500 | { | 3502 | { |
3501 | _groupID = groupID; | 3503 | _groupID = groupID; |
3502 | if (client != null) | 3504 | if (client != null) |
3503 | GetProperties(client); | 3505 | SendPropertiesToClient(client); |
3504 | m_updateFlag = 2; | 3506 | m_updateFlag = 2; |
3505 | } | 3507 | } |
3506 | 3508 | ||
@@ -4242,10 +4244,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
4242 | } | 4244 | } |
4243 | } | 4245 | } |
4244 | 4246 | ||
4245 | public virtual void UpdateMovement() | ||
4246 | { | ||
4247 | } | ||
4248 | |||
4249 | /// <summary> | 4247 | /// <summary> |
4250 | /// | 4248 | /// |
4251 | /// </summary> | 4249 | /// </summary> |
@@ -4320,10 +4318,10 @@ namespace OpenSim.Region.Framework.Scenes | |||
4320 | 4318 | ||
4321 | break; | 4319 | break; |
4322 | } | 4320 | } |
4323 | SendFullUpdateToAllClients(); | ||
4324 | 4321 | ||
4325 | SendObjectPropertiesToClient(AgentID); | 4322 | SendFullUpdateToAllClients(); |
4326 | 4323 | ||
4324 | SendRootPartPropertiesToClient(AgentID); | ||
4327 | } | 4325 | } |
4328 | } | 4326 | } |
4329 | 4327 | ||
@@ -4844,7 +4842,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
4844 | if (ParentGroup.IsDeleted) | 4842 | if (ParentGroup.IsDeleted) |
4845 | return; | 4843 | return; |
4846 | 4844 | ||
4847 | if (ParentGroup.IsAttachment && ParentGroup.RootPart != this) | 4845 | if (ParentGroup.IsAttachment && ((ParentGroup.RootPart != this) || |
4846 | ((ParentGroup.AttachedAvatar != remoteClient.AgentId) && (ParentGroup.AttachmentPoint >= 31) && (ParentGroup.AttachmentPoint <= 38)))) | ||
4848 | return; | 4847 | return; |
4849 | 4848 | ||
4850 | // Causes this thread to dig into the Client Thread Data. | 4849 | // Causes this thread to dig into the Client Thread Data. |
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs index f6b690c..4edc220 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs | |||
@@ -988,11 +988,16 @@ namespace OpenSim.Region.Framework.Scenes | |||
988 | 988 | ||
989 | private bool CreateInventoryFileName() | 989 | private bool CreateInventoryFileName() |
990 | { | 990 | { |
991 | // m_log.DebugFormat( | ||
992 | // "[PRIM INVENTORY]: Creating inventory file for {0} {1} {2}, serial {3}", | ||
993 | // m_part.Name, m_part.UUID, m_part.LocalId, m_inventorySerial); | ||
994 | |||
991 | if (m_inventoryFileName == String.Empty || | 995 | if (m_inventoryFileName == String.Empty || |
992 | m_inventoryFileNameSerial < m_inventorySerial) | 996 | m_inventoryFileNameSerial < m_inventorySerial) |
993 | { | 997 | { |
994 | m_inventoryFileName = "inventory_" + UUID.Random().ToString() + ".tmp"; | 998 | m_inventoryFileName = "inventory_" + UUID.Random().ToString() + ".tmp"; |
995 | m_inventoryFileNameSerial = m_inventorySerial; | 999 | m_inventoryFileNameSerial = m_inventorySerial; |
1000 | |||
996 | return true; | 1001 | return true; |
997 | } | 1002 | } |
998 | 1003 | ||
@@ -1025,6 +1030,12 @@ namespace OpenSim.Region.Framework.Scenes | |||
1025 | return; | 1030 | return; |
1026 | } | 1031 | } |
1027 | 1032 | ||
1033 | if (m_items.Count == 0) // No inventory | ||
1034 | { | ||
1035 | client.SendTaskInventory(m_part.UUID, 0, new byte[0]); | ||
1036 | return; | ||
1037 | } | ||
1038 | |||
1028 | if (!changed) | 1039 | if (!changed) |
1029 | { | 1040 | { |
1030 | if (m_inventoryFileData.Length > 2) | 1041 | if (m_inventoryFileData.Length > 2) |
@@ -1096,10 +1107,12 @@ namespace OpenSim.Region.Framework.Scenes | |||
1096 | if (m_inventoryFileData.Length > 2) | 1107 | if (m_inventoryFileData.Length > 2) |
1097 | { | 1108 | { |
1098 | xferManager.AddNewFile(m_inventoryFileName, m_inventoryFileData); | 1109 | xferManager.AddNewFile(m_inventoryFileName, m_inventoryFileData); |
1110 | client.SendTaskInventory(m_part.UUID, (short)m_inventorySerial, | ||
1111 | Util.StringToBytes256(m_inventoryFileName)); | ||
1112 | return; | ||
1099 | } | 1113 | } |
1100 | 1114 | ||
1101 | client.SendTaskInventory(m_part.UUID, (short)m_inventorySerial, | 1115 | client.SendTaskInventory(m_part.UUID, 0, new byte[0]); |
1102 | Util.StringToBytes256(m_inventoryFileName)); | ||
1103 | } | 1116 | } |
1104 | 1117 | ||
1105 | /// <summary> | 1118 | /// <summary> |
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index fa6945c..dee9bc3 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs | |||
@@ -71,7 +71,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
71 | { | 71 | { |
72 | // ~ScenePresence() | 72 | // ~ScenePresence() |
73 | // { | 73 | // { |
74 | // m_log.Debug("[ScenePresence] Destructor called"); | 74 | // m_log.Debug("[SCENE PRESENCE] Destructor called"); |
75 | // } | 75 | // } |
76 | 76 | ||
77 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 77 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
@@ -191,8 +191,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
191 | 191 | ||
192 | private Quaternion m_bodyRot = Quaternion.Identity; | 192 | private Quaternion m_bodyRot = Quaternion.Identity; |
193 | 193 | ||
194 | private Quaternion m_bodyRotPrevious = Quaternion.Identity; | ||
195 | |||
196 | private const int LAND_VELOCITYMAG_MAX = 12; | 194 | private const int LAND_VELOCITYMAG_MAX = 12; |
197 | 195 | ||
198 | public bool IsRestrictedToRegion; | 196 | public bool IsRestrictedToRegion; |
@@ -238,6 +236,11 @@ namespace OpenSim.Region.Framework.Scenes | |||
238 | public Vector3 MoveToPositionTarget { get; private set; } | 236 | public Vector3 MoveToPositionTarget { get; private set; } |
239 | private Quaternion m_offsetRotation = new Quaternion(0.0f, 0.0f, 0.0f, 1.0f); | 237 | private Quaternion m_offsetRotation = new Quaternion(0.0f, 0.0f, 0.0f, 1.0f); |
240 | 238 | ||
239 | /// <summary> | ||
240 | /// Controls whether an avatar automatically moving to a target will land when it gets there (if flying). | ||
241 | /// </summary> | ||
242 | public bool LandAtTarget { get; private set; } | ||
243 | |||
241 | private bool m_followCamAuto; | 244 | private bool m_followCamAuto; |
242 | 245 | ||
243 | private int m_movementUpdateCount; | 246 | private int m_movementUpdateCount; |
@@ -492,7 +495,13 @@ namespace OpenSim.Region.Framework.Scenes | |||
492 | PhysicsActor actor = m_physicsActor; | 495 | PhysicsActor actor = m_physicsActor; |
493 | // if (actor != null) | 496 | // if (actor != null) |
494 | if ((actor != null) && (m_parentID == 0)) // KF Do NOT update m_pos here if Av is sitting! | 497 | if ((actor != null) && (m_parentID == 0)) // KF Do NOT update m_pos here if Av is sitting! |
498 | { | ||
495 | m_pos = actor.Position; | 499 | m_pos = actor.Position; |
500 | |||
501 | // m_log.DebugFormat( | ||
502 | // "[SCENE PRESENCE]: Set position {0} for {1} in {2} via getting AbsolutePosition!", | ||
503 | // m_pos, Name, Scene.RegionInfo.RegionName); | ||
504 | } | ||
496 | else | 505 | else |
497 | { | 506 | { |
498 | // Obtain the correct position of a seated avatar. | 507 | // Obtain the correct position of a seated avatar. |
@@ -536,20 +545,28 @@ namespace OpenSim.Region.Framework.Scenes | |||
536 | } | 545 | } |
537 | catch (Exception e) | 546 | catch (Exception e) |
538 | { | 547 | { |
539 | m_log.Error("[SCENEPRESENCE]: ABSOLUTE POSITION " + e.Message); | 548 | m_log.Error("[SCENE PRESENCE]: ABSOLUTE POSITION " + e.Message); |
540 | } | 549 | } |
541 | } | 550 | } |
542 | 551 | ||
543 | if (m_parentID == 0) // KF Do NOT update m_pos here if Av is sitting! | 552 | // Changed this to update unconditionally to make npose work |
553 | // if (m_parentID == 0) // KF Do NOT update m_pos here if Av is sitting! | ||
544 | m_pos = value; | 554 | m_pos = value; |
545 | m_parentPosition = Vector3.Zero; | 555 | m_parentPosition = Vector3.Zero; |
556 | |||
557 | // m_log.DebugFormat( | ||
558 | // "[ENTITY BASE]: In {0} set AbsolutePosition of {1} to {2}", | ||
559 | // Scene.RegionInfo.RegionName, Name, m_pos); | ||
546 | } | 560 | } |
547 | } | 561 | } |
548 | 562 | ||
563 | /// <summary> | ||
564 | /// If sitting, returns the offset position from the prim the avatar is sitting on. | ||
565 | /// Otherwise, returns absolute position in the scene. | ||
566 | /// </summary> | ||
549 | public Vector3 OffsetPosition | 567 | public Vector3 OffsetPosition |
550 | { | 568 | { |
551 | get { return m_pos; } | 569 | get { return m_pos; } |
552 | set { m_pos = value; } | ||
553 | } | 570 | } |
554 | 571 | ||
555 | /// <summary> | 572 | /// <summary> |
@@ -561,8 +578,14 @@ namespace OpenSim.Region.Framework.Scenes | |||
561 | { | 578 | { |
562 | PhysicsActor actor = m_physicsActor; | 579 | PhysicsActor actor = m_physicsActor; |
563 | if (actor != null) | 580 | if (actor != null) |
581 | { | ||
564 | m_velocity = actor.Velocity; | 582 | m_velocity = actor.Velocity; |
565 | 583 | ||
584 | // m_log.DebugFormat( | ||
585 | // "[SCENE PRESENCE]: Set velocity {0} for {1} in {2} via getting Velocity!", | ||
586 | // m_velocity, Name, Scene.RegionInfo.RegionName); | ||
587 | } | ||
588 | |||
566 | return m_velocity; | 589 | return m_velocity; |
567 | } | 590 | } |
568 | set | 591 | set |
@@ -577,11 +600,15 @@ namespace OpenSim.Region.Framework.Scenes | |||
577 | } | 600 | } |
578 | catch (Exception e) | 601 | catch (Exception e) |
579 | { | 602 | { |
580 | m_log.Error("[SCENEPRESENCE]: VELOCITY " + e.Message); | 603 | m_log.Error("[SCENE PRESENCE]: VELOCITY " + e.Message); |
581 | } | 604 | } |
582 | } | 605 | } |
583 | 606 | ||
584 | m_velocity = value; | 607 | m_velocity = value; |
608 | |||
609 | // m_log.DebugFormat( | ||
610 | // "[SCENE PRESENCE]: In {0} set velocity of {1} to {2}", | ||
611 | // Scene.RegionInfo.RegionName, Name, m_velocity); | ||
585 | } | 612 | } |
586 | } | 613 | } |
587 | 614 | ||
@@ -620,12 +647,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
620 | } | 647 | } |
621 | } | 648 | } |
622 | 649 | ||
623 | public Quaternion PreviousRotation | ||
624 | { | ||
625 | get { return m_bodyRotPrevious; } | ||
626 | set { m_bodyRotPrevious = value; } | ||
627 | } | ||
628 | |||
629 | /// <summary> | 650 | /// <summary> |
630 | /// If this is true, agent doesn't have a representation in this scene. | 651 | /// If this is true, agent doesn't have a representation in this scene. |
631 | /// this is an agent 'looking into' this scene from a nearby scene(region) | 652 | /// this is an agent 'looking into' this scene from a nearby scene(region) |
@@ -1126,7 +1147,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1126 | Animator.ResetAnimations(); | 1147 | Animator.ResetAnimations(); |
1127 | 1148 | ||
1128 | // m_log.DebugFormat( | 1149 | // m_log.DebugFormat( |
1129 | // "[SCENEPRESENCE]: Downgrading root agent {0}, {1} to a child agent in {2}", | 1150 | // "[SCENE PRESENCE]: Downgrading root agent {0}, {1} to a child agent in {2}", |
1130 | // Name, UUID, m_scene.RegionInfo.RegionName); | 1151 | // Name, UUID, m_scene.RegionInfo.RegionName); |
1131 | 1152 | ||
1132 | // Don't zero out the velocity since this can cause problems when an avatar is making a region crossing, | 1153 | // Don't zero out the velocity since this can cause problems when an avatar is making a region crossing, |
@@ -1302,7 +1323,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1302 | m_callbackURI = null; | 1323 | m_callbackURI = null; |
1303 | } | 1324 | } |
1304 | 1325 | ||
1305 | //m_log.DebugFormat("Completed movement"); | 1326 | //m_log.DebugFormat("[SCENE PRESENCE] Completed movement"); |
1306 | 1327 | ||
1307 | m_controllingClient.MoveAgentIntoRegion(m_scene.RegionInfo, AbsolutePosition, look); | 1328 | m_controllingClient.MoveAgentIntoRegion(m_scene.RegionInfo, AbsolutePosition, look); |
1308 | SendInitialData(); | 1329 | SendInitialData(); |
@@ -1813,7 +1834,10 @@ namespace OpenSim.Region.Framework.Scenes | |||
1813 | /// This is to allow movement to targets that are known to be on an elevated platform with a continuous path | 1834 | /// This is to allow movement to targets that are known to be on an elevated platform with a continuous path |
1814 | /// from start to finish. | 1835 | /// from start to finish. |
1815 | /// </param> | 1836 | /// </param> |
1816 | public void MoveToTarget(Vector3 pos, bool noFly) | 1837 | /// <param name="landAtTarget"> |
1838 | /// If true and the avatar starts flying during the move then land at the target. | ||
1839 | /// </param> | ||
1840 | public void MoveToTarget(Vector3 pos, bool noFly, bool landAtTarget) | ||
1817 | { | 1841 | { |
1818 | m_log.DebugFormat( | 1842 | m_log.DebugFormat( |
1819 | "[SCENE PRESENCE]: Avatar {0} received request to move to position {1} in {2}", | 1843 | "[SCENE PRESENCE]: Avatar {0} received request to move to position {1} in {2}", |
@@ -1839,7 +1863,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1839 | 1863 | ||
1840 | // Fudge factor. It appears that if one clicks "go here" on a piece of ground, the go here request is | 1864 | // Fudge factor. It appears that if one clicks "go here" on a piece of ground, the go here request is |
1841 | // always slightly higher than the actual terrain height. | 1865 | // always slightly higher than the actual terrain height. |
1842 | // FIXME: This constrains NOC movements as well, so should be somewhere else. | 1866 | // FIXME: This constrains NPC movements as well, so should be somewhere else. |
1843 | if (pos.Z - terrainHeight < 0.2) | 1867 | if (pos.Z - terrainHeight < 0.2) |
1844 | pos.Z = terrainHeight; | 1868 | pos.Z = terrainHeight; |
1845 | 1869 | ||
@@ -1852,9 +1876,25 @@ namespace OpenSim.Region.Framework.Scenes | |||
1852 | else if (pos.Z > terrainHeight) | 1876 | else if (pos.Z > terrainHeight) |
1853 | PhysicsActor.Flying = true; | 1877 | PhysicsActor.Flying = true; |
1854 | 1878 | ||
1879 | LandAtTarget = landAtTarget; | ||
1855 | MovingToTarget = true; | 1880 | MovingToTarget = true; |
1856 | MoveToPositionTarget = pos; | 1881 | MoveToPositionTarget = pos; |
1857 | 1882 | ||
1883 | // Rotate presence around the z-axis to point in same direction as movement. | ||
1884 | // Ignore z component of vector | ||
1885 | Vector3 localVectorToTarget3D = pos - AbsolutePosition; | ||
1886 | Vector3 localVectorToTarget2D = new Vector3((float)(localVectorToTarget3D.X), (float)(localVectorToTarget3D.Y), 0f); | ||
1887 | |||
1888 | // m_log.DebugFormat("[SCENE PRESENCE]: Local vector to target is {0}", localVectorToTarget2D); | ||
1889 | |||
1890 | // Calculate the yaw. | ||
1891 | Vector3 angle = new Vector3(0, 0, (float)(Math.Atan2(localVectorToTarget2D.Y, localVectorToTarget2D.X))); | ||
1892 | |||
1893 | // m_log.DebugFormat("[SCENE PRESENCE]: Angle is {0}", angle); | ||
1894 | |||
1895 | Rotation = Quaternion.CreateFromEulers(angle); | ||
1896 | // m_log.DebugFormat("[SCENE PRESENCE]: Body rot for {0} set to {1}", Name, Rotation); | ||
1897 | |||
1858 | Vector3 agent_control_v3 = new Vector3(); | 1898 | Vector3 agent_control_v3 = new Vector3(); |
1859 | HandleMoveToTargetUpdate(ref agent_control_v3); | 1899 | HandleMoveToTargetUpdate(ref agent_control_v3); |
1860 | AddNewMovement(agent_control_v3); | 1900 | AddNewMovement(agent_control_v3); |
@@ -2744,7 +2784,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
2744 | Vector3 pos = m_pos; | 2784 | Vector3 pos = m_pos; |
2745 | pos.Z += m_appearance.HipOffset; | 2785 | pos.Z += m_appearance.HipOffset; |
2746 | 2786 | ||
2747 | //m_log.DebugFormat("[SCENEPRESENCE]: TerseUpdate: Pos={0} Rot={1} Vel={2}", m_pos, m_bodyRot, m_velocity); | 2787 | //m_log.DebugFormat("[SCENE PRESENCE]: " + Name + " sending TerseUpdate to " + remoteClient.Name + " : Pos={0} Rot={1} Vel={2}", m_pos, m_bodyRot, m_velocity); |
2748 | 2788 | ||
2749 | remoteClient.SendPrimUpdate( | 2789 | remoteClient.SendPrimUpdate( |
2750 | this, | 2790 | this, |
@@ -2831,6 +2871,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
2831 | /// </summary> | 2871 | /// </summary> |
2832 | private void SendInitialData() | 2872 | private void SendInitialData() |
2833 | { | 2873 | { |
2874 | //m_log.DebugFormat("[SCENE PRESENCE] SendInitialData: {0} ({1})", Name, UUID); | ||
2834 | // Moved this into CompleteMovement to ensure that m_appearance is initialized before | 2875 | // Moved this into CompleteMovement to ensure that m_appearance is initialized before |
2835 | // the inventory arrives | 2876 | // the inventory arrives |
2836 | // m_scene.GetAvatarAppearance(m_controllingClient, out m_appearance); | 2877 | // m_scene.GetAvatarAppearance(m_controllingClient, out m_appearance); |
@@ -2875,10 +2916,11 @@ namespace OpenSim.Region.Framework.Scenes | |||
2875 | /// </summary> | 2916 | /// </summary> |
2876 | public void SendAvatarDataToAllAgents() | 2917 | public void SendAvatarDataToAllAgents() |
2877 | { | 2918 | { |
2919 | //m_log.DebugFormat("[SCENE PRESENCE] SendAvatarDataToAllAgents: {0} ({1})", Name, UUID); | ||
2878 | // only send update from root agents to other clients; children are only "listening posts" | 2920 | // only send update from root agents to other clients; children are only "listening posts" |
2879 | if (IsChildAgent) | 2921 | if (IsChildAgent) |
2880 | { | 2922 | { |
2881 | m_log.Warn("[SCENEPRESENCE] attempt to send avatar data from a child agent"); | 2923 | m_log.Warn("[SCENE PRESENCE] attempt to send avatar data from a child agent"); |
2882 | return; | 2924 | return; |
2883 | } | 2925 | } |
2884 | 2926 | ||
@@ -2928,7 +2970,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
2928 | /// <param name="avatar"></param> | 2970 | /// <param name="avatar"></param> |
2929 | public void SendAvatarDataToAgent(ScenePresence avatar) | 2971 | public void SendAvatarDataToAgent(ScenePresence avatar) |
2930 | { | 2972 | { |
2931 | // m_log.WarnFormat("[SP] Send avatar data from {0} to {1}",m_uuid,avatar.ControllingClient.AgentId); | 2973 | //m_log.DebugFormat("[SCENE PRESENCE] SendAvatarDataToAgent from {0} ({1}) to {2} ({3})", Name, UUID, avatar.Name, avatar.UUID); |
2932 | 2974 | ||
2933 | avatar.ControllingClient.SendAvatarDataImmediate(this); | 2975 | avatar.ControllingClient.SendAvatarDataImmediate(this); |
2934 | if (Animator != null) | 2976 | if (Animator != null) |
@@ -2941,10 +2983,11 @@ namespace OpenSim.Region.Framework.Scenes | |||
2941 | /// </summary> | 2983 | /// </summary> |
2942 | public void SendAppearanceToAllOtherAgents() | 2984 | public void SendAppearanceToAllOtherAgents() |
2943 | { | 2985 | { |
2986 | m_log.DebugFormat("[SCENE PRESENCE] SendAppearanceToAllOtherAgents: {0} ({1})", Name, UUID); | ||
2944 | // only send update from root agents to other clients; children are only "listening posts" | 2987 | // only send update from root agents to other clients; children are only "listening posts" |
2945 | if (IsChildAgent) | 2988 | if (IsChildAgent) |
2946 | { | 2989 | { |
2947 | m_log.Warn("[SCENEPRESENCE] attempt to send avatar data from a child agent"); | 2990 | m_log.Warn("[SCENE PRESENCE] attempt to send avatar data from a child agent"); |
2948 | return; | 2991 | return; |
2949 | } | 2992 | } |
2950 | 2993 | ||
@@ -2970,6 +3013,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
2970 | /// </summary> | 3013 | /// </summary> |
2971 | public void SendOtherAgentsAppearanceToMe() | 3014 | public void SendOtherAgentsAppearanceToMe() |
2972 | { | 3015 | { |
3016 | //m_log.DebugFormat("[SCENE PRESENCE] SendOtherAgentsAppearanceToMe: {0} ({1})", Name, UUID); | ||
2973 | m_perfMonMS = Util.EnvironmentTickCount(); | 3017 | m_perfMonMS = Util.EnvironmentTickCount(); |
2974 | 3018 | ||
2975 | int count = 0; | 3019 | int count = 0; |
@@ -3618,7 +3662,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
3618 | /// <summary> | 3662 | /// <summary> |
3619 | /// Handles part of the PID controller function for moving an avatar. | 3663 | /// Handles part of the PID controller function for moving an avatar. |
3620 | /// </summary> | 3664 | /// </summary> |
3621 | public override void UpdateMovement() | 3665 | public void UpdateMovement() |
3622 | { | 3666 | { |
3623 | if (m_forceToApply.HasValue) | 3667 | if (m_forceToApply.HasValue) |
3624 | { | 3668 | { |
@@ -3637,6 +3681,10 @@ namespace OpenSim.Region.Framework.Scenes | |||
3637 | /// </summary> | 3681 | /// </summary> |
3638 | public void AddToPhysicalScene(bool isFlying) | 3682 | public void AddToPhysicalScene(bool isFlying) |
3639 | { | 3683 | { |
3684 | // m_log.DebugFormat( | ||
3685 | // "[SCENE PRESENCE]: Adding physics actor for {0}, ifFlying = {1} in {2}", | ||
3686 | // Name, isFlying, Scene.RegionInfo.RegionName); | ||
3687 | |||
3640 | if (m_appearance.AvatarHeight == 0) | 3688 | if (m_appearance.AvatarHeight == 0) |
3641 | m_appearance.SetHeight(); | 3689 | m_appearance.SetHeight(); |
3642 | 3690 | ||
@@ -4340,4 +4388,4 @@ namespace OpenSim.Region.Framework.Scenes | |||
4340 | } | 4388 | } |
4341 | } | 4389 | } |
4342 | } | 4390 | } |
4343 | } \ No newline at end of file | 4391 | } |
diff --git a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAutopilotTests.cs b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAutopilotTests.cs new file mode 100644 index 0000000..64c36ff --- /dev/null +++ b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAutopilotTests.cs | |||
@@ -0,0 +1,135 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSimulator Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using System; | ||
29 | using System.Collections.Generic; | ||
30 | using System.Reflection; | ||
31 | using log4net; | ||
32 | using Nini.Config; | ||
33 | using NUnit.Framework; | ||
34 | using OpenMetaverse; | ||
35 | using OpenSim.Framework; | ||
36 | using OpenSim.Framework.Communications; | ||
37 | using OpenSim.Region.Framework.Interfaces; | ||
38 | using OpenSim.Region.Framework.Scenes; | ||
39 | using OpenSim.Tests.Common; | ||
40 | using OpenSim.Tests.Common.Mock; | ||
41 | |||
42 | namespace OpenSim.Region.Framework.Scenes.Tests | ||
43 | { | ||
44 | [TestFixture] | ||
45 | public class ScenePresenceAutopilotTests | ||
46 | { | ||
47 | private TestScene m_scene; | ||
48 | |||
49 | [TestFixtureSetUp] | ||
50 | public void FixtureInit() | ||
51 | { | ||
52 | // Don't allow tests to be bamboozled by asynchronous events. Execute everything on the same thread. | ||
53 | Util.FireAndForgetMethod = FireAndForgetMethod.None; | ||
54 | } | ||
55 | |||
56 | [TestFixtureTearDown] | ||
57 | public void TearDown() | ||
58 | { | ||
59 | // We must set this back afterwards, otherwise later tests will fail since they're expecting multiple | ||
60 | // threads. Possibly, later tests should be rewritten not to worry about such things. | ||
61 | Util.FireAndForgetMethod = Util.DefaultFireAndForgetMethod; | ||
62 | } | ||
63 | |||
64 | [SetUp] | ||
65 | public void Init() | ||
66 | { | ||
67 | m_scene = SceneHelpers.SetupScene(); | ||
68 | } | ||
69 | |||
70 | [Test] | ||
71 | public void TestMove() | ||
72 | { | ||
73 | TestHelpers.InMethod(); | ||
74 | // log4net.Config.XmlConfigurator.Configure(); | ||
75 | |||
76 | ScenePresence sp = SceneHelpers.AddScenePresence(m_scene, TestHelpers.ParseTail(0x1)); | ||
77 | |||
78 | Vector3 startPos = sp.AbsolutePosition; | ||
79 | // Vector3 startPos = new Vector3(128, 128, 30); | ||
80 | |||
81 | // For now, we'll make the scene presence fly to simplify this test, but this needs to change. | ||
82 | sp.PhysicsActor.Flying = true; | ||
83 | |||
84 | m_scene.Update(); | ||
85 | Assert.That(sp.AbsolutePosition, Is.EqualTo(startPos)); | ||
86 | |||
87 | Vector3 targetPos = startPos + new Vector3(0, 10, 0); | ||
88 | sp.MoveToTarget(targetPos, false, false); | ||
89 | |||
90 | Assert.That(sp.AbsolutePosition, Is.EqualTo(startPos)); | ||
91 | Assert.That( | ||
92 | sp.Rotation, new QuaternionToleranceConstraint(new Quaternion(0, 0, 0.7071068f, 0.7071068f), 0.000001)); | ||
93 | |||
94 | m_scene.Update(); | ||
95 | |||
96 | // We should really check the exact figure. | ||
97 | Assert.That(sp.AbsolutePosition.X, Is.EqualTo(startPos.X)); | ||
98 | Assert.That(sp.AbsolutePosition.Y, Is.GreaterThan(startPos.Y)); | ||
99 | Assert.That(sp.AbsolutePosition.Z, Is.EqualTo(startPos.Z)); | ||
100 | Assert.That(sp.AbsolutePosition.Z, Is.LessThan(targetPos.X)); | ||
101 | |||
102 | for (int i = 0; i < 10; i++) | ||
103 | m_scene.Update(); | ||
104 | |||
105 | double distanceToTarget = Util.GetDistanceTo(sp.AbsolutePosition, targetPos); | ||
106 | Assert.That(distanceToTarget, Is.LessThan(1), "Avatar not within 1 unit of target position on first move"); | ||
107 | Assert.That(sp.AbsolutePosition, Is.EqualTo(targetPos)); | ||
108 | Assert.That(sp.AgentControlFlags, Is.EqualTo((uint)AgentManager.ControlFlags.NONE)); | ||
109 | |||
110 | // Try a second movement | ||
111 | startPos = sp.AbsolutePosition; | ||
112 | targetPos = startPos + new Vector3(10, 0, 0); | ||
113 | sp.MoveToTarget(targetPos, false, false); | ||
114 | |||
115 | Assert.That(sp.AbsolutePosition, Is.EqualTo(startPos)); | ||
116 | Assert.That( | ||
117 | sp.Rotation, new QuaternionToleranceConstraint(new Quaternion(0, 0, 0, 1), 0.000001)); | ||
118 | |||
119 | m_scene.Update(); | ||
120 | |||
121 | // We should really check the exact figure. | ||
122 | Assert.That(sp.AbsolutePosition.X, Is.GreaterThan(startPos.X)); | ||
123 | Assert.That(sp.AbsolutePosition.X, Is.LessThan(targetPos.X)); | ||
124 | Assert.That(sp.AbsolutePosition.Y, Is.EqualTo(startPos.Y)); | ||
125 | Assert.That(sp.AbsolutePosition.Z, Is.EqualTo(startPos.Z)); | ||
126 | |||
127 | for (int i = 0; i < 10; i++) | ||
128 | m_scene.Update(); | ||
129 | |||
130 | distanceToTarget = Util.GetDistanceTo(sp.AbsolutePosition, targetPos); | ||
131 | Assert.That(distanceToTarget, Is.LessThan(1), "Avatar not within 1 unit of target position on second move"); | ||
132 | Assert.That(sp.AbsolutePosition, Is.EqualTo(targetPos)); | ||
133 | } | ||
134 | } | ||
135 | } \ No newline at end of file | ||