2024-01-27 15:19:52 +03:00
|
|
|
using System.Linq;
|
|
|
|
|
using System.Numerics;
|
2024-01-28 18:18:54 +07:00
|
|
|
using Content.Server._White.Cult.GameRule;
|
2024-01-27 15:19:52 +03:00
|
|
|
using Content.Shared.Alert;
|
|
|
|
|
using Content.Shared.Maps;
|
2024-01-28 18:37:24 +07:00
|
|
|
using Content.Shared._White.Cult.Components;
|
2024-03-27 21:23:18 +07:00
|
|
|
using Robust.Server.GameObjects;
|
2024-01-27 15:19:52 +03:00
|
|
|
using Robust.Shared.Map;
|
2024-03-27 21:23:18 +07:00
|
|
|
using Robust.Shared.Map.Components;
|
2024-01-29 01:02:37 +07:00
|
|
|
using CultistComponent = Content.Shared._White.Cult.Components.CultistComponent;
|
2024-01-27 15:19:52 +03:00
|
|
|
|
2024-01-28 18:18:54 +07:00
|
|
|
namespace Content.Server._White.Cult.Runes.Systems;
|
2024-01-27 15:19:52 +03:00
|
|
|
|
|
|
|
|
public partial class CultSystem
|
|
|
|
|
{
|
|
|
|
|
[Dependency] private readonly AlertsSystem _alertsSystem = default!;
|
|
|
|
|
[Dependency] private readonly IMapManager _mapManager = default!;
|
|
|
|
|
[Dependency] private readonly ITileDefinitionManager _tileDefinition = default!;
|
2024-03-27 21:23:18 +07:00
|
|
|
[Dependency] private readonly MapSystem _map = default!;
|
2024-01-27 15:19:52 +03:00
|
|
|
|
|
|
|
|
public void InitializeBuffSystem()
|
|
|
|
|
{
|
|
|
|
|
SubscribeLocalEvent<CultBuffComponent, ComponentAdd>(OnAdd);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public override void Update(float frameTime)
|
|
|
|
|
{
|
|
|
|
|
base.Update(frameTime);
|
|
|
|
|
UpdateBuffTimers(frameTime);
|
|
|
|
|
AnyCultistNearTile();
|
|
|
|
|
RemoveExpiredBuffs();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void AnyCultistNearTile()
|
|
|
|
|
{
|
2024-03-27 21:23:18 +07:00
|
|
|
var cultistsQuery = EntityQueryEnumerator<CultistComponent>();
|
2024-01-27 15:19:52 +03:00
|
|
|
|
2024-03-27 21:23:18 +07:00
|
|
|
while (cultistsQuery.MoveNext(out var uid, out _))
|
2024-01-27 15:19:52 +03:00
|
|
|
{
|
|
|
|
|
if (HasComp<CultBuffComponent>(uid))
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
if (!AnyCultTilesNearby(uid))
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
var comp = EnsureComp<CultBuffComponent>(uid);
|
|
|
|
|
comp.BuffTime = CultBuffComponent.CultTileBuffTime;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void OnAdd(EntityUid uid, CultBuffComponent comp, ComponentAdd args)
|
|
|
|
|
{
|
|
|
|
|
_alertsSystem.ShowAlert(uid, AlertType.CultBuffed);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void UpdateBuffTimers(float frameTime)
|
|
|
|
|
{
|
2024-03-27 21:23:18 +07:00
|
|
|
var buffsQuery = EntityQueryEnumerator<CultBuffComponent>();
|
2024-01-27 15:19:52 +03:00
|
|
|
|
2024-03-27 21:23:18 +07:00
|
|
|
while (buffsQuery.MoveNext(out var uid, out var buff))
|
2024-01-27 15:19:52 +03:00
|
|
|
{
|
|
|
|
|
var remainingTime = buff.BuffTime;
|
|
|
|
|
|
|
|
|
|
remainingTime -= TimeSpan.FromSeconds(frameTime);
|
|
|
|
|
|
2024-03-27 21:23:18 +07:00
|
|
|
if (HasComp<CultistComponent>(uid))
|
2024-01-27 15:19:52 +03:00
|
|
|
{
|
|
|
|
|
if (remainingTime < CultBuffComponent.CultTileBuffTime && AnyCultTilesNearby(uid))
|
|
|
|
|
remainingTime = CultBuffComponent.CultTileBuffTime;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
buff.BuffTime = remainingTime;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private bool AnyCultTilesNearby(EntityUid uid)
|
|
|
|
|
{
|
|
|
|
|
var localpos = Transform(uid).Coordinates.Position;
|
|
|
|
|
|
2024-03-27 21:23:18 +07:00
|
|
|
if (!TryComp<CultistComponent>(uid, out _))
|
2024-01-27 15:19:52 +03:00
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
var radius = CultBuffComponent.NearbyTilesBuffRadius;
|
|
|
|
|
|
2024-03-27 21:23:18 +07:00
|
|
|
var gridUid = Transform(uid).GridUid;
|
|
|
|
|
if (!gridUid.HasValue)
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!TryComp(gridUid, out MapGridComponent? grid))
|
2024-01-27 15:19:52 +03:00
|
|
|
return false;
|
|
|
|
|
|
2024-03-27 21:23:18 +07:00
|
|
|
var tilesRefs = _map.GetLocalTilesIntersecting(gridUid.Value, grid, new Box2(
|
|
|
|
|
localpos + new Vector2(-radius, -radius),
|
|
|
|
|
localpos + new Vector2(radius, radius)));
|
|
|
|
|
|
|
|
|
|
var cultRule = EntityManager.EntityQuery<CultRuleComponent>().FirstOrDefault();
|
|
|
|
|
if (cultRule is null)
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var cultTileDef = (ContentTileDefinition) _tileDefinition[$"{cultRule.CultFloor}"];
|
2024-01-27 15:19:52 +03:00
|
|
|
var cultTile = new Tile(cultTileDef.TileId);
|
|
|
|
|
|
|
|
|
|
return tilesRefs.Any(tileRef => tileRef.Tile.TypeId == cultTile.TypeId);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void RemoveExpiredBuffs()
|
|
|
|
|
{
|
2024-03-27 21:23:18 +07:00
|
|
|
var buffsQuery = EntityQueryEnumerator<CultBuffComponent>();
|
2024-01-27 15:19:52 +03:00
|
|
|
|
2024-03-27 21:23:18 +07:00
|
|
|
while (buffsQuery.MoveNext(out var uid, out var buff))
|
2024-01-27 15:19:52 +03:00
|
|
|
{
|
|
|
|
|
var remainingTime = buff.BuffTime;
|
|
|
|
|
|
|
|
|
|
if (remainingTime <= TimeSpan.Zero)
|
|
|
|
|
{
|
|
|
|
|
RemComp<CultBuffComponent>(uid);
|
|
|
|
|
_alertsSystem.ClearAlert(uid, AlertType.CultBuffed);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2024-03-27 21:23:18 +07:00
|
|
|
}
|