1
0
mirror of https://github.com/RaidMax/IW4M-Admin.git synced 2025-06-10 15:20:48 -05:00

implement bus mode for game interface to allow files for bus data transfer

This commit is contained in:
RaidMax
2023-06-06 17:56:12 -05:00
parent c24e838bb5
commit fd7c8fcb4a
6 changed files with 190 additions and 22 deletions

View File

@ -21,13 +21,29 @@ Setup()
level.commonFunctions.setDvar = "SetDvarIfUninitialized";
level.commonFunctions.getPlayerFromClientNum = "GetPlayerFromClientNum";
level.commonFunctions.waittillNotifyOrTimeout = "WaittillNotifyOrTimeout";
level.commonFunctions.getInboundData = "GetInboundData";
level.commonFunctions.getOutboundData = "GetOutboundData";
level.commonFunctions.setInboundData = "SetInboundData";
level.commonFunctions.setOutboundData = "SetOutboundData";
level.overrideMethods = [];
level.overrideMethods[level.commonFunctions.setDvar] = scripts\_integration_base::NotImplementedFunction;
level.overrideMethods[level.commonFunctions.getPlayerFromClientNum] = ::_GetPlayerFromClientNum;
level.overrideMethods[level.commonFunctions.getInboundData] = ::_GetInboundData;
level.overrideMethods[level.commonFunctions.getOutboundData] = ::_GetOutboundData;
level.overrideMethods[level.commonFunctions.setInboundData] = ::_SetInboundData;
level.overrideMethods[level.commonFunctions.setOutboundData] = ::_SetOutboundData;
level.busMethods = [];
level.busMethods[level.commonFunctions.getInboundData] = ::_GetInboundData;
level.busMethods[level.commonFunctions.getOutboundData] = ::_GetOutboundData;
level.busMethods[level.commonFunctions.setInboundData] = ::_SetInboundData;
level.busMethods[level.commonFunctions.setOutboundData] = ::_SetOutboundData;
level.commonKeys = spawnstruct();
level.commonKeys.enabled = "sv_iw4madmin_integration_enabled";
level.commonKeys.busMode = "sv_iw4madmin_integration_busmode";
level.commonKeys.busDir = "sv_iw4madmin_integration_busdir";
level.notifyTypes = spawnstruct();
level.notifyTypes.gameFunctionsInitialized = "GameFunctionsInitialized";
@ -69,6 +85,8 @@ Setup()
_SetDvarIfUninitialized( level.eventBus.inVar, "" );
_SetDvarIfUninitialized( level.eventBus.outVar, "" );
_SetDvarIfUninitialized( level.commonKeys.enabled, 1 );
_SetDvarIfUninitialized( level.commonKeys.busMode, "rcon" );
_SetDvarIfUninitialized( level.commonKeys.busdir, "" );
_SetDvarIfUninitialized( "sv_iw4madmin_integration_debug", 0 );
_SetDvarIfUninitialized( "GroupSeparatorChar", "" );
_SetDvarIfUninitialized( "RecordSeparatorChar", "" );
@ -157,6 +175,26 @@ _GetPlayerFromClientNum( clientNum )
return undefined;
}
_GetInboundData()
{
return GetDvar( level.eventBus.inVar );
}
_GetOutboundData()
{
return GetDvar( level.eventBus.outVar );
}
_SetInboundData( data )
{
return SetDvar( level.eventBus.inVar, data );
}
_SetOutboundData( data )
{
return SetDvar( level.eventBus.outVar, data );
}
// Not every game can output to console or even game log.
// Adds a very basic logging system that every
// game specific script can extend.accumulate
@ -322,29 +360,35 @@ BuildEventRequest( responseExpected, eventType, eventSubtype, entOrId, data )
MonitorBus()
{
level endon( level.eventTypes.gameEnd );
[[level.overrideMethods[level.commonFunctions.SetInboundData]]]( "" );
[[level.overrideMethods[level.commonFunctions.SetOutboundData]]]( "" );
for( ;; )
{
wait ( 0.1 );
// check to see if IW4MAdmin is ready to receive more data
if ( getDvar( level.eventBus.inVar ) == "" )
inVal = [[level.busMethods[level.commonFunctions.getInboundData]]]();
if ( !IsDefined( inVal ) || inVal == "" )
{
level notify( "bus_ready" );
}
eventString = getDvar( level.eventBus.outVar );
eventString = [[level.busMethods[level.commonFunctions.getOutboundData]]]();
if ( eventString == "" )
if ( !IsDefined( eventString ) || eventString == "" )
{
continue;
}
LogDebug( "-> " + eventString );
groupSeparator = GetSubStr( GetDvar( "GroupSeparatorChar" ), 0, 1 );
NotifyEvent( strtok( eventString, groupSeparator ) );
SetDvar( level.eventBus.outVar, "" );
[[level.busMethods[level.commonFunctions.SetOutboundData]]]( "" );
}
}
@ -356,11 +400,11 @@ QueueEvent( request, eventType, notifyEntity )
maxWait = level.eventBus.timeout * 1000; // 30 seconds
timedOut = "";
while ( GetDvar( level.eventBus.inVar ) != "" && ( GetTime() - start ) < maxWait )
while ( [[level.busMethods[level.commonFunctions.getInboundData]]]() != "" && ( GetTime() - start ) < maxWait )
{
level [[level.overrideMethods[level.commonFunctions.waittillNotifyOrTimeout]]]( "bus_ready", 1 );
if ( GetDvar( level.eventBus.inVar ) != "" )
if ( [[level.busMethods[level.commonFunctions.getInboundData]]]() != "" )
{
LogDebug( "A request is already in progress..." );
timedOut = "set";
@ -379,14 +423,14 @@ QueueEvent( request, eventType, notifyEntity )
notifyEntity NotifyClientEventTimeout( eventType );
}
SetDvar( level.eventBus.inVar, "" );
[[level.busMethods[level.commonFunctions.SetInboundData]]]( "" );
return;
}
LogDebug( "<- " + request );
SetDvar( level.eventBus.inVar, request );
[[level.busMethods[level.commonFunctions.setInboundData]]]( request );
}
ParseDataString( data )

View File

@ -28,7 +28,12 @@ Setup()
level.overrideMethods[level.commonFunctions.backupRestoreClientKillStreakData] = ::BackupRestoreClientKillStreakData;
level.overrideMethods[level.commonFunctions.waitTillAnyTimeout] = ::WaitTillAnyTimeout;
level.overrideMethods[level.commonFunctions.waittillNotifyOrTimeout] = ::WaitillNotifyOrTimeoutWrapper;
level.overrideMethods[level.commonFunctions.getInboundData] = ::GetInboundData;
level.overrideMethods[level.commonFunctions.getOutboundData] = ::GetOutboundData;
level.overrideMethods[level.commonFunctions.setInboundData] = ::SetInboundData;
level.overrideMethods[level.commonFunctions.setOutboundData] = ::SetOutboundData;
RegisterClientCommands();
level notify( level.notifyTypes.gameFunctionsInitialized );
@ -97,6 +102,26 @@ WaitForClientEvents()
}
}
GetInboundData()
{
return FileRead( level.eventBus.inVar);
}
GetOutboundData()
{
return FileRead( level.eventBus.outVar );
}
SetInboundData( data )
{
FileWrite( level.eventBus.inVar, data, "write" );
}
SetOutboundData( data )
{
FileWrite(level.eventBus.outVar, data, "write" );
}
GetMaxClients()
{
return level.maxClients;

View File

@ -50,9 +50,11 @@ Setup()
level.eventTypes.urlRequestCompleted = "UrlRequestCompleted";
level.eventTypes.registerCommandRequested = "RegisterCommandRequested";
level.eventTypes.getCommandsRequested = "GetCommandsRequested";
level.eventTypes.getBusModeRequested = "GetBusModeRequested";
level.eventCallbacks[level.eventTypes.urlRequestCompleted] = ::OnUrlRequestCompletedCallback;
level.eventCallbacks[level.eventTypes.getCommandsRequested] = ::OnCommandsRequestedCallback;
level.eventCallbacks[level.eventTypes.urlRequestCompleted] = ::OnUrlRequestCompletedCallback;
level.eventCallbacks[level.eventTypes.getCommandsRequested] = ::OnCommandsRequestedCallback;
level.eventCallbacks[level.eventTypes.getBusModeRequested] = ::OnBusModeRequestedCallback;
level.iw4madminIntegrationDefaultPerformance = 200;
level.notifyEntities = [];
@ -195,6 +197,28 @@ SaveTrackingMetrics()
scripts\_integration_base::IncrementClientMeta( "TotalShotsFired", change, self.persistentClientId );
}
OnBusModeRequestedCallback( event )
{
data = [];
data["mode"] = GetDvar( level.commonKeys.busMode );
data["directory"] = GetDvar( level.commonKeys.busDir );
scripts\_integration_base::LogDebug( "Bus mode requested" );
busModeRequest = scripts\_integration_base::BuildEventRequest( false, level.eventTypes.getBusModeRequested, "", undefined, data );
scripts\_integration_base::QueueEvent( busModeRequest, level.eventTypes.getBusModeRequested, undefined );
scripts\_integration_base::LogDebug( "Bus mode updated" );
if ( GetDvar( level.commonKeys.busMode ) == "file" || GetDvar( level.commonKeys.busDir ) != "" )
{
level.busMethods[level.commonFunctions.getInboundData] = level.overrideMethods[level.commonFunctions.getInboundData];
level.busMethods[level.commonFunctions.getOutboundData] = level.overrideMethods[level.commonFunctions.getOutboundData];
level.busMethods[level.commonFunctions.setInboundData] = level.overrideMethods[level.commonFunctions.setInboundData];
level.busMethods[level.commonFunctions.setOutboundData] = level.overrideMethods[level.commonFunctions.setOutboundData];
}
}
// #region register script command
OnCommandsRequestedCallback( event )

View File

@ -81,5 +81,8 @@ AffirmationCommandCallback( event, _ )
// horrible json parsing.. but it's just an example
parsedResponse = strtok( response, "\"" );
self IPrintLnBold ( "^5" + parsedResponse[parsedResponse.size - 2] );
if ( IsPlayer( self ) )
{
self IPrintLnBold ( "^5" + parsedResponse[parsedResponse.size - 2] );
}
}