private bool HasNoReservedBullet(ISharedPlayerWeaponComponentGetter agent, PlayerEntity playerEntity) { if (agent.GetReservedBullet() < 1) { _elapse = 0; if (SharedConfig.CurrentGameMode == Components.GameMode.Normal) { playerEntity.tip.TipType = ETipType.BulletRunout; } else { playerEntity.tip.TipType = ETipType.NoBulletInPackage; } return(true); } return(false); }
public void ExecuteUserCmd(IUserCmdOwner owner, IUserCmd cmd) { PlayerEntity player = (PlayerEntity)owner.OwnerEntity; if (cmd.IsReload)// && cmd.FilteredInput.IsInput(EPlayerInput.IsReload)) { if (!cmd.FilteredInput.IsInput(EPlayerInput.IsReload) && !player.playerMove.IsAutoRun) { return; } if (!player.hasWeaponComponentAgent) { return; } ISharedPlayerWeaponComponentGetter sharedAPI = player.GetController <PlayerWeaponController>(); WeaponInfo currWeapon = sharedAPI.CurrSlotWeaponInfo; var config = SingletonManager.Get <WeaponConfigManager>().GetConfigById(currWeapon.Id); if (NoReloadAction(config)) { return; } if (MagazineIsFull(player.weaponLogic.State, currWeapon.Bullet)) { return; } if (HasNoReservedBullet(sharedAPI, player)) { return; } if (!_reloading) { player.weaponLogic.WeaponSound.PlaySound(EWeaponSoundType.ClipDrop); _reloading = true; } var weaponState = player.weaponLogic.State; var reloadSpeed = weaponState.ReloadSpeed; reloadSpeed = Mathf.Max(0.1f, reloadSpeed); player.playerMove.InterruptAutoRun(); player.animatorClip.ClipManager.SetReloadSpeedBuff(reloadSpeed); if (weaponState.SpecialReloadCount > 0) { var target = weaponState.BulletCountLimit - weaponState.LoadedBulletCount; target = Mathf.Min(target, weaponState.ReservedBulletCount); var count = Mathf.CeilToInt((float)target / weaponState.SpecialReloadCount); count = Mathf.Max(1, count); player.stateInterface.State.SpecialReload( () => { SpecialReload(weaponState); }, count, () => { //换弹结束回调 player.animatorClip.ClipManager.ResetReloadSpeedBuff(); }); } else { if (weaponState.LoadedBulletCount > 0 && !weaponState.IsAlwaysEmptyReload) { var needActionDeal = CheckNeedActionDeal(sharedAPI, ActionDealEnum.Reload); if (needActionDeal) { player.appearanceInterface.Appearance.MountWeaponOnAlternativeLocator(); } player.stateInterface.State.Reload(() => { if (needActionDeal) { player.appearanceInterface.Appearance.RemountWeaponOnRightHand(); } Reload(weaponState); player.animatorClip.ClipManager.ResetReloadSpeedBuff(); _reloading = false; }); } else { var needActionDeal = CheckNeedActionDeal(sharedAPI, ActionDealEnum.ReloadEmpty); if (needActionDeal) { player.appearanceInterface.Appearance.MountWeaponOnAlternativeLocator(); } player.stateInterface.State.ReloadEmpty(() => { if (needActionDeal) { player.appearanceInterface.Appearance.RemountWeaponOnRightHand(); } Reload(weaponState); player.animatorClip.ClipManager.ResetReloadSpeedBuff(); _reloading = false; }); } } } }
private bool CheckNeedActionDeal(ISharedPlayerWeaponComponentGetter sharedApi, ActionDealEnum action) { return(SingletonManager.Get <WeaponConfigManager>().NeedActionDeal(sharedApi.CurrSlotWeaponId, action)); }