コード例 #1
0
        private void TurnOn(StunbatonComponent comp, EntityUid user)
        {
            if (comp.Activated)
            {
                return;
            }

            if (!EntityManager.TryGetComponent <SpriteComponent?>(comp.Owner, out var sprite) ||
                !EntityManager.TryGetComponent <SharedItemComponent?>(comp.Owner, out var item))
            {
                return;
            }

            var playerFilter = Filter.Pvs(comp.Owner);

            if (!TryComp <BatteryComponent>(comp.Owner, out var battery) || battery.CurrentCharge < comp.EnergyPerUse)
            {
                SoundSystem.Play(comp.TurnOnFailSound.GetSound(), playerFilter, comp.Owner, AudioHelpers.WithVariation(0.25f));
                user.PopupMessage(Loc.GetString("stunbaton-component-low-charge"));
                return;
            }

            SoundSystem.Play(comp.SparksSound.GetSound(), playerFilter, comp.Owner, AudioHelpers.WithVariation(0.25f));

            item.EquippedPrefix = "on";
            sprite.LayerSetState(0, "stunbaton_on");
            comp.Activated = true;
        }
コード例 #2
0
        private void TurnOn(StunbatonComponent comp, EntityUid user)
        {
            if (comp.Activated)
            {
                return;
            }

            var playerFilter = Filter.Pvs(comp.Owner, entityManager: EntityManager);

            if (!TryComp <BatteryComponent>(comp.Owner, out var battery) || battery.CurrentCharge < comp.EnergyPerUse)
            {
                SoundSystem.Play(comp.TurnOnFailSound.GetSound(), playerFilter, comp.Owner, AudioHelpers.WithVariation(0.25f));
                user.PopupMessage(Loc.GetString("stunbaton-component-low-charge"));
                return;
            }

            if (EntityManager.TryGetComponent <AppearanceComponent>(comp.Owner, out var appearance) &&
                EntityManager.TryGetComponent <ItemComponent>(comp.Owner, out var item))
            {
                _item.SetHeldPrefix(comp.Owner, "on", item);
                appearance.SetData(ToggleVisuals.Toggled, true);
            }

            SoundSystem.Play(comp.SparksSound.GetSound(), playerFilter, comp.Owner, AudioHelpers.WithVariation(0.25f));
            comp.Activated = true;
        }
コード例 #3
0
 private void OnPowerCellChanged(EntityUid uid, StunbatonComponent comp, PowerCellChangedEvent args)
 {
     if (args.Ejected)
     {
         TurnOff(comp);
     }
 }
コード例 #4
0
        private void OnExamined(EntityUid uid, StunbatonComponent comp, ExaminedEvent args)
        {
            var msg = comp.Activated
                ? Loc.GetString("comp-stunbaton-examined-on")
                : Loc.GetString("comp-stunbaton-examined-off");

            args.PushMarkup(msg);
        }
コード例 #5
0
        private void OnExamined(EntityUid uid, StunbatonComponent comp, ExaminedEvent args)
        {
            args.Message.AddText("\n");
            var msg = comp.Activated
                ? Loc.GetString("comp-stunbaton-examined-on")
                : Loc.GetString("comp-stunbaton-examined-off");

            args.Message.AddMarkup(msg);
        }
コード例 #6
0
        private void OnMeleeHit(EntityUid uid, StunbatonComponent component, MeleeHitEvent args)
        {
            if (!component.Activated)
            {
                return;
            }

            // Don't apply damage if it's activated; just do stamina damage.
            args.BonusDamage -= args.BaseDamage;
        }
コード例 #7
0
 private void OnUseInHand(EntityUid uid, StunbatonComponent comp, UseInHandEvent args)
 {
     if (comp.Activated)
     {
         TurnOff(comp);
     }
     else
     {
         TurnOn(comp, args.User);
     }
 }
コード例 #8
0
 private void OnInteractUsing(EntityUid uid, StunbatonComponent comp, InteractUsingEvent args)
 {
     if (!ActionBlockerSystem.CanInteract(args.User))
     {
         return;
     }
     if (ComponentManager.TryGetComponent <PowerCellSlotComponent>(uid, out var cellslot))
     {
         cellslot.InsertCell(args.Used);
     }
 }
コード例 #9
0
        private void OnExamined(EntityUid uid, StunbatonComponent comp, ExaminedEvent args)
        {
            var msg = comp.Activated
                ? Loc.GetString("comp-stunbaton-examined-on")
                : Loc.GetString("comp-stunbaton-examined-off");

            args.PushMarkup(msg);
            if (TryComp <BatteryComponent>(uid, out var battery))
            {
                args.PushMarkup(Loc.GetString("stunbaton-component-on-examine-charge",
                                              ("charge", (int)((battery.CurrentCharge / battery.MaxCharge) * 100))));
            }
        }
