Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[ADMIN] new command "sendert" #690

Merged
merged 4 commits into from
Oct 29, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
216 changes: 216 additions & 0 deletions Content.Server/ADT/Administration/Commands/SendERTCommand.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,216 @@
using Content.Server.Administration;
using Content.Server.Administration.Logs;
using Content.Server.AlertLevel;
using Content.Server.Audio;
using Content.Server.Chat.Systems;
using Content.Server.Station.Systems;
using Content.Shared.Administration;
using Content.Shared.Database;
using Robust.Server.GameObjects;
using Robust.Server.Maps;
using Robust.Server.Player;
using Robust.Shared.Audio;
using Robust.Shared.Console;
using Robust.Shared.Map;
using Robust.Shared.Player;
using System.Numerics;
using Content.Server.Chat.Managers;
using Robust.Shared.ContentPack;

namespace Content.Server.ADT.Administration.Commands;

[AdminCommand(AdminFlags.Admin)]
public sealed class SendERTCommand : IConsoleCommand
{
[Dependency] private readonly IMapManager _mapManager = default!;
[Dependency] private readonly IAdminLogManager _adminLogger = default!;
[Dependency] private readonly IEntitySystemManager _system = default!;
[Dependency] private readonly IEntityManager _entManager = default!;
[Dependency] private readonly IPlayerManager _playerManager = default!;
[Dependency] private readonly IChatManager _chat = default!;
[Dependency] private readonly IResourceManager _resourceManager = default!;

public string Command => "sendert";
public string Description => Loc.GetString("send-ert-description");
public string Help => Loc.GetString("send-ert-help");
public void Execute(IConsoleShell shell, string argStr, string[] args)
{
#region Setup vars
string audioPath = "";
string defaultGridPath = "/Maps/ADTMaps/Shuttles/ERT", defaultAudioPath = "/Audio/Corvax/Adminbuse";
string alertLevelCode = "gamma";
int volume = 0;
bool isLoadGrid = false, isAnnounce = true, isPlayAudio = true, isSetAlertLevel = true, playAuidoFromAnnouncement = false;
Color announceColor = Color.SeaBlue;
#endregion

var player = shell.Player;
if (player?.AttachedEntity == null) // Are we the server's console?
{ shell.WriteLine(Loc.GetString("shell-only-players-can-run-this-command")); return; }

var stationUid = _system.GetEntitySystem<StationSystem>().GetOwningStation(player.AttachedEntity.Value);
if (stationUid == null)
{
shell.WriteLine(Loc.GetString("cmd-setalertlevel-invalid-grid"));
return;
}

#region Set isAnnounce
switch (args.Length)
{
case 0:
shell.WriteLine(Loc.GetString("send-ert-help"));
return;
case 1:
isAnnounce = true;
break;
default:
if (bool.TryParse(args[1].ToLower(), out var temp)) { isAnnounce = temp; }
else { shell.WriteError(Loc.GetString($"send-ert-truefalse-error")); return; }
break;
}
#endregion

#region ERT type check
switch (args[0].ToLower())
{
case "default":
audioPath = $"{defaultAudioPath}/yesert.ogg";
isLoadGrid = true;
break;

case "default-rev":
audioPath = $"{defaultAudioPath}/yesert.ogg";
isLoadGrid = true;
break;

case "security":
audioPath = $"{defaultAudioPath}/yesert.ogg";
isLoadGrid = true;
break;

case "engineer":
audioPath = $"{defaultAudioPath}/yesert.ogg";
isLoadGrid = true;
break;

case "medical":
audioPath = $"{defaultAudioPath}/yesert.ogg";
isLoadGrid = true;
break;

case "janitor":
audioPath = $"{defaultAudioPath}/yesert.ogg";
isLoadGrid = true;
break;

case "chaplain":
audioPath = $"{defaultAudioPath}/yesert.ogg";
isLoadGrid = true;
break;

case "cbun":
audioPath = $"{defaultAudioPath}/yesert.ogg";
isLoadGrid = true;
break;

case "deathsquad":
//alertLevelCode = "epsilon";
announceColor = Color.White;
isLoadGrid = true;
break;

case "denial":
audioPath = $"{defaultAudioPath}/noert.ogg";
isAnnounce = true;
isLoadGrid = false;
isSetAlertLevel = false;
break;

default:
isLoadGrid = false;
shell.WriteError(Loc.GetString("send-ert-erttype-error"));
return;

}
#endregion

#region Command's body
if (isLoadGrid) // Create grid & map
{
var gridPath = $"{defaultGridPath}/{args[0].ToLower()}.yml";
if (!_resourceManager.TryContentFileRead(gridPath, out var _))
{
shell.WriteError(Loc.GetString("send-ert-erttype-error-path"));
shell.WriteError($"No map found: {gridPath}");
return;
}

var mapId = _mapManager.CreateMap();
_system.GetEntitySystem<MetaDataSystem>().SetEntityName(_mapManager.GetMapEntityId(mapId), Loc.GetString("sent-ert-map-name"));
var girdOptions = new MapLoadOptions();
girdOptions.Offset = new Vector2(0, 0);
girdOptions.Rotation = Angle.FromDegrees(0);
_system.GetEntitySystem<MapLoaderSystem>().Load(mapId, gridPath, girdOptions);
shell.WriteLine($"Карта {gridPath} успешно загружена! :з");
_chat.SendAdminAlert($"Админ {player.Name} вызвал {args[0].ToLower()}. Карте 'Сектор патрулирования' было присовино ID: {mapId}. Точка телепортации для призраков появилась на шаттле.");
}

if (isAnnounce) // Write announce & play audio
{
if (isSetAlertLevel)
{
if (stationUid == null) { shell.WriteLine(Loc.GetString("sent-ert-invalid-grid")); return; } //We are on station?
_system.GetEntitySystem<AlertLevelSystem>().SetLevel(stationUid.Value, alertLevelCode, false, true, true, true);
}

if (isPlayAudio)
{
Filter filter = Filter.Empty().AddAllPlayers(_playerManager);

var audioOption = AudioParams.Default;
audioOption = audioOption.WithVolume(volume);

_entManager.System<ServerGlobalSoundSystem>().PlayAdminGlobal(filter, audioPath, audioOption, true);
}

_system.GetEntitySystem<ChatSystem>().DispatchGlobalAnnouncement(Loc.GetString($"ert-send-{args[0].ToLower()}-announcement"), Loc.GetString($"ert-send-{args[0].ToLower()}-announcer"), playSound: playAuidoFromAnnouncement, colorOverride: announceColor);
}
#endregion

_adminLogger.Add(LogType.Action, LogImpact.High, $"{player} send ERT. Type: {args[0]}. Is announce: {isAnnounce}");
}

public CompletionResult GetCompletion(IConsoleShell shell, string[] args)
{
if (args.Length == 1)
{
var type = new CompletionOption[]
{
new("Default", Loc.GetString("send-ert-hint-type-default")),
new("Default-rev", Loc.GetString("send-ert-hint-type-default-rev")),
new("Security", Loc.GetString("send-ert-hint-type-security")),
new("Engineer", Loc.GetString("send-ert-hint-type-engineer")),
new("Medical", Loc.GetString("send-ert-hint-type-medical")),
new("Janitor", Loc.GetString("send-ert-hint-type-janitor")),
new("Chaplain", Loc.GetString("send-ert-hint-type-chaplain")),
new("CBUN", Loc.GetString("send-ert-hint-type-cbrn")),
new("DeathSquad", Loc.GetString("send-ert-hint-type-deathsquad")),
new("Denial", Loc.GetString("send-ert-hint-type-denial")),
};
return CompletionResult.FromHintOptions(type, Loc.GetString("send-ert-hint-type"));
}

if (args.Length == 2)
{
var isAnnounce = new CompletionOption[]
{
new("true", Loc.GetString("send-ert-hint-isannounce-true")),
new("false", Loc.GetString("send-ert-hint-isannounce-false")),
};
return CompletionResult.FromHintOptions(isAnnounce, Loc.GetString("send-ert-hint-isannounce"));
}

return CompletionResult.Empty;
}
}
71 changes: 71 additions & 0 deletions Resources/Locale/ru-RU/ADT/command/sendert.ftl
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
# Command
send-ert-description = Вызывает ОБР заданного типа. Вы должны находиться на станции.
send-ert-help = sendert <тип ОБР> (объявляют себя? По умолчанию true)

