Fixes & more (#548)
* - fix: Narsie not spawning, items not dropping on paralyze, cult tweaks. * - fix: Diagonal grilles layer. * - add: Cockroaches don't drop organs. * - add: Magic hands now work on interact & disable context menu interaction. * - fix: Shackles speech after doafter. * - tweak: Reduce flashbang knockdown, check for CanLieDown. * - tweak: Hspear limit. * - tweak: Remove knockdown tile friction. * - tweak: Engi belt in sus box. * - fix: Constructs can hear cult chat. * - fix: Desword audio. * - fix: Context menu. * - fix: Actually drop items on paralyze. * - tweak: Revert range reduction. * - add: Update thermal visibility. * - add: NPCs can miss. * - tweak: Update desc. * - fix: Actually fix desword audio. * - tweak: Secret weights & game presets. * - fix: Cult stun.
This commit is contained in:
@@ -3,12 +3,15 @@ using System.Numerics;
|
||||
using Content.Client.CombatMode;
|
||||
using Content.Client.Examine;
|
||||
using Content.Client.Gameplay;
|
||||
using Content.Client.Popups;
|
||||
using Content.Client.Verbs;
|
||||
using Content.Client.Verbs.UI;
|
||||
using Content.Shared.CCVar;
|
||||
using Content.Shared.Examine;
|
||||
using Content.Shared.IdentityManagement;
|
||||
using Content.Shared.Input;
|
||||
using Content.Shared.Mobs.Components;
|
||||
using Content.Shared.Popups;
|
||||
using Robust.Client.GameObjects;
|
||||
using Robust.Client.Graphics;
|
||||
using Robust.Client.Input;
|
||||
@@ -50,6 +53,7 @@ namespace Content.Client.ContextMenu.UI
|
||||
[UISystemDependency] private readonly ExamineSystem _examineSystem = default!;
|
||||
[UISystemDependency] private readonly TransformSystem _xform = default!;
|
||||
[UISystemDependency] private readonly CombatModeSystem _combatMode = default!;
|
||||
[UISystemDependency] private readonly PopupSystem _popup = default!; // WD EDIT
|
||||
|
||||
private bool _updating;
|
||||
|
||||
@@ -124,6 +128,19 @@ namespace Content.Client.ContextMenu.UI
|
||||
return;
|
||||
}
|
||||
|
||||
// WD START
|
||||
var localEntity = _playerManager.LocalEntity;
|
||||
if (args.Function == EngineKeyFunctions.Use &&
|
||||
EntityManager.HasComponent<MobStateComponent>(entity.Value) && entity.Value != localEntity)
|
||||
{
|
||||
_popup.PopupClient(Loc.GetString("context-menu-cant-interact"),
|
||||
entity.Value, localEntity, PopupType.MediumCaution);
|
||||
_context.Close();
|
||||
args.Handle();
|
||||
return;
|
||||
}
|
||||
// WD END
|
||||
|
||||
// do some other server-side interaction?
|
||||
if (args.Function == EngineKeyFunctions.Use ||
|
||||
args.Function == ContentKeyFunctions.ActivateItemInWorld ||
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
using System.Linq;
|
||||
using System.Numerics;
|
||||
using Content.Client.Stealth;
|
||||
using Content.Shared._White.Overlays;
|
||||
using Content.Shared.Body.Components;
|
||||
using Content.Shared.Stealth.Components;
|
||||
using Robust.Client.GameObjects;
|
||||
using Robust.Client.Graphics;
|
||||
using Robust.Client.Player;
|
||||
@@ -19,6 +21,7 @@ public sealed class ThermalVisionOverlay : Overlay
|
||||
private readonly TransformSystem _transform;
|
||||
private readonly OccluderSystem _occluder;
|
||||
private readonly PointLightSystem _pointLight;
|
||||
private readonly StealthSystem _stealth;
|
||||
|
||||
public override OverlaySpace Space => OverlaySpace.WorldSpace;
|
||||
|
||||
@@ -33,6 +36,7 @@ public sealed class ThermalVisionOverlay : Overlay
|
||||
_transform = _entity.System<TransformSystem>();
|
||||
_occluder = _entity.System<OccluderSystem>();
|
||||
_pointLight = _entity.System<PointLightSystem>();
|
||||
_stealth = _entity.System<StealthSystem>();
|
||||
ZIndex = -1;
|
||||
}
|
||||
|
||||
@@ -125,7 +129,9 @@ public sealed class ThermalVisionOverlay : Overlay
|
||||
|
||||
private bool CanSee(EntityUid ent, SpriteComponent sprite)
|
||||
{
|
||||
return sprite.Visible && !_entity.HasComponent<ThermalBlockerComponent>(ent);
|
||||
return sprite.Visible && !_entity.HasComponent<ThermalBlockerComponent>(ent) &&
|
||||
(!_entity.TryGetComponent(ent, out StealthComponent? stealth) ||
|
||||
_stealth.GetVisibility(ent, stealth) > 0.5f);
|
||||
}
|
||||
|
||||
private bool HasOccluders(EntityUid ent)
|
||||
|
||||
@@ -24,6 +24,7 @@ using Content.Shared.Mobs.Systems;
|
||||
using Content.Shared.Players;
|
||||
using Content.Shared.Radio;
|
||||
using Content.Shared._White;
|
||||
using Content.Shared._White.Cult.Components;
|
||||
using Content.Shared.Speech;
|
||||
using Content.Shared._White.Cult.Systems;
|
||||
using Robust.Server.Player;
|
||||
@@ -795,6 +796,7 @@ public sealed partial class ChatSystem : SharedChatSystem
|
||||
return Filter.Empty()
|
||||
.AddWhereAttachedEntity(HasComp<GhostComponent>)
|
||||
.AddWhereAttachedEntity(HasComp<CultistComponent>)
|
||||
.AddWhereAttachedEntity(HasComp<ConstructComponent>)
|
||||
.Recipients
|
||||
.Union(_adminManager.ActiveAdmins)
|
||||
.Select(p => p.Channel);
|
||||
|
||||
@@ -14,7 +14,7 @@ public sealed partial class CultRitesHandComponent : BaseMagicHandComponent
|
||||
public SoundSpecifier SuckSound = new SoundPathSpecifier("/Audio/White/Cult/enter_blood.ogg");
|
||||
|
||||
[DataField]
|
||||
public float HealModifier = 0.5f;
|
||||
public float HealModifier = 1f;
|
||||
|
||||
[DataField(customTypeSerializer: typeof(PrototypeIdListSerializer<CultistFactoryProductionPrototype>))]
|
||||
public List<string> BloodRites = new ()
|
||||
|
||||
@@ -17,11 +17,11 @@ using Content.Shared.Examine;
|
||||
using Content.Shared.FixedPoint;
|
||||
using Content.Shared.Fluids.Components;
|
||||
using Content.Shared.Interaction;
|
||||
using Content.Shared.Mobs.Components;
|
||||
using Content.Shared.Mobs.Systems;
|
||||
using Content.Shared.Popups;
|
||||
using Content.Shared.StatusEffect;
|
||||
using Content.Shared.UserInterface;
|
||||
using Content.Shared.Weapons.Melee.Events;
|
||||
using Robust.Server.Audio;
|
||||
using Robust.Server.GameObjects;
|
||||
using Robust.Shared.Prototypes;
|
||||
@@ -50,9 +50,8 @@ public sealed class MagicHandSystem : EntitySystem
|
||||
{
|
||||
base.Initialize();
|
||||
|
||||
SubscribeLocalEvent<CultStunHandComponent, MeleeHitEvent>(OnStunHit);
|
||||
SubscribeLocalEvent<CultRitesHandComponent, MeleeHitEvent>(OnRitesHit);
|
||||
SubscribeLocalEvent<CultRitesHandComponent, AfterInteractEvent>(OnInteract);
|
||||
SubscribeLocalEvent<CultStunHandComponent, AfterInteractEvent>(OnStunInteract);
|
||||
SubscribeLocalEvent<CultRitesHandComponent, AfterInteractEvent>(OnRitesInteract);
|
||||
SubscribeLocalEvent<CultRitesHandComponent, CultistFactoryItemSelectedMessage>(OnBloodRitesSelected);
|
||||
SubscribeLocalEvent<CultRitesHandComponent, ActivatableUIOpenAttemptEvent>(OnRitesSelectAttempt);
|
||||
SubscribeLocalEvent<CultRitesHandComponent, BeforeActivatableUIOpenEvent>(BeforeRitesSelect);
|
||||
@@ -122,17 +121,26 @@ public sealed class MagicHandSystem : EntitySystem
|
||||
cultist.RitesBloodAmount -= prototype.BloodCost;
|
||||
}
|
||||
|
||||
private void OnInteract(Entity<CultRitesHandComponent> ent, ref AfterInteractEvent args)
|
||||
private void OnRitesInteract(Entity<CultRitesHandComponent> ent, ref AfterInteractEvent args)
|
||||
{
|
||||
if (!args.CanReach || args.Target is not { } target)
|
||||
return;
|
||||
|
||||
if (!TryComp(args.User, out CultistComponent? cultist))
|
||||
return;
|
||||
|
||||
if (HasComp<CultistComponent>(target) || HasComp<ConstructComponent>(target))
|
||||
{
|
||||
RitesHeal(ent, target, args.User, cultist);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
var puddleQuery = GetEntityQuery<PuddleComponent>();
|
||||
if (!puddleQuery.HasComp(target))
|
||||
return;
|
||||
|
||||
if (!TryComp(args.User, out BloodstreamComponent? bloodstreamComponent) ||
|
||||
!TryComp(args.User, out CultistComponent? cultist))
|
||||
if (!TryComp(args.User, out BloodstreamComponent? bloodstreamComponent))
|
||||
return;
|
||||
|
||||
var xform = Transform(target);
|
||||
@@ -176,28 +184,22 @@ public sealed class MagicHandSystem : EntitySystem
|
||||
args.Handled = true;
|
||||
}
|
||||
|
||||
private void OnRitesHit(Entity<CultRitesHandComponent> ent, ref MeleeHitEvent args)
|
||||
private void RitesHeal(Entity<CultRitesHandComponent> ent, EntityUid target, EntityUid user, CultistComponent cultist)
|
||||
{
|
||||
if (args.HitEntities.Count == 0)
|
||||
return;
|
||||
|
||||
var target = args.HitEntities[0];
|
||||
var (uid, comp) = ent;
|
||||
|
||||
QueueDel(uid);
|
||||
|
||||
if (!TryComp(args.User, out CultistComponent? cultist) || !TryComp(target, out DamageableComponent? damageable))
|
||||
if (!TryComp(target, out DamageableComponent? damageable) || !TryComp(target, out MobStateComponent? mobState))
|
||||
return;
|
||||
|
||||
if (_mobState.IsDead(target))
|
||||
if (_mobState.IsDead(target, mobState))
|
||||
{
|
||||
Popup(Loc.GetString("cult-rites-dead"), args.User);
|
||||
Popup(Loc.GetString("cult-rites-dead"), user);
|
||||
return;
|
||||
}
|
||||
|
||||
if (cultist.RitesBloodAmount <= FixedPoint2.Zero)
|
||||
{
|
||||
Popup(Loc.GetString("cult-rites-heal-no-blood"), args.User);
|
||||
Popup(Loc.GetString("cult-rites-heal-no-blood"), user);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -205,27 +207,32 @@ public sealed class MagicHandSystem : EntitySystem
|
||||
var totalDamage = damage.GetTotal();
|
||||
if (totalDamage <= FixedPoint2.Zero)
|
||||
{
|
||||
Popup(Loc.GetString("cult-rites-already-healed"), args.User);
|
||||
Popup(Loc.GetString("cult-rites-already-healed"), user);
|
||||
return;
|
||||
}
|
||||
|
||||
QueueDel(uid);
|
||||
|
||||
var coef = FixedPoint2.Min(cultist.RitesBloodAmount * comp.HealModifier, totalDamage) / totalDamage;
|
||||
cultist.RitesBloodAmount =
|
||||
FixedPoint2.Max(FixedPoint2.Zero, cultist.RitesBloodAmount - totalDamage / comp.HealModifier);
|
||||
_damageable.TryChangeDamage(target, -damage * coef, true, false, damageable, args.User);
|
||||
Popup(Loc.GetString("cult-rites-after-heal", ("blood", cultist.RitesBloodAmount)), args.User);
|
||||
_damageable.TryChangeDamage(target, -damage * coef, true, false, damageable, user);
|
||||
Popup(Loc.GetString("cult-rites-after-heal", ("blood", cultist.RitesBloodAmount)), user);
|
||||
_audio.PlayPvs(comp.HealSound, target);
|
||||
Speak(args.User, comp);
|
||||
Speak(user, comp);
|
||||
}
|
||||
|
||||
private void OnStunHit(Entity<CultStunHandComponent> ent, ref MeleeHitEvent args)
|
||||
private void OnStunInteract(Entity<CultStunHandComponent> ent, ref AfterInteractEvent args)
|
||||
{
|
||||
if (args.HitEntities.Count == 0)
|
||||
if (!args.CanReach || args.Target is not { } target)
|
||||
return;
|
||||
|
||||
var target = args.HitEntities[0];
|
||||
var (uid, comp) = ent;
|
||||
|
||||
if (uid == target || !TryComp(target, out StatusEffectsComponent? status) ||
|
||||
HasComp<CultistComponent>(target) || HasComp<ConstructComponent>(target))
|
||||
return;
|
||||
|
||||
QueueDel(uid);
|
||||
Spawn("CultStunFlashEffect", Transform(target).Coordinates);
|
||||
Speak(args.User, comp);
|
||||
@@ -241,8 +248,8 @@ public sealed class MagicHandSystem : EntitySystem
|
||||
var halo = HasComp<PentagramComponent>(args.User);
|
||||
|
||||
_statusEffects.TryAddStatusEffect(target, "Muted", halo ? comp.HaloMuteDuration : comp.MuteDuration, true,
|
||||
"Muted");
|
||||
_stun.TryParalyze(target, halo ? comp.HaloDuration : comp.Duration, true);
|
||||
"Muted", status);
|
||||
_stun.TryParalyze(target, halo ? comp.HaloDuration : comp.Duration, true, status);
|
||||
}
|
||||
|
||||
private void Popup(string msg, EntityUid user, PopupType type = PopupType.Small)
|
||||
|
||||
29
Content.Server/_White/Cult/Pylon/CheckForStructure.cs
Normal file
29
Content.Server/_White/Cult/Pylon/CheckForStructure.cs
Normal file
@@ -0,0 +1,29 @@
|
||||
using Content.Server.Popups;
|
||||
using Content.Shared._White.Cult.Pylon;
|
||||
using Content.Shared.Construction;
|
||||
using Content.Shared.Popups;
|
||||
using JetBrains.Annotations;
|
||||
|
||||
namespace Content.Server._White.Cult.Pylon;
|
||||
|
||||
[UsedImplicitly]
|
||||
[DataDefinition]
|
||||
public sealed partial class CheckForStructure : IGraphAction
|
||||
{
|
||||
public void PerformAction(EntityUid uid, EntityUid? userUid, IEntityManager entityManager)
|
||||
{
|
||||
var xform = entityManager.GetComponent<TransformComponent>(uid);
|
||||
var coords = xform.Coordinates;
|
||||
if (!SharedPylonComponent.CheckForStructure(coords, entityManager, 9f, uid))
|
||||
return;
|
||||
|
||||
entityManager.QueueDeleteEntity(uid);
|
||||
if (userUid != null)
|
||||
{
|
||||
entityManager.System<PopupSystem>()
|
||||
.PopupEntity(Loc.GetString("cult-structure-craft-another-structure-nearby"),
|
||||
userUid.Value, userUid.Value, PopupType.MediumCaution);
|
||||
}
|
||||
entityManager.SpawnEntity("CultRunicMetal4", coords);
|
||||
}
|
||||
}
|
||||
@@ -61,15 +61,6 @@ public sealed class PylonSystem : EntitySystem
|
||||
|
||||
private void OnInit(EntityUid uid, SharedPylonComponent component, ComponentInit args)
|
||||
{
|
||||
var coords = Transform(uid).Coordinates;
|
||||
if (SharedPylonComponent.CheckForStructure(coords, EntityManager, 9f, uid))
|
||||
{
|
||||
QueueDel(uid);
|
||||
_popupSystem.PopupCoordinates(Loc.GetString("cult-structure-craft-another-structure-nearby"),
|
||||
coords, PopupType.MediumCaution);
|
||||
Spawn("CultRunicMetal4", coords);
|
||||
return;
|
||||
}
|
||||
UpdateAppearance(uid, component);
|
||||
}
|
||||
|
||||
|
||||
@@ -102,6 +102,8 @@ public partial class CultSystem
|
||||
{
|
||||
_popupSystem.PopupEntity("Цель обезмолвлена.", args.User, args.User);
|
||||
}
|
||||
if (args.Speech != null)
|
||||
_chat.TrySendInGameICMessage(args.User, args.Speech, InGameICChatType.Whisper, false);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -369,8 +371,8 @@ public partial class CultSystem
|
||||
if (!TryComp(args.Target, out CuffableComponent? cuffs) || cuffs.Container.ContainedEntities.Count > 0)
|
||||
return;
|
||||
|
||||
var doAfterArgs = new DoAfterArgs(EntityManager, args.Performer, TimeSpan.FromSeconds(2), new ShacklesEvent(),
|
||||
args.Performer, args.Target)
|
||||
var doAfterArgs = new DoAfterArgs(EntityManager, args.Performer, TimeSpan.FromSeconds(2),
|
||||
new ShacklesEvent(args.Speech), args.Performer, args.Target)
|
||||
{
|
||||
BreakOnMove = true,
|
||||
BreakOnDamage = true
|
||||
@@ -379,7 +381,6 @@ public partial class CultSystem
|
||||
if (!_doAfterSystem.TryStartDoAfter(doAfterArgs))
|
||||
return;
|
||||
|
||||
Speak(args);
|
||||
args.Handled = true;
|
||||
}
|
||||
|
||||
|
||||
@@ -7,7 +7,6 @@ using Content.Shared.Wieldable;
|
||||
using Robust.Shared.Audio;
|
||||
using Robust.Shared.Audio.Systems;
|
||||
using Robust.Shared.Network;
|
||||
using Robust.Shared.Timing;
|
||||
|
||||
namespace Content.Shared.Item.ItemToggle;
|
||||
/// <summary>
|
||||
@@ -23,7 +22,6 @@ public abstract class SharedItemToggleSystem : EntitySystem
|
||||
[Dependency] private readonly SharedPointLightSystem _light = default!;
|
||||
[Dependency] private readonly INetManager _netManager = default!;
|
||||
[Dependency] private readonly SharedPopupSystem _popup = default!;
|
||||
[Dependency] private readonly IGameTiming _timing = default!;
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
@@ -242,17 +240,14 @@ public abstract class SharedItemToggleSystem : EntitySystem
|
||||
/// </summary>
|
||||
private void UpdateActiveSound(EntityUid uid, ItemToggleActiveSoundComponent activeSound, ref ItemToggledEvent args)
|
||||
{
|
||||
if (!_timing.IsFirstTimePredicted) // WD
|
||||
if (_netManager.IsClient) // WD EDIT, FUCK THIS (desword sound broken)
|
||||
return;
|
||||
|
||||
if (args.Activated)
|
||||
{
|
||||
if (activeSound.ActiveSound != null && activeSound.PlayingStream == null)
|
||||
{
|
||||
if (args.Predicted)
|
||||
activeSound.PlayingStream = _audio.PlayPredicted(activeSound.ActiveSound, uid, args.User, AudioParams.Default.WithLoop(true)).Value.Entity;
|
||||
else
|
||||
activeSound.PlayingStream = _audio.PlayPvs(activeSound.ActiveSound, uid, AudioParams.Default.WithLoop(true)).Value.Entity;
|
||||
activeSound.PlayingStream = _audio.PlayPvs(activeSound.ActiveSound, uid, AudioParams.Default.WithLoop(true)) .Value.Entity;
|
||||
}
|
||||
}
|
||||
else
|
||||
|
||||
@@ -11,7 +11,6 @@ using Content.Shared._White.Wizard.Timestop;
|
||||
using Content.Shared.Buckle;
|
||||
using Content.Shared.Buckle.Components;
|
||||
using Content.Shared.Mobs;
|
||||
using Content.Shared.Movement.Events;
|
||||
using Robust.Shared.Audio.Systems;
|
||||
using Robust.Shared.Input.Binding;
|
||||
using Robust.Shared.Physics;
|
||||
@@ -29,10 +28,8 @@ public abstract partial class SharedStandingStateSystem : EntitySystem
|
||||
[Dependency] private readonly SharedPhysicsSystem _physics = default!;
|
||||
[Dependency] private readonly SharedDoAfterSystem _doAfter = default!; // WD EDIT
|
||||
[Dependency] private readonly MovementSpeedModifierSystem _movement = default!; // WD EDIT
|
||||
[Dependency] private readonly SharedStunSystem _stun = default!; // WD EDIT
|
||||
[Dependency] private readonly MobStateSystem _mobState = default!; // WD EDIT
|
||||
[Dependency] private readonly SharedBuckleSystem _buckle = default!; // WD EDIT
|
||||
[Dependency] private readonly SharedTransformSystem _transform = default!; // WD EDIT
|
||||
[Dependency] private readonly SharedRotationVisualsSystem _rotation = default!; // WD EDIT
|
||||
|
||||
// If StandingCollisionLayer value is ever changed to more than one layer, the logic needs to be edited.
|
||||
@@ -53,7 +50,6 @@ public abstract partial class SharedStandingStateSystem : EntitySystem
|
||||
|
||||
SubscribeLocalEvent<StandingStateComponent, StandingUpDoAfterEvent>(OnStandingUpDoAfter);
|
||||
SubscribeLocalEvent<StandingStateComponent, RefreshMovementSpeedModifiersEvent>(OnRefreshMovementSpeed);
|
||||
SubscribeLocalEvent<StandingStateComponent, TileFrictionEvent>(OnTileFriction);
|
||||
SubscribeLocalEvent<StandingStateComponent, SlipAttemptEvent>(OnSlipAttempt);
|
||||
|
||||
InitializeColliding();
|
||||
@@ -114,12 +110,6 @@ public abstract partial class SharedStandingStateSystem : EntitySystem
|
||||
args.ModifySpeed(1f, 1f);
|
||||
}
|
||||
|
||||
private void OnTileFriction(Entity<StandingStateComponent> ent, ref TileFrictionEvent args)
|
||||
{
|
||||
if (IsDown(ent))
|
||||
args.Modifier *= SharedStunSystem.KnockDownModifier;
|
||||
}
|
||||
|
||||
private void OnSlipAttempt(EntityUid uid, StandingStateComponent component, SlipAttemptEvent args)
|
||||
{
|
||||
if (IsDown(uid))
|
||||
@@ -171,7 +161,7 @@ public abstract partial class SharedStandingStateSystem : EntitySystem
|
||||
return true;
|
||||
}
|
||||
|
||||
public enum DropHeldItemsBehavior
|
||||
public enum DropHeldItemsBehavior : byte
|
||||
{
|
||||
NoDrop,
|
||||
DropIfStanding,
|
||||
@@ -222,9 +212,6 @@ public abstract partial class SharedStandingStateSystem : EntitySystem
|
||||
if (TryComp(uid, out BuckleComponent? buckle) && buckle.Buckled && !_buckle.TryUnbuckle(uid, uid, buckleComp: buckle)) // WD EDIT
|
||||
return false;
|
||||
|
||||
if (standingState.CurrentState is StandingState.Lying or StandingState.GettingUp)
|
||||
return true;
|
||||
|
||||
// This is just to avoid most callers doing this manually saving boilerplate
|
||||
// 99% of the time you'll want to drop items but in some scenarios (e.g. buckling) you don't want to.
|
||||
// We do this BEFORE downing because something like buckle may be blocking downing but we want to drop hand items anyway
|
||||
@@ -234,6 +221,9 @@ public abstract partial class SharedStandingStateSystem : EntitySystem
|
||||
RaiseLocalEvent(uid, new DropHandItemsEvent());
|
||||
}
|
||||
|
||||
if (standingState.CurrentState is StandingState.Lying or StandingState.GettingUp)
|
||||
return true;
|
||||
|
||||
var msg = new DownAttemptEvent();
|
||||
RaiseLocalEvent(uid, msg);
|
||||
|
||||
|
||||
@@ -107,7 +107,7 @@ public abstract class SharedStunSystem : EntitySystem
|
||||
private void OnKnockInit(EntityUid uid, KnockedDownComponent component, ComponentInit args)
|
||||
{
|
||||
RaiseNetworkEvent(new CheckAutoGetUpEvent()); // WD EDIT
|
||||
_standingState.Down(uid);
|
||||
_standingState.TryLieDown(uid, null, SharedStandingStateSystem.DropHeldItemsBehavior.DropIfStanding);
|
||||
}
|
||||
|
||||
private void OnKnockShutdown(EntityUid uid, KnockedDownComponent component, ComponentShutdown args)
|
||||
@@ -207,6 +207,9 @@ public abstract class SharedStunSystem : EntitySystem
|
||||
if (_statusEffect.HasStatusEffect(uid, "Stun"))
|
||||
time = TimeSpan.FromSeconds(6);
|
||||
|
||||
if (_standingState.IsDown(uid)) // WD
|
||||
RaiseLocalEvent(uid, new DropHandItemsEvent());
|
||||
|
||||
return TryKnockdown(uid, time, refresh, status) && TryStun(uid, time, refresh, status);
|
||||
}
|
||||
|
||||
|
||||
@@ -129,7 +129,7 @@ public sealed partial class MeleeWeaponComponent : Component
|
||||
/// Nearest edge range to hit an entity.
|
||||
/// </summary>
|
||||
[ViewVariables(VVAccess.ReadWrite), DataField, AutoNetworkedField]
|
||||
public float Range = 1.2f;
|
||||
public float Range = 1.5f;
|
||||
|
||||
/// <summary>
|
||||
/// Total width of the angle for wide attacks.
|
||||
|
||||
@@ -401,7 +401,7 @@ public abstract class SharedMeleeWeaponSystem : EntitySystem
|
||||
|
||||
if (lightTarget == null)
|
||||
{
|
||||
if (weapon.CanMiss)
|
||||
if (weapon.CanMiss || session == null) // NPCs can miss
|
||||
break;
|
||||
return false;
|
||||
}
|
||||
@@ -512,11 +512,6 @@ public abstract class SharedMeleeWeaponSystem : EntitySystem
|
||||
animation = miss && weapon.Animation == "WeaponArcThrust"
|
||||
? weapon.MissAnimation
|
||||
: weapon.Animation;
|
||||
if (miss)
|
||||
{
|
||||
weapon.NextAttack -= fireRate / 2f;
|
||||
weapon.NextMobAttack -= fireRate / 2f;
|
||||
}
|
||||
// WD EDIT END
|
||||
break;
|
||||
case DisarmAttackEvent disarm:
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using Content.Shared.Inventory;
|
||||
using Content.Shared.Standing;
|
||||
using Content.Shared.Stunnable;
|
||||
|
||||
namespace Content.Shared._White.BuffedFlashGrenade;
|
||||
@@ -38,9 +39,12 @@ public sealed class FlashSoundSuppressionSystem : EntitySystem
|
||||
if (distance > range)
|
||||
return;
|
||||
|
||||
var knockdownTime = float.Lerp(knockdownDuration, 0f, distance / range);
|
||||
if (knockdownTime > 0f)
|
||||
_stunSystem.TryKnockdown(target, TimeSpan.FromSeconds(knockdownTime), true);
|
||||
if (TryComp<StandingStateComponent>(target, out var standingState) && standingState.CanLieDown)
|
||||
{
|
||||
var knockdownTime = float.Lerp(knockdownDuration, 0f, distance / range);
|
||||
if (knockdownTime > 0f)
|
||||
_stunSystem.TryKnockdown(target, TimeSpan.FromSeconds(knockdownTime), true);
|
||||
}
|
||||
|
||||
var stunTime = float.Lerp(stunDuration, 0f, distance / range);
|
||||
if (stunTime > 0f)
|
||||
|
||||
@@ -6,8 +6,16 @@ using Robust.Shared.Serialization;
|
||||
namespace Content.Shared._White.Cult.Actions;
|
||||
|
||||
[Serializable, NetSerializable]
|
||||
public sealed partial class ShacklesEvent : SimpleDoAfterEvent
|
||||
public sealed partial class ShacklesEvent : DoAfterEvent
|
||||
{
|
||||
public string? Speech;
|
||||
|
||||
public ShacklesEvent(string? speech)
|
||||
{
|
||||
Speech = speech;
|
||||
}
|
||||
|
||||
public override DoAfterEvent Clone() => this;
|
||||
}
|
||||
|
||||
[Serializable, NetSerializable]
|
||||
|
||||
@@ -49,7 +49,7 @@ public sealed class BloodSpearSystem : EntitySystem
|
||||
|
||||
if (!_holy.IsHoldingHolyWeapon(args.Target))
|
||||
{
|
||||
if(!_stunSystem.TryParalyze(args.Target, TimeSpan.FromSeconds(4), true, status))
|
||||
if(!_stunSystem.TryParalyze(args.Target, TimeSpan.FromSeconds(5), true, status))
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -6,10 +6,10 @@ ent-SoulShardGhost = камень душ
|
||||
.suffix = Роль призраков
|
||||
|
||||
ent-StunHand = оглушающая аура
|
||||
.desc = Оглушит и обезмолвит жертву при ударе.
|
||||
.desc = Оглушит и обезмолвит жертву при контакте.
|
||||
|
||||
ent-RitesHand = аура кровавых обрядов
|
||||
.desc = Впитывает кровь из всего, к чему прикасается. При ударе по культистам и конструктам может исцелить их. Используйте в руке, чтобы провести продвинутый обряд.
|
||||
.desc = Впитывает кровь из всего, к чему прикасается. При контакте с культистами или конструктами может исцелить их. Используйте в руке, чтобы провести продвинутый обряд.
|
||||
|
||||
ent-ShadowShackles = теневые оковы
|
||||
.desc = Оковы, сковывающие запястья с помощью зловещей магии.
|
||||
|
||||
@@ -22,3 +22,5 @@ melee-block-event-blocked = заблокировал!
|
||||
alerts-blocked-name = Атака заблокирована
|
||||
alerts-blocked-desc = Невозможно блокировать некоторое время.
|
||||
melee-block-component-delay = Может блокировать атаку ближнего боя каждые {$delay} секунд.
|
||||
|
||||
context-menu-cant-interact = Невозможно взаимодействовать через контекстное меню!
|
||||
|
||||
@@ -112,12 +112,7 @@
|
||||
components:
|
||||
- type: StorageFill
|
||||
contents:
|
||||
- id: Crowbar
|
||||
- id: Wrench
|
||||
- id: Screwdriver
|
||||
- id: Wirecutter
|
||||
- id: Welder
|
||||
- id: Multitool
|
||||
- id: ClothingBeltUtilityEngineering
|
||||
- id: ClothingHandsGlovesCombat
|
||||
- id: ClothingMaskGasSyndicate
|
||||
|
||||
|
||||
@@ -375,7 +375,8 @@
|
||||
damageType: Blunt
|
||||
damage: 10
|
||||
behaviors:
|
||||
- !type:GibBehavior { }
|
||||
- !type:GibBehavior
|
||||
recursive: false
|
||||
- type: NonSpreaderZombie
|
||||
|
||||
- type: entity
|
||||
@@ -529,7 +530,8 @@
|
||||
damageType: Blunt
|
||||
damage: 60
|
||||
behaviors:
|
||||
- !type:GibBehavior { }
|
||||
- !type:GibBehavior
|
||||
recursive: false
|
||||
- type: FireVisuals
|
||||
sprite: Mobs/Effects/onfire.rsi
|
||||
normalState: Mouse_burning
|
||||
|
||||
@@ -757,7 +757,7 @@
|
||||
- type: FlashOnTrigger
|
||||
range: 7
|
||||
stunTime: 2 # WD
|
||||
knockdownTime: 20 # WD
|
||||
knockdownTime: 10 # WD
|
||||
- type: SpawnOnTrigger
|
||||
proto: GrenadeFlashEffect
|
||||
- type: ActiveTimerTrigger
|
||||
|
||||
@@ -42,7 +42,7 @@
|
||||
animation: WeaponArcThrust
|
||||
soundHit:
|
||||
path: /Audio/Weapons/bladeslice.ogg
|
||||
range: 1.8 # Spears are long
|
||||
range: 2 # Spears are long
|
||||
- type: DamageOtherOnHit
|
||||
damage:
|
||||
types:
|
||||
|
||||
@@ -68,7 +68,7 @@
|
||||
- type: FlashOnTrigger
|
||||
range: 7
|
||||
stunTime: 2 # WD
|
||||
knockdownTime: 20 # WD
|
||||
knockdownTime: 10 # WD
|
||||
- type: SoundOnTrigger
|
||||
sound:
|
||||
path: "/Audio/Effects/flash_bang.ogg"
|
||||
|
||||
@@ -200,7 +200,7 @@
|
||||
mask:
|
||||
- FullTileMask
|
||||
layer:
|
||||
- WallLayer
|
||||
- GlassLayer
|
||||
- type: Construction
|
||||
graph: GrilleDiagonal
|
||||
node: grilleDiagonal
|
||||
@@ -235,7 +235,7 @@
|
||||
mask:
|
||||
- FullTileMask
|
||||
layer:
|
||||
- WallLayer
|
||||
- GlassLayer
|
||||
- type: Construction
|
||||
graph: GrilleDiagonal
|
||||
node: clockworkGrilleDiagonal
|
||||
|
||||
@@ -101,6 +101,7 @@
|
||||
blacklist:
|
||||
tags:
|
||||
- NukeOpsUplink
|
||||
saleLimit: 1
|
||||
|
||||
# Night Vision
|
||||
- type: listing
|
||||
|
||||
@@ -87,6 +87,7 @@
|
||||
completed:
|
||||
- !type:SnapToGrid
|
||||
southRotation: true
|
||||
- !type:CheckForStructure
|
||||
steps:
|
||||
- material: RunicMetalSheets
|
||||
amount: 4
|
||||
|
||||
@@ -8,15 +8,6 @@
|
||||
components:
|
||||
- type: Item
|
||||
size: Ginormous
|
||||
- type: MeleeWeapon
|
||||
canBeBlocked: false
|
||||
canHeavyAttack: false
|
||||
canMiss: false
|
||||
attackRate: 2
|
||||
wideAnimationRotation: 180
|
||||
damage:
|
||||
types:
|
||||
Heat: 0
|
||||
- type: DeleteOnDropAttempt
|
||||
message: cult-hand-component-extra-message
|
||||
- type: Unremoveable
|
||||
@@ -35,15 +26,6 @@
|
||||
state: icon
|
||||
- type: Item
|
||||
sprite: White/Cult/Entities/stun.rsi
|
||||
- type: MeleeWeapon
|
||||
canAttackSelf: false
|
||||
attackWhitelist:
|
||||
components:
|
||||
- StatusEffects
|
||||
attackBlacklist:
|
||||
components:
|
||||
- Cultist
|
||||
- Construct
|
||||
- type: CultStunHand
|
||||
speech: "Fuu ma'jin!"
|
||||
|
||||
@@ -58,11 +40,6 @@
|
||||
state: icon
|
||||
- type: Item
|
||||
sprite: White/Cult/Entities/rites.rsi
|
||||
- type: MeleeWeapon
|
||||
attackWhitelist:
|
||||
components:
|
||||
- Cultist
|
||||
- Construct
|
||||
- type: CultRitesHand
|
||||
speech: "Fel'th Dol Ab'orod!"
|
||||
- type: ActivatableUI
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
animation: WeaponArcThrust
|
||||
soundHit:
|
||||
path: /Audio/Weapons/bladeslice.ogg
|
||||
range: 1.8
|
||||
range: 2
|
||||
- type: DamageOtherOnHit
|
||||
damage:
|
||||
types:
|
||||
|
||||
@@ -84,6 +84,7 @@
|
||||
group: Construct
|
||||
- type: GlobalAntagonist
|
||||
antagonistPrototype: globalAntagonistCult
|
||||
- type: ThermalBlocker
|
||||
|
||||
- type: entity
|
||||
id: JuggernautConstruct
|
||||
|
||||
@@ -41,7 +41,7 @@
|
||||
- type: FlashOnTrigger
|
||||
range: 5
|
||||
stunTime: 2 # WD
|
||||
knockdownTime: 20 # WD
|
||||
knockdownTime: 10 # WD
|
||||
- type: SpawnOnTrigger
|
||||
proto: GrenadeFlashEffect
|
||||
- type: DeleteOnTrigger
|
||||
|
||||
@@ -265,7 +265,7 @@
|
||||
- type: MeleeWeapon
|
||||
soundHit:
|
||||
path: /Audio/White/Items/hit/chainhit.ogg
|
||||
range: 2.2
|
||||
range: 2.5
|
||||
damage:
|
||||
types:
|
||||
Blunt: 18
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
alias:
|
||||
- survival
|
||||
name: survival-title
|
||||
showInVote: false # secret
|
||||
showInVote: true
|
||||
description: survival-description
|
||||
rules:
|
||||
- RampingStationEventScheduler
|
||||
@@ -98,7 +98,7 @@
|
||||
- traitor
|
||||
name: traitor-title
|
||||
description: traitor-description
|
||||
showInVote: false
|
||||
showInVote: true
|
||||
rules:
|
||||
- Traitor
|
||||
- SubGamemodesRule
|
||||
@@ -114,7 +114,7 @@
|
||||
name: death-match-title
|
||||
description: death-match-description
|
||||
maxPlayers: 15
|
||||
showInVote: true
|
||||
showInVote: false
|
||||
supportedMaps: DeathMatchMapPool
|
||||
rules:
|
||||
- DeathMatch31
|
||||
@@ -141,7 +141,7 @@
|
||||
- revolutionaries
|
||||
name: rev-title
|
||||
description: rev-description
|
||||
showInVote: false
|
||||
showInVote: true
|
||||
rules:
|
||||
- Revolutionary
|
||||
- SubGamemodesRule
|
||||
@@ -172,7 +172,7 @@
|
||||
- pirates
|
||||
name: pirates-title
|
||||
description: pirates-description
|
||||
showInVote: true
|
||||
showInVote: false
|
||||
rules:
|
||||
- Pirates
|
||||
- BasicStationEventScheduler
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
Changeling: 0.14
|
||||
Nukeops: 0.14
|
||||
Cult: 0.15
|
||||
Wizard: 0.15
|
||||
Revolutionary: 0.04
|
||||
Wizard: 0.09
|
||||
Revolutionary: 0.1
|
||||
Zombie: 0.04
|
||||
Survival: 0.04
|
||||
|
||||
Reference in New Issue
Block a user