* More attachment stuff, reworked some of the inventory routines to be what I need them to be for attachments.

0.6.0-stable
Teravus Ovares 2008-04-27 14:37:51 +00:00
parent 7cb78d73eb
commit f71871bca3
8 changed files with 171 additions and 41 deletions

View File

@ -643,14 +643,14 @@ namespace OpenSim.Framework
void SendPrimitiveToClient(ulong regionHandle, ushort timeDilation, uint localID, PrimitiveBaseShape primShape, void SendPrimitiveToClient(ulong regionHandle, ushort timeDilation, uint localID, PrimitiveBaseShape primShape,
LLVector3 pos, uint flags, LLUUID objectID, LLUUID ownerID, string text, byte[] color, LLVector3 pos, uint flags, LLUUID objectID, LLUUID ownerID, string text, byte[] color,
uint parentID, byte[] particleSystem, LLQuaternion rotation, byte clickAction, byte[] textureanimation, 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, void SendPrimitiveToClient(ulong regionHandle, ushort timeDilation, uint localID, PrimitiveBaseShape primShape,
LLVector3 pos, uint flags, LLUUID objectID, LLUUID ownerID, string text, byte[] color, LLVector3 pos, uint flags, LLUUID objectID, LLUUID ownerID, string text, byte[] color,
uint parentID, byte[] particleSystem, LLQuaternion rotation, byte clickAction); uint parentID, byte[] particleSystem, LLQuaternion rotation, byte clickAction);
void SendPrimTerseUpdate(ulong regionHandle, ushort timeDilation, uint localID, LLVector3 position, 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, void SendPrimTerseUpdate(ulong regionHandle, ushort timeDilation, uint localID, LLVector3 position,
LLQuaternion rotation, LLVector3 velocity, LLVector3 rotationalvelocity); LLQuaternion rotation, LLVector3 velocity, LLVector3 rotationalvelocity);

View File

@ -2018,13 +2018,13 @@ namespace OpenSim.Region.ClientStack
SendPrimitiveToClient(regionHandle, timeDilation, localID, primShape, pos, flags, SendPrimitiveToClient(regionHandle, timeDilation, localID, primShape, pos, flags,
objectID, ownerID, text, color, parentID, particleSystem, objectID, ownerID, text, color, parentID, particleSystem,
rotation, clickAction, textureanim, false,(uint)0); rotation, clickAction, textureanim, false,(uint)0, LLUUID.Zero);
} }
public void SendPrimitiveToClient( public void SendPrimitiveToClient(
ulong regionHandle, ushort timeDilation, uint localID, PrimitiveBaseShape primShape, LLVector3 pos, ulong regionHandle, ushort timeDilation, uint localID, PrimitiveBaseShape primShape, LLVector3 pos,
uint flags, uint flags,
LLUUID objectID, LLUUID ownerID, string text, byte[] color, uint parentID, byte[] particleSystem, 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); ObjectUpdatePacket outPacket = (ObjectUpdatePacket)PacketPool.Instance.GetPacket(PacketType.ObjectUpdate);
// TODO: don't create new blocks if recycling an old packet // TODO: don't create new blocks if recycling an old packet
@ -2063,7 +2063,7 @@ namespace OpenSim.Region.ClientStack
// Item from inventory??? // Item from inventory???
outPacket.ObjectData[0].NameValue = 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)); outPacket.ObjectData[0].State = (byte)((AttachPoint % 16) * 16 + (AttachPoint / 16));
} }
@ -2093,7 +2093,7 @@ namespace OpenSim.Region.ClientStack
/// <param name="position"></param> /// <param name="position"></param>
/// <param name="rotation"></param> /// <param name="rotation"></param>
public void SendPrimTerseUpdate(ulong regionHandle, ushort timeDilation, uint localID, LLVector3 position, 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 velocity = new LLVector3(0f, 0f, 0f);
LLVector3 rotationalvelocity = 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.RegionHandle = regionHandle;
terse.RegionData.TimeDilation = timeDilation; terse.RegionData.TimeDilation = timeDilation;
terse.ObjectData = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[1]; 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; terse.Header.Reliable = false;
OutPacket(terse, ThrottleOutPacketType.Task); OutPacket(terse, ThrottleOutPacketType.Task);
} }
@ -2305,8 +2305,9 @@ namespace OpenSim.Region.ClientStack
bytes[i++] = (byte)((rvely >> 8) % 256); bytes[i++] = (byte)((rvely >> 8) % 256);
bytes[i++] = (byte)(rvelz % 256); bytes[i++] = (byte)(rvelz % 256);
bytes[i++] = (byte)((rvelz >> 8) % 256); bytes[i++] = (byte)((rvelz >> 8) % 256);
dat.Data = bytes; dat.Data = bytes;
return dat; return dat;
} }

