More blood (#514)
* - add: Some construct stuff. * - add: Some rune stuff. * - add: Unvisit. * - add: Better blood rites.
This commit is contained in:
@@ -0,0 +1,7 @@
|
||||
namespace Content.Server._White.Cult.Items.Components;
|
||||
|
||||
public abstract partial class BaseMagicHandComponent : Component
|
||||
{
|
||||
[DataField]
|
||||
public string Speech;
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
using Content.Shared._White.Cult;
|
||||
using Robust.Shared.Audio;
|
||||
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.List;
|
||||
|
||||
namespace Content.Server._White.Cult.Items.Components;
|
||||
|
||||
[RegisterComponent]
|
||||
public sealed partial class CultRitesHandComponent : BaseMagicHandComponent
|
||||
{
|
||||
[DataField]
|
||||
public SoundSpecifier HealSound = new SoundPathSpecifier("/Audio/White/Cult/rites.ogg");
|
||||
|
||||
[DataField]
|
||||
public SoundSpecifier SuckSound = new SoundPathSpecifier("/Audio/White/Cult/enter_blood.ogg");
|
||||
|
||||
[DataField]
|
||||
public float HealModifier = 0.5f;
|
||||
|
||||
[DataField(customTypeSerializer: typeof(PrototypeIdListSerializer<CultistFactoryProductionPrototype>))]
|
||||
public List<string> BloodRites = new ()
|
||||
{
|
||||
"FactoryCultBloodSpear",
|
||||
"FactoryCultBloodBarrage"
|
||||
};
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
namespace Content.Server._White.Cult.Items.Components;
|
||||
|
||||
[RegisterComponent]
|
||||
public sealed partial class CultStunHandComponent : Component
|
||||
public sealed partial class CultStunHandComponent : BaseMagicHandComponent
|
||||
{
|
||||
[DataField]
|
||||
public TimeSpan Duration = TimeSpan.FromSeconds(16);
|
||||
@@ -14,7 +14,4 @@ public sealed partial class CultStunHandComponent : Component
|
||||
|
||||
[DataField]
|
||||
public TimeSpan HaloMuteDuration = TimeSpan.FromSeconds(1);
|
||||
|
||||
[DataField]
|
||||
public string Speech = "Fuu ma'jin!";
|
||||
}
|
||||
|
||||
@@ -1,56 +0,0 @@
|
||||
using Content.Server._White.Cult.Items.Components;
|
||||
using Content.Server.Body.Components;
|
||||
using Content.Server.Body.Systems;
|
||||
using Content.Server.Chat.Systems;
|
||||
using Content.Server.Popups;
|
||||
using Content.Server.Stunnable;
|
||||
using Content.Shared._White.Chaplain;
|
||||
using Content.Shared.Popups;
|
||||
using Content.Shared.StatusEffect;
|
||||
using Content.Shared.Weapons.Melee.Events;
|
||||
|
||||
namespace Content.Server._White.Cult.Items.Systems;
|
||||
|
||||
public sealed class CultStunHandSystem : EntitySystem
|
||||
{
|
||||
[Dependency] private readonly StunSystem _stun = default!;
|
||||
[Dependency] private readonly ChatSystem _chat = default!;
|
||||
[Dependency] private readonly HolyWeaponSystem _holyWeapon = default!;
|
||||
[Dependency] private readonly PopupSystem _popupSystem = default!;
|
||||
[Dependency] private readonly BloodstreamSystem _bloodstream = default!;
|
||||
[Dependency] private readonly StatusEffectsSystem _statusEffects = default!;
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
base.Initialize();
|
||||
|
||||
SubscribeLocalEvent<CultStunHandComponent, MeleeHitEvent>(OnHit);
|
||||
}
|
||||
|
||||
private void OnHit(Entity<CultStunHandComponent> ent, ref MeleeHitEvent args)
|
||||
{
|
||||
if (args.HitEntities.Count == 0)
|
||||
return;
|
||||
|
||||
var target = args.HitEntities[0];
|
||||
var (uid, comp) = ent;
|
||||
|
||||
QueueDel(uid);
|
||||
Spawn("CultStunFlashEffect", Transform(target).Coordinates);
|
||||
_chat.TrySendInGameICMessage(args.User, comp.Speech, InGameICChatType.Whisper, false);
|
||||
if (TryComp(args.User, out BloodstreamComponent? bloodstream))
|
||||
_bloodstream.TryModifyBloodLevel(args.User, -10, bloodstream, createPuddle: false);
|
||||
|
||||
if (_holyWeapon.IsHoldingHolyWeapon(target))
|
||||
{
|
||||
_popupSystem.PopupEntity(Loc.GetString("cult-magic-holy"), args.User, args.User, PopupType.MediumCaution);
|
||||
return;
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
257
Content.Server/_White/Cult/Items/Systems/MagicHandSystem.cs
Normal file
257
Content.Server/_White/Cult/Items/Systems/MagicHandSystem.cs
Normal file
@@ -0,0 +1,257 @@
|
||||
using System.Linq;
|
||||
using Content.Server._White.Cult.Items.Components;
|
||||
using Content.Server.Body.Components;
|
||||
using Content.Server.Body.Systems;
|
||||
using Content.Server.Chat.Systems;
|
||||
using Content.Server.Chemistry.Containers.EntitySystems;
|
||||
using Content.Server.Hands.Systems;
|
||||
using Content.Server.Popups;
|
||||
using Content.Server.Stunnable;
|
||||
using Content.Shared._White.Chaplain;
|
||||
using Content.Shared._White.Cult;
|
||||
using Content.Shared._White.Cult.Components;
|
||||
using Content.Shared._White.Cult.UI;
|
||||
using Content.Shared.Chemistry.Components;
|
||||
using Content.Shared.Damage;
|
||||
using Content.Shared.Examine;
|
||||
using Content.Shared.FixedPoint;
|
||||
using Content.Shared.Fluids.Components;
|
||||
using Content.Shared.Interaction;
|
||||
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;
|
||||
|
||||
namespace Content.Server._White.Cult.Items.Systems;
|
||||
|
||||
public sealed class MagicHandSystem : EntitySystem
|
||||
{
|
||||
[Dependency] private readonly StunSystem _stun = default!;
|
||||
[Dependency] private readonly ChatSystem _chat = default!;
|
||||
[Dependency] private readonly HolyWeaponSystem _holyWeapon = default!;
|
||||
[Dependency] private readonly PopupSystem _popupSystem = default!;
|
||||
[Dependency] private readonly BloodstreamSystem _bloodstream = default!;
|
||||
[Dependency] private readonly StatusEffectsSystem _statusEffects = default!;
|
||||
[Dependency] private readonly DamageableSystem _damageable = default!;
|
||||
[Dependency] private readonly MobStateSystem _mobState = default!;
|
||||
[Dependency] private readonly AudioSystem _audio = default!;
|
||||
[Dependency] private readonly EntityLookupSystem _lookup = default!;
|
||||
[Dependency] private readonly TransformSystem _transform = default!;
|
||||
[Dependency] private readonly SolutionContainerSystem _solutionSystem = default!;
|
||||
[Dependency] private readonly HandsSystem _handsSystem = default!;
|
||||
[Dependency] private readonly UserInterfaceSystem _ui = default!;
|
||||
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
base.Initialize();
|
||||
|
||||
SubscribeLocalEvent<CultStunHandComponent, MeleeHitEvent>(OnStunHit);
|
||||
SubscribeLocalEvent<CultRitesHandComponent, MeleeHitEvent>(OnRitesHit);
|
||||
SubscribeLocalEvent<CultRitesHandComponent, AfterInteractEvent>(OnInteract);
|
||||
SubscribeLocalEvent<CultRitesHandComponent, CultistFactoryItemSelectedMessage>(OnBloodRitesSelected);
|
||||
SubscribeLocalEvent<CultRitesHandComponent, ActivatableUIOpenAttemptEvent>(OnRitesSelectAttempt);
|
||||
SubscribeLocalEvent<CultRitesHandComponent, BeforeActivatableUIOpenEvent>(BeforeRitesSelect);
|
||||
SubscribeLocalEvent<CultRitesHandComponent, ExaminedEvent>(OnExamine);
|
||||
}
|
||||
|
||||
private void OnExamine(Entity<CultRitesHandComponent> ent, ref ExaminedEvent args)
|
||||
{
|
||||
var user = args.Examiner;
|
||||
if (user != Transform(ent).ParentUid || !TryComp(user, out CultistComponent? cultist))
|
||||
return;
|
||||
args.PushMarkup(Loc.GetString("cult-rites-examine", ("blood", cultist.RitesBloodAmount)));
|
||||
}
|
||||
|
||||
private void BeforeRitesSelect(Entity<CultRitesHandComponent> ent, ref BeforeActivatableUIOpenEvent args)
|
||||
{
|
||||
if (_ui.TryGetUi(ent, BloodRitesUi.Key, out var bui))
|
||||
_ui.SetUiState(bui, new CultistFactoryBUIState(ent.Comp.BloodRites));
|
||||
}
|
||||
|
||||
private void OnRitesSelectAttempt(Entity<CultRitesHandComponent> ent, ref ActivatableUIOpenAttemptEvent args)
|
||||
{
|
||||
if (!HasComp<CultistComponent>(args.User))
|
||||
args.Cancel();
|
||||
}
|
||||
|
||||
private void OnBloodRitesSelected(Entity<CultRitesHandComponent> ent, ref CultistFactoryItemSelectedMessage args)
|
||||
{
|
||||
var attachedEntity = args.Session.AttachedEntity;
|
||||
|
||||
if (!TryComp(attachedEntity, out CultistComponent? cultist))
|
||||
return;
|
||||
|
||||
if (!_prototypeManager.TryIndex<CultistFactoryProductionPrototype>(args.Item, out var prototype))
|
||||
return;
|
||||
|
||||
var uid = attachedEntity.Value;
|
||||
|
||||
if (cultist.RitesBloodAmount < prototype.BloodCost)
|
||||
{
|
||||
var message = Loc.GetString("cult-rites-no-blood", ("required", prototype.BloodCost),
|
||||
("blood", cultist.RitesBloodAmount));
|
||||
Popup(message, uid);
|
||||
return;
|
||||
}
|
||||
|
||||
Speak(uid, ent.Comp);
|
||||
Del(ent);
|
||||
|
||||
var success = false;
|
||||
foreach (var entity in prototype.Item.Select(item => Spawn(item, Transform(uid).Coordinates)))
|
||||
{
|
||||
if (_handsSystem.TryPickupAnyHand(uid, entity))
|
||||
{
|
||||
success = true;
|
||||
continue;
|
||||
}
|
||||
|
||||
Popup(Loc.GetString("cult-rites-no-hand"), uid);
|
||||
QueueDel(entity);
|
||||
break;
|
||||
}
|
||||
|
||||
if (!success)
|
||||
return;
|
||||
|
||||
cultist.RitesBloodAmount -= prototype.BloodCost;
|
||||
}
|
||||
|
||||
private void OnInteract(Entity<CultRitesHandComponent> ent, ref AfterInteractEvent args)
|
||||
{
|
||||
if (!args.CanReach || args.Target is not { } target)
|
||||
return;
|
||||
|
||||
var puddleQuery = GetEntityQuery<PuddleComponent>();
|
||||
if (!puddleQuery.HasComp(target))
|
||||
return;
|
||||
|
||||
if (!TryComp(args.User, out BloodstreamComponent? bloodstreamComponent) ||
|
||||
!TryComp(args.User, out CultistComponent? cultist))
|
||||
return;
|
||||
|
||||
var xform = Transform(target);
|
||||
|
||||
var entitiesInRange = _lookup.GetEntitiesInRange(_transform.GetMapCoordinates(xform), 1.5f);
|
||||
|
||||
var totalBloodAmount = FixedPoint2.Zero;
|
||||
|
||||
foreach (var solutionEntity in entitiesInRange.ToList())
|
||||
{
|
||||
if (!puddleQuery.TryComp(solutionEntity, out var puddleComponent))
|
||||
continue;
|
||||
|
||||
if (!_solutionSystem.TryGetSolution(solutionEntity, puddleComponent.SolutionName, out var solution))
|
||||
continue;
|
||||
|
||||
var hasBlood = false;
|
||||
foreach (var solutionContent in solution.Value.Comp.Solution.Contents.ToList()
|
||||
.Where(solutionContent => solutionContent.Reagent.Prototype == "Blood"))
|
||||
{
|
||||
hasBlood = true;
|
||||
totalBloodAmount += solutionContent.Quantity;
|
||||
|
||||
_bloodstream.TryModifyBloodLevel(args.User, solutionContent.Quantity / 6f, bloodstreamComponent);
|
||||
_solutionSystem.RemoveReagent((Entity<SolutionComponent>) solution, "Blood", FixedPoint2.MaxValue);
|
||||
}
|
||||
|
||||
if (hasBlood)
|
||||
Spawn("CultTileEffect", Transform(solutionEntity).Coordinates);
|
||||
}
|
||||
|
||||
if (totalBloodAmount <= FixedPoint2.Zero)
|
||||
return;
|
||||
|
||||
cultist.RitesBloodAmount += totalBloodAmount;
|
||||
|
||||
_audio.PlayPvs(ent.Comp.SuckSound, args.User);
|
||||
_popupSystem.PopupEntity(Loc.GetString("cult-rites-message", ("blood", cultist.RitesBloodAmount)),
|
||||
args.User, args.User);
|
||||
|
||||
args.Handled = true;
|
||||
}
|
||||
|
||||
private void OnRitesHit(Entity<CultRitesHandComponent> ent, ref MeleeHitEvent args)
|
||||
{
|
||||
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))
|
||||
return;
|
||||
|
||||
if (_mobState.IsDead(target))
|
||||
{
|
||||
Popup(Loc.GetString("cult-rites-dead"), args.User);
|
||||
return;
|
||||
}
|
||||
|
||||
if (cultist.RitesBloodAmount <= FixedPoint2.Zero)
|
||||
{
|
||||
Popup(Loc.GetString("cult-rites-heal-no-blood"), args.User);
|
||||
return;
|
||||
}
|
||||
|
||||
var damage = damageable.Damage;
|
||||
var totalDamage = damage.GetTotal();
|
||||
if (totalDamage <= FixedPoint2.Zero)
|
||||
{
|
||||
Popup(Loc.GetString("cult-rites-already-healed"), args.User);
|
||||
return;
|
||||
}
|
||||
|
||||
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);
|
||||
_audio.PlayPvs(comp.HealSound, target);
|
||||
Speak(args.User, comp);
|
||||
}
|
||||
|
||||
private void OnStunHit(Entity<CultStunHandComponent> ent, ref MeleeHitEvent args)
|
||||
{
|
||||
if (args.HitEntities.Count == 0)
|
||||
return;
|
||||
|
||||
var target = args.HitEntities[0];
|
||||
var (uid, comp) = ent;
|
||||
|
||||
QueueDel(uid);
|
||||
Spawn("CultStunFlashEffect", Transform(target).Coordinates);
|
||||
Speak(args.User, comp);
|
||||
if (TryComp(args.User, out BloodstreamComponent? bloodstream))
|
||||
_bloodstream.TryModifyBloodLevel(args.User, -10, bloodstream, createPuddle: false);
|
||||
|
||||
if (_holyWeapon.IsHoldingHolyWeapon(target))
|
||||
{
|
||||
Popup(Loc.GetString("cult-magic-holy"), args.User, PopupType.MediumCaution);
|
||||
return;
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
private void Popup(string msg, EntityUid user, PopupType type = PopupType.Small)
|
||||
{
|
||||
_popupSystem.PopupEntity(msg, user, user, type);
|
||||
}
|
||||
|
||||
private void Speak(EntityUid user, BaseMagicHandComponent comp)
|
||||
{
|
||||
_chat.TrySendInGameICMessage(user, comp.Speech, InGameICChatType.Whisper, false);
|
||||
}
|
||||
}
|
||||
@@ -106,15 +106,7 @@ public partial class CultSystem
|
||||
|
||||
private void OnStun(EntityUid uid, CultistComponent component, CultStunActionEvent args)
|
||||
{
|
||||
var entity = Spawn("StunHand", Transform(uid).Coordinates);
|
||||
if (!_handsSystem.TryPickupAnyHand(uid, entity))
|
||||
{
|
||||
_popupSystem.PopupEntity(Loc.GetString("cult-magic-no-empty-hand"), uid, uid);
|
||||
QueueDel(entity);
|
||||
_actionsSystem.SetCooldown(args.Action, TimeSpan.FromSeconds(1));
|
||||
return;
|
||||
}
|
||||
args.Handled = true;
|
||||
GrantItem(uid, "StunHand", args);
|
||||
}
|
||||
|
||||
private void OnTeleport(EntityUid uid, CultistComponent component, CultTeleportTargetActionEvent args)
|
||||
@@ -150,61 +142,7 @@ public partial class CultSystem
|
||||
|
||||
private void OnBloodRites(EntityUid uid, CultistComponent component, CultBloodRitesInstantActionEvent args)
|
||||
{
|
||||
if (!TryComp<BloodstreamComponent>(args.Performer, out var bloodstreamComponent))
|
||||
return;
|
||||
|
||||
var bruteDamageGroup = _prototypeManager.Index<DamageGroupPrototype>("Brute");
|
||||
var burnDamageGroup = _prototypeManager.Index<DamageGroupPrototype>("Burn");
|
||||
|
||||
var xform = Transform(uid);
|
||||
|
||||
var entitiesInRange = _lookup.GetEntitiesInRange(_transform.GetMapCoordinates(xform), 1.5f);
|
||||
|
||||
FixedPoint2 totalBloodAmount = 0f;
|
||||
|
||||
var breakLoop = false;
|
||||
foreach (var solutionEntity in entitiesInRange.ToList())
|
||||
{
|
||||
if (breakLoop)
|
||||
break;
|
||||
|
||||
if (!TryComp<PuddleComponent>(solutionEntity, out var puddleComponent))
|
||||
continue;
|
||||
|
||||
if (!_solutionSystem.TryGetSolution(solutionEntity, puddleComponent.SolutionName, out var solution))
|
||||
continue;
|
||||
|
||||
foreach (var solutionContent in solution.Value.Comp.Solution.Contents.ToList())
|
||||
{
|
||||
if (solutionContent.Reagent.Prototype != "Blood")
|
||||
continue;
|
||||
|
||||
totalBloodAmount += solutionContent.Quantity;
|
||||
|
||||
_bloodstreamSystem.TryModifyBloodLevel(uid, solutionContent.Quantity / 6f, bloodstreamComponent);
|
||||
_solutionSystem.RemoveReagent((Entity<SolutionComponent>) solution, "Blood", FixedPoint2.MaxValue);
|
||||
|
||||
/*if (GetMissingBloodValue(bloodstreamComponent) == 0)
|
||||
{
|
||||
breakLoop = true;
|
||||
}*/
|
||||
}
|
||||
}
|
||||
|
||||
if (totalBloodAmount == 0f)
|
||||
return;
|
||||
|
||||
component.RitesBloodAmount += totalBloodAmount;
|
||||
|
||||
_audio.PlayPvs("/Audio/White/Cult/enter_blood.ogg", uid, AudioParams.Default);
|
||||
_damageableSystem.TryChangeDamage(uid, new DamageSpecifier(bruteDamageGroup, -20));
|
||||
_damageableSystem.TryChangeDamage(uid, new DamageSpecifier(burnDamageGroup, -20));
|
||||
|
||||
_popupSystem.PopupEntity(Loc.GetString("verb-blood-rites-message", ("blood", component.RitesBloodAmount)), uid,
|
||||
uid);
|
||||
|
||||
Speak(args);
|
||||
args.Handled = true;
|
||||
GrantItem(uid, "RitesHand", args);
|
||||
}
|
||||
|
||||
private static FixedPoint2 GetMissingBloodValue(BloodstreamComponent bloodstreamComponent)
|
||||
@@ -497,4 +435,17 @@ public partial class CultSystem
|
||||
{
|
||||
_spells.Speak(args, InGameICChatType.Whisper);
|
||||
}
|
||||
|
||||
public void GrantItem(EntityUid uid, string proto, InstantActionEvent args)
|
||||
{
|
||||
var entity = Spawn(proto, Transform(uid).Coordinates);
|
||||
if (!_handsSystem.TryPickupAnyHand(uid, entity))
|
||||
{
|
||||
_popupSystem.PopupEntity(Loc.GetString("cult-magic-no-empty-hand"), uid, uid);
|
||||
QueueDel(entity);
|
||||
_actionsSystem.SetCooldown(args.Action, TimeSpan.FromSeconds(1));
|
||||
return;
|
||||
}
|
||||
args.Handled = true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using Content.Server.GameTicking;
|
||||
using System.Linq;
|
||||
using Content.Server.GameTicking;
|
||||
using Content.Server.GameTicking.Rules.Components;
|
||||
using Content.Server.Popups;
|
||||
using Content.Server._White.Cult.GameRule;
|
||||
@@ -46,9 +47,10 @@ public partial class CultSystem
|
||||
|
||||
private void OnMapInit(EntityUid uid, ConstructComponent component, MapInitEvent args)
|
||||
{
|
||||
foreach (var id in component.Actions)
|
||||
foreach (var action in component.Actions.Select(id => _actionsSystem.AddAction(uid, id)))
|
||||
{
|
||||
component.ActionEntities.Add(_actionsSystem.AddAction(uid, id));
|
||||
_actionsSystem.StartUseDelay(action);
|
||||
component.ActionEntities.Add(action);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -99,7 +99,7 @@ public sealed partial class CultSystem : EntitySystem
|
||||
|
||||
SubscribeLocalEvent<CultEmpowerComponent, CultEmpowerSelectedBuiMessage>(OnEmpowerSelected);
|
||||
SubscribeLocalEvent<CultEmpowerComponent, UseInHandEvent>(OnUseInHand);
|
||||
SubscribeLocalEvent<CultEmpowerComponent, ActivateInWorldEvent>(OnActiveInWorld);
|
||||
SubscribeLocalEvent<CultEmpowerComponent, CultRuneInvokeEvent>(OnActiveInWorld);
|
||||
|
||||
// UI
|
||||
SubscribeLocalEvent<RuneDrawerProviderComponent, ActivatableUIOpenAttemptEvent>(OnRuneDrawAttempt);
|
||||
@@ -396,19 +396,19 @@ public sealed partial class CultSystem : EntitySystem
|
||||
|
||||
if (ev.Result)
|
||||
{
|
||||
OnAfterInvoke(uid, cultists);
|
||||
OnAfterInvoke(uid, cultists, ev.InvokePhraseOverride);
|
||||
}
|
||||
}
|
||||
|
||||
private void OnAfterInvoke(EntityUid rune, HashSet<EntityUid> cultists)
|
||||
private void OnAfterInvoke(EntityUid rune, HashSet<EntityUid> cultists, string? invokePhraseOverride = null)
|
||||
{
|
||||
if (!_entityManager.TryGetComponent<CultRuneBaseComponent>(rune, out var component))
|
||||
return;
|
||||
|
||||
foreach (var cultist in cultists)
|
||||
{
|
||||
_chat.TrySendInGameICMessage(cultist, component.InvokePhrase, component.InvokeChatType, false, false, null,
|
||||
null, null, false);
|
||||
_chat.TrySendInGameICMessage(cultist, invokePhraseOverride ?? component.InvokePhrase,
|
||||
component.InvokeChatType, false, false, null, null, null, false);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -455,16 +455,19 @@ public sealed partial class CultSystem : EntitySystem
|
||||
!HasComp<MindShieldComponent>(victim.Value))
|
||||
{
|
||||
result = Convert(uid, victim.Value, args.User, args.Cultists);
|
||||
args.InvokePhraseOverride = "Mah'weyh pleggh at e'ntrath!";
|
||||
}
|
||||
else
|
||||
{
|
||||
result = Sacrifice(uid, victim.Value, args.User, args.Cultists);
|
||||
args.InvokePhraseOverride = "Barhah hra zar'garis!";
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Жертва мертва, выполняется альтернативное действие
|
||||
result = SacrificeNonObjectiveDead(uid, victim.Value, args.User, args.Cultists);
|
||||
args.InvokePhraseOverride = "Barhah hra zar'garis!";
|
||||
}
|
||||
|
||||
args.Result = result;
|
||||
@@ -1217,13 +1220,14 @@ public sealed partial class CultSystem : EntitySystem
|
||||
* Empower rune start ----
|
||||
*/
|
||||
|
||||
private void OnActiveInWorld(EntityUid uid, CultEmpowerComponent component, ActivateInWorldEvent args)
|
||||
private void OnActiveInWorld(EntityUid uid, CultEmpowerComponent component, CultRuneInvokeEvent args)
|
||||
{
|
||||
if (!component.IsRune || !TryComp<CultistComponent>(args.User, out _) ||
|
||||
!TryComp<ActorComponent>(args.User, out var actor))
|
||||
return;
|
||||
|
||||
_ui.TryOpen(uid, CultEmpowerUiKey.Key, actor.PlayerSession);
|
||||
args.Result = !_ui.SessionHasOpenUi(uid, CultEmpowerUiKey.Key, actor.PlayerSession) &&
|
||||
_ui.TryOpen(uid, CultEmpowerUiKey.Key, actor.PlayerSession);
|
||||
}
|
||||
|
||||
private void OnUseInHand(EntityUid uid, CultEmpowerComponent component, UseInHandEvent args)
|
||||
@@ -1377,6 +1381,7 @@ public sealed partial class CultSystem : EntitySystem
|
||||
var shard = _entityManager.SpawnEntity("SoulShard", transform.Value);
|
||||
|
||||
_mindSystem.TransferTo(mindComponent.Mind.Value, shard);
|
||||
_mindSystem.UnVisit(mindComponent.Mind.Value);
|
||||
|
||||
_bodySystem.GibBody(target);
|
||||
|
||||
|
||||
@@ -2,7 +2,6 @@ using System.Linq;
|
||||
using Content.Server.Body.Components;
|
||||
using Content.Shared._White.Cult;
|
||||
using Content.Shared._White.Cult.Components;
|
||||
using Content.Shared._White.Cult.UI;
|
||||
using Content.Shared.DoAfter;
|
||||
using Content.Shared.Verbs;
|
||||
using Robust.Shared.Player;
|
||||
@@ -17,7 +16,6 @@ public sealed partial class CultSystem
|
||||
SubscribeLocalEvent<CultistComponent, CultEmpowerSelectedBuiMessage>(OnCultistEmpowerSelected);
|
||||
SubscribeLocalEvent<CultistComponent, CultEmpowerRemoveBuiMessage>(OnCultistEmpowerRemove);
|
||||
SubscribeLocalEvent<CultistComponent, SpellCreatedEvent>(OnSpellCreated);
|
||||
SubscribeLocalEvent<CultistComponent, CultistFactoryItemSelectedMessage>(OnBloodRitesSelected);
|
||||
}
|
||||
|
||||
private void OnCultistEmpowerRemove(Entity<CultistComponent> ent, ref CultEmpowerRemoveBuiMessage args)
|
||||
@@ -100,24 +98,8 @@ public sealed partial class CultSystem
|
||||
}
|
||||
};
|
||||
|
||||
var bloodRitesVerb = new Verb
|
||||
{
|
||||
Text = Loc.GetString("verb-blood-rites-text"),
|
||||
Message = Loc.GetString("verb-blood-rites-message", ("blood", ent.Comp.RitesBloodAmount)),
|
||||
Category = VerbCategory.Cult,
|
||||
Act = () =>
|
||||
{
|
||||
if (!_ui.TryGetUi(ent, BloodRitesUi.Key, out var bui))
|
||||
return;
|
||||
|
||||
_ui.SetUiState(bui, new CultistFactoryBUIState(ent.Comp.BloodRites));
|
||||
_ui.OpenUi(bui, actor.PlayerSession);
|
||||
}
|
||||
};
|
||||
|
||||
args.Verbs.Add(createSpellVerb);
|
||||
args.Verbs.Add(removeSpellVerb);
|
||||
args.Verbs.Add(bloodRitesVerb);
|
||||
}
|
||||
|
||||
private void RemoveSpell(Entity<CultistComponent> ent, ICommonSession session)
|
||||
@@ -130,36 +112,4 @@ public sealed partial class CultSystem
|
||||
|
||||
_ui.TryOpen(ent, CultEmpowerRemoveUiKey.Key, session);
|
||||
}
|
||||
|
||||
private void OnBloodRitesSelected(Entity<CultistComponent> ent, ref CultistFactoryItemSelectedMessage args)
|
||||
{
|
||||
if (!_prototypeManager.TryIndex<CultistFactoryProductionPrototype>(args.Item, out var prototype))
|
||||
return;
|
||||
|
||||
if (ent.Comp.RitesBloodAmount < prototype.BloodCost)
|
||||
{
|
||||
var message = Loc.GetString("verb-blood-rites-no-blood", ("required", prototype.BloodCost),
|
||||
("blood", ent.Comp.RitesBloodAmount));
|
||||
_popupSystem.PopupEntity(message, ent, ent);
|
||||
return;
|
||||
}
|
||||
|
||||
var success = false;
|
||||
foreach (var item in prototype.Item)
|
||||
{
|
||||
var entity = Spawn(item, Transform(ent).Coordinates);
|
||||
if (_handsSystem.TryPickupAnyHand(ent, entity))
|
||||
{
|
||||
success = true;
|
||||
continue;
|
||||
}
|
||||
|
||||
_popupSystem.PopupEntity(Loc.GetString("verb-blood-rites-no-hand"), ent, ent);
|
||||
QueueDel(entity);
|
||||
break;
|
||||
}
|
||||
|
||||
if (success)
|
||||
ent.Comp.RitesBloodAmount -= prototype.BloodCost;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user