diff --git a/dlls/coop.cpp b/dlls/coop.cpp index 502745cd..c03f96db 100644 --- a/dlls/coop.cpp +++ b/dlls/coop.cpp @@ -357,6 +357,130 @@ void COOP_ApplyData( void ) } +// use this to translate GGMMapOffset during changelevel +struct GGMLandmarkTransition +{ + char sourceMap[32]; + char targetMap[32]; + char landmarkName[32]; + Vector vecLandmark; +}; + +// offset for all maps relative to current map +struct GGMMapState +{ + struct GGMMapState *pNext; + char mapName[32]; + Vector vecOffset; +}; + +GGMMapState *g_pMapOffsets; +GGMLandmarkTransition g_landmarkTransition; +edict_t *COOP_FindLandmark( const char *pLandmarkName ); +bool COOP_ProcessTransition( void ) +{ + bool fAddCurrent = true; + edict_t *landmark; + + if( !mp_coop.value ) + return false; + + if( !g_landmarkTransition.landmarkName[0] ) + return false; + + if( strcmp( g_landmarkTransition.targetMap, STRING(gpGlobals->mapname) ) ) + return false; + landmark = COOP_FindLandmark( g_landmarkTransition.landmarkName ); + if( !landmark ) + return false; + Vector &lm = landmark->v.origin; + + for( GGMMapState *pOffset = g_pMapOffsets; pOffset; pOffset = pOffset->pNext ) + { + if( !strcmp( pOffset->mapName, STRING(gpGlobals->mapname) ) ) + { + pOffset->vecOffset = Vector( 0, 0, 0 ); + fAddCurrent = false; + continue; + } + pOffset->vecOffset = pOffset->vecOffset - g_landmarkTransition.vecLandmark + lm; + } + + if( fAddCurrent ) + { + GGMMapState *pNewOffset = (GGMMapState *)calloc(1, sizeof( struct GGMMapState ) ); + + pNewOffset->pNext = g_pMapOffsets; + pNewOffset->vecOffset = Vector(0, 0, 0); + strncpy(pNewOffset->mapName, STRING(gpGlobals->mapname), 31); + g_pMapOffsets = pNewOffset; + } + return true; +} + +void COOP_SetupLandmarkTransition( const char *szNextMap, const char *szNextSpot, Vector vecLandmarkOffset ) +{ + strncpy(g_landmarkTransition.sourceMap, STRING(gpGlobals->mapname), 31 ); + strncpy(g_landmarkTransition.targetMap, szNextMap, 31 ); + strncpy(g_landmarkTransition.landmarkName, szNextSpot, 31 ); + g_landmarkTransition.vecLandmark = vecLandmarkOffset; +} + +void COOP_ServerActivate( void ) +{ + if( !COOP_ProcessTransition() ) + { + ALERT( at_console, "Transition failed, new game started\n"); + while( g_pMapOffsets ) + { + GGMMapState *pOffset = g_pMapOffsets; + g_pMapOffsets = pOffset->pNext; + free( pOffset ); + } + GGMMapState *pNewOffset = (GGMMapState *)calloc(1, sizeof( struct GGMMapState ) ); + + pNewOffset->pNext = g_pMapOffsets; + pNewOffset->vecOffset = Vector(0, 0, 0); + strncpy(pNewOffset->mapName, STRING(gpGlobals->mapname), 31); + g_pMapOffsets = pNewOffset; + if( mp_coop.value ) + COOP_ClearData(); + } + else if( mp_coop.value ) COOP_ApplyData(); + + + if( mp_coop.value ) + { + for( int i = 1; i <= gpGlobals->maxClients; i++ ) + { + CBasePlayer *plr = (CBasePlayer*)UTIL_PlayerByIndex( i ); + + // reset all players state + if( plr ) + { + plr->gravgunmod_data.m_state = STATE_UNINITIALIZED; + plr->RemoveAllItems( TRUE ); + UTIL_BecomeSpectator( plr ); + //plr->Spawn(); + } + } + } + g_landmarkTransition.landmarkName[0] = false; +} + +bool COOP_GetOrigin( Vector *pvecNewOrigin, const Vector &vecOrigin, const char *pszMapName ) +{ + for( GGMMapState *pOffset = g_pMapOffsets; pOffset; pOffset = pOffset->pNext ) + { + if( !strcmp( pOffset->mapName, pszMapName ) ) + { + *pvecNewOrigin = vecOrigin + pOffset->vecOffset; + return true; + } + } + + return false; +} int g_iVote; diff --git a/dlls/coop_util.h b/dlls/coop_util.h index 31db3025..4031b583 100644 --- a/dlls/coop_util.h +++ b/dlls/coop_util.h @@ -66,6 +66,8 @@ bool COOP_ClientCommand( edict_t *pEntity ); bool COOP_ConfirmMenu(CBaseEntity *pTrigger, CBaseEntity *pActivator, int count2, char *mapname ); void COOP_ResetVote( void ); +void COOP_ServerActivate( void ); +bool COOP_GetOrigin( Vector *pvecNewOrigin, const Vector &vecOrigin, const char *pszMapName ); class CBasePlayer; void UTIL_CoopKickPlayer(CBaseEntity *pPlayer); bool UTIL_CoopIsBadPlayer( CBaseEntity *plr ); diff --git a/dlls/gravgunmod.cpp b/dlls/gravgunmod.cpp index 6c611516..07d718ef 100644 --- a/dlls/gravgunmod.cpp +++ b/dlls/gravgunmod.cpp @@ -855,97 +855,9 @@ struct GGMPlayerState *GGM_GetState( const char *uid, const char *name ) } -GGMMapOffset *g_pMapOffsets; -GGMLandmarkTransition g_landmarkTransition; -edict_t *COOP_FindLandmark( const char *pLandmarkName ); -bool COOP_ProcessTransition( void ) -{ - bool fAddCurrent = true; - edict_t *landmark; - - if( !mp_coop.value ) - return false; - - if( !g_landmarkTransition.landmarkName[0] ) - return false; - - if( strcmp( g_landmarkTransition.targetMap, STRING(gpGlobals->mapname) ) ) - return false; - landmark = COOP_FindLandmark( g_landmarkTransition.landmarkName ); - if( !landmark ) - return false; - Vector &lm = landmark->v.origin; - - for( GGMMapOffset *pOffset = g_pMapOffsets; pOffset; pOffset = pOffset->pNext ) - { - if( !strcmp( pOffset->mapName, STRING(gpGlobals->mapname) ) ) - { - pOffset->vecOffset = Vector( 0, 0, 0 ); - fAddCurrent = false; - continue; - } - pOffset->vecOffset = pOffset->vecOffset - g_landmarkTransition.vecLandmark + lm; - } - - if( fAddCurrent ) - { - GGMMapOffset *pNewOffset = (GGMMapOffset *)calloc(1, sizeof( struct GGMMapOffset ) ); - - pNewOffset->pNext = g_pMapOffsets; - pNewOffset->vecOffset = Vector(0, 0, 0); - strncpy(pNewOffset->mapName, STRING(gpGlobals->mapname), 31); - g_pMapOffsets = pNewOffset; - } - return true; -} - -void COOP_SetupLandmarkTransition( const char *szNextMap, const char *szNextSpot, Vector vecLandmarkOffset ) -{ - strncpy(g_landmarkTransition.sourceMap, STRING(gpGlobals->mapname), 31 ); - strncpy(g_landmarkTransition.targetMap, szNextMap, 31 ); - strncpy(g_landmarkTransition.landmarkName, szNextSpot, 31 ); - g_landmarkTransition.vecLandmark = vecLandmarkOffset; -} void GGM_ServerActivate( void ) { - if( !COOP_ProcessTransition() ) - { - ALERT( at_console, "Transition failed, new game started\n"); - while( g_pMapOffsets ) - { - GGMMapOffset *pOffset = g_pMapOffsets; - g_pMapOffsets = pOffset->pNext; - free( pOffset ); - } - GGMMapOffset *pNewOffset = (GGMMapOffset *)calloc(1, sizeof( struct GGMMapOffset ) ); - - pNewOffset->pNext = g_pMapOffsets; - pNewOffset->vecOffset = Vector(0, 0, 0); - strncpy(pNewOffset->mapName, STRING(gpGlobals->mapname), 31); - g_pMapOffsets = pNewOffset; - if( mp_coop.value ) - COOP_ClearData(); - } - else if( mp_coop.value ) COOP_ApplyData(); - - - if( mp_coop.value ) - { - for( int i = 1; i <= gpGlobals->maxClients; i++ ) - { - CBasePlayer *plr = (CBasePlayer*)UTIL_PlayerByIndex( i ); - - // reset all players state - if( plr ) - { - plr->gravgunmod_data.m_state = STATE_UNINITIALIZED; - plr->RemoveAllItems( TRUE ); - UTIL_BecomeSpectator( plr ); - //plr->Spawn(); - } - } - } - g_landmarkTransition.landmarkName[0] = false; + COOP_ServerActivate(); } void GGM_SaveState( CBasePlayer *pPlayer ) @@ -1010,11 +922,59 @@ void GGM_SaveState( CBasePlayer *pPlayer ) if( pState->fNeedWrite ) GGM_WritePersist( pState ); } -bool GGM_RestoreState(CBasePlayer *pPlayer) + +bool GGM_RestorePosition( CBasePlayer *pPlayer, struct GGMPosition *pos ) +{ + bool fOriginSet = COOP_GetOrigin( &pPlayer->pev->origin, pos->vecOrigin, pos->mapName ); + //pPlayer->pev->origin = pState->t.pos.vecOrigin; + + if( pos->trainGlobal[0] ) + { + CBaseEntity *pTrain = UTIL_FindEntityByString( NULL, "globalname", pos->trainGlobal ); + if( pTrain ) + { + Vector vecTrainOrigin; + if( pos->vecTrainAngles == g_vecZero ) + vecTrainOrigin = VecBModelOrigin( pTrain->pev ); + else + vecTrainOrigin = pTrain->pev->origin; + + Vector angleDiff = pTrain->pev->angles - pos->vecAngles; + if( angleDiff != g_vecZero ) + { + float length = pos->vecTrainOffset.Length(); + Vector newAngles = UTIL_VecToAngles( pos->vecTrainOffset) + angleDiff; + //newAngles[0] = -newAngles[0]; + Vector newOffset; + UTIL_MakeVectorsPrivate( newAngles, newOffset, NULL, NULL ); + pPlayer->pev->origin = vecTrainOrigin - newOffset * length; + } + else + pPlayer->pev->origin = vecTrainOrigin + pos->vecTrainOffset; + fOriginSet = true; + } + } + if( mp_coop.value && !fOriginSet ) + { + g_pGameRules->GetPlayerSpawnSpot( pPlayer ); + if( pPlayer->gravgunmod_data.m_state = STATE_POINT_SELECT ) + return false; + } + + if( pos->fDuck ) + { + pPlayer->pev->view_ofs.z = 12; + pPlayer->pev->flags |= FL_DUCKING; + UTIL_SetSize( pPlayer->pev, VEC_DUCK_HULL_MIN, VEC_DUCK_HULL_MAX ); + } + pPlayer->pev->angles = pos->vecAngles; + return true; +} + +bool GGM_RestoreState( CBasePlayer *pPlayer ) { GGMPlayerState *pState = pPlayer->gravgunmod_data.pState; int i; - bool fOriginSet = false; if( !pState ) return false; @@ -1028,57 +988,8 @@ bool GGM_RestoreState(CBasePlayer *pPlayer) pPlayer->pev->armorvalue = pState->t.flBattery; pPlayer->pev->health = pState->t.flHealth; - //pPlayer->pev->origin = pState->t.pos.vecOrigin; - for( GGMMapOffset *offset = g_pMapOffsets; offset; offset = offset->pNext ) - { - if( !strcmp( offset->mapName, pState->t.pos.mapName ) ) - { - pPlayer->pev->origin = pState->t.pos.vecOrigin + offset->vecOffset; - fOriginSet = true; - break; - } - } - - if( pState->t.pos.trainGlobal[0] ) - { - CBaseEntity *pTrain = UTIL_FindEntityByString( NULL, "globalname", pState->t.pos.trainGlobal ); - if( pTrain ) - { - Vector vecTrainOrigin; - if( pState->t.pos.vecTrainAngles == g_vecZero ) - vecTrainOrigin = VecBModelOrigin( pTrain->pev ); - else - vecTrainOrigin = pTrain->pev->origin; - - Vector angleDiff = pTrain->pev->angles - pState->t.pos.vecAngles; - if( angleDiff != g_vecZero ) - { - float length = pState->t.pos.vecTrainOffset.Length(); - Vector newAngles = UTIL_VecToAngles( pState->t.pos.vecTrainOffset) + angleDiff; - //newAngles[0] = -newAngles[0]; - Vector newOffset; - UTIL_MakeVectorsPrivate( newAngles, newOffset, NULL, NULL ); - pPlayer->pev->origin = vecTrainOrigin - newOffset * length; - } - else - pPlayer->pev->origin = vecTrainOrigin + pState->t.pos.vecTrainOffset; - fOriginSet = true; - } - } - if( mp_coop.value && !fOriginSet ) - { - g_pGameRules->GetPlayerSpawnSpot( pPlayer ); - if( pPlayer->gravgunmod_data.m_state = STATE_POINT_SELECT ) - return false; - } - - if( pState->t.pos.fDuck ) - { - pPlayer->pev->view_ofs.z = 12; - pPlayer->pev->flags |= FL_DUCKING; - UTIL_SetSize( pPlayer->pev, VEC_DUCK_HULL_MIN, VEC_DUCK_HULL_MAX ); - } - pPlayer->pev->angles = pState->t.pos.vecAngles; + if( !GGM_RestorePosition( pPlayer, &pPlayer->gravgunmod_data.pState->t.pos ) ) + return false; pPlayer->RemoveAllItems( FALSE ); diff --git a/dlls/gravgunmod.h b/dlls/gravgunmod.h index 1bbe1ff0..cedfff9c 100644 --- a/dlls/gravgunmod.h +++ b/dlls/gravgunmod.h @@ -103,23 +103,6 @@ public: void Show(); }; -// offset for all maps relative to current map -struct GGMMapOffset -{ - struct GGMMapOffset *pNext; - char mapName[32]; - Vector vecOffset; -}; - -// use this to translate GGMMapOffset during changelevel -struct GGMLandmarkTransition -{ - char sourceMap[32]; - char targetMap[32]; - char landmarkName[32]; - Vector vecLandmark; -}; - // full player map-independed position data struct GGMPosition {