View File

@ -322,6 +322,22 @@ namespace OpenSim.Region.Environment.Scenes
// Calls attach with a Zero position // Calls attach with a Zero position
AttachObject(remoteClient, objectLocalID, AttachmentPt, rot, LLVector3.Zero); 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) 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 // Check object for stored attachment point
AttachmentPt = (uint)group.GetAttachmentPoint(); AttachmentPt = (uint)group.GetAttachmentPoint();
// if we still didn't find a suitable attachment point....... // if we still didn't find a suitable attachment point.......
if (AttachmentPt == 0) if (AttachmentPt == 0)
{ {
AttachmentPt = (uint)AttachmentPoint.LeftHand; 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); group.AttachToAgent(remoteClient.AgentId, AttachmentPt, attachPos);
} }

View File

@ -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> /// <summary>
/// Rez an object into a scene /// Event Handler Rez an object into a scene
/// Calls the non-void event handler
/// </summary> /// </summary>
/// <param name="remoteClient"></param> /// <param name="remoteClient"></param>
/// <param name="itemID"></param> /// <param name="itemID"></param>
@ -1024,6 +1080,38 @@ namespace OpenSim.Region.Environment.Scenes
LLUUID RayTargetID, byte BypassRayCast, bool RayEndIsIntersection, LLUUID RayTargetID, byte BypassRayCast, bool RayEndIsIntersection,
uint EveryoneMask, uint GroupMask, uint NextOwnerMask, uint ItemFlags, uint EveryoneMask, uint GroupMask, uint NextOwnerMask, uint ItemFlags,
bool RezSelected, bool RemoveItem, LLUUID fromTaskID) 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 // Work out position details
byte bRayEndIsIntersection = (byte)0; byte bRayEndIsIntersection = (byte)0;
@ -1042,9 +1130,9 @@ namespace OpenSim.Region.Environment.Scenes
RayStart, RayEnd, RayTargetID, new LLQuaternion(0, 0, 0, 1), RayStart, RayEnd, RayTargetID, new LLQuaternion(0, 0, 0, 1),
BypassRayCast, bRayEndIsIntersection); BypassRayCast, bRayEndIsIntersection);
if (!PermissionsMngr.CanRezObject(remoteClient.AgentId, pos)) if (!PermissionsMngr.CanRezObject(remoteClient.AgentId, pos) && !attachment)
{ {
return; return null;
} }
// Rez object // Rez object
@ -1064,7 +1152,14 @@ namespace OpenSim.Region.Environment.Scenes
SceneObjectGroup group = new SceneObjectGroup(this, m_regionHandle, xmlData); SceneObjectGroup group = new SceneObjectGroup(this, m_regionHandle, xmlData);
group.ResetIDs(); group.ResetIDs();
AddEntity(group); 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); SceneObjectPart rootPart = group.GetChildPart(group.UUID);
// Since renaming the item in the inventory does not affect the name stored // 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.ApplyPhysics(m_physicalPrim);
group.StartScripts(); group.StartScripts();
//bool UsePhysics = (((rootPart.ObjectFlags & (uint)LLObject.ObjectFlags.Physics) > 0)&& m_physicalPrim);
//if ((rootPart.ObjectFlags & (uint) LLObject.ObjectFlags.Phantom) == 0) if (!attachment)
//{ rootPart.ScheduleFullUpdate();
//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); return rootPart.ParentGroup;
// }
//
rootPart.ScheduleFullUpdate();
} }
} }
} }
} }
return null;
} }
public void RezSingleAttachment(IClientAPI remoteClient, LLUUID itemID, uint AttachmentPt,
uint ItemFlags, uint NextOwnerMask)
{
Console.WriteLine("RezSingleAttachment: unimplemented yet");
}
} }
} }

View File

