From 9c56bd60c35a73ec0fd3459b8dc57fae689d65c5 Mon Sep 17 00:00:00 2001 From: Dexter Date: Mon, 4 Nov 2013 06:08:40 +0000 Subject: [PATCH] start implementing actual team joinage action extreme (added basic con command clientside wrapper that sends to engine->ServerCmd for this) team finding & joining logic is in the team manager.. not player, might make too much sense! auto-join is WIP --- mp/src/game/server/ff/ff_sv_player.cpp | 99 +++++-------- mp/src/game/server/ff/ff_sv_player.h | 7 +- mp/src/game/shared/ff/ff_sh_player.cpp | 1 + mp/src/game/shared/ff/ff_sh_playercommands.h | 26 ++++ mp/src/game/shared/ff/ff_sh_team_manager.cpp | 147 ++++++++++++++++++- mp/src/game/shared/ff/ff_sh_team_manager.h | 6 + mp/src/game/shared/ff/ff_shared.vpc | 1 + 7 files changed, 219 insertions(+), 68 deletions(-) create mode 100644 mp/src/game/shared/ff/ff_sh_playercommands.h diff --git a/mp/src/game/server/ff/ff_sv_player.cpp b/mp/src/game/server/ff/ff_sv_player.cpp index f619c841..d6271b8f 100644 --- a/mp/src/game/server/ff/ff_sv_player.cpp +++ b/mp/src/game/server/ff/ff_sv_player.cpp @@ -25,6 +25,7 @@ #include "SoundEmitterSystem/isoundemittersystembase.h" #include "ilagcompensationmanager.h" +#include "ff_sh_team_manager.h" // Don't alias here #if defined( CFF_SH_Player ) @@ -947,79 +948,26 @@ void CFF_SV_Player::ChangeTeam( int iTeam ) } } -bool CFF_SV_Player::HandleCommand_JoinTeam( int team ) -{ - if ( !GetGlobalTeam( team ) || team == 0 ) - { - Warning( "HandleCommand_JoinTeam( %d ) - invalid team index.\n", team ); - return false; - } - - if ( team == TEAM_SPECTATOR ) - { - // Prevent this is the cvar is set - if ( !mp_allowspectators.GetInt() ) - { - ClientPrint( this, HUD_PRINTCENTER, "#Cannot_Be_Spectator" ); - return false; - } - - if ( GetTeamNumber() != TEAM_UNASSIGNED && !IsDead() ) - { - m_fNextSuicideTime = gpGlobals->curtime; // allow the suicide to work - - CommitSuicide(); - - // add 1 to frags to balance out the 1 subtracted for killing yourself - IncrementFragCount( 1 ); - } - - ChangeTeam( TEAM_SPECTATOR ); - - return true; - } - else - { - StopObserverMode(); - State_Transition(STATE_ACTIVE); - } - - // Switch their actual team... - ChangeTeam( team ); - - return true; -} - bool CFF_SV_Player::ClientCommand( const CCommand &args ) { - if ( FStrEq( args[0], "spectate" ) ) + if ( FStrEq( args[0], "spectate" ) || FStrEq( args[0], "team" ) ) { if ( ShouldRunRateLimitedCommand( args ) ) { - // instantly join spectators - HandleCommand_JoinTeam( TEAM_SPECTATOR ); - } - return true; - } - else if ( FStrEq( args[0], "jointeam" ) ) - { - if ( args.ArgC() < 2 ) - { - Warning( "Player sent bad jointeam syntax\n" ); - } + const char *team; - if ( ShouldRunRateLimitedCommand( args ) ) - { - int iTeam = atoi( args[1] ); - HandleCommand_JoinTeam( iTeam ); + if ( args.ArgC() < 2) // || FStrEq( args[0], "spectate" ) ) + return false; + if ( FStrEq( args[0], "spectate" ) ) + team = "spec"; + else + team = args[1]; + // let the team manager earn its namesake and handle that crap + return CFF_SH_TeamManager::HandlePlayerTeamCommand( *this, team ); } return true; } - else if ( FStrEq( args[0], "joingame" ) ) - { - return true; - } - + return BaseClass::ClientCommand( args ); } @@ -1589,4 +1537,27 @@ bool CFF_SV_Player::CanHearAndReadChatFrom( CBasePlayer *pPlayer ) return false; return true; +} + + +// called by team manager once a valid team is found, but before switching, +// do any eg class cleanup here etc +void CFF_SV_Player::PreChangeTeam( int iOldTeam, int iNewTeam ) +{ + // set team unassigned + // set class unassigned + // remove items + // special infection stuff, + // force uncloak lol + // clear state (might do w/ player func) + // check kill + // lua player_killed +} + +// called by team manager once a valid team is found, and after new team set +// do any init and respawn etc +void CFF_SV_Player::PostChangeTeam( int iOldTeam, int iNewTeam ) +{ + // reset state + // spawn called } \ No newline at end of file diff --git a/mp/src/game/server/ff/ff_sv_player.h b/mp/src/game/server/ff/ff_sv_player.h index f96bee4c..1425fc56 100644 --- a/mp/src/game/server/ff/ff_sv_player.h +++ b/mp/src/game/server/ff/ff_sv_player.h @@ -58,7 +58,7 @@ public: virtual void PreThink( void ); virtual void PlayerDeathThink( void ); virtual void SetAnimation( PLAYER_ANIM playerAnim ); - virtual bool HandleCommand_JoinTeam( int team ); + //virtual bool HandleCommand_Class( const char* className ); virtual bool ClientCommand( const CCommand &args ); virtual void CreateViewModel( int viewmodelindex = 0 ); virtual bool BecomeRagdollOnClient( const Vector &force ); @@ -137,7 +137,10 @@ public: virtual bool CanHearAndReadChatFrom( CBasePlayer *pPlayer ); - + // called by team manager once a valid team is found, but before switching + void PreChangeTeam( int iOldTeam, int iNewTeam ); + // called by team manager once a valid team is found, and after new team set + void PostChangeTeam( int iOldTeam, int iNewTeam ); private: CNetworkQAngle( m_angEyeAngles ); diff --git a/mp/src/game/shared/ff/ff_sh_player.cpp b/mp/src/game/shared/ff/ff_sh_player.cpp index fc2925ab..715a4938 100644 --- a/mp/src/game/shared/ff/ff_sh_player.cpp +++ b/mp/src/game/shared/ff/ff_sh_player.cpp @@ -15,6 +15,7 @@ #include "ff_sv_player.h" #endif +#include "ff_sh_playercommands.h" #include "engine/IEngineSound.h" #include "SoundEmitterSystem/isoundemittersystembase.h" diff --git a/mp/src/game/shared/ff/ff_sh_playercommands.h b/mp/src/game/shared/ff/ff_sh_playercommands.h new file mode 100644 index 00000000..ca5f625a --- /dev/null +++ b/mp/src/game/shared/ff/ff_sh_playercommands.h @@ -0,0 +1,26 @@ +#pragma once +#include "cbase.h" +#include "ff_sh_player.h" +#include + +#define FF_COMMAND(cmd, desc) \ + void CliCmdFunc_##cmd(const CCommand &args) \ + { \ + std::string fullcmd; \ + for(int i = 0; i < args.ArgC(); i++) \ + { \ + if(i > 0) \ + fullcmd += ' '; \ + fullcmd += args.Arg(i); \ + } \ + engine->ServerCmd(fullcmd.c_str()); \ + } \ + static ConCommand CliCmd_##cmd(#cmd, CliCmdFunc_##cmd, desc ); + +#ifdef CLIENT_DLL +FF_COMMAND(team, "join a team"); +FF_COMMAND(class, "set player class"); +#endif +//FF_AUTO_COMMAND(ff_testcmd, TestCommand_f, "a test command", FCV +//ConCommand cc_ff_testcmd("ff_testcmd", + diff --git a/mp/src/game/shared/ff/ff_sh_team_manager.cpp b/mp/src/game/shared/ff/ff_sh_team_manager.cpp index 64905da8..109fe6e5 100644 --- a/mp/src/game/shared/ff/ff_sh_team_manager.cpp +++ b/mp/src/game/shared/ff/ff_sh_team_manager.cpp @@ -8,7 +8,6 @@ // memdbgon must be the last include file in a .cpp file!!! #include "tier0/memdbgon.h" - #ifdef GAME_DLL static void ClassRestrictionChange( IConVar *var, const char *pOldString, float fOldVal ); @@ -59,7 +58,7 @@ static void ClassRestrictionChange( IConVar *var, const char *pOldString, float int idx = -1; for ( int i = 0; i < CLASS_COUNT; i ++) { - if ( Q_strcmp( conVar->GetName(), classRestrictionCvars[i].GetName() ) == 0 ) + if ( FStrEq( conVar->GetName(), classRestrictionCvars[i].GetName() ) ) { idx = i; break; @@ -223,6 +222,148 @@ int CFF_SH_TeamManager::GetTeamLimits( void ) return m_iMaxPlayers; } +#ifdef GAME_DLL +bool CFF_SH_TeamManager::HandlePlayerTeamCommand( CFF_SV_Player &pPlayer, const char *pTeamName ) +{ + if ( !pTeamName ) + return false; + + int iOldTeam = pPlayer.GetTeamNumber(); + int iTeam = TEAM_UNASSIGNED; + + if ( FStrEq( pTeamName, "auto" ) ) + { + iTeam = PickAutoJoinTeam( ); + } + else if ( FStrEq( pTeamName, "spec" ) ) + { + iTeam = TEAM_SPECTATOR; + } + else if ( FStrEq( pTeamName, "red" ) ) + { + iTeam = TEAM_RED; + } + else if ( FStrEq( pTeamName, "blue" ) ) + { + iTeam = TEAM_BLUE; + } + else if ( FStrEq( pTeamName, "yellow" ) ) + { + iTeam = TEAM_YELLOW; + } + else if ( FStrEq( pTeamName, "green" ) ) + { + iTeam = TEAM_GREEN; + } + else if ( FStrEq( pTeamName, "custom1" ) ) + { + iTeam = TEAM_CUSTOM1; + } + else if ( FStrEq( pTeamName, "custom2" ) ) + { + iTeam = TEAM_CUSTOM2; + } + else if ( FStrEq( pTeamName, "custom3" ) ) + { + iTeam = TEAM_CUSTOM3; + } + else if ( FStrEq( pTeamName, "custom4" ) ) + { + iTeam = TEAM_CUSTOM4; + } + else if ( FStrEq( pTeamName, "custom5" ) ) + { + iTeam = TEAM_CUSTOM5; + } + else if ( FStrEq( pTeamName, "custom6" ) ) + { + iTeam = TEAM_CUSTOM6; + } + else if ( FStrEq( pTeamName, "custom7" ) ) + { + iTeam = TEAM_CUSTOM7; + } + else if ( FStrEq( pTeamName, "custom8" ) ) + { + iTeam = TEAM_CUSTOM8; + } + else + { + // no known hardcoded team name, + // try to find team by current team names just for the hell of it + for ( int i = 0; i < g_Teams.Count(); ++i ) + { + if (!g_Teams[i]) + continue; + if ( FStrEq( g_Teams[i]->GetName(), pTeamName ) ) + { + iTeam = g_Teams[i]->GetTeamNumber( ); + break; + } + } + } + + if ( iTeam == TEAM_UNASSIGNED ) + { + // TODO: say nothin' found poor sap + return false; + } + + // check stupid stuff first + if ( iOldTeam == iTeam ) + { + // wants to join same team + return false; + } + + CFF_SH_TeamManager *pTeam = GetGlobalFFTeam( iTeam ); + if ( !pTeam ) + { + // non active team or something fucked + return false; + } + + // make sure isnt full + if ( pTeam->IsTeamFull() ) + { + return false; + } + + // TODO: Lua player_switchteam predicate here + + // refactored this, so each step of the process is seperate chunks, + // since so much per-class state is handled in each + pPlayer.PreChangeTeam( iOldTeam, iTeam ); + pPlayer.ChangeTeam( iTeam ); + pPlayer.PostChangeTeam( iOldTeam, iTeam ); + return true; +} + +// fun fact, on ep1 code this was called UTIL_PickRandomTeam, but it wasnt random, it was auto join +int CFF_SH_TeamManager::PickAutoJoinTeam( ) +{ + // TODO: + return TEAM_BLUE; +} + +bool CFF_SH_TeamManager::IsTeamFull() const +{ + if (m_iMaxPlayers == 0) + return false; + + int numActive = 0; + for( int i = 1; i <= gpGlobals->maxClients; i++ ) + { + CFF_SV_Player *pPlayer = (CFF_SV_Player *) UTIL_PlayerByIndex( i ); + if( pPlayer && pPlayer->GetTeamNumber( ) == GetTeamNumber( ) ) + numActive++; + } + + return numActive > m_iMaxPlayers; +} + +#endif + //ConCommand ff_team( "ff_team", //ConCommand ff_team( "ffdbg_dump_teams", #if defined (_DEBUG) && defined (GAME_DLL) @@ -246,3 +387,5 @@ void DebugSetTeamName_f( const CCommand &args ) } ConCommand cc_ffdbg_setteamname("ffdbg_set_team_name", DebugSetTeamName_f); #endif + + diff --git a/mp/src/game/shared/ff/ff_sh_team_manager.h b/mp/src/game/shared/ff/ff_sh_team_manager.h index 837db784..43ef5ede 100644 --- a/mp/src/game/shared/ff/ff_sh_team_manager.h +++ b/mp/src/game/shared/ff/ff_sh_team_manager.h @@ -5,10 +5,12 @@ #pragma once #endif +#include "cbase.h" #include "ff_sh_shareddefs.h" #ifdef GAME_DLL #include "team.h" +#include "ff_sv_player.h" #else #include "c_team.h" #define CTeam C_Team @@ -61,6 +63,10 @@ public: void UpdateClassLimit( int idx ); void UpdateAllClassLimits( void ); + static bool HandlePlayerTeamCommand( CFF_SV_Player &pPlayer, const char* pTeam ); + static int PickAutoJoinTeam( ); + + bool IsTeamFull() const; #endif // GAME_DLL // shared getters diff --git a/mp/src/game/shared/ff/ff_shared.vpc b/mp/src/game/shared/ff/ff_shared.vpc index 7c7562c5..6e414aaa 100644 --- a/mp/src/game/shared/ff/ff_shared.vpc +++ b/mp/src/game/shared/ff/ff_shared.vpc @@ -27,6 +27,7 @@ $Project { $File "$SRCDIR\game\shared\ff\ff_sh_player.cpp" $File "$SRCDIR\game\shared\ff\ff_sh_player.h" + $File "$SRCDIR\game\shared\ff\ff_sh_playercommands.h" } $Folder "Game" {