protected void UpdateOrientationAttenuation(WeaponAttackProxy attackProxy, WeaponSideCmd cmd)
        {
            var orientation = attackProxy.Orientation;
            var punchYaw    = orientation.AccPunchYaw;
            var punchPitch  = orientation.AccPunchPitch;

            var frameSec = cmd.UserCmd.FrameInterval / 1000f;
            //获取向量长度
            var puntchLength = Mathf.Sqrt(punchYaw * punchYaw + punchPitch * punchPitch);

            if (puntchLength > 0)
            {
                punchYaw   = punchYaw / puntchLength;
                punchPitch = punchPitch / puntchLength;

                puntchLength = UpdateLen(attackProxy, puntchLength, frameSec);
                //UpdateLen: AccPunchYaw  =>AccPunchYaw
                orientation.AccPunchYaw   = punchYaw * puntchLength;
                orientation.AccPunchPitch = punchPitch * puntchLength;

                var factor = GePuntchFallbackFactor(attackProxy.Owner);
                //GePuntchFallbackFactor : AccPunchYaw => AccPunchPitch
                orientation.AccPunchYawValue   = orientation.AccPunchYaw * factor;
                orientation.AccPunchPitchValue = orientation.AccPunchPitch * factor;
            }
        }
 private void CallOnIdle(WeaponAttackProxy attackProxy, WeaponSideCmd cmd)
 {
     foreach (var fireIdle in _idles)
     {
         fireIdle.OnIdle(attackProxy, cmd);
     }
 }
 private void CallAfterFires(WeaponAttackProxy attackProxy, WeaponSideCmd cmd)
 {
     foreach (var afterfire in _afterFireProcessors)
     {
         afterfire.OnAfterFire(attackProxy, cmd);
     }
 }
 private void CallBeforeFires(WeaponAttackProxy attackProxy, WeaponSideCmd cmd)
 {
     foreach (var beforeFire in _beforeFireProcessors)
     {
         beforeFire.OnBeforeFire(attackProxy, cmd);
     }
 }
 private void CallOnFrame(WeaponAttackProxy attackProxy, WeaponSideCmd cmd)
 {
     foreach (var frame in _frames)
     {
         frame.OnFrame(attackProxy, cmd);
     }
 }
Exemplo n.º 6
0
        public void OnAfterFire(WeaponAttackProxy attackProxy, WeaponSideCmd cmd)
        {
            if (attackProxy.BasicComponent.RealFireModel != (int)EFireMode.Burst)
            {
                return;
            }

            var runTimeComponent = attackProxy.RuntimeComponent;

            runTimeComponent.NeedAutoBurstShoot = false;
            var config = attackProxy.WeaponConfigAssy.S_DefaultFireModeLogicCfg;

            runTimeComponent.BurstShootCount += 1;
            float intervalFactor = 1 - attackProxy.GetAttachedAttributeByType(WeaponAttributeType.AttackInterval) / 100;

            if (runTimeComponent.BurstShootCount < config.BurstCount)
            {
                runTimeComponent.NextAttackTimestamp = cmd.UserCmd.RenderTime + Mathf.CeilToInt(config.BurstAttackInnerInterval * intervalFactor);
                runTimeComponent.NeedAutoBurstShoot  = true;
                runTimeComponent.IsPrevCmdFire       = true;
            }
            else
            {
                runTimeComponent.NextAttackTimestamp = cmd.UserCmd.RenderTime + Mathf.CeilToInt(config.BurstAttackInterval * intervalFactor);
                runTimeComponent.BurstShootCount     = 0;
            }

            if (attackProxy.BasicComponent.Bullet == 0)
            {
                runTimeComponent.BurstShootCount    = 0;
                runTimeComponent.NeedAutoBurstShoot = false;
            }
        }
        protected override void Update(WeaponAttackProxy attackProxy, WeaponSideCmd cmd)
        {
            var   config            = attackProxy.WeaponConfigAssy.S_PistolSpreadLogicCfg;
            float spreadScaleFactor = FireSpreadProvider.GetSpreadScaleFactor(config, attackProxy);

            FireSpreadFormula.ApplyPistolFinalSpread(spreadScaleFactor, config.SpreadScale, attackProxy.RuntimeComponent);
        }
