As discussed on the Discord, xenos are not humans (#1840)

* As discussed on the Discord, xenos are not humans

* Add living component for living beings without a defined body

* Merge LivingDamageable and Damageable components

* Fix ruinable and state manager inconsistencies

* Fix ruinable exposedata

* Fix new destructibles yamls

* Fix healing not healing

* Fix alive not being a valid state

* Fix valid state checking
This commit is contained in:
DrSmugleaf
2020-08-22 13:40:22 +02:00
committed by GitHub
parent f7c71b500f
commit bb923aa230
32 changed files with 175 additions and 108 deletions

View File

@@ -18,14 +18,12 @@ using Content.Shared.Body.Template;
using Content.Shared.GameObjects.Components.Body; using Content.Shared.GameObjects.Components.Body;
using Content.Shared.GameObjects.Components.Damage; using Content.Shared.GameObjects.Components.Damage;
using Content.Shared.GameObjects.Components.Movement; using Content.Shared.GameObjects.Components.Movement;
using Robust.Server.GameObjects;
using Robust.Server.Interfaces.Player; using Robust.Server.Interfaces.Player;
using Robust.Shared.GameObjects; using Robust.Shared.GameObjects;
using Robust.Shared.Interfaces.GameObjects; using Robust.Shared.Interfaces.GameObjects;
using Robust.Shared.Interfaces.Reflection; using Robust.Shared.Interfaces.Reflection;
using Robust.Shared.IoC; using Robust.Shared.IoC;
using Robust.Shared.Log; using Robust.Shared.Log;
using Robust.Shared.Maths;
using Robust.Shared.Players; using Robust.Shared.Players;
using Robust.Shared.Prototypes; using Robust.Shared.Prototypes;
using Robust.Shared.Serialization; using Robust.Shared.Serialization;
@@ -138,11 +136,6 @@ namespace Content.Server.GameObjects.Components.Body
base.Initialize(); base.Initialize();
LoadBodyPreset(Preset); LoadBodyPreset(Preset);
foreach (var behavior in Owner.GetAllComponents<IOnHealthChangedBehavior>())
{
HealthChangedEvent += behavior.OnHealthChanged;
}
} }
protected override void Startup() protected override void Startup()

View File

