Move landmark transition structs to coop.cpp

This commit is contained in:
mittorn 2018-10-21 07:41:34 +07:00
parent 7d68ba8375
commit e46a562572
4 changed files with 179 additions and 159 deletions

View File

@ -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;

View File

@ -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 );

View File

@ -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 );

View File

@ -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
{