- add: Revive 2.0. (#318)
This commit is contained in:
@@ -37,8 +37,10 @@ using Content.Shared._White.Cult.Components;
|
|||||||
using Content.Shared._White.Cult.Runes;
|
using Content.Shared._White.Cult.Runes;
|
||||||
using Content.Shared._White.Cult.UI;
|
using Content.Shared._White.Cult.UI;
|
||||||
using Content.Shared.Cuffs;
|
using Content.Shared.Cuffs;
|
||||||
|
using Content.Shared.FixedPoint;
|
||||||
using Content.Shared.GameTicking;
|
using Content.Shared.GameTicking;
|
||||||
using Content.Shared.Mindshield.Components;
|
using Content.Shared.Mindshield.Components;
|
||||||
|
using Content.Shared.Mobs.Systems;
|
||||||
using Content.Shared.Movement.Pulling.Components;
|
using Content.Shared.Movement.Pulling.Components;
|
||||||
using Content.Shared.Movement.Pulling.Systems;
|
using Content.Shared.Movement.Pulling.Systems;
|
||||||
using Content.Shared.UserInterface;
|
using Content.Shared.UserInterface;
|
||||||
@@ -74,6 +76,8 @@ public sealed partial class CultSystem : EntitySystem
|
|||||||
[Dependency] private readonly PullingSystem _pulling = default!;
|
[Dependency] private readonly PullingSystem _pulling = default!;
|
||||||
[Dependency] private readonly SharedCuffableSystem _cuffable = default!;
|
[Dependency] private readonly SharedCuffableSystem _cuffable = default!;
|
||||||
[Dependency] private readonly SolutionContainerSystem _solutionContainerSystem = default!;
|
[Dependency] private readonly SolutionContainerSystem _solutionContainerSystem = default!;
|
||||||
|
[Dependency] private readonly MobStateSystem _mobState = default!;
|
||||||
|
[Dependency] private readonly MobThresholdSystem _thresholdSystem = default!;
|
||||||
|
|
||||||
public override void Initialize()
|
public override void Initialize()
|
||||||
{
|
{
|
||||||
@@ -821,8 +825,7 @@ public sealed partial class CultSystem : EntitySystem
|
|||||||
var targets =
|
var targets =
|
||||||
_lookup.GetEntitiesInRange(uid, component.RangeTarget, LookupFlags.Dynamic | LookupFlags.Sundries);
|
_lookup.GetEntitiesInRange(uid, component.RangeTarget, LookupFlags.Dynamic | LookupFlags.Sundries);
|
||||||
|
|
||||||
targets.RemoveWhere(x =>
|
targets.RemoveWhere(x => !_entityManager.HasComponent<HumanoidAppearanceComponent>(x));
|
||||||
!_entityManager.HasComponent<HumanoidAppearanceComponent>(x) || !HasComp<CultistComponent>(x));
|
|
||||||
|
|
||||||
if (targets.Count == 0)
|
if (targets.Count == 0)
|
||||||
return;
|
return;
|
||||||
@@ -832,12 +835,7 @@ public sealed partial class CultSystem : EntitySystem
|
|||||||
if (victim == null)
|
if (victim == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
_entityManager.TryGetComponent<MobStateComponent>(victim.Value, out var state);
|
if (_mobState.IsAlive(victim.Value))
|
||||||
|
|
||||||
if (state == null)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (state.CurrentState != MobState.Dead && state.CurrentState != MobState.Critical)
|
|
||||||
{
|
{
|
||||||
_popupSystem.PopupEntity(Loc.GetString("cult-revive-rune-already-alive"), args.User, args.User);
|
_popupSystem.PopupEntity(Loc.GetString("cult-revive-rune-already-alive"), args.User, args.User);
|
||||||
return;
|
return;
|
||||||
@@ -850,15 +848,56 @@ public sealed partial class CultSystem : EntitySystem
|
|||||||
|
|
||||||
private bool Revive(EntityUid target, EntityUid user)
|
private bool Revive(EntityUid target, EntityUid user)
|
||||||
{
|
{
|
||||||
if (CultRuneReviveComponent.ChargesLeft == 0)
|
if (HasComp<CultistComponent>(target))
|
||||||
{
|
{
|
||||||
_popupSystem.PopupEntity(Loc.GetString("cult-revive-rune-no-charges"), user, user);
|
if (CultRuneReviveComponent.ChargesLeft == 0)
|
||||||
return false;
|
{
|
||||||
|
_popupSystem.PopupEntity(Loc.GetString("cult-revive-rune-no-charges"), user, user);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
CultRuneReviveComponent.ChargesLeft--;
|
||||||
|
|
||||||
|
_entityManager.EventBus.RaiseLocalEvent(target, new RejuvenateEvent());
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (!TryComp(target, out DamageableComponent? damageable) ||
|
||||||
|
!TryComp(target, out MobThresholdsComponent? threshold) ||
|
||||||
|
!TryComp(target, out MobStateComponent? mobState))
|
||||||
|
return false;
|
||||||
|
|
||||||
CultRuneReviveComponent.ChargesLeft--;
|
if (!_mobState.IsDead(target, mobState))
|
||||||
|
return false;
|
||||||
|
|
||||||
_entityManager.EventBus.RaiseLocalEvent(target, new RejuvenateEvent());
|
var airlossGroup = _prototypeManager.Index<DamageGroupPrototype>("Airloss");
|
||||||
|
|
||||||
|
var deadThreshold = _thresholdSystem.GetThresholdForState(target, MobState.Dead, threshold);
|
||||||
|
|
||||||
|
if (damageable.Damage.TryGetDamageInGroup(airlossGroup, out var toHeal))
|
||||||
|
{
|
||||||
|
var afterHeal = damageable.TotalDamage - toHeal;
|
||||||
|
if (deadThreshold <= afterHeal)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
var asphyxType = _prototypeManager.Index<DamageTypePrototype>("Asphyxiation");
|
||||||
|
var bloodlossType = _prototypeManager.Index<DamageTypePrototype>("Bloodloss");
|
||||||
|
|
||||||
|
var heal = new Action<DamageTypePrototype>(type =>
|
||||||
|
{
|
||||||
|
if (!damageable.Damage.DamageDict.TryGetValue(type.ID, out var damage))
|
||||||
|
return;
|
||||||
|
|
||||||
|
_damageableSystem.TryChangeDamage(target, new DamageSpecifier(type, -damage));
|
||||||
|
});
|
||||||
|
|
||||||
|
heal(asphyxType);
|
||||||
|
heal(bloodlossType);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (damageable.TotalDamage < deadThreshold)
|
||||||
|
_mobState.ChangeMobState(target, MobState.Critical, mobState, user);
|
||||||
|
}
|
||||||
|
|
||||||
EntityUid? transferTo = null;
|
EntityUid? transferTo = null;
|
||||||
|
|
||||||
@@ -1383,4 +1422,4 @@ public sealed partial class CultSystem : EntitySystem
|
|||||||
/*
|
/*
|
||||||
* Helpers End ----
|
* Helpers End ----
|
||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
ent-SoulShard = камень душ
|
ent-SoulShard = камень душ
|
||||||
.desc = Мистический светящийся осколок.
|
.desc = Мистический светящийся осколок.
|
||||||
|
|
||||||
ent-SoulShardGhost = камень душ
|
ent-SoulShardGhost = камень душ
|
||||||
@@ -57,7 +57,7 @@ ent-SummoningRune = руна призыва
|
|||||||
.desc = Эта руна позволяет мгновенно призвать к руне любого несвязанного культиста. Для использования требуются 2 культиста, стоящих вокруг руны.
|
.desc = Эта руна позволяет мгновенно призвать к руне любого несвязанного культиста. Для использования требуются 2 культиста, стоящих вокруг руны.
|
||||||
|
|
||||||
ent-ReviveRune = руна воскрешения
|
ent-ReviveRune = руна воскрешения
|
||||||
.desc = Каждый раз, когда кого-то приносят в жертву на Руне Преподнесения, этой руне добавляется один глобальный заряд. Размещение трупа культиста на руне и её активация вернет его к жизни, расходуя при этом заряд.
|
.desc = Каждый раз, когда кого-то приносят в жертву на Руне Преподнесения, этой руне добавляется один глобальный заряд. Размещение трупа культиста на руне и её активация вернет его к жизни, расходуя при этом заряд. Руна воскрешения может воскрешать не культистов, не тратя при этом заряды, но она способна излечить их только от удушения и кровопотери.
|
||||||
|
|
||||||
ent-BarrierRune = руна барьера
|
ent-BarrierRune = руна барьера
|
||||||
.desc = При активации на создаёт барьер, блокирующую проход. Может быть повторно активирована, чтобы отменить заклинание.
|
.desc = При активации на создаёт барьер, блокирующую проход. Может быть повторно активирована, чтобы отменить заклинание.
|
||||||
|
|||||||
Reference in New Issue
Block a user