aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorubit2012-05-17 02:05:46 +0200
committerubit2012-05-17 02:05:46 +0200
commit845f8423e41833d5febf0bb577e565f3599d3f18 (patch)
tree7bd6347f1b3dd69303d699e9744771e003346738
parentMerge branch 'ubitwork' of ssh://3dhosting.de/var/git/careminster into ubitwork (diff)
parentdefault collision sounds. Incomplete, untested, needs revision (diff)
downloadopensim-SC-845f8423e41833d5febf0bb577e565f3599d3f18.zip
opensim-SC-845f8423e41833d5febf0bb577e565f3599d3f18.tar.gz
opensim-SC-845f8423e41833d5febf0bb577e565f3599d3f18.tar.bz2
opensim-SC-845f8423e41833d5febf0bb577e565f3599d3f18.tar.xz
Merge branch 'ubitwork' of ssh://3dhosting.de/var/git/careminster into ubitwork
-rw-r--r--OpenSim/Region/Framework/Scenes/CollisionSounds.cs204
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneObjectPart.cs52
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs10
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs2
4 files changed, 262 insertions, 6 deletions
diff --git a/OpenSim/Region/Framework/Scenes/CollisionSounds.cs b/OpenSim/Region/Framework/Scenes/CollisionSounds.cs
new file mode 100644
index 0000000..65c8012
--- /dev/null
+++ b/OpenSim/Region/Framework/Scenes/CollisionSounds.cs
@@ -0,0 +1,204 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27// Ubit 2012
28
29using System;
30using System.Collections.Generic;
31using OpenMetaverse;
32using OpenSim.Framework;
33
34namespace OpenSim.Region.Framework.Scenes
35{
36 public static class CollisionSounds
37 {
38 // defines for cases
39 // only know one UUID for now (woodflesh)
40
41 private const int MaxMaterials = 7;
42 // part part
43 private static UUID snd_StoneStone = new UUID("be582e5d-b123-41a2-a150-454c39e961c8");
44 private static UUID snd_StoneMetal = new UUID("be582e5d-b123-41a2-a150-454c39e961c8");
45 private static UUID snd_StoneGlass = new UUID("be582e5d-b123-41a2-a150-454c39e961c8");
46 private static UUID snd_StoneWood = new UUID("be582e5d-b123-41a2-a150-454c39e961c8");
47 private static UUID snd_StoneFlesh = new UUID("be582e5d-b123-41a2-a150-454c39e961c8");
48 private static UUID snd_StonePlastic = new UUID("be582e5d-b123-41a2-a150-454c39e961c8");
49 private static UUID snd_StoneRubber = new UUID("be582e5d-b123-41a2-a150-454c39e961c8");
50
51 private static UUID snd_MetalStone = new UUID("be582e5d-b123-41a2-a150-454c39e961c8");
52 private static UUID snd_MetalMetal = new UUID("be582e5d-b123-41a2-a150-454c39e961c8");
53 private static UUID snd_MetalGlass = new UUID("be582e5d-b123-41a2-a150-454c39e961c8");
54 private static UUID snd_MetalWood = new UUID("be582e5d-b123-41a2-a150-454c39e961c8");
55 private static UUID snd_MetalFlesh = new UUID("be582e5d-b123-41a2-a150-454c39e961c8");
56 private static UUID snd_MetalPlastic = new UUID("be582e5d-b123-41a2-a150-454c39e961c8");
57 private static UUID snd_MetalRubber = new UUID("be582e5d-b123-41a2-a150-454c39e961c8");
58
59 private static UUID snd_GlassStone = new UUID("be582e5d-b123-41a2-a150-454c39e961c8");
60 private static UUID snd_GlassMetal = new UUID("be582e5d-b123-41a2-a150-454c39e961c8");
61 private static UUID snd_GlassGlass = new UUID("be582e5d-b123-41a2-a150-454c39e961c8");
62 private static UUID snd_GlassWood = new UUID("be582e5d-b123-41a2-a150-454c39e961c8");
63 private static UUID snd_GlassFlesh = new UUID("be582e5d-b123-41a2-a150-454c39e961c8");
64 private static UUID snd_GlassPlastic = new UUID("be582e5d-b123-41a2-a150-454c39e961c8");
65 private static UUID snd_GlassRubber = new UUID("be582e5d-b123-41a2-a150-454c39e961c8");
66
67 private static UUID snd_WoodStone = new UUID("be582e5d-b123-41a2-a150-454c39e961c8");
68 private static UUID snd_WoodMetal = new UUID("be582e5d-b123-41a2-a150-454c39e961c8");
69 private static UUID snd_WoodGlass = new UUID("be582e5d-b123-41a2-a150-454c39e961c8");
70 private static UUID snd_WoodWood = new UUID("be582e5d-b123-41a2-a150-454c39e961c8");
71 private static UUID snd_WoodFlesh = new UUID("be582e5d-b123-41a2-a150-454c39e961c8");
72 private static UUID snd_WoodPlastic = new UUID("be582e5d-b123-41a2-a150-454c39e961c8");
73 private static UUID snd_WoodRubber = new UUID("be582e5d-b123-41a2-a150-454c39e961c8");
74
75 private static UUID snd_FleshStone = new UUID("be582e5d-b123-41a2-a150-454c39e961c8");
76 private static UUID snd_FleshMetal = new UUID("be582e5d-b123-41a2-a150-454c39e961c8");
77 private static UUID snd_FleshGlass = new UUID("be582e5d-b123-41a2-a150-454c39e961c8");
78 private static UUID snd_FleshWood = new UUID("be582e5d-b123-41a2-a150-454c39e961c8");
79 private static UUID snd_FleshFlesh = new UUID("be582e5d-b123-41a2-a150-454c39e961c8");
80 private static UUID snd_FleshPlastic = new UUID("be582e5d-b123-41a2-a150-454c39e961c8");
81 private static UUID snd_FleshRubber = new UUID("be582e5d-b123-41a2-a150-454c39e961c8");
82
83 private static UUID snd_PlasticStone = new UUID("be582e5d-b123-41a2-a150-454c39e961c8");
84 private static UUID snd_PlasticMetal = new UUID("be582e5d-b123-41a2-a150-454c39e961c8");
85 private static UUID snd_PlasticGlass = new UUID("be582e5d-b123-41a2-a150-454c39e961c8");
86 private static UUID snd_PlasticWood = new UUID("be582e5d-b123-41a2-a150-454c39e961c8");
87 private static UUID snd_PlasticFlesh = new UUID("be582e5d-b123-41a2-a150-454c39e961c8");
88 private static UUID snd_PlasticPlastic = new UUID("be582e5d-b123-41a2-a150-454c39e961c8");
89 private static UUID snd_PlasticRubber = new UUID("be582e5d-b123-41a2-a150-454c39e961c8");
90
91 private static UUID snd_RubberStone = new UUID("be582e5d-b123-41a2-a150-454c39e961c8");
92 private static UUID snd_RubberMetal = new UUID("be582e5d-b123-41a2-a150-454c39e961c8");
93 private static UUID snd_RubberGlass = new UUID("be582e5d-b123-41a2-a150-454c39e961c8");
94 private static UUID snd_RubberWood = new UUID("be582e5d-b123-41a2-a150-454c39e961c8");
95 private static UUID snd_RubberFlesh = new UUID("be582e5d-b123-41a2-a150-454c39e961c8");
96 private static UUID snd_RubberPlastic = new UUID("be582e5d-b123-41a2-a150-454c39e961c8");
97 private static UUID snd_RubberRubber = new UUID("be582e5d-b123-41a2-a150-454c39e961c8");
98
99 // terrain part
100 private static UUID snd_TerrainStone = new UUID("be582e5d-b123-41a2-a150-454c39e961c8");
101 private static UUID snd_TerrainMetal = new UUID("be582e5d-b123-41a2-a150-454c39e961c8");
102 private static UUID snd_TerrainGlass = new UUID("be582e5d-b123-41a2-a150-454c39e961c8");
103 private static UUID snd_TerrainWood = new UUID("be582e5d-b123-41a2-a150-454c39e961c8");
104 private static UUID snd_TerrainFlesh = new UUID("be582e5d-b123-41a2-a150-454c39e961c8");
105 private static UUID snd_TerrainPlastic = new UUID("be582e5d-b123-41a2-a150-454c39e961c8");
106 private static UUID snd_TerrainRubber = new UUID("be582e5d-b123-41a2-a150-454c39e961c8");
107
108 public static UUID[] m_TerrainPart = {
109 snd_TerrainStone,
110 snd_TerrainMetal,
111 snd_TerrainGlass,
112 snd_TerrainWood,
113 snd_TerrainFlesh,
114 snd_TerrainPlastic,
115 snd_TerrainRubber
116 };
117
118 public static UUID[] m_PartPart = {
119 snd_StoneStone, snd_StoneMetal, snd_StoneGlass, snd_StoneWood, snd_StoneFlesh, snd_StonePlastic, snd_StoneRubber,
120 snd_MetalStone, snd_MetalMetal, snd_MetalGlass, snd_MetalWood, snd_MetalFlesh, snd_MetalPlastic, snd_MetalRubber,
121 snd_GlassStone, snd_GlassMetal, snd_GlassGlass, snd_GlassWood, snd_GlassFlesh, snd_GlassPlastic, snd_GlassRubber,
122 snd_WoodStone, snd_WoodMetal, snd_WoodGlass, snd_WoodWood, snd_WoodFlesh, snd_WoodPlastic, snd_WoodRubber,
123 snd_FleshStone, snd_FleshMetal, snd_FleshGlass, snd_FleshWood, snd_FleshFlesh, snd_FleshPlastic, snd_FleshRubber,
124 snd_PlasticStone, snd_PlasticMetal, snd_PlasticGlass, snd_PlasticWood, snd_PlasticFlesh, snd_PlasticPlastic, snd_PlasticRubber,
125 snd_RubberStone, snd_RubberMetal, snd_RubberGlass, snd_RubberWood, snd_RubberFlesh, snd_RubberPlastic, snd_RubberRubber
126 };
127
128 public static void PartCollisionSound(SceneObjectPart part,List<uint> Colliders)
129 {
130 if(Colliders.Count == 0 || part == null)
131 return;
132
133 if ((part.Flags & PrimFlags.Physics) == 0) // let only active prims trigger sounds
134 return;
135
136 if (part.ParentGroup == null)
137 return;
138
139 if (part.CollisionSound == part.invalidCollisionSoundUUID)
140 return;
141
142 UUID soundID;
143 int otherMaterial;
144
145 int thisMaterial = (int) part.Material;
146 if (thisMaterial >= MaxMaterials)
147 thisMaterial = 3;
148
149 int thisMatScaled = thisMaterial * MaxMaterials;
150 int index;
151
152 bool doneownsound = false;
153
154 foreach (uint Id in Colliders)
155 {
156 if (Id == 0)
157 {
158 if (!doneownsound)
159 {
160 soundID = m_TerrainPart[thisMaterial];
161 part.SendCollisionSound(soundID, 1.0);
162 doneownsound = true;
163 }
164 continue;
165 }
166
167 SceneObjectPart otherPart = part.ParentGroup.Scene.GetSceneObjectPart(Id);
168 if (otherPart != null)
169 {
170 if (otherPart.CollisionSound == part.invalidCollisionSoundUUID)
171 continue;
172 if (otherPart.CollisionSound != UUID.Zero)
173 otherPart.SendCollisionSound(otherPart.CollisionSound, otherPart.CollisionSoundVolume);
174 else
175 {
176 otherMaterial = (int)otherPart.Material;
177 if (otherMaterial >= MaxMaterials)
178 otherMaterial = 3;
179 index = thisMatScaled + otherMaterial;
180 soundID = m_PartPart[index];
181 if (doneownsound)
182 otherPart.SendCollisionSound(soundID, 1.0);
183 else
184 {
185 part.SendCollisionSound(soundID, 1.0);
186 doneownsound = true;
187 }
188 }
189 }
190 else if (!doneownsound)
191 {
192 ScenePresence av = part.ParentGroup.Scene.GetScenePresence(Id);
193 if (av != null && (!av.IsChildAgent))
194 {
195 index = thisMatScaled + 4; // flesh
196 soundID = m_PartPart[index];
197 part.SendCollisionSound(soundID, 1.0);
198 doneownsound = true;
199 }
200 }
201 }
202 }
203 }
204} \ No newline at end of file
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index 8716e20..af9b7eb 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
@@ -188,6 +188,7 @@ namespace OpenSim.Region.Framework.Scenes
188 188
189 public double SoundRadius; 189 public double SoundRadius;
190 190
191
191 public uint TimeStampFull; 192 public uint TimeStampFull;
192 193
193 public uint TimeStampLastActivity; // Will be used for AutoReturn 194 public uint TimeStampLastActivity; // Will be used for AutoReturn
@@ -332,6 +333,8 @@ namespace OpenSim.Region.Framework.Scenes
332 private UUID m_collisionSound; 333 private UUID m_collisionSound;
333 private float m_collisionSoundVolume; 334 private float m_collisionSoundVolume;
334 335
336 private DateTime LastColSoundSentTime;
337
335 338
336 private SOPVehicle m_vehicle = null; 339 private SOPVehicle m_vehicle = null;
337 340
@@ -371,6 +374,7 @@ namespace OpenSim.Region.Framework.Scenes
371 // this appears to have the same UUID (!) as the prim. If this isn't the case, one can't drag items from 374 // this appears to have the same UUID (!) as the prim. If this isn't the case, one can't drag items from
372 // the prim into an agent inventory (Linden client reports that the "Object not found for drop" in its log 375 // the prim into an agent inventory (Linden client reports that the "Object not found for drop" in its log
373 m_inventory = new SceneObjectPartInventory(this); 376 m_inventory = new SceneObjectPartInventory(this);
377 LastColSoundSentTime = DateTime.UtcNow;
374 } 378 }
375 379
376 /// <summary> 380 /// <summary>
@@ -1336,11 +1340,13 @@ namespace OpenSim.Region.Framework.Scenes
1336 set { m_sitAnimation = value; } 1340 set { m_sitAnimation = value; }
1337 } 1341 }
1338 1342
1343 public UUID invalidCollisionSoundUUID = new UUID("ffffffff-ffff-ffff-ffff-ffffffffffff");
1344
1339 public UUID CollisionSound 1345 public UUID CollisionSound
1340 { 1346 {
1341 get { return m_collisionSound; } 1347 get { return m_collisionSound; }
1342 set 1348 set
1343 { 1349 {
1344 m_collisionSound = value; 1350 m_collisionSound = value;
1345 aggregateScriptEvents(); 1351 aggregateScriptEvents();
1346 } 1352 }
@@ -2655,8 +2661,15 @@ namespace OpenSim.Region.Framework.Scenes
2655 2661
2656 bool IsNotVolumeDtc = !VolumeDetectActive; 2662 bool IsNotVolumeDtc = !VolumeDetectActive;
2657 2663
2658 if (startedColliders.Count > 0 && CollisionSound != UUID.Zero && CollisionSoundVolume > 0.0f && IsNotVolumeDtc) 2664 if (IsNotVolumeDtc && startedColliders.Count > 0 && CollisionSoundVolume > 0.0f && CollisionSound != invalidCollisionSoundUUID)
2659 SendSound(CollisionSound.ToString(), CollisionSoundVolume, true, (byte)0, 0, false, false); 2665 {
2666 if(CollisionSound != UUID.Zero)
2667 SendCollisionSound(CollisionSound, CollisionSoundVolume);
2668 else
2669 {
2670 CollisionSounds.PartCollisionSound(this, startedColliders);
2671 }
2672 }
2660 2673
2661 SendCollisionEvent(scriptEvents.collision_start, startedColliders, ParentGroup.Scene.EventManager.TriggerScriptCollidingStart); 2674 SendCollisionEvent(scriptEvents.collision_start, startedColliders, ParentGroup.Scene.EventManager.TriggerScriptCollidingStart);
2662 if (IsNotVolumeDtc) 2675 if (IsNotVolumeDtc)
@@ -3190,6 +3203,37 @@ namespace OpenSim.Region.Framework.Scenes
3190 } 3203 }
3191 } 3204 }
3192 3205
3206 public void SendCollisionSound(UUID soundID, double volume)
3207 {
3208 if (soundID == UUID.Zero)
3209 return;
3210
3211
3212 ISoundModule soundModule = ParentGroup.Scene.RequestModuleInterface<ISoundModule>();
3213 if (soundModule == null)
3214 return;
3215
3216 if (volume > 1)
3217 volume = 1;
3218 if (volume < 0)
3219 volume = 0;
3220
3221 DateTime now = DateTime.UtcNow;
3222 if((now - LastColSoundSentTime).Milliseconds < 200) // reduce rate to 5 per sec per part ??
3223 return;
3224
3225 LastColSoundSentTime = now;
3226
3227 UUID ownerID = OwnerID;
3228 UUID objectID = ParentGroup.RootPart.UUID;
3229 UUID parentID = ParentGroup.UUID;
3230 Vector3 position = AbsolutePosition; // region local
3231 ulong regionHandle = ParentGroup.Scene.RegionInfo.RegionHandle;
3232
3233 soundModule.TriggerSound(soundID, ownerID, objectID, parentID, volume, position, regionHandle, 0);
3234 }
3235
3236
3193 /// <summary> 3237 /// <summary>
3194 /// Send a terse update to all clients 3238 /// Send a terse update to all clients
3195 /// </summary> 3239 /// </summary>
@@ -4743,7 +4787,7 @@ namespace OpenSim.Region.Framework.Scenes
4743 4787
4744 pa.OnCollisionUpdate -= PhysicsCollision; 4788 pa.OnCollisionUpdate -= PhysicsCollision;
4745 4789
4746 bool hassound = ( CollisionSound != UUID.Zero && CollisionSoundVolume > 0.0f); 4790 bool hassound = ( CollisionSound != invalidCollisionSoundUUID);
4747 scriptEvents CombinedEvents = AggregateScriptEvents; 4791 scriptEvents CombinedEvents = AggregateScriptEvents;
4748 4792
4749 // merge with root part 4793 // merge with root part
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index e18d9cf..eb68038 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -4779,7 +4779,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4779 public void llCollisionSound(string impact_sound, double impact_volume) 4779 public void llCollisionSound(string impact_sound, double impact_volume)
4780 { 4780 {
4781 m_host.AddScriptLPS(1); 4781 m_host.AddScriptLPS(1);
4782 4782
4783 if(impact_sound == "")
4784 {
4785 m_host.CollisionSoundVolume = (float)impact_volume;
4786 m_host.CollisionSound = m_host.invalidCollisionSoundUUID;
4787 return;
4788 }
4783 // TODO: Parameter check logic required. 4789 // TODO: Parameter check logic required.
4784 UUID soundId = UUID.Zero; 4790 UUID soundId = UUID.Zero;
4785 if (!UUID.TryParse(impact_sound, out soundId)) 4791 if (!UUID.TryParse(impact_sound, out soundId))
@@ -4795,8 +4801,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4795 } 4801 }
4796 m_host.TaskInventory.LockItemsForRead(false); 4802 m_host.TaskInventory.LockItemsForRead(false);
4797 } 4803 }
4798 m_host.CollisionSound = soundId;
4799 m_host.CollisionSoundVolume = (float)impact_volume; 4804 m_host.CollisionSoundVolume = (float)impact_volume;
4805 m_host.CollisionSound = soundId;
4800 } 4806 }
4801 4807
4802 public LSL_String llGetAnimation(string id) 4808 public LSL_String llGetAnimation(string id)
diff --git a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
index ff1f277..5e68d69 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
@@ -847,6 +847,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
847 SceneObjectPart part = Engine.World.GetSceneObjectPart(LocalID); 847 SceneObjectPart part = Engine.World.GetSceneObjectPart(LocalID);
848 part.Inventory.GetInventoryItem(ItemID).PermsMask = 0; 848 part.Inventory.GetInventoryItem(ItemID).PermsMask = 0;
849 part.Inventory.GetInventoryItem(ItemID).PermsGranter = UUID.Zero; 849 part.Inventory.GetInventoryItem(ItemID).PermsGranter = UUID.Zero;
850 part.CollisionSound = UUID.Zero;
850 AsyncCommandManager.RemoveScript(Engine, LocalID, ItemID); 851 AsyncCommandManager.RemoveScript(Engine, LocalID, ItemID);
851 EventQueue.Clear(); 852 EventQueue.Clear();
852 m_Script.ResetVars(); 853 m_Script.ResetVars();
@@ -873,6 +874,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
873 SceneObjectPart part = Engine.World.GetSceneObjectPart(LocalID); 874 SceneObjectPart part = Engine.World.GetSceneObjectPart(LocalID);
874 part.Inventory.GetInventoryItem(ItemID).PermsMask = 0; 875 part.Inventory.GetInventoryItem(ItemID).PermsMask = 0;
875 part.Inventory.GetInventoryItem(ItemID).PermsGranter = UUID.Zero; 876 part.Inventory.GetInventoryItem(ItemID).PermsGranter = UUID.Zero;
877 part.CollisionSound = UUID.Zero;
876 AsyncCommandManager.RemoveScript(Engine, LocalID, ItemID); 878 AsyncCommandManager.RemoveScript(Engine, LocalID, ItemID);
877 879
878 EventQueue.Clear(); 880 EventQueue.Clear();