Пример #1
0
        public void Simulate(CookingPlayer pawn)
        {
            switch (CarriedProp.IsValid)
            {
            case true when pawn.Input.Pressed(InputButton.Use) || pawn.LifeState == LifeState.Dead:
                Drop();

                return;

            case true when pawn.Input.Pressed(InputButton.Attack1):
                DoThrow(pawn);

                return;
            }

            if (LastPickup.Relative >= 1 && !CarriedProp.IsValid && pawn.Input.Pressed(InputButton.Use))
            {
                var traceResult = Trace.Ray(pawn.EyePos, pawn.EyePos + pawn.EyeRot.Forward * 85)
                                  .Radius(4)
                                  .Ignore(pawn)
                                  .Run();

                DebugOverlay.Text(traceResult.EndPos, $"Hit: {traceResult.Hit}, Entity: {(traceResult.Hit ? traceResult.Entity : "N/A")}", 5f);

                if (traceResult.Hit && traceResult.Entity is IPickupable entity && CanPickup(entity))
                {
                    DebugOverlay.Text(traceResult.EndPos - Vector3.Down * 5, "Picking up!", 5f);
                    DoPickup(entity, pawn);
                }
            }

            //Log.Info( $"Testing: {CarriedProp.IsSet}" );

            PhysicsManipulate(pawn);
        }
Пример #2
0
    public override void OnPlayerControlTick(Player owner)
    {
        base.OnPlayerControlTick(owner);

        //DebugTrace( owner );
        return;

        if (!NavMesh.IsLoaded)
        {
            return;
        }

        timeSinceLast = 0;

        var forward = owner.EyeRot.Forward * 2000;


        var tr = Trace.Ray(owner.EyePos, owner.EyePos + forward)
                 .Ignore(owner)
                 .Run();

        var closestPoint = NavMesh.GetClosestPoint(tr.EndPos);

        DebugOverlay.Line(tr.EndPos, closestPoint, 0.1f);

        DebugOverlay.Axis(closestPoint, Rotation.LookAt(tr.Normal), 2.0f, Time.Delta * 2);
        DebugOverlay.Text(closestPoint, $"CLOSEST Walkable POINT", Time.Delta * 2);

        NavMesh.BuildPath(Owner.WorldPos, closestPoint);
    }
        protected void ReflectBall(CollisionEventData eventData, float multiplier)
        {
            var reflect = Vector3.Reflect(eventData.PreVelocity.Normal, eventData.Normal.Normal).Normal;

            var normalDot = eventData.PreVelocity.Normal.Dot(eventData.Normal);

            // Don't do any reflection if we hit it at such an angle
            if (normalDot <= 0.10)
            {
                return;
            }

            // Collision sound happens at this point, not entity
            var sound = Sound.FromWorld(BounceSound.Name, eventData.Pos);

            sound.SetVolume(0.2f + Math.Clamp(eventData.Speed / 1250.0f, 0.0f, 0.8f));
            sound.SetPitch(0.5f + Math.Clamp(eventData.Speed / 1250.0f, 0.0f, 0.5f));

            var particle = Particles.Create("particles/ball_hit.vpcf", eventData.Pos);

            particle.SetPos(0, eventData.Pos);
            particle.Destroy(false);

            var newSpeed = Math.Max(eventData.PreVelocity.Length, eventData.Speed);

            newSpeed *= multiplier;

            // Adjust the speed depending on the hit normal, slight hit = more speed
            newSpeed *= (1 - normalDot / 2);

            var newVelocity = reflect * newSpeed;

            // TODO: not a fan of this, should determine by the dot normal
            newVelocity.z = 0;

            PhysicsBody.Velocity        = newVelocity;
            PhysicsBody.AngularVelocity = Vector3.Zero;

            if (Debug)
            {
                DebugOverlay.Text(eventData.Pos, $"V {eventData.PreVelocity.Length} -> {newSpeed}", 5f);
                DebugOverlay.Text(eventData.Pos + Vector3.Up * 8, $"N. {normalDot}", 5f);
                DebugOverlay.Line(eventData.Pos, eventData.Pos - (eventData.PreVelocity.Normal * 64.0f), 5f);
                DebugOverlay.Line(eventData.Pos, eventData.Pos + (reflect * 64.0f), 5f);
            }
        }
