From 7f3a00c97164f89f905b11ac6fb65c093f94ba9b Mon Sep 17 00:00:00 2001 From: mittorn Date: Thu, 13 Oct 2016 16:34:38 +0300 Subject: [PATCH] Working reconnect mechanizm --- dlls/client.cpp | 18 ++++++++++++++---- dlls/multiplay_gamerules.cpp | 6 +++--- dlls/triggers.cpp | 30 ++++++++++++++++++++---------- 3 files changed, 37 insertions(+), 17 deletions(-) diff --git a/dlls/client.cpp b/dlls/client.cpp index 2c133394..178b6b91 100644 --- a/dlls/client.cpp +++ b/dlls/client.cpp @@ -83,14 +83,14 @@ BOOL ClientConnect( edict_t *pEntity, const char *pszName, const char *pszAddres CBasePlayer *pl = (CBasePlayer *)CBaseEntity::Instance( pEntity ) ; if( pl ) { - pl->m_state = STATE_CONNECTED; + pl->m_state = STATE_UNINITIALIZED; pl->RemoveAllItems( TRUE ); BecomeSpectator( pl ); - ClientPutInServer( pl->edict() ); + //ClientPutInServer( pl->edict() ); } } - g_engfuncs.pfnQueryClientCvarValue2( pEntity, "touch_enable", 111 ); + //g_engfuncs.pfnQueryClientCvarValue2( pEntity, "touch_enable", 111 ); return g_pGameRules->ClientConnected( pEntity, pszName, pszAddress, szRejectReason ); @@ -698,7 +698,7 @@ void ServerActivate( edict_t *pEdictList, int edictCount, int clientMax ) plr->m_state = STATE_UNINITIALIZED; plr->RemoveAllItems( TRUE ); BecomeSpectator( plr ); - plr->Spawn(); + //plr->Spawn(); } } } @@ -719,6 +719,9 @@ void PlayerPreThink( edict_t *pEntity ) entvars_t *pev = &pEntity->v; CBasePlayer *pPlayer = (CBasePlayer *)GET_PRIVATE(pEntity); + if( !pPlayer ) + ClientPutInServer( pEntity ); + if (pPlayer) pPlayer->PreThink( ); } @@ -742,6 +745,7 @@ void PlayerPostThink( edict_t *pEntity ) } void CoopClearData( void ); +void CoopApplyData( void ); void CoopClearWeaponList( void ); void ParmsNewLevel( void ) { @@ -749,7 +753,10 @@ void ParmsNewLevel( void ) SAVERESTOREDATA *pSaveData = (SAVERESTOREDATA *)gpGlobals->pSaveData; if ( pSaveData ) + { pSaveData->connectionCount = BuildChangeList( pSaveData->levelList, MAX_LEVEL_CONNECTIONS ); + CoopApplyData(); + } else if( mp_coop_changelevel.value ) { @@ -766,7 +773,10 @@ void ParmsChangeLevel( void ) SAVERESTOREDATA *pSaveData = (SAVERESTOREDATA *)gpGlobals->pSaveData; if ( pSaveData ) + { pSaveData->connectionCount = BuildChangeList( pSaveData->levelList, MAX_LEVEL_CONNECTIONS ); + CoopApplyData(); + } else if( mp_coop_changelevel.value ) { diff --git a/dlls/multiplay_gamerules.cpp b/dlls/multiplay_gamerules.cpp index d6528e96..801bf029 100644 --- a/dlls/multiplay_gamerules.cpp +++ b/dlls/multiplay_gamerules.cpp @@ -740,11 +740,11 @@ void CHalfLifeMultiplay::PlayerThink( CBasePlayer *pPlayer ) if( pPlayer->m_afButtonPressed & ( IN_DUCK | IN_ATTACK | IN_ATTACK2 | IN_USE | IN_JUMP ) ) SpawnPlayer( pPlayer ); if( pPlayer->m_state == STATE_UNINITIALIZED ) - if( pPlayer->m_afButtonPressed ) + if( pPlayer->m_afButtonPressed || pPlayer->pev->button ) { - //ClientPutInServer( pPlayer->edict() ); + ClientPutInServer( pPlayer->edict() ); // clean prediction lags after changelevel - CLIENT_COMMAND( pPlayer->edict(), "reconnect\n" ); + //CLIENT_COMMAND( pPlayer->edict(), "reconnect\n" ); pPlayer->m_afButtonPressed = 0; return; } diff --git a/dlls/triggers.cpp b/dlls/triggers.cpp index 70da4ef6..ee038c3e 100644 --- a/dlls/triggers.cpp +++ b/dlls/triggers.cpp @@ -1495,7 +1495,8 @@ struct SavedCoords bool trainsaved; Vector trainoffset; char trainglobal[256]; -} g_SavedCoords; +} g_SavedCoords, s_SavedCoords; + void CoopClearData( void ) @@ -1505,6 +1506,11 @@ void CoopClearData( void ) g_SavedCoords = l_SavedCoords; } +void CoopApplyData( void ) +{ + g_SavedCoords = s_SavedCoords; +} + int g_iMenu; void ShowMenu( CBasePlayer *pPlayer, const char *title, int count, const char **slot, signed char time = -1 ); @@ -1868,7 +1874,7 @@ void CChangeLevel::ChangeLevelNow( CBaseEntity *pActivator ) if( !strcmp( m_szMapName, mp_coop_disabledmap.string ) ) { UTIL_HudMessageAll( params, UTIL_VarArgs( "MAP %S IS DISABLED", m_szMapName ) ); - + return; } // forget touch by some fool if( gpGlobals->time - pev->dmgtime > 30) @@ -1997,7 +2003,7 @@ void CChangeLevel::ChangeLevelNow( CBaseEntity *pActivator ) } CoopSaveTrain( pActivator, &l_SavedCoords ); - g_SavedCoords = l_SavedCoords; + s_SavedCoords = l_SavedCoords; @@ -2054,8 +2060,8 @@ void CChangeLevel::ChangeLevelNow( CBaseEntity *pActivator ) if( !FNullEnt( pentLandmark ) ) { strcpy( st_szNextSpot, m_szLandmarkName ); - strcpy( g_SavedCoords.landmark, m_szLandmarkName ); - g_SavedCoords.offset = gpGlobals->vecLandmarkOffset = VARS( pentLandmark )->origin; + strcpy( s_SavedCoords.landmark, m_szLandmarkName ); + s_SavedCoords.offset = gpGlobals->vecLandmarkOffset = VARS( pentLandmark )->origin; } //ALERT( at_console, "Level touches %d levels\n", ChangeList( levels, 16 ) ); @@ -2070,19 +2076,23 @@ void CChangeLevel::ChangeLevelNow( CBaseEntity *pActivator ) // reset all players state if( plr ) { - plr->m_state = STATE_CONNECTED; + plr->m_state = STATE_UNINITIALIZED; plr->RemoveAllItems( TRUE ); BecomeSpectator( plr ); - plr->SetThink( &CBasePlayer::Spawn ); - plr->pev->nextthink = gpGlobals->time + 1; - //CLIENT_COMMAND( plr->edict(), "connect the-swank.pp.ua:27017\n" ); + //plr->SetThink( &CBasePlayer::Spawn ); + //plr->pev->nextthink = gpGlobals->time + 1; + // HACK: force perform reconnection + CLIENT_COMMAND( plr->edict(), "reconnect\n" ); + + //CLIENT_COMMAND( plr->edict(), "alias cmd \"reconnect;unalias cmd\"\n" ); //MESSAGE_BEGIN( MSG_ONE, 2, NULL, plr->pev ); // svc_disconnect after stufftext //MESSAGE_END(); //SERVER_COMMAND( UTIL_VarArgs( "kick %d\n", i-1 ) ); //SERVER_EXECUTE(); } } - CHANGE_LEVEL( st_szNextMap, st_szNextSpot ); + SERVER_COMMAND( UTIL_VarArgs( "wait;wait;wait;wait;wait;changelevel %s %s\n", st_szNextMap, st_szNextSpot ) ); + //CHANGE_LEVEL( st_szNextMap, st_szNextSpot ); } //