Attachments, attachments, and, did I say attachments?
Too many fixes to list.0.6.0-stable
parent
f0bf3df024
commit
48c6d052d9
|
@ -55,9 +55,9 @@ namespace OpenSim.Framework
|
|||
UUID RayTargetID, byte BypassRayCast, bool RayEndIsIntersection,
|
||||
bool RezSelected, bool RemoveItem, UUID fromTaskID);
|
||||
|
||||
public delegate void RezSingleAttachmentFromInv(IClientAPI remoteClient, UUID itemID, uint AttachmentPt);
|
||||
public delegate UUID RezSingleAttachmentFromInv(IClientAPI remoteClient, UUID itemID, uint AttachmentPt);
|
||||
|
||||
public delegate void ObjectAttach(IClientAPI remoteClient, uint objectLocalID, uint AttachmentPt, Quaternion rot);
|
||||
public delegate void ObjectAttach(IClientAPI remoteClient, uint objectLocalID, uint AttachmentPt, Quaternion rot, bool silent);
|
||||
|
||||
public delegate void ModifyTerrain(
|
||||
float height, float seconds, byte size, byte action, float north, float west, float south, float east,
|
||||
|
|
|
@ -4293,7 +4293,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
|||
{
|
||||
if (att.ObjectData.Length > 0)
|
||||
{
|
||||
handlerObjectAttach(this, att.ObjectData[0].ObjectLocalID, att.AgentData.AttachmentPoint, att.ObjectData[0].Rotation);
|
||||
handlerObjectAttach(this, att.ObjectData[0].ObjectLocalID, att.AgentData.AttachmentPoint, att.ObjectData[0].Rotation, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1116,7 +1116,9 @@ namespace OpenSim.Region.Communications.OGS1
|
|||
|
||||
if (remObject != null)
|
||||
{
|
||||
m_log.DebugFormat("[INTERREGION]: Sending prim crossing message for prim {0}", primID.ToString());
|
||||
retValue = remObject.InformRegionOfPrimCrossing(regionHandle, primID.Guid, objData, XMLMethod);
|
||||
m_log.DebugFormat("[INTERREGION]: Return from prim crossing message for prim {0}: {1}", primID.ToString(), retValue.ToString());
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -1497,6 +1499,7 @@ namespace OpenSim.Region.Communications.OGS1
|
|||
/// <returns></returns>
|
||||
public bool IncomingPrim(ulong regionHandle, UUID primID, string objData, int XMLMethod)
|
||||
{
|
||||
m_log.DebugFormat("[INTERREGION]: Got prim crosssing request for {0}", primID);
|
||||
m_localBackend.TriggerExpectPrim(regionHandle, primID, objData, XMLMethod);
|
||||
|
||||
return true;
|
||||
|
|
|
@ -32,7 +32,6 @@ using System.IO;
|
|||
using System.Net;
|
||||
using System.Reflection;
|
||||
using System.Text;
|
||||
using System.Timers;
|
||||
using System.Xml;
|
||||
using OpenMetaverse;
|
||||
using log4net;
|
||||
|
@ -71,12 +70,10 @@ namespace OpenSim.Region.DataSnapshot
|
|||
public string m_hostname = "127.0.0.1";
|
||||
|
||||
//Update timers
|
||||
private Timer m_periodic = null;
|
||||
private int m_period = 20; // in seconds
|
||||
private int m_maxStales = 500;
|
||||
private int m_stales = 0;
|
||||
private Timer m_passedCheck = null;
|
||||
private bool m_periodPassed = false;
|
||||
private int m_lastUpdate = 0;
|
||||
|
||||
//Program objects
|
||||
private SnapshotStore m_snapStore = null;
|
||||
|
@ -126,6 +123,7 @@ namespace OpenSim.Region.DataSnapshot
|
|||
{
|
||||
m_disabledModules.Add(bloody_wanker);
|
||||
}
|
||||
m_lastUpdate = System.Environment.TickCount;
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
|
@ -137,17 +135,6 @@ namespace OpenSim.Region.DataSnapshot
|
|||
|
||||
if (m_enabled)
|
||||
{
|
||||
//Create update timer
|
||||
m_periodic = new Timer();
|
||||
m_periodic.Interval = m_period * 1000;
|
||||
m_periodic.Elapsed += SnapshotTimerCallback;
|
||||
|
||||
//Create update eligibility timer
|
||||
m_passedCheck = new Timer();
|
||||
m_passedCheck.Interval = m_period * 1000;
|
||||
m_passedCheck.Elapsed += UpdateEligibilityCallback;
|
||||
m_passedCheck.Start();
|
||||
|
||||
//Hand it the first scene, assuming that all scenes have the same BaseHTTPServer
|
||||
new DataRequestHandler(scene, this);
|
||||
|
||||
|
@ -253,6 +240,8 @@ namespace OpenSim.Region.DataSnapshot
|
|||
*/
|
||||
public XmlDocument GetSnapshot(string regionName)
|
||||
{
|
||||
CheckStale();
|
||||
|
||||
XmlDocument requestedSnap = new XmlDocument();
|
||||
requestedSnap.AppendChild(requestedSnap.CreateXmlDeclaration("1.0", null, null));
|
||||
requestedSnap.AppendChild(requestedSnap.CreateWhitespace("\r\n"));
|
||||
|
@ -369,38 +358,34 @@ namespace OpenSim.Region.DataSnapshot
|
|||
//Behavior here: Wait m_period seconds, then update if there has not been a request in m_period seconds
|
||||
//or m_maxStales has been exceeded
|
||||
m_stales++;
|
||||
}
|
||||
|
||||
if ((m_stales >= m_maxStales) && m_periodPassed)
|
||||
SnapshotTimerCallback(m_periodic, null);
|
||||
else if (m_periodic.Enabled == false)
|
||||
m_periodic.Start();
|
||||
private void CheckStale()
|
||||
{
|
||||
// Wrap check
|
||||
if (System.Environment.TickCount < m_lastUpdate)
|
||||
{
|
||||
m_lastUpdate = System.Environment.TickCount;
|
||||
}
|
||||
|
||||
if (m_stales >= m_maxStales)
|
||||
{
|
||||
if (System.Environment.TickCount - m_lastUpdate >= 20000)
|
||||
{
|
||||
m_stales = 0;
|
||||
m_lastUpdate = System.Environment.TickCount;
|
||||
MakeEverythingStale();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
m_periodic.Stop();
|
||||
m_periodic.Start();
|
||||
}
|
||||
}
|
||||
|
||||
private void SnapshotTimerCallback(object timer, ElapsedEventArgs args)
|
||||
if (m_lastUpdate + 1000 * m_period < System.Environment.TickCount)
|
||||
{
|
||||
m_log.Debug("[DATASNAPSHOT]: Marking scenes for snapshot updates.");
|
||||
|
||||
//Finally generate those snapshot updates
|
||||
m_stales = 0;
|
||||
m_lastUpdate = System.Environment.TickCount;
|
||||
MakeEverythingStale();
|
||||
|
||||
//Stop the update delay timer
|
||||
m_periodic.Stop();
|
||||
|
||||
//Reset the eligibility flag and timer
|
||||
m_periodPassed = false;
|
||||
m_passedCheck.Stop();
|
||||
m_passedCheck.Start();
|
||||
}
|
||||
|
||||
private void UpdateEligibilityCallback(object timer, ElapsedEventArgs args)
|
||||
{
|
||||
//Set eligibility, so we can start making updates
|
||||
m_periodPassed = true;
|
||||
}
|
||||
}
|
||||
|
||||
public void MakeEverythingStale()
|
||||
|
|
|
@ -70,7 +70,7 @@ namespace OpenSim.Region.DataSnapshot.Providers
|
|||
client.OnGrabUpdate += delegate(UUID objectID, Vector3 offset, Vector3 grapPos,
|
||||
IClientAPI remoteClient, List<SurfaceTouchEventArgs> surfaceArgs) { this.Stale = true; };
|
||||
client.OnObjectAttach += delegate(IClientAPI remoteClient, uint objectLocalID, uint AttachmentPt,
|
||||
Quaternion rot) { this.Stale = true; };
|
||||
Quaternion rot, bool silent) { this.Stale = true; };
|
||||
client.OnObjectDuplicate += delegate(uint localID, Vector3 offset, uint dupeFlags, UUID AgentID,
|
||||
UUID GroupID) { this.Stale = true; };
|
||||
client.OnObjectDuplicateOnRay += delegate(uint localID, uint dupeFlags, UUID AgentID, UUID GroupID,
|
||||
|
|
|
@ -262,7 +262,7 @@ namespace OpenSim.Region.Environment.Modules.ContentManagement
|
|||
scene.PhysicsScene.RemovePrim(((SceneObjectGroup)scene.Entities[uuid]).RootPart.PhysActor);
|
||||
scene.SendKillObject(scene.Entities[uuid].LocalId);
|
||||
scene.m_innerScene.DeleteSceneObject(uuid, false);
|
||||
((SceneObjectGroup)scene.Entities[uuid]).DeleteGroup();
|
||||
((SceneObjectGroup)scene.Entities[uuid]).DeleteGroup(false);
|
||||
}
|
||||
catch(Exception e)
|
||||
{
|
||||
|
|
|
@ -211,14 +211,13 @@ namespace OpenSim.Region.Environment.Modules.ContentManagement
|
|||
|
||||
public void SendFullUpdate(IClientAPI client, uint clientFlags)
|
||||
{
|
||||
m_Entity.SendFullUpdateToClient(client, clientFlags);
|
||||
m_Entity.SendFullUpdateToClient(client);
|
||||
}
|
||||
|
||||
public void SendFullUpdateToAll()
|
||||
{
|
||||
uint clientFlags = 0;
|
||||
m_Entity.Scene.ClientManager.ForEachClient(delegate(IClientAPI controller)
|
||||
{ m_Entity.SendFullUpdateToClient(controller, clientFlags); }
|
||||
{ m_Entity.SendFullUpdateToClient(controller); }
|
||||
);
|
||||
}
|
||||
|
||||
|
|
|
@ -181,7 +181,7 @@ namespace OpenSim.Region.Environment.Modules.World.TreePopulator
|
|||
|
||||
if (Util.RandomClass.NextDouble() < killLikelyhood)
|
||||
{
|
||||
m_scene.DeleteSceneObject(selectedTree.ParentGroup);
|
||||
m_scene.DeleteSceneObject(selectedTree.ParentGroup, false);
|
||||
m_trees.Remove(selectedTree.ParentGroup.UUID);
|
||||
|
||||
m_scene.ForEachClient(delegate(IClientAPI controller)
|
||||
|
|
|
@ -433,7 +433,7 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
/// <param name="objectLocalID"></param>
|
||||
/// <param name="AttachmentPt"></param>
|
||||
/// <param name="rot"></param>
|
||||
protected internal void AttachObject(IClientAPI remoteClient, uint objectLocalID, uint AttachmentPt, Quaternion rot)
|
||||
protected internal void AttachObject(IClientAPI remoteClient, uint objectLocalID, uint AttachmentPt, Quaternion rot, bool silent)
|
||||
{
|
||||
// If we can't take it, we can't attach it!
|
||||
//
|
||||
|
@ -447,7 +447,7 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
|
||||
// Calls attach with a Zero position
|
||||
//
|
||||
AttachObject(remoteClient, objectLocalID, AttachmentPt, rot, Vector3.Zero);
|
||||
AttachObject(remoteClient, objectLocalID, AttachmentPt, rot, Vector3.Zero, false);
|
||||
}
|
||||
|
||||
public SceneObjectGroup RezSingleAttachment(
|
||||
|
@ -464,7 +464,7 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
if (AttachmentPt != 0 && AttachmentPt != objatt.GetAttachmentPoint())
|
||||
tainted = true;
|
||||
|
||||
AttachObject(remoteClient, objatt.LocalId, AttachmentPt, Quaternion.Identity, objatt.AbsolutePosition);
|
||||
AttachObject(remoteClient, objatt.LocalId, AttachmentPt, Quaternion.Identity, objatt.AbsolutePosition, false);
|
||||
objatt.ScheduleGroupForFullUpdate();
|
||||
if (tainted)
|
||||
objatt.HasGroupChanged = true;
|
||||
|
@ -491,14 +491,14 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
group.DetachToInventoryPrep();
|
||||
m_log.Debug("[DETACH]: Saving attachpoint: " + ((uint)group.GetAttachmentPoint()).ToString());
|
||||
m_parentScene.updateKnownAsset(remoteClient, group, group.GetFromAssetID(), group.OwnerID);
|
||||
m_parentScene.DeleteSceneObject(group);
|
||||
m_parentScene.DeleteSceneObject(group, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected internal void AttachObject(
|
||||
IClientAPI remoteClient, uint objectLocalID, uint AttachmentPt, Quaternion rot, Vector3 attachPos)
|
||||
IClientAPI remoteClient, uint objectLocalID, uint AttachmentPt, Quaternion rot, Vector3 attachPos, bool silent)
|
||||
{
|
||||
List<EntityBase> EntityList = GetEntities();
|
||||
foreach (EntityBase obj in EntityList)
|
||||
|
@ -553,7 +553,7 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
|
||||
m_parentScene.AttachObject(remoteClient, AttachmentPt, itemId, group);
|
||||
|
||||
group.AttachToAgent(remoteClient.AgentId, AttachmentPt, attachPos);
|
||||
group.AttachToAgent(remoteClient.AgentId, AttachmentPt, attachPos, silent);
|
||||
// In case it is later dropped again, don't let
|
||||
// it get cleaned up
|
||||
//
|
||||
|
|
|
@ -1601,7 +1601,7 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
}
|
||||
else if (permissionToDelete)
|
||||
{
|
||||
DeleteSceneObject(grp);
|
||||
DeleteSceneObject(grp, false);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1735,7 +1735,7 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
|
||||
// Finally remove the item, for reals this time.
|
||||
if (permissionToDelete)
|
||||
DeleteSceneObject(objectGroup);
|
||||
DeleteSceneObject(objectGroup, false);
|
||||
}
|
||||
|
||||
public void updateKnownAsset(IClientAPI remoteClient, SceneObjectGroup grp, UUID assetID, UUID agentID)
|
||||
|
@ -2279,7 +2279,7 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
|
||||
returnobjects[i] = null;
|
||||
|
||||
DeleteSceneObject(ObjectDeleting);
|
||||
DeleteSceneObject(ObjectDeleting, false);
|
||||
ObjectDeleting = null;
|
||||
}
|
||||
else
|
||||
|
@ -2320,7 +2320,7 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
EventManager.TriggerStopScript(part.LocalId, itemID);
|
||||
}
|
||||
|
||||
public void RezSingleAttachment(IClientAPI remoteClient, UUID itemID,
|
||||
public UUID RezSingleAttachment(IClientAPI remoteClient, UUID itemID,
|
||||
uint AttachmentPt)
|
||||
{
|
||||
SceneObjectGroup att = m_innerScene.RezSingleAttachment(remoteClient, itemID, AttachmentPt);
|
||||
|
@ -2328,13 +2328,13 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
if (att == null)
|
||||
{
|
||||
DetachSingleAttachmentToInv(itemID, remoteClient);
|
||||
return;
|
||||
return UUID.Zero;
|
||||
}
|
||||
|
||||
RezSingleAttachment(att, remoteClient, itemID, AttachmentPt);
|
||||
return RezSingleAttachment(att, remoteClient, itemID, AttachmentPt);
|
||||
}
|
||||
|
||||
public void RezSingleAttachment(SceneObjectGroup att,
|
||||
public UUID RezSingleAttachment(SceneObjectGroup att,
|
||||
IClientAPI remoteClient, UUID itemID, uint AttachmentPt)
|
||||
{
|
||||
if (att.RootPart != null)
|
||||
|
@ -2351,11 +2351,12 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
}
|
||||
|
||||
}
|
||||
return att.UUID;
|
||||
}
|
||||
|
||||
public void AttachObject(IClientAPI controllingClient, uint localID, uint attachPoint, Quaternion rot, Vector3 pos)
|
||||
{
|
||||
m_innerScene.AttachObject(controllingClient, localID, attachPoint, rot, pos);
|
||||
m_innerScene.AttachObject(controllingClient, localID, attachPoint, rot, pos, false);
|
||||
}
|
||||
|
||||
public void AttachObject(IClientAPI remoteClient, uint AttachmentPt, UUID itemID, SceneObjectGroup att)
|
||||
|
|
|
@ -1831,7 +1831,7 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
foreach (EntityBase e in entities)
|
||||
{
|
||||
if (e is SceneObjectGroup)
|
||||
DeleteSceneObject((SceneObjectGroup)e);
|
||||
DeleteSceneObject((SceneObjectGroup)e, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1840,7 +1840,7 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
/// Delete the given object from the scene.
|
||||
/// </summary>
|
||||
/// <param name="group"></param>
|
||||
public void DeleteSceneObject(SceneObjectGroup group)
|
||||
public void DeleteSceneObject(SceneObjectGroup group, bool silent)
|
||||
{
|
||||
//SceneObjectPart rootPart = group.GetChildPart(group.UUID);
|
||||
|
||||
|
@ -1866,7 +1866,7 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
EventManager.TriggerParcelPrimCountTainted();
|
||||
}
|
||||
|
||||
group.DeleteGroup();
|
||||
group.DeleteGroup(silent);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -1982,7 +1982,7 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
/// </summary>
|
||||
/// <param name="attemptedPosition">the attempted out of region position of the scene object</param>
|
||||
/// <param name="grp">the scene object that we're crossing</param>
|
||||
public void CrossPrimGroupIntoNewRegion(Vector3 attemptedPosition, SceneObjectGroup grp)
|
||||
public void CrossPrimGroupIntoNewRegion(Vector3 attemptedPosition, SceneObjectGroup grp, bool silent)
|
||||
{
|
||||
if (grp == null)
|
||||
return;
|
||||
|
@ -1994,7 +1994,7 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
// We remove the object here
|
||||
try
|
||||
{
|
||||
DeleteSceneObject(grp);
|
||||
DeleteSceneObject(grp, false);
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
|
@ -2044,7 +2044,7 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
grp.OffsetForNewRegion(pos);
|
||||
|
||||
// If we fail to cross the border, then reset the position of the scene object on that border.
|
||||
if (!CrossPrimGroupIntoNewRegion(newRegionHandle, grp))
|
||||
if (!CrossPrimGroupIntoNewRegion(newRegionHandle, grp, silent))
|
||||
{
|
||||
grp.OffsetForNewRegion(oldGroupPosition);
|
||||
}
|
||||
|
@ -2059,7 +2059,7 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
/// true if the crossing itself was successful, false on failure
|
||||
/// FIMXE: we still return true if the crossing object was not successfully deleted from the originating region
|
||||
/// </returns>
|
||||
public bool CrossPrimGroupIntoNewRegion(ulong newRegionHandle, SceneObjectGroup grp)
|
||||
public bool CrossPrimGroupIntoNewRegion(ulong newRegionHandle, SceneObjectGroup grp, bool silent)
|
||||
{
|
||||
bool successYN = false;
|
||||
int primcrossingXMLmethod = 0;
|
||||
|
@ -2075,7 +2075,7 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
// We remove the object here
|
||||
try
|
||||
{
|
||||
DeleteSceneObject(grp);
|
||||
DeleteSceneObject(grp, silent);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
|
@ -2115,7 +2115,7 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
/// <returns></returns>
|
||||
public bool IncomingInterRegionPrimGroup(ulong regionHandle, UUID primID, string objXMLData, int XMLMethod)
|
||||
{
|
||||
m_log.Warn("{[INTERREGION]: A new prim arrived from a neighbor");
|
||||
m_log.Warn("[INTERREGION]: A new prim arrived from a neighbor");
|
||||
if (XMLMethod == 0)
|
||||
{
|
||||
SceneObjectGroup sceneObject = m_serialiser.DeserializeGroupFromXml2(objXMLData);
|
||||
|
@ -2129,7 +2129,7 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
SceneObjectGroup grp = RootPrim.ParentGroup;
|
||||
if (grp != null)
|
||||
{
|
||||
DeleteSceneObject(grp);
|
||||
DeleteSceneObject(grp, false);
|
||||
}
|
||||
|
||||
m_log.Info("[INTERREGION]: Denied prim crossing for banned avatar");
|
||||
|
@ -2145,6 +2145,8 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
{
|
||||
// Never persist
|
||||
|
||||
m_log.DebugFormat("[ATTACHMENT]: Received attachment {0}, inworld asset id {1}", grp.RootPart.LastOwnerID.ToString(), grp.UUID.ToString());
|
||||
|
||||
grp.DetachFromBackup();
|
||||
|
||||
// Attachment
|
||||
|
@ -2156,6 +2158,7 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
// with the deeded object, it goes back to them
|
||||
|
||||
grp.SetFromAssetID(grp.RootPart.LastOwnerID);
|
||||
m_log.DebugFormat("[ATTACHMENT]: Attach to avatar {0}", sp.UUID.ToString());
|
||||
AttachObject(sp.ControllingClient, grp.LocalId, (uint)0, grp.GroupRotation, grp.AbsolutePosition);
|
||||
}
|
||||
else
|
||||
|
@ -4354,7 +4357,7 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
if ((grp.RootPart.Flags & PrimFlags.TemporaryOnRez) != 0)
|
||||
{
|
||||
if (grp.RootPart.Expires <= DateTime.Now)
|
||||
DeleteSceneObject(grp);
|
||||
DeleteSceneObject(grp, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -675,8 +675,6 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
// the avatar.Close below will clear the child region list. We need this below for (possibly)
|
||||
// closing the child agents, so save it here (we need a copy as it is Clear()-ed).
|
||||
List<ulong> childRegions = new List<ulong>(avatar.GetKnownRegionList());
|
||||
avatar.Close();
|
||||
|
||||
// Compared to ScenePresence.CrossToNewRegion(), there's no obvious code to handle a teleport
|
||||
// failure at this point (unlike a border crossing failure). So perhaps this can never fail
|
||||
// once we reach here...
|
||||
|
@ -712,11 +710,14 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
|
||||
avatar.MakeChildAgent();
|
||||
Thread.Sleep(5000);
|
||||
avatar.CrossAttachmentsIntoNewRegion(reg.RegionHandle);
|
||||
avatar.CrossAttachmentsIntoNewRegion(reg.RegionHandle, true);
|
||||
if (KiPrimitive != null)
|
||||
{
|
||||
KiPrimitive(avatar.LocalId);
|
||||
}
|
||||
|
||||
avatar.Close();
|
||||
|
||||
uint newRegionX = (uint)(reg.RegionHandle >> 40);
|
||||
uint newRegionY = (((uint)(reg.RegionHandle)) >> 8);
|
||||
uint oldRegionX = (uint)(m_regionInfo.RegionHandle >> 40);
|
||||
|
|
|
@ -227,7 +227,7 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
|
||||
if ((val.X > 257f || val.X < -1f || val.Y > 257f || val.Y < -1f) && !IsAttachment)
|
||||
{
|
||||
m_scene.CrossPrimGroupIntoNewRegion(val, this);
|
||||
m_scene.CrossPrimGroupIntoNewRegion(val, this, true);
|
||||
}
|
||||
|
||||
lock (m_parts)
|
||||
|
@ -319,7 +319,7 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
{
|
||||
m_isSelected = value;
|
||||
// Tell physics engine that group is selected
|
||||
if (m_rootPart.PhysActor != null)
|
||||
if (m_rootPart != null && m_rootPart.PhysActor != null)
|
||||
{
|
||||
m_rootPart.PhysActor.Selected = value;
|
||||
// Pass it on to the children.
|
||||
|
@ -746,7 +746,7 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
/// <param name="agentID"></param>
|
||||
/// <param name="attachmentpoint"></param>
|
||||
/// <param name="AttachOffset"></param>
|
||||
public void AttachToAgent(UUID agentID, uint attachmentpoint, Vector3 AttachOffset)
|
||||
public void AttachToAgent(UUID agentID, uint attachmentpoint, Vector3 AttachOffset, bool silent)
|
||||
{
|
||||
ScenePresence avatar = m_scene.GetScenePresence(agentID);
|
||||
if (avatar != null)
|
||||
|
@ -777,6 +777,9 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
SetAttachmentPoint(Convert.ToByte(attachmentpoint));
|
||||
|
||||
avatar.AddAttachment(this);
|
||||
|
||||
if(!silent)
|
||||
{
|
||||
// Killing it here will cause the client to deselect it
|
||||
// It then reappears on the avatar, deselected
|
||||
// through the full update below
|
||||
|
@ -790,6 +793,8 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
ScheduleGroupForFullUpdate();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public byte GetAttachmentPoint()
|
||||
{
|
||||
if (m_rootPart != null)
|
||||
|
@ -994,7 +999,7 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
/// <summary>
|
||||
/// Delete this group from its scene and tell all the scene presences about that deletion.
|
||||
/// </summary>
|
||||
public void DeleteGroup()
|
||||
public void DeleteGroup(bool silent)
|
||||
{
|
||||
// We need to keep track of this state in case this group is still queued for backup.
|
||||
// FIXME: This is a poor temporary solution, since it still leaves plenty of scope for race
|
||||
|
@ -1018,10 +1023,13 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
avatars[i].StandUp();
|
||||
}
|
||||
|
||||
if (!silent)
|
||||
{
|
||||
if (m_rootPart != null && part == m_rootPart)
|
||||
avatars[i].ControllingClient.SendKillObject(m_regionHandle, part.LocalId);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
m_rootPart = null;
|
||||
m_parts.Clear();
|
||||
|
@ -1257,13 +1265,16 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
|
||||
#region Client Updating
|
||||
|
||||
public void SendFullUpdateToClient(IClientAPI remoteClient, uint clientFlags)
|
||||
public void SendFullUpdateToClient(IClientAPI remoteClient)
|
||||
{
|
||||
SendPartFullUpdate(remoteClient, RootPart, m_scene.ExternalChecks.ExternalChecksGenerateClientFlags(remoteClient.AgentId, RootPart.UUID));
|
||||
|
||||
lock (m_parts)
|
||||
{
|
||||
foreach (SceneObjectPart part in m_parts.Values)
|
||||
{
|
||||
SendPartFullUpdate(remoteClient, part, clientFlags);
|
||||
if (part != RootPart)
|
||||
SendPartFullUpdate(remoteClient, part, m_scene.ExternalChecks.ExternalChecksGenerateClientFlags(remoteClient.AgentId, part.UUID));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1626,10 +1637,13 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
|
||||
public void ScheduleFullUpdateToAvatar(ScenePresence presence)
|
||||
{
|
||||
RootPart.AddFullUpdateToAvatar(presence);
|
||||
|
||||
lock (m_parts)
|
||||
{
|
||||
foreach (SceneObjectPart part in m_parts.Values)
|
||||
{
|
||||
if (part != RootPart)
|
||||
part.AddFullUpdateToAvatar(presence);
|
||||
}
|
||||
}
|
||||
|
@ -1652,10 +1666,13 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
public void ScheduleGroupForFullUpdate()
|
||||
{
|
||||
checkAtTargets();
|
||||
RootPart.ScheduleFullUpdate();
|
||||
|
||||
lock (m_parts)
|
||||
{
|
||||
foreach (SceneObjectPart part in m_parts.Values)
|
||||
{
|
||||
if (part != RootPart)
|
||||
part.ScheduleFullUpdate();
|
||||
}
|
||||
}
|
||||
|
@ -1680,10 +1697,13 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
/// </summary>
|
||||
public void SendGroupFullUpdate()
|
||||
{
|
||||
RootPart.SendFullUpdateToAllClients();
|
||||
|
||||
lock (m_parts)
|
||||
{
|
||||
foreach (SceneObjectPart part in m_parts.Values)
|
||||
{
|
||||
if (part != RootPart)
|
||||
part.SendFullUpdateToAllClients();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -114,8 +114,6 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
private static readonly Vector3 m_sitTargetCorrectionOffset = new Vector3(0.1f, 0.0f, 0.3f);
|
||||
private float m_godlevel = 0;
|
||||
|
||||
private bool m_attachmentsTransported = true;
|
||||
|
||||
private bool m_invulnerable = true;
|
||||
|
||||
private Vector3 m_LastChildAgentUpdatePosition = new Vector3();
|
||||
|
@ -611,10 +609,12 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
}
|
||||
|
||||
foreach (EntityBase e in ents)
|
||||
{
|
||||
if (e is SceneObjectGroup)
|
||||
m_pendingObjects.Enqueue((SceneObjectGroup)e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
while (m_pendingObjects.Count > 0 && m_partsUpdateQueue.Count < 60)
|
||||
{
|
||||
|
@ -626,7 +626,7 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
// So it's not implemented now.
|
||||
//
|
||||
|
||||
// Don't even queue if we have seent this one
|
||||
// Don't even queue if we have sent this one
|
||||
//
|
||||
if (!m_updateTimes.ContainsKey(g.UUID))
|
||||
g.ScheduleFullUpdateToAvatar(this);
|
||||
|
@ -637,6 +637,8 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
while (m_partsUpdateQueue.Count > 0)
|
||||
{
|
||||
SceneObjectPart part = m_partsUpdateQueue.Dequeue();
|
||||
if (part.ParentGroup == null || part.ParentGroup.RootPart == null)
|
||||
continue;
|
||||
if (m_updateTimes.ContainsKey(part.UUID))
|
||||
{
|
||||
ScenePartUpdate update = m_updateTimes[part.UUID];
|
||||
|
@ -680,12 +682,25 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
{
|
||||
//never been sent to client before so do full update
|
||||
|
||||
part.SendFullUpdate(ControllingClient,
|
||||
GenerateClientFlags(part.UUID));
|
||||
|
||||
// Attachment handling
|
||||
//
|
||||
if (part.ParentGroup.RootPart.Shape.PCode == 9 && part.ParentGroup.RootPart.Shape.State != 0)
|
||||
{
|
||||
if (part != part.ParentGroup.RootPart)
|
||||
continue;
|
||||
|
||||
part.ParentGroup.SendFullUpdateToClient(ControllingClient);
|
||||
continue;
|
||||
}
|
||||
|
||||
ScenePartUpdate update = new ScenePartUpdate();
|
||||
update.FullID = part.UUID;
|
||||
update.LastFullUpdateTime = part.TimeStampFull;
|
||||
m_updateTimes.Add(part.UUID, update);
|
||||
|
||||
part.SendFullUpdate(ControllingClient,
|
||||
GenerateClientFlags(part.UUID));
|
||||
updateCount++;
|
||||
}
|
||||
|
||||
|
@ -1115,7 +1130,7 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
// {
|
||||
proxyObjectGroup.SendGroupFullUpdate();
|
||||
remote_client.SendSitResponse(proxyObjectGroup.UUID, Vector3.Zero, Quaternion.Identity, true, Vector3.Zero, Vector3.Zero, false);
|
||||
m_scene.DeleteSceneObject(proxyObjectGroup);
|
||||
m_scene.DeleteSceneObject(proxyObjectGroup, false);
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
|
@ -2206,9 +2221,9 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
// now we have a child agent in this region. Request all interesting data about other (root) agents
|
||||
SendInitialFullUpdateToAllClients();
|
||||
|
||||
CrossAttachmentsIntoNewRegion(neighbourHandle);
|
||||
CrossAttachmentsIntoNewRegion(neighbourHandle, true);
|
||||
|
||||
m_scene.SendKillObject(m_localId);
|
||||
// m_scene.SendKillObject(m_localId);
|
||||
|
||||
m_scene.NotifyMyCoarseLocationChange();
|
||||
// the user may change their profile information in other region,
|
||||
|
@ -2472,8 +2487,6 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
public void Close()
|
||||
{
|
||||
lock (m_attachments)
|
||||
{
|
||||
if (!m_attachmentsTransported)
|
||||
{
|
||||
try
|
||||
{
|
||||
|
@ -2489,7 +2502,6 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
}
|
||||
m_attachments.Clear();
|
||||
}
|
||||
}
|
||||
lock (m_knownChildRegions)
|
||||
{
|
||||
m_knownChildRegions.Clear();
|
||||
|
@ -2582,9 +2594,8 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
return true;
|
||||
}
|
||||
|
||||
public bool CrossAttachmentsIntoNewRegion(ulong regionHandle)
|
||||
public bool CrossAttachmentsIntoNewRegion(ulong regionHandle, bool silent)
|
||||
{
|
||||
m_attachmentsTransported = true;
|
||||
lock (m_attachments)
|
||||
{
|
||||
// Validate
|
||||
|
@ -2604,7 +2615,8 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
gobj.RootPart.IsAttachment = false;
|
||||
gobj.AbsolutePosition = gobj.RootPart.AttachedPos;
|
||||
gobj.RootPart.LastOwnerID = gobj.GetFromAssetID();
|
||||
m_scene.CrossPrimGroupIntoNewRegion(regionHandle, gobj);
|
||||
m_log.DebugFormat("[ATTACHMENT]: Sending attachment {0} to region {1}", gobj.UUID, regionHandle);
|
||||
m_scene.CrossPrimGroupIntoNewRegion(regionHandle, gobj, silent);
|
||||
}
|
||||
}
|
||||
m_attachments.Clear();
|
||||
|
@ -3130,6 +3142,9 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
|
||||
private void ItemReceived(UUID itemID)
|
||||
{
|
||||
if (IsChildAgent)
|
||||
return;
|
||||
|
||||
if (null == m_appearance)
|
||||
{
|
||||
m_log.Warn("[ATTACHMENT] Appearance has not been initialized");
|
||||
|
@ -3143,14 +3158,20 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
UUID asset = m_appearance.GetAttachedAsset(attachpoint);
|
||||
if (UUID.Zero == asset) // We have just logged in
|
||||
{
|
||||
m_log.InfoFormat("[ATTACHMENT] Rez attachment {0}",
|
||||
itemID.ToString());
|
||||
|
||||
try
|
||||
{
|
||||
// Rez from inventory
|
||||
m_scene.RezSingleAttachment(ControllingClient, itemID,
|
||||
(uint)attachpoint);
|
||||
asset = m_scene.RezSingleAttachment(ControllingClient,
|
||||
itemID, (uint)attachpoint);
|
||||
// Corner case: We are not yet a Scene Entity
|
||||
// Setting attachment info in RezSingleAttachment will fail
|
||||
// Set it here
|
||||
//
|
||||
m_appearance.SetAttachment((int)attachpoint, itemID,
|
||||
asset);
|
||||
m_log.InfoFormat("[ATTACHMENT] Rezzed attachment {0}, inworld asset {1}",
|
||||
itemID.ToString(), asset);
|
||||
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
|
@ -3160,21 +3181,29 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
return;
|
||||
}
|
||||
|
||||
SceneObjectPart att = m_scene.GetSceneObjectPart(m_appearance.GetAttachedAsset(attachpoint));
|
||||
SceneObjectPart att = m_scene.GetSceneObjectPart(asset);
|
||||
|
||||
|
||||
// If this is null, then the asset has not yet appeared in world
|
||||
// so we revisit this when it does
|
||||
//
|
||||
if (att != null)
|
||||
if (att != null && att.UUID != asset) // Yes. It's really needed
|
||||
{
|
||||
m_log.InfoFormat("[ATTACHEMENT] Attach from world {0}",
|
||||
itemID.ToString());
|
||||
m_log.DebugFormat("[ATTACHMENT]: Attach from in world: ItemID {0}, Asset ID {1}, Attachment inworld: {2}", itemID.ToString(), asset.ToString(), att.UUID.ToString());
|
||||
|
||||
// This will throw if crossing katty-korner
|
||||
// So catch it here to avoid the noid
|
||||
//
|
||||
try
|
||||
{
|
||||
// Attach from world, if not already attached
|
||||
if (att.ParentGroup != null && !att.IsAttachment)
|
||||
m_scene.AttachObject(ControllingClient, att.ParentGroup.LocalId, (uint)0, att.ParentGroup.GroupRotation, Vector3.Zero);
|
||||
}
|
||||
catch (System.NullReferenceException e)
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -122,7 +122,7 @@ namespace OpenSim.Region.Examples.SimpleModule
|
|||
if (m_parts.Count == 1)
|
||||
{
|
||||
m_parts.Remove(m_rootPart.UUID);
|
||||
m_scene.DeleteSceneObject(this);
|
||||
m_scene.DeleteSceneObject(this, false);
|
||||
remoteClient.SendKillObject(m_regionHandle, m_rootPart.LocalId);
|
||||
remoteClient.AddMoney(50);
|
||||
remoteClient.SendChatMessage("KABLAM!!!", 1, AbsolutePosition, "Groupie Groupie", UUID.Zero, (byte)ChatSourceType.Object, (byte)ChatAudibleLevel.Fully);
|
||||
|
|
|
@ -198,7 +198,7 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine
|
|||
lastLocalID);
|
||||
if (part != null && part.ParentGroup != null)
|
||||
lastScriptEngine.World.DeleteSceneObject(
|
||||
part.ParentGroup);
|
||||
part.ParentGroup, false);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
|
|
|
@ -641,7 +641,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
|
|||
{
|
||||
m_InSelfDelete = true;
|
||||
if (part != null && part.ParentGroup != null)
|
||||
m_Engine.World.DeleteSceneObject(part.ParentGroup);
|
||||
m_Engine.World.DeleteSceneObject(part.ParentGroup, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue