Merge branch 'ubitworkmaster'
commit
56081dc5e1
|
@ -134,6 +134,21 @@ namespace OpenSim.Framework
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void Remove(List<uint> ids)
|
||||||
|
{
|
||||||
|
LookupItem lookup;
|
||||||
|
|
||||||
|
foreach (uint localid in ids)
|
||||||
|
{
|
||||||
|
if (m_lookupTable.TryGetValue(localid, out lookup))
|
||||||
|
{
|
||||||
|
lookup.Heap.Remove(lookup.Handle);
|
||||||
|
m_lookupTable.Remove(localid);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Remove an item from one of the queues. Specifically, it removes the
|
/// Remove an item from one of the queues. Specifically, it removes the
|
||||||
/// oldest item from the next queue in order to provide fair access to
|
/// oldest item from the next queue in order to provide fair access to
|
||||||
|
|
|
@ -1660,6 +1660,12 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
// foreach (uint id in localIDs)
|
// foreach (uint id in localIDs)
|
||||||
// m_log.DebugFormat("[CLIENT]: Sending KillObjectPacket to {0} for {1} in {2}", Name, id, regionHandle);
|
// m_log.DebugFormat("[CLIENT]: Sending KillObjectPacket to {0} for {1} in {2}", Name, id, regionHandle);
|
||||||
|
|
||||||
|
// remove pending entities
|
||||||
|
lock (m_entityProps.SyncRoot)
|
||||||
|
m_entityProps.Remove(localIDs);
|
||||||
|
lock (m_entityUpdates.SyncRoot)
|
||||||
|
m_entityUpdates.Remove(localIDs);
|
||||||
|
|
||||||
KillObjectPacket kill = (KillObjectPacket)PacketPool.Instance.GetPacket(PacketType.KillObject);
|
KillObjectPacket kill = (KillObjectPacket)PacketPool.Instance.GetPacket(PacketType.KillObject);
|
||||||
// TODO: don't create new blocks if recycling an old packet
|
// TODO: don't create new blocks if recycling an old packet
|
||||||
kill.ObjectData = new KillObjectPacket.ObjectDataBlock[localIDs.Count];
|
kill.ObjectData = new KillObjectPacket.ObjectDataBlock[localIDs.Count];
|
||||||
|
@ -1671,28 +1677,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
kill.Header.Reliable = true;
|
kill.Header.Reliable = true;
|
||||||
kill.Header.Zerocoded = true;
|
kill.Header.Zerocoded = true;
|
||||||
|
|
||||||
if (localIDs.Count == 1 && m_scene.GetScenePresence(localIDs[0]) != null)
|
|
||||||
{
|
|
||||||
OutPacket(kill, ThrottleOutPacketType.Task);
|
OutPacket(kill, ThrottleOutPacketType.Task);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
// We MUST lock for both manipulating the kill record and sending the packet, in order to avoid a race
|
|
||||||
// condition where a kill can be processed before an out-of-date update for the same object.
|
|
||||||
// ProcessEntityUpdates() also takes the m_killRecord lock.
|
|
||||||
// lock (m_killRecord)
|
|
||||||
// {
|
|
||||||
// foreach (uint localID in localIDs)
|
|
||||||
// m_killRecord.Add(localID);
|
|
||||||
|
|
||||||
// The throttle queue used here must match that being used for updates. Otherwise, there is a
|
|
||||||
// chance that a kill packet put on a separate queue will be sent to the client before an existing
|
|
||||||
// update packet on another queue. Receiving updates after kills results in unowned and undeletable
|
|
||||||
// scene objects in a viewer until that viewer is relogged in.
|
|
||||||
OutPacket(kill, ThrottleOutPacketType.Task);
|
|
||||||
// }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Send information about the items contained in a folder to the client.
|
/// Send information about the items contained in a folder to the client.
|
||||||
|
@ -5328,13 +5314,12 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
Vector3 velocity = new Vector3(0, 0, 0);
|
Vector3 velocity = new Vector3(0, 0, 0);
|
||||||
Vector3 acceleration = new Vector3(0, 0, 0);
|
Vector3 acceleration = new Vector3(0, 0, 0);
|
||||||
rotation.Normalize();
|
rotation.Normalize();
|
||||||
Vector3 vrot = new Vector3(rotation.X, rotation.Y, rotation.Z);
|
|
||||||
|
|
||||||
data.CollisionPlane.ToBytes(objectData, 0);
|
data.CollisionPlane.ToBytes(objectData, 0);
|
||||||
offsetPosition.ToBytes(objectData, 16);
|
offsetPosition.ToBytes(objectData, 16);
|
||||||
velocity.ToBytes(objectData, 28);
|
velocity.ToBytes(objectData, 28);
|
||||||
acceleration.ToBytes(objectData, 40);
|
acceleration.ToBytes(objectData, 40);
|
||||||
vrot.ToBytes(objectData, 52);
|
rotation.ToBytes(objectData, 52);
|
||||||
data.AngularVelocity.ToBytes(objectData, 64);
|
data.AngularVelocity.ToBytes(objectData, 64);
|
||||||
|
|
||||||
ObjectUpdatePacket.ObjectDataBlock update = new ObjectUpdatePacket.ObjectDataBlock();
|
ObjectUpdatePacket.ObjectDataBlock update = new ObjectUpdatePacket.ObjectDataBlock();
|
||||||
|
@ -5394,8 +5379,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
|
|
||||||
Quaternion rotation = data.RotationOffset;
|
Quaternion rotation = data.RotationOffset;
|
||||||
rotation.Normalize();
|
rotation.Normalize();
|
||||||
Vector3 vrot = new Vector3(rotation.X, rotation.Y, rotation.Z);
|
rotation.ToBytes(objectData, 36);
|
||||||
vrot.ToBytes(objectData, 36);
|
|
||||||
data.AngularVelocity.ToBytes(objectData, 48);
|
data.AngularVelocity.ToBytes(objectData, 48);
|
||||||
|
|
||||||
ObjectUpdatePacket.ObjectDataBlock update = new ObjectUpdatePacket.ObjectDataBlock();
|
ObjectUpdatePacket.ObjectDataBlock update = new ObjectUpdatePacket.ObjectDataBlock();
|
||||||
|
|
|
@ -981,10 +981,12 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
|
||||||
|
|
||||||
// May need to logout or other cleanup
|
// May need to logout or other cleanup
|
||||||
// AgentHasMovedAway(sp, logout);
|
// AgentHasMovedAway(sp, logout);
|
||||||
AgentHasMovedAway(sp, true); // until logout use is checked
|
// AgentHasMovedAway(sp, true); // until logout use is checked
|
||||||
|
|
||||||
// Well, this is it. The agent is over there.
|
// Well, this is it. The agent is over there.
|
||||||
KillEntity(sp.Scene, sp.LocalId);
|
// KillEntity(sp.Scene, sp.LocalId);
|
||||||
|
|
||||||
|
sp.HasMovedAway();
|
||||||
|
|
||||||
// Now let's make it officially a child agent
|
// Now let's make it officially a child agent
|
||||||
sp.MakeChildAgent();
|
sp.MakeChildAgent();
|
||||||
|
@ -1139,6 +1141,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
|
||||||
|
|
||||||
m_entityTransferStateMachine.UpdateInTransit(sp.UUID, AgentTransferState.CleaningUp);
|
m_entityTransferStateMachine.UpdateInTransit(sp.UUID, AgentTransferState.CleaningUp);
|
||||||
|
|
||||||
|
sp.HasMovedAway();
|
||||||
|
|
||||||
// Need to signal neighbours whether child agents may need closing irrespective of whether this
|
// Need to signal neighbours whether child agents may need closing irrespective of whether this
|
||||||
// one needed closing. We also need to close child agents as quickly as possible to avoid complicated
|
// one needed closing. We also need to close child agents as quickly as possible to avoid complicated
|
||||||
// race conditions with rapid agent releporting (e.g. from A1 to a non-neighbour B, back
|
// race conditions with rapid agent releporting (e.g. from A1 to a non-neighbour B, back
|
||||||
|
@ -1147,12 +1151,9 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
|
||||||
// abandoned without proper close by viewer but then re-used by an incoming connection.
|
// abandoned without proper close by viewer but then re-used by an incoming connection.
|
||||||
sp.CloseChildAgents(newRegionX, newRegionY);
|
sp.CloseChildAgents(newRegionX, newRegionY);
|
||||||
|
|
||||||
// May need to logout or other cleanup
|
// AgentHasMovedAway(sp, true);
|
||||||
// AgentHasMovedAway(sp, logout);
|
|
||||||
AgentHasMovedAway(sp, true);
|
|
||||||
|
|
||||||
// Well, this is it. The agent is over there.
|
// Well, this is it. The agent is over there.
|
||||||
KillEntity(sp.Scene, sp.LocalId);
|
// KillEntity(sp.Scene, sp.LocalId);
|
||||||
|
|
||||||
// Now let's make it officially a child agent
|
// Now let's make it officially a child agent
|
||||||
sp.MakeChildAgent();
|
sp.MakeChildAgent();
|
||||||
|
|
|
@ -576,6 +576,16 @@ namespace OpenSim.Region.Framework.Scenes.Animation
|
||||||
m_scenePresence.SendAnimPack(animations, seqs, objectIDs);
|
m_scenePresence.SendAnimPack(animations, seqs, objectIDs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void GetArrays(out UUID[] animIDs, out int[] sequenceNums, out UUID[] objectIDs)
|
||||||
|
{
|
||||||
|
animIDs = null;
|
||||||
|
sequenceNums = null;
|
||||||
|
objectIDs = null;
|
||||||
|
|
||||||
|
if(m_animations != null)
|
||||||
|
m_animations.GetArrays(out animIDs, out sequenceNums, out objectIDs);
|
||||||
|
}
|
||||||
|
|
||||||
public void SendAnimPackToClient(IClientAPI client)
|
public void SendAnimPackToClient(IClientAPI client)
|
||||||
{
|
{
|
||||||
if (m_scenePresence.IsChildAgent)
|
if (m_scenePresence.IsChildAgent)
|
||||||
|
|
|
@ -3000,13 +3000,18 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
if (sp == null)
|
if (sp == null)
|
||||||
{
|
{
|
||||||
m_log.DebugFormat(
|
m_log.DebugFormat(
|
||||||
"[SCENE]: Adding new child scene presence {0} {1} to scene {2} at pos {3}",
|
"[SCENE]: Adding new child scene presence {0} {1} to scene {2} at pos {3}, tpflags: {4}",
|
||||||
client.Name, client.AgentId, RegionInfo.RegionName, client.StartPos);
|
client.Name, client.AgentId, RegionInfo.RegionName, client.StartPos,
|
||||||
|
((TPFlags)aCircuit.teleportFlags).ToString());
|
||||||
|
|
||||||
m_clientManager.Add(client);
|
m_clientManager.Add(client);
|
||||||
SubscribeToClientEvents(client);
|
SubscribeToClientEvents(client);
|
||||||
|
|
||||||
sp = m_sceneGraph.CreateAndAddChildScenePresence(client, aCircuit.Appearance, type);
|
sp = m_sceneGraph.CreateAndAddChildScenePresence(client, aCircuit.Appearance, type);
|
||||||
|
|
||||||
|
sp.TeleportFlags = (TPFlags)aCircuit.teleportFlags;
|
||||||
|
|
||||||
|
/* done in completMovement
|
||||||
InventoryFolderBase cof = InventoryService.GetFolderForType(client.AgentId, (AssetType)46);
|
InventoryFolderBase cof = InventoryService.GetFolderForType(client.AgentId, (AssetType)46);
|
||||||
if (cof == null)
|
if (cof == null)
|
||||||
sp.COF = UUID.Zero;
|
sp.COF = UUID.Zero;
|
||||||
|
@ -3014,9 +3019,9 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
sp.COF = cof.ID;
|
sp.COF = cof.ID;
|
||||||
|
|
||||||
m_log.DebugFormat("[SCENE]: COF for {0} is {1}", client.AgentId, sp.COF);
|
m_log.DebugFormat("[SCENE]: COF for {0} is {1}", client.AgentId, sp.COF);
|
||||||
|
*/
|
||||||
m_eventManager.TriggerOnNewPresence(sp);
|
m_eventManager.TriggerOnNewPresence(sp);
|
||||||
|
|
||||||
sp.TeleportFlags = (TPFlags)aCircuit.teleportFlags;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -2636,6 +2636,16 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
m_rootPart.UpdateFlag = UpdateRequired.TERSE;
|
m_rootPart.UpdateFlag = UpdateRequired.TERSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (IsAttachment)
|
||||||
|
{
|
||||||
|
ScenePresence sp = m_scene.GetScenePresence(AttachedAvatar);
|
||||||
|
if (sp != null)
|
||||||
|
{
|
||||||
|
sp.SendAttachmentScheduleUpdate(this);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
SceneObjectPart[] parts = m_parts.GetArray();
|
SceneObjectPart[] parts = m_parts.GetArray();
|
||||||
for (int i = 0; i < parts.Length; i++)
|
for (int i = 0; i < parts.Length; i++)
|
||||||
{
|
{
|
||||||
|
@ -2698,14 +2708,24 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
|
|
||||||
// m_log.DebugFormat("[SOG]: Sending immediate full group update for {0} {1}", Name, UUID);
|
// m_log.DebugFormat("[SOG]: Sending immediate full group update for {0} {1}", Name, UUID);
|
||||||
|
|
||||||
RootPart.SendFullUpdateToAllClients();
|
if (IsAttachment)
|
||||||
|
{
|
||||||
|
ScenePresence sp = m_scene.GetScenePresence(AttachedAvatar);
|
||||||
|
if (sp != null)
|
||||||
|
{
|
||||||
|
sp.SendAttachmentUpdate(this,UpdateRequired.FULL);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
RootPart.SendFullUpdateToAllClientsInternal();
|
||||||
|
|
||||||
SceneObjectPart[] parts = m_parts.GetArray();
|
SceneObjectPart[] parts = m_parts.GetArray();
|
||||||
for (int i = 0; i < parts.Length; i++)
|
for (int i = 0; i < parts.Length; i++)
|
||||||
{
|
{
|
||||||
SceneObjectPart part = parts[i];
|
SceneObjectPart part = parts[i];
|
||||||
if (part != RootPart)
|
if (part != RootPart)
|
||||||
part.SendFullUpdateToAllClients();
|
part.SendFullUpdateToAllClientsInternal();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2739,9 +2759,19 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
if (IsDeleted)
|
if (IsDeleted)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (IsAttachment)
|
||||||
|
{
|
||||||
|
ScenePresence sp = m_scene.GetScenePresence(AttachedAvatar);
|
||||||
|
if (sp != null)
|
||||||
|
{
|
||||||
|
sp.SendAttachmentUpdate(this, UpdateRequired.TERSE);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
SceneObjectPart[] parts = m_parts.GetArray();
|
SceneObjectPart[] parts = m_parts.GetArray();
|
||||||
for (int i = 0; i < parts.Length; i++)
|
for (int i = 0; i < parts.Length; i++)
|
||||||
parts[i].SendTerseUpdateToAllClients();
|
parts[i].SendTerseUpdateToAllClientsInternal();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|
|
@ -862,7 +862,8 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
{
|
{
|
||||||
Vector3 offset = (m_offsetPosition - oldpos);
|
Vector3 offset = (m_offsetPosition - oldpos);
|
||||||
av.AbsolutePosition += offset;
|
av.AbsolutePosition += offset;
|
||||||
av.SendAvatarDataToAllAgents();
|
// av.SendAvatarDataToAllAgents();
|
||||||
|
av.SendTerseUpdateToAllClients();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3237,6 +3238,18 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
// m_log.DebugFormat(
|
// m_log.DebugFormat(
|
||||||
// "[SOG]: Sendinging part full update to {0} for {1} {2}", remoteClient.Name, part.Name, part.LocalId);
|
// "[SOG]: Sendinging part full update to {0} for {1} {2}", remoteClient.Name, part.Name, part.LocalId);
|
||||||
|
|
||||||
|
|
||||||
|
if (ParentGroup.IsAttachment)
|
||||||
|
{
|
||||||
|
ScenePresence sp = ParentGroup.Scene.GetScenePresence(ParentGroup.AttachedAvatar);
|
||||||
|
if (sp != null)
|
||||||
|
{
|
||||||
|
sp.SendAttachmentUpdate(this, UpdateRequired.FULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* this does nothing
|
||||||
|
SendFullUpdateToClient(remoteClient, Position) ignores position parameter
|
||||||
if (IsRoot)
|
if (IsRoot)
|
||||||
{
|
{
|
||||||
if (ParentGroup.IsAttachment)
|
if (ParentGroup.IsAttachment)
|
||||||
|
@ -3248,6 +3261,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
SendFullUpdateToClient(remoteClient, AbsolutePosition);
|
SendFullUpdateToClient(remoteClient, AbsolutePosition);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
SendFullUpdateToClient(remoteClient);
|
SendFullUpdateToClient(remoteClient);
|
||||||
|
@ -3257,7 +3271,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Send a full update for this part to all clients.
|
/// Send a full update for this part to all clients.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public void SendFullUpdateToAllClients()
|
public void SendFullUpdateToAllClientsInternal()
|
||||||
{
|
{
|
||||||
if (ParentGroup == null)
|
if (ParentGroup == null)
|
||||||
return;
|
return;
|
||||||
|
@ -3276,6 +3290,36 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void SendFullUpdateToAllClients()
|
||||||
|
{
|
||||||
|
if (ParentGroup == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Update the "last" values
|
||||||
|
m_lastPosition = OffsetPosition;
|
||||||
|
m_lastRotation = RotationOffset;
|
||||||
|
m_lastVelocity = Velocity;
|
||||||
|
m_lastAcceleration = Acceleration;
|
||||||
|
m_lastAngularVelocity = AngularVelocity;
|
||||||
|
m_lastUpdateSentTime = Environment.TickCount;
|
||||||
|
|
||||||
|
if (ParentGroup.IsAttachment)
|
||||||
|
{
|
||||||
|
ScenePresence sp = ParentGroup.Scene.GetScenePresence(ParentGroup.AttachedAvatar);
|
||||||
|
if (sp != null)
|
||||||
|
{
|
||||||
|
sp.SendAttachmentUpdate(this, UpdateRequired.FULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ParentGroup.Scene.ForEachScenePresence(delegate(ScenePresence avatar)
|
||||||
|
{
|
||||||
|
SendFullUpdate(avatar.ControllingClient);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Sends a full update to the client
|
/// Sends a full update to the client
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -3345,24 +3389,24 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
!OffsetPosition.ApproxEquals(m_lastPosition, POSITION_TOLERANCE) ||
|
!OffsetPosition.ApproxEquals(m_lastPosition, POSITION_TOLERANCE) ||
|
||||||
Environment.TickCount - m_lastUpdateSentTime > TIME_MS_TOLERANCE)
|
Environment.TickCount - m_lastUpdateSentTime > TIME_MS_TOLERANCE)
|
||||||
{
|
{
|
||||||
SendTerseUpdateToAllClients();
|
SendTerseUpdateToAllClientsInternal();
|
||||||
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case UpdateRequired.FULL:
|
case UpdateRequired.FULL:
|
||||||
{
|
{
|
||||||
ClearUpdateSchedule();
|
ClearUpdateSchedule();
|
||||||
SendFullUpdateToAllClients();
|
SendFullUpdateToAllClientsInternal();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Send a terse update to all clients
|
/// Send a terse update to all clients
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public void SendTerseUpdateToAllClients()
|
public void SendTerseUpdateToAllClientsInternal()
|
||||||
{
|
{
|
||||||
if (ParentGroup == null || ParentGroup.Scene == null)
|
if (ParentGroup == null || ParentGroup.Scene == null)
|
||||||
return;
|
return;
|
||||||
|
@ -3381,6 +3425,36 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void SendTerseUpdateToAllClients()
|
||||||
|
{
|
||||||
|
if (ParentGroup == null || ParentGroup.Scene == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Update the "last" values
|
||||||
|
m_lastPosition = OffsetPosition;
|
||||||
|
m_lastRotation = RotationOffset;
|
||||||
|
m_lastVelocity = Velocity;
|
||||||
|
m_lastAcceleration = Acceleration;
|
||||||
|
m_lastAngularVelocity = AngularVelocity;
|
||||||
|
m_lastUpdateSentTime = Environment.TickCount;
|
||||||
|
|
||||||
|
if (ParentGroup.IsAttachment)
|
||||||
|
{
|
||||||
|
ScenePresence sp = ParentGroup.Scene.GetScenePresence(ParentGroup.AttachedAvatar);
|
||||||
|
if (sp != null)
|
||||||
|
{
|
||||||
|
sp.SendAttachmentUpdate(this, UpdateRequired.TERSE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ParentGroup.Scene.ForEachClient(delegate(IClientAPI client)
|
||||||
|
{
|
||||||
|
SendTerseUpdateToClient(client);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void SetAxisRotation(int axis, int rotate)
|
public void SetAxisRotation(int axis, int rotate)
|
||||||
{
|
{
|
||||||
ParentGroup.SetAxisRotation(axis, rotate);
|
ParentGroup.SetAxisRotation(axis, rotate);
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue