Skip to content
This repository has been archived by the owner on Nov 1, 2024. It is now read-only.

Commit

Permalink
Merge pull request #1 from BeatusCrow/master
Browse files Browse the repository at this point in the history
add peaceful zone
  • Loading branch information
BeatusCrow authored Jul 16, 2024
2 parents 549988e + d14e999 commit b706a15
Show file tree
Hide file tree
Showing 6 changed files with 164 additions and 0 deletions.
32 changes: 32 additions & 0 deletions Content.Server/_NF/PeacefulZone/PeacefulZoneGeneratorComponent.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.PeacefulZone
{
[RegisterComponent]
public sealed partial class PeacefulZoneGeneratorComponent : 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/PeacefulZone/PeacefulZoneGeneratorSystem.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.PeacefulZone
{
public sealed class PeacefulZoneGeneratorSystem : 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<PeacefulZoneGeneratorComponent, ComponentInit>(OnComponentInit);
}

private void OnComponentInit(EntityUid uid, PeacefulZoneGeneratorComponent 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<PeacefulZoneGeneratorComponent>();
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));
}

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

component.NextUpdate += component.UpdateInterval;
}
}
}
}
2 changes: 2 additions & 0 deletions Resources/Locale/ru-RU/_NF/PeacefulZone.ftl
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
peaceful-zone-name = Мирная зона
peaceful-zone-description = Волшебство NT творит чудеса...
22 changes: 22 additions & 0 deletions Resources/Prototypes/_NF/peaceful_zone.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
- type: entity
parent: MarkerBase
id: PeacefulZone
name: peaceful-zone-name
description: peaceful-zone-description
components:
- type: Sprite
sprite: _NF/peacefulzone.rsi
state: peaceful_zone
- type: PeacefulZoneGenerator
radius: 300 # this is the value chosen by Kmin
rolesImmun:
- Bailiff
- Brigmedic
- Cadet
- Deputy
- DetectiveNF
- SeniorOfficer
- Sheriff
- SecurityGuard
- StationRepresentative
- StationTrafficController
14 changes: 14 additions & 0 deletions Resources/Textures/_NF/peacefulzone.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)",
"size": {
"x": 32,
"y": 32
},
"states": [
{
"name": "peaceful_zone"
}
]
}
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit b706a15

Please sign in to comment.