Taking Prims (SceneObjectGroups) in and out of inventory should now work and if left in inventory will still be there after restarts. (as with the rest of inventory it will only fully work in standalone mode with account authentication turned on).

This commit is contained in:
MW
2007-08-16 16:31:32 +00:00
parent 915f8cc1a1
commit 531f64a53b
18 changed files with 323 additions and 93 deletions

View File

@@ -34,6 +34,7 @@ using OpenSim.Framework.Interfaces;
using OpenSim.Framework.Types;
using OpenSim.Framework.Communications.Caches;
using OpenSim.Framework.Data;
using OpenSim.Framework.Utilities;
namespace OpenSim.Region.Environment.Scenes
{
@@ -206,26 +207,16 @@ namespace OpenSim.Region.Environment.Scenes
});
}
/// <summary>
///
/// </summary>
/// <param name="primAsset"></param>
/// <param name="pos"></param>
public void RezObject(AssetBase primAsset, LLVector3 pos)
{
}
/// <summary>
///
/// </summary>
/// <param name="packet"></param>
/// <param name="simClient"></param>
public void DeRezObject(Packet packet, IClientAPI simClient)
public void DeRezObject(Packet packet, IClientAPI remoteClient)
{
DeRezObjectPacket DeRezPacket = (DeRezObjectPacket)packet;
if (DeRezPacket.AgentBlock.DestinationID == LLUUID.Zero)
{
//currently following code not used (or don't know of any case of destination being zero
@@ -246,17 +237,44 @@ namespace OpenSim.Region.Environment.Scenes
}
if (selectedEnt != null)
{
if (PermissionsMngr.CanDeRezObject(simClient.AgentId, selectedEnt.m_uuid))
if (PermissionsMngr.CanDeRezObject(remoteClient.AgentId,((SceneObjectGroup)selectedEnt).UUID))
{
List<ScenePresence> avatars = this.RequestAvatarList();
foreach (ScenePresence avatar in avatars)
string sceneObjectXml = ((SceneObjectGroup)selectedEnt).ToXmlString();
CachedUserInfo userInfo = commsManager.UserProfiles.GetUserDetails(remoteClient.AgentId);
if (userInfo != null)
{
avatar.ControllingClient.SendKillObject(this.m_regionHandle, selectedEnt.LocalId);
AssetBase asset = new AssetBase();
asset.Name = ((SceneObjectGroup)selectedEnt).GetPartName(selectedEnt.LocalId);
asset.Description = ((SceneObjectGroup)selectedEnt).GetPartDescription(selectedEnt.LocalId);
asset.InvType = 6;
asset.Type = 6;
asset.FullID = LLUUID.Random();
asset.Data = Helpers.StringToField(sceneObjectXml);
this.assetCache.AddAsset(asset);
InventoryItemBase item = new InventoryItemBase();
item.avatarID = remoteClient.AgentId;
item.creatorsID = remoteClient.AgentId;
item.inventoryID = LLUUID.Random();
item.assetID = asset.FullID;
item.inventoryDescription = asset.Description;
item.inventoryName = asset.Name;
item.assetType = asset.Type;
item.invType = asset.InvType;
item.parentFolderID = DeRezPacket.AgentBlock.DestinationID;
item.inventoryCurrentPermissions = 2147483647;
item.inventoryNextPermissions = 2147483647;
userInfo.AddItem(remoteClient.AgentId, item);
remoteClient.SendInventoryItemUpdate(item);
}
((SceneObjectGroup)selectedEnt).DeleteGroup();
lock (Entities)
{
Entities.Remove(selectedEnt.m_uuid);
Entities.Remove(((SceneObjectGroup) selectedEnt).UUID);
}
}
}
@@ -264,6 +282,45 @@ namespace OpenSim.Region.Environment.Scenes
}
}
public void RezObject(IClientAPI remoteClient, LLUUID itemID, LLVector3 pos)
{
CachedUserInfo userInfo = commsManager.UserProfiles.GetUserDetails(remoteClient.AgentId);
if (userInfo != null)
{
if(userInfo.RootFolder != null)
{
InventoryItemBase item = userInfo.RootFolder.HasItem(itemID);
if (item != null)
{
AssetBase rezAsset = this.assetCache.GetAsset(item.assetID, false);
if (rezAsset != null)
{
this.AddRezObject(Util.FieldToString(rezAsset.Data), pos);
userInfo.DeleteItem(remoteClient.AgentId, item);
remoteClient.SendRemoveInventoryItem(itemID);
}
else
{
rezAsset = this.assetCache.GetAsset(item.assetID, false);
if (rezAsset != null)
{
this.AddRezObject(Util.FieldToString(rezAsset.Data), pos);
userInfo.DeleteItem(remoteClient.AgentId, item);
remoteClient.SendRemoveInventoryItem(itemID);
}
}
}
}
}
}
private void AddRezObject(string xmlData, LLVector3 pos)
{
SceneObjectGroup group = new SceneObjectGroup(this, this.m_regionHandle, xmlData);
this.AddEntity(group);
group.Pos = pos;
}
/// <summary>
///
/// </summary>
@@ -301,11 +358,11 @@ namespace OpenSim.Region.Environment.Scenes
this.Entities.Add(copy.UUID, copy);
copy.ScheduleGroupForFullUpdate();
/* List<ScenePresence> avatars = this.RequestAvatarList();
for (int i = 0; i < avatars.Count; i++)
{
// copy.SendAllChildPrimsToClient(avatars[i].ControllingClient);
}*/
/* List<ScenePresence> avatars = this.RequestAvatarList();
for (int i = 0; i < avatars.Count; i++)
{
// copy.SendAllChildPrimsToClient(avatars[i].ControllingClient);
}*/
}
else
@@ -620,7 +677,7 @@ namespace OpenSim.Region.Environment.Scenes
if (hasPrim != false)
{
((SceneObjectGroup)ent).UpdateGroupRotation(pos, rot);
// prim.UpdateGroupMouseRotation(pos, rot);
// prim.UpdateGroupMouseRotation(pos, rot);
break;
}
}
@@ -665,7 +722,7 @@ namespace OpenSim.Region.Environment.Scenes
{
if (ent is SceneObjectGroup)
{
// prim = ((SceneObject)ent).HasChildPrim(localID);
// prim = ((SceneObject)ent).HasChildPrim(localID);
if (prim != null)
{
prim.UpdateSingleRotation(rot);
@@ -692,7 +749,7 @@ namespace OpenSim.Region.Environment.Scenes
if (hasPrim != false)
{
((SceneObjectGroup)ent).Resize(scale, localID);
// prim.ResizeGoup(scale);
// prim.ResizeGoup(scale);
break;
}
}

View File

@@ -538,7 +538,10 @@ namespace OpenSim.Region.Environment.Scenes
public void AddEntity(SceneObjectGroup sceneObject)
{
Entities.Add(sceneObject.UUID, sceneObject);
if(!Entities.ContainsKey(sceneObject.UUID))
{
Entities.Add(sceneObject.UUID, sceneObject);
}
}
public void RemoveEntity(SceneObjectGroup sceneObject)
@@ -604,6 +607,7 @@ namespace OpenSim.Region.Environment.Scenes
client.OnObjectDeselect += DeselectPrim;
client.OnGrabUpdate += MoveObject;
client.OnDeRezObject += DeRezObject;
client.OnRezObject += RezObject;
client.OnNameFromUUIDRequest += commsManager.HandleUUIDNameRequest;
client.OnObjectDescription += PrimDescription;
client.OnObjectName += PrimName;
@@ -1114,7 +1118,7 @@ namespace OpenSim.Region.Environment.Scenes
this.assetCache.AddAsset(asset);
item.assetID = asset.FullID;
userInfo.updateItem(remoteClient.AgentId, item);
userInfo.UpdateItem(remoteClient.AgentId, item);
// remoteClient.SendInventoryItemUpdate(item);

View File

@@ -39,7 +39,7 @@ namespace OpenSim.Region.Environment.Scenes
{
get { return m_rootPart.RotationOffset; }
}
/// <summary>
///
@@ -108,6 +108,12 @@ namespace OpenSim.Region.Environment.Scenes
get { return m_rootPart.OwnerID; }
}
public string Text
{
get { return m_rootPart.Text; }
set { m_rootPart.Text = value; }
}
/// <summary>
/// Added because the Parcel code seems to use it
/// but not sure a object should have this
@@ -143,19 +149,40 @@ namespace OpenSim.Region.Environment.Scenes
StringReader sr = new StringReader(xmlData);
XmlTextReader reader = new XmlTextReader(sr);
reader.Read();
reader.ReadStartElement("SceneObjectGroup");
reader.ReadStartElement("RootPart");
this.m_rootPart = SceneObjectPart.FromXml(reader);
reader.ReadEndElement();
//TODO: read and create rest of the parts
reader.ReadEndElement();
while (reader.Read())
{
switch (reader.NodeType)
{
case XmlNodeType.Element:
if (reader.Name == "Part")
{
reader.Read();
SceneObjectPart Part = SceneObjectPart.FromXml(reader);
Part.LocalID = m_scene.PrimIDAllocate();
this.AddPart(Part);
Part.RegionHandle = m_regionHandle;
}
break;
case XmlNodeType.EndElement:
break;
}
}
reader.Close();
sr.Close();
this.m_rootPart.SetParent(this);
this.m_parts.Add(m_rootPart.UUID, m_rootPart);
this.m_rootPart.LocalID = m_scene.PrimIDAllocate();
this.m_rootPart.ParentID = 0;
this.m_rootPart.RegionHandle = m_regionHandle;
this.UpdateParentIDs();
m_scene.EventManager.OnBackup += this.ProcessBackup;
this.ScheduleGroupForFullUpdate();
}
/// <summary>
@@ -192,6 +219,17 @@ namespace OpenSim.Region.Environment.Scenes
writer.WriteStartElement(String.Empty, "RootPart", String.Empty);
m_rootPart.ToXml(writer);
writer.WriteEndElement();
writer.WriteStartElement(String.Empty, "OtherParts", String.Empty);
foreach (SceneObjectPart part in this.m_parts.Values)
{
if (part.UUID != this.m_rootPart.UUID)
{
writer.WriteStartElement(String.Empty, "Part", String.Empty);
part.ToXml(writer);
writer.WriteEndElement();
}
}
writer.WriteEndElement();
writer.WriteEndElement();
writer.Close();
// System.Console.WriteLine("prim: " + sw.ToString());
@@ -215,11 +253,11 @@ namespace OpenSim.Region.Environment.Scenes
dupe.m_regionHandle = this.m_regionHandle;
dupe.CopyRootPart(this.m_rootPart);
List<SceneObjectPart> partList = new List<SceneObjectPart>(this.m_parts.Values);
foreach (SceneObjectPart part in partList)
{
if (part.UUID != this.m_rootPart.UUID)
if (part.UUID != this.m_rootPart.UUID)
{
dupe.CopyPart(part);
}
@@ -477,13 +515,6 @@ namespace OpenSim.Region.Environment.Scenes
}
}
public string Text
{
get { return m_rootPart.Text; }
set { m_rootPart.Text = value; }
}
public void SetPartText(string text, uint localID)
{
SceneObjectPart part = this.GetChildPrim(localID);
@@ -502,6 +533,26 @@ namespace OpenSim.Region.Environment.Scenes
}
}
public string GetPartName(uint localID)
{
SceneObjectPart part = this.GetChildPrim(localID);
if (part != null)
{
return part.PartName;
}
return "";
}
public string GetPartDescription(uint localID)
{
SceneObjectPart part = this.GetChildPrim(localID);
if (part != null)
{
return part.Description;
}
return "";
}
/// <summary>
///
/// </summary>
@@ -598,7 +649,7 @@ namespace OpenSim.Region.Environment.Scenes
SceneObjectPart part = this.GetChildPrim(localID);
if (part != null)
{
if (part.UUID== this.m_rootPart.UUID)
if (part.UUID == this.m_rootPart.UUID)
{
this.UpdateRootPosition(pos);
}
@@ -805,14 +856,14 @@ namespace OpenSim.Region.Environment.Scenes
public override void UpdateMovement()
{
foreach( SceneObjectPart part in m_parts.Values )
foreach (SceneObjectPart part in m_parts.Values)
{
part.UpdateMovement();
}
base.UpdateMovement();
}
/// <summary>
/// Added as a way for the storage provider to reset the scene,
/// most likely a better way to do this sort of thing but for now...
@@ -857,8 +908,8 @@ namespace OpenSim.Region.Environment.Scenes
}
return null;
}
public void UpdateText( string text )
public void UpdateText(string text)
{
m_rootPart.Text = text;
m_rootPart.ScheduleTerseUpdate();
@@ -866,7 +917,7 @@ namespace OpenSim.Region.Environment.Scenes
public void ObjectGrabHandler(uint localId, LLVector3 offsetPos, IClientAPI remoteClient)
{
if( m_rootPart.LocalID == localId )
if (m_rootPart.LocalID == localId)
{
OnGrabGroup(offsetPos, remoteClient);
}
@@ -886,5 +937,18 @@ namespace OpenSim.Region.Environment.Scenes
{
}
public void DeleteGroup()
{
m_scene.EventManager.OnBackup -= this.ProcessBackup;
foreach (SceneObjectPart part in this.m_parts.Values)
{
List<ScenePresence> avatars = this.RequestSceneAvatars();
for (int i = 0; i < avatars.Count; i++)
{
avatars[i].ControllingClient.SendKillObject(this.m_regionHandle, part.LocalID);
}
}
}
}
}