diff options
Diffstat (limited to 'OpenSim')
5 files changed, 412 insertions, 67 deletions
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index 6b562e5..1e1eee2 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | |||
@@ -107,6 +107,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
107 | [XmlIgnore] | 107 | [XmlIgnore] |
108 | public bool DIE_AT_EDGE; | 108 | public bool DIE_AT_EDGE; |
109 | 109 | ||
110 | [XmlIgnore] | ||
111 | public Dictionary<int, string> m_CollisionFilter; | ||
112 | |||
110 | // TODO: This needs to be persisted in next XML version update! | 113 | // TODO: This needs to be persisted in next XML version update! |
111 | [XmlIgnore] | 114 | [XmlIgnore] |
112 | public readonly int[] PayPrice = {-2,-2,-2,-2,-2}; | 115 | public readonly int[] PayPrice = {-2,-2,-2,-2,-2}; |
@@ -456,6 +459,15 @@ namespace OpenSim.Region.Framework.Scenes | |||
456 | ParentGroup.HasGroupChanged = true; | 459 | ParentGroup.HasGroupChanged = true; |
457 | } | 460 | } |
458 | } | 461 | } |
462 | |||
463 | public Dictionary<int, string> CollisionFilter | ||
464 | { | ||
465 | get { return m_CollisionFilter; } | ||
466 | set | ||
467 | { | ||
468 | m_CollisionFilter = value; | ||
469 | } | ||
470 | } | ||
459 | 471 | ||
460 | public ulong RegionHandle | 472 | public ulong RegionHandle |
461 | { | 473 | { |
@@ -1883,20 +1895,52 @@ namespace OpenSim.Region.Framework.Scenes | |||
1883 | 1895 | ||
1884 | if (m_parentGroup.Scene == null) | 1896 | if (m_parentGroup.Scene == null) |
1885 | return; | 1897 | return; |
1886 | 1898 | #region collision Filter | |
1887 | SceneObjectPart obj = m_parentGroup.Scene.GetSceneObjectPart(localId); | 1899 | SceneObjectPart obj = m_parentGroup.Scene.GetSceneObjectPart(localId); |
1888 | if (obj != null) | 1900 | if (obj != null) |
1889 | { | 1901 | { |
1890 | DetectedObject detobj = new DetectedObject(); | 1902 | if(m_parentGroup.RootPart.CollisionFilter.ContainsValue(obj.UUID.ToString()) || m_parentGroup.RootPart.CollisionFilter.ContainsValue(obj.Name)) |
1891 | detobj.keyUUID = obj.UUID; | 1903 | { |
1892 | detobj.nameStr = obj.Name; | 1904 | string data = ""; |
1893 | detobj.ownerUUID = obj._ownerID; | 1905 | m_parentGroup.RootPart.CollisionFilter.TryGetValue(1,out data); |
1894 | detobj.posVector = obj.AbsolutePosition; | 1906 | //If it is 1, it is to accept ONLY collisions from this object |
1895 | detobj.rotQuat = obj.GetWorldRotation(); | 1907 | if(data != "") |
1896 | detobj.velVector = obj.Velocity; | 1908 | { |
1897 | detobj.colliderType = 0; | 1909 | DetectedObject detobj = new DetectedObject(); |
1898 | detobj.groupUUID = obj._groupID; | 1910 | detobj.keyUUID = obj.UUID; |
1899 | colliding.Add(detobj); | 1911 | detobj.nameStr = obj.Name; |
1912 | detobj.ownerUUID = obj._ownerID; | ||
1913 | detobj.posVector = obj.AbsolutePosition; | ||
1914 | detobj.rotQuat = obj.GetWorldRotation(); | ||
1915 | detobj.velVector = obj.Velocity; | ||
1916 | detobj.colliderType = 0; | ||
1917 | detobj.groupUUID = obj._groupID; | ||
1918 | colliding.Add(detobj); | ||
1919 | } | ||
1920 | //If it is 0, it is to not accept collisions from this object | ||
1921 | else | ||
1922 | { | ||
1923 | } | ||
1924 | } | ||
1925 | else | ||
1926 | { | ||
1927 | string data = ""; | ||
1928 | m_parentGroup.RootPart.CollisionFilter.TryGetValue(1,out data); | ||
1929 | //If it is 1, it is to accept ONLY collisions from this object, so this other object will not work | ||
1930 | if(data == "") | ||
1931 | { | ||
1932 | DetectedObject detobj = new DetectedObject(); | ||
1933 | detobj.keyUUID = obj.UUID; | ||
1934 | detobj.nameStr = obj.Name; | ||
1935 | detobj.ownerUUID = obj._ownerID; | ||
1936 | detobj.posVector = obj.AbsolutePosition; | ||
1937 | detobj.rotQuat = obj.GetWorldRotation(); | ||
1938 | detobj.velVector = obj.Velocity; | ||
1939 | detobj.colliderType = 0; | ||
1940 | detobj.groupUUID = obj._groupID; | ||
1941 | colliding.Add(detobj); | ||
1942 | } | ||
1943 | } | ||
1900 | } | 1944 | } |
1901 | else | 1945 | else |
1902 | { | 1946 | { |
@@ -1908,19 +1952,52 @@ namespace OpenSim.Region.Framework.Scenes | |||
1908 | 1952 | ||
1909 | if (av.LocalId == localId) | 1953 | if (av.LocalId == localId) |
1910 | { | 1954 | { |
1911 | DetectedObject detobj = new DetectedObject(); | 1955 | if(m_parentGroup.RootPart.CollisionFilter.ContainsValue(obj.UUID.ToString()) || m_parentGroup.RootPart.CollisionFilter.ContainsValue(obj.Name)) |
1912 | detobj.keyUUID = av.UUID; | 1956 | { |
1913 | detobj.nameStr = av.ControllingClient.Name; | 1957 | string data = ""; |
1914 | detobj.ownerUUID = av.UUID; | 1958 | m_parentGroup.RootPart.CollisionFilter.TryGetValue(1,out data); |
1915 | detobj.posVector = av.AbsolutePosition; | 1959 | //If it is 1, it is to accept ONLY collisions from this avatar |
1916 | detobj.rotQuat = av.Rotation; | 1960 | if(data != "") |
1917 | detobj.velVector = av.Velocity; | 1961 | { |
1918 | detobj.colliderType = 0; | 1962 | DetectedObject detobj = new DetectedObject(); |
1919 | detobj.groupUUID = av.ControllingClient.ActiveGroupId; | 1963 | detobj.keyUUID = av.UUID; |
1920 | colliding.Add(detobj); | 1964 | detobj.nameStr = av.ControllingClient.Name; |
1965 | detobj.ownerUUID = av.UUID; | ||
1966 | detobj.posVector = av.AbsolutePosition; | ||
1967 | detobj.rotQuat = av.Rotation; | ||
1968 | detobj.velVector = av.Velocity; | ||
1969 | detobj.colliderType = 0; | ||
1970 | detobj.groupUUID = av.ControllingClient.ActiveGroupId; | ||
1971 | colliding.Add(detobj); | ||
1972 | } | ||
1973 | //If it is 0, it is to not accept collisions from this avatar | ||
1974 | else | ||
1975 | { | ||
1976 | } | ||
1977 | } | ||
1978 | else | ||
1979 | { | ||
1980 | string data = ""; | ||
1981 | m_parentGroup.RootPart.CollisionFilter.TryGetValue(1,out data); | ||
1982 | //If it is 1, it is to accept ONLY collisions from this avatar, so this other avatar will not work | ||
1983 | if(data == "") | ||
1984 | { | ||
1985 | DetectedObject detobj = new DetectedObject(); | ||
1986 | detobj.keyUUID = av.UUID; | ||
1987 | detobj.nameStr = av.ControllingClient.Name; | ||
1988 | detobj.ownerUUID = av.UUID; | ||
1989 | detobj.posVector = av.AbsolutePosition; | ||
1990 | detobj.rotQuat = av.Rotation; | ||
1991 | detobj.velVector = av.Velocity; | ||
1992 | detobj.colliderType = 0; | ||
1993 | detobj.groupUUID = av.ControllingClient.ActiveGroupId; | ||
1994 | colliding.Add(detobj); | ||
1995 | } | ||
1996 | } | ||
1921 | } | 1997 | } |
1922 | } | 1998 | } |
1923 | } | 1999 | } |
2000 | #endregion | ||
1924 | } | 2001 | } |
1925 | if (colliding.Count > 0) | 2002 | if (colliding.Count > 0) |
1926 | { | 2003 | { |
@@ -1954,41 +2031,105 @@ namespace OpenSim.Region.Framework.Scenes | |||
1954 | 2031 | ||
1955 | if (m_parentGroup.Scene == null) | 2032 | if (m_parentGroup.Scene == null) |
1956 | return; | 2033 | return; |
1957 | 2034 | #region collision Filter | |
1958 | SceneObjectPart obj = m_parentGroup.Scene.GetSceneObjectPart(localId); | 2035 | SceneObjectPart obj = m_parentGroup.Scene.GetSceneObjectPart(localId); |
1959 | if (obj != null) | 2036 | if (obj != null) |
1960 | { | 2037 | { |
1961 | DetectedObject detobj = new DetectedObject(); | 2038 | if(m_parentGroup.RootPart.CollisionFilter.ContainsValue(obj.UUID.ToString()) || m_parentGroup.RootPart.CollisionFilter.ContainsValue(obj.Name)) |
1962 | detobj.keyUUID = obj.UUID; | 2039 | { |
1963 | detobj.nameStr = obj.Name; | 2040 | string data = ""; |
1964 | detobj.ownerUUID = obj._ownerID; | 2041 | m_parentGroup.RootPart.CollisionFilter.TryGetValue(1,out data); |
1965 | detobj.posVector = obj.AbsolutePosition; | 2042 | //If it is 1, it is to accept ONLY collisions from this object |
1966 | detobj.rotQuat = obj.GetWorldRotation(); | 2043 | if(data != "") |
1967 | detobj.velVector = obj.Velocity; | 2044 | { |
1968 | detobj.colliderType = 0; | 2045 | DetectedObject detobj = new DetectedObject(); |
1969 | detobj.groupUUID = obj._groupID; | 2046 | detobj.keyUUID = obj.UUID; |
1970 | colliding.Add(detobj); | 2047 | detobj.nameStr = obj.Name; |
2048 | detobj.ownerUUID = obj._ownerID; | ||
2049 | detobj.posVector = obj.AbsolutePosition; | ||
2050 | detobj.rotQuat = obj.GetWorldRotation(); | ||
2051 | detobj.velVector = obj.Velocity; | ||
2052 | detobj.colliderType = 0; | ||
2053 | detobj.groupUUID = obj._groupID; | ||
2054 | colliding.Add(detobj); | ||
2055 | } | ||
2056 | //If it is 0, it is to not accept collisions from this object | ||
2057 | else | ||
2058 | { | ||
2059 | } | ||
2060 | } | ||
2061 | else | ||
2062 | { | ||
2063 | string data = ""; | ||
2064 | m_parentGroup.RootPart.CollisionFilter.TryGetValue(1,out data); | ||
2065 | //If it is 1, it is to accept ONLY collisions from this object, so this other object will not work | ||
2066 | if(data == "") | ||
2067 | { | ||
2068 | DetectedObject detobj = new DetectedObject(); | ||
2069 | detobj.keyUUID = obj.UUID; | ||
2070 | detobj.nameStr = obj.Name; | ||
2071 | detobj.ownerUUID = obj._ownerID; | ||
2072 | detobj.posVector = obj.AbsolutePosition; | ||
2073 | detobj.rotQuat = obj.GetWorldRotation(); | ||
2074 | detobj.velVector = obj.Velocity; | ||
2075 | detobj.colliderType = 0; | ||
2076 | detobj.groupUUID = obj._groupID; | ||
2077 | colliding.Add(detobj); | ||
2078 | } | ||
2079 | } | ||
1971 | } | 2080 | } |
1972 | else | 2081 | else |
1973 | { | 2082 | { |
1974 | ScenePresence[] avlist = m_parentGroup.Scene.GetScenePresences(); | 2083 | ScenePresence[] avlist = m_parentGroup.Scene.GetScenePresences(); |
1975 | 2084 | ||
1976 | for (int i = 0; i < avlist.Length; i++) | 2085 | for (int i = 0; i < avlist.Length; i++) |
1977 | { | 2086 | { |
1978 | ScenePresence av = avlist[i]; | 2087 | ScenePresence av = avlist[i]; |
1979 | 2088 | ||
1980 | if (av.LocalId == localId) | 2089 | if (av.LocalId == localId) |
1981 | { | 2090 | { |
1982 | DetectedObject detobj = new DetectedObject(); | 2091 | if(m_parentGroup.RootPart.CollisionFilter.ContainsValue(obj.UUID.ToString()) || m_parentGroup.RootPart.CollisionFilter.ContainsValue(obj.Name)) |
1983 | detobj.keyUUID = av.UUID; | 2092 | { |
1984 | detobj.nameStr = av.Name; | 2093 | string data = ""; |
1985 | detobj.ownerUUID = av.UUID; | 2094 | m_parentGroup.RootPart.CollisionFilter.TryGetValue(1,out data); |
1986 | detobj.posVector = av.AbsolutePosition; | 2095 | //If it is 1, it is to accept ONLY collisions from this avatar |
1987 | detobj.rotQuat = av.Rotation; | 2096 | if(data != "") |
1988 | detobj.velVector = av.Velocity; | 2097 | { |
1989 | detobj.colliderType = 0; | 2098 | DetectedObject detobj = new DetectedObject(); |
1990 | detobj.groupUUID = av.ControllingClient.ActiveGroupId; | 2099 | detobj.keyUUID = av.UUID; |
1991 | colliding.Add(detobj); | 2100 | detobj.nameStr = av.ControllingClient.Name; |
2101 | detobj.ownerUUID = av.UUID; | ||
2102 | detobj.posVector = av.AbsolutePosition; | ||
2103 | detobj.rotQuat = av.Rotation; | ||
2104 | detobj.velVector = av.Velocity; | ||
2105 | detobj.colliderType = 0; | ||
2106 | detobj.groupUUID = av.ControllingClient.ActiveGroupId; | ||
2107 | colliding.Add(detobj); | ||
2108 | } | ||
2109 | //If it is 0, it is to not accept collisions from this avatar | ||
2110 | else | ||
2111 | { | ||
2112 | } | ||
2113 | } | ||
2114 | else | ||
2115 | { | ||
2116 | string data = ""; | ||
2117 | m_parentGroup.RootPart.CollisionFilter.TryGetValue(1,out data); | ||
2118 | //If it is 1, it is to accept ONLY collisions from this avatar, so this other avatar will not work | ||
2119 | if(data == "") | ||
2120 | { | ||
2121 | DetectedObject detobj = new DetectedObject(); | ||
2122 | detobj.keyUUID = av.UUID; | ||
2123 | detobj.nameStr = av.ControllingClient.Name; | ||
2124 | detobj.ownerUUID = av.UUID; | ||
2125 | detobj.posVector = av.AbsolutePosition; | ||
2126 | detobj.rotQuat = av.Rotation; | ||
2127 | detobj.velVector = av.Velocity; | ||
2128 | detobj.colliderType = 0; | ||
2129 | detobj.groupUUID = av.ControllingClient.ActiveGroupId; | ||
2130 | colliding.Add(detobj); | ||
2131 | } | ||
2132 | } | ||
1992 | } | 2133 | } |
1993 | } | 2134 | } |
1994 | } | 2135 | } |
@@ -2006,6 +2147,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
2006 | m_parentGroup.Scene.EventManager.TriggerScriptColliding(LocalId, CollidingMessage); | 2147 | m_parentGroup.Scene.EventManager.TriggerScriptColliding(LocalId, CollidingMessage); |
2007 | } | 2148 | } |
2008 | } | 2149 | } |
2150 | #endregion | ||
2009 | } | 2151 | } |
2010 | 2152 | ||
2011 | if ((m_parentGroup.RootPart.ScriptEvents & scriptEvents.collision_end) != 0) | 2153 | if ((m_parentGroup.RootPart.ScriptEvents & scriptEvents.collision_end) != 0) |
@@ -2024,19 +2166,52 @@ namespace OpenSim.Region.Framework.Scenes | |||
2024 | return; | 2166 | return; |
2025 | if (m_parentGroup.Scene == null) | 2167 | if (m_parentGroup.Scene == null) |
2026 | return; | 2168 | return; |
2169 | #region collision Filter | ||
2027 | SceneObjectPart obj = m_parentGroup.Scene.GetSceneObjectPart(localId); | 2170 | SceneObjectPart obj = m_parentGroup.Scene.GetSceneObjectPart(localId); |
2028 | if (obj != null) | 2171 | if (obj != null) |
2029 | { | 2172 | { |
2030 | DetectedObject detobj = new DetectedObject(); | 2173 | if(m_parentGroup.RootPart.CollisionFilter.ContainsValue(obj.UUID.ToString()) || m_parentGroup.RootPart.CollisionFilter.ContainsValue(obj.Name)) |
2031 | detobj.keyUUID = obj.UUID; | 2174 | { |
2032 | detobj.nameStr = obj.Name; | 2175 | string data = ""; |
2033 | detobj.ownerUUID = obj._ownerID; | 2176 | m_parentGroup.RootPart.CollisionFilter.TryGetValue(1,out data); |
2034 | detobj.posVector = obj.AbsolutePosition; | 2177 | //If it is 1, it is to accept ONLY collisions from this object |
2035 | detobj.rotQuat = obj.GetWorldRotation(); | 2178 | if(data != "") |
2036 | detobj.velVector = obj.Velocity; | 2179 | { |
2037 | detobj.colliderType = 0; | 2180 | DetectedObject detobj = new DetectedObject(); |
2038 | detobj.groupUUID = obj._groupID; | 2181 | detobj.keyUUID = obj.UUID; |
2039 | colliding.Add(detobj); | 2182 | detobj.nameStr = obj.Name; |
2183 | detobj.ownerUUID = obj._ownerID; | ||
2184 | detobj.posVector = obj.AbsolutePosition; | ||
2185 | detobj.rotQuat = obj.GetWorldRotation(); | ||
2186 | detobj.velVector = obj.Velocity; | ||
2187 | detobj.colliderType = 0; | ||
2188 | detobj.groupUUID = obj._groupID; | ||
2189 | colliding.Add(detobj); | ||
2190 | } | ||
2191 | //If it is 0, it is to not accept collisions from this object | ||
2192 | else | ||
2193 | { | ||
2194 | } | ||
2195 | } | ||
2196 | else | ||
2197 | { | ||
2198 | string data = ""; | ||
2199 | m_parentGroup.RootPart.CollisionFilter.TryGetValue(1,out data); | ||
2200 | //If it is 1, it is to accept ONLY collisions from this object, so this other object will not work | ||
2201 | if(data == "") | ||
2202 | { | ||
2203 | DetectedObject detobj = new DetectedObject(); | ||
2204 | detobj.keyUUID = obj.UUID; | ||
2205 | detobj.nameStr = obj.Name; | ||
2206 | detobj.ownerUUID = obj._ownerID; | ||
2207 | detobj.posVector = obj.AbsolutePosition; | ||
2208 | detobj.rotQuat = obj.GetWorldRotation(); | ||
2209 | detobj.velVector = obj.Velocity; | ||
2210 | detobj.colliderType = 0; | ||
2211 | detobj.groupUUID = obj._groupID; | ||
2212 | colliding.Add(detobj); | ||
2213 | } | ||
2214 | } | ||
2040 | } | 2215 | } |
2041 | else | 2216 | else |
2042 | { | 2217 | { |
@@ -2048,19 +2223,52 @@ namespace OpenSim.Region.Framework.Scenes | |||
2048 | 2223 | ||
2049 | if (av.LocalId == localId) | 2224 | if (av.LocalId == localId) |
2050 | { | 2225 | { |
2051 | DetectedObject detobj = new DetectedObject(); | 2226 | if(m_parentGroup.RootPart.CollisionFilter.ContainsValue(obj.UUID.ToString()) || m_parentGroup.RootPart.CollisionFilter.ContainsValue(obj.Name)) |
2052 | detobj.keyUUID = av.UUID; | 2227 | { |
2053 | detobj.nameStr = av.Name; | 2228 | string data = ""; |
2054 | detobj.ownerUUID = av.UUID; | 2229 | m_parentGroup.RootPart.CollisionFilter.TryGetValue(1,out data); |
2055 | detobj.posVector = av.AbsolutePosition; | 2230 | //If it is 1, it is to accept ONLY collisions from this avatar |
2056 | detobj.rotQuat = av.Rotation; | 2231 | if(data != "") |
2057 | detobj.velVector = av.Velocity; | 2232 | { |
2058 | detobj.colliderType = 0; | 2233 | DetectedObject detobj = new DetectedObject(); |
2059 | detobj.groupUUID = av.ControllingClient.ActiveGroupId; | 2234 | detobj.keyUUID = av.UUID; |
2060 | colliding.Add(detobj); | 2235 | detobj.nameStr = av.ControllingClient.Name; |
2236 | detobj.ownerUUID = av.UUID; | ||
2237 | detobj.posVector = av.AbsolutePosition; | ||
2238 | detobj.rotQuat = av.Rotation; | ||
2239 | detobj.velVector = av.Velocity; | ||
2240 | detobj.colliderType = 0; | ||
2241 | detobj.groupUUID = av.ControllingClient.ActiveGroupId; | ||
2242 | colliding.Add(detobj); | ||
2243 | } | ||
2244 | //If it is 0, it is to not accept collisions from this avatar | ||
2245 | else | ||
2246 | { | ||
2247 | } | ||
2248 | } | ||
2249 | else | ||
2250 | { | ||
2251 | string data = ""; | ||
2252 | m_parentGroup.RootPart.CollisionFilter.TryGetValue(1,out data); | ||
2253 | //If it is 1, it is to accept ONLY collisions from this avatar, so this other avatar will not work | ||
2254 | if(data == "") | ||
2255 | { | ||
2256 | DetectedObject detobj = new DetectedObject(); | ||
2257 | detobj.keyUUID = av.UUID; | ||
2258 | detobj.nameStr = av.ControllingClient.Name; | ||
2259 | detobj.ownerUUID = av.UUID; | ||
2260 | detobj.posVector = av.AbsolutePosition; | ||
2261 | detobj.rotQuat = av.Rotation; | ||
2262 | detobj.velVector = av.Velocity; | ||
2263 | detobj.colliderType = 0; | ||
2264 | detobj.groupUUID = av.ControllingClient.ActiveGroupId; | ||
2265 | colliding.Add(detobj); | ||
2266 | } | ||
2267 | } | ||
2061 | } | 2268 | } |
2062 | } | 2269 | } |
2063 | } | 2270 | } |
2271 | #endregion | ||
2064 | } | 2272 | } |
2065 | 2273 | ||
2066 | if (colliding.Count > 0) | 2274 | if (colliding.Count > 0) |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 3a229c2..f0d73d3 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | |||
@@ -2812,7 +2812,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
2812 | public void llCollisionFilter(string name, string id, int accept) | 2812 | public void llCollisionFilter(string name, string id, int accept) |
2813 | { | 2813 | { |
2814 | m_host.AddScriptLPS(1); | 2814 | m_host.AddScriptLPS(1); |
2815 | NotImplemented("llCollisionFilter"); | 2815 | m_host.CollisionFilter.Clear(); |
2816 | if(id != null) | ||
2817 | { | ||
2818 | m_host.CollisionFilter.Add(accept,id); | ||
2819 | } | ||
2820 | else | ||
2821 | { | ||
2822 | m_host.CollisionFilter.Add(accept,name); | ||
2823 | } | ||
2816 | } | 2824 | } |
2817 | 2825 | ||
2818 | public void llTakeControls(int controls, int accept, int pass_on) | 2826 | public void llTakeControls(int controls, int accept, int pass_on) |
@@ -8323,11 +8331,43 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
8323 | 8331 | ||
8324 | return -1; | 8332 | return -1; |
8325 | } | 8333 | } |
8326 | 8334 | ||
8327 | public void llSetInventoryPermMask(string item, int mask, int value) | 8335 | public void llSetInventoryPermMask(string item, int mask, int value) |
8328 | { | 8336 | { |
8329 | m_host.AddScriptLPS(1); | 8337 | m_host.AddScriptLPS(1); |
8330 | NotImplemented("llSetInventoryPermMask"); | 8338 | if (m_ScriptEngine.Config.GetBoolean("AllowGodFunctions", false)) |
8339 | { | ||
8340 | if (World.Permissions.CanRunConsoleCommand(m_host.OwnerID)) | ||
8341 | { | ||
8342 | lock (m_host.TaskInventory) | ||
8343 | { | ||
8344 | foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) | ||
8345 | { | ||
8346 | if (inv.Value.Name == item) | ||
8347 | { | ||
8348 | switch (mask) | ||
8349 | { | ||
8350 | case 0: | ||
8351 | inv.Value.BasePermissions = (uint)value; | ||
8352 | break; | ||
8353 | case 1: | ||
8354 | inv.Value.CurrentPermissions = (uint)value; | ||
8355 | break; | ||
8356 | case 2: | ||
8357 | inv.Value.GroupPermissions = (uint)value; | ||
8358 | break; | ||
8359 | case 3: | ||
8360 | inv.Value.EveryonePermissions = (uint)value; | ||
8361 | break; | ||
8362 | case 4: | ||
8363 | inv.Value.NextPermissions = (uint)value; | ||
8364 | break; | ||
8365 | } | ||
8366 | } | ||
8367 | } | ||
8368 | } | ||
8369 | } | ||
8370 | } | ||
8331 | } | 8371 | } |
8332 | 8372 | ||
8333 | public LSL_String llGetInventoryCreator(string item) | 8373 | public LSL_String llGetInventoryCreator(string item) |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs index bd09534..b6fc0a4 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs | |||
@@ -1987,5 +1987,82 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1987 | 1987 | ||
1988 | return (int)pws; | 1988 | return (int)pws; |
1989 | } | 1989 | } |
1990 | public void osSetSpeed(string UUID, float SpeedModifier) | ||
1991 | { | ||
1992 | CheckThreatLevel(ThreatLevel.Moderate, "osSetSpeed"); | ||
1993 | m_host.AddScriptLPS(1); | ||
1994 | ScenePresence avatar = World.GetScenePresence(new UUID(UUID)); | ||
1995 | avatar.SpeedModifier = SpeedModifier; | ||
1996 | } | ||
1997 | public void osKickAvatar(string FirstName,string SurName,string alert) | ||
1998 | { | ||
1999 | CheckThreatLevel(ThreatLevel.Severe, "osKickAvatar"); | ||
2000 | if (World.Permissions.CanRunConsoleCommand(m_host.OwnerID)) | ||
2001 | { | ||
2002 | foreach (ScenePresence presence in World.GetAvatars()) | ||
2003 | { | ||
2004 | if ((presence.Firstname == FirstName) && | ||
2005 | presence.Lastname == SurName) | ||
2006 | { | ||
2007 | // kick client... | ||
2008 | if (alert != null) | ||
2009 | presence.ControllingClient.Kick(alert); | ||
2010 | |||
2011 | // ...and close on our side | ||
2012 | presence.Scene.IncomingCloseAgent(presence.UUID); | ||
2013 | } | ||
2014 | } | ||
2015 | } | ||
2016 | } | ||
2017 | public void osCauseDamage(string avatar, double damage) | ||
2018 | { | ||
2019 | CheckThreatLevel(ThreatLevel.High, "osCauseDamage"); | ||
2020 | m_host.AddScriptLPS(1); | ||
2021 | |||
2022 | UUID avatarId = new UUID(avatar); | ||
2023 | Vector3 pos = m_host.GetWorldPosition(); | ||
2024 | |||
2025 | ScenePresence presence = World.GetScenePresence(avatarId); | ||
2026 | if (presence != null) | ||
2027 | { | ||
2028 | LandData land = World.GetLandData((float)pos.X, (float)pos.Y); | ||
2029 | if ((land.Flags & (uint)ParcelFlags.AllowDamage) == (uint)ParcelFlags.AllowDamage) | ||
2030 | { | ||
2031 | float health = presence.Health; | ||
2032 | health -= (float)damage; | ||
2033 | presence.setHealthWithUpdate(health); | ||
2034 | if (health <= 0) | ||
2035 | { | ||
2036 | float healthliveagain = 100; | ||
2037 | presence.ControllingClient.SendAgentAlertMessage("You died!", true); | ||
2038 | presence.setHealthWithUpdate(healthliveagain); | ||
2039 | presence.Scene.TeleportClientHome(presence.UUID, presence.ControllingClient); | ||
2040 | } | ||
2041 | } | ||
2042 | } | ||
2043 | } | ||
2044 | public void osCauseHealing(string avatar, double healing) | ||
2045 | { | ||
2046 | CheckThreatLevel(ThreatLevel.High, "osCauseHealing"); | ||
2047 | m_host.AddScriptLPS(1); | ||
2048 | |||
2049 | UUID avatarId = new UUID(avatar); | ||
2050 | ScenePresence presence = World.GetScenePresence(avatarId); | ||
2051 | Vector3 pos = m_host.GetWorldPosition(); | ||
2052 | bool result = World.ScriptDanger(m_host.LocalId, new Vector3((float)pos.X, (float)pos.Y, (float)pos.Z)); | ||
2053 | if (result) | ||
2054 | { | ||
2055 | if (presence != null) | ||
2056 | { | ||
2057 | float health = presence.Health; | ||
2058 | health += (float)healing; | ||
2059 | if (health >= 100) | ||
2060 | { | ||
2061 | health = 100; | ||
2062 | } | ||
2063 | presence.setHealthWithUpdate(health); | ||
2064 | } | ||
2065 | } | ||
2066 | } | ||
1990 | } | 2067 | } |
1991 | } | 2068 | } |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs index d943b59..5e20f7d 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs | |||
@@ -165,5 +165,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces | |||
165 | LSL_List osGetRegionStats(); | 165 | LSL_List osGetRegionStats(); |
166 | 166 | ||
167 | int osGetSimulatorMemory(); | 167 | int osGetSimulatorMemory(); |
168 | void osKickAvatar(string FirstName,string SurName,string alert); | ||
169 | void osSetSpeed(string UUID, float SpeedModifier); | ||
170 | void osCauseHealing(string avatar, double healing); | ||
171 | void osCauseDamage(string avatar, double damage); | ||
168 | } | 172 | } |
169 | } | 173 | } |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs index 2876ad6..2ec6226 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs | |||
@@ -647,5 +647,21 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase | |||
647 | { | 647 | { |
648 | return m_OSSL_Functions.osGetSimulatorMemory(); | 648 | return m_OSSL_Functions.osGetSimulatorMemory(); |
649 | } | 649 | } |
650 | public void osKickAvatar(string FirstName,string SurName,string alert) | ||
651 | { | ||
652 | m_OSSL_Functions.osKickAvatar( FirstName, SurName, alert); | ||
653 | } | ||
654 | public void osSetSpeed(string UUID, float SpeedModifier) | ||
655 | { | ||
656 | m_OSSL_Functions.osSetSpeed(UUID, SpeedModifier); | ||
657 | } | ||
658 | public void osCauseDamage(string avatar, double damage) | ||
659 | { | ||
660 | m_OSSL_Functions.osCauseDamage(avatar, damage); | ||
661 | } | ||
662 | public void osCauseHealing(string avatar, double healing) | ||
663 | { | ||
664 | m_OSSL_Functions.osCauseHealing(avatar, healing); | ||
665 | } | ||
650 | } | 666 | } |
651 | } | 667 | } |