Merge branch 'master' into careminster-presence-refactor
This was rather conflicted. Please test linking.avinationmerge
commit
fc8d2be632
|
@ -89,7 +89,6 @@ namespace OpenSim.Data.MSSQL
|
|||
Dictionary<UUID, SceneObjectGroup> objects = new Dictionary<UUID, SceneObjectGroup>();
|
||||
SceneObjectGroup grp = null;
|
||||
|
||||
|
||||
string sql = "SELECT *, " +
|
||||
"sort = CASE WHEN prims.UUID = prims.SceneGroupID THEN 0 ELSE 1 END " +
|
||||
"FROM prims " +
|
||||
|
@ -232,7 +231,7 @@ namespace OpenSim.Data.MSSQL
|
|||
/// <param name="regionUUID"></param>
|
||||
public void StoreObject(SceneObjectGroup obj, UUID regionUUID)
|
||||
{
|
||||
_Log.InfoFormat("[MSSQL]: Adding/Changing SceneObjectGroup: {0} to region: {1}, object has {2} prims.", obj.UUID, regionUUID, obj.Children.Count);
|
||||
_Log.DebugFormat("[MSSQL]: Adding/Changing SceneObjectGroup: {0} to region: {1}, object has {2} prims.", obj.UUID, regionUUID, obj.Children.Count);
|
||||
|
||||
using (SqlConnection conn = new SqlConnection(m_connectionString))
|
||||
{
|
||||
|
@ -291,7 +290,6 @@ namespace OpenSim.Data.MSSQL
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
|
|
@ -239,6 +239,7 @@ namespace OpenSim.Data.MySQL
|
|||
|
||||
ExecuteNonQuery(cmd);
|
||||
}
|
||||
|
||||
cmd.Dispose();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -427,7 +427,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
|
|||
if (m_scene.TryGetScenePresence(remoteClient.AgentId, out presence))
|
||||
{
|
||||
if (!m_scene.Permissions.CanRezObject(
|
||||
part.ParentGroup.Children.Count, remoteClient.AgentId, presence.AbsolutePosition))
|
||||
part.ParentGroup.PrimCount, remoteClient.AgentId, presence.AbsolutePosition))
|
||||
return;
|
||||
|
||||
presence.Appearance.DetachAttachment(itemID);
|
||||
|
|
|
@ -549,7 +549,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
|
|||
}
|
||||
|
||||
if (!m_Scene.Permissions.CanRezObject(
|
||||
group.Children.Count, remoteClient.AgentId, pos)
|
||||
group.PrimCount, remoteClient.AgentId, pos)
|
||||
&& !attachment)
|
||||
{
|
||||
// The client operates in no fail mode. It will
|
||||
|
@ -629,7 +629,9 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
|
|||
rootPart.Name = item.Name;
|
||||
rootPart.Description = item.Description;
|
||||
|
||||
List<SceneObjectPart> partList = new List<SceneObjectPart>(group.Children.Values);
|
||||
List<SceneObjectPart> partList = null;
|
||||
lock (group.Children)
|
||||
partList = new List<SceneObjectPart>(group.Children.Values);
|
||||
|
||||
group.SetGroup(remoteClient.ActiveGroupId, remoteClient);
|
||||
if ((rootPart.OwnerID != item.Owner) || (item.CurrentPermissions & 16) != 0)
|
||||
|
|
|
@ -243,29 +243,29 @@ namespace OpenSim.Region.CoreModules.World.Archiver
|
|||
// to the same scene (when this is possible).
|
||||
sceneObject.ResetIDs();
|
||||
|
||||
foreach (SceneObjectPart part in sceneObject.Children.Values)
|
||||
lock (sceneObject.Children)
|
||||
{
|
||||
if (!ResolveUserUuid(part.CreatorID))
|
||||
part.CreatorID = m_scene.RegionInfo.EstateSettings.EstateOwner;
|
||||
|
||||
if (!ResolveUserUuid(part.OwnerID))
|
||||
part.OwnerID = m_scene.RegionInfo.EstateSettings.EstateOwner;
|
||||
|
||||
if (!ResolveUserUuid(part.LastOwnerID))
|
||||
part.LastOwnerID = m_scene.RegionInfo.EstateSettings.EstateOwner;
|
||||
|
||||
// And zap any troublesome sit target information
|
||||
part.SitTargetOrientation = new Quaternion(0, 0, 0, 1);
|
||||
part.SitTargetPosition = new Vector3(0, 0, 0);
|
||||
|
||||
// Fix ownership/creator of inventory items
|
||||
// Not doing so results in inventory items
|
||||
// being no copy/no mod for everyone
|
||||
part.TaskInventory.LockItemsForRead(true);
|
||||
TaskInventoryDictionary inv = part.TaskInventory;
|
||||
foreach (KeyValuePair<UUID, TaskInventoryItem> kvp in inv)
|
||||
foreach (SceneObjectPart part in sceneObject.Children.Values)
|
||||
{
|
||||
if (!ResolveUserUuid(kvp.Value.OwnerID))
|
||||
if (!ResolveUserUuid(part.CreatorID))
|
||||
part.CreatorID = m_scene.RegionInfo.EstateSettings.EstateOwner;
|
||||
|
||||
if (!ResolveUserUuid(part.OwnerID))
|
||||
part.OwnerID = m_scene.RegionInfo.EstateSettings.EstateOwner;
|
||||
|
||||
if (!ResolveUserUuid(part.LastOwnerID))
|
||||
part.LastOwnerID = m_scene.RegionInfo.EstateSettings.EstateOwner;
|
||||
|
||||
// And zap any troublesome sit target information
|
||||
part.SitTargetOrientation = new Quaternion(0, 0, 0, 1);
|
||||
part.SitTargetPosition = new Vector3(0, 0, 0);
|
||||
|
||||
// Fix ownership/creator of inventory items
|
||||
// Not doing so results in inventory items
|
||||
// being no copy/no mod for everyone
|
||||
part.TaskInventory.LockItemsForRead(true);
|
||||
TaskInventoryDictionary inv = part.TaskInventory;
|
||||
foreach (KeyValuePair<UUID, TaskInventoryItem> kvp in inv)
|
||||
{
|
||||
if (!ResolveUserUuid(kvp.Value.OwnerID))
|
||||
{
|
||||
|
@ -276,8 +276,8 @@ namespace OpenSim.Region.CoreModules.World.Archiver
|
|||
kvp.Value.CreatorID = m_scene.RegionInfo.EstateSettings.EstateOwner;
|
||||
}
|
||||
}
|
||||
part.TaskInventory.LockItemsForRead(false);
|
||||
}
|
||||
part.TaskInventory.LockItemsForRead(false);
|
||||
}
|
||||
|
||||
if (m_scene.AddRestoredSceneObject(sceneObject, true, false))
|
||||
|
|
|
@ -128,7 +128,10 @@ namespace OpenSim.Region.CoreModules.World.Objects.BuySell
|
|||
group.SetOwnerId(remoteClient.AgentId);
|
||||
group.SetRootPartOwner(part, remoteClient.AgentId, remoteClient.ActiveGroupId);
|
||||
|
||||
List<SceneObjectPart> partList = new List<SceneObjectPart>(group.Children.Values);
|
||||
List<SceneObjectPart> partList = null;
|
||||
|
||||
lock (group.Children)
|
||||
partList = new List<SceneObjectPart>(group.Children.Values);
|
||||
|
||||
if (m_scene.Permissions.PropagatePermissions())
|
||||
{
|
||||
|
|
|
@ -227,277 +227,281 @@ namespace OpenSim.Region.CoreModules.World.WorldMap
|
|||
{
|
||||
SceneObjectGroup mapdot = (SceneObjectGroup)obj;
|
||||
Color mapdotspot = Color.Gray; // Default color when prim color is white
|
||||
|
||||
// Loop over prim in group
|
||||
foreach (SceneObjectPart part in mapdot.Children.Values)
|
||||
lock (mapdot.Children)
|
||||
{
|
||||
if (part == null)
|
||||
continue;
|
||||
|
||||
// Draw if the object is at least 1 meter wide in any direction
|
||||
if (part.Scale.X > 1f || part.Scale.Y > 1f || part.Scale.Z > 1f)
|
||||
foreach (SceneObjectPart part in mapdot.Children.Values)
|
||||
{
|
||||
// Try to get the RGBA of the default texture entry..
|
||||
//
|
||||
try
|
||||
if (part == null)
|
||||
continue;
|
||||
|
||||
// Draw if the object is at least 1 meter wide in any direction
|
||||
if (part.Scale.X > 1f || part.Scale.Y > 1f || part.Scale.Z > 1f)
|
||||
{
|
||||
// get the null checks out of the way
|
||||
// skip the ones that break
|
||||
if (part == null)
|
||||
continue;
|
||||
|
||||
if (part.Shape == null)
|
||||
continue;
|
||||
|
||||
if (part.Shape.PCode == (byte)PCode.Tree || part.Shape.PCode == (byte)PCode.NewTree || part.Shape.PCode == (byte)PCode.Grass)
|
||||
continue; // eliminates trees from this since we don't really have a good tree representation
|
||||
// if you want tree blocks on the map comment the above line and uncomment the below line
|
||||
//mapdotspot = Color.PaleGreen;
|
||||
|
||||
Primitive.TextureEntry textureEntry = part.Shape.Textures;
|
||||
|
||||
if (textureEntry == null || textureEntry.DefaultTexture == null)
|
||||
continue;
|
||||
|
||||
Color4 texcolor = textureEntry.DefaultTexture.RGBA;
|
||||
|
||||
// Not sure why some of these are null, oh well.
|
||||
|
||||
int colorr = 255 - (int)(texcolor.R * 255f);
|
||||
int colorg = 255 - (int)(texcolor.G * 255f);
|
||||
int colorb = 255 - (int)(texcolor.B * 255f);
|
||||
|
||||
if (!(colorr == 255 && colorg == 255 && colorb == 255))
|
||||
// Try to get the RGBA of the default texture entry..
|
||||
//
|
||||
try
|
||||
{
|
||||
//Try to set the map spot color
|
||||
try
|
||||
{
|
||||
// If the color gets goofy somehow, skip it *shakes fist at Color4
|
||||
mapdotspot = Color.FromArgb(colorr, colorg, colorb);
|
||||
}
|
||||
catch (ArgumentException)
|
||||
// get the null checks out of the way
|
||||
// skip the ones that break
|
||||
if (part == null)
|
||||
continue;
|
||||
|
||||
if (part.Shape == null)
|
||||
continue;
|
||||
|
||||
if (part.Shape.PCode == (byte)PCode.Tree || part.Shape.PCode == (byte)PCode.NewTree || part.Shape.PCode == (byte)PCode.Grass)
|
||||
continue; // eliminates trees from this since we don't really have a good tree representation
|
||||
// if you want tree blocks on the map comment the above line and uncomment the below line
|
||||
//mapdotspot = Color.PaleGreen;
|
||||
|
||||
Primitive.TextureEntry textureEntry = part.Shape.Textures;
|
||||
|
||||
if (textureEntry == null || textureEntry.DefaultTexture == null)
|
||||
continue;
|
||||
|
||||
Color4 texcolor = textureEntry.DefaultTexture.RGBA;
|
||||
|
||||
// Not sure why some of these are null, oh well.
|
||||
|
||||
int colorr = 255 - (int)(texcolor.R * 255f);
|
||||
int colorg = 255 - (int)(texcolor.G * 255f);
|
||||
int colorb = 255 - (int)(texcolor.B * 255f);
|
||||
|
||||
if (!(colorr == 255 && colorg == 255 && colorb == 255))
|
||||
{
|
||||
//Try to set the map spot color
|
||||
try
|
||||
{
|
||||
// If the color gets goofy somehow, skip it *shakes fist at Color4
|
||||
mapdotspot = Color.FromArgb(colorr, colorg, colorb);
|
||||
}
|
||||
catch (ArgumentException)
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (IndexOutOfRangeException)
|
||||
{
|
||||
// Windows Array
|
||||
}
|
||||
catch (ArgumentOutOfRangeException)
|
||||
{
|
||||
// Mono Array
|
||||
}
|
||||
|
||||
Vector3 pos = part.GetWorldPosition();
|
||||
|
||||
// skip prim outside of retion
|
||||
if (pos.X < 0f || pos.X > 256f || pos.Y < 0f || pos.Y > 256f)
|
||||
continue;
|
||||
|
||||
// skip prim in non-finite position
|
||||
if (Single.IsNaN(pos.X) || Single.IsNaN(pos.Y) ||
|
||||
Single.IsInfinity(pos.X) || Single.IsInfinity(pos.Y))
|
||||
continue;
|
||||
|
||||
// Figure out if object is under 256m above the height of the terrain
|
||||
bool isBelow256AboveTerrain = false;
|
||||
|
||||
try
|
||||
{
|
||||
isBelow256AboveTerrain = (pos.Z < ((float)hm[(int)pos.X, (int)pos.Y] + 256f));
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
}
|
||||
|
||||
if (isBelow256AboveTerrain)
|
||||
{
|
||||
// Translate scale by rotation so scale is represented properly when object is rotated
|
||||
Vector3 lscale = new Vector3(part.Shape.Scale.X, part.Shape.Scale.Y, part.Shape.Scale.Z);
|
||||
Vector3 scale = new Vector3();
|
||||
Vector3 tScale = new Vector3();
|
||||
Vector3 axPos = new Vector3(pos.X,pos.Y,pos.Z);
|
||||
|
||||
Quaternion llrot = part.GetWorldRotation();
|
||||
Quaternion rot = new Quaternion(llrot.W, llrot.X, llrot.Y, llrot.Z);
|
||||
scale = lscale * rot;
|
||||
|
||||
// negative scales don't work in this situation
|
||||
scale.X = Math.Abs(scale.X);
|
||||
scale.Y = Math.Abs(scale.Y);
|
||||
scale.Z = Math.Abs(scale.Z);
|
||||
|
||||
// This scaling isn't very accurate and doesn't take into account the face rotation :P
|
||||
int mapdrawstartX = (int)(pos.X - scale.X);
|
||||
int mapdrawstartY = (int)(pos.Y - scale.Y);
|
||||
int mapdrawendX = (int)(pos.X + scale.X);
|
||||
int mapdrawendY = (int)(pos.Y + scale.Y);
|
||||
|
||||
// If object is beyond the edge of the map, don't draw it to avoid errors
|
||||
if (mapdrawstartX < 0 || mapdrawstartX > ((int)Constants.RegionSize - 1) || mapdrawendX < 0 || mapdrawendX > ((int)Constants.RegionSize - 1)
|
||||
|| mapdrawstartY < 0 || mapdrawstartY > ((int)Constants.RegionSize - 1) || mapdrawendY < 0
|
||||
|| mapdrawendY > ((int)Constants.RegionSize - 1))
|
||||
continue;
|
||||
|
||||
#region obb face reconstruction part duex
|
||||
Vector3[] vertexes = new Vector3[8];
|
||||
|
||||
// float[] distance = new float[6];
|
||||
Vector3[] FaceA = new Vector3[6]; // vertex A for Facei
|
||||
Vector3[] FaceB = new Vector3[6]; // vertex B for Facei
|
||||
Vector3[] FaceC = new Vector3[6]; // vertex C for Facei
|
||||
Vector3[] FaceD = new Vector3[6]; // vertex D for Facei
|
||||
|
||||
tScale = new Vector3(lscale.X, -lscale.Y, lscale.Z);
|
||||
scale = ((tScale * rot));
|
||||
vertexes[0] = (new Vector3((pos.X + scale.X), (pos.Y + scale.Y), (pos.Z + scale.Z)));
|
||||
// vertexes[0].x = pos.X + vertexes[0].x;
|
||||
//vertexes[0].y = pos.Y + vertexes[0].y;
|
||||
//vertexes[0].z = pos.Z + vertexes[0].z;
|
||||
|
||||
FaceA[0] = vertexes[0];
|
||||
FaceB[3] = vertexes[0];
|
||||
FaceA[4] = vertexes[0];
|
||||
|
||||
tScale = lscale;
|
||||
scale = ((tScale * rot));
|
||||
vertexes[1] = (new Vector3((pos.X + scale.X), (pos.Y + scale.Y), (pos.Z + scale.Z)));
|
||||
|
||||
// vertexes[1].x = pos.X + vertexes[1].x;
|
||||
// vertexes[1].y = pos.Y + vertexes[1].y;
|
||||
//vertexes[1].z = pos.Z + vertexes[1].z;
|
||||
|
||||
FaceB[0] = vertexes[1];
|
||||
FaceA[1] = vertexes[1];
|
||||
FaceC[4] = vertexes[1];
|
||||
|
||||
tScale = new Vector3(lscale.X, -lscale.Y, -lscale.Z);
|
||||
scale = ((tScale * rot));
|
||||
|
||||
vertexes[2] = (new Vector3((pos.X + scale.X), (pos.Y + scale.Y), (pos.Z + scale.Z)));
|
||||
|
||||
//vertexes[2].x = pos.X + vertexes[2].x;
|
||||
//vertexes[2].y = pos.Y + vertexes[2].y;
|
||||
//vertexes[2].z = pos.Z + vertexes[2].z;
|
||||
|
||||
FaceC[0] = vertexes[2];
|
||||
FaceD[3] = vertexes[2];
|
||||
FaceC[5] = vertexes[2];
|
||||
|
||||
tScale = new Vector3(lscale.X, lscale.Y, -lscale.Z);
|
||||
scale = ((tScale * rot));
|
||||
vertexes[3] = (new Vector3((pos.X + scale.X), (pos.Y + scale.Y), (pos.Z + scale.Z)));
|
||||
|
||||
//vertexes[3].x = pos.X + vertexes[3].x;
|
||||
// vertexes[3].y = pos.Y + vertexes[3].y;
|
||||
// vertexes[3].z = pos.Z + vertexes[3].z;
|
||||
|
||||
FaceD[0] = vertexes[3];
|
||||
FaceC[1] = vertexes[3];
|
||||
FaceA[5] = vertexes[3];
|
||||
|
||||
tScale = new Vector3(-lscale.X, lscale.Y, lscale.Z);
|
||||
scale = ((tScale * rot));
|
||||
vertexes[4] = (new Vector3((pos.X + scale.X), (pos.Y + scale.Y), (pos.Z + scale.Z)));
|
||||
|
||||
// vertexes[4].x = pos.X + vertexes[4].x;
|
||||
// vertexes[4].y = pos.Y + vertexes[4].y;
|
||||
// vertexes[4].z = pos.Z + vertexes[4].z;
|
||||
|
||||
FaceB[1] = vertexes[4];
|
||||
FaceA[2] = vertexes[4];
|
||||
FaceD[4] = vertexes[4];
|
||||
|
||||
tScale = new Vector3(-lscale.X, lscale.Y, -lscale.Z);
|
||||
scale = ((tScale * rot));
|
||||
vertexes[5] = (new Vector3((pos.X + scale.X), (pos.Y + scale.Y), (pos.Z + scale.Z)));
|
||||
|
||||
// vertexes[5].x = pos.X + vertexes[5].x;
|
||||
// vertexes[5].y = pos.Y + vertexes[5].y;
|
||||
// vertexes[5].z = pos.Z + vertexes[5].z;
|
||||
|
||||
FaceD[1] = vertexes[5];
|
||||
FaceC[2] = vertexes[5];
|
||||
FaceB[5] = vertexes[5];
|
||||
|
||||
tScale = new Vector3(-lscale.X, -lscale.Y, lscale.Z);
|
||||
scale = ((tScale * rot));
|
||||
vertexes[6] = (new Vector3((pos.X + scale.X), (pos.Y + scale.Y), (pos.Z + scale.Z)));
|
||||
|
||||
// vertexes[6].x = pos.X + vertexes[6].x;
|
||||
// vertexes[6].y = pos.Y + vertexes[6].y;
|
||||
// vertexes[6].z = pos.Z + vertexes[6].z;
|
||||
|
||||
FaceB[2] = vertexes[6];
|
||||
FaceA[3] = vertexes[6];
|
||||
FaceB[4] = vertexes[6];
|
||||
|
||||
tScale = new Vector3(-lscale.X, -lscale.Y, -lscale.Z);
|
||||
scale = ((tScale * rot));
|
||||
vertexes[7] = (new Vector3((pos.X + scale.X), (pos.Y + scale.Y), (pos.Z + scale.Z)));
|
||||
|
||||
// vertexes[7].x = pos.X + vertexes[7].x;
|
||||
// vertexes[7].y = pos.Y + vertexes[7].y;
|
||||
// vertexes[7].z = pos.Z + vertexes[7].z;
|
||||
|
||||
FaceD[2] = vertexes[7];
|
||||
FaceC[3] = vertexes[7];
|
||||
FaceD[5] = vertexes[7];
|
||||
#endregion
|
||||
|
||||
//int wy = 0;
|
||||
|
||||
//bool breakYN = false; // If we run into an error drawing, break out of the
|
||||
// loop so we don't lag to death on error handling
|
||||
DrawStruct ds = new DrawStruct();
|
||||
ds.brush = new SolidBrush(mapdotspot);
|
||||
//ds.rect = new Rectangle(mapdrawstartX, (255 - mapdrawstartY), mapdrawendX - mapdrawstartX, mapdrawendY - mapdrawstartY);
|
||||
|
||||
ds.trns = new face[FaceA.Length];
|
||||
|
||||
for (int i = 0; i < FaceA.Length; i++)
|
||||
catch (IndexOutOfRangeException)
|
||||
{
|
||||
Point[] working = new Point[5];
|
||||
working[0] = project(FaceA[i], axPos);
|
||||
working[1] = project(FaceB[i], axPos);
|
||||
working[2] = project(FaceD[i], axPos);
|
||||
working[3] = project(FaceC[i], axPos);
|
||||
working[4] = project(FaceA[i], axPos);
|
||||
|
||||
face workingface = new face();
|
||||
workingface.pts = working;
|
||||
|
||||
ds.trns[i] = workingface;
|
||||
// Windows Array
|
||||
}
|
||||
|
||||
z_sort.Add(part.LocalId, ds);
|
||||
z_localIDs.Add(part.LocalId);
|
||||
z_sortheights.Add(pos.Z);
|
||||
|
||||
//for (int wx = mapdrawstartX; wx < mapdrawendX; wx++)
|
||||
//{
|
||||
//for (wy = mapdrawstartY; wy < mapdrawendY; wy++)
|
||||
catch (ArgumentOutOfRangeException)
|
||||
{
|
||||
// Mono Array
|
||||
}
|
||||
|
||||
Vector3 pos = part.GetWorldPosition();
|
||||
|
||||
// skip prim outside of retion
|
||||
if (pos.X < 0f || pos.X > 256f || pos.Y < 0f || pos.Y > 256f)
|
||||
continue;
|
||||
|
||||
// skip prim in non-finite position
|
||||
if (Single.IsNaN(pos.X) || Single.IsNaN(pos.Y) ||
|
||||
Single.IsInfinity(pos.X) || Single.IsInfinity(pos.Y))
|
||||
continue;
|
||||
|
||||
// Figure out if object is under 256m above the height of the terrain
|
||||
bool isBelow256AboveTerrain = false;
|
||||
|
||||
try
|
||||
{
|
||||
isBelow256AboveTerrain = (pos.Z < ((float)hm[(int)pos.X, (int)pos.Y] + 256f));
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
}
|
||||
|
||||
if (isBelow256AboveTerrain)
|
||||
{
|
||||
// Translate scale by rotation so scale is represented properly when object is rotated
|
||||
Vector3 lscale = new Vector3(part.Shape.Scale.X, part.Shape.Scale.Y, part.Shape.Scale.Z);
|
||||
Vector3 scale = new Vector3();
|
||||
Vector3 tScale = new Vector3();
|
||||
Vector3 axPos = new Vector3(pos.X,pos.Y,pos.Z);
|
||||
|
||||
Quaternion llrot = part.GetWorldRotation();
|
||||
Quaternion rot = new Quaternion(llrot.W, llrot.X, llrot.Y, llrot.Z);
|
||||
scale = lscale * rot;
|
||||
|
||||
// negative scales don't work in this situation
|
||||
scale.X = Math.Abs(scale.X);
|
||||
scale.Y = Math.Abs(scale.Y);
|
||||
scale.Z = Math.Abs(scale.Z);
|
||||
|
||||
// This scaling isn't very accurate and doesn't take into account the face rotation :P
|
||||
int mapdrawstartX = (int)(pos.X - scale.X);
|
||||
int mapdrawstartY = (int)(pos.Y - scale.Y);
|
||||
int mapdrawendX = (int)(pos.X + scale.X);
|
||||
int mapdrawendY = (int)(pos.Y + scale.Y);
|
||||
|
||||
// If object is beyond the edge of the map, don't draw it to avoid errors
|
||||
if (mapdrawstartX < 0 || mapdrawstartX > ((int)Constants.RegionSize - 1) || mapdrawendX < 0 || mapdrawendX > ((int)Constants.RegionSize - 1)
|
||||
|| mapdrawstartY < 0 || mapdrawstartY > ((int)Constants.RegionSize - 1) || mapdrawendY < 0
|
||||
|| mapdrawendY > ((int)Constants.RegionSize - 1))
|
||||
continue;
|
||||
|
||||
#region obb face reconstruction part duex
|
||||
Vector3[] vertexes = new Vector3[8];
|
||||
|
||||
// float[] distance = new float[6];
|
||||
Vector3[] FaceA = new Vector3[6]; // vertex A for Facei
|
||||
Vector3[] FaceB = new Vector3[6]; // vertex B for Facei
|
||||
Vector3[] FaceC = new Vector3[6]; // vertex C for Facei
|
||||
Vector3[] FaceD = new Vector3[6]; // vertex D for Facei
|
||||
|
||||
tScale = new Vector3(lscale.X, -lscale.Y, lscale.Z);
|
||||
scale = ((tScale * rot));
|
||||
vertexes[0] = (new Vector3((pos.X + scale.X), (pos.Y + scale.Y), (pos.Z + scale.Z)));
|
||||
// vertexes[0].x = pos.X + vertexes[0].x;
|
||||
//vertexes[0].y = pos.Y + vertexes[0].y;
|
||||
//vertexes[0].z = pos.Z + vertexes[0].z;
|
||||
|
||||
FaceA[0] = vertexes[0];
|
||||
FaceB[3] = vertexes[0];
|
||||
FaceA[4] = vertexes[0];
|
||||
|
||||
tScale = lscale;
|
||||
scale = ((tScale * rot));
|
||||
vertexes[1] = (new Vector3((pos.X + scale.X), (pos.Y + scale.Y), (pos.Z + scale.Z)));
|
||||
|
||||
// vertexes[1].x = pos.X + vertexes[1].x;
|
||||
// vertexes[1].y = pos.Y + vertexes[1].y;
|
||||
//vertexes[1].z = pos.Z + vertexes[1].z;
|
||||
|
||||
FaceB[0] = vertexes[1];
|
||||
FaceA[1] = vertexes[1];
|
||||
FaceC[4] = vertexes[1];
|
||||
|
||||
tScale = new Vector3(lscale.X, -lscale.Y, -lscale.Z);
|
||||
scale = ((tScale * rot));
|
||||
|
||||
vertexes[2] = (new Vector3((pos.X + scale.X), (pos.Y + scale.Y), (pos.Z + scale.Z)));
|
||||
|
||||
//vertexes[2].x = pos.X + vertexes[2].x;
|
||||
//vertexes[2].y = pos.Y + vertexes[2].y;
|
||||
//vertexes[2].z = pos.Z + vertexes[2].z;
|
||||
|
||||
FaceC[0] = vertexes[2];
|
||||
FaceD[3] = vertexes[2];
|
||||
FaceC[5] = vertexes[2];
|
||||
|
||||
tScale = new Vector3(lscale.X, lscale.Y, -lscale.Z);
|
||||
scale = ((tScale * rot));
|
||||
vertexes[3] = (new Vector3((pos.X + scale.X), (pos.Y + scale.Y), (pos.Z + scale.Z)));
|
||||
|
||||
//vertexes[3].x = pos.X + vertexes[3].x;
|
||||
// vertexes[3].y = pos.Y + vertexes[3].y;
|
||||
// vertexes[3].z = pos.Z + vertexes[3].z;
|
||||
|
||||
FaceD[0] = vertexes[3];
|
||||
FaceC[1] = vertexes[3];
|
||||
FaceA[5] = vertexes[3];
|
||||
|
||||
tScale = new Vector3(-lscale.X, lscale.Y, lscale.Z);
|
||||
scale = ((tScale * rot));
|
||||
vertexes[4] = (new Vector3((pos.X + scale.X), (pos.Y + scale.Y), (pos.Z + scale.Z)));
|
||||
|
||||
// vertexes[4].x = pos.X + vertexes[4].x;
|
||||
// vertexes[4].y = pos.Y + vertexes[4].y;
|
||||
// vertexes[4].z = pos.Z + vertexes[4].z;
|
||||
|
||||
FaceB[1] = vertexes[4];
|
||||
FaceA[2] = vertexes[4];
|
||||
FaceD[4] = vertexes[4];
|
||||
|
||||
tScale = new Vector3(-lscale.X, lscale.Y, -lscale.Z);
|
||||
scale = ((tScale * rot));
|
||||
vertexes[5] = (new Vector3((pos.X + scale.X), (pos.Y + scale.Y), (pos.Z + scale.Z)));
|
||||
|
||||
// vertexes[5].x = pos.X + vertexes[5].x;
|
||||
// vertexes[5].y = pos.Y + vertexes[5].y;
|
||||
// vertexes[5].z = pos.Z + vertexes[5].z;
|
||||
|
||||
FaceD[1] = vertexes[5];
|
||||
FaceC[2] = vertexes[5];
|
||||
FaceB[5] = vertexes[5];
|
||||
|
||||
tScale = new Vector3(-lscale.X, -lscale.Y, lscale.Z);
|
||||
scale = ((tScale * rot));
|
||||
vertexes[6] = (new Vector3((pos.X + scale.X), (pos.Y + scale.Y), (pos.Z + scale.Z)));
|
||||
|
||||
// vertexes[6].x = pos.X + vertexes[6].x;
|
||||
// vertexes[6].y = pos.Y + vertexes[6].y;
|
||||
// vertexes[6].z = pos.Z + vertexes[6].z;
|
||||
|
||||
FaceB[2] = vertexes[6];
|
||||
FaceA[3] = vertexes[6];
|
||||
FaceB[4] = vertexes[6];
|
||||
|
||||
tScale = new Vector3(-lscale.X, -lscale.Y, -lscale.Z);
|
||||
scale = ((tScale * rot));
|
||||
vertexes[7] = (new Vector3((pos.X + scale.X), (pos.Y + scale.Y), (pos.Z + scale.Z)));
|
||||
|
||||
// vertexes[7].x = pos.X + vertexes[7].x;
|
||||
// vertexes[7].y = pos.Y + vertexes[7].y;
|
||||
// vertexes[7].z = pos.Z + vertexes[7].z;
|
||||
|
||||
FaceD[2] = vertexes[7];
|
||||
FaceC[3] = vertexes[7];
|
||||
FaceD[5] = vertexes[7];
|
||||
#endregion
|
||||
|
||||
//int wy = 0;
|
||||
|
||||
//bool breakYN = false; // If we run into an error drawing, break out of the
|
||||
// loop so we don't lag to death on error handling
|
||||
DrawStruct ds = new DrawStruct();
|
||||
ds.brush = new SolidBrush(mapdotspot);
|
||||
//ds.rect = new Rectangle(mapdrawstartX, (255 - mapdrawstartY), mapdrawendX - mapdrawstartX, mapdrawendY - mapdrawstartY);
|
||||
|
||||
ds.trns = new face[FaceA.Length];
|
||||
|
||||
for (int i = 0; i < FaceA.Length; i++)
|
||||
{
|
||||
Point[] working = new Point[5];
|
||||
working[0] = project(FaceA[i], axPos);
|
||||
working[1] = project(FaceB[i], axPos);
|
||||
working[2] = project(FaceD[i], axPos);
|
||||
working[3] = project(FaceC[i], axPos);
|
||||
working[4] = project(FaceA[i], axPos);
|
||||
|
||||
face workingface = new face();
|
||||
workingface.pts = working;
|
||||
|
||||
ds.trns[i] = workingface;
|
||||
}
|
||||
|
||||
z_sort.Add(part.LocalId, ds);
|
||||
z_localIDs.Add(part.LocalId);
|
||||
z_sortheights.Add(pos.Z);
|
||||
|
||||
//for (int wx = mapdrawstartX; wx < mapdrawendX; wx++)
|
||||
//{
|
||||
//m_log.InfoFormat("[MAPDEBUG]: {0},{1}({2})", wx, (255 - wy),wy);
|
||||
//try
|
||||
//for (wy = mapdrawstartY; wy < mapdrawendY; wy++)
|
||||
//{
|
||||
// Remember, flip the y!
|
||||
// mapbmp.SetPixel(wx, (255 - wy), mapdotspot);
|
||||
//m_log.InfoFormat("[MAPDEBUG]: {0},{1}({2})", wx, (255 - wy),wy);
|
||||
//try
|
||||
//{
|
||||
// Remember, flip the y!
|
||||
// mapbmp.SetPixel(wx, (255 - wy), mapdotspot);
|
||||
//}
|
||||
//catch (ArgumentException)
|
||||
//{
|
||||
// breakYN = true;
|
||||
//}
|
||||
|
||||
//if (breakYN)
|
||||
// break;
|
||||
//}
|
||||
//catch (ArgumentException)
|
||||
//{
|
||||
// breakYN = true;
|
||||
//}
|
||||
|
||||
|
||||
//if (breakYN)
|
||||
// break;
|
||||
//}
|
||||
|
||||
//if (breakYN)
|
||||
// break;
|
||||
//}
|
||||
} // Object is within 256m Z of terrain
|
||||
} // object is at least a meter wide
|
||||
} // Object is within 256m Z of terrain
|
||||
} // object is at least a meter wide
|
||||
} // mapdot.Children lock
|
||||
} // loop over group children
|
||||
} // entitybase is sceneobject group
|
||||
} // foreach loop over entities
|
||||
|
|
|
@ -29,6 +29,7 @@ using System.Collections.Generic;
|
|||
using System.Collections;
|
||||
using OpenMetaverse;
|
||||
using OpenSim.Framework;
|
||||
using OpenSim.Region.Framework.Scenes;
|
||||
|
||||
namespace OpenSim.Region.Framework.Interfaces
|
||||
{
|
||||
|
@ -155,6 +156,17 @@ namespace OpenSim.Region.Framework.Interfaces
|
|||
/// If no inventory item has that name then an empty list is returned.
|
||||
/// </returns>
|
||||
IList<TaskInventoryItem> GetInventoryItems(string name);
|
||||
|
||||
/// <summary>
|
||||
/// Get the scene object referenced by an inventory item.
|
||||
/// </summary>
|
||||
///
|
||||
/// This is returned in a 'rez ready' state. That is, name, description, permissions and other details have
|
||||
/// been adjusted to reflect the part and item from which it originates.
|
||||
///
|
||||
/// <param name="item"></param>
|
||||
/// <returns>The scene object. Null if the scene object asset couldn't be found</returns>
|
||||
SceneObjectGroup GetRezReadySceneObject(TaskInventoryItem item);
|
||||
|
||||
/// <summary>
|
||||
/// Update an existing inventory item.
|
||||
|
|
|
@ -2022,60 +2022,13 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
if (null == item)
|
||||
return null;
|
||||
|
||||
UUID ownerID = item.OwnerID;
|
||||
AssetBase rezAsset = AssetService.Get(item.AssetID.ToString());
|
||||
|
||||
if (null == rezAsset)
|
||||
return null;
|
||||
|
||||
string xmlData = Utils.BytesToString(rezAsset.Data);
|
||||
SceneObjectGroup group = SceneObjectSerializer.FromOriginalXmlFormat(xmlData);
|
||||
|
||||
if (!Permissions.CanRezObject(group.Children.Count, ownerID, pos))
|
||||
return null;
|
||||
|
||||
group.ResetIDs();
|
||||
|
||||
SceneObjectPart rootPart = group.GetChildPart(group.UUID);
|
||||
|
||||
// Since renaming the item in the inventory does not affect the name stored
|
||||
// in the serialization, transfer the correct name from the inventory to the
|
||||
// object itself before we rez.
|
||||
rootPart.Name = item.Name;
|
||||
rootPart.Description = item.Description;
|
||||
|
||||
List<SceneObjectPart> partList = new List<SceneObjectPart>(group.Children.Values);
|
||||
|
||||
group.SetGroup(sourcePart.GroupID, null);
|
||||
|
||||
if ((rootPart.OwnerID != item.OwnerID) || (item.CurrentPermissions & 16) != 0)
|
||||
{
|
||||
if (Permissions.PropagatePermissions())
|
||||
{
|
||||
foreach (SceneObjectPart part in partList)
|
||||
{
|
||||
part.EveryoneMask = item.EveryonePermissions;
|
||||
part.NextOwnerMask = item.NextPermissions;
|
||||
}
|
||||
|
||||
group.ApplyNextOwnerPermissions();
|
||||
}
|
||||
}
|
||||
|
||||
foreach (SceneObjectPart part in partList)
|
||||
{
|
||||
if ((part.OwnerID != item.OwnerID) || (item.CurrentPermissions & 16) != 0)
|
||||
{
|
||||
part.LastOwnerID = part.OwnerID;
|
||||
part.OwnerID = item.OwnerID;
|
||||
part.Inventory.ChangeInventoryOwner(item.OwnerID);
|
||||
}
|
||||
|
||||
part.EveryoneMask = item.EveryonePermissions;
|
||||
part.NextOwnerMask = item.NextPermissions;
|
||||
}
|
||||
SceneObjectGroup group = sourcePart.Inventory.GetRezReadySceneObject(item);
|
||||
|
||||
rootPart.TrimPermissions();
|
||||
if (null == group)
|
||||
return null;
|
||||
|
||||
if (!Permissions.CanRezObject(group.PrimCount, item.OwnerID, pos))
|
||||
return null;
|
||||
|
||||
if (!Permissions.BypassPermissions())
|
||||
{
|
||||
|
@ -2091,7 +2044,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
|
||||
group.ScheduleGroupForFullUpdate();
|
||||
|
||||
return rootPart.ParentGroup;
|
||||
return group;
|
||||
}
|
||||
|
||||
public virtual bool returnObjects(SceneObjectGroup[] returnobjects, UUID AgentId)
|
||||
|
@ -2151,8 +2104,11 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
sog.SetGroup(groupID, remoteClient);
|
||||
sog.ScheduleGroupForFullUpdate();
|
||||
|
||||
foreach (SceneObjectPart child in sog.Children.Values)
|
||||
child.Inventory.ChangeInventoryOwner(ownerID);
|
||||
lock (sog.Children)
|
||||
{
|
||||
foreach (SceneObjectPart child in sog.Children.Values)
|
||||
child.Inventory.ChangeInventoryOwner(ownerID);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -2162,16 +2118,18 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
if (sog.GroupID != groupID)
|
||||
continue;
|
||||
|
||||
foreach (SceneObjectPart child in sog.Children.Values)
|
||||
lock (sog.Children)
|
||||
{
|
||||
child.LastOwnerID = child.OwnerID;
|
||||
child.Inventory.ChangeInventoryOwner(groupID);
|
||||
foreach (SceneObjectPart child in sog.Children.Values)
|
||||
{
|
||||
child.LastOwnerID = child.OwnerID;
|
||||
child.Inventory.ChangeInventoryOwner(groupID);
|
||||
}
|
||||
}
|
||||
|
||||
sog.SetOwnerId(groupID);
|
||||
sog.ApplyNextOwnerPermissions();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
foreach (uint localID in localIDs)
|
||||
|
|
|
@ -156,21 +156,29 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
}
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
// We also need to check the children of this prim as they
|
||||
// can be selected as well and send property information
|
||||
bool foundPrim = false;
|
||||
foreach (KeyValuePair<UUID, SceneObjectPart> child in ((SceneObjectGroup) ent).Children)
|
||||
{
|
||||
if (child.Value.LocalId == primLocalID)
|
||||
{
|
||||
child.Value.GetProperties(remoteClient);
|
||||
foundPrim = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (foundPrim) break;
|
||||
else
|
||||
{
|
||||
// We also need to check the children of this prim as they
|
||||
// can be selected as well and send property information
|
||||
bool foundPrim = false;
|
||||
|
||||
SceneObjectGroup sog = ent as SceneObjectGroup;
|
||||
|
||||
lock (sog.Children)
|
||||
{
|
||||
foreach (KeyValuePair<UUID, SceneObjectPart> child in (sog.Children))
|
||||
{
|
||||
if (child.Value.LocalId == primLocalID)
|
||||
{
|
||||
child.Value.GetProperties(remoteClient);
|
||||
foundPrim = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (foundPrim)
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1790,8 +1790,9 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
|
||||
if (group.RootPart == null)
|
||||
{
|
||||
m_log.ErrorFormat("[SCENE]: Found a SceneObjectGroup with m_rootPart == null and {0} children",
|
||||
group.Children == null ? 0 : group.Children.Count);
|
||||
m_log.ErrorFormat(
|
||||
"[SCENE]: Found a SceneObjectGroup with m_rootPart == null and {0} children",
|
||||
group.Children == null ? 0 : group.PrimCount);
|
||||
}
|
||||
|
||||
AddRestoredSceneObject(group, true, true);
|
||||
|
@ -2130,18 +2131,22 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
group.RemoveScriptInstances(true);
|
||||
}
|
||||
|
||||
foreach (SceneObjectPart part in group.Children.Values)
|
||||
lock (group.Children)
|
||||
{
|
||||
if (part.IsJoint() && ((part.Flags & PrimFlags.Physics) != 0))
|
||||
foreach (SceneObjectPart part in group.Children.Values)
|
||||
{
|
||||
PhysicsScene.RequestJointDeletion(part.Name); // FIXME: what if the name changed?
|
||||
}
|
||||
else if (part.PhysActor != null)
|
||||
{
|
||||
PhysicsScene.RemovePrim(part.PhysActor);
|
||||
part.PhysActor = null;
|
||||
if (part.IsJoint() && ((part.Flags & PrimFlags.Physics) != 0))
|
||||
{
|
||||
PhysicsScene.RequestJointDeletion(part.Name); // FIXME: what if the name changed?
|
||||
}
|
||||
else if (part.PhysActor != null)
|
||||
{
|
||||
PhysicsScene.RemovePrim(part.PhysActor);
|
||||
part.PhysActor = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// if (rootPart.PhysActor != null)
|
||||
// {
|
||||
// PhysicsScene.RemovePrim(rootPart.PhysActor);
|
||||
|
@ -2498,14 +2503,16 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
|
||||
// Force allocation of new LocalId
|
||||
//
|
||||
foreach (SceneObjectPart p in sceneObject.Children.Values)
|
||||
p.LocalId = 0;
|
||||
lock (sceneObject.Children)
|
||||
{
|
||||
foreach (SceneObjectPart p in sceneObject.Children.Values)
|
||||
p.LocalId = 0;
|
||||
}
|
||||
|
||||
if (sceneObject.IsAttachmentCheckFull()) // Attachment
|
||||
{
|
||||
sceneObject.RootPart.AddFlag(PrimFlags.TemporaryOnRez);
|
||||
sceneObject.RootPart.AddFlag(PrimFlags.Phantom);
|
||||
|
||||
|
||||
// Don't sent a full update here because this will cause full updates to be sent twice for
|
||||
// attachments on region crossings, resulting in viewer glitches.
|
||||
|
@ -2519,7 +2526,6 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
|
||||
if (sp != null)
|
||||
{
|
||||
|
||||
SceneObjectGroup grp = sceneObject;
|
||||
|
||||
m_log.DebugFormat(
|
||||
|
|
|
@ -384,34 +384,35 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
// "[SCENE GRAPH]: Adding object {0} {1} to region {2}",
|
||||
// sceneObject.Name, sceneObject.UUID, m_parentScene.RegionInfo.RegionName);
|
||||
|
||||
if (m_parentScene.m_clampPrimSize)
|
||||
lock (sceneObject.Children)
|
||||
{
|
||||
foreach (SceneObjectPart part in sceneObject.Children.Values)
|
||||
if (m_parentScene.m_clampPrimSize)
|
||||
{
|
||||
Vector3 scale = part.Shape.Scale;
|
||||
|
||||
if (scale.X > m_parentScene.m_maxNonphys)
|
||||
scale.X = m_parentScene.m_maxNonphys;
|
||||
if (scale.Y > m_parentScene.m_maxNonphys)
|
||||
scale.Y = m_parentScene.m_maxNonphys;
|
||||
if (scale.Z > m_parentScene.m_maxNonphys)
|
||||
scale.Z = m_parentScene.m_maxNonphys;
|
||||
|
||||
part.Shape.Scale = scale;
|
||||
foreach (SceneObjectPart part in sceneObject.Children.Values)
|
||||
{
|
||||
Vector3 scale = part.Shape.Scale;
|
||||
|
||||
if (scale.X > m_parentScene.m_maxNonphys)
|
||||
scale.X = m_parentScene.m_maxNonphys;
|
||||
if (scale.Y > m_parentScene.m_maxNonphys)
|
||||
scale.Y = m_parentScene.m_maxNonphys;
|
||||
if (scale.Z > m_parentScene.m_maxNonphys)
|
||||
scale.Z = m_parentScene.m_maxNonphys;
|
||||
|
||||
part.Shape.Scale = scale;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
sceneObject.AttachToScene(m_parentScene);
|
||||
|
||||
if (sendClientUpdates)
|
||||
sceneObject.ScheduleGroupForFullUpdate();
|
||||
|
||||
Entities.Add(sceneObject);
|
||||
m_numPrim += sceneObject.Children.Count;
|
||||
|
||||
sceneObject.AttachToScene(m_parentScene);
|
||||
|
||||
if (attachToBackup)
|
||||
{
|
||||
sceneObject.AttachToBackup();
|
||||
if (sendClientUpdates)
|
||||
sceneObject.ScheduleGroupForFullUpdate();
|
||||
|
||||
Entities.Add(sceneObject);
|
||||
m_numPrim += sceneObject.Children.Count;
|
||||
|
||||
if (attachToBackup)
|
||||
sceneObject.AttachToBackup();
|
||||
}
|
||||
|
||||
if (OnObjectCreate != null)
|
||||
|
@ -448,10 +449,10 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
|
||||
if (!resultOfObjectLinked)
|
||||
{
|
||||
m_numPrim -= ((SceneObjectGroup) Entities[uuid]).Children.Count;
|
||||
m_numPrim -= grp.PrimCount;
|
||||
|
||||
if ((grp.RootPart.Flags & PrimFlags.Physics) == PrimFlags.Physics)
|
||||
RemovePhysicalPrim(grp.Children.Count);
|
||||
RemovePhysicalPrim(grp.PrimCount);
|
||||
}
|
||||
|
||||
if (OnObjectRemove != null)
|
||||
|
@ -966,8 +967,12 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
{
|
||||
if (SceneObjectGroupsByFullID.TryGetValue(fullID, out sog))
|
||||
{
|
||||
if (sog.Children.ContainsKey(fullID))
|
||||
return sog;
|
||||
lock (sog.Children)
|
||||
{
|
||||
if (sog.Children.ContainsKey(fullID))
|
||||
return sog;
|
||||
}
|
||||
|
||||
SceneObjectGroupsByFullID.Remove(fullID);
|
||||
}
|
||||
}
|
||||
|
@ -1678,7 +1683,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
{
|
||||
if (part != null)
|
||||
{
|
||||
if (part.ParentGroup.Children.Count != 1) // Skip single
|
||||
if (part.ParentGroup.PrimCount != 1) // Skip single
|
||||
{
|
||||
if (part.LinkNum < 2) // Root
|
||||
rootParts.Add(part);
|
||||
|
@ -1717,8 +1722,15 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
// However, editing linked parts and unlinking may be different
|
||||
//
|
||||
SceneObjectGroup group = root.ParentGroup;
|
||||
List<SceneObjectPart> newSet = new List<SceneObjectPart>(group.Children.Values);
|
||||
int numChildren = group.Children.Count;
|
||||
|
||||
List<SceneObjectPart> newSet = null;
|
||||
int numChildren = -1;
|
||||
|
||||
lock (group.Children)
|
||||
{
|
||||
newSet = new List<SceneObjectPart>(group.Children.Values);
|
||||
numChildren = group.PrimCount;
|
||||
}
|
||||
|
||||
// If there are prims left in a link set, but the root is
|
||||
// slated for unlink, we need to do this
|
||||
|
@ -1808,12 +1820,17 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
{
|
||||
if (ent is SceneObjectGroup)
|
||||
{
|
||||
foreach (KeyValuePair<UUID, SceneObjectPart> subent in ((SceneObjectGroup)ent).Children)
|
||||
SceneObjectGroup sog = ent as SceneObjectGroup;
|
||||
|
||||
lock (sog.Children)
|
||||
{
|
||||
if (subent.Value.LocalId == localID)
|
||||
foreach (KeyValuePair<UUID, SceneObjectPart> subent in sog.Children)
|
||||
{
|
||||
objid = subent.Key;
|
||||
obj = subent.Value;
|
||||
if (subent.Value.LocalId == localID)
|
||||
{
|
||||
objid = subent.Key;
|
||||
obj = subent.Value;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1878,7 +1895,8 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
SceneObjectGroup original = GetGroupByPrim(originalPrimID);
|
||||
if (original != null)
|
||||
{
|
||||
if (m_parentScene.Permissions.CanDuplicateObject(original.Children.Count, original.UUID, AgentID, original.AbsolutePosition))
|
||||
if (m_parentScene.Permissions.CanDuplicateObject(
|
||||
original.PrimCount, original.UUID, AgentID, original.AbsolutePosition))
|
||||
{
|
||||
SceneObjectGroup copy = original.Copy(true);
|
||||
copy.AbsolutePosition = copy.AbsolutePosition + offset;
|
||||
|
|
|
@ -360,7 +360,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
/// </summary>
|
||||
public int PrimCount
|
||||
{
|
||||
get { return m_parts.Count; }
|
||||
get { lock (m_parts) { return m_parts.Count; } }
|
||||
}
|
||||
|
||||
protected Quaternion m_rotation = Quaternion.Identity;
|
||||
|
@ -398,6 +398,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
|
||||
/// <value>
|
||||
/// The parts of this scene object group. You must lock this property before using it.
|
||||
/// If you want to know the number of children, consider using the PrimCount property instead
|
||||
/// </value>
|
||||
public Dictionary<UUID, SceneObjectPart> Children
|
||||
{
|
||||
|
@ -521,7 +522,16 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
public override UUID UUID
|
||||
{
|
||||
get { return m_rootPart.UUID; }
|
||||
set { m_rootPart.UUID = value; }
|
||||
set
|
||||
{
|
||||
m_rootPart.UUID = value;
|
||||
|
||||
lock (m_parts)
|
||||
{
|
||||
m_parts.Remove(m_rootPart.UUID);
|
||||
m_parts.Add(m_rootPart.UUID, m_rootPart);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public UUID OwnerID
|
||||
|
@ -742,21 +752,23 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
if (m_rootPart.LocalId == 0)
|
||||
m_rootPart.LocalId = m_scene.AllocateLocalId();
|
||||
|
||||
// No need to lock here since the object isn't yet in a scene
|
||||
foreach (SceneObjectPart part in m_parts.Values)
|
||||
lock (m_parts)
|
||||
{
|
||||
if (Object.ReferenceEquals(part, m_rootPart))
|
||||
foreach (SceneObjectPart part in m_parts.Values)
|
||||
{
|
||||
continue;
|
||||
if (Object.ReferenceEquals(part, m_rootPart))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if (part.LocalId == 0)
|
||||
{
|
||||
part.LocalId = m_scene.AllocateLocalId();
|
||||
}
|
||||
|
||||
part.ParentID = m_rootPart.LocalId;
|
||||
//m_log.DebugFormat("[SCENE]: Given local id {0} to part {1}, linknum {2}, parent {3} {4}", part.LocalId, part.UUID, part.LinkNum, part.ParentID, part.ParentUUID);
|
||||
}
|
||||
|
||||
if (part.LocalId == 0)
|
||||
{
|
||||
part.LocalId = m_scene.AllocateLocalId();
|
||||
}
|
||||
|
||||
part.ParentID = m_rootPart.LocalId;
|
||||
//m_log.DebugFormat("[SCENE]: Given local id {0} to part {1}, linknum {2}, parent {3} {4}", part.LocalId, part.UUID, part.LinkNum, part.ParentID, part.ParentUUID);
|
||||
}
|
||||
|
||||
ApplyPhysics(m_scene.m_physicalPrim);
|
||||
|
@ -1238,9 +1250,12 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
m_rootPart.AttachedAvatar = agentID;
|
||||
|
||||
//Anakin Lohner bug #3839
|
||||
foreach (SceneObjectPart p in m_parts.Values)
|
||||
lock (m_parts)
|
||||
{
|
||||
p.AttachedAvatar = agentID;
|
||||
foreach (SceneObjectPart p in m_parts.Values)
|
||||
{
|
||||
p.AttachedAvatar = agentID;
|
||||
}
|
||||
}
|
||||
|
||||
if (m_rootPart.PhysActor != null)
|
||||
|
@ -1308,10 +1323,14 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
|
||||
AbsolutePosition = detachedpos;
|
||||
m_rootPart.AttachedAvatar = UUID.Zero;
|
||||
//Anakin Lohner bug #3839
|
||||
foreach (SceneObjectPart p in m_parts.Values)
|
||||
|
||||
//Anakin Lohner bug #3839
|
||||
lock (m_parts)
|
||||
{
|
||||
p.AttachedAvatar = UUID.Zero;
|
||||
foreach (SceneObjectPart p in m_parts.Values)
|
||||
{
|
||||
p.AttachedAvatar = UUID.Zero;
|
||||
}
|
||||
}
|
||||
|
||||
m_rootPart.SetParentLocalId(0);
|
||||
|
@ -1337,10 +1356,14 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
}
|
||||
|
||||
m_rootPart.AttachedAvatar = UUID.Zero;
|
||||
|
||||
//Anakin Lohner bug #3839
|
||||
foreach (SceneObjectPart p in m_parts.Values)
|
||||
lock (m_parts)
|
||||
{
|
||||
p.AttachedAvatar = UUID.Zero;
|
||||
foreach (SceneObjectPart p in m_parts.Values)
|
||||
{
|
||||
p.AttachedAvatar = UUID.Zero;
|
||||
}
|
||||
}
|
||||
|
||||
m_rootPart.SetParentLocalId(0);
|
||||
|
@ -1406,9 +1429,8 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
part.ParentID = 0;
|
||||
part.LinkNum = 0;
|
||||
|
||||
// No locking required since the SOG should not be in the scene yet - one can't change root parts after
|
||||
// the scene object has been attached to the scene
|
||||
m_parts.Add(m_rootPart.UUID, m_rootPart);
|
||||
lock (m_parts)
|
||||
m_parts.Add(m_rootPart.UUID, m_rootPart);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -1928,14 +1950,14 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// Copy the given part as the root part of this scene object.
|
||||
/// </summary>
|
||||
/// <param name="part"></param>
|
||||
/// <param name="cAgentID"></param>
|
||||
/// <param name="cGroupID"></param>
|
||||
public void CopyRootPart(SceneObjectPart part, UUID cAgentID, UUID cGroupID, bool userExposed)
|
||||
{
|
||||
SetRootPart(part.Copy(m_scene.AllocateLocalId(), OwnerID, GroupID, m_parts.Count, userExposed));
|
||||
SetRootPart(part.Copy(m_scene.AllocateLocalId(), OwnerID, GroupID, 0, userExposed));
|
||||
}
|
||||
|
||||
public void ScriptSetPhysicsStatus(bool UsePhysics)
|
||||
|
@ -2234,14 +2256,15 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
/// </summary>
|
||||
public void ResetIDs()
|
||||
{
|
||||
// As this is only ever called for prims which are not currently part of the scene (and hence
|
||||
// not accessible by clients), there should be no need to lock
|
||||
List<SceneObjectPart> partsList = new List<SceneObjectPart>(m_parts.Values);
|
||||
m_parts.Clear();
|
||||
foreach (SceneObjectPart part in partsList)
|
||||
lock (m_parts)
|
||||
{
|
||||
part.ResetIDs(part.LinkNum); // Don't change link nums
|
||||
m_parts.Add(part.UUID, part);
|
||||
List<SceneObjectPart> partsList = new List<SceneObjectPart>(m_parts.Values);
|
||||
m_parts.Clear();
|
||||
foreach (SceneObjectPart part in partsList)
|
||||
{
|
||||
part.ResetIDs(part.LinkNum); // Don't change link nums
|
||||
m_parts.Add(part.UUID, part);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2479,10 +2502,15 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
public SceneObjectPart GetChildPart(UUID primID)
|
||||
{
|
||||
SceneObjectPart childPart = null;
|
||||
if (m_parts.ContainsKey(primID))
|
||||
|
||||
lock (m_parts)
|
||||
{
|
||||
childPart = m_parts[primID];
|
||||
if (m_parts.ContainsKey(primID))
|
||||
{
|
||||
childPart = m_parts[primID];
|
||||
}
|
||||
}
|
||||
|
||||
return childPart;
|
||||
}
|
||||
|
||||
|
@ -2519,9 +2547,10 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
/// <returns></returns>
|
||||
public bool HasChildPrim(UUID primID)
|
||||
{
|
||||
if (m_parts.ContainsKey(primID))
|
||||
lock (m_parts)
|
||||
{
|
||||
return true;
|
||||
if (m_parts.ContainsKey(primID))
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
|
@ -3132,9 +3161,11 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
public void UpdatePermissions(UUID AgentID, byte field, uint localID,
|
||||
uint mask, byte addRemTF)
|
||||
{
|
||||
foreach (SceneObjectPart part in m_parts.Values)
|
||||
part.UpdatePermissions(AgentID, field, localID, mask,
|
||||
addRemTF);
|
||||
lock (m_parts)
|
||||
{
|
||||
foreach (SceneObjectPart part in m_parts.Values)
|
||||
part.UpdatePermissions(AgentID, field, localID, mask, addRemTF);
|
||||
}
|
||||
|
||||
HasGroupChanged = true;
|
||||
}
|
||||
|
|
|
@ -37,6 +37,7 @@ using log4net;
|
|||
using OpenSim.Framework;
|
||||
using OpenSim.Region.Framework.Interfaces;
|
||||
using OpenSim.Region.Framework.Scenes.Scripting;
|
||||
using OpenSim.Region.Framework.Scenes.Serialization;
|
||||
|
||||
namespace OpenSim.Region.Framework.Scenes
|
||||
{
|
||||
|
@ -722,6 +723,71 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
return items;
|
||||
}
|
||||
|
||||
public SceneObjectGroup GetRezReadySceneObject(TaskInventoryItem item)
|
||||
{
|
||||
UUID ownerID = item.OwnerID;
|
||||
AssetBase rezAsset = m_part.ParentGroup.Scene.AssetService.Get(item.AssetID.ToString());
|
||||
|
||||
if (null == rezAsset)
|
||||
{
|
||||
m_log.WarnFormat(
|
||||
"[PRIM INVENTORY]: Could not find asset {0} for inventory item {1} in {2}",
|
||||
item.AssetID, item.Name, m_part.Name);
|
||||
return null;
|
||||
}
|
||||
|
||||
string xmlData = Utils.BytesToString(rezAsset.Data);
|
||||
SceneObjectGroup group = SceneObjectSerializer.FromOriginalXmlFormat(xmlData);
|
||||
|
||||
group.ResetIDs();
|
||||
|
||||
SceneObjectPart rootPart = group.GetChildPart(group.UUID);
|
||||
|
||||
// Since renaming the item in the inventory does not affect the name stored
|
||||
// in the serialization, transfer the correct name from the inventory to the
|
||||
// object itself before we rez.
|
||||
rootPart.Name = item.Name;
|
||||
rootPart.Description = item.Description;
|
||||
|
||||
List<SceneObjectPart> partList = null;
|
||||
|
||||
lock (group.Children)
|
||||
partList = new List<SceneObjectPart>(group.Children.Values);
|
||||
|
||||
group.SetGroup(m_part.GroupID, null);
|
||||
|
||||
if ((rootPart.OwnerID != item.OwnerID) || (item.CurrentPermissions & 16) != 0)
|
||||
{
|
||||
if (m_part.ParentGroup.Scene.Permissions.PropagatePermissions())
|
||||
{
|
||||
foreach (SceneObjectPart part in partList)
|
||||
{
|
||||
part.EveryoneMask = item.EveryonePermissions;
|
||||
part.NextOwnerMask = item.NextPermissions;
|
||||
}
|
||||
|
||||
group.ApplyNextOwnerPermissions();
|
||||
}
|
||||
}
|
||||
|
||||
foreach (SceneObjectPart part in partList)
|
||||
{
|
||||
if ((part.OwnerID != item.OwnerID) || (item.CurrentPermissions & 16) != 0)
|
||||
{
|
||||
part.LastOwnerID = part.OwnerID;
|
||||
part.OwnerID = item.OwnerID;
|
||||
part.Inventory.ChangeInventoryOwner(item.OwnerID);
|
||||
}
|
||||
|
||||
part.EveryoneMask = item.EveryonePermissions;
|
||||
part.NextOwnerMask = item.NextPermissions;
|
||||
}
|
||||
|
||||
rootPart.TrimPermissions();
|
||||
|
||||
return group;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Update an existing inventory item.
|
||||
/// </summary>
|
||||
|
@ -1197,6 +1263,5 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
|
||||
Items.LockItemsForRead(false);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
|
@ -121,16 +121,19 @@ namespace OpenSim.Region.OptionalModules.ContentManagement
|
|||
continue;
|
||||
temp = (SceneObjectGroup) currObj;
|
||||
|
||||
if (m_CMEntityHash.ContainsKey(temp.UUID))
|
||||
lock (temp.Children)
|
||||
{
|
||||
foreach (SceneObjectPart part in temp.Children.Values)
|
||||
if (!((ContentManagementEntity)m_CMEntityHash[temp.UUID]).HasChildPrim(part.UUID))
|
||||
if (m_CMEntityHash.ContainsKey(temp.UUID))
|
||||
{
|
||||
foreach (SceneObjectPart part in temp.Children.Values)
|
||||
if (!((ContentManagementEntity)m_CMEntityHash[temp.UUID]).HasChildPrim(part.UUID))
|
||||
missingList.Add(part);
|
||||
}
|
||||
else //Entire group is missing from revision. (and is a new part in region)
|
||||
{
|
||||
foreach (SceneObjectPart part in temp.Children.Values)
|
||||
missingList.Add(part);
|
||||
}
|
||||
else //Entire group is missing from revision. (and is a new part in region)
|
||||
{
|
||||
foreach (SceneObjectPart part in temp.Children.Values)
|
||||
missingList.Add(part);
|
||||
}
|
||||
}
|
||||
}
|
||||
return missingList;
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/*
|
||||
/*
|
||||
* Copyright (c) Contributors, http://opensimulator.org/
|
||||
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
||||
*
|
||||
|
@ -167,9 +167,12 @@ namespace OpenSim.Region.OptionalModules.ContentManagement
|
|||
public void RemoveOrUpdateDeletedEntity(SceneObjectGroup group)
|
||||
{
|
||||
// Deal with new parts not revisioned that have been deleted.
|
||||
foreach (SceneObjectPart part in group.Children.Values)
|
||||
if (m_MetaEntityCollection.Auras.ContainsKey(part.UUID))
|
||||
m_MetaEntityCollection.RemoveNewlyCreatedEntityAura(part.UUID);
|
||||
lock (group.Children)
|
||||
{
|
||||
foreach (SceneObjectPart part in group.Children.Values)
|
||||
if (m_MetaEntityCollection.Auras.ContainsKey(part.UUID))
|
||||
m_MetaEntityCollection.RemoveNewlyCreatedEntityAura(part.UUID);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -207,8 +210,13 @@ namespace OpenSim.Region.OptionalModules.ContentManagement
|
|||
{
|
||||
temp = SceneObjectSerializer.FromXml2Format(xml);
|
||||
temp.SetScene(scene);
|
||||
foreach (SceneObjectPart part in temp.Children.Values)
|
||||
part.RegionHandle = scene.RegionInfo.RegionHandle;
|
||||
|
||||
lock (temp.Children)
|
||||
{
|
||||
foreach (SceneObjectPart part in temp.Children.Values)
|
||||
part.RegionHandle = scene.RegionInfo.RegionHandle;
|
||||
}
|
||||
|
||||
ReplacementList.Add(temp.UUID, (EntityBase)temp);
|
||||
}
|
||||
catch (Exception e)
|
||||
|
@ -338,15 +346,20 @@ namespace OpenSim.Region.OptionalModules.ContentManagement
|
|||
System.Collections.ArrayList auraList = new System.Collections.ArrayList();
|
||||
if (group == null)
|
||||
return null;
|
||||
foreach (SceneObjectPart part in group.Children.Values)
|
||||
|
||||
lock (group.Children)
|
||||
{
|
||||
if (m_MetaEntityCollection.Auras.ContainsKey(part.UUID))
|
||||
foreach (SceneObjectPart part in group.Children.Values)
|
||||
{
|
||||
((AuraMetaEntity)m_MetaEntityCollection.Auras[part.UUID]).SetAura(new Vector3(0,254,0), part.Scale);
|
||||
((AuraMetaEntity)m_MetaEntityCollection.Auras[part.UUID]).RootPart.GroupPosition = part.GetWorldPosition();
|
||||
auraList.Add((AuraMetaEntity)m_MetaEntityCollection.Auras[part.UUID]);
|
||||
if (m_MetaEntityCollection.Auras.ContainsKey(part.UUID))
|
||||
{
|
||||
((AuraMetaEntity)m_MetaEntityCollection.Auras[part.UUID]).SetAura(new Vector3(0,254,0), part.Scale);
|
||||
((AuraMetaEntity)m_MetaEntityCollection.Auras[part.UUID]).RootPart.GroupPosition = part.GetWorldPosition();
|
||||
auraList.Add((AuraMetaEntity)m_MetaEntityCollection.Auras[part.UUID]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return auraList;
|
||||
}
|
||||
|
||||
|
|
|
@ -186,9 +186,12 @@ namespace OpenSim.Region.OptionalModules.ContentManagement
|
|||
((ContentManagementEntity)m_model.MetaEntityCollection.Entities[group.UUID]).SendFullDiffUpdateToAll();
|
||||
|
||||
// Deal with new parts not revisioned that have been deleted.
|
||||
foreach (SceneObjectPart part in group.Children.Values)
|
||||
if (m_model.MetaEntityCollection.Auras.ContainsKey(part.UUID))
|
||||
((AuraMetaEntity)m_model.MetaEntityCollection.Auras[part.UUID]).HideFromAll();
|
||||
lock (group.Children)
|
||||
{
|
||||
foreach (SceneObjectPart part in group.Children.Values)
|
||||
if (m_model.MetaEntityCollection.Auras.ContainsKey(part.UUID))
|
||||
((AuraMetaEntity)m_model.MetaEntityCollection.Auras[part.UUID]).HideFromAll();
|
||||
}
|
||||
}
|
||||
|
||||
public void SendMetaEntitiesToNewClient(IClientAPI client)
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/*
|
||||
/*
|
||||
* Copyright (c) Contributors, http://opensimulator.org/
|
||||
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
||||
*
|
||||
|
@ -132,30 +132,33 @@ namespace OpenSim.Region.OptionalModules.ContentManagement
|
|||
// if group is not contained in scene's list
|
||||
if (!ContainsKey(sceneEntityList, m_UnchangedEntity.UUID))
|
||||
{
|
||||
foreach (SceneObjectPart part in m_UnchangedEntity.Children.Values)
|
||||
lock (m_UnchangedEntity.Children)
|
||||
{
|
||||
// if scene list no longer contains this part, display translucent part and mark with red aura
|
||||
if (!ContainsKey(sceneEntityList, part.UUID))
|
||||
foreach (SceneObjectPart part in m_UnchangedEntity.Children.Values)
|
||||
{
|
||||
// if already displaying a red aura over part, make sure its red
|
||||
if (m_AuraEntities.ContainsKey(part.UUID))
|
||||
// if scene list no longer contains this part, display translucent part and mark with red aura
|
||||
if (!ContainsKey(sceneEntityList, part.UUID))
|
||||
{
|
||||
m_AuraEntities[part.UUID].SetAura(new Vector3(254,0,0), part.Scale);
|
||||
// if already displaying a red aura over part, make sure its red
|
||||
if (m_AuraEntities.ContainsKey(part.UUID))
|
||||
{
|
||||
m_AuraEntities[part.UUID].SetAura(new Vector3(254,0,0), part.Scale);
|
||||
}
|
||||
else
|
||||
{
|
||||
AuraMetaEntity auraGroup = new AuraMetaEntity(m_Entity.Scene,
|
||||
part.GetWorldPosition(),
|
||||
MetaEntity.TRANSLUCENT,
|
||||
new Vector3(254,0,0),
|
||||
part.Scale
|
||||
);
|
||||
m_AuraEntities.Add(part.UUID, auraGroup);
|
||||
}
|
||||
SceneObjectPart metaPart = m_Entity.GetLinkNumPart(part.LinkNum);
|
||||
SetPartTransparency(metaPart, MetaEntity.TRANSLUCENT);
|
||||
}
|
||||
else
|
||||
{
|
||||
AuraMetaEntity auraGroup = new AuraMetaEntity(m_Entity.Scene,
|
||||
part.GetWorldPosition(),
|
||||
MetaEntity.TRANSLUCENT,
|
||||
new Vector3(254,0,0),
|
||||
part.Scale
|
||||
);
|
||||
m_AuraEntities.Add(part.UUID, auraGroup);
|
||||
}
|
||||
SceneObjectPart metaPart = m_Entity.GetLinkNumPart(part.LinkNum);
|
||||
SetPartTransparency(metaPart, MetaEntity.TRANSLUCENT);
|
||||
// otherwise, scene will not contain the part. note: a group can not remove a part without changing group id
|
||||
}
|
||||
// otherwise, scene will not contain the part. note: a group can not remove a part without changing group id
|
||||
}
|
||||
|
||||
// a deleted part has no where to point a beam particle system,
|
||||
|
@ -180,8 +183,10 @@ namespace OpenSim.Region.OptionalModules.ContentManagement
|
|||
/// </summary>
|
||||
public bool HasChildPrim(UUID uuid)
|
||||
{
|
||||
if (m_UnchangedEntity.Children.ContainsKey(uuid))
|
||||
return true;
|
||||
lock (m_UnchangedEntity.Children)
|
||||
if (m_UnchangedEntity.Children.ContainsKey(uuid))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -190,9 +195,13 @@ namespace OpenSim.Region.OptionalModules.ContentManagement
|
|||
/// </summary>
|
||||
public bool HasChildPrim(uint localID)
|
||||
{
|
||||
foreach (SceneObjectPart part in m_UnchangedEntity.Children.Values)
|
||||
if (part.LocalId == localID)
|
||||
return true;
|
||||
lock (m_UnchangedEntity.Children)
|
||||
{
|
||||
foreach (SceneObjectPart part in m_UnchangedEntity.Children.Values)
|
||||
if (part.LocalId == localID)
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -228,37 +237,72 @@ namespace OpenSim.Region.OptionalModules.ContentManagement
|
|||
// Use "UnchangedEntity" to do comparisons because its text, transparency, and other attributes will be just as the user
|
||||
// had originally saved.
|
||||
// m_Entity will NOT necessarily be the same entity as the user had saved.
|
||||
foreach (SceneObjectPart UnchangedPart in m_UnchangedEntity.Children.Values)
|
||||
lock (m_UnchangedEntity.Children)
|
||||
{
|
||||
//This is the part that we use to show changes.
|
||||
metaEntityPart = m_Entity.GetLinkNumPart(UnchangedPart.LinkNum);
|
||||
if (sceneEntityGroup.Children.ContainsKey(UnchangedPart.UUID))
|
||||
foreach (SceneObjectPart UnchangedPart in m_UnchangedEntity.Children.Values)
|
||||
{
|
||||
sceneEntityPart = sceneEntityGroup.Children[UnchangedPart.UUID];
|
||||
differences = Difference.FindDifferences(UnchangedPart, sceneEntityPart);
|
||||
if (differences != Diff.NONE)
|
||||
metaEntityPart.Text = "CHANGE: " + differences.ToString();
|
||||
if (differences != 0)
|
||||
//This is the part that we use to show changes.
|
||||
metaEntityPart = m_Entity.GetLinkNumPart(UnchangedPart.LinkNum);
|
||||
if (sceneEntityGroup.Children.ContainsKey(UnchangedPart.UUID))
|
||||
{
|
||||
// Root Part that has been modified
|
||||
if ((differences&Diff.POSITION) > 0)
|
||||
sceneEntityPart = sceneEntityGroup.Children[UnchangedPart.UUID];
|
||||
differences = Difference.FindDifferences(UnchangedPart, sceneEntityPart);
|
||||
if (differences != Diff.NONE)
|
||||
metaEntityPart.Text = "CHANGE: " + differences.ToString();
|
||||
if (differences != 0)
|
||||
{
|
||||
// Root Part that has been modified
|
||||
if ((differences&Diff.POSITION) > 0)
|
||||
{
|
||||
// If the position of any part has changed, make sure the RootPart of the
|
||||
// meta entity is pointing with a beam particle system
|
||||
if (m_BeamEntities.ContainsKey(m_UnchangedEntity.RootPart.UUID))
|
||||
{
|
||||
m_BeamEntities[m_UnchangedEntity.RootPart.UUID].HideFromAll();
|
||||
m_BeamEntities.Remove(m_UnchangedEntity.RootPart.UUID);
|
||||
}
|
||||
BeamMetaEntity beamGroup = new BeamMetaEntity(m_Entity.Scene,
|
||||
m_UnchangedEntity.RootPart.GetWorldPosition(),
|
||||
MetaEntity.TRANSLUCENT,
|
||||
sceneEntityPart,
|
||||
new Vector3(0,0,254)
|
||||
);
|
||||
m_BeamEntities.Add(m_UnchangedEntity.RootPart.UUID, beamGroup);
|
||||
}
|
||||
|
||||
if (m_AuraEntities.ContainsKey(UnchangedPart.UUID))
|
||||
{
|
||||
m_AuraEntities[UnchangedPart.UUID].HideFromAll();
|
||||
m_AuraEntities.Remove(UnchangedPart.UUID);
|
||||
}
|
||||
AuraMetaEntity auraGroup = new AuraMetaEntity(m_Entity.Scene,
|
||||
UnchangedPart.GetWorldPosition(),
|
||||
MetaEntity.TRANSLUCENT,
|
||||
new Vector3(0,0,254),
|
||||
UnchangedPart.Scale
|
||||
);
|
||||
m_AuraEntities.Add(UnchangedPart.UUID, auraGroup);
|
||||
SetPartTransparency(metaEntityPart, MetaEntity.TRANSLUCENT);
|
||||
|
||||
DiffersFromSceneGroup = true;
|
||||
}
|
||||
else // no differences between scene part and meta part
|
||||
{
|
||||
// If the position of any part has changed, make sure the RootPart of the
|
||||
// meta entity is pointing with a beam particle system
|
||||
if (m_BeamEntities.ContainsKey(m_UnchangedEntity.RootPart.UUID))
|
||||
{
|
||||
m_BeamEntities[m_UnchangedEntity.RootPart.UUID].HideFromAll();
|
||||
m_BeamEntities.Remove(m_UnchangedEntity.RootPart.UUID);
|
||||
}
|
||||
BeamMetaEntity beamGroup = new BeamMetaEntity(m_Entity.Scene,
|
||||
m_UnchangedEntity.RootPart.GetWorldPosition(),
|
||||
MetaEntity.TRANSLUCENT,
|
||||
sceneEntityPart,
|
||||
new Vector3(0,0,254)
|
||||
);
|
||||
m_BeamEntities.Add(m_UnchangedEntity.RootPart.UUID, beamGroup);
|
||||
if (m_AuraEntities.ContainsKey(UnchangedPart.UUID))
|
||||
{
|
||||
m_AuraEntities[UnchangedPart.UUID].HideFromAll();
|
||||
m_AuraEntities.Remove(UnchangedPart.UUID);
|
||||
}
|
||||
SetPartTransparency(metaEntityPart, MetaEntity.NONE);
|
||||
}
|
||||
|
||||
}
|
||||
else //The entity currently in the scene is missing parts from the metaentity saved, so mark parts red as deleted.
|
||||
{
|
||||
if (m_AuraEntities.ContainsKey(UnchangedPart.UUID))
|
||||
{
|
||||
m_AuraEntities[UnchangedPart.UUID].HideFromAll();
|
||||
|
@ -267,48 +311,17 @@ namespace OpenSim.Region.OptionalModules.ContentManagement
|
|||
AuraMetaEntity auraGroup = new AuraMetaEntity(m_Entity.Scene,
|
||||
UnchangedPart.GetWorldPosition(),
|
||||
MetaEntity.TRANSLUCENT,
|
||||
new Vector3(0,0,254),
|
||||
new Vector3(254,0,0),
|
||||
UnchangedPart.Scale
|
||||
);
|
||||
m_AuraEntities.Add(UnchangedPart.UUID, auraGroup);
|
||||
SetPartTransparency(metaEntityPart, MetaEntity.TRANSLUCENT);
|
||||
|
||||
|
||||
DiffersFromSceneGroup = true;
|
||||
}
|
||||
else // no differences between scene part and meta part
|
||||
{
|
||||
if (m_BeamEntities.ContainsKey(m_UnchangedEntity.RootPart.UUID))
|
||||
{
|
||||
m_BeamEntities[m_UnchangedEntity.RootPart.UUID].HideFromAll();
|
||||
m_BeamEntities.Remove(m_UnchangedEntity.RootPart.UUID);
|
||||
}
|
||||
if (m_AuraEntities.ContainsKey(UnchangedPart.UUID))
|
||||
{
|
||||
m_AuraEntities[UnchangedPart.UUID].HideFromAll();
|
||||
m_AuraEntities.Remove(UnchangedPart.UUID);
|
||||
}
|
||||
SetPartTransparency(metaEntityPart, MetaEntity.NONE);
|
||||
}
|
||||
}
|
||||
else //The entity currently in the scene is missing parts from the metaentity saved, so mark parts red as deleted.
|
||||
{
|
||||
if (m_AuraEntities.ContainsKey(UnchangedPart.UUID))
|
||||
{
|
||||
m_AuraEntities[UnchangedPart.UUID].HideFromAll();
|
||||
m_AuraEntities.Remove(UnchangedPart.UUID);
|
||||
}
|
||||
AuraMetaEntity auraGroup = new AuraMetaEntity(m_Entity.Scene,
|
||||
UnchangedPart.GetWorldPosition(),
|
||||
MetaEntity.TRANSLUCENT,
|
||||
new Vector3(254,0,0),
|
||||
UnchangedPart.Scale
|
||||
);
|
||||
m_AuraEntities.Add(UnchangedPart.UUID, auraGroup);
|
||||
SetPartTransparency(metaEntityPart, MetaEntity.TRANSLUCENT);
|
||||
|
||||
DiffersFromSceneGroup = true;
|
||||
}
|
||||
}
|
||||
|
||||
return changed;
|
||||
}
|
||||
|
||||
|
|
|
@ -150,15 +150,19 @@ namespace OpenSim.Region.OptionalModules.ContentManagement
|
|||
{
|
||||
//make new uuids
|
||||
Dictionary<UUID, SceneObjectPart> parts = new Dictionary<UUID, SceneObjectPart>();
|
||||
foreach (SceneObjectPart part in m_Entity.Children.Values)
|
||||
|
||||
lock (m_Entity.Children)
|
||||
{
|
||||
part.ResetIDs(part.LinkNum);
|
||||
parts.Add(part.UUID, part);
|
||||
foreach (SceneObjectPart part in m_Entity.Children.Values)
|
||||
{
|
||||
part.ResetIDs(part.LinkNum);
|
||||
parts.Add(part.UUID, part);
|
||||
}
|
||||
|
||||
//finalize
|
||||
m_Entity.RootPart.PhysActor = null;
|
||||
m_Entity.Children = parts;
|
||||
}
|
||||
|
||||
//finalize
|
||||
m_Entity.RootPart.PhysActor = null;
|
||||
m_Entity.Children = parts;
|
||||
}
|
||||
|
||||
#endregion Protected Methods
|
||||
|
@ -173,8 +177,11 @@ namespace OpenSim.Region.OptionalModules.ContentManagement
|
|||
//This deletes the group without removing from any databases.
|
||||
//This is important because we are not IN any database.
|
||||
//m_Entity.FakeDeleteGroup();
|
||||
foreach (SceneObjectPart part in m_Entity.Children.Values)
|
||||
client.SendKillObject(m_Entity.RegionHandle, part.LocalId);
|
||||
lock (m_Entity.Children)
|
||||
{
|
||||
foreach (SceneObjectPart part in m_Entity.Children.Values)
|
||||
client.SendKillObject(m_Entity.RegionHandle, part.LocalId);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -182,12 +189,15 @@ namespace OpenSim.Region.OptionalModules.ContentManagement
|
|||
/// </summary>
|
||||
public virtual void HideFromAll()
|
||||
{
|
||||
foreach (SceneObjectPart part in m_Entity.Children.Values)
|
||||
lock (m_Entity.Children)
|
||||
{
|
||||
m_Entity.Scene.ForEachClient(
|
||||
delegate(IClientAPI controller)
|
||||
{ controller.SendKillObject(m_Entity.RegionHandle, part.LocalId); }
|
||||
);
|
||||
foreach (SceneObjectPart part in m_Entity.Children.Values)
|
||||
{
|
||||
m_Entity.Scene.ForEachClient(
|
||||
delegate(IClientAPI controller)
|
||||
{ controller.SendKillObject(m_Entity.RegionHandle, part.LocalId); }
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -185,14 +185,19 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule
|
|||
get
|
||||
{
|
||||
SceneObjectPart my = GetSOP();
|
||||
int total = my.ParentGroup.Children.Count;
|
||||
|
||||
IObject[] rets = new IObject[total];
|
||||
|
||||
int i = 0;
|
||||
foreach (KeyValuePair<UUID, SceneObjectPart> pair in my.ParentGroup.Children)
|
||||
IObject[] rets = null;
|
||||
|
||||
lock (my.ParentGroup.Children)
|
||||
{
|
||||
rets[i++] = new SOPObject(m_rootScene, pair.Value.LocalId, m_security);
|
||||
int total = my.ParentGroup.Children.Count;
|
||||
|
||||
rets = new IObject[total];
|
||||
|
||||
int i = 0;
|
||||
foreach (KeyValuePair<UUID, SceneObjectPart> pair in my.ParentGroup.Children)
|
||||
{
|
||||
rets[i++] = new SOPObject(m_rootScene, pair.Value.LocalId, m_security);
|
||||
}
|
||||
}
|
||||
|
||||
return rets;
|
||||
|
|
|
@ -293,7 +293,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
|||
{
|
||||
case ScriptBaseClass.LINK_SET:
|
||||
if (m_host.ParentGroup != null)
|
||||
return new List<SceneObjectPart>(m_host.ParentGroup.Children.Values);
|
||||
{
|
||||
lock (m_host.ParentGroup.Children)
|
||||
return new List<SceneObjectPart>(m_host.ParentGroup.Children.Values);
|
||||
}
|
||||
return ret;
|
||||
|
||||
case ScriptBaseClass.LINK_ROOT:
|
||||
|
@ -308,7 +311,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
|||
case ScriptBaseClass.LINK_ALL_OTHERS:
|
||||
if (m_host.ParentGroup == null)
|
||||
return new List<SceneObjectPart>();
|
||||
ret = new List<SceneObjectPart>(m_host.ParentGroup.Children.Values);
|
||||
|
||||
lock (m_host.ParentGroup.Children)
|
||||
ret = new List<SceneObjectPart>(m_host.ParentGroup.Children.Values);
|
||||
|
||||
if (ret.Contains(m_host))
|
||||
ret.Remove(m_host);
|
||||
return ret;
|
||||
|
@ -316,7 +322,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
|||
case ScriptBaseClass.LINK_ALL_CHILDREN:
|
||||
if (m_host.ParentGroup == null)
|
||||
return new List<SceneObjectPart>();
|
||||
ret = new List<SceneObjectPart>(m_host.ParentGroup.Children.Values);
|
||||
|
||||
lock (m_host.ParentGroup.Children)
|
||||
ret = new List<SceneObjectPart>(m_host.ParentGroup.Children.Values);
|
||||
|
||||
if (ret.Contains(m_host.ParentGroup.RootPart))
|
||||
ret.Remove(m_host.ParentGroup.RootPart);
|
||||
return ret;
|
||||
|
@ -1272,12 +1281,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
|||
if (group == null)
|
||||
return;
|
||||
bool allow = true;
|
||||
foreach (SceneObjectPart part in group.Children.Values)
|
||||
|
||||
lock (group.Children)
|
||||
{
|
||||
if (part.Scale.X > World.m_maxPhys || part.Scale.Y > World.m_maxPhys || part.Scale.Z > World.m_maxPhys)
|
||||
foreach (SceneObjectPart part in group.Children.Values)
|
||||
{
|
||||
allow = false;
|
||||
break;
|
||||
if (part.Scale.X > World.m_maxPhys || part.Scale.Y > World.m_maxPhys || part.Scale.Z > World.m_maxPhys)
|
||||
{
|
||||
allow = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -3757,7 +3770,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
|||
{
|
||||
m_host.AddScriptLPS(1);
|
||||
|
||||
if (m_host.ParentGroup.Children.Count > 1)
|
||||
if (m_host.ParentGroup.PrimCount > 1)
|
||||
{
|
||||
return m_host.LinkNum;
|
||||
}
|
||||
|
@ -3878,15 +3891,18 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
|||
case ScriptBaseClass.LINK_ALL_OTHERS:
|
||||
case ScriptBaseClass.LINK_ALL_CHILDREN:
|
||||
case ScriptBaseClass.LINK_THIS:
|
||||
foreach (SceneObjectPart part in parentPrim.Children.Values)
|
||||
lock (parentPrim.Children)
|
||||
{
|
||||
if (part.UUID != m_host.UUID)
|
||||
foreach (SceneObjectPart part in parentPrim.Children.Values)
|
||||
{
|
||||
childPrim = part;
|
||||
break;
|
||||
if (part.UUID != m_host.UUID)
|
||||
{
|
||||
childPrim = part;
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
childPrim = parentPrim.GetLinkNumPart(linknum);
|
||||
if (childPrim.UUID == m_host.UUID)
|
||||
|
@ -3962,26 +3978,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
|||
if (parentPrim.RootPart.AttachmentPoint != 0)
|
||||
return; // Fail silently if attached
|
||||
|
||||
List<SceneObjectPart> parts = new List<SceneObjectPart>(parentPrim.Children.Values);
|
||||
parts.Remove(parentPrim.RootPart);
|
||||
if (parts.Count > 0)
|
||||
lock (parentPrim.Children)
|
||||
{
|
||||
try
|
||||
List<SceneObjectPart> parts = new List<SceneObjectPart>(parentPrim.Children.Values);
|
||||
parts.Remove(parentPrim.RootPart);
|
||||
|
||||
foreach (SceneObjectPart part in parts)
|
||||
{
|
||||
parts[0].ParentGroup.areUpdatesSuspended = true;
|
||||
foreach (SceneObjectPart part in parts)
|
||||
{
|
||||
parentPrim.DelinkFromGroup(part.LocalId, true);
|
||||
parentPrim.TriggerScriptChangedEvent(Changed.LINK);
|
||||
}
|
||||
}
|
||||
finally
|
||||
{
|
||||
parts[0].ParentGroup.areUpdatesSuspended = false;
|
||||
parentPrim.DelinkFromGroup(part.LocalId, true);
|
||||
parentPrim.TriggerScriptChangedEvent(Changed.LINK);
|
||||
}
|
||||
parentPrim.HasGroupChanged = true;
|
||||
parentPrim.ScheduleGroupForFullUpdate();
|
||||
}
|
||||
parentPrim.HasGroupChanged = true;
|
||||
parentPrim.ScheduleGroupForFullUpdate();
|
||||
}
|
||||
|
||||
public LSL_String llGetLinkKey(int linknum)
|
||||
|
@ -4545,7 +4554,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
|||
{
|
||||
partItemID = item.ItemID;
|
||||
int linkNumber = m_host.LinkNum;
|
||||
if (m_host.ParentGroup.Children.Count == 1)
|
||||
if (m_host.ParentGroup.PrimCount == 1)
|
||||
linkNumber = 0;
|
||||
|
||||
object[] resobj = new object[]
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
<<<<<<< HEAD:OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LS_Api.cs
|
||||
/*
|
||||
* Copyright (c) Contributors, http://opensimulator.org/
|
||||
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
||||
|
@ -505,3 +506,507 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
|||
|
||||
}
|
||||
}
|
||||
=======
|
||||
/*
|
||||
* Copyright (c) Contributors, http://opensimulator.org/
|
||||
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the OpenSimulator Project nor the
|
||||
* names of its contributors may be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.Reflection;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Runtime.Remoting.Lifetime;
|
||||
using OpenMetaverse;
|
||||
using Nini.Config;
|
||||
using OpenSim;
|
||||
using OpenSim.Framework;
|
||||
using OpenSim.Region.CoreModules.World.LightShare;
|
||||
using OpenSim.Region.Framework.Interfaces;
|
||||
using OpenSim.Region.Framework.Scenes;
|
||||
using OpenSim.Region.ScriptEngine.Shared;
|
||||
using OpenSim.Region.ScriptEngine.Shared.Api.Plugins;
|
||||
using OpenSim.Region.ScriptEngine.Shared.ScriptBase;
|
||||
using OpenSim.Region.ScriptEngine.Interfaces;
|
||||
using OpenSim.Region.ScriptEngine.Shared.Api.Interfaces;
|
||||
|
||||
using LSL_Float = OpenSim.Region.ScriptEngine.Shared.LSL_Types.LSLFloat;
|
||||
using LSL_Integer = OpenSim.Region.ScriptEngine.Shared.LSL_Types.LSLInteger;
|
||||
using LSL_Key = OpenSim.Region.ScriptEngine.Shared.LSL_Types.LSLString;
|
||||
using LSL_List = OpenSim.Region.ScriptEngine.Shared.LSL_Types.list;
|
||||
using LSL_Rotation = OpenSim.Region.ScriptEngine.Shared.LSL_Types.Quaternion;
|
||||
using LSL_String = OpenSim.Region.ScriptEngine.Shared.LSL_Types.LSLString;
|
||||
using LSL_Vector = OpenSim.Region.ScriptEngine.Shared.LSL_Types.Vector3;
|
||||
|
||||
namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||
{
|
||||
[Serializable]
|
||||
public class LS_Api : MarshalByRefObject, ILS_Api, IScriptApi
|
||||
{
|
||||
internal IScriptEngine m_ScriptEngine;
|
||||
internal SceneObjectPart m_host;
|
||||
internal uint m_localID;
|
||||
internal UUID m_itemID;
|
||||
internal bool m_LSFunctionsEnabled = false;
|
||||
internal IScriptModuleComms m_comms = null;
|
||||
|
||||
public void Initialize(IScriptEngine ScriptEngine, SceneObjectPart host, uint localID, UUID itemID)
|
||||
{
|
||||
m_ScriptEngine = ScriptEngine;
|
||||
m_host = host;
|
||||
m_localID = localID;
|
||||
m_itemID = itemID;
|
||||
|
||||
if (m_ScriptEngine.Config.GetBoolean("AllowLightShareFunctions", false))
|
||||
m_LSFunctionsEnabled = true;
|
||||
|
||||
m_comms = m_ScriptEngine.World.RequestModuleInterface<IScriptModuleComms>();
|
||||
if (m_comms == null)
|
||||
m_LSFunctionsEnabled = false;
|
||||
}
|
||||
|
||||
public override Object InitializeLifetimeService()
|
||||
{
|
||||
ILease lease = (ILease)base.InitializeLifetimeService();
|
||||
|
||||
if (lease.CurrentState == LeaseState.Initial)
|
||||
{
|
||||
lease.InitialLeaseTime = TimeSpan.FromMinutes(0);
|
||||
// lease.RenewOnCallTime = TimeSpan.FromSeconds(10.0);
|
||||
// lease.SponsorshipTimeout = TimeSpan.FromMinutes(1.0);
|
||||
}
|
||||
return lease;
|
||||
}
|
||||
|
||||
public Scene World
|
||||
{
|
||||
get { return m_ScriptEngine.World; }
|
||||
}
|
||||
|
||||
//
|
||||
//Dumps an error message on the debug console.
|
||||
//
|
||||
|
||||
internal void LSShoutError(string message)
|
||||
{
|
||||
if (message.Length > 1023)
|
||||
message = message.Substring(0, 1023);
|
||||
|
||||
World.SimChat(Utils.StringToBytes(message),
|
||||
ChatTypeEnum.Shout, ScriptBaseClass.DEBUG_CHANNEL, m_host.ParentGroup.RootPart.AbsolutePosition, m_host.Name, m_host.UUID, true);
|
||||
|
||||
IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>();
|
||||
wComm.DeliverMessage(ChatTypeEnum.Shout, ScriptBaseClass.DEBUG_CHANNEL, m_host.Name, m_host.UUID, message);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get the current Windlight scene
|
||||
/// </summary>
|
||||
/// <returns>List of windlight parameters</returns>
|
||||
public LSL_List lsGetWindlightScene(LSL_List rules)
|
||||
{
|
||||
if (!m_LSFunctionsEnabled)
|
||||
{
|
||||
LSShoutError("LightShare functions are not enabled.");
|
||||
return new LSL_List();
|
||||
}
|
||||
m_host.AddScriptLPS(1);
|
||||
RegionLightShareData wl = m_host.ParentGroup.Scene.RegionInfo.WindlightSettings;
|
||||
|
||||
LSL_List values = new LSL_List();
|
||||
int idx = 0;
|
||||
while (idx < rules.Length)
|
||||
{
|
||||
uint rule = (uint)rules.GetLSLIntegerItem(idx);
|
||||
LSL_List toadd = new LSL_List();
|
||||
|
||||
switch (rule)
|
||||
{
|
||||
case (int)ScriptBaseClass.WL_AMBIENT:
|
||||
toadd.Add(new LSL_Rotation(wl.ambient.X, wl.ambient.Y, wl.ambient.Z, wl.ambient.W));
|
||||
break;
|
||||
case (int)ScriptBaseClass.WL_BIG_WAVE_DIRECTION:
|
||||
toadd.Add(new LSL_Vector(wl.bigWaveDirection.X, wl.bigWaveDirection.Y, 0.0f));
|
||||
break;
|
||||
case (int)ScriptBaseClass.WL_BLUE_DENSITY:
|
||||
toadd.Add(new LSL_Rotation(wl.blueDensity.X, wl.blueDensity.Y, wl.blueDensity.Z, wl.blueDensity.W));
|
||||
break;
|
||||
case (int)ScriptBaseClass.WL_BLUR_MULTIPLIER:
|
||||
toadd.Add(new LSL_Float(wl.blurMultiplier));
|
||||
break;
|
||||
case (int)ScriptBaseClass.WL_CLOUD_COLOR:
|
||||
toadd.Add(new LSL_Rotation(wl.cloudColor.X, wl.cloudColor.Y, wl.cloudColor.Z, wl.cloudColor.W));
|
||||
break;
|
||||
case (int)ScriptBaseClass.WL_CLOUD_COVERAGE:
|
||||
toadd.Add(new LSL_Float(wl.cloudCoverage));
|
||||
break;
|
||||
case (int)ScriptBaseClass.WL_CLOUD_DETAIL_XY_DENSITY:
|
||||
toadd.Add(new LSL_Vector(wl.cloudDetailXYDensity.X, wl.cloudDetailXYDensity.Y, wl.cloudDetailXYDensity.Z));
|
||||
break;
|
||||
case (int)ScriptBaseClass.WL_CLOUD_SCALE:
|
||||
toadd.Add(new LSL_Float(wl.cloudScale));
|
||||
break;
|
||||
case (int)ScriptBaseClass.WL_CLOUD_SCROLL_X:
|
||||
toadd.Add(new LSL_Float(wl.cloudScrollX));
|
||||
break;
|
||||
case (int)ScriptBaseClass.WL_CLOUD_SCROLL_X_LOCK:
|
||||
toadd.Add(new LSL_Integer(wl.cloudScrollXLock ? 1 : 0));
|
||||
break;
|
||||
case (int)ScriptBaseClass.WL_CLOUD_SCROLL_Y:
|
||||
toadd.Add(new LSL_Float(wl.cloudScrollY));
|
||||
break;
|
||||
case (int)ScriptBaseClass.WL_CLOUD_SCROLL_Y_LOCK:
|
||||
toadd.Add(new LSL_Integer(wl.cloudScrollYLock ? 1 : 0));
|
||||
break;
|
||||
case (int)ScriptBaseClass.WL_CLOUD_XY_DENSITY:
|
||||
toadd.Add(new LSL_Vector(wl.cloudXYDensity.X, wl.cloudXYDensity.Y, wl.cloudXYDensity.Z));
|
||||
break;
|
||||
case (int)ScriptBaseClass.WL_DENSITY_MULTIPLIER:
|
||||
toadd.Add(new LSL_Float(wl.densityMultiplier));
|
||||
break;
|
||||
case (int)ScriptBaseClass.WL_DISTANCE_MULTIPLIER:
|
||||
toadd.Add(new LSL_Float(wl.distanceMultiplier));
|
||||
break;
|
||||
case (int)ScriptBaseClass.WL_DRAW_CLASSIC_CLOUDS:
|
||||
toadd.Add(new LSL_Integer(wl.drawClassicClouds ? 1 : 0));
|
||||
break;
|
||||
case (int)ScriptBaseClass.WL_EAST_ANGLE:
|
||||
toadd.Add(new LSL_Float(wl.eastAngle));
|
||||
break;
|
||||
case (int)ScriptBaseClass.WL_FRESNEL_OFFSET:
|
||||
toadd.Add(new LSL_Float(wl.fresnelOffset));
|
||||
break;
|
||||
case (int)ScriptBaseClass.WL_FRESNEL_SCALE:
|
||||
toadd.Add(new LSL_Float(wl.fresnelScale));
|
||||
break;
|
||||
case (int)ScriptBaseClass.WL_HAZE_DENSITY:
|
||||
toadd.Add(new LSL_Float(wl.hazeDensity));
|
||||
break;
|
||||
case (int)ScriptBaseClass.WL_HAZE_HORIZON:
|
||||
toadd.Add(new LSL_Float(wl.hazeHorizon));
|
||||
break;
|
||||
case (int)ScriptBaseClass.WL_HORIZON:
|
||||
toadd.Add(new LSL_Rotation(wl.horizon.X, wl.horizon.Y, wl.horizon.Z, wl.horizon.W));
|
||||
break;
|
||||
case (int)ScriptBaseClass.WL_LITTLE_WAVE_DIRECTION:
|
||||
toadd.Add(new LSL_Vector(wl.littleWaveDirection.X, wl.littleWaveDirection.Y, 0.0f));
|
||||
break;
|
||||
case (int)ScriptBaseClass.WL_MAX_ALTITUDE:
|
||||
toadd.Add(new LSL_Integer(wl.maxAltitude));
|
||||
break;
|
||||
case (int)ScriptBaseClass.WL_NORMAL_MAP_TEXTURE:
|
||||
toadd.Add(new LSL_Key(wl.normalMapTexture.ToString()));
|
||||
break;
|
||||
case (int)ScriptBaseClass.WL_REFLECTION_WAVELET_SCALE:
|
||||
toadd.Add(new LSL_Vector(wl.reflectionWaveletScale.X, wl.reflectionWaveletScale.Y, wl.reflectionWaveletScale.Z));
|
||||
break;
|
||||
case (int)ScriptBaseClass.WL_REFRACT_SCALE_ABOVE:
|
||||
toadd.Add(new LSL_Float(wl.refractScaleAbove));
|
||||
break;
|
||||
case (int)ScriptBaseClass.WL_REFRACT_SCALE_BELOW:
|
||||
toadd.Add(new LSL_Float(wl.refractScaleBelow));
|
||||
break;
|
||||
case (int)ScriptBaseClass.WL_SCENE_GAMMA:
|
||||
toadd.Add(new LSL_Float(wl.sceneGamma));
|
||||
break;
|
||||
case (int)ScriptBaseClass.WL_STAR_BRIGHTNESS:
|
||||
toadd.Add(new LSL_Float(wl.starBrightness));
|
||||
break;
|
||||
case (int)ScriptBaseClass.WL_SUN_GLOW_FOCUS:
|
||||
toadd.Add(new LSL_Float(wl.sunGlowFocus));
|
||||
break;
|
||||
case (int)ScriptBaseClass.WL_SUN_GLOW_SIZE:
|
||||
toadd.Add(new LSL_Float(wl.sunGlowSize));
|
||||
break;
|
||||
case (int)ScriptBaseClass.WL_SUN_MOON_COLOR:
|
||||
toadd.Add(new LSL_Rotation(wl.sunMoonColor.X, wl.sunMoonColor.Y, wl.sunMoonColor.Z, wl.sunMoonColor.W));
|
||||
break;
|
||||
case (int)ScriptBaseClass.WL_UNDERWATER_FOG_MODIFIER:
|
||||
toadd.Add(new LSL_Float(wl.underwaterFogModifier));
|
||||
break;
|
||||
case (int)ScriptBaseClass.WL_WATER_COLOR:
|
||||
toadd.Add(new LSL_Vector(wl.waterColor.X, wl.waterColor.Y, wl.waterColor.Z));
|
||||
break;
|
||||
case (int)ScriptBaseClass.WL_WATER_FOG_DENSITY_EXPONENT:
|
||||
toadd.Add(new LSL_Float(wl.waterFogDensityExponent));
|
||||
break;
|
||||
}
|
||||
|
||||
if (toadd.Length > 0)
|
||||
{
|
||||
values.Add(rule);
|
||||
values.Add(toadd.Data[0]);
|
||||
}
|
||||
idx++;
|
||||
}
|
||||
|
||||
return values;
|
||||
}
|
||||
|
||||
private RegionLightShareData getWindlightProfileFromRules(LSL_List rules)
|
||||
{
|
||||
RegionLightShareData wl = (RegionLightShareData)m_host.ParentGroup.Scene.RegionInfo.WindlightSettings.Clone();
|
||||
|
||||
// LSL_List values = new LSL_List();
|
||||
int idx = 0;
|
||||
while (idx < rules.Length)
|
||||
{
|
||||
uint rule = (uint)rules.GetLSLIntegerItem(idx);
|
||||
LSL_Types.Quaternion iQ;
|
||||
LSL_Types.Vector3 iV;
|
||||
switch (rule)
|
||||
{
|
||||
case (int)ScriptBaseClass.WL_SUN_MOON_POSITION:
|
||||
idx++;
|
||||
wl.sunMoonPosition = (float)rules.GetLSLFloatItem(idx);
|
||||
break;
|
||||
case (int)ScriptBaseClass.WL_AMBIENT:
|
||||
idx++;
|
||||
iQ = rules.GetQuaternionItem(idx);
|
||||
wl.ambient = new Vector4((float)iQ.x, (float)iQ.y, (float)iQ.z, (float)iQ.s);
|
||||
break;
|
||||
case (int)ScriptBaseClass.WL_BIG_WAVE_DIRECTION:
|
||||
idx++;
|
||||
iV = rules.GetVector3Item(idx);
|
||||
wl.bigWaveDirection = new Vector2((float)iV.x, (float)iV.y);
|
||||
break;
|
||||
case (int)ScriptBaseClass.WL_BLUE_DENSITY:
|
||||
idx++;
|
||||
iQ = rules.GetQuaternionItem(idx);
|
||||
wl.blueDensity = new Vector4((float)iQ.x, (float)iQ.y, (float)iQ.z, (float)iQ.s);
|
||||
break;
|
||||
case (int)ScriptBaseClass.WL_BLUR_MULTIPLIER:
|
||||
idx++;
|
||||
wl.blurMultiplier = (float)rules.GetLSLFloatItem(idx);
|
||||
break;
|
||||
case (int)ScriptBaseClass.WL_CLOUD_COLOR:
|
||||
idx++;
|
||||
iQ = rules.GetQuaternionItem(idx);
|
||||
wl.cloudColor = new Vector4((float)iQ.x, (float)iQ.y, (float)iQ.z, (float)iQ.s);
|
||||
break;
|
||||
case (int)ScriptBaseClass.WL_CLOUD_COVERAGE:
|
||||
idx++;
|
||||
wl.cloudCoverage = (float)rules.GetLSLFloatItem(idx);
|
||||
break;
|
||||
case (int)ScriptBaseClass.WL_CLOUD_DETAIL_XY_DENSITY:
|
||||
idx++;
|
||||
iV = rules.GetVector3Item(idx);
|
||||
wl.cloudDetailXYDensity = new Vector3((float)iV.x, (float)iV.y, (float)iV.z);
|
||||
break;
|
||||
case (int)ScriptBaseClass.WL_CLOUD_SCALE:
|
||||
idx++;
|
||||
wl.cloudScale = (float)rules.GetLSLFloatItem(idx);
|
||||
break;
|
||||
case (int)ScriptBaseClass.WL_CLOUD_SCROLL_X:
|
||||
idx++;
|
||||
wl.cloudScrollX = (float)rules.GetLSLFloatItem(idx);
|
||||
break;
|
||||
case (int)ScriptBaseClass.WL_CLOUD_SCROLL_X_LOCK:
|
||||
idx++;
|
||||
wl.cloudScrollXLock = rules.GetLSLIntegerItem(idx).value == 1 ? true : false;
|
||||
break;
|
||||
case (int)ScriptBaseClass.WL_CLOUD_SCROLL_Y:
|
||||
idx++;
|
||||
wl.cloudScrollY = (float)rules.GetLSLFloatItem(idx);
|
||||
break;
|
||||
case (int)ScriptBaseClass.WL_CLOUD_SCROLL_Y_LOCK:
|
||||
idx++;
|
||||
wl.cloudScrollYLock = rules.GetLSLIntegerItem(idx).value == 1 ? true : false;
|
||||
break;
|
||||
case (int)ScriptBaseClass.WL_CLOUD_XY_DENSITY:
|
||||
idx++;
|
||||
iV = rules.GetVector3Item(idx);
|
||||
wl.cloudXYDensity = new Vector3((float)iV.x, (float)iV.y, (float)iV.z);
|
||||
break;
|
||||
case (int)ScriptBaseClass.WL_DENSITY_MULTIPLIER:
|
||||
idx++;
|
||||
wl.densityMultiplier = (float)rules.GetLSLFloatItem(idx);
|
||||
break;
|
||||
case (int)ScriptBaseClass.WL_DISTANCE_MULTIPLIER:
|
||||
idx++;
|
||||
wl.distanceMultiplier = (float)rules.GetLSLFloatItem(idx);
|
||||
break;
|
||||
case (int)ScriptBaseClass.WL_DRAW_CLASSIC_CLOUDS:
|
||||
idx++;
|
||||
wl.drawClassicClouds = rules.GetLSLIntegerItem(idx).value == 1 ? true : false;
|
||||
break;
|
||||
case (int)ScriptBaseClass.WL_EAST_ANGLE:
|
||||
idx++;
|
||||
wl.eastAngle = (float)rules.GetLSLFloatItem(idx);
|
||||
break;
|
||||
case (int)ScriptBaseClass.WL_FRESNEL_OFFSET:
|
||||
idx++;
|
||||
wl.fresnelOffset = (float)rules.GetLSLFloatItem(idx);
|
||||
break;
|
||||
case (int)ScriptBaseClass.WL_FRESNEL_SCALE:
|
||||
idx++;
|
||||
wl.fresnelScale = (float)rules.GetLSLFloatItem(idx);
|
||||
break;
|
||||
case (int)ScriptBaseClass.WL_HAZE_DENSITY:
|
||||
idx++;
|
||||
wl.hazeDensity = (float)rules.GetLSLFloatItem(idx);
|
||||
break;
|
||||
case (int)ScriptBaseClass.WL_HAZE_HORIZON:
|
||||
idx++;
|
||||
wl.hazeHorizon = (float)rules.GetLSLFloatItem(idx);
|
||||
break;
|
||||
case (int)ScriptBaseClass.WL_HORIZON:
|
||||
idx++;
|
||||
iQ = rules.GetQuaternionItem(idx);
|
||||
wl.horizon = new Vector4((float)iQ.x, (float)iQ.y, (float)iQ.z, (float)iQ.s);
|
||||
break;
|
||||
case (int)ScriptBaseClass.WL_LITTLE_WAVE_DIRECTION:
|
||||
idx++;
|
||||
iV = rules.GetVector3Item(idx);
|
||||
wl.littleWaveDirection = new Vector2((float)iV.x, (float)iV.y);
|
||||
break;
|
||||
case (int)ScriptBaseClass.WL_MAX_ALTITUDE:
|
||||
idx++;
|
||||
wl.maxAltitude = (ushort)rules.GetLSLIntegerItem(idx).value;
|
||||
break;
|
||||
case (int)ScriptBaseClass.WL_NORMAL_MAP_TEXTURE:
|
||||
idx++;
|
||||
wl.normalMapTexture = new UUID(rules.GetLSLStringItem(idx).m_string);
|
||||
break;
|
||||
case (int)ScriptBaseClass.WL_REFLECTION_WAVELET_SCALE:
|
||||
idx++;
|
||||
iV = rules.GetVector3Item(idx);
|
||||
wl.reflectionWaveletScale = new Vector3((float)iV.x, (float)iV.y, (float)iV.z);
|
||||
break;
|
||||
case (int)ScriptBaseClass.WL_REFRACT_SCALE_ABOVE:
|
||||
idx++;
|
||||
wl.refractScaleAbove = (float)rules.GetLSLFloatItem(idx);
|
||||
break;
|
||||
case (int)ScriptBaseClass.WL_REFRACT_SCALE_BELOW:
|
||||
idx++;
|
||||
wl.refractScaleBelow = (float)rules.GetLSLFloatItem(idx);
|
||||
break;
|
||||
case (int)ScriptBaseClass.WL_SCENE_GAMMA:
|
||||
idx++;
|
||||
wl.sceneGamma = (float)rules.GetLSLFloatItem(idx);
|
||||
break;
|
||||
case (int)ScriptBaseClass.WL_STAR_BRIGHTNESS:
|
||||
idx++;
|
||||
wl.starBrightness = (float)rules.GetLSLFloatItem(idx);
|
||||
break;
|
||||
case (int)ScriptBaseClass.WL_SUN_GLOW_FOCUS:
|
||||
idx++;
|
||||
wl.sunGlowFocus = (float)rules.GetLSLFloatItem(idx);
|
||||
break;
|
||||
case (int)ScriptBaseClass.WL_SUN_GLOW_SIZE:
|
||||
idx++;
|
||||
wl.sunGlowSize = (float)rules.GetLSLFloatItem(idx);
|
||||
break;
|
||||
case (int)ScriptBaseClass.WL_SUN_MOON_COLOR:
|
||||
idx++;
|
||||
iQ = rules.GetQuaternionItem(idx);
|
||||
wl.sunMoonColor = new Vector4((float)iQ.x, (float)iQ.y, (float)iQ.z, (float)iQ.s);
|
||||
break;
|
||||
case (int)ScriptBaseClass.WL_UNDERWATER_FOG_MODIFIER:
|
||||
idx++;
|
||||
wl.underwaterFogModifier = (float)rules.GetLSLFloatItem(idx);
|
||||
break;
|
||||
case (int)ScriptBaseClass.WL_WATER_COLOR:
|
||||
idx++;
|
||||
iV = rules.GetVector3Item(idx);
|
||||
wl.waterColor = new Vector3((float)iV.x, (float)iV.y, (float)iV.z);
|
||||
break;
|
||||
case (int)ScriptBaseClass.WL_WATER_FOG_DENSITY_EXPONENT:
|
||||
idx++;
|
||||
wl.waterFogDensityExponent = (float)rules.GetLSLFloatItem(idx);
|
||||
break;
|
||||
}
|
||||
idx++;
|
||||
}
|
||||
return wl;
|
||||
}
|
||||
/// <summary>
|
||||
/// Set the current Windlight scene
|
||||
/// </summary>
|
||||
/// <param name="rules"></param>
|
||||
/// <returns>success: true or false</returns>
|
||||
public int lsSetWindlightScene(LSL_List rules)
|
||||
{
|
||||
if (!m_LSFunctionsEnabled)
|
||||
{
|
||||
LSShoutError("LightShare functions are not enabled.");
|
||||
return 0;
|
||||
}
|
||||
if (!World.RegionInfo.EstateSettings.IsEstateManager(m_host.OwnerID) && World.GetScenePresence(m_host.OwnerID).GodLevel < 200)
|
||||
{
|
||||
LSShoutError("lsSetWindlightScene can only be used by estate managers or owners.");
|
||||
return 0;
|
||||
}
|
||||
int success = 0;
|
||||
m_host.AddScriptLPS(1);
|
||||
if (LightShareModule.EnableWindlight)
|
||||
{
|
||||
RegionLightShareData wl = getWindlightProfileFromRules(rules);
|
||||
m_host.ParentGroup.Scene.StoreWindlightProfile(wl);
|
||||
success = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
LSShoutError("Windlight module is disabled");
|
||||
return 0;
|
||||
}
|
||||
return success;
|
||||
}
|
||||
/// <summary>
|
||||
/// Set the current Windlight scene to a target avatar
|
||||
/// </summary>
|
||||
/// <param name="rules"></param>
|
||||
/// <returns>success: true or false</returns>
|
||||
public int lsSetWindlightSceneTargeted(LSL_List rules, LSL_Key target)
|
||||
{
|
||||
if (!m_LSFunctionsEnabled)
|
||||
{
|
||||
LSShoutError("LightShare functions are not enabled.");
|
||||
return 0;
|
||||
}
|
||||
if (!World.RegionInfo.EstateSettings.IsEstateManager(m_host.OwnerID) && World.GetScenePresence(m_host.OwnerID).GodLevel < 200)
|
||||
{
|
||||
LSShoutError("lsSetWindlightSceneTargeted can only be used by estate managers or owners.");
|
||||
return 0;
|
||||
}
|
||||
int success = 0;
|
||||
m_host.AddScriptLPS(1);
|
||||
if (LightShareModule.EnableWindlight)
|
||||
{
|
||||
RegionLightShareData wl = getWindlightProfileFromRules(rules);
|
||||
World.EventManager.TriggerOnSendNewWindlightProfileTargeted(wl, new UUID(target.m_string));
|
||||
success = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
LSShoutError("Windlight module is disabled");
|
||||
return 0;
|
||||
}
|
||||
return success;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
>>>>>>> master:OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LS_Api.cs
|
||||
|
|
|
@ -209,12 +209,15 @@ namespace OpenSim.Region.ScriptEngine.Shared
|
|||
else
|
||||
Type = 0x02; // Passive
|
||||
|
||||
foreach (SceneObjectPart p in part.ParentGroup.Children.Values)
|
||||
lock (part.ParentGroup.Children)
|
||||
{
|
||||
if (p.Inventory.ContainsScripts())
|
||||
foreach (SceneObjectPart p in part.ParentGroup.Children.Values)
|
||||
{
|
||||
Type |= 0x08; // Scripted
|
||||
break;
|
||||
if (p.Inventory.ContainsScripts())
|
||||
{
|
||||
Type |= 0x08; // Scripted
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue