Add composite destructible thresholds (#3102)

* Add composite destructible thresholds

* Reorder yaml properties

* Update YAML

* Fix YAML

* Re-fix YAML

* Add missing nullable enable

* Go back window component is explosive

* rider
This commit is contained in:
DrSmugleaf
2021-02-09 12:57:21 +01:00
committed by GitHub
parent 205c787773
commit 15f05b565a
58 changed files with 284 additions and 188 deletions

View File

@@ -12,11 +12,12 @@ using static Content.IntegrationTests.Tests.Destructible.DestructibleTestPrototy
namespace Content.IntegrationTests.Tests.Destructible namespace Content.IntegrationTests.Tests.Destructible
{ {
[TestFixture] [TestFixture]
[TestOf(typeof(TotalDamageClassesTrigger))] [TestOf(typeof(DamageClassTrigger))]
[TestOf(typeof(AndTrigger))]
public class DestructibleDamageClassTest : ContentIntegrationTest public class DestructibleDamageClassTest : ContentIntegrationTest
{ {
[Test] [Test]
public async Task Test() public async Task AndTest()
{ {
var server = StartServerDummyTicker(new ServerContentIntegrationOption var server = StartServerDummyTicker(new ServerContentIntegrationOption
{ {
@@ -82,7 +83,12 @@ namespace Content.IntegrationTests.Tests.Destructible
Assert.That(threshold.Behaviors, Is.Empty); Assert.That(threshold.Behaviors, Is.Empty);
Assert.NotNull(threshold.Trigger); Assert.NotNull(threshold.Trigger);
Assert.That(threshold.Triggered, Is.True); Assert.That(threshold.Triggered, Is.True);
Assert.IsInstanceOf<TotalDamageClassesTrigger>(threshold.Trigger); Assert.IsInstanceOf<AndTrigger>(threshold.Trigger);
var trigger = (AndTrigger) threshold.Trigger;
Assert.IsInstanceOf<DamageClassTrigger>(trigger.Triggers[0]);
Assert.IsInstanceOf<DamageClassTrigger>(trigger.Triggers[1]);
sThresholdListenerComponent.ThresholdsReached.Clear(); sThresholdListenerComponent.ThresholdsReached.Clear();
@@ -139,7 +145,12 @@ namespace Content.IntegrationTests.Tests.Destructible
Assert.That(threshold.Behaviors, Is.Empty); Assert.That(threshold.Behaviors, Is.Empty);
Assert.NotNull(threshold.Trigger); Assert.NotNull(threshold.Trigger);
Assert.That(threshold.Triggered, Is.True); Assert.That(threshold.Triggered, Is.True);
Assert.IsInstanceOf<TotalDamageClassesTrigger>(threshold.Trigger); Assert.IsInstanceOf<AndTrigger>(threshold.Trigger);
trigger = (AndTrigger) threshold.Trigger;
Assert.IsInstanceOf<DamageClassTrigger>(trigger.Triggers[0]);
Assert.IsInstanceOf<DamageClassTrigger>(trigger.Triggers[1]);
sThresholdListenerComponent.ThresholdsReached.Clear(); sThresholdListenerComponent.ThresholdsReached.Clear();

View File

@@ -12,7 +12,8 @@ using static Content.IntegrationTests.Tests.Destructible.DestructibleTestPrototy
namespace Content.IntegrationTests.Tests.Destructible namespace Content.IntegrationTests.Tests.Destructible
{ {
[TestFixture] [TestFixture]
[TestOf(typeof(TotalDamageTypesTrigger))] [TestOf(typeof(DamageTypeTrigger))]
[TestOf(typeof(AndTrigger))]
public class DestructibleDamageTypeTest : ContentIntegrationTest public class DestructibleDamageTypeTest : ContentIntegrationTest
{ {
[Test] [Test]
@@ -82,7 +83,12 @@ namespace Content.IntegrationTests.Tests.Destructible
Assert.That(threshold.Behaviors, Is.Empty); Assert.That(threshold.Behaviors, Is.Empty);
Assert.NotNull(threshold.Trigger); Assert.NotNull(threshold.Trigger);
Assert.That(threshold.Triggered, Is.True); Assert.That(threshold.Triggered, Is.True);
Assert.IsInstanceOf<TotalDamageTypesTrigger>(threshold.Trigger); Assert.IsInstanceOf<AndTrigger>(threshold.Trigger);
var trigger = (AndTrigger) threshold.Trigger;
Assert.IsInstanceOf<DamageTypeTrigger>(trigger.Triggers[0]);
Assert.IsInstanceOf<DamageTypeTrigger>(trigger.Triggers[1]);
sThresholdListenerComponent.ThresholdsReached.Clear(); sThresholdListenerComponent.ThresholdsReached.Clear();
@@ -139,7 +145,12 @@ namespace Content.IntegrationTests.Tests.Destructible
Assert.That(threshold.Behaviors, Is.Empty); Assert.That(threshold.Behaviors, Is.Empty);
Assert.NotNull(threshold.Trigger); Assert.NotNull(threshold.Trigger);
Assert.That(threshold.Triggered, Is.True); Assert.That(threshold.Triggered, Is.True);
Assert.IsInstanceOf<TotalDamageTypesTrigger>(threshold.Trigger); Assert.IsInstanceOf<AndTrigger>(threshold.Trigger);
trigger = (AndTrigger) threshold.Trigger;
Assert.IsInstanceOf<DamageTypeTrigger>(trigger.Triggers[0]);
Assert.IsInstanceOf<DamageTypeTrigger>(trigger.Triggers[1]);
sThresholdListenerComponent.ThresholdsReached.Clear(); sThresholdListenerComponent.ThresholdsReached.Clear();

View File

@@ -21,11 +21,11 @@
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
!type:TotalDamageTrigger !type:DamageTrigger
damage: 20 damage: 20
triggersOnce: false triggersOnce: false
- trigger: - trigger:
!type:TotalDamageTrigger !type:DamageTrigger
damage: 50 damage: 50
triggersOnce: false triggersOnce: false
behaviors: behaviors:
@@ -48,7 +48,7 @@
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
!type:TotalDamageTrigger !type:DamageTrigger
damage: 50 damage: 50
behaviors: behaviors:
- !type:PlaySoundBehavior - !type:PlaySoundBehavior
@@ -70,13 +70,16 @@
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
!type:TotalDamageTypesTrigger !type:AndTrigger
damage: triggers:
Blunt: 10 - !type:DamageTypeTrigger
Slash: 10 type: Blunt
damage: 10
- !type:DamageTypeTrigger
type: Slash
damage: 10
- type: TestThresholdListener - type: TestThresholdListener
- type: entity - type: entity
id: {DestructibleDamageClassEntityId} id: {DestructibleDamageClassEntityId}
name: {DestructibleDamageClassEntityId} name: {DestructibleDamageClassEntityId}
@@ -85,10 +88,14 @@
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
!type:TotalDamageClassesTrigger !type:AndTrigger
damage: triggers:
Brute: 10 - !type:DamageClassTrigger
Burn: 10 class: Brute
damage: 10
- !type:DamageClassTrigger
class: Burn
damage: 10
- type: TestThresholdListener"; - type: TestThresholdListener";
} }
} }

View File

@@ -191,7 +191,7 @@ namespace Content.IntegrationTests.Tests.Destructible
// Verify the first one, should be the lowest one (20) // Verify the first one, should be the lowest one (20)
msg = sThresholdListenerComponent.ThresholdsReached[0]; msg = sThresholdListenerComponent.ThresholdsReached[0];
var trigger = (TotalDamageTrigger) msg.Threshold.Trigger; var trigger = (DamageTrigger) msg.Threshold.Trigger;
Assert.NotNull(trigger); Assert.NotNull(trigger);
Assert.That(trigger.Damage, Is.EqualTo(20)); Assert.That(trigger.Damage, Is.EqualTo(20));
@@ -202,7 +202,7 @@ namespace Content.IntegrationTests.Tests.Destructible
// Verify the second one, should be the highest one (50) // Verify the second one, should be the highest one (50)
msg = sThresholdListenerComponent.ThresholdsReached[1]; msg = sThresholdListenerComponent.ThresholdsReached[1];
trigger = (TotalDamageTrigger) msg.Threshold.Trigger; trigger = (DamageTrigger) msg.Threshold.Trigger;
Assert.NotNull(trigger); Assert.NotNull(trigger);
Assert.That(trigger.Damage, Is.EqualTo(50)); Assert.That(trigger.Damage, Is.EqualTo(50));

View File

@@ -0,0 +1,37 @@
#nullable enable
using System;
using System.Collections.Generic;
using Content.Server.GameObjects.EntitySystems;
using Content.Shared.GameObjects.Components.Damage;
using Robust.Shared.Interfaces.Serialization;
using Robust.Shared.Serialization;
namespace Content.Server.GameObjects.Components.Destructible.Thresholds.Triggers
{
/// <summary>
/// A trigger that will activate when all of its triggers have activated.
/// </summary>
[Serializable]
public class AndTrigger : IThresholdTrigger
{
public List<IThresholdTrigger> Triggers { get; set; } = new();
void IExposeData.ExposeData(ObjectSerializer serializer)
{
serializer.DataField(this, x => x.Triggers, "triggers", new List<IThresholdTrigger>());
}
public bool Reached(IDamageableComponent damageable, DestructibleSystem system)
{
foreach (var trigger in Triggers)
{
if (!trigger.Reached(damageable, system))
{
return false;
}
}
return true;
}
}
}

View File

@@ -1,6 +1,5 @@
#nullable enable #nullable enable
using System; using System;
using System.Collections.Generic;
using Content.Server.GameObjects.EntitySystems; using Content.Server.GameObjects.EntitySystems;
using Content.Shared.Damage; using Content.Shared.Damage;
using Content.Shared.GameObjects.Components.Damage; using Content.Shared.GameObjects.Components.Damage;
@@ -10,39 +9,37 @@ using Robust.Shared.Serialization;
namespace Content.Server.GameObjects.Components.Destructible.Thresholds.Triggers namespace Content.Server.GameObjects.Components.Destructible.Thresholds.Triggers
{ {
/// <summary> /// <summary>
/// A trigger that will activate when all of the damage types received /// A trigger that will activate when the amount of damage received
/// are above the specified threshold. /// of the specified class is above the specified threshold.
/// </summary> /// </summary>
[Serializable] [Serializable]
public class TotalDamageTypesTrigger : IThresholdTrigger public class DamageClassTrigger : IThresholdTrigger
{ {
/// <summary> /// <summary>
/// The amount of damage at which this threshold will trigger. /// The class to check the damage of.
/// The damage requirements of all <see cref="DamageType"/> must be met.
/// </summary> /// </summary>
private Dictionary<DamageType, int> Damage { get; set; } = new(); public DamageClass? Class { get; set; }
/// <summary>
/// The amount of damage at which this threshold will trigger.
/// </summary>
public int Damage { get; set; }
void IExposeData.ExposeData(ObjectSerializer serializer) void IExposeData.ExposeData(ObjectSerializer serializer)
{ {
serializer.DataField(this, x => x.Damage, "damage", new Dictionary<DamageType, int>()); serializer.DataField(this, x => x.Class, "class", null);
serializer.DataField(this, x => x.Damage, "damage", 0);
} }
public bool Reached(IDamageableComponent damageable, DestructibleSystem system) public bool Reached(IDamageableComponent damageable, DestructibleSystem system)
{ {
foreach (var (type, damageRequired) in Damage) if (Class == null)
{ {
if (!damageable.TryGetDamage(type, out var damageReceived)) return false;
{
return false;
}
if (damageReceived < damageRequired)
{
return false;
}
} }
return true; return damageable.TryGetDamage(Class.Value, out var damageReceived) &&
damageReceived >= Damage;
} }
} }
} }

View File

@@ -8,16 +8,16 @@ using Robust.Shared.Serialization;
namespace Content.Server.GameObjects.Components.Destructible.Thresholds.Triggers namespace Content.Server.GameObjects.Components.Destructible.Thresholds.Triggers
{ {
/// <summary> /// <summary>
/// A trigger that will activate when the amount of total damage received /// A trigger that will activate when the amount of damage received
/// is above the specified threshold. /// is above the specified threshold.
/// </summary> /// </summary>
[Serializable] [Serializable]
public class TotalDamageTrigger : IThresholdTrigger public class DamageTrigger : IThresholdTrigger
{ {
/// <summary> /// <summary>
/// The amount of total damage at which this threshold will trigger. /// The amount of damage at which this threshold will trigger.
/// </summary> /// </summary>
public int Damage { get; private set; } public int Damage { get; set; }
void IExposeData.ExposeData(ObjectSerializer serializer) void IExposeData.ExposeData(ObjectSerializer serializer)
{ {

View File

@@ -0,0 +1,39 @@
#nullable enable
using System;
using Content.Server.GameObjects.EntitySystems;
using Content.Shared.Damage;
using Content.Shared.GameObjects.Components.Damage;
using Robust.Shared.Interfaces.Serialization;
using Robust.Shared.Serialization;
namespace Content.Server.GameObjects.Components.Destructible.Thresholds.Triggers
{
/// <summary>
/// A trigger that will activate when the amount of damage received
/// of the specified type is above the specified threshold.
/// </summary>
[Serializable]
public class DamageTypeTrigger : IThresholdTrigger
{
public DamageType? Type { get; set; }
public int Damage { get; set; }
void IExposeData.ExposeData(ObjectSerializer serializer)
{
serializer.DataField(this, x => x.Type, "type", null);
serializer.DataField(this, x => x.Damage, "damage", 0);
}
public bool Reached(IDamageableComponent damageable, DestructibleSystem system)
{
if (Type == null)
{
return false;
}
return damageable.TryGetDamage(Type.Value, out var damageReceived) &&
damageReceived >= Damage;
}
}
}

View File

@@ -0,0 +1,37 @@
#nullable enable
using System;
using System.Collections.Generic;
using Content.Server.GameObjects.EntitySystems;
using Content.Shared.GameObjects.Components.Damage;
using Robust.Shared.Interfaces.Serialization;
using Robust.Shared.Serialization;
namespace Content.Server.GameObjects.Components.Destructible.Thresholds.Triggers
{
/// <summary>
/// A trigger that will activate when any of its triggers have activated.
/// </summary>
[Serializable]
public class OrTrigger : IThresholdTrigger
{
public List<IThresholdTrigger> Triggers { get; } = new();
void IExposeData.ExposeData(ObjectSerializer serializer)
{
serializer.DataField(this, x => x.Triggers, "triggers", new List<IThresholdTrigger>());
}
public bool Reached(IDamageableComponent damageable, DestructibleSystem system)
{
foreach (var trigger in Triggers)
{
if (trigger.Reached(damageable, system))
{
return true;
}
}
return false;
}
}
}

View File

@@ -1,48 +0,0 @@
#nullable enable
using System;
using System.Collections.Generic;
using Content.Server.GameObjects.EntitySystems;
using Content.Shared.Damage;
using Content.Shared.GameObjects.Components.Damage;
using Robust.Shared.Interfaces.Serialization;
using Robust.Shared.Serialization;
namespace Content.Server.GameObjects.Components.Destructible.Thresholds.Triggers
{
/// <summary>
/// A trigger that will activate when all of the damage classes received
/// are above the specified threshold.
/// </summary>
[Serializable]
public class TotalDamageClassesTrigger : IThresholdTrigger
{
/// <summary>
/// The amount of damage at which this threshold will trigger.
/// The damage requirements of all <see cref="DamageClass"/> must be met.
/// </summary>
private Dictionary<DamageClass, int> Damage { get; set; } = new();
void IExposeData.ExposeData(ObjectSerializer serializer)
{
serializer.DataField(this, x => x.Damage, "damage", new Dictionary<DamageClass, int>());
}
public bool Reached(IDamageableComponent damageable, DestructibleSystem system)
{
foreach (var (type, damageRequired) in Damage)
{
if (!damageable.TryGetDamage(type, out var damageReceived))
{
return false;
}
if (damageReceived < damageRequired)
{
return false;
}
}
return true;
}
}
}

View File

@@ -46,7 +46,7 @@ namespace Content.Server.GameObjects.Components
{ {
foreach (var threshold in destructible.Thresholds) foreach (var threshold in destructible.Thresholds)
{ {
if (threshold.Trigger is not TotalDamageTrigger trigger) if (threshold.Trigger is not DamageTrigger trigger)
{ {
continue; continue;
} }
@@ -65,12 +65,12 @@ namespace Content.Server.GameObjects.Components
} }
var damage = damageable.TotalDamage; var damage = damageable.TotalDamage;
TotalDamageTrigger? trigger = null; DamageTrigger? trigger = null;
// TODO: Pretend this does not exist until https://github.com/space-wizards/space-station-14/pull/2783 is merged // TODO: Pretend this does not exist until https://github.com/space-wizards/space-station-14/pull/2783 is merged
foreach (var threshold in destructible.Thresholds) foreach (var threshold in destructible.Thresholds)
{ {
if ((trigger = threshold.Trigger as TotalDamageTrigger) != null) if ((trigger = threshold.Trigger as DamageTrigger) != null)
{ {
break; break;
} }

View File

@@ -61,7 +61,7 @@
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
!type:TotalDamageTrigger !type:DamageTrigger
damage: 500 damage: 500
behaviors: behaviors:
- !type:DoActsBehavior - !type:DoActsBehavior

View File

@@ -26,7 +26,7 @@
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
!type:TotalDamageTrigger !type:DamageTrigger
damage: 75 damage: 75
behaviors: behaviors:
- !type:DoActsBehavior - !type:DoActsBehavior

View File

@@ -24,7 +24,7 @@
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
!type:TotalDamageTrigger !type:DamageTrigger
damage: 30 damage: 30
behaviors: behaviors:
- !type:PlaySoundBehavior - !type:PlaySoundBehavior

View File

@@ -25,7 +25,7 @@
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
!type:TotalDamageTrigger !type:DamageTrigger
damage: 50 damage: 50
behaviors: behaviors:
- !type:DoActsBehavior - !type:DoActsBehavior

View File

@@ -16,7 +16,7 @@
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
!type:TotalDamageTrigger !type:DamageTrigger
damage: 100 damage: 100
behaviors: behaviors:
- !type:DoActsBehavior - !type:DoActsBehavior

View File

@@ -35,7 +35,7 @@
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
!type:TotalDamageTrigger !type:DamageTrigger
damage: 50 damage: 50
behaviors: behaviors:
- !type:DoActsBehavior - !type:DoActsBehavior

View File

@@ -32,7 +32,7 @@
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
!type:TotalDamageTrigger !type:DamageTrigger
damage: 30 damage: 30
behaviors: behaviors:
- !type:PlaySoundBehavior - !type:PlaySoundBehavior
@@ -79,7 +79,7 @@
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
!type:TotalDamageTrigger !type:DamageTrigger
damage: 30 damage: 30
behaviors: behaviors:
- !type:PlaySoundBehavior - !type:PlaySoundBehavior

View File

@@ -40,7 +40,7 @@
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
!type:TotalDamageTrigger !type:DamageTrigger
damage: 15 damage: 15
behaviors: behaviors:
- !type:PlaySoundBehavior - !type:PlaySoundBehavior
@@ -68,7 +68,7 @@
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
!type:TotalDamageTrigger !type:DamageTrigger
damage: 1 damage: 1
behaviors: behaviors:
- !type:PlaySoundBehavior - !type:PlaySoundBehavior
@@ -99,7 +99,7 @@
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
!type:TotalDamageTrigger !type:DamageTrigger
damage: 1 damage: 1
behaviors: behaviors:
- !type:PlaySoundBehavior - !type:PlaySoundBehavior
@@ -127,7 +127,7 @@
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
!type:TotalDamageTrigger !type:DamageTrigger
damage: 15 damage: 15
behaviors: behaviors:
- !type:PlaySoundBehavior - !type:PlaySoundBehavior
@@ -158,7 +158,7 @@
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
!type:TotalDamageTrigger !type:DamageTrigger
damage: 75 damage: 75
behaviors: behaviors:
- !type:PlaySoundBehavior - !type:PlaySoundBehavior
@@ -189,7 +189,7 @@
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
!type:TotalDamageTrigger !type:DamageTrigger
damage: 5 damage: 5
behaviors: behaviors:
- !type:PlaySoundBehavior - !type:PlaySoundBehavior
@@ -220,7 +220,7 @@
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
!type:TotalDamageTrigger !type:DamageTrigger
damage: 20 damage: 20
behaviors: behaviors:
- !type:PlaySoundBehavior - !type:PlaySoundBehavior
@@ -251,7 +251,7 @@
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
!type:TotalDamageTrigger !type:DamageTrigger
damage: 15 damage: 15
behaviors: behaviors:
- !type:PlaySoundBehavior - !type:PlaySoundBehavior
@@ -282,7 +282,7 @@
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
!type:TotalDamageTrigger !type:DamageTrigger
damage: 15 damage: 15
behaviors: behaviors:
- !type:PlaySoundBehavior - !type:PlaySoundBehavior
@@ -313,7 +313,7 @@
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
!type:TotalDamageTrigger !type:DamageTrigger
damage: 50 damage: 50
behaviors: behaviors:
- !type:PlaySoundBehavior - !type:PlaySoundBehavior
@@ -336,7 +336,7 @@
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
!type:TotalDamageTrigger !type:DamageTrigger
damage: 1 damage: 1
behaviors: behaviors:
- !type:DoActsBehavior - !type:DoActsBehavior

View File

@@ -20,7 +20,7 @@
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
!type:TotalDamageTrigger !type:DamageTrigger
damage: 100 damage: 100
behaviors: behaviors:
- !type:DoActsBehavior - !type:DoActsBehavior

View File

@@ -14,7 +14,7 @@
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
!type:TotalDamageTrigger !type:DamageTrigger
damage: 100 damage: 100
behaviors: behaviors:
- !type:DoActsBehavior - !type:DoActsBehavior

View File

@@ -14,7 +14,7 @@
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
!type:TotalDamageTrigger !type:DamageTrigger
damage: 100 damage: 100
behaviors: behaviors:
- !type:DoActsBehavior - !type:DoActsBehavior

View File

@@ -24,7 +24,7 @@
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
!type:TotalDamageTrigger !type:DamageTrigger
damage: 50 damage: 50
behaviors: behaviors:
- !type:DoActsBehavior - !type:DoActsBehavior

View File

@@ -15,7 +15,7 @@
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
!type:TotalDamageTrigger !type:DamageTrigger
damage: 100 damage: 100
behaviors: behaviors:
- !type:DoActsBehavior - !type:DoActsBehavior

View File

@@ -14,7 +14,7 @@
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
!type:TotalDamageTrigger !type:DamageTrigger
damage: 100 damage: 100
behaviors: behaviors:
- !type:DoActsBehavior - !type:DoActsBehavior

View File

@@ -14,7 +14,7 @@
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
!type:TotalDamageTrigger !type:DamageTrigger
damage: 100 damage: 100
behaviors: behaviors:
- !type:DoActsBehavior - !type:DoActsBehavior

View File

@@ -14,7 +14,7 @@
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
!type:TotalDamageTrigger !type:DamageTrigger
damage: 100 damage: 100
behaviors: behaviors:
- !type:DoActsBehavior - !type:DoActsBehavior

View File

@@ -99,7 +99,7 @@
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
!type:TotalDamageTrigger !type:DamageTrigger
damage: 100 damage: 100
behaviors: behaviors:
- !type:DoActsBehavior - !type:DoActsBehavior

View File

@@ -32,7 +32,7 @@
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
!type:TotalDamageTrigger !type:DamageTrigger
damage: 100 damage: 100
behaviors: behaviors:
- !type:DoActsBehavior - !type:DoActsBehavior

View File

@@ -258,7 +258,7 @@
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
!type:TotalDamageTrigger !type:DamageTrigger
damage: 100 damage: 100
behaviors: behaviors:
- !type:DoActsBehavior - !type:DoActsBehavior

View File

@@ -33,7 +33,7 @@
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
!type:TotalDamageTrigger !type:DamageTrigger
damage: 50 damage: 50
behaviors: behaviors:
- !type:DoActsBehavior - !type:DoActsBehavior

View File

@@ -23,7 +23,7 @@
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
!type:TotalDamageTrigger !type:DamageTrigger
damage: 100 damage: 100
behaviors: behaviors:
- !type:DoActsBehavior - !type:DoActsBehavior
@@ -56,7 +56,7 @@
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
!type:TotalDamageTrigger !type:DamageTrigger
damage: 100 damage: 100
behaviors: behaviors:
- !type:SpawnEntitiesBehavior - !type:SpawnEntitiesBehavior
@@ -95,7 +95,7 @@
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
!type:TotalDamageTrigger !type:DamageTrigger
damage: 100 damage: 100
behaviors: behaviors:
- !type:SpawnEntitiesBehavior - !type:SpawnEntitiesBehavior
@@ -136,7 +136,7 @@
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
!type:TotalDamageTrigger !type:DamageTrigger
damage: 100 damage: 100
behaviors: behaviors:
- !type:SpawnEntitiesBehavior - !type:SpawnEntitiesBehavior

View File

@@ -26,7 +26,7 @@
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
!type:TotalDamageTrigger !type:DamageTrigger
damage: 500 damage: 500
behaviors: behaviors:
- !type:DoActsBehavior - !type:DoActsBehavior

View File

@@ -26,7 +26,7 @@
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
!type:TotalDamageTrigger !type:DamageTrigger
damage: 500 damage: 500
behaviors: behaviors:
- !type:SpawnEntitiesBehavior - !type:SpawnEntitiesBehavior

View File

@@ -35,7 +35,7 @@
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
!type:TotalDamageTrigger !type:DamageTrigger
damage: 100 damage: 100
behaviors: behaviors:
- !type:DoActsBehavior - !type:DoActsBehavior

View File

@@ -35,7 +35,7 @@
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
!type:TotalDamageTrigger !type:DamageTrigger
damage: 100 damage: 100
behaviors: behaviors:
- !type:DoActsBehavior - !type:DoActsBehavior

View File

@@ -22,7 +22,7 @@
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
!type:TotalDamageTrigger !type:DamageTrigger
damage: 75 damage: 75
behaviors: behaviors:
- !type:DoActsBehavior - !type:DoActsBehavior

View File

@@ -36,7 +36,7 @@
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
!type:TotalDamageTrigger !type:DamageTrigger
damage: 50 damage: 50
behaviors: behaviors:
- !type:SpawnEntitiesBehavior - !type:SpawnEntitiesBehavior
@@ -87,7 +87,7 @@
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
!type:TotalDamageTrigger !type:DamageTrigger
damage: 25 damage: 25
behaviors: behaviors:
- !type:SpawnEntitiesBehavior - !type:SpawnEntitiesBehavior

View File

@@ -18,7 +18,7 @@
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
!type:TotalDamageTrigger !type:DamageTrigger
damage: 100 damage: 100
behaviors: behaviors:
- !type:DoActsBehavior - !type:DoActsBehavior
@@ -154,7 +154,7 @@
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
!type:TotalDamageTrigger !type:DamageTrigger
damage: 100 damage: 100
behaviors: behaviors:
- !type:DoActsBehavior - !type:DoActsBehavior
@@ -397,7 +397,7 @@
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
!type:TotalDamageTrigger !type:DamageTrigger
damage: 100 damage: 100
behaviors: behaviors:
- !type:DoActsBehavior - !type:DoActsBehavior

View File

@@ -34,7 +34,7 @@
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
!type:TotalDamageTrigger !type:DamageTrigger
damage: 150 damage: 150
behaviors: behaviors:
- !type:DoActsBehavior - !type:DoActsBehavior

View File

@@ -28,7 +28,7 @@
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
!type:TotalDamageTrigger !type:DamageTrigger
damage: 50 damage: 50
behaviors: behaviors:
- !type:DoActsBehavior - !type:DoActsBehavior

View File

@@ -44,7 +44,7 @@
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
!type:TotalDamageTrigger !type:DamageTrigger
damage: 100 damage: 100
behaviors: behaviors:
- !type:DoActsBehavior - !type:DoActsBehavior

View File

@@ -40,7 +40,7 @@
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
!type:TotalDamageTrigger !type:DamageTrigger
damage: 100 damage: 100
behaviors: behaviors:
- !type:DoActsBehavior - !type:DoActsBehavior

View File

@@ -28,7 +28,7 @@
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
!type:TotalDamageTrigger !type:DamageTrigger
damage: 10 damage: 10
behaviors: behaviors:
- !type:DoActsBehavior - !type:DoActsBehavior

View File

@@ -19,7 +19,7 @@
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
!type:TotalDamageTrigger !type:DamageTrigger
damage: 100 damage: 100
behaviors: behaviors:
- !type:DoActsBehavior - !type:DoActsBehavior

View File

@@ -33,7 +33,7 @@
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
!type:TotalDamageTrigger !type:DamageTrigger
damage: 50 damage: 50
behaviors: behaviors:
- !type:SpawnEntitiesBehavior - !type:SpawnEntitiesBehavior

View File

@@ -44,7 +44,7 @@
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
!type:TotalDamageTrigger !type:DamageTrigger
damage: 50 damage: 50
behaviors: behaviors:
- !type:DoActsBehavior - !type:DoActsBehavior
@@ -73,8 +73,13 @@
enabled: true enabled: true
offset: "0.5, 0" offset: "0.5, 0"
- type: Destructible - type: Destructible
deadThreshold: 25 thresholds:
resistances: metallicResistances - trigger:
!type:DamageTrigger
damage: 25
behaviors:
- !type:DoActsBehavior
acts: [ "Destruction" ]
- type: Construction - type: Construction
graph: lightFixture graph: lightFixture
node: bulbLight node: bulbLight
@@ -104,7 +109,7 @@
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
!type:TotalDamageTrigger !type:DamageTrigger
damage: 25 damage: 25
behaviors: behaviors:
- !type:DoActsBehavior - !type:DoActsBehavior

View File

@@ -30,7 +30,7 @@
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
!type:TotalDamageTrigger !type:DamageTrigger
damage: 100 damage: 100
behaviors: behaviors:
- !type:DoActsBehavior - !type:DoActsBehavior

View File

@@ -13,7 +13,7 @@
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
!type:TotalDamageTrigger !type:DamageTrigger
damage: 5 damage: 5
behaviors: behaviors:
- !type:DoActsBehavior - !type:DoActsBehavior

View File

@@ -52,7 +52,7 @@
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
!type:TotalDamageTrigger !type:DamageTrigger
damage: 300 damage: 300
behaviors: behaviors:
- !type:SpawnEntitiesBehavior - !type:SpawnEntitiesBehavior
@@ -80,7 +80,7 @@
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
!type:TotalDamageTrigger !type:DamageTrigger
damage: 300 damage: 300
behaviors: behaviors:
- !type:SpawnEntitiesBehavior - !type:SpawnEntitiesBehavior
@@ -108,7 +108,7 @@
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
!type:TotalDamageTrigger !type:DamageTrigger
damage: 300 damage: 300
behaviors: behaviors:
- !type:SpawnEntitiesBehavior - !type:SpawnEntitiesBehavior
@@ -137,7 +137,7 @@
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
!type:TotalDamageTrigger !type:DamageTrigger
damage: 300 damage: 300
behaviors: behaviors:
- !type:SpawnEntitiesBehavior - !type:SpawnEntitiesBehavior
@@ -165,7 +165,7 @@
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
!type:TotalDamageTrigger !type:DamageTrigger
damage: 300 damage: 300
behaviors: behaviors:
- !type:SpawnEntitiesBehavior - !type:SpawnEntitiesBehavior
@@ -193,7 +193,7 @@
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
!type:TotalDamageTrigger !type:DamageTrigger
damage: 300 damage: 300
behaviors: behaviors:
- !type:SpawnEntitiesBehavior - !type:SpawnEntitiesBehavior
@@ -222,7 +222,7 @@
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
!type:TotalDamageTrigger !type:DamageTrigger
damage: 300 damage: 300
behaviors: behaviors:
- !type:SpawnEntitiesBehavior - !type:SpawnEntitiesBehavior
@@ -250,7 +250,7 @@
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
!type:TotalDamageTrigger !type:DamageTrigger
damage: 300 damage: 300
behaviors: behaviors:
- !type:SpawnEntitiesBehavior - !type:SpawnEntitiesBehavior
@@ -278,7 +278,7 @@
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
!type:TotalDamageTrigger !type:DamageTrigger
damage: 300 damage: 300
behaviors: behaviors:
- !type:SpawnEntitiesBehavior - !type:SpawnEntitiesBehavior
@@ -306,7 +306,7 @@
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
!type:TotalDamageTrigger !type:DamageTrigger
damage: 300 damage: 300
behaviors: behaviors:
- !type:SpawnEntitiesBehavior - !type:SpawnEntitiesBehavior
@@ -334,7 +334,7 @@
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
!type:TotalDamageTrigger !type:DamageTrigger
damage: 300 damage: 300
behaviors: behaviors:
- !type:SpawnEntitiesBehavior - !type:SpawnEntitiesBehavior
@@ -367,7 +367,7 @@
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
!type:TotalDamageTrigger !type:DamageTrigger
damage: 600 damage: 600
behaviors: behaviors:
- !type:DoActsBehavior - !type:DoActsBehavior
@@ -397,7 +397,7 @@
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
!type:TotalDamageTrigger !type:DamageTrigger
damage: 1000 damage: 1000
behaviors: behaviors:
- !type:SpawnEntitiesBehavior - !type:SpawnEntitiesBehavior
@@ -425,7 +425,7 @@
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
!type:TotalDamageTrigger !type:DamageTrigger
damage: 300 damage: 300
behaviors: behaviors:
- !type:SpawnEntitiesBehavior - !type:SpawnEntitiesBehavior
@@ -453,7 +453,7 @@
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
!type:TotalDamageTrigger !type:DamageTrigger
damage: 300 damage: 300
behaviors: behaviors:
- !type:SpawnEntitiesBehavior - !type:SpawnEntitiesBehavior
@@ -485,7 +485,7 @@
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
!type:TotalDamageTrigger !type:DamageTrigger
damage: 300 damage: 300
behaviors: behaviors:
- !type:DoActsBehavior - !type:DoActsBehavior
@@ -511,7 +511,7 @@
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
!type:TotalDamageTrigger !type:DamageTrigger
damage: 300 damage: 300
behaviors: behaviors:
- !type:SpawnEntitiesBehavior - !type:SpawnEntitiesBehavior
@@ -539,7 +539,7 @@
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
!type:TotalDamageTrigger !type:DamageTrigger
damage: 300 damage: 300
behaviors: behaviors:
- !type:SpawnEntitiesBehavior - !type:SpawnEntitiesBehavior

View File

@@ -31,7 +31,7 @@
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
!type:TotalDamageTrigger !type:DamageTrigger
damage: 15 damage: 15
behaviors: behaviors:
- !type:PlaySoundCollectionBehavior - !type:PlaySoundCollectionBehavior
@@ -70,7 +70,7 @@
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
!type:TotalDamageTrigger !type:DamageTrigger
damage: 75 damage: 75
behaviors: behaviors:
- !type:PlaySoundCollectionBehavior - !type:PlaySoundCollectionBehavior
@@ -103,7 +103,7 @@
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
!type:TotalDamageTrigger !type:DamageTrigger
damage: 100 damage: 100
behaviors: behaviors:
- !type:PlaySoundCollectionBehavior - !type:PlaySoundCollectionBehavior

View File

@@ -126,7 +126,7 @@
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
!type:TotalDamageTrigger !type:DamageTrigger
damage: 50 damage: 50
behaviors: behaviors:
- !type:DoActsBehavior - !type:DoActsBehavior

View File

@@ -165,9 +165,9 @@
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
!type:TotalDamageTypesTrigger !type:DamageTypeTrigger
damage: type: Blunt
Blunt: 400 damage: 400
behaviors: behaviors:
- !type:GibBehavior { } - !type:GibBehavior { }
- type: HeatResistance - type: HeatResistance

View File

@@ -27,7 +27,7 @@
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
!type:TotalDamageTrigger !type:DamageTrigger
damage: 5 damage: 5
behaviors: behaviors:
- !type:PlaySoundCollectionBehavior - !type:PlaySoundCollectionBehavior

View File

@@ -20,7 +20,7 @@
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
!type:TotalDamageTrigger !type:DamageTrigger
damage: 5 damage: 5
behaviors: behaviors:
- !type:PlaySoundCollectionBehavior - !type:PlaySoundCollectionBehavior

View File

@@ -132,7 +132,7 @@
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
!type:TotalDamageTrigger !type:DamageTrigger
damage: 10 damage: 10
behaviors: behaviors:
- !type:PlaySoundBehavior - !type:PlaySoundBehavior
@@ -163,7 +163,7 @@
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
!type:TotalDamageTrigger !type:DamageTrigger
damage: 20 damage: 20
behaviors: behaviors:
- !type:PlaySoundBehavior - !type:PlaySoundBehavior

View File

@@ -12,7 +12,7 @@
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
!type:TotalDamageTrigger !type:DamageTrigger
damage: 5 damage: 5
behaviors: behaviors:
- !type:PlaySoundCollectionBehavior - !type:PlaySoundCollectionBehavior
@@ -20,7 +20,7 @@
- !type:DoActsBehavior - !type:DoActsBehavior
acts: [ "Breakage" ] acts: [ "Breakage" ]
- trigger: - trigger:
!type:TotalDamageTrigger !type:DamageTrigger
damage: 10 damage: 10
behaviors: behaviors:
- !type:PlaySoundCollectionBehavior - !type:PlaySoundCollectionBehavior

View File

@@ -26,7 +26,7 @@
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
!type:TotalDamageTrigger !type:DamageTrigger
damage: 10 damage: 10
behaviors: behaviors:
- !type:DoActsBehavior - !type:DoActsBehavior
@@ -60,7 +60,7 @@
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
!type:TotalDamageTrigger !type:DamageTrigger
damage: 10 damage: 10
behaviors: behaviors:
- !type:DoActsBehavior - !type:DoActsBehavior
@@ -94,7 +94,7 @@
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
!type:TotalDamageTrigger !type:DamageTrigger
damage: 10 damage: 10
behaviors: behaviors:
- !type:DoActsBehavior - !type:DoActsBehavior
@@ -127,7 +127,7 @@
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
!type:TotalDamageTrigger !type:DamageTrigger
damage: 50 damage: 50
behaviors: behaviors:
- !type:DoActsBehavior - !type:DoActsBehavior