diff options
Diffstat (limited to 'Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_mfd.nut')
-rw-r--r-- | Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_mfd.nut | 100 |
1 files changed, 53 insertions, 47 deletions
diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_mfd.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_mfd.nut index 8d0545cba..326f3302f 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_mfd.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_mfd.nut @@ -1,9 +1,11 @@ untyped global function GamemodeMfd_Init +global function RateSpawnpoints_Frontline struct { entity imcLastMark entity militiaLastMark + bool isMfdPro } file void function GamemodeMfd_Init() @@ -11,6 +13,16 @@ void function GamemodeMfd_Init() GamemodeMfdShared_Init() RegisterSignal( "MarkKilled" ) + + // todo + if ( GAMETYPE == MARKED_FOR_DEATH_PRO ) + { + file.isMfdPro = true + SetRespawnsEnabled( true ) + SetRoundBased( true ) + SetShouldUseRoundWinningKillReplay( true ) + Riff_ForceSetEliminationMode( eEliminationMode.Pilots ) + } AddCallback_OnPlayerKilled( UpdateMarksForKill ) AddCallback_GameStateEnter( eGameState.Playing, CreateInitialMarks ) @@ -170,63 +182,57 @@ void function UpdateMarksForKill( entity victim, entity attacker, var damageInfo } } -/* -void function MarkPlayers() +// could probably put this in spawn.nut? only here because i believe it's the main mode that uses this func +void function RateSpawnpoints_Frontline( int checkClass, array<entity> spawnpoints, int team, entity player ) { - // todo: need to handle disconnecting marks - if ( !TargetsMarkedImmediately() ) - wait MFD_BETWEEN_MARKS_TIME - + Frontline frontline = GetFrontline( player.GetTeam() ) - // wait until we actually have 2 valid players - array<entity> imcPlayers - array<entity> militiaPlayers - while ( imcPlayers.len() == 0 || militiaPlayers.len() == 0 ) - { - imcPlayers = GetPlayerArrayOfTeam( TEAM_IMC ) - militiaPlayers = GetPlayerArrayOfTeam( TEAM_MILITIA ) - - WaitFrame() - } + // heavily based on ctf spawn algo iteration 4, only changes it at the end + array<entity> startSpawns = SpawnPoints_GetPilotStart( team ) + array<entity> enemyStartSpawns = SpawnPoints_GetPilotStart( GetOtherTeam( team ) ) + array<entity> enemyPlayers = GetPlayerArrayOfTeam_Alive( team ) - // decide marks - entity imcMark = imcPlayers[ RandomInt( imcPlayers.len() ) ] - level.mfdPendingMarkedPlayerEnt[ TEAM_IMC ].SetOwner( imcMark ) + // get average startspawn position and max dist between spawns + // could probably cache this, tbh, not like it should change outside of halftimes + vector averageFriendlySpawns + float maxFriendlySpawnDist - entity militiaMark = militiaPlayers[ RandomInt( militiaPlayers.len() ) ] - level.mfdPendingMarkedPlayerEnt[ TEAM_MILITIA ].SetOwner( militiaMark ) - - foreach ( entity player in GetPlayerArray() ) + foreach ( entity spawn in startSpawns ) { - Remote_CallFunction_NonReplay( player, "SCB_MarkedChanged" ) - Remote_CallFunction_NonReplay( player, "ServerCallback_MFD_StartNewMarkCountdown", Time() + MFD_COUNTDOWN_TIME ) - } + foreach ( entity otherSpawn in startSpawns ) + { + float dist = Distance2D( spawn.GetOrigin(), otherSpawn.GetOrigin() ) + if ( dist > maxFriendlySpawnDist ) + maxFriendlySpawnDist = dist + } - wait MFD_COUNTDOWN_TIME + averageFriendlySpawns += spawn.GetOrigin() + } - while ( !IsAlive( imcMark ) || !IsAlive( militiaMark ) ) - WaitFrame() + averageFriendlySpawns /= startSpawns.len() - // clear pending marks - level.mfdPendingMarkedPlayerEnt[ TEAM_IMC ].SetOwner( null ) - level.mfdPendingMarkedPlayerEnt[ TEAM_MILITIA ].SetOwner( null ) + // get average enemy startspawn position + vector averageEnemySpawns - // set marks - level.mfdActiveMarkedPlayerEnt[ TEAM_IMC ].SetOwner( imcMark ) - level.mfdActiveMarkedPlayerEnt[ TEAM_MILITIA ].SetOwner( militiaMark ) + foreach ( entity spawn in enemyStartSpawns ) + averageEnemySpawns += spawn.GetOrigin() - foreach ( entity player in GetPlayerArray() ) - Remote_CallFunction_NonReplay( player, "SCB_MarkedChanged" ) + averageEnemySpawns /= enemyStartSpawns.len() + + // from here, rate spawns + float baseDistance = Distance2D( averageFriendlySpawns, averageEnemySpawns ) + float spawnIterations = ( baseDistance / maxFriendlySpawnDist ) / 2 - while ( IsAlive( imcMark ) && IsAlive( militiaMark ) ) - WaitFrame() + foreach ( entity spawn in spawnpoints ) + { + // ratings should max/min out at 100 / -100 + // start by prioritizing closer spawns, but not so much that enemies won't really affect them + float rating = 10 * ( 1.0 - Distance2D( averageFriendlySpawns, spawn.GetOrigin() ) / baseDistance ) - // clear marks - level.mfdActiveMarkedPlayerEnt[ TEAM_IMC ].SetOwner( null ) - level.mfdActiveMarkedPlayerEnt[ TEAM_MILITIA ].SetOwner( null ) + // rate based on distance to frontline, and then prefer spawns in the same dir from the frontline as the combatdir + rating += rating * ( 1.0 - ( Distance2D( spawn.GetOrigin(), frontline.friendlyCenter ) / baseDistance ) ) + rating *= fabs( frontline.combatDir.y - Normalize( spawn.GetOrigin() - averageFriendlySpawns ).y ) - foreach ( entity player in GetPlayerArray() ) - Remote_CallFunction_NonReplay( player, "SCB_MarkedChanged" ) - - thread MarkPlayers() -}*/
\ No newline at end of file + spawn.CalculateRating( checkClass, player.GetTeam(), rating, rating ) + } +}
\ No newline at end of file |