コード例 #10
0
        private void OnThrowCollide(EntityUid uid, StunbatonComponent comp, ThrowDoHitEvent args)
        {
            if (!EntityManager.TryGetComponent <PowerCellSlotComponent>(uid, out var slot))
            {
                return;
            }
            if (!comp.Activated || slot.Cell == null || !slot.Cell.TryUseCharge(comp.EnergyPerUse))
            {
                return;
            }

            StunEntity(args.Target, comp);
        }
コード例 #11
0
        private void OnPowerCellChanged(EntityUid uid, StunbatonComponent comp, PowerCellChangedEvent args)
        {
            if (!comp.Activated)
            {
                return;
            }

            if (args.Ejected ||
                !_cellSystem.TryGetBatteryFromSlot(comp.Owner, out var battery) ||
                battery.CurrentCharge < comp.EnergyPerUse)
            {
                TurnOff(comp);
            }
        }
コード例 #12
0
        private void OnThrowCollide(EntityUid uid, StunbatonComponent comp, ThrowDoHitEvent args)
        {
            if (!comp.Activated)
            {
                return;
            }

            if (!_cellSystem.TryGetBatteryFromSlot(uid, out var battery) || !battery.TryUseCharge(comp.EnergyPerUse))
            {
                return;
            }

            StunEntity(args.Target, comp);
        }
コード例 #13
0
        private void OnMeleeInteract(EntityUid uid, StunbatonComponent comp, MeleeInteractEvent args)
        {
            if (!comp.Activated)
            {
                return;
            }

            if (!_cellSystem.TryGetBatteryFromSlot(uid, out var battery) || !battery.TryUseCharge(comp.EnergyPerUse))
            {
                return;
            }

            args.CanInteract = true;
            StunEntity(args.Entity, comp);
        }
コード例 #14
0
        private void OnMeleeInteract(EntityUid uid, StunbatonComponent comp, MeleeInteractEvent args)
        {
            if (!comp.Activated)
            {
                return;
            }

            if (!EntityManager.TryGetComponent <PowerCellSlotComponent>(uid, out var slot) || slot.Cell == null || !slot.Cell.TryUseCharge(comp.EnergyPerUse))
            {
                return;
            }

            args.CanInteract = true;
            StunEntity(args.Entity, comp);
        }
コード例 #15
0
 private void OnUseInHand(EntityUid uid, StunbatonComponent comp, UseInHandEvent args)
 {
     if (!ActionBlockerSystem.CanUse(args.User))
     {
         return;
     }
     if (comp.Activated)
     {
         TurnOff(comp);
     }
     else
     {
         TurnOn(comp, args.User);
     }
 }
コード例 #16
0
        private void OnMeleeHit(EntityUid uid, StunbatonComponent comp, MeleeHitEvent args)
        {
            if (!comp.Activated || !args.HitEntities.Any())
            {
                return;
            }

            if (!_cellSystem.TryGetBatteryFromSlot(uid, out var battery) || !battery.TryUseCharge(comp.EnergyPerUse))
            {
                return;
            }

            foreach (EntityUid entity in args.HitEntities)
            {
                StunEntity(entity, comp);
            }
        }
コード例 #17
0
        private void OnStaminaHitAttempt(EntityUid uid, StunbatonComponent component, ref StaminaDamageOnHitAttemptEvent args)
        {
            if (!component.Activated ||
                !TryComp <BatteryComponent>(uid, out var battery) || !battery.TryUseCharge(component.EnergyPerUse))
            {
                args.Cancelled = true;
                return;
            }

            args.HitSoundOverride = component.StunSound;

            if (battery.CurrentCharge < component.EnergyPerUse)
            {
                SoundSystem.Play(component.SparksSound.GetSound(), Filter.Pvs(component.Owner, entityManager: EntityManager), uid, AudioHelpers.WithVariation(0.25f));
                TurnOff(component);
            }
        }
