diff options
Merge branch 'ubitwork' of ssh://3dhosting.de/var/git/careminster into ubitwork
-rw-r--r-- | OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | 74 |
1 files changed, 48 insertions, 26 deletions
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 5bade25..5cbcfec 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | |||
@@ -8000,6 +8000,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
8000 | //This is a special version of SetPrimParams to deal with avatars which are sat on the linkset. | 8000 | //This is a special version of SetPrimParams to deal with avatars which are sat on the linkset. |
8001 | 8001 | ||
8002 | int idx = 0; | 8002 | int idx = 0; |
8003 | SceneObjectPart sitpart = World.GetSceneObjectPart(av.ParentID); // betting this will be used | ||
8003 | 8004 | ||
8004 | bool positionChanged = false; | 8005 | bool positionChanged = false; |
8005 | Vector3 finalPos = Vector3.Zero; | 8006 | Vector3 finalPos = Vector3.Zero; |
@@ -8014,60 +8015,81 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
8014 | 8015 | ||
8015 | switch (code) | 8016 | switch (code) |
8016 | { | 8017 | { |
8018 | // a avatar is a child | ||
8017 | case (int)ScriptBaseClass.PRIM_POSITION: | 8019 | case (int)ScriptBaseClass.PRIM_POSITION: |
8018 | case (int)ScriptBaseClass.PRIM_POS_LOCAL: | 8020 | case (int)ScriptBaseClass.PRIM_POS_LOCAL: |
8019 | { | 8021 | { |
8020 | if (remain < 1) | 8022 | if (remain < 1) |
8021 | return; | 8023 | return; |
8022 | |||
8023 | LSL_Vector v; | 8024 | LSL_Vector v; |
8024 | v = rules.GetVector3Item(idx++); | 8025 | v = rules.GetVector3Item(idx++); |
8025 | 8026 | ||
8026 | SceneObjectPart part = World.GetSceneObjectPart(av.ParentID); | 8027 | if (sitpart == null) |
8027 | if (part == null) | ||
8028 | break; | 8028 | break; |
8029 | 8029 | ||
8030 | LSL_Rotation localRot = ScriptBaseClass.ZERO_ROTATION; | 8030 | Vector3 pos = new Vector3((float)v.x, (float)v.y, (float)v.z); // requested absolute position |
8031 | LSL_Vector localPos = ScriptBaseClass.ZERO_VECTOR; | 8031 | |
8032 | if (llGetLinkNumber() > 1) | 8032 | if (sitpart != sitpart.ParentGroup.RootPart) |
8033 | { | 8033 | { |
8034 | localRot = llGetLocalRot(); | 8034 | pos -= sitpart.OffsetPosition; // remove sit part offset |
8035 | localPos = llGetLocalPos(); | 8035 | Quaternion rot = sitpart.RotationOffset; |
8036 | pos *= Quaternion.Conjugate(rot); // removed sit part rotation | ||
8036 | } | 8037 | } |
8038 | Vector3 sitOffset = (Zrot(av.Rotation)) * (av.Appearance.AvatarHeight * 0.02638f * 2.0f); | ||
8039 | pos += sitOffset; | ||
8037 | 8040 | ||
8038 | v -= localPos; | 8041 | finalPos = pos; |
8039 | v /= localRot; | 8042 | positionChanged = true; |
8043 | } | ||
8044 | break; | ||
8040 | 8045 | ||
8041 | LSL_Vector sitOffset = (llRot2Up(new LSL_Rotation(av.Rotation.X, av.Rotation.Y, av.Rotation.Z, av.Rotation.W)) * av.Appearance.AvatarHeight * 0.02638f); | 8046 | case (int)ScriptBaseClass.PRIM_ROTATION: |
8047 | { | ||
8048 | if (remain < 1) | ||
8049 | return; | ||
8042 | 8050 | ||
8043 | v = v + 2 * sitOffset; | 8051 | if (sitpart == null) |
8052 | break; | ||
8044 | 8053 | ||
8045 | av.OffsetPosition = new Vector3((float)v.x, (float)v.y, (float)v.z); | 8054 | LSL_Rotation r = rules.GetQuaternionItem(idx++); |
8046 | av.SendAvatarDataToAllAgents(); | 8055 | Quaternion rot = new Quaternion((float)r.x, (float)r.y, (float)r.z, (float)r.s); // requested world rotation |
8056 | |||
8057 | SceneObjectGroup sitgrp = sitpart.ParentGroup; | ||
8058 | if (sitgrp != null) | ||
8059 | { | ||
8060 | // need to replicate SL bug | ||
8061 | rot = sitgrp.RootPart.RotationOffset * rot; | ||
8062 | if (sitgrp.RootPart != sitpart) | ||
8063 | { | ||
8064 | Quaternion srot = sitpart.RotationOffset; | ||
8065 | rot = Quaternion.Conjugate(srot) * rot; // removed sit part offset rotation | ||
8066 | } | ||
8047 | 8067 | ||
8068 | av.Rotation = rot; | ||
8069 | // av.SendAvatarDataToAllAgents(); | ||
8070 | av.SendTerseUpdateToAllClients(); | ||
8071 | } | ||
8048 | } | 8072 | } |
8049 | break; | 8073 | break; |
8050 | 8074 | ||
8051 | case (int)ScriptBaseClass.PRIM_ROT_LOCAL: | 8075 | case (int)ScriptBaseClass.PRIM_ROT_LOCAL: |
8052 | case (int)ScriptBaseClass.PRIM_ROTATION: | ||
8053 | { | 8076 | { |
8054 | if (remain < 1) | 8077 | if (remain < 1) |
8055 | return; | 8078 | return; |
8056 | 8079 | ||
8057 | LSL_Rotation localRot = ScriptBaseClass.ZERO_ROTATION; | 8080 | if (sitpart == null) |
8058 | LSL_Vector localPos = ScriptBaseClass.ZERO_VECTOR; | 8081 | break; |
8059 | 8082 | ||
8060 | if (llGetLinkNumber() > 1) | 8083 | LSL_Rotation r = rules.GetQuaternionItem(idx++); |
8084 | Quaternion rot = new Quaternion((float)r.x, (float)r.y, (float)r.z, (float)r.s); // requested offset rotation | ||
8085 | if (sitpart != sitpart.ParentGroup.RootPart) | ||
8061 | { | 8086 | { |
8062 | localRot = llGetLocalRot(); | 8087 | Quaternion srot = sitpart.RotationOffset; |
8063 | localPos = llGetLocalPos(); | 8088 | rot = Quaternion.Conjugate(srot) * rot; // remove sit part offset rotation |
8064 | } | 8089 | } |
8065 | 8090 | av.Rotation = rot; | |
8066 | LSL_Rotation r; | 8091 | // av.SendAvatarDataToAllAgents(); |
8067 | r = rules.GetQuaternionItem(idx++); | 8092 | av.SendTerseUpdateToAllClients(); |
8068 | r = r * llGetRootRotation() / localRot; | ||
8069 | av.Rotation = new Quaternion((float)r.x, (float)r.y, (float)r.z, (float)r.s); | ||
8070 | av.SendAvatarDataToAllAgents(); | ||
8071 | } | 8093 | } |
8072 | break; | 8094 | break; |
8073 | 8095 | ||