small bit of refactoring

afrisby
MW 2007-10-18 19:17:07 +00:00
parent 05df857132
commit 19f8b14120
2 changed files with 484 additions and 476 deletions

View File

@ -1,473 +1,476 @@
/* /*
* Copyright (c) Contributors, http://opensimulator.org/ * Copyright (c) Contributors, http://opensimulator.org/
* See CONTRIBUTORS.TXT for a full list of copyright holders. * See CONTRIBUTORS.TXT for a full list of copyright holders.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met: * modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright * * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer. * notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright * * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the * notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution. * documentation and/or other materials provided with the distribution.
* * Neither the name of the OpenSim Project nor the * * Neither the name of the OpenSim Project nor the
* names of its contributors may be used to endorse or promote products * names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission. * derived from this software without specific prior written permission.
* *
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS AS IS AND ANY * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS AS IS AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * 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 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* *
*/ */
using Axiom.Math; using Axiom.Math;
using libsecondlife; using libsecondlife;
using libsecondlife.Packets; using libsecondlife.Packets;
using OpenSim.Framework.Communications.Cache; using OpenSim.Framework.Communications.Cache;
using OpenSim.Framework.Communications.Caches; using OpenSim.Framework.Communications.Caches;
using OpenSim.Framework.Interfaces; using OpenSim.Framework.Interfaces;
using OpenSim.Framework.Types; using OpenSim.Framework.Types;
using OpenSim.Framework.Utilities; using OpenSim.Framework.Utilities;
using OpenSim.Region.Physics.Manager; using OpenSim.Region.Physics.Manager;
namespace OpenSim.Region.Environment.Scenes namespace OpenSim.Region.Environment.Scenes
{ {
public partial class Scene public partial class Scene
{ {
//split these method into this partial as a lot of these (hopefully) are only temporary and won't be needed once Caps is more complete //split these method into this partial as a lot of these (hopefully) are only temporary and won't be needed once Caps is more complete
// or at least some of they can be moved somewhere else // or at least some of they can be moved somewhere else
public void AddInventoryItem(LLUUID avatarId, InventoryItemBase item) public void AddInventoryItem(LLUUID avatarId, InventoryItemBase item)
{ {
ScenePresence avatar; ScenePresence avatar;
if ( TryGetAvatar( avatarId, out avatar )) if ( TryGetAvatar( avatarId, out avatar ))
{ {
AddInventoryItem(avatar.ControllingClient, item); AddInventoryItem(avatar.ControllingClient, item);
} }
} }
public void AddInventoryItem(IClientAPI remoteClient, InventoryItemBase item) public void AddInventoryItem(IClientAPI remoteClient, InventoryItemBase item)
{ {
CachedUserInfo userInfo = commsManager.UserProfileCache.GetUserDetails(remoteClient.AgentId); CachedUserInfo userInfo = commsManager.UserProfileCache.GetUserDetails(remoteClient.AgentId);
if (userInfo != null) if (userInfo != null)
{ {
userInfo.AddItem(remoteClient.AgentId, item); userInfo.AddItem(remoteClient.AgentId, item);
remoteClient.SendInventoryItemUpdate(item); remoteClient.SendInventoryItemUpdate(item);
} }
} }
public LLUUID CapsUpdateInventoryItemAsset(LLUUID avatarId, LLUUID itemID, byte[] data) public LLUUID CapsUpdateInventoryItemAsset(LLUUID avatarId, LLUUID itemID, byte[] data)
{ {
ScenePresence avatar; ScenePresence avatar;
if (TryGetAvatar(avatarId, out avatar)) if (TryGetAvatar(avatarId, out avatar))
{ {
return CapsUpdateInventoryItemAsset(avatar.ControllingClient, itemID, data); return CapsUpdateInventoryItemAsset(avatar.ControllingClient, itemID, data);
} }
return LLUUID.Zero; return LLUUID.Zero;
} }
public LLUUID CapsUpdateInventoryItemAsset(IClientAPI remoteClient, LLUUID itemID, byte[] data) public LLUUID CapsUpdateInventoryItemAsset(IClientAPI remoteClient, LLUUID itemID, byte[] data)
{ {
CachedUserInfo userInfo = commsManager.UserProfileCache.GetUserDetails(remoteClient.AgentId); CachedUserInfo userInfo = commsManager.UserProfileCache.GetUserDetails(remoteClient.AgentId);
if (userInfo != null) if (userInfo != null)
{ {
if (userInfo.RootFolder != null) if (userInfo.RootFolder != null)
{ {
InventoryItemBase item = userInfo.RootFolder.HasItem(itemID); InventoryItemBase item = userInfo.RootFolder.HasItem(itemID);
if (item != null) if (item != null)
{ {
AssetBase asset; AssetBase asset;
asset = new AssetBase(); asset = new AssetBase();
asset.FullID = LLUUID.Random(); asset.FullID = LLUUID.Random();
asset.Type = (sbyte) item.assetType; asset.Type = (sbyte) item.assetType;
asset.InvType = (sbyte) item.invType; asset.InvType = (sbyte) item.invType;
asset.Name = item.inventoryName; asset.Name = item.inventoryName;
asset.Data = data; asset.Data = data;
commsManager.AssetCache.AddAsset(asset); commsManager.AssetCache.AddAsset(asset);
item.assetID = asset.FullID; item.assetID = asset.FullID;
userInfo.UpdateItem(remoteClient.AgentId, item); userInfo.UpdateItem(remoteClient.AgentId, item);
// remoteClient.SendInventoryItemUpdate(item); // remoteClient.SendInventoryItemUpdate(item);
if (item.invType == 7) if (item.invType == 7)
{ {
//do we want to know about updated note cards? //do we want to know about updated note cards?
} }
else if (item.invType == 10) else if (item.invType == 10)
{ {
// do we want to know about updated scripts // do we want to know about updated scripts
} }
return (asset.FullID); return (asset.FullID);
} }
} }
} }
return LLUUID.Zero; return LLUUID.Zero;
} }
public void UDPUpdateInventoryItemAsset(IClientAPI remoteClient, LLUUID transactionID, LLUUID assetID, public void UDPUpdateInventoryItemAsset(IClientAPI remoteClient, LLUUID transactionID, LLUUID assetID,
LLUUID itemID) LLUUID itemID)
{ {
CachedUserInfo userInfo = commsManager.UserProfileCache.GetUserDetails(remoteClient.AgentId); CachedUserInfo userInfo = commsManager.UserProfileCache.GetUserDetails(remoteClient.AgentId);
if (userInfo != null) if (userInfo != null)
{ {
if (userInfo.RootFolder != null) if (userInfo.RootFolder != null)
{ {
InventoryItemBase item = userInfo.RootFolder.HasItem(itemID); InventoryItemBase item = userInfo.RootFolder.HasItem(itemID);
if (item != null) if (item != null)
{ {
AgentAssetTransactions transactions = AgentAssetTransactions transactions =
commsManager.TransactionsManager.GetUserTransActions(remoteClient.AgentId); commsManager.TransactionsManager.GetUserTransActions(remoteClient.AgentId);
if (transactions != null) if (transactions != null)
{ {
AssetBase asset = null; AssetBase asset = null;
bool addToCache = false; bool addToCache = false;
asset = commsManager.AssetCache.GetAsset(assetID); asset = commsManager.AssetCache.GetAsset(assetID);
if (asset == null) if (asset == null)
{ {
asset = transactions.GetTransactionAsset(transactionID); asset = transactions.GetTransactionAsset(transactionID);
addToCache = true; addToCache = true;
} }
if (asset != null) if (asset != null)
{ {
if (asset.FullID == assetID) if (asset.FullID == assetID)
{ {
asset.Name = item.inventoryName; asset.Name = item.inventoryName;
asset.Description = item.inventoryDescription; asset.Description = item.inventoryDescription;
asset.InvType = (sbyte) item.invType; asset.InvType = (sbyte) item.invType;
asset.Type = (sbyte) item.assetType; asset.Type = (sbyte) item.assetType;
item.assetID = asset.FullID; item.assetID = asset.FullID;
if (addToCache) if (addToCache)
{ {
commsManager.AssetCache.AddAsset(asset); commsManager.AssetCache.AddAsset(asset);
} }
userInfo.UpdateItem(remoteClient.AgentId, item); userInfo.UpdateItem(remoteClient.AgentId, item);
} }
} }
} }
} }
} }
} }
} }
/// <summary> /// <summary>
/// temporary method to test out creating new inventory items /// temporary method to test out creating new inventory items
/// </summary> /// </summary>
/// <param name="remoteClient"></param> /// <param name="remoteClient"></param>
/// <param name="transActionID"></param> /// <param name="transActionID"></param>
/// <param name="folderID"></param> /// <param name="folderID"></param>
/// <param name="callbackID"></param> /// <param name="callbackID"></param>
/// <param name="description"></param> /// <param name="description"></param>
/// <param name="name"></param> /// <param name="name"></param>
/// <param name="invType"></param> /// <param name="invType"></param>
/// <param name="type"></param> /// <param name="type"></param>
/// <param name="wearableType"></param> /// <param name="wearableType"></param>
/// <param name="nextOwnerMask"></param> /// <param name="nextOwnerMask"></param>
public void CreateNewInventoryItem(IClientAPI remoteClient, LLUUID transActionID, LLUUID folderID, public void CreateNewInventoryItem(IClientAPI remoteClient, LLUUID transActionID, LLUUID folderID,
uint callbackID, string description, string name, sbyte invType, sbyte type, uint callbackID, string description, string name, sbyte invType, sbyte type,
byte wearableType, uint nextOwnerMask) byte wearableType, uint nextOwnerMask)
{ {
if (transActionID == LLUUID.Zero) if (transActionID == LLUUID.Zero)
{ {
CachedUserInfo userInfo = commsManager.UserProfileCache.GetUserDetails(remoteClient.AgentId); CachedUserInfo userInfo = commsManager.UserProfileCache.GetUserDetails(remoteClient.AgentId);
if (userInfo != null) if (userInfo != null)
{ {
AssetBase asset = new AssetBase(); AssetBase asset = new AssetBase();
asset.Name = name; asset.Name = name;
asset.Description = description; asset.Description = description;
asset.InvType = invType; asset.InvType = invType;
asset.Type = type; asset.Type = type;
asset.FullID = LLUUID.Random(); asset.FullID = LLUUID.Random();
asset.Data = new byte[1]; asset.Data = new byte[1];
commsManager.AssetCache.AddAsset(asset); commsManager.AssetCache.AddAsset(asset);
InventoryItemBase item = new InventoryItemBase(); InventoryItemBase item = new InventoryItemBase();
item.avatarID = remoteClient.AgentId; item.avatarID = remoteClient.AgentId;
item.creatorsID = remoteClient.AgentId; item.creatorsID = remoteClient.AgentId;
item.inventoryID = LLUUID.Random(); item.inventoryID = LLUUID.Random();
item.assetID = asset.FullID; item.assetID = asset.FullID;
item.inventoryDescription = description; item.inventoryDescription = description;
item.inventoryName = name; item.inventoryName = name;
item.assetType = invType; item.assetType = invType;
item.invType = invType; item.invType = invType;
item.parentFolderID = folderID; item.parentFolderID = folderID;
item.inventoryCurrentPermissions = 2147483647; item.inventoryCurrentPermissions = 2147483647;
item.inventoryNextPermissions = nextOwnerMask; item.inventoryNextPermissions = nextOwnerMask;
userInfo.AddItem(remoteClient.AgentId, item); userInfo.AddItem(remoteClient.AgentId, item);
remoteClient.SendInventoryItemUpdate(item); remoteClient.SendInventoryItemUpdate(item);
} }
} }
else else
{ {
commsManager.TransactionsManager.HandleInventoryFromTransaction(remoteClient, transActionID, folderID, commsManager.TransactionsManager.HandleInventoryFromTransaction(remoteClient, transActionID, folderID,
callbackID, description, name, invType, callbackID, description, name, invType,
type, wearableType, nextOwnerMask); type, wearableType, nextOwnerMask);
//System.Console.WriteLine("request to create inventory item from transaction " + transActionID); //System.Console.WriteLine("request to create inventory item from transaction " + transActionID);
} }
} }
/// <summary> /// <summary>
/// ///
/// </summary> /// </summary>
/// <param name="remoteClient"></param> /// <param name="remoteClient"></param>
/// <param name="primLocalID"></param> /// <param name="primLocalID"></param>
public void RequestTaskInventory(IClientAPI remoteClient, uint primLocalID) public void RequestTaskInventory(IClientAPI remoteClient, uint primLocalID)
{ {
bool hasPrim = false; bool hasPrim = false;
foreach (EntityBase ent in Entities.Values) foreach (EntityBase ent in Entities.Values)
{ {
if (ent is SceneObjectGroup) if (ent is SceneObjectGroup)
{ {
hasPrim = ((SceneObjectGroup) ent).HasChildPrim(primLocalID); hasPrim = ((SceneObjectGroup) ent).HasChildPrim(primLocalID);
if (hasPrim != false) if (hasPrim != false)
{ {
bool fileChange = ((SceneObjectGroup) ent).GetPartInventoryFileName(remoteClient, primLocalID); bool fileChange = ((SceneObjectGroup) ent).GetPartInventoryFileName(remoteClient, primLocalID);
if (fileChange) if (fileChange)
{ {
if (XferManager != null) if (XferManager != null)
{ {
((SceneObjectGroup) ent).RequestInventoryFile(primLocalID, XferManager); ((SceneObjectGroup) ent).RequestInventoryFile(primLocalID, XferManager);
} }
} }
break; break;
} }
} }
} }
} }
public void RemoveTaskInventory(IClientAPI remoteClient, LLUUID itemID, uint localID) public void RemoveTaskInventory(IClientAPI remoteClient, LLUUID itemID, uint localID)
{ {
bool hasPrim = false; bool hasPrim = false;
foreach (EntityBase ent in Entities.Values) foreach (EntityBase ent in Entities.Values)
{ {
if (ent is SceneObjectGroup) if (ent is SceneObjectGroup)
{ {
hasPrim = ((SceneObjectGroup) ent).HasChildPrim(localID); hasPrim = ((SceneObjectGroup) ent).HasChildPrim(localID);
if (hasPrim != false) if (hasPrim != false)
{ {
int type = ((SceneObjectGroup) ent).RemoveInventoryItem(remoteClient, localID, itemID); int type = ((SceneObjectGroup) ent).RemoveInventoryItem(remoteClient, localID, itemID);
((SceneObjectGroup) ent).GetProperites(remoteClient); ((SceneObjectGroup) ent).GetProperites(remoteClient);
if (type == 10) if (type == 10)
{ {
EventManager.TriggerRemoveScript(localID, itemID); EventManager.TriggerRemoveScript(localID, itemID);
} }
} }
} }
} }
} }
public void RezScript(IClientAPI remoteClient, LLUUID itemID, uint localID) public void RezScript(IClientAPI remoteClient, LLUUID itemID, uint localID)
{ {
CachedUserInfo userInfo = commsManager.UserProfileCache.GetUserDetails(remoteClient.AgentId); CachedUserInfo userInfo = commsManager.UserProfileCache.GetUserDetails(remoteClient.AgentId);
LLUUID copyID = LLUUID.Random(); LLUUID copyID = LLUUID.Random();
if (userInfo != null) if (userInfo != null)
{ {
if (userInfo.RootFolder != null) if (userInfo.RootFolder != null)
{ {
InventoryItemBase item = userInfo.RootFolder.HasItem(itemID); InventoryItemBase item = userInfo.RootFolder.HasItem(itemID);
if (item != null) if (item != null)
{ {
bool isTexture = false; bool isTexture = false;
bool rezzed = false; bool rezzed = false;
if (item.invType == 0) if (item.invType == 0)
{ {
isTexture = true; isTexture = true;
} }
AssetBase rezAsset = commsManager.AssetCache.GetAsset(item.assetID, isTexture); AssetBase rezAsset = commsManager.AssetCache.GetAsset(item.assetID, isTexture);
if (rezAsset != null) if (rezAsset != null)
{ {
string script = Util.FieldToString(rezAsset.Data); string script = Util.FieldToString(rezAsset.Data);
//Console.WriteLine("rez script "+script); //Console.WriteLine("rez script "+script);
EventManager.TriggerRezScript(localID, copyID, script); EventManager.TriggerRezScript(localID, copyID, script);
rezzed = true; rezzed = true;
} }
else else
{ {
//lets try once more incase the asset cache is being slow getting the asset from server //lets try once more incase the asset cache is being slow getting the asset from server
rezAsset = commsManager.AssetCache.GetAsset(item.assetID, isTexture); rezAsset = commsManager.AssetCache.GetAsset(item.assetID, isTexture);
if (rezAsset != null) if (rezAsset != null)
{ {
string script = Util.FieldToString(rezAsset.Data); string script = Util.FieldToString(rezAsset.Data);
// Console.WriteLine("rez script " + script); // Console.WriteLine("rez script " + script);
EventManager.TriggerRezScript(localID, copyID, script); EventManager.TriggerRezScript(localID, copyID, script);
rezzed = true; rezzed = true;
} }
} }
if (rezzed) if (rezzed)
{ {
bool hasPrim = false; bool hasPrim = false;
foreach (EntityBase ent in Entities.Values) foreach (EntityBase ent in Entities.Values)
{ {
if (ent is SceneObjectGroup) if (ent is SceneObjectGroup)
{ {
hasPrim = ((SceneObjectGroup) ent).HasChildPrim(localID); hasPrim = ((SceneObjectGroup) ent).HasChildPrim(localID);
if (hasPrim != false) if (hasPrim != false)
{ {
bool added = bool added =
((SceneObjectGroup) ent).AddInventoryItem(remoteClient, localID, item, ((SceneObjectGroup) ent).AddInventoryItem(remoteClient, localID, item,
copyID); copyID);
((SceneObjectGroup) ent).GetProperites(remoteClient); ((SceneObjectGroup) ent).GetProperites(remoteClient);
} }
} }
} }
} }
} }
} }
} }
} }
/// <summary> /// <summary>
/// ///
/// </summary> /// </summary>
/// <param name="packet"></param> /// <param name="packet"></param>
/// <param name="simClient"></param> /// <param name="simClient"></param>
public void DeRezObject(Packet packet, IClientAPI remoteClient) public void DeRezObject(Packet packet, IClientAPI remoteClient)
{ {
DeRezObjectPacket DeRezPacket = (DeRezObjectPacket) packet; DeRezObjectPacket DeRezPacket = (DeRezObjectPacket) packet;
if (DeRezPacket.AgentBlock.DestinationID == LLUUID.Zero) if (DeRezPacket.AgentBlock.DestinationID == LLUUID.Zero)
{ {
//currently following code not used (or don't know of any case of destination being zero //currently following code not used (or don't know of any case of destination being zero
} }
else else
{ {
foreach (DeRezObjectPacket.ObjectDataBlock Data in DeRezPacket.ObjectData) foreach (DeRezObjectPacket.ObjectDataBlock Data in DeRezPacket.ObjectData)
{ {
EntityBase selectedEnt = null; EntityBase selectedEnt = null;
//OpenSim.Framework.Console.MainConsole.Instance.WriteLine("LocalID:" + Data.ObjectLocalID.ToString()); //OpenSim.Framework.Console.MainConsole.Instance.WriteLine("LocalID:" + Data.ObjectLocalID.ToString());
foreach (EntityBase ent in Entities.Values) foreach (EntityBase ent in Entities.Values)
{ {
if (ent.LocalId == Data.ObjectLocalID) if (ent.LocalId == Data.ObjectLocalID)
{ {
selectedEnt = ent; selectedEnt = ent;
break; break;
} }
} }
if (selectedEnt != null) if (selectedEnt != null)
{ {
if (PermissionsMngr.CanDeRezObject(remoteClient.AgentId, ((SceneObjectGroup) selectedEnt).UUID)) if (PermissionsMngr.CanDeRezObject(remoteClient.AgentId, ((SceneObjectGroup) selectedEnt).UUID))
{ {
string sceneObjectXml = ((SceneObjectGroup) selectedEnt).ToXmlString(); string sceneObjectXml = ((SceneObjectGroup) selectedEnt).ToXmlString();
CachedUserInfo userInfo = commsManager.UserProfileCache.GetUserDetails(remoteClient.AgentId); CachedUserInfo userInfo = commsManager.UserProfileCache.GetUserDetails(remoteClient.AgentId);
if (userInfo != null) if (userInfo != null)
{ {
AssetBase asset = new AssetBase(); AssetBase asset = new AssetBase();
asset.Name = ((SceneObjectGroup) selectedEnt).GetPartName(selectedEnt.LocalId); asset.Name = ((SceneObjectGroup) selectedEnt).GetPartName(selectedEnt.LocalId);
asset.Description = asset.Description =
((SceneObjectGroup) selectedEnt).GetPartDescription(selectedEnt.LocalId); ((SceneObjectGroup) selectedEnt).GetPartDescription(selectedEnt.LocalId);
asset.InvType = 6; asset.InvType = 6;
asset.Type = 6; asset.Type = 6;
asset.FullID = LLUUID.Random(); asset.FullID = LLUUID.Random();
asset.Data = Helpers.StringToField(sceneObjectXml); asset.Data = Helpers.StringToField(sceneObjectXml);
commsManager.AssetCache.AddAsset(asset); commsManager.AssetCache.AddAsset(asset);
InventoryItemBase item = new InventoryItemBase(); InventoryItemBase item = new InventoryItemBase();
item.avatarID = remoteClient.AgentId; item.avatarID = remoteClient.AgentId;
item.creatorsID = remoteClient.AgentId; item.creatorsID = remoteClient.AgentId;
item.inventoryID = LLUUID.Random(); item.inventoryID = LLUUID.Random();
item.assetID = asset.FullID; item.assetID = asset.FullID;
item.inventoryDescription = asset.Description; item.inventoryDescription = asset.Description;
item.inventoryName = asset.Name; item.inventoryName = asset.Name;
item.assetType = asset.Type; item.assetType = asset.Type;
item.invType = asset.InvType; item.invType = asset.InvType;
item.parentFolderID = DeRezPacket.AgentBlock.DestinationID; item.parentFolderID = DeRezPacket.AgentBlock.DestinationID;
item.inventoryCurrentPermissions = 2147483647; item.inventoryCurrentPermissions = 2147483647;
item.inventoryNextPermissions = 2147483647; item.inventoryNextPermissions = 2147483647;
userInfo.AddItem(remoteClient.AgentId, item); userInfo.AddItem(remoteClient.AgentId, item);
remoteClient.SendInventoryItemUpdate(item); remoteClient.SendInventoryItemUpdate(item);
} }
SceneObjectPart rootPart = DeleteSceneObjectGroup((SceneObjectGroup)selectedEnt);
((SceneObjectGroup) selectedEnt).GetChildPart(((SceneObjectGroup) selectedEnt).UUID); }
if (rootPart.PhysActor != null) }
{ }
phyScene.RemovePrim(rootPart.PhysActor); }
rootPart.PhysActor = null; }
}
public void DeleteSceneObjectGroup(SceneObjectGroup group)
storageManager.DataStore.RemoveObject(((SceneObjectGroup) selectedEnt).UUID, {
m_regInfo.RegionID); SceneObjectPart rootPart = (group).GetChildPart(group.UUID);
((SceneObjectGroup) selectedEnt).DeleteGroup(); if (rootPart.PhysActor != null)
{
lock (Entities) phyScene.RemovePrim(rootPart.PhysActor);
{ rootPart.PhysActor = null;
Entities.Remove(((SceneObjectGroup) selectedEnt).UUID); }
}
((SceneObjectGroup) selectedEnt).DeleteParts(); storageManager.DataStore.RemoveObject(group.UUID, m_regInfo.RegionID);
} group.DeleteGroup();
}
} lock (Entities)
} {
} Entities.Remove(group.UUID);
}
public void RezObject(IClientAPI remoteClient, LLUUID itemID, LLVector3 pos) group.DeleteParts();
{ }
CachedUserInfo userInfo = commsManager.UserProfileCache.GetUserDetails(remoteClient.AgentId);
if (userInfo != null) public void RezObject(IClientAPI remoteClient, LLUUID itemID, LLVector3 pos)
{ {
if (userInfo.RootFolder != null) CachedUserInfo userInfo = commsManager.UserProfileCache.GetUserDetails(remoteClient.AgentId);
{ if (userInfo != null)
InventoryItemBase item = userInfo.RootFolder.HasItem(itemID); {
if (item != null) if (userInfo.RootFolder != null)
{ {
AssetBase rezAsset = commsManager.AssetCache.GetAsset(item.assetID, false); InventoryItemBase item = userInfo.RootFolder.HasItem(itemID);
if (rezAsset != null) if (item != null)
{ {
AddRezObject(Util.FieldToString(rezAsset.Data), pos); AssetBase rezAsset = commsManager.AssetCache.GetAsset(item.assetID, false);
userInfo.DeleteItem(remoteClient.AgentId, item); if (rezAsset != null)
remoteClient.SendRemoveInventoryItem(itemID); {
} AddRezObject(Util.FieldToString(rezAsset.Data), pos);
else userInfo.DeleteItem(remoteClient.AgentId, item);
{ remoteClient.SendRemoveInventoryItem(itemID);
//lets try once more incase the asset cache is being slow getting the asset from server }
rezAsset = commsManager.AssetCache.GetAsset(item.assetID, false); else
if (rezAsset != null) {
{ //lets try once more incase the asset cache is being slow getting the asset from server
AddRezObject(Util.FieldToString(rezAsset.Data), pos); rezAsset = commsManager.AssetCache.GetAsset(item.assetID, false);
userInfo.DeleteItem(remoteClient.AgentId, item); if (rezAsset != null)
remoteClient.SendRemoveInventoryItem(itemID); {
} 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, m_regionHandle, xmlData);
AddEntity(group); private void AddRezObject(string xmlData, LLVector3 pos)
group.AbsolutePosition = pos; {
SceneObjectPart rootPart = group.GetChildPart(group.UUID); SceneObjectGroup group = new SceneObjectGroup(this, m_regionHandle, xmlData);
if ((rootPart.ObjectFlags & (uint) LLObject.ObjectFlags.Phantom) == 0) AddEntity(group);
{ group.AbsolutePosition = pos;
PrimitiveBaseShape pbs = rootPart.Shape; SceneObjectPart rootPart = group.GetChildPart(group.UUID);
rootPart.PhysActor = phyScene.AddPrimShape( if ((rootPart.ObjectFlags & (uint) LLObject.ObjectFlags.Phantom) == 0)
rootPart.Name, {
pbs, PrimitiveBaseShape pbs = rootPart.Shape;
new PhysicsVector(rootPart.AbsolutePosition.X, rootPart.AbsolutePosition.Y, rootPart.PhysActor = phyScene.AddPrimShape(
rootPart.AbsolutePosition.Z), rootPart.Name,
new PhysicsVector(rootPart.Scale.X, rootPart.Scale.Y, rootPart.Scale.Z), pbs,
new Quaternion(rootPart.RotationOffset.W, rootPart.RotationOffset.X, new PhysicsVector(rootPart.AbsolutePosition.X, rootPart.AbsolutePosition.Y,
rootPart.RotationOffset.Y, rootPart.RotationOffset.Z)); rootPart.AbsolutePosition.Z),
} new PhysicsVector(rootPart.Scale.X, rootPart.Scale.Y, rootPart.Scale.Z),
} new Quaternion(rootPart.RotationOffset.W, rootPart.RotationOffset.X,
} rootPart.RotationOffset.Y, rootPart.RotationOffset.Z));
} }
}
}
}

View File

@ -270,26 +270,31 @@ namespace OpenSim.Region.Environment.Scenes
StringReader sr = new StringReader(xmlData); StringReader sr = new StringReader(xmlData);
XmlTextReader reader = new XmlTextReader(sr); XmlTextReader reader = new XmlTextReader(sr);
reader.Read(); reader.Read();
reader.ReadStartElement("SceneObjectGroup"); reader.ReadStartElement("SceneObjectGroup");
// reader.ReadStartElement("RootPart"); // reader.ReadStartElement("RootPart");
m_rootPart = SceneObjectPart.FromXml(reader); m_rootPart = SceneObjectPart.FromXml(reader);
//reader.ReadEndElement();
while (reader.Read()) reader.Read();
bool more = true;
while (more)
{ {
switch (reader.NodeType) switch (reader.NodeType)
{ {
case XmlNodeType.Element: case XmlNodeType.Element:
if (reader.Name == "SceneObjectPart") if (reader.Name == "SceneObjectPart")
{ {
// reader.Read();
SceneObjectPart Part = SceneObjectPart.FromXml(reader); SceneObjectPart Part = SceneObjectPart.FromXml(reader);
AddPart(Part); AddPart(Part);
} }
break; break;
case XmlNodeType.EndElement: case XmlNodeType.EndElement:
reader.Read();
break; break;
} }
more = !reader.EOF;
} }
reader.Close(); reader.Close();
sr.Close(); sr.Close();