mirror of https://github.com/FWGS/hlsdk-xash3d
Get rid of old SavedCoords struct, rewrite transition code to new system
This commit is contained in:
parent
ecb31d4533
commit
b55f4aeeb0
182
dlls/coop.cpp
182
dlls/coop.cpp
|
@ -5,9 +5,6 @@
|
||||||
#include "coop_util.h"
|
#include "coop_util.h"
|
||||||
#include "gravgunmod.h"
|
#include "gravgunmod.h"
|
||||||
|
|
||||||
|
|
||||||
struct SavedCoords g_SavedCoords, s_SavedCoords;
|
|
||||||
|
|
||||||
static float msglimittime1, msglimittime2;
|
static float msglimittime1, msglimittime2;
|
||||||
|
|
||||||
cvar_t mp_coop = { "mp_coop", "0", FCVAR_SERVER };
|
cvar_t mp_coop = { "mp_coop", "0", FCVAR_SERVER };
|
||||||
|
@ -42,21 +39,6 @@ edict_t *COOP_FindLandmark( const char *pLandmarkName )
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void COOP_ValidateOffset( void )
|
|
||||||
{
|
|
||||||
if( !g_SavedCoords.validoffset )
|
|
||||||
{
|
|
||||||
edict_t *landmark = COOP_FindLandmark( g_SavedCoords.landmark );
|
|
||||||
if(landmark)
|
|
||||||
g_SavedCoords.offset = landmark->v.origin - g_SavedCoords.offset;
|
|
||||||
else
|
|
||||||
g_SavedCoords.offset = g_vecZero - g_SavedCoords.offset;
|
|
||||||
g_SavedCoords.validoffset = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void UTIL_CoopPlayerMessage( CBaseEntity *pPlayer, int channel, float time, unsigned int color1, unsigned int color2, float x, float y, const char *format, ... )
|
void UTIL_CoopPlayerMessage( CBaseEntity *pPlayer, int channel, float time, unsigned int color1, unsigned int color2, float x, float y, const char *format, ... )
|
||||||
{
|
{
|
||||||
if( !pPlayer )
|
if( !pPlayer )
|
||||||
|
@ -158,57 +140,22 @@ void UTIL_CleanSpawnPoint( Vector origin, float dist )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Vector COOP_FixupSpawnPoint(Vector spawn)
|
Vector COOP_FixupSpawnPoint( Vector vecOrigin, bool fDuck )
|
||||||
{
|
{
|
||||||
int i = 0;
|
int i = 0;
|
||||||
// predict that spawn point is almost correct
|
// predict that spawn point is almost correct
|
||||||
while( i < 2 ) // 2 player heights
|
while( i < 2 ) // 2 player heights
|
||||||
{
|
{
|
||||||
Vector point = spawn + Vector( 0, 0, 36 * i );
|
Vector point = vecOrigin + Vector( 0, 0, 36 * i );
|
||||||
TraceResult tr;
|
TraceResult tr;
|
||||||
UTIL_TraceHull( point, point, ignore_monsters, (mp_unduck.value&&g_fSavedDuck)?head_hull:human_hull, NULL, &tr );
|
UTIL_TraceHull( point, point, ignore_monsters, (mp_unduck.value&&fDuck)?head_hull:human_hull, NULL, &tr );
|
||||||
if( !tr.fStartSolid && !tr.fAllSolid )
|
if( !tr.fStartSolid && !tr.fAllSolid )
|
||||||
return point;
|
return point;
|
||||||
i = -i;
|
i = -i;
|
||||||
if( i >= 0 )
|
if( i >= 0 )
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
return spawn;
|
return vecOrigin;
|
||||||
}
|
|
||||||
|
|
||||||
void UTIL_CoopSaveTrain( CBaseEntity *pPlayer, SavedCoords *coords)
|
|
||||||
{
|
|
||||||
if( coords->trainsaved )
|
|
||||||
return;
|
|
||||||
|
|
||||||
CBaseEntity *train = UTIL_CoopGetPlayerTrain(pPlayer);
|
|
||||||
if( !train )
|
|
||||||
{
|
|
||||||
ALERT( at_console, "^1NO TRAIN!\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
ALERT( at_console, "^1TRAIN IS %s\n", STRING( train->pev->classname ) );
|
|
||||||
|
|
||||||
if( !pPlayer->IsPlayer() )
|
|
||||||
{
|
|
||||||
// it is trainnitself, try find player on it
|
|
||||||
CBaseEntity *pList;
|
|
||||||
Vector mins = pPlayer->pev->absmin;
|
|
||||||
Vector maxs = pPlayer->pev->absmax;
|
|
||||||
maxs.z += 72;
|
|
||||||
int count = UTIL_EntitiesInBox( &pList, 1, mins, maxs, FL_ONGROUND );
|
|
||||||
if( count && pList && pList->IsPlayer() )
|
|
||||||
pPlayer = pList;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ALERT( at_console, "Train without players\n" );
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
strcpy( coords->trainglobal, STRING(train->pev->globalname) );
|
|
||||||
coords->trainoffset = pPlayer->pev->origin - VecBModelOrigin(train->pev);
|
|
||||||
coords->trainsaved = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void UTIL_BecomeSpectator( CBasePlayer *pPlayer )
|
void UTIL_BecomeSpectator( CBasePlayer *pPlayer )
|
||||||
|
@ -247,14 +194,13 @@ void UTIL_SpawnPlayer( CBasePlayer *pPlayer )
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
char * UTIL_CoopPlayerName( CBaseEntity *pPlayer )
|
char *UTIL_CoopPlayerName( CBaseEntity *pPlayer )
|
||||||
{
|
{
|
||||||
if( !pPlayer )
|
if( !pPlayer )
|
||||||
return (char*)"unnamed(NULL)";
|
return (char*)"unnamed(NULL)";
|
||||||
return (char*)( ( pPlayer->pev->netname && STRING( pPlayer->pev->netname )[0] != 0 ) ? STRING( pPlayer->pev->netname ) : "unconnected" );
|
return (char*)( ( pPlayer->pev->netname && STRING( pPlayer->pev->netname )[0] != 0 ) ? STRING( pPlayer->pev->netname ) : "unconnected" );
|
||||||
}
|
}
|
||||||
|
|
||||||
bool g_fSavedDuck;
|
|
||||||
|
|
||||||
char *badlist[256] = {
|
char *badlist[256] = {
|
||||||
"player", // does not even can set own name
|
"player", // does not even can set own name
|
||||||
|
@ -319,29 +265,19 @@ bool UTIL_CoopIsBadPlayer( CBaseEntity *plr )
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
bool g_fPause;
|
||||||
void COOP_ClearData( void )
|
void COOP_ClearData( void )
|
||||||
{
|
{
|
||||||
// nullify
|
g_fPause = false;
|
||||||
SavedCoords l_SavedCoords = {0};
|
|
||||||
g_SavedCoords = l_SavedCoords;
|
|
||||||
msglimittime1 = msglimittime2 = 0;
|
msglimittime1 = msglimittime2 = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool g_fPause;
|
|
||||||
void COOP_ApplyData( void )
|
void COOP_ApplyData( void )
|
||||||
{
|
{
|
||||||
if( s_SavedCoords.valid )
|
|
||||||
{
|
|
||||||
struct SavedCoords null1 = {0};
|
|
||||||
g_SavedCoords = s_SavedCoords;
|
|
||||||
s_SavedCoords = null1;
|
|
||||||
g_fSavedDuck = g_SavedCoords.fDuck;
|
|
||||||
}
|
|
||||||
g_fPause = false;
|
|
||||||
ALERT( at_console, "^2CoopApplyData()\n" );
|
ALERT( at_console, "^2CoopApplyData()\n" );
|
||||||
msglimittime1 = msglimittime2 = 0;
|
msglimittime1 = msglimittime2 = 0;
|
||||||
|
g_fPause = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// use this to translate GGMMapOffset during changelevel
|
// use this to translate GGMMapOffset during changelevel
|
||||||
|
@ -351,6 +287,9 @@ struct GGMLandmarkTransition
|
||||||
char targetMap[32];
|
char targetMap[32];
|
||||||
char landmarkName[32];
|
char landmarkName[32];
|
||||||
Vector vecLandmark;
|
Vector vecLandmark;
|
||||||
|
bool fTriggerUsed;
|
||||||
|
bool fSavedPos;
|
||||||
|
GGMPosition pos;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -373,12 +312,43 @@ struct GGMMapState
|
||||||
GGMMapState *g_pMapStates;
|
GGMMapState *g_pMapStates;
|
||||||
GGMMapState *g_pCurrentMap;
|
GGMMapState *g_pCurrentMap;
|
||||||
GGMLandmarkTransition g_landmarkTransition;
|
GGMLandmarkTransition g_landmarkTransition;
|
||||||
|
struct GGMCoopState
|
||||||
|
{
|
||||||
|
struct GGMPosition savedPos;
|
||||||
|
bool fSaved;
|
||||||
|
} g_CoopState;
|
||||||
edict_t *COOP_FindLandmark( const char *pLandmarkName );
|
edict_t *COOP_FindLandmark( const char *pLandmarkName );
|
||||||
|
|
||||||
|
void COOP_MarkTriggers( void )
|
||||||
|
{
|
||||||
|
CBaseEntity *pTrigger = NULL;
|
||||||
|
|
||||||
|
while( pTrigger = UTIL_FindEntityByClassname( pTrigger, "trigger_changelevel" ) )
|
||||||
|
{
|
||||||
|
struct COOPChangelevelData *pData = COOP_GetTriggerData( pTrigger );
|
||||||
|
pData->fIsBack = !strcmp( pData->pszMapName, g_landmarkTransition.sourceMap );
|
||||||
|
// if( gpGlobals->startspot && STRING(gpGlobals->startspot) && !strcmp(STRING(gpGlobals->startspot), m_szLandmarkName) )
|
||||||
|
// m_coopData.fIsBack = true;
|
||||||
|
|
||||||
|
pTrigger->pev->renderamt = 127;
|
||||||
|
pTrigger->pev->effects &= ~EF_NODRAW;
|
||||||
|
pTrigger->pev->rendermode = kRenderTransColor;
|
||||||
|
pTrigger->pev->rendercolor = g_vecZero;
|
||||||
|
if( pData->fIsBack )
|
||||||
|
pTrigger->pev->rendercolor.z = 255;
|
||||||
|
else
|
||||||
|
pTrigger->pev->rendercolor.y = 255;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool COOP_ProcessTransition( void )
|
bool COOP_ProcessTransition( void )
|
||||||
{
|
{
|
||||||
bool fAddCurrent = true;
|
bool fAddCurrent = true;
|
||||||
edict_t *landmark;
|
edict_t *landmark;
|
||||||
|
|
||||||
|
g_CoopState.savedPos = g_landmarkTransition.pos;
|
||||||
|
g_CoopState.fSaved = g_landmarkTransition.fSavedPos;
|
||||||
|
|
||||||
if( !mp_coop.value )
|
if( !mp_coop.value )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
@ -416,16 +386,22 @@ bool COOP_ProcessTransition( void )
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void COOP_SetupLandmarkTransition( const char *szNextMap, const char *szNextSpot, Vector vecLandmarkOffset )
|
void COOP_SetupLandmarkTransition( const char *szNextMap, const char *szNextSpot, Vector vecLandmarkOffset, struct GGMPosition *pPos )
|
||||||
{
|
{
|
||||||
strncpy(g_landmarkTransition.sourceMap, STRING(gpGlobals->mapname), 31 );
|
strncpy(g_landmarkTransition.sourceMap, STRING(gpGlobals->mapname), 31 );
|
||||||
strncpy(g_landmarkTransition.targetMap, szNextMap, 31 );
|
strncpy(g_landmarkTransition.targetMap, szNextMap, 31 );
|
||||||
strncpy(g_landmarkTransition.landmarkName, szNextSpot, 31 );
|
strncpy(g_landmarkTransition.landmarkName, szNextSpot, 31 );
|
||||||
g_landmarkTransition.vecLandmark = vecLandmarkOffset;
|
g_landmarkTransition.vecLandmark = vecLandmarkOffset;
|
||||||
|
if( pPos )
|
||||||
|
{
|
||||||
|
g_landmarkTransition.pos = *pPos;
|
||||||
|
g_landmarkTransition.fSavedPos = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void COOP_ServerActivate( void )
|
void COOP_ServerActivate( void )
|
||||||
{
|
{
|
||||||
|
COOP_MarkTriggers();
|
||||||
if( !COOP_ProcessTransition() )
|
if( !COOP_ProcessTransition() )
|
||||||
{
|
{
|
||||||
ALERT( at_console, "Transition failed, new game started\n");
|
ALERT( at_console, "Transition failed, new game started\n");
|
||||||
|
@ -463,7 +439,7 @@ void COOP_ServerActivate( void )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
g_landmarkTransition.landmarkName[0] = false;
|
memset( &g_landmarkTransition, 0, sizeof( GGMLandmarkTransition ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
bool COOP_GetOrigin( Vector *pvecNewOrigin, const Vector &vecOrigin, const char *pszMapName )
|
bool COOP_GetOrigin( Vector *pvecNewOrigin, const Vector &vecOrigin, const char *pszMapName )
|
||||||
|
@ -624,63 +600,13 @@ bool COOP_PlayerDeath( CBasePlayer *pPlayer )
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool UTIL_CoopGetSpawnPoint( Vector *origin, Vector *angles)
|
bool COOP_SetDefaultSpawnPosition( CBasePlayer *pPlayer )
|
||||||
{
|
{
|
||||||
if(!g_SavedCoords.valid)
|
if( !g_CoopState.fSaved )
|
||||||
return false;
|
return false;
|
||||||
|
return GGM_RestorePosition( pPlayer, &g_CoopState.savedPos );
|
||||||
// spawn on elevator or train
|
|
||||||
if( g_SavedCoords.trainsaved )
|
|
||||||
{
|
|
||||||
CBaseEntity *train = UTIL_FindEntityByString( NULL, "globalname", g_SavedCoords.trainglobal );
|
|
||||||
if( !train ) train = UTIL_FindEntityByString( NULL, "classname", g_SavedCoords.trainglobal );
|
|
||||||
if( train && ( !g_SavedCoords.trainuser1 || train->pev->iuser1 == g_SavedCoords.trainuser1 ) )
|
|
||||||
{
|
|
||||||
*angles = g_SavedCoords.triggerangles;
|
|
||||||
*origin = VecBModelOrigin(train->pev) + g_SavedCoords.trainoffset;
|
|
||||||
g_SavedCoords.trainuser1 = train->pev->iuser1;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
ALERT( at_console, "Failed to get train %s (map design error?)\n", g_SavedCoords.trainglobal );
|
|
||||||
}
|
|
||||||
Vector point = g_SavedCoords.triggerorigin;
|
|
||||||
*angles = g_SavedCoords.triggerangles;
|
|
||||||
if( !g_SavedCoords.validspawnpoint )
|
|
||||||
{
|
|
||||||
TraceResult tr;
|
|
||||||
Vector angle;
|
|
||||||
UTIL_MakeVectorsPrivate( *angles, (float*)&angle, NULL, NULL );
|
|
||||||
COOP_ValidateOffset();
|
|
||||||
point = point + g_SavedCoords.offset;
|
|
||||||
//UTIL_TraceHull( point, point, ignore_monsters, human_hull, NULL, &tr );
|
|
||||||
|
|
||||||
if( mp_unduck.value && g_fSavedDuck && !g_SavedCoords.fUsed )
|
|
||||||
UTIL_TraceHull( point, point + angle * 100, missile, head_hull, NULL, &tr );
|
|
||||||
else
|
|
||||||
UTIL_TraceHull( point, point + angle * 100, ignore_monsters, human_hull, NULL, &tr );
|
|
||||||
|
|
||||||
if( !tr.fStartSolid && !tr.fAllSolid || ENTINDEX( tr.pHit ) && ENTINDEX( tr.pHit ) <= gpGlobals->maxClients )
|
|
||||||
{
|
|
||||||
//g_SavedCoords.triggerorigin = tr.vecEndPos;
|
|
||||||
//g_SavedCoords.validspawnpoint = true;
|
|
||||||
if( tr.pHit && FClassnameIs( tr.pHit, "func_door" ) )
|
|
||||||
tr.pHit->v.solid = SOLID_NOT;
|
|
||||||
ALERT( at_console, "CoopGetSpawnPoint: ^2offset set\n");
|
|
||||||
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
//g_SavedCoords.valid = false;
|
|
||||||
ALERT( at_console, "CoopGetSpawnPoint: ^2trace failed\n");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*origin = point;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
CBaseEntity *UTIL_CoopGetPlayerTrain( CBaseEntity *pPlayer)
|
CBaseEntity *UTIL_CoopGetPlayerTrain( CBaseEntity *pPlayer)
|
||||||
{
|
{
|
||||||
CBaseEntity *train = NULL;
|
CBaseEntity *train = NULL;
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
#ifndef COOP_UTIL_H
|
#ifndef COOP_UTIL_H
|
||||||
#define COOP_UTIL_H
|
#define COOP_UTIL_H
|
||||||
|
#include "gravgunmod.h"
|
||||||
extern cvar_t mp_gravgun_players;
|
extern cvar_t mp_gravgun_players;
|
||||||
extern cvar_t mp_coop;
|
extern cvar_t mp_coop;
|
||||||
extern cvar_t mp_coop_nofriendlyfire;
|
extern cvar_t mp_coop_nofriendlyfire;
|
||||||
|
@ -20,35 +21,24 @@ extern cvar_t materials_txt;
|
||||||
extern bool g_fSavedDuck;
|
extern bool g_fSavedDuck;
|
||||||
extern bool g_fPause;
|
extern bool g_fPause;
|
||||||
|
|
||||||
struct SavedCoords
|
struct COOPChangelevelData
|
||||||
{
|
{
|
||||||
char landmark[32];
|
bool fIsBack;
|
||||||
Vector triggerorigin;
|
bool fSkipSpawnCheck;
|
||||||
Vector triggerangles;
|
struct GGMPosition savedPosition;
|
||||||
Vector offset;
|
bool fSpawnSaved;
|
||||||
int iCount;
|
|
||||||
bool valid;
|
|
||||||
bool validoffset;
|
|
||||||
bool validspawnpoint;
|
|
||||||
int changeback;
|
|
||||||
bool trainsaved;
|
|
||||||
Vector trainoffset;
|
|
||||||
char trainglobal[256];
|
|
||||||
int trainuser1;
|
|
||||||
bool fUsed;
|
bool fUsed;
|
||||||
bool fDuck;
|
unsigned int bitsTouchCount;
|
||||||
|
float flRepeatTimer;
|
||||||
|
const char *pszMapName;
|
||||||
|
bool fValid;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void COOP_ValidateOffset( void );
|
|
||||||
void UTIL_CleanSpawnPoint( Vector origin, float radius );
|
void UTIL_CleanSpawnPoint( Vector origin, float radius );
|
||||||
char *UTIL_CoopPlayerName( CBaseEntity *pPlayer );
|
char *UTIL_CoopPlayerName( CBaseEntity *pPlayer );
|
||||||
|
|
||||||
bool UTIL_CoopGetSpawnPoint( Vector *point, Vector *angles);
|
bool COOP_SetDefaultSpawnPosition( CBasePlayer *pPlayer );
|
||||||
|
Vector COOP_FixupSpawnPoint( Vector vecOrigin, bool fDuck );
|
||||||
void UTIL_CoopSaveTrain( CBaseEntity *pPlayer, SavedCoords *coords);
|
|
||||||
Vector COOP_FixupSpawnPoint(Vector spawn);
|
|
||||||
void COOP_ClearData( void );
|
void COOP_ClearData( void );
|
||||||
void COOP_ApplyData( void );
|
void COOP_ApplyData( void );
|
||||||
void UTIL_CoopPrintMessage( const char *format, ... );
|
void UTIL_CoopPrintMessage( const char *format, ... );
|
||||||
|
@ -83,7 +73,6 @@ public:
|
||||||
|
|
||||||
extern CWeaponList g_WeaponList;
|
extern CWeaponList g_WeaponList;
|
||||||
|
|
||||||
extern struct SavedCoords g_SavedCoords, s_SavedCoords;
|
struct COOPChangelevelData *COOP_GetTriggerData( CBaseEntity *pTrigger );
|
||||||
|
|
||||||
#endif // COOP_UTIL_H
|
#endif // COOP_UTIL_H
|
||||||
|
|
||||||
|
|
|
@ -65,58 +65,13 @@ extern EHANDLE g_pLastSpawn;
|
||||||
edict_t *CGameRules::GetPlayerSpawnSpot( CBasePlayer *pPlayer )
|
edict_t *CGameRules::GetPlayerSpawnSpot( CBasePlayer *pPlayer )
|
||||||
{
|
{
|
||||||
edict_t *pentSpawnSpot = EntSelectSpawnPoint( pPlayer );
|
edict_t *pentSpawnSpot = EntSelectSpawnPoint( pPlayer );
|
||||||
if( pPlayer->gravgunmod_data.m_state == STATE_POINT_SELECT )
|
|
||||||
{
|
|
||||||
pPlayer->gravgunmod_data.m_state = STATE_SPAWNED;
|
|
||||||
pPlayer->pev->effects &= ~EF_NODRAW;
|
|
||||||
|
|
||||||
pPlayer->pev->takedamage = DAMAGE_YES;
|
|
||||||
pPlayer->pev->flags &= ~FL_SPECTATOR;
|
|
||||||
pPlayer->pev->movetype = MOVETYPE_WALK;
|
|
||||||
CLIENT_COMMAND( pPlayer->edict(), "touch_show _coopm*\n" );
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( mp_coop.value )
|
|
||||||
UTIL_CleanSpawnPoint( pentSpawnSpot->v.origin, 100 );
|
|
||||||
|
|
||||||
if( g_pLastSpawn )
|
|
||||||
pPlayer->pev->origin = VARS( pentSpawnSpot )->origin + Vector( 0, 0, 1 );
|
pPlayer->pev->origin = VARS( pentSpawnSpot )->origin + Vector( 0, 0, 1 );
|
||||||
pPlayer->pev->v_angle = g_vecZero;
|
pPlayer->pev->v_angle = g_vecZero;
|
||||||
pPlayer->pev->velocity = g_vecZero;
|
pPlayer->pev->velocity = g_vecZero;
|
||||||
pPlayer->pev->angles = VARS( pentSpawnSpot )->angles;
|
pPlayer->pev->angles = VARS( pentSpawnSpot )->angles;
|
||||||
pPlayer->pev->punchangle = g_vecZero;
|
pPlayer->pev->punchangle = g_vecZero;
|
||||||
if( !(pPlayer->pev->flags & FL_SPECTATOR ) )
|
|
||||||
if( mp_coop.value )
|
|
||||||
if( !UTIL_CoopGetSpawnPoint( &pPlayer->pev->origin, &pPlayer->pev->angles ) )
|
|
||||||
{
|
|
||||||
if( !g_pLastSpawn )
|
|
||||||
{
|
|
||||||
hudtextparms_t params = {};
|
|
||||||
params.fadeinTime = 0.5;
|
|
||||||
params.fadeoutTime = .5;
|
|
||||||
params.holdTime = 10;
|
|
||||||
params.channel = 0;
|
|
||||||
params.x = params.y = -1;
|
|
||||||
params.r2 = params.g2 = params.b2 = params.a2 = params.r1 = params.g1 = params.b1 = params.a1 = 255;
|
|
||||||
|
|
||||||
|
|
||||||
UTIL_HudMessage( pPlayer, params, "Server cannot select a spawnpoint\nplease fly to it manually\nand press attack button" );
|
|
||||||
// select spawn point
|
|
||||||
pPlayer->gravgunmod_data.m_state = STATE_POINT_SELECT;
|
|
||||||
pPlayer->m_afButtonPressed = 0;
|
|
||||||
|
|
||||||
if(pPlayer->pev->origin.Length() > 8192)
|
|
||||||
pPlayer->pev->origin = g_vecZero;
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
pPlayer->pev->fixangle = TRUE;
|
pPlayer->pev->fixangle = TRUE;
|
||||||
pPlayer->pev->origin = COOP_FixupSpawnPoint( pPlayer->pev->origin );
|
|
||||||
if( g_fSavedDuck )
|
|
||||||
pPlayer->pev->flags |= FL_DUCKING;
|
|
||||||
|
|
||||||
return pentSpawnSpot;
|
return pentSpawnSpot;
|
||||||
}
|
}
|
||||||
|
|
|
@ -961,8 +961,9 @@ bool GGM_RestorePosition( CBasePlayer *pPlayer, struct GGMPosition *pos )
|
||||||
}
|
}
|
||||||
if( mp_coop.value && !fOriginSet )
|
if( mp_coop.value && !fOriginSet )
|
||||||
{
|
{
|
||||||
g_pGameRules->GetPlayerSpawnSpot( pPlayer );
|
if( !COOP_SetDefaultSpawnPosition( pPlayer ) )
|
||||||
if( pPlayer->gravgunmod_data.m_state = STATE_POINT_SELECT )
|
g_pGameRules->GetPlayerSpawnSpot( pPlayer );
|
||||||
|
if( pPlayer->gravgunmod_data.m_state == STATE_POINT_SELECT )
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -973,6 +974,7 @@ bool GGM_RestorePosition( CBasePlayer *pPlayer, struct GGMPosition *pos )
|
||||||
UTIL_SetSize( pPlayer->pev, VEC_DUCK_HULL_MIN, VEC_DUCK_HULL_MAX );
|
UTIL_SetSize( pPlayer->pev, VEC_DUCK_HULL_MIN, VEC_DUCK_HULL_MAX );
|
||||||
}
|
}
|
||||||
pPlayer->pev->angles = pos->vecAngles;
|
pPlayer->pev->angles = pos->vecAngles;
|
||||||
|
pPlayer->pev->fixangle = TRUE;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1033,7 +1035,7 @@ bool GGM_PlayerSpawn( CBasePlayer *pPlayer )
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( mp_spectator.value && pPlayer->gravgunmod_data.m_state == STATE_CONNECTED || !pPlayer->gravgunmod_data.pState )
|
if( ( mp_coop.value || mp_spectator.value ) && pPlayer->gravgunmod_data.m_state == STATE_CONNECTED || !pPlayer->gravgunmod_data.pState )
|
||||||
{
|
{
|
||||||
if( !pPlayer->gravgunmod_data.pState )
|
if( !pPlayer->gravgunmod_data.pState )
|
||||||
GGM_ChatPrintf( pPlayer, "This nickname busy! Please login or change nickname\n" );
|
GGM_ChatPrintf( pPlayer, "This nickname busy! Please login or change nickname\n" );
|
||||||
|
@ -1041,6 +1043,8 @@ bool GGM_PlayerSpawn( CBasePlayer *pPlayer )
|
||||||
pPlayer->gravgunmod_data.m_state = STATE_SPECTATOR_BEGIN;
|
pPlayer->gravgunmod_data.m_state = STATE_SPECTATOR_BEGIN;
|
||||||
pPlayer->RemoveAllItems( TRUE );
|
pPlayer->RemoveAllItems( TRUE );
|
||||||
UTIL_BecomeSpectator( pPlayer );
|
UTIL_BecomeSpectator( pPlayer );
|
||||||
|
if( !COOP_SetDefaultSpawnPosition( pPlayer ) )
|
||||||
|
g_pGameRules->GetPlayerSpawnSpot( pPlayer );
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1090,7 +1094,8 @@ bool GGM_PlayerSpawn( CBasePlayer *pPlayer )
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
g_pGameRules->GetPlayerSpawnSpot( pPlayer );
|
if( !COOP_SetDefaultSpawnPosition( pPlayer ) )
|
||||||
|
g_pGameRules->GetPlayerSpawnSpot( pPlayer );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -185,6 +185,6 @@ void GGM_SaveState( CBasePlayer *pPlayer );
|
||||||
bool GGM_PlayerSpawn( CBasePlayer *pPlayer );
|
bool GGM_PlayerSpawn( CBasePlayer *pPlayer );
|
||||||
const char *GGM_GetAuthID( CBasePlayer *pPlayer );
|
const char *GGM_GetAuthID( CBasePlayer *pPlayer );
|
||||||
void GGM_ServerActivate( void );
|
void GGM_ServerActivate( void );
|
||||||
void COOP_SetupLandmarkTransition( const char *szNextMap, const char *szNextSpot, Vector vecLandmarkOffset );
|
void COOP_SetupLandmarkTransition( const char *szNextMap, const char *szNextSpot, Vector vecLandmarkOffset, struct GGMPosition *pPos );
|
||||||
#endif // GRAVGUNMOD_H
|
#endif // GRAVGUNMOD_H
|
||||||
|
|
||||||
|
|
|
@ -613,30 +613,31 @@ void CHalfLifeMultiplay::PlayerSpawn( CBasePlayer *pPlayer )
|
||||||
addDefault = FALSE;
|
addDefault = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( addDefault )
|
if( !mp_coop.value )
|
||||||
{
|
{
|
||||||
pPlayer->GiveNamedItem( "weapon_crowbar" );
|
if( addDefault )
|
||||||
pPlayer->GiveNamedItem( "weapon_9mmhandgun" );
|
{
|
||||||
pPlayer->GiveAmmo( 68, "9mm", _9MM_MAX_CARRY );// 4 full reloads
|
pPlayer->GiveNamedItem( "weapon_crowbar" );
|
||||||
}
|
pPlayer->GiveNamedItem( "weapon_9mmhandgun" );
|
||||||
|
pPlayer->GiveAmmo( 68, "9mm", _9MM_MAX_CARRY );// 4 full reloads
|
||||||
|
}
|
||||||
|
|
||||||
if( (int)cvar_allow_gravgun.value == 2 )
|
if( (int)cvar_allow_gravgun.value == 2 )
|
||||||
pPlayer->GiveNamedItem( "weapon_gravgun" );
|
pPlayer->GiveNamedItem( "weapon_gravgun" );
|
||||||
if( (int)cvar_allow_ar2.value == 2 )
|
if( (int)cvar_allow_ar2.value == 2 )
|
||||||
pPlayer->GiveNamedItem( "weapon_ar2" );
|
pPlayer->GiveNamedItem( "weapon_ar2" );
|
||||||
if( !cvar_ar2_mp5.value )
|
if( !cvar_ar2_mp5.value )
|
||||||
{
|
{
|
||||||
pPlayer->GiveAmmo( cvar_ar2_bullets.value, "AR2", 120 );
|
pPlayer->GiveAmmo( cvar_ar2_bullets.value, "AR2", 120 );
|
||||||
pPlayer->GiveAmmo( cvar_ar2_balls.value, "AR2grenades", 3 );
|
pPlayer->GiveAmmo( cvar_ar2_balls.value, "AR2grenades", 3 );
|
||||||
|
}
|
||||||
|
if( (int)cvar_allow_bigcock.value == 2 )
|
||||||
|
pPlayer->GiveNamedItem( "weapon_big_cock" );
|
||||||
|
if( (int)cvar_allow_gateofbabylon.value == 2 )
|
||||||
|
pPlayer->GiveNamedItem( "weapon_gateofbabylon" );
|
||||||
}
|
}
|
||||||
if( (int)cvar_allow_bigcock.value == 2 )
|
else
|
||||||
pPlayer->GiveNamedItem( "weapon_big_cock" );
|
|
||||||
if( (int)cvar_allow_gateofbabylon.value == 2 )
|
|
||||||
pPlayer->GiveNamedItem( "weapon_gateofbabylon" );
|
|
||||||
|
|
||||||
if( mp_coop.value )
|
|
||||||
{
|
{
|
||||||
// pPlayer->GiveNamedItem( "item_suit" );
|
|
||||||
g_WeaponList.GiveToPlayer(pPlayer);
|
g_WeaponList.GiveToPlayer(pPlayer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2858,7 +2858,7 @@ edict_t *EntSelectSpawnPoint( CBaseEntity *pPlayer )
|
||||||
if( !FStrEq( STRING( pSpot->pev->netname ), STRING( gpGlobals->mapname ) ) )
|
if( !FStrEq( STRING( pSpot->pev->netname ), STRING( gpGlobals->mapname ) ) )
|
||||||
continue;
|
continue;
|
||||||
// check if it is placed in wall
|
// check if it is placed in wall
|
||||||
UTIL_TraceHull( pSpot->pev->origin, pSpot->pev->origin , missile, (mp_unduck.value&&g_fSavedDuck)?head_hull:human_hull, NULL, &tr );
|
UTIL_TraceHull( pSpot->pev->origin, pSpot->pev->origin , missile, human_hull, NULL, &tr );
|
||||||
if( tr.fStartSolid || tr.fAllSolid )
|
if( tr.fStartSolid || tr.fAllSolid )
|
||||||
continue;
|
continue;
|
||||||
// trace down to find if there is no floor
|
// trace down to find if there is no floor
|
||||||
|
@ -3116,13 +3116,6 @@ int CBasePlayer::Restore( CRestore &restore )
|
||||||
m_flNextAttack = UTIL_WeaponTimeBase();
|
m_flNextAttack = UTIL_WeaponTimeBase();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// restored player has some bugs untill respawned
|
|
||||||
if( mp_coop.value )
|
|
||||||
{
|
|
||||||
gravgunmod_data.m_state = STATE_CONNECTED;
|
|
||||||
SetThink( &CBasePlayer::Spawn );
|
|
||||||
pev->nextthink = gpGlobals->time + 0.5;
|
|
||||||
}
|
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1326,7 +1326,6 @@ public:
|
||||||
void EXPORT TriggerChangeLevel( void );
|
void EXPORT TriggerChangeLevel( void );
|
||||||
void EXPORT ExecuteChangeLevel( void );
|
void EXPORT ExecuteChangeLevel( void );
|
||||||
void EXPORT TouchChangeLevel( CBaseEntity *pOther );
|
void EXPORT TouchChangeLevel( CBaseEntity *pOther );
|
||||||
void EXPORT UpdateColor();
|
|
||||||
void ChangeLevelNow( CBaseEntity *pActivator );
|
void ChangeLevelNow( CBaseEntity *pActivator );
|
||||||
|
|
||||||
static edict_t *FindLandmark( const char *pLandmarkName );
|
static edict_t *FindLandmark( const char *pLandmarkName );
|
||||||
|
@ -1343,14 +1342,7 @@ public:
|
||||||
char m_szLandmarkName[cchMapNameMost]; // trigger_changelevel only: landmark on next map
|
char m_szLandmarkName[cchMapNameMost]; // trigger_changelevel only: landmark on next map
|
||||||
string_t m_changeTarget;
|
string_t m_changeTarget;
|
||||||
float m_changeTargetDelay;
|
float m_changeTargetDelay;
|
||||||
unsigned int m_uTouchCount;
|
struct COOPChangelevelData m_coopData;
|
||||||
bool m_bUsed;
|
|
||||||
Vector m_vecSpawnOrigin;
|
|
||||||
Vector m_vecSpawnAngles;
|
|
||||||
bool m_fSpawnSaved;
|
|
||||||
bool m_fIsBack;
|
|
||||||
bool m_fSkipSpawnCheck; // skip 30 seconds check when called by multimanager or trigger_once
|
|
||||||
float m_flRepeatTimer;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
LINK_ENTITY_TO_CLASS( trigger_changelevel, CChangeLevel )
|
LINK_ENTITY_TO_CLASS( trigger_changelevel, CChangeLevel )
|
||||||
|
@ -1366,6 +1358,14 @@ TYPEDESCRIPTION CChangeLevel::m_SaveData[] =
|
||||||
|
|
||||||
IMPLEMENT_SAVERESTORE( CChangeLevel, CBaseTrigger )
|
IMPLEMENT_SAVERESTORE( CChangeLevel, CBaseTrigger )
|
||||||
|
|
||||||
|
struct COOPChangelevelData *COOP_GetTriggerData( CBaseEntity *pTrigger )
|
||||||
|
{
|
||||||
|
CChangeLevel *pChangeLevel = (CChangeLevel*)pTrigger;
|
||||||
|
pChangeLevel->m_coopData.pszMapName = pChangeLevel->m_szMapName;
|
||||||
|
|
||||||
|
return &pChangeLevel->m_coopData;
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Cache user-entity-field values until spawn is called.
|
// Cache user-entity-field values until spawn is called.
|
||||||
//
|
//
|
||||||
|
@ -1404,8 +1404,8 @@ When the player touches this, he gets sent to the map listed in the "map" variab
|
||||||
*/
|
*/
|
||||||
void CChangeLevel::Spawn( void )
|
void CChangeLevel::Spawn( void )
|
||||||
{
|
{
|
||||||
m_uTouchCount = 0;
|
m_coopData.bitsTouchCount = 0;
|
||||||
m_bUsed = false;
|
m_coopData.fUsed = false;
|
||||||
if( FStrEq( m_szMapName, "" ) )
|
if( FStrEq( m_szMapName, "" ) )
|
||||||
ALERT( at_console, "a trigger_changelevel doesn't have a map" );
|
ALERT( at_console, "a trigger_changelevel doesn't have a map" );
|
||||||
|
|
||||||
|
@ -1418,25 +1418,7 @@ void CChangeLevel::Spawn( void )
|
||||||
}
|
}
|
||||||
InitTrigger();
|
InitTrigger();
|
||||||
if( !( pev->spawnflags & SF_CHANGELEVEL_USEONLY ) )
|
if( !( pev->spawnflags & SF_CHANGELEVEL_USEONLY ) )
|
||||||
{
|
|
||||||
SetTouch( &CChangeLevel::TouchChangeLevel );
|
SetTouch( &CChangeLevel::TouchChangeLevel );
|
||||||
if( mp_coop.value )
|
|
||||||
{
|
|
||||||
if( gpGlobals->startspot && STRING(gpGlobals->startspot) && !strcmp(STRING(gpGlobals->startspot), m_szLandmarkName) )
|
|
||||||
m_fIsBack = true;
|
|
||||||
// set color (got from XDM)
|
|
||||||
if( m_fIsBack )
|
|
||||||
pev->rendercolor.z = 255;
|
|
||||||
else
|
|
||||||
pev->rendercolor.y = 255;
|
|
||||||
pev->renderamt = 127;
|
|
||||||
|
|
||||||
pev->effects &= ~EF_NODRAW;
|
|
||||||
pev->rendermode = kRenderTransColor;
|
|
||||||
SetThink( &CChangeLevel::UpdateColor );
|
|
||||||
pev->nextthink = gpGlobals->time + 2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//ALERT( at_console, "TRANSITION: %s (%s)\n", m_szMapName, m_szLandmarkName );
|
//ALERT( at_console, "TRANSITION: %s (%s)\n", m_szMapName, m_szLandmarkName );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1479,11 +1461,11 @@ edict_t *CChangeLevel::FindLandmark( const char *pLandmarkName )
|
||||||
void CChangeLevel::UseChangeLevel( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value )
|
void CChangeLevel::UseChangeLevel( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value )
|
||||||
{
|
{
|
||||||
// if not activated by touch, do not count players
|
// if not activated by touch, do not count players
|
||||||
m_bUsed = true;
|
m_coopData.fUsed = true;
|
||||||
if( pCaller && FClassnameIs( pCaller->edict(), "multi_manager" ) || FClassnameIs( pCaller->edict(), "trigger_once" ) )
|
if( pCaller && FClassnameIs( pCaller->edict(), "multi_manager" ) || FClassnameIs( pCaller->edict(), "trigger_once" ) )
|
||||||
m_fSkipSpawnCheck = true;
|
m_coopData.fSkipSpawnCheck = true;
|
||||||
else
|
else
|
||||||
m_fSkipSpawnCheck = false;
|
m_coopData.fSkipSpawnCheck = false;
|
||||||
const char *classname = NULL;
|
const char *classname = NULL;
|
||||||
if( pCaller && pCaller->pev->classname )
|
if( pCaller && pCaller->pev->classname )
|
||||||
classname = STRING( pCaller->pev->classname );
|
classname = STRING( pCaller->pev->classname );
|
||||||
|
@ -1491,27 +1473,6 @@ void CChangeLevel::UseChangeLevel( CBaseEntity *pActivator, CBaseEntity *pCaller
|
||||||
ChangeLevelNow( pActivator );
|
ChangeLevelNow( pActivator );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void CChangeLevel::UpdateColor( void )
|
|
||||||
{
|
|
||||||
Vector origin = VecBModelOrigin(pev);
|
|
||||||
Vector point, angles;
|
|
||||||
CBaseEntity *pPlayer;
|
|
||||||
pev->nextthink = gpGlobals->time + 30;
|
|
||||||
|
|
||||||
/*if( !m_fIsBack && (pPlayer = UTIL_FindEntityByClassname( NULL, "info_player_start" )) )
|
|
||||||
if( (origin - pPlayer->pev->origin).Length() < 500 )
|
|
||||||
m_fIsBack = true;*/
|
|
||||||
if( !m_fIsBack && UTIL_CoopGetSpawnPoint( &point, &angles ) )
|
|
||||||
if( (origin - point).Length() < 500 )
|
|
||||||
m_fIsBack = true;
|
|
||||||
pev->rendercolor = g_vecZero;
|
|
||||||
if( m_fIsBack )
|
|
||||||
pev->rendercolor.z = 255;
|
|
||||||
else
|
|
||||||
pev->rendercolor.y = 255;
|
|
||||||
}
|
|
||||||
|
|
||||||
// If some player is on train with global state, save id
|
// If some player is on train with global state, save id
|
||||||
|
|
||||||
CBaseEntity *FindTriggerTransition( char *pVolumeName )
|
CBaseEntity *FindTriggerTransition( char *pVolumeName )
|
||||||
|
@ -1537,46 +1498,97 @@ void CChangeLevel::ChangeLevelNow( CBaseEntity *pActivator )
|
||||||
{
|
{
|
||||||
edict_t *pentLandmark;
|
edict_t *pentLandmark;
|
||||||
|
|
||||||
LEVELLIST levels[16];
|
// LEVELLIST levels[16];
|
||||||
hudtextparms_t params = {};
|
hudtextparms_t params = {};
|
||||||
params.fadeinTime = 0.5;
|
params.fadeinTime = 0.5;
|
||||||
params.fadeoutTime = .5;
|
params.fadeoutTime = .5;
|
||||||
params.holdTime = 10;
|
params.holdTime = 10;
|
||||||
params.r2 = params.g2 = params.b2 = params.a2 = params.r1 = params.g1 = params.b1 = params.a1 = 255;
|
params.r2 = params.g2 = params.b2 = params.a2 = params.r1 = params.g1 = params.b1 = params.a1 = 255;
|
||||||
bool valid = false;
|
|
||||||
|
|
||||||
ASSERT( !FStrEq( m_szMapName, "" ) );
|
ASSERT( !FStrEq( m_szMapName, "" ) );
|
||||||
|
|
||||||
if( s_SavedCoords.valid )
|
if( m_coopData.fValid )
|
||||||
return; //already pending
|
return; //already pending
|
||||||
|
|
||||||
// forget touch by some fool
|
// forget touch by some fool
|
||||||
if( gpGlobals->time - pev->dmgtime > 30)
|
if( gpGlobals->time - pev->dmgtime > 30)
|
||||||
|
m_coopData.bitsTouchCount = 0;
|
||||||
|
|
||||||
|
// find best candidate for default spawn point
|
||||||
|
if( !m_coopData.fSpawnSaved )
|
||||||
{
|
{
|
||||||
m_uTouchCount = 0;
|
CBasePlayer *pRealActivator = NULL;
|
||||||
pev->nextthink = gpGlobals->time + 30;
|
|
||||||
|
if( pActivator )
|
||||||
|
{
|
||||||
|
// trigger touch
|
||||||
|
if( pActivator->IsNetClient() )
|
||||||
|
pRealActivator = (CBasePlayer*)pActivator;
|
||||||
|
|
||||||
|
|
||||||
|
// activate by path track?
|
||||||
|
if( !pRealActivator && pActivator->IsBSPModel() )
|
||||||
|
{
|
||||||
|
for( int i = 1; i < gpGlobals->maxClients; i++ )
|
||||||
|
{
|
||||||
|
CBaseEntity *plr = UTIL_PlayerByIndex( i );
|
||||||
|
if( plr && plr->IsNetClient() && plr->pev->groundentity == pActivator->edict() )
|
||||||
|
{
|
||||||
|
pRealActivator = (CBasePlayer*)plr;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// activate by something other, player nearest to transition volume center
|
||||||
|
if( !pRealActivator && m_coopData.fUsed )
|
||||||
|
{
|
||||||
|
CBaseEntity *pTransition = FindTriggerTransition( m_szLandmarkName );
|
||||||
|
|
||||||
|
if( pTransition )
|
||||||
|
{
|
||||||
|
Vector vecOrigin = VecBModelOrigin( pTransition->pev );
|
||||||
|
float dist = 9999;
|
||||||
|
|
||||||
|
for( int i = 1; i < gpGlobals->maxClients; i++ )
|
||||||
|
{
|
||||||
|
CBaseEntity *plr = UTIL_PlayerByIndex( i );
|
||||||
|
if( plr && plr->IsNetClient() && pTransition->Intersects( plr ) )
|
||||||
|
{
|
||||||
|
float diff = (vecOrigin - plr->pev->origin).Length();
|
||||||
|
if( dist > diff )
|
||||||
|
{
|
||||||
|
dist = diff;
|
||||||
|
pRealActivator = (CBasePlayer *)plr;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if( pRealActivator )
|
||||||
|
{
|
||||||
|
GGM_SavePosition(pRealActivator, &m_coopData.savedPosition);
|
||||||
|
m_hActivator = pRealActivator;
|
||||||
|
m_coopData.fSpawnSaved = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(mp_coop.value)
|
if(mp_coop.value)
|
||||||
{
|
{
|
||||||
SavedCoords l_SavedCoords = {};
|
|
||||||
// if not activated by touch, do not count players
|
// if not activated by touch, do not count players
|
||||||
if( !m_bUsed )
|
if( !m_coopData.fUsed )
|
||||||
{
|
{
|
||||||
m_uTouchCount |= 1 << ( ENTINDEX( pActivator->edict() ) - 1);
|
CBaseEntity *pActTrain = UTIL_CoopGetPlayerTrain(m_hActivator);
|
||||||
|
|
||||||
// Keep first toucher coords to save correct spawn angles
|
unsigned int count1 = 0; // players that touched
|
||||||
if( !m_fSpawnSaved && pActivator->IsPlayer() )
|
unsigned int count2 = 0; // all players
|
||||||
{
|
|
||||||
m_vecSpawnOrigin = pActivator->pev->origin;
|
|
||||||
m_vecSpawnAngles = pActivator->pev->angles;
|
|
||||||
m_fSpawnSaved = true;
|
|
||||||
UTIL_CoopSaveTrain( pActivator, &l_SavedCoords );
|
|
||||||
}
|
|
||||||
unsigned int count1 = 0;
|
|
||||||
unsigned int count2 = 0;
|
|
||||||
unsigned int i = 0;
|
unsigned int i = 0;
|
||||||
|
|
||||||
|
m_coopData.bitsTouchCount |= 1 << ( ENTINDEX( pActivator->edict() ) - 1);
|
||||||
|
|
||||||
// loop through all clients, count number of players
|
// loop through all clients, count number of players
|
||||||
for( i = 1; i <= gpGlobals->maxClients; i++ )
|
for( i = 1; i <= gpGlobals->maxClients; i++ )
|
||||||
{
|
{
|
||||||
|
@ -1586,37 +1598,32 @@ void CChangeLevel::ChangeLevelNow( CBaseEntity *pActivator )
|
||||||
if( !pTrain && UTIL_CoopIsBadPlayer( plr ) )
|
if( !pTrain && UTIL_CoopIsBadPlayer( plr ) )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
// refuse
|
||||||
|
if( plr && (pTrain != pActTrain) )
|
||||||
|
return;
|
||||||
|
|
||||||
// count only players spawned more 30 seconds ago
|
// count only players spawned more 30 seconds ago
|
||||||
if( plr && plr->IsPlayer() && (pTrain || (gpGlobals->time -((CBasePlayer*)plr)->gravgunmod_data.m_flSpawnTime ) > 30 ) && plr->pev->modelindex )
|
if( plr && plr->IsPlayer() && (pTrain || (gpGlobals->time -((CBasePlayer*)plr)->gravgunmod_data.m_flSpawnTime ) > 30 ) && plr->pev->modelindex )
|
||||||
{
|
{
|
||||||
count2++;
|
count2++;
|
||||||
|
|
||||||
// player touched trigger, save it's coordinates
|
// player touched trigger, count it
|
||||||
if( m_uTouchCount & (1<<(i - 1)) )
|
if( m_coopData.bitsTouchCount & (1<<(i - 1)) )
|
||||||
{
|
|
||||||
count1++;
|
count1++;
|
||||||
if( InTransitionVolume( plr, m_szLandmarkName ))
|
|
||||||
{
|
|
||||||
l_SavedCoords.fDuck |= !!(plr->pev->flags & FL_DUCKING);
|
|
||||||
UTIL_CoopSaveTrain( plr, &l_SavedCoords );
|
|
||||||
l_SavedCoords.iCount++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
i = 0;
|
i = 0;
|
||||||
if( !l_SavedCoords.trainsaved )
|
if( !pActTrain )
|
||||||
{
|
{
|
||||||
if( !count2 )
|
if( !count2 )
|
||||||
{
|
{
|
||||||
if( pActivator && pActivator->IsPlayer() && m_flRepeatTimer - gpGlobals->time < -1 )
|
if( pActivator && pActivator->IsPlayer() && m_coopData.flRepeatTimer - gpGlobals->time < -1 )
|
||||||
{
|
{
|
||||||
CBasePlayer *pPlayer = (CBasePlayer*)pActivator;
|
CBasePlayer *pPlayer = (CBasePlayer*)pActivator;
|
||||||
//UTIL_CoopPrintMessage("%s^7 trying activate changelevel too early\n", UTIL_CoopPlayerName( pPlayer ));
|
//UTIL_CoopPrintMessage("%s^7 trying activate changelevel too early\n", UTIL_CoopPlayerName( pPlayer ));
|
||||||
UTIL_CleanSpawnPoint( pPlayer->pev->origin, 50 );
|
UTIL_CleanSpawnPoint( pPlayer->pev->origin, 50 );
|
||||||
m_flRepeatTimer = gpGlobals->time;
|
m_coopData.flRepeatTimer = gpGlobals->time;
|
||||||
pPlayer->gravgunmod_data.m_iLocalConfirm = -2;
|
pPlayer->gravgunmod_data.m_iLocalConfirm = -2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1624,8 +1631,6 @@ void CChangeLevel::ChangeLevelNow( CBaseEntity *pActivator )
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( count1 > 1 && count1 < count2 / 3 )
|
|
||||||
i = count1 - count1 < count2 / 3;
|
|
||||||
if( count1 > 1 && count1 < count2 / 3 )
|
if( count1 > 1 && count1 < count2 / 3 )
|
||||||
i = 1;
|
i = 1;
|
||||||
|
|
||||||
|
@ -1637,7 +1642,7 @@ void CChangeLevel::ChangeLevelNow( CBaseEntity *pActivator )
|
||||||
if( count2 )
|
if( count2 )
|
||||||
{
|
{
|
||||||
pev->rendercolor.x = count1 * 255 / count2;
|
pev->rendercolor.x = count1 * 255 / count2;
|
||||||
if( m_fIsBack )
|
if( m_coopData.fIsBack )
|
||||||
pev->rendercolor.z = 255 - pev->rendercolor.x;
|
pev->rendercolor.z = 255 - pev->rendercolor.x;
|
||||||
else
|
else
|
||||||
pev->rendercolor.y = 255 - pev->rendercolor.x;
|
pev->rendercolor.y = 255 - pev->rendercolor.x;
|
||||||
|
@ -1645,40 +1650,22 @@ void CChangeLevel::ChangeLevelNow( CBaseEntity *pActivator )
|
||||||
|
|
||||||
ALERT( at_console, "^3CHANGELEVEL:^7 %d %d\n", count2, count1 );
|
ALERT( at_console, "^3CHANGELEVEL:^7 %d %d\n", count2, count1 );
|
||||||
|
|
||||||
if( !m_fIsBack && count1 > 1 && count1 < count2 / 3 )
|
if( !m_coopData.fIsBack && count1 > 1 && count1 < count2 / 3 )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
//if( count1 <= 1 && count2 == 2 )
|
//if( count1 <= 1 && count2 == 2 )
|
||||||
// return;
|
// return;
|
||||||
|
|
||||||
if( m_fIsBack )
|
if( m_coopData.fIsBack )
|
||||||
if( !COOP_ConfirmMenu( this, pActivator, count2, m_szMapName ) )
|
if( !COOP_ConfirmMenu( this, pActivator, count2, m_szMapName ) )
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( m_fSpawnSaved )
|
ALERT( at_console, "^2CHANGELEVEL:^7 %d %d %d\n", count2, count1, (int)m_coopData.fIsBack);
|
||||||
{
|
|
||||||
l_SavedCoords.triggerangles = m_vecSpawnAngles;
|
|
||||||
l_SavedCoords.triggerorigin = m_vecSpawnOrigin;
|
|
||||||
valid = true;
|
|
||||||
}
|
|
||||||
ALERT( at_console, "^2CHANGELEVEL:^7 %d %d %d\n", count2, count1, (int)m_fIsBack);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
l_SavedCoords.fDuck = false;
|
|
||||||
// Get current player's coordinates
|
|
||||||
if( pActivator && pActivator->IsPlayer() )
|
|
||||||
{
|
|
||||||
l_SavedCoords.triggerangles = pActivator->pev->angles;
|
|
||||||
l_SavedCoords.triggerorigin = pActivator->pev->origin;
|
|
||||||
valid = true;
|
|
||||||
l_SavedCoords.fDuck |= !!(pActivator->pev->flags & FL_DUCKING);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
UTIL_CoopSaveTrain( pActivator, &l_SavedCoords );
|
|
||||||
s_SavedCoords = l_SavedCoords;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -1687,8 +1674,8 @@ void CChangeLevel::ChangeLevelNow( CBaseEntity *pActivator )
|
||||||
else if( g_pGameRules->IsDeathmatch() )
|
else if( g_pGameRules->IsDeathmatch() )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
m_uTouchCount = 0;
|
m_coopData.bitsTouchCount = 0;
|
||||||
m_bUsed = false;
|
m_coopData.fUsed = false;
|
||||||
// Some people are firing these multiple times in a frame, disable
|
// Some people are firing these multiple times in a frame, disable
|
||||||
if( gpGlobals->time == pev->dmgtime )
|
if( gpGlobals->time == pev->dmgtime )
|
||||||
return;
|
return;
|
||||||
|
@ -1706,7 +1693,7 @@ void CChangeLevel::ChangeLevelNow( CBaseEntity *pActivator )
|
||||||
{
|
{
|
||||||
CBaseEntity *plr = UTIL_PlayerByIndex( i );
|
CBaseEntity *plr = UTIL_PlayerByIndex( i );
|
||||||
|
|
||||||
if( plr && plr->IsPlayer() && ( !FindTriggerTransition( m_szLandmarkName ) || (gpGlobals->time -((CBasePlayer*)plr)->gravgunmod_data.m_flSpawnTime ) > 30 || m_fSkipSpawnCheck ) )
|
if( plr && plr->IsPlayer() && ( !FindTriggerTransition( m_szLandmarkName ) || (gpGlobals->time -((CBasePlayer*)plr)->gravgunmod_data.m_flSpawnTime ) > 30 || m_coopData.fSkipSpawnCheck ) )
|
||||||
{
|
{
|
||||||
if( InTransitionVolume( plr, m_szLandmarkName ))
|
if( InTransitionVolume( plr, m_szLandmarkName ))
|
||||||
{
|
{
|
||||||
|
@ -1726,13 +1713,17 @@ void CChangeLevel::ChangeLevelNow( CBaseEntity *pActivator )
|
||||||
}
|
}
|
||||||
else if( ( (gpGlobals->time -((CBasePlayer*)pPlayer)->gravgunmod_data.m_flSpawnTime ) < 30 ) && FindTriggerTransition( m_szLandmarkName ) || !InTransitionVolume( pPlayer, m_szLandmarkName ) )
|
else if( ( (gpGlobals->time -((CBasePlayer*)pPlayer)->gravgunmod_data.m_flSpawnTime ) < 30 ) && FindTriggerTransition( m_szLandmarkName ) || !InTransitionVolume( pPlayer, m_szLandmarkName ) )
|
||||||
{
|
{
|
||||||
ALERT( at_console, "Player isn't in the transition volume %s, aborting\n", m_szLandmarkName );
|
if( !m_coopData.fSkipSpawnCheck )
|
||||||
if( !m_fSkipSpawnCheck )
|
{
|
||||||
|
ALERT( at_console, "Player isn't in the transition volume %s, aborting\n", m_szLandmarkName );
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
ALERT( at_console, "Player isn't in the transition volume %s, but changelevel forced\n", m_szLandmarkName );
|
||||||
}
|
}
|
||||||
else ALERT( at_console, "Player is in the transition volume %s, changing level now\n", m_szLandmarkName );
|
else ALERT( at_console, "Player is in the transition volume %s, changing level now\n", m_szLandmarkName );
|
||||||
|
|
||||||
UTIL_CoopPrintMessage( "%s^7 activated changelevel, spawncheck is %d\n", UTIL_CoopPlayerName( pPlayer ), (int)!m_fSkipSpawnCheck );
|
UTIL_CoopPrintMessage( "%s^7 activated changelevel, spawncheck is %d\n", UTIL_CoopPlayerName( pPlayer ), (int)!m_coopData.fSkipSpawnCheck );
|
||||||
|
|
||||||
// This object will get removed in the call to CHANGE_LEVEL, copy the params into "safe" memory
|
// This object will get removed in the call to CHANGE_LEVEL, copy the params into "safe" memory
|
||||||
strcpy( st_szNextMap, m_szMapName );
|
strcpy( st_szNextMap, m_szMapName );
|
||||||
|
@ -1746,10 +1737,10 @@ void CChangeLevel::ChangeLevelNow( CBaseEntity *pActivator )
|
||||||
if( !FNullEnt( pentLandmark ) )
|
if( !FNullEnt( pentLandmark ) )
|
||||||
{
|
{
|
||||||
strcpy( st_szNextSpot, m_szLandmarkName );
|
strcpy( st_szNextSpot, m_szLandmarkName );
|
||||||
strcpy( s_SavedCoords.landmark, m_szLandmarkName );
|
gpGlobals->vecLandmarkOffset = VARS( pentLandmark )->origin;
|
||||||
s_SavedCoords.offset = gpGlobals->vecLandmarkOffset = VARS( pentLandmark )->origin;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Create an entity to fire the changetarget
|
// Create an entity to fire the changetarget
|
||||||
if( m_changeTarget )
|
if( m_changeTarget )
|
||||||
{
|
{
|
||||||
|
@ -1769,6 +1760,8 @@ void CChangeLevel::ChangeLevelNow( CBaseEntity *pActivator )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
m_coopData.fValid = true;
|
||||||
|
|
||||||
//ALERT( at_console, "Level touches %d levels\n", ChangeList( levels, 16 ) );
|
//ALERT( at_console, "Level touches %d levels\n", ChangeList( levels, 16 ) );
|
||||||
ALERT( at_console, "CHANGE LEVEL: %s %s\n", st_szNextMap, st_szNextSpot );
|
ALERT( at_console, "CHANGE LEVEL: %s %s\n", st_szNextMap, st_szNextSpot );
|
||||||
COOP_ResetVote();
|
COOP_ResetVote();
|
||||||
|
@ -1793,9 +1786,8 @@ void CChangeLevel::ChangeLevelNow( CBaseEntity *pActivator )
|
||||||
}
|
}
|
||||||
g_fPause = true;
|
g_fPause = true;
|
||||||
}
|
}
|
||||||
s_SavedCoords.fUsed = m_bUsed;
|
|
||||||
s_SavedCoords.valid = valid;
|
COOP_SetupLandmarkTransition( st_szNextMap, st_szNextSpot, gpGlobals->vecLandmarkOffset, m_coopData.fSpawnSaved?&m_coopData.savedPosition:NULL );
|
||||||
COOP_SetupLandmarkTransition( st_szNextMap, st_szNextSpot, gpGlobals->vecLandmarkOffset );
|
|
||||||
|
|
||||||
// wait 5 frames to make sure all players are in reconnected state
|
// wait 5 frames to make sure all players are in reconnected state
|
||||||
if( mp_coop_reconnect_hack.value )
|
if( mp_coop_reconnect_hack.value )
|
||||||
|
@ -1812,7 +1804,7 @@ void CChangeLevel::TouchChangeLevel( CBaseEntity *pOther )
|
||||||
if( !FClassnameIs( pOther->pev, "player" ) )
|
if( !FClassnameIs( pOther->pev, "player" ) )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
m_fSkipSpawnCheck = false;
|
m_coopData.fSkipSpawnCheck = false;
|
||||||
|
|
||||||
ChangeLevelNow( pOther );
|
ChangeLevelNow( pOther );
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue