2020-10-29 21:42:11 +02:00
|
|
|
|
using System;
|
|
|
|
|
|
using Content.Server.Utility;
|
|
|
|
|
|
using Content.Shared.Audio;
|
|
|
|
|
|
using Content.Shared.GameObjects.Components;
|
|
|
|
|
|
using Content.Shared.GameObjects.Components.Damage;
|
|
|
|
|
|
using Content.Shared.GameObjects.EntitySystems;
|
|
|
|
|
|
using Content.Shared.Interfaces.GameObjects.Components;
|
|
|
|
|
|
using Content.Shared.Utility;
|
|
|
|
|
|
using Robust.Server.GameObjects;
|
|
|
|
|
|
using Robust.Server.GameObjects.EntitySystems;
|
2020-10-08 17:41:23 +02:00
|
|
|
|
using Robust.Shared.GameObjects;
|
2020-10-29 21:42:11 +02:00
|
|
|
|
using Robust.Shared.GameObjects.Systems;
|
|
|
|
|
|
using Robust.Shared.Localization;
|
|
|
|
|
|
using Robust.Shared.Utility;
|
2020-10-08 17:41:23 +02:00
|
|
|
|
|
|
|
|
|
|
namespace Content.Server.GameObjects.Components
|
|
|
|
|
|
{
|
|
|
|
|
|
[RegisterComponent]
|
|
|
|
|
|
[ComponentReference(typeof(SharedWindowComponent))]
|
2020-10-29 21:42:11 +02:00
|
|
|
|
public class WindowComponent : SharedWindowComponent, IExamine, IInteractHand
|
2020-10-08 17:41:23 +02:00
|
|
|
|
{
|
2020-10-29 21:42:11 +02:00
|
|
|
|
private int? Damage
|
|
|
|
|
|
{
|
|
|
|
|
|
get
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!Owner.TryGetComponent(out IDamageableComponent damageableComponent)) return null;
|
|
|
|
|
|
return damageableComponent.TotalDamage;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private int? MaxDamage
|
|
|
|
|
|
{
|
|
|
|
|
|
get
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!Owner.TryGetComponent(out IDamageableComponent damageableComponent)) return null;
|
|
|
|
|
|
return damageableComponent.Thresholds[DamageState.Dead];
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public override void Initialize()
|
|
|
|
|
|
{
|
|
|
|
|
|
base.Initialize();
|
|
|
|
|
|
if (Owner.TryGetComponent(out IDamageableComponent damageableComponent))
|
|
|
|
|
|
{
|
|
|
|
|
|
damageableComponent.HealthChangedEvent += OnDamage;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private void OnDamage(HealthChangedEventArgs eventArgs)
|
|
|
|
|
|
{
|
|
|
|
|
|
int current = eventArgs.Damageable.TotalDamage;
|
|
|
|
|
|
int max = eventArgs.Damageable.Thresholds[DamageState.Dead];
|
|
|
|
|
|
if (eventArgs.Damageable.CurrentState == DamageState.Dead) return;
|
|
|
|
|
|
UpdateVisuals(current, max);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private void UpdateVisuals(int currentDamage, int maxDamage)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (Owner.TryGetComponent(out AppearanceComponent appearance))
|
|
|
|
|
|
{
|
|
|
|
|
|
appearance.SetData(WindowVisuals.Damage, (float) currentDamage / maxDamage);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void IExamine.Examine(FormattedMessage message, bool inDetailsRange)
|
|
|
|
|
|
{
|
|
|
|
|
|
int? damage = Damage;
|
|
|
|
|
|
int? maxDamage = MaxDamage;
|
|
|
|
|
|
if (damage == null || maxDamage == null) return;
|
|
|
|
|
|
float fraction = ((damage == 0 || maxDamage == 0) ? 0f : (float) damage / maxDamage) ?? 0f;
|
|
|
|
|
|
int level = Math.Min(ContentHelpers.RoundToLevels(fraction, 1, 7), 5);
|
|
|
|
|
|
switch (level)
|
|
|
|
|
|
{
|
|
|
|
|
|
case 0:
|
|
|
|
|
|
message.AddText(Loc.GetString("It looks fully intact."));
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 1:
|
|
|
|
|
|
message.AddText(Loc.GetString("It has a few scratches."));
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 2:
|
|
|
|
|
|
message.AddText(Loc.GetString("It has a few small cracks."));
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 3:
|
|
|
|
|
|
message.AddText(Loc.GetString("It has several big cracks running along its surface."));
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 4:
|
|
|
|
|
|
message.AddText(Loc.GetString("It has deep cracks across multiple layers."));
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 5:
|
|
|
|
|
|
message.AddText(Loc.GetString("It is extremely badly cracked and on the verge of shattering."));
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool IInteractHand.InteractHand(InteractHandEventArgs eventArgs)
|
|
|
|
|
|
{
|
|
|
|
|
|
EntitySystem.Get<AudioSystem>()
|
|
|
|
|
|
.PlayAtCoords("/Audio/Effects/glass_knock.ogg", eventArgs.Target.Transform.Coordinates, AudioHelpers.WithVariation(0.05f));
|
|
|
|
|
|
eventArgs.Target.PopupMessageEveryone(Loc.GetString("*knock knock*"));
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
2020-10-08 17:41:23 +02:00
|
|
|
|
}
|
|
|
|
|
|
}
|