diff options
Diffstat (limited to 'OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs')
-rw-r--r-- | OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs | 150 |
1 files changed, 90 insertions, 60 deletions
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs index a2649ee..36cb09a 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs | |||
@@ -267,14 +267,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
267 | /// </summary> | 267 | /// </summary> |
268 | public void CreateScriptInstances(int startParam, bool postOnRez, string engine, int stateSource) | 268 | public void CreateScriptInstances(int startParam, bool postOnRez, string engine, int stateSource) |
269 | { | 269 | { |
270 | Items.LockItemsForRead(true); | 270 | List<TaskInventoryItem> scripts = GetInventoryItems(InventoryType.LSL); |
271 | IList<TaskInventoryItem> items = new List<TaskInventoryItem>(Items.Values); | 271 | foreach (TaskInventoryItem item in scripts) |
272 | Items.LockItemsForRead(false); | 272 | CreateScriptInstance(item, startParam, postOnRez, engine, stateSource); |
273 | foreach (TaskInventoryItem item in items) | ||
274 | { | ||
275 | if ((int)InventoryType.LSL == item.InvType) | ||
276 | CreateScriptInstance(item, startParam, postOnRez, engine, stateSource); | ||
277 | } | ||
278 | } | 273 | } |
279 | 274 | ||
280 | public ArrayList GetScriptErrors(UUID itemID) | 275 | public ArrayList GetScriptErrors(UUID itemID) |
@@ -305,17 +300,11 @@ namespace OpenSim.Region.Framework.Scenes | |||
305 | /// </param> | 300 | /// </param> |
306 | public void RemoveScriptInstances(bool sceneObjectBeingDeleted) | 301 | public void RemoveScriptInstances(bool sceneObjectBeingDeleted) |
307 | { | 302 | { |
308 | Items.LockItemsForRead(true); | 303 | List<TaskInventoryItem> scripts = GetInventoryItems(InventoryType.LSL); |
309 | IList<TaskInventoryItem> items = new List<TaskInventoryItem>(Items.Values); | 304 | foreach (TaskInventoryItem item in scripts) |
310 | Items.LockItemsForRead(false); | ||
311 | |||
312 | foreach (TaskInventoryItem item in items) | ||
313 | { | 305 | { |
314 | if ((int)InventoryType.LSL == item.InvType) | 306 | RemoveScriptInstance(item.ItemID, sceneObjectBeingDeleted); |
315 | { | 307 | m_part.RemoveScriptEvents(item.ItemID); |
316 | RemoveScriptInstance(item.ItemID, sceneObjectBeingDeleted); | ||
317 | m_part.RemoveScriptEvents(item.ItemID); | ||
318 | } | ||
319 | } | 308 | } |
320 | } | 309 | } |
321 | 310 | ||
@@ -1280,9 +1269,57 @@ namespace OpenSim.Region.Framework.Scenes | |||
1280 | return true; | 1269 | return true; |
1281 | } | 1270 | } |
1282 | } | 1271 | } |
1272 | |||
1283 | return false; | 1273 | return false; |
1284 | } | 1274 | } |
1285 | 1275 | ||
1276 | /// <summary> | ||
1277 | /// Returns the count of scripts in this parts inventory. | ||
1278 | /// </summary> | ||
1279 | /// <returns></returns> | ||
1280 | public int ScriptCount() | ||
1281 | { | ||
1282 | int count = 0; | ||
1283 | Items.LockItemsForRead(true); | ||
1284 | foreach (TaskInventoryItem item in m_items.Values) | ||
1285 | { | ||
1286 | if (item.InvType == (int)InventoryType.LSL) | ||
1287 | { | ||
1288 | count++; | ||
1289 | } | ||
1290 | } | ||
1291 | Items.LockItemsForRead(false); | ||
1292 | return count; | ||
1293 | } | ||
1294 | /// <summary> | ||
1295 | /// Returns the count of running scripts in this parts inventory. | ||
1296 | /// </summary> | ||
1297 | /// <returns></returns> | ||
1298 | public int RunningScriptCount() | ||
1299 | { | ||
1300 | IScriptModule[] engines = m_part.ParentGroup.Scene.RequestModuleInterfaces<IScriptModule>(); | ||
1301 | if (engines.Length == 0) | ||
1302 | return 0; | ||
1303 | |||
1304 | int count = 0; | ||
1305 | List<TaskInventoryItem> scripts = GetInventoryItems(InventoryType.LSL); | ||
1306 | |||
1307 | foreach (TaskInventoryItem item in scripts) | ||
1308 | { | ||
1309 | foreach (IScriptModule engine in engines) | ||
1310 | { | ||
1311 | if (engine != null) | ||
1312 | { | ||
1313 | if (engine.GetScriptState(item.ItemID)) | ||
1314 | { | ||
1315 | count++; | ||
1316 | } | ||
1317 | } | ||
1318 | } | ||
1319 | } | ||
1320 | return count; | ||
1321 | } | ||
1322 | |||
1286 | public List<UUID> GetInventoryList() | 1323 | public List<UUID> GetInventoryList() |
1287 | { | 1324 | { |
1288 | List<UUID> ret = new List<UUID>(); | 1325 | List<UUID> ret = new List<UUID>(); |
@@ -1297,22 +1334,24 @@ namespace OpenSim.Region.Framework.Scenes | |||
1297 | { | 1334 | { |
1298 | List<TaskInventoryItem> ret = new List<TaskInventoryItem>(); | 1335 | List<TaskInventoryItem> ret = new List<TaskInventoryItem>(); |
1299 | 1336 | ||
1300 | lock (m_items) | 1337 | Items.LockItemsForRead(true); |
1301 | ret = new List<TaskInventoryItem>(m_items.Values); | 1338 | ret = new List<TaskInventoryItem>(m_items.Values); |
1339 | Items.LockItemsForRead(false); | ||
1302 | 1340 | ||
1303 | return ret; | 1341 | return ret; |
1304 | } | 1342 | } |
1305 | 1343 | ||
1306 | public List<TaskInventoryItem> GetInventoryScripts() | 1344 | public List<TaskInventoryItem> GetInventoryItems(InventoryType type) |
1307 | { | 1345 | { |
1308 | List<TaskInventoryItem> ret = new List<TaskInventoryItem>(); | 1346 | List<TaskInventoryItem> ret = new List<TaskInventoryItem>(); |
1309 | 1347 | ||
1310 | lock (m_items) | 1348 | Items.LockItemsForRead(true); |
1311 | { | 1349 | |
1312 | foreach (TaskInventoryItem item in m_items.Values) | 1350 | foreach (TaskInventoryItem item in m_items.Values) |
1313 | if (item.InvType == (int)InventoryType.LSL) | 1351 | if (item.InvType == (int)type) |
1314 | ret.Add(item); | 1352 | ret.Add(item); |
1315 | } | 1353 | |
1354 | Items.LockItemsForRead(false); | ||
1316 | 1355 | ||
1317 | return ret; | 1356 | return ret; |
1318 | } | 1357 | } |
@@ -1334,35 +1373,32 @@ namespace OpenSim.Region.Framework.Scenes | |||
1334 | if (engines.Length == 0) // No engine at all | 1373 | if (engines.Length == 0) // No engine at all |
1335 | return ret; | 1374 | return ret; |
1336 | 1375 | ||
1337 | Items.LockItemsForRead(true); | 1376 | List<TaskInventoryItem> scripts = GetInventoryItems(InventoryType.LSL); |
1338 | foreach (TaskInventoryItem item in m_items.Values) | 1377 | |
1378 | foreach (TaskInventoryItem item in scripts) | ||
1339 | { | 1379 | { |
1340 | if (item.InvType == (int)InventoryType.LSL) | 1380 | foreach (IScriptModule e in engines) |
1341 | { | 1381 | { |
1342 | foreach (IScriptModule e in engines) | 1382 | if (e != null) |
1343 | { | 1383 | { |
1344 | if (e != null) | 1384 | string n = e.GetXMLState(item.ItemID); |
1385 | if (n != String.Empty) | ||
1345 | { | 1386 | { |
1346 | string n = e.GetXMLState(item.ItemID); | 1387 | if (oldIDs) |
1347 | if (n != String.Empty) | 1388 | { |
1389 | if (!ret.ContainsKey(item.OldItemID)) | ||
1390 | ret[item.OldItemID] = n; | ||
1391 | } | ||
1392 | else | ||
1348 | { | 1393 | { |
1349 | if (oldIDs) | 1394 | if (!ret.ContainsKey(item.ItemID)) |
1350 | { | 1395 | ret[item.ItemID] = n; |
1351 | if (!ret.ContainsKey(item.OldItemID)) | ||
1352 | ret[item.OldItemID] = n; | ||
1353 | } | ||
1354 | else | ||
1355 | { | ||
1356 | if (!ret.ContainsKey(item.ItemID)) | ||
1357 | ret[item.ItemID] = n; | ||
1358 | } | ||
1359 | break; | ||
1360 | } | 1396 | } |
1397 | break; | ||
1361 | } | 1398 | } |
1362 | } | 1399 | } |
1363 | } | 1400 | } |
1364 | } | 1401 | } |
1365 | Items.LockItemsForRead(false); | ||
1366 | return ret; | 1402 | return ret; |
1367 | } | 1403 | } |
1368 | 1404 | ||
@@ -1372,27 +1408,21 @@ namespace OpenSim.Region.Framework.Scenes | |||
1372 | if (engines.Length == 0) | 1408 | if (engines.Length == 0) |
1373 | return; | 1409 | return; |
1374 | 1410 | ||
1411 | List<TaskInventoryItem> scripts = GetInventoryItems(InventoryType.LSL); | ||
1375 | 1412 | ||
1376 | Items.LockItemsForRead(true); | 1413 | foreach (TaskInventoryItem item in scripts) |
1377 | |||
1378 | foreach (TaskInventoryItem item in m_items.Values) | ||
1379 | { | 1414 | { |
1380 | if (item.InvType == (int)InventoryType.LSL) | 1415 | foreach (IScriptModule engine in engines) |
1381 | { | 1416 | { |
1382 | foreach (IScriptModule engine in engines) | 1417 | if (engine != null) |
1383 | { | 1418 | { |
1384 | if (engine != null) | 1419 | if (item.OwnerChanged) |
1385 | { | 1420 | engine.PostScriptEvent(item.ItemID, "changed", new Object[] { (int)Changed.OWNER }); |
1386 | if (item.OwnerChanged) | 1421 | item.OwnerChanged = false; |
1387 | engine.PostScriptEvent(item.ItemID, "changed", new Object[] { (int)Changed.OWNER }); | 1422 | engine.ResumeScript(item.ItemID); |
1388 | item.OwnerChanged = false; | ||
1389 | engine.ResumeScript(item.ItemID); | ||
1390 | } | ||
1391 | } | 1423 | } |
1392 | } | 1424 | } |
1393 | } | 1425 | } |
1394 | |||
1395 | Items.LockItemsForRead(false); | ||
1396 | } | 1426 | } |
1397 | } | 1427 | } |
1398 | } | 1428 | } |