# Errors
send-ert-truefalse-error = Вторая переменная не соответствует ни true, ни false
send-ert-erttype-error = Обнаружен неизвестный отряд ОБР
sent-ert-invalid-grid = Вы находитесь не на станции. Для запуска команды ваш персонаж должен находится на гриде станции
send-ert-erttype-error-path = Неизвестный путь к шаттлу или он отстуствует

# Map name
sent-ert-map-name = Сектор патруля

# ERT type: default
ert-send-default-announcement = Внимание! Мы получили запрос на отряд быстрого реагирования. Запрос одобрен. Отряд будет подготовлен и отправлен в кротчайшие сроки.
ert-send-default-announcer = Центральное командование

# ERT type: default-rev
ert-send-default-rev-announcement = Внимание! Мы получили запрос на отряд быстрого реагирования. Запрос одобрен. Отряд будет подготовлен и отправлен в кротчайшие сроки.
ert-send-default-rev-announcer = Центральное командование

# ERT type: security
ert-send-security-announcement = Внимание! Мы получили запрос на отряд быстрого реагирования. Запрос одобрен. Отряд будет подготовлен и отправлен в кротчайшие сроки.
ert-send-security-announcer = Центральное командование

# ERT type: engineer
ert-send-engineer-announcement = Внимание! Мы получили запрос на отряд быстрого реагирования. Запрос одобрен. Отряд будет подготовлен и отправлен в кротчайшие сроки.
ert-send-engineer-announcer = Центральное командование