@@ -41,8 +41,6 @@ namespace Content.Server.GameObjects.Components.Damage
switch (eventArgs.Severity) switch (eventArgs.Severity)
{ {
case ExplosionSeverity.Destruction: case ExplosionSeverity.Destruction:
PerformDestruction();
break;
case ExplosionSeverity.Heavy: case ExplosionSeverity.Heavy:
PerformDestruction(); PerformDestruction();
break; break;

View File

@@ -5,7 +5,6 @@ using Robust.Shared.GameObjects;
using Robust.Shared.GameObjects.Systems; using Robust.Shared.GameObjects.Systems;
using Robust.Shared.Interfaces.GameObjects; using Robust.Shared.Interfaces.GameObjects;
using Robust.Shared.Serialization; using Robust.Shared.Serialization;
using Robust.Shared.ViewVariables;
namespace Content.Server.GameObjects.Components.Damage namespace Content.Server.GameObjects.Components.Damage
{ {
@@ -18,13 +17,6 @@ namespace Content.Server.GameObjects.Components.Damage
{ {
private DamageState _currentDamageState; private DamageState _currentDamageState;
/// <summary>
/// How much HP this component can sustain before triggering
/// <see cref="PerformDestruction"/>.
/// </summary>
[ViewVariables(VVAccess.ReadWrite)]
public int MaxHp { get; private set; }
/// <summary> /// <summary>
/// Sound played upon destruction. /// Sound played upon destruction.
/// </summary> /// </summary>
@@ -35,29 +27,24 @@ namespace Content.Server.GameObjects.Components.Damage
public override DamageState CurrentDamageState => _currentDamageState; public override DamageState CurrentDamageState => _currentDamageState;
public override void Initialize()
{
base.Initialize();
HealthChangedEvent += OnHealthChanged;
}
public override void ExposeData(ObjectSerializer serializer) public override void ExposeData(ObjectSerializer serializer)
{ {
base.ExposeData(serializer); base.ExposeData(serializer);
serializer.DataField(this, ruinable => ruinable.MaxHp, "maxHP", 100); serializer.DataReadWriteFunction(
"deadThreshold",
100,
t => DeadThreshold = t ,
() => DeadThreshold ?? -1);
serializer.DataField(this, ruinable => ruinable.DestroySound, "destroySound", string.Empty); serializer.DataField(this, ruinable => ruinable.DestroySound, "destroySound", string.Empty);
} }
public override void OnRemove() protected override void EnterState(DamageState state)
{ {
base.OnRemove(); base.EnterState(state);
HealthChangedEvent -= OnHealthChanged;
}
private void OnHealthChanged(HealthChangedEventArgs e) if (state == DamageState.Dead)
{
if (CurrentDamageState != DamageState.Dead && TotalDamage >= MaxHp)
{ {
PerformDestruction(); PerformDestruction();
} }

View File

@@ -187,7 +187,12 @@ namespace Content.Server.GameObjects.Components.Mobs
{ {
case RuinableComponent ruinable: case RuinableComponent ruinable:
{ {
var modifier = (int) (ruinable.TotalDamage / (ruinable.MaxHp / 7f)); if (ruinable.DeadThreshold == null)
{
break;
}
var modifier = (int) (ruinable.TotalDamage / (ruinable.DeadThreshold / 7f));
status.ChangeStatusEffectIcon(StatusEffect.Health, status.ChangeStatusEffectIcon(StatusEffect.Health,
"/Textures/Interface/StatusEffects/Human/human" + modifier + ".png"); "/Textures/Interface/StatusEffects/Human/human" + modifier + ".png");
@@ -196,8 +201,12 @@ namespace Content.Server.GameObjects.Components.Mobs
} }
case BodyManagerComponent body: case BodyManagerComponent body:
{ {
// TODO: Declare body max normal damage (currently 100) if (body.CriticalThreshold == null)
var modifier = (int) (body.TotalDamage / (100f / 7f)); {
return;
}
var modifier = (int) (body.TotalDamage / (body.CriticalThreshold / 7f));
status.ChangeStatusEffectIcon(StatusEffect.Health, status.ChangeStatusEffectIcon(StatusEffect.Health,
"/Textures/Interface/StatusEffects/Human/human" + modifier + ".png"); "/Textures/Interface/StatusEffects/Human/human" + modifier + ".png");

View File

@@ -1,5 +1,4 @@
using System; using System;
using System.Collections.Generic;
using Content.Shared.GameObjects.Components.Damage; using Content.Shared.GameObjects.Components.Damage;
using Robust.Shared.GameObjects; using Robust.Shared.GameObjects;
using Robust.Shared.Serialization; using Robust.Shared.Serialization;
@@ -11,15 +10,6 @@ namespace Content.Shared.GameObjects.Components.Body
public override string Name => "BodyManager"; public override string Name => "BodyManager";
public override uint? NetID => ContentNetIDs.BODY_MANAGER; public override uint? NetID => ContentNetIDs.BODY_MANAGER;
public override List<DamageState> SupportedDamageStates => new List<DamageState> {DamageState.Alive, DamageState.Critical, DamageState.Dead};
public override DamageState CurrentDamageState =>
CurrentDamageState = TotalDamage > 200
? DamageState.Dead
: TotalDamage > 100
? DamageState.Critical
: DamageState.Alive;
} }
[Serializable, NetSerializable] [Serializable, NetSerializable]

View File

@@ -27,15 +27,62 @@ namespace Content.Shared.GameObjects.Components.Damage
public override string Name => "Damageable"; public override string Name => "Damageable";
public event Action<HealthChangedEventArgs> HealthChangedEvent = default!; private DamageState _currentDamageState;
public event Action<HealthChangedEventArgs>? HealthChangedEvent;
/// <summary>
/// The threshold of damage, if any, above which the entity enters crit.
/// -1 means that this entity cannot go into crit.
/// </summary>
[ViewVariables(VVAccess.ReadWrite)]
public int? CriticalThreshold { get; set; }
/// <summary>
/// The threshold of damage, if any, above which the entity dies.
/// -1 means that this entity cannot die.
/// </summary>
[ViewVariables(VVAccess.ReadWrite)]
public int? DeadThreshold { get; set; }
[ViewVariables] private ResistanceSet Resistance { get; set; } = default!; [ViewVariables] private ResistanceSet Resistance { get; set; } = default!;
[ViewVariables] private DamageContainer Damage { get; set; } = default!; [ViewVariables] private DamageContainer Damage { get; set; } = default!;
public virtual List<DamageState> SupportedDamageStates => new List<DamageState> {DamageState.Alive}; public virtual List<DamageState> SupportedDamageStates
{
get
{
var states = new List<DamageState> {DamageState.Alive};
public virtual DamageState CurrentDamageState { get; protected set; } = DamageState.Alive; if (CriticalThreshold != null)
{
states.Add(DamageState.Critical);
}
if (DeadThreshold != null)
{
states.Add(DamageState.Dead);
}
return states;
}
}
public virtual DamageState CurrentDamageState
{
get => _currentDamageState;
set
{
var old = _currentDamageState;
_currentDamageState = value;
if (old != value)
{
EnterState(value);
}
}
}
[ViewVariables] public int TotalDamage => Damage.TotalDamage; [ViewVariables] public int TotalDamage => Damage.TotalDamage;
@@ -47,6 +94,18 @@ namespace Content.Shared.GameObjects.Components.Damage
{ {
base.ExposeData(serializer); base.ExposeData(serializer);
serializer.DataReadWriteFunction(
"criticalThreshold",
-1,
t => CriticalThreshold = t == -1 ? (int?) null : t,
() => CriticalThreshold ?? -1);
serializer.DataReadWriteFunction(
"deadThreshold",
-1,
t => DeadThreshold = t == -1 ? (int?) null : t,
() => DeadThreshold ?? -1);
if (serializer.Reading) if (serializer.Reading)
{ {
// Doesn't write to file, TODO? // Doesn't write to file, TODO?
@@ -75,6 +134,16 @@ namespace Content.Shared.GameObjects.Components.Damage
} }
} }
public override void Initialize()
{
base.Initialize();
foreach (var behavior in Owner.GetAllComponents<IOnHealthChangedBehavior>())
{
HealthChangedEvent += behavior.OnHealthChanged;
}
}
public bool TryGetDamage(DamageType type, out int damage) public bool TryGetDamage(DamageType type, out int damage)
{ {
return Damage.TryGetDamageValue(type, out damage); return Damage.TryGetDamageValue(type, out damage);
@@ -218,10 +287,26 @@ namespace Content.Shared.GameObjects.Components.Damage
OnHealthChanged(args); OnHealthChanged(args);
} }
protected virtual void EnterState(DamageState state) { }
protected virtual void OnHealthChanged(HealthChangedEventArgs e) protected virtual void OnHealthChanged(HealthChangedEventArgs e)
{ {
if (DeadThreshold != -1 && TotalDamage > DeadThreshold)
{
CurrentDamageState = DamageState.Dead;
}
else if (CriticalThreshold != -1 && TotalDamage > CriticalThreshold)
{
CurrentDamageState = DamageState.Critical;
}
else
{
CurrentDamageState = DamageState.Alive;
}
Owner.EntityManager.EventBus.RaiseEvent(EventSource.Local, e); Owner.EntityManager.EventBus.RaiseEvent(EventSource.Local, e);
HealthChangedEvent?.Invoke(e); HealthChangedEvent?.Invoke(e);
Dirty(); Dirty();
} }
} }

View File

@@ -59,7 +59,7 @@
- type: SnapGrid - type: SnapGrid
offset: Center offset: Center
- type: Destructible - type: Destructible
maxHP: 500 deadThreshold: 500
placement: placement:
mode: SnapgridCenter mode: SnapgridCenter

View File

@@ -18,7 +18,7 @@
- type: Anchorable - type: Anchorable
- type: Pullable - type: Pullable
- type: Destructible - type: Destructible
maxHP: 50 deadThreshold: 50
- type: entity - type: entity
name: bar stool name: bar stool
@@ -51,7 +51,7 @@
- type: Anchorable - type: Anchorable
- type: Pullable - type: Pullable
- type: Destructible - type: Destructible
maxHP: 50 deadThreshold: 50
- type: entity - type: entity
name: dark office chair name: dark office chair
@@ -86,7 +86,7 @@
- type: Anchorable - type: Anchorable
- type: Pullable - type: Pullable
- type: Destructible - type: Destructible
maxHP: 50 deadThreshold: 50
- type: entity - type: entity
parent: Chair parent: Chair
@@ -134,6 +134,6 @@
position: Down position: Down
rotation: -90 rotation: -90
- type: Destructible - type: Destructible
maxHP: 75 deadThreshold: 75
placement: placement:
mode: SnapgridCenter mode: SnapgridCenter

View File

@@ -18,7 +18,7 @@
- type: SnapGrid - type: SnapGrid
offset: Center offset: Center
- type: Destructible - type: Destructible
maxHP: 50 deadThreshold: 50
- type: UserInterface - type: UserInterface
interfaces: interfaces:
- key: enum.InstrumentUiKey.Key - key: enum.InstrumentUiKey.Key

View File

@@ -14,7 +14,7 @@
- type: Clickable - type: Clickable
- type: InteractionOutline - type: InteractionOutline
- type: Destructible - type: Destructible
maxHP: 100 deadThreshold: 100
- type: Physics - type: Physics
- type: ShuttleController - type: ShuttleController
- type: Strap - type: Strap

View File

@@ -24,7 +24,7 @@
base: solid_ base: solid_
- type: Climbable - type: Climbable
- type: Destructible - type: Destructible
maxHP: 50 deadThreshold: 50
spawnOnDestroy: SteelSheet1 spawnOnDestroy: SteelSheet1
# TODO: drop wood instead of steel when destroyed when that's added # TODO: drop wood instead of steel when destroyed when that's added
@@ -40,5 +40,5 @@
key: wood key: wood
base: wood_ base: wood_
- type: Destructible - type: Destructible
maxHP: 50 deadThreshold: 50
spawnOnDestroy: SteelSheet1 spawnOnDestroy: SteelSheet1

View File

@@ -29,7 +29,7 @@
- type: Clickable - type: Clickable
- type: InteractionOutline - type: InteractionOutline
- type: Breakable - type: Breakable
maxHP: 150 deadThreshold: 150
- type: GravityGenerator - type: GravityGenerator
- type: UserInterface - type: UserInterface
interfaces: interfaces:

View File

@@ -35,7 +35,7 @@
offset: Center offset: Center
- type: MedicalScanner - type: MedicalScanner
- type: Destructible - type: Destructible
maxHP: 100 deadThreshold: 100
- type: Appearance - type: Appearance
visuals: visuals:
- type: MedicalScannerVisualizer - type: MedicalScannerVisualizer

View File

@@ -51,7 +51,7 @@
- type: PowerConsumer - type: PowerConsumer
drawRate: 50 drawRate: 50
- type: Breakable - type: Breakable
maxHP: 100 deadThreshold: 100
- type: Anchorable - type: Anchorable
- type: entity - type: entity
@@ -290,7 +290,7 @@
- type: SnapGrid - type: SnapGrid
offset: Center offset: Center
- type: Breakable - type: Breakable
maxHP: 100 deadThreshold: 100
#Depriciated, to be removed from maps #Depriciated, to be removed from maps

View File

@@ -31,7 +31,7 @@
- type: SnapGrid - type: SnapGrid
offset: Center offset: Center
- type: Breakable - type: Breakable
maxHP: 50 deadThreshold: 50
- type: UserInterface - type: UserInterface
interfaces: interfaces:
- key: enum.VendingMachineUiKey.Key - key: enum.VendingMachineUiKey.Key

View File

@@ -42,7 +42,7 @@
- type: EntityStorage - type: EntityStorage
- type: PlaceableSurface - type: PlaceableSurface
- type: Destructible - type: Destructible
maxHP: 100 deadThreshold: 100
- type: Appearance - type: Appearance
visuals: visuals:
- type: StorageVisualizer - type: StorageVisualizer

View File

@@ -26,7 +26,7 @@
mass: 15 mass: 15
Anchored: false Anchored: false
- type: Destructible - type: Destructible
maxHP: 10 deadThreshold: 10
- type: Solution - type: Solution
maxVol: 1500 maxVol: 1500
caps: 2 caps: 2

View File

@@ -37,7 +37,7 @@
CanWeldShut: false CanWeldShut: false
- type: PlaceableSurface - type: PlaceableSurface
- type: Destructible - type: Destructible
maxHP: 100 deadThreshold: 100
- type: Appearance - type: Appearance
visuals: visuals:
- type: StorageVisualizer - type: StorageVisualizer

View File

@@ -17,7 +17,7 @@
- !type:PhysShapeAabb - !type:PhysShapeAabb
layer: [MobMask] layer: [MobMask]
- type: Destructible - type: Destructible
maxHP: 100 deadThreshold: 100
- type: Occluder - type: Occluder
sizeX: 32 sizeX: 32
sizeY: 32 sizeY: 32

View File

@@ -15,7 +15,7 @@
- !type:PhysShapeAabb - !type:PhysShapeAabb
layer: [MobMask, Opaque] layer: [MobMask, Opaque]
- type: Destructible - type: Destructible
maxHP: 50 deadThreshold: 50
spawnOnDestroy: SteelSheet1 spawnOnDestroy: SteelSheet1
- type: SnapGrid - type: SnapGrid
offset: Edge offset: Edge

View File

@@ -46,7 +46,7 @@
bulb: Tube bulb: Tube
- type: PowerReceiver - type: PowerReceiver
- type: Destructible - type: Destructible
maxHP: 50 deadThreshold: 50
- type: entity - type: entity
name: small light name: small light
@@ -69,4 +69,4 @@
bulb: Bulb bulb: Bulb
- type: PowerReceiver - type: PowerReceiver
- type: Destructible - type: Destructible
maxHP: 25 deadThreshold: 25

View File

@@ -25,7 +25,7 @@
- VaultImpassable - VaultImpassable
- SmallImpassable - SmallImpassable
- type: Destructible - type: Destructible
maxHP: 100 deadThreshold: 100
- type: SnapGrid - type: SnapGrid
offset: Center offset: Center
- type: LowWall - type: LowWall

View File

@@ -26,7 +26,7 @@
- VaultImpassable - VaultImpassable
- SmallImpassable - SmallImpassable
- type: Destructible - type: Destructible
maxHP: 500 deadThreshold: 500
spawnOnDestroy: Girder spawnOnDestroy: Girder
- type: Occluder - type: Occluder
sizeX: 32 sizeX: 32
@@ -49,7 +49,7 @@
- type: Icon - type: Icon
sprite: Constructible/Structures/Walls/brick.rsi sprite: Constructible/Structures/Walls/brick.rsi
- type: Destructible - type: Destructible
maxHP: 300 deadThreshold: 300
spawnOnDestroy: Girder spawnOnDestroy: Girder
- type: IconSmooth - type: IconSmooth
key: walls key: walls
@@ -65,7 +65,7 @@
- type: Icon - type: Icon
sprite: Constructible/Structures/Walls/clock.rsi sprite: Constructible/Structures/Walls/clock.rsi
- type: Destructible - type: Destructible
maxHP: 300 deadThreshold: 300
spawnOnDestroy: Girder spawnOnDestroy: Girder
- type: IconSmooth - type: IconSmooth
key: walls key: walls
@@ -81,7 +81,7 @@
- type: Icon - type: Icon
sprite: Constructible/Structures/Walls/clown.rsi sprite: Constructible/Structures/Walls/clown.rsi
- type: Destructible - type: Destructible
maxHP: 300 deadThreshold: 300
spawnOnDestroy: Girder spawnOnDestroy: Girder
- type: IconSmooth - type: IconSmooth
key: walls key: walls
@@ -98,7 +98,7 @@
- type: Icon - type: Icon
sprite: Constructible/Structures/Walls/cult.rsi sprite: Constructible/Structures/Walls/cult.rsi
- type: Destructible - type: Destructible
maxHP: 300 deadThreshold: 300
spawnOnDestroy: Girder spawnOnDestroy: Girder
- type: IconSmooth - type: IconSmooth
key: walls key: walls
@@ -114,7 +114,7 @@
- type: Icon - type: Icon
sprite: Constructible/Structures/Walls/debug.rsi sprite: Constructible/Structures/Walls/debug.rsi
- type: Destructible - type: Destructible
maxHP: 300 deadThreshold: 300
spawnOnDestroy: Girder spawnOnDestroy: Girder
- type: IconSmooth - type: IconSmooth
key: walls key: walls
@@ -130,7 +130,7 @@
- type: Icon - type: Icon
sprite: Constructible/Structures/Walls/diamond.rsi sprite: Constructible/Structures/Walls/diamond.rsi
- type: Destructible - type: Destructible
maxHP: 300 deadThreshold: 300
spawnOnDestroy: Girder spawnOnDestroy: Girder
- type: IconSmooth - type: IconSmooth
key: walls key: walls
@@ -147,7 +147,7 @@
- type: Icon - type: Icon
sprite: Constructible/Structures/Walls/gold.rsi sprite: Constructible/Structures/Walls/gold.rsi
- type: Destructible - type: Destructible
maxHP: 300 deadThreshold: 300
spawnOnDestroy: Girder spawnOnDestroy: Girder
- type: IconSmooth - type: IconSmooth
key: walls key: walls
@@ -163,7 +163,7 @@
- type: Icon - type: Icon
sprite: Constructible/Structures/Walls/ice.rsi sprite: Constructible/Structures/Walls/ice.rsi
- type: Destructible - type: Destructible
maxHP: 300 deadThreshold: 300
spawnOnDestroy: Girder spawnOnDestroy: Girder
- type: IconSmooth - type: IconSmooth
key: walls key: walls
@@ -179,7 +179,7 @@
- type: Icon - type: Icon
sprite: Constructible/Structures/Walls/metal.rsi sprite: Constructible/Structures/Walls/metal.rsi
- type: Destructible - type: Destructible
maxHP: 300 deadThreshold: 300
spawnOnDestroy: Girder spawnOnDestroy: Girder
- type: IconSmooth - type: IconSmooth
key: walls key: walls
@@ -195,7 +195,7 @@
- type: Icon - type: Icon
sprite: Constructible/Structures/Walls/plasma.rsi sprite: Constructible/Structures/Walls/plasma.rsi
- type: Destructible - type: Destructible
maxHP: 300 deadThreshold: 300
spawnOnDestroy: Girder spawnOnDestroy: Girder
- type: IconSmooth - type: IconSmooth
key: walls key: walls
@@ -211,7 +211,7 @@
- type: Icon - type: Icon
sprite: Constructible/Structures/Walls/plastic.rsi sprite: Constructible/Structures/Walls/plastic.rsi
- type: Destructible - type: Destructible
maxHP: 300 deadThreshold: 300
spawnOnDestroy: Girder spawnOnDestroy: Girder
- type: IconSmooth - type: IconSmooth
key: walls key: walls
@@ -229,7 +229,7 @@
sprite: Constructible/Structures/Walls/solid.rsi sprite: Constructible/Structures/Walls/solid.rsi
state: rgeneric state: rgeneric
- type: Destructible - type: Destructible
maxHP: 600 deadThreshold: 600
spawnOnDestroy: Girder spawnOnDestroy: Girder
- type: ReinforcedWall - type: ReinforcedWall
key: walls key: walls
@@ -247,7 +247,7 @@
- type: Icon - type: Icon
sprite: Constructible/Structures/Walls/riveted.rsi sprite: Constructible/Structures/Walls/riveted.rsi
- type: Destructible - type: Destructible
maxHP: 1000 deadThreshold: 1000
spawnOnDestroy: Girder spawnOnDestroy: Girder
- type: IconSmooth - type: IconSmooth
key: walls key: walls
@@ -263,7 +263,7 @@
- type: Icon - type: Icon
sprite: Constructible/Structures/Walls/sandstone.rsi sprite: Constructible/Structures/Walls/sandstone.rsi
- type: Destructible - type: Destructible
maxHP: 300 deadThreshold: 300
spawnOnDestroy: Girder spawnOnDestroy: Girder
- type: IconSmooth - type: IconSmooth
key: walls key: walls
@@ -279,7 +279,7 @@
- type: Icon - type: Icon
sprite: Constructible/Structures/Walls/silver.rsi sprite: Constructible/Structures/Walls/silver.rsi
- type: Destructible - type: Destructible
maxHP: 300 deadThreshold: 300
spawnOnDestroy: Girder spawnOnDestroy: Girder
- type: IconSmooth - type: IconSmooth
key: walls key: walls
@@ -296,7 +296,7 @@
- type: Icon - type: Icon
sprite: Constructible/Structures/Walls/solid.rsi sprite: Constructible/Structures/Walls/solid.rsi
- type: Destructible - type: Destructible
maxHP: 300 deadThreshold: 300
spawnOnDestroy: Girder spawnOnDestroy: Girder
destroySound: /Audio/Effects/metalbreak.ogg destroySound: /Audio/Effects/metalbreak.ogg
- type: IconSmooth - type: IconSmooth
@@ -313,7 +313,7 @@
- type: Icon - type: Icon
sprite: Constructible/Structures/Walls/uranium.rsi sprite: Constructible/Structures/Walls/uranium.rsi
- type: Destructible - type: Destructible
maxHP: 300 deadThreshold: 300
spawnOnDestroy: Girder spawnOnDestroy: Girder
- type: IconSmooth - type: IconSmooth
key: walls key: walls
@@ -329,7 +329,7 @@
- type: Icon - type: Icon
sprite: Constructible/Structures/Walls/wood.rsi sprite: Constructible/Structures/Walls/wood.rsi
- type: Destructible - type: Destructible
maxHP: 300 deadThreshold: 300
spawnOnDestroy: Girder spawnOnDestroy: Girder
- type: IconSmooth - type: IconSmooth
key: walls key: walls

View File

@@ -28,7 +28,7 @@
- VaultImpassable - VaultImpassable
- SmallImpassable - SmallImpassable
- type: Destructible - type: Destructible
maxHP: 100 deadThreshold: 100
- type: SnapGrid - type: SnapGrid
offset: Center offset: Center
- type: Airtight - type: Airtight

View File

@@ -39,9 +39,9 @@
layer: layer:
- Opaque - Opaque
- MobImpassable - MobImpassable
- type: BodyManager - type: Damageable
BaseTemplate: bodyTemplate.Humanoid criticalThreshold: 50
BasePreset: bodyPreset.BasicHuman deadThreshold: 100
- type: HeatResistance - type: HeatResistance
- type: CombatMode - type: CombatMode
- type: Teleportable - type: Teleportable

View File

@@ -34,9 +34,9 @@
layer: layer:
- Opaque - Opaque
- MobImpassable - MobImpassable
- type: BodyManager - type: Damageable
BaseTemplate: bodyTemplate.Humanoid criticalThreshold: 50
BasePreset: bodyPreset.BasicHuman deadThreshold: 100
- type: HeatResistance - type: HeatResistance
- type: CombatMode - type: CombatMode
- type: Teleportable - type: Teleportable

View File

@@ -34,9 +34,9 @@
layer: layer:
- Opaque - Opaque
- MobImpassable - MobImpassable
- type: BodyManager - type: Damageable
baseTemplate: bodyTemplate.Humanoid criticalThreshold: 100
basePreset: bodyPreset.BasicHuman deadThreshold: 200
- type: MobStateManager - type: MobStateManager
- type: HeatResistance - type: HeatResistance
- type: CombatMode - type: CombatMode

View File

@@ -31,9 +31,9 @@
layer: layer:
- Opaque - Opaque
- MobImpassable - MobImpassable
- type: BodyManager - type: Damageable
BaseTemplate: bodyTemplate.Humanoid criticalThreshold: 50
BasePreset: bodyPreset.BasicHuman deadThreshold: 100
- type: HeatResistance - type: HeatResistance
- type: CombatMode - type: CombatMode
- type: Teleportable - type: Teleportable

View File

@@ -36,9 +36,9 @@
layer: layer:
- Opaque - Opaque
- MobImpassable - MobImpassable
- type: BodyManager - type: Damageable
baseTemplate: bodyTemplate.Humanoid criticalThreshold: 150
basePreset: bodyPreset.BasicHuman deadThreshold: 200
- type: Metabolism - type: Metabolism
- type: MobStateManager - type: MobStateManager
- type: HeatResistance - type: HeatResistance

View File

@@ -126,6 +126,8 @@
- Opaque - Opaque
- MobImpassable - MobImpassable
- type: BodyManager - type: BodyManager
criticalThreshold: 100
deadThreshold: 200
baseTemplate: bodyTemplate.Humanoid baseTemplate: bodyTemplate.Humanoid
basePreset: bodyPreset.BasicHuman basePreset: bodyPreset.BasicHuman
- type: Metabolism - type: Metabolism
@@ -256,6 +258,8 @@
layer: layer:
- MobImpassable - MobImpassable
- type: BodyManager - type: BodyManager
criticalThreshold: 100
deadThreshold: 200
baseTemplate: bodyTemplate.Humanoid baseTemplate: bodyTemplate.Humanoid
basePreset: bodyPreset.BasicHuman basePreset: bodyPreset.BasicHuman
- type: MobStateManager - type: MobStateManager

View File

@@ -22,7 +22,7 @@
lightImpactRange: 4 lightImpactRange: 4
flashRange: 7 flashRange: 7
- type: Destructible - type: Destructible
maxHP: 10 deadThreshold: 10
- type: Appearance - type: Appearance
visuals: visuals:
- type: TimerTriggerVisualizer - type: TimerTriggerVisualizer
@@ -48,7 +48,7 @@
delay: 3.5 delay: 3.5
- type: FlashExplosive - type: FlashExplosive
- type: Destructible - type: Destructible
maxHP: 10 deadThreshold: 10
- type: Appearance - type: Appearance
visuals: visuals:
- type: TimerTriggerVisualizer - type: TimerTriggerVisualizer
@@ -78,7 +78,7 @@
lightImpactRange: 7 lightImpactRange: 7
flashRange: 10 flashRange: 10
- type: Destructible - type: Destructible
maxHP: 10 deadThreshold: 10
- type: Appearance - type: Appearance
visuals: visuals:
- type: TimerTriggerVisualizer - type: TimerTriggerVisualizer

View File

@@ -65,6 +65,7 @@
<s:String x:Key="/Default/FilterSettingsManager/CoverageFilterXml/@EntryValue">&lt;data&gt;&lt;IncludeFilters /&gt;&lt;ExcludeFilters&gt;&lt;Filter ModuleMask="Lidgren.Network" ModuleVersionMask="*" ClassMask="*" FunctionMask="*" IsEnabled="True" /&gt;&lt;/ExcludeFilters&gt;&lt;/data&gt;</s:String> <s:String x:Key="/Default/FilterSettingsManager/CoverageFilterXml/@EntryValue">&lt;data&gt;&lt;IncludeFilters /&gt;&lt;ExcludeFilters&gt;&lt;Filter ModuleMask="Lidgren.Network" ModuleVersionMask="*" ClassMask="*" FunctionMask="*" IsEnabled="True" /&gt;&lt;/ExcludeFilters&gt;&lt;/data&gt;</s:String>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Collidable/@EntryIndexedValue">True</s:Boolean> <s:Boolean x:Key="/Default/UserDictionary/Words/=Collidable/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Cooldowns/@EntryIndexedValue">True</s:Boolean> <s:Boolean x:Key="/Default/UserDictionary/Words/=Cooldowns/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=crit/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=firelocks/@EntryIndexedValue">True</s:Boolean> <s:Boolean x:Key="/Default/UserDictionary/Words/=firelocks/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=diminishingly/@EntryIndexedValue">True</s:Boolean> <s:Boolean x:Key="/Default/UserDictionary/Words/=diminishingly/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=flashable/@EntryIndexedValue">True</s:Boolean> <s:Boolean x:Key="/Default/UserDictionary/Words/=flashable/@EntryIndexedValue">True</s:Boolean>