コード例 #18
0
        private void StunEntity(IEntity entity, StunbatonComponent comp)
        {
            if (!entity.TryGetComponent(out StatusEffectsComponent? status) || !comp.Activated)
            {
                return;
            }

            // TODO: Make slowdown inflicted customizable.

            SoundSystem.Play(Filter.Pvs(comp.Owner), comp.StunSound.GetSound(), comp.Owner, AudioHelpers.WithVariation(0.25f));
            if (!EntityManager.HasComponent <SlowedDownComponent>(entity.Uid))
            {
                if (_robustRandom.Prob(comp.ParalyzeChanceNoSlowdown))
                {
                    _stunSystem.TryParalyze(entity.Uid, TimeSpan.FromSeconds(comp.ParalyzeTime), status);
                }
                else
                {
                    _stunSystem.TrySlowdown(entity.Uid, TimeSpan.FromSeconds(comp.SlowdownTime), 0.5f, 0.5f, status);
                }
            }
            else
            {
                if (_robustRandom.Prob(comp.ParalyzeChanceWithSlowdown))
                {
                    _stunSystem.TryParalyze(entity.Uid, TimeSpan.FromSeconds(comp.ParalyzeTime), status);
                }
                else
                {
                    _stunSystem.TrySlowdown(entity.Uid, TimeSpan.FromSeconds(comp.SlowdownTime), 0.5f, 0.5f, status);
                }
            }

            var slowdownTime = TimeSpan.FromSeconds(comp.SlowdownTime);

            _jitterSystem.DoJitter(entity.Uid, slowdownTime, status: status);
            _stutteringSystem.DoStutter(entity.Uid, slowdownTime, status);

            if (!comp.Owner.TryGetComponent <PowerCellSlotComponent>(out var slot) || slot.Cell == null || !(slot.Cell.CurrentCharge < comp.EnergyPerUse))
            {
                return;
            }

            SoundSystem.Play(Filter.Pvs(comp.Owner), comp.SparksSound.GetSound(), comp.Owner, AudioHelpers.WithVariation(0.25f));
            TurnOff(comp);
        }
コード例 #19
0
        private void OnMeleeHit(EntityUid uid, StunbatonComponent comp, MeleeHitEvent args)
        {
            if (!comp.Activated || !args.HitEntities.Any())
            {
                return;
            }

            if (!EntityManager.TryGetComponent <PowerCellSlotComponent>(uid, out var slot) || slot.Cell == null || !slot.Cell.TryUseCharge(comp.EnergyPerUse))
            {
                return;
            }

            foreach (IEntity entity in args.HitEntities)
            {
                StunEntity(entity, comp);
            }
        }
コード例 #20
0
        private void TurnOff(StunbatonComponent comp)
        {
            if (!comp.Activated)
            {
                return;
            }

            if (TryComp <AppearanceComponent>(comp.Owner, out var appearance) &&
                TryComp <ItemComponent>(comp.Owner, out var item))
            {
                _item.SetHeldPrefix(comp.Owner, "off", item);
                appearance.SetData(ToggleVisuals.Toggled, false);
            }

            SoundSystem.Play(comp.SparksSound.GetSound(), Filter.Pvs(comp.Owner), comp.Owner, AudioHelpers.WithVariation(0.25f));

            comp.Activated = false;
        }
コード例 #21
0
        private void OnThrowCollide(EntityUid uid, StunbatonComponent comp, ThrowDoHitEvent args)
        {
            if (!comp.Activated)
            {
                return;
            }

            if (!TryComp <BatteryComponent>(uid, out var battery))
            {
                return;
            }

            if (_robustRandom.Prob(comp.OnThrowStunChance) && battery.TryUseCharge(comp.EnergyPerUse))
            {
                SendPowerPulse(args.Target, args.User, uid);
                StunEntity(args.Target, comp);
            }
        }
コード例 #22
0
        private void TurnOff(StunbatonComponent comp)
        {
            if (!comp.Activated)
            {
                return;
            }

            if (!comp.Owner.TryGetComponent <SpriteComponent>(out var sprite) ||
                !comp.Owner.TryGetComponent <ItemComponent>(out var item))
            {
                return;
            }

            SoundSystem.Play(Filter.Pvs(comp.Owner), comp.SparksSound.GetSound(), comp.Owner, AudioHelpers.WithVariation(0.25f));
            item.EquippedPrefix = "off";
            // TODO stunbaton visualizer
            sprite.LayerSetState(0, "stunbaton_off");
            comp.Activated = false;
        }
コード例 #23
0
        private void OnMeleeHit(EntityUid uid, StunbatonComponent comp, MeleeHitEvent args)
        {
            if (!comp.Activated || !args.HitEntities.Any() || args.Handled)
            {
                return;
            }

            if (!TryComp <BatteryComponent>(uid, out var battery) || !battery.TryUseCharge(comp.EnergyPerUse))
            {
                return;
            }

            foreach (EntityUid entity in args.HitEntities)
            {
                StunEntity(entity, comp);
                SendPowerPulse(entity, args.User, uid);
            }

            // No combat should occur if we successfully stunned.
            args.Handled = true;
        }
