aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--OpenSim/Region/Environment/Scenes/Scene.Inventory.cs64
-rw-r--r--OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs12
-rw-r--r--OpenSim/Region/ScriptEngine/Common/BuiltIn_Commands_BaseClass.cs4
-rw-r--r--OpenSim/Region/ScriptEngine/Common/LSL_BuiltIn_Commands.cs56
-rw-r--r--OpenSim/Region/ScriptEngine/Common/LSL_BuiltIn_Commands_Interface.cs2
5 files changed, 132 insertions, 6 deletions
diff --git a/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs b/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs
index 1c7e98e..ee52a66 100644
--- a/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs
@@ -1353,7 +1353,69 @@ namespace OpenSim.Region.Environment.Scenes
1353 } 1353 }
1354 return null; 1354 return null;
1355 } 1355 }
1356 1356
1357 public virtual SceneObjectGroup RezObject(TaskInventoryItem item, LLVector3 pos, LLQuaternion rot, LLVector3 vel, int param)
1358 {
1359 // Rez object
1360 if (item != null)
1361 {
1362 LLUUID ownerID = item.OwnerID;
1363
1364 if (!PermissionsMngr.CanRezObject(ownerID, pos))
1365 {
1366 return null;
1367 }
1368
1369 AssetBase rezAsset = AssetCache.GetAsset(item.AssetID, false);
1370
1371 if (rezAsset != null)
1372 {
1373 string xmlData = Helpers.FieldToUTF8String(rezAsset.Data);
1374 SceneObjectGroup group = new SceneObjectGroup(this, m_regionHandle, xmlData);
1375 group.ResetIDs();
1376 AddEntity(group);
1377
1378 // we set it's position in world.
1379 group.AbsolutePosition = pos;
1380
1381 SceneObjectPart rootPart = group.GetChildPart(group.UUID);
1382
1383 // Since renaming the item in the inventory does not affect the name stored
1384 // in the serialization, transfer the correct name from the inventory to the
1385 // object itself before we rez.
1386 rootPart.Name = item.Name;
1387 rootPart.Description = item.Description;
1388
1389 List<SceneObjectPart> partList = new List<SceneObjectPart>(group.Children.Values);
1390 foreach (SceneObjectPart part in partList)
1391 {
1392 if (part.OwnerID != item.OwnerID)
1393 {
1394 part.LastOwnerID = part.OwnerID;
1395 part.OwnerID = item.OwnerID;
1396 part.EveryoneMask = item.EveryoneMask;
1397 part.BaseMask = item.BaseMask;
1398 part.OwnerMask = item.OwnerMask;
1399 part.NextOwnerMask = item.NextOwnerMask;
1400 part.ChangeInventoryOwner(item.OwnerID);
1401 }
1402 }
1403 rootPart.TrimPermissions();
1404 if (group.RootPart.Shape.PCode == (byte)PCode.Prim)
1405 {
1406 group.ClearPartAttachmentData();
1407 }
1408 group.UpdateGroupRotation(rot);
1409 group.ApplyPhysics(m_physicalPrim);
1410 group.Velocity = vel;
1411 group.StartScripts();
1412 rootPart.ScheduleFullUpdate();
1413 return rootPart.ParentGroup;
1414 }
1415
1416 }
1417 return null;
1418 }
1357 1419
1358 } 1420 }
1359} 1421}
diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs
index 5d39790..9ed5990 100644
--- a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs
@@ -2526,5 +2526,17 @@ namespace OpenSim.Region.Environment.Scenes
2526 } 2526 }
2527 } 2527 }
2528 } 2528 }
2529 public float GetMass()
2530 {
2531 float retmass = 0f;
2532 lock (m_parts)
2533 {
2534 foreach (SceneObjectPart part in m_parts.Values)
2535 {
2536 retmass += part.GetMass();
2537 }
2538 }
2539 return retmass;
2540 }
2529 } 2541 }
2530} 2542}
diff --git a/OpenSim/Region/ScriptEngine/Common/BuiltIn_Commands_BaseClass.cs b/OpenSim/Region/ScriptEngine/Common/BuiltIn_Commands_BaseClass.cs
index f7cd697..49ddd3f 100644
--- a/OpenSim/Region/ScriptEngine/Common/BuiltIn_Commands_BaseClass.cs
+++ b/OpenSim/Region/ScriptEngine/Common/BuiltIn_Commands_BaseClass.cs
@@ -697,9 +697,9 @@ namespace OpenSim.Region.ScriptEngine.Common
697 m_LSL_Functions.llMakeFire(); 697 m_LSL_Functions.llMakeFire();
698 } 698 }
699 699
700 public void llRezObject(string inventory, vector pos, rotation rot, int param) 700 public void llRezObject(string inventory, vector pos, vector vel, rotation rot, int param)
701 { 701 {
702 m_LSL_Functions.llRezObject(inventory, pos, rot, param); 702 m_LSL_Functions.llRezObject(inventory, pos, vel, rot, param);
703 } 703 }
704 704
705 public void llLookAt(vector target, double strength, double damping) 705 public void llLookAt(vector target, double strength, double damping)
diff --git a/OpenSim/Region/ScriptEngine/Common/LSL_BuiltIn_Commands.cs b/OpenSim/Region/ScriptEngine/Common/LSL_BuiltIn_Commands.cs
index f0108f8..ca94dd7 100644
--- a/OpenSim/Region/ScriptEngine/Common/LSL_BuiltIn_Commands.cs
+++ b/OpenSim/Region/ScriptEngine/Common/LSL_BuiltIn_Commands.cs
@@ -1839,10 +1839,62 @@ namespace OpenSim.Region.ScriptEngine.Common
1839 NotImplemented("llMakeFire"); 1839 NotImplemented("llMakeFire");
1840 } 1840 }
1841 1841
1842 public void llRezObject(string inventory, LSL_Types.Vector3 pos, LSL_Types.Quaternion rot, int param) 1842 public void llRezObject(string inventory, LSL_Types.Vector3 pos, LSL_Types.Vector3 vel, LSL_Types.Quaternion rot, int param)
1843 { 1843 {
1844 m_host.AddScriptLPS(1); 1844 m_host.AddScriptLPS(1);
1845 NotImplemented("llRezObject"); 1845 //NotImplemented("llRezObject");
1846 bool found = false;
1847
1848 // Instead of using return;, I'm using continue; because in our TaskInventory implementation
1849 // it's possible to have two items with the same task inventory name.
1850 // this is an easter egg of sorts.
1851
1852 foreach (KeyValuePair<LLUUID, TaskInventoryItem> inv in m_host.TaskInventory)
1853 {
1854 if (inv.Value.Name == inventory)
1855 {
1856 // make sure we're an object.
1857 if (inv.Value.InvType != (int)InventoryType.Object)
1858 {
1859 llSay(0, "Unable to create requested object. Object is missing from database.");
1860 continue;
1861 }
1862
1863 LLVector3 llpos = new LLVector3((float)pos.x, (float)pos.y, (float)pos.z);
1864
1865 // test if we're further away then 10m
1866 if (Util.GetDistanceTo(llpos, m_host.AbsolutePosition) > 10)
1867 return; // wiki says, if it's further away then 10m, silently fail.
1868
1869 LLVector3 llvel = new LLVector3((float)vel.x, (float)vel.y, (float)vel.z);
1870
1871 // need the magnitude later
1872 float velmag = (float)Util.GetMagnitude(llvel);
1873
1874 SceneObjectGroup new_group = World.RezObject(inv.Value, llpos, new LLQuaternion((float)rot.x, (float)rot.y, (float)rot.z, (float)rot.s), llvel, param);
1875
1876 // If either of these are null, then there was an unknown error.
1877 if (new_group == null)
1878 continue;
1879 if (new_group.RootPart == null)
1880 continue;
1881
1882 // objects rezzed with this method are die_at_edge by default.
1883 new_group.RootPart.SetDieAtEdge(true);
1884
1885 m_ScriptEngine.m_EventQueueManager.AddToScriptQueue(m_localID, m_itemID, "object_rez", EventQueueManager.llDetectNull, new Object[] { new LSL_Types.LSLString(new_group.RootPart.UUID.ToString()) });
1886 float groupmass = new_group.GetMass();
1887
1888 //Recoil.
1889 llApplyImpulse(new LSL_Types.Vector3(llvel.X * groupmass, llvel.Y * groupmass, llvel.Z * groupmass), 0);
1890 found = true;
1891 //script delay
1892 System.Threading.Thread.Sleep((int)((groupmass * velmag) / 10));
1893 break;
1894 }
1895 }
1896 if (!found)
1897 llSay(0, "Could not find object " + inventory);
1846 } 1898 }
1847 1899
1848 public void llLookAt(LSL_Types.Vector3 target, double strength, double damping) 1900 public void llLookAt(LSL_Types.Vector3 target, double strength, double damping)
diff --git a/OpenSim/Region/ScriptEngine/Common/LSL_BuiltIn_Commands_Interface.cs b/OpenSim/Region/ScriptEngine/Common/LSL_BuiltIn_Commands_Interface.cs
index 6742ed5..115e4e8 100644
--- a/OpenSim/Region/ScriptEngine/Common/LSL_BuiltIn_Commands_Interface.cs
+++ b/OpenSim/Region/ScriptEngine/Common/LSL_BuiltIn_Commands_Interface.cs
@@ -190,7 +190,7 @@ namespace OpenSim.Region.ScriptEngine.Common
190 //wiki: (deprecated) 190 //wiki: (deprecated)
191 void llMakeFire(); 191 void llMakeFire();
192 //wiki: llRezObject(string inventory, vector pos, vector rel, rotation rot, integer param) 192 //wiki: llRezObject(string inventory, vector pos, vector rel, rotation rot, integer param)
193 void llRezObject(string inventory, LSL_Types.Vector3 pos, LSL_Types.Quaternion rot, int param); 193 void llRezObject(string inventory, LSL_Types.Vector3 pos, LSL_Types.Vector3 vel, LSL_Types.Quaternion rot, int param);
194 //wiki: llLookAt(vector target, double strength, double damping) 194 //wiki: llLookAt(vector target, double strength, double damping)
195 void llLookAt(LSL_Types.Vector3 target, double strength, double damping); 195 void llLookAt(LSL_Types.Vector3 target, double strength, double damping);
196 //wiki: llStopLookAt() 196 //wiki: llStopLookAt()