diff options
Diffstat (limited to '')
-rw-r--r-- | OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 202 |
1 files changed, 183 insertions, 19 deletions
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index 22a8ca1..56b2f13 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | |||
@@ -140,6 +140,15 @@ namespace OpenSim.Region.Framework.Scenes | |||
140 | 140 | ||
141 | [XmlIgnore] | 141 | [XmlIgnore] |
142 | public UUID FromItemID; | 142 | public UUID FromItemID; |
143 | |||
144 | [XmlIgnore] | ||
145 | public int STATUS_ROTATE_X; | ||
146 | |||
147 | [XmlIgnore] | ||
148 | public int STATUS_ROTATE_Y; | ||
149 | |||
150 | [XmlIgnore] | ||
151 | public int STATUS_ROTATE_Z; | ||
143 | 152 | ||
144 | [XmlIgnore] | 153 | [XmlIgnore] |
145 | private Dictionary<int, string> m_CollisionFilter = new Dictionary<int, string>(); | 154 | private Dictionary<int, string> m_CollisionFilter = new Dictionary<int, string>(); |
@@ -1673,6 +1682,19 @@ namespace OpenSim.Region.Framework.Scenes | |||
1673 | return m_parentGroup.RootPart.DIE_AT_EDGE; | 1682 | return m_parentGroup.RootPart.DIE_AT_EDGE; |
1674 | } | 1683 | } |
1675 | 1684 | ||
1685 | public int GetAxisRotation(int axis) | ||
1686 | { | ||
1687 | //Cannot use ScriptBaseClass constants as no referance to it currently. | ||
1688 | if (axis == 2)//STATUS_ROTATE_X | ||
1689 | return STATUS_ROTATE_X; | ||
1690 | if (axis == 4)//STATUS_ROTATE_Y | ||
1691 | return STATUS_ROTATE_Y; | ||
1692 | if (axis == 8)//STATUS_ROTATE_Z | ||
1693 | return STATUS_ROTATE_Z; | ||
1694 | |||
1695 | return 0; | ||
1696 | } | ||
1697 | |||
1676 | public double GetDistanceTo(Vector3 a, Vector3 b) | 1698 | public double GetDistanceTo(Vector3 a, Vector3 b) |
1677 | { | 1699 | { |
1678 | float dx = a.X - b.X; | 1700 | float dx = a.X - b.X; |
@@ -1831,16 +1853,12 @@ namespace OpenSim.Region.Framework.Scenes | |||
1831 | // and build up list of colliders this time | 1853 | // and build up list of colliders this time |
1832 | foreach (uint localid in collissionswith.Keys) | 1854 | foreach (uint localid in collissionswith.Keys) |
1833 | { | 1855 | { |
1834 | if (localid != 0) | 1856 | thisHitColliders.Add(localid); |
1857 | if (!m_lastColliders.Contains(localid)) | ||
1835 | { | 1858 | { |
1836 | thisHitColliders.Add(localid); | 1859 | startedColliders.Add(localid); |
1837 | if (!m_lastColliders.Contains(localid)) | ||
1838 | { | ||
1839 | startedColliders.Add(localid); | ||
1840 | } | ||
1841 | |||
1842 | //m_log.Debug("[OBJECT]: Collided with:" + localid.ToString() + " at depth of: " + collissionswith[localid].ToString()); | ||
1843 | } | 1860 | } |
1861 | //m_log.Debug("[OBJECT]: Collided with:" + localid.ToString() + " at depth of: " + collissionswith[localid].ToString()); | ||
1844 | } | 1862 | } |
1845 | 1863 | ||
1846 | // calculate things that ended colliding | 1864 | // calculate things that ended colliding |
@@ -1882,6 +1900,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
1882 | List<DetectedObject> colliding = new List<DetectedObject>(); | 1900 | List<DetectedObject> colliding = new List<DetectedObject>(); |
1883 | foreach (uint localId in startedColliders) | 1901 | foreach (uint localId in startedColliders) |
1884 | { | 1902 | { |
1903 | if (localId == 0) | ||
1904 | return; | ||
1885 | // always running this check because if the user deletes the object it would return a null reference. | 1905 | // always running this check because if the user deletes the object it would return a null reference. |
1886 | if (m_parentGroup == null) | 1906 | if (m_parentGroup == null) |
1887 | return; | 1907 | return; |
@@ -1919,7 +1939,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1919 | { | 1939 | { |
1920 | bool found = m_parentGroup.RootPart.CollisionFilter.TryGetValue(1,out data); | 1940 | bool found = m_parentGroup.RootPart.CollisionFilter.TryGetValue(1,out data); |
1921 | //If it is 1, it is to accept ONLY collisions from this object, so this other object will not work | 1941 | //If it is 1, it is to accept ONLY collisions from this object, so this other object will not work |
1922 | if (found) | 1942 | if (!found) |
1923 | { | 1943 | { |
1924 | DetectedObject detobj = new DetectedObject(); | 1944 | DetectedObject detobj = new DetectedObject(); |
1925 | detobj.keyUUID = obj.UUID; | 1945 | detobj.keyUUID = obj.UUID; |
@@ -1944,7 +1964,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1944 | 1964 | ||
1945 | if (av.LocalId == localId) | 1965 | if (av.LocalId == localId) |
1946 | { | 1966 | { |
1947 | if (m_parentGroup.RootPart.CollisionFilter.ContainsValue(obj.UUID.ToString()) || m_parentGroup.RootPart.CollisionFilter.ContainsValue(obj.Name)) | 1967 | if (m_parentGroup.RootPart.CollisionFilter.ContainsValue(av.UUID.ToString()) || m_parentGroup.RootPart.CollisionFilter.ContainsValue(av.Name)) |
1948 | { | 1968 | { |
1949 | bool found = m_parentGroup.RootPart.CollisionFilter.TryGetValue(1,out data); | 1969 | bool found = m_parentGroup.RootPart.CollisionFilter.TryGetValue(1,out data); |
1950 | //If it is 1, it is to accept ONLY collisions from this avatar | 1970 | //If it is 1, it is to accept ONLY collisions from this avatar |
@@ -1970,7 +1990,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1970 | { | 1990 | { |
1971 | bool found = m_parentGroup.RootPart.CollisionFilter.TryGetValue(1,out data); | 1991 | bool found = m_parentGroup.RootPart.CollisionFilter.TryGetValue(1,out data); |
1972 | //If it is 1, it is to accept ONLY collisions from this avatar, so this other avatar will not work | 1992 | //If it is 1, it is to accept ONLY collisions from this avatar, so this other avatar will not work |
1973 | if (found) | 1993 | if (!found) |
1974 | { | 1994 | { |
1975 | DetectedObject detobj = new DetectedObject(); | 1995 | DetectedObject detobj = new DetectedObject(); |
1976 | detobj.keyUUID = av.UUID; | 1996 | detobj.keyUUID = av.UUID; |
@@ -2017,7 +2037,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
2017 | { | 2037 | { |
2018 | // always running this check because if the user deletes the object it would return a null reference. | 2038 | // always running this check because if the user deletes the object it would return a null reference. |
2019 | if (localId == 0) | 2039 | if (localId == 0) |
2020 | continue; | 2040 | return; |
2021 | 2041 | ||
2022 | if (m_parentGroup == null) | 2042 | if (m_parentGroup == null) |
2023 | return; | 2043 | return; |
@@ -2055,7 +2075,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
2055 | { | 2075 | { |
2056 | bool found = m_parentGroup.RootPart.CollisionFilter.TryGetValue(1,out data); | 2076 | bool found = m_parentGroup.RootPart.CollisionFilter.TryGetValue(1,out data); |
2057 | //If it is 1, it is to accept ONLY collisions from this object, so this other object will not work | 2077 | //If it is 1, it is to accept ONLY collisions from this object, so this other object will not work |
2058 | if (found) | 2078 | if (!found) |
2059 | { | 2079 | { |
2060 | DetectedObject detobj = new DetectedObject(); | 2080 | DetectedObject detobj = new DetectedObject(); |
2061 | detobj.keyUUID = obj.UUID; | 2081 | detobj.keyUUID = obj.UUID; |
@@ -2080,7 +2100,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
2080 | 2100 | ||
2081 | if (av.LocalId == localId) | 2101 | if (av.LocalId == localId) |
2082 | { | 2102 | { |
2083 | if (m_parentGroup.RootPart.CollisionFilter.ContainsValue(obj.UUID.ToString()) || m_parentGroup.RootPart.CollisionFilter.ContainsValue(obj.Name)) | 2103 | if (m_parentGroup.RootPart.CollisionFilter.ContainsValue(av.UUID.ToString()) || m_parentGroup.RootPart.CollisionFilter.ContainsValue(av.Name)) |
2084 | { | 2104 | { |
2085 | bool found = m_parentGroup.RootPart.CollisionFilter.TryGetValue(1,out data); | 2105 | bool found = m_parentGroup.RootPart.CollisionFilter.TryGetValue(1,out data); |
2086 | //If it is 1, it is to accept ONLY collisions from this avatar | 2106 | //If it is 1, it is to accept ONLY collisions from this avatar |
@@ -2106,7 +2126,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
2106 | { | 2126 | { |
2107 | bool found = m_parentGroup.RootPart.CollisionFilter.TryGetValue(1,out data); | 2127 | bool found = m_parentGroup.RootPart.CollisionFilter.TryGetValue(1,out data); |
2108 | //If it is 1, it is to accept ONLY collisions from this avatar, so this other avatar will not work | 2128 | //If it is 1, it is to accept ONLY collisions from this avatar, so this other avatar will not work |
2109 | if (found) | 2129 | if (!found) |
2110 | { | 2130 | { |
2111 | DetectedObject detobj = new DetectedObject(); | 2131 | DetectedObject detobj = new DetectedObject(); |
2112 | detobj.keyUUID = av.UUID; | 2132 | detobj.keyUUID = av.UUID; |
@@ -2149,7 +2169,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
2149 | foreach (uint localId in endedColliders) | 2169 | foreach (uint localId in endedColliders) |
2150 | { | 2170 | { |
2151 | if (localId == 0) | 2171 | if (localId == 0) |
2152 | continue; | 2172 | return; |
2153 | 2173 | ||
2154 | // always running this check because if the user deletes the object it would return a null reference. | 2174 | // always running this check because if the user deletes the object it would return a null reference. |
2155 | if (m_parentGroup == null) | 2175 | if (m_parentGroup == null) |
@@ -2186,7 +2206,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
2186 | { | 2206 | { |
2187 | bool found = m_parentGroup.RootPart.CollisionFilter.TryGetValue(1,out data); | 2207 | bool found = m_parentGroup.RootPart.CollisionFilter.TryGetValue(1,out data); |
2188 | //If it is 1, it is to accept ONLY collisions from this object, so this other object will not work | 2208 | //If it is 1, it is to accept ONLY collisions from this object, so this other object will not work |
2189 | if (found) | 2209 | if (!found) |
2190 | { | 2210 | { |
2191 | DetectedObject detobj = new DetectedObject(); | 2211 | DetectedObject detobj = new DetectedObject(); |
2192 | detobj.keyUUID = obj.UUID; | 2212 | detobj.keyUUID = obj.UUID; |
@@ -2211,7 +2231,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
2211 | 2231 | ||
2212 | if (av.LocalId == localId) | 2232 | if (av.LocalId == localId) |
2213 | { | 2233 | { |
2214 | if (m_parentGroup.RootPart.CollisionFilter.ContainsValue(obj.UUID.ToString()) || m_parentGroup.RootPart.CollisionFilter.ContainsValue(obj.Name)) | 2234 | if (m_parentGroup.RootPart.CollisionFilter.ContainsValue(av.UUID.ToString()) || m_parentGroup.RootPart.CollisionFilter.ContainsValue(av.Name)) |
2215 | { | 2235 | { |
2216 | bool found = m_parentGroup.RootPart.CollisionFilter.TryGetValue(1,out data); | 2236 | bool found = m_parentGroup.RootPart.CollisionFilter.TryGetValue(1,out data); |
2217 | //If it is 1, it is to accept ONLY collisions from this avatar | 2237 | //If it is 1, it is to accept ONLY collisions from this avatar |
@@ -2237,7 +2257,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
2237 | { | 2257 | { |
2238 | bool found = m_parentGroup.RootPart.CollisionFilter.TryGetValue(1,out data); | 2258 | bool found = m_parentGroup.RootPart.CollisionFilter.TryGetValue(1,out data); |
2239 | //If it is 1, it is to accept ONLY collisions from this avatar, so this other avatar will not work | 2259 | //If it is 1, it is to accept ONLY collisions from this avatar, so this other avatar will not work |
2240 | if (found) | 2260 | if (!found) |
2241 | { | 2261 | { |
2242 | DetectedObject detobj = new DetectedObject(); | 2262 | DetectedObject detobj = new DetectedObject(); |
2243 | detobj.keyUUID = av.UUID; | 2263 | detobj.keyUUID = av.UUID; |
@@ -2271,6 +2291,120 @@ namespace OpenSim.Region.Framework.Scenes | |||
2271 | } | 2291 | } |
2272 | } | 2292 | } |
2273 | } | 2293 | } |
2294 | if ((m_parentGroup.RootPart.ScriptEvents & scriptEvents.land_collision_start) != 0) | ||
2295 | { | ||
2296 | if (startedColliders.Count > 0) | ||
2297 | { | ||
2298 | ColliderArgs LandStartCollidingMessage = new ColliderArgs(); | ||
2299 | List<DetectedObject> colliding = new List<DetectedObject>(); | ||
2300 | foreach (uint localId in startedColliders) | ||
2301 | { | ||
2302 | if (localId == 0) | ||
2303 | { | ||
2304 | //Hope that all is left is ground! | ||
2305 | DetectedObject detobj = new DetectedObject(); | ||
2306 | detobj.keyUUID = UUID.Zero; | ||
2307 | detobj.nameStr = ""; | ||
2308 | detobj.ownerUUID = UUID.Zero; | ||
2309 | detobj.posVector = m_parentGroup.RootPart.AbsolutePosition; | ||
2310 | detobj.rotQuat = Quaternion.Identity; | ||
2311 | detobj.velVector = Vector3.Zero; | ||
2312 | detobj.colliderType = 0; | ||
2313 | detobj.groupUUID = UUID.Zero; | ||
2314 | colliding.Add(detobj); | ||
2315 | } | ||
2316 | } | ||
2317 | |||
2318 | if (colliding.Count > 0) | ||
2319 | { | ||
2320 | LandStartCollidingMessage.Colliders = colliding; | ||
2321 | // always running this check because if the user deletes the object it would return a null reference. | ||
2322 | if (m_parentGroup == null) | ||
2323 | return; | ||
2324 | |||
2325 | if (m_parentGroup.Scene == null) | ||
2326 | return; | ||
2327 | |||
2328 | m_parentGroup.Scene.EventManager.TriggerScriptLandCollidingStart(LocalId, LandStartCollidingMessage); | ||
2329 | } | ||
2330 | } | ||
2331 | } | ||
2332 | if ((m_parentGroup.RootPart.ScriptEvents & scriptEvents.land_collision) != 0) | ||
2333 | { | ||
2334 | if (m_lastColliders.Count > 0) | ||
2335 | { | ||
2336 | ColliderArgs LandCollidingMessage = new ColliderArgs(); | ||
2337 | List<DetectedObject> colliding = new List<DetectedObject>(); | ||
2338 | foreach (uint localId in startedColliders) | ||
2339 | { | ||
2340 | if (localId == 0) | ||
2341 | { | ||
2342 | //Hope that all is left is ground! | ||
2343 | DetectedObject detobj = new DetectedObject(); | ||
2344 | detobj.keyUUID = UUID.Zero; | ||
2345 | detobj.nameStr = ""; | ||
2346 | detobj.ownerUUID = UUID.Zero; | ||
2347 | detobj.posVector = m_parentGroup.RootPart.AbsolutePosition; | ||
2348 | detobj.rotQuat = Quaternion.Identity; | ||
2349 | detobj.velVector = Vector3.Zero; | ||
2350 | detobj.colliderType = 0; | ||
2351 | detobj.groupUUID = UUID.Zero; | ||
2352 | colliding.Add(detobj); | ||
2353 | } | ||
2354 | } | ||
2355 | |||
2356 | if (colliding.Count > 0) | ||
2357 | { | ||
2358 | LandCollidingMessage.Colliders = colliding; | ||
2359 | // always running this check because if the user deletes the object it would return a null reference. | ||
2360 | if (m_parentGroup == null) | ||
2361 | return; | ||
2362 | |||
2363 | if (m_parentGroup.Scene == null) | ||
2364 | return; | ||
2365 | |||
2366 | m_parentGroup.Scene.EventManager.TriggerScriptLandColliding(LocalId, LandCollidingMessage); | ||
2367 | } | ||
2368 | } | ||
2369 | } | ||
2370 | if ((m_parentGroup.RootPart.ScriptEvents & scriptEvents.land_collision_end) != 0) | ||
2371 | { | ||
2372 | if (endedColliders.Count > 0) | ||
2373 | { | ||
2374 | ColliderArgs LandEndCollidingMessage = new ColliderArgs(); | ||
2375 | List<DetectedObject> colliding = new List<DetectedObject>(); | ||
2376 | foreach (uint localId in startedColliders) | ||
2377 | { | ||
2378 | if (localId == 0) | ||
2379 | { | ||
2380 | //Hope that all is left is ground! | ||
2381 | DetectedObject detobj = new DetectedObject(); | ||
2382 | detobj.keyUUID = UUID.Zero; | ||
2383 | detobj.nameStr = ""; | ||
2384 | detobj.ownerUUID = UUID.Zero; | ||
2385 | detobj.posVector = m_parentGroup.RootPart.AbsolutePosition; | ||
2386 | detobj.rotQuat = Quaternion.Identity; | ||
2387 | detobj.velVector = Vector3.Zero; | ||
2388 | detobj.colliderType = 0; | ||
2389 | detobj.groupUUID = UUID.Zero; | ||
2390 | colliding.Add(detobj); | ||
2391 | } | ||
2392 | } | ||
2393 | |||
2394 | if (colliding.Count > 0) | ||
2395 | { | ||
2396 | LandEndCollidingMessage.Colliders = colliding; | ||
2397 | // always running this check because if the user deletes the object it would return a null reference. | ||
2398 | if (m_parentGroup == null) | ||
2399 | return; | ||
2400 | |||
2401 | if (m_parentGroup.Scene == null) | ||
2402 | return; | ||
2403 | |||
2404 | m_parentGroup.Scene.EventManager.TriggerScriptLandCollidingEnd(LocalId, LandEndCollidingMessage); | ||
2405 | } | ||
2406 | } | ||
2407 | } | ||
2274 | } | 2408 | } |
2275 | 2409 | ||
2276 | public void PhysicsOutOfBounds(Vector3 pos) | 2410 | public void PhysicsOutOfBounds(Vector3 pos) |
@@ -2737,6 +2871,13 @@ namespace OpenSim.Region.Framework.Scenes | |||
2737 | { | 2871 | { |
2738 | m_parentGroup.SetAxisRotation(axis, rotate); | 2872 | m_parentGroup.SetAxisRotation(axis, rotate); |
2739 | } | 2873 | } |
2874 | //Cannot use ScriptBaseClass constants as no referance to it currently. | ||
2875 | if (axis == 2)//STATUS_ROTATE_X | ||
2876 | STATUS_ROTATE_X = rotate; | ||
2877 | if (axis == 4)//STATUS_ROTATE_Y | ||
2878 | STATUS_ROTATE_Y = rotate; | ||
2879 | if (axis == 8)//STATUS_ROTATE_Z | ||
2880 | STATUS_ROTATE_Z = rotate; | ||
2740 | } | 2881 | } |
2741 | 2882 | ||
2742 | public void SetBuoyancy(float fvalue) | 2883 | public void SetBuoyancy(float fvalue) |
@@ -3669,6 +3810,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
3669 | ((AggregateScriptEvents & scriptEvents.collision) != 0) || | 3810 | ((AggregateScriptEvents & scriptEvents.collision) != 0) || |
3670 | ((AggregateScriptEvents & scriptEvents.collision_end) != 0) || | 3811 | ((AggregateScriptEvents & scriptEvents.collision_end) != 0) || |
3671 | ((AggregateScriptEvents & scriptEvents.collision_start) != 0) || | 3812 | ((AggregateScriptEvents & scriptEvents.collision_start) != 0) || |
3813 | ((AggregateScriptEvents & scriptEvents.land_collision_start) != 0) || | ||
3814 | ((AggregateScriptEvents & scriptEvents.land_collision) != 0) || | ||
3815 | ((AggregateScriptEvents & scriptEvents.land_collision_end) != 0) || | ||
3672 | (CollisionSound != UUID.Zero) | 3816 | (CollisionSound != UUID.Zero) |
3673 | ) | 3817 | ) |
3674 | { | 3818 | { |
@@ -3873,6 +4017,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
3873 | ((AggregateScriptEvents & scriptEvents.collision) != 0) || | 4017 | ((AggregateScriptEvents & scriptEvents.collision) != 0) || |
3874 | ((AggregateScriptEvents & scriptEvents.collision_end) != 0) || | 4018 | ((AggregateScriptEvents & scriptEvents.collision_end) != 0) || |
3875 | ((AggregateScriptEvents & scriptEvents.collision_start) != 0) || | 4019 | ((AggregateScriptEvents & scriptEvents.collision_start) != 0) || |
4020 | ((AggregateScriptEvents & scriptEvents.land_collision_start) != 0) || | ||
4021 | ((AggregateScriptEvents & scriptEvents.land_collision) != 0) || | ||
4022 | ((AggregateScriptEvents & scriptEvents.land_collision_end) != 0) || | ||
3876 | (CollisionSound != UUID.Zero) | 4023 | (CollisionSound != UUID.Zero) |
3877 | ) | 4024 | ) |
3878 | { | 4025 | { |
@@ -3933,6 +4080,23 @@ namespace OpenSim.Region.Framework.Scenes | |||
3933 | } | 4080 | } |
3934 | } | 4081 | } |
3935 | 4082 | ||
4083 | public int registerRotTargetWaypoint(Quaternion target, float tolerance) | ||
4084 | { | ||
4085 | if (m_parentGroup != null) | ||
4086 | { | ||
4087 | return m_parentGroup.registerRotTargetWaypoint(target, tolerance); | ||
4088 | } | ||
4089 | return 0; | ||
4090 | } | ||
4091 | |||
4092 | public void unregisterRotTargetWaypoint(int handle) | ||
4093 | { | ||
4094 | if (m_parentGroup != null) | ||
4095 | { | ||
4096 | m_parentGroup.unregisterRotTargetWaypoint(handle); | ||
4097 | } | ||
4098 | } | ||
4099 | |||
3936 | public void SetCameraAtOffset(Vector3 v) | 4100 | public void SetCameraAtOffset(Vector3 v) |
3937 | { | 4101 | { |
3938 | m_cameraAtOffset = v; | 4102 | m_cameraAtOffset = v; |