// Some presence property has changed. Generate a call into the scene presence // so the new values are evaluated (like AgentControlFlags). // The ScenePresence will trigger OnScenePresenceUpdated and we rely on the // fact that the values will all be equal to supress the generation of a // new outgoing property update message. private void GenerateAgentUpdated(ScenePresence sp) { // The call for the change of these values comes out of the client view // which has an OnAgentUpdate event that the scene presence connects to. // We can't use the OnAgentUpdate event subscription (we're not derived // from client view) so we fake the reception of a presenece changing // message by building up the parameter block and directly calling the // ScenePresence's handling routine. AgentUpdateArgs aua = new AgentUpdateArgs(); aua.AgentID = sp.UUID; aua.BodyRotation = sp.Rotation; aua.CameraAtAxis = sp.CameraAtAxis; aua.CameraCenter = sp.CameraPosition; aua.CameraLeftAxis = sp.CameraLeftAxis; aua.CameraUpAxis = sp.CameraUpAxis; aua.ClientAgentPosition = sp.AbsolutePosition; aua.ControlFlags = sp.AgentControlFlags; aua.Far = sp.DrawDistance; aua.Flags = 0; aua.HeadRotation = sp.Rotation; // this is wrong but the only thing we can do aua.State = sp.State; aua.UseClientAgentPosition = true; sp.HandleAgentUpdate(null, aua); }
private void Update() { frame++; if (frame > 20) { frame = 0; if (OnAgentUpdate != null) { AgentUpdateArgs pack = new AgentUpdateArgs(); pack.ControlFlags = movementFlag; pack.BodyRotation = bodyDirection; OnAgentUpdate(this, pack); } if (flyState == 0) { movementFlag = (uint)AgentManager.ControlFlags.AGENT_CONTROL_FLY | (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG; flyState = 1; } else if (flyState == 1) { movementFlag = (uint)AgentManager.ControlFlags.AGENT_CONTROL_FLY | (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_POS; flyState = 2; } else { movementFlag = (uint)AgentManager.ControlFlags.AGENT_CONTROL_FLY; flyState = 0; } if (count >= 10) { if (OnChatFromClient != null) { OSChatMessage args = new OSChatMessage(); args.Message = "Hey You! Get out of my Home. This is my Region"; args.Channel = 0; args.From = FirstName + " " + LastName; args.Scene = m_scene; args.Position = new Vector3(128, 128, 26); args.Sender = this; args.Type = ChatTypeEnum.Shout; OnChatFromClient(this, args); } count = -1; } count++; } }
public bool AgentUpdate(AgentUpdateArgs arg) { UpdateAgent handlerAgentUpdate = OnAgentUpdate; if (handlerAgentUpdate != null) { OnAgentUpdate(this, arg); handlerAgentUpdate = null; return(true); } handlerAgentUpdate = null; return(false); }
public void OnBotAgentUpdate(ScenePresence presence, Vector3 toward, uint controlFlag, Quaternion bodyRotation, bool isMoving) { if (m_controller.Bot.Frozen && isMoving) { bool fly = presence.PhysicsActor == null ? false : presence.PhysicsActor.Flying; StopMoving(presence, fly, false); return; } if (isMoving) { m_hasStoppedMoving = false; } AgentUpdateArgs pack = new AgentUpdateArgs { ControlFlags = controlFlag, BodyRotation = bodyRotation }; presence.HandleAgentUpdate(presence.ControllingClient, pack); }
public void TestCrossOnSameSimulator() { TestHelpers.InMethod(); // TestHelpers.EnableLogging(); UUID userId = TestHelpers.ParseTail(0x1); // TestEventQueueGetModule eqmA = new TestEventQueueGetModule(); EntityTransferModule etmA = new EntityTransferModule(); EntityTransferModule etmB = new EntityTransferModule(); LocalSimulationConnectorModule lscm = new LocalSimulationConnectorModule(); IConfigSource config = new IniConfigSource(); IConfig modulesConfig = config.AddConfig("Modules"); modulesConfig.Set("EntityTransferModule", etmA.Name); modulesConfig.Set("SimulationServices", lscm.Name); // IConfig entityTransferConfig = config.AddConfig("EntityTransfer"); // In order to run a single threaded regression test we do not want the entity transfer module waiting // for a callback from the destination scene before removing its avatar data. // entityTransferConfig.Set("wait_for_callback", false); SceneHelpers sh = new SceneHelpers(); TestScene sceneA = sh.SetupScene("sceneA", TestHelpers.ParseTail(0x100), 1000, 1000); TestScene sceneB = sh.SetupScene("sceneB", TestHelpers.ParseTail(0x200), 1000, 999); SceneHelpers.SetupSceneModules(new Scene[] { sceneA, sceneB }, config, lscm); SceneHelpers.SetupSceneModules(sceneA, config, new CapabilitiesModule(), etmA); // SceneHelpers.SetupSceneModules(sceneA, config, new CapabilitiesModule(), etmA, eqmA); SceneHelpers.SetupSceneModules(sceneB, config, new CapabilitiesModule(), etmB); AgentCircuitData acd = SceneHelpers.GenerateAgentData(userId); TestClient tc = new TestClient(acd, sceneA); List <TestClient> destinationTestClients = new List <TestClient>(); EntityTransferHelpers.SetupInformClientOfNeighbourTriggersNeighbourClientCreate(tc, destinationTestClients); ScenePresence originalSp = SceneHelpers.AddScenePresence(sceneA, tc, acd); originalSp.AbsolutePosition = new Vector3(128, 32, 10); // originalSp.Flying = true; // Console.WriteLine("First pos {0}", originalSp.AbsolutePosition); // eqmA.ClearEvents(); AgentUpdateArgs moveArgs = new AgentUpdateArgs(); //moveArgs.BodyRotation = Quaternion.CreateFromEulers(Vector3.Zero); moveArgs.BodyRotation = Quaternion.CreateFromEulers(new Vector3(0, 0, (float)-(Math.PI / 2))); moveArgs.ControlFlags = (uint)AgentManager.ControlFlags.AGENT_CONTROL_AT_POS; moveArgs.SessionID = acd.SessionID; originalSp.HandleAgentUpdate(originalSp.ControllingClient, moveArgs); sceneA.Update(1); // Console.WriteLine("Second pos {0}", originalSp.AbsolutePosition); // FIXME: This is a sufficient number of updates to for the presence to reach the northern border. // But really we want to do this in a more robust way. for (int i = 0; i < 100; i++) { sceneA.Update(1); // Console.WriteLine("Pos {0}", originalSp.AbsolutePosition); } // Need to sort processing of EnableSimulator message on adding scene presences before we can test eqm // messages // Dictionary<UUID, List<TestEventQueueGetModule.Event>> eqmEvents = eqmA.Events; // // Assert.That(eqmEvents.Count, Is.EqualTo(1)); // Assert.That(eqmEvents.ContainsKey(originalSp.UUID), Is.True); // // List<TestEventQueueGetModule.Event> spEqmEvents = eqmEvents[originalSp.UUID]; // // Assert.That(spEqmEvents.Count, Is.EqualTo(1)); // Assert.That(spEqmEvents[0].Name, Is.EqualTo("CrossRegion")); // sceneA should now only have a child agent ScenePresence spAfterCrossSceneA = sceneA.GetScenePresence(originalSp.UUID); Assert.That(spAfterCrossSceneA.IsChildAgent, Is.True); ScenePresence spAfterCrossSceneB = sceneB.GetScenePresence(originalSp.UUID); // Agent remains a child until the client triggers complete movement Assert.That(spAfterCrossSceneB.IsChildAgent, Is.True); TestClient sceneBTc = ((TestClient)spAfterCrossSceneB.ControllingClient); int agentMovementCompleteReceived = 0; sceneBTc.OnReceivedMoveAgentIntoRegion += (ri, pos, look) => agentMovementCompleteReceived++; sceneBTc.CompleteMovement(); Assert.That(agentMovementCompleteReceived, Is.EqualTo(1)); Assert.That(spAfterCrossSceneB.IsChildAgent, Is.False); }
public void TestCrossOnSameSimulatorNoRootDestPerm() { TestHelpers.InMethod(); // TestHelpers.EnableLogging(); UUID userId = TestHelpers.ParseTail(0x1); EntityTransferModule etmA = new EntityTransferModule(); EntityTransferModule etmB = new EntityTransferModule(); LocalSimulationConnectorModule lscm = new LocalSimulationConnectorModule(); IConfigSource config = new IniConfigSource(); IConfig modulesConfig = config.AddConfig("Modules"); modulesConfig.Set("EntityTransferModule", etmA.Name); modulesConfig.Set("SimulationServices", lscm.Name); SceneHelpers sh = new SceneHelpers(); TestScene sceneA = sh.SetupScene("sceneA", TestHelpers.ParseTail(0x100), 1000, 1000); TestScene sceneB = sh.SetupScene("sceneB", TestHelpers.ParseTail(0x200), 1000, 999); SceneHelpers.SetupSceneModules(new Scene[] { sceneA, sceneB }, config, lscm); SceneHelpers.SetupSceneModules(sceneA, config, new CapabilitiesModule(), etmA); // We need to set up the permisions module on scene B so that our later use of agent limit to deny // QueryAccess won't succeed anyway because administrators are always allowed in and the default // IsAdministrator if no permissions module is present is true. SceneHelpers.SetupSceneModules(sceneB, config, new CapabilitiesModule(), new PermissionsModule(), etmB); AgentCircuitData acd = SceneHelpers.GenerateAgentData(userId); TestClient tc = new TestClient(acd, sceneA); List <TestClient> destinationTestClients = new List <TestClient>(); EntityTransferHelpers.SetupInformClientOfNeighbourTriggersNeighbourClientCreate(tc, destinationTestClients); // Make sure sceneB will not accept this avatar. sceneB.RegionInfo.EstateSettings.PublicAccess = false; ScenePresence originalSp = SceneHelpers.AddScenePresence(sceneA, tc, acd); originalSp.AbsolutePosition = new Vector3(128, 32, 10); AgentUpdateArgs moveArgs = new AgentUpdateArgs(); //moveArgs.BodyRotation = Quaternion.CreateFromEulers(Vector3.Zero); moveArgs.BodyRotation = Quaternion.CreateFromEulers(new Vector3(0, 0, (float)-(Math.PI / 2))); moveArgs.ControlFlags = (uint)AgentManager.ControlFlags.AGENT_CONTROL_AT_POS; moveArgs.SessionID = acd.SessionID; originalSp.HandleAgentUpdate(originalSp.ControllingClient, moveArgs); sceneA.Update(1); // Console.WriteLine("Second pos {0}", originalSp.AbsolutePosition); // FIXME: This is a sufficient number of updates to for the presence to reach the northern border. // But really we want to do this in a more robust way. for (int i = 0; i < 100; i++) { sceneA.Update(1); // Console.WriteLine("Pos {0}", originalSp.AbsolutePosition); } // sceneA agent should still be root ScenePresence spAfterCrossSceneA = sceneA.GetScenePresence(originalSp.UUID); Assert.That(spAfterCrossSceneA.IsChildAgent, Is.False); ScenePresence spAfterCrossSceneB = sceneB.GetScenePresence(originalSp.UUID); // sceneB agent should also still be root Assert.That(spAfterCrossSceneB.IsChildAgent, Is.True); // sceneB should ignore unauthorized attempt to upgrade agent to root TestClient sceneBTc = ((TestClient)spAfterCrossSceneB.ControllingClient); int agentMovementCompleteReceived = 0; sceneBTc.OnReceivedMoveAgentIntoRegion += (ri, pos, look) => agentMovementCompleteReceived++; sceneBTc.CompleteMovement(); Assert.That(agentMovementCompleteReceived, Is.EqualTo(0)); Assert.That(spAfterCrossSceneB.IsChildAgent, Is.True); }
/// <summary> /// This is the event handler for client movement. If a client is moving, this event is triggering. /// </summary> public virtual void HandleAgentUpdate (IClientAPI remoteClient, AgentUpdateArgs agentData) { m_perfMonMS = Util.EnvironmentTickCount(); ++m_movementUpdateCount; if (m_movementUpdateCount < 1) m_movementUpdateCount = 1; #region Sanity Checking // This is irritating. Really. if (!AbsolutePosition.IsFinite()) { OutOfBoundsCall(Vector3.Zero); return; } #endregion Sanity Checking #region Inputs if (Frozen) return; //Do nothing, just end AgentManager.ControlFlags flags = (AgentManager.ControlFlags)agentData.ControlFlags; Quaternion bodyRotation = agentData.BodyRotation; //Check to see whether ray casting needs done // We multiply by 10 so that we don't trigger it when the camera moves slightly (as its 2 meter change) if (Util.GetFlatDistanceTo(agentData.CameraCenter, m_lastCameraCenter) > SIGNIFICANT_MOVEMENT * 10) { m_lastCameraCenter = agentData.CameraCenter; Scene.AuroraEventManager.FireGenericEventHandler("SignficantCameraMovement", this); } // Camera location in world. We'll need to raytrace // from this location from time to time. m_CameraCenter = agentData.CameraCenter; // Use these three vectors to figure out what the agent is looking at // Convert it to a Matrix and/or Quaternion m_CameraAtAxis = agentData.CameraAtAxis; m_CameraLeftAxis = agentData.CameraLeftAxis; m_CameraUpAxis = agentData.CameraUpAxis; // The Agent's Draw distance setting DrawDistance = agentData.Far; // Check if Client has camera in 'follow cam' or 'build' mode. Vector3 camdif = (Vector3.One * m_bodyRot - Vector3.One * CameraRotation); m_followCamAuto = ((m_CameraUpAxis.Z > 0.959f && m_CameraUpAxis.Z < 0.98f) && (Math.Abs(camdif.X) < 0.4f && Math.Abs(camdif.Y) < 0.4f)) ? true : false; m_mouseLook = (flags & AgentManager.ControlFlags.AGENT_CONTROL_MOUSELOOK) != 0; m_leftButtonDown = (flags & AgentManager.ControlFlags.AGENT_CONTROL_LBUTTON_DOWN) != 0; m_isAway = (flags & AgentManager.ControlFlags.AGENT_CONTROL_AWAY) != 0; #endregion Inputs if ((flags & AgentManager.ControlFlags.AGENT_CONTROL_STAND_UP) != 0) { StandUp(); } //m_log.DebugFormat("[FollowCam]: {0}", m_followCamAuto); // Raycast from the avatar's head to the camera to see if there's anything blocking the view if ((m_movementUpdateCount % NumMovementsBetweenRayCast) == 0 && m_scene.PhysicsScene.SupportsRayCast()) { if (m_followCamAuto) { Vector3 posAdjusted = m_pos + HEAD_ADJUSTMENT; m_scene.PhysicsScene.RaycastWorld(m_pos, Vector3.Normalize(m_CameraCenter - posAdjusted), Vector3.Distance(m_CameraCenter, posAdjusted) + 0.3f, RayCastCameraCallback); } } if (!m_CameraCenter.IsFinite()) { m_CameraCenter = new Vector3(128, 128, 128); } IScriptControllerModule m = RequestModuleInterface<IScriptControllerModule> (); if (m != null) //Tell any scripts about it m.OnNewMovement (ref flags); if (m_autopilotMoving) CheckAtSitTarget(); // In the future, these values might need to go global. // Here's where you get them. if (!SitGround) SitGround = (flags & AgentManager.ControlFlags.AGENT_CONTROL_SIT_ON_GROUND) != 0; m_AgentControlFlags = flags; m_headrotation = agentData.HeadRotation; m_state = agentData.State; PhysicsCharacter actor = PhysicsActor; if (actor == null) { //This happens while sitting, don't spam it //m_log.Debug("Null physical actor in AgentUpdate in " + m_scene.RegionInfo.RegionName); return; } bool update_movementflag = false; if (AllowMovement && !SitGround && !Frozen) { if (FallenStandUp) { //Poke the animator a bit Animator.UpdateMovementAnimations(false); m_bodyRot = bodyRotation; AddNewMovement (Vector3.Zero, bodyRotation); return; } if (agentData.UseClientAgentPosition) { m_moveToPositionInProgress = (agentData.ClientAgentPosition - AbsolutePosition).Length() > 0.2f; m_moveToPositionTarget = agentData.ClientAgentPosition; } int i = 0; bool update_rotation = false; bool DCFlagKeyPressed = false; Vector3 agent_control_v3 = Vector3.Zero; Quaternion q = bodyRotation; bool oldflying = PhysicsActor.Flying; if (m_forceFly) actor.Flying = true; else if (m_flyDisabled) actor.Flying = false; else actor.Flying = ((flags & AgentManager.ControlFlags.AGENT_CONTROL_FLY) != 0); if (actor.Flying != oldflying) update_movementflag = true; if (q != m_bodyRot) { m_bodyRot = q; update_rotation = true; } if (m_parentID == UUID.Zero) { bool bAllowUpdateMoveToPosition = false; bool bResetMoveToPosition = false; Vector3[] dirVectors; // use camera up angle when in mouselook and not flying or when holding the left mouse button down and not flying // this prevents 'jumping' in inappropriate situations. if ((m_mouseLook && !m_physicsActor.Flying) || (m_leftButtonDown && !m_physicsActor.Flying)) dirVectors = GetWalkDirectionVectors(); else dirVectors = Dir_Vectors; // The fact that m_movementflag is a byte needs to be fixed // it really should be a uint uint nudgehack = 250; //Do these two like this to block out all others because it will slow it down if ((flags & AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_POS) == AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_POS) { bResetMoveToPosition = true; DCFlagKeyPressed = true; agent_control_v3 += dirVectors[8]; } else if ((flags & AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_NEG) { bResetMoveToPosition = true; DCFlagKeyPressed = true; agent_control_v3 += dirVectors[9]; } else { foreach (Dir_ControlFlags DCF in DIR_CONTROL_FLAGS) { if (((uint)flags & (uint)DCF) != 0) { bResetMoveToPosition = true; DCFlagKeyPressed = true; agent_control_v3 += dirVectors[i]; //m_log.DebugFormat("[Motion]: {0}, {1}",i, dirVectors[i]); if ((m_movementflag & (uint)DCF) == 0) { if (DCF == Dir_ControlFlags.DIR_CONTROL_FLAG_FORWARD_NUDGE || DCF == Dir_ControlFlags.DIR_CONTROL_FLAG_BACKWARD_NUDGE) { // m_movementflag |= (byte)nudgehack; m_movementflag |= nudgehack; } m_movementflag += (uint)DCF; update_movementflag = true; } } else { if ((m_movementflag & (uint)DCF) != 0 || ((DCF == Dir_ControlFlags.DIR_CONTROL_FLAG_FORWARD_NUDGE || DCF == Dir_ControlFlags.DIR_CONTROL_FLAG_BACKWARD_NUDGE) && ((m_movementflag & nudgehack) == nudgehack)) ) // This or is for Nudge forward { m_movementflag -= ((uint)DCF); update_movementflag = true; /* if ((DCF == Dir_ControlFlags.DIR_CONTROL_FLAG_FORWARD_NUDGE || DCF == Dir_ControlFlags.DIR_CONTROL_FLAG_BACKWARD_NUDGE) && ((m_movementflag & (byte)nudgehack) == nudgehack)) { m_log.Debug("Removed Hack flag"); } */ } else { bAllowUpdateMoveToPosition = true; } } i++; } } //Paupaw:Do Proper PID for Autopilot here if (bResetMoveToPosition) { m_moveToPositionTarget = Vector3.Zero; m_moveToPositionInProgress = false; update_movementflag = true; bAllowUpdateMoveToPosition = false; } if (bAllowUpdateMoveToPosition && (m_moveToPositionInProgress && !m_autopilotMoving)) { //Check the error term of the current position in relation to the target position if (Util.GetFlatDistanceTo(AbsolutePosition, m_moveToPositionTarget) <= 0.5f) { // we are close enough to the target m_moveToPositionTarget = Vector3.Zero; m_moveToPositionInProgress = false; update_movementflag = true; } else { try { // move avatar in 2D at one meter/second towards target, in avatar coordinate frame. // This movement vector gets added to the velocity through AddNewMovement(). // Theoretically we might need a more complex PID approach here if other // unknown forces are acting on the avatar and we need to adaptively respond // to such forces, but the following simple approach seems to works fine. Vector3 LocalVectorToTarget3D= (m_moveToPositionTarget - AbsolutePosition) // vector from cur. pos to target in global coords // * Matrix4.CreateFromQuaternion(Quaternion.Inverse(bodyRotation)); // change to avatar coords * Quaternion.Inverse(bodyRotation); // mult by matix is faster but with creation, use *quarternion // Ignore z component of vector Vector3 LocalVectorToTarget2D; LocalVectorToTarget2D.X = LocalVectorToTarget3D.X; LocalVectorToTarget2D.Y = LocalVectorToTarget3D.Y; LocalVectorToTarget2D.Z = 0f; agent_control_v3 += LocalVectorToTarget2D; // update avatar movement flags. the avatar coordinate system is as follows: // // +X (forward) // // ^ // | // | // | // | // (left) +Y <--------o--------> -Y // avatar // | // | // | // | // v // -X // // based on the above avatar coordinate system, classify the movement into // one of left/right/back/forward. if (LocalVectorToTarget2D.Y > 0)//MoveLeft { m_movementflag += (uint)Dir_ControlFlags.DIR_CONTROL_FLAG_LEFT; //AgentControlFlags AgentControlFlags |= (uint)Dir_ControlFlags.DIR_CONTROL_FLAG_LEFT; update_movementflag = true; } else if (LocalVectorToTarget2D.Y < 0) //MoveRight { m_movementflag += (uint)Dir_ControlFlags.DIR_CONTROL_FLAG_RIGHT; AgentControlFlags |= (uint)Dir_ControlFlags.DIR_CONTROL_FLAG_RIGHT; update_movementflag = true; } if (LocalVectorToTarget2D.X < 0) //MoveBack { m_movementflag += (uint)Dir_ControlFlags.DIR_CONTROL_FLAG_BACK; AgentControlFlags |= (uint)Dir_ControlFlags.DIR_CONTROL_FLAG_BACK; update_movementflag = true; } else if (LocalVectorToTarget2D.X > 0) //Move Forward { m_movementflag += (uint)Dir_ControlFlags.DIR_CONTROL_FLAG_FORWARD; AgentControlFlags |= (uint)Dir_ControlFlags.DIR_CONTROL_FLAG_FORWARD; update_movementflag = true; } } catch (Exception e) { //Avoid system crash, can be slower but... m_log.DebugFormat("Crash! {0}", e.ToString()); } } } } // Cause the avatar to stop flying if it's colliding // with something with the down arrow pressed. // Only do this if we're flying if (m_physicsActor != null && m_physicsActor.Flying && !m_forceFly) { // Landing detection code // Are the landing controls requirements filled? bool controlland = (((flags & AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0) || ((flags & AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG) != 0)); // Are the collision requirements fulfilled? bool colliding = (m_physicsActor.IsColliding == true); if (m_physicsActor.Flying && colliding && controlland) { // nesting this check because LengthSquared() is expensive and we don't // want to do it every step when flying. // then call it in the if... //The == Zero and Z > 0.1 are to stop people from flying and then falling down because the physics engine hasn't calculted the push yet if (Velocity != Vector3.Zero && Math.Abs(Velocity.Z) > 0.05 && (Velocity.LengthSquared() <= LAND_VELOCITYMAG_MAX)) { StopFlying (); SendTerseUpdateToAllClients (); } } } // If the agent update does move the avatar, then calculate the force ready for the velocity update, // which occurs later in the main scene loop if (update_movementflag || (update_rotation && DCFlagKeyPressed)) { // m_log.DebugFormat("{0} {1}", update_movementflag, (update_rotation && DCFlagKeyPressed)); // m_log.DebugFormat( // "In {0} adding velocity to {1} of {2}", m_scene.RegionInfo.RegionName, Name, agent_control_v3); AddNewMovement(agent_control_v3, q); } } //if (update_movementflag && ((flags & AgentManager.ControlFlags.AGENT_CONTROL_SIT_ON_GROUND) == 0) && (m_parentID == UUID.Zero) && !SitGround) // Animator.UpdateMovementAnimations(true); IAgentUpdateMonitor reporter = (IAgentUpdateMonitor)m_scene.RequestModuleInterface<IMonitorModule>().GetMonitor(m_scene.RegionInfo.RegionID.ToString(), MonitorModuleHelper.AgentUpdateCount); if (reporter != null) reporter.AddAgentTime(Util.EnvironmentTickCountSubtract(m_perfMonMS)); }
public void Reset() { lastarg = null; //Reset the killObjectUpdate packet stats //m_killRecord = new HashSet<uint>(); }