aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Framework
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/Framework')
-rw-r--r--OpenSim/Region/Framework/Scenes/ScenePresence.cs93
1 files changed, 46 insertions, 47 deletions
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index ff9df37..85f4ee5 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -2109,9 +2109,6 @@ namespace OpenSim.Region.Framework.Scenes
2109 if (part == null) 2109 if (part == null)
2110 return; 2110 return;
2111 2111
2112 // TODO: determine position to sit at based on scene geometry; don't trust offset from client
2113 // see http://wiki.secondlife.com/wiki/User:Andrew_Linden/Office_Hours/2007_11_06 for details on how LL does it
2114
2115 if (PhysicsActor != null) 2112 if (PhysicsActor != null)
2116 m_sitAvatarHeight = PhysicsActor.Size.Z * 0.5f; 2113 m_sitAvatarHeight = PhysicsActor.Size.Z * 0.5f;
2117 2114
@@ -2130,25 +2127,8 @@ namespace OpenSim.Region.Framework.Scenes
2130 } 2127 }
2131 else 2128 else
2132 { 2129 {
2133// if (Util.GetDistanceTo(AbsolutePosition, pos) <= 10) 2130 if (PhysicsSit(part,offset)) // physics engine
2134// { 2131 return;
2135// m_log.DebugFormat(
2136// "[SCENE PRESENCE]: Sitting {0} on {1} {2} because sit target is unset and within 10m",
2137// Name, part.Name, part.LocalId);
2138
2139 if (m_scene.PhysicsScene != null &&
2140 part.PhysActor != null &&
2141 Util.GetDistanceTo(AbsolutePosition, pos) <= 30)
2142 {
2143
2144 Vector3 camdif = CameraPosition - part.AbsolutePosition;
2145 camdif.Normalize();
2146
2147// m_log.InfoFormat("sit {0} {1}", offset.ToString(), camdif.ToString());
2148
2149 if (m_scene.PhysicsScene.SitAvatar(part.PhysActor, AbsolutePosition, CameraPosition, offset, new Vector3(0.35f, 0, 0.65f), PhysicsSitResponse) != 0)
2150 return;
2151 }
2152 2132
2153 if (Util.GetDistanceTo(AbsolutePosition, pos) <= 10) 2133 if (Util.GetDistanceTo(AbsolutePosition, pos) <= 10)
2154 { 2134 {
@@ -2156,12 +2136,6 @@ namespace OpenSim.Region.Framework.Scenes
2156 AbsolutePosition = pos + new Vector3(0.0f, 0.0f, m_sitAvatarHeight); 2136 AbsolutePosition = pos + new Vector3(0.0f, 0.0f, m_sitAvatarHeight);
2157 canSit = true; 2137 canSit = true;
2158 } 2138 }
2159// else
2160// {
2161// m_log.DebugFormat(
2162// "[SCENE PRESENCE]: Ignoring sit request of {0} on {1} {2} because sit target is unset and outside 10m",
2163// Name, part.Name, part.LocalId);
2164// }
2165 } 2139 }
2166 2140
2167 if (canSit) 2141 if (canSit)
@@ -2223,14 +2197,6 @@ namespace OpenSim.Region.Framework.Scenes
2223 m_requestedSitTargetID = part.LocalId; 2197 m_requestedSitTargetID = part.LocalId;
2224 m_requestedSitTargetUUID = targetID; 2198 m_requestedSitTargetUUID = targetID;
2225 2199
2226// m_log.DebugFormat("[SIT]: Client requested Sit Position: {0}", offset);
2227
2228 if (m_scene.PhysicsScene.SupportsRayCast())
2229 {
2230 //m_scene.PhysicsScene.RaycastWorld(Vector3.Zero,Vector3.Zero, 0.01f,new RaycastCallback());
2231 //SitRayCastAvatarPosition(part);
2232 //return;
2233 }
2234 } 2200 }
2235 else 2201 else
2236 { 2202 {
@@ -2240,24 +2206,57 @@ namespace OpenSim.Region.Framework.Scenes
2240 SendSitResponse(targetID, offset, Quaternion.Identity); 2206 SendSitResponse(targetID, offset, Quaternion.Identity);
2241 } 2207 }
2242 2208
2243 public void PhysicsSitResponse(int status, uint partID, Vector3 offset, Quaternion Orientation) 2209 // returns false if does not suport so older sit can be tried
2210 public bool PhysicsSit(SceneObjectPart part, Vector3 offset)
2244 { 2211 {
2212 if (part == null || part.ParentGroup.IsAttachment)
2213 {
2214 return true;
2215 }
2245 2216
2246 if (status < 0) 2217 if ( m_scene.PhysicsScene == null)
2218 return false;
2219
2220 if (part.PhysActor == null)
2247 { 2221 {
2248 ControllingClient.SendAlertMessage("Sit position no longer exists"); 2222 // none physcis shape
2249 return; 2223 if (part.PhysicsShapeType == (byte)PhysicsShapeType.None)
2224 ControllingClient.SendAlertMessage(" There is no suitable surface to sit on, try another spot.");
2225 else
2226 { // non physical phantom TODO
2227 ControllingClient.SendAlertMessage(" There is no suitable surface to sit on, try another spot.");
2228 return false;
2229 }
2230 return true;
2250 } 2231 }
2251 2232
2252 if (status == 0) 2233 // not doing autopilot
2234 m_requestedSitTargetID = 0;
2235
2236 if (m_scene.PhysicsScene.SitAvatar(part.PhysActor, AbsolutePosition, CameraPosition, offset, new Vector3(0.35f, 0, 0.65f), PhysicsSitResponse) != 0)
2237 return true;
2238
2239 return false;
2240 }
2241
2242 // status
2243 // < 0 ignore
2244 // 0 bad sit spot
2245 public void PhysicsSitResponse(int status, uint partID, Vector3 offset, Quaternion Orientation)
2246 {
2247 if (status < 0)
2253 return; 2248 return;
2254 2249
2255 SceneObjectPart part = m_scene.GetSceneObjectPart(partID); 2250 if (status == 0)
2256 if (part == null || part.ParentGroup.IsAttachment)
2257 { 2251 {
2252 ControllingClient.SendAlertMessage(" There is no suitable surface to sit on, try another spot.");
2258 return; 2253 return;
2259 } 2254 }
2260 2255
2256 SceneObjectPart part = m_scene.GetSceneObjectPart(partID);
2257 if (part == null)
2258 return;
2259
2261// m_log.InfoFormat("physsit {0} {1}", offset.ToString(),Orientation.ToString()); 2260// m_log.InfoFormat("physsit {0} {1}", offset.ToString(),Orientation.ToString());
2262 2261
2263 part.AddSittingAvatar(UUID); 2262 part.AddSittingAvatar(UUID);
@@ -2269,16 +2268,14 @@ namespace OpenSim.Region.Framework.Scenes
2269 ControllingClient.SendSitResponse( 2268 ControllingClient.SendSitResponse(
2270 part.UUID, offset, Orientation, false, cameraAtOffset, cameraEyeOffset, forceMouselook); 2269 part.UUID, offset, Orientation, false, cameraAtOffset, cameraEyeOffset, forceMouselook);
2271 2270
2272 part.ParentGroup.TriggerScriptChangedEvent(Changed.LINK); 2271 // not using autopilot
2273
2274 // assuming no autopilot in use
2275 Velocity = Vector3.Zero; 2272 Velocity = Vector3.Zero;
2276 RemoveFromPhysicalScene(); 2273 RemoveFromPhysicalScene();
2277 2274
2278 Rotation = Orientation; 2275 Rotation = Orientation;
2279 m_pos = offset; 2276 m_pos = offset;
2280 2277
2281 m_requestedSitTargetID = 0; // invalidate the viewer sit comand for now 2278 m_requestedSitTargetID = 0;
2282 part.ParentGroup.AddAvatar(UUID); 2279 part.ParentGroup.AddAvatar(UUID);
2283 2280
2284 ParentPart = part; 2281 ParentPart = part;
@@ -2286,6 +2283,8 @@ namespace OpenSim.Region.Framework.Scenes
2286 2283
2287 Animator.TrySetMovementAnimation("SIT"); 2284 Animator.TrySetMovementAnimation("SIT");
2288 SendAvatarDataToAllAgents(); 2285 SendAvatarDataToAllAgents();
2286
2287 part.ParentGroup.TriggerScriptChangedEvent(Changed.LINK);
2289 } 2288 }
2290 2289
2291 2290