diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index 1942dfe5fc..ce7f8a02aa 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs @@ -1257,6 +1257,9 @@ namespace OpenSim.Region.Framework.Scenes set { m_sitTargetOrientation = value; } } + public float SitActiveRange { get; set;} + public Vector3 StandOffset { get; set;} + public bool Stopped { get { diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index dc6f7fdb0a..2e7fb38049 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -3262,21 +3262,52 @@ namespace OpenSim.Region.Framework.Scenes standRotation = standRotation * m_bodyRot; m_bodyRot = standRotation; - Quaternion standRotationZ = new Quaternion(0,0,standRotation.Z,standRotation.W); - float t = standRotationZ.W * standRotationZ.W + standRotationZ.Z * standRotationZ.Z; - if (t > 0) + Quaternion standRotationZ; + Vector3 adjustmentForSitPose = part.StandOffset; + if (adjustmentForSitPose.X == 0 && + adjustmentForSitPose.Y == 0 && + adjustmentForSitPose.Z == 0) { - t = 1.0f / (float)Math.Sqrt(t); - standRotationZ.W *= t; - standRotationZ.Z *= t; + standRotationZ = new Quaternion(0, 0, standRotation.Z, standRotation.W); + float t = standRotationZ.W * standRotationZ.W + standRotationZ.Z * standRotationZ.Z; + if (t > 0) + { + t = 1.0f / (float)Math.Sqrt(t); + standRotationZ.W *= t; + standRotationZ.Z *= t; + } + else + { + standRotationZ.W = 1.0f; + standRotationZ.Z = 0f; + } + adjustmentForSitPose = new Vector3(0.65f, 0, m_sitAvatarHeight * 0.5f + .1f) * standRotationZ; } else { - standRotationZ.W = 1.0f; - standRotationZ.Z = 0f; - } + sitWorldPosition = part.GetWorldPosition(); - Vector3 adjustmentForSitPose = new Vector3(0.65f, 0, m_sitAvatarHeight * 0.5f + .1f) * standRotationZ; + standRotation = part.GetWorldRotation(); + standRotationZ = new Quaternion(0, 0, standRotation.Z, standRotation.W); + float t = standRotationZ.W * standRotationZ.W + standRotationZ.Z * standRotationZ.Z; + if (t > 0) + { + t = 1.0f / (float)Math.Sqrt(t); + standRotationZ.W *= t; + standRotationZ.Z *= t; + } + else + { + standRotationZ.W = 1.0f; + standRotationZ.Z = 0f; + } + adjustmentForSitPose *= standRotationZ; + + if (Appearance != null && Appearance.AvatarHeight > 0) + adjustmentForSitPose.Z += 0.5f * Appearance.AvatarHeight + .1f; + else + adjustmentForSitPose.Z += .9f; + } m_pos = sitWorldPosition + adjustmentForSitPose; } @@ -3325,7 +3356,7 @@ namespace OpenSim.Region.Framework.Scenes //look for prims with explicit sit targets that are available foreach (SceneObjectPart part in partArray) { - if (part.IsSitTargetSet && part.SitTargetAvatar == UUID.Zero) + if (part.IsSitTargetSet && part.SitTargetAvatar == UUID.Zero && part.SitActiveRange > 0) { //switch the target to this prim return part; @@ -3346,6 +3377,17 @@ namespace OpenSim.Region.Framework.Scenes if (part == null) return; + float range = part.SitActiveRange; + if (range < 0) + return; + + Vector3 pos = part.AbsolutePosition + offset; + if (range > 1e-5f) + { + if (Vector3.DistanceSquared(AbsolutePosition, pos) > range * range) + return; + } + if (PhysicsActor != null) m_sitAvatarHeight = PhysicsActor.Size.Z * 0.5f; @@ -3359,9 +3401,6 @@ namespace OpenSim.Region.Framework.Scenes if (PhysicsSit(part,offset)) // physics engine return; - Vector3 pos = part.AbsolutePosition + offset; - if (Vector3.DistanceSquared(AbsolutePosition, pos) > 100) - return; AbsolutePosition = pos + new Vector3(0.0f, 0.0f, m_sitAvatarHeight); } diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs index eb7049e4de..ae023b139b 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs @@ -5674,5 +5674,28 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api return 3; return 0; } + + public void osSetSitActiveRange(LSL_Float v) + { + if (v > 128f) + v = 128f; + m_host.SitActiveRange = (float)v; + } + + public LSL_Float osGetSitActiveRange() + { + return m_host.SitActiveRange; + } + + public void osSetStandTarget(LSL_Vector v) + { + // todo add limits ? + m_host.StandOffset = v; + } + + public LSL_Vector osGetStandTarget() + { + return m_host.StandOffset; + } } } \ No newline at end of file diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs index 2bb71e9518..977c51b09c 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs @@ -380,33 +380,33 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces LSL_List osGetRegionStats(); vector osGetRegionSize(); - int osGetSimulatorMemory(); - int osGetSimulatorMemoryKB(); + int osGetSimulatorMemory(); + int osGetSimulatorMemoryKB(); void osKickAvatar(string FirstName, string SurName, string alert); void osKickAvatar(LSL_Key agentId, string alert); void osSetSpeed(string UUID, LSL_Float SpeedModifier); void osSetOwnerSpeed(LSL_Float SpeedModifier); - LSL_Float osGetHealth(key agentId); + LSL_Float osGetHealth(key agentId); void osCauseHealing(key agentId, LSL_Float healing); void osSetHealth(key agentId, LSL_Float health); void osSetHealRate(key agentId, LSL_Float health); - LSL_Float osGetHealRate(key agentId); + LSL_Float osGetHealRate(key agentId); void osCauseDamage(key avatar, LSL_Float damage); void osForceOtherSit(string avatar); void osForceOtherSit(string avatar, string target); - LSL_List osGetPrimitiveParams(LSL_Key prim, LSL_List rules); + LSL_List osGetPrimitiveParams(LSL_Key prim, LSL_List rules); void osSetPrimitiveParams(LSL_Key prim, LSL_List rules); void osSetProjectionParams(LSL_Integer projection, LSL_Key texture, LSL_Float fov, LSL_Float focus, LSL_Float amb); void osSetProjectionParams(LSL_Key prim, LSL_Integer projection, LSL_Key texture, LSL_Float fov, LSL_Float focus, LSL_Float amb); void osSetProjectionParams(LSL_Integer linknumber, LSL_Integer projection, LSL_Key texture, LSL_Float fov, LSL_Float focus, LSL_Float amb); - LSL_List osGetAvatarList(); - LSL_List osGetNPCList(); + LSL_List osGetAvatarList(); + LSL_List osGetNPCList(); - LSL_String osUnixTimeToTimestamp(LSL_Integer time); + LSL_String osUnixTimeToTimestamp(LSL_Integer time); - LSL_Integer osInviteToGroup(LSL_Key agentId); - LSL_Integer osEjectFromGroup(LSL_Key agentId); + LSL_Integer osInviteToGroup(LSL_Key agentId); + LSL_Integer osEjectFromGroup(LSL_Key agentId); void osSetTerrainTexture(int level, LSL_Key texture); void osSetTerrainTextureHeight(int corner, double low, double high); @@ -416,7 +416,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces /// /// /// 1 if thing is a valid UUID, 0 otherwise - LSL_Integer osIsUUID(string thing); + LSL_Integer osIsUUID(string thing); /// /// Wraps to Math.Min() @@ -424,7 +424,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces /// /// /// - LSL_Float osMin(double a, double b); + LSL_Float osMin(double a, double b); /// /// Wraps to Math.max() @@ -432,7 +432,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces /// /// /// - LSL_Float osMax(double a, double b); + LSL_Float osMax(double a, double b); /// /// Get the key of the object that rezzed this object. @@ -559,5 +559,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces void osResetAllScripts(LSL_Integer AllLinkset); LSL_Integer osIsNotValidNumber(LSL_Float v); + + void osSetSitActiveRange(LSL_Float v); + LSL_Float osGetSitActiveRange(); + void osSetStandTarget(vector v); + vector osGetStandTarget(); } } diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs index da2c560f6f..806449c928 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs @@ -35,7 +35,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase public partial class ScriptBaseClass { // SCRIPTS CONSTANTS - public static readonly LSLInteger OS_APIVERSION = 10; + public static readonly LSLInteger OS_APIVERSION = 11; public static readonly LSLInteger TRUE = 1; public static readonly LSLInteger FALSE = 0; diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs index 9745403429..f61f0aa93c 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs @@ -1421,5 +1421,26 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase { return m_OSSL_Functions.osIsNotValidNumber(v); } + + public void osSetSitActiveRange(LSL_Float v) + { + m_OSSL_Functions.osSetSitActiveRange(v); + } + + public LSL_Float osGetSitActiveRange() + { + return m_OSSL_Functions.osGetSitActiveRange(); + } + + public void osSetStandTarget(vector v) + { + m_OSSL_Functions.osSetStandTarget(v); + } + + public vector osGetStandTarget() + + { + return m_OSSL_Functions.osGetStandTarget(); + } } }