Exemplo n.º 8
0
        protected override void DoIdle(WeaponAttackProxy attackProxy, WeaponSideCmd cmd)
        {
            //null->Fire->SpecialFireHold(1)->SpecialFireEnd->null
            if (cmd.FiltedInput(EPlayerInput.IsPullboltInterrupt))
            {//当前pullBolting被限制,不执行
                attackProxy.InterruptPullBolt();
                return;
            }
            var state = attackProxy.CharacterState.GetActionState();

            //正常开火拉栓
            if (state == ActionInConfig.SpecialFireHold)
            {
                logger.Info("Normal pullbolt");
                attackProxy.AudioController.PlayPullBoltAudio(attackProxy.WeaponConfigAssy.S_Id);
                attackProxy.CharacterState.SpecialFireEnd();
                attackProxy.RuntimeComponent.FinishPullBolt();
                return;
            }
            if (state == ActionInConfig.Null && attackProxy.BasicComponent.Bullet > 0)
            {
                //只拉栓逻辑
                if (attackProxy.RuntimeComponent.IsPullboltInterrupt)
                {
                    logger.Info("Interrupt pullbolt");
                    attackProxy.RuntimeComponent.FinishPullBolt();
                    attackProxy.AudioController.PlayPullBoltAudio(attackProxy.WeaponConfigAssy.S_Id);
                    attackProxy.CharacterState.SpecialFireEnd();
                }
                // var needActionDeal = SingletonManager.Get<WeaponResourceConfigManager>()
                //                 .NeedActionDeal(attackProxy.WeaponConfigAssy.S_Id, ActionDealEnum.Reload);
            }
        }
Exemplo n.º 9
0
        public virtual bool IsCanFire(WeaponAttackProxy attackProxy, WeaponSideCmd cmd)
        {
            if (cmd.UserCmd.RenderTime < attackProxy.RuntimeComponent.NextAttackTimestamp)
            {
                return(false);
            }
            if (attackProxy.BasicComponent.Bullet <= 0)
            {
                attackProxy.Owner.ShowTip(ETipType.FireWithNoBullet);
                if (cmd.FiltedInput(EPlayerInput.IsLeftAttack))
                {
                    attackProxy.AudioController.PlayEmptyFireAudio();
                }
                return(false);
            }

            EFireMode currentMode = (EFireMode)attackProxy.BasicComponent.RealFireModel;

            switch (currentMode)
            {
            case EFireMode.Manual:
                return(!attackProxy.RuntimeComponent.IsPrevCmdFire);

            case EFireMode.Auto:
                return(true);

            case EFireMode.Burst:
                return(!attackProxy.RuntimeComponent.IsPrevCmdFire || attackProxy.RuntimeComponent.NeedAutoBurstShoot);

            default:
                return(false);
            }
        }
 public void OnIdle(WeaponAttackProxy attackProxy, WeaponSideCmd cmd)
 {
     if (!cmd.IsFire)
     {
         attackProxy.AudioController.StopFireTrigger();
         DoIdle(attackProxy, cmd);
     }
 }
        //以当前0.5X+10速度衰减
        public virtual float UpdateLen(WeaponAttackProxy attackProxy, float len, float frameSec)
        {
            var r = len;

            r -= (10f + r * 0.5f) * frameSec;
            r  = Mathf.Max(r, 0f);
            return(r);
        }
Exemplo n.º 12
0
 public void OnFrame(WeaponAttackProxy attackProxy, WeaponSideCmd cmd)
 {
     if (!cmd.IsFire)
     {
         attackProxy.RuntimeComponent.IsPrevCmdFire = false;
         attackProxy.AudioController.StopFireTrigger();
     }
 }
        public override void OnAfterFire(WeaponAttackProxy attackProxy, WeaponSideCmd cmd)
        {
            var config     = attackProxy.WeaponConfigAssy.SRifleShakeCfg;
            var shakeGroup = FireShakeProvider.GetShakeGroup(config, attackProxy.Owner);
            var shakeInfo  = FireShakeProvider.GetShakeInfo(config, attackProxy.Owner, shakeGroup);

            CalcBaseShake(attackProxy, cmd.UserCmd.Seq, shakeInfo);
        }
Exemplo n.º 14
0
 public override bool IsCanFire(WeaponAttackProxy attackProxy, WeaponSideCmd weaponCmd)
 {
     if (base.IsCanFire(attackProxy, weaponCmd))
     {
         return(attackProxy.RuntimeComponent.PullBoltFinish);
     }
     return(false);
 }
        public override float UpdateLen(WeaponAttackProxy attackProxy, float len, float frameTime)
        {
            var r = len;

            r -= (attackProxy.WeaponConfigAssy.SRifleShakeCfg.FixedDecayFactor +
                  r * attackProxy.WeaponConfigAssy.SRifleShakeCfg.LenDecayFactor) * frameTime;
            r = Mathf.Max(r, 0f);
            return(r);
        }
        public override void OnAfterFire(WeaponAttackProxy attackProxy, WeaponSideCmd cmd)
        {
            var config = attackProxy.WeaponConfigAssy.SFixedShakeCfg;

            if (null == config)
            {
                return;
            }
            attackProxy.Orientation.AccPunchPitch      += config.PunchPitch;
            attackProxy.Orientation.AccPunchPitchValue += config.PunchPitch * config.PunchOffsetFactor;
        }
