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:
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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}");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
100
Content.Server/GameObjects/EntitySystems/GodmodeSystem.cs
Normal file
100
Content.Server/GameObjects/EntitySystems/GodmodeSystem.cs
Normal 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; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user