diff --git a/Application/RConParsers/DynamicRConParserConfiguration.cs b/Application/RConParsers/DynamicRConParserConfiguration.cs
index 96355612c..7de5974e2 100644
--- a/Application/RConParsers/DynamicRConParserConfiguration.cs
+++ b/Application/RConParsers/DynamicRConParserConfiguration.cs
@@ -31,6 +31,7 @@ namespace IW4MAdmin.Application.RConParsers
public string NoticeLineSeparator { get; set; } = Environment.NewLine;
public int? DefaultRConPort { get; set; }
public string DefaultInstallationDirectoryHint { get; set; }
+ public short FloodProtectInterval { get; set; } = 750;
public ColorCodeMapping ColorCodeMapping { get; set; } = new ColorCodeMapping
{
@@ -59,4 +60,4 @@ namespace IW4MAdmin.Application.RConParsers
MaxPlayersStatus = parserRegexFactory.CreateParserRegex();
}
}
-}
\ No newline at end of file
+}
diff --git a/GameFiles/IW4x/userraw/scripts/_commands.gsc b/GameFiles/IW4x/userraw/scripts/_commands.gsc
deleted file mode 100644
index 0c80cb336..000000000
--- a/GameFiles/IW4x/userraw/scripts/_commands.gsc
+++ /dev/null
@@ -1,53 +0,0 @@
-#include common_scripts\utility;
-#include maps\mp\_utility;
-#include maps\mp\gametypes\_hud_util;
-#include maps\mp\gametypes\_playerlogic;
-
-init()
-{
- SetDvarIfUninitialized( "sv_iw4madmin_command", "" );
- level thread WaitForCommand();
-}
-
-WaitForCommand()
-{
- level endon( "game_ended" );
-
- for(;;)
- {
- commandInfo = strtok( getDvar("sv_iw4madmin_command"), ";" );
- command = commandInfo[0];
-
- switch( command )
- {
- case "alert":
- //clientId alertType sound message
- SendAlert( commandInfo[1], commandInfo[2], commandInfo[3], commandInfo[4] );
- break;
- case "killplayer":
- // clientId
- KillPlayer( commandInfo[1], commandInfo[2] );
- break;
- }
-
- setDvar( "sv_iw4madmin_command", "" );
- wait( 1 );
- }
-}
-
-SendAlert( clientId, alertType, sound, message )
-{
- client = getPlayerFromClientNum( int( clientId ) );
- client thread playLeaderDialogOnPlayer( sound, client.team );
- client playLocalSound( sound );
- client iPrintLnBold( "^1" + alertType + ": ^3" + message );
-}
-
-KillPlayer( targetId, originId)
-{
- target = getPlayerFromClientNum( int( targetId ) );
- target suicide();
- origin = getPlayerFromClientNum( int( originId ) );
-
- iPrintLnBold("^1" + origin.name + " ^7killed ^5" + target.name);
-}
\ No newline at end of file
diff --git a/GameFiles/IW4x/userraw/scripts/_integration.gsc b/GameFiles/IW4x/userraw/scripts/_integration.gsc
new file mode 100644
index 000000000..64a5ead78
--- /dev/null
+++ b/GameFiles/IW4x/userraw/scripts/_integration.gsc
@@ -0,0 +1,360 @@
+#include common_scripts\utility;
+#include maps\mp\_utility;
+#include maps\mp\gametypes\_hud_util;
+#include maps\mp\gametypes\_playerlogic;
+
+init()
+{
+ // setup default vars
+ level.eventBus = spawnstruct();
+ level.eventBus.inVar = "sv_iw4madmin_in";
+ level.eventBus.outVar = "sv_iw4madmin_out";
+ level.clientDataKey = "clientData";
+
+ level.eventTypes = spawnstruct();
+ level.eventTypes.clientDataReceived = "ClientDataReceived";
+ level.eventTypes.clientDataRequested = "ClientDataRequested";
+ level.eventTypes.executeCommandRequested = "ExecuteCommandRequested";
+
+ SetDvarIfUninitialized( level.eventBus.inVar, "" );
+ SetDvarIfUninitialized( level.eventBus.outVar, "" );
+ SetDvarIfUninitialized( "sv_iw4madmin_integration_enabled", 1 );
+
+ // map the event type to the handler
+ level.eventCallbacks = [];
+ level.eventCallbacks[level.eventTypes.clientDataReceived] = ::OnClientDataReceived;
+ level.eventCallbacks[level.eventTypes.executeCommandRequested] = ::OnExecuteCommand;
+
+ // start long running tasks
+ level thread PlayerWaitEvents();
+ level thread MonitorBus();
+ level thread OnPlayerConnect();
+}
+
+//////////////////////////////////
+// Client Methods
+//////////////////////////////////
+
+OnPlayerConnect()
+{
+ level endon ( "disconnect" );
+
+ for ( ;; )
+ {
+ level waittill( "connected", player );
+ player.pers[level.clientDataKey] = spawnstruct();
+ player thread OnPlayerSpawned();
+ }
+}
+
+OnPlayerSpawned()
+{
+ self endon( "disconnect" );
+
+ for ( ;; )
+ {
+ self waittill( "spawned_player" );
+ self PlayerConnectEvents();
+ }
+}
+
+DisplayWelcomeData()
+{
+ self endon( "disconnect" );
+
+ clientData = self.pers[level.clientDataKey];
+
+ self IPrintLnBold( "Welcome, your level is ^5" + clientData.permissionLevel );
+ wait (2.0);
+ self IPrintLnBold( "You were last seen ^5" + clientData.lastConnection );
+}
+
+PlayerConnectEvents()
+{
+ self endon( "disconnect" );
+
+ clientData = self.pers[level.clientDataKey];
+
+ if ( isDefined( clientData.state ) && clientData.state == "complete" )
+ {
+ return;
+ }
+
+ self RequestClientBasicData();
+ // example of requesting meta from IW4MAdmin
+ // self RequestClientMeta( "LastServerPlayed" );
+}
+
+PlayerWaitEvents()
+{
+ level endon( "game_ended" );
+ self endon( "disconnect" );
+
+ for ( ;; )
+ {
+ level waittill( "client_event", client );
+
+ /#self IPrintLn("Processing Event " + client.event.type + "-" + client.event.subtype );#/
+
+ eventHandler = level.eventCallbacks[client.event.type];
+
+ if ( isDefined( eventHandler ) )
+ {
+ client [[eventHandler]]( client.event );
+ }
+
+ client.eventData = [];
+ }
+}
+
+//////////////////////////////////
+// Helper Methods
+//////////////////////////////////
+
+RequestClientMeta( metaKey )
+{
+ getClientMetaEvent = BuildEventRequest( true, level.eventTypes.clientDataRequested, "Meta", self, metaKey );
+ self thread QueueEvent( getClientMetaEvent, level.eventTypes.clientDataRequested );
+}
+
+RequestClientBasicData()
+{
+ getClientDataEvent = BuildEventRequest( true, level.eventTypes.clientDataRequested, "None", self, "" );
+ self thread QueueEvent( getClientDataEvent, level.eventTypes.clientDataRequested );
+}
+
+BuildEventRequest( responseExpected, eventType, eventSubtype, client, data )
+{
+ if ( !isDefined( data ) )
+ {
+ data = "";
+ }
+
+ if ( !isDefined( eventSubtype ) )
+ {
+ eventSubtype = "None";
+ }
+
+ request = "0";
+
+ if ( responseExpected )
+ {
+ request = "1";
+ }
+
+ request = request + ";" + eventType + ";" + eventSubtype + ";" + client getEntityNumber() + ";" + data;
+ return request;
+}
+
+MonitorBus()
+{
+ level endon( "game_ended" );
+
+ for( ;; )
+ {
+ wait ( 0.25 );
+
+ // check to see if IW4MAdmin is ready to receive more data
+ if ( getDvar( level.eventBus.inVar ) == "" )
+ {
+ level notify( "bus_ready" );
+ }
+
+ eventString = getDvar( level.eventBus.outVar );
+
+ if ( eventString == "" )
+ {
+ continue;
+ }
+
+ /#IPrintLn( "-> " + eventString );#/
+
+ NotifyClientEvent( strtok( eventString, ";" ) );
+
+ SetDvar( level.eventBus.outVar, "" );
+ }
+}
+
+QueueEvent( request, eventType )
+{
+ self endon( "disconnect" );
+
+ start = GetTime();
+ maxWait = 15 * 1000; // 15 seconds
+ timedOut = "";
+
+ while ( GetDvar( level.eventBus.inVar ) != "" && ( GetTime() - start ) < maxWait )
+ {
+ level waittill_notify_or_timeout( "bus_ready", 5 );
+
+ if ( GetDvar( level.eventBus.inVar ) != "" )
+ {
+ /#self IPrintLn("A request is already in progress...");#/
+ timedOut = "set";
+ continue;
+ }
+
+ timedOut = "unset";
+ }
+
+ if ( timedOut == "set")
+ {
+ /# self IPrintLn("Timed out waiting for response...");#/
+ if ( eventType == level.eventTypes.clientDataRequested ) // todo: this is dirty fix
+ {
+ self.pers["clientData"].state = "failed";
+ }
+ return;
+ }
+
+ /#IPrintLn("<- " + request);#/
+ SetDvar( level.eventBus.inVar, request );
+}
+
+ParseDataString( data )
+{
+ dataParts = strtok( data, "|" );
+ dict = [];
+
+ counter = 0;
+ foreach ( part in dataParts )
+ {
+ splitPart = strtok( part, "=" );
+ key = splitPart[0];
+ value = splitPart[1];
+ dict[key] = value;
+ dict[counter] = key;
+ counter++;
+ }
+
+ return dict;
+}
+
+NotifyClientEvent( eventInfo )
+{
+ client = getPlayerFromClientNum( int( eventInfo[3] ) );
+
+ event = spawnstruct();
+ event.type = eventInfo[1];
+ event.subtype = eventInfo[2];
+ event.data = eventInfo[4];
+
+ /#IPrintLn(event.data);#/
+
+ client.event = event;
+
+ level notify( "client_event", client );
+}
+
+//////////////////////////////////
+// Event Handlers
+/////////////////////////////////
+
+OnClientDataReceived( event )
+{
+ event.data = ParseDataString( event.data );
+ clientData = self.pers[level.clientDataKey];
+
+ if ( event.subtype == "Meta" )
+ {
+ if ( !isDefined( clientData["meta"] ) )
+ {
+ clientData.meta = [];
+ }
+
+ metaKey = event.data[0];
+ clientData["meta"][metaKey] = event.data[metaKey];
+
+ return;
+ }
+
+ clientData.permissionLevel = event.data["level"];
+ clientData.lastConnection = event.data["lastConnection"];
+ clientData.state = "complete";
+
+ self thread DisplayWelcomeData();
+}
+
+OnExecuteCommand( event )
+{
+ data = ParseDataString( event.data );
+ switch ( event.subtype )
+ {
+ case "GiveWeapon":
+ self GiveWeaponImpl( data );
+ break;
+ case "TakeWeapons":
+ self TakeWeaponsImpl();
+ break;
+ case "SwitchTeams":
+ self TeamSwitchImpl();
+ break;
+ case "Hide":
+ self HideImpl();
+ break;
+ case "Unhide":
+ self UnhideImpl();
+ break;
+ case "Alert":
+ self AlertImpl( data );
+ break;
+ }
+}
+
+//////////////////////////////////
+// Command Implementations
+/////////////////////////////////
+
+GiveWeaponImpl( data )
+{
+ if ( IsAlive( self ) )
+ {
+ self IPrintLnBold( "You have been given a new weapon" );
+ self GiveWeapon( data["weaponName"] );
+ self SwitchToWeapon( data["weaponName"] );
+ }
+}
+
+TakeWeaponsImpl()
+{
+ if ( IsAlive( self ) )
+ {
+ self TakeAllWeapons();
+ self IPrintLnBold( "All your weapons have been taken" );
+ }
+}
+
+TeamSwitchImpl()
+{
+ if ( self.team == "allies" )
+ {
+ self [[level.axis]]();
+ }
+ else
+ {
+ self [[level.allies]]();
+ }
+}
+
+HideImpl()
+{
+ if ( IsAlive( self ) )
+ {
+ self Hide();
+ self IPrintLnBold( "You are now hidden" );
+ }
+}
+
+UnhideImpl()
+{
+ if ( IsAlive( self ) )
+ {
+ self Show();
+ self IPrintLnBold( "You are now visible" );
+ }
+}
+
+AlertImpl( data )
+{
+ self thread maps\mp\gametypes\_hud_message::oldNotifyMessage( data["alertType"], data["message"], "compass_waypoint_target", ( 1, 0, 0 ), "ui_mp_nukebomb_timer", 7.5 );
+}
diff --git a/IW4MAdmin.sln b/IW4MAdmin.sln
index e5705a7dd..27263555d 100644
--- a/IW4MAdmin.sln
+++ b/IW4MAdmin.sln
@@ -30,8 +30,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ProfanityDeterment", "Plugi
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Login", "Plugins\Login\Login.csproj", "{D9F2ED28-6FA5-40CA-9912-E7A849147AB1}"
EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "IW4ScriptCommands", "Plugins\IW4ScriptCommands\IW4ScriptCommands.csproj", "{6C706CE5-A206-4E46-8712-F8C48D526091}"
-EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ScriptPlugins", "ScriptPlugins", "{3F9ACC27-26DB-49FA-BCD2-50C54A49C9FA}"
ProjectSection(SolutionItems) = preProject
Plugins\ScriptPlugins\ActionOnReport.js = Plugins\ScriptPlugins\ActionOnReport.js
@@ -253,30 +251,6 @@ Global
{D9F2ED28-6FA5-40CA-9912-E7A849147AB1}.Release|x64.Build.0 = Release|Any CPU
{D9F2ED28-6FA5-40CA-9912-E7A849147AB1}.Release|x86.ActiveCfg = Release|Any CPU
{D9F2ED28-6FA5-40CA-9912-E7A849147AB1}.Release|x86.Build.0 = Release|Any CPU
- {6C706CE5-A206-4E46-8712-F8C48D526091}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {6C706CE5-A206-4E46-8712-F8C48D526091}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {6C706CE5-A206-4E46-8712-F8C48D526091}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
- {6C706CE5-A206-4E46-8712-F8C48D526091}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
- {6C706CE5-A206-4E46-8712-F8C48D526091}.Debug|x64.ActiveCfg = Debug|Any CPU
- {6C706CE5-A206-4E46-8712-F8C48D526091}.Debug|x64.Build.0 = Debug|Any CPU
- {6C706CE5-A206-4E46-8712-F8C48D526091}.Debug|x86.ActiveCfg = Debug|Any CPU
- {6C706CE5-A206-4E46-8712-F8C48D526091}.Debug|x86.Build.0 = Debug|Any CPU
- {6C706CE5-A206-4E46-8712-F8C48D526091}.Prerelease|Any CPU.ActiveCfg = Prerelease|Any CPU
- {6C706CE5-A206-4E46-8712-F8C48D526091}.Prerelease|Any CPU.Build.0 = Prerelease|Any CPU
- {6C706CE5-A206-4E46-8712-F8C48D526091}.Prerelease|Mixed Platforms.ActiveCfg = Debug|Any CPU
- {6C706CE5-A206-4E46-8712-F8C48D526091}.Prerelease|Mixed Platforms.Build.0 = Debug|Any CPU
- {6C706CE5-A206-4E46-8712-F8C48D526091}.Prerelease|x64.ActiveCfg = Debug|Any CPU
- {6C706CE5-A206-4E46-8712-F8C48D526091}.Prerelease|x64.Build.0 = Debug|Any CPU
- {6C706CE5-A206-4E46-8712-F8C48D526091}.Prerelease|x86.ActiveCfg = Debug|Any CPU
- {6C706CE5-A206-4E46-8712-F8C48D526091}.Prerelease|x86.Build.0 = Debug|Any CPU
- {6C706CE5-A206-4E46-8712-F8C48D526091}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {6C706CE5-A206-4E46-8712-F8C48D526091}.Release|Any CPU.Build.0 = Release|Any CPU
- {6C706CE5-A206-4E46-8712-F8C48D526091}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
- {6C706CE5-A206-4E46-8712-F8C48D526091}.Release|Mixed Platforms.Build.0 = Release|Any CPU
- {6C706CE5-A206-4E46-8712-F8C48D526091}.Release|x64.ActiveCfg = Release|Any CPU
- {6C706CE5-A206-4E46-8712-F8C48D526091}.Release|x64.Build.0 = Release|Any CPU
- {6C706CE5-A206-4E46-8712-F8C48D526091}.Release|x86.ActiveCfg = Release|Any CPU
- {6C706CE5-A206-4E46-8712-F8C48D526091}.Release|x86.Build.0 = Release|Any CPU
{F5815359-CFC7-44B4-9A3B-C04BACAD5836}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{F5815359-CFC7-44B4-9A3B-C04BACAD5836}.Debug|Any CPU.Build.0 = Debug|Any CPU
{F5815359-CFC7-44B4-9A3B-C04BACAD5836}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
@@ -406,7 +380,6 @@ Global
{179140D3-97AA-4CB4-8BF6-A0C73CA75701} = {26E8B310-269E-46D4-A612-24601F16065F}
{958FF7EC-0226-4E85-A85B-B84EC768197D} = {26E8B310-269E-46D4-A612-24601F16065F}
{D9F2ED28-6FA5-40CA-9912-E7A849147AB1} = {26E8B310-269E-46D4-A612-24601F16065F}
- {6C706CE5-A206-4E46-8712-F8C48D526091} = {26E8B310-269E-46D4-A612-24601F16065F}
{3F9ACC27-26DB-49FA-BCD2-50C54A49C9FA} = {26E8B310-269E-46D4-A612-24601F16065F}
{F5815359-CFC7-44B4-9A3B-C04BACAD5836} = {26E8B310-269E-46D4-A612-24601F16065F}
{00A1FED2-2254-4AF7-A5DB-2357FA7C88CD} = {26E8B310-269E-46D4-A612-24601F16065F}
diff --git a/Integrations/Cod/CodRConConnection.cs b/Integrations/Cod/CodRConConnection.cs
index 6282e4eda..4ac4d5b90 100644
--- a/Integrations/Cod/CodRConConnection.cs
+++ b/Integrations/Cod/CodRConConnection.cs
@@ -64,9 +64,9 @@ namespace Integrations.Cod
var timeSinceLastQuery = (DateTime.Now - connectionState.LastQuery).TotalMilliseconds;
- if (timeSinceLastQuery < StaticHelpers.FloodProtectionInterval)
+ if (timeSinceLastQuery < config.FloodProtectInterval)
{
- await Task.Delay(StaticHelpers.FloodProtectionInterval - (int)timeSinceLastQuery);
+ await Task.Delay(config.FloodProtectInterval - (int)timeSinceLastQuery);
}
connectionState.LastQuery = DateTime.Now;
diff --git a/Plugins/IW4ScriptCommands/Commands/KillPlayerCommand.cs b/Plugins/IW4ScriptCommands/Commands/KillPlayerCommand.cs
deleted file mode 100644
index bef7d7d7a..000000000
--- a/Plugins/IW4ScriptCommands/Commands/KillPlayerCommand.cs
+++ /dev/null
@@ -1,44 +0,0 @@
-using SharedLibraryCore;
-using SharedLibraryCore.Commands;
-using SharedLibraryCore.Configuration;
-using SharedLibraryCore.Database.Models;
-using SharedLibraryCore.Interfaces;
-using System.Threading.Tasks;
-
-namespace IW4ScriptCommands.Commands
-{
- ///
- /// Example script command
- ///
- public class KillPlayerCommand : Command
- {
- public KillPlayerCommand(CommandConfiguration config, ITranslationLookup lookup) : base(config, lookup)
- {
- Name = "killplayer";
- Description = "kill a player";
- Alias = "kp";
- Permission = EFClient.Permission.Administrator;
- RequiresTarget = true;
- Arguments = new[]
- {
- new CommandArgument()
- {
- Name = "player",
- Required = true
- }
- };
- }
-
- public override async Task ExecuteAsync(GameEvent E)
- {
- var cmd = new ScriptCommand()
- {
- CommandName = "killplayer",
- ClientNumber = E.Target.ClientNumber,
- CommandArguments = new[] { E.Origin.ClientNumber.ToString() }
- };
-
- await cmd.Execute(E.Owner);
- }
- }
-}
diff --git a/Plugins/IW4ScriptCommands/GscApiController.cs b/Plugins/IW4ScriptCommands/GscApiController.cs
deleted file mode 100644
index edadf8660..000000000
--- a/Plugins/IW4ScriptCommands/GscApiController.cs
+++ /dev/null
@@ -1,44 +0,0 @@
-using Microsoft.AspNetCore.Mvc;
-using SharedLibraryCore;
-using SharedLibraryCore.Interfaces;
-using System.Linq;
-using System.Text;
-
-namespace WebfrontCore.Controllers.API
-{
- [Route("api/gsc/[action]")]
- public class GscApiController : BaseController
- {
- public GscApiController(IManager manager) : base(manager)
- {
-
- }
-
- ///
- /// grabs basic info about the client from IW4MAdmin
- ///
- ///
- ///
- [HttpGet("{networkId}")]
- public IActionResult ClientInfo(string networkId)
- {
- long decimalNetworkId = networkId.ConvertGuidToLong(System.Globalization.NumberStyles.HexNumber);
- var clientInfo = Manager.GetActiveClients()
- .FirstOrDefault(c => c.NetworkId == decimalNetworkId);
-
- if (clientInfo != null)
- {
- var sb = new StringBuilder();
- sb.AppendLine($"admin={clientInfo.IsPrivileged()}");
- sb.AppendLine($"level={(int)clientInfo.Level}");
- sb.AppendLine($"levelstring={clientInfo.Level.ToLocalizedLevelName()}");
- sb.AppendLine($"connections={clientInfo.Connections}");
- sb.AppendLine($"authenticated={clientInfo.GetAdditionalProperty("IsLoggedIn") == true}");
-
- return Content(sb.ToString());
- }
-
- return Content("");
- }
- }
-}
diff --git a/Plugins/IW4ScriptCommands/IW4ScriptCommands.csproj b/Plugins/IW4ScriptCommands/IW4ScriptCommands.csproj
deleted file mode 100644
index bf99ae8f3..000000000
--- a/Plugins/IW4ScriptCommands/IW4ScriptCommands.csproj
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
- Library
- net6.0
-
-
- Debug;Release;Prerelease
- Latest
-
-
-
-
-
-
-
-
-
-
-
diff --git a/Plugins/IW4ScriptCommands/Plugin.cs b/Plugins/IW4ScriptCommands/Plugin.cs
deleted file mode 100644
index 23091568a..000000000
--- a/Plugins/IW4ScriptCommands/Plugin.cs
+++ /dev/null
@@ -1,46 +0,0 @@
-using SharedLibraryCore;
-using SharedLibraryCore.Interfaces;
-using System.Threading.Tasks;
-
-namespace IW4ScriptCommands
-{
- public class Plugin : IPlugin
- {
- public string Name => "IW4 Script Commands";
-
- public float Version => 1.0f;
-
- public string Author => "RaidMax";
-
- public async Task OnEventAsync(GameEvent E, Server S)
- {
- if (E.Type == GameEvent.EventType.Start)
- {
- await S.SetDvarAsync("sv_iw4madmin_serverid", S.EndPoint);
- }
-
- if (E.Type == GameEvent.EventType.Warn)
- {
- var cmd = new ScriptCommand()
- {
- ClientNumber = E.Target.ClientNumber,
- CommandName = "alert",
- CommandArguments = new[]
- {
- "Warning",
- "ui_mp_nukebomb_timer",
- E.Data
- }
- };
- // notifies the player ingame of the warning
- await cmd.Execute(S);
- }
- }
-
- public Task OnLoadAsync(IManager manager) => Task.CompletedTask;
-
- public Task OnTickAsync(Server S) => Task.CompletedTask;
-
- public Task OnUnloadAsync() => Task.CompletedTask;
- }
-}
diff --git a/Plugins/IW4ScriptCommands/ScriptCommand.cs b/Plugins/IW4ScriptCommands/ScriptCommand.cs
deleted file mode 100644
index 5b2e494bb..000000000
--- a/Plugins/IW4ScriptCommands/ScriptCommand.cs
+++ /dev/null
@@ -1,36 +0,0 @@
-using SharedLibraryCore;
-using System.Linq;
-using System.Threading.Tasks;
-
-namespace IW4ScriptCommands
-{
- ///
- /// Contains basic properties for command information read by gsc
- ///
- class ScriptCommand
- {
- ///
- /// Name of the command to execute
- ///
- public string CommandName { get; set; }
-
- ///
- /// Target client number
- ///
- public int ClientNumber { get; set; }
-
- ///
- /// Arguments for the script function itself
- ///
- public string[] CommandArguments { get; set; } = new string[0];
-
- public override string ToString() => string.Join(";", new[] { CommandName, ClientNumber.ToString() }.Concat(CommandArguments).Select(_arg => _arg.Replace(";", "")));
-
- ///
- /// Executes the command
- ///
- /// server to execute the command on
- ///
- public async Task Execute(Server server) => await server.SetDvarAsync("sv_iw4madmin_command", ToString());
- }
-}
diff --git a/Plugins/ScriptPlugins/GameInterface.js b/Plugins/ScriptPlugins/GameInterface.js
index 347ae2976..25e9d4c8e 100644
--- a/Plugins/ScriptPlugins/GameInterface.js
+++ b/Plugins/ScriptPlugins/GameInterface.js
@@ -26,7 +26,7 @@ let plugin = {
switch (eventType) {
case 'start':
const enabled = initialize(server);
-
+
if (!enabled) {
return;
}
@@ -189,7 +189,11 @@ let commands = [{
targetRequired: true,
// optional
arguments: [{
- name: 'alert message',
+ name: 'player',
+ required: true
+ },
+ {
+ name: 'message',
required: true
}],
supportedGames: ['IW4'],
@@ -203,9 +207,11 @@ let commands = [{
}];
const sendScriptCommand = (server, command, target, data) => {
- if (plugin.enabled) {
- sendEvent(server, false, 'ExecuteCommandRequested', command, target, data);
+ const state = servers[server.EndPoint];
+ if (state === undefined || !state.enabled) {
+ return;
}
+ sendEvent(server, false, 'ExecuteCommandRequested', command, target, data);
}
const sendEvent = (server, responseExpected, event, subtype, client, data) => {
@@ -272,7 +278,7 @@ const initialize = (server) => {
logger.WriteError(`Could not get integration status of ${server.EndPoint} - ${error}`);
}
- logger.WriteDebug(`GSC Integration enabledGSC Integration enabled = ${enabled}`);
+ logger.WriteInfo(`GSC Integration enabled = ${enabled}`);
if (!enabled) {
servers[server.EndPoint] = {
@@ -320,13 +326,13 @@ const pollForEvents = server => {
const event = parseEvent(input)
- logger.WriteInfo(`Processing input... ${event.eventType}`);
+ logger.WriteDebug(`Processing input... ${event.eventType} ${event.subType} ${event.data} ${event.clientNumber}`);
if (event.eventType === 'ClientDataRequested') {
const client = server.GetClientByNumber(event.clientNumber);
if (client != null) {
- logger.WriteInfo(`Found client ${client.Name}`);
+ logger.WriteDebug(`Found client ${client.Name}`);
let data = [];
@@ -342,9 +348,9 @@ const pollForEvents = server => {
}
sendEvent(server, false, 'ClientDataReceived', event.subType, client, data);
+ } else {
+ logger.WriteWarning(`Could not find client slot ${event.clientNumber} when processing ${event.eventType}`);
}
-
- logger.WriteWarning(`Could not find client slot ${event.clientNumber} when processing ${event.eventType}`);
}
try {
diff --git a/Plugins/ScriptPlugins/ParserIW4x.js b/Plugins/ScriptPlugins/ParserIW4x.js
index 5dac1a50c..324f28e63 100644
--- a/Plugins/ScriptPlugins/ParserIW4x.js
+++ b/Plugins/ScriptPlugins/ParserIW4x.js
@@ -3,7 +3,7 @@ var eventParser;
var plugin = {
author: 'RaidMax',
- version: 0.5,
+ version: 0.6,
name: 'IW4x Parser',
isParser: true,
@@ -20,10 +20,11 @@ var plugin = {
rconParser.Configuration.CommandPrefixes.Ban = 'clientkick {0} "{1}"';
rconParser.Configuration.CommandPrefixes.TempBan = 'tempbanclient {0} "{1}"';
- rconParser.Configuration.DefaultRConPort = 28960;
- rconParser.Configuration.DefaultInstallationDirectoryHint = 'HKEY_CURRENT_USER\\Software\\Classes\\iw4x\\shell\\open\\command';
+ rconParser.Configuration.DefaultRConPort = 28960;
+ rconParser.Configuration.DefaultInstallationDirectoryHint = 'HKEY_CURRENT_USER\\Software\\Classes\\iw4x\\shell\\open\\command';
+ rconParser.Configuration.FloodProtectInterval = 50;
- eventParser.Configuration.GameDirectory = 'userraw';
+ eventParser.Configuration.GameDirectory = 'userraw';
rconParser.Version = 'IW4x (v0.6.0)';
rconParser.GameName = 2; // IW4x
@@ -37,4 +38,4 @@ var plugin = {
onTickAsync: function (server) {
}
-};
\ No newline at end of file
+};
diff --git a/SharedLibraryCore/Interfaces/IRConParserConfiguration.cs b/SharedLibraryCore/Interfaces/IRConParserConfiguration.cs
index 6d84606c4..589775151 100644
--- a/SharedLibraryCore/Interfaces/IRConParserConfiguration.cs
+++ b/SharedLibraryCore/Interfaces/IRConParserConfiguration.cs
@@ -100,5 +100,7 @@ namespace SharedLibraryCore.Interfaces
string DefaultInstallationDirectoryHint { get; }
ColorCodeMapping ColorCodeMapping { get; }
+
+ short FloodProtectInterval { get; }
}
-}
\ No newline at end of file
+}