diff options
19 files changed, 232 insertions, 70 deletions
diff --git a/Northstar.Client/mod/resource/northstar_client_localisation_english.txt b/Northstar.Client/mod/resource/northstar_client_localisation_english.txt Binary files differindex 49ec746c..b7a4c758 100644 --- a/Northstar.Client/mod/resource/northstar_client_localisation_english.txt +++ b/Northstar.Client/mod/resource/northstar_client_localisation_english.txt diff --git a/Northstar.Client/mod/resource/northstar_client_localisation_german.txt b/Northstar.Client/mod/resource/northstar_client_localisation_german.txt Binary files differindex fdea511e..3d7a7551 100644 --- a/Northstar.Client/mod/resource/northstar_client_localisation_german.txt +++ b/Northstar.Client/mod/resource/northstar_client_localisation_german.txt diff --git a/Northstar.Client/mod/resource/northstar_client_localisation_japanese.txt b/Northstar.Client/mod/resource/northstar_client_localisation_japanese.txt Binary files differindex e4ac2680..58abc549 100644 --- a/Northstar.Client/mod/resource/northstar_client_localisation_japanese.txt +++ b/Northstar.Client/mod/resource/northstar_client_localisation_japanese.txt diff --git a/Northstar.Client/mod/resource/northstar_client_localisation_portuguese.txt b/Northstar.Client/mod/resource/northstar_client_localisation_portuguese.txt Binary files differindex 332d25f8..0db15c43 100644 --- a/Northstar.Client/mod/resource/northstar_client_localisation_portuguese.txt +++ b/Northstar.Client/mod/resource/northstar_client_localisation_portuguese.txt diff --git a/Northstar.Client/mod/resource/northstar_client_localisation_tchinese.txt b/Northstar.Client/mod/resource/northstar_client_localisation_tchinese.txt Binary files differnew file mode 100644 index 00000000..cd8cf977 --- /dev/null +++ b/Northstar.Client/mod/resource/northstar_client_localisation_tchinese.txt diff --git a/Northstar.Client/mod/scripts/vscripts/ui/menu_ns_serverbrowser.nut b/Northstar.Client/mod/scripts/vscripts/ui/menu_ns_serverbrowser.nut index 7252d3d5..7254f199 100644 --- a/Northstar.Client/mod/scripts/vscripts/ui/menu_ns_serverbrowser.nut +++ b/Northstar.Client/mod/scripts/vscripts/ui/menu_ns_serverbrowser.nut @@ -91,6 +91,36 @@ void function AddNorthstarServerBrowserMenu() AddMenu( "ServerBrowserMenu", $"resource/ui/menus/server_browser.menu", InitServerBrowserMenu, "#MENU_SERVER_BROWSER" ) } +void function UpdatePrivateMatchModesAndMaps() +{ + array<string> realMaps = [ "mp_lobby" ] + realMaps.extend( GetPrivateMatchMaps() ) + + foreach ( int enum_, string map in realMaps ) + { + if ( filterArguments.filterMaps.find( map ) != -1 ) + continue + + filterArguments.filterMaps.append( map ) + + string localized = GetMapDisplayName( map ) + Hud_DialogList_AddListItem( Hud_GetChild( file.menu, "SwtBtnSelectMap" ) , localized, string( enum_ + 1 ) ) + } + + array<string> realModes = [ "private_match" ] + realModes.extend( GetPrivateMatchModes() ) + + foreach( int enum_, string mode in realModes ) + { + string localized = GetGameModeDisplayName( mode ) + if ( filterArguments.filterGamemodes.find( localized ) != -1 ) + continue + + filterArguments.filterGamemodes.append( localized ) + Hud_DialogList_AddListItem( Hud_GetChild( file.menu, "SwtBtnSelectGamemode" ) , localized, string( enum_ + 1 ) ) + } +} + void function InitServerBrowserMenu() { file.menu = GetMenu( "ServerBrowserMenu" ) @@ -104,28 +134,14 @@ void function InitServerBrowserMenu() file.serversGamemode = GetElementsByClassname( file.menu, "ServerGamemode" ) file.serversLatency = GetElementsByClassname( file.menu, "ServerLatency" ) - // Create filter arrays - filterArguments.filterMaps.extend(GetPrivateMatchMaps()) - filterArguments.filterMaps.insert(0, "SWITCH_ANY") - filterArguments.filterMaps.append("mp_lobby") - - foreach ( int enum_, string map in filterArguments.filterMaps ) - Hud_DialogList_AddListItem( Hud_GetChild( file.menu, "SwtBtnSelectMap" ) , map, string( enum_ ) ) - - - filterArguments.filterGamemodes = GetPrivateMatchModes() - filterArguments.filterGamemodes.insert(0, "SWITCH_ANY") - - // GetGameModeDisplayName( mode ) requires server talk even if it can be entirely client side - foreach ( int enum_, string mode in filterArguments.filterGamemodes ) - Hud_DialogList_AddListItem( Hud_GetChild( file.menu, "SwtBtnSelectGamemode" ) , mode, string( enum_ ) ) - + filterArguments.filterMaps = [ "SWITCH_ANY" ] + Hud_DialogList_AddListItem( Hud_GetChild( file.menu, "SwtBtnSelectMap" ), "SWITCH_ANY", "0" ) + + filterArguments.filterGamemodes = [ "SWITCH_ANY" ] + Hud_DialogList_AddListItem( Hud_GetChild( file.menu, "SwtBtnSelectGamemode" ), "SWITCH_ANY", "0" ) // Event handlers AddMenuEventHandler( file.menu, eUIEvent.MENU_CLOSE, OnCloseServerBrowserMenu ) - - - AddMenuEventHandler( file.menu, eUIEvent.MENU_OPEN, OnServerBrowserMenuOpened ) AddMenuFooterOption( file.menu, BUTTON_B, "#B_BUTTON_BACK", "#BACK" ) AddMenuFooterOption( file.menu, BUTTON_Y, "#Y_REFRESH_SERVERS", "#REFRESH_SERVERS", RefreshServers ) @@ -375,6 +391,7 @@ void function OnCloseServerBrowserMenu() void function OnServerBrowserMenuOpened() { + UpdatePrivateMatchModesAndMaps() Hud_SetText( Hud_GetChild( file.menu, "Title" ), "#MENU_TITLE_SERVER_BROWSER" ) UI_SetPresentationType( ePresentationType.KNOWLEDGEBASE_MAIN ) @@ -696,14 +713,6 @@ void function FilterServerList() } } - - printt("Better.Serverbrowser:------------------------") - printt("Server count: ", NSGetServerCount()) - printt("Filtered count: ", file.serversArrayFiltered.len()) - printt("Total players: ", totalPlayers) - printt("This message gets shown only on full refresh") - printt("---------------------------------------------") - Hud_SetText( Hud_GetChild( file.menu, "InGamePlayerCount" ), string( totalPlayers ) ) Hud_SetText( Hud_GetChild( file.menu, "TotalServerCount" ), string( NSGetServerCount() ) ) } diff --git a/Northstar.Custom/mod.json b/Northstar.Custom/mod.json index 4759956a..e817df6d 100644 --- a/Northstar.Custom/mod.json +++ b/Northstar.Custom/mod.json @@ -334,6 +334,18 @@ "ServerCallback": { "After": "DisallowedWeapons_Init" } + }, + + { + "Path": "sh_custom_pilot_collision.gnut", + "RunOn": "( CLIENT || SERVER ) && MP", + "ClientCallback": { + "After": "CustomPilotCollision_InitPlaylistVars" + }, + + "ServerCallback": { + "After": "CustomPilotCollision_InitPlaylistVars" + } } ], diff --git a/Northstar.Custom/mod/resource/northstar_custom_portuguese.txt b/Northstar.Custom/mod/resource/northstar_custom_portuguese.txt Binary files differindex 62835f52..0a7b19d2 100644 --- a/Northstar.Custom/mod/resource/northstar_custom_portuguese.txt +++ b/Northstar.Custom/mod/resource/northstar_custom_portuguese.txt diff --git a/Northstar.Custom/mod/scripts/vscripts/gamemodes/_gamemode_inf.gnut b/Northstar.Custom/mod/scripts/vscripts/gamemodes/_gamemode_inf.gnut index a0e0b743..2ccd46ba 100644 --- a/Northstar.Custom/mod/scripts/vscripts/gamemodes/_gamemode_inf.gnut +++ b/Northstar.Custom/mod/scripts/vscripts/gamemodes/_gamemode_inf.gnut @@ -30,7 +30,7 @@ void function InfectionInitPlayer( entity player ) if ( GetGameState() < eGameState.Playing ) SetTeam( player, INFECTION_TEAM_SURVIVOR ) else - InfectPlayer( player ) + InfectPlayer( player, player ) } void function SelectFirstInfected() @@ -45,23 +45,23 @@ void function SelectFirstInfectedDelayed() array<entity> players = GetPlayerArray() entity infected = players[ RandomInt( players.len() ) ] - InfectPlayer( infected ) + InfectPlayer( infected, infected ) RespawnInfected( infected ) } void function InfectionOnPlayerKilled( entity victim, entity attacker, var damageInfo ) { - if ( !victim.IsPlayer() || GetGameState() != eGameState.Playing ) + if ( !victim.IsPlayer() || !attacker.IsPlayer() || GetGameState() != eGameState.Playing ) return if ( victim.GetTeam() == INFECTION_TEAM_SURVIVOR ) - InfectPlayer( victim ) + InfectPlayer( victim, attacker ) if ( attacker.IsPlayer() ) attacker.SetPlayerGameStat( PGS_ASSAULT_SCORE, attacker.GetPlayerGameStat( PGS_ASSAULT_SCORE ) + 1 ) } -void function InfectPlayer( entity player ) +void function InfectPlayer( entity player, entity attacker ) { SetTeam( player, INFECTION_TEAM_INFECTED ) player.SetPlayerGameStat( PGS_ASSAULT_SCORE, 0 ) // reset kills @@ -70,7 +70,12 @@ void function InfectPlayer( entity player ) // check how many survivors there are array<entity> survivors = GetPlayerArrayOfTeam( INFECTION_TEAM_SURVIVOR ) if ( survivors.len() == 0 ) + { + SetRespawnsEnabled( false ) + SetKillcamsEnabled( false ) + SetRoundWinningKillReplayAttacker(attacker) SetWinner( INFECTION_TEAM_INFECTED ) + } else if ( survivors.len() == 1 && !file.hasHadLastInfection ) SetLastSurvivor( survivors[ 0 ] ) @@ -183,8 +188,14 @@ void function SetLastSurvivor( entity player ) int function TimeoutCheckSurvivors() { - if ( GetPlayerArrayOfTeam( INFECTION_TEAM_SURVIVOR ).len() > 0 ) + array<entity> survivors = GetPlayerArrayOfTeam( INFECTION_TEAM_SURVIVOR ) + if ( survivors.len() > 0 ) + { + SetRespawnsEnabled( false ) + SetKillcamsEnabled( false ) + SetRoundWinningKillReplayAttacker(survivors[ 0 ]) return INFECTION_TEAM_SURVIVOR + } return INFECTION_TEAM_INFECTED } diff --git a/Northstar.Custom/mod/scripts/vscripts/sh_custom_air_accel.gnut b/Northstar.Custom/mod/scripts/vscripts/sh_custom_air_accel.gnut index faa92480..2ce93013 100644 --- a/Northstar.Custom/mod/scripts/vscripts/sh_custom_air_accel.gnut +++ b/Northstar.Custom/mod/scripts/vscripts/sh_custom_air_accel.gnut @@ -8,7 +8,9 @@ void function CustomAirAccelVars_Init() #if SERVER AddCallback_OnPlayerRespawned( ApplyCustomPlayerAirAccel ) - AddCallback_OnPilotBecomesTitan( ApplyCustomPlayerAirAccelFromTitan ) // not sure if necessary but assuming it is + AddCallback_OnTitanBecomesPilot( ApplyCustomPlayerAirAccelFromTitan ) // airaccel is reset after player leaves titan + AddCallback_OnPilotBecomesTitan( ApplyCustomPlayerAirAccelFromTitan ) // airaccel is also reset after player enters titan + AddCallback_OnPlayerGetsNewPilotLoadout( ApplyCustomPlayerAirAccelOnLoadoutChange ) // airaccel is also reset on loadout change for some reason #endif } @@ -22,4 +24,9 @@ void function ApplyCustomPlayerAirAccelFromTitan( entity player, entity titan ) { player.kv.airAcceleration = GetCurrentPlaylistVarInt( "custom_air_accel_pilot", int( player.GetPlayerSettingsField( "airAcceleration" ) ) ) } -#endif
\ No newline at end of file + +void function ApplyCustomPlayerAirAccelOnLoadoutChange( entity player, PilotLoadoutDef loadout ) +{ + player.kv.airAcceleration = GetCurrentPlaylistVarInt( "custom_air_accel_pilot", int( player.GetPlayerSettingsField( "airAcceleration" ) ) ) +} +#endif diff --git a/Northstar.Custom/mod/scripts/vscripts/sh_custom_pilot_collision.gnut b/Northstar.Custom/mod/scripts/vscripts/sh_custom_pilot_collision.gnut new file mode 100644 index 00000000..b33a4c02 --- /dev/null +++ b/Northstar.Custom/mod/scripts/vscripts/sh_custom_pilot_collision.gnut @@ -0,0 +1,32 @@ +global function CustomPilotCollision_InitPlaylistVars + +void function CustomPilotCollision_InitPlaylistVars() +{ + AddPrivateMatchModeSettingEnum( "#MODE_SETTING_CATEGORY_PILOT", "no_pilot_collision", [ "#SETTING_DISABLED", "#SETTING_ENABLED" ], "0" ) + +#if SERVER + AddCallback_OnPlayerRespawned( SetPilotCollisionFlagsForRespawn ) + AddCallback_OnPilotBecomesTitan( PilotCollisionOnPilotBecomesTitan ) + AddCallback_OnTitanBecomesPilot( PilotCollisionOnTitanBecomesPilot ) +#endif +} + +#if SERVER +void function SetPilotCollisionFlagsForRespawn( entity player ) +{ + if ( GetCurrentPlaylistVarInt( "no_pilot_collision", 0 ) == 1 ) + player.kv.CollisionGroup = TRACE_COLLISION_GROUP_BLOCK_WEAPONS +} + +void function PilotCollisionOnPilotBecomesTitan( entity player, entity titan ) +{ + if ( GetCurrentPlaylistVarInt( "no_pilot_collision", 0 ) == 1 ) + player.kv.CollisionGroup = TRACE_COLLISION_GROUP_PLAYER +} + +void function PilotCollisionOnTitanBecomesPilot( entity player, entity titan ) +{ + if ( GetCurrentPlaylistVarInt( "no_pilot_collision", 0 ) == 1 ) + player.kv.CollisionGroup = TRACE_COLLISION_GROUP_BLOCK_WEAPONS +} +#endif
\ No newline at end of file diff --git a/Northstar.CustomServers/mod/scripts/vscripts/burnmeter/_burnmeter.gnut b/Northstar.CustomServers/mod/scripts/vscripts/burnmeter/_burnmeter.gnut index 3eb6bda6..6d13c75b 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/burnmeter/_burnmeter.gnut +++ b/Northstar.CustomServers/mod/scripts/vscripts/burnmeter/_burnmeter.gnut @@ -34,13 +34,15 @@ void function BurnMeter_Init() // setup burncard use funcs
BurnReward_GetByRef( "burnmeter_amped_weapons" ).rewardAvailableCallback = PlayerUsesAmpedWeaponsBurncard
BurnReward_GetByRef( "burnmeter_smart_pistol" ).rewardAvailableCallback = PlayerUsesSmartPistolBurncard
- BurnReward_GetByRef( "burnmeter_emergency_battery" ).rewardAvailableCallback = PlayerUsesBatteryBurncard
+ BurnReward_GetByRef( "burnmeter_emergency_battery" ).rewardAvailableCallback = Burnmeter_EmergencyBattery
BurnReward_GetByRef( "burnmeter_radar_jammer" ).rewardAvailableCallback = PlayerUsesRadarJammerBurncard
BurnReward_GetByRef( "burnmeter_maphack" ).rewardAvailableCallback = PlayerUsesMaphackBurncard
BurnReward_GetByRef( "burnmeter_phase_rewind" ).rewardAvailableCallback = PlayerUsesPhaseRewindBurncard
// these ones aren't so important, they're either for fd ( unsupported rn ) or unused
- //BurnReward_GetByRef( "burnmeter_harvester_shield" ).rewardAvailableCallback =
+ BurnReward_GetByRef( "burnmeter_harvester_shield" ).rewardAvailableCallback = PlayerUsesHarvesterShieldBurncard
+ BurnReward_GetByRef( "burnmeter_amped_weapons_permanent" ).rewardAvailableCallback = PlayerUsesPermanentAmpedWeaponsBurncard
+ BurnReward_GetByRef( "burnmeter_instant_battery" ).rewardAvailableCallback = Burnmeter_AmpedBattery
BurnReward_GetByRef( "burnmeter_rodeo_grenade" ).rewardAvailableCallback = PlayerUsesRodeoGrenadeBurncard
BurnReward_GetByRef( "burnmeter_nuke_titan" ).rewardAvailableCallback = PlayerUsesNukeTitanBurncard // unused in vanilla, fun though
@@ -185,9 +187,13 @@ void function PhaseRewindLifetime( entity player ) void function RunBurnCardUseFunc( entity player, string itemRef )
{
+ print( itemRef )
+
void functionref( entity ) ornull func = BurnReward_GetByRef( itemRef ).rewardAvailableCallback
if ( func != null )
( expect void functionref( entity ) ( func ) )( player )
+ else
+ print( "tried to call usefunc for burncard " + itemRef + ", but func did not exist!" )
}
void function UseBurnCardWeapon( entity weapon, entity player )
@@ -214,6 +220,19 @@ void function UseBurnCardWeaponInCriticalSection( entity weapon, entity ownerPla void function BurnMeter_GiveRewardDirect( entity player, string itemRef )
{
+ BurnReward burncard = BurnReward_GetByRef( itemRef )
+
+ array<string> mods = [ "burn_card_weapon_mod" ]
+ if ( burncard.extraWeaponMod != "" )
+ mods.append( burncard.extraWeaponMod )
+
+ // ensure inventory slot isn't full to avoid crash
+ entity preexistingWeapon = player.GetOffhandWeapon( OFFHAND_INVENTORY )
+ if ( IsValid( preexistingWeapon ) )
+ player.TakeWeaponNow( preexistingWeapon.GetWeaponClassName() )
+
+ player.GiveOffhandWeapon( burncard.weaponName, OFFHAND_INVENTORY, mods )
+ Remote_CallFunction_Replay( player, "ServerCallback_RewardReadyMessage", player.s.respawnTime )
}
@@ -294,11 +313,6 @@ void function PlayerUsesSmartPistolBurncard( entity player ) // do we need to track the player losing smart pistol, then give their old weapon back? idk not implementing for now, check later
}
-void function PlayerUsesBatteryBurncard( entity player )
-{
- Rodeo_GiveBatteryToPlayer( player )
-}
-
void function PlayerUsesRadarJammerBurncard( entity player )
{
foreach ( entity otherPlayer in GetPlayerArray() )
@@ -425,6 +439,35 @@ void function PlayerUsesNukeBurncardThreaded( entity player ) PlayerEarnMeter_SetOwnedFrac( player, ownedFrac )
}
+void function PlayerUsesPermanentAmpedWeaponsBurncard( entity player )
+{
+ array<entity> weapons = player.GetMainWeapons()
+ //weapons.extend( player.GetOffhandWeapons() ) // idk? unsure of vanilla behaviour here
+ foreach ( entity weapon in weapons )
+ {
+ weapon.RemoveMod( "silencer" ) // both this and the burnmod will override firing fx, if a second one overrides this we crash
+ foreach ( string mod in GetWeaponBurnMods( weapon.GetWeaponClassName() ) )
+ {
+ // catch incompatibilities just in case
+ try
+ {
+ weapon.AddMod( mod )
+ }
+ catch( ex )
+ {
+ weapons.removebyvalue( weapon )
+ }
+ }
+
+ weapon.SetScriptFlags0( weapon.GetScriptFlags0() | WEAPONFLAG_AMPED )
+ }
+}
+
+void function PlayerUsesHarvesterShieldBurncard( entity player )
+{
+ player.SetPlayerNetInt( "numHarvesterShieldBoost", player.GetPlayerNetInt( "numHarvesterShieldBoost" ) + 1 )
+}
+
void function PlayerUsesRodeoGrenadeBurncard( entity player )
{
player.SetPlayerNetInt( "numSuperRodeoGrenades", player.GetPlayerNetInt( "numSuperRodeoGrenades" ) + 1 )
diff --git a/Northstar.CustomServers/mod/scripts/vscripts/earn_meter/sv_earn_meter_mp.gnut b/Northstar.CustomServers/mod/scripts/vscripts/earn_meter/sv_earn_meter_mp.gnut index 6682807b..4c42a825 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/earn_meter/sv_earn_meter_mp.gnut +++ b/Northstar.CustomServers/mod/scripts/vscripts/earn_meter/sv_earn_meter_mp.gnut @@ -166,18 +166,8 @@ void function EarnMeterMP_BoostEarned( entity player ) while ( burncard.ref == "burnmeter_random_foil" ) burncard = BurnReward_GetRandom() - - array<string> mods = [ "burn_card_weapon_mod" ] - if ( burncard.extraWeaponMod != "" ) - mods.append( burncard.extraWeaponMod ) - - // ensure inventory slot isn't full to avoid crash - entity preexistingWeapon = player.GetOffhandWeapon( OFFHAND_INVENTORY ) - if ( IsValid( preexistingWeapon ) ) - player.TakeWeaponNow( preexistingWeapon.GetWeaponClassName() ) - - player.GiveOffhandWeapon( burncard.weaponName, OFFHAND_INVENTORY, mods ) - Remote_CallFunction_Replay( player, "ServerCallback_RewardReadyMessage", player.s.respawnTime ) + + BurnMeter_GiveRewardDirect( player, burncard.ref ) } void function EarnMeterMP_TitanEarned( entity player ) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut index b5f700e5..8a6b8bf0 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut @@ -3,7 +3,7 @@ global function RateSpawnpoints_FD void function GamemodeFD_Init() { - + PrecacheModel( MODEL_ATTRITION_BANK ) } void function RateSpawnpoints_FD(int _0, array<entity> _1, int _2, entity _3) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_speedball.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_speedball.nut index 3bc11c3a..974481c1 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_speedball.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_speedball.nut @@ -21,6 +21,7 @@ void function GamemodeSpeedball_Init() AddSpawnCallbackEditorClass( "script_ref", "info_speedball_flag", CreateFlag ) + AddCallback_GameStateEnter( eGameState.Prematch, CreateFlagIfNoFlagSpawnpoint ) AddCallback_GameStateEnter( eGameState.Playing, ResetFlag ) AddCallback_OnTouchHealthKit( "item_flag", OnFlagCollected ) AddCallback_OnPlayerKilled( OnPlayerKilled ) @@ -114,6 +115,21 @@ void function DropFlag() file.flagCarrier = null } +void function CreateFlagIfNoFlagSpawnpoint() +{ + if ( IsValid( file.flag ) ) + return + + foreach ( entity hardpoint in GetEntArrayByClass_Expensive( "info_hardpoint" ) ) + { + if ( hardpoint.kv.hardpointGroup == "B" ) + { + CreateFlag( hardpoint ) + return + } + } +} + void function ResetFlag() { file.flag.ClearParent() diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_ttdm.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_ttdm.nut index c72fcb0d..417d0fbf 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_ttdm.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_ttdm.nut @@ -53,6 +53,7 @@ void function TTDMIntroShowIntermissionCam( entity player ) void function PlayerWatchesTTDMIntroIntermissionCam( entity player )
{
+ player.EndSignal( "OnDestroy" )
ScreenFadeFromBlack( player )
entity intermissionCam = GetEntArrayByClass_Expensive( "info_intermission" )[ 0 ]
diff --git a/Northstar.CustomServers/mod/scripts/vscripts/mp/_classic_mp_dropship_intro.gnut b/Northstar.CustomServers/mod/scripts/vscripts/mp/_classic_mp_dropship_intro.gnut index 8e624c14..1e19abd3 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/mp/_classic_mp_dropship_intro.gnut +++ b/Northstar.CustomServers/mod/scripts/vscripts/mp/_classic_mp_dropship_intro.gnut @@ -86,7 +86,7 @@ void function OnPrematchStart() foreach ( entity dropshipSpawn in validDropshipSpawns ) { // todo: possibly make this only spawn dropships if we've got enough players to need them - int createTeam = HasSwitchedSides() ? dropshipSpawn.GetTeam() : GetOtherTeam( dropshipSpawn.GetTeam() ) + int createTeam = HasSwitchedSides() ? GetOtherTeam( dropshipSpawn.GetTeam() ) : dropshipSpawn.GetTeam() array<IntroDropship> teamDropships = createTeam == TEAM_MILITIA ? file.militiaDropships : file.imcDropships if ( teamDropships.len() >= 2 ) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/mp/_gamestate_mp.nut b/Northstar.CustomServers/mod/scripts/vscripts/mp/_gamestate_mp.nut index 63ecbf68..598b4522 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/mp/_gamestate_mp.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/mp/_gamestate_mp.nut @@ -39,7 +39,9 @@ struct { bool roundWinningKillReplayTrackPilotKills = true bool roundWinningKillReplayTrackTitanKills = false - + + bool gameWonThisFrame + bool hasKillForGameWonThisFrame float roundWinningKillReplayTime entity roundWinningKillReplayVictim entity roundWinningKillReplayAttacker @@ -282,7 +284,7 @@ void function GameStateEnter_WinnerDetermined_Threaded() entity replayAttacker = file.roundWinningKillReplayAttacker bool doReplay = Replay_IsEnabled() && IsRoundWinningKillReplayEnabled() && IsValid( replayAttacker ) - && Time() - file.roundWinningKillReplayTime <= ROUND_WINNING_KILL_REPLAY_LENGTH_OF_REPLAY + && Time() - file.roundWinningKillReplayTime <= ROUND_WINNING_KILL_REPLAY_LENGTH_OF_REPLAY && winningTeam != TEAM_UNASSIGNED float replayLength = 2.0 // extra delay if no replay if ( doReplay ) @@ -541,12 +543,22 @@ void function ForceFadeToBlack( entity player ) void function OnPlayerKilled( entity victim, entity attacker, var damageInfo ) { if ( !GamePlayingOrSuddenDeath() ) - return + { + if ( file.gameWonThisFrame ) + { + if ( file.hasKillForGameWonThisFrame ) + return + } + else + return + } // set round winning killreplay info here if we're tracking pilot kills // todo: make this not count environmental deaths like falls, unsure how to prevent this if ( file.roundWinningKillReplayTrackPilotKills && victim != attacker && attacker != svGlobal.worldspawn && IsValid( attacker ) ) { + if ( file.gameWonThisFrame ) + file.hasKillForGameWonThisFrame = true file.roundWinningKillReplayTime = Time() file.roundWinningKillReplayVictim = victim file.roundWinningKillReplayAttacker = attacker @@ -555,6 +567,12 @@ void function OnPlayerKilled( entity victim, entity attacker, var damageInfo ) file.roundWinningKillReplayHealthFrac = GetHealthFrac( attacker ) } + if ( ( Riff_EliminationMode() == eEliminationMode.Titans || Riff_EliminationMode() == eEliminationMode.PilotsTitans ) && victim.IsTitan() ) // need an extra check for this + OnTitanKilled( victim, damageInfo ) + + if ( !GamePlayingOrSuddenDeath() ) + return + // note: pilotstitans is just win if enemy team runs out of either pilots or titans if ( IsPilotEliminationBased() || GetGameState() == eGameState.SuddenDeath ) { @@ -579,21 +597,28 @@ void function OnPlayerKilled( entity victim, entity attacker, var damageInfo ) SetWinner( GetOtherTeam( victim.GetTeam() ), "#GAMEMODE_ENEMY_PILOTS_ELIMINATED", "#GAMEMODE_FRIENDLY_PILOTS_ELIMINATED" ) } } - - if ( ( Riff_EliminationMode() == eEliminationMode.Titans || Riff_EliminationMode() == eEliminationMode.PilotsTitans ) && victim.IsTitan() ) // need an extra check for this - OnTitanKilled( victim, damageInfo ) } void function OnTitanKilled( entity victim, var damageInfo ) { if ( !GamePlayingOrSuddenDeath() ) - return + { + if ( file.gameWonThisFrame ) + { + if ( file.hasKillForGameWonThisFrame ) + return + } + else + return + } // set round winning killreplay info here if we're tracking titan kills // todo: make this not count environmental deaths like falls, unsure how to prevent this entity attacker = DamageInfo_GetAttacker( damageInfo ) if ( file.roundWinningKillReplayTrackTitanKills && victim != attacker && attacker != svGlobal.worldspawn && IsValid( attacker ) ) { + if ( file.gameWonThisFrame ) + file.hasKillForGameWonThisFrame = true file.roundWinningKillReplayTime = Time() file.roundWinningKillReplayVictim = victim file.roundWinningKillReplayAttacker = attacker @@ -601,6 +626,9 @@ void function OnTitanKilled( entity victim, var damageInfo ) file.roundWinningKillReplayTimeOfDeath = Time() file.roundWinningKillReplayHealthFrac = GetHealthFrac( attacker ) } + + if ( !GamePlayingOrSuddenDeath() ) + return // note: pilotstitans is just win if enemy team runs out of either pilots or titans if ( IsTitanEliminationBased() ) @@ -706,12 +734,16 @@ void function SetRoundWinningKillReplayAttacker( entity attacker ) file.roundWinningKillReplayTime = Time() file.roundWinningKillReplayHealthFrac = GetHealthFrac( attacker ) file.roundWinningKillReplayAttacker = attacker + file.roundWinningKillReplayTimeOfDeath = Time() } void function SetWinner( int team, string winningReason = "", string losingReason = "" ) { SetServerVar( "winningTeam", team ) + file.gameWonThisFrame = true + thread UpdateGameWonThisFrameNextFrame() + if ( winningReason.len() == 0 ) file.announceRoundWinnerWinningSubstr = 0 else @@ -739,6 +771,13 @@ void function SetWinner( int team, string winningReason = "", string losingReaso } } +void function UpdateGameWonThisFrameNextFrame() +{ + WaitFrame() + file.gameWonThisFrame = false + file.hasKillForGameWonThisFrame = false +} + void function AddTeamScore( int team, int amount ) { GameRules_SetTeamScore( team, GameRules_GetTeamScore( team ) + amount ) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_wargames.nut b/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_wargames.nut index 92307f3c..11587947 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_wargames.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_wargames.nut @@ -104,7 +104,8 @@ void function OnPrematchStart() entity militiaIon = CreatePropDynamic( $"models/titans/medium/titan_medium_ajax.mdl", < -1809.98, 2790.39, -1409 >, < 0, 80, 0 > ) thread PlayAnim( militiaIon, "at_titan_activation_wargames_intro" ) - + militiaIon.Anim_SetInitialTime( 4.5 ) + entity militiaPilot = CreateElitePilot( TEAM_UNASSIGNED, < 0, 0, 0 >, < 0, 0, 0 > ) DispatchSpawn( militiaPilot ) militiaPilot.SetParent( militiaIon, "HIJACK" ) @@ -116,7 +117,6 @@ void function OnPrematchStart() DispatchSpawn( militiaMarvinChillin ) thread PlayAnim( militiaMarvinChillin, "mv_idle_unarmed" ) - // imc grunts entity imcGrunt1 = CreatePropDynamic( $"models/humans/grunts/imc_grunt_rifle.mdl", < -2915, 2867, -1788 >, < 0, -137, 0 > ) thread PlayAnim( imcGrunt1, "pt_console_idle" ) @@ -188,6 +188,7 @@ void function PlayerWatchesWargamesIntro( entity player ) player.kv.VisibilityFlags = ENTITY_VISIBLE_TO_EVERYONE ClearPlayerAnimViewEntity( player ) player.EnableWeaponViewModel() + DeployAndEnableWeapons(player) player.ClearParent() player.UnforceStand() player.MovementEnable() @@ -224,15 +225,16 @@ void function PlayerWatchesWargamesIntro( entity player ) player.kv.VisibilityFlags = ENTITY_VISIBLE_TO_OWNER TrainingPod_ViewConeLock_PodClosed( player ) player.DisableWeaponViewModel() + HolsterAndDisableWeapons(player) player.MovementDisable() player.SetInvulnerable() - // spawn faction leader - // no clue why client subtracts 4.5 from the time we give this, so just add it here instead - if ( factionTeam == TEAM_IMC ) - Remote_CallFunction_NonReplay( player, "ServerCallback_SpawnIMCFactionLeaderForIntro", file.introStartTime + 4.5, playerPod.GetEncodedEHandle() ) + if ( factionTeam == TEAM_MILITIA && GetFactionChoice( player ) == "faction_marvin" ) + Remote_CallFunction_NonReplay( player, "ServerCallback_SpawnMilitiaFactionLeaderForIntro", file.introStartTime, playerPod.GetEncodedEHandle() ) + else if ( factionTeam == TEAM_MILITIA ) + Remote_CallFunction_NonReplay( player, "ServerCallback_SpawnMilitiaFactionLeaderForIntro", file.introStartTime + 1.75, playerPod.GetEncodedEHandle() ) else - Remote_CallFunction_NonReplay( player, "ServerCallback_SpawnMilitiaFactionLeaderForIntro", file.introStartTime + 4.5, playerPod.GetEncodedEHandle() ) + Remote_CallFunction_NonReplay( player, "ServerCallback_SpawnIMCFactionLeaderForIntro", file.introStartTime + 4.5, playerPod.GetEncodedEHandle() ) // idle pod sequence FirstPersonSequenceStruct podIdleSequence |