예제 #1
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);
            }
        }
예제 #2
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);
            }
        }
        protected override void UpdateFire(PlayerWeaponController controller, WeaponSideCmd cmd, Contexts contexts)
        {
            var nowTime          = controller.RelatedTime;
            var runTimeComponent = controller.HeldWeaponAgent.RunTimeComponent;

            if (!cmd.FiltedInput(XmlConfig.EPlayerInput.MeleeAttack) || _inSpecialAttack)
            {
                return;
            }
            if (cmd.FiltedInput(XmlConfig.EPlayerInput.IsLeftAttack) &&
                controller.RelatedThrowAction.ThrowingEntityKey == EntityKey.Default &&
                (controller.RelatedThrowAction.LastFireWeaponKey == controller.HeldWeaponAgent.WeaponKey.EntityId ||
                 controller.RelatedThrowAction.LastFireWeaponKey == 0))
            {
                if (nowTime > runTimeComponent.NextAttackPeriodStamp)
                {
                    // 轻击1
                    runTimeComponent.NextAttackPeriodStamp =
                        nowTime + _config.AttackTotalInterval; //目前表里配的间隔时间是结束后到开始时间
                    runTimeComponent.ContinueAttackStartStamp = nowTime + _config.AttackOneCD;
                    runTimeComponent.ContinueAttackEndStamp   = nowTime + _config.ContinousInterval;
                    controller.RelatedCharState.LightMeleeAttackOne(OnAttackAniFinish);
                    AfterAttack(controller, cmd, EMeleeAttackType.Soft);
                }
                else if (CompareUtility.IsBetween(nowTime, runTimeComponent.ContinueAttackStartStamp,
                                                  runTimeComponent.ContinueAttackEndStamp))
                {
                    // 轻击2
                    runTimeComponent.ContinueAttackStartStamp = 0;
                    runTimeComponent.ContinueAttackEndStamp   = 0;
                    runTimeComponent.NextAttackPeriodStamp    = Math.Max(nowTime + _config.AttackOneCD,
                                                                         runTimeComponent.ContinueAttackEndStamp);
                    controller.RelatedCharState.LightMeleeAttackTwo(OnAttackAniFinish);
                    AfterAttack(controller, cmd, EMeleeAttackType.Soft);
                }

                controller.RelatedThrowAction.LastFireWeaponKey = controller.HeldWeaponAgent.WeaponKey.EntityId;
            }
            else if (cmd.FiltedInput(XmlConfig.EPlayerInput.IsRightAttack) &&
                     nowTime >= runTimeComponent.NextAttackPeriodStamp)
            {
                _inSpecialAttack = true;
                controller.RelatedCharState.MeleeSpecialAttack(OnSpecialAttackFinished);
                runTimeComponent.NextAttackPeriodStamp = nowTime + _config.SpecialAttackTotalInterval;
                AfterAttack(controller, cmd, EMeleeAttackType.Hard);
            }
        }
예제 #4
0
        protected override void UpdateFire(PlayerWeaponController controller, WeaponSideCmd cmd, Contexts contexts)
        {
            if (cmd.FiltedInput(EPlayerInput.IsLeftAttack))
            {
                DoReady(controller, cmd);
            }

            if (cmd.SwitchThrowMode)
            {
                DoSwitchMode(controller, cmd);
            }

            if (cmd.FiltedInput(EPlayerInput.IsReload))
            {
                DoPull(controller, cmd);
            }

            if (cmd.FiltedInput(EPlayerInput.IsThrowing))
            {
                DoThrowing(controller, cmd, contexts);
            }
        }
예제 #5
0
        protected override bool CheckInterrupt(PlayerWeaponController controller, WeaponSideCmd cmd)
        {
            if (throwingActionData.IsReady && cmd.FiltedInput(EPlayerInput.IsThrowingInterrupt))
            {
                DebugUtil.MyLog("Throw interrupt");
                //拉栓未投掷,打断投掷动作
                characterState.ForceFinishGrenadeThrow();
                controller.UnArmWeapon(false);
                return(true);
            }

            return(false);
        }
