[Transfer] Engi (#790)

* Suhariki (#4)

* init

* Porting is complete

Still WIP

* small stuff

* SmallStuff

* awawawa

* Нас рано

* Engi

* More luck

* removed some shit

(cherry picked from commit e1d745655b0e7253ea4e4814b82dd56e90153514)

* Самодельные отражайки (#6)

* Ghetto Mirror Shield

* Protorypes for ghetto mirrors

* locale

* idk, works fine on my machine

* forsenPls

(cherry picked from commit 4505739fd9430bcc578da3dec932d9aa7ca933ca)

* Шлем из ведра (#7)

* Bucket Helmet

* Code cleanup

* Squashed commit of the following:

commit 4505739fd9430bcc578da3dec932d9aa7ca933ca
Author: BIGZi0348 <118811750+BIGZi0348@users.noreply.github.com>
Date:   Sat Sep 21 17:10:02 2024 +0300

    Самодельные отражайки (#6)

    * Ghetto Mirror Shield

    * Protorypes for ghetto mirrors

    * locale

    * idk, works fine on my machine

    * forsenPls

commit 1f066876508dec8d3f21ad753dab9fcc13dc8d1a
Author: BIGZi0348 <118811750+BIGZi0348@users.noreply.github.com>
Date:   Sat Sep 21 14:57:30 2024 +0300

    Агрессивный вор (#5)

    * AggressiveThief

    * Попытка насрать обратно

commit e1d745655b0e7253ea4e4814b82dd56e90153514
Author: BIGZi0348 <118811750+BIGZi0348@users.noreply.github.com>
Date:   Sat Sep 21 14:46:38 2024 +0300

    Suhariki (#4)

    * init

    * Porting is complete

    Still WIP

    * small stuff

    * SmallStuff

    * awawawa

    * Нас рано

    * Engi

    * More luck

    * removed some shit

commit 08061b4f1fbbfd521e3a40ef53d9bc86fa140087
Author: BIGZi0348 <118811750+BIGZi0348@users.noreply.github.com>
Date:   Sat Sep 21 14:30:31 2024 +0300

    Engi rise up (#3)

commit 00e2f5c45ca7abfeff1f85d4893352d8875f8560
Author: BIGZi0348 <118811750+BIGZi0348@users.noreply.github.com>
Date:   Thu Sep 19 19:42:30 2024 +0300

    Bigzi upstream1 (#2)

    * init

    * Porting is complete

    Still WIP

    * Мелочи - Король крыс, диски, правки перевода и респрайт одеяния культа (#686)

    * Большой Крыс Отдыхает

    * Фикс размера фейк диска

    * Доработка диска очков РНД

    * Скоро перейду на райдер

    * Переводы

    * Диски одного размера

    * Респрайт робы и капюшона культа

    * Automatic changelog update

    * fix (#687)

    * Automatic changelog update

    * govno HD (#688)

    * Automatic changelog update

    * Hotfix loadouts (#689)

    * govno HD

    * hotfix loadouts

    * fuck

    * Automatic changelog update

    * Update PULL_REQUEST_TEMPLATE.md

    * Even smaller stuff (#690)

    * 45 to 44

    * Фикс ошибки перевода

    * Voice mask translate

    * Automatic changelog update

    * small stuff

    * SmallStuff

    * awawawa

    * Локализация шепелявости (#691)

    * БУМ!!!!!!!! (#692)

    * Automatic changelog update

    * Большой ребаланс милишки (#681)

    * MeleeThrowOnHit rework

    * buff baseball bat

    * better mjolnir

    * telebaton system unhardcode + refactor + transform TelescopicBatonComponent to KnockDownOnHitComponent

    * fix telebaton prototype

    * darova

    * fix KnockDownOnHitSystem

    * chaplain weapons rebalance

    * fix nullrod hit sound

    * BloodstreamSystem cleanup

    * bleeding rebalance

    * damage rebalance

    * small baseball bat fix

    * Automatic changelog update

    * Chaplain armor fix (#693)

    * Фикс описания (#696)

    * No passengers on this military complex (#695)

    * Automatic changelog update

    * Переводы (#698)

    * Пепеводы

    * Очепятки

    * Фикс прожектора и открутка цифр (#697)

    * Melochi

    * Фикс хамелеона

    * Переводы денег мне на карту

    * Automatic changelog update

    * Нас рано

    * Фикс пополнения зарядов РЦД используя стаки ресурсов (#699)

    * Фиксики

    * Спасли Валеру от банкротства

    * Very hot man (#700)

    * Automatic changelog update

    * reverted illegal code added by oniks

    ---------

    Co-authored-by: RavmorganButOnCocaine <valtos@nextmail.ru>
    Co-authored-by: Spatison <137375981+Spatison@users.noreply.github.com>
    Co-authored-by: Valtos <valtos@spaces.ru>
    Co-authored-by: Jabak <163307958+Jabaks@users.noreply.github.com>
    Co-authored-by: ThereDrD <88589686+ThereDrD0@users.noreply.github.com>

* ВЕДРО!!!

* Funny

* Oppsie

(cherry picked from commit 92ce631b0c0187678b6d1eea34d3c0830b9b0fac)

* Yes (#8)

(cherry picked from commit 3d083befca212455cffcae56b84ee55050ad62be)

* Small Fix

То чувство, когда можешь срать прямо в мэйн

(cherry picked from commit 8fa7cfb678711a55bf6704ced30f7ed9b4b1e8c4)

* bababooey (#9)

(cherry picked from commit f7ed9d287f6798c7d39ac437a2f969ec0dc10309)

* GoodLooking (#10)

(cherry picked from commit 1617dce502b71db22a6b736ac879c04c07ec54a0)

* Dadka scazal (#11)

(cherry picked from commit 50da866354952628185bb396f359c2f533d57340)

* Сортировка эксклюзива енги + респрайт деревянных столов и дверей (#12)

* Massive

* Чейндлок

(cherry picked from commit 4dc165e4c1aa75e8fd22f14db95ac72bf50c77f5)

* Big Zi bucket helmet fix

* Опять насрал в мастер

(cherry picked from commit bd866e0cd87770b1509885f66ec5c562dda3fd91)

* Боевые Молоты (#14)

(cherry picked from commit 64df6b4b91050273218007365cf81a45c3ea74a8)

* хотфикс сухариков

(cherry picked from commit a98265c22dc7de467693f501cf3a5d8577e94a54)

* funny sword (#15)

(cherry picked from commit 231aaa1b33b7e4edf00506c6ebdbd389257cf1ca)

* funny hammer

(cherry picked from commit 1e58eaa146cc95f34358d97d6c436ba4705d09a1)

* Добавил админ логирование PacifiedOnChaplainActionSystem (#19)

Update PacifiedOnChaplainActionSystem.cs

(cherry picked from commit f6aa42eab7cce294336aec14f7dfb6f0671267cf)

* Small refactor

(cherry picked from commit b38ad7e7b8afa35a22c84c2fb8836bf13736dfb3)

* Команда для отправки цели для станции (#21)

* Команда для отправки цели для станции

* Правки

(cherry picked from commit 93a79c4952e3a75c32ff5cc4d07df4018a9bf7db)

* Больше целей

(cherry picked from commit c3d34d6a4e000d8af66c8f53d60a898cfae0a454)

* Music for events

(cherry picked from commit 4a7214634b3e77caefd011bf5900f581055a0ac8)

* Санитизация

* unused

---------

Co-authored-by: BIGZi0348 <118811750+bigzi0348@users.noreply.github.com>
Co-authored-by: BIGZi0348 <svalker0348@gmail.com>
This commit is contained in:
keslik
2024-11-27 05:25:36 +03:00
committed by GitHub
parent 4ef3b2837e
commit 92dd279988
49 changed files with 1267 additions and 12 deletions

View File

@@ -0,0 +1,30 @@
using Content.Shared.Inventory.Events;
using Content.Shared._White._Engi.BucketHelmet;
namespace Content.Server._White._Engi.BucketHelmet;
/// <summary>
/// WD.
/// This handles placemet of PreventStrippingFromEarsComponent when bucket helmet is in use.
/// </summary>
public sealed class BucketHelmetSystem : EntitySystem
{
public override void Initialize()
{
SubscribeLocalEvent<BucketHelmetComponent, GotEquippedEvent>(OnGotEquipped);
SubscribeLocalEvent<BucketHelmetComponent, GotUnequippedEvent>(OnGotUnequipped);
}
public void OnGotUnequipped(EntityUid uid, BucketHelmetComponent component, GotUnequippedEvent args)
{
RemComp<PreventStrippingFromEarsComponent>(args.Equipee);
}
public void OnGotEquipped(EntityUid uid, BucketHelmetComponent component, GotEquippedEvent args)
{
if (args.Slot == "head")
EnsureComp<PreventStrippingFromEarsComponent>(args.Equipee);
}
}

View File

@@ -0,0 +1,15 @@
using Robust.Shared.Audio;
namespace Content.Server._White._Engi.PacifiedOnChaplainAction
{
/// <summary>
/// WD.
/// Adds verb for chaplain to pacify entity.
/// </summary>
[RegisterComponent]
public sealed partial class PacifiedOnChaplainActionComponent : Component
{
[DataField]
public SoundSpecifier ActionSound = new SoundPathSpecifier("/Audio/Effects/holy.ogg");
}
}

View File

@@ -0,0 +1,113 @@
using Content.Shared.ActionBlocker;
using Content.Server.Popups;
using Robust.Shared.Audio.Systems;
using Content.Shared.Interaction;
using Content.Shared.Verbs;
using Content.Server.Bible.Components;
using Content.Shared.Timing;
using Content.Shared.CombatMode.Pacification;
using Content.Server.Administration.Logs;
using Content.Shared.Database;
namespace Content.Server._White._Engi.PacifiedOnChaplainAction
{
/// <summary>
/// WD
/// </summary>
public sealed class PacifiedOnChaplainAction : EntitySystem
{
[Dependency] private readonly ActionBlockerSystem _blocker = default!;
[Dependency] private readonly PopupSystem _popupSystem = default!;
[Dependency] private readonly SharedAudioSystem _audio = default!;
[Dependency] private readonly UseDelaySystem _delay = default!;
[Dependency] private readonly IAdminLogManager _adminLogger = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<PacifiedOnChaplainActionComponent, AfterInteractEvent>(OnAfterInteract);
SubscribeLocalEvent<PacifiedOnChaplainActionComponent, GetVerbsEvent<AlternativeVerb>>(AddPacifiedOnChaplainVerb);
}
private void Action(PacifiedOnChaplainActionComponent component, EntityUid target, EntityUid user)
{
var popup = "";
if (HasComp<PacifiedComponent>(target))
{
popup = "unpacified-by-chaplain";
RemComp<PacifiedComponent>(target);
}
else
{
popup = "pacified-by-chaplain";
EnsureComp<PacifiedComponent>(target);
}
_adminLogger.Add(LogType.Verb,
LogImpact.Medium,
$"{ToPrettyString(target):target} {popup} {ToPrettyString(user):user}");
_popupSystem.PopupEntity(Loc.GetString(popup, ("target", target)), user, user);
_audio.PlayPvs(component.ActionSound, user);
}
private void OnAfterInteract(EntityUid uid, PacifiedOnChaplainActionComponent component, AfterInteractEvent args)
{
if (!args.CanReach)
return;
if (!TryComp(uid, out UseDelayComponent? useDelay) || _delay.IsDelayed((uid, useDelay)))
return;
if (args.Target == null)
return;
if (!HasComp<BibleUserComponent>(args.User))
return;
Action(component, (EntityUid) args.Target, args.User);
_delay.TryResetDelay((uid, useDelay));
return;
}
private void AddPacifiedOnChaplainVerb(EntityUid uid, PacifiedOnChaplainActionComponent component, GetVerbsEvent<AlternativeVerb> args)
{
if (!args.CanInteract || !args.CanAccess)
return;
if (!HasComp<BibleUserComponent>(args.User))
return;
if (!_blocker.CanInteract(args.User, uid))
return;
var verbName = "";
if (HasComp<PacifiedComponent>(args.Target))
verbName = Loc.GetString("unpacify-by-chaplain");
else
verbName = Loc.GetString("pacify-by-chaplain");
AlternativeVerb verb = new()
{
Act = () =>
{
if (!TryComp(uid, out UseDelayComponent? useDelay) || _delay.IsDelayed((uid, useDelay)))
return;
Action(component, args.Target, args.User);
_delay.TryResetDelay((uid, useDelay));
},
Text = verbName,
Priority = 2
};
args.Verbs.Add(verb);
}
}
}

View File

@@ -0,0 +1,66 @@
using System.Linq;
using Content.Server.Administration;
using Content.Server.Commands;
using Content.Shared.Administration;
using Robust.Shared.Console;
using Robust.Shared.Prototypes;
namespace Content.Server._White._Engi.StationGoal
{
[AdminCommand(AdminFlags.Fun)]
public sealed class StationGoalCommand : IConsoleCommand
{
[Dependency] private readonly IEntityManager _entManager = default!;
public string Command => "sendstationgoal";
public string Description => Loc.GetString("send-station-goal-command-description");
public string Help => Loc.GetString("send-station-goal-command-help-text", ("command", Command));
public void Execute(IConsoleShell shell, string argStr, string[] args)
{
if (args.Length != 2)
{
shell.WriteError(Loc.GetString("shell-wrong-arguments-number"));
return;
}
if (!NetEntity.TryParse(args[0], out var euidNet) || !_entManager.TryGetEntity(euidNet, out var euid))
{
shell.WriteError($"Failed to parse euid '{args[0]}'.");
return;
}
var protoId = args[1];
var prototypeManager = IoCManager.Resolve<IPrototypeManager>();
if (!prototypeManager.TryIndex<StationGoalPrototype>(protoId, out var proto))
{
shell.WriteError($"No station goal found with ID {protoId}!");
return;
}
var stationGoalPaper = IoCManager.Resolve<IEntityManager>().System<StationGoalPaperSystem>();
if (!stationGoalPaper.SendStationGoal(euid, protoId))
{
shell.WriteError("Station goal was not sent");
return;
}
}
public CompletionResult GetCompletion(IConsoleShell shell, string[] args)
{
switch (args.Length)
{
case 1:
var stations = ContentCompletionHelper.StationIds(_entManager);
return CompletionResult.FromHintOptions(stations, "[StationId]");
case 2:
var options = IoCManager.Resolve<IPrototypeManager>()
.EnumeratePrototypes<StationGoalPrototype>()
.Select(p => new CompletionOption(p.ID));
return CompletionResult.FromHintOptions(options, Loc.GetString("send-station-goal-command-arg-id"));
}
return CompletionResult.Empty;
}
}
}

View File

@@ -0,0 +1,15 @@
using Robust.Shared.Prototypes;
namespace Content.Server._White._Engi.StationGoal
{
/// <summary>
/// WD.
/// If attached to a station prototype, will send the station a random goal from the list.
/// </summary>
[RegisterComponent]
public sealed partial class StationGoalComponent : Component
{
[DataField]
public List<ProtoId<StationGoalPrototype>> Goals = new();
}
}

View File

@@ -0,0 +1,11 @@
namespace Content.Server._White._Engi.StationGoal
{
/// <summary>
/// WD.
/// Paper with a written station goal in it.
/// </summary>
[RegisterComponent]
public sealed partial class StationGoalPaperComponent : Component
{
}
}

View File

@@ -0,0 +1,132 @@
using Content.Server.Fax;
using Content.Server.GameTicking.Events;
using Content.Server.Station.Components;
using Content.Server.Station.Systems;
using Content.Shared.Fax.Components;
using Content.Shared.Paper;
using Robust.Server.Player;
using Robust.Shared.Prototypes;
using Robust.Shared.Random;
using Content.Server.RandomMetadata;
namespace Content.Server._White._Engi.StationGoal
{
/// <summary>
/// WD.
/// System to spawn paper with station goal.
/// </summary>
public sealed class StationGoalPaperSystem : EntitySystem
{
[Dependency] private readonly IPrototypeManager _proto = default!;
[Dependency] private readonly IRobustRandom _random = default!;
[Dependency] private readonly FaxSystem _fax = default!;
[Dependency] private readonly IPlayerManager _playerManager = default!;
[Dependency] private readonly StationSystem _station = default!;
[Dependency] private readonly RandomMetadataSystem _randomMeta = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<RoundStartingEvent>(OnRoundStarting);
}
private void OnRoundStarting(RoundStartingEvent ev)
{
var playerCount = _playerManager.PlayerCount;
var query = EntityQueryEnumerator<StationGoalComponent>();
while (query.MoveNext(out var uid, out var station))
{
var tempGoals = new List<ProtoId<StationGoalPrototype>>(station.Goals);
StationGoalPrototype? selGoal = null;
while (tempGoals.Count > 0)
{
var goalId = _random.Pick(tempGoals);
var goalProto = _proto.Index(goalId);
if (playerCount > goalProto.MaxPlayers ||
playerCount < goalProto.MinPlayers)
{
tempGoals.Remove(goalId);
continue;
}
selGoal = goalProto;
break;
}
if (selGoal is null)
return;
if (SendStationGoal(uid, selGoal))
{
Log.Info($"Goal {selGoal.ID} has been sent to station {MetaData(uid).EntityName}");
}
}
}
public bool SendStationGoal(EntityUid? ent, ProtoId<StationGoalPrototype> goal)
{
return SendStationGoal(ent, _proto.Index(goal));
}
/// <summary>
/// Send a station goal on selected station to all faxes which are authorized to receive it.
/// </summary>
/// <returns>True if at least one fax received paper</returns>
public bool SendStationGoal(EntityUid? ent, StationGoalPrototype goal)
{
if (ent is null)
return false;
if (!TryComp<StationDataComponent>(ent, out var stationData))
return false;
var today = DateTime.Today.ToString("dd.MM");
var namesList = new List<string>
{
"names_first_male",
"names_last_male"
};
var operatorName = _randomMeta.GetRandomFromSegments(namesList, " ");
var faxContent = Loc.GetString("engi-station-goal-form",
("station", MetaData(ent.Value).EntityName),
("date", today),
("operator", operatorName),
("text", Loc.GetString(goal.Text)));
var printout = new FaxPrintout(
faxContent,
Loc.GetString("engi-station-goal-fax-paper-name"),
null,
null,
"paper_stamp-centcom",
new List<StampDisplayInfo>
{
new() { StampedName = Loc.GetString("stamp-component-stamped-name-centcom"), StampedColor = Color.FromHex("#006600") },
});
var wasSent = false;
var query = EntityQueryEnumerator<FaxMachineComponent>();
while (query.MoveNext(out var faxUid, out var fax))
{
if (!fax.ReceiveStationGoal)
continue;
var largestGrid = _station.GetLargestGrid(stationData);
var grid = Transform(faxUid).GridUid;
if (grid is not null && largestGrid == grid.Value)
{
_fax.Receive(faxUid, printout, null, fax);
foreach (var spawnEnt in goal.Spawns)
{
SpawnAtPosition(spawnEnt, Transform(faxUid).Coordinates);
}
wasSent = true;
}
}
return wasSent;
}
}
}

View File

@@ -0,0 +1,29 @@
using Robust.Shared.Prototypes;
namespace Content.Server._White._Engi.StationGoal
{
/// <summary>
/// WD
/// </summary>
[Serializable, Prototype("stationGoal")]
public sealed class StationGoalPrototype : IPrototype
{
[IdDataField]
public string ID { get; } = default!;
[DataField]
public string Text { get; set; } = string.Empty;
[DataField]
public int? MinPlayers;
[DataField]
public int? MaxPlayers;
/// <summary>
/// Goal may require certain items to complete. These items will appear near the receving fax machine at the start of the round.
/// </summary>
[DataField]
public List<EntProtoId> Spawns = new();
}
}