diff --git a/.github/workflows/build-test-debug-win.yml b/.github/workflows/build-test-debug-win.yml new file mode 100644 index 00000000000..7cb598ef17f --- /dev/null +++ b/.github/workflows/build-test-debug-win.yml @@ -0,0 +1,63 @@ +name: Build & Test Debug Windows + +on: + push: + branches: [ master, staging, trying ] + merge_group: + pull_request: + types: [ opened, reopened, synchronize, ready_for_review ] + branches: [ master ] + workflow_dispatch: # ручной запуск + +jobs: + build: + if: github.actor != 'IanComradeBot' && github.event.pull_request.draft == false + strategy: + matrix: + os: [ windows-latest ] + + runs-on: ${{ matrix.os }} + + steps: + - name: Checkout Master + uses: actions/checkout@v3.6.0 + + - name: Setup Submodule + run: | + git submodule update --init --recursive + + - name: Pull engine updates + uses: space-wizards/submodule-dependency@v0.1.5 + + - name: Update Engine Submodules + run: | + cd RobustToolbox/ + git submodule update --init --recursive + + - name: Setup .NET Core + uses: actions/setup-dotnet@v3.2.0 + with: + dotnet-version: 8.0.x + + - name: Install dependencies + run: dotnet restore + + - name: Build Project + run: dotnet build --configuration DebugOpt --no-restore /p:WarningsAsErrors=nullable /m + + - name: Run Content.Tests + run: dotnet test --no-build --configuration DebugOpt Content.Tests/Content.Tests.csproj -- NUnit.ConsoleOut=0 + + - name: Run Content.IntegrationTests + shell: pwsh + run: | + $env:DOTNET_gcServer=1 + dotnet test --no-build --configuration DebugOpt Content.IntegrationTests/Content.IntegrationTests.csproj -- NUnit.ConsoleOut=0 NUnit.MapWarningTo=Failed + ci-success: + name: Build & Test Debug + needs: + - build + runs-on: windows-latest + steps: + - name: CI succeeded + run: exit 0 \ No newline at end of file diff --git a/Content.Client/ADT/MiningShop/MiningShopBui.cs b/Content.Client/ADT/MiningShop/MiningShopBui.cs index 4aa80d6cd6c..79545b11dfa 100644 --- a/Content.Client/ADT/MiningShop/MiningShopBui.cs +++ b/Content.Client/ADT/MiningShop/MiningShopBui.cs @@ -23,6 +23,7 @@ public sealed class MiningShopBui : BoundUserInterface [Dependency] private readonly IResourceCache _resource = default!; private readonly MiningPointsSystem _miningPoints; private MiningShopWindow? _window; + private List _sections = new(); public MiningShopBui(EntityUid owner, Enum uiKey) : base(owner, uiKey) { _miningPoints = EntMan.System(); @@ -34,63 +35,61 @@ protected override void Open() _window.OnClose += Close; _window.Title = EntMan.GetComponentOrNull(Owner)?.EntityName ?? "MiningShop"; - if (EntMan.TryGetComponent(Owner, out MiningShopComponent? vendor)) + if (!EntMan.TryGetComponent(Owner, out MiningShopComponent? vendor)) + return; + var sections = _prototype.EnumeratePrototypes().ToList(); + sections.Sort((x, y) => x.Name[0].CompareTo(x.Name[0])); + + foreach (var section in sections) { - for (var sectionIndex = 0; sectionIndex < vendor.Sections.Count; sectionIndex++) + var uiSection = new MiningShopSection(); + uiSection.Label.SetMessage(GetSectionName(section)); + _sections.Add(section); + + foreach (var entry in section.Entries) { - var section = vendor.Sections[sectionIndex]; + var uiEntry = new MiningShopEntry(); + + if (_prototype.TryIndex(entry.Id, out var entity)) + { + uiEntry.Texture.Textures = SpriteComponent.GetPrototypeTextures(entity, _resource) + .Select(o => o.Default) + .ToList(); + uiEntry.Panel.Button.Label.Text = entry.Name?.Replace("\\n", "\n") ?? entity.Name; - var uiSection = new MiningShopSection(); - uiSection.Label.SetMessage(GetSectionName(section)); + var name = entity.Name; + var color = MiningShopPanel.DefaultColor; + var borderColor = MiningShopPanel.DefaultBorderColor; + var hoverColor = MiningShopPanel.DefaultBorderColor; + uiEntry.Panel.Color = color; + uiEntry.Panel.BorderColor = borderColor; + uiEntry.Panel.HoveredColor = hoverColor; - for (var entryIndex = 0; entryIndex < section.Entries.Count; entryIndex++) - { - var entry = section.Entries[entryIndex]; - var uiEntry = new MiningShopEntry(); - - if (_prototype.TryIndex(entry.Id, out var entity)) - { - uiEntry.Texture.Textures = SpriteComponent.GetPrototypeTextures(entity, _resource) - .Select(o => o.Default) - .ToList(); - uiEntry.Panel.Button.Label.Text = entry.Name?.Replace("\\n", "\n") ?? entity.Name; - - var name = entity.Name; - var color = MiningShopPanel.DefaultColor; - var borderColor = MiningShopPanel.DefaultBorderColor; - var hoverColor = MiningShopPanel.DefaultBorderColor; - - uiEntry.Panel.Color = color; - uiEntry.Panel.BorderColor = borderColor; - uiEntry.Panel.HoveredColor = hoverColor; - - var msg = new FormattedMessage(); - msg.AddText(name); - msg.PushNewline(); - - if (!string.IsNullOrWhiteSpace(entity.Description)) - msg.AddText(entity.Description); - - var tooltip = new Tooltip(); - tooltip.SetMessage(msg); - tooltip.MaxWidth = 250f; - - uiEntry.TooltipLabel.ToolTip = entity.Description; - uiEntry.TooltipLabel.TooltipDelay = 0; - uiEntry.TooltipLabel.TooltipSupplier = _ => tooltip; - - var sectionI = sectionIndex; - var entryI = entryIndex; - uiEntry.Panel.Button.OnPressed += _ => OnButtonPressed(sectionI, entryI); - } - - uiSection.Entries.AddChild(uiEntry); + var msg = new FormattedMessage(); + msg.AddText(name); + msg.PushNewline(); + + if (!string.IsNullOrWhiteSpace(entity.Description)) + msg.AddText(entity.Description); + + var tooltip = new Tooltip(); + tooltip.SetMessage(msg); + tooltip.MaxWidth = 250f; + + uiEntry.TooltipLabel.ToolTip = entity.Description; + uiEntry.TooltipLabel.TooltipDelay = 0; + uiEntry.TooltipLabel.TooltipSupplier = _ => tooltip; + + uiEntry.Panel.Button.OnPressed += _ => OnButtonPressed(entry); } - _window.Sections.AddChild(uiSection); + uiSection.Entries.AddChild(uiEntry); } + + _window.Sections.AddChild(uiSection); } + _window.Express.OnPressed += _ => OnExpressDeliveryButtonPressed(); _window.Search.OnTextChanged += OnSearchChanged; @@ -99,9 +98,9 @@ protected override void Open() _window.OpenCentered(); } - private void OnButtonPressed(int sectionIndex, int entryIndex) + private void OnButtonPressed(Content.Shared.ADT.MiningShop.MiningShopEntry entry) { - var msg = new MiningShopBuiMsg(sectionIndex, entryIndex); + var msg = new MiningShopBuiMsg(entry); SendMessage(msg); Refresh(); } @@ -168,10 +167,12 @@ public void Refresh() _window.PointsLabel.Text = $"Осталось очков: {userpoints}"; - for (var sectionIndex = 0; sectionIndex < vendor.Sections.Count; sectionIndex++) + var sections = _prototype.EnumeratePrototypes(); + + for (var sectionIndex = 0; sectionIndex < _sections.Count; sectionIndex++) { - var section = vendor.Sections[sectionIndex]; - var uiSection = (MiningShopSection) _window.Sections.GetChild(sectionIndex); + var section = _sections[sectionIndex]; + var uiSection = (MiningShopSection)_window.Sections.GetChild(sectionIndex); uiSection.Label.SetMessage(GetSectionName(section)); var sectionDisabled = false; @@ -179,7 +180,7 @@ public void Refresh() for (var entryIndex = 0; entryIndex < section.Entries.Count; entryIndex++) { var entry = section.Entries[entryIndex]; - var uiEntry = (MiningShopEntry) uiSection.Entries.GetChild(entryIndex); + var uiEntry = (MiningShopEntry)uiSection.Entries.GetChild(entryIndex); var disabled = sectionDisabled; if (userpoints < entry.Price) @@ -210,7 +211,7 @@ protected override void ReceiveMessage(BoundUserInterfaceMessage message) } } - private FormattedMessage GetSectionName(SharedMiningShopSection section) + private FormattedMessage GetSectionName(SharedMiningShopSectionPrototype section) { var name = new FormattedMessage(); name.PushTag(new MarkupNode("bold", new MarkupParameter(section.Name.ToUpperInvariant()), null)); diff --git a/Content.Server/Administration/Managers/AdminManager.cs b/Content.Server/Administration/Managers/AdminManager.cs index 57a7387ab5c..c0cb1ca83ac 100644 --- a/Content.Server/Administration/Managers/AdminManager.cs +++ b/Content.Server/Administration/Managers/AdminManager.cs @@ -20,6 +20,9 @@ using Robust.Shared.Toolshed; using Robust.Shared.Toolshed.Errors; using Robust.Shared.Utility; +using Content.Shared.ADT.CCVar; +using Content.Server.Discord; +using Serilog; namespace Content.Server.Administration.Managers @@ -36,6 +39,7 @@ public sealed partial class AdminManager : IAdminManager, IPostInjectInit, IConG [Dependency] private readonly IChatManager _chat = default!; [Dependency] private readonly ToolshedManager _toolshed = default!; [Dependency] private readonly ILogManager _logManager = default!; + [Dependency] private readonly DiscordWebhook _discord = default!; private readonly Dictionary _admins = new(); private readonly HashSet _promotedPlayers = new(); @@ -76,7 +80,7 @@ public bool IsAdmin(ICommonSession session, bool includeDeAdmin = false) return null; } - public void DeAdmin(ICommonSession session) + public async void DeAdmin(ICommonSession session) // ADT-tweak: add "async" { if (!_admins.TryGetValue(session, out var reg)) { @@ -97,6 +101,22 @@ public void DeAdmin(ICommonSession session) SendPermsChangedEvent(session); UpdateAdminStatus(session); + // ADT-Tweak-start: Постит сообщение в чат при деадмине + if (!string.IsNullOrEmpty(_cfg.GetCVar(ADTDiscordWebhookCCVars.DiscordAdminchatWebhook))) + { + var webhookUrl = _cfg.GetCVar(ADTDiscordWebhookCCVars.DiscordAdminchatWebhook); + if (webhookUrl == null) + return; + if (await _discord.GetWebhook(webhookUrl) is not { } webhookData) + return; + var payload = new WebhookPayload + { + Content = $"**Снял права**: **{session.Name}**" + }; + var identifier = webhookData.ToIdentifier(); + await _discord.CreateMessage(identifier, payload); + } + // ADT-Tweak-end } public void Stealth(ICommonSession session) @@ -137,7 +157,7 @@ public void UnStealth(ICommonSession session) // _chat.SendAdminAnnouncement(Loc.GetString("admin-manager-self-disable-stealth", ("exStealthAdminName", session.Name)), flagWhitelist: AdminFlags.Stealth); } - public void ReAdmin(ICommonSession session) + public async void ReAdmin(ICommonSession session) // ADT-tweak: add "async" { if (!_admins.TryGetValue(session, out var reg)) { @@ -168,6 +188,22 @@ public void ReAdmin(ICommonSession session) SendPermsChangedEvent(session); UpdateAdminStatus(session); + // ADT-Tweak-start: Постит сообщение в чат при деадмине + if (!string.IsNullOrEmpty(_cfg.GetCVar(ADTDiscordWebhookCCVars.DiscordAdminchatWebhook))) + { + var webhookUrl = _cfg.GetCVar(ADTDiscordWebhookCCVars.DiscordAdminchatWebhook); + if (webhookUrl == null) + return; + if (await _discord.GetWebhook(webhookUrl) is not { } webhookData) + return; + var payload = new WebhookPayload + { + Content = $"**Вернул права**: **{session.Name}**" + }; + var identifier = webhookData.ToIdentifier(); + await _discord.CreateMessage(identifier, payload); + } + // ADT-Tweak-end } public async void ReloadAdmin(ICommonSession player) @@ -353,13 +389,31 @@ private void PlayerStatusChanged(object? sender, SessionStatusEventArgs e) } else { + DisconnectedAdminMaybe(e.Session); // ADT-Tweak _chat.SendAdminAnnouncement(Loc.GetString("admin-manager-admin-logout-message", ("name", e.Session.Name))); } } } } - + // ADT-Tweak-start: Кидает инфу в дис если админ вышел из игры + private async void DisconnectedAdminMaybe(ICommonSession session) + { + if (!string.IsNullOrEmpty(_cfg.GetCVar(ADTDiscordWebhookCCVars.DiscordAdminchatWebhook))) + { + var webhookUrl = _cfg.GetCVar(ADTDiscordWebhookCCVars.DiscordAdminchatWebhook); + var senderName = session.Name; + if (await _discord.GetWebhook(webhookUrl) is not { } webhookData) + return; + var payload = new WebhookPayload + { + Content = $"**Оповещение: Админ ВЫШЕЛ {senderName}**" + }; + var identifier = webhookData.ToIdentifier(); + await _discord.CreateMessage(identifier, payload); + } + } + // ADT-Tweak-end private async void LoginAdminMaybe(ICommonSession session) { var adminDat = await LoadAdminData(session); @@ -398,6 +452,26 @@ private async void LoginAdminMaybe(ICommonSession session) { _chat.SendAdminAnnouncement(Loc.GetString("admin-manager-admin-login-message", ("name", session.Name))); + // ADT-Tweak-start: Кидает инфу в дис если админ зашёл + if (!string.IsNullOrEmpty(_cfg.GetCVar(ADTDiscordWebhookCCVars.DiscordAdminchatWebhook))) + { + var webhookUrl = _cfg.GetCVar(ADTDiscordWebhookCCVars.DiscordAdminchatWebhook); + var senderAdmin = GetAdminData(session); + if (senderAdmin == null) + return; + var senderName = session.Name; + if (!string.IsNullOrEmpty(senderAdmin.Title)) + senderName += $"\\[{senderAdmin.Title}\\]"; + if (await _discord.GetWebhook(webhookUrl) is not { } webhookData) + return; + var payload = new WebhookPayload + { + Content = $"**Оповещение: Админ зашёл {senderName}**" + }; + var identifier = webhookData.ToIdentifier(); + await _discord.CreateMessage(identifier, payload); + } + // ADT-Tweak-end } } diff --git a/Content.Server/Chat/Managers/ChatManager.cs b/Content.Server/Chat/Managers/ChatManager.cs index 7188f545766..e21ff29c9db 100644 --- a/Content.Server/Chat/Managers/ChatManager.cs +++ b/Content.Server/Chat/Managers/ChatManager.cs @@ -19,6 +19,8 @@ using Robust.Shared.Player; using Robust.Shared.Replays; using Robust.Shared.Utility; +using Content.Shared.ADT.CCVar; +using Content.Server.Discord; namespace Content.Server.Chat.Managers; @@ -46,6 +48,8 @@ internal sealed partial class ChatManager : IChatManager [Dependency] private readonly IEntityManager _entityManager = default!; [Dependency] private readonly PlayerRateLimitManager _rateLimitManager = default!; [Dependency] private readonly SponsorsManager _sponsorsManager = default!; // Corvax-Sponsors + [Dependency] private readonly IConfigurationManager _cfg = default!; + [Dependency] private readonly DiscordWebhook _discord = default!; /// /// The maximum length a player-sent message can be sent @@ -277,7 +281,7 @@ private void SendOOC(ICommonSession player, string message) _adminLogger.Add(LogType.Chat, LogImpact.Low, $"OOC from {player:Player}: {message}"); } - private void SendAdminChat(ICommonSession player, string message) + private async void SendAdminChat(ICommonSession player, string message) { if (!_adminManager.IsAdmin(player)) { @@ -315,6 +319,24 @@ private void SendAdminChat(ICommonSession player, string message) } _adminLogger.Add(LogType.Chat, $"Admin chat from {player:Player}: {message}"); + // ADT-Tweak-start: Постит в дис весь админчат, если есть данный вебхук + if (!string.IsNullOrEmpty(_cfg.GetCVar(ADTDiscordWebhookCCVars.DiscordAdminchatWebhook))) + { + var webhookUrl = _cfg.GetCVar(ADTDiscordWebhookCCVars.DiscordAdminchatWebhook); + + if (webhookUrl == null) + return; + + if (await _discord.GetWebhook(webhookUrl) is not { } webhookData) + return; + var payload = new WebhookPayload + { + Content = $"***AdminChat***: **{senderName}**: {message}" + }; + var identifier = webhookData.ToIdentifier(); + await _discord.CreateMessage(identifier, payload); + } + // ADT-Tweak-end } #endregion diff --git a/Content.Shared/ADT/CCVar/CCVars.WebhookDiscord.cs b/Content.Shared/ADT/CCVar/CCVars.WebhookDiscord.cs index 3924fee9abb..664052e5eaa 100644 --- a/Content.Shared/ADT/CCVar/CCVars.WebhookDiscord.cs +++ b/Content.Shared/ADT/CCVar/CCVars.WebhookDiscord.cs @@ -10,5 +10,11 @@ public sealed class ADTDiscordWebhookCCVars : CVars /// URL of the Discord webhook which will relay adminwho info to the channel. /// public static readonly CVarDef DiscordAdminwhoWebhook = - CVarDef.Create("discord.adminwho_webhook", string.Empty, CVar.SERVERONLY | CVar.CONFIDENTIAL); + CVarDef.Create("discord.adminwho_webhook", string.Empty, CVar.SERVERONLY | CVar.CONFIDENTIAL | CVar.ARCHIVE); + + /// + /// URL of the Discord adminchat info to the channel. + /// + public static readonly CVarDef DiscordAdminchatWebhook = + CVarDef.Create("discord.adminchat_webhook", string.Empty, CVar.SERVERONLY | CVar.CONFIDENTIAL | CVar.ARCHIVE); } diff --git a/Content.Shared/ADT/MiningShop/MiningShopComponent.cs b/Content.Shared/ADT/MiningShop/MiningShopComponent.cs index 3f03ed74088..701b8a372e2 100644 --- a/Content.Shared/ADT/MiningShop/MiningShopComponent.cs +++ b/Content.Shared/ADT/MiningShop/MiningShopComponent.cs @@ -9,9 +9,6 @@ namespace Content.Shared.ADT.MiningShop; [Access(typeof(SharedMiningShopSystem))] public sealed partial class MiningShopComponent : Component { - - [DataField, AutoNetworkedField] - public List Sections = new(); [DataField, AutoNetworkedField] public List OrderList = new(); diff --git a/Content.Shared/ADT/MiningShop/MiningShopSection.cs b/Content.Shared/ADT/MiningShop/MiningShopSection.cs index 832d40119ad..e825f27822e 100644 --- a/Content.Shared/ADT/MiningShop/MiningShopSection.cs +++ b/Content.Shared/ADT/MiningShop/MiningShopSection.cs @@ -4,22 +4,17 @@ namespace Content.Shared.ADT.MiningShop; -[DataDefinition] -[Serializable, NetSerializable] -public sealed partial class SharedMiningShopSection +[Prototype("miningShopSection")] +public sealed partial class SharedMiningShopSectionPrototype : IPrototype { + [IdDataField] + public string ID { get; private set; } = default!; + [DataField(required: true)] public string Name = string.Empty; [DataField(required: true)] public List Entries = new(); - - // Only used by Spec Vendors to mark the kit section for RMCVendorSpecialistComponent logic. - [DataField] - public int? SharedSpecLimit; - - [DataField] - public List> Jobs = new(); } [DataDefinition] diff --git a/Content.Shared/ADT/MiningShop/MiningShopVendorUI.cs b/Content.Shared/ADT/MiningShop/MiningShopVendorUI.cs index 28fd444237e..f839be241d8 100644 --- a/Content.Shared/ADT/MiningShop/MiningShopVendorUI.cs +++ b/Content.Shared/ADT/MiningShop/MiningShopVendorUI.cs @@ -9,10 +9,9 @@ public enum MiningShopUI : byte } [Serializable, NetSerializable] -public sealed class MiningShopBuiMsg(int section, int entry) : BoundUserInterfaceMessage +public sealed class MiningShopBuiMsg(MiningShopEntry entry) : BoundUserInterfaceMessage { - public readonly int Section = section; - public readonly int Entry = entry; + public readonly MiningShopEntry Entry = entry; } [Serializable, NetSerializable] diff --git a/Content.Shared/ADT/MiningShop/SharedMiningShopSystem.cs b/Content.Shared/ADT/MiningShop/SharedMiningShopSystem.cs index eab7bbc3af6..aed579c0e77 100644 --- a/Content.Shared/ADT/MiningShop/SharedMiningShopSystem.cs +++ b/Content.Shared/ADT/MiningShop/SharedMiningShopSystem.cs @@ -23,27 +23,11 @@ public override void Initialize() protected virtual void OnVendBui(Entity vendor, ref MiningShopBuiMsg args) { var comp = vendor.Comp; - var sections = comp.Sections.Count; var actor = args.Actor; - if (args.Section < 0 || args.Section >= sections) - { - Log.Error($"{ToPrettyString(actor)} sent an invalid vend section: {args.Section}. Max: {sections}"); - return; - } - - var section = comp.Sections[args.Section]; - var entries = section.Entries.Count; - if (args.Entry < 0 || args.Entry >= entries) - { - Log.Error($"{ToPrettyString(actor)} sent an invalid vend entry: {args.Entry}. Max: {entries}"); - return; - } - - var entry = section.Entries[args.Entry]; - if (entry.Price != null) + if (args.Entry.Price != null) { - if (_miningPoints.TryFindIdCard(actor) is {} idCard && _miningPoints.RemovePoints(idCard, entry.Price.Value)) + if (_miningPoints.TryFindIdCard(actor) is {} idCard && _miningPoints.RemovePoints(idCard, args.Entry.Price.Value)) { Dirty(vendor); } @@ -52,7 +36,7 @@ protected virtual void OnVendBui(Entity vendor, ref MiningS if (_net.IsClient) return; - vendor.Comp.OrderList.Add(entry); + vendor.Comp.OrderList.Add(args.Entry); } diff --git a/Resources/Changelog/1ChangelogADT.yml b/Resources/Changelog/1ChangelogADT.yml index 718592c6e8e..5e9703bdd8f 100644 --- a/Resources/Changelog/1ChangelogADT.yml +++ b/Resources/Changelog/1ChangelogADT.yml @@ -5046,3 +5046,37 @@ Entries: type: Add} time: '2024-12-31T08:14:40Z' id: 628 + - author: Шрёдька + changes: + - {message: 'Теперь используется цвет, установленный для администратора через + команду setadminooc, для его ника в админ-ахелпе.', type: Add} + time: '2025-01-01T14:48:57Z' + id: 629 + - author: Котя + changes: + - {message: Добавлены шипы некрополя на лаваленд., type: Add} + - {message: 'Добавлен древний голиаф на лаваленд. Атакует щупальцами наугад, + имеет повышенный урон и 400 единиц здоровья.', type: Add} + - {message: 'Добавлено проклятое сердце, вавилонская книга и кристалл вампиризма. + Найдите их в сундуках некрополя и проверьте, что они делают.', type: Add} + - {message: Добавлен джаунтер в ШахтёрМаг. Он позволяет не умереть от падения + в бездну. Одноразовый., type: Add} + time: '2025-01-02T03:21:53Z' + id: 630 + - author: Ratyyy + changes: + - {message: 'Синдикат начал производить и поставлять агентам миниатюрные энергетические + арбалеты, в то время как экипаж подхватил похожую технологию и научился + делать простые энергетические арбалеты.', type: Add} + time: '2025-01-02T16:19:42Z' + id: 631 + - author: Котя + changes: + - {message: 'Произошёл небольшой ребаланс крашеров. Сильно ослабли когти, самую + малость ослабло мачете, а классический крашер стал быстрее стрелять.', type: Tweak} + - {message: 'ПКА теперь бьёт широким ударом, что делает штык полезным против + черепушек легиона.', type: Tweak} + - {message: NT подписали соглашение о ненападении с каргонией! Утилизаторы больше + не могут стать раундстартовыми антагонистами., type: Tweak} + time: '2025-01-02T18:23:05Z' + id: 632 diff --git a/Resources/Maps/ADTMaps/Nonstation/lavaland_outpost.yml b/Resources/Maps/ADTMaps/Nonstation/lavaland_outpost.yml index 88aa22a4193..67618d5aa20 100644 --- a/Resources/Maps/ADTMaps/Nonstation/lavaland_outpost.yml +++ b/Resources/Maps/ADTMaps/Nonstation/lavaland_outpost.yml @@ -1462,88 +1462,6 @@ entities: pos: 22.5,5.5 parent: 1 - type: MiningShop - sections: - - jobs: [] - sharedSpecLimit: null - entries: - - price: 750 - name: null - id: WeaponCrusher - - price: 1050 - name: null - id: WeaponKineticSpear - - price: 1050 - name: null - id: WeaponKineticHammer - - price: 1050 - name: null - id: WeaponKineticClaws - - price: 1050 - name: null - id: WeaponKineticMachete - name: Крашеры - - jobs: [] - sharedSpecLimit: null - entries: - - price: 550 - name: null - id: WeaponProtoKineticAccelerator - name: ПКА - - jobs: [] - sharedSpecLimit: null - entries: - - price: 600 - name: null - id: FultonBeacon - - price: 1150 - name: null - id: Fulton - name: фултоны - - jobs: [] - sharedSpecLimit: null - entries: - - price: 700 - name: null - id: MedkitBruteFilled - - price: 600 - name: null - id: MedkitBurnFilled - name: медицина - - jobs: [] - sharedSpecLimit: null - entries: - - price: 500 - name: null - id: ClothingBeltSalvageWebbing - - price: 3000 - name: null - id: ClothingOuterHardsuitSalvage - - price: 1000 - name: null - id: ADTClothingOuterArmorMiner - - price: 3600 - name: null - id: ADTClothingOuterArmorMinerHeavy - - price: 4000 - name: null - id: ClothingOuterArmorMinerLight - name: снаряжение - - jobs: [] - sharedSpecLimit: null - entries: - - price: 500 - name: null - id: PKAUpgradeDamage - - price: 500 - name: null - id: PKAUpgradeRange - - price: 500 - name: null - id: PKAUpgradeFireRate - - price: 500 - name: null - id: PKAUpgradeLight - name: улучшения - uid: 1835 components: - type: Transform diff --git a/Resources/Prototypes/ADT/Entities/Objects/Weapons/Melee/crushers.yml b/Resources/Prototypes/ADT/Entities/Objects/Weapons/Melee/crushers.yml index 7813b518be3..e9fdecb60ed 100644 --- a/Resources/Prototypes/ADT/Entities/Objects/Weapons/Melee/crushers.yml +++ b/Resources/Prototypes/ADT/Entities/Objects/Weapons/Melee/crushers.yml @@ -139,7 +139,7 @@ wideAnimationRotation: -135 damage: types: - Slash: 20 + Slash: 15 soundHit: collection: MetalThud angle: 0 @@ -154,7 +154,7 @@ - type: BackstabDamageMultipilier bonusDamage: types: - Slash: 40 + Slash: 20 - type: GunRequiresWield - type: Wieldable - type: Item @@ -176,7 +176,7 @@ attackRate: 1.5 damage: types: - Slash: 25 + Slash: 20 soundHit: collection: MetalThud angle: 0 @@ -188,4 +188,4 @@ - type: BackstabDamageMultipilier bonusDamage: types: - Slash: 15 + Slash: 10 diff --git a/Resources/Prototypes/ADT/Entities/Structures/Machines/miningshop.yml b/Resources/Prototypes/ADT/Entities/Structures/Machines/miningshop.yml index daac5aedb68..6a858c2ffb1 100644 --- a/Resources/Prototypes/ADT/Entities/Structures/Machines/miningshop.yml +++ b/Resources/Prototypes/ADT/Entities/Structures/Machines/miningshop.yml @@ -5,63 +5,6 @@ description: A dwarf's best friend! components: - type: MiningShop - sections: - - name: Крашеры - entries: - - id: WeaponCrusher - price: 750 - - id: WeaponKineticSpear - price: 1050 - - id: WeaponKineticHammer - price: 1050 - - id: WeaponKineticClaws - price: 1050 - - id: WeaponKineticMachete - price: 1050 - - name: ПКА - entries: - - id: WeaponProtoKineticAccelerator - price: 550 - - name: Фултоны - entries: - - id: FultonBeacon - price: 600 - - id: Fulton - price: 1150 - - name: Медицина - entries: - - id: MedkitBruteFilled - price: 700 - - id: MedkitBurnFilled - price: 600 - - name: Снаряжение - entries: - - id: ClothingBeltSalvageWebbing - price: 500 - - id: ClothingOuterHardsuitSalvage - price: 3000 - - id: ADTClothingOuterArmorMiner - price: 1000 - - id: ADTClothingOuterArmorMinerHeavy - price: 3600 - - id: ClothingOuterArmorMinerLight - price: 4000 - - id: ADTWeaponCutter - price: 500 - - id: ADTClothingJumpBoots - price: 2500 - - id: ADTJaunter - price: 900 - - name: Улучшения - entries: - - id: PKAUpgradeDamage - price: 500 - - id: PKAUpgradeRange - price: 500 - - id: PKAUpgradeFireRate - price: 500 - - id: PKAUpgradeLight - price: 500 - type: Sprite sprite: Structures/Machines/VendingMachines/mining.rsi layers: diff --git a/Resources/Prototypes/ADT/mining_shop.yml b/Resources/Prototypes/ADT/mining_shop.yml new file mode 100644 index 00000000000..0b3b3b6d7ea --- /dev/null +++ b/Resources/Prototypes/ADT/mining_shop.yml @@ -0,0 +1,74 @@ +- type: miningShopSection + id: Crushers + name: Крашеры + entries: + - id: WeaponCrusher + price: 750 + - id: WeaponKineticSpear + price: 1050 + - id: WeaponKineticHammer + price: 1050 + - id: WeaponKineticClaws + price: 1050 + - id: WeaponKineticMachete + price: 1050 + +- type: miningShopSection + id: KA + name: ПКА + entries: + - id: WeaponProtoKineticAccelerator + price: 550 + +- type: miningShopSection + id: Fulton + name: Фултоны + entries: + - id: FultonBeacon + price: 600 + - id: Fulton + price: 1150 + +- type: miningShopSection + id: Medicine + name: Медицина + entries: + - id: MedkitBruteFilled + price: 700 + - id: MedkitBurnFilled + price: 600 + +- type: miningShopSection + id: Equipment + name: Снаряжение + entries: + - id: ClothingBeltSalvageWebbing + price: 500 + - id: ClothingOuterHardsuitSalvage + price: 3000 + - id: ADTClothingOuterArmorMiner + price: 1000 + - id: ADTClothingOuterArmorMinerHeavy + price: 3600 + - id: ClothingOuterArmorMinerLight + price: 4000 + - id: ADTWeaponCutter + price: 500 + - id: ADTClothingJumpBoots + price: 2500 + - id: ADTJaunter + price: 900 + +- type: miningShopSection + id: Upgrades + name: Улучшения + entries: + - id: PKAUpgradeDamage + price: 500 + - id: PKAUpgradeRange + price: 500 + - id: PKAUpgradeFireRate + price: 500 + - id: PKAUpgradeLight + price: 500 + diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Basic/base_pka.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Basic/base_pka.yml index c69324e9d17..aea7e2affbf 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Basic/base_pka.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Basic/base_pka.yml @@ -74,6 +74,7 @@ soundHit: collection: GenericHit - type: AltFireMelee #ADT_Tweak + attackType: Heavy - type: Tag #ADT tweak tags: - PKA diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/mining.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/mining.yml index b2a2018b6a8..672835b23e5 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/mining.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/mining.yml @@ -123,7 +123,7 @@ fireRate: 1 useKey: false - type: RechargeBasicEntityAmmo - rechargeCooldown: 2 # ADT tweak 0.5 -> 2 + rechargeCooldown: 1 # ADT tweak 0.5 -> 1 rechargeSound: path: /Audio/Weapons/Guns/MagIn/kinetic_reload.ogg - type: BasicEntityAmmoProvider diff --git a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml index 2ee0e2fbd3b..1e24745999a 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml @@ -340,7 +340,7 @@ - WeaponGauntletGorilla - SynthesizerInstrument - ClothingShoesBootsMagSci - - ClothingShoesBootsMoon + # - ClothingShoesBootsMoon # ADT tweak - убираем луноходы - ClothingShoesBootsSpeed - NodeScanner - HolofanProjector diff --git a/Resources/Prototypes/Recipes/Lathes/misc.yml b/Resources/Prototypes/Recipes/Lathes/misc.yml index 7dc77997839..bd2d4f608e7 100644 --- a/Resources/Prototypes/Recipes/Lathes/misc.yml +++ b/Resources/Prototypes/Recipes/Lathes/misc.yml @@ -135,12 +135,13 @@ Steel: 1000 Plastic: 500 -- type: latheRecipe - id: ClothingShoesBootsMoon - result: ClothingShoesBootsMoon - completetime: 2 - materials: - Steel: 600 +# ADT tweak - убираем луноходы +# - type: latheRecipe +# id: ClothingShoesBootsMoon +# result: ClothingShoesBootsMoon +# completetime: 2 +# materials: +# Steel: 600 - type: latheRecipe id: ClothingShoesBootsSpeed diff --git a/Resources/Prototypes/Research/experimental.yml b/Resources/Prototypes/Research/experimental.yml index 34443e78f00..842e4b8b8f0 100644 --- a/Resources/Prototypes/Research/experimental.yml +++ b/Resources/Prototypes/Research/experimental.yml @@ -68,7 +68,7 @@ cost: 7500 recipeUnlocks: - ClothingShoesBootsMagSci - - ClothingShoesBootsMoon + #- ClothingShoesBootsMoon # ADT tweak - убираем луноходы - type: technology id: AnomalyCoreHarnessing diff --git a/Resources/Prototypes/Roles/Jobs/Cargo/salvage_specialist.yml b/Resources/Prototypes/Roles/Jobs/Cargo/salvage_specialist.yml index c4574f26d40..17869184dbc 100644 --- a/Resources/Prototypes/Roles/Jobs/Cargo/salvage_specialist.yml +++ b/Resources/Prototypes/Roles/Jobs/Cargo/salvage_specialist.yml @@ -3,6 +3,7 @@ name: job-name-salvagespec description: job-description-salvagespec playTimeTracker: JobSalvageSpecialist + canBeAntag: false # ADT tweak requirements: - !type:DepartmentTimeRequirement department: Cargo