Exemplo n.º 17
0
 public void OnIdle(WeaponAttackProxy attackProxy, WeaponSideCmd cmd)
 {
     if (attackProxy.RuntimeComponent.ContinuesShootCount == 0)
     {
         var config = attackProxy.WeaponConfigAssy.S_PistolAccuracyLogicCfg;
         if (config != null)
         {
             attackProxy.RuntimeComponent.Accuracy = config.InitAccuracy;
         }
     }
 }
Exemplo n.º 18
0
        protected override void Update(WeaponAttackProxy attackProxy, WeaponSideCmd cmd)

        {
            // var appearance = controller.RelatedAppearence;
            // var weaponObject = appearance.IsFirstPerson
            //                 ? appearance.GetWeaponP1InHand()
            //                 : appearance.GetWeaponP3InHand();
            // DebugUtil.MyLog(weaponObject.transform.position.ToString("f4"));
            RifleSpreadLogicConfig config = attackProxy.WeaponConfigAssy.S_RifleSpreadLogicCfg;
            float spreadScaleFactor       = FireSpreadProvider.GetSpreadScaleFactor(config, attackProxy);

            FireSpreadFormula.ApplyRifleFinalSpread(spreadScaleFactor, config.SpreadScale, attackProxy.RuntimeComponent);
        }
Exemplo n.º 19
0
 public override void OnAfterFire(WeaponAttackProxy attackProxy, WeaponSideCmd cmd)
 {
     attackProxy.RuntimeComponent.StartPullBolt();
     if (attackProxy.BasicComponent.Bullet > 0)
     {
         var needActionDeal = SingletonManager.Get <WeaponResourceConfigManager>()
                              .NeedActionDeal(attackProxy.WeaponConfigAssy.S_Id, ActionDealEnum.Reload);
         SpecialFireAppearance(attackProxy, needActionDeal);
     }
     else
     {
         base.OnAfterFire(attackProxy, cmd);
     }
 }
 public virtual void OnAfterFire(WeaponAttackProxy attackProxy, WeaponSideCmd cmd)
 {
     if (attackProxy.CharacterState != null)
     {
         if (attackProxy.IsAiming)
         {
             attackProxy.CharacterState.SightsFire();
         }
         else
         {
             attackProxy.CharacterState.Fire();
         }
     }
 }
