aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorMelanie2009-12-31 04:48:59 +0000
committerMelanie2009-12-31 04:48:59 +0000
commiteab2b4c6a96cd5b2a0f079f27a9c2ac15273d3f0 (patch)
treebbc37e3ea0845dcd599ff9f62d53e9d9ed42746c
parentAdds osKickUser and osSetSpeed (diff)
downloadopensim-SC-eab2b4c6a96cd5b2a0f079f27a9c2ac15273d3f0.zip
opensim-SC-eab2b4c6a96cd5b2a0f079f27a9c2ac15273d3f0.tar.gz
opensim-SC-eab2b4c6a96cd5b2a0f079f27a9c2ac15273d3f0.tar.bz2
opensim-SC-eab2b4c6a96cd5b2a0f079f27a9c2ac15273d3f0.tar.xz
[PATCH] Adds llCollisionFilter
Thank you, Revolution. Applied with minor changes.
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneObjectPart.cs334
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs48
2 files changed, 315 insertions, 67 deletions
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index c0243a5..8ac4c37 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};
@@ -451,6 +454,15 @@ namespace OpenSim.Region.Framework.Scenes
451 ParentGroup.HasGroupChanged = true; 454 ParentGroup.HasGroupChanged = true;
452 } 455 }
453 } 456 }
457
458 public Dictionary<int, string> CollisionFilter
459 {
460 get { return m_CollisionFilter; }
461 set
462 {
463 m_CollisionFilter = value;
464 }
465 }
454 466
455 public ulong RegionHandle 467 public ulong RegionHandle
456 { 468 {
@@ -1874,20 +1886,52 @@ namespace OpenSim.Region.Framework.Scenes
1874 1886
1875 if (m_parentGroup.Scene == null) 1887 if (m_parentGroup.Scene == null)
1876 return; 1888 return;
1877 1889 #region collision Filter
1878 SceneObjectPart obj = m_parentGroup.Scene.GetSceneObjectPart(localId); 1890 SceneObjectPart obj = m_parentGroup.Scene.GetSceneObjectPart(localId);
1879 if (obj != null) 1891 if (obj != null)
1880 { 1892 {
1881 DetectedObject detobj = new DetectedObject(); 1893 if(m_parentGroup.RootPart.CollisionFilter.ContainsValue(obj.UUID.ToString()) || m_parentGroup.RootPart.CollisionFilter.ContainsValue(obj.Name))
1882 detobj.keyUUID = obj.UUID; 1894 {
1883 detobj.nameStr = obj.Name; 1895 string data = "";
1884 detobj.ownerUUID = obj._ownerID; 1896 m_parentGroup.RootPart.CollisionFilter.TryGetValue(1,out data);
1885 detobj.posVector = obj.AbsolutePosition; 1897 //If it is 1, it is to accept ONLY collisions from this object
1886 detobj.rotQuat = obj.GetWorldRotation(); 1898 if(data != "")
1887 detobj.velVector = obj.Velocity; 1899 {
1888 detobj.colliderType = 0; 1900 DetectedObject detobj = new DetectedObject();
1889 detobj.groupUUID = obj._groupID; 1901 detobj.keyUUID = obj.UUID;
1890 colliding.Add(detobj); 1902 detobj.nameStr = obj.Name;
1903 detobj.ownerUUID = obj._ownerID;
1904 detobj.posVector = obj.AbsolutePosition;
1905 detobj.rotQuat = obj.GetWorldRotation();
1906 detobj.velVector = obj.Velocity;
1907 detobj.colliderType = 0;
1908 detobj.groupUUID = obj._groupID;
1909 colliding.Add(detobj);
1910 }
1911 //If it is 0, it is to not accept collisions from this object
1912 else
1913 {
1914 }
1915 }
1916 else
1917 {
1918 string data = "";
1919 m_parentGroup.RootPart.CollisionFilter.TryGetValue(1,out data);
1920 //If it is 1, it is to accept ONLY collisions from this object, so this other object will not work
1921 if(data == "")
1922 {
1923 DetectedObject detobj = new DetectedObject();
1924 detobj.keyUUID = obj.UUID;
1925 detobj.nameStr = obj.Name;
1926 detobj.ownerUUID = obj._ownerID;
1927 detobj.posVector = obj.AbsolutePosition;
1928 detobj.rotQuat = obj.GetWorldRotation();
1929 detobj.velVector = obj.Velocity;
1930 detobj.colliderType = 0;
1931 detobj.groupUUID = obj._groupID;
1932 colliding.Add(detobj);
1933 }
1934 }
1891 } 1935 }
1892 else 1936 else
1893 { 1937 {
@@ -1899,19 +1943,52 @@ namespace OpenSim.Region.Framework.Scenes
1899 1943
1900 if (av.LocalId == localId) 1944 if (av.LocalId == localId)
1901 { 1945 {
1902 DetectedObject detobj = new DetectedObject(); 1946 if(m_parentGroup.RootPart.CollisionFilter.ContainsValue(obj.UUID.ToString()) || m_parentGroup.RootPart.CollisionFilter.ContainsValue(obj.Name))
1903 detobj.keyUUID = av.UUID; 1947 {
1904 detobj.nameStr = av.ControllingClient.Name; 1948 string data = "";
1905 detobj.ownerUUID = av.UUID; 1949 m_parentGroup.RootPart.CollisionFilter.TryGetValue(1,out data);
1906 detobj.posVector = av.AbsolutePosition; 1950 //If it is 1, it is to accept ONLY collisions from this avatar
1907 detobj.rotQuat = av.Rotation; 1951 if(data != "")
1908 detobj.velVector = av.Velocity; 1952 {
1909 detobj.colliderType = 0; 1953 DetectedObject detobj = new DetectedObject();
1910 detobj.groupUUID = av.ControllingClient.ActiveGroupId; 1954 detobj.keyUUID = av.UUID;
1911 colliding.Add(detobj); 1955 detobj.nameStr = av.ControllingClient.Name;
1956 detobj.ownerUUID = av.UUID;
1957 detobj.posVector = av.AbsolutePosition;
1958 detobj.rotQuat = av.Rotation;
1959 detobj.velVector = av.Velocity;
1960 detobj.colliderType = 0;
1961 detobj.groupUUID = av.ControllingClient.ActiveGroupId;
1962 colliding.Add(detobj);
1963 }
1964 //If it is 0, it is to not accept collisions from this avatar
1965 else
1966 {
1967 }
1968 }
1969 else
1970 {
1971 string data = "";
1972 m_parentGroup.RootPart.CollisionFilter.TryGetValue(1,out data);
1973 //If it is 1, it is to accept ONLY collisions from this avatar, so this other avatar will not work
1974 if(data == "")
1975 {
1976 DetectedObject detobj = new DetectedObject();
1977 detobj.keyUUID = av.UUID;
1978 detobj.nameStr = av.ControllingClient.Name;
1979 detobj.ownerUUID = av.UUID;
1980 detobj.posVector = av.AbsolutePosition;
1981 detobj.rotQuat = av.Rotation;
1982 detobj.velVector = av.Velocity;
1983 detobj.colliderType = 0;
1984 detobj.groupUUID = av.ControllingClient.ActiveGroupId;
1985 colliding.Add(detobj);
1986 }
1987 }
1912 } 1988 }
1913 } 1989 }
1914 } 1990 }
1991 #endregion
1915 } 1992 }
1916 if (colliding.Count > 0) 1993 if (colliding.Count > 0)
1917 { 1994 {
@@ -1945,41 +2022,105 @@ namespace OpenSim.Region.Framework.Scenes
1945 2022
1946 if (m_parentGroup.Scene == null) 2023 if (m_parentGroup.Scene == null)
1947 return; 2024 return;
1948 2025 #region collision Filter
1949 SceneObjectPart obj = m_parentGroup.Scene.GetSceneObjectPart(localId); 2026 SceneObjectPart obj = m_parentGroup.Scene.GetSceneObjectPart(localId);
1950 if (obj != null) 2027 if (obj != null)
1951 { 2028 {
1952 DetectedObject detobj = new DetectedObject(); 2029 if(m_parentGroup.RootPart.CollisionFilter.ContainsValue(obj.UUID.ToString()) || m_parentGroup.RootPart.CollisionFilter.ContainsValue(obj.Name))
1953 detobj.keyUUID = obj.UUID; 2030 {
1954 detobj.nameStr = obj.Name; 2031 string data = "";
1955 detobj.ownerUUID = obj._ownerID; 2032 m_parentGroup.RootPart.CollisionFilter.TryGetValue(1,out data);
1956 detobj.posVector = obj.AbsolutePosition; 2033 //If it is 1, it is to accept ONLY collisions from this object
1957 detobj.rotQuat = obj.GetWorldRotation(); 2034 if(data != "")
1958 detobj.velVector = obj.Velocity; 2035 {
1959 detobj.colliderType = 0; 2036 DetectedObject detobj = new DetectedObject();
1960 detobj.groupUUID = obj._groupID; 2037 detobj.keyUUID = obj.UUID;
1961 colliding.Add(detobj); 2038 detobj.nameStr = obj.Name;
2039 detobj.ownerUUID = obj._ownerID;
2040 detobj.posVector = obj.AbsolutePosition;
2041 detobj.rotQuat = obj.GetWorldRotation();
2042 detobj.velVector = obj.Velocity;
2043 detobj.colliderType = 0;
2044 detobj.groupUUID = obj._groupID;
2045 colliding.Add(detobj);
2046 }
2047 //If it is 0, it is to not accept collisions from this object
2048 else
2049 {
2050 }
2051 }
2052 else
2053 {
2054 string data = "";
2055 m_parentGroup.RootPart.CollisionFilter.TryGetValue(1,out data);
2056 //If it is 1, it is to accept ONLY collisions from this object, so this other object will not work
2057 if(data == "")
2058 {
2059 DetectedObject detobj = new DetectedObject();
2060 detobj.keyUUID = obj.UUID;
2061 detobj.nameStr = obj.Name;
2062 detobj.ownerUUID = obj._ownerID;
2063 detobj.posVector = obj.AbsolutePosition;
2064 detobj.rotQuat = obj.GetWorldRotation();
2065 detobj.velVector = obj.Velocity;
2066 detobj.colliderType = 0;
2067 detobj.groupUUID = obj._groupID;
2068 colliding.Add(detobj);
2069 }
2070 }
1962 } 2071 }
1963 else 2072 else
1964 { 2073 {
1965 ScenePresence[] avlist = m_parentGroup.Scene.GetScenePresences(); 2074 ScenePresence[] avlist = m_parentGroup.Scene.GetScenePresences();
1966 2075
1967 for (int i = 0; i < avlist.Length; i++) 2076 for (int i = 0; i < avlist.Length; i++)
1968 { 2077 {
1969 ScenePresence av = avlist[i]; 2078 ScenePresence av = avlist[i];
1970 2079
1971 if (av.LocalId == localId) 2080 if (av.LocalId == localId)
1972 { 2081 {
1973 DetectedObject detobj = new DetectedObject(); 2082 if(m_parentGroup.RootPart.CollisionFilter.ContainsValue(obj.UUID.ToString()) || m_parentGroup.RootPart.CollisionFilter.ContainsValue(obj.Name))
1974 detobj.keyUUID = av.UUID; 2083 {
1975 detobj.nameStr = av.Name; 2084 string data = "";
1976 detobj.ownerUUID = av.UUID; 2085 m_parentGroup.RootPart.CollisionFilter.TryGetValue(1,out data);
1977 detobj.posVector = av.AbsolutePosition; 2086 //If it is 1, it is to accept ONLY collisions from this avatar
1978 detobj.rotQuat = av.Rotation; 2087 if(data != "")
1979 detobj.velVector = av.Velocity; 2088 {
1980 detobj.colliderType = 0; 2089 DetectedObject detobj = new DetectedObject();
1981 detobj.groupUUID = av.ControllingClient.ActiveGroupId; 2090 detobj.keyUUID = av.UUID;
1982 colliding.Add(detobj); 2091 detobj.nameStr = av.ControllingClient.Name;
2092 detobj.ownerUUID = av.UUID;
2093 detobj.posVector = av.AbsolutePosition;
2094 detobj.rotQuat = av.Rotation;
2095 detobj.velVector = av.Velocity;
2096 detobj.colliderType = 0;
2097 detobj.groupUUID = av.ControllingClient.ActiveGroupId;
2098 colliding.Add(detobj);
2099 }
2100 //If it is 0, it is to not accept collisions from this avatar
2101 else
2102 {
2103 }
2104 }
2105 else
2106 {
2107 string data = "";
2108 m_parentGroup.RootPart.CollisionFilter.TryGetValue(1,out data);
2109 //If it is 1, it is to accept ONLY collisions from this avatar, so this other avatar will not work
2110 if(data == "")
2111 {
2112 DetectedObject detobj = new DetectedObject();
2113 detobj.keyUUID = av.UUID;
2114 detobj.nameStr = av.ControllingClient.Name;
2115 detobj.ownerUUID = av.UUID;
2116 detobj.posVector = av.AbsolutePosition;
2117 detobj.rotQuat = av.Rotation;
2118 detobj.velVector = av.Velocity;
2119 detobj.colliderType = 0;
2120 detobj.groupUUID = av.ControllingClient.ActiveGroupId;
2121 colliding.Add(detobj);
2122 }
2123 }
1983 } 2124 }
1984 } 2125 }
1985 } 2126 }
@@ -1997,6 +2138,7 @@ namespace OpenSim.Region.Framework.Scenes
1997 m_parentGroup.Scene.EventManager.TriggerScriptColliding(LocalId, CollidingMessage); 2138 m_parentGroup.Scene.EventManager.TriggerScriptColliding(LocalId, CollidingMessage);
1998 } 2139 }
1999 } 2140 }
2141 #endregion
2000 } 2142 }
2001 2143
2002 if ((m_parentGroup.RootPart.ScriptEvents & scriptEvents.collision_end) != 0) 2144 if ((m_parentGroup.RootPart.ScriptEvents & scriptEvents.collision_end) != 0)
@@ -2015,19 +2157,52 @@ namespace OpenSim.Region.Framework.Scenes
2015 return; 2157 return;
2016 if (m_parentGroup.Scene == null) 2158 if (m_parentGroup.Scene == null)
2017 return; 2159 return;
2160 #region collision Filter
2018 SceneObjectPart obj = m_parentGroup.Scene.GetSceneObjectPart(localId); 2161 SceneObjectPart obj = m_parentGroup.Scene.GetSceneObjectPart(localId);
2019 if (obj != null) 2162 if (obj != null)
2020 { 2163 {
2021 DetectedObject detobj = new DetectedObject(); 2164 if(m_parentGroup.RootPart.CollisionFilter.ContainsValue(obj.UUID.ToString()) || m_parentGroup.RootPart.CollisionFilter.ContainsValue(obj.Name))
2022 detobj.keyUUID = obj.UUID; 2165 {
2023 detobj.nameStr = obj.Name; 2166 string data = "";
2024 detobj.ownerUUID = obj._ownerID; 2167 m_parentGroup.RootPart.CollisionFilter.TryGetValue(1,out data);
2025 detobj.posVector = obj.AbsolutePosition; 2168 //If it is 1, it is to accept ONLY collisions from this object
2026 detobj.rotQuat = obj.GetWorldRotation(); 2169 if(data != "")
2027 detobj.velVector = obj.Velocity; 2170 {
2028 detobj.colliderType = 0; 2171 DetectedObject detobj = new DetectedObject();
2029 detobj.groupUUID = obj._groupID; 2172 detobj.keyUUID = obj.UUID;
2030 colliding.Add(detobj); 2173 detobj.nameStr = obj.Name;
2174 detobj.ownerUUID = obj._ownerID;
2175 detobj.posVector = obj.AbsolutePosition;
2176 detobj.rotQuat = obj.GetWorldRotation();
2177 detobj.velVector = obj.Velocity;
2178 detobj.colliderType = 0;
2179 detobj.groupUUID = obj._groupID;
2180 colliding.Add(detobj);
2181 }
2182 //If it is 0, it is to not accept collisions from this object
2183 else
2184 {
2185 }
2186 }
2187 else
2188 {
2189 string data = "";
2190 m_parentGroup.RootPart.CollisionFilter.TryGetValue(1,out data);
2191 //If it is 1, it is to accept ONLY collisions from this object, so this other object will not work
2192 if(data == "")
2193 {
2194 DetectedObject detobj = new DetectedObject();
2195 detobj.keyUUID = obj.UUID;
2196 detobj.nameStr = obj.Name;
2197 detobj.ownerUUID = obj._ownerID;
2198 detobj.posVector = obj.AbsolutePosition;
2199 detobj.rotQuat = obj.GetWorldRotation();
2200 detobj.velVector = obj.Velocity;
2201 detobj.colliderType = 0;
2202 detobj.groupUUID = obj._groupID;
2203 colliding.Add(detobj);
2204 }
2205 }
2031 } 2206 }
2032 else 2207 else
2033 { 2208 {
@@ -2039,19 +2214,52 @@ namespace OpenSim.Region.Framework.Scenes
2039 2214
2040 if (av.LocalId == localId) 2215 if (av.LocalId == localId)
2041 { 2216 {
2042 DetectedObject detobj = new DetectedObject(); 2217 if(m_parentGroup.RootPart.CollisionFilter.ContainsValue(obj.UUID.ToString()) || m_parentGroup.RootPart.CollisionFilter.ContainsValue(obj.Name))
2043 detobj.keyUUID = av.UUID; 2218 {
2044 detobj.nameStr = av.Name; 2219 string data = "";
2045 detobj.ownerUUID = av.UUID; 2220 m_parentGroup.RootPart.CollisionFilter.TryGetValue(1,out data);
2046 detobj.posVector = av.AbsolutePosition; 2221 //If it is 1, it is to accept ONLY collisions from this avatar
2047 detobj.rotQuat = av.Rotation; 2222 if(data != "")
2048 detobj.velVector = av.Velocity; 2223 {
2049 detobj.colliderType = 0; 2224 DetectedObject detobj = new DetectedObject();
2050 detobj.groupUUID = av.ControllingClient.ActiveGroupId; 2225 detobj.keyUUID = av.UUID;
2051 colliding.Add(detobj); 2226 detobj.nameStr = av.ControllingClient.Name;
2227 detobj.ownerUUID = av.UUID;
2228 detobj.posVector = av.AbsolutePosition;
2229 detobj.rotQuat = av.Rotation;
2230 detobj.velVector = av.Velocity;
2231 detobj.colliderType = 0;
2232 detobj.groupUUID = av.ControllingClient.ActiveGroupId;
2233 colliding.Add(detobj);
2234 }
2235 //If it is 0, it is to not accept collisions from this avatar
2236 else
2237 {
2238 }
2239 }
2240 else
2241 {
2242 string data = "";
2243 m_parentGroup.RootPart.CollisionFilter.TryGetValue(1,out data);
2244 //If it is 1, it is to accept ONLY collisions from this avatar, so this other avatar will not work
2245 if(data == "")
2246 {
2247 DetectedObject detobj = new DetectedObject();
2248 detobj.keyUUID = av.UUID;
2249 detobj.nameStr = av.ControllingClient.Name;
2250 detobj.ownerUUID = av.UUID;
2251 detobj.posVector = av.AbsolutePosition;
2252 detobj.rotQuat = av.Rotation;
2253 detobj.velVector = av.Velocity;
2254 detobj.colliderType = 0;
2255 detobj.groupUUID = av.ControllingClient.ActiveGroupId;
2256 colliding.Add(detobj);
2257 }
2258 }
2052 } 2259 }
2053 } 2260 }
2054 } 2261 }
2262 #endregion
2055 } 2263 }
2056 2264
2057 if (colliding.Count > 0) 2265 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 6102504..43df4ab 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -2752,7 +2752,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2752 public void llCollisionFilter(string name, string id, int accept) 2752 public void llCollisionFilter(string name, string id, int accept)
2753 { 2753 {
2754 m_host.AddScriptLPS(1); 2754 m_host.AddScriptLPS(1);
2755 NotImplemented("llCollisionFilter"); 2755 m_host.CollisionFilter.Clear();
2756 if(id != null)
2757 {
2758 m_host.CollisionFilter.Add(accept,id);
2759 }
2760 else
2761 {
2762 m_host.CollisionFilter.Add(accept,name);
2763 }
2756 } 2764 }
2757 2765
2758 public void llTakeControls(int controls, int accept, int pass_on) 2766 public void llTakeControls(int controls, int accept, int pass_on)
@@ -8204,11 +8212,43 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8204 8212
8205 return -1; 8213 return -1;
8206 } 8214 }
8207 8215
8208 public void llSetInventoryPermMask(string item, int mask, int value) 8216 public void llSetInventoryPermMask(string item, int mask, int value)
8209 { 8217 {
8210 m_host.AddScriptLPS(1); 8218 m_host.AddScriptLPS(1);
8211 NotImplemented("llSetInventoryPermMask"); 8219 if (m_ScriptEngine.Config.GetBoolean("AllowGodFunctions", false))
8220 {
8221 if (World.Permissions.CanRunConsoleCommand(m_host.OwnerID))
8222 {
8223 lock (m_host.TaskInventory)
8224 {
8225 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
8226 {
8227 if (inv.Value.Name == item)
8228 {
8229 switch (mask)
8230 {
8231 case 0:
8232 inv.Value.BasePermissions = (uint)value;
8233 break;
8234 case 1:
8235 inv.Value.CurrentPermissions = (uint)value;
8236 break;
8237 case 2:
8238 inv.Value.GroupPermissions = (uint)value;
8239 break;
8240 case 3:
8241 inv.Value.EveryonePermissions = (uint)value;
8242 break;
8243 case 4:
8244 inv.Value.NextPermissions = (uint)value;
8245 break;
8246 }
8247 }
8248 }
8249 }
8250 }
8251 }
8212 } 8252 }
8213 8253
8214 public LSL_String llGetInventoryCreator(string item) 8254 public LSL_String llGetInventoryCreator(string item)