Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Pacified Zone marker #1815

Merged
merged 17 commits into from
Aug 9, 2024
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 32 additions & 0 deletions Content.Server/_NF/PacifiedZone/PacifiedZoneGeneratorComponent.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
using Robust.Shared.Prototypes;
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom;
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype;
using Content.Shared.Containers.ItemSlots;
using Robust.Server.GameObjects;
using Content.Shared.Roles;
using Content.Shared.Roles.Jobs;

namespace Content.Server._NF.PacifiedZone
{
[RegisterComponent]
public sealed partial class PacifiedZoneGeneratorComponent : Component
{
public List<NetEntity> OldListEntities = new();
public List<NetEntity> IntermediateListEntities = new();

[DataField(customTypeSerializer: typeof(TimeOffsetSerializer))]
public TimeSpan NextUpdate;

/// <summary>
/// The interval at which this component updates.
/// </summary>
[DataField]
public TimeSpan UpdateInterval = TimeSpan.FromSeconds(1);

[DataField("radius")]
public int Radius = 5;

[DataField("rolesImmun")]
public List<ProtoId<JobPrototype>> RolesImmun = new();
}
}
94 changes: 94 additions & 0 deletions Content.Server/_NF/PacifiedZone/PacifiedlZoneGeneratorSystem.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
using Robust.Server.GameObjects;
using Robust.Shared.Timing;
using Content.Shared.Humanoid;
using Content.Shared.CombatMode.Pacification;
using Content.Shared.Mind;
using Content.Shared.Roles;
using Content.Shared.Roles.Jobs;


namespace Content.Server._NF.PacifiedZone
{
public sealed class PacifiedZoneGeneratorSystem : EntitySystem
{
[Dependency] private readonly UserInterfaceSystem _userInterface = default!;
[Dependency] private readonly EntityLookupSystem _lookup = default!;
[Dependency] private readonly IGameTiming _gameTiming = default!;
[Dependency] private readonly IEntityManager _entMan = default!;
[Dependency] private readonly SharedMindSystem _mindSystem = default!;
[Dependency] private readonly SharedJobSystem _jobSystem = default!;

public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<PacifiedZoneGeneratorComponent, ComponentInit>(OnComponentInit);
Vonsant marked this conversation as resolved.
Show resolved Hide resolved
}

Vonsant marked this conversation as resolved.
Show resolved Hide resolved
private void OnComponentInit(EntityUid uid, PacifiedZoneGeneratorComponent component, ComponentInit args)
{
foreach (var humanoid_uid in _lookup.GetEntitiesInRange<HumanoidAppearanceComponent>(Transform(uid).Coordinates, component.Radius))
{
if (TryComp<PacifiedComponent>(humanoid_uid, out var pacifComp))
continue;

if (!_mindSystem.TryGetMind(humanoid_uid, out var mindId, out var mind))
continue;

_jobSystem.MindTryGetJobId(mindId, out var jobId);

if (jobId != null)
if (component.RolesImmun.Contains(jobId!.Value))
continue;

AddComp<PacifiedComponent>(humanoid_uid);
component.OldListEntities.Add(_entMan.GetNetEntity(humanoid_uid));
}

component.NextUpdate = _gameTiming.CurTime + component.UpdateInterval;
}

public override void Update(float frameTime)
{
base.Update(frameTime);

var gen_query = AllEntityQuery<PacifiedZoneGeneratorComponent>();
while (gen_query.MoveNext(out var gen_uid, out var component))
{
var query = _lookup.GetEntitiesInRange<HumanoidAppearanceComponent>(Transform(gen_uid).Coordinates, component.Radius);
foreach (var humanoid_uid in query)
{
if (!_mindSystem.TryGetMind(humanoid_uid, out var mindId, out var mind))
continue;

_jobSystem.MindTryGetJobId(mindId, out var jobId);

if (jobId != null)
if (component.RolesImmun.Contains(jobId!.Value))
continue;

if (component.OldListEntities.Contains(_entMan.GetNetEntity(humanoid_uid)))
{
component.IntermediateListEntities.Add(_entMan.GetNetEntity(humanoid_uid));
component.OldListEntities.Remove(_entMan.GetNetEntity(humanoid_uid));
}
else
{
AddComp<PacifiedComponent>(humanoid_uid);
component.IntermediateListEntities.Add(_entMan.GetNetEntity(humanoid_uid));
}
}

foreach (var humanoid_net_uid in component.OldListEntities)
{
RemComp<PacifiedComponent>(GetEntity(humanoid_net_uid));
Vonsant marked this conversation as resolved.
Show resolved Hide resolved
}

component.OldListEntities.Clear();
component.OldListEntities.AddRange(component.IntermediateListEntities);
component.IntermediateListEntities.Clear();

component.NextUpdate += component.UpdateInterval;
}
}
}
}
77 changes: 77 additions & 0 deletions Resources/Prototypes/_NF/Entities/Markers/pacified_zone.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
- type: entity
parent: MarkerBase
id: PacifiedZone10
name: Pacified zone
description: It's just a NanoTrasen miracle...
suffix: 10
components:
- type: Sprite
sprite: _NF/Markers/pacifiedzone.rsi
state: pacified_zone
- type: PacifiedZoneGenerator
radius: 10
rolesImmun:
- Bailiff
- Brigmedic
- Cadet
- Deputy
- DetectiveNF
- SeniorOfficer
- Sheriff
- SecurityGuard
- StationRepresentative
- StationTrafficController
- type: entity
parent: PacifiedZone10
id: PacifiedZone20
suffix: 20
components:
- type: PacifiedZoneGenerator
radius: 20
rolesImmun:
- Bailiff
- Brigmedic
- Cadet
- Deputy
- DetectiveNF
- SeniorOfficer
- Sheriff
- SecurityGuard
- StationRepresentative
- StationTrafficController
- type: entity
parent: PacifiedZone10
id: PacifiedZone50
suffix: 50
components:
- type: PacifiedZoneGenerator
radius: 50
rolesImmun:
- Bailiff
- Brigmedic
- Cadet
- Deputy
- DetectiveNF
- SeniorOfficer
- Sheriff
- SecurityGuard
- StationRepresentative
- StationTrafficController
- type: entity
parent: PacifiedZone10
id: PacifiedZone100
suffix: 100
components:
- type: PacifiedZoneGenerator
radius: 100
rolesImmun:
- Bailiff
- Brigmedic
- Cadet
- Deputy
- DetectiveNF
- SeniorOfficer
- Sheriff
- SecurityGuard
- StationRepresentative
- StationTrafficController
14 changes: 14 additions & 0 deletions Resources/Textures/_NF/Markers/pacifiedzone.rsi/meta.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
{
"version": 1,
"license": "CC-BY-SA-3.0",
"copyright": "Made by BeatusCrow(github/discord 1153000512325681183)",
"size": {
"x": 32,
"y": 32
},
"states": [
{
"name": "pacified_zone"
}
]
}
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading