Update gravgunmod

This commit is contained in:
mittorn 2017-11-11 21:29:47 +00:00
parent ab29b25db0
commit 4973eb01a7
14 changed files with 438 additions and 205 deletions

View File

@ -129,13 +129,13 @@ int GetEntityAPI2( DLL_FUNCTIONS *pFunctionTable, int *interfaceVersion )
} }
#endif #endif
int UTIL_CoopCheckSpawn( edict_t *pent ); int Ent_CheckEntitySpawn( edict_t *pent );
int DispatchSpawn( edict_t *pent ) int DispatchSpawn( edict_t *pent )
{ {
CBaseEntity *pEntity = (CBaseEntity *)GET_PRIVATE( pent ); CBaseEntity *pEntity = (CBaseEntity *)GET_PRIVATE( pent );
int ret = UTIL_CoopCheckSpawn( pent ); int ret = Ent_CheckEntitySpawn( pent );
if( ret ) if( ret )
return ret; return ret;

View File

@ -49,6 +49,8 @@ CBaseEntity
#include "monsterevent.h" #include "monsterevent.h"
#endif #endif
#include "enttools.h"
// C functions for external declarations that call the appropriate C++ methods // C functions for external declarations that call the appropriate C++ methods
#include "exportdef.h" #include "exportdef.h"
@ -350,6 +352,8 @@ public:
enum EGON_FIRESTATE { FIRE_OFF, FIRE_CHARGE }; enum EGON_FIRESTATE { FIRE_OFF, FIRE_CHARGE };
int m_fireState; int m_fireState;
EntoolsEntData enttools_data;
}; };
// Ugly technique to override base member functions // Ugly technique to override base member functions

View File

