/// <summary> /// This turns a root agent into a child agent /// </summary> /// <remarks> /// when an agent departs this region for a neighbor, this gets called. /// /// It doesn't get called for a teleport. Reason being, an agent that /// teleports out may not end up anywhere near this region /// </remarks> public void MakeChildAgent(ulong newRegionHandle) { m_scene.EventManager.OnRegionHeartbeatEnd -= RegionHeartbeatEnd; RegionHandle = newRegionHandle; m_log.DebugFormat("[SCENE PRESENCE]: Making {0} a child agent in {1} from root region {2}", Name, Scene.RegionInfo.RegionName, newRegionHandle); // Reset the m_originRegionID as it has dual use as a flag to signal that the UpdateAgent() call orignating // from the source simulator has completed on a V2 teleport. lock (m_originRegionIDAccessLock) m_originRegionID = UUID.Zero; // Reset these so that teleporting in and walking out isn't seen // as teleporting back TeleportFlags = TeleportFlags.Default; MovementFlag = 0; // It looks like Animator is set to null somewhere, and MakeChild // is called after that. Probably in aborted teleports. if (Animator == null) Animator = new ScenePresenceAnimator(this); else Animator.ResetAnimations(); // m_log.DebugFormat( // "[SCENE PRESENCE]: Downgrading root agent {0}, {1} to a child agent in {2}", // Name, UUID, m_scene.RegionInfo.RegionName); // Don't zero out the velocity since this can cause problems when an avatar is making a region crossing, // depending on the exact timing. This shouldn't matter anyway since child agent positions are not updated. //Velocity = new Vector3(0, 0, 0); IsChildAgent = true; m_scene.SwapRootAgentCount(true); RemoveFromPhysicalScene(); ParentID = 0; // Child agents can't be sitting // we dont have land information for child m_previusParcelHide = false; m_previusParcelUUID = UUID.Zero; m_currentParcelHide = false; m_currentParcelUUID = UUID.Zero; // FIXME: Set RegionHandle to the region handle of the scene this agent is moving into CollisionPlane = Vector4.UnitW; m_scene.EventManager.TriggerOnMakeChildAgent(this); }
public ScenePresence( IClientAPI client, Scene world, AvatarAppearance appearance, PresenceType type) { m_scene = world; AttachmentsSyncLock = new Object(); AllowMovement = true; IsChildAgent = true; IsLoggingIn = false; m_sendCoarseLocationsMethod = SendCoarseLocationsDefault; Animator = new ScenePresenceAnimator(this); Overrides = new MovementAnimationOverrides(); PresenceType = type; DrawDistance = world.DefaultDrawDistance; RegionHandle = world.RegionInfo.RegionHandle; ControllingClient = client; Firstname = ControllingClient.FirstName; Lastname = ControllingClient.LastName; m_name = String.Format("{0} {1}", Firstname, Lastname); m_uuid = client.AgentId; LocalId = m_scene.AllocateLocalId(); LegacySitOffsets = m_scene.LegacySitOffsets; UserAccount account = m_scene.UserAccountService.GetUserAccount(m_scene.RegionInfo.ScopeID, m_uuid); if (account != null) m_userFlags = account.UserFlags; else m_userFlags = 0; if (account != null) UserLevel = account.UserLevel; IGroupsModule gm = m_scene.RequestModuleInterface<IGroupsModule>(); if (gm != null) Grouptitle = gm.GetGroupTitle(m_uuid); m_scriptEngines = m_scene.RequestModuleInterfaces<IScriptModule>(); AbsolutePosition = posLastSignificantMove = CameraPosition = m_lastCameraPosition = ControllingClient.StartPos; m_reprioritization_timer = new Timer(world.ReprioritizationInterval); m_reprioritization_timer.Elapsed += new ElapsedEventHandler(Reprioritize); m_reprioritization_timer.AutoReset = false; AdjustKnownSeeds(); RegisterToEvents(); SetDirectionVectors(); Appearance = appearance; m_stateMachine = new ScenePresenceStateMachine(this); }
public ScenePresence() { m_sendCourseLocationsMethod = SendCoarseLocationsDefault; CreateSceneViewer(); m_animator = new ScenePresenceAnimator(this); }
/// <summary> /// This turns a root agent into a child agent /// </summary> /// <remarks> /// when an agent departs this region for a neighbor, this gets called. /// /// It doesn't get called for a teleport. Reason being, an agent that /// teleports out may not end up anywhere near this region /// </remarks> public void MakeChildAgent() { m_log.DebugFormat("[SCENE PRESENCE]: Making {0} a child agent in {1}", Name, Scene.RegionInfo.RegionName); // Reset these so that teleporting in and walking out isn't seen // as teleporting back TeleportFlags = TeleportFlags.Default; // It looks like Animator is set to null somewhere, and MakeChild // is called after that. Probably in aborted teleports. if (Animator == null) Animator = new ScenePresenceAnimator(this); else Animator.ResetAnimations(); // m_log.DebugFormat( // "[SCENE PRESENCE]: Downgrading root agent {0}, {1} to a child agent in {2}", // Name, UUID, m_scene.RegionInfo.RegionName); // Don't zero out the velocity since this can cause problems when an avatar is making a region crossing, // depending on the exact timing. This shouldn't matter anyway since child agent positions are not updated. //Velocity = new Vector3(0, 0, 0); IsChildAgent = true; m_scene.SwapRootAgentCount(true); RemoveFromPhysicalScene(); // FIXME: Set RegionHandle to the region handle of the scene this agent is moving into m_scene.EventManager.TriggerOnMakeChildAgent(this); }
public void Close() { lock (m_attachments) { // Delete attachments from scene // Don't try to save, as this thread won't live long // enough to complete the save. This would cause no copy // attachments to poof! // foreach (SceneObjectGroup grp in m_attachments) { m_scene.DeleteSceneObject(grp, false); } m_attachments.Clear(); } lock (m_knownChildRegions) { m_knownChildRegions.Clear(); } lock (m_reprioritization_timer) { m_reprioritization_timer.Enabled = false; m_reprioritization_timer.Elapsed -= new ElapsedEventHandler(Reprioritize); } // I don't get it but mono crashes when you try to dispose of this timer, // unsetting the elapsed callback should be enough to allow for cleanup however. // m_reprioritizationTimer.Dispose(); m_sceneViewer.Close(); RemoveFromPhysicalScene(); m_animator.Close(); m_animator = null; }
private ScenePresence(IClientAPI client, Scene world, RegionInfo reginfo) { m_animator = new ScenePresenceAnimator(this); m_sendCourseLocationsMethod = SendCoarseLocationsDefault; CreateSceneViewer(); m_rootRegionHandle = reginfo.RegionHandle; m_controllingClient = client; m_firstname = m_controllingClient.FirstName; m_lastname = m_controllingClient.LastName; m_name = String.Format("{0} {1}", m_firstname, m_lastname); m_scene = world; m_uuid = client.AgentId; m_regionInfo = reginfo; m_localId = m_scene.AllocateLocalId(); IGroupsModule gm = m_scene.RequestModuleInterface<IGroupsModule>(); if (gm != null) m_grouptitle = gm.GetGroupTitle(m_uuid); m_scriptEngines = m_scene.RequestModuleInterfaces<IScriptModule>(); AbsolutePosition = posLastSignificantMove = m_CameraCenter = m_lastCameraCenter = m_controllingClient.StartPos; m_reprioritization_timer = new Timer(world.ReprioritizationInterval); m_reprioritization_timer.Elapsed += new ElapsedEventHandler(Reprioritize); m_reprioritization_timer.AutoReset = false; AdjustKnownSeeds(); // TODO: I think, this won't send anything, as we are still a child here... Animator.TrySetMovementAnimation("STAND"); // we created a new ScenePresence (a new child agent) in a fresh region. // Request info about all the (root) agents in this region // Note: This won't send data *to* other clients in that region (children don't send) SendInitialFullUpdateToAllClients(); RegisterToEvents(); SetDirectionVectors(); }
public ScenePresence( IClientAPI client, Scene world, AvatarAppearance appearance, PresenceType type) { m_scene = world; AttachmentsSyncLock = new Object(); AllowMovement = true; IsChildAgent = true; IsLoggingIn = false; m_sendCoarseLocationsMethod = SendCoarseLocationsDefault; Animator = new ScenePresenceAnimator(this); Overrides = new MovementAnimationOverrides(); PresenceType = type; DrawDistance = world.DefaultDrawDistance; RegionHandle = world.RegionInfo.RegionHandle; ControllingClient = client; Firstname = ControllingClient.FirstName; Lastname = ControllingClient.LastName; m_name = String.Format("{0} {1}", Firstname, Lastname); m_uuid = client.AgentId; LocalId = m_scene.AllocateLocalId(); LegacySitOffsets = m_scene.LegacySitOffsets; UserAccount account = m_scene.UserAccountService.GetUserAccount(m_scene.RegionInfo.ScopeID, m_uuid); if (account != null) m_userFlags = account.UserFlags; else m_userFlags = 0; if (account != null) UserLevel = account.UserLevel; // IGroupsModule gm = m_scene.RequestModuleInterface<IGroupsModule>(); // if (gm != null) // Grouptitle = gm.GetGroupTitle(m_uuid); m_scriptEngines = m_scene.RequestModuleInterfaces<IScriptModule>(); AbsolutePosition = posLastMove = posLastSignificantMove = CameraPosition = m_reprioritizationLastPosition = ControllingClient.StartPos; m_reprioritizationLastDrawDistance = DrawDistance; // disable updates workjobs for now childUpdatesBusy = true; m_reprioritizationBusy = true; AdjustKnownSeeds(); RegisterToEvents(); SetDirectionVectors(); Appearance = appearance; m_stateMachine = new ScenePresenceStateMachine(this); HealRate = 0.5f; IConfig sconfig = m_scene.Config.Configs["EntityTransfer"]; if (sconfig != null) { string lpb = sconfig.GetString("LandingPointBehavior", "LandingPointBehavior_OS"); if (lpb == "LandingPointBehavior_SL") m_LandingPointBehavior = LandingPointBehavior.SL; } }
public ScenePresence( IClientAPI client, Scene world, AvatarAppearance appearance, PresenceType type) { AttachmentsSyncLock = new Object(); m_sendCourseLocationsMethod = SendCoarseLocationsDefault; Animator = new ScenePresenceAnimator(this); PresenceType = type; DrawDistance = world.DefaultDrawDistance; RegionHandle = world.RegionInfo.RegionHandle; ControllingClient = client; Firstname = ControllingClient.FirstName; Lastname = ControllingClient.LastName; m_name = String.Format("{0} {1}", Firstname, Lastname); m_scene = world; m_uuid = client.AgentId; LocalId = m_scene.AllocateLocalId(); UserAccount account = m_scene.UserAccountService.GetUserAccount(m_scene.RegionInfo.ScopeID, m_uuid); if (account != null) m_userFlags = account.UserFlags; else m_userFlags = 0; if (account != null) UserLevel = account.UserLevel; IGroupsModule gm = m_scene.RequestModuleInterface<IGroupsModule>(); if (gm != null) Grouptitle = gm.GetGroupTitle(m_uuid); m_scriptEngines = m_scene.RequestModuleInterfaces<IScriptModule>(); AbsolutePosition = posLastSignificantMove = CameraPosition = m_lastCameraPosition = ControllingClient.StartPos; m_reprioritization_timer = new Timer(world.ReprioritizationInterval); m_reprioritization_timer.Elapsed += new ElapsedEventHandler(Reprioritize); m_reprioritization_timer.AutoReset = false; AdjustKnownSeeds(); // TODO: I think, this won't send anything, as we are still a child here... Animator.TrySetMovementAnimation("STAND"); // we created a new ScenePresence (a new child agent) in a fresh region. // Request info about all the (root) agents in this region // Note: This won't send data *to* other clients in that region (children don't send) // MIC: This gets called again in CompleteMovement // SendInitialFullUpdateToAllClients(); SendOtherAgentsAvatarDataToMe(); SendOtherAgentsAppearanceToMe(); RegisterToEvents(); SetDirectionVectors(); Appearance = appearance; }
public void Close() { if (!IsChildAgent) m_scene.AttachmentsModule.DeleteAttachmentsFromScene(this, false); lock (m_knownChildRegions) { m_knownChildRegions.Clear(); } lock (m_reprioritization_timer) { m_reprioritization_timer.Enabled = false; m_reprioritization_timer.Elapsed -= new ElapsedEventHandler(Reprioritize); } // I don't get it but mono crashes when you try to dispose of this timer, // unsetting the elapsed callback should be enough to allow for cleanup however. // m_reprioritizationTimer.Dispose(); m_sceneViewer.Close(); RemoveFromPhysicalScene(); m_animator.Close(); m_animator = null; }