aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Framework/Scenes
diff options
context:
space:
mode:
authorJustin Clark-Casey (justincc)2012-07-10 23:19:52 +0100
committerJustin Clark-Casey (justincc)2012-07-10 23:21:39 +0100
commite8347b70957273421ee567577e2d9a6139af0621 (patch)
tree94ca5b3a04b5fe6d0fdd3b546a1ec8056d218f9e /OpenSim/Region/Framework/Scenes
parentRemove log line accidentally left in SP.SendSitResponse() (diff)
downloadopensim-SC-e8347b70957273421ee567577e2d9a6139af0621.zip
opensim-SC-e8347b70957273421ee567577e2d9a6139af0621.tar.gz
opensim-SC-e8347b70957273421ee567577e2d9a6139af0621.tar.bz2
opensim-SC-e8347b70957273421ee567577e2d9a6139af0621.tar.xz
Move common code to detect whether a part has a valid sit target into a SOP property rather than being repeated in SP.
This also makes the detection in SP.FindNextAvailableSitTarget() and SendSitResponse() identical. Previously they varied slightly (SendSitResponse didn't check for an older type of invalid quaternion) but the practical effect is most probably zero.
Diffstat (limited to 'OpenSim/Region/Framework/Scenes')
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneObjectPart.cs15
-rw-r--r--OpenSim/Region/Framework/Scenes/ScenePresence.cs35
2 files changed, 20 insertions, 30 deletions
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index 6677dae..dcec7e9 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
@@ -135,6 +135,21 @@ namespace OpenSim.Region.Framework.Scenes
135 get { return ParentGroup.RootPart == this; } 135 get { return ParentGroup.RootPart == this; }
136 } 136 }
137 137
138 /// <summary>
139 /// Is an explicit sit target set for this part?
140 /// </summary>
141 public bool IsSitTargetSet
142 {
143 get
144 {
145 return
146 !(SitTargetPosition == Vector3.Zero
147 && (SitTargetOrientation == Quaternion.Identity // Valid Zero Rotation quaternion
148 || SitTargetOrientation.X == 0f && SitTargetOrientation.Y == 0f && SitTargetOrientation.Z == 1f && SitTargetOrientation.W == 0f // W-Z Mapping was invalid at one point
149 || SitTargetOrientation.X == 0f && SitTargetOrientation.Y == 0f && SitTargetOrientation.Z == 0f && SitTargetOrientation.W == 0f)); // Invalid Quaternion
150 }
151 }
152
138 #region Fields 153 #region Fields
139 154
140 public bool AllowedDrop; 155 public bool AllowedDrop;
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index c71bae9..c644ea5 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -1846,15 +1846,7 @@ namespace OpenSim.Region.Framework.Scenes
1846 //look for prims with explicit sit targets that are available 1846 //look for prims with explicit sit targets that are available
1847 foreach (SceneObjectPart part in partArray) 1847 foreach (SceneObjectPart part in partArray)
1848 { 1848 {
1849 // Is a sit target available? 1849 if (part.IsSitTargetSet && part.SitTargetAvatar == UUID.Zero)
1850 Vector3 avSitOffset = part.SitTargetPosition;
1851 Quaternion avSitOrientation = part.SitTargetOrientation;
1852 UUID avOnTargetAlready = part.SitTargetAvatar;
1853
1854 bool SitTargetUnOccupied = avOnTargetAlready == UUID.Zero;
1855 bool SitTargetisSet = avSitOffset != Vector3.Zero || avSitOrientation != Quaternion.Identity;
1856
1857 if (SitTargetisSet && SitTargetUnOccupied)
1858 { 1850 {
1859 //switch the target to this prim 1851 //switch the target to this prim
1860 return part; 1852 return part;
@@ -1880,40 +1872,23 @@ namespace OpenSim.Region.Framework.Scenes
1880 // TODO: determine position to sit at based on scene geometry; don't trust offset from client 1872 // TODO: determine position to sit at based on scene geometry; don't trust offset from client
1881 // see http://wiki.secondlife.com/wiki/User:Andrew_Linden/Office_Hours/2007_11_06 for details on how LL does it 1873 // see http://wiki.secondlife.com/wiki/User:Andrew_Linden/Office_Hours/2007_11_06 for details on how LL does it
1882 1874
1883 // Is a sit target available?
1884 Vector3 avSitOffSet = part.SitTargetPosition;
1885 Quaternion avSitOrientation = part.SitTargetOrientation;
1886 UUID avOnTargetAlready = part.SitTargetAvatar;
1887
1888 bool SitTargetUnOccupied = (!(avOnTargetAlready != UUID.Zero));
1889 bool SitTargetisSet =
1890 (!(avSitOffSet == Vector3.Zero &&
1891 (
1892 avSitOrientation == Quaternion.Identity // Valid Zero Rotation quaternion
1893 || avSitOrientation.X == 0f && avSitOrientation.Y == 0f && avSitOrientation.Z == 1f && avSitOrientation.W == 0f // W-Z Mapping was invalid at one point
1894 || avSitOrientation.X == 0f && avSitOrientation.Y == 0f && avSitOrientation.Z == 0f && avSitOrientation.W == 0f // Invalid Quaternion
1895 )
1896 ));
1897
1898// m_log.DebugFormat("[SCENE PRESENCE]: {0} {1}", SitTargetisSet, SitTargetUnOccupied);
1899
1900 if (PhysicsActor != null) 1875 if (PhysicsActor != null)
1901 m_sitAvatarHeight = PhysicsActor.Size.Z; 1876 m_sitAvatarHeight = PhysicsActor.Size.Z;
1902 1877
1903 bool canSit = false; 1878 bool canSit = false;
1904 pos = part.AbsolutePosition + offset; 1879 pos = part.AbsolutePosition + offset;
1905 1880
1906 if (SitTargetisSet) 1881 if (part.IsSitTargetSet)
1907 { 1882 {
1908 if (SitTargetUnOccupied) 1883 if (part.SitTargetAvatar == UUID.Zero)
1909 { 1884 {
1910// m_log.DebugFormat( 1885// m_log.DebugFormat(
1911// "[SCENE PRESENCE]: Sitting {0} on {1} {2} because sit target is set and unoccupied", 1886// "[SCENE PRESENCE]: Sitting {0} on {1} {2} because sit target is set and unoccupied",
1912// Name, part.Name, part.LocalId); 1887// Name, part.Name, part.LocalId);
1913 1888
1914 part.SitTargetAvatar = UUID; 1889 part.SitTargetAvatar = UUID;
1915 offset = new Vector3(avSitOffSet.X, avSitOffSet.Y, avSitOffSet.Z); 1890 offset = part.SitTargetPosition;
1916 sitOrientation = avSitOrientation; 1891 sitOrientation = part.SitTargetOrientation;
1917 canSit = true; 1892 canSit = true;
1918 } 1893 }
1919 } 1894 }