diff --git a/dlls/gravgunmod.cpp b/dlls/gravgunmod.cpp index 3584282c..b6f461c1 100644 --- a/dlls/gravgunmod.cpp +++ b/dlls/gravgunmod.cpp @@ -873,7 +873,11 @@ void GGM_SaveState( CBasePlayer *pPlayer ) if( pPlayer->pev->health <= 0 ) return; - pState->t.vecOrigin = pPlayer->pev->origin; + pState->t.pos.vecOrigin = pPlayer->pev->origin; + pState->t.pos.vecAngles = pPlayer->pev->angles; + pState->t.pos.fDuck = !!(pPlayer->pev->flags & FL_DUCKING); + strncpy( pState->t.pos.mapName, STRING(gpGlobals->mapname), 31 ); + pState->t.flHealth = pPlayer->pev->health; pState->t.flBattery = pPlayer->pev->armorvalue; if(pPlayer->m_pActiveItem.Get()) @@ -915,8 +919,16 @@ bool GGM_RestoreState(CBasePlayer *pPlayer) if( pState->t.flHealth < 1 ) return false; pPlayer->pev->armorvalue = pState->t.flBattery; - pPlayer->pev->origin = pState->t.vecOrigin; pPlayer->pev->health = pState->t.flHealth; + pPlayer->pev->origin = pState->t.pos.vecOrigin; + 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; + pPlayer->RemoveAllItems( FALSE ); for( i = 0; i < MAX_WEAPONS; i++ ) diff --git a/dlls/gravgunmod.h b/dlls/gravgunmod.h index 2c6466a0..7f66ad22 100644 --- a/dlls/gravgunmod.h +++ b/dlls/gravgunmod.h @@ -103,9 +103,35 @@ 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]; + Vector vecLandmark; +}; +// full player map-independed position data +struct GGMPosition +{ + Vector vecOrigin; + Vector vecAngles; + char mapName[32]; + char trainGlobal[32]; + Vector vecTrainOffset; + Vector vecTrainAngles; + bool fDuck; +}; +// login records are persistent struct GGMLogin { struct GGMLogin *pNext; @@ -138,7 +164,7 @@ struct GGMTempState char rgiClip[MAX_WEAPONS];// ammo names int rgAmmo[MAX_AMMO_SLOTS];// ammo quantities char WeaponName[32]; - Vector vecOrigin; + GGMPosition pos; }; struct GGMPlayerState