Пример #4
0
    public void OnFrame()
    {
        var pos     = WorldPos;
        var right   = WorldRot.Right * 4;
        var forward = WorldRot.Forward * 4;
        var up      = WorldRot.Up * 50;
        var offset  = Time.Now * 2.0f;
        var offsetz = Time.Now * 0.1f;

        var mode = (int)((Time.Now * 0.3f) % 5);

        switch (mode)
        {
        case 0:
        {
            DebugOverlay.Text(pos, "Perlin");
            break;
        }

        case 1:
        {
            DebugOverlay.Text(pos, "SparseConvolution");
            break;
        }

        case 2:
        {
            DebugOverlay.Text(pos, "SparseConvolutionNormalized");
            break;
        }

        case 3:
        {
            DebugOverlay.Text(pos, "Turbulence");
            break;
        }

        case 4:
        {
            DebugOverlay.Text(pos, "Fractal");
            break;
        }
        }


        var size = 100;

        pos -= right * size * 0.5f;
        pos -= forward * size * 0.5f;

        for (float x = 0; x < size; x++)
        {
            for (float y = 0; y < size; y++)
            {
                float val = 0;

                switch (mode)
                {
                case 0:
                {
                    val = Noise.Perlin(x * 0.1f + offset, y * 0.1f, offsetz) * 0.5f;
                    break;
                }

                case 1:
                {
                    val = Noise.SparseConvolution(x * 0.1f + offset, y * 0.1f, offsetz) * 0.5f;
                    break;
                }

                case 2:
                {
                    val = Noise.SparseConvolutionNormalized(x * 0.1f + offset, y * 0.1f, offsetz) * 0.5f;
                    break;
                }

                case 3:
                {
                    val = Noise.Turbulence(2, x * 0.1f + offset, y * 0.1f, offsetz) * 0.5f;
                    break;
                }

                case 4:
                {
                    val = Noise.Fractal(2, x * 0.1f + offset, y * 0.1f, offsetz) * 0.5f;
                    break;
                }
                }

                var start = pos + x * right + y * forward;
                DebugOverlay.Line(start, start + up * val, Color.Lerp(Color.Red, Color.Green, (val + 1.0f) / 2.0f));
            }
        }
    }
Пример #5
0
        private void StepMove()
        {
            var vecPos = Position;
            var vecVel = Velocity;

            //
            // First try walking straight to where they want to go.
            //
            TryPlayerMove();

            //
            // mv now contains where they ended up if they tried to walk straight there.
            // Save those results for use later.
            //
            var vecDownPos = Position;
            var vecDownVel = Velocity;

            //
            // Reset original values to try some other things.
            //
            Position = vecPos;
            Velocity = vecVel;

            // Only step up as high as we have headroom to do so.
            var trace = TraceBBox(Position, Position + Vector3.Up * (StepSize + DistEpsilon));

            if (!trace.StartedSolid)
            {
                Position = trace.EndPos;
            }
            TryPlayerMove();


            trace = TraceBBox(Position, Position + Vector3.Down * (StepSize + DistEpsilon * 2));
            if (trace.Normal.z < GroundNormalZ)
            {
                if (Debug)
                {
                    DebugOverlay.Text(vecDownPos, "step down", 2.0f);
                }

                Position = vecDownPos;
                Velocity = vecDownVel.WithZ(0);
                // out step height
                return;
            }

            if (!trace.StartedSolid)
            {
                Position = trace.EndPos;
            }

            var vecUpPos = Position;

            float flDownDist = (vecDownPos.x - vecPos.x) * (vecDownPos.x - vecPos.x) + (vecDownPos.y - vecPos.y) * (vecDownPos.y - vecPos.y);
            float flUpDist   = (vecUpPos.x - vecPos.x) * (vecUpPos.x - vecPos.x) + (vecUpPos.y - vecPos.y) * (vecUpPos.y - vecPos.y);

            if (flDownDist > flUpDist)
            {
                Position = vecDownPos;
                Velocity = vecDownVel;
            }
            else
            {
                // copy z value from slide move
                Velocity = Velocity.WithZ(vecDownVel.z);
            }

            // out step height
        }