diff options
-rw-r--r-- | OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | 52 |
1 files changed, 43 insertions, 9 deletions
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 559523b..bba0c3b 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | |||
@@ -2113,13 +2113,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
2113 | return end; | 2113 | return end; |
2114 | } | 2114 | } |
2115 | 2115 | ||
2116 | protected void SetPos(SceneObjectPart part, LSL_Vector targetPos) | 2116 | protected LSL_Vector GetSetPosTarget(SceneObjectPart part, LSL_Vector targetPos, LSL_Vector fromPos) |
2117 | { | 2117 | { |
2118 | if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted) | 2118 | if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted) |
2119 | return; | 2119 | return fromPos; |
2120 | 2120 | ||
2121 | // Capped movemment if distance > 10m (http://wiki.secondlife.com/wiki/LlSetPos) | 2121 | // Capped movemment if distance > 10m (http://wiki.secondlife.com/wiki/LlSetPos) |
2122 | LSL_Vector currentPos = GetPartLocalPos(part); | 2122 | |
2123 | 2123 | ||
2124 | float ground = World.GetGroundHeight((float)targetPos.x, (float)targetPos.y); | 2124 | float ground = World.GetGroundHeight((float)targetPos.x, (float)targetPos.y); |
2125 | bool disable_underground_movement = m_ScriptEngine.Config.GetBoolean("DisableUndergroundMovement", true); | 2125 | bool disable_underground_movement = m_ScriptEngine.Config.GetBoolean("DisableUndergroundMovement", true); |
@@ -2128,14 +2128,28 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
2128 | { | 2128 | { |
2129 | if ((targetPos.z < ground) && disable_underground_movement && m_host.AttachmentPoint == 0) | 2129 | if ((targetPos.z < ground) && disable_underground_movement && m_host.AttachmentPoint == 0) |
2130 | targetPos.z = ground; | 2130 | targetPos.z = ground; |
2131 | } | ||
2132 | LSL_Vector real_vec = SetPosAdjust(fromPos, targetPos); | ||
2133 | |||
2134 | return real_vec; | ||
2135 | } | ||
2136 | |||
2137 | protected void SetPos(SceneObjectPart part, LSL_Vector targetPos) | ||
2138 | { | ||
2139 | if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted) | ||
2140 | return; | ||
2141 | |||
2142 | LSL_Vector currentPos = GetPartLocalPos(part); | ||
2143 | LSL_Vector toPos = GetSetPosTarget(part, targetPos, currentPos); | ||
2144 | |||
2145 | if (part.ParentGroup.RootPart == part) | ||
2146 | { | ||
2131 | SceneObjectGroup parent = part.ParentGroup; | 2147 | SceneObjectGroup parent = part.ParentGroup; |
2132 | LSL_Vector real_vec = SetPosAdjust(currentPos, targetPos); | 2148 | parent.UpdateGroupPosition(new Vector3((float)toPos.x, (float)toPos.y, (float)toPos.z)); |
2133 | parent.UpdateGroupPosition(new Vector3((float)real_vec.x, (float)real_vec.y, (float)real_vec.z)); | ||
2134 | } | 2149 | } |
2135 | else | 2150 | else |
2136 | { | 2151 | { |
2137 | LSL_Vector rel_vec = SetPosAdjust(new LSL_Vector(part.OffsetPosition.X, part.OffsetPosition.Y, part.OffsetPosition.Z), targetPos); | 2152 | part.OffsetPosition = new Vector3((float)toPos.x, (float)toPos.y, (float)toPos.z); |
2138 | part.OffsetPosition = new Vector3((float)rel_vec.x, (float)rel_vec.y, (float)rel_vec.z); | ||
2139 | SceneObjectGroup parent = part.ParentGroup; | 2153 | SceneObjectGroup parent = part.ParentGroup; |
2140 | parent.HasGroupChanged = true; | 2154 | parent.HasGroupChanged = true; |
2141 | parent.ScheduleGroupForTerseUpdate(); | 2155 | parent.ScheduleGroupForTerseUpdate(); |
@@ -7401,6 +7415,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
7401 | 7415 | ||
7402 | int idx = 0; | 7416 | int idx = 0; |
7403 | 7417 | ||
7418 | bool positionChanged = false; | ||
7419 | LSL_Vector currentPosition = GetPartLocalPos(part); | ||
7420 | |||
7404 | while (idx < rules.Length) | 7421 | while (idx < rules.Length) |
7405 | { | 7422 | { |
7406 | int code = rules.GetLSLIntegerItem(idx++); | 7423 | int code = rules.GetLSLIntegerItem(idx++); |
@@ -7409,7 +7426,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
7409 | 7426 | ||
7410 | int face; | 7427 | int face; |
7411 | LSL_Vector v; | 7428 | LSL_Vector v; |
7412 | 7429 | ||
7413 | switch (code) | 7430 | switch (code) |
7414 | { | 7431 | { |
7415 | case (int)ScriptBaseClass.PRIM_POSITION: | 7432 | case (int)ScriptBaseClass.PRIM_POSITION: |
@@ -7417,7 +7434,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
7417 | return; | 7434 | return; |
7418 | 7435 | ||
7419 | v=rules.GetVector3Item(idx++); | 7436 | v=rules.GetVector3Item(idx++); |
7420 | SetPos(part, v); | 7437 | positionChanged = true; |
7438 | currentPosition = GetSetPosTarget(part, v, currentPosition); | ||
7421 | 7439 | ||
7422 | break; | 7440 | break; |
7423 | case (int)ScriptBaseClass.PRIM_SIZE: | 7441 | case (int)ScriptBaseClass.PRIM_SIZE: |
@@ -7785,6 +7803,22 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
7785 | break; | 7803 | break; |
7786 | } | 7804 | } |
7787 | } | 7805 | } |
7806 | |||
7807 | if (positionChanged) | ||
7808 | { | ||
7809 | if (part.ParentGroup.RootPart == part) | ||
7810 | { | ||
7811 | SceneObjectGroup parent = part.ParentGroup; | ||
7812 | parent.UpdateGroupPosition(new Vector3((float)currentPosition.x, (float)currentPosition.y, (float)currentPosition.z)); | ||
7813 | } | ||
7814 | else | ||
7815 | { | ||
7816 | part.OffsetPosition = new Vector3((float)currentPosition.x, (float)currentPosition.y, (float)currentPosition.z); | ||
7817 | SceneObjectGroup parent = part.ParentGroup; | ||
7818 | parent.HasGroupChanged = true; | ||
7819 | parent.ScheduleGroupForTerseUpdate(); | ||
7820 | } | ||
7821 | } | ||
7788 | } | 7822 | } |
7789 | 7823 | ||
7790 | public LSL_String llStringToBase64(string str) | 7824 | public LSL_String llStringToBase64(string str) |