Разрушаемые
Как сделать сущность разрушаемой
Сделать сущность разрушаемой можно, добавив ей компоненты Damageable и Destructible в YAML. Компонент Destructible отвечает за определение списка порогов, которые у него есть, каждый с триггером (когда он сработает) и списком поведений (что происходит при срабатывании).
- type: entity
id: Wall
name: wall
description: Keeps the air in and the greytide out.
components:
- type: Damageable
resistances: metallicResistances
- type: Destructible
thresholds: # Список порогов, которых может достичь эта сущность
# Первый и единственный порог, задающий триггер и список поведений
- trigger: # Триггер этого порога
!type:DamageTrigger # Срабатывает при суммарном уроне...
damage: 300 # ... равном или превышающем 300
behaviors: # Поведения этого порога
- !type:SpawnEntitiesBehavior # Первое поведение, спавнит сущности
spawn:
Girder: # Спавнит каркасы...
min: 1 # ... от минимум 1...
max: 1 # ... до максимум 1
- !type:DoActsBehavior # Второе поведение, активирует список действий
acts: ["Destruction"] # В данном случае действие Destruction
Как добавить новый триггер разрушения
Все триггеры реализуют интерфейс IThresholdTrigger.
Новые можно определить так:
[DataDefinition]
public partial class DamageTrigger : IThresholdTrigger
{
/// <summary>
/// Количество урона, при котором сработает этот порог.
/// </summary>
[DataField]
public int Damage { get; set; }
public bool Reached(IDamageableComponent damageable, DestructibleSystem system)
{
return damageable.TotalDamage >= Damage;
}
}
Как добавить новое поведение при разрушении
Все поведения реализуют интерфейс IThresholdBehavior.
Новые можно определить так:
[DataDefinition]
public partial class PlaySoundBehavior : IThresholdBehavior
{
/// <summary>
/// Звук, проигрываемый при разрушении.
/// </summary>
[DataField]
public string Sound { get; set; } = string.Empty;
public void Execute(IEntity owner, DestructibleSystem system)
{
if (string.IsNullOrEmpty(Sound))
{
return;
}
var pos = owner.Transform.Coordinates;
SoundSystem.Play(Filter.Pvs(pos), Sound, pos, AudioHelpers.WithVariation(0.125f));
}
}