Make godmode able to be disabled and more accessible to the rest of the code (#2560)

* Make Godmode able to be disabled and more accessible

* You got a license for that exclamation mark?

* Move restore logic to the entity system

* Make MovedByPressureComponent able to be disabled

* Add extension that gives you the moved by pressure component

* Fix not disabling moved by pressure
This commit is contained in:
DrSmugleaf
2020-11-22 04:45:15 +01:00
committed by GitHub
parent 1f654df977
commit eb97168e30
4 changed files with 129 additions and 13 deletions

View File

@@ -197,7 +197,7 @@ namespace Content.Server.Atmos
foreach (var entity in _gridTileLookupSystem.GetEntitiesIntersecting(GridIndex, GridIndices)) foreach (var entity in _gridTileLookupSystem.GetEntitiesIntersecting(GridIndex, GridIndices))
{ {
if (!entity.TryGetComponent(out IPhysicsComponent physics) if (!entity.TryGetComponent(out IPhysicsComponent physics)
|| !entity.TryGetComponent(out MovedByPressureComponent pressure) || !entity.IsMovedByPressure(out var pressure)
|| entity.IsInContainer()) || entity.IsInContainer())
continue; continue;

View File

@@ -1,4 +1,7 @@
using Robust.Shared.GameObjects; #nullable enable
using System.Diagnostics.CodeAnalysis;
using Robust.Shared.GameObjects;
using Robust.Shared.Interfaces.GameObjects;
using Robust.Shared.Serialization; using Robust.Shared.Serialization;
using Robust.Shared.ViewVariables; using Robust.Shared.ViewVariables;
@@ -9,6 +12,8 @@ namespace Content.Server.GameObjects.Components.Atmos
{ {
public override string Name => "MovedByPressure"; public override string Name => "MovedByPressure";
[ViewVariables(VVAccess.ReadWrite)]
public bool Enabled { get; set; } = true;
[ViewVariables(VVAccess.ReadWrite)] [ViewVariables(VVAccess.ReadWrite)]
public float PressureResistance { get; set; } = 1f; public float PressureResistance { get; set; } = 1f;
[ViewVariables(VVAccess.ReadWrite)] [ViewVariables(VVAccess.ReadWrite)]
@@ -19,8 +24,23 @@ namespace Content.Server.GameObjects.Components.Atmos
public override void ExposeData(ObjectSerializer serializer) public override void ExposeData(ObjectSerializer serializer)
{ {
base.ExposeData(serializer); base.ExposeData(serializer);
serializer.DataField(this, x => x.Enabled, "enabled", true);
serializer.DataField(this, x => PressureResistance, "pressureResistance", 1f); serializer.DataField(this, x => PressureResistance, "pressureResistance", 1f);
serializer.DataField(this, x => MoveResist, "moveResist", 100f); serializer.DataField(this, x => MoveResist, "moveResist", 100f);
} }
} }
public static class MovedByPressureExtensions
{
public static bool IsMovedByPressure(this IEntity entity)
{
return entity.IsMovedByPressure(out _);
}
public static bool IsMovedByPressure(this IEntity entity, [NotNullWhen(true)] out MovedByPressureComponent? moved)
{
return entity.TryGetComponent(out moved) &&
moved.Enabled;
}
}
} }

View File

@@ -2,12 +2,13 @@
using System; using System;
using System.Diagnostics.CodeAnalysis; using System.Diagnostics.CodeAnalysis;
using Content.Server.Administration; using Content.Server.Administration;
using Content.Server.GameObjects.Components.Atmos; using Content.Server.GameObjects.EntitySystems;
using Content.Shared.Administration; using Content.Shared.Administration;
using Content.Shared.GameObjects.Components.Damage; using Content.Shared.GameObjects.Components.Damage;
using Robust.Server.Interfaces.Console; using Robust.Server.Interfaces.Console;
using Robust.Server.Interfaces.Player; using Robust.Server.Interfaces.Player;
using Robust.Shared.GameObjects; using Robust.Shared.GameObjects;
using Robust.Shared.GameObjects.Systems;
using Robust.Shared.Interfaces.GameObjects; using Robust.Shared.Interfaces.GameObjects;
using Robust.Shared.IoC; using Robust.Shared.IoC;
@@ -204,17 +205,12 @@ namespace Content.Server.GameObjects.Components.Damage
return; return;
} }
if (entity.HasComponent<MovedByPressureComponent>()) var godmodeSystem = EntitySystem.Get<GodmodeSystem>();
{ var enabled = godmodeSystem.ToggleGodmode(entity);
entity.RemoveComponent<MovedByPressureComponent>();
}
if (entity.TryGetComponent(out IDamageableComponent? damageable)) shell.SendText(player, enabled
{ ? $"Enabled godmode for entity {entity.Name} with id {entity.Uid}"
damageable.AddFlag(DamageFlag.Invulnerable); : $"Disabled godmode for entity {entity.Name} with id {entity.Uid}");
}
shell.SendText(player, $"Enabled godmode for entity {entity.Name}");
} }
} }
} }

View File

@@ -0,0 +1,100 @@
#nullable enable
using System.Collections.Generic;
using Content.Server.GameObjects.Components.Atmos;
using Content.Shared.GameObjects.Components.Damage;
using Content.Shared.GameTicking;
using JetBrains.Annotations;
using Robust.Shared.GameObjects.Systems;
using Robust.Shared.Interfaces.GameObjects;
namespace Content.Server.GameObjects.EntitySystems
{
[UsedImplicitly]
public class GodmodeSystem : EntitySystem, IResettingEntitySystem
{
private readonly Dictionary<IEntity, OldEntityInformation> _entities = new Dictionary<IEntity, OldEntityInformation>();
public void Reset()
{
_entities.Clear();
}
public bool EnableGodmode(IEntity entity)
{
if (_entities.ContainsKey(entity))
{
return false;
}
_entities[entity] = new OldEntityInformation(entity);
if (entity.TryGetComponent(out MovedByPressureComponent? moved))
{
moved.Enabled = false;
}
if (entity.TryGetComponent(out IDamageableComponent? damageable))
{
damageable.AddFlag(DamageFlag.Invulnerable);
}
return true;
}
public bool HasGodmode(IEntity entity)
{
return _entities.ContainsKey(entity);
}
public bool DisableGodmode(IEntity entity)
{
if (!_entities.Remove(entity, out var old))
{
return false;
}
if (entity.TryGetComponent(out MovedByPressureComponent? moved))
{
moved.Enabled = old.MovedByPressure;
}
if (entity.TryGetComponent(out IDamageableComponent? damageable))
{
damageable.RemoveFlag(DamageFlag.Invulnerable);
}
return true;
}
/// <summary>
/// Toggles godmode for a given entity.
/// </summary>
/// <param name="entity">The entity to toggle godmode for.</param>
/// <returns>true if enabled, false if disabled.</returns>
public bool ToggleGodmode(IEntity entity)
{
if (HasGodmode(entity))
{
DisableGodmode(entity);
return false;
}
else
{
EnableGodmode(entity);
return true;
}
}
public class OldEntityInformation
{
public OldEntityInformation(IEntity entity)
{
Entity = entity;
MovedByPressure = entity.IsMovedByPressure();
}
public IEntity Entity { get; }
public bool MovedByPressure { get; }
}
}
}