Files
BIGZi0348 ce9b8af560 Увы
2025-01-05 18:37:53 +03:00

162 lines
5.7 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using Content.Server.Chat.Systems;
using Content.Server.GameTicking;
using Content.Server.GameTicking.Rules.Components;
using Content.Server.Speech.Components;
using Content.Server._White.AspectsSystem.Aspects.Components;
using Content.Server._White.AspectsSystem.Base;
using Content.Server._White.Discord.GameTicking;
using Content.Server.GameTicking.Components;
using Content.Shared.GameTicking;
using Content.Shared.Humanoid;
using Content.Shared.Humanoid.Markings;
using Content.Shared.Speech;
using Robust.Shared.Enums;
using Robust.Shared.Prototypes;
using Robust.Shared.Random;
namespace Content.Server._White.AspectsSystem.Aspects;
public sealed class CatEarsAspect : AspectSystem<CatEarsAspectComponent>
{
[Dependency] private readonly IPrototypeManager _protoMan = default!;
[Dependency] private readonly IRobustRandom _random = default!;
[Dependency] private readonly ChatSystem _chat = default!;
[Dependency] private readonly ChatHelper _chatHelper = default!;
private MarkingPrototype _ears = default!;
private MarkingPrototype _tail = default!;
private const string FemaleFelinidVoices = "FemaleFelinid";
private const string MaleFelinidVoices = "MaleFelinid";
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<PlayerSpawnCompleteEvent>(HandleLateJoin);
SubscribeLocalEvent<RoundEndedEvent>(OnRoundEnd);
_ears = _protoMan.Index<MarkingPrototype>("FelinidEarsBasic");
_tail = _protoMan.Index<MarkingPrototype>("FelinidTailBasic");
}
private void OnRoundEnd(RoundEndedEvent ev)
{
var query = EntityQueryEnumerator<CatEarsAspectComponent, GameRuleComponent>();
while (query.MoveNext(out var ruleEntity, out _, out var gameRule))
{
if (!GameTicker.IsGameRuleAdded(ruleEntity, gameRule))
continue;
var entQuery = EntityQueryEnumerator<SpeechComponent, HumanoidAppearanceComponent>();
while (entQuery.MoveNext(out var ent, out _, out _))
{
_chat.TrySendInGameICMessage(ent, _random.Pick(new[] { "Мяу", "Мур", "Ня" }), InGameICChatType.Speak,
ChatTransmitRange.Normal);
}
}
}
protected override void Started(
EntityUid uid,
CatEarsAspectComponent component,
GameRuleComponent gameRule,
GameRuleStartedEvent args)
{
base.Started(uid, component, gameRule, args);
var query = EntityQueryEnumerator<HumanoidAppearanceComponent>();
while (query.MoveNext(out var ent, out var appearance))
{
AddMarkings(ent, appearance);
}
}
private void HandleLateJoin(PlayerSpawnCompleteEvent ev)
{
var query = EntityQueryEnumerator<CatEarsAspectComponent, GameRuleComponent>();
while (query.MoveNext(out var ruleEntity, out _, out var gameRule))
{
if (!GameTicker.IsGameRuleAdded(ruleEntity, gameRule))
continue;
if (!ev.LateJoin)
return;
AddMarkings(ev.Mob);
_chatHelper.SendAspectDescription(ev.Mob, Loc.GetString("cat-ears-aspect-desc"));
}
}
private void AddMarkings(EntityUid uid, HumanoidAppearanceComponent? appearance = null)
{
if (!Resolve(uid, ref appearance, false))
return;
switch (appearance.Species)
{
case "Felinid":
return;
case "Human":
{
if (!appearance.MarkingSet.TryGetCategory(MarkingCategories.HeadTop, out var markings) ||
markings.Count == 0)
AddEars(appearance);
if (!appearance.MarkingSet.TryGetCategory(MarkingCategories.Tail, out markings) || markings.Count == 0)
AddTail(appearance);
Dirty(uid, appearance);
ChangeEmotesVoice(uid, appearance);
return;
}
default:
AddEars(appearance);
AddTail(appearance);
Dirty(uid, appearance);
ChangeEmotesVoice(uid, appearance);
break;
}
}
private List<Color> GetColors(HumanoidAppearanceComponent appearance, MarkingPrototype prototype)
{
return MarkingColoring.GetMarkingLayerColors(prototype, appearance.SkinColor, appearance.EyeColor,
appearance.MarkingSet);
}
private void AddTail(HumanoidAppearanceComponent appearance)
{
if (!appearance.MarkingSet.TryGetMarking(MarkingCategories.Tail, _tail.ID, out _))
{
appearance.MarkingSet.AddFront(MarkingCategories.Tail,
new Marking(_tail.ID, GetColors(appearance, _tail)) { Forced = true });
}
}
private void AddEars(HumanoidAppearanceComponent appearance)
{
if (!appearance.MarkingSet.TryGetMarking(MarkingCategories.HeadTop, _tail.ID, out _))
{
appearance.MarkingSet.AddFront(MarkingCategories.HeadTop,
new Marking(_ears.ID, GetColors(appearance, _ears)) { Forced = true });
}
}
private void ChangeEmotesVoice(EntityUid user, HumanoidAppearanceComponent appearanceComponent)
{
if (!TryComp(user, out VocalComponent? vocals))
{
return;
}
switch (appearanceComponent.Gender)
{
case Gender.Female:
_protoMan.TryIndex(FemaleFelinidVoices, out vocals.EmoteSounds);
break;
case Gender.Male:
_protoMan.TryIndex(MaleFelinidVoices, out vocals.EmoteSounds);
break;
}
}
}