diff --git a/Application/Application.csproj b/Application/Application.csproj index 4c478d2b..858f10a5 100644 --- a/Application/Application.csproj +++ b/Application/Application.csproj @@ -53,6 +53,7 @@ + true diff --git a/Application/Commands/ClearAllReportsCommand.cs b/Application/Commands/ClearAllReportsCommand.cs new file mode 100644 index 00000000..b78b55e1 --- /dev/null +++ b/Application/Commands/ClearAllReportsCommand.cs @@ -0,0 +1,31 @@ +using System.Threading.Tasks; +using Data.Models.Client; +using SharedLibraryCore; +using SharedLibraryCore.Configuration; +using SharedLibraryCore.Interfaces; + +namespace IW4MAdmin.Application.Commands; + +public class ClearAllReportsCommand : Command +{ + public ClearAllReportsCommand(CommandConfiguration config, ITranslationLookup layout) : base(config, layout) + { + Name = "clearallreports"; + Description = _translationLookup["COMMANDS_REPORTS_CLEAR_DESC"]; + Alias = "car"; + Permission = EFClient.Permission.Administrator; + RequiresTarget = false; + } + + public override Task ExecuteAsync(GameEvent gameEvent) + { + foreach (var server in gameEvent.Owner.Manager.GetServers()) + { + server.Reports.Clear(); + } + + gameEvent.Origin.Tell(_translationLookup["COMMANDS_REPORTS_CLEAR_SUCCESS"]); + + return Task.CompletedTask; + } +} diff --git a/Application/Main.cs b/Application/Main.cs index 2edb79a2..bcded032 100644 --- a/Application/Main.cs +++ b/Application/Main.cs @@ -94,6 +94,15 @@ namespace IW4MAdmin.Application Console.WriteLine($" Version {Utilities.GetVersionAsString()}"); Console.WriteLine("====================================================="); + Console.ForegroundColor = ConsoleColor.Red; + Console.WriteLine("!!!! IMPORTANT !!!!"); + Console.WriteLine("The next update of IW4MAdmin will require .NET 8."); + Console.WriteLine("This is a breaking change!"); + Console.WriteLine( + "Please update the ASP.NET Core Runtime: https://dotnet.microsoft.com/en-us/download/dotnet/8.0"); + Console.WriteLine("!!!!!!!!!!!!!!!!!!!"); + Console.ForegroundColor = ConsoleColor.Gray; + await LaunchAsync(); } diff --git a/Data/Data.csproj b/Data/Data.csproj index 49f5e201..75cbf585 100644 --- a/Data/Data.csproj +++ b/Data/Data.csproj @@ -4,11 +4,8 @@ net6.0 Debug;Release;Prerelease AnyCPU - true - RaidMax.IW4MAdmin.Data RaidMax.IW4MAdmin.Data - - 1.2.0 + 1.0.0.0 diff --git a/DeploymentFiles/deployment-pipeline.yml b/DeploymentFiles/deployment-pipeline.yml index e8463b15..d684acae 100644 --- a/DeploymentFiles/deployment-pipeline.yml +++ b/DeploymentFiles/deployment-pipeline.yml @@ -1,4 +1,4 @@ -name: '$(Date:yyyy.MM.dd)$(Rev:.r)' +name: '$(Date:yyyy.M.d)$(Rev:.r)' trigger: batch: true @@ -7,6 +7,10 @@ trigger: - release/pre - master - develop + paths: + exclude: + - '**/*.yml' + - '*.yml' pr: none @@ -66,7 +70,7 @@ jobs: displayName: 'Build projects' inputs: solution: '$(solution)' - msbuildArgs: '/p:DeployOnBuild=false /p:PackageAsSingleFile=false /p:SkipInvalidConfigurations=true /p:PackageLocation="$(build.artifactStagingDirectory)" /p:Version=$(Build.BuildNumber)' + msbuildArgs: '/p:DeployOnBuild=false /p:PackageAsSingleFile=false /p:SkipInvalidConfigurations=true /p:PackageLocation="$(build.artifactStagingDirectory)" /p:Version=$(Build.BuildNumber) /p:PackageVersion=$(Build.BuildNumber)' platform: '$(buildPlatform)' configuration: '$(buildConfiguration)' @@ -181,6 +185,13 @@ jobs: artifact: 'IW4MAdmin.$(buildConfiguration)' publishLocation: 'pipeline' + - task: PublishPipelineArtifact@1 + displayName: 'Publish nuget package artifact' + inputs: + targetPath: '$(Build.Repository.LocalPath)/SharedLibraryCore/bin/$(buildConfiguration)/RaidMax.IW4MAdmin.SharedLibraryCore.$(Build.BuildNumber).nupkg' + artifact: 'SharedLibraryCore.$(Build.BuildNumber).nupkg' + publishLocation: 'pipeline' + - task: FtpUpload@2 condition: ne(variables['Build.SourceBranch'], 'refs/heads/develop') displayName: 'Upload zip file to website' diff --git a/DeploymentFiles/nuget-pipeline.yml b/DeploymentFiles/nuget-pipeline.yml new file mode 100644 index 00000000..ff7ae71e --- /dev/null +++ b/DeploymentFiles/nuget-pipeline.yml @@ -0,0 +1,55 @@ +name: '$(Date:yyyy.M.d)$(Rev:.r)' + +pr: none + +pool: + vmImage: 'windows-2022' + +variables: + buildPlatform: 'Any CPU' + outputFolder: '$(Build.ArtifactStagingDirectory)\Publish\$(buildConfiguration)' + releaseType: verified + buildConfiguration: Stable + isPreRelease: false + +jobs: + - job: Build_Pack + steps: + - task: PowerShell@2 + displayName: 'Setup Build configuration' + condition: or(eq(variables['Build.SourceBranch'], 'refs/heads/release/pre'), eq(variables['Build.SourceBranch'], 'refs/heads/develop'), eq(variables['Build.SourceBranch'], 'refs/heads/chore/nuget-pipeline')) + inputs: + targetType: 'inline' + script: | + echo '##vso[task.setvariable variable=releaseType]prerelease' + echo '##vso[task.setvariable variable=buildConfiguration]Prerelease' + echo '##vso[task.setvariable variable=isPreRelease]true' + failOnStderr: true + + - task: DotNetCoreCLI@2 + displayName: 'Build Data' + inputs: + command: 'build' + projects: '**/Data.csproj' + arguments: '-c $(buildConfiguration)' + + - task: DotNetCoreCLI@2 + displayName: 'Build SLC' + inputs: + command: 'build' + projects: '**/SharedLibraryCore.csproj' + arguments: '-c $(buildConfiguration) /p:Version=$(Build.BuildNumber)' + + - task: DotNetCoreCLI@2 + displayName: 'Pack SLC' + inputs: + command: 'pack' + packagesToPack: '**/SharedLibraryCore.csproj' + versioningScheme: 'byBuildNumber' + + - task: PublishPipelineArtifact@1 + displayName: 'Publish nuget package artifact' + inputs: + targetPath: 'D:\a\1\a\RaidMax.IW4MAdmin.SharedLibraryCore.$(Build.BuildNumber).nupkg' + artifact: 'SharedLibraryCore.$(Build.BuildNumber).nupkg' + publishLocation: 'pipeline' diff --git a/GameFiles/AntiCheat/IW5/storage/iw5/scripts/_customcallbacks.gsc b/GameFiles/AntiCheat/IW5/storage/iw5/scripts/_customcallbacks.gsc index e327d1a0..e8a7f0bd 100644 --- a/GameFiles/AntiCheat/IW5/storage/iw5/scripts/_customcallbacks.gsc +++ b/GameFiles/AntiCheat/IW5/storage/iw5/scripts/_customcallbacks.gsc @@ -137,6 +137,8 @@ waitForFrameThread() waitForAdditionalAngles( logString, beforeFrameCount, afterFrameCount ) { + self endon( "disconnect" ); + currentIndex = self.currentAnglePosition; wait( 0.05 * afterFrameCount ); @@ -246,4 +248,4 @@ Callback_PlayerDisconnect() { level notify( "disconnected", self ); self maps\mp\gametypes\_playerlogic::Callback_PlayerDisconnect(); -} \ No newline at end of file +} diff --git a/GameFiles/AntiCheat/PT6/storage/t6/scripts/mp/_customcallbacks.gsc b/GameFiles/AntiCheat/PT6/storage/t6/scripts/mp/_customcallbacks.gsc index 133a6a59..5e62645d 100644 --- a/GameFiles/AntiCheat/PT6/storage/t6/scripts/mp/_customcallbacks.gsc +++ b/GameFiles/AntiCheat/PT6/storage/t6/scripts/mp/_customcallbacks.gsc @@ -143,6 +143,8 @@ waitForFrameThread() waitForAdditionalAngles( logString, beforeFrameCount, afterFrameCount ) { + self endon( "disconnect" ); + currentIndex = self.currentAnglePosition; wait( 0.05 * afterFrameCount ); @@ -260,4 +262,4 @@ Callback_PlayerDisconnect() { level notify( "disconnected", self ); self [[maps\mp\gametypes\_globallogic_player::callback_playerdisconnect]](); -} \ No newline at end of file +} diff --git a/GameFiles/GameInterface/_integration_iw5.gsc b/GameFiles/GameInterface/_integration_iw5.gsc index fd4d652a..6dfc6a7c 100644 --- a/GameFiles/GameInterface/_integration_iw5.gsc +++ b/GameFiles/GameInterface/_integration_iw5.gsc @@ -193,7 +193,7 @@ NoClipImpl() self God(); self Noclip(); - self Hide(); + self Show(); SetDvar( "sv_cheats", 0 ); diff --git a/IW4MAdmin.sln b/IW4MAdmin.sln index 90b29b90..87038b44 100644 --- a/IW4MAdmin.sln +++ b/IW4MAdmin.sln @@ -12,6 +12,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution version.txt = version.txt DeploymentFiles\UpdateIW4MAdmin.ps1 = DeploymentFiles\UpdateIW4MAdmin.ps1 DeploymentFiles\UpdateIW4MAdmin.sh = DeploymentFiles\UpdateIW4MAdmin.sh + DeploymentFiles\nuget-pipeline.yml = DeploymentFiles\nuget-pipeline.yml EndProjectSection EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SharedLibraryCore", "SharedLibraryCore\SharedLibraryCore.csproj", "{AA0541A2-8D51-4AD9-B0AC-3D1F5B162481}" diff --git a/Plugins/AutomessageFeed/AutomessageFeed.csproj b/Plugins/AutomessageFeed/AutomessageFeed.csproj index 5886eaeb..1a79d2e5 100644 --- a/Plugins/AutomessageFeed/AutomessageFeed.csproj +++ b/Plugins/AutomessageFeed/AutomessageFeed.csproj @@ -10,7 +10,7 @@ - + diff --git a/Plugins/LiveRadar/LiveRadar.csproj b/Plugins/LiveRadar/LiveRadar.csproj index 9964cdcc..a5a50206 100644 --- a/Plugins/LiveRadar/LiveRadar.csproj +++ b/Plugins/LiveRadar/LiveRadar.csproj @@ -16,7 +16,7 @@ - + diff --git a/Plugins/Login/Login.csproj b/Plugins/Login/Login.csproj index b462bc8f..b3a92171 100644 --- a/Plugins/Login/Login.csproj +++ b/Plugins/Login/Login.csproj @@ -19,7 +19,7 @@ - + diff --git a/Plugins/Mute/Mute.csproj b/Plugins/Mute/Mute.csproj index aee6479e..19e6bb03 100644 --- a/Plugins/Mute/Mute.csproj +++ b/Plugins/Mute/Mute.csproj @@ -8,10 +8,11 @@ Library Debug;Release;Prerelease AnyCPU + IW4MAdmin.Plugins.Mute - + diff --git a/Plugins/Mute/MuteManager.cs b/Plugins/Mute/MuteManager.cs index 5f91d816..537465b1 100644 --- a/Plugins/Mute/MuteManager.cs +++ b/Plugins/Mute/MuteManager.cs @@ -131,8 +131,11 @@ public class MuteManager { var newPenalty = new EFPenalty { - Type = muteState is MuteState.Unmuted ? EFPenalty.PenaltyType.Unmute : - dateTime is null ? EFPenalty.PenaltyType.Mute : EFPenalty.PenaltyType.TempMute, + Type = muteState is MuteState.Unmuted + ? EFPenalty.PenaltyType.Unmute + : dateTime is null + ? EFPenalty.PenaltyType.Mute + : EFPenalty.PenaltyType.TempMute, Expires = muteState is MuteState.Unmuted ? DateTime.UtcNow : dateTime, Offender = target, Offense = reason, @@ -148,10 +151,9 @@ public class MuteManager { await using var context = _databaseContextFactory.CreateContext(); var mutePenalties = await context.Penalties - .Where(penalty => penalty.OffenderId == client.ClientId && - (penalty.Type == EFPenalty.PenaltyType.Mute || - penalty.Type == EFPenalty.PenaltyType.TempMute) && - (penalty.Expires == null || penalty.Expires > DateTime.UtcNow)) + .Where(penalty => penalty.OffenderId == client.ClientId) + .Where(penalty => penalty.Type == EFPenalty.PenaltyType.Mute || penalty.Type == EFPenalty.PenaltyType.TempMute) + .Where(penalty => penalty.Expires == null || penalty.Expires > DateTime.UtcNow) .ToListAsync(); foreach (var mutePenalty in mutePenalties) @@ -169,19 +171,20 @@ public class MuteManager switch (muteStateMeta.MuteState) { case MuteState.Muted: - await server.ExecuteCommandAsync($"muteClient {client.ClientNumber}"); + var muteCommand = string.Format(server.RconParser.Configuration.CommandPrefixes.Mute, client.ClientNumber); + await server.ExecuteCommandAsync(muteCommand); muteStateMeta.CommandExecuted = true; break; case MuteState.Unmuted: - await server.ExecuteCommandAsync($"unmute {client.ClientNumber}"); + var unMuteCommand = string.Format(server.RconParser.Configuration.CommandPrefixes.Unmute, client.ClientNumber); + await server.ExecuteCommandAsync(unMuteCommand); muteStateMeta.CommandExecuted = true; break; } } private async Task ReadPersistentDataV1(EFClient client) => TryParse( - (await _metaService.GetPersistentMeta(Plugin.MuteKey, client.ClientId))?.Value, - out var muteState) + (await _metaService.GetPersistentMeta(Plugin.MuteKey, client.ClientId))?.Value, out var muteState) ? muteState : null; diff --git a/Plugins/Mute/Plugin.cs b/Plugins/Mute/Plugin.cs index 242857da..fc75ea27 100644 --- a/Plugins/Mute/Plugin.cs +++ b/Plugins/Mute/Plugin.cs @@ -21,7 +21,7 @@ public class Plugin : IPluginV2 public const string MuteKey = "IW4MMute"; public static IManager Manager { get; private set; } = null!; - public static readonly Server.Game[] SupportedGames = {Server.Game.IW4}; + public static Server.Game[] SupportedGames { get; private set; } = Array.Empty(); private static readonly string[] DisabledCommands = {nameof(PrivateMessageAdminsCommand), "PrivateMessageCommand"}; private readonly IInteractionRegistration _interactionRegistration; private readonly IRemoteCommandService _remoteCommandService; @@ -34,12 +34,14 @@ public class Plugin : IPluginV2 _interactionRegistration = interactionRegistration; _remoteCommandService = remoteCommandService; _muteManager = muteManager; - + IManagementEventSubscriptions.Load += OnLoad; IManagementEventSubscriptions.Unload += OnUnload; - IManagementEventSubscriptions.ClientStateInitialized += OnClientStateInitialized; + IGameServerEventSubscriptions.ClientDataUpdated += OnClientDataUpdated; + IGameServerEventSubscriptions.MonitoringStarted += OnServerMonitoredStarted; + IGameEventSubscriptions.ClientMessaged += OnClientMessaged; } @@ -61,7 +63,7 @@ public class Plugin : IPluginV2 var muteMeta = Task.Run(() => _muteManager.GetCurrentMuteState(gameEvent.Origin), cancellationToken) .GetAwaiter().GetResult(); - + if (muteMeta.MuteState is not MuteState.Muted) { return true; @@ -91,7 +93,7 @@ public class Plugin : IPluginV2 }); return Task.CompletedTask; } - + private Task OnUnload(IManager manager, CancellationToken token) { _interactionRegistration.UnregisterInteraction(MuteInteraction); @@ -152,21 +154,21 @@ public class Plugin : IPluginV2 { return; } - + var muteMetaJoin = await _muteManager.GetCurrentMuteState(state.Client); switch (muteMetaJoin) { - case { MuteState: MuteState.Muted }: + case {MuteState: MuteState.Muted}: // Let the client know when their mute expires. state.Client.Tell(Utilities.CurrentLocalization .LocalizationIndex["PLUGINS_MUTE_REMAINING_TIME"].FormatExt( - muteMetaJoin is { Expiration: not null } + muteMetaJoin is {Expiration: not null} ? muteMetaJoin.Expiration.Value.HumanizeForCurrentCulture() : Utilities.CurrentLocalization.LocalizationIndex["PLUGINS_MUTE_NEVER"], muteMetaJoin.Reason)); break; - case { MuteState: MuteState.Unmuting }: + case {MuteState: MuteState.Unmuting}: // Handle unmute of unmuted players. await _muteManager.Unmute(state.Client.CurrentServer, Utilities.IW4MAdminClient(), state.Client, muteMetaJoin.Reason ?? string.Empty); @@ -319,4 +321,29 @@ public class Plugin : IPluginV2 } }; } + + private Task OnServerMonitoredStarted(MonitorStartEvent serverEvent, CancellationToken token) + { + var game = (Server.Game)serverEvent.Server.GameCode; + + lock (SupportedGames) + { + if (SupportedGames.Contains(game)) + { + return Task.CompletedTask; + } + + var server = Manager.GetServers().FirstOrDefault(x => x == serverEvent.Server); + var commandIsEmpty = string.IsNullOrWhiteSpace(server?.RconParser.Configuration.CommandPrefixes.Mute); + + if (commandIsEmpty) + { + return Task.CompletedTask; + } + + SupportedGames = SupportedGames.Append(game).ToArray(); + } + + return Task.CompletedTask; + } } diff --git a/Plugins/ProfanityDeterment/ProfanityDeterment.csproj b/Plugins/ProfanityDeterment/ProfanityDeterment.csproj index 9d987a06..009d1d49 100644 --- a/Plugins/ProfanityDeterment/ProfanityDeterment.csproj +++ b/Plugins/ProfanityDeterment/ProfanityDeterment.csproj @@ -1,7 +1,7 @@  - Library + Library net6.0 @@ -16,7 +16,7 @@ - + diff --git a/Plugins/ScriptPlugins/ParserIW4x.js b/Plugins/ScriptPlugins/ParserIW4x.js index b35ef0d0..0d9cf3a2 100644 --- a/Plugins/ScriptPlugins/ParserIW4x.js +++ b/Plugins/ScriptPlugins/ParserIW4x.js @@ -19,6 +19,8 @@ var plugin = { rconParser.Configuration.CommandPrefixes.Kick = 'clientkick {0} "{1}"'; rconParser.Configuration.CommandPrefixes.Ban = 'clientkick {0} "{1}"'; rconParser.Configuration.CommandPrefixes.TempBan = 'tempbanclient {0} "{1}"'; + rconParser.Configuration.CommandPrefixes.Mute = 'muteClient {0}'; + rconParser.Configuration.CommandPrefixes.Unmute = 'unmute {0}'; rconParser.Configuration.DefaultRConPort = 28960; rconParser.Configuration.DefaultInstallationDirectoryHint = 'HKEY_CURRENT_USER\\Software\\Classes\\iw4x\\shell\\open\\command'; diff --git a/Plugins/ScriptPlugins/ParserIW6x.js b/Plugins/ScriptPlugins/ParserIW6x.js index 7c399aa8..4185bb35 100644 --- a/Plugins/ScriptPlugins/ParserIW6x.js +++ b/Plugins/ScriptPlugins/ParserIW6x.js @@ -20,6 +20,8 @@ var plugin = { rconParser.Configuration.CommandPrefixes.Ban = 'clientkick {0} "{1}"'; rconParser.Configuration.CommandPrefixes.TempBan = 'clientkick {0} "{1}"'; rconParser.Configuration.CommandPrefixes.RConResponse = '\xff\xff\xff\xffprint\n'; + rconParser.Configuration.CommandPrefixes.Mute = 'muteClient {0}'; + rconParser.Configuration.CommandPrefixes.Unmute = 'unmuteClient {0}'; rconParser.Configuration.Dvar.Pattern = '^ *\\"(.+)\\" is: \\"(.+)?\\" default: \\"(.+)?\\"\\n?(?:latched: \\"(.+)?\\"\\n?)?(.*)$'; rconParser.Configuration.Status.Pattern = '^ *([0-9]+) +-?([0-9]+) +(Yes|No) +((?:[A-Z]+|[0-9]+)) +((?:[a-z]|[0-9]){8,32}|(?:[a-z]|[0-9]){8,32}|bot[0-9]+|(?:[0-9]+)) *(.{0,32}) +(\\d+\\.\\d+\\.\\d+.\\d+\\:-*\\d{1,5}|0+.0+:-*\\d{1,5}|loopback|unknown|bot) +(-*[0-9]+) *$'; rconParser.Configuration.StatusHeader.Pattern = 'num +score +bot +ping +guid +name +address +qport *'; diff --git a/Plugins/ScriptPlugins/ParserPlutoniumT5.js b/Plugins/ScriptPlugins/ParserPlutoniumT5.js index 6c12985a..b681ce70 100644 --- a/Plugins/ScriptPlugins/ParserPlutoniumT5.js +++ b/Plugins/ScriptPlugins/ParserPlutoniumT5.js @@ -13,6 +13,7 @@ var plugin = { onLoadAsync: function (manager) { rconParser = manager.GenerateDynamicRConParser(this.name); eventParser = manager.GenerateDynamicEventParser(this.name); + eventParser.Configuration.GameDirectory = ''; rconParser.Configuration.DefaultInstallationDirectoryHint = '{LocalAppData}/Plutonium/storage/t5'; rconParser.Configuration.CommandPrefixes.RConResponse = '\xff\xff\xff\xffprint\n'; @@ -21,6 +22,7 @@ var plugin = { rconParser.Configuration.CommandPrefixes.RConGetInfo = undefined; rconParser.Configuration.GuidNumberStyle = 7; // Integer rconParser.Configuration.DefaultRConPort = 3074; + rconParser.Configuration.OverrideDvarNameMapping.Add('fs_homepath', 'fs_basegame'); rconParser.Configuration.CanGenerateLogPath = false; rconParser.Configuration.OverrideCommandTimeouts.Clear(); diff --git a/Plugins/Stats/Helpers/StatManager.cs b/Plugins/Stats/Helpers/StatManager.cs index eec64dd7..0ed89842 100644 --- a/Plugins/Stats/Helpers/StatManager.cs +++ b/Plugins/Stats/Helpers/StatManager.cs @@ -1,5 +1,4 @@ using IW4MAdmin.Plugins.Stats.Cheat; -using IW4MAdmin.Plugins.Stats.Config; using IW4MAdmin.Plugins.Stats.Web.Dtos; using Microsoft.EntityFrameworkCore; using SharedLibraryCore; @@ -8,6 +7,7 @@ using SharedLibraryCore.Interfaces; using System; using System.Collections.Concurrent; using System.Collections.Generic; +using System.Data.Common; using System.Linq; using System.Linq.Expressions; using System.Threading; @@ -21,8 +21,6 @@ using Data.Models.Server; using Humanizer.Localisation; using Microsoft.Data.Sqlite; using Microsoft.Extensions.Logging; -using MySqlConnector; -using Npgsql; using Stats.Client.Abstractions; using Stats.Config; using Stats.Helpers; @@ -488,9 +486,7 @@ namespace IW4MAdmin.Plugins.Stats.Helpers } catch (DbUpdateException updateException) when ( - updateException.InnerException is PostgresException { SqlState: "23503" } - || updateException.InnerException is SqliteException { SqliteErrorCode: 787 } - || updateException.InnerException is MySqlException { SqlState: "23503" }) + updateException.InnerException is DbException { SqlState: "23503" } or SqliteException { SqliteErrorCode: 787 }) { _log.LogWarning("Trying to add {Client} to stats before they have been added to the database", pl.ToString()); diff --git a/Plugins/Stats/Stats.csproj b/Plugins/Stats/Stats.csproj index 1a8321ac..7aff2f0c 100644 --- a/Plugins/Stats/Stats.csproj +++ b/Plugins/Stats/Stats.csproj @@ -17,7 +17,7 @@ - + diff --git a/Plugins/Welcome/Welcome.csproj b/Plugins/Welcome/Welcome.csproj index f2f4c15b..de9255ef 100644 --- a/Plugins/Welcome/Welcome.csproj +++ b/Plugins/Welcome/Welcome.csproj @@ -20,7 +20,7 @@ - + diff --git a/SharedLibraryCore/RCon/CommandPrefix.cs b/SharedLibraryCore/RCon/CommandPrefix.cs index 59947192..d286f54d 100644 --- a/SharedLibraryCore/RCon/CommandPrefix.cs +++ b/SharedLibraryCore/RCon/CommandPrefix.cs @@ -16,5 +16,7 @@ public string RConGetInfo { get; set; } public string RConResponse { get; set; } public string RconGetInfoResponseHeader { get; set; } + public string Mute { get; set; } + public string Unmute { get; set; } } -} \ No newline at end of file +} diff --git a/SharedLibraryCore/SharedLibraryCore.csproj b/SharedLibraryCore/SharedLibraryCore.csproj index 7c6d139e..081458e6 100644 --- a/SharedLibraryCore/SharedLibraryCore.csproj +++ b/SharedLibraryCore/SharedLibraryCore.csproj @@ -54,8 +54,11 @@ - - + + + true + Data.dll + @@ -65,7 +68,7 @@ $(TargetsForTfmSpecificBuildOutput);CopyProjectReferencesToPackage - + diff --git a/WebfrontCore/WebfrontCore.csproj b/WebfrontCore/WebfrontCore.csproj index 51070322..8ce9eb47 100644 --- a/WebfrontCore/WebfrontCore.csproj +++ b/WebfrontCore/WebfrontCore.csproj @@ -63,6 +63,7 @@ +