Files
crystall-punk-14/Content.Server/_CP14/Religion/CP14ReligionSystem.UI.cs
Red 422a0c5e10 Gods and religions (#1405)
* basic religion vision

* block god interactions

* skill tree mob specify

* silvania setup??

* clustering shader optimization

* gods department & job

* random gods jobs

* Luxian god

* Update Nature.png

* Update sphere_of_light.yml

* god chat

* Update ChatSystem.cs

* OBSERVATION

* public observation and basic follower api

* shader tweaks

* improve shaders

* spawning and praying on altars

* altars ppvs override

* move pvs overridiation from altars to observers

* shader coloration

* spectral z mover

* god magic radius restricted

* guide how to believe in god

* sends messages to god when smoeone wanna become follower

* follower doAfter

* goodbye luxian, welcome lumera

* goodbye silvania, welcome merkas

* som polish and renamings

* gods fast travel

* Update altar.ftl

* some lumera sfx

* renouncing patrons!

* renounce followers

* followewr percentage calculation

* remove from player-facing

* fix

* Update sphere_of_light.yml

* Update base.yml
2025-06-13 14:15:48 +03:00

76 lines
2.6 KiB
C#

using Content.Shared._CP14.Religion.Components;
using Content.Shared._CP14.Religion.Systems;
using Content.Shared.Follower;
using Robust.Server.GameObjects;
namespace Content.Server._CP14.Religion;
public sealed partial class CP14ReligionGodSystem
{
[Dependency] private readonly UserInterfaceSystem _userInterface = default!;
[Dependency] private readonly FollowerSystem _follower = default!;
private void InitializeUI()
{
SubscribeLocalEvent<CP14ReligionEntityComponent, OpenBoundInterfaceMessage>(OnOpenInterface);
SubscribeLocalEvent<CP14ReligionEntityComponent, CP14ReligionEntityTeleportAttempt>(OnTeleportAttempt);
}
private void OnTeleportAttempt(Entity<CP14ReligionEntityComponent> ent, ref CP14ReligionEntityTeleportAttempt args)
{
var target = GetEntity(args.Entity);
var canTeleport = false;
if (TryComp<CP14ReligionAltarComponent>(target, out var altar))
{
if (altar.Religion == ent.Comp.Religion)
{
canTeleport = true;
}
}
else if (TryComp<CP14ReligionFollowerComponent>(target, out var follower))
{
if (follower.Religion == ent.Comp.Religion)
{
canTeleport = true;
}
}
if (!canTeleport)
return;
_follower.StartFollowingEntity(ent, target);
}
private void OnOpenInterface(Entity<CP14ReligionEntityComponent> ent, ref OpenBoundInterfaceMessage args)
{
if (ent.Comp.Religion is null)
return;
var altars = new Dictionary<NetEntity, string>();
var queryAltars = EntityQueryEnumerator<CP14ReligionAltarComponent, MetaDataComponent>();
while (queryAltars.MoveNext(out var uid, out var altar, out var meta))
{
if (altar.Religion != ent.Comp.Religion)
continue;
altars.TryAdd(GetNetEntity(uid), meta.EntityName);
}
var followers = new Dictionary<NetEntity, string>();
var queryFollowers = EntityQueryEnumerator<CP14ReligionFollowerComponent, MetaDataComponent>();
while (queryFollowers.MoveNext(out var uid, out var follower, out var meta))
{
if (follower.Religion != ent.Comp.Religion)
continue;
followers.TryAdd(GetNetEntity(uid), meta.EntityName);
}
var followerPercentage = GetFollowerPercentage(ent);
ent.Comp.FollowerPercentage = followerPercentage;
Dirty(ent);
_userInterface.SetUiState(ent.Owner, CP14ReligionEntityUiKey.Key, new CP14ReligionEntityUiState(altars, followers, followerPercentage));
}
}