mirror of
https://github.com/WWhiteDreamProject/wwdpublic.git
synced 2026-04-19 06:28:40 +03:00
@@ -6,6 +6,7 @@ using Content.Server.Language;
|
||||
using Content.Shared.Chat;
|
||||
using Content.Shared.Language;
|
||||
using Content.Shared.WhiteDream.BloodCult.BloodCultist;
|
||||
using Content.Shared.WhiteDream.BloodCult.Constructs;
|
||||
using Robust.Shared.Network;
|
||||
using Robust.Shared.Player;
|
||||
using Robust.Shared.Utility;
|
||||
@@ -23,10 +24,19 @@ public sealed class BloodCultChatSystem : EntitySystem
|
||||
{
|
||||
base.Initialize();
|
||||
|
||||
SubscribeLocalEvent<BloodCultistComponent, EntitySpokeEvent>(OnSpeak);
|
||||
SubscribeLocalEvent<BloodCultistComponent, EntitySpokeEvent>(OnCultistSpeak);
|
||||
SubscribeLocalEvent<ConstructComponent, EntitySpokeEvent>(OnConstructSpeak);
|
||||
}
|
||||
|
||||
private void OnSpeak(EntityUid uid, BloodCultistComponent component, EntitySpokeEvent args)
|
||||
private void OnCultistSpeak(EntityUid uid, BloodCultistComponent component, EntitySpokeEvent args)
|
||||
{
|
||||
if (args.Source != uid || args.Language.ID != component.CultLanguageId || args.IsWhisper)
|
||||
return;
|
||||
|
||||
SendMessage(args.Source, args.Message, false, args.Language);
|
||||
}
|
||||
|
||||
private void OnConstructSpeak(EntityUid uid, ConstructComponent component, EntitySpokeEvent args)
|
||||
{
|
||||
if (args.Source != uid || args.Language.ID != component.CultLanguageId || args.IsWhisper)
|
||||
return;
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
using Content.Server.Actions;
|
||||
using Content.Server.WhiteDream.BloodCult.Gamerule;
|
||||
using Content.Shared.Mobs;
|
||||
using Content.Shared.WhiteDream.BloodCult;
|
||||
using Content.Shared.WhiteDream.BloodCult.Constructs;
|
||||
using Robust.Server.GameObjects;
|
||||
@@ -17,6 +18,7 @@ public sealed class ConstructSystem : EntitySystem
|
||||
|
||||
SubscribeLocalEvent<ConstructComponent, MapInitEvent>(OnMapInit);
|
||||
SubscribeLocalEvent<ConstructComponent, ComponentShutdown>(OnComponentShutdown);
|
||||
SubscribeLocalEvent<ConstructComponent, MobStateChangedEvent>(OnMobStateChanged);
|
||||
}
|
||||
|
||||
public override void Update(float frameTime)
|
||||
@@ -63,4 +65,15 @@ public sealed class ConstructSystem : EntitySystem
|
||||
while (cultistRule.MoveNext(out _, out var rule))
|
||||
rule.Constructs.Remove(construct);
|
||||
}
|
||||
|
||||
private void OnMobStateChanged(EntityUid uid, ConstructComponent component, MobStateChangedEvent args)
|
||||
{
|
||||
if (args.NewMobState != MobState.Dead)
|
||||
return;
|
||||
|
||||
var xform = Transform(uid);
|
||||
Spawn(component.SpawnOnDeathPrototype, xform.Coordinates);
|
||||
|
||||
QueueDel(uid);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
using Content.Shared.Chat;
|
||||
|
||||
namespace Content.Server.WhiteDream.BloodCult.Items.BaseAura;
|
||||
|
||||
public abstract partial class BaseAuraComponent : Component
|
||||
{
|
||||
[DataField]
|
||||
public string? Speech;
|
||||
|
||||
[DataField]
|
||||
public InGameICChatType ChatType = InGameICChatType.Whisper;
|
||||
}
|
||||
@@ -1,5 +1,6 @@
|
||||
using Content.Server.Actions;
|
||||
using Content.Server.Hands.Systems;
|
||||
using Content.Server.Projectiles;
|
||||
using Content.Server.Stunnable;
|
||||
using Content.Shared.Humanoid;
|
||||
using Content.Shared.Item;
|
||||
@@ -7,6 +8,7 @@ using Content.Shared.Projectiles;
|
||||
using Content.Shared.WhiteDream.BloodCult.BloodCultist;
|
||||
using Content.Shared.WhiteDream.BloodCult.Spells;
|
||||
using Robust.Server.Audio;
|
||||
using Robust.Server.GameObjects;
|
||||
|
||||
namespace Content.Server.WhiteDream.BloodCult.Items.BloodSpear;
|
||||
|
||||
@@ -16,6 +18,8 @@ public sealed class BloodSpearSystem : EntitySystem
|
||||
[Dependency] private readonly AudioSystem _audio = default!;
|
||||
[Dependency] private readonly HandsSystem _hands = default!;
|
||||
[Dependency] private readonly StunSystem _stun = default!;
|
||||
[Dependency] private readonly TransformSystem _transform = default!;
|
||||
[Dependency] private readonly ProjectileSystem _projectile = default!;
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
@@ -66,6 +70,16 @@ public sealed class BloodSpearSystem : EntitySystem
|
||||
if (!spearUid.HasValue || !TryComp(spearUid, out BloodSpearComponent? spear))
|
||||
return;
|
||||
|
||||
var spearXform = Transform(spearUid.Value);
|
||||
var cultistCoords = _transform.GetWorldPosition(cultist);
|
||||
|
||||
if (TryComp<EmbeddableProjectileComponent>(spearUid, out var embeddableProjectile)
|
||||
&& embeddableProjectile.Target.HasValue)
|
||||
_projectile.RemoveEmbed(spearUid.Value, embeddableProjectile);
|
||||
|
||||
_transform.AttachToGridOrMap(spearUid.Value, spearXform);
|
||||
_transform.SetWorldPosition(spearXform, cultistCoords);
|
||||
|
||||
_hands.TryForcePickupAnyHand(cultist, spearUid.Value);
|
||||
_audio.PlayPvs(spear.RecallAudio, spearUid.Value);
|
||||
args.Handled = true;
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
using Content.Server.WhiteDream.BloodCult.Items.BaseAura;
|
||||
using Robust.Shared.Prototypes;
|
||||
|
||||
namespace Content.Server.WhiteDream.BloodCult.Items.ShadowShacklesAura;
|
||||
|
||||
[RegisterComponent]
|
||||
public sealed partial class ShadowShacklesAuraComponent : BaseAuraComponent
|
||||
{
|
||||
[DataField]
|
||||
public EntProtoId ShacklesProto = "ShadowShackles";
|
||||
|
||||
[DataField]
|
||||
public TimeSpan MuteDuration = TimeSpan.FromSeconds(5);
|
||||
|
||||
[DataField]
|
||||
public TimeSpan KnockdownDuration = TimeSpan.FromSeconds(1);
|
||||
}
|
||||
@@ -0,0 +1,55 @@
|
||||
using System.Linq;
|
||||
using Content.Server.Chat.Systems;
|
||||
using Content.Server.Cuffs;
|
||||
using Content.Server.Stunnable;
|
||||
using Content.Shared.Speech.Muting;
|
||||
using Content.Shared.StatusEffect;
|
||||
using Content.Shared.Stunnable;
|
||||
using Content.Shared.Weapons.Melee.Events;
|
||||
using Content.Shared.WhiteDream.BloodCult.BloodCultist;
|
||||
using Robust.Server.GameObjects;
|
||||
|
||||
|
||||
namespace Content.Server.WhiteDream.BloodCult.Items.ShadowShacklesAura;
|
||||
|
||||
public sealed class ShadowShacklesAuraSystem : EntitySystem
|
||||
{
|
||||
[Dependency] private readonly StatusEffectsSystem _statusEffects = default!;
|
||||
[Dependency] private readonly StunSystem _stun = default!;
|
||||
[Dependency] private readonly ChatSystem _chat = default!;
|
||||
[Dependency] private readonly TransformSystem _transform = default!;
|
||||
[Dependency] private readonly CuffableSystem _cuffable = default!;
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
base.Initialize();
|
||||
|
||||
SubscribeLocalEvent<ShadowShacklesAuraComponent, MeleeHitEvent>(OnMeleeHit);
|
||||
}
|
||||
|
||||
private void OnMeleeHit(EntityUid uid, ShadowShacklesAuraComponent component, MeleeHitEvent args)
|
||||
{
|
||||
if (!args.HitEntities.Any())
|
||||
return;
|
||||
|
||||
var target = args.HitEntities.First();
|
||||
if (uid == target
|
||||
|| !HasComp<StunnedComponent>(target)
|
||||
|| HasComp<BloodCultistComponent>(target))
|
||||
return;
|
||||
|
||||
if (component.Speech != null)
|
||||
_chat.TrySendInGameICMessage(args.User, component.Speech, component.ChatType, false);
|
||||
|
||||
var shuckles = Spawn(component.ShacklesProto, _transform.GetMapCoordinates(args.User));
|
||||
if (!_cuffable.TryAddNewCuffs(target, args.User, shuckles))
|
||||
{
|
||||
QueueDel(shuckles);
|
||||
return;
|
||||
}
|
||||
|
||||
_stun.TryKnockdown(target, component.KnockdownDuration, true);
|
||||
_statusEffects.TryAddStatusEffect<MutedComponent>(target, "Muted", component.MuteDuration, true);
|
||||
QueueDel(uid);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
using Content.Server.WhiteDream.BloodCult.Items.BaseAura;
|
||||
using Content.Shared.Chat;
|
||||
|
||||
namespace Content.Server.WhiteDream.BloodCult.Items.StunAura;
|
||||
|
||||
[RegisterComponent]
|
||||
public sealed partial class StunAuraComponent : BaseAuraComponent
|
||||
{
|
||||
[DataField]
|
||||
public TimeSpan ParalyzeDuration = TimeSpan.FromSeconds(16);
|
||||
|
||||
[DataField]
|
||||
public TimeSpan MuteDuration = TimeSpan.FromSeconds(12);
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
using System.Linq;
|
||||
using Content.Server.Chat.Systems;
|
||||
using Content.Server.Stunnable;
|
||||
using Content.Shared.Speech.Muting;
|
||||
using Content.Shared.StatusEffect;
|
||||
using Content.Shared.Weapons.Melee.Events;
|
||||
using Content.Shared.WhiteDream.BloodCult.BloodCultist;
|
||||
using Content.Shared.WhiteDream.BloodCult.Constructs;
|
||||
|
||||
namespace Content.Server.WhiteDream.BloodCult.Items.StunAura;
|
||||
|
||||
public sealed class StunAuraSystem : EntitySystem
|
||||
{
|
||||
[Dependency] private readonly StatusEffectsSystem _statusEffects = default!;
|
||||
[Dependency] private readonly StunSystem _stun = default!;
|
||||
[Dependency] private readonly ChatSystem _chat = default!;
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
base.Initialize();
|
||||
|
||||
SubscribeLocalEvent<StunAuraComponent, MeleeHitEvent>(OnMeleeHit);
|
||||
}
|
||||
|
||||
private void OnMeleeHit(EntityUid uid, StunAuraComponent component, MeleeHitEvent args)
|
||||
{
|
||||
if (!args.HitEntities.Any())
|
||||
return;
|
||||
|
||||
var target = args.HitEntities.First();
|
||||
if (uid == target
|
||||
|| HasComp<BloodCultistComponent>(target)
|
||||
|| HasComp<ConstructComponent>(target))
|
||||
return;
|
||||
|
||||
if (component.Speech != null)
|
||||
_chat.TrySendInGameICMessage(args.User, component.Speech, component.ChatType, false);
|
||||
|
||||
_statusEffects.TryAddStatusEffect<MutedComponent>(target, "Muted", component.MuteDuration, true);
|
||||
_stun.TryParalyze(target, component.ParalyzeDuration, true);
|
||||
QueueDel(uid);
|
||||
}
|
||||
}
|
||||
@@ -5,10 +5,12 @@ using Content.Shared.Damage;
|
||||
using Content.Shared.Humanoid;
|
||||
using Content.Shared.Interaction;
|
||||
using Content.Shared.Maps;
|
||||
using Content.Shared.Mobs.Components;
|
||||
using Content.Shared.Mobs.Systems;
|
||||
using Content.Shared.WhiteDream.BloodCult;
|
||||
using Content.Shared.WhiteDream.BloodCult.BloodCultist;
|
||||
using Content.Shared.WhiteDream.BloodCult.Components;
|
||||
using Content.Shared.WhiteDream.BloodCult.Constructs;
|
||||
using Robust.Server.Audio;
|
||||
using Robust.Server.GameObjects;
|
||||
using Robust.Shared.Audio;
|
||||
@@ -125,11 +127,11 @@ public sealed class PylonSystem : EntitySystem
|
||||
{
|
||||
var pylonPosition = Transform(pylon).Coordinates;
|
||||
var targets =
|
||||
_lookup.GetEntitiesInRange<HumanoidAppearanceComponent>(pylonPosition, pylon.Comp.HealingAuraRange);
|
||||
_lookup.GetEntitiesInRange<MobStateComponent>(pylonPosition, pylon.Comp.HealingAuraRange);
|
||||
|
||||
foreach (var target in targets)
|
||||
{
|
||||
if (HasComp<BloodCultistComponent>(target) && !_mobState.IsDead(target))
|
||||
if ((HasComp<BloodCultistComponent>(target) || HasComp<ConstructComponent>(target)) && !_mobState.IsDead(target))
|
||||
_damageable.TryChangeDamage(target, pylon.Comp.Healing, true);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,10 +1,8 @@
|
||||
using Content.Server.Actions;
|
||||
using Content.Server.Cuffs;
|
||||
using Content.Server.DoAfter;
|
||||
using Content.Server.Emp;
|
||||
using Content.Server.Hands.Systems;
|
||||
using Content.Server.Popups;
|
||||
using Content.Server.Stunnable;
|
||||
using Content.Shared.Abilities.Psionics;
|
||||
using Content.Shared.Actions;
|
||||
using Content.Shared.Actions.Events;
|
||||
@@ -14,7 +12,6 @@ using Content.Shared.Inventory;
|
||||
using Content.Shared.Mindshield.Components;
|
||||
using Content.Shared.Popups;
|
||||
using Content.Shared.RadialSelector;
|
||||
using Content.Shared.Speech.Muting;
|
||||
using Content.Shared.StatusEffect;
|
||||
using Content.Shared.Verbs;
|
||||
using Content.Shared.WhiteDream.BloodCult.Spells;
|
||||
@@ -30,14 +27,12 @@ public sealed class BloodCultSpellsSystem : EntitySystem
|
||||
|
||||
[Dependency] private readonly ActionsSystem _actions = default!;
|
||||
[Dependency] private readonly DoAfterSystem _doAfter = default!;
|
||||
[Dependency] private readonly CuffableSystem _cuffable = default!;
|
||||
[Dependency] private readonly EmpSystem _empSystem = default!;
|
||||
[Dependency] private readonly HandsSystem _hands = default!;
|
||||
[Dependency] private readonly InventorySystem _inventory = default!;
|
||||
[Dependency] private readonly TransformSystem _transform = default!;
|
||||
[Dependency] private readonly PopupSystem _popup = default!;
|
||||
[Dependency] private readonly StatusEffectsSystem _statusEffects = default!;
|
||||
[Dependency] private readonly StunSystem _stun = default!;
|
||||
[Dependency] private readonly UserInterfaceSystem _ui = default!;
|
||||
|
||||
public override void Initialize()
|
||||
@@ -53,9 +48,7 @@ public sealed class BloodCultSpellsSystem : EntitySystem
|
||||
SubscribeLocalEvent<BloodCultSpellsHolderComponent, RadialSelectorSelectedMessage>(OnSpellSelected);
|
||||
SubscribeLocalEvent<BloodCultSpellsHolderComponent, CreateSpeellDoAfterEvent>(OnSpellCreated);
|
||||
|
||||
SubscribeLocalEvent<BloodCultStunEvent>(OnStun);
|
||||
SubscribeLocalEvent<BloodCultEmpEvent>(OnEmp);
|
||||
SubscribeLocalEvent<BloodCultShacklesEvent>(OnShackles);
|
||||
SubscribeLocalEvent<SummonEquipmentEvent>(OnSummonEquipment);
|
||||
}
|
||||
|
||||
@@ -170,16 +163,6 @@ public sealed class BloodCultSpellsSystem : EntitySystem
|
||||
|
||||
#region SpellsHandlers
|
||||
|
||||
private void OnStun(BloodCultStunEvent ev)
|
||||
{
|
||||
if (ev.Handled)
|
||||
return;
|
||||
|
||||
_statusEffects.TryAddStatusEffect<MutedComponent>(ev.Target, "Muted", ev.MuteDuration, true);
|
||||
_stun.TryParalyze(ev.Target, ev.ParalyzeDuration, true);
|
||||
ev.Handled = true;
|
||||
}
|
||||
|
||||
private void OnEmp(BloodCultEmpEvent ev)
|
||||
{
|
||||
if (ev.Handled)
|
||||
@@ -189,20 +172,6 @@ public sealed class BloodCultSpellsSystem : EntitySystem
|
||||
ev.Handled = true;
|
||||
}
|
||||
|
||||
private void OnShackles(BloodCultShacklesEvent ev)
|
||||
{
|
||||
if (ev.Handled)
|
||||
return;
|
||||
|
||||
var shuckles = Spawn(ev.ShacklesProto);
|
||||
if (!_cuffable.TryAddNewCuffs(ev.Target, ev.Performer, shuckles))
|
||||
return;
|
||||
|
||||
_stun.TryKnockdown(ev.Target, ev.KnockdownDuration, true);
|
||||
_statusEffects.TryAddStatusEffect<MutedComponent>(ev.Target, "Muted", ev.MuteDuration, true);
|
||||
ev.Handled = true;
|
||||
}
|
||||
|
||||
private void OnSummonEquipment(SummonEquipmentEvent ev)
|
||||
{
|
||||
if (ev.Handled)
|
||||
@@ -211,7 +180,14 @@ public sealed class BloodCultSpellsSystem : EntitySystem
|
||||
foreach (var (slot, protoId) in ev.Prototypes)
|
||||
{
|
||||
var entity = Spawn(protoId, _transform.GetMapCoordinates(ev.Performer));
|
||||
_hands.TryPickupAnyHand(ev.Performer, entity);
|
||||
if (!_hands.TryPickupAnyHand(ev.Performer, entity) && !ev.Force)
|
||||
{
|
||||
_popup.PopupEntity(Loc.GetString("cult-magic-no-empty-hand"), ev.Performer, ev.Performer);
|
||||
_actions.SetCooldown(ev.Action, TimeSpan.FromSeconds(1));
|
||||
QueueDel(entity);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!TryComp(entity, out ClothingComponent? _))
|
||||
continue;
|
||||
|
||||
|
||||
@@ -867,8 +867,8 @@ public abstract class SharedActionsSystem : EntitySystem
|
||||
Dirty(actionId.Value, action);
|
||||
Dirty(performer, comp);
|
||||
ActionRemoved(performer, actionId.Value, comp, action);
|
||||
if (action.Temporary)
|
||||
QueueDel(actionId.Value);
|
||||
if (action.Temporary && GameTiming.IsFirstTimePredicted) // WD EDIT
|
||||
Del(actionId.Value); // WD EDIT
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -1,16 +1,20 @@
|
||||
using System.Numerics;
|
||||
using Content.Shared._White.DeleteOnDropAttempt;
|
||||
using Content.Shared.Hands.Components;
|
||||
using Content.Shared.Interaction;
|
||||
using Content.Shared.Inventory.VirtualItem;
|
||||
using Content.Shared.Tag;
|
||||
using Robust.Shared.Containers;
|
||||
using Robust.Shared.Map;
|
||||
using Robust.Shared.Network;
|
||||
|
||||
namespace Content.Shared.Hands.EntitySystems;
|
||||
|
||||
public abstract partial class SharedHandsSystem
|
||||
{
|
||||
[Dependency] private readonly TagSystem _tagSystem = default!;
|
||||
[Dependency] private readonly INetManager _net = default!; // WD EDIT
|
||||
|
||||
private void InitializeDrop()
|
||||
{
|
||||
SubscribeLocalEvent<HandsComponent, EntRemovedFromContainerMessage>(HandleEntityRemoved);
|
||||
@@ -61,6 +65,14 @@ public abstract partial class SharedHandsSystem
|
||||
if (hand.Container?.ContainedEntity is not {} held)
|
||||
return false;
|
||||
|
||||
// WD EDIT START
|
||||
if (HasComp<DeleteOnDropAttemptComponent>(held) && _net.IsServer)
|
||||
{
|
||||
QueueDel(held);
|
||||
return false;
|
||||
}
|
||||
// WD EDIT END
|
||||
|
||||
if (!ContainerSystem.CanRemove(held, hand.Container))
|
||||
return false;
|
||||
|
||||
|
||||
@@ -85,7 +85,7 @@ public abstract partial class SharedProjectileSystem : EntitySystem
|
||||
RemoveEmbed(uid, component, args.User);
|
||||
}
|
||||
|
||||
private void RemoveEmbed(EntityUid uid, EmbeddableProjectileComponent component, EntityUid? remover = null)
|
||||
public void RemoveEmbed(EntityUid uid, EmbeddableProjectileComponent component, EntityUid? remover = null) // WD EDIT
|
||||
{
|
||||
component.AutoRemoveTime = null;
|
||||
component.Target = null;
|
||||
|
||||
@@ -1,15 +1,15 @@
|
||||
using Robust.Shared.GameStates;
|
||||
using Robust.Shared.Prototypes;
|
||||
|
||||
namespace Content.Shared.SimpleStation14.Clothing
|
||||
{
|
||||
[RegisterComponent]
|
||||
public sealed partial class ClothingGrantComponentComponent : Component
|
||||
{
|
||||
[DataField("component", required: true)]
|
||||
[AlwaysPushInheritance]
|
||||
public ComponentRegistry Components { get; private set; } = new();
|
||||
namespace Content.Shared.SimpleStation14.Clothing;
|
||||
|
||||
[ViewVariables(VVAccess.ReadWrite)]
|
||||
public bool IsActive = false;
|
||||
}
|
||||
[RegisterComponent, NetworkedComponent] // WD EDIT
|
||||
public sealed partial class ClothingGrantComponentComponent : Component
|
||||
{
|
||||
[DataField("component", required: true)]
|
||||
[AlwaysPushInheritance]
|
||||
public ComponentRegistry Components { get; private set; } = new();
|
||||
|
||||
[ViewVariables(VVAccess.ReadWrite)]
|
||||
public bool IsActive = false;
|
||||
}
|
||||
|
||||
@@ -2,6 +2,8 @@ using Content.Shared.Clothing.Components;
|
||||
using Content.Shared.Inventory.Events;
|
||||
using Robust.Shared.Serialization.Manager;
|
||||
using Content.Shared.Tag;
|
||||
using Robust.Shared.Timing;
|
||||
|
||||
|
||||
namespace Content.Shared.SimpleStation14.Clothing;
|
||||
|
||||
@@ -10,6 +12,7 @@ public sealed class ClothingGrantingSystem : EntitySystem
|
||||
[Dependency] private readonly IComponentFactory _componentFactory = default!;
|
||||
[Dependency] private readonly ISerializationManager _serializationManager = default!;
|
||||
[Dependency] private readonly TagSystem _tagSystem = default!;
|
||||
[Dependency] private readonly IGameTiming _timing = default!; // WD EDIT
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
@@ -24,6 +27,12 @@ public sealed class ClothingGrantingSystem : EntitySystem
|
||||
|
||||
private void OnCompEquip(EntityUid uid, ClothingGrantComponentComponent component, GotEquippedEvent args)
|
||||
{
|
||||
// WD EDIT START
|
||||
if (!_timing.IsFirstTimePredicted
|
||||
|| _timing.ApplyingState)
|
||||
return;
|
||||
// WD EDIT END
|
||||
|
||||
if (!TryComp<ClothingComponent>(uid, out var clothing)) return;
|
||||
|
||||
if (!clothing.Slots.HasFlag(args.SlotFlags)) return;
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using Content.Shared.Antag;
|
||||
using Content.Shared.Language;
|
||||
using Content.Shared.StatusIcon;
|
||||
using Robust.Shared.Prototypes;
|
||||
|
||||
@@ -19,6 +20,12 @@ public sealed partial class ConstructComponent : Component, IAntagStatusIconComp
|
||||
[DataField]
|
||||
public ProtoId<StatusIconPrototype> StatusIcon { get; set; } = "BloodCultMember";
|
||||
|
||||
[DataField]
|
||||
public ProtoId<LanguagePrototype> CultLanguageId { get; set; } = "Eldritch";
|
||||
|
||||
[DataField]
|
||||
public ProtoId<EntityPrototype> SpawnOnDeathPrototype { get; set; } = "Ectoplasm";
|
||||
|
||||
[DataField]
|
||||
public bool IconVisibleToGhost { get; set; } = true;
|
||||
|
||||
|
||||
@@ -9,20 +9,6 @@ using Robust.Shared.Serialization;
|
||||
|
||||
namespace Content.Shared.WhiteDream.BloodCult.Spells;
|
||||
|
||||
public sealed partial class BloodCultStunEvent : EntityTargetActionEvent, ISpeakSpell
|
||||
{
|
||||
[DataField]
|
||||
public TimeSpan ParalyzeDuration = TimeSpan.FromSeconds(16);
|
||||
|
||||
[DataField]
|
||||
public TimeSpan MuteDuration = TimeSpan.FromSeconds(12);
|
||||
|
||||
[DataField]
|
||||
public string? Speech { get; set; }
|
||||
|
||||
public InGameICChatType ChatType => InGameICChatType.Whisper;
|
||||
}
|
||||
|
||||
public sealed partial class BloodCultTeleportEvent : EntityTargetActionEvent, ISpeakSpell
|
||||
{
|
||||
[DataField]
|
||||
@@ -54,23 +40,6 @@ public sealed partial class BloodCultEmpEvent : InstantActionEvent, ISpeakSpell
|
||||
public InGameICChatType ChatType => InGameICChatType.Whisper;
|
||||
}
|
||||
|
||||
public sealed partial class BloodCultShacklesEvent : EntityTargetActionEvent, ISpeakSpell
|
||||
{
|
||||
[DataField]
|
||||
public EntProtoId ShacklesProto = "ShadowShackles";
|
||||
|
||||
[DataField]
|
||||
public TimeSpan MuteDuration = TimeSpan.FromSeconds(5);
|
||||
|
||||
[DataField]
|
||||
public TimeSpan KnockdownDuration = TimeSpan.FromSeconds(1);
|
||||
|
||||
[DataField]
|
||||
public string? Speech { get; set; }
|
||||
|
||||
public InGameICChatType ChatType => InGameICChatType.Whisper;
|
||||
}
|
||||
|
||||
public sealed partial class BloodCultTwistedConstructionEvent : EntityTargetActionEvent, ISpeakSpell
|
||||
{
|
||||
[DataField]
|
||||
@@ -90,6 +59,9 @@ public sealed partial class SummonEquipmentEvent : InstantActionEvent, ISpeakSpe
|
||||
[DataField]
|
||||
public string? Speech { get; set; }
|
||||
|
||||
[DataField]
|
||||
public bool Force { get; set; } = true;
|
||||
|
||||
public InGameICChatType ChatType => InGameICChatType.Whisper;
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
namespace Content.Shared._White.DeleteOnDropAttempt;
|
||||
|
||||
[RegisterComponent]
|
||||
public sealed partial class DeleteOnDropAttemptComponent : Component;
|
||||
@@ -4,11 +4,13 @@ using Robust.Shared.GameStates;
|
||||
|
||||
namespace Content.Shared._White.Overlays;
|
||||
|
||||
[RegisterComponent, NetworkedComponent]
|
||||
[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
|
||||
public sealed partial class NightVisionComponent : SwitchableOverlayComponent
|
||||
{
|
||||
[DataField, AutoNetworkedField]
|
||||
public override string? ToggleAction { get; set; } = "ToggleNightVision";
|
||||
|
||||
[DataField, AutoNetworkedField]
|
||||
public override Color Color { get; set; } = Color.FromHex("#98FB98");
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
blood-cult-spells-too-many = Too many spells already selected.
|
||||
blood-cult-spells-no-empty-hand = You need a free hand to use the spell!
|
||||
blood-cult-spells-too-many = Too many spells already selected.
|
||||
blood-cult-no-spells = You have no spells selected.
|
||||
|
||||
blood-cult-select-spells-verb = Prepare blood spells
|
||||
blood-cult-remove-spells-verb = Remove blood spells
|
||||
blood-cult-remove-spells-verb = Remove blood spells
|
||||
@@ -7,22 +7,18 @@
|
||||
- type: Sprite
|
||||
sprite: WhiteDream/BloodCult/actions.rsi
|
||||
state: stun
|
||||
- type: EntityTargetAction
|
||||
checkCanAccess: false
|
||||
range: 3
|
||||
- type: InstantAction
|
||||
itemIconStyle: BigAction
|
||||
charges: 1
|
||||
useDelay: 3
|
||||
temporary: true
|
||||
canTargetSelf: false
|
||||
interactOnMiss: false
|
||||
whitelist:
|
||||
components:
|
||||
- Body
|
||||
icon:
|
||||
sprite: WhiteDream/BloodCult/actions.rsi
|
||||
state: stun
|
||||
event: !type:BloodCultStunEvent
|
||||
speech: "Fuu ma'jin!"
|
||||
event: !type:SummonEquipmentEvent
|
||||
prototypes:
|
||||
hand1: StunAura
|
||||
force: false
|
||||
- type: BaseCultSpell
|
||||
|
||||
- type: entity
|
||||
@@ -66,7 +62,7 @@
|
||||
temporary: true
|
||||
icon:
|
||||
sprite: WhiteDream/BloodCult/actions.rsi
|
||||
state: teleport
|
||||
state: create_emp
|
||||
event: !type:BloodCultEmpEvent
|
||||
speech: "Ta'gh fara'qha fel d'amar det!"
|
||||
- type: BaseCultSpell
|
||||
@@ -80,22 +76,18 @@
|
||||
- type: Sprite
|
||||
sprite: WhiteDream/BloodCult/actions.rsi
|
||||
state: shackles
|
||||
- type: EntityTargetAction
|
||||
checkCanAccess: false
|
||||
range: 3
|
||||
- type: InstantAction
|
||||
itemIconStyle: BigAction
|
||||
charges: 4
|
||||
useDelay: 3
|
||||
temporary: true
|
||||
canTargetSelf: false
|
||||
interactOnMiss: false
|
||||
whitelist:
|
||||
components:
|
||||
- Body
|
||||
icon:
|
||||
sprite: WhiteDream/BloodCult/actions.rsi
|
||||
state: shackles
|
||||
event: !type:BloodCultShacklesEvent
|
||||
speech: "In'totum Lig'abis!"
|
||||
event: !type:SummonEquipmentEvent
|
||||
prototypes:
|
||||
hand1: ShadowShacklesAura
|
||||
force: false
|
||||
- type: BaseCultSpell
|
||||
|
||||
- type: entity
|
||||
@@ -192,6 +184,7 @@
|
||||
speech: "Fel'th Dol Ab'orod!"
|
||||
prototypes:
|
||||
hand1: BloodRitesAura
|
||||
force: false
|
||||
- type: BaseCultSpell
|
||||
|
||||
- type: entity
|
||||
|
||||
@@ -112,6 +112,14 @@
|
||||
- type: Clothing
|
||||
sprite: Clothing/Eyes/Misc/blindfold.rsi
|
||||
- type: FlashImmunity
|
||||
- type: EyeProtection
|
||||
- type: ClothingGrantComponent
|
||||
component:
|
||||
- type: NightVision
|
||||
toggleAction: null
|
||||
activateSound: null
|
||||
deactivateSound: null
|
||||
color: White
|
||||
- type: ShowHealthBars
|
||||
damageContainers:
|
||||
- Biological
|
||||
@@ -119,5 +127,3 @@
|
||||
- type: ShowHealthIcons
|
||||
damageContainers:
|
||||
- Biological
|
||||
# TODO: ADD NIGHT VISION
|
||||
|
||||
|
||||
@@ -107,6 +107,8 @@
|
||||
understands:
|
||||
- TauCetiBasic
|
||||
- Eldritch
|
||||
- type: LanguageSpeaker
|
||||
- type: StatusIcon
|
||||
|
||||
- type: entity
|
||||
id: ConstructJuggernaut
|
||||
|
||||
@@ -0,0 +1,70 @@
|
||||
- type: entity
|
||||
parent: BaseItem
|
||||
id: BaseBloodCultAura
|
||||
name: blood aura
|
||||
description: A sinister looking aura that distorts the flow of reality around it.
|
||||
abstract: true
|
||||
categories: [ HideSpawnMenu ]
|
||||
components:
|
||||
- type: Item
|
||||
size: Ginormous
|
||||
- type: MeleeWeapon
|
||||
damage:
|
||||
types:
|
||||
Blunt: 0
|
||||
heavyStaminaCost: 0
|
||||
maxTargets: 1
|
||||
canHeavyAttack: false
|
||||
animation: WeaponArcSlash
|
||||
angle: 1
|
||||
- type: Unremoveable
|
||||
deleteOnDrop: true
|
||||
- type: CultItem
|
||||
- type: DeleteOnDropAttempt
|
||||
|
||||
- type: entity
|
||||
parent: BaseBloodCultAura
|
||||
id: BloodRitesAura
|
||||
name: blood rite aura
|
||||
description: Absorbs blood from anything you touch. Touching cultists and constructs can heal them. Use in-hand to cast an advanced rite.
|
||||
components:
|
||||
- type: Sprite
|
||||
sprite: WhiteDream/BloodCult/Entities/Items/rites.rsi
|
||||
state: icon
|
||||
- type: BloodRitesAura
|
||||
- type: UserInterface
|
||||
interfaces:
|
||||
enum.BloodRitesUiKey.Key:
|
||||
type: BloodRitesUi
|
||||
- type: ActivatableUI
|
||||
key: enum.BloodRitesUiKey.Key
|
||||
inHandsOnly: true
|
||||
requireActiveHand: false
|
||||
|
||||
- type: entity
|
||||
parent: BaseBloodCultAura
|
||||
id: StunAura
|
||||
name: stunning aura
|
||||
description: Will stun and mute a weak-minded victim on hit.
|
||||
components:
|
||||
- type: Sprite
|
||||
sprite: WhiteDream/BloodCult/Entities/Items/stun.rsi
|
||||
state: icon
|
||||
- type: Item
|
||||
sprite: WhiteDream/BloodCult/Entities/Items/stun.rsi
|
||||
- type: StunAura
|
||||
speech: Fuu ma'jin!
|
||||
|
||||
- type: entity
|
||||
parent: BaseBloodCultAura
|
||||
id: ShadowShacklesAura
|
||||
name: shadow shackles aura
|
||||
description: Will shackles the target with shadow shackles on hit.
|
||||
components:
|
||||
- type: Sprite
|
||||
sprite: WhiteDream/BloodCult/Entities/Items/shadow_shaсkles.rsi
|
||||
state: icon
|
||||
- type: Item
|
||||
sprite: WhiteDream/BloodCult/Entities/Items/shadow_shaсkles.rsi
|
||||
- type: ShadowShacklesAura
|
||||
speech: In'totum Lig'abis!
|
||||
@@ -144,28 +144,4 @@
|
||||
- type: DisarmMalus
|
||||
- type: CultItem
|
||||
- type: BloodSpear
|
||||
|
||||
- type: entity
|
||||
parent: BaseItem
|
||||
id: BloodRitesAura
|
||||
name: blood rite aura
|
||||
description: Absorbs blood from anything you touch. Touching cultists and constructs can heal them. Use in-hand to cast an advanced rite.
|
||||
components:
|
||||
- type: Sprite
|
||||
sprite: WhiteDream/BloodCult/Entities/Items/rites.rsi
|
||||
state: icon
|
||||
- type: MeleeWeapon
|
||||
damage:
|
||||
types:
|
||||
Blunt: 0
|
||||
heavyStaminaCost: 0
|
||||
maxTargets: 1
|
||||
- type: BloodRitesAura
|
||||
- type: UserInterface
|
||||
interfaces:
|
||||
enum.BloodRitesUiKey.Key:
|
||||
type: BloodRitesUi
|
||||
- type: ActivatableUI
|
||||
key: enum.BloodRitesUiKey.Key
|
||||
inHandsOnly: true
|
||||
requireActiveHand: false
|
||||
- type: ThrowingItemModifier
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"version": 1,
|
||||
"license": "CC-BY-SA-3.0",
|
||||
"copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/pull/49264/commits/d0dffe7ca643db2624424fdcebf45863f85c0448",
|
||||
"copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/blob/master/icons/obj/weapons/hand.dmi",
|
||||
"size": {
|
||||
"x": 32,
|
||||
"y": 32
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 6.3 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 5.8 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 5.8 KiB |
@@ -0,0 +1,66 @@
|
||||
{
|
||||
"version": 1,
|
||||
"license": "CC-BY-SA-3.0",
|
||||
"copyright": "Made by Spatison(GitHub)",
|
||||
"size": {
|
||||
"x": 32,
|
||||
"y": 32
|
||||
},
|
||||
"states": [
|
||||
{
|
||||
"name": "icon"
|
||||
},
|
||||
{
|
||||
"name": "inhand-left",
|
||||
"directions": 4,
|
||||
"delays": [
|
||||
[
|
||||
0.1,
|
||||
0.1,
|
||||
0.1
|
||||
],
|
||||
[
|
||||
0.1,
|
||||
0.1,
|
||||
0.1
|
||||
],
|
||||
[
|
||||
0.1,
|
||||
0.1,
|
||||
0.1
|
||||
],
|
||||
[
|
||||
0.1,
|
||||
0.1,
|
||||
0.1
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "inhand-right",
|
||||
"directions": 4,
|
||||
"delays": [
|
||||
[
|
||||
0.1,
|
||||
0.1,
|
||||
0.1
|
||||
],
|
||||
[
|
||||
0.1,
|
||||
0.1,
|
||||
0.1
|
||||
],
|
||||
[
|
||||
0.1,
|
||||
0.1,
|
||||
0.1
|
||||
],
|
||||
[
|
||||
0.1,
|
||||
0.1,
|
||||
0.1
|
||||
]
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 1.4 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 508 B |
Binary file not shown.
|
After Width: | Height: | Size: 504 B |
@@ -0,0 +1,66 @@
|
||||
{
|
||||
"version": 1,
|
||||
"license": "CC-BY-SA-3.0",
|
||||
"copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/blob/master/icons/obj/weapons/hand.dmi",
|
||||
"size": {
|
||||
"x": 32,
|
||||
"y": 32
|
||||
},
|
||||
"states": [
|
||||
{
|
||||
"name": "icon"
|
||||
},
|
||||
{
|
||||
"name": "inhand-left",
|
||||
"directions": 4,
|
||||
"delays": [
|
||||
[
|
||||
0.1,
|
||||
0.1,
|
||||
0.1
|
||||
],
|
||||
[
|
||||
0.1,
|
||||
0.1,
|
||||
0.1
|
||||
],
|
||||
[
|
||||
0.1,
|
||||
0.1,
|
||||
0.1
|
||||
],
|
||||
[
|
||||
0.1,
|
||||
0.1,
|
||||
0.1
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "inhand-right",
|
||||
"directions": 4,
|
||||
"delays": [
|
||||
[
|
||||
0.1,
|
||||
0.1,
|
||||
0.1
|
||||
],
|
||||
[
|
||||
0.1,
|
||||
0.1,
|
||||
0.1
|
||||
],
|
||||
[
|
||||
0.1,
|
||||
0.1,
|
||||
0.1
|
||||
],
|
||||
[
|
||||
0.1,
|
||||
0.1,
|
||||
0.1
|
||||
]
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
Reference in New Issue
Block a user