diff options
-rw-r--r-- | OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs | 18 | ||||
-rw-r--r-- | OpenSim/Region/Framework/Scenes/ScenePresence.cs | 109 |
2 files changed, 111 insertions, 16 deletions
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs index 20bc59c..8592650 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs | |||
@@ -5079,6 +5079,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
5079 | { | 5079 | { |
5080 | ScenePresence presence = (ScenePresence)entity; | 5080 | ScenePresence presence = (ScenePresence)entity; |
5081 | 5081 | ||
5082 | // m_log.DebugFormat( | ||
5083 | // "[LLCLIENTVIEW]: Sending terse update to {0} with position {1} in {2}", Name, presence.OffsetPosition, m_scene.Name); | ||
5084 | |||
5082 | attachPoint = presence.State; | 5085 | attachPoint = presence.State; |
5083 | collisionPlane = presence.CollisionPlane; | 5086 | collisionPlane = presence.CollisionPlane; |
5084 | position = presence.OffsetPosition; | 5087 | position = presence.OffsetPosition; |
@@ -5198,6 +5201,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
5198 | 5201 | ||
5199 | protected ObjectUpdatePacket.ObjectDataBlock CreateAvatarUpdateBlock(ScenePresence data) | 5202 | protected ObjectUpdatePacket.ObjectDataBlock CreateAvatarUpdateBlock(ScenePresence data) |
5200 | { | 5203 | { |
5204 | // m_log.DebugFormat( | ||
5205 | // "[LLCLIENTVIEW]: Sending full update to {0} with position {1} in {2}", Name, data.OffsetPosition, m_scene.Name); | ||
5206 | |||
5201 | byte[] objectData = new byte[76]; | 5207 | byte[] objectData = new byte[76]; |
5202 | 5208 | ||
5203 | data.CollisionPlane.ToBytes(objectData, 0); | 5209 | data.CollisionPlane.ToBytes(objectData, 0); |
@@ -5218,7 +5224,13 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
5218 | update.NameValue = Utils.StringToBytes("FirstName STRING RW SV " + data.Firstname + "\nLastName STRING RW SV " + | 5224 | update.NameValue = Utils.StringToBytes("FirstName STRING RW SV " + data.Firstname + "\nLastName STRING RW SV " + |
5219 | data.Lastname + "\nTitle STRING RW SV " + data.Grouptitle); | 5225 | data.Lastname + "\nTitle STRING RW SV " + data.Grouptitle); |
5220 | update.ObjectData = objectData; | 5226 | update.ObjectData = objectData; |
5221 | update.ParentID = data.ParentID; | 5227 | |
5228 | SceneObjectPart parentPart = data.ParentPart; | ||
5229 | if (parentPart != null) | ||
5230 | update.ParentID = parentPart.ParentGroup.LocalId; | ||
5231 | else | ||
5232 | update.ParentID = 0; | ||
5233 | |||
5222 | update.PathCurve = 16; | 5234 | update.PathCurve = 16; |
5223 | update.PathScaleX = 100; | 5235 | update.PathScaleX = 100; |
5224 | update.PathScaleY = 100; | 5236 | update.PathScaleY = 100; |
@@ -12643,6 +12655,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
12643 | { | 12655 | { |
12644 | if (p is ScenePresence) | 12656 | if (p is ScenePresence) |
12645 | { | 12657 | { |
12658 | // m_log.DebugFormat( | ||
12659 | // "[LLCLIENTVIEW]: Immediately sending terse agent update for {0} to {1} in {2}", | ||
12660 | // p.Name, Name, Scene.Name); | ||
12661 | |||
12646 | // It turns out to get the agent to stop flying, you have to feed it stop flying velocities | 12662 | // It turns out to get the agent to stop flying, you have to feed it stop flying velocities |
12647 | // There's no explicit message to send the client to tell it to stop flying.. it relies on the | 12663 | // There's no explicit message to send the client to tell it to stop flying.. it relies on the |
12648 | // velocity, collision plane and avatar height | 12664 | // velocity, collision plane and avatar height |
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 7243db1..0fb5477 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs | |||
@@ -499,6 +499,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
499 | } | 499 | } |
500 | else | 500 | else |
501 | { | 501 | { |
502 | // m_log.DebugFormat("[SCENE PRESENCE]: Fetching abs pos where PhysicsActor == null and parent part {0} for {1}", Name, Scene.Name); | ||
502 | // Obtain the correct position of a seated avatar. | 503 | // Obtain the correct position of a seated avatar. |
503 | // In addition to providing the correct position while | 504 | // In addition to providing the correct position while |
504 | // the avatar is seated, this value will also | 505 | // the avatar is seated, this value will also |
@@ -522,7 +523,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
522 | } | 523 | } |
523 | set | 524 | set |
524 | { | 525 | { |
525 | // m_log.DebugFormat("[SCENE PRESENCE]: Setting position of {0} in {1} to {2}", Name, Scene.Name, value); | 526 | // m_log.DebugFormat("[SCENE PRESENCE]: Setting position of {0} to {1} in {2}", Name, value, Scene.Name); |
526 | // Util.PrintCallStack(); | 527 | // Util.PrintCallStack(); |
527 | 528 | ||
528 | if (PhysicsActor != null) | 529 | if (PhysicsActor != null) |
@@ -2173,13 +2174,12 @@ namespace OpenSim.Region.Framework.Scenes | |||
2173 | { | 2174 | { |
2174 | // m_log.DebugFormat("[SCENE PRESENCE]: StandUp() for {0}", Name); | 2175 | // m_log.DebugFormat("[SCENE PRESENCE]: StandUp() for {0}", Name); |
2175 | 2176 | ||
2177 | bool satOnObject = IsSatOnObject; | ||
2178 | SceneObjectPart part = ParentPart; | ||
2176 | SitGround = false; | 2179 | SitGround = false; |
2177 | if (PhysicsActor == null) | ||
2178 | AddToPhysicalScene(false); | ||
2179 | 2180 | ||
2180 | if (ParentID != 0) | 2181 | if (satOnObject) |
2181 | { | 2182 | { |
2182 | SceneObjectPart part = ParentPart; | ||
2183 | TaskInventoryDictionary taskIDict = part.TaskInventory; | 2183 | TaskInventoryDictionary taskIDict = part.TaskInventory; |
2184 | if (taskIDict != null) | 2184 | if (taskIDict != null) |
2185 | { | 2185 | { |
@@ -2198,18 +2198,62 @@ namespace OpenSim.Region.Framework.Scenes | |||
2198 | ParentPosition = part.GetWorldPosition(); | 2198 | ParentPosition = part.GetWorldPosition(); |
2199 | ControllingClient.SendClearFollowCamProperties(part.ParentUUID); | 2199 | ControllingClient.SendClearFollowCamProperties(part.ParentUUID); |
2200 | 2200 | ||
2201 | m_pos += ParentPosition + new Vector3(0.0f, 0.0f, 2.0f * m_sitAvatarHeight); | ||
2202 | ParentPosition = Vector3.Zero; | ||
2203 | |||
2204 | ParentID = 0; | 2201 | ParentID = 0; |
2205 | ParentPart = null; | 2202 | ParentPart = null; |
2203 | |||
2204 | Quaternion standRotation; | ||
2205 | |||
2206 | if (part.SitTargetAvatar == UUID) | ||
2207 | { | ||
2208 | standRotation = part.GetWorldRotation(); | ||
2209 | |||
2210 | if (!part.IsRoot) | ||
2211 | standRotation = standRotation * part.SitTargetOrientation; | ||
2212 | // standRotation = part.RotationOffset * part.SitTargetOrientation; | ||
2213 | // else | ||
2214 | // standRotation = part.SitTargetOrientation; | ||
2215 | |||
2216 | } | ||
2217 | else | ||
2218 | { | ||
2219 | standRotation = Rotation; | ||
2220 | } | ||
2221 | |||
2222 | //Vector3 standPos = ParentPosition + new Vector3(0.0f, 0.0f, 2.0f * m_sitAvatarHeight); | ||
2223 | //Vector3 standPos = ParentPosition; | ||
2224 | |||
2225 | // Vector3 standPositionAdjustment | ||
2226 | // = part.SitTargetPosition + new Vector3(0.5f, 0f, m_sitAvatarHeight / 2f); | ||
2227 | Vector3 adjustmentForSitPosition = part.SitTargetPosition * part.GetWorldRotation(); | ||
2228 | |||
2229 | // XXX: This is based on the physics capsule sizes. Need to find a better way to read this rather than | ||
2230 | // hardcoding here. | ||
2231 | Vector3 adjustmentForSitPose = new Vector3(0.74f, 0f, 0f) * standRotation; | ||
2232 | |||
2233 | Vector3 standPos = ParentPosition + adjustmentForSitPosition + adjustmentForSitPose; | ||
2234 | |||
2235 | m_log.DebugFormat( | ||
2236 | "[SCENE PRESENCE]: Setting stand to pos {0}, (adjustmentForSitPosition {1}, adjustmentForSitPose {2}) rotation {3} for {4} in {5}", | ||
2237 | standPos, adjustmentForSitPosition, adjustmentForSitPose, standRotation, Name, Scene.Name); | ||
2238 | |||
2239 | Rotation = standRotation; | ||
2240 | AbsolutePosition = standPos; | ||
2241 | ParentPosition = Vector3.Zero; | ||
2242 | } | ||
2243 | |||
2244 | // We need to wait until we have calculated proper stand positions before sitting up the physical | ||
2245 | // avatar to avoid race conditions. | ||
2246 | if (PhysicsActor == null) | ||
2247 | AddToPhysicalScene(false); | ||
2248 | |||
2249 | if (satOnObject) | ||
2250 | { | ||
2206 | SendAvatarDataToAllAgents(); | 2251 | SendAvatarDataToAllAgents(); |
2207 | m_requestedSitTargetID = 0; | 2252 | m_requestedSitTargetID = 0; |
2208 | 2253 | ||
2209 | part.RemoveSittingAvatar(UUID); | 2254 | part.RemoveSittingAvatar(UUID); |
2210 | 2255 | ||
2211 | if (part != null) | 2256 | part.ParentGroup.TriggerScriptChangedEvent(Changed.LINK); |
2212 | part.ParentGroup.TriggerScriptChangedEvent(Changed.LINK); | ||
2213 | } | 2257 | } |
2214 | 2258 | ||
2215 | Animator.TrySetMovementAnimation("STAND"); | 2259 | Animator.TrySetMovementAnimation("STAND"); |
@@ -2267,7 +2311,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
2267 | m_sitAvatarHeight = PhysicsActor.Size.Z; | 2311 | m_sitAvatarHeight = PhysicsActor.Size.Z; |
2268 | 2312 | ||
2269 | bool canSit = false; | 2313 | bool canSit = false; |
2270 | Vector3 pos = part.AbsolutePosition + offset; | ||
2271 | 2314 | ||
2272 | if (part.IsSitTargetSet && part.SitTargetAvatar == UUID.Zero) | 2315 | if (part.IsSitTargetSet && part.SitTargetAvatar == UUID.Zero) |
2273 | { | 2316 | { |
@@ -2277,10 +2320,23 @@ namespace OpenSim.Region.Framework.Scenes | |||
2277 | 2320 | ||
2278 | offset = part.SitTargetPosition; | 2321 | offset = part.SitTargetPosition; |
2279 | sitOrientation = part.SitTargetOrientation; | 2322 | sitOrientation = part.SitTargetOrientation; |
2323 | |||
2324 | if (!part.IsRoot) | ||
2325 | { | ||
2326 | // m_log.DebugFormat("Old sit orient {0}", sitOrientation); | ||
2327 | sitOrientation = part.RotationOffset * sitOrientation; | ||
2328 | // m_log.DebugFormat("New sit orient {0}", sitOrientation); | ||
2329 | // m_log.DebugFormat("Old sit offset {0}", offset); | ||
2330 | offset = offset * part.RotationOffset; | ||
2331 | // m_log.DebugFormat("New sit offset {0}", offset); | ||
2332 | } | ||
2333 | |||
2280 | canSit = true; | 2334 | canSit = true; |
2281 | } | 2335 | } |
2282 | else | 2336 | else |
2283 | { | 2337 | { |
2338 | Vector3 pos = part.AbsolutePosition + offset; | ||
2339 | |||
2284 | if (Util.GetDistanceTo(AbsolutePosition, pos) <= 10) | 2340 | if (Util.GetDistanceTo(AbsolutePosition, pos) <= 10) |
2285 | { | 2341 | { |
2286 | // m_log.DebugFormat( | 2342 | // m_log.DebugFormat( |
@@ -2312,8 +2368,12 @@ namespace OpenSim.Region.Framework.Scenes | |||
2312 | cameraEyeOffset = part.GetCameraEyeOffset(); | 2368 | cameraEyeOffset = part.GetCameraEyeOffset(); |
2313 | forceMouselook = part.GetForceMouselook(); | 2369 | forceMouselook = part.GetForceMouselook(); |
2314 | 2370 | ||
2371 | // An viewer expects to specify sit positions as offsets to the root prim, even if a child prim is | ||
2372 | // being sat upon. | ||
2373 | offset += part.OffsetPosition; | ||
2374 | |||
2315 | ControllingClient.SendSitResponse( | 2375 | ControllingClient.SendSitResponse( |
2316 | part.UUID, offset, sitOrientation, false, cameraAtOffset, cameraEyeOffset, forceMouselook); | 2376 | part.ParentGroup.UUID, offset, sitOrientation, false, cameraAtOffset, cameraEyeOffset, forceMouselook); |
2317 | 2377 | ||
2318 | m_requestedSitTargetUUID = part.UUID; | 2378 | m_requestedSitTargetUUID = part.UUID; |
2319 | 2379 | ||
@@ -2586,13 +2646,31 @@ namespace OpenSim.Region.Framework.Scenes | |||
2586 | 2646 | ||
2587 | //Quaternion result = (sitTargetOrient * vq) * nq; | 2647 | //Quaternion result = (sitTargetOrient * vq) * nq; |
2588 | 2648 | ||
2589 | m_pos = sitTargetPos + SIT_TARGET_ADJUSTMENT; | 2649 | Vector3 newPos = sitTargetPos + SIT_TARGET_ADJUSTMENT; |
2590 | Rotation = sitTargetOrient; | 2650 | Quaternion newRot; |
2651 | |||
2652 | if (part.IsRoot) | ||
2653 | { | ||
2654 | newRot = sitTargetOrient; | ||
2655 | } | ||
2656 | else | ||
2657 | { | ||
2658 | newPos = newPos * part.RotationOffset; | ||
2659 | newRot = part.RotationOffset * sitTargetOrient; | ||
2660 | } | ||
2661 | |||
2662 | newPos += part.OffsetPosition; | ||
2663 | |||
2664 | m_pos = newPos; | ||
2665 | Rotation = newRot; | ||
2591 | ParentPosition = part.AbsolutePosition; | 2666 | ParentPosition = part.AbsolutePosition; |
2592 | } | 2667 | } |
2593 | else | 2668 | else |
2594 | { | 2669 | { |
2595 | m_pos -= part.AbsolutePosition; | 2670 | // An viewer expects to specify sit positions as offsets to the root prim, even if a child prim is |
2671 | // being sat upon. | ||
2672 | m_pos -= part.GroupPosition; | ||
2673 | |||
2596 | ParentPosition = part.AbsolutePosition; | 2674 | ParentPosition = part.AbsolutePosition; |
2597 | 2675 | ||
2598 | // m_log.DebugFormat( | 2676 | // m_log.DebugFormat( |
@@ -2825,6 +2903,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
2825 | lastTerseUpdateToAllClientsTick = currentTick; | 2903 | lastTerseUpdateToAllClientsTick = currentTick; |
2826 | lastPositionSentToAllClients = OffsetPosition; | 2904 | lastPositionSentToAllClients = OffsetPosition; |
2827 | 2905 | ||
2906 | // Console.WriteLine("Scheduled update for {0} in {1}", Name, Scene.Name); | ||
2828 | m_scene.ForEachClient(SendTerseUpdateToClient); | 2907 | m_scene.ForEachClient(SendTerseUpdateToClient); |
2829 | } | 2908 | } |
2830 | TriggerScenePresenceUpdated(); | 2909 | TriggerScenePresenceUpdated(); |