# ERT type: medical
ert-send-medical-announcement = Внимание! Мы получили запрос на отряд быстрого реагирования. Запрос одобрен. Отряд будет подготовлен и отправлен в кротчайшие сроки.
ert-send-medical-announcer = Центральное командование

# ERT type: janitor
ert-send-janitor-announcement = Внимание! Мы получили запрос на отряд быстрого реагирования. Запрос одобрен. Отряд будет подготовлен и отправлен в кротчайшие сроки.
ert-send-janitor-announcer = Центральное командование

# ERT type: chaplain
ert-send-chaplain-announcement = Внимание! Мы получили запрос на отряд быстрого реагирования. Запрос одобрен. Отряд будет подготовлен и отправлен в кротчайшие сроки.
ert-send-chaplain-announcer = Центральное командование

# ERT type: cbun
ert-send-cbun-announcement = Внимание! Мы получили запрос на отряд быстрого реагирования. Запрос одобрен. Отряд будет подготовлен и отправлен в кротчайшие сроки.
ert-send-cbun-announcer = Центральное командование

# ERT type: deathsquad
ert-send-deathsquad-announcement = Приказ Центрального командования. Экипаж станции должен оставаться на своих местах. Ожидайте шаттл эвакуации.
ert-send-deathsquad-announcer = Центральное командование

# ERT type: denial
ert-send-denial-announcement = Внимание! Мы получили запрос на отряд быстрого реагирования. Запрос отклонён. Попытайтесь решить проблемы своими силами.
ert-send-denial-announcer = Центральное командование

# Hints
send-ert-hint-type = Тип ОБР

send-ert-hint-type-default = Стандартный отряд(Против ЯО)
send-ert-hint-type-default-rev = Стандартный отряд(Против бунтов)
send-ert-hint-type-security = Отряд СБ ОБР
send-ert-hint-type-engineer = Отряд инженеров ОБР
send-ert-hint-type-medical = Отряд медиков ОБР
send-ert-hint-type-janitor = Отряд уборщиков ОБР
send-ert-hint-type-chaplain = Отряд священников ОБР
send-ert-hint-type-cbrn = Отряд РХБЗЗ
send-ert-hint-type-deathsquad = Отряд Эскадрона смерти
send-ert-hint-type-denial = Отказ в вызове ОБР

send-ert-hint-isannounce = Объявляют себя?

send-ert-hint-isannounce-true = Да
send-ert-hint-isannounce-false = Нет
19 changes: 10 additions & 9 deletions Resources/Locale/ru-RU/ADT/personalization.ftl
Original file line number Diff line number Diff line change
Expand Up @@ -69,21 +69,22 @@ ent-ADTPlushieJungar = плюшевый Джунгарик

