public void Initialize() { if (Behaviour.RefNumber == 99) //flag waving guy { SetAction(Behaviour.Actions[7], true); } else { SetAction(Behaviour.Standing, true); } Position = Instructions[InitialInstruction].Position; _currentInstruction = InitialInstruction; if (Instructions[_currentInstruction].AutoY) { StillDesign.PhysX.RaycastHit hit = PhysX.Instance.Scene.RaycastClosestShape(new StillDesign.PhysX.Ray(Position + new Vector3(0, 10, 0), Vector3.Down), StillDesign.PhysX.ShapesType.Static); Position = hit.WorldImpact; } ActorDescription actorDesc = new ActorDescription(); actorDesc.BodyDescription = new BodyDescription(1); actorDesc.BodyDescription.MassSpaceInertia = new Vector3(1, 1, 1); actorDesc.BodyDescription.BodyFlags |= BodyFlag.Kinematic; BoxShapeDescription box = new BoxShapeDescription(1.6f, 2.5f, 1.6f); box.Flags = ShapeFlag.TriggerOnEnter; box.LocalPosition = new Vector3(0, 1, 0); actorDesc.Shapes.Add(box); _physXActor = PhysX.Instance.Scene.CreateActor(actorDesc); _physXActor.GlobalPosition = Position; _physXActor.UserData = this; }
public void Update() { if (_stopUpdating) { return; } float angle = Helpers.GetSignedAngleBetweenVectors(Engine.Camera.Orientation, _direction, false); angle = MathHelper.ToDegrees(angle); if (angle < 0) { angle += 360; } if (float.IsNaN(angle)) { angle = 0; } int seq = 0; foreach (PedestrianActionSequenceMap seqMap in _currentAction.Sequences) { if (angle < seqMap.MaxBearing) { seq = seqMap.SequenceIndex; SetSequence(Behaviour.Sequences[seqMap.SequenceIndex]); break; } } _frameTime += Engine.ElapsedSeconds; if (_frameTime > _frameRate) { _frameIndex++; _frameTime = 0; if (!_inLoopingFrames) { if (_frameIndex >= _currentSequence.InitialFrames.Count) { if (_currentSequence.LoopingFrames.Count > 0) { _inLoopingFrames = true; _frameIndex = 0; } else { _frameIndex--; _frameTime = -1; //stop animating } } } else { if (_frameIndex >= _currentSequence.LoopingFrames.Count) { _frameIndex = 0; _frameTime = 0; UpdateFrameRate(); } } } if (IsHit) { Position += _direction * _hitSpeed * Engine.ElapsedSeconds; if (_hitSpinSpeed != 0) { Position.Y += _hitUpSpeed * Engine.ElapsedSeconds; _hitUpSpeed -= Engine.ElapsedSeconds * 45; _hitSpeed -= Engine.ElapsedSeconds * 10; if (Position.Y <= _groundHeight) { Position.Y = _groundHeight; _hitCurrentSpin = _hitSpinSpeed = _hitUpSpeed = 0; _hitSpeed = 0; _stopUpdating = true; } _hitCurrentSpin += _hitSpinSpeed * Engine.ElapsedSeconds; } else { if (_frameTime == -1) { _stopUpdating = true; //if were not spining the ped, stop them as soon as anim is finished } } if (float.IsNaN(Position.X)) { } _physXActor.GlobalPosition = Position; } else if (_isRunning) { Vector3 target = Instructions[_currentInstruction].Position; _direction = target - Position; if (float.IsNaN(_direction.X)) { } if (_direction != Vector3.Zero) { _direction.Normalize(); Position += _direction * RunningSpeed * Engine.ElapsedSeconds; if (float.IsNaN(_direction.X)) { } if (Instructions[_currentInstruction].AutoY) { StillDesign.PhysX.RaycastHit hit = PhysX.Instance.Scene.RaycastClosestShape(new StillDesign.PhysX.Ray(Position + new Vector3(0, 10, 0), Vector3.Down), StillDesign.PhysX.ShapesType.Static); target.Y = hit.WorldImpact.Y; float fallDist = Position.Y - hit.WorldImpact.Y; if (fallDist > 10) { SetAction(Behaviour.NonFatalFalling, true); if (!_isFalling) { SoundCache.Play(Behaviour.FallingNoise, Race.Current.PlayerVehicle, true); } _isFalling = true; } if (fallDist > 0.5f) { Position.Y -= Engine.ElapsedSeconds * 20; } else { Position.Y = hit.WorldImpact.Y; if (_isFalling) { OnHit(Race.Current.PlayerVehicle); return; } } } _physXActor.GlobalPosition = Position; } if (Vector3.Distance(Position, target) < 0.5f) { if (Instructions[_currentInstruction].Reverse) { _instructionDirection *= -1; } _currentInstruction += _instructionDirection; if (_currentInstruction == -1) { _currentInstruction = 0; _instructionDirection *= -1; } } } }