Ejemplo n.º 1
0
        private void ProcessPhysicItem
        (
            float dt,
            ref DefStDodgeOnGroundSettings settings,
            ref DefStDodgeInput input,
            ref DefStDodgeOnGroundProcessData process,
            ref StVelocity velocity,
            ref CharacterControllerState state
        )
        {
            /*if (!state.IsGrounded() && math.any(process.Direction != float3.zero) && process.IsDodging == 1)
             * {
             *  var previousVelocity = velocity.Value;
             *  var previousFlatVel  = previousVelocity.ToGrid(1);
             *  var previousSpeed    = Mathf.Max(previousFlatVel.magnitude, settings.MinSpeed) + (process.InertieDelta * dt);
             *
             *  velocity.Value   = math.normalize(process.Direction) * previousSpeed;
             *  velocity.Value.y = previousVelocity.y;
             * }*/

            // TODO: Remove hardcoded character slopelimit (45)

            /*if (MvUtils.OnGround(state, velocity) && Vector3.Angle(state.AngleDir, Vector3.up) < 45 && process.IsDodging == 1)
             * {
             *  process.IsDodging = 0;
             *
             *  var oldY = velocity.Value.y;
             *  var addSpeed = Mathf.Max(velocity.Value.ToGrid(1).magnitude - process.StartAfterDodgeFlatSpeed, 0);
             *  var speed = Mathf.Min(velocity.Value.ToGrid(1).magnitude, process.StartFlatSpeed + addSpeed);
             *
             *  velocity.Value = velocity.Value.ToGrid(1).normalized * speed;
             *
             *  Debug.Log("nice");
             *
             *  velocity.Value.y = oldY;
             * }*/

            process.InertieDelta            -= state.IsGrounded() ? dt * 50f : dt;
            process.CooldownBeforeNextDodge -= dt;
            input.TimeBeforeResetState      -= dt;
        }
