mirror of
https://github.com/YGGverse/hlsdk-portable.git
synced 2025-02-03 02:24:28 +00:00
Add changelevel local confirm and banlist
This commit is contained in:
parent
d627ff1528
commit
ab1ae84bc8
@ -99,7 +99,8 @@ enum PlayerMenuState
|
|||||||
MENUSTATE_COOPMENU,
|
MENUSTATE_COOPMENU,
|
||||||
MENUSTATE_COOPMENU_SPEC,
|
MENUSTATE_COOPMENU_SPEC,
|
||||||
MENUSTATE_CHECKPOINT,
|
MENUSTATE_CHECKPOINT,
|
||||||
MENUSTATE_GLOBAL
|
MENUSTATE_GLOBAL,
|
||||||
|
MENUSTATE_LOCAL_CONFIRM
|
||||||
};
|
};
|
||||||
|
|
||||||
#include "whandle.h"
|
#include "whandle.h"
|
||||||
@ -335,6 +336,8 @@ public:
|
|||||||
PlayerState m_state;
|
PlayerState m_state;
|
||||||
bool m_fTouchMenu;
|
bool m_fTouchMenu;
|
||||||
int m_iMenuState;
|
int m_iMenuState;
|
||||||
|
int m_iLocalConfirm;
|
||||||
|
int m_iConfirmKey;
|
||||||
virtual void Touch( CBaseEntity *pOther );
|
virtual void Touch( CBaseEntity *pOther );
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -913,7 +913,7 @@ void CBaseTrigger::HurtTouch( CBaseEntity *pOther )
|
|||||||
// HACKHACK -- In multiplayer, players touch this based on packet receipt.
|
// HACKHACK -- In multiplayer, players touch this based on packet receipt.
|
||||||
// So the players who send packets later aren't always hurt. Keep track of
|
// So the players who send packets later aren't always hurt. Keep track of
|
||||||
// how much time has passed and whether or not you've touched that player
|
// how much time has passed and whether or not you've touched that player
|
||||||
if( g_pGameRules->IsMultiplayer() )
|
if( !mp_coop.value && g_pGameRules->IsMultiplayer() )
|
||||||
{
|
{
|
||||||
if( pev->dmgtime > gpGlobals->time )
|
if( pev->dmgtime > gpGlobals->time )
|
||||||
{
|
{
|
||||||
@ -1350,6 +1350,7 @@ public:
|
|||||||
bool m_fSpawnSaved;
|
bool m_fSpawnSaved;
|
||||||
bool m_fIsBack;
|
bool m_fIsBack;
|
||||||
bool m_fSkipSpawnCheck; // skip 30 seconds check when called by multimanager or trigger_once
|
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 )
|
||||||
@ -1513,6 +1514,7 @@ struct checkpoint_s
|
|||||||
char str[32];
|
char str[32];
|
||||||
float time;
|
float time;
|
||||||
Vector origin;
|
Vector origin;
|
||||||
|
Vector angles;
|
||||||
} g_checkpoints[4];
|
} g_checkpoints[4];
|
||||||
|
|
||||||
|
|
||||||
@ -1546,12 +1548,54 @@ void ShowMenu( CBasePlayer *pPlayer, const char *title, int count, const char **
|
|||||||
bool g_fSavedDuck;
|
bool g_fSavedDuck;
|
||||||
|
|
||||||
#define CoopPlayerName( pPlayer ) ( ( pPlayer->pev->netname && STRING( pPlayer->pev->netname )[0] != 0 ) ? STRING( pPlayer->pev->netname ) : "unconnected" )
|
#define CoopPlayerName( pPlayer ) ( ( pPlayer->pev->netname && STRING( pPlayer->pev->netname )[0] != 0 ) ? STRING( pPlayer->pev->netname ) : "unconnected" )
|
||||||
|
char *badlist[100] = {
|
||||||
|
"player", // does not even can set own name
|
||||||
|
"talat",
|
||||||
|
"hmse",
|
||||||
|
"mhmd",
|
||||||
|
"aeman",
|
||||||
|
"famas",
|
||||||
|
"danek",
|
||||||
|
"ame syia",
|
||||||
|
"melih"
|
||||||
|
};
|
||||||
|
|
||||||
void CoopKickPlayer(CBaseEntity *pPlayer)
|
void CoopKickPlayer(CBaseEntity *pPlayer)
|
||||||
{
|
{
|
||||||
|
int i;
|
||||||
if( !pPlayer )
|
if( !pPlayer )
|
||||||
return;
|
return;
|
||||||
SERVER_COMMAND( UTIL_VarArgs( "kick %d\n", ENTINDEX(pPlayer->pev->pContainingEntity) - 1 ) );
|
SERVER_COMMAND( UTIL_VarArgs( "kick %d\n", ENTINDEX(pPlayer->pev->pContainingEntity) - 1 ) );
|
||||||
|
char *name = (char*) CoopPlayerName( pPlayer );
|
||||||
|
if( strlen( name ) < 5 )
|
||||||
|
return;
|
||||||
|
for( i = 0; badlist[i]; i++ );
|
||||||
|
badlist[i] = strdup( name );
|
||||||
|
}
|
||||||
|
|
||||||
|
bool IsBadPlayer( CBaseEntity *plr )
|
||||||
|
{
|
||||||
|
if( !plr || !plr->IsPlayer() )
|
||||||
|
return false;
|
||||||
|
for( int i = 0; badlist[i];i++ )
|
||||||
|
if( strcasestr( (char*)CoopPlayerName( plr ), badlist[i] ) )
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CoopLocalConfirmMenu(CBasePlayer *pPlayer)
|
||||||
|
{
|
||||||
|
const char *menu[] = {
|
||||||
|
"No",
|
||||||
|
"Cancel",
|
||||||
|
"Do not confirm",
|
||||||
|
"Don't confirm",
|
||||||
|
"Единая Россия"
|
||||||
|
};
|
||||||
|
|
||||||
|
menu[pPlayer->m_iConfirmKey = RANDOM_LONG(2,4)] = "Confirm";
|
||||||
|
ShowMenu(pPlayer, "Confirm changing map BACK (NOT RECOMMENDED)?", ARRAYSIZE(menu), menu);
|
||||||
|
pPlayer->m_iMenuState = MENUSTATE_LOCAL_CONFIRM;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Show to all spawned players: voting, etc..
|
// Show to all spawned players: voting, etc..
|
||||||
@ -1654,7 +1698,7 @@ public:
|
|||||||
{
|
{
|
||||||
CBaseEntity *plr = UTIL_PlayerByIndex( i );
|
CBaseEntity *plr = UTIL_PlayerByIndex( i );
|
||||||
|
|
||||||
if( plr && plr->IsPlayer() )
|
if( plr && plr->IsPlayer() && !IsBadPlayer( plr ) )
|
||||||
{
|
{
|
||||||
count2++;
|
count2++;
|
||||||
CBasePlayer *player = (CBasePlayer *) plr;
|
CBasePlayer *player = (CBasePlayer *) plr;
|
||||||
@ -1671,6 +1715,13 @@ public:
|
|||||||
{
|
{
|
||||||
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 )
|
||||||
|
return;
|
||||||
|
if( pPlayer->m_iLocalConfirm < 3 )
|
||||||
|
{
|
||||||
|
CoopLocalConfirmMenu( pPlayer );
|
||||||
|
return;
|
||||||
|
}
|
||||||
g_iMenu = 1;
|
g_iMenu = 1;
|
||||||
m_flTime = gpGlobals->time;
|
m_flTime = gpGlobals->time;
|
||||||
m_pTrigger = trigger;
|
m_pTrigger = trigger;
|
||||||
@ -1680,7 +1731,11 @@ public:
|
|||||||
"Cancel",
|
"Cancel",
|
||||||
"BAN"
|
"BAN"
|
||||||
};
|
};
|
||||||
ShowGlobalMenu(UTIL_VarArgs("Confirm changing map to %s?", mapname), ARRAYSIZE(menu), menu);
|
MESSAGE_BEGIN( MSG_ALL, 8, NULL ); // svc_print
|
||||||
|
WRITE_BYTE( 3 ); // PRINT_CHAT
|
||||||
|
WRITE_STRING( UTIL_VarArgs( "%s^7 wants to change map ^1BACKWARDS\n", ( pPlayer->pev->netname && STRING( pPlayer->pev->netname )[0] != 0 ) ? STRING( pPlayer->pev->netname ) : "unconnected"));
|
||||||
|
MESSAGE_END();
|
||||||
|
ShowGlobalMenu(UTIL_VarArgs("Confirm changing map BACK TO %s?", mapname), ARRAYSIZE(menu), menu);
|
||||||
|
|
||||||
}
|
}
|
||||||
void VoteMenu( CBasePlayer *pPlayer )
|
void VoteMenu( CBasePlayer *pPlayer )
|
||||||
@ -1707,6 +1762,10 @@ public:
|
|||||||
m_iConfirm = i;
|
m_iConfirm = i;
|
||||||
m_iVoteCount = 0;
|
m_iVoteCount = 0;
|
||||||
m_pPlayer = pPlayer;
|
m_pPlayer = pPlayer;
|
||||||
|
MESSAGE_BEGIN( MSG_ALL, 8, NULL ); // svc_print
|
||||||
|
WRITE_BYTE( 3 ); // PRINT_CHAT
|
||||||
|
WRITE_STRING( UTIL_VarArgs( "%s^7 opened vote menu\n", ( pPlayer->pev->netname && STRING( pPlayer->pev->netname )[0] != 0 ) ? STRING( pPlayer->pev->netname ) : "unconnected"));
|
||||||
|
MESSAGE_END();
|
||||||
ShowGlobalMenu(UTIL_VarArgs("%s requested to force change map", CoopPlayerName( pPlayer ) ), i, maps);
|
ShowGlobalMenu(UTIL_VarArgs("%s requested to force change map", CoopPlayerName( pPlayer ) ), i, maps);
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -1715,8 +1774,6 @@ public:
|
|||||||
};
|
};
|
||||||
GlobalMenu g_GlobalMenu;
|
GlobalMenu g_GlobalMenu;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void CChangeLevel::UpdateColor( void )
|
void CChangeLevel::UpdateColor( void )
|
||||||
{
|
{
|
||||||
Vector origin = VecBModelOrigin(pev);
|
Vector origin = VecBModelOrigin(pev);
|
||||||
@ -1745,7 +1802,7 @@ void CChangeLevel::UpdateColor( void )
|
|||||||
|
|
||||||
void CoopCheckpointMenu( CBasePlayer *pPlayer )
|
void CoopCheckpointMenu( CBasePlayer *pPlayer )
|
||||||
{
|
{
|
||||||
if( pPlayer->m_state == STATE_SPAWNED )
|
//if( pPlayer->m_state == STATE_SPAWNED )
|
||||||
{
|
{
|
||||||
|
|
||||||
if( mp_coop_checkpoints.value )
|
if( mp_coop_checkpoints.value )
|
||||||
@ -1754,9 +1811,11 @@ void CoopCheckpointMenu( CBasePlayer *pPlayer )
|
|||||||
"New checkpoint"
|
"New checkpoint"
|
||||||
};
|
};
|
||||||
int i;
|
int i;
|
||||||
|
if( pPlayer->m_state == STATE_SPECTATOR || pPlayer->m_state == STATE_SPECTATOR_BEGIN )
|
||||||
|
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;
|
||||||
ShowMenu( pPlayer, "Coop menu", i, menu );
|
ShowMenu( pPlayer, "Select checkpoint", i, menu );
|
||||||
pPlayer->m_iMenuState = MENUSTATE_CHECKPOINT;
|
pPlayer->m_iMenuState = MENUSTATE_CHECKPOINT;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1769,6 +1828,7 @@ void CoopNewCheckpoint( entvars_t *pevPlayer )
|
|||||||
g_checkpoints[0].time = gpGlobals->time;
|
g_checkpoints[0].time = gpGlobals->time;
|
||||||
snprintf( g_checkpoints[0].str, 31, "%5s %d", STRING( pevPlayer->netname ), (int)( gpGlobals->time / 60 ) );
|
snprintf( g_checkpoints[0].str, 31, "%5s %d", STRING( pevPlayer->netname ), (int)( gpGlobals->time / 60 ) );
|
||||||
g_checkpoints[0].origin = pevPlayer->origin;
|
g_checkpoints[0].origin = pevPlayer->origin;
|
||||||
|
g_checkpoints[0].angles = pevPlayer->angles;
|
||||||
MESSAGE_BEGIN( MSG_ALL, 8, NULL ); // svc_print
|
MESSAGE_BEGIN( MSG_ALL, 8, NULL ); // svc_print
|
||||||
WRITE_BYTE( 3 ); // PRINT_CHAT
|
WRITE_BYTE( 3 ); // PRINT_CHAT
|
||||||
WRITE_STRING( "New checkpoint availiable\n" );
|
WRITE_STRING( "New checkpoint availiable\n" );
|
||||||
@ -1840,8 +1900,13 @@ void CoopProcessMenu( CBasePlayer *pPlayer, int imenu )
|
|||||||
case MENUSTATE_COOPMENU_SPEC:
|
case MENUSTATE_COOPMENU_SPEC:
|
||||||
if( imenu == 1 )
|
if( imenu == 1 )
|
||||||
{
|
{
|
||||||
SpawnPlayer( pPlayer );
|
if( g_checkpoints[0].time )
|
||||||
pPlayer->m_state = STATE_SPAWNED;
|
CoopCheckpointMenu( pPlayer );
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SpawnPlayer( pPlayer );
|
||||||
|
pPlayer->m_state = STATE_SPAWNED;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if( imenu == 2 )
|
if( imenu == 2 )
|
||||||
{
|
{
|
||||||
@ -1877,12 +1942,16 @@ void CoopProcessMenu( CBasePlayer *pPlayer, int imenu )
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case MENUSTATE_GLOBAL:
|
case MENUSTATE_GLOBAL:
|
||||||
g_GlobalMenu.Process( pPlayer, imenu );
|
if( !IsBadPlayer( pPlayer ) )
|
||||||
|
g_GlobalMenu.Process( pPlayer, imenu );
|
||||||
break;
|
break;
|
||||||
case MENUSTATE_CHECKPOINT:
|
case MENUSTATE_CHECKPOINT:
|
||||||
if( imenu == 1 )
|
if( imenu == 1 )
|
||||||
{
|
{
|
||||||
CoopNewCheckpoint( pPlayer->pev );
|
if( pPlayer->m_state == STATE_SPECTATOR_BEGIN )
|
||||||
|
SpawnPlayer( pPlayer );
|
||||||
|
else if( !IsBadPlayer( pPlayer ) )
|
||||||
|
CoopNewCheckpoint( pPlayer->pev );
|
||||||
}
|
}
|
||||||
else if( imenu > 1 && imenu < 5 )
|
else if( imenu > 1 && imenu < 5 )
|
||||||
{
|
{
|
||||||
@ -1891,6 +1960,13 @@ void CoopProcessMenu( CBasePlayer *pPlayer, int imenu )
|
|||||||
pPlayer->pev->origin = g_checkpoints[imenu-2].origin;
|
pPlayer->pev->origin = g_checkpoints[imenu-2].origin;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case MENUSTATE_LOCAL_CONFIRM:
|
||||||
|
if( imenu - 1 == pPlayer->m_iConfirmKey )
|
||||||
|
pPlayer->m_iLocalConfirm++;
|
||||||
|
else
|
||||||
|
pPlayer->m_iLocalConfirm = 0;
|
||||||
|
pPlayer->m_iMenuState = MENUSTATE_NONE;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -2131,9 +2207,13 @@ void CChangeLevel::ChangeLevelNow( CBaseEntity *pActivator )
|
|||||||
for( i = 1; i <= gpGlobals->maxClients; i++ )
|
for( i = 1; i <= gpGlobals->maxClients; i++ )
|
||||||
{
|
{
|
||||||
CBaseEntity *plr = UTIL_PlayerByIndex( i );
|
CBaseEntity *plr = UTIL_PlayerByIndex( i );
|
||||||
|
CBaseEntity *pTrain = CoopGetPlayerTrain( plr );
|
||||||
|
|
||||||
|
if( !pTrain && IsBadPlayer( plr ) )
|
||||||
|
continue;
|
||||||
|
|
||||||
// count only players spawned more 30 seconds ago
|
// count only players spawned more 30 seconds ago
|
||||||
if( plr && plr->IsPlayer() && (CoopGetPlayerTrain(plr) || (gpGlobals->time -((CBasePlayer*)plr)->m_flSpawnTime ) > 30 ) )
|
if( plr && plr->IsPlayer() && (pTrain || (gpGlobals->time -((CBasePlayer*)plr)->m_flSpawnTime ) > 30 ) )
|
||||||
{
|
{
|
||||||
count2++;
|
count2++;
|
||||||
|
|
||||||
@ -2161,6 +2241,17 @@ void CChangeLevel::ChangeLevelNow( CBaseEntity *pActivator )
|
|||||||
{
|
{
|
||||||
if( !count2 )
|
if( !count2 )
|
||||||
{
|
{
|
||||||
|
if( pActivator && pActivator->IsPlayer() && m_flRepeatTimer - gpGlobals->time < -1 ){
|
||||||
|
CBasePlayer *pPlayer = (CBasePlayer*)pActivator;
|
||||||
|
MESSAGE_BEGIN( MSG_ALL, 8, NULL ); // svc_print
|
||||||
|
WRITE_BYTE( 3 ); // PRINT_CHAT
|
||||||
|
WRITE_STRING( UTIL_VarArgs( "%s^7 trying activate changelevel too soon\n", ( pPlayer->pev->netname && STRING( pPlayer->pev->netname )[0] != 0 ) ? STRING( pPlayer->pev->netname ) : "unconnected"));
|
||||||
|
MESSAGE_END();
|
||||||
|
UTIL_CleanSpawnPoint( pPlayer->pev->origin, 50 );
|
||||||
|
m_flRepeatTimer = gpGlobals->time;
|
||||||
|
pPlayer->m_iLocalConfirm = -2;
|
||||||
|
}
|
||||||
|
|
||||||
UTIL_HudMessageAll( params, "Cannot change level: Not enough players!\nWait 30 sec before you may changelevel!" );
|
UTIL_HudMessageAll( params, "Cannot change level: Not enough players!\nWait 30 sec before you may changelevel!" );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -2171,7 +2262,7 @@ void CChangeLevel::ChangeLevelNow( CBaseEntity *pActivator )
|
|||||||
i = 1;
|
i = 1;
|
||||||
|
|
||||||
if( i )
|
if( i )
|
||||||
UTIL_HudMessageAll( params, UTIL_VarArgs( "%s touched end of map\nnext is %s %s, %d to go",
|
UTIL_HudMessageAll( params, UTIL_VarArgs( "%s touched end of map\nnext is %s %s, %d to go\n",
|
||||||
( pActivator->pev->netname && STRING( pActivator->pev->netname )[0] != 0 ) ? STRING( pActivator->pev->netname ) : "unconnected",
|
( pActivator->pev->netname && STRING( pActivator->pev->netname )[0] != 0 ) ? STRING( pActivator->pev->netname ) : "unconnected",
|
||||||
st_szNextMap, st_szNextSpot, i ) );
|
st_szNextMap, st_szNextSpot, i ) );
|
||||||
if( count2 )
|
if( count2 )
|
||||||
@ -2200,11 +2291,20 @@ void CChangeLevel::ChangeLevelNow( CBaseEntity *pActivator )
|
|||||||
}
|
}
|
||||||
if( g_iMenu != 1 )
|
if( g_iMenu != 1 )
|
||||||
{
|
{
|
||||||
g_GlobalMenu.ConfirmMenu( (CBasePlayer*)pActivator, this, m_szMapName );
|
if( !IsBadPlayer( pActivator ) )
|
||||||
|
g_GlobalMenu.ConfirmMenu( (CBasePlayer*)pActivator, this, m_szMapName );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if( g_GlobalMenu.m_iConfirm < count2 )
|
if( g_GlobalMenu.m_iConfirm < count2 )
|
||||||
return;
|
return;
|
||||||
|
//if( mp_coop_strongpolicy.value )
|
||||||
|
/*{
|
||||||
|
// do not allow go back if there are checkpoints, but not near changelevel
|
||||||
|
if( g_checkpoints[0].time && (g_checkpoints[0].origin - VecBModelOrigin(pev)).Length() > 150 )
|
||||||
|
return;
|
||||||
|
if( count2 < 2 )
|
||||||
|
return;
|
||||||
|
}*/
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2288,6 +2388,10 @@ void CChangeLevel::ChangeLevelNow( CBaseEntity *pActivator )
|
|||||||
|
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
|
MESSAGE_BEGIN( MSG_ALL, 8, NULL ); // svc_print
|
||||||
|
WRITE_BYTE( 3 ); // PRINT_CHAT
|
||||||
|
WRITE_STRING( UTIL_VarArgs( "%s^7 activated changelevel\n", ( pPlayer->pev->netname && STRING( pPlayer->pev->netname )[0] != 0 ) ? STRING( pPlayer->pev->netname ) : "unconnected"));
|
||||||
|
MESSAGE_END();
|
||||||
|
|
||||||
// shedule remove ke^w on first info_player_start
|
// shedule remove ke^w on first info_player_start
|
||||||
/*edict_t *playerstart = FIND_ENTITY_BY_CLASSNAME( NULL, "info_player_start" );
|
/*edict_t *playerstart = FIND_ENTITY_BY_CLASSNAME( NULL, "info_player_start" );
|
||||||
|
Loading…
x
Reference in New Issue
Block a user