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:
@@ -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()
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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");
|
||||||
|
|||||||
@@ -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]
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -65,6 +65,7 @@
|
|||||||
<s:String x:Key="/Default/FilterSettingsManager/CoverageFilterXml/@EntryValue"><data><IncludeFilters /><ExcludeFilters><Filter ModuleMask="Lidgren.Network" ModuleVersionMask="*" ClassMask="*" FunctionMask="*" IsEnabled="True" /></ExcludeFilters></data></s:String>
|
<s:String x:Key="/Default/FilterSettingsManager/CoverageFilterXml/@EntryValue"><data><IncludeFilters /><ExcludeFilters><Filter ModuleMask="Lidgren.Network" ModuleVersionMask="*" ClassMask="*" FunctionMask="*" IsEnabled="True" /></ExcludeFilters></data></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>
|
||||||
|
|||||||
Reference in New Issue
Block a user