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;
|
int g_iVote;
|
||||||
|
|
||||||
|
@ -66,6 +66,8 @@ bool COOP_ClientCommand( edict_t *pEntity );
|
|||||||
bool COOP_ConfirmMenu(CBaseEntity *pTrigger, CBaseEntity *pActivator, int count2, char *mapname );
|
bool COOP_ConfirmMenu(CBaseEntity *pTrigger, CBaseEntity *pActivator, int count2, char *mapname );
|
||||||
void COOP_ResetVote( void );
|
void COOP_ResetVote( void );
|
||||||
|
|
||||||
|
void COOP_ServerActivate( void );
|
||||||
|
bool COOP_GetOrigin( Vector *pvecNewOrigin, const Vector &vecOrigin, const char *pszMapName );
|
||||||
class CBasePlayer;
|
class CBasePlayer;
|
||||||
void UTIL_CoopKickPlayer(CBaseEntity *pPlayer);
|
void UTIL_CoopKickPlayer(CBaseEntity *pPlayer);
|
||||||
bool UTIL_CoopIsBadPlayer( CBaseEntity *plr );
|
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 )
|
void GGM_ServerActivate( void )
|
||||||
{
|
{
|
||||||
if( !COOP_ProcessTransition() )
|
COOP_ServerActivate();
|
||||||
{
|
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void GGM_SaveState( CBasePlayer *pPlayer )
|
void GGM_SaveState( CBasePlayer *pPlayer )
|
||||||
@ -1010,11 +922,59 @@ void GGM_SaveState( CBasePlayer *pPlayer )
|
|||||||
if( pState->fNeedWrite )
|
if( pState->fNeedWrite )
|
||||||
GGM_WritePersist( pState );
|
GGM_WritePersist( pState );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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 )
|
bool GGM_RestoreState( CBasePlayer *pPlayer )
|
||||||
{
|
{
|
||||||
GGMPlayerState *pState = pPlayer->gravgunmod_data.pState;
|
GGMPlayerState *pState = pPlayer->gravgunmod_data.pState;
|
||||||
int i;
|
int i;
|
||||||
bool fOriginSet = false;
|
|
||||||
|
|
||||||
if( !pState )
|
if( !pState )
|
||||||
return false;
|
return false;
|
||||||
@ -1028,57 +988,8 @@ bool GGM_RestoreState(CBasePlayer *pPlayer)
|
|||||||
pPlayer->pev->armorvalue = pState->t.flBattery;
|
pPlayer->pev->armorvalue = pState->t.flBattery;
|
||||||
pPlayer->pev->health = pState->t.flHealth;
|
pPlayer->pev->health = pState->t.flHealth;
|
||||||
|
|
||||||
//pPlayer->pev->origin = pState->t.pos.vecOrigin;
|
if( !GGM_RestorePosition( pPlayer, &pPlayer->gravgunmod_data.pState->t.pos ) )
|
||||||
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;
|
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;
|
|
||||||
|
|
||||||
pPlayer->RemoveAllItems( FALSE );
|
pPlayer->RemoveAllItems( FALSE );
|
||||||
|
|
||||||
|
@ -103,23 +103,6 @@ public:
|
|||||||
void Show();
|
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
|
// full player map-independed position data
|
||||||
struct GGMPosition
|
struct GGMPosition
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user