예제 #6
0
 protected override bool CheckInterrupt(PlayerWeaponController controller, WeaponSideCmd cmd)
 {
     if (controller.RelatedThrowAction.IsReady &&
         cmd.FiltedInput(EPlayerInput.IsThrowingInterrupt))
     {
         //收回手雷
         controller.RelatedThrowAction.IsReady = false;
         if (controller.RelatedThrowAction.IsPull)
         {
             //若已拉栓,销毁ThrowingEntity
             _throwingFactory.DestroyThrowing(controller.RelatedThrowAction.ThrowingEntityKey);
         }
         controller.UnArmWeapon(false);
         //拉栓未投掷,打断投掷动作
         controller.RelatedCharState.ForceFinishGrenadeThrow();
         controller.RelatedThrowAction.ClearState();
         return(true);
     }
     return(false);
 }
예제 #7
0
        protected override void DoIdle(PlayerWeaponController controller, WeaponSideCmd cmd)
        {
            var heldAgent = controller.HeldWeaponAgent;

            //null->Fire->SpecialFireHold(1)->SpecialFireEnd->null
            if (cmd.FiltedInput(EPlayerInput.IsPullboltInterrupt))
            {//当前pullBolting被限制,不执行
                heldAgent.InterruptPullBolt();
                return;
            }
            var state            = controller.RelatedCharState.GetActionState();
            var runTimeComponent = heldAgent.RunTimeComponent;

            //开火中:重置拉栓
            if (state == ActionInConfig.SpecialFireHold ||
                (runTimeComponent.PullBoltInterrupt && state == ActionInConfig.Null))
            {
                runTimeComponent.PullBoltInterrupt = false;
                if (!runTimeComponent.IsPullingBolt)
                {
                    controller.RelatedCharState.SpecialFireEnd();
                    if (controller.AudioController != null)
                    {
                        controller.AudioController.PlayPullBoltAudio(heldAgent.ConfigId);
                    }
                }
                SetPullBolt(runTimeComponent, true);

                return;
            }

            //拉栓行为结束:拉栓成功
            if (runTimeComponent.IsPullingBolt && state != ActionInConfig.SpecialFireEnd)
            {
                SetPullBolt(runTimeComponent, false);
                runTimeComponent.PullBoltFinish = true;
            }
        }
예제 #8
0
        public virtual bool IsCanFire(PlayerWeaponController controller, WeaponSideCmd cmd)
        {
            WeaponBaseAgent weaponAgent = controller.HeldWeaponAgent;

            if (cmd.UserCmd.RenderTime < weaponAgent.RunTimeComponent.NextAttackTimestamp)
            {
                return(false);
            }
            if (weaponAgent.BaseComponent.Bullet <= 0)
            {
                controller.ShowTip(ETipType.FireWithNoBullet);
                if (cmd.FiltedInput(EPlayerInput.IsLeftAttack) &&
                    controller.AudioController != null)
                {
                    controller.AudioController.PlayEmptyFireAudio();
                }
                return(false);
            }

            EFireMode currentMode = (EFireMode)weaponAgent.BaseComponent.RealFireModel;

            switch (currentMode)
            {
            case EFireMode.Manual:
                return(!weaponAgent.RunTimeComponent.IsPrevCmdFire);

            case EFireMode.Auto:
                return(true);

            case EFireMode.Burst:
                return(!weaponAgent.RunTimeComponent.IsPrevCmdFire || weaponAgent.RunTimeComponent.NeedAutoBurstShoot);

            default:
                return(false);
            }
        }
예제 #9
0
 public bool IsTrigger(PlayerWeaponController controller, WeaponSideCmd cmd)
 {
     return(cmd.FiltedInput(XmlConfig.EPlayerInput.IsLeftAttack) ||
            cmd.UserCmd.IsAutoFire);
 }