ent-FlippoSchrodingerLighter = зажигалка Шрёдингера
.desc = Зажигалка зиппо с тёмно-зелёным металлическим покрытием. На корпусе есть две буквы, которые обозначают "Александр Шрёдингер".
.suffix = { "Шрёдя" }
.suffix = { "Именное, Schrodinger" }

ent-ADTClothingOuterCoatSchroCoat = плащ Шрёдингера
.desc = Это темное-зелёное пальто, тяжелее, чем кажется на первый взгляд
.desc = Это темное-зелёное пальто, тяжелее, чем кажется на первый взгляд.
.suffix = { "Именное, Schrodinger" }

ent-ADTCigarSchrodingerCase = { ent-CigarCase }
.desc = { ent-CigarCase.desc }

ent-ADTBriefcaseBrownSchrodinger = чемодан Шрёдингера
.desc = Стандартная униформа проверяющих работу станции со стороны комитета надзора NanoTrasen.
.suffix = { "ЦК, Шрёдя" }
.suffix = { "Именное ЦК, Schrodinger" }

ent-ADTWeaponRevolverDeckardGold = золотой Декард
.desc = Наградной револьвер созданный по специальному заказу и украшенный золотом для придания ему особого величия. Он предназначен для использования патронов "магнум" 44-го калибра, обеспечивая высокую огневую мощь и точность. Сбоку видна гравировка "А.А.Шрёдингеру 2567".
.suffix = { "Шрёдя" }
.suffix = { "Именное, Schrodinger" }

ent-ADTBriefcaseCentcomm = чемодан ЦентКома
.desc = Роскошный и сверхпрочный чемодан с символикой NanoTrasen. Предназначен для очень важных людей с очень важными бумагами.
Expand Down Expand Up @@ -198,7 +199,7 @@ ent-ADTPlushieRebecca = Ребекка

ent-ADTPlushieSchrodinger = Шрёдингер
.desc = Мягкая плюшевая игрушка, одета в традиционный костюм с белой рубашкой, красным галстуком и пиджаком, будьте аккуратней иногда находиться в суперпозиции.
.suffix = { "" }
.suffix = { "Именное, Schrodinger" }

ent-ADTPlushieTerenty = Терентий
.desc = Срочник инженерной мысли. Очень любит фрезон и лимитки. Никогда не знаешь, стоит ли ожидать от него чего-то хорошего, или плохого. Порывшись в его карманах, можно найти зловещую плётку Риты... На игрушке имеется бирка, с маркировкой "С. Р. О. Ч. Н. И. К."
Expand Down Expand Up @@ -326,7 +327,7 @@ ent-ADTSyrelBattleAxe = боевой топор капитана
ent-ADTSyrelClothingBeltSheath = чехол боевого топора
.desc = Прочный кожанный чехол для боевого топора капитана.
.suffix = { "Именное, Syrel" }

ent-ADTClothingHandsPushnoYGloves = Беспалые кожаные перчатки
.desc = Перчатки без пальцев из прочной натуральной кожи, отлично сочетается с белой рубашкой и аквамариновой жилеткой.
.suffix = Именное, PushnoY.
Expand Down Expand Up @@ -365,11 +366,11 @@ ent-ADTClothingHeadHatMoon_so_redHat = изящная шляпа
.desc = Средних размеров шляпа. Сделана она из качественной ткани светло-салатового цвета. Немного пыльная, но всë равно выглядит дорого. Около центра самой шляпы, прикреплён значок. Он золотисто-медного материала, знаков различия или изображений нет.
.suffix = Именное, Moon_so_red

ent-ADTClothingEyesMoon_so_redGlasses = салатовые очки
.desc = Странно выглядящие очки светло-салатового цвета. Имеются лёгкие царапины.
ent-ADTClothingEyesMoon_so_redGlasses = салатовые очки
.desc = Странно выглядящие очки светло-салатового цвета. Имеются лёгкие царапины.
.suffix = Именное, Moon_so_red

ent-ADTClothingOuterMoon_so_redCoat = потрепанная мантия
ent-ADTClothingOuterMoon_so_redCoat = потрепанная мантия
.desc = Массивная мантия светло-салатого цвета. Старовата, пыльна, но ткань выглядит дорого. На груди вышето сердце, как мило! На внутренней части левого рукава есть большой ярлык, на нëм написано: " Ральзею Кë ".
.suffix = Именное, Moon_so_red

Expand Down
Loading
Loading