@ -83,7 +83,7 @@ BOOL ClientConnect( edict_t *pEntity, const char *pszName, const char *pszAddres
CBasePlayer *pl = (CBasePlayer *)CBaseEntity::Instance( pEntity ) ; CBasePlayer *pl = (CBasePlayer *)CBaseEntity::Instance( pEntity ) ;
if( pl ) if( pl )
{ {
pl->m_state = STATE_UNINITIALIZED; pl->gravgunmod_data.m_state = STATE_UNINITIALIZED;
pl->RemoveAllItems( TRUE ); pl->RemoveAllItems( TRUE );
UTIL_BecomeSpectator( pl ); UTIL_BecomeSpectator( pl );
} }
@ -140,7 +140,7 @@ void ClientDisconnect( edict_t *pEntity )
{ {
CBasePlayer *pPlayer = (CBasePlayer*)CBaseEntity::Instance( pEntity ); CBasePlayer *pPlayer = (CBasePlayer*)CBaseEntity::Instance( pEntity );
if( pPlayer ) if( pPlayer )
pPlayer->m_state = STATE_UNINITIALIZED; pPlayer->gravgunmod_data.m_state = STATE_UNINITIALIZED;
} }
} }
@ -219,20 +219,13 @@ void ClientPutInServer( edict_t *pEntity )
pPlayer = GetClassPtr((CBasePlayer *)pev); pPlayer = GetClassPtr((CBasePlayer *)pev);
pPlayer->SetCustomDecalFrames(-1); // Assume none; pPlayer->SetCustomDecalFrames(-1); // Assume none;
if( mp_coop.value && pPlayer->m_state == STATE_UNINITIALIZED )
g_engfuncs.pfnQueryClientCvarValue2( pEntity, "touch_enable", 111 );
pPlayer->m_state = STATE_CONNECTED; GGM_ClientPutinServer( pEntity, pPlayer );
// Allocate a CBasePlayer for pev, and call spawn // Allocate a CBasePlayer for pev, and call spawn
pPlayer->Spawn(); pPlayer->Spawn();
// AGHL-like spectator GGM_ClientFirstSpawn( pPlayer );
if( mp_spectator.value )
{
pPlayer->RemoveAllItems( TRUE );
UTIL_BecomeSpectator( pPlayer );
}
// Reset interpolation during first frame // Reset interpolation during first frame
pPlayer->pev->effects |= EF_NOINTERP; pPlayer->pev->effects |= EF_NOINTERP;
@ -614,7 +607,7 @@ void ClientUserInfoChanged( edict_t *pEntity, char *infobuffer )
g_engfuncs.pfnSetClientKeyValue( ENTINDEX(pEntity), infobuffer, "name", sName ); g_engfuncs.pfnSetClientKeyValue( ENTINDEX(pEntity), infobuffer, "name", sName );
// prevent phantom nickname changed messages // prevent phantom nickname changed messages
if( mp_coop.value && ((CBasePlayer *)pEntity->pvPrivateData)->m_state == STATE_UNINITIALIZED ) if( mp_coop.value && ((CBasePlayer *)pEntity->pvPrivateData)->gravgunmod_data.m_state == STATE_UNINITIALIZED )
return; return;
char text[256]; char text[256];
@ -711,7 +704,7 @@ void ServerActivate( edict_t *pEdictList, int edictCount, int clientMax )
// reset all players state // reset all players state
if( plr ) if( plr )
{ {
plr->m_state = STATE_UNINITIALIZED; plr->gravgunmod_data.m_state = STATE_UNINITIALIZED;
plr->RemoveAllItems( TRUE ); plr->RemoveAllItems( TRUE );
UTIL_BecomeSpectator( plr ); UTIL_BecomeSpectator( plr );
//plr->Spawn(); //plr->Spawn();
@ -1917,7 +1910,7 @@ void CvarValue2( const edict_t *pEnt, int requestID, const char *cvarName, const
if( mp_coop.value && pEnt && requestID == 111 && FStrEq( cvarName , "touch_enable" ) && atoi( value) ) if( mp_coop.value && pEnt && requestID == 111 && FStrEq( cvarName , "touch_enable" ) && atoi( value) )
{ {
CBasePlayer *player = (CBasePlayer * ) CBaseEntity::Instance( (edict_t*)pEnt ); CBasePlayer *player = (CBasePlayer * ) CBaseEntity::Instance( (edict_t*)pEnt );
player->m_fTouchMenu = !!atof( value ); player->gravgunmod_data.m_fTouchMenu = !!atof( value );
CLIENT_COMMAND((edict_t*)pEnt, "touch_addbutton \"_coopm\" \"*black\" \"coopmenu\" 0 0.05 0.15 0.11 0 0 0 128 335\ntouch_addbutton \"_coopmt\" \"#COOP MENU\" \"\" 0 0.05 0.16 0.11 255 255 127 255 79 2\nm1\n"); CLIENT_COMMAND((edict_t*)pEnt, "touch_addbutton \"_coopm\" \"*black\" \"coopmenu\" 0 0.05 0.15 0.11 0 0 0 128 335\ntouch_addbutton \"_coopmt\" \"#COOP MENU\" \"\" 0 0.05 0.16 0.11 255 255 127 255 79 2\nm1\n");
} }

View File

@ -206,7 +206,7 @@ void UTIL_BecomeSpectator( CBasePlayer *pPlayer )
void UTIL_SpawnPlayer( CBasePlayer *pPlayer ) void UTIL_SpawnPlayer( CBasePlayer *pPlayer )
{ {
pPlayer->m_state = STATE_SPAWNED; pPlayer->gravgunmod_data.m_state = STATE_SPAWNED;
pPlayer->m_iRespawnFrames = 0; pPlayer->m_iRespawnFrames = 0;
pPlayer->pev->effects &= ~EF_NODRAW; pPlayer->pev->effects &= ~EF_NODRAW;
@ -336,9 +336,9 @@ void UTIL_CoopLocalConfirmMenu(CBasePlayer *pPlayer)
"Единая Россия" "Единая Россия"
}; };
menu[pPlayer->m_iConfirmKey = RANDOM_LONG(2,4)] = "Confirm"; menu[pPlayer->gravgunmod_data.m_iConfirmKey = RANDOM_LONG(2,4)] = "Confirm";
UTIL_CoopShowMenu(pPlayer, "Confirm changing map BACK (NOT RECOMMENDED)?", ARRAYSIZE(menu), menu); UTIL_CoopShowMenu(pPlayer, "Confirm changing map BACK (NOT RECOMMENDED)?", ARRAYSIZE(menu), menu);
pPlayer->m_iMenuState = MENUSTATE_LOCAL_CONFIRM; pPlayer->gravgunmod_data.m_iMenuState = MENUSTATE_LOCAL_CONFIRM;
} }
@ -422,7 +422,7 @@ void GlobalMenu::ShowGlobalMenu( const char *title, int count, const char **menu
count2++; count2++;
CBasePlayer *player = (CBasePlayer *) plr; CBasePlayer *player = (CBasePlayer *) plr;
UTIL_CoopShowMenu( player, title, count, menu, 30 ); UTIL_CoopShowMenu( player, title, count, menu, 30 );
player->m_iMenuState = MENUSTATE_GLOBAL; player->gravgunmod_data.m_iMenuState = MENUSTATE_GLOBAL;
} }
} }
@ -434,9 +434,9 @@ void GlobalMenu::ConfirmMenu( CBasePlayer *pPlayer, CBaseEntity *trigger, const
{ {
if( g_iMenu && gpGlobals->time - m_flTime < 30 ) if( g_iMenu && gpGlobals->time - m_flTime < 30 )
return; // wait 30s befor new confirm vote return; // wait 30s befor new confirm vote
if( pPlayer->m_iMenuState == MENUSTATE_LOCAL_CONFIRM ) if( pPlayer->gravgunmod_data.m_iMenuState == MENUSTATE_LOCAL_CONFIRM )
return; return;
if( pPlayer->m_iLocalConfirm < 3 ) if( pPlayer->gravgunmod_data.m_iLocalConfirm < 3 )
{ {
UTIL_CoopLocalConfirmMenu( pPlayer ); UTIL_CoopLocalConfirmMenu( pPlayer );
return; return;
@ -460,7 +460,7 @@ void GlobalMenu::ConfirmMenu( CBasePlayer *pPlayer, CBaseEntity *trigger, const
void UTIL_CoopCheckpointMenu( CBasePlayer *pPlayer ) void UTIL_CoopCheckpointMenu( CBasePlayer *pPlayer )
{ {
//if( pPlayer->m_state == STATE_SPAWNED ) //if( pPlayer->gravgunmod_data.m_state == STATE_SPAWNED )
{ {
if( mp_coop_checkpoints.value ) if( mp_coop_checkpoints.value )
@ -469,12 +469,12 @@ void UTIL_CoopCheckpointMenu( CBasePlayer *pPlayer )
"New checkpoint" "New checkpoint"
}; };
int i; int i;
if( pPlayer->m_state == STATE_SPECTATOR || pPlayer->m_state == STATE_SPECTATOR_BEGIN ) if( pPlayer->gravgunmod_data.m_state == STATE_SPECTATOR || pPlayer->gravgunmod_data.m_state == STATE_SPECTATOR_BEGIN )
menu[0] = "Just spawn"; menu[0] = "Just spawn";
for( i = 1; g_checkpoints[i-1].time; i++ ) for( i = 1; g_checkpoints[i-1].time; i++ )
menu[i] = g_checkpoints[i-1].str; menu[i] = g_checkpoints[i-1].str;
UTIL_CoopShowMenu( pPlayer, "Select checkpoint", i, menu ); UTIL_CoopShowMenu( pPlayer, "Select checkpoint", i, menu );
pPlayer->m_iMenuState = MENUSTATE_CHECKPOINT; pPlayer->gravgunmod_data.m_iMenuState = MENUSTATE_CHECKPOINT;
} }
} }
} }
@ -516,9 +516,9 @@ void UTIL_CoopVoteMenu( CBasePlayer *pPlayer )
void UTIL_CoopMenu( CBasePlayer *pPlayer ) void UTIL_CoopMenu( CBasePlayer *pPlayer )
{ {
if( pPlayer->m_state == STATE_SPAWNED ) if( pPlayer->gravgunmod_data.m_state == STATE_SPAWNED )
{ {
pPlayer->m_iMenuState = MENUSTATE_COOPMENU; pPlayer->gravgunmod_data.m_iMenuState = MENUSTATE_COOPMENU;
if( mp_coop.value ) if( mp_coop.value )
{ {
const char *menu[] = { const char *menu[] = {
@ -534,9 +534,9 @@ void UTIL_CoopMenu( CBasePlayer *pPlayer )
UTIL_CoopShowMenu( pPlayer, "Coop menu", count1, menu ); UTIL_CoopShowMenu( pPlayer, "Coop menu", count1, menu );
} }
} }
else if ( pPlayer->m_state == STATE_SPECTATOR ) else if ( pPlayer->gravgunmod_data.m_state == STATE_SPECTATOR )
{ {
pPlayer->m_iMenuState = MENUSTATE_COOPMENU_SPEC; pPlayer->gravgunmod_data.m_iMenuState = MENUSTATE_COOPMENU_SPEC;
if( mp_coop.value ) if( mp_coop.value )
{ {
const char *menu[] = { const char *menu[] = {
@ -551,7 +551,7 @@ void UTIL_CoopMenu( CBasePlayer *pPlayer )
void UTIL_CoopProcessMenu( CBasePlayer *pPlayer, int imenu ) void UTIL_CoopProcessMenu( CBasePlayer *pPlayer, int imenu )
{ {
switch( pPlayer->m_iMenuState ) switch( pPlayer->gravgunmod_data.m_iMenuState )
{ {
case MENUSTATE_COOPMENU_SPEC: case MENUSTATE_COOPMENU_SPEC:
if( imenu == 1 ) if( imenu == 1 )
@ -561,17 +561,17 @@ void UTIL_CoopProcessMenu( CBasePlayer *pPlayer, int imenu )
else else
{ {
UTIL_SpawnPlayer( pPlayer ); UTIL_SpawnPlayer( pPlayer );
pPlayer->m_state = STATE_SPAWNED; pPlayer->gravgunmod_data.m_state = STATE_SPAWNED;
} }
} }
if( imenu == 2 ) if( imenu == 2 )
{ {
pPlayer->m_state = STATE_SPECTATOR; pPlayer->gravgunmod_data.m_state = STATE_SPECTATOR;
CLIENT_COMMAND( pPlayer->edict(), "touch_show _coopm*\n" ); CLIENT_COMMAND( pPlayer->edict(), "touch_show _coopm*\n" );
} }
break; break;
case MENUSTATE_COOPMENU: case MENUSTATE_COOPMENU:
if( pPlayer->m_state != STATE_SPAWNED ) if( pPlayer->gravgunmod_data.m_state != STATE_SPAWNED )
break; break;
if( imenu == 1 ) if( imenu == 1 )
{ {
@ -586,7 +586,7 @@ void UTIL_CoopProcessMenu( CBasePlayer *pPlayer, int imenu )
{ {
pPlayer->RemoveAllItems( TRUE ); pPlayer->RemoveAllItems( TRUE );
UTIL_BecomeSpectator( pPlayer ); UTIL_BecomeSpectator( pPlayer );
pPlayer->m_state = STATE_SPECTATOR; pPlayer->gravgunmod_data.m_state = STATE_SPECTATOR;
} }
if( imenu == 4 ) if( imenu == 4 )
{ {
@ -604,7 +604,7 @@ void UTIL_CoopProcessMenu( CBasePlayer *pPlayer, int imenu )
case MENUSTATE_CHECKPOINT: case MENUSTATE_CHECKPOINT:
if( imenu == 1 ) if( imenu == 1 )
{ {
if( pPlayer->m_state != STATE_SPAWNED ) if( pPlayer->gravgunmod_data.m_state != STATE_SPAWNED )
UTIL_SpawnPlayer( pPlayer ); UTIL_SpawnPlayer( pPlayer );
else if( !UTIL_CoopIsBadPlayer( pPlayer ) ) else if( !UTIL_CoopIsBadPlayer( pPlayer ) )
UTIL_CoopNewCheckpoint( pPlayer->pev ); UTIL_CoopNewCheckpoint( pPlayer->pev );
@ -618,16 +618,16 @@ void UTIL_CoopProcessMenu( CBasePlayer *pPlayer, int imenu )
} }
break; break;
case MENUSTATE_LOCAL_CONFIRM: case MENUSTATE_LOCAL_CONFIRM:
if( imenu - 1 == pPlayer->m_iConfirmKey ) if( imenu - 1 == pPlayer->gravgunmod_data.m_iConfirmKey )
pPlayer->m_iLocalConfirm++; pPlayer->gravgunmod_data.m_iLocalConfirm++;
else else
pPlayer->m_iLocalConfirm = 0; pPlayer->gravgunmod_data.m_iLocalConfirm = 0;
pPlayer->m_iMenuState = MENUSTATE_NONE; pPlayer->gravgunmod_data.m_iMenuState = MENUSTATE_NONE;
break; break;
default: default:
break; break;
} }
//pPlayer->m_iMenuState = MENUSTATE_NONE; //pPlayer->gravgunmod_data.m_iMenuState = MENUSTATE_NONE;
} }
bool UTIL_CoopRestorePlayerCoords(CBaseEntity *player, Vector *origin, Vector *angles ) bool UTIL_CoopRestorePlayerCoords(CBaseEntity *player, Vector *origin, Vector *angles )
@ -772,7 +772,7 @@ extern int gmsgShowMenu;
void UTIL_CoopShowMenu( CBasePlayer *pPlayer, const char *title, int count, const char **slot, signed char time ) void UTIL_CoopShowMenu( CBasePlayer *pPlayer, const char *title, int count, const char **slot, signed char time )
{ {
if( pPlayer->m_fTouchMenu) if( pPlayer->gravgunmod_data.m_fTouchMenu)
{ {
char buf[256]; char buf[256];
#define MENU_STR(VAR) (#VAR) #define MENU_STR(VAR) (#VAR)
@ -833,103 +833,6 @@ bool UTIL_CoopConfirmMenu(CBaseEntity *pTrigger, CBaseEntity *pActivator, int co
return true; return true;
} }
#include <string.h>
/* @NOPEDANTRY: ignore use of reserved identifier */
static char *strrstr(const char *x, const char *y) {
char *prev = NULL;
char *next;
if (*y == '\0')
return (char*)strchr(x, '\0');
while ((next = (char*)strstr(x, y)) != NULL) {
prev = next;
x = next + 1;
}
return prev;
}
int UTIL_CheckForEntTools( edict_t *pent )
{
if( pent->v.targetname )
{
char *s = (char*)STRING( pent->v.targetname );
char str[256];
strcpy( str, s );
s = strrstr( str, "_e" );
if( s )
{
*s = 0;
s = s + 2;
if( atoi(s) == ENTINDEX( pent ) )
{
s = strrstr( str, "_");
if( s )
{
int userid = atoi( s + 1 );
for( int i = 1; i < gpGlobals->maxClients; i++ )
if( userid == g_engfuncs.pfnGetPlayerUserId( INDEXENT( i ) ) )
return i;
}
}
}
}
return 0;
}
int UTIL_CoopCheckSpawn( edict_t *pent )
{
if( mp_checkentities.value )
{
const char *szClassName = NULL;
if( !pent->v.classname )
return 0;
szClassName = STRING( pent->v.classname );
if( !szClassName || !szClassName[0] )
return 0;
if( strstr( szClassName, "monster_") )
{
CBasePlayer *pPlayer = (CBasePlayer*)UTIL_PlayerByIndex( UTIL_CheckForEntTools( pent ) );
if( pPlayer )
{
if( UTIL_CoopIsBadPlayer( pPlayer ) )
{
pent->v.flags = FL_KILLME;
return -1;
}
if( gpGlobals->time - pPlayer->m_fEnttoolsMonsterTime < 5 )
{
UTIL_CoopKickPlayer( pPlayer );
pent->v.flags = FL_KILLME;
return -1;
}
if( gpGlobals->time - pPlayer->m_fEnttoolsMonsterTime > 120 )
pPlayer->m_iEnttoolsMonsters = 0;
if( pPlayer->m_iEnttoolsMonsters > 5 )
{
UTIL_CoopKickPlayer( pPlayer );
pent->v.flags = FL_KILLME;
return -1;
}
pPlayer->m_iEnttoolsMonsters++;
pPlayer->m_fEnttoolsMonsterTime = gpGlobals->time;
}
}
}
return 0;
}
void COOP_RegisterCVars() void COOP_RegisterCVars()
{ {
CVAR_REGISTER( &mp_coop ); CVAR_REGISTER( &mp_coop );

View File

@ -2,19 +2,15 @@
#include "util.h" #include "util.h"
#include "cbase.h" #include "cbase.h"
#include "game.h" #include "game.h"
#include "player.h"
#define Ent_IsValidEdict( e ) ( e && !e->free ) #define Ent_IsValidEdict( e ) ( e && !e->free )
bool Q_isdigit( const char *str ) // stop any actions with players
{ static cvar_t mp_enttools_players = { "mp_enttools_players", "0", FCVAR_SERVER };
if( str && *str ) // prevent ent_fire with entities not created with enttools
{ static cvar_t mp_enttools_lockmapentities = { "mp_enttools_lockmapentities", "0", FCVAR_SERVER };
while( isdigit( *str )) str++; static cvar_t mp_enttools_checkowner = { "mp_enttools_checkowner", "0", FCVAR_SERVER };
if( !*str ) return true;
}
return false;
}
bool Q_stricmpext( const char *pattern, const char *text ); bool Q_stricmpext( const char *pattern, const char *text );
static bool Q_starcmp( const char *pattern, const char *text ) static bool Q_starcmp( const char *pattern, const char *text )
@ -64,6 +60,114 @@ bool Q_stricmpext( const char *pattern, const char *text )
return true; return true;
} }
bool Q_isdigit( const char *str )
{
if( str && *str )
{
while( isdigit( *str )) str++;
if( !*str ) return true;
}
return false;
}
typedef struct entblacklist_s
{
struct entblacklist_s *next;
char pattern[32];
int limit;
int behaviour;
} entblacklist_t;
entblacklist_t *entblacklist;
void Ent_AddToBlacklist_f( void )
{
if( CMD_ARGC() != 4 )
{
ALERT( at_console, "Usage: mp_enttools_blacklist <pattern> <per minute limit> <behaviour (0 - block, 1 - kick, 2 - ban)>\n" );
}
entblacklist_t *node = (entblacklist_t *)malloc( sizeof( entblacklist_t ) );
node->next = entblacklist;
strncpy( node->pattern, CMD_ARGV(1), 31 );
node->pattern[32] = 0;
node->limit = atoi( CMD_ARGV(2) );
node->behaviour = atoi( CMD_ARGV( 3 ) );
entblacklist = node;
}
bool Ent_CheckFire( edict_t *player, edict_t *ent, const char *command )
{
if( !mp_enttools_players.value && ENTINDEX( ent ) < gpGlobals->maxClients + 1 )
return false;
CBaseEntity *pEntity = CBaseEntity::Instance( ent );
if( pEntity )
{
if( mp_enttools_lockmapentities.value && !pEntity->enttools_data.enttools )
return false;
// only if player online
if( mp_enttools_checkowner.value == 1 )
{
if( GGM_PlayerByID( pEntity->enttools_data.ownerid ) )
return !strcmp( pEntity->enttools_data.ownerid, GGM_GetPlayerID( player ) );
}
if( mp_enttools_checkowner.value == 2 )
{
return !strcmp( pEntity->enttools_data.ownerid, GGM_GetPlayerID( player ) );
}
}
return true;
}
bool Ent_CheckCreate( edict_t *player, const char *classname )
{
CBasePlayer *p = (CBasePlayer*)CBaseEntity::Instance(player);
entblacklist_t *node;
if( !p )
return false;
if( p->gravgunmod_data.m_flEntScope > 1 )
return false;
if( gpGlobals->time - p->gravgunmod_data.m_flEntTime > 60 )
{
p->gravgunmod_data.m_flEntTime = gpGlobals->time;
p->gravgunmod_data.m_flEntScope = 0;
}
for( node = entblacklist; node; node = node->next )
{
if( Q_stricmpext(node->pattern, classname ) )
{
if( !node->limit || ( p->gravgunmod_data.m_flEntScope + 1.0f / (float)node->limit > 1 ) )
{
// remove all created entities
Ent_RunGC( false, true, GGM_GetPlayerID( player ) );
if( node->behaviour == 2 )
{
SERVER_COMMAND( UTIL_VarArgs("banid 0 #%d kick\nwriteid\n", GETPLAYERUSERID( player ) ) );
}
else if( node->behaviour == 1 )
{
SERVER_COMMAND( UTIL_VarArgs("kick #%d\nwriteid\n", GETPLAYERUSERID( player ) ) );
}
return false;
}
p->gravgunmod_data.m_flEntScope += 1.0f / (float)node->limit;
}
}
return true;
}
void Ent_ClientPrintf( edict_t *player, const char *format, ... ) void Ent_ClientPrintf( edict_t *player, const char *format, ... )
{ {
va_list argptr; va_list argptr;
@ -427,6 +531,9 @@ void Ent_Fire_f( edict_t *player )
continue; continue;
} }
if( !Ent_CheckFire( player, ent, CMD_ARGV( 2 ) ) )
return;
Ent_ClientPrintf( player, "entity %i\n", i ); Ent_ClientPrintf( player, "entity %i\n", i );
count++; count++;
@ -649,6 +756,9 @@ void Ent_Create_f( edict_t *player )
return; return;
} }
if( !Ent_CheckCreate( player, CMD_ARGV(1) ) )
return;
classname = ALLOC_STRING( CMD_ARGV( 1 ) ); classname = ALLOC_STRING( CMD_ARGV( 1 ) );
ent = CREATE_NAMED_ENTITY( classname ); ent = CREATE_NAMED_ENTITY( classname );
@ -689,18 +799,19 @@ void Ent_Create_f( edict_t *player )
if( !ent->v.targetname ) if( !ent->v.targetname )
{ {
char newname[256], clientname[256]; char newname[256], clientname[256];
int j;
for( i = 0; i < 32; i++ ) for( j = 0; j < 32; j++ )
{ {
char c = tolower( (STRING( player->v.netname ))[i] ); char c = tolower( (STRING( player->v.netname ))[j] );
if( c < 'a' || c > 'z' ) if( c < 'a' || c > 'z' )
c = '_'; c = '_';
if( !(STRING( player->v.netname ))[i] ) if( !(STRING( player->v.netname ))[j] )
{ {
clientname[i] = 0; clientname[j] = 0;
break; break;
} }
clientname[i] = c; clientname[j] = c;
} }
// generate name based on nick name and index // generate name based on nick name and index
@ -740,6 +851,13 @@ void Ent_Create_f( edict_t *player )
if( pkvd.fHandled ) if( pkvd.fHandled )
Ent_ClientPrintf( player, "value \"%s\" set to \"%s\"!\n", pkvd.szKeyName, pkvd.szValue ); Ent_ClientPrintf( player, "value \"%s\" set to \"%s\"!\n", pkvd.szKeyName, pkvd.szValue );
} }
CBaseEntity *entity = CBaseEntity::Instance( ent );
if( entity )
{
entity->enttools_data.enttools = true;
strcpy( entity->enttools_data.ownerid, GGM_GetPlayerID( player ) );
}
} }
typedef struct ucmd_s typedef struct ucmd_s
{ {
@ -789,4 +907,8 @@ void ENT_RegisterCVars( void )
{ {
CVAR_REGISTER( &mp_enttools_enable ); CVAR_REGISTER( &mp_enttools_enable );
CVAR_REGISTER( &mp_enttools_maxfire ); CVAR_REGISTER( &mp_enttools_maxfire );
CVAR_REGISTER( &mp_enttools_lockmapentities );
CVAR_REGISTER( &mp_enttools_checkowner );
CVAR_REGISTER( &mp_enttools_players );
g_engfuncs.pfnAddServerCommand( "mp_enttools_addblacklist", Ent_AddToBlacklist_f );
} }

View File

@ -5,5 +5,11 @@ extern cvar_t mp_enttools_maxfire;
extern cvar_t mp_enttools_enable; extern cvar_t mp_enttools_enable;
bool Ent_ProcessClientCommand( edict_t *player ); bool Ent_ProcessClientCommand( edict_t *player );
void ENT_RegisterCVars( void ); void ENT_RegisterCVars( void );
struct EntoolsEntData {
bool enttools; // created by enttools
char ownerid[32];
};
#endif // ENTTOOLS_H #endif // ENTTOOLS_H

View File

@ -65,9 +65,9 @@ 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->m_state == STATE_POINT_SELECT ) if( pPlayer->gravgunmod_data.m_state == STATE_POINT_SELECT )
{ {
pPlayer->m_state = STATE_SPAWNED; pPlayer->gravgunmod_data.m_state = STATE_SPAWNED;
pPlayer->pev->effects &= ~EF_NODRAW; pPlayer->pev->effects &= ~EF_NODRAW;
pPlayer->pev->takedamage = DAMAGE_YES; pPlayer->pev->takedamage = DAMAGE_YES;
@ -104,7 +104,7 @@ edict_t *CGameRules::GetPlayerSpawnSpot( CBasePlayer *pPlayer )
UTIL_HudMessage( pPlayer, params, "Server cannot select a spawnpoint\nplease fly to it manually\nand press attack button" ); UTIL_HudMessage( pPlayer, params, "Server cannot select a spawnpoint\nplease fly to it manually\nand press attack button" );
// select spawn point // select spawn point
pPlayer->m_state = STATE_POINT_SELECT; pPlayer->gravgunmod_data.m_state = STATE_POINT_SELECT;
pPlayer->m_afButtonPressed = 0; pPlayer->m_afButtonPressed = 0;
if(pPlayer->pev->origin.Length() > 8192) if(pPlayer->pev->origin.Length() > 8192)

View File

@ -2,8 +2,10 @@
#include "util.h" #include "util.h"
#include "cbase.h" #include "cbase.h"
#include "gravgunmod.h" #include "gravgunmod.h"
#include "player.h"
#include "coop_util.h" #include "coop_util.h"
cvar_t cvar_allow_gravgun = { "mp_allow_gravgun","1", FCVAR_SERVER }; cvar_t cvar_allow_gravgun = { "mp_allow_gravgun","1", FCVAR_SERVER };
cvar_t cvar_allow_ar2 = { "mp_allow_ar2","0", FCVAR_SERVER }; cvar_t cvar_allow_ar2 = { "mp_allow_ar2","0", FCVAR_SERVER };
cvar_t cvar_ar2_mp5 = { "mp_ar2_mp5","0", FCVAR_SERVER }; cvar_t cvar_ar2_mp5 = { "mp_ar2_mp5","0", FCVAR_SERVER };
@ -19,6 +21,8 @@ cvar_t mp_gravgun_players = { "mp_gravgun_players", "0", FCVAR_SERVER };
cvar_t mp_fixhornetbug = { "mp_fixhornetbug", "0", FCVAR_SERVER }; cvar_t mp_fixhornetbug = { "mp_fixhornetbug", "0", FCVAR_SERVER };
cvar_t mp_checkentities = { "mp_checkentities", "0", FCVAR_SERVER }; cvar_t mp_checkentities = { "mp_checkentities", "0", FCVAR_SERVER };
void Ent_RunGC_f( void );
void GGM_RegisterCVars( void ) void GGM_RegisterCVars( void )
{ {
CVAR_REGISTER( &cvar_allow_ar2 ); CVAR_REGISTER( &cvar_allow_ar2 );
@ -34,4 +38,192 @@ void GGM_RegisterCVars( void )
CVAR_REGISTER( &mp_gravgun_players ); CVAR_REGISTER( &mp_gravgun_players );
CVAR_REGISTER( &mp_fixhornetbug ); CVAR_REGISTER( &mp_fixhornetbug );
CVAR_REGISTER( &mp_checkentities ); CVAR_REGISTER( &mp_checkentities );
g_engfuncs.pfnAddServerCommand( "ent_rungc", Ent_RunGC_f );
}
void Ent_RunGC( bool common, bool enttools, const char *userid )
{
int i, count = 0, removed = 0;
edict_t *ent = g_engfuncs.pfnPEntityOfEntIndex( gpGlobals->maxClients + 5 );
ALERT( at_warning, "Running garbage collector\n" );
for( i = gpGlobals->maxClients; i < gpGlobals->maxEntities; i++, ent++ )
{
const char *classname = STRING( ent->v.classname );
if( ent->free )
continue;
if( !classname || !ent->v.classname || !classname[0] )
continue;
count++;
if( ent->v.flags & FL_KILLME )
continue;
if( common )
{
if( !strcmp( classname, "gib" ) )
{
ent->v.flags |= FL_KILLME;
removed++;
continue;
}
if( !strncmp( classname, "monster_", 8 ) && ent->v.health <= 0 || ent->v.deadflag != DEAD_NO )
{
ent->v.flags |= FL_KILLME;
removed++;
continue;
}
}
if( !enttools )
{
if( strncmp( classname, "monster_", 8 ) || strncmp( classname, "weapon_", 7 ) || strncmp( classname, "ammo_", 5 ) )
continue;
}
if( !ent->v.owner && ent->v.spawnflags & SF_NORESPAWN )
{
ent->v.flags |= FL_KILLME;
removed++;
continue;
}
CBaseEntity *entity = CBaseEntity::Instance( ent );
if( !entity )
{
ent->v.flags |= FL_KILLME;
removed++;
continue;
}
if( enttools && entity->enttools_data.enttools )
{
if( !userid || !strcmp( userid, entity->enttools_data.ownerid ) )
{
ent->v.flags |= FL_KILLME;
removed++;
continue;
}
}
else if( common && !entity->IsInWorld() )
{
ent->v.flags |= FL_KILLME;
removed++;
continue;
}
}
ALERT( at_notice, "Total %d entities, %d cleaned\n", count, removed );
}
void Ent_RunGC_f()
{
int enttools = atoi(CMD_ARGV(1));
Ent_RunGC( !enttools, enttools, NULL );
}
int Ent_CheckEntitySpawn( edict_t *pent )
{
if( mp_checkentities.value )
{
int index = ENTINDEX( pent );
static uint counter, lastgc;
counter++;
if( gpGlobals->maxEntities - index < 10 )
{
ALERT( at_error, "REFUSING CREATING ENTITY %s\n", STRING( pent->v.classname ) );
Ent_RunGC( true, true, NULL );
return 1;
}
if( gpGlobals->maxEntities - index < 100 )
{
if( !strncmp( STRING(pent->v.classname), "env_", 4) )
return 1;
if( !strcmp( STRING(pent->v.classname), "gib" ) )
return 1;
Ent_RunGC( true, false, NULL );
return 0;
}
if( index > gpGlobals->maxEntities / 2 && counter - lastgc > 64 )
{
lastgc = counter;
Ent_RunGC( true, false, NULL );
return 0;
}
}
return 0;
}
void GGM_ClientPutinServer(edict_t *pEntity, CBasePlayer *pPlayer)
{
if( mp_coop.value && pPlayer->gravgunmod_data.m_state == STATE_UNINITIALIZED )
g_engfuncs.pfnQueryClientCvarValue2( pEntity, "touch_enable", 111 );
pPlayer->gravgunmod_data.m_state = STATE_CONNECTED;
const char *uid = GETPLAYERAUTHID( pPlayer->edict() );
if( strstr(uid, "PENDING") )
uid = g_engfuncs.pfnInfoKeyValue( g_engfuncs.pfnGetInfoKeyBuffer( pPlayer->edict() ), "ip" );
strncpy( pPlayer->gravgunmod_data.uid, uid, 31 );
pPlayer->gravgunmod_data.uid[32] = 0;
pPlayer->gravgunmod_data.m_flEntTime = 0;
pPlayer->gravgunmod_data.m_flEntScope = 0;
}
void GGM_ClientFirstSpawn(CBasePlayer *pPlayer)
{
// AGHL-like spectator
if( mp_spectator.value )
{
pPlayer->RemoveAllItems( TRUE );
UTIL_BecomeSpectator( pPlayer );
}
}
edict_t *GGM_PlayerByID( const char *id )
{
for( int i = 1; i <= gpGlobals->maxClients; i++ )
{
CBaseEntity *plr = UTIL_PlayerByIndex( i );
if( plr && plr->IsPlayer() )
{
CBasePlayer *player = (CBasePlayer *) plr;
if( !strcmp( player->gravgunmod_data.uid, id ) )
return player->edict();
}
}
return NULL;
}
const char *GGM_GetPlayerID( edict_t *player )
{
CBasePlayer *plr = (CBasePlayer*)CBaseEntity::Instance( player );
if( !plr->IsPlayer() )
return NULL;
return plr->gravgunmod_data.uid;
} }

View File

@ -19,6 +19,44 @@ extern cvar_t mp_fixhornetbug;
extern cvar_t mp_checkentities; extern cvar_t mp_checkentities;
void GGM_RegisterCVars( void ); void GGM_RegisterCVars( void );
void Ent_RunGC( bool common, bool enttools, const char *userid );
class CBasePlayer;
void GGM_ClientPutinServer(edict_t *pEntity , CBasePlayer *pPlayer);
void GGM_ClientFirstSpawn(CBasePlayer *pPlayer );
const char *GGM_GetPlayerID( edict_t *player );
edict_t *GGM_PlayerByID( const char *id );
enum PlayerState
{
STATE_UNINITIALIZED = 0,
STATE_CONNECTED,
STATE_SPECTATOR_BEGIN,
STATE_SPAWNED,
STATE_SPECTATOR,
STATE_POINT_SELECT
};
enum PlayerMenuState
{
MENUSTATE_NONE = 0,
MENUSTATE_COOPMENU,
MENUSTATE_COOPMENU_SPEC,
MENUSTATE_CHECKPOINT,
MENUSTATE_GLOBAL,
MENUSTATE_LOCAL_CONFIRM
};
struct GGMData
{
float m_flSpawnTime;
PlayerState m_state;
bool m_fTouchMenu;
int m_iMenuState;
int m_iLocalConfirm;
int m_iConfirmKey;
float m_flEntScope;
float m_flEntTime;
char uid[32];
};
#endif // GRAVGUNMOD_H #endif // GRAVGUNMOD_H

View File

@ -129,7 +129,7 @@ BOOL CHalfLifeMultiplay::ClientCommand( CBasePlayer *pPlayer, const char *pcmd )
{ {
if( FStrEq( pcmd, "joincoop" ) ) if( FStrEq( pcmd, "joincoop" ) )
{ {
if( pPlayer->m_state == STATE_SPECTATOR_BEGIN ) if( pPlayer->gravgunmod_data.m_state == STATE_SPECTATOR_BEGIN )
UTIL_SpawnPlayer( pPlayer ); UTIL_SpawnPlayer( pPlayer );
else else
ClientPrint( pPlayer->pev, HUD_PRINTCONSOLE, "You cannot use joincoop now!\n\n" ); ClientPrint( pPlayer->pev, HUD_PRINTCONSOLE, "You cannot use joincoop now!\n\n" );
@ -509,15 +509,15 @@ void CHalfLifeMultiplay::InitHUD( CBasePlayer *pl )
MESSAGE_END(); MESSAGE_END();
} }
if( pl->m_state <= STATE_CONNECTED ) if( pl->gravgunmod_data.m_state <= STATE_CONNECTED )
ClientPutInServer( pl->edict() ); ClientPutInServer( pl->edict() );
if( mp_coop.value ) if( mp_coop.value )
{ {
if( pl->m_state == STATE_SPECTATOR_BEGIN ) if( pl->gravgunmod_data.m_state == STATE_SPECTATOR_BEGIN )
{ {
pl->m_iMenuState = MENUSTATE_COOPMENU_SPEC; pl->gravgunmod_data.m_iMenuState = MENUSTATE_COOPMENU_SPEC;
if( mp_coop.value ) if( mp_coop.value )
{ {
@ -601,10 +601,10 @@ BOOL CHalfLifeMultiplay::FPlayerCanTakeDamage( CBasePlayer *pPlayer, CBaseEntity
//========================================================= //=========================================================
void CHalfLifeMultiplay::PlayerThink( CBasePlayer *pPlayer ) void CHalfLifeMultiplay::PlayerThink( CBasePlayer *pPlayer )
{ {
if( !mp_coop.value && pPlayer->m_state == STATE_SPECTATOR_BEGIN ) if( !mp_coop.value && pPlayer->gravgunmod_data.m_state == STATE_SPECTATOR_BEGIN )
if( pPlayer->m_afButtonPressed & ( IN_DUCK | IN_ATTACK | IN_ATTACK2 | IN_USE | IN_JUMP ) ) if( pPlayer->m_afButtonPressed & ( IN_DUCK | IN_ATTACK | IN_ATTACK2 | IN_USE | IN_JUMP ) )
UTIL_SpawnPlayer( pPlayer ); UTIL_SpawnPlayer( pPlayer );
if( pPlayer->m_state == STATE_UNINITIALIZED ) if( pPlayer->gravgunmod_data.m_state == STATE_UNINITIALIZED )
if( pPlayer->m_afButtonPressed || pPlayer->pev->button ) if( pPlayer->m_afButtonPressed || pPlayer->pev->button )
{ {
ClientPutInServer( pPlayer->edict() ); ClientPutInServer( pPlayer->edict() );
@ -614,7 +614,7 @@ void CHalfLifeMultiplay::PlayerThink( CBasePlayer *pPlayer )
return; return;
} }
if( pPlayer->m_state == STATE_POINT_SELECT ) if( pPlayer->gravgunmod_data.m_state == STATE_POINT_SELECT )
{ {
if( pPlayer->m_afButtonPressed & ( IN_DUCK | IN_ATTACK | IN_ATTACK2 | IN_USE | IN_JUMP ) ) if( pPlayer->m_afButtonPressed & ( IN_DUCK | IN_ATTACK | IN_ATTACK2 | IN_USE | IN_JUMP ) )
pPlayer->Spawn(); pPlayer->Spawn();
@ -640,21 +640,21 @@ void CHalfLifeMultiplay::PlayerSpawn( CBasePlayer *pPlayer )
BOOL addDefault; BOOL addDefault;
CBaseEntity *pWeaponEntity = NULL; CBaseEntity *pWeaponEntity = NULL;
if( pPlayer->m_state == STATE_UNINITIALIZED ) if( pPlayer->gravgunmod_data.m_state == STATE_UNINITIALIZED )
{ {
ClientPutInServer( pPlayer->edict() ); ClientPutInServer( pPlayer->edict() );
return; return;
} }
if( mp_spectator.value && pPlayer->m_state == STATE_CONNECTED ) if( mp_spectator.value && pPlayer->gravgunmod_data.m_state == STATE_CONNECTED )
{ {
pPlayer->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 );
return; return;
} }
if( mp_coop_changelevel.value && pPlayer->m_state == STATE_POINT_SELECT && !(pPlayer->pev->flags & FL_SPECTATOR) ) if( mp_coop_changelevel.value && pPlayer->gravgunmod_data.m_state == STATE_POINT_SELECT && !(pPlayer->pev->flags & FL_SPECTATOR) )
{ {
pPlayer->RemoveAllItems( TRUE ); pPlayer->RemoveAllItems( TRUE );
UTIL_BecomeSpectator( pPlayer ); UTIL_BecomeSpectator( pPlayer );
@ -662,7 +662,7 @@ void CHalfLifeMultiplay::PlayerSpawn( CBasePlayer *pPlayer )
} }
if( !mp_coop_changelevel.value ) if( !mp_coop_changelevel.value )
pPlayer->m_state = STATE_SPAWNED; pPlayer->gravgunmod_data.m_state = STATE_SPAWNED;
g_fPause = false; g_fPause = false;

View File

@ -2481,7 +2481,7 @@ void CBasePlayer::PostThink()
} }
// Handle Tank controlling // Handle Tank controlling
if( m_pTank && m_state == STATE_SPAWNED ) if( m_pTank && gravgunmod_data.m_state == STATE_SPAWNED )
{ {
// if they've moved too far from the gun, or selected a weapon, unuse the gun // if they've moved too far from the gun, or selected a weapon, unuse the gun
if( m_pTank->OnControls( pev ) && !pev->weaponmodel ) if( m_pTank->OnControls( pev ) && !pev->weaponmodel )
@ -2878,7 +2878,7 @@ void CBasePlayer::Spawn( void )
m_lastx = m_lasty = 0; m_lastx = m_lasty = 0;
m_flNextChatTime = gpGlobals->time; m_flNextChatTime = gpGlobals->time;
m_flSpawnTime = gpGlobals->time; gravgunmod_data.m_flSpawnTime = gpGlobals->time;
g_pGameRules->PlayerSpawn( this ); g_pGameRules->PlayerSpawn( this );
g_flSemclipTime = 0; g_flSemclipTime = 0;
@ -3011,7 +3011,7 @@ int CBasePlayer::Restore( CRestore &restore )
// restored player has some bugs untill respawned // restored player has some bugs untill respawned
if( mp_coop_changelevel.value ) if( mp_coop_changelevel.value )
{ {
m_state = STATE_CONNECTED; gravgunmod_data.m_state = STATE_CONNECTED;
SetThink( &CBasePlayer::Spawn ); SetThink( &CBasePlayer::Spawn );
pev->nextthink = gpGlobals->time + 0.5; pev->nextthink = gpGlobals->time + 0.5;
} }

View File

@ -83,26 +83,7 @@ enum sbar_data
#define CHAT_INTERVAL 1.0f #define CHAT_INTERVAL 1.0f
enum PlayerState #include "gravgunmod.h"
{
STATE_UNINITIALIZED = 0,
STATE_CONNECTED,
STATE_SPECTATOR_BEGIN,
STATE_SPAWNED,
STATE_SPECTATOR,
STATE_POINT_SELECT
};
enum PlayerMenuState
{
MENUSTATE_NONE = 0,
MENUSTATE_COOPMENU,
MENUSTATE_COOPMENU_SPEC,
MENUSTATE_CHECKPOINT,
MENUSTATE_GLOBAL,
MENUSTATE_LOCAL_CONFIRM
};
#include "whandle.h" #include "whandle.h"
class CBasePlayer : public CBaseMonster class CBasePlayer : public CBaseMonster
@ -332,14 +313,8 @@ public:
float m_flNextChatTime; float m_flNextChatTime;
virtual float TouchGravGun( CBaseEntity *attacker, int stage ); virtual float TouchGravGun( CBaseEntity *attacker, int stage );
float m_flSpawnTime;
PlayerState m_state; struct GGMData gravgunmod_data;
bool m_fTouchMenu;
int m_iMenuState;
int m_iLocalConfirm;
int m_iConfirmKey;
int m_iEnttoolsMonsters;
float m_fEnttoolsMonsterTime;
virtual void Touch( CBaseEntity *pOther ); virtual void Touch( CBaseEntity *pOther );
}; };

View File

@ -121,7 +121,7 @@ float CHalfLifeRules::FlPlayerFallDamage( CBasePlayer *pPlayer )
//========================================================= //=========================================================
void CHalfLifeRules::PlayerSpawn( CBasePlayer *pPlayer ) void CHalfLifeRules::PlayerSpawn( CBasePlayer *pPlayer )
{ {
pPlayer->m_state = STATE_SPAWNED; pPlayer->gravgunmod_data.m_state = STATE_SPAWNED;
} }
//========================================================= //=========================================================

View File

@ -1653,7 +1653,7 @@ void CChangeLevel::ChangeLevelNow( CBaseEntity *pActivator )
continue; continue;
// 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)->m_flSpawnTime ) > 30 ) ) if( plr && plr->IsPlayer() && (pTrain || (gpGlobals->time -((CBasePlayer*)plr)->gravgunmod_data.m_flSpawnTime ) > 30 ) )
{ {
count2++; count2++;
@ -1687,7 +1687,7 @@ void CChangeLevel::ChangeLevelNow( CBaseEntity *pActivator )
UTIL_CoopPrintMessage("%s^7 trying activate changelevel too soon\n", UTIL_CoopPlayerName( pPlayer )); UTIL_CoopPrintMessage("%s^7 trying activate changelevel too soon\n", UTIL_CoopPlayerName( pPlayer ));
UTIL_CleanSpawnPoint( pPlayer->pev->origin, 50 ); UTIL_CleanSpawnPoint( pPlayer->pev->origin, 50 );
m_flRepeatTimer = gpGlobals->time; m_flRepeatTimer = gpGlobals->time;
pPlayer->m_iLocalConfirm = -2; pPlayer->gravgunmod_data.m_iLocalConfirm = -2;
} }
UTIL_CoopHudMessage( 1, 5, 0xFF0000FF, 0xFF0000FF, 0, 0.7, "Cannot change level: Not enough players!\nWait 30 sec before you may changelevel!" ); UTIL_CoopHudMessage( 1, 5, 0xFF0000FF, 0xFF0000FF, 0, 0.7, "Cannot change level: Not enough players!\nWait 30 sec before you may changelevel!" );
@ -1776,7 +1776,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)->m_flSpawnTime ) > 30 || m_fSkipSpawnCheck ) ) if( plr && plr->IsPlayer() && ( !FindTriggerTransition( m_szLandmarkName ) || (gpGlobals->time -((CBasePlayer*)plr)->gravgunmod_data.m_flSpawnTime ) > 30 || m_fSkipSpawnCheck ) )
{ {
if( InTransitionVolume( plr, m_szLandmarkName )) if( InTransitionVolume( plr, m_szLandmarkName ))
{ {
@ -1794,7 +1794,7 @@ void CChangeLevel::ChangeLevelNow( CBaseEntity *pActivator )
ALERT( at_console, "There are %d players in transition volume %s\n", count, m_szLandmarkName ); ALERT( at_console, "There are %d players in transition volume %s\n", count, m_szLandmarkName );
} }
else if( ( (gpGlobals->time -((CBasePlayer*)pPlayer)->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 ); ALERT( at_console, "Player isn't in the transition volume %s, aborting\n", m_szLandmarkName );
if( !m_fSkipSpawnCheck ) if( !m_fSkipSpawnCheck )
@ -1853,7 +1853,7 @@ void CChangeLevel::ChangeLevelNow( CBaseEntity *pActivator )
// reset all players state to make it spawn again after restart // reset all players state to make it spawn again after restart
if( plr ) if( plr )
{ {
plr->m_state = STATE_UNINITIALIZED; plr->gravgunmod_data.m_state = STATE_UNINITIALIZED;
plr->RemoveAllItems( TRUE ); plr->RemoveAllItems( TRUE );
UTIL_BecomeSpectator( plr ); UTIL_BecomeSpectator( plr );
// HACK: force perform reconnection // HACK: force perform reconnection