コード例 #24
0
        private void StunEntity(IEntity entity, StunbatonComponent comp)
        {
            if (!entity.TryGetComponent(out StunnableComponent? stunnable) || !comp.Activated)
            {
                return;
            }

            SoundSystem.Play(Filter.Pvs(comp.Owner), "/Audio/Weapons/egloves.ogg", comp.Owner.Transform.Coordinates, AudioHelpers.WithVariation(0.25f));
            if (!stunnable.SlowedDown)
            {
                if (_robustRandom.Prob(comp.ParalyzeChanceNoSlowdown))
                {
                    stunnable.Paralyze(comp.ParalyzeTime);
                }
                else
                {
                    stunnable.Slowdown(comp.SlowdownTime);
                }
            }
            else
            {
                if (_robustRandom.Prob(comp.ParalyzeChanceWithSlowdown))
                {
                    stunnable.Paralyze(comp.ParalyzeTime);
                }
                else
                {
                    stunnable.Slowdown(comp.SlowdownTime);
                }
            }


            if (!comp.Owner.TryGetComponent <PowerCellSlotComponent>(out var slot) || slot.Cell == null || !(slot.Cell.CurrentCharge < comp.EnergyPerUse))
            {
                return;
            }

            SoundSystem.Play(Filter.Pvs(comp.Owner), AudioHelpers.GetRandomFileFromSoundCollection("sparks"), comp.Owner.Transform.Coordinates, AudioHelpers.WithVariation(0.25f));
            TurnOff(comp);
        }
コード例 #25
0
        private void TurnOn(StunbatonComponent comp, IEntity user)
        {
            if (comp.Activated)
            {
                return;
            }

            if (!comp.Owner.TryGetComponent <SpriteComponent>(out var sprite) ||
                !comp.Owner.TryGetComponent <ItemComponent>(out var item))
            {
                return;
            }

            var playerFilter = Filter.Pvs(comp.Owner);

            if (!comp.Owner.TryGetComponent <PowerCellSlotComponent>(out var slot))
            {
                return;
            }

            if (slot.Cell == null)
            {
                SoundSystem.Play(playerFilter, comp.TurnOnFailSound.GetSound(), comp.Owner, AudioHelpers.WithVariation(0.25f));
                user.PopupMessage(Loc.GetString("comp-stunbaton-activated-missing-cell"));
                return;
            }

            if (slot.Cell != null && slot.Cell.CurrentCharge < comp.EnergyPerUse)
            {
                SoundSystem.Play(playerFilter, comp.TurnOnFailSound.GetSound(), comp.Owner, AudioHelpers.WithVariation(0.25f));
                user.PopupMessage(Loc.GetString("comp-stunbaton-activated-dead-cell"));
                return;
            }

            SoundSystem.Play(playerFilter, comp.SparksSound.GetSound(), comp.Owner, AudioHelpers.WithVariation(0.25f));

            item.EquippedPrefix = "on";
            sprite.LayerSetState(0, "stunbaton_on");
            comp.Activated = true;
        }
コード例 #26
0
        private void StunEntity(IEntity entity, StunbatonComponent comp)
        {
            if (!entity.TryGetComponent(out StunnableComponent? stunnable) || !comp.Activated)
            {
                return;
            }

            SoundSystem.Play(Filter.Pvs(comp.Owner), comp.StunSound.GetSound(), comp.Owner, AudioHelpers.WithVariation(0.25f));
            if (!stunnable.SlowedDown)
            {
                if (_robustRandom.Prob(comp.ParalyzeChanceNoSlowdown))
                {
                    stunnable.Paralyze(comp.ParalyzeTime);
                }
                else
                {
                    stunnable.Slowdown(comp.SlowdownTime);
                }
            }
            else
            {
                if (_robustRandom.Prob(comp.ParalyzeChanceWithSlowdown))
                {
                    stunnable.Paralyze(comp.ParalyzeTime);
                }
                else
                {
                    stunnable.Slowdown(comp.SlowdownTime);
                }
            }


            if (!comp.Owner.TryGetComponent <PowerCellSlotComponent>(out var slot) || slot.Cell == null || !(slot.Cell.CurrentCharge < comp.EnergyPerUse))
            {
                return;
            }

            SoundSystem.Play(Filter.Pvs(comp.Owner), comp.SparksSound.GetSound(), comp.Owner, AudioHelpers.WithVariation(0.25f));
            TurnOff(comp);
        }