Skip to content

Commit

Permalink
[ADMIN] new command "sendert" (#690)
Browse files Browse the repository at this point in the history
## Описание PR
<!-- Что вы изменили в этом пулл реквесте? -->

## Почему / Баланс
*чтобы не было глупых вопросов, а как вызвать ОБР*

## Техническая информация
<!-- Если речь идет об изменении кода, кратко изложите на высоком уровне
принцип работы нового кода. Это облегчает рецензирование.- -->

## Медиа

![image](https://github.com/user-attachments/assets/7c8f5653-3f67-416a-9004-b1f614c39866)

![image](https://github.com/user-attachments/assets/c31da81b-3e54-4600-be9c-de12b185ea14)



## Требования
<!--
В связи с наплывом ПР'ов нам необходимо убедиться, что ПР'ы следуют
правильным рекомендациям.

Пожалуйста, уделите время прочтению, если делаете пулл реквест (ПР)
впервые.

Отметьте поля ниже, чтобы подтвердить, что Вы действительно видели их
(поставьте X в скобках, например [X]):
-->
- [ ] Я прочитал(а) и следую [Руководство по созданию пулл
реквестов](https://docs.spacestation14.com/en/general-development/codebase-info/pull-request-guidelines.html).
Я понимаю, что в противном случае мой ПР может быть закрыт по усмотрению
мейнтейнера.
- [ ] Я добавил скриншоты/видео к этому пулл реквесту, демонстрирующие
его изменения в игре, **или** этот пулл реквест не требует демонстрации
в игре

## Критические изменения
<!--
Перечислите все критические изменения, включая изменения пространства
имён, публичных классов/методов/полей, переименования прототипов, и
предоставьте инструкции по их исправлению.
-->

**Чейнджлог**

:cl: Шрёдька
- add: Добавлена новая команда sendert для вызова ОБР.
  • Loading branch information
Schrodinger71 authored Oct 29, 2024
1 parent 63c7cd3 commit ab4f930
Show file tree
Hide file tree
Showing 15 changed files with 68,708 additions and 33 deletions.
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

0 comments on commit ab4f930

Please sign in to comment.