Exemplo n.º 21
0
        public void OnBeforeFire(WeaponAttackProxy attackProxy, WeaponSideCmd cmd)
        {
            if (attackProxy.WeaponConfigAssy.S_RifleFireCounterCfg == null)
            {
                return;
            }
            var runTimeComponent = attackProxy.RuntimeComponent;

            // runTimeComponent.NeedReduceContinuesShootCD = true;
            runTimeComponent.ContinuesShootCount = Mathf.Min(++runTimeComponent.ContinuesShootCount,
                                                             attackProxy.WeaponConfigAssy.S_RifleFireCounterCfg.MaxCount);
            runTimeComponent.ContinuesShootReduceTimestamp =
                cmd.UserCmd.RenderTime + attackProxy.WeaponConfigAssy.S_RifleFireCounterCfg.DecreaseInitInterval;
        }
        /// <summary>
        /// TargetPunchPitchDelta => AccPunchYaw,AccPunchYawValue
        /// </summary>
        /// <param name="agent"></param>
        /// <param name="cmd"></param>

        public override void OnFrame(WeaponAttackProxy attackProxy, WeaponSideCmd cmd)
        {
            ShakeGroup shakeGroup       = FireShakeProvider.GetShakeGroup(attackProxy.WeaponConfigAssy.SRifleShakeCfg, attackProxy.Owner);
            var        runTimeComponent = attackProxy.RuntimeComponent;
            //int frameInterval = cmd.UserCmd.FrameInterval;
            var orient = attackProxy.Orientation;
            //后坐力生效时间
            var deltaTime = Mathf.Min(cmd.UserCmd.FrameInterval, cmd.UserCmd.RenderTime - runTimeComponent.LastRenderTimestamp);

            if (runTimeComponent.PunchDecayLeftInterval > 0)
            {
                float totalInterval = FireShakeProvider.GetDecayInterval(attackProxy.WeaponConfigAssy);
                float lastInterval  = runTimeComponent.PunchDecayLeftInterval;
                runTimeComponent.PunchDecayLeftInterval -= deltaTime;
                float newInterval = runTimeComponent.PunchDecayLeftInterval;

                var lastPunchPitch = FireShakeFormula.EaseOutCubic(0, runTimeComponent.TargetPunchPitchDelta,
                                                                   (totalInterval - lastInterval) / totalInterval);
                var newPunchPitch = FireShakeFormula.EaseOutCubic(0, runTimeComponent.TargetPunchPitchDelta,
                                                                  (totalInterval - newInterval) / totalInterval);

                orient.AccPunchPitch     += newPunchPitch - lastPunchPitch;
                orient.AccPunchPitchValue = orient.AccPunchPitch * shakeGroup.VPunchOffsetFactor;

                orient.AccPunchYaw     += runTimeComponent.PunchYawSpeed * deltaTime;
                orient.AccPunchYawValue = orient.AccPunchYaw * shakeGroup.HPunchOffsetFactor;

                if (GlobalConst.EnableWeaponLog)
                {
                    DebugUtil.MyLog(("orient.AccPunchPitch:" + orient.AccPunchPitch));
                }
            }
            else
            {
                UpdateOrientationAttenuation(attackProxy, cmd);
            }

            if (attackProxy.WeaponConfigAssy.S_FireRollCfg != null && runTimeComponent.CameraRotationInterval > 0)
            {
                runTimeComponent.CameraRotationInterval -= deltaTime;
                orient.FireRoll += runTimeComponent.CameraRotationSpeed * deltaTime;
            }
            else
            {
                RecoverFireRoll(attackProxy, cmd);
            }
            base.OnFrame(attackProxy, cmd);
        }
Exemplo n.º 23
0
        public void OnAfterFire(WeaponAttackProxy attackProxy, WeaponSideCmd cmd)
        {
            if ((EFireMode)attackProxy.BasicComponent.RealFireModel == EFireMode.Burst)
            {
                return;
            }
            var runtimeDataComponent = attackProxy.RuntimeComponent;

            runtimeDataComponent.IsPrevCmdFire = true;
            float intervalFactor = 1 - attackProxy.GetAttachedAttributeByType(WeaponAttributeType.AttackInterval) / 100;

            runtimeDataComponent.NextAttackTimestamp = cmd.UserCmd.RenderTime + Mathf.CeilToInt(attackProxy.WeaponConfigAssy.S_CommonFireCfg.AttackInterval * intervalFactor);
            runtimeDataComponent.NeedAutoBurstShoot  = false;
            //  runtimeDataComponent.ContinuesShootCount = 0;
            runtimeDataComponent.LastAttackTimestamp = cmd.UserCmd.RenderTime;
        }
Exemplo n.º 24
0
        public void OnBeforeFire(WeaponAttackProxy attackProxy, WeaponSideCmd cmd)
        {
            var runTimeComponent = attackProxy.RuntimeComponent;

            if (runTimeComponent.LastAttackTimestamp == 0)
            {
            }
            else
            {
                var config = attackProxy.WeaponConfigAssy.S_PistolAccuracyLogicCfg;
                if (config == null)
                {
                    return;
                }
                runTimeComponent.Accuracy = AccuracyFormula.GetPistolAccuracy(cmd.UserCmd.RenderTime - runTimeComponent.LastAttackTimestamp,
                                                                              config.AccuracyFactor, config.MinAccuracy, config.MaxAccuracy);
            }
        }
Exemplo n.º 25
0
        public void OnIdle(WeaponAttackProxy attackProxy, WeaponSideCmd cmd)
        {
            if (attackProxy.WeaponConfigAssy.S_RifleFireCounterCfg == null)
            {
                return;
            }

            if (attackProxy.RuntimeComponent.ContinuesShootCount < 1)
            {
                return;
            }
            if (attackProxy.RuntimeComponent.ContinuesShootReduceTimestamp < cmd.UserCmd.RenderTime)
            {
                //          DebugUtil.MyLog("Count -- ||DecreaseStepInterval:"+heldAgent.RifleFireCounterCfg.DecreaseStepInterval+"||"+heldAgent.RifleFireCounterCfg.DecreaseStepInterval);
                attackProxy.RuntimeComponent.ContinuesShootReduceTimestamp = cmd.UserCmd.RenderTime +
                                                                             attackProxy.WeaponConfigAssy.S_RifleFireCounterCfg.DecreaseStepInterval;
                --attackProxy.RuntimeComponent.ContinuesShootCount;
            }
        }
