* More attachment stuff, reworked some of the inventory routines to be what I need them to be for attachments.
parent
7cb78d73eb
commit
f71871bca3
|
@ -643,14 +643,14 @@ namespace OpenSim.Framework
|
|||
void SendPrimitiveToClient(ulong regionHandle, ushort timeDilation, uint localID, PrimitiveBaseShape primShape,
|
||||
LLVector3 pos, uint flags, LLUUID objectID, LLUUID ownerID, string text, byte[] color,
|
||||
uint parentID, byte[] particleSystem, LLQuaternion rotation, byte clickAction, byte[] textureanimation,
|
||||
bool attachment, uint AttachmentPoint);
|
||||
bool attachment, uint AttachmentPoint, LLUUID AssetId);
|
||||
|
||||
void SendPrimitiveToClient(ulong regionHandle, ushort timeDilation, uint localID, PrimitiveBaseShape primShape,
|
||||
LLVector3 pos, uint flags, LLUUID objectID, LLUUID ownerID, string text, byte[] color,
|
||||
uint parentID, byte[] particleSystem, LLQuaternion rotation, byte clickAction);
|
||||
|
||||
void SendPrimTerseUpdate(ulong regionHandle, ushort timeDilation, uint localID, LLVector3 position,
|
||||
LLQuaternion rotation, byte state);
|
||||
LLQuaternion rotation, byte state, LLUUID AssetId);
|
||||
|
||||
void SendPrimTerseUpdate(ulong regionHandle, ushort timeDilation, uint localID, LLVector3 position,
|
||||
LLQuaternion rotation, LLVector3 velocity, LLVector3 rotationalvelocity);
|
||||
|
|
|
@ -2018,13 +2018,13 @@ namespace OpenSim.Region.ClientStack
|
|||
|
||||
SendPrimitiveToClient(regionHandle, timeDilation, localID, primShape, pos, flags,
|
||||
objectID, ownerID, text, color, parentID, particleSystem,
|
||||
rotation, clickAction, textureanim, false,(uint)0);
|
||||
rotation, clickAction, textureanim, false,(uint)0, LLUUID.Zero);
|
||||
}
|
||||
public void SendPrimitiveToClient(
|
||||
ulong regionHandle, ushort timeDilation, uint localID, PrimitiveBaseShape primShape, LLVector3 pos,
|
||||
uint flags,
|
||||
LLUUID objectID, LLUUID ownerID, string text, byte[] color, uint parentID, byte[] particleSystem,
|
||||
LLQuaternion rotation, byte clickAction, byte[] textureanim, bool attachment, uint AttachPoint)
|
||||
LLQuaternion rotation, byte clickAction, byte[] textureanim, bool attachment, uint AttachPoint, LLUUID AssetId)
|
||||
{
|
||||
ObjectUpdatePacket outPacket = (ObjectUpdatePacket)PacketPool.Instance.GetPacket(PacketType.ObjectUpdate);
|
||||
// TODO: don't create new blocks if recycling an old packet
|
||||
|
@ -2063,7 +2063,7 @@ namespace OpenSim.Region.ClientStack
|
|||
|
||||
// Item from inventory???
|
||||
outPacket.ObjectData[0].NameValue =
|
||||
Helpers.StringToField("AttachItemID STRING RW SV " + objectID.UUID);
|
||||
Helpers.StringToField("AttachItemID STRING RW SV " + AssetId.UUID);
|
||||
outPacket.ObjectData[0].State = (byte)((AttachPoint % 16) * 16 + (AttachPoint / 16));
|
||||
}
|
||||
|
||||
|
@ -2093,7 +2093,7 @@ namespace OpenSim.Region.ClientStack
|
|||
/// <param name="position"></param>
|
||||
/// <param name="rotation"></param>
|
||||
public void SendPrimTerseUpdate(ulong regionHandle, ushort timeDilation, uint localID, LLVector3 position,
|
||||
LLQuaternion rotation, byte state)
|
||||
LLQuaternion rotation, byte state, LLUUID AssetId)
|
||||
{
|
||||
LLVector3 velocity = new LLVector3(0f, 0f, 0f);
|
||||
LLVector3 rotationalvelocity = new LLVector3(0f, 0f, 0f);
|
||||
|
@ -2102,7 +2102,7 @@ namespace OpenSim.Region.ClientStack
|
|||
terse.RegionData.RegionHandle = regionHandle;
|
||||
terse.RegionData.TimeDilation = timeDilation;
|
||||
terse.ObjectData = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[1];
|
||||
terse.ObjectData[0] = CreatePrimImprovedBlock(localID, position, rotation, velocity, rotationalvelocity, state);
|
||||
terse.ObjectData[0] = CreatePrimImprovedBlock(localID, position, rotation, velocity, rotationalvelocity, state); // AssetID should fall into here probably somehow...
|
||||
terse.Header.Reliable = false;
|
||||
OutPacket(terse, ThrottleOutPacketType.Task);
|
||||
}
|
||||
|
@ -2305,8 +2305,9 @@ namespace OpenSim.Region.ClientStack
|
|||
bytes[i++] = (byte)((rvely >> 8) % 256);
|
||||
bytes[i++] = (byte)(rvelz % 256);
|
||||
bytes[i++] = (byte)((rvelz >> 8) % 256);
|
||||
|
||||
dat.Data = bytes;
|
||||
|
||||
|
||||
return dat;
|
||||
}
|
||||
|
||||
|
|
|
@ -322,6 +322,22 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
// Calls attach with a Zero position
|
||||
AttachObject(remoteClient, objectLocalID, AttachmentPt, rot, LLVector3.Zero);
|
||||
}
|
||||
public void RezSingleAttachment(IClientAPI remoteClient, LLUUID itemID, uint AttachmentPt,
|
||||
uint ItemFlags, uint NextOwnerMask)
|
||||
{
|
||||
SceneObjectGroup objatt = m_parentScene.RezObject(remoteClient, itemID, LLVector3.Zero, LLVector3.Zero, LLUUID.Zero, (byte)1, true,
|
||||
(uint)(PermissionMask.Copy | PermissionMask.Move | PermissionMask.Modify | PermissionMask.Transfer),
|
||||
(uint)(PermissionMask.Copy | PermissionMask.Move | PermissionMask.Modify | PermissionMask.Transfer),
|
||||
(uint)(PermissionMask.Copy | PermissionMask.Move | PermissionMask.Modify | PermissionMask.Transfer),
|
||||
ItemFlags, false, false, remoteClient.AgentId, true);
|
||||
|
||||
if (objatt != null)
|
||||
{
|
||||
AttachObject(remoteClient,objatt.LocalId,AttachmentPt,new LLQuaternion(0,0,0,1),objatt.AbsolutePosition);
|
||||
objatt.ScheduleGroupForFullUpdate();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public void AttachObject(IClientAPI remoteClient, uint objectLocalID, uint AttachmentPt, LLQuaternion rot, LLVector3 attachPos)
|
||||
{
|
||||
|
@ -338,14 +354,25 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
// Check object for stored attachment point
|
||||
AttachmentPt = (uint)group.GetAttachmentPoint();
|
||||
|
||||
|
||||
// if we still didn't find a suitable attachment point.......
|
||||
if (AttachmentPt == 0)
|
||||
{
|
||||
AttachmentPt = (uint)AttachmentPoint.LeftHand;
|
||||
attachPos = LLVector3.Zero;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
// Saves and gets assetID
|
||||
if (group.GetFromAssetID() == LLUUID.Zero)
|
||||
{
|
||||
LLUUID newAssetID = m_parentScene.attachObjectAssetStore(remoteClient, group, remoteClient.AgentId);
|
||||
|
||||
// sets assetID so client can show asset as 'attached' in inventory
|
||||
group.SetFromAssetID(newAssetID);
|
||||
}
|
||||
group.AttachToAgent(remoteClient.AgentId, AttachmentPt, attachPos);
|
||||
|
||||
}
|
||||
|
|
|
@ -1002,9 +1002,65 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
}
|
||||
}
|
||||
}
|
||||
public LLUUID attachObjectAssetStore(IClientAPI remoteClient, SceneObjectGroup grp, LLUUID AgentId)
|
||||
{
|
||||
SceneObjectGroup objectGroup = grp;
|
||||
if (objectGroup != null)
|
||||
{
|
||||
string sceneObjectXml = objectGroup.ToXmlString();
|
||||
|
||||
CachedUserInfo userInfo =
|
||||
CommsManager.UserProfileCacheService.GetUserDetails(AgentId);
|
||||
if (userInfo != null)
|
||||
{
|
||||
AssetBase asset = CreateAsset(
|
||||
objectGroup.GetPartName(objectGroup.LocalId),
|
||||
objectGroup.GetPartDescription(objectGroup.LocalId),
|
||||
(sbyte)InventoryType.Object,
|
||||
(sbyte)AssetType.Object,
|
||||
Helpers.StringToField(sceneObjectXml));
|
||||
AssetCache.AddAsset(asset);
|
||||
|
||||
InventoryItemBase item = new InventoryItemBase();
|
||||
item.Creator = objectGroup.RootPart.CreatorID;
|
||||
item.Owner = remoteClient.AgentId;
|
||||
item.ID = LLUUID.Random();
|
||||
item.AssetID = asset.FullID;
|
||||
item.Description = asset.Description;
|
||||
item.Name = asset.Name;
|
||||
item.AssetType = asset.Type;
|
||||
item.InvType = asset.InvType;
|
||||
|
||||
// Sticking it in root folder for now.. objects folder later?
|
||||
|
||||
item.Folder = userInfo.RootFolder.ID;// DeRezPacket.AgentBlock.DestinationID;
|
||||
item.EveryOnePermissions = objectGroup.RootPart.EveryoneMask;
|
||||
if (remoteClient.AgentId != objectGroup.RootPart.OwnerID)
|
||||
{
|
||||
item.BasePermissions = objectGroup.RootPart.NextOwnerMask;
|
||||
item.CurrentPermissions = objectGroup.RootPart.NextOwnerMask;
|
||||
item.NextPermissions = objectGroup.RootPart.NextOwnerMask;
|
||||
}
|
||||
else
|
||||
{
|
||||
item.BasePermissions = objectGroup.RootPart.BaseMask;
|
||||
item.CurrentPermissions = objectGroup.RootPart.OwnerMask;
|
||||
item.NextPermissions = objectGroup.RootPart.NextOwnerMask;
|
||||
}
|
||||
|
||||
userInfo.AddItem(remoteClient.AgentId, item);
|
||||
remoteClient.SendInventoryItemCreateUpdate(item);
|
||||
return item.AssetID;
|
||||
}
|
||||
return LLUUID.Zero;
|
||||
}
|
||||
return LLUUID.Zero;
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Rez an object into a scene
|
||||
/// Event Handler Rez an object into a scene
|
||||
/// Calls the non-void event handler
|
||||
/// </summary>
|
||||
/// <param name="remoteClient"></param>
|
||||
/// <param name="itemID"></param>
|
||||
|
@ -1024,6 +1080,38 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
LLUUID RayTargetID, byte BypassRayCast, bool RayEndIsIntersection,
|
||||
uint EveryoneMask, uint GroupMask, uint NextOwnerMask, uint ItemFlags,
|
||||
bool RezSelected, bool RemoveItem, LLUUID fromTaskID)
|
||||
{
|
||||
SceneObjectGroup sog = RezObject(remoteClient, itemID, RayEnd, RayStart,
|
||||
RayTargetID, BypassRayCast, RayEndIsIntersection,
|
||||
EveryoneMask, GroupMask, NextOwnerMask, ItemFlags,
|
||||
RezSelected, RemoveItem, fromTaskID, false);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Returns SceneObjectGroup or null from asset request.
|
||||
/// </summary>
|
||||
/// <param name="remoteClient"></param>
|
||||
/// <param name="itemID"></param>
|
||||
/// <param name="RayEnd"></param>
|
||||
/// <param name="RayStart"></param>
|
||||
/// <param name="RayTargetID"></param>
|
||||
/// <param name="BypassRayCast"></param>
|
||||
/// <param name="RayEndIsIntersection"></param>
|
||||
/// <param name="EveryoneMask"></param>
|
||||
/// <param name="GroupMask"></param>
|
||||
/// <param name="NextOwnerMask"></param>
|
||||
/// <param name="ItemFlags"></param>
|
||||
/// <param name="RezSelected"></param>
|
||||
/// <param name="RemoveItem"></param>
|
||||
/// <param name="fromTaskID"></param>
|
||||
/// <param name="difference"></param>
|
||||
/// <returns></returns>
|
||||
public virtual SceneObjectGroup RezObject(IClientAPI remoteClient, LLUUID itemID, LLVector3 RayEnd, LLVector3 RayStart,
|
||||
LLUUID RayTargetID, byte BypassRayCast, bool RayEndIsIntersection,
|
||||
uint EveryoneMask, uint GroupMask, uint NextOwnerMask, uint ItemFlags,
|
||||
bool RezSelected, bool RemoveItem, LLUUID fromTaskID, bool attachment)
|
||||
{
|
||||
// Work out position details
|
||||
byte bRayEndIsIntersection = (byte)0;
|
||||
|
@ -1042,9 +1130,9 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
RayStart, RayEnd, RayTargetID, new LLQuaternion(0, 0, 0, 1),
|
||||
BypassRayCast, bRayEndIsIntersection);
|
||||
|
||||
if (!PermissionsMngr.CanRezObject(remoteClient.AgentId, pos))
|
||||
if (!PermissionsMngr.CanRezObject(remoteClient.AgentId, pos) && !attachment)
|
||||
{
|
||||
return;
|
||||
return null;
|
||||
}
|
||||
|
||||
// Rez object
|
||||
|
@ -1064,7 +1152,14 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
SceneObjectGroup group = new SceneObjectGroup(this, m_regionHandle, xmlData);
|
||||
group.ResetIDs();
|
||||
AddEntity(group);
|
||||
group.AbsolutePosition = pos;
|
||||
|
||||
// if attachment we set it's asset id so object updates can reflect that
|
||||
// if not, we set it's position in world.
|
||||
if (!attachment)
|
||||
group.AbsolutePosition = pos;
|
||||
else
|
||||
group.SetFromAssetID(itemID);
|
||||
|
||||
SceneObjectPart rootPart = group.GetChildPart(group.UUID);
|
||||
|
||||
// Since renaming the item in the inventory does not affect the name stored
|
||||
|
@ -1092,34 +1187,18 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
group.ApplyPhysics(m_physicalPrim);
|
||||
group.StartScripts();
|
||||
|
||||
//bool UsePhysics = (((rootPart.ObjectFlags & (uint)LLObject.ObjectFlags.Physics) > 0)&& m_physicalPrim);
|
||||
//if ((rootPart.ObjectFlags & (uint) LLObject.ObjectFlags.Phantom) == 0)
|
||||
//{
|
||||
//PrimitiveBaseShape pbs = rootPart.Shape;
|
||||
//rootPart.PhysActor = PhysicsScene.AddPrimShape(
|
||||
//rootPart.Name,
|
||||
//pbs,
|
||||
//new PhysicsVector(rootPart.AbsolutePosition.X, rootPart.AbsolutePosition.Y,
|
||||
// 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), UsePhysics);
|
||||
|
||||
// rootPart.DoPhysicsPropertyUpdate(UsePhysics, true);
|
||||
if (!attachment)
|
||||
rootPart.ScheduleFullUpdate();
|
||||
|
||||
// }
|
||||
//
|
||||
rootPart.ScheduleFullUpdate();
|
||||
return rootPart.ParentGroup;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public void RezSingleAttachment(IClientAPI remoteClient, LLUUID itemID, uint AttachmentPt,
|
||||
uint ItemFlags, uint NextOwnerMask)
|
||||
{
|
||||
Console.WriteLine("RezSingleAttachment: unimplemented yet");
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1559,7 +1559,7 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
client.OnGrabUpdate += m_innerScene.MoveObject;
|
||||
client.OnDeRezObject += DeRezObject;
|
||||
client.OnRezObject += RezObject;
|
||||
client.OnRezSingleAttachmentFromInv += RezSingleAttachment;
|
||||
client.OnRezSingleAttachmentFromInv += m_innerScene.RezSingleAttachment;
|
||||
client.OnObjectAttach += m_innerScene.AttachObject;
|
||||
client.OnObjectDetach += m_innerScene.DetachObject;
|
||||
client.OnNameFromUUIDRequest += CommsManager.HandleUUIDNameRequest;
|
||||
|
|
|
@ -30,6 +30,7 @@ using System.Collections.Generic;
|
|||
using System.Drawing;
|
||||
using System.IO;
|
||||
using System.Xml;
|
||||
using System.Xml.Serialization;
|
||||
using Axiom.Math;
|
||||
using libsecondlife;
|
||||
using libsecondlife.Packets;
|
||||
|
@ -91,6 +92,7 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
public bool HasGroupChanged = false;
|
||||
|
||||
|
||||
|
||||
private LLVector3 lastPhysGroupPos;
|
||||
private LLQuaternion lastPhysGroupRot;
|
||||
|
||||
|
@ -484,6 +486,26 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
{
|
||||
}
|
||||
|
||||
public void SetFromAssetID(LLUUID AssetId)
|
||||
{
|
||||
lock (m_parts)
|
||||
{
|
||||
foreach (SceneObjectPart part in m_parts.Values)
|
||||
{
|
||||
part.fromAssetID = AssetId;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public LLUUID GetFromAssetID()
|
||||
{
|
||||
if (m_rootPart != null)
|
||||
{
|
||||
return m_rootPart.fromAssetID;
|
||||
}
|
||||
return LLUUID.Zero;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Hooks this object up to the backup event so that it is persisted to the database when the update thread executes.
|
||||
/// </summary>
|
||||
|
|
|
@ -104,6 +104,7 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
[XmlIgnore] public uint m_attachmentPoint = (byte)0;
|
||||
[XmlIgnore] public LLUUID m_attachedAvatar = LLUUID.Zero;
|
||||
[XmlIgnore] public LLVector3 m_attachedPos = LLVector3.Zero;
|
||||
[XmlIgnore] public LLUUID fromAssetID = LLUUID.Zero;
|
||||
|
||||
public Int32 CreationDate;
|
||||
public uint ParentID = 0;
|
||||
|
@ -2251,7 +2252,7 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
byte[] color = new byte[] {m_color.R, m_color.G, m_color.B, m_color.A};
|
||||
remoteClient.SendPrimitiveToClient(m_regionHandle, (ushort)(m_parentGroup.GetTimeDilation() * (float)ushort.MaxValue), LocalId, m_shape, lPos, clientFlags, m_uuid,
|
||||
OwnerID,
|
||||
m_text, color, ParentID, m_particleSystem, lRot, m_clickAction, m_TextureAnimation, m_IsAttachment, m_attachmentPoint);
|
||||
m_text, color, ParentID, m_particleSystem, lRot, m_clickAction, m_TextureAnimation, m_IsAttachment, m_attachmentPoint,fromAssetID);
|
||||
}
|
||||
|
||||
/// Terse updates
|
||||
|
@ -2297,7 +2298,7 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
LLQuaternion mRot = RotationOffset;
|
||||
if ((ObjectFlags & (uint) LLObject.ObjectFlags.Physics) == 0)
|
||||
{
|
||||
remoteClient.SendPrimTerseUpdate(m_regionHandle, (ushort)(m_parentGroup.GetTimeDilation() * (float)ushort.MaxValue), LocalId, lPos, mRot, Shape.State);
|
||||
remoteClient.SendPrimTerseUpdate(m_regionHandle, (ushort)(m_parentGroup.GetTimeDilation() * (float)ushort.MaxValue), LocalId, lPos, mRot, Shape.State, fromAssetID);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -2312,13 +2313,13 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
LLQuaternion mRot = RotationOffset;
|
||||
if (m_IsAttachment)
|
||||
{
|
||||
remoteClient.SendPrimTerseUpdate(m_regionHandle, (ushort)(m_parentGroup.GetTimeDilation() * (float)ushort.MaxValue), LocalId, lPos, mRot, (byte)((m_attachmentPoint % 16) * 16 + (m_attachmentPoint / 16)));
|
||||
remoteClient.SendPrimTerseUpdate(m_regionHandle, (ushort)(m_parentGroup.GetTimeDilation() * (float)ushort.MaxValue), LocalId, lPos, mRot, (byte)((m_attachmentPoint % 16) * 16 + (m_attachmentPoint / 16)),fromAssetID);
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((ObjectFlags & (uint)LLObject.ObjectFlags.Physics) == 0)
|
||||
{
|
||||
remoteClient.SendPrimTerseUpdate(m_regionHandle, (ushort)(m_parentGroup.GetTimeDilation() * (float)ushort.MaxValue), LocalId, lPos, mRot, Shape.State);
|
||||
remoteClient.SendPrimTerseUpdate(m_regionHandle, (ushort)(m_parentGroup.GetTimeDilation() * (float)ushort.MaxValue), LocalId, lPos, mRot, Shape.State, fromAssetID);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
@ -383,11 +383,11 @@ namespace OpenSim.Region.Examples.SimpleModule
|
|||
LLUUID objectID, LLUUID ownerID, string text, byte[] color,
|
||||
uint parentID,
|
||||
byte[] particleSystem, LLQuaternion rotation, byte clickAction, byte[] textureanimation,
|
||||
bool attachment, uint AttachmentPoint)
|
||||
bool attachment, uint AttachmentPoint, LLUUID AssetId)
|
||||
{
|
||||
}
|
||||
public virtual void SendPrimTerseUpdate(ulong regionHandle, ushort timeDilation, uint localID,
|
||||
LLVector3 position, LLQuaternion rotation, byte state)
|
||||
LLVector3 position, LLQuaternion rotation, byte state, LLUUID AssetId)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue