diff options
Diffstat (limited to 'OpenSim/Region/Framework/Scenes')
-rw-r--r-- | OpenSim/Region/Framework/Scenes/CollisionSounds.cs | 317 | ||||
-rw-r--r-- | OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 108 | ||||
-rw-r--r-- | OpenSim/Region/Framework/Scenes/ScenePresence.cs | 133 |
3 files changed, 384 insertions, 174 deletions
diff --git a/OpenSim/Region/Framework/Scenes/CollisionSounds.cs b/OpenSim/Region/Framework/Scenes/CollisionSounds.cs index b1b0f5b..81ca9f1 100644 --- a/OpenSim/Region/Framework/Scenes/CollisionSounds.cs +++ b/OpenSim/Region/Framework/Scenes/CollisionSounds.cs | |||
@@ -33,45 +33,115 @@ using OpenSim.Framework; | |||
33 | 33 | ||
34 | namespace OpenSim.Region.Framework.Scenes | 34 | namespace OpenSim.Region.Framework.Scenes |
35 | { | 35 | { |
36 | public static class CollisionSounds | 36 | public struct CollisionForSoundInfo |
37 | { | 37 | { |
38 | // defines for cases | 38 | public uint colliderID; |
39 | // only know one UUID for now (woodflesh) | 39 | public Vector3 position; |
40 | public float relativeVel; | ||
41 | } | ||
40 | 42 | ||
43 | public static class CollisionSounds | ||
44 | { | ||
41 | private const int MaxMaterials = 7; | 45 | private const int MaxMaterials = 7; |
42 | // part part | 46 | // part part |
43 | private static UUID snd_StoneStone = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a"); | 47 | /* |
44 | private static UUID snd_StoneMetal = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a"); | 48 | private static UUID snd_StoneStone = new UUID("be7295c0-a158-11e1-b3dd-0800200c9a66"); |
45 | private static UUID snd_StoneGlass = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a"); | 49 | private static UUID snd_StoneMetal = new UUID("be7295c0-a158-11e1-b3dd-0800201c9a66"); |
46 | private static UUID snd_StoneWood = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a"); | 50 | private static UUID snd_StoneGlass = new UUID("be7295c0-a158-11e1-b3dd-0800202c9a66"); |
47 | private static UUID snd_StoneFlesh = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a"); | 51 | private static UUID snd_StoneWood = new UUID("be7295c0-a158-11e1-b3dd-0800203c9a66"); |
48 | private static UUID snd_StonePlastic = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a"); | 52 | private static UUID snd_StoneFlesh = new UUID("be7295c0-a158-11e1-b3dd-0800204c9a66"); |
49 | private static UUID snd_StoneRubber = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a"); | 53 | private static UUID snd_StonePlastic = new UUID("be7295c0-a158-11e1-b3dd-0800205c9a66"); |
50 | 54 | private static UUID snd_StoneRubber = new UUID("be7295c0-a158-11e1-b3dd-0800206c9a66"); | |
51 | private static UUID snd_MetalMetal = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a"); | 55 | |
52 | private static UUID snd_MetalGlass = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a"); | 56 | private static UUID snd_MetalStone = new UUID("be7295c0-a158-11e1-b3dd-0801200c9a66"); |
53 | private static UUID snd_MetalWood = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a"); | 57 | private static UUID snd_MetalMetal = new UUID("be7295c0-a158-11e1-b3dd-0801201c9a66"); |
54 | private static UUID snd_MetalFlesh = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a"); | 58 | private static UUID snd_MetalGlass = new UUID("be7295c0-a158-11e1-b3dd-0801202c9a66"); |
55 | private static UUID snd_MetalPlastic = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a"); | 59 | private static UUID snd_MetalWood = new UUID("be7295c0-a158-11e1-b3dd-0801203c9a66"); |
56 | private static UUID snd_MetalRubber = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a"); | 60 | private static UUID snd_MetalFlesh = new UUID("be7295c0-a158-11e1-b3dd-0801204c9a66"); |
57 | 61 | private static UUID snd_MetalPlastic = new UUID("be7295c0-a158-11e1-b3dd-0801205c9a66"); | |
58 | private static UUID snd_GlassGlass = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a"); | 62 | private static UUID snd_MetalRubber = new UUID("be7295c0-a158-11e1-b3dd-0801206c9a66"); |
59 | private static UUID snd_GlassWood = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a"); | 63 | |
60 | private static UUID snd_GlassFlesh = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a"); | 64 | private static UUID snd_GlassStone = new UUID("be7295c0-a158-11e1-b3dd-0802200c9a66"); |
61 | private static UUID snd_GlassPlastic = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a"); | 65 | private static UUID snd_GlassMetal = new UUID("be7295c0-a158-11e1-b3dd-0802201c9a66"); |
62 | private static UUID snd_GlassRubber = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a"); | 66 | private static UUID snd_GlassGlass = new UUID("be7295c0-a158-11e1-b3dd-0802202c9a66"); |
63 | 67 | private static UUID snd_GlassWood = new UUID("be7295c0-a158-11e1-b3dd-0802203c9a66"); | |
64 | private static UUID snd_WoodWood = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a"); | 68 | private static UUID snd_GlassFlesh = new UUID("be7295c0-a158-11e1-b3dd-0802204c9a66"); |
65 | private static UUID snd_WoodFlesh = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a"); | 69 | private static UUID snd_GlassPlastic = new UUID("be7295c0-a158-11e1-b3dd-0802205c9a66"); |
66 | private static UUID snd_WoodPlastic = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a"); | 70 | private static UUID snd_GlassRubber = new UUID("be7295c0-a158-11e1-b3dd-0802206c9a66"); |
67 | private static UUID snd_WoodRubber = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a"); | 71 | |
68 | 72 | private static UUID snd_WoodStone = new UUID("be7295c0-a158-11e1-b3dd-0803200c9a66"); | |
69 | private static UUID snd_FleshFlesh = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a"); | 73 | private static UUID snd_WoodMetal = new UUID("be7295c0-a158-11e1-b3dd-0803201c9a66"); |
70 | private static UUID snd_FleshPlastic = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a"); | 74 | private static UUID snd_WoodGlass = new UUID("be7295c0-a158-11e1-b3dd-0803202c9a66"); |
71 | private static UUID snd_FleshRubber = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a"); | 75 | private static UUID snd_WoodWood = new UUID("be7295c0-a158-11e1-b3dd-0803203c9a66"); |
72 | 76 | private static UUID snd_WoodFlesh = new UUID("be7295c0-a158-11e1-b3dd-0803204c9a66"); | |
73 | private static UUID snd_PlasticPlastic = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a"); | 77 | private static UUID snd_WoodPlastic = new UUID("be7295c0-a158-11e1-b3dd-0803205c9a66"); |
74 | private static UUID snd_PlasticRubber = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a"); | 78 | private static UUID snd_WoodRubber = new UUID("be7295c0-a158-11e1-b3dd-0803206c9a66"); |
79 | |||
80 | private static UUID snd_FleshStone = new UUID("be7295c0-a158-11e1-b3dd-0804200c9a66"); | ||
81 | private static UUID snd_FleshMetal = new UUID("be7295c0-a158-11e1-b3dd-0804201c9a66"); | ||
82 | private static UUID snd_FleshGlass = new UUID("be7295c0-a158-11e1-b3dd-0804202c9a66"); | ||
83 | private static UUID snd_FleshWood = new UUID("be7295c0-a158-11e1-b3dd-0804203c9a66"); | ||
84 | private static UUID snd_FleshFlesh = new UUID("be7295c0-a158-11e1-b3dd-0804204c9a66"); | ||
85 | private static UUID snd_FleshPlastic = new UUID("be7295c0-a158-11e1-b3dd-0804205c9a66"); | ||
86 | private static UUID snd_FleshRubber = new UUID("be7295c0-a158-11e1-b3dd-0804206c9a66"); | ||
87 | |||
88 | private static UUID snd_PlasticStone = new UUID("be7295c0-a158-11e1-b3dd-0805200c9a66"); | ||
89 | private static UUID snd_PlasticMetal = new UUID("be7295c0-a158-11e1-b3dd-0805201c9a66"); | ||
90 | private static UUID snd_PlasticGlass = new UUID("be7295c0-a158-11e1-b3dd-0805202c9a66"); | ||
91 | private static UUID snd_PlasticWood = new UUID("be7295c0-a158-11e1-b3dd-0805203c9a66"); | ||
92 | private static UUID snd_PlasticFlesh = new UUID("be7295c0-a158-11e1-b3dd-0805204c9a66"); | ||
93 | private static UUID snd_PlasticPlastic = new UUID("be7295c0-a158-11e1-b3dd-0805205c9a66"); | ||
94 | private static UUID snd_PlasticRubber = new UUID("be7295c0-a158-11e1-b3dd-0805206c9a66"); | ||
95 | |||
96 | private static UUID snd_RubberStone = new UUID("be7295c0-a158-11e1-b3dd-0806200c9a66"); | ||
97 | private static UUID snd_RubberMetal = new UUID("be7295c0-a158-11e1-b3dd-0806201c9a66"); | ||
98 | private static UUID snd_RubberGlass = new UUID("be7295c0-a158-11e1-b3dd-0806202c9a66"); | ||
99 | private static UUID snd_RubberWood = new UUID("be7295c0-a158-11e1-b3dd-0806203c9a66"); | ||
100 | private static UUID snd_RubberFlesh = new UUID("be7295c0-a158-11e1-b3dd-0806204c9a66"); | ||
101 | private static UUID snd_RubberPlastic = new UUID("be7295c0-a158-11e1-b3dd-0806205c9a66"); | ||
102 | private static UUID snd_RubberRubber = new UUID("be7295c0-a158-11e1-b3dd-0806206c9a66"); | ||
103 | |||
104 | // terrain part | ||
105 | private static UUID snd_TerrainStone = new UUID("be7295c0-a158-11e1-b3dd-0807200c9a66"); | ||
106 | private static UUID snd_TerrainMetal = new UUID("be7295c0-a158-11e1-b3dd-0807200c9a66"); | ||
107 | private static UUID snd_TerrainGlass = new UUID("be7295c0-a158-11e1-b3dd-0807200c9a66"); | ||
108 | private static UUID snd_TerrainWood = new UUID("be7295c0-a158-11e1-b3dd-0807200c9a66"); | ||
109 | private static UUID snd_TerrainFlesh = new UUID("be7295c0-a158-11e1-b3dd-0807200c9a66"); | ||
110 | private static UUID snd_TerrainPlastic = new UUID("be7295c0-a158-11e1-b3dd-0807200c9a66"); | ||
111 | private static UUID snd_TerrainRubber = new UUID("be7295c0-a158-11e1-b3dd-0807200c9a66"); | ||
112 | */ | ||
113 | private static UUID snd_StoneStone = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a"); | ||
114 | private static UUID snd_StoneMetal = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a"); | ||
115 | private static UUID snd_StoneGlass = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a"); | ||
116 | private static UUID snd_StoneWood = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a"); | ||
117 | private static UUID snd_StoneFlesh = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a"); | ||
118 | private static UUID snd_StonePlastic = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a"); | ||
119 | private static UUID snd_StoneRubber = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a"); | ||
120 | |||
121 | private static UUID snd_MetalMetal = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a"); | ||
122 | private static UUID snd_MetalGlass = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a"); | ||
123 | private static UUID snd_MetalWood = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a"); | ||
124 | private static UUID snd_MetalFlesh = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a"); | ||
125 | private static UUID snd_MetalPlastic = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a"); | ||
126 | private static UUID snd_MetalRubber = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a"); | ||
127 | |||
128 | private static UUID snd_GlassGlass = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a"); | ||
129 | private static UUID snd_GlassWood = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a"); | ||
130 | private static UUID snd_GlassFlesh = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a"); | ||
131 | private static UUID snd_GlassPlastic = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a"); | ||
132 | private static UUID snd_GlassRubber = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a"); | ||
133 | |||
134 | private static UUID snd_WoodWood = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a"); | ||
135 | private static UUID snd_WoodFlesh = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a"); | ||
136 | private static UUID snd_WoodPlastic = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a"); | ||
137 | private static UUID snd_WoodRubber = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a"); | ||
138 | |||
139 | private static UUID snd_FleshFlesh = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a"); | ||
140 | private static UUID snd_FleshPlastic = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a"); | ||
141 | private static UUID snd_FleshRubber = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a"); | ||
142 | |||
143 | private static UUID snd_PlasticPlastic = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a"); | ||
144 | private static UUID snd_PlasticRubber = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a"); | ||
75 | 145 | ||
76 | private static UUID snd_RubberRubber = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a"); | 146 | private static UUID snd_RubberRubber = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a"); |
77 | 147 | ||
@@ -93,7 +163,19 @@ namespace OpenSim.Region.Framework.Scenes | |||
93 | snd_TerrainPlastic, | 163 | snd_TerrainPlastic, |
94 | snd_TerrainRubber | 164 | snd_TerrainRubber |
95 | }; | 165 | }; |
96 | 166 | /* | |
167 | //full assimetric sounds | ||
168 | public static UUID[] m_PartPart = { | ||
169 | snd_StoneStone, snd_StoneMetal, snd_StoneGlass, snd_StoneWood, snd_StoneFlesh, snd_StonePlastic, snd_StoneRubber, | ||
170 | snd_MetalStone, snd_MetalMetal, snd_MetalGlass, snd_MetalWood, snd_MetalFlesh, snd_MetalPlastic, snd_MetalRubber, | ||
171 | snd_GlassStone, snd_GlassMetal, snd_GlassGlass, snd_GlassWood, snd_GlassFlesh, snd_GlassPlastic, snd_GlassRubber, | ||
172 | snd_WoodStone, snd_WoodMetal, snd_WoodGlass, snd_WoodWood, snd_WoodFlesh, snd_WoodPlastic, snd_WoodRubber, | ||
173 | snd_FleshStone, snd_FleshMetal, snd_FleshGlass, snd_FleshWood, snd_FleshFlesh, snd_FleshPlastic, snd_FleshRubber, | ||
174 | snd_PlasticStone, snd_PlasticMetal, snd_PlasticGlass, snd_PlasticWood, snd_PlasticFlesh, snd_PlasticPlastic, snd_PlasticRubber, | ||
175 | snd_RubberStone, snd_RubberMetal, snd_RubberGlass, snd_RubberWood, snd_RubberFlesh, snd_RubberPlastic, snd_RubberRubber | ||
176 | }; | ||
177 | */ | ||
178 | // simetric sounds | ||
97 | public static UUID[] m_PartPart = { | 179 | public static UUID[] m_PartPart = { |
98 | snd_StoneStone, snd_StoneMetal, snd_StoneGlass, snd_StoneWood, snd_StoneFlesh, snd_StonePlastic, snd_StoneRubber, | 180 | snd_StoneStone, snd_StoneMetal, snd_StoneGlass, snd_StoneWood, snd_StoneFlesh, snd_StonePlastic, snd_StoneRubber, |
99 | snd_StoneMetal, snd_MetalMetal, snd_MetalGlass, snd_MetalWood, snd_MetalFlesh, snd_MetalPlastic, snd_MetalRubber, | 181 | snd_StoneMetal, snd_MetalMetal, snd_MetalGlass, snd_MetalWood, snd_MetalFlesh, snd_MetalPlastic, snd_MetalRubber, |
@@ -103,13 +185,10 @@ namespace OpenSim.Region.Framework.Scenes | |||
103 | snd_StonePlastic, snd_MetalPlastic, snd_GlassPlastic, snd_WoodPlastic, snd_FleshPlastic, snd_PlasticPlastic, snd_PlasticRubber, | 185 | snd_StonePlastic, snd_MetalPlastic, snd_GlassPlastic, snd_WoodPlastic, snd_FleshPlastic, snd_PlasticPlastic, snd_PlasticRubber, |
104 | snd_StoneRubber, snd_MetalRubber, snd_GlassRubber, snd_WoodRubber, snd_FleshRubber, snd_PlasticRubber, snd_RubberRubber | 186 | snd_StoneRubber, snd_MetalRubber, snd_GlassRubber, snd_WoodRubber, snd_FleshRubber, snd_PlasticRubber, snd_RubberRubber |
105 | }; | 187 | }; |
106 | 188 | ||
107 | public static void PartCollisionSound(SceneObjectPart part,List<uint> Colliders) | 189 | public static void PartCollisionSound(SceneObjectPart part, List<CollisionForSoundInfo> collidersinfolist) |
108 | { | 190 | { |
109 | // temporary mute sounds | 191 | if (collidersinfolist.Count == 0 || part == null) |
110 | return; | ||
111 | |||
112 | if(Colliders.Count == 0 || part == null) | ||
113 | return; | 192 | return; |
114 | 193 | ||
115 | if (part.VolumeDetectActive || (part.Flags & PrimFlags.Physics) == 0) | 194 | if (part.VolumeDetectActive || (part.Flags & PrimFlags.Physics) == 0) |
@@ -118,124 +197,161 @@ namespace OpenSim.Region.Framework.Scenes | |||
118 | if (part.ParentGroup == null) | 197 | if (part.ParentGroup == null) |
119 | return; | 198 | return; |
120 | 199 | ||
121 | if (part.CollisionSound == part.invalidCollisionSoundUUID) | 200 | if (part.CollisionSoundType < 0) |
122 | return; | 201 | return; |
123 | 202 | ||
124 | UUID soundID; | 203 | float volume = 0.0f; |
125 | int otherMaterial; | 204 | bool HaveSound = false; |
126 | 205 | ||
127 | Vector3 position = part.AbsolutePosition; | 206 | UUID soundID = part.CollisionSound; |
128 | 207 | ||
129 | if (part.CollisionSound != UUID.Zero) | 208 | if (part.CollisionSoundType > 0) |
130 | { | 209 | { |
131 | if (part.CollisionSoundVolume > 0.0f) | 210 | // soundID = part.CollisionSound; |
132 | part.SendCollisionSound(part.CollisionSound, part.CollisionSoundVolume, position); | 211 | volume = part.CollisionSoundVolume; |
133 | return; | 212 | if (volume == 0.0f) |
213 | return; | ||
214 | HaveSound = true; | ||
134 | } | 215 | } |
135 | 216 | ||
136 | int thisMaterial = (int) part.Material; | 217 | bool doneownsound = false; |
218 | |||
219 | int thisMaterial = (int)part.Material; | ||
137 | if (thisMaterial >= MaxMaterials) | 220 | if (thisMaterial >= MaxMaterials) |
138 | thisMaterial = 3; | 221 | thisMaterial = 3; |
139 | |||
140 | int thisMatScaled = thisMaterial * MaxMaterials; | 222 | int thisMatScaled = thisMaterial * MaxMaterials; |
141 | int index; | ||
142 | 223 | ||
143 | bool doneownsound = false; | 224 | CollisionForSoundInfo colInfo; |
225 | uint id; | ||
144 | 226 | ||
145 | foreach (uint Id in Colliders) | 227 | for(int i = 0; i< collidersinfolist.Count; i++) |
146 | { | 228 | { |
147 | if (Id == 0) | 229 | colInfo = collidersinfolist[i]; |
230 | |||
231 | id = colInfo.colliderID; | ||
232 | if (id == 0) // terrain collision | ||
148 | { | 233 | { |
149 | if (!doneownsound) | 234 | if (!doneownsound) |
150 | { | 235 | { |
151 | soundID = m_TerrainPart[thisMaterial]; | 236 | if (!HaveSound) |
152 | part.SendCollisionSound(soundID, 1.0, position); | 237 | { |
238 | volume = Math.Abs(colInfo.relativeVel); | ||
239 | if (volume < 0.2f) | ||
240 | continue; | ||
241 | |||
242 | volume *= volume * .0625f; // 4m/s == full volume | ||
243 | if (volume > 1.0f) | ||
244 | volume = 1.0f; | ||
245 | |||
246 | soundID = m_TerrainPart[thisMaterial]; | ||
247 | } | ||
248 | part.SendCollisionSound(soundID, volume, colInfo.position); | ||
153 | doneownsound = true; | 249 | doneownsound = true; |
154 | } | 250 | } |
155 | continue; | 251 | continue; |
156 | } | 252 | } |
157 | 253 | ||
158 | SceneObjectPart otherPart = part.ParentGroup.Scene.GetSceneObjectPart(Id); | 254 | SceneObjectPart otherPart = part.ParentGroup.Scene.GetSceneObjectPart(id); |
159 | if (otherPart != null) | 255 | if (otherPart != null) |
160 | { | 256 | { |
161 | if (otherPart.CollisionSound == part.invalidCollisionSoundUUID || otherPart.VolumeDetectActive) | 257 | if (otherPart.CollisionSoundType < 0 || otherPart.VolumeDetectActive) |
162 | continue; | 258 | continue; |
163 | if (otherPart.CollisionSound != UUID.Zero) | 259 | |
164 | otherPart.SendCollisionSound(otherPart.CollisionSound, otherPart.CollisionSoundVolume, position); | 260 | if (!HaveSound) |
165 | else | ||
166 | { | 261 | { |
167 | otherMaterial = (int)otherPart.Material; | 262 | if (otherPart.CollisionSoundType > 0) |
168 | if (otherMaterial >= MaxMaterials) | 263 | { |
169 | otherMaterial = 3; | 264 | soundID = otherPart.CollisionSound; |
170 | index = thisMatScaled + otherMaterial; | 265 | volume = otherPart.CollisionSoundVolume; |
171 | soundID = m_PartPart[index]; | 266 | if (volume == 0.0f) |
172 | if (doneownsound) | 267 | continue; |
173 | otherPart.SendCollisionSound(soundID, 1.0, position); | 268 | } |
174 | else | 269 | else |
175 | { | 270 | { |
176 | part.SendCollisionSound(soundID, 1.0, position); | 271 | volume = Math.Abs(colInfo.relativeVel); |
177 | doneownsound = true; | 272 | if (volume < 0.2f) |
273 | continue; | ||
274 | |||
275 | volume *= volume * .0625f; // 4m/s == full volume | ||
276 | if (volume > 1.0f) | ||
277 | volume = 1.0f; | ||
278 | |||
279 | int otherMaterial = (int)otherPart.Material; | ||
280 | if (otherMaterial >= MaxMaterials) | ||
281 | otherMaterial = 3; | ||
282 | |||
283 | soundID = m_PartPart[thisMatScaled + otherMaterial]; | ||
178 | } | 284 | } |
179 | } | 285 | } |
180 | } | 286 | |
181 | /* avatars get notification let them trigger the sound | 287 | if (doneownsound) |
182 | else if (!doneownsound) | 288 | otherPart.SendCollisionSound(soundID, volume, colInfo.position); |
183 | { | 289 | else |
184 | ScenePresence av = part.ParentGroup.Scene.GetScenePresence(Id); | ||
185 | if (av != null && (!av.IsChildAgent)) | ||
186 | { | 290 | { |
187 | index = thisMatScaled + 4; // flesh | 291 | part.SendCollisionSound(soundID, volume, colInfo.position); |
188 | soundID = m_PartPart[index]; | ||
189 | part.SendCollisionSound(soundID, 1.0); | ||
190 | doneownsound = true; | 292 | doneownsound = true; |
191 | } | 293 | } |
192 | } | 294 | } |
193 | */ | ||
194 | } | 295 | } |
195 | } | 296 | } |
196 | 297 | ||
197 | public static void AvatarCollisionSound(ScenePresence av, List<uint> Colliders) | 298 | public static void AvatarCollisionSound(ScenePresence av, List<CollisionForSoundInfo> collidersinfolist) |
198 | { | 299 | { |
199 | // temporary mute sounds | 300 | if (collidersinfolist.Count == 0 || av == null) |
200 | return; | ||
201 | |||
202 | if (Colliders.Count == 0 || av == null) | ||
203 | return; | 301 | return; |
204 | 302 | ||
205 | UUID soundID; | 303 | UUID soundID; |
206 | int otherMaterial; | 304 | int otherMaterial; |
207 | 305 | ||
208 | int thisMaterial = 3; | 306 | int thisMaterial = 4; // flesh |
209 | 307 | ||
210 | int thisMatScaled = thisMaterial * MaxMaterials; | 308 | int thisMatScaled = thisMaterial * MaxMaterials; |
211 | int index; | ||
212 | // bool doneownsound = false; | ||
213 | 309 | ||
214 | Vector3 position = av.AbsolutePosition; | 310 | // bool doneownsound = false; |
215 | 311 | ||
216 | foreach (uint Id in Colliders) | 312 | CollisionForSoundInfo colInfo; |
313 | uint id; | ||
314 | float volume; | ||
315 | |||
316 | for(int i = 0; i< collidersinfolist.Count; i++) | ||
217 | { | 317 | { |
218 | if (Id == 0) | 318 | colInfo = collidersinfolist[i]; |
319 | |||
320 | id = colInfo.colliderID; | ||
321 | |||
322 | if (id == 0) // no terrain collision sounds for now | ||
219 | { | 323 | { |
220 | continue; | 324 | continue; |
325 | // volume = Math.Abs(colInfo.relativeVel); | ||
326 | // if (volume < 0.2f) | ||
327 | // continue; | ||
328 | |||
221 | } | 329 | } |
222 | 330 | ||
223 | SceneObjectPart otherPart = av.Scene.GetSceneObjectPart(Id); | 331 | SceneObjectPart otherPart = av.Scene.GetSceneObjectPart(id); |
224 | if (otherPart != null) | 332 | if (otherPart != null) |
225 | { | 333 | { |
226 | if (otherPart.CollisionSound == otherPart.invalidCollisionSoundUUID) | 334 | if (otherPart.CollisionSoundType < 0) |
227 | continue; | 335 | continue; |
228 | if (otherPart.CollisionSound != UUID.Zero) | 336 | if (otherPart.CollisionSoundType > 0 && otherPart.CollisionSoundVolume > 0f) |
229 | otherPart.SendCollisionSound(otherPart.CollisionSound, otherPart.CollisionSoundVolume, position); | 337 | otherPart.SendCollisionSound(otherPart.CollisionSound, otherPart.CollisionSoundVolume, colInfo.position); |
230 | else | 338 | else |
231 | { | 339 | { |
340 | volume = Math.Abs(colInfo.relativeVel); | ||
341 | if (volume < 0.2f) | ||
342 | continue; | ||
343 | |||
344 | volume *= volume * .0625f; // 4m/s == full volume | ||
345 | if (volume > 1.0f) | ||
346 | volume = 1.0f; | ||
232 | otherMaterial = (int)otherPart.Material; | 347 | otherMaterial = (int)otherPart.Material; |
233 | if (otherMaterial >= MaxMaterials) | 348 | if (otherMaterial >= MaxMaterials) |
234 | otherMaterial = 3; | 349 | otherMaterial = 3; |
235 | index = thisMatScaled + otherMaterial; | 350 | |
236 | soundID = m_PartPart[index]; | 351 | soundID = m_PartPart[thisMatScaled + otherMaterial]; |
237 | otherPart.SendCollisionSound(soundID, 1.0, position); | 352 | otherPart.SendCollisionSound(soundID, volume, colInfo.position); |
238 | } | 353 | } |
354 | continue; | ||
239 | } | 355 | } |
240 | /* | 356 | /* |
241 | else if (!doneownsound) | 357 | else if (!doneownsound) |
@@ -251,6 +367,5 @@ namespace OpenSim.Region.Framework.Scenes | |||
251 | */ | 367 | */ |
252 | } | 368 | } |
253 | } | 369 | } |
254 | |||
255 | } | 370 | } |
256 | } | 371 | } |
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index b5705b7..2852c4b 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | |||
@@ -329,11 +329,13 @@ namespace OpenSim.Region.Framework.Scenes | |||
329 | private Vector3 m_cameraAtOffset; | 329 | private Vector3 m_cameraAtOffset; |
330 | private bool m_forceMouselook; | 330 | private bool m_forceMouselook; |
331 | 331 | ||
332 | // TODO: Collision sound should have default. | 332 | |
333 | // 0 for default collision sounds, -1 for script disabled sound 1 for script defined sound | ||
334 | private sbyte m_collisionSoundType; | ||
333 | private UUID m_collisionSound; | 335 | private UUID m_collisionSound; |
334 | private float m_collisionSoundVolume; | 336 | private float m_collisionSoundVolume; |
335 | 337 | ||
336 | private DateTime LastColSoundSentTime; | 338 | private int LastColSoundSentTime; |
337 | 339 | ||
338 | 340 | ||
339 | private SOPVehicle m_vehicle = null; | 341 | private SOPVehicle m_vehicle = null; |
@@ -374,7 +376,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
374 | // this appears to have the same UUID (!) as the prim. If this isn't the case, one can't drag items from | 376 | // this appears to have the same UUID (!) as the prim. If this isn't the case, one can't drag items from |
375 | // the prim into an agent inventory (Linden client reports that the "Object not found for drop" in its log | 377 | // the prim into an agent inventory (Linden client reports that the "Object not found for drop" in its log |
376 | m_inventory = new SceneObjectPartInventory(this); | 378 | m_inventory = new SceneObjectPartInventory(this); |
377 | LastColSoundSentTime = DateTime.UtcNow; | 379 | LastColSoundSentTime = Util.EnvironmentTickCount(); |
378 | } | 380 | } |
379 | 381 | ||
380 | /// <summary> | 382 | /// <summary> |
@@ -1342,12 +1344,39 @@ namespace OpenSim.Region.Framework.Scenes | |||
1342 | 1344 | ||
1343 | public UUID invalidCollisionSoundUUID = new UUID("ffffffff-ffff-ffff-ffff-ffffffffffff"); | 1345 | public UUID invalidCollisionSoundUUID = new UUID("ffffffff-ffff-ffff-ffff-ffffffffffff"); |
1344 | 1346 | ||
1347 | // 0 for default collision sounds, -1 for script disabled sound 1 for script defined sound | ||
1348 | // runtime thing.. do not persist | ||
1349 | [XmlIgnore] | ||
1350 | public sbyte CollisionSoundType | ||
1351 | { | ||
1352 | get | ||
1353 | { | ||
1354 | return m_collisionSoundType; | ||
1355 | } | ||
1356 | set | ||
1357 | { | ||
1358 | m_collisionSoundType = value; | ||
1359 | if (value == -1) | ||
1360 | m_collisionSound = invalidCollisionSoundUUID; | ||
1361 | else if (value == 0) | ||
1362 | m_collisionSound = UUID.Zero; | ||
1363 | } | ||
1364 | } | ||
1365 | |||
1345 | public UUID CollisionSound | 1366 | public UUID CollisionSound |
1346 | { | 1367 | { |
1347 | get { return m_collisionSound; } | 1368 | get { return m_collisionSound; } |
1348 | set | 1369 | set |
1349 | { | 1370 | { |
1350 | m_collisionSound = value; | 1371 | m_collisionSound = value; |
1372 | |||
1373 | if (value == invalidCollisionSoundUUID) | ||
1374 | m_collisionSoundType = -1; | ||
1375 | else if (value == UUID.Zero) | ||
1376 | m_collisionSoundType = 0; | ||
1377 | else | ||
1378 | m_collisionSoundType = 1; | ||
1379 | |||
1351 | aggregateScriptEvents(); | 1380 | aggregateScriptEvents(); |
1352 | } | 1381 | } |
1353 | } | 1382 | } |
@@ -1575,7 +1604,10 @@ namespace OpenSim.Region.Framework.Scenes | |||
1575 | } | 1604 | } |
1576 | } | 1605 | } |
1577 | else if (PhysActor == null) | 1606 | else if (PhysActor == null) |
1607 | { | ||
1578 | ApplyPhysics((uint)Flags, VolumeDetectActive, false); | 1608 | ApplyPhysics((uint)Flags, VolumeDetectActive, false); |
1609 | UpdatePhysicsSubscribedEvents(); | ||
1610 | } | ||
1579 | else | 1611 | else |
1580 | { | 1612 | { |
1581 | PhysActor.PhysicsShapeType = m_physicsShapeType; | 1613 | PhysActor.PhysicsShapeType = m_physicsShapeType; |
@@ -2632,13 +2664,42 @@ namespace OpenSim.Region.Framework.Scenes | |||
2632 | 2664 | ||
2633 | else | 2665 | else |
2634 | { | 2666 | { |
2667 | List<CollisionForSoundInfo> soundinfolist = new List<CollisionForSoundInfo>(); | ||
2668 | |||
2635 | // calculate things that started colliding this time | 2669 | // calculate things that started colliding this time |
2636 | // and build up list of colliders this time | 2670 | // and build up list of colliders this time |
2637 | foreach (uint localid in collissionswith.Keys) | 2671 | if (!VolumeDetectActive && CollisionSoundType >= 0) |
2672 | { | ||
2673 | CollisionForSoundInfo soundinfo; | ||
2674 | ContactPoint curcontact; | ||
2675 | |||
2676 | foreach (uint id in collissionswith.Keys) | ||
2677 | { | ||
2678 | thisHitColliders.Add(id); | ||
2679 | if (!m_lastColliders.Contains(id)) | ||
2680 | { | ||
2681 | startedColliders.Add(id); | ||
2682 | |||
2683 | curcontact = collissionswith[id]; | ||
2684 | if (Math.Abs(curcontact.RelativeSpeed) > 0.2) | ||
2685 | { | ||
2686 | soundinfo = new CollisionForSoundInfo(); | ||
2687 | soundinfo.colliderID = id; | ||
2688 | soundinfo.position = curcontact.Position; | ||
2689 | soundinfo.relativeVel = curcontact.RelativeSpeed; | ||
2690 | soundinfolist.Add(soundinfo); | ||
2691 | } | ||
2692 | } | ||
2693 | } | ||
2694 | } | ||
2695 | else | ||
2638 | { | 2696 | { |
2639 | thisHitColliders.Add(localid); | 2697 | foreach (uint id in collissionswith.Keys) |
2640 | if (!m_lastColliders.Contains(localid)) | 2698 | { |
2641 | startedColliders.Add(localid); | 2699 | thisHitColliders.Add(id); |
2700 | if (!m_lastColliders.Contains(id)) | ||
2701 | startedColliders.Add(id); | ||
2702 | } | ||
2642 | } | 2703 | } |
2643 | 2704 | ||
2644 | // calculate things that ended colliding | 2705 | // calculate things that ended colliding |
@@ -2655,17 +2716,14 @@ namespace OpenSim.Region.Framework.Scenes | |||
2655 | // remove things that ended colliding from the last colliders list | 2716 | // remove things that ended colliding from the last colliders list |
2656 | foreach (uint localID in endedColliders) | 2717 | foreach (uint localID in endedColliders) |
2657 | m_lastColliders.Remove(localID); | 2718 | m_lastColliders.Remove(localID); |
2658 | } | ||
2659 | |||
2660 | // play the sound. | ||
2661 | 2719 | ||
2662 | bool IsNotVolumeDtc = !VolumeDetectActive; | 2720 | // play sounds. |
2663 | 2721 | if (soundinfolist.Count > 0) | |
2664 | if (IsNotVolumeDtc && startedColliders.Count > 0 && CollisionSound != invalidCollisionSoundUUID) | 2722 | CollisionSounds.PartCollisionSound(this, soundinfolist); |
2665 | CollisionSounds.PartCollisionSound(this, startedColliders); | 2723 | } |
2666 | 2724 | ||
2667 | SendCollisionEvent(scriptEvents.collision_start, startedColliders, ParentGroup.Scene.EventManager.TriggerScriptCollidingStart); | 2725 | SendCollisionEvent(scriptEvents.collision_start, startedColliders, ParentGroup.Scene.EventManager.TriggerScriptCollidingStart); |
2668 | if (IsNotVolumeDtc) | 2726 | if (!VolumeDetectActive) |
2669 | SendCollisionEvent(scriptEvents.collision , m_lastColliders , ParentGroup.Scene.EventManager.TriggerScriptColliding); | 2727 | SendCollisionEvent(scriptEvents.collision , m_lastColliders , ParentGroup.Scene.EventManager.TriggerScriptColliding); |
2670 | SendCollisionEvent(scriptEvents.collision_end , endedColliders , ParentGroup.Scene.EventManager.TriggerScriptCollidingEnd); | 2728 | SendCollisionEvent(scriptEvents.collision_end , endedColliders , ParentGroup.Scene.EventManager.TriggerScriptCollidingEnd); |
2671 | 2729 | ||
@@ -3210,8 +3268,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
3210 | if (volume < 0) | 3268 | if (volume < 0) |
3211 | volume = 0; | 3269 | volume = 0; |
3212 | 3270 | ||
3213 | DateTime now = DateTime.UtcNow; | 3271 | int now = Util.EnvironmentTickCount(); |
3214 | if((now - LastColSoundSentTime).Milliseconds < 200) // reduce rate to 5 per sec per part ?? | 3272 | if(Util.EnvironmentTickCountSubtract(now,LastColSoundSentTime) <200) |
3215 | return; | 3273 | return; |
3216 | 3274 | ||
3217 | LastColSoundSentTime = now; | 3275 | LastColSoundSentTime = now; |
@@ -4609,7 +4667,15 @@ namespace OpenSim.Region.Framework.Scenes | |||
4609 | /// </remarks> | 4667 | /// </remarks> |
4610 | public void RemoveFromPhysics() | 4668 | public void RemoveFromPhysics() |
4611 | { | 4669 | { |
4612 | ParentGroup.Scene.PhysicsScene.RemovePrim(PhysActor); | 4670 | PhysicsActor pa = PhysActor; |
4671 | if (pa != null) | ||
4672 | { | ||
4673 | pa.OnCollisionUpdate -= PhysicsCollision; | ||
4674 | pa.OnRequestTerseUpdate -= PhysicsRequestingTerseUpdate; | ||
4675 | pa.OnOutOfBounds -= PhysicsOutOfBounds; | ||
4676 | |||
4677 | ParentGroup.Scene.PhysicsScene.RemovePrim(pa); | ||
4678 | } | ||
4613 | PhysActor = null; | 4679 | PhysActor = null; |
4614 | } | 4680 | } |
4615 | 4681 | ||
@@ -4778,7 +4844,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
4778 | 4844 | ||
4779 | pa.OnCollisionUpdate -= PhysicsCollision; | 4845 | pa.OnCollisionUpdate -= PhysicsCollision; |
4780 | 4846 | ||
4781 | bool hassound = ( CollisionSound != invalidCollisionSoundUUID); | 4847 | bool hassound = (CollisionSoundType >= 0 && !VolumeDetectActive); |
4848 | |||
4782 | scriptEvents CombinedEvents = AggregateScriptEvents; | 4849 | scriptEvents CombinedEvents = AggregateScriptEvents; |
4783 | 4850 | ||
4784 | // merge with root part | 4851 | // merge with root part |
@@ -4787,10 +4854,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
4787 | 4854 | ||
4788 | // submit to this part case | 4855 | // submit to this part case |
4789 | if (VolumeDetectActive) | 4856 | if (VolumeDetectActive) |
4790 | { | ||
4791 | CombinedEvents &= PhyscicsVolumeDtcSubsEvents; | 4857 | CombinedEvents &= PhyscicsVolumeDtcSubsEvents; |
4792 | hassound = false; | ||
4793 | } | ||
4794 | else if ((Flags & PrimFlags.Phantom) != 0) | 4858 | else if ((Flags & PrimFlags.Phantom) != 0) |
4795 | CombinedEvents &= PhyscicsPhantonSubsEvents; | 4859 | CombinedEvents &= PhyscicsPhantonSubsEvents; |
4796 | else | 4860 | else |
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index ebddf21..5a3b518 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs | |||
@@ -2032,7 +2032,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
2032 | // m_log.DebugFormat("[SCENE PRESENCE]: {0} {1}", SitTargetisSet, SitTargetUnOccupied); | 2032 | // m_log.DebugFormat("[SCENE PRESENCE]: {0} {1}", SitTargetisSet, SitTargetUnOccupied); |
2033 | 2033 | ||
2034 | if (PhysicsActor != null) | 2034 | if (PhysicsActor != null) |
2035 | m_sitAvatarHeight = PhysicsActor.Size.Z; | 2035 | m_sitAvatarHeight = PhysicsActor.Size.Z * 0.5f; |
2036 | 2036 | ||
2037 | bool canSit = false; | 2037 | bool canSit = false; |
2038 | pos = part.AbsolutePosition + offset; | 2038 | pos = part.AbsolutePosition + offset; |
@@ -4098,6 +4098,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
4098 | 4098 | ||
4099 | private void RaiseCollisionScriptEvents(Dictionary<uint, ContactPoint> coldata) | 4099 | private void RaiseCollisionScriptEvents(Dictionary<uint, ContactPoint> coldata) |
4100 | { | 4100 | { |
4101 | /* | ||
4101 | lock(m_collisionEventLock) | 4102 | lock(m_collisionEventLock) |
4102 | { | 4103 | { |
4103 | if (m_collisionEventFlag) | 4104 | if (m_collisionEventFlag) |
@@ -4107,76 +4108,106 @@ namespace OpenSim.Region.Framework.Scenes | |||
4107 | 4108 | ||
4108 | Util.FireAndForget(delegate(object x) | 4109 | Util.FireAndForget(delegate(object x) |
4109 | { | 4110 | { |
4111 | */ | ||
4110 | try | 4112 | try |
4111 | { | 4113 | { |
4112 | List<uint> thisHitColliders = new List<uint>(); | 4114 | List<uint> thisHitColliders = new List<uint>(); |
4113 | List<uint> endedColliders = new List<uint>(); | 4115 | List<uint> endedColliders = new List<uint>(); |
4114 | List<uint> startedColliders = new List<uint>(); | 4116 | List<uint> startedColliders = new List<uint>(); |
4117 | List<CollisionForSoundInfo> soundinfolist = new List<CollisionForSoundInfo>(); | ||
4118 | CollisionForSoundInfo soundinfo; | ||
4119 | ContactPoint curcontact; | ||
4115 | 4120 | ||
4116 | foreach (uint localid in coldata.Keys) | 4121 | if (coldata.Count == 0) |
4117 | { | 4122 | { |
4118 | thisHitColliders.Add(localid); | 4123 | if (m_lastColliders.Count == 0) |
4119 | if (!m_lastColliders.Contains(localid)) | 4124 | return; // nothing to do |
4120 | { | 4125 | |
4121 | startedColliders.Add(localid); | 4126 | foreach (uint localID in m_lastColliders) |
4122 | } | ||
4123 | //m_log.Debug("[SCENE PRESENCE]: Collided with:" + localid.ToString() + " at depth of: " + collissionswith[localid].ToString()); | ||
4124 | } | ||
4125 | |||
4126 | // calculate things that ended colliding | ||
4127 | foreach (uint localID in m_lastColliders) | ||
4128 | { | ||
4129 | if (!thisHitColliders.Contains(localID)) | ||
4130 | { | 4127 | { |
4131 | endedColliders.Add(localID); | 4128 | endedColliders.Add(localID); |
4132 | } | 4129 | } |
4133 | } | 4130 | m_lastColliders.Clear(); |
4134 | //add the items that started colliding this time to the last colliders list. | ||
4135 | foreach (uint localID in startedColliders) | ||
4136 | { | ||
4137 | m_lastColliders.Add(localID); | ||
4138 | } | ||
4139 | // remove things that ended colliding from the last colliders list | ||
4140 | foreach (uint localID in endedColliders) | ||
4141 | { | ||
4142 | m_lastColliders.Remove(localID); | ||
4143 | } | 4131 | } |
4144 | 4132 | ||
4145 | // do event notification | 4133 | else |
4146 | if (startedColliders.Count > 0) | ||
4147 | { | 4134 | { |
4148 | CollisionSounds.AvatarCollisionSound(this, startedColliders); | 4135 | foreach (uint id in coldata.Keys) |
4149 | |||
4150 | ColliderArgs StartCollidingMessage = new ColliderArgs(); | ||
4151 | List<DetectedObject> colliding = new List<DetectedObject>(); | ||
4152 | foreach (uint localId in startedColliders) | ||
4153 | { | 4136 | { |
4154 | if (localId == 0) | 4137 | thisHitColliders.Add(id); |
4155 | continue; | 4138 | if (!m_lastColliders.Contains(id)) |
4139 | { | ||
4140 | startedColliders.Add(id); | ||
4141 | curcontact = coldata[id]; | ||
4142 | if (Math.Abs(curcontact.RelativeSpeed) > 0.2) | ||
4143 | { | ||
4144 | soundinfo = new CollisionForSoundInfo(); | ||
4145 | soundinfo.colliderID = id; | ||
4146 | soundinfo.position = curcontact.Position; | ||
4147 | soundinfo.relativeVel = curcontact.RelativeSpeed; | ||
4148 | soundinfolist.Add(soundinfo); | ||
4149 | } | ||
4150 | } | ||
4151 | //m_log.Debug("[SCENE PRESENCE]: Collided with:" + localid.ToString() + " at depth of: " + collissionswith[localid].ToString()); | ||
4152 | } | ||
4156 | 4153 | ||
4157 | SceneObjectPart obj = Scene.GetSceneObjectPart(localId); | 4154 | // calculate things that ended colliding |
4158 | string data = ""; | 4155 | foreach (uint localID in m_lastColliders) |
4159 | if (obj != null) | 4156 | { |
4157 | if (!thisHitColliders.Contains(localID)) | ||
4160 | { | 4158 | { |
4161 | DetectedObject detobj = new DetectedObject(); | 4159 | endedColliders.Add(localID); |
4162 | detobj.keyUUID = obj.UUID; | ||
4163 | detobj.nameStr = obj.Name; | ||
4164 | detobj.ownerUUID = obj.OwnerID; | ||
4165 | detobj.posVector = obj.AbsolutePosition; | ||
4166 | detobj.rotQuat = obj.GetWorldRotation(); | ||
4167 | detobj.velVector = obj.Velocity; | ||
4168 | detobj.colliderType = 0; | ||
4169 | detobj.groupUUID = obj.GroupID; | ||
4170 | colliding.Add(detobj); | ||
4171 | } | 4160 | } |
4172 | } | 4161 | } |
4162 | //add the items that started colliding this time to the last colliders list. | ||
4163 | foreach (uint localID in startedColliders) | ||
4164 | { | ||
4165 | m_lastColliders.Add(localID); | ||
4166 | } | ||
4167 | // remove things that ended colliding from the last colliders list | ||
4168 | foreach (uint localID in endedColliders) | ||
4169 | { | ||
4170 | m_lastColliders.Remove(localID); | ||
4171 | } | ||
4173 | 4172 | ||
4174 | if (colliding.Count > 0) | 4173 | if (soundinfolist.Count > 0) |
4174 | CollisionSounds.AvatarCollisionSound(this, soundinfolist); | ||
4175 | |||
4176 | // do event notification | ||
4177 | if (startedColliders.Count > 0) | ||
4175 | { | 4178 | { |
4176 | StartCollidingMessage.Colliders = colliding; | ||
4177 | 4179 | ||
4178 | foreach (SceneObjectGroup att in GetAttachments()) | 4180 | ColliderArgs StartCollidingMessage = new ColliderArgs(); |
4179 | Scene.EventManager.TriggerScriptCollidingStart(att.LocalId, StartCollidingMessage); | 4181 | List<DetectedObject> colliding = new List<DetectedObject>(); |
4182 | foreach (uint localId in startedColliders) | ||
4183 | { | ||
4184 | if (localId == 0) | ||
4185 | continue; | ||
4186 | |||
4187 | SceneObjectPart obj = Scene.GetSceneObjectPart(localId); | ||
4188 | string data = ""; | ||
4189 | if (obj != null) | ||
4190 | { | ||
4191 | DetectedObject detobj = new DetectedObject(); | ||
4192 | detobj.keyUUID = obj.UUID; | ||
4193 | detobj.nameStr = obj.Name; | ||
4194 | detobj.ownerUUID = obj.OwnerID; | ||
4195 | detobj.posVector = obj.AbsolutePosition; | ||
4196 | detobj.rotQuat = obj.GetWorldRotation(); | ||
4197 | detobj.velVector = obj.Velocity; | ||
4198 | detobj.colliderType = 0; | ||
4199 | detobj.groupUUID = obj.GroupID; | ||
4200 | colliding.Add(detobj); | ||
4201 | } | ||
4202 | } | ||
4203 | |||
4204 | if (colliding.Count > 0) | ||
4205 | { | ||
4206 | StartCollidingMessage.Colliders = colliding; | ||
4207 | |||
4208 | foreach (SceneObjectGroup att in GetAttachments()) | ||
4209 | Scene.EventManager.TriggerScriptCollidingStart(att.LocalId, StartCollidingMessage); | ||
4210 | } | ||
4180 | } | 4211 | } |
4181 | } | 4212 | } |
4182 | 4213 | ||
@@ -4257,7 +4288,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
4257 | { | 4288 | { |
4258 | m_collisionEventFlag = false; | 4289 | m_collisionEventFlag = false; |
4259 | } | 4290 | } |
4260 | }); | 4291 | // }); |
4261 | } | 4292 | } |
4262 | 4293 | ||
4263 | private void TeleportFlagsDebug() { | 4294 | private void TeleportFlagsDebug() { |