@ -1559,7 +1559,7 @@ namespace OpenSim.Region.Environment.Scenes
client.OnGrabUpdate += m_innerScene.MoveObject; client.OnGrabUpdate += m_innerScene.MoveObject;
client.OnDeRezObject += DeRezObject; client.OnDeRezObject += DeRezObject;
client.OnRezObject += RezObject; client.OnRezObject += RezObject;
client.OnRezSingleAttachmentFromInv += RezSingleAttachment; client.OnRezSingleAttachmentFromInv += m_innerScene.RezSingleAttachment;
client.OnObjectAttach += m_innerScene.AttachObject; client.OnObjectAttach += m_innerScene.AttachObject;
client.OnObjectDetach += m_innerScene.DetachObject; client.OnObjectDetach += m_innerScene.DetachObject;
client.OnNameFromUUIDRequest += CommsManager.HandleUUIDNameRequest; client.OnNameFromUUIDRequest += CommsManager.HandleUUIDNameRequest;

View File

@ -30,6 +30,7 @@ using System.Collections.Generic;
using System.Drawing; using System.Drawing;
using System.IO; using System.IO;
using System.Xml; using System.Xml;
using System.Xml.Serialization;
using Axiom.Math; using Axiom.Math;
using libsecondlife; using libsecondlife;
using libsecondlife.Packets; using libsecondlife.Packets;
@ -89,6 +90,7 @@ namespace OpenSim.Region.Environment.Scenes
/// since the group's last persistent backup /// since the group's last persistent backup
/// </summary> /// </summary>
public bool HasGroupChanged = false; public bool HasGroupChanged = false;
private LLVector3 lastPhysGroupPos; private LLVector3 lastPhysGroupPos;
@ -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> /// <summary>
/// Hooks this object up to the backup event so that it is persisted to the database when the update thread executes. /// Hooks this object up to the backup event so that it is persisted to the database when the update thread executes.
/// </summary> /// </summary>

View File

@ -104,6 +104,7 @@ namespace OpenSim.Region.Environment.Scenes
[XmlIgnore] public uint m_attachmentPoint = (byte)0; [XmlIgnore] public uint m_attachmentPoint = (byte)0;
[XmlIgnore] public LLUUID m_attachedAvatar = LLUUID.Zero; [XmlIgnore] public LLUUID m_attachedAvatar = LLUUID.Zero;
[XmlIgnore] public LLVector3 m_attachedPos = LLVector3.Zero; [XmlIgnore] public LLVector3 m_attachedPos = LLVector3.Zero;
[XmlIgnore] public LLUUID fromAssetID = LLUUID.Zero;
public Int32 CreationDate; public Int32 CreationDate;
public uint ParentID = 0; 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}; 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, remoteClient.SendPrimitiveToClient(m_regionHandle, (ushort)(m_parentGroup.GetTimeDilation() * (float)ushort.MaxValue), LocalId, m_shape, lPos, clientFlags, m_uuid,
OwnerID, 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 /// Terse updates
@ -2297,7 +2298,7 @@ namespace OpenSim.Region.Environment.Scenes
LLQuaternion mRot = RotationOffset; LLQuaternion mRot = RotationOffset;
if ((ObjectFlags & (uint) LLObject.ObjectFlags.Physics) == 0) 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 else
{ {
@ -2312,13 +2313,13 @@ namespace OpenSim.Region.Environment.Scenes
LLQuaternion mRot = RotationOffset; LLQuaternion mRot = RotationOffset;
if (m_IsAttachment) 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 else
{ {
if ((ObjectFlags & (uint)LLObject.ObjectFlags.Physics) == 0) 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 else
{ {

View File

@ -383,11 +383,11 @@ namespace OpenSim.Region.Examples.SimpleModule
LLUUID objectID, LLUUID ownerID, string text, byte[] color, LLUUID objectID, LLUUID ownerID, string text, byte[] color,
uint parentID, uint parentID,
byte[] particleSystem, LLQuaternion rotation, byte clickAction, byte[] textureanimation, 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, public virtual void SendPrimTerseUpdate(ulong regionHandle, ushort timeDilation, uint localID,
LLVector3 position, LLQuaternion rotation, byte state) LLVector3 position, LLQuaternion rotation, byte state, LLUUID AssetId)
{ {
} }