mirror of
https://github.com/WWhiteDreamProject/wwdpublic.git
synced 2026-04-17 13:37:47 +03:00
# Description This refactors #510 and #553. #553 specifically was reverted and re-implemented from scratch. As a consequence to all of this, the chat system was refactored a bit too, hopefully for the best. Changes: - InGameICChatType, InGameOOCChatType, ChatTransmitRange were all moved to shared and made serializable - Added a method to wrap whisper messages to reduce code duplication in chat system - Both WrapPublicMethod and WrapWhisperMessage call the same generic WrapMessage method, which allows to add speech verbs to whispers and more. That method is also fully responsible for adding language markers and deducing speech verbs now. - Everything related to speech was moved out of LanguagePrototype and into SpeechOverrideInfo. LanguagePrototype now holds an instance of that. - Added AllowRadio, RequireSpeech, ChatTypeOverride, SpeechVerbOverrides, MessageWrapOverrides to SpeechOverrideInfo, all of which are used in implementing the sign language. - Suffered a lot # TODO - [X] Cry - [X] Fix the sign language not displaying properly over the character. - [X] Find a way to circumvent being unable to speak?? <details><summary><h1>Media</h1></summary><p>  See below </p></details> # Changelog No cl no fun --------- Signed-off-by: Mnemotechnican <69920617+Mnemotechnician@users.noreply.github.com> Co-authored-by: Danger Revolution! <142105406+DangerRevolution@users.noreply.github.com>
132 lines
5.0 KiB
C#
132 lines
5.0 KiB
C#
using System.Numerics;
|
|
using Content.Server.Atmos.EntitySystems;
|
|
using Content.Server.Chat.Systems;
|
|
using Content.Server.NPC;
|
|
using Content.Server.NPC.HTN;
|
|
using Content.Server.NPC.Systems;
|
|
using Content.Server.Popups;
|
|
using Content.Shared.Atmos;
|
|
using Content.Shared.Chat;
|
|
using Content.Shared.Dataset;
|
|
using Content.Shared.Nutrition.Components;
|
|
using Content.Shared.Nutrition.EntitySystems;
|
|
using Content.Shared.Pointing;
|
|
using Content.Shared.RatKing;
|
|
using Robust.Shared.Map;
|
|
using Robust.Shared.Random;
|
|
|
|
namespace Content.Server.RatKing
|
|
{
|
|
/// <inheritdoc/>
|
|
public sealed class RatKingSystem : SharedRatKingSystem
|
|
{
|
|
[Dependency] private readonly AtmosphereSystem _atmos = default!;
|
|
[Dependency] private readonly ChatSystem _chat = default!;
|
|
[Dependency] private readonly HTNSystem _htn = default!;
|
|
[Dependency] private readonly HungerSystem _hunger = default!;
|
|
[Dependency] private readonly NPCSystem _npc = default!;
|
|
[Dependency] private readonly PopupSystem _popup = default!;
|
|
|
|
public override void Initialize()
|
|
{
|
|
base.Initialize();
|
|
|
|
SubscribeLocalEvent<RatKingComponent, RatKingRaiseArmyActionEvent>(OnRaiseArmy);
|
|
SubscribeLocalEvent<RatKingComponent, RatKingDomainActionEvent>(OnDomain);
|
|
SubscribeLocalEvent<RatKingComponent, AfterPointedAtEvent>(OnPointedAt);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Summons an allied rat servant at the King, costing a small amount of hunger
|
|
/// </summary>
|
|
private void OnRaiseArmy(EntityUid uid, RatKingComponent component, RatKingRaiseArmyActionEvent args)
|
|
{
|
|
if (args.Handled)
|
|
return;
|
|
|
|
if (!TryComp<HungerComponent>(uid, out var hunger))
|
|
return;
|
|
|
|
//make sure the hunger doesn't go into the negatives
|
|
if (hunger.CurrentHunger < component.HungerPerArmyUse)
|
|
{
|
|
_popup.PopupEntity(Loc.GetString("rat-king-too-hungry"), uid, uid);
|
|
return;
|
|
}
|
|
args.Handled = true;
|
|
_hunger.ModifyHunger(uid, -component.HungerPerArmyUse, hunger);
|
|
var servant = Spawn(component.ArmyMobSpawnId, Transform(uid).Coordinates);
|
|
var comp = EnsureComp<RatKingServantComponent>(servant);
|
|
comp.King = uid;
|
|
Dirty(servant, comp);
|
|
|
|
component.Servants.Add(servant);
|
|
_npc.SetBlackboard(servant, NPCBlackboard.FollowTarget, new EntityCoordinates(uid, Vector2.Zero));
|
|
UpdateServantNpc(servant, component.CurrentOrder);
|
|
}
|
|
|
|
/// <summary>
|
|
/// uses hunger to release a specific amount of ammonia into the air. This heals the rat king
|
|
/// and his servants through a specific metabolism.
|
|
/// </summary>
|
|
private void OnDomain(EntityUid uid, RatKingComponent component, RatKingDomainActionEvent args)
|
|
{
|
|
if (args.Handled)
|
|
return;
|
|
|
|
if (!TryComp<HungerComponent>(uid, out var hunger))
|
|
return;
|
|
|
|
//make sure the hunger doesn't go into the negatives
|
|
if (hunger.CurrentHunger < component.HungerPerDomainUse)
|
|
{
|
|
_popup.PopupEntity(Loc.GetString("rat-king-too-hungry"), uid, uid);
|
|
return;
|
|
}
|
|
args.Handled = true;
|
|
_hunger.ModifyHunger(uid, -component.HungerPerDomainUse, hunger);
|
|
|
|
_popup.PopupEntity(Loc.GetString("rat-king-domain-popup"), uid);
|
|
var tileMix = _atmos.GetTileMixture(uid, excite: true);
|
|
tileMix?.AdjustMoles(Gas.Ammonia, component.MolesAmmoniaPerDomain);
|
|
}
|
|
|
|
private void OnPointedAt(EntityUid uid, RatKingComponent component, ref AfterPointedAtEvent args)
|
|
{
|
|
if (component.CurrentOrder != RatKingOrderType.CheeseEm)
|
|
return;
|
|
|
|
foreach (var servant in component.Servants)
|
|
{
|
|
_npc.SetBlackboard(servant, NPCBlackboard.CurrentOrderedTarget, args.Pointed);
|
|
}
|
|
}
|
|
|
|
public override void UpdateServantNpc(EntityUid uid, RatKingOrderType orderType)
|
|
{
|
|
base.UpdateServantNpc(uid, orderType);
|
|
|
|
if (!TryComp<HTNComponent>(uid, out var htn))
|
|
return;
|
|
|
|
if (htn.Plan != null)
|
|
_htn.ShutdownPlan(htn);
|
|
|
|
_npc.SetBlackboard(uid, NPCBlackboard.CurrentOrders, orderType);
|
|
_htn.Replan(htn);
|
|
}
|
|
|
|
public override void DoCommandCallout(EntityUid uid, RatKingComponent component)
|
|
{
|
|
base.DoCommandCallout(uid, component);
|
|
|
|
if (!component.OrderCallouts.TryGetValue(component.CurrentOrder, out var datasetId) ||
|
|
!PrototypeManager.TryIndex<DatasetPrototype>(datasetId, out var datasetPrototype))
|
|
return;
|
|
|
|
var msg = Random.Pick(datasetPrototype.Values);
|
|
_chat.TrySendInGameICMessage(uid, msg, InGameICChatType.Speak, true);
|
|
}
|
|
}
|
|
}
|