Ejemplo n.º 2
0
        private bool ProcessItem
        (
            ref Entity entity,
            ref StVelocity velocity,
            ref DefStRunInput runInput,
            ref DefStDodgeOnGroundSettings setting,
            ref DefStDodgeInput input,
            ref DefStDodgeOnGroundProcessData process,
            ref CharacterControllerState state,
            Transform transform
        )
        {
            var doDodge = input.State != InputState.None && process.CooldownBeforeNextDodge <= 0f && MvUtils.OnGround(state, velocity);

            if (input.TimeBeforeResetState <= 0f)
            {
                input.State = InputState.None;
            }

            // We expect the developpers to check for staminas or things like that for this command.
            EntityManager.SetComponentData(m_CmdDoDodge, new EntityCommandTarget(entity));
            DiffuseCommand(m_CmdDoDodge, m_CmdDoDodgeResult, doDodge, CmdState.Begin);

            doDodge = GetCmdResult(m_CmdDoDodgeResult);
            if (!doDodge)
            {
                return(false);
            }

            process.StartFlatSpeed = velocity.Value.ToGrid(1).magnitude;

            var direction = SrtComputeDirection(transform.forward.normalized, transform.rotation, runInput.Direction);

            velocity.Value.y = 0f;

            var addVelocity = SrtDodge(velocity.Value, direction, setting.AdditiveSpeed, setting.MinSpeed, setting.MaxSpeed);
            var momentum    = transform.GetComponent <CharacterControllerMotor>().Momentum;

            if (Vector3.Dot(velocity.Value.normalized, math.normalizesafe(addVelocity)) >= 0.9f)
            {
                addVelocity = (momentum.normalized + ((Vector3)addVelocity).normalized).normalized * math.length(addVelocity);
                Debug.Log(addVelocity);
            }

            velocity.Value  = addVelocity;
            velocity.Value += Vector3.up * setting.VerticalPower;

            input.TimeBeforeResetState = -1f;
            input.State = InputState.None;

            process.CooldownBeforeNextDodge = 0.5f;
            process.InertieDelta            = 0.1f;
            process.Direction = direction;
            process.IsDodging = 1;
            process.StartAfterDodgeFlatSpeed = velocity.Value.ToGrid(1).magnitude;

            // We except developpers to just clean the pre-command phase, and not applying things like reducing stamina...
            DiffuseCommand(m_CmdDoDodge, m_CmdDoDodgeResult, true, CmdState.End);

            // Send dodge message to clients
            BroadcastNewEntity(PostUpdateCommands, true);
            PostUpdateCommands.AddComponent(new DefStDodgeEvent(Time.time, Time.frameCount, entity));

            MvDelegateEvents.InvokeCharacterDodge(entity);

            return(true);
        }
        private bool ProcessItem
        (
            ref Entity entity,
            ref StVelocity velocity,
            ref DefStDodgeOnGroundSettings setting,
            ref DefStRunInput runInput,
            ref DefStDodgeInput input,
            ref DefStWallDodgeProcessData process,
            ref DefStDodgeOnGroundProcessData groundProcess,
            CharacterControllerMotor motor
        )
        {
            var action = input.State != InputState.None && !MvUtils.OnGround(motor, velocity) && Time.time > process.TimeBeforeNextWD;

            DiffuseCommand(m_CmdDoDodge, m_CmdDoDodgeResult, action, CmdState.Begin);

            if (!m_CmdDoDodgeResult.GetComponentData <EntityCommandResult>().AsBool())
            {
                DiffuseCommand(m_CmdDoDodge, m_CmdDoDodgeResult, action, CmdState.End);

                return(false);
            }

            var originalVelocity = velocity.Value;
            var fwd       = motor.transform.forward;
            var pos       = motor.transform.position + new Vector3(0, motor.CharacterController.stepOffset + 0.1f);
            var rot       = motor.transform.rotation;
            var rd        = motor.CharacterController.radius + 0.075f;
            var sw        = motor.CharacterController.skinWidth + 0.025f;
            var height    = motor.CharacterController.height - motor.CharacterController.stepOffset;
            var subheight = (height * 0.75f) - 0.005f;

            CPhysicSettings.Active.SetGlobalCollision(motor.gameObject, false);

            var direction = (Vector3)SrtComputeDirection(fwd, rot, runInput.Direction);

            direction = (velocity.Value.ToGrid(1).normalized + direction * 2).normalized;
            var rayTrace = UtilityWallRayTrace.RayTrace(ref direction, ref pos, ref rd, ref sw, ref height, ref subheight, motor.CharacterController);

            CPhysicSettings.Active.SetGlobalCollision(motor.gameObject, true);

            var success = rayTrace.normal != Vector3.zero && Mathf.Abs(rayTrace.normal.y) < 0.2f;

            if (success)
            {
                rayTrace.normal = rayTrace.normal.ToGrid(1).normalized;

                var reflected  = (Vector3.Reflect(direction, rayTrace.normal) + rayTrace.normal).normalized;
                var oldY       = velocity.Value.y;
                var dirInertie = (reflected * (velocity.Value.magnitude + 1)) + rayTrace.normal * 3.5f;
                dirInertie = RaycastUtilities.SlideVelocityNoYChange(velocity.Value, rayTrace.normal) + rayTrace.normal * 10;

                var minSpeed = Mathf.Max(velocity.Value.ToGrid(1).magnitude + setting.AdditiveSpeed, setting.MinSpeed);

                velocity.Value = dirInertie.ToGrid(1).normalized *(minSpeed);

                velocity.Value.y = Mathf.Max(oldY + 2, 0);

                process.TimeBeforeNextWD = Time.time + DefaultCooldown;

                input.TimeBeforeResetState = -1f;
                input.State = InputState.None;

                groundProcess.CooldownBeforeNextDodge = 0.25f;
                //groundProcess.InertieDelta            = 0.5f;
                groundProcess.Direction = dirInertie.normalized;

                BroadcastNewEntity(PostUpdateCommands, true);
                PostUpdateCommands.AddComponent(new DefStWallJumpEvent(Time.time, Time.frameCount, entity, originalVelocity, rayTrace.normal));
            }

            DiffuseCommand(m_CmdDoDodge, m_CmdDoDodgeResult, action, CmdState.End);

            return(success);
        }