adds a source uid to most damage & mobstate events (#11559)
Co-authored-by: Flipp Syder <76629141+vulppine@users.noreply.github.com>
This commit is contained in:
@@ -109,7 +109,7 @@ namespace Content.Server.Atmos.Miasma
|
|||||||
damage.DamageDict.Add("Blunt", 0.3); // Slowly accumulate enough to gib after like half an hour
|
damage.DamageDict.Add("Blunt", 0.3); // Slowly accumulate enough to gib after like half an hour
|
||||||
damage.DamageDict.Add("Cellular", 0.3); // Cloning rework might use this eventually
|
damage.DamageDict.Add("Cellular", 0.3); // Cloning rework might use this eventually
|
||||||
|
|
||||||
_damageableSystem.TryChangeDamage(perishable.Owner, damage, true, true);
|
_damageableSystem.TryChangeDamage(perishable.Owner, damage, true, true, origin: perishable.Owner);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!TryComp<PhysicsComponent>(perishable.Owner, out var physics))
|
if (!TryComp<PhysicsComponent>(perishable.Owner, out var physics))
|
||||||
|
|||||||
@@ -78,7 +78,7 @@ namespace Content.Server.Bed
|
|||||||
if (HasComp<SleepingComponent>(healedEntity))
|
if (HasComp<SleepingComponent>(healedEntity))
|
||||||
damage *= bedComponent.SleepMultiplier;
|
damage *= bedComponent.SleepMultiplier;
|
||||||
|
|
||||||
_damageableSystem.TryChangeDamage(healedEntity, damage, true);
|
_damageableSystem.TryChangeDamage(healedEntity, damage, true, origin: bedComponent.Owner);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -107,7 +107,7 @@ namespace Content.Server.Bible
|
|||||||
_popupSystem.PopupEntity(Loc.GetString("bible-sizzle"), args.User, Filter.Entities(args.User));
|
_popupSystem.PopupEntity(Loc.GetString("bible-sizzle"), args.User, Filter.Entities(args.User));
|
||||||
|
|
||||||
SoundSystem.Play(component.SizzleSoundPath.GetSound(), Filter.Pvs(args.User), args.User);
|
SoundSystem.Play(component.SizzleSoundPath.GetSound(), Filter.Pvs(args.User), args.User);
|
||||||
_damageableSystem.TryChangeDamage(args.User, component.DamageOnUntrainedUse, true);
|
_damageableSystem.TryChangeDamage(args.User, component.DamageOnUntrainedUse, true, origin: uid);
|
||||||
_delay.BeginDelay(uid, delay);
|
_delay.BeginDelay(uid, delay);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
@@ -125,13 +125,13 @@ namespace Content.Server.Bible
|
|||||||
_popupSystem.PopupEntity(selfFailMessage, args.User, Filter.Entities(args.User), PopupType.MediumCaution);
|
_popupSystem.PopupEntity(selfFailMessage, args.User, Filter.Entities(args.User), PopupType.MediumCaution);
|
||||||
|
|
||||||
SoundSystem.Play("/Audio/Effects/hit_kick.ogg", Filter.Pvs(args.Target.Value), args.User);
|
SoundSystem.Play("/Audio/Effects/hit_kick.ogg", Filter.Pvs(args.Target.Value), args.User);
|
||||||
_damageableSystem.TryChangeDamage(args.Target.Value, component.DamageOnFail, true);
|
_damageableSystem.TryChangeDamage(args.Target.Value, component.DamageOnFail, true, origin: uid);
|
||||||
_delay.BeginDelay(uid, delay);
|
_delay.BeginDelay(uid, delay);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var damage = _damageableSystem.TryChangeDamage(args.Target.Value, component.Damage, true);
|
var damage = _damageableSystem.TryChangeDamage(args.Target.Value, component.Damage, true, origin: uid);
|
||||||
|
|
||||||
if (damage == null || damage.Total == 0)
|
if (damage == null || damage.Total == 0)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -111,7 +111,7 @@ namespace Content.Server.Chat
|
|||||||
damagePrototype = _prototypeManager.Index<DamageTypePrototype>(fallback.ToString());
|
damagePrototype = _prototypeManager.Index<DamageTypePrototype>(fallback.ToString());
|
||||||
}
|
}
|
||||||
const int lethalAmountOfDamage = 200; // TODO: Would be nice to get this number from somewhere else
|
const int lethalAmountOfDamage = 200; // TODO: Would be nice to get this number from somewhere else
|
||||||
_damageableSystem.TryChangeDamage(target, new(damagePrototype, lethalAmountOfDamage), true);
|
_damageableSystem.TryChangeDamage(target, new(damagePrototype, lethalAmountOfDamage), true, origin: target);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -148,7 +148,7 @@ public sealed class ClimbSystem : SharedClimbSystem
|
|||||||
_stunSystem.TryParalyze(user, TimeSpan.FromSeconds(component.BonkTime), true);
|
_stunSystem.TryParalyze(user, TimeSpan.FromSeconds(component.BonkTime), true);
|
||||||
|
|
||||||
if (component.BonkDamage is { } bonkDmg)
|
if (component.BonkDamage is { } bonkDmg)
|
||||||
_damageableSystem.TryChangeDamage(user, bonkDmg, true);
|
_damageableSystem.TryChangeDamage(user, bonkDmg, true, origin: user);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -363,8 +363,8 @@ public sealed class ClimbSystem : SharedClimbSystem
|
|||||||
if (TryComp<PhysicsComponent>(args.Climber, out var physics) && physics.Mass <= component.MassLimit)
|
if (TryComp<PhysicsComponent>(args.Climber, out var physics) && physics.Mass <= component.MassLimit)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
_damageableSystem.TryChangeDamage(args.Climber, component.ClimberDamage);
|
_damageableSystem.TryChangeDamage(args.Climber, component.ClimberDamage, origin: args.Climber);
|
||||||
_damageableSystem.TryChangeDamage(uid, component.TableDamage);
|
_damageableSystem.TryChangeDamage(uid, component.TableDamage, origin: args.Climber);
|
||||||
_stunSystem.TryParalyze(args.Climber, TimeSpan.FromSeconds(component.StunTime), true);
|
_stunSystem.TryParalyze(args.Climber, TimeSpan.FromSeconds(component.StunTime), true);
|
||||||
|
|
||||||
// Not shown to the user, since they already get a 'you climb on the glass table' popup
|
// Not shown to the user, since they already get a 'you climb on the glass table' popup
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ namespace Content.Server.Damage.Systems
|
|||||||
&& welder.Lit
|
&& welder.Lit
|
||||||
&& !welder.TankSafe)
|
&& !welder.TankSafe)
|
||||||
{
|
{
|
||||||
var dmg = _damageableSystem.TryChangeDamage(args.Target, weldingDamage);
|
var dmg = _damageableSystem.TryChangeDamage(args.Target, weldingDamage, origin: args.User);
|
||||||
|
|
||||||
if (dmg != null)
|
if (dmg != null)
|
||||||
_adminLogger.Add(LogType.Damaged,
|
_adminLogger.Add(LogType.Damaged,
|
||||||
@@ -42,7 +42,7 @@ namespace Content.Server.Damage.Systems
|
|||||||
&& EntityManager.TryGetComponent<ToolComponent?>(args.Used, out var tool)
|
&& EntityManager.TryGetComponent<ToolComponent?>(args.Used, out var tool)
|
||||||
&& tool.Qualities.ContainsAny(component.Tools))
|
&& tool.Qualities.ContainsAny(component.Tools))
|
||||||
{
|
{
|
||||||
var dmg = _damageableSystem.TryChangeDamage(args.Target, damage);
|
var dmg = _damageableSystem.TryChangeDamage(args.Target, damage, origin: args.User);
|
||||||
|
|
||||||
if (dmg != null)
|
if (dmg != null)
|
||||||
_adminLogger.Add(LogType.Damaged,
|
_adminLogger.Add(LogType.Damaged,
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ namespace Content.Server.Damage.Systems
|
|||||||
|
|
||||||
private void OnDoHit(EntityUid uid, DamageOtherOnHitComponent component, ThrowDoHitEvent args)
|
private void OnDoHit(EntityUid uid, DamageOtherOnHitComponent component, ThrowDoHitEvent args)
|
||||||
{
|
{
|
||||||
var dmg = _damageableSystem.TryChangeDamage(args.Target, component.Damage, component.IgnoreResistances);
|
var dmg = _damageableSystem.TryChangeDamage(args.Target, component.Damage, component.IgnoreResistances, origin: args.User);
|
||||||
|
|
||||||
// Log damage only for mobs. Useful for when people throw spears at each other, but also avoids log-spam when explosions send glass shards flying.
|
// Log damage only for mobs. Useful for when people throw spears at each other, but also avoids log-spam when explosions send glass shards flying.
|
||||||
if (dmg != null && HasComp<MobStateComponent>(args.Target))
|
if (dmg != null && HasComp<MobStateComponent>(args.Target))
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ public sealed class DamageUserOnTriggerSystem : EntitySystem
|
|||||||
var ev = new BeforeDamageUserOnTriggerEvent(damage, target);
|
var ev = new BeforeDamageUserOnTriggerEvent(damage, target);
|
||||||
RaiseLocalEvent(source, ev);
|
RaiseLocalEvent(source, ev);
|
||||||
|
|
||||||
return _damageableSystem.TryChangeDamage(target, ev.Damage, component.IgnoreResistances) is not null;
|
return _damageableSystem.TryChangeDamage(target, ev.Damage, component.IgnoreResistances, origin: source) is not null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -10,6 +10,7 @@
|
|||||||
[DataField("timeLeft")] public float TimeLeft { get; set; }
|
[DataField("timeLeft")] public float TimeLeft { get; set; }
|
||||||
[DataField("electrocuting")] public EntityUid Electrocuting { get; set; }
|
[DataField("electrocuting")] public EntityUid Electrocuting { get; set; }
|
||||||
[DataField("accumDamage")] public float AccumulatedDamage { get; set; }
|
[DataField("accumDamage")] public float AccumulatedDamage { get; set; }
|
||||||
|
[DataField("source")] public EntityUid Source { get; set; }
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -105,7 +105,7 @@ namespace Content.Server.Electrocution
|
|||||||
_prototypeManager.Index<DamageTypePrototype>(DamageType),
|
_prototypeManager.Index<DamageTypePrototype>(DamageType),
|
||||||
(int) finished.AccumulatedDamage);
|
(int) finished.AccumulatedDamage);
|
||||||
|
|
||||||
var actual = _damageableSystem.TryChangeDamage(finished.Electrocuting, damage);
|
var actual = _damageableSystem.TryChangeDamage(finished.Electrocuting, damage, origin: finished.Source);
|
||||||
if (actual != null)
|
if (actual != null)
|
||||||
{
|
{
|
||||||
_adminLogger.Add(LogType.Electrocution,
|
_adminLogger.Add(LogType.Electrocution,
|
||||||
@@ -315,6 +315,7 @@ namespace Content.Server.Electrocution
|
|||||||
|
|
||||||
electrocutionComponent.TimeLeft = 1f;
|
electrocutionComponent.TimeLeft = 1f;
|
||||||
electrocutionComponent.Electrocuting = uid;
|
electrocutionComponent.Electrocuting = uid;
|
||||||
|
electrocutionComponent.Source = sourceUid;
|
||||||
|
|
||||||
RaiseLocalEvent(uid, new ElectrocutedEvent(uid, sourceUid, siemensCoefficient), true);
|
RaiseLocalEvent(uid, new ElectrocutedEvent(uid, sourceUid, siemensCoefficient), true);
|
||||||
|
|
||||||
@@ -369,7 +370,7 @@ namespace Content.Server.Electrocution
|
|||||||
if(shockDamage is {} dmg)
|
if(shockDamage is {} dmg)
|
||||||
{
|
{
|
||||||
var actual = _damageableSystem.TryChangeDamage(uid,
|
var actual = _damageableSystem.TryChangeDamage(uid,
|
||||||
new DamageSpecifier(_prototypeManager.Index<DamageTypePrototype>(DamageType), dmg));
|
new DamageSpecifier(_prototypeManager.Index<DamageTypePrototype>(DamageType), dmg), origin: sourceUid);
|
||||||
|
|
||||||
if (actual != null)
|
if (actual != null)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -363,6 +363,7 @@ public sealed partial class ExplosionSystem : EntitySystem
|
|||||||
|
|
||||||
ev.DamageCoefficient = Math.Max(0, ev.DamageCoefficient);
|
ev.DamageCoefficient = Math.Max(0, ev.DamageCoefficient);
|
||||||
|
|
||||||
|
//todo need a way to track origin of explosion
|
||||||
if (ev.DamageCoefficient == 1)
|
if (ev.DamageCoefficient == 1)
|
||||||
{
|
{
|
||||||
// no damage-dict multiplication required.
|
// no damage-dict multiplication required.
|
||||||
|
|||||||
@@ -63,7 +63,7 @@ public sealed class GatherableSystem : EntitySystem
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
// Complete the gathering process
|
// Complete the gathering process
|
||||||
_damageableSystem.TryChangeDamage(ev.Resource, tool.Damage);
|
_damageableSystem.TryChangeDamage(ev.Resource, tool.Damage, origin: ev.Player);
|
||||||
SoundSystem.Play(tool.GatheringSound.GetSound(), Filter.Pvs(ev.Resource, entityManager: EntityManager), ev.Resource);
|
SoundSystem.Play(tool.GatheringSound.GetSound(), Filter.Pvs(ev.Resource, entityManager: EntityManager), ev.Resource);
|
||||||
tool.GatheringEntities.Remove(ev.Resource);
|
tool.GatheringEntities.Remove(ev.Resource);
|
||||||
|
|
||||||
|
|||||||
@@ -243,7 +243,7 @@ namespace Content.Server.Guardian
|
|||||||
{
|
{
|
||||||
if (args.DamageDelta == null) return;
|
if (args.DamageDelta == null) return;
|
||||||
|
|
||||||
_damageSystem.TryChangeDamage(component.Host, args.DamageDelta * component.DamageShare);
|
_damageSystem.TryChangeDamage(component.Host, args.DamageDelta * component.DamageShare, origin: args.Origin);
|
||||||
_popupSystem.PopupEntity(Loc.GetString("guardian-entity-taking-damage"), component.Host, Filter.Entities(component.Host));
|
_popupSystem.PopupEntity(Loc.GetString("guardian-entity-taking-damage"), component.Host, Filter.Entities(component.Host));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -117,7 +117,7 @@ namespace Content.Server.Light.EntitySystems
|
|||||||
var burnMsg = Loc.GetString("powered-light-component-burn-hand");
|
var burnMsg = Loc.GetString("powered-light-component-burn-hand");
|
||||||
_popupSystem.PopupEntity(burnMsg, uid, Filter.Entities(userUid));
|
_popupSystem.PopupEntity(burnMsg, uid, Filter.Entities(userUid));
|
||||||
|
|
||||||
var damage = _damageableSystem.TryChangeDamage(userUid, light.Damage);
|
var damage = _damageableSystem.TryChangeDamage(userUid, light.Damage, origin: userUid);
|
||||||
|
|
||||||
if (damage != null)
|
if (damage != null)
|
||||||
_adminLogger.Add(LogType.Damaged,
|
_adminLogger.Add(LogType.Damaged,
|
||||||
|
|||||||
@@ -55,7 +55,7 @@ public sealed class HealingSystem : EntitySystem
|
|||||||
_bloodstreamSystem.TryModifyBleedAmount(uid, args.Component.BloodlossModifier);
|
_bloodstreamSystem.TryModifyBleedAmount(uid, args.Component.BloodlossModifier);
|
||||||
}
|
}
|
||||||
|
|
||||||
var healed = _damageable.TryChangeDamage(uid, args.Component.Damage, true);
|
var healed = _damageable.TryChangeDamage(uid, args.Component.Damage, true, origin: args.User);
|
||||||
|
|
||||||
// Reverify that we can heal the damage.
|
// Reverify that we can heal the damage.
|
||||||
if (healed == null)
|
if (healed == null)
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ namespace Content.Server.Projectiles
|
|||||||
|
|
||||||
var otherEntity = args.OtherFixture.Body.Owner;
|
var otherEntity = args.OtherFixture.Body.Owner;
|
||||||
var direction = args.OurFixture.Body.LinearVelocity.Normalized;
|
var direction = args.OurFixture.Body.LinearVelocity.Normalized;
|
||||||
var modifiedDamage = _damageableSystem.TryChangeDamage(otherEntity, component.Damage, component.IgnoreResistances);
|
var modifiedDamage = _damageableSystem.TryChangeDamage(otherEntity, component.Damage, component.IgnoreResistances, origin: component.Shooter);
|
||||||
component.DamagedEntity = true;
|
component.DamagedEntity = true;
|
||||||
|
|
||||||
if (modifiedDamage is not null && EntityManager.EntityExists(component.Shooter))
|
if (modifiedDamage is not null && EntityManager.EntityExists(component.Shooter))
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ namespace Content.Server.Repairable
|
|||||||
|
|
||||||
if (component.Damage != null)
|
if (component.Damage != null)
|
||||||
{
|
{
|
||||||
var damageChanged = _damageableSystem.TryChangeDamage(uid, component.Damage, true, false);
|
var damageChanged = _damageableSystem.TryChangeDamage(uid, component.Damage, true, false, origin: args.User);
|
||||||
_adminLogger.Add(LogType.Healed, $"{ToPrettyString(args.User):user} repaired {ToPrettyString(uid):target} by {damageChanged?.Total}");
|
_adminLogger.Add(LogType.Healed, $"{ToPrettyString(args.User):user} repaired {ToPrettyString(uid):target} by {damageChanged?.Total}");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -202,7 +202,7 @@ public sealed partial class RevenantSystem
|
|||||||
return;
|
return;
|
||||||
DamageSpecifier dspec = new();
|
DamageSpecifier dspec = new();
|
||||||
dspec.DamageDict.Add("Poison", damage.Value);
|
dspec.DamageDict.Add("Poison", damage.Value);
|
||||||
_damage.TryChangeDamage(args.Target, dspec, true);
|
_damage.TryChangeDamage(args.Target, dspec, true, origin: uid);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnHarvestCancelled(EntityUid uid, RevenantComponent component, HarvestDoAfterCancelled args)
|
private void OnHarvestCancelled(EntityUid uid, RevenantComponent component, HarvestDoAfterCancelled args)
|
||||||
@@ -252,7 +252,7 @@ public sealed partial class RevenantSystem
|
|||||||
//hardcoded damage specifiers til i die.
|
//hardcoded damage specifiers til i die.
|
||||||
var dspec = new DamageSpecifier();
|
var dspec = new DamageSpecifier();
|
||||||
dspec.DamageDict.Add("Structural", 15);
|
dspec.DamageDict.Add("Structural", 15);
|
||||||
_damage.TryChangeDamage(ent, dspec);
|
_damage.TryChangeDamage(ent, dspec, origin: uid);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!_random.Prob(component.DefileEffectChance))
|
if (!_random.Prob(component.DefileEffectChance))
|
||||||
|
|||||||
@@ -71,7 +71,7 @@ public sealed partial class GunSystem : SharedGunSystem
|
|||||||
if (_interaction.TryRollClumsy(user.Value, GunClumsyChance, clumsy))
|
if (_interaction.TryRollClumsy(user.Value, GunClumsyChance, clumsy))
|
||||||
{
|
{
|
||||||
// Wound them
|
// Wound them
|
||||||
Damageable.TryChangeDamage(user, clumsy.ClumsyDamage);
|
Damageable.TryChangeDamage(user, clumsy.ClumsyDamage, origin: user);
|
||||||
_stun.TryParalyze(user.Value, TimeSpan.FromSeconds(3f), true);
|
_stun.TryParalyze(user.Value, TimeSpan.FromSeconds(3f), true);
|
||||||
|
|
||||||
// Apply salt to the wound ("Honk!")
|
// Apply salt to the wound ("Honk!")
|
||||||
@@ -187,7 +187,7 @@ public sealed partial class GunSystem : SharedGunSystem
|
|||||||
var dmg = hitscan.Damage;
|
var dmg = hitscan.Damage;
|
||||||
|
|
||||||
if (dmg != null)
|
if (dmg != null)
|
||||||
dmg = Damageable.TryChangeDamage(hitEntity, dmg);
|
dmg = Damageable.TryChangeDamage(hitEntity, dmg, origin: user);
|
||||||
|
|
||||||
if (dmg != null)
|
if (dmg != null)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -58,7 +58,7 @@ public sealed class BlockingUserSystem : EntitySystem
|
|||||||
{
|
{
|
||||||
if (args.DamageDelta != null && args.DamageIncreased)
|
if (args.DamageDelta != null && args.DamageIncreased)
|
||||||
{
|
{
|
||||||
_damageable.TryChangeDamage(component.BlockingItem, args.DamageDelta);
|
_damageable.TryChangeDamage(component.BlockingItem, args.DamageDelta, origin: args.Origin);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -113,7 +113,7 @@ namespace Content.Shared.Damage
|
|||||||
/// The damage changed event is used by other systems, such as damage thresholds.
|
/// The damage changed event is used by other systems, such as damage thresholds.
|
||||||
/// </remarks>
|
/// </remarks>
|
||||||
public void DamageChanged(DamageableComponent component, DamageSpecifier? damageDelta = null,
|
public void DamageChanged(DamageableComponent component, DamageSpecifier? damageDelta = null,
|
||||||
bool interruptsDoAfters = true)
|
bool interruptsDoAfters = true, EntityUid? origin = null)
|
||||||
{
|
{
|
||||||
component.DamagePerGroup = component.Damage.GetDamagePerGroup(_prototypeManager);
|
component.DamagePerGroup = component.Damage.GetDamagePerGroup(_prototypeManager);
|
||||||
component.TotalDamage = component.Damage.Total;
|
component.TotalDamage = component.Damage.Total;
|
||||||
@@ -124,7 +124,7 @@ namespace Content.Shared.Damage
|
|||||||
var data = new DamageVisualizerGroupData(damageDelta.GetDamagePerGroup(_prototypeManager).Keys.ToList());
|
var data = new DamageVisualizerGroupData(damageDelta.GetDamagePerGroup(_prototypeManager).Keys.ToList());
|
||||||
_appearance.SetData(component.Owner, DamageVisualizerKeys.DamageUpdateGroups, data, appearance);
|
_appearance.SetData(component.Owner, DamageVisualizerKeys.DamageUpdateGroups, data, appearance);
|
||||||
}
|
}
|
||||||
RaiseLocalEvent(component.Owner, new DamageChangedEvent(component, damageDelta, interruptsDoAfters));
|
RaiseLocalEvent(component.Owner, new DamageChangedEvent(component, damageDelta, interruptsDoAfters, origin));
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -140,7 +140,7 @@ namespace Content.Shared.Damage
|
|||||||
/// null if the user had no applicable components that can take damage.
|
/// null if the user had no applicable components that can take damage.
|
||||||
/// </returns>
|
/// </returns>
|
||||||
public DamageSpecifier? TryChangeDamage(EntityUid? uid, DamageSpecifier damage, bool ignoreResistances = false,
|
public DamageSpecifier? TryChangeDamage(EntityUid? uid, DamageSpecifier damage, bool ignoreResistances = false,
|
||||||
bool interruptsDoAfters = true, DamageableComponent? damageable = null)
|
bool interruptsDoAfters = true, DamageableComponent? damageable = null, EntityUid? origin = null)
|
||||||
{
|
{
|
||||||
if (!uid.HasValue || !Resolve(uid.Value, ref damageable, false))
|
if (!uid.HasValue || !Resolve(uid.Value, ref damageable, false))
|
||||||
{
|
{
|
||||||
@@ -364,10 +364,16 @@ namespace Content.Shared.Damage
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public readonly bool InterruptsDoAfters = false;
|
public readonly bool InterruptsDoAfters = false;
|
||||||
|
|
||||||
public DamageChangedEvent(DamageableComponent damageable, DamageSpecifier? damageDelta, bool interruptsDoAfters)
|
/// <summary>
|
||||||
|
/// Contains the entity which caused the change in damage, if any was responsible.
|
||||||
|
/// </summary>
|
||||||
|
public readonly EntityUid? Origin;
|
||||||
|
|
||||||
|
public DamageChangedEvent(DamageableComponent damageable, DamageSpecifier? damageDelta, bool interruptsDoAfters, EntityUid? origin)
|
||||||
{
|
{
|
||||||
Damageable = damageable;
|
Damageable = damageable;
|
||||||
DamageDelta = damageDelta;
|
DamageDelta = damageDelta;
|
||||||
|
Origin = origin;
|
||||||
|
|
||||||
if (DamageDelta == null)
|
if (DamageDelta == null)
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -406,7 +406,7 @@ public abstract class SharedDoorSystem : EntitySystem
|
|||||||
{
|
{
|
||||||
door.CurrentlyCrushing.Add(entity);
|
door.CurrentlyCrushing.Add(entity);
|
||||||
if (door.CrushDamage != null)
|
if (door.CrushDamage != null)
|
||||||
_damageableSystem.TryChangeDamage(entity, door.CrushDamage);
|
_damageableSystem.TryChangeDamage(entity, door.CrushDamage, origin: uid);
|
||||||
|
|
||||||
_stunSystem.TryParalyze(entity, stunTime, true);
|
_stunSystem.TryParalyze(entity, stunTime, true);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -178,7 +178,7 @@ namespace Content.Shared.MobState.EntitySystems
|
|||||||
|
|
||||||
public void UpdateState(EntityUid _, MobStateComponent component, DamageChangedEvent args)
|
public void UpdateState(EntityUid _, MobStateComponent component, DamageChangedEvent args)
|
||||||
{
|
{
|
||||||
UpdateState(component, args.Damageable.TotalDamage);
|
UpdateState(component, args.Damageable.TotalDamage, args.Origin);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnMoveAttempt(EntityUid uid, MobStateComponent component, UpdateCanMoveEvent args)
|
private void OnMoveAttempt(EntityUid uid, MobStateComponent component, UpdateCanMoveEvent args)
|
||||||
@@ -275,20 +275,20 @@ namespace Content.Shared.MobState.EntitySystems
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Updates the mob state..
|
/// Updates the mob state..
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public void UpdateState(MobStateComponent component, FixedPoint2 damage)
|
public void UpdateState(MobStateComponent component, FixedPoint2 damage, EntityUid? origin = null)
|
||||||
{
|
{
|
||||||
if (!TryGetState(component, damage, out var newState, out var threshold))
|
if (!TryGetState(component, damage, out var newState, out var threshold))
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
SetMobState(component, component.CurrentState, (newState.Value, threshold));
|
SetMobState(component, component.CurrentState, (newState.Value, threshold), origin);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Sets the mob state and marks the component as dirty.
|
/// Sets the mob state and marks the component as dirty.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private void SetMobState(MobStateComponent component, DamageState? old, (DamageState state, FixedPoint2 threshold)? current)
|
private void SetMobState(MobStateComponent component, DamageState? old, (DamageState state, FixedPoint2 threshold)? current, EntityUid? origin = null)
|
||||||
{
|
{
|
||||||
if (!current.HasValue)
|
if (!current.HasValue)
|
||||||
{
|
{
|
||||||
@@ -313,7 +313,7 @@ namespace Content.Shared.MobState.EntitySystems
|
|||||||
EnterState(component, state);
|
EnterState(component, state);
|
||||||
UpdateState(component, state, threshold);
|
UpdateState(component, state, threshold);
|
||||||
|
|
||||||
var message = new MobStateChangedEvent(component, old, state);
|
var message = new MobStateChangedEvent(component, old, state, origin);
|
||||||
RaiseLocalEvent(component.Owner, message, true);
|
RaiseLocalEvent(component.Owner, message, true);
|
||||||
Dirty(component);
|
Dirty(component);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,11 +7,13 @@ namespace Content.Shared.MobState
|
|||||||
public MobStateChangedEvent(
|
public MobStateChangedEvent(
|
||||||
MobStateComponent component,
|
MobStateComponent component,
|
||||||
DamageState? oldMobState,
|
DamageState? oldMobState,
|
||||||
DamageState currentMobState)
|
DamageState currentMobState,
|
||||||
|
EntityUid? origin)
|
||||||
{
|
{
|
||||||
Component = component;
|
Component = component;
|
||||||
OldMobState = oldMobState;
|
OldMobState = oldMobState;
|
||||||
CurrentMobState = currentMobState;
|
CurrentMobState = currentMobState;
|
||||||
|
Origin = origin;
|
||||||
}
|
}
|
||||||
|
|
||||||
public EntityUid Entity => Component.Owner;
|
public EntityUid Entity => Component.Owner;
|
||||||
@@ -21,6 +23,8 @@ namespace Content.Shared.MobState
|
|||||||
public DamageState? OldMobState { get; }
|
public DamageState? OldMobState { get; }
|
||||||
|
|
||||||
public DamageState CurrentMobState { get; }
|
public DamageState CurrentMobState { get; }
|
||||||
|
|
||||||
|
public EntityUid? Origin { get; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class A
|
public static class A
|
||||||
|
|||||||
Reference in New Issue
Block a user