public override void RemoveAvatar(PhysicsCharacter actor) { BasicCharacterActor act = (BasicCharacterActor)actor; if (_actors.Contains(act)) { _actors.Remove(act); } }
private void ResetAvatar(PhysicsCharacter physicsObject, PhysicsState physicsState, float direction) { physicsObject.Position = physicsState.Position; physicsObject.ForceSetPosition(physicsState.Position); physicsObject.Orientation = physicsState.Rotation; physicsObject.RotationalVelocity = physicsState.AngularVelocity * direction; physicsObject.Velocity = physicsState.LinearVelocity * direction; physicsObject.ForceSetVelocity(physicsState.LinearVelocity * direction); physicsObject.RequestPhysicsterseUpdate(); }
public void AddAvatar(PhysicsCharacter prm) { PhysicsState state = new PhysicsState { Position = prm.Position, AngularVelocity = prm.RotationalVelocity, LinearVelocity = prm.Velocity, Rotation = prm.Orientation }; m_activePrims[prm.UUID] = state; }
public override void RemoveAvatar(PhysicsCharacter actor) { // MainConsole.Instance.DebugFormat("{0}: RemoveAvatar", LogHeader); if (actor is BSCharacter) { ((BSCharacter)actor).Destroy(); } try { lock (m_avatars) m_avatars.Remove(actor.LocalID); } catch (Exception e) { MainConsole.Instance.WarnFormat("{0}: Attempt to remove avatar that is not in physics scene: {1}", LogHeader, e); } }
public override void RemoveAvatar(PhysicsCharacter actor) { lock (BulletLock) { BulletDotNETCharacter chr = (BulletDotNETCharacter)actor; if (!Locked) { chr.Remove(); AddPhysicsActorTaint(chr); //chr = null; } else { RemoveQueue.Add(actor); } m_charactersLocalID.Remove(chr.m_localID); } }
/// <summary> /// This method determines the proper movement related animation /// </summary> public string GetMovementAnimation() { const float STANDUP_TIME = 2f; const float BRUSH_TIME = 3.5f; const float FALL_AFTER_MOVE_TIME = 0.75f; const float SOFTLAND_FORCE = 80; #region Inputs if (m_scenePresence.SitGround) { return("SIT_GROUND_CONSTRAINED"); } AgentManager.ControlFlags controlFlags = (AgentManager.ControlFlags)m_scenePresence.AgentControlFlags; PhysicsCharacter actor = m_scenePresence.PhysicsActor; // Create forward and left vectors from the current avatar rotation Vector3 fwd = Vector3.UnitX * m_scenePresence.Rotation; Vector3 left = Vector3.UnitY * m_scenePresence.Rotation; // Check control flags bool heldForward = (((controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_AT_POS) == AgentManager.ControlFlags.AGENT_CONTROL_AT_POS) || ((controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_POS) == AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_POS)); bool yawPos = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_YAW_POS) == AgentManager.ControlFlags.AGENT_CONTROL_YAW_POS; bool yawNeg = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_YAW_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_YAW_NEG; bool heldBack = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG; bool heldLeft = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS) == AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS; bool heldRight = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG; bool heldTurnLeft = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_TURN_LEFT) == AgentManager.ControlFlags.AGENT_CONTROL_TURN_LEFT; bool heldTurnRight = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_TURN_RIGHT) == AgentManager.ControlFlags.AGENT_CONTROL_TURN_RIGHT; bool heldUp = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) == AgentManager.ControlFlags.AGENT_CONTROL_UP_POS; bool heldDown = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG; //bool flying = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_FLY) == AgentManager.ControlFlags.AGENT_CONTROL_FLY; //bool mouselook = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_MOUSELOOK) == AgentManager.ControlFlags.AGENT_CONTROL_MOUSELOOK; // Direction in which the avatar is trying to move Vector3 move = Vector3.Zero; if (heldForward) { move.X += fwd.X; move.Y += fwd.Y; } if (heldBack) { move.X -= fwd.X; move.Y -= fwd.Y; } if (heldLeft) { move.X += left.X; move.Y += left.Y; } if (heldRight) { move.X -= left.X; move.Y -= left.Y; } if (heldUp) { move.Z += 1; } if (heldDown) { move.Z -= 1; } float fallVelocity = (actor != null) ? actor.Velocity.Z : 0.0f; if (heldTurnLeft && yawPos && !heldForward && !heldBack && actor != null && !actor.IsJumping && !actor.Flying && move.Z == 0 && fallVelocity == 0.0f && !heldUp && !heldDown && move.CompareTo(Vector3.Zero) == 0) { return("TURNLEFT"); } if (heldTurnRight && yawNeg && !heldForward && !heldBack && actor != null && !actor.IsJumping && !actor.Flying && move.Z == 0 && fallVelocity == 0.0f && !heldUp && !heldDown && move.CompareTo(Vector3.Zero) == 0) { return("TURNRIGHT"); } // Is the avatar trying to move? // bool moving = (move != Vector3.Zero); #endregion Inputs #region Standup float standupElapsed = (Util.EnvironmentTickCount() - m_animTickStandup) / 1000f; if (m_scenePresence.PhysicsActor != null && standupElapsed < STANDUP_TIME && m_useSplatAnimation) { // Falling long enough to trigger the animation m_scenePresence.FallenStandUp = true; m_scenePresence.PhysicsActor.Velocity = Vector3.Zero; return("STANDUP"); } else if (standupElapsed < BRUSH_TIME && m_useSplatAnimation) { m_scenePresence.FallenStandUp = true; return("BRUSH"); } else if (m_animTickStandup != 0 || m_scenePresence.FallenStandUp) { m_scenePresence.FallenStandUp = false; m_animTickStandup = 0; } #endregion Standup #region Flying // if (actor != null && actor.Flying) if (actor != null && (m_scenePresence.AgentControlFlags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_FLY) == (uint)AgentManager.ControlFlags.AGENT_CONTROL_FLY || m_scenePresence.ForceFly) { m_animTickFall = 0; if (move.X != 0f || move.Y != 0f) { if (move.Z == 0) { if (m_scenePresence.Scene.PhysicsScene.UseUnderWaterPhysics && actor.Position.Z < m_scenePresence.Scene.RegionInfo.RegionSettings.WaterHeight) { return("SWIM_FORWARD"); } else { if (m_timesBeforeSlowFlyIsOff < SLOWFLY_DELAY) { m_timesBeforeSlowFlyIsOff++; return("FLYSLOW"); } else { return("FLY"); } } } else if (move.Z > 0) { if (m_scenePresence.Scene.PhysicsScene.UseUnderWaterPhysics && actor.Position.Z < m_scenePresence.Scene.RegionInfo.RegionSettings.WaterHeight) { return("SWIM_UP"); } else { return("FLYSLOW"); } } if (m_scenePresence.Scene.PhysicsScene.UseUnderWaterPhysics && actor.Position.Z < m_scenePresence.Scene.RegionInfo.RegionSettings.WaterHeight) { return("SWIM_DOWN"); } else { return("FLY"); } } else if (move.Z > 0f) { //This is for the slow fly timer m_timesBeforeSlowFlyIsOff = 0; if (m_scenePresence.Scene.PhysicsScene.UseUnderWaterPhysics && actor.Position.Z < m_scenePresence.Scene.RegionInfo.RegionSettings.WaterHeight) { return("SWIM_UP"); } else { return("HOVER_UP"); } } else if (move.Z < 0f) { wasLastFlying = true; //This is for the slow fly timer m_timesBeforeSlowFlyIsOff = 0; if (m_scenePresence.Scene.PhysicsScene.UseUnderWaterPhysics && actor.Position.Z < m_scenePresence.Scene.RegionInfo.RegionSettings.WaterHeight) { return("SWIM_DOWN"); } else { ITerrainChannel channel = m_scenePresence.Scene.RequestModuleInterface <ITerrainChannel>(); if (channel != null) { float groundHeight = channel.GetNormalizedGroundHeight((int)m_scenePresence.AbsolutePosition.X, (int)m_scenePresence.AbsolutePosition.Y); if (actor != null && (m_scenePresence.AbsolutePosition.Z - groundHeight) < 2) { return("LAND"); } else { return("HOVER_DOWN"); } } else { return("HOVER_DOWN"); } } } else { //This is for the slow fly timer m_timesBeforeSlowFlyIsOff = 0; if (m_scenePresence.Scene.PhysicsScene.UseUnderWaterPhysics && actor.Position.Z < m_scenePresence.Scene.RegionInfo.RegionSettings.WaterHeight) { return("SWIM_HOVER"); } else { return("HOVER"); } } } m_timesBeforeSlowFlyIsOff = 0; #endregion Flying #region Jumping if (actor != null && actor.IsJumping) { return("JUMP"); } if (actor != null && actor.IsPreJumping) { return("PREJUMP"); } #endregion #region Falling/Floating/Landing float walkElapsed = (Util.EnvironmentTickCount() - m_animTickWalk) / 1000f; if (actor != null && actor.IsPhysical && !actor.IsJumping && (!actor.IsColliding) && actor.Velocity.Z < -2 && walkElapsed > FALL_AFTER_MOVE_TIME) { //Always return falldown immediately as there shouldn't be a waiting period if (m_animTickFall == 0) { m_animTickFall = Util.EnvironmentTickCount(); } return("FALLDOWN"); } #endregion Falling/Floating/Landing #region Ground Movement if (m_movementAnimation == "FALLDOWN") { float fallElapsed = (Util.EnvironmentTickCount() - m_animTickFall) / 1000f; if (fallElapsed < 0.75) { m_animTickFall = Util.EnvironmentTickCount(); return("SOFT_LAND"); } else if (fallElapsed < 1.1 || (Math.Abs(actor.Velocity.X) > 1 && Math.Abs(actor.Velocity.Y) > 1 && actor.Velocity.Z < 3)) { m_animTickFall = Util.EnvironmentTickCount(); return("LAND"); } else { if (m_useSplatAnimation) { m_animTickStandup = Util.EnvironmentTickCount(); return("STANDUP"); } else { return("LAND"); } } } else if (m_movementAnimation == "LAND") { if (actor != null && actor.Velocity.Z != 0) { if (actor.Velocity.Z < SOFTLAND_FORCE) { return("LAND"); } return("SOFT_LAND"); } //return "LAND"; } m_animTickFall = 0; if (move.Z <= 0f) { if (actor != null && (move.X != 0f || move.Y != 0f || actor.Velocity.X != 0 && actor.Velocity.Y != 0)) { wasLastFlying = false; if (actor.IsColliding) { m_animTickWalk = Util.EnvironmentTickCount(); } // Walking / crouchwalking / running if (move.Z < 0f) { return("CROUCHWALK"); } else if (m_scenePresence.SetAlwaysRun) { return("RUN"); } else { return("WALK"); } } else { // Not walking if (move.Z < 0f && !wasLastFlying) { return("CROUCH"); } else { return("STAND"); } } } #endregion Ground Movement return(m_movementAnimation); }
/// <summary> /// Removes physics plugin scene representation of this agent if it exists. /// </summary> public virtual void RemoveFromPhysicalScene () { try { if (PhysicsActor != null) { if (OnRemovePhysics != null) OnRemovePhysics(); if (m_physicsActor != null) m_scene.PhysicsScene.RemoveAvatar(m_physicsActor); if (m_physicsActor != null) m_physicsActor.OnCollisionUpdate -= PhysicsCollisionUpdate; if (m_physicsActor != null) m_physicsActor.OnRequestTerseUpdate -= SendPhysicsTerseUpdateToAllClients; if (m_physicsActor != null) m_physicsActor.OnSignificantMovement -= CheckForSignificantMovement; if (m_physicsActor != null) m_physicsActor.OnPositionAndVelocityUpdate -= PhysicsUpdatePosAndVelocity; if (m_physicsActor != null) m_physicsActor.OnCheckForRegionCrossing -= CheckForBorderCrossing; if (m_physicsActor != null) m_physicsActor.OnOutOfBounds -= OutOfBoundsCall; if (m_physicsActor != null) m_scene.PhysicsScene.RemoveAvatar(PhysicsActor); if (m_physicsActor != null) m_physicsActor.UnSubscribeEvents(); m_physicsActor = null; } } catch { } }
/// <summary> /// Adds a physical representation of the avatar to the Physics plugin /// </summary> public virtual void AddToPhysicalScene (bool isFlying, bool AddAvHeightToPosition) { //Make sure we arn't already doing this if (m_creatingPhysicalRepresentation) return; //Set this so we don't do it multiple times m_creatingPhysicalRepresentation = true; IAvatarAppearanceModule appearance = RequestModuleInterface<IAvatarAppearanceModule> (); if (appearance != null) { if (appearance.Appearance.AvatarHeight == 0) appearance.Appearance.SetHeight (); if (appearance.Appearance.AvatarHeight != 0) m_avHeight = appearance.Appearance.AvatarHeight; } PhysicsScene scene = m_scene.PhysicsScene; Vector3 pVec = AbsolutePosition; if(AddAvHeightToPosition) //This is here so that after teleports, you arrive just slightly higher so that you don't fall through the ground/objects pVec.Z += m_avHeight; m_physicsActor = scene.AddAvatar(Name, pVec, Rotation, new Vector3 (0f, 0f, m_avHeight), isFlying, LocalId, UUID); scene.AddPhysicsActorTaint(m_physicsActor); m_physicsActor.OnRequestTerseUpdate += SendPhysicsTerseUpdateToAllClients; m_physicsActor.OnSignificantMovement += CheckForSignificantMovement; m_physicsActor.OnCollisionUpdate += PhysicsCollisionUpdate; m_physicsActor.OnPositionAndVelocityUpdate += PhysicsUpdatePosAndVelocity; m_physicsActor.OnCheckForRegionCrossing += CheckForBorderCrossing; m_physicsActor.OnOutOfBounds += OutOfBoundsCall; // Called for PhysicsActors when there's something wrong m_physicsActor.SubscribeEvents(500); m_physicsActor.Orientation = Rotation; //Tell any events about it if (OnAddPhysics != null) OnAddPhysics(); //All done, reset this m_creatingPhysicalRepresentation = false; }
public abstract void RemoveAvatar(PhysicsCharacter actor);
public override void RemoveAvatar(PhysicsCharacter actor) { }
public void getPhysical(PhysicsWorld physics_world) { _physics_character = new PhysicsCharacter(physics_world, EngineHelper.otk2bullet(-_character.spatial.position), 2.0f); _previous_position = _character.spatial.position; _physical = false; }