Exemplo n.º 26
0
        private void UpdateAccurcy(WeaponAttackProxy attackProxy)
        {
            var config = attackProxy.WeaponConfigAssy.S_BaseAccuracyLogicCfg;

            if (config == null)
            {
                return;
            }

            int accuracyDivisor = config.AccuracyDivisor; //除数因子

            if (accuracyDivisor != -1)
            {
                attackProxy.RuntimeComponent.Accuracy = AccuracyFormula.GetCommonAccuracy(config.MaxInaccuracy, attackProxy.RuntimeComponent.ContinuesShootCount,
                                                                                          config.AccuracyDivisor, config.AccuracyOffset);
            }
            else
            {
                attackProxy.RuntimeComponent.Accuracy = 0;
            }
        }
        protected void RecoverFireRoll(WeaponAttackProxy attackProxy, WeaponSideCmd cmd)
        {
            var rotateYaw = attackProxy.Orientation.FireRoll;

            if (rotateYaw != 0)
            {
                if (attackProxy.WeaponConfigAssy.S_FireRollCfg == null)
                {
                    rotateYaw = 0;
                }
                else
                {
                    var rotatePos = rotateYaw >= 0;
                    rotateYaw -= rotateYaw * cmd.UserCmd.FrameInterval / attackProxy.WeaponConfigAssy.S_FireRollCfg.FireRollBackTime;
                    if ((rotatePos && rotateYaw < 0) || (!rotatePos && rotateYaw > 0))
                    {
                        rotateYaw = 0;
                    }
                }
                attackProxy.Orientation.FireRoll = rotateYaw;
            }
        }
Exemplo n.º 28
0
        protected void SpecialFireAppearance(WeaponAttackProxy attackProxy, bool needActionDeal)
        {
            var relatedCharState  = attackProxy.CharacterState;
            var relatedAppearance = attackProxy.Appearence;

            if (relatedCharState == null)
            {
                return;
            }
            if (attackProxy.CanFire)
            {
                relatedCharState.SpecialSightsFire(() =>
                {
                    if (needActionDeal)
                    {
                        relatedAppearance.RemountWeaponOnRightHand();
                    }
                    attackProxy.RuntimeComponent.FinishPullBolt();
                });
            }
            else
            {
                relatedCharState.SpecialFire(() =>
                {
                    if (needActionDeal)
                    {
                        relatedAppearance.RemountWeaponOnRightHand();
                    }

                    attackProxy.RuntimeComponent.FinishPullBolt();
                });
            }

            if (needActionDeal)
            {
                relatedAppearance.MountWeaponOnAlternativeLocator();
            }
        }
Exemplo n.º 29
0
        /// <summary>
        ///     判断特殊换弹逻辑
        /// </summary>
        /// <param name="playerWeapon"></param>
        /// <param name="cmd"></param>
        /// <returns>是否可以射击</returns>
        private bool CheckSpecialReload(WeaponAttackProxy attackProxy)
        {
            var specialReload = attackProxy.CharacterState.GetActionState();

            // DebugUtil.MyLog("GetActionState:"+controller.RelatedCharState.GetActionState());
            if (specialReload != ActionInConfig.Reload && specialReload != ActionInConfig.SpecialReload)
            {
                return(true);
            }

            var config = attackProxy.WeaponConfigAssy.S_CommonFireCfg;

            if (config == null)
            {
                return(false);
            }
            if (config.SpecialReloadCount > 0 && attackProxy.BasicComponent.Bullet > 0)
            {
                if (attackProxy.BasicComponent.PullBolt)
                {
                    //如果已经上膛,直接打断并开枪
                    attackProxy.CharacterState.ForceBreakSpecialReload(null);
                    return(true);
                }

                //如果没有上膛,执行上膛,结束后开枪
                attackProxy.CharacterState.BreakSpecialReload();
                attackProxy.BasicComponent.PullBolt             = true;
                attackProxy.RuntimeComponent.NeedAutoBurstShoot = false;
            }
            else
            {
                attackProxy.AudioController.PlayEmptyFireAudio();
            }

            return(false);
        }
Exemplo n.º 30
0
        protected override void Update(WeaponAttackProxy attackProxy, WeaponSideCmd cmd)
        {
            var config = attackProxy.WeaponConfigAssy.S_FixedSpreadLogicCfg;

            FireSpreadFormula.ApplyFixedFinalSpread(config.Value, config.SpreadScale, attackProxy.RuntimeComponent);
        }