[Tweak|Fix] Blood Cult (#169)

* fixs: blood cult

* fix

* fix: tupo
This commit is contained in:
Spatison
2024-12-22 15:28:12 +10:00
committed by GitHub
parent 1b458aaf65
commit f25e700781
34 changed files with 475 additions and 133 deletions

View File

@@ -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;

View File

@@ -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);
}
}

View File

@@ -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;
}

View File

@@ -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;

View File

@@ -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);
}

View File

@@ -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);
}
}

View File

@@ -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);
}

View File

@@ -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);
}
}

View File

@@ -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);
}
}

View File

@@ -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;

View File

@@ -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>

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;
}

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;
}

View File

@@ -0,0 +1,4 @@
namespace Content.Shared._White.DeleteOnDropAttempt;
[RegisterComponent]
public sealed partial class DeleteOnDropAttemptComponent : Component;

View File

@@ -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");
}

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -107,6 +107,8 @@
understands:
- TauCetiBasic
- Eldritch
- type: LanguageSpeaker
- type: StatusIcon
- type: entity
id: ConstructJuggernaut

View File

@@ -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!

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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
]
]
}
]
}