mirror of
https://github.com/YGGverse/hlsdk-portable.git
synced 2025-02-08 21:14:14 +00:00
Move landmark transition structs to coop.cpp
This commit is contained in:
parent
7d68ba8375
commit
e46a562572
124
dlls/coop.cpp
124
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;
|
||||
|
||||
|
@ -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 );
|
||||
|
@ -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 );
|
||||
|
||||
|
@ -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
|
||||
{
|
||||
|
Loading…
x
Reference in New Issue
Block a user