Skip to content

Commit

Permalink
Add button to allow players to change teams (#872)
Browse files Browse the repository at this point in the history
Adds button and logic to allow players to switch teams. This is a feature used in FSU and popular on many servers.
Team switch is disabled via script for some gamemodes where switching teams does not make sense.
  • Loading branch information
Zanieon authored Nov 22, 2024
1 parent aba62bf commit 13211e9
Show file tree
Hide file tree
Showing 6 changed files with 83 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -312,6 +312,12 @@ Press Yes if you agree to this. This choice can be changed in the mods menu at a
// In-game chat
"HUD_CHAT_WHISPER_PREFIX" "[WHISPER]"
"HUD_CHAT_SERVER_PREFIX" "[SERVER]"

// Team Switching
"TEAMSWITCH_GAMEMODE" "Gamemode does not allow Team Switching"
"TEAMSWITCH_BUFFER" "Team Switching is on Cooldown"
"TEAMSWITCH_GAMEPLAY" "Team change not allowed outside playing phase"
"TEAMSWITCH_DISABLED" "Current gamemode doesn't support team change"

"NO_GAMESERVER_RESPONSE" "Couldn't reach game server"
"BAD_GAMESERVER_RESPONSE" "Game server gave an invalid response"
Expand Down
21 changes: 21 additions & 0 deletions Northstar.Client/mod/scripts/vscripts/ui/menu_ingame.nut
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,9 @@ void function InitInGameMPMenu()
var gameHeader = AddComboButtonHeader( comboStruct, headerIndex, "#MENU_HEADER_GAME" )
var leaveButton = AddComboButton( comboStruct, headerIndex, buttonIndex++, "#LEAVE_MATCH" )
Hud_AddEventHandler( leaveButton, UIE_CLICK, OnLeaveButton_Activate )
var teamChangeButton = AddComboButton( comboStruct, headerIndex, buttonIndex++, "#SWITCH_TEAMS" )
Hud_AddEventHandler( teamChangeButton, UIE_CLICK, OnRequestTeamSwitch )
thread UpdateTeamSwitchButton_Threaded( teamChangeButton )
#if DEV
var devButton = AddComboButton( comboStruct, headerIndex, buttonIndex++, "Dev" )
Hud_AddEventHandler( devButton, UIE_CLICK, AdvanceMenuEventHandler( GetMenu( "DevMenu" ) ) )
Expand Down Expand Up @@ -700,3 +703,21 @@ void function SetTitanSelectButtonVisibleState( bool state )
Hud_Hide( file.titanSelectButton )
}
}

void function UpdateTeamSwitchButton_Threaded( var button )
{
while ( true )
{
Hud_SetLocked( button, !GetConVarBool( "ns_allow_team_change" ) )
wait 0.5
}
}

void function OnRequestTeamSwitch( var button )
{
if ( !Hud_IsLocked( button ) )
{
ClientCommand( "changeteam" )
CloseAllMenus()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ void function GamemodeHidden_Init()
SetLoadoutGracePeriodEnabled( false ) // prevent modifying loadouts with grace period
SetWeaponDropsEnabled( false )
SetRespawnsEnabled( false )
SetGamemodeAllowsTeamSwitch( false )
Riff_ForceTitanAvailability( eTitanAvailability.Never )
Riff_ForceBoostAvailability( eBoostAvailability.Disabled )
Riff_ForceSetEliminationMode( eEliminationMode.Pilots )
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ void function GamemodeInfection_Init()
SetSpawnpointGamemodeOverride( FFA )
SetLoadoutGracePeriodEnabled( false ) // prevent modifying loadouts with grace period
SetWeaponDropsEnabled( false )
SetGamemodeAllowsTeamSwitch( false )
SetShouldUseRoundWinningKillReplay( true )
Riff_ForceTitanAvailability( eTitanAvailability.Never )
Riff_ForceBoostAvailability( eBoostAvailability.Disabled )
Expand Down
5 changes: 5 additions & 0 deletions Northstar.CustomServers/mod.json
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,11 @@
"Name": "ns_progression_enabled",
"DefaultValue": "0",
"Flags": "ARCHIVE_PLAYERPROFILE"
},
{
"Name": "ns_allow_team_change",
"DefaultValue": "1",
"Flags": "REPLICATED"
}
],
"Scripts": [
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ global function TrackTitanDamageInPlayerGameStat
global function ShouldEntTakeDamage_SPMP
global function GetTitanBuildTime
global function TitanPlayerHotDropsIntoLevel
global function SetGamemodeAllowsTeamSwitch

global function SetRecalculateRespawnAsTitanStartPointCallback

Expand All @@ -30,10 +31,13 @@ struct {
array<entity> specCams

entity functionref( entity player, entity basePoint ) recalculateRespawnAsTitanStartPointCallback
table<entity, float> playerChangeTeamTimeBuffer
bool gamemodeTeamSwitchEnabled = true
} file

void function BaseGametype_Init_MPSP()
{
AddClientCommandCallback( "changeteam", ClientCommandCallbackChangeTeam )
AddSpawnCallback( "info_intermission", SetIntermissionCamera )

AddPostDamageCallback( "player", AddToTitanDamageStat )
Expand Down Expand Up @@ -630,6 +634,51 @@ void function SetRecalculateRespawnAsTitanStartPointCallback( entity functionref
file.recalculateRespawnAsTitanStartPointCallback = callbackFunc
}

void function SetGamemodeAllowsTeamSwitch( bool enabled )
{
file.gamemodeTeamSwitchEnabled = enabled
}

bool function ClientCommandCallbackChangeTeam( entity player, array<string> args )
{
if ( !GetConVarBool( "ns_allow_team_change" ) || IsPrivateMatchSpectator( player ) )
return true

if ( !file.gamemodeTeamSwitchEnabled )
{
SendHudMessage( player, "#TEAMSWITCH_GAMEMODE", -1, 0.4, 255, 255, 255, 255, 0.15, 3.0, 0.5 )
return true
}

if ( !( player in file.playerChangeTeamTimeBuffer ) )
{
file.playerChangeTeamTimeBuffer[ player ] <- Time() + 5.0
}
else
{
if ( file.playerChangeTeamTimeBuffer[ player ] > Time() )
{
SendHudMessage( player, "#TEAMSWITCH_BUFFER", -1, 0.4, 255, 255, 255, 255, 0.15, 3.0, 0.5 )
return true
}
}

if ( player in file.playerChangeTeamTimeBuffer && file.playerChangeTeamTimeBuffer[ player ] < Time() )
file.playerChangeTeamTimeBuffer[ player ] = Time() + 5.0

if ( !GamePlaying() )
{
SendHudMessage( player, "#TEAMSWITCH_GAMEPLAY", -1, 0.4, 255, 255, 255, 255, 0.15, 3.0, 0.5 )
return true
}
if ( GetCurrentPlaylistVarInt( "max_teams", 0 ) > 1 && !IsFFAGame() )
SetTeam( player, GetOtherTeam( player.GetTeam() ) )
else
SendHudMessage( player, "#TEAMSWITCH_DISABLED", -1, 0.4, 255, 255, 255, 255, 0.15, 3.0, 0.5 )

return true
}

// stuff to change later

bool function ShouldEntTakeDamage_SPMP( entity ent, var damageInfo )
Expand Down

0 comments on commit 13211e9

Please sign in to comment.