/// <summary> /// Adds a Scene Object group to the Scene. /// Verifies that the creator of the object is not banned from the simulator. /// Checks if the item is an Attachment /// </summary> /// <param name="scene"></param> /// <param name="sceneObject"></param> /// <returns>True if the SceneObjectGroup was added, False if it was not</returns> public bool AddSceneObject(IScene scene, SceneObjectGroup sceneObject) { // If the user is banned, we won't let any of their objects // enter. Period. // if (scene.RegionInfo.EstateSettings.IsBanned(sceneObject.OwnerID)) { MainConsole.Instance.Info("[EntityTransferModule]: Denied prim crossing for banned avatar"); return false; } if (!sceneObject.IsAttachmentCheckFull()) // Not Attachment { if (!scene.Permissions.CanObjectEntry(sceneObject.UUID, true, sceneObject.AbsolutePosition, sceneObject.OwnerID)) { // Deny non attachments based on parcel settings // MainConsole.Instance.Info("[EntityTransferModule]: Denied prim crossing " + "because of parcel settings"); IBackupModule backup = scene.RequestModuleInterface<IBackupModule>(); if (backup != null) backup.DeleteSceneObjects(new[] { sceneObject }, true, true); return false; } if (scene.SceneGraph.AddPrimToScene(sceneObject)) { if(sceneObject.RootPart.IsSelected) sceneObject.RootPart.CreateSelected = true; sceneObject.ScheduleGroupUpdate (PrimUpdateFlags.ForcedFullUpdate); return true; } } return false; }
/// <summary> /// Adds a Scene Object group to the Scene. /// Verifies that the creator of the object is not banned from the simulator. /// Checks if the item is an Attachment /// </summary> /// <param name="sceneObject"></param> /// <returns>True if the SceneObjectGroup was added, False if it was not</returns> public bool AddSceneObject(SceneObjectGroup sceneObject) { // Force allocation of new LocalId // SceneObjectPart[] parts = sceneObject.Parts; for (int i = 0; i < parts.Length; i++) parts[i].LocalId = 0; if (sceneObject.IsAttachmentCheckFull()) // Attachment { sceneObject.RootPart.AddFlag(PrimFlags.TemporaryOnRez); sceneObject.RootPart.AddFlag(PrimFlags.Phantom); // Don't sent a full update here because this will cause full updates to be sent twice for // attachments on region crossings, resulting in viewer glitches. AddRestoredSceneObject(sceneObject, false, false, false); // Handle attachment special case SceneObjectPart RootPrim = sceneObject.RootPart; // Fix up attachment Parent Local ID ScenePresence sp = GetScenePresence(sceneObject.OwnerID); if (sp != null) { SceneObjectGroup grp = sceneObject; // m_log.DebugFormat( // "[ATTACHMENT]: Received attachment {0}, inworld asset id {1}", grp.FromItemID, grp.UUID); // m_log.DebugFormat( // "[ATTACHMENT]: Attach to avatar {0} at position {1}", sp.UUID, grp.AbsolutePosition); RootPrim.RemFlag(PrimFlags.TemporaryOnRez); if (AttachmentsModule != null) AttachmentsModule.AttachObject(sp, grp, 0, false, false); } else { RootPrim.RemFlag(PrimFlags.TemporaryOnRez); RootPrim.AddFlag(PrimFlags.TemporaryOnRez); } } else { AddRestoredSceneObject(sceneObject, true, false); } return true; }
/// <summary> /// Adds a Scene Object group to the Scene. /// Verifies that the creator of the object is not banned from the simulator. /// Checks if the item is an Attachment /// </summary> /// <param name="sceneObject"></param> /// <returns>True if the SceneObjectGroup was added, False if it was not</returns> public bool AddSceneObject(SceneObjectGroup sceneObject) { // If the user is banned, we won't let any of their objects // enter. Period. // if (m_regInfo.EstateSettings.IsBanned(sceneObject.OwnerID)) { m_log.InfoFormat("[INTERREGION]: Denied prim crossing for banned avatar {0}", sceneObject.OwnerID); return false; } sceneObject.SetScene(this); // Force allocation of new LocalId // SceneObjectPart[] parts = sceneObject.Parts; for (int i = 0; i < parts.Length; i++) parts[i].LocalId = 0; if (sceneObject.IsAttachmentCheckFull()) // Attachment { sceneObject.RootPart.AddFlag(PrimFlags.TemporaryOnRez); sceneObject.RootPart.AddFlag(PrimFlags.Phantom); // Don't sent a full update here because this will cause full updates to be sent twice for // attachments on region crossings, resulting in viewer glitches. AddRestoredSceneObject(sceneObject, false, false, false); // Handle attachment special case SceneObjectPart RootPrim = sceneObject.RootPart; // Fix up attachment Parent Local ID ScenePresence sp = GetScenePresence(sceneObject.OwnerID); if (sp != null) { SceneObjectGroup grp = sceneObject; m_log.DebugFormat( "[ATTACHMENT]: Received attachment {0}, inworld asset id {1}", grp.GetFromItemID(), grp.UUID); m_log.DebugFormat( "[ATTACHMENT]: Attach to avatar {0} at position {1}", sp.UUID, grp.AbsolutePosition); RootPrim.RemFlag(PrimFlags.TemporaryOnRez); if (AttachmentsModule != null) AttachmentsModule.AttachObject(sp, grp, 0, false); } else { RootPrim.RemFlag(PrimFlags.TemporaryOnRez); RootPrim.AddFlag(PrimFlags.TemporaryOnRez); } } else { AddRestoredSceneObject(sceneObject, true, false); if (!Permissions.CanObjectEntry(sceneObject.UUID, true, sceneObject.AbsolutePosition)) { // Deny non attachments based on parcel settings // m_log.Info("[INTERREGION]: Denied prim crossing because of parcel settings"); DeleteSceneObject(sceneObject, false); return false; } } return true; }
public override bool HandleIncomingSceneObject(SceneObjectGroup so, Vector3 newPosition) { // FIXME: We must make it so that we can use SOG.IsAttachment here. At the moment it is always null! if (!so.IsAttachmentCheckFull()) return base.HandleIncomingSceneObject(so, newPosition); // Equally, we can't use so.AttachedAvatar here. if (so.OwnerID == UUID.Zero || Scene.UserManagementModule.IsLocalGridUser(so.OwnerID)) return base.HandleIncomingSceneObject(so, newPosition); // foreign user AgentCircuitData aCircuit = Scene.AuthenticateHandler.GetAgentCircuitData(so.OwnerID); if (aCircuit != null) { if ((aCircuit.teleportFlags & (uint)Constants.TeleportFlags.ViaHGLogin) == 0) { // We have already pulled the necessary attachments from the source grid. base.HandleIncomingSceneObject(so, newPosition); } else { if (aCircuit.ServiceURLs != null && aCircuit.ServiceURLs.ContainsKey("AssetServerURI")) { m_incomingSceneObjectEngine.QueueJob( string.Format("HG UUID Gather for attachment {0} for {1}", so.Name, aCircuit.Name), () => { string url = aCircuit.ServiceURLs["AssetServerURI"].ToString(); // m_log.DebugFormat( // "[HG ENTITY TRANSFER MODULE]: Incoming attachment {0} for HG user {1} with asset service {2}", // so.Name, so.AttachedAvatar, url); IDictionary<UUID, sbyte> ids = new Dictionary<UUID, sbyte>(); HGUuidGatherer uuidGatherer = new HGUuidGatherer(Scene.AssetService, url, ids); uuidGatherer.AddForInspection(so); while (!uuidGatherer.Complete) { int tickStart = Util.EnvironmentTickCount(); UUID? nextUuid = uuidGatherer.NextUuidToInspect; uuidGatherer.GatherNext(); // m_log.DebugFormat( // "[HG ENTITY TRANSFER]: Gathered attachment asset uuid {0} for object {1} for HG user {2} took {3} ms with asset service {4}", // nextUuid, so.Name, so.OwnerID, Util.EnvironmentTickCountSubtract(tickStart), url); int ticksElapsed = Util.EnvironmentTickCountSubtract(tickStart); if (ticksElapsed > 30000) { m_log.WarnFormat( "[HG ENTITY TRANSFER]: Removing incoming scene object jobs for HG user {0} as gather of {1} from {2} took {3} ms to respond (> {4} ms)", so.OwnerID, so.Name, url, ticksElapsed, 30000); RemoveIncomingSceneObjectJobs(so.OwnerID.ToString()); return; } } // m_log.DebugFormat( // "[HG ENTITY TRANSFER]: Fetching {0} assets for attachment {1} for HG user {2} with asset service {3}", // ids.Count, so.Name, so.OwnerID, url); foreach (KeyValuePair<UUID, sbyte> kvp in ids) { int tickStart = Util.EnvironmentTickCount(); uuidGatherer.FetchAsset(kvp.Key); int ticksElapsed = Util.EnvironmentTickCountSubtract(tickStart); if (ticksElapsed > 30000) { m_log.WarnFormat( "[HG ENTITY TRANSFER]: Removing incoming scene object jobs for HG user {0} as fetch of {1} from {2} took {3} ms to respond (> {4} ms)", so.OwnerID, kvp.Key, url, ticksElapsed, 30000); RemoveIncomingSceneObjectJobs(so.OwnerID.ToString()); return; } } base.HandleIncomingSceneObject(so, newPosition); // m_log.DebugFormat( // "[HG ENTITY TRANSFER MODULE]: Completed incoming attachment {0} for HG user {1} with asset server {2}", // so.Name, so.OwnerID, url); }, so.OwnerID.ToString()); } } } return true; }
private int GetStateSource(SceneObjectGroup sog) { if(!sog.IsAttachmentCheckFull()) return 2; // StateSource.PrimCrossing ScenePresence sp = GetScenePresence(sog.OwnerID); if (sp != null) return sp.GetStateSource(); return 2; // StateSource.PrimCrossing }
/// <summary> /// Adds a Scene Object group to the Scene. /// Verifies that the creator of the object is not banned from the simulator. /// Checks if the item is an Attachment /// </summary> /// <param name="sceneObject"></param> /// <returns>True if the SceneObjectGroup was added, False if it was not</returns> public bool AddSceneObject(SceneObjectGroup sceneObject) { if (sceneObject.OwnerID == UUID.Zero) { m_log.ErrorFormat("[SCENE]: Owner ID for {0} was zero", sceneObject.UUID); return false; } // If the user is banned, we won't let any of their objects // enter. Period. // int flags = GetUserFlags(sceneObject.OwnerID); if (RegionInfo.EstateSettings.IsBanned(sceneObject.OwnerID, flags)) { m_log.InfoFormat("[INTERREGION]: Denied prim crossing for banned avatar {0}", sceneObject.OwnerID); return false; } // Force allocation of new LocalId // SceneObjectPart[] parts = sceneObject.Parts; for (int i = 0; i < parts.Length; i++) parts[i].LocalId = 0; if (sceneObject.IsAttachmentCheckFull()) // Attachment { sceneObject.RootPart.AddFlag(PrimFlags.TemporaryOnRez); // sceneObject.RootPart.AddFlag(PrimFlags.Phantom); // Don't sent a full update here because this will cause full updates to be sent twice for // attachments on region crossings, resulting in viewer glitches. AddRestoredSceneObject(sceneObject, false, false, false); // Handle attachment special case SceneObjectPart RootPrim = sceneObject.RootPart; // Fix up attachment Parent Local ID ScenePresence sp = GetScenePresence(sceneObject.OwnerID); if (sp != null) { SceneObjectGroup grp = sceneObject; // m_log.DebugFormat( // "[ATTACHMENT]: Received attachment {0}, inworld asset id {1}", grp.FromItemID, grp.UUID); // m_log.DebugFormat( // "[ATTACHMENT]: Attach to avatar {0} at position {1}", sp.UUID, grp.AbsolutePosition); RootPrim.RemFlag(PrimFlags.TemporaryOnRez); // We must currently not resume scripts at this stage since AttachmentsModule does not have the // information that this is due to a teleport/border cross rather than an ordinary attachment. // We currently do this in Scene.MakeRootAgent() instead. if (AttachmentsModule != null) AttachmentsModule.AttachObject(sp, grp, 0, false, false, true); } else { m_log.DebugFormat("[SCENE]: Attachment {0} arrived and scene presence was not found, setting to temp", sceneObject.UUID); // RootPrim.RemFlag(PrimFlags.TemporaryOnRez); // RootPrim.AddFlag(PrimFlags.TemporaryOnRez); } if (sceneObject.OwnerID == UUID.Zero) { m_log.ErrorFormat("[SCENE]: Owner ID for {0} was zero after attachment processing. BUG!", sceneObject.UUID); return false; } } else { if (sceneObject.OwnerID == UUID.Zero) { m_log.ErrorFormat("[SCENE]: Owner ID for non-attachment {0} was zero", sceneObject.UUID); return false; } AddRestoredSceneObject(sceneObject, true, false); } return true; }
/// <summary> /// Adds a Scene Object group to the Scene. /// Verifies that the creator of the object is not banned from the simulator. /// Checks if the item is an Attachment /// </summary> /// <param name="sceneObject"></param> /// <returns>True if the SceneObjectGroup was added, False if it was not</returns> public bool AddSceneObject(SceneObjectGroup sceneObject) { // If the user is banned, we won't let any of their objects // enter. Period. // if (m_regInfo.EstateSettings.IsBanned(sceneObject.OwnerID)) { m_log.Info("[INTERREGION]: Denied prim crossing for " + "banned avatar"); return false; } // Force allocation of new LocalId // foreach (SceneObjectPart p in sceneObject.ChildrenList) p.LocalId = 0; if (sceneObject.IsAttachmentCheckFull()) // Attachment { sceneObject.RootPart.AddFlag(PrimFlags.TemporaryOnRez); sceneObject.RootPart.AddFlag(PrimFlags.Phantom); AddRestoredSceneObject(sceneObject, false, false, true); // Handle attachment special case SceneObjectPart RootPrim = sceneObject.RootPart; // Fix up attachment Parent Local ID ScenePresence sp = GetScenePresence(sceneObject.OwnerID); if (sp != null) { SceneObjectGroup grp = sceneObject; m_log.DebugFormat( "[ATTACHMENT]: Received attachment {0}, inworld asset id {1}", grp.GetFromItemID(), grp.UUID); m_log.DebugFormat( "[ATTACHMENT]: Attach to avatar {0} at position {1}", sp.UUID, grp.AbsolutePosition); if (AttachmentsModule != null) AttachmentsModule.AttachObject(sp.ControllingClient, grp.LocalId, 0, false); RootPrim.RemFlag(PrimFlags.TemporaryOnRez); grp.SendGroupFullUpdate(PrimUpdateFlags.FullUpdate); } else { RootPrim.RemFlag(PrimFlags.TemporaryOnRez); RootPrim.AddFlag(PrimFlags.TemporaryOnRez); } } else { AddRestoredSceneObject(sceneObject, true, false, true); if (!Permissions.CanObjectEntry(sceneObject.UUID, true, sceneObject.AbsolutePosition)) { // Deny non attachments based on parcel settings // m_log.Info("[INTERREGION]: Denied prim crossing " + "because of parcel settings"); DeleteSceneObject(sceneObject, false, true); return false; } } return true; }