mirror of
https://github.com/YGGverse/hlsdk-portable.git
synced 2025-01-26 14:44:20 +00:00
Vote changelevel and confirm changelevel menus (WIP)
This commit is contained in:
parent
690d6023bf
commit
1bb794892a
@ -94,7 +94,7 @@ void CoopClearWeaponList( void )
|
|||||||
{
|
{
|
||||||
g_WeaponList.Clear();
|
g_WeaponList.Clear();
|
||||||
}
|
}
|
||||||
|
extern int g_iMenu;
|
||||||
|
|
||||||
void BecomeSpectator( CBasePlayer *pPlayer )
|
void BecomeSpectator( CBasePlayer *pPlayer )
|
||||||
{
|
{
|
||||||
@ -126,7 +126,7 @@ void SpawnPlayer( CBasePlayer *pPlayer )
|
|||||||
|
|
||||||
extern int gmsgShowMenu;
|
extern int gmsgShowMenu;
|
||||||
|
|
||||||
void ShowMenu( CBasePlayer *pPlayer, const char *title, int count, const char **slot )
|
void ShowMenu( CBasePlayer *pPlayer, const char *title, int count, const char **slot, signed char time = -1 )
|
||||||
{
|
{
|
||||||
char buf[128], *pbuf = buf;
|
char buf[128], *pbuf = buf;
|
||||||
short int flags = 1<<9;
|
short int flags = 1<<9;
|
||||||
@ -138,7 +138,7 @@ void ShowMenu( CBasePlayer *pPlayer, const char *title, int count, const char **
|
|||||||
}
|
}
|
||||||
MESSAGE_BEGIN(MSG_ONE, gmsgShowMenu, NULL, pPlayer->pev);
|
MESSAGE_BEGIN(MSG_ONE, gmsgShowMenu, NULL, pPlayer->pev);
|
||||||
WRITE_SHORT( flags ); // slots
|
WRITE_SHORT( flags ); // slots
|
||||||
WRITE_CHAR( -1 ); // show time
|
WRITE_CHAR( time ); // show time
|
||||||
WRITE_BYTE( 0 ); // need more
|
WRITE_BYTE( 0 ); // need more
|
||||||
WRITE_STRING( buf );
|
WRITE_STRING( buf );
|
||||||
MESSAGE_END();
|
MESSAGE_END();
|
||||||
@ -156,7 +156,7 @@ void CoopMenu( CBasePlayer *pPlayer )
|
|||||||
"Force respawn",
|
"Force respawn",
|
||||||
"Unblock",
|
"Unblock",
|
||||||
"Become spectator",
|
"Become spectator",
|
||||||
//"Vote changelevel"
|
"Vote changelevel"
|
||||||
};
|
};
|
||||||
ShowMenu( pPlayer, "Coop menu", ARRAYSIZE( menu ), menu );
|
ShowMenu( pPlayer, "Coop menu", ARRAYSIZE( menu ), menu );
|
||||||
}
|
}
|
||||||
@ -174,7 +174,7 @@ void CoopMenu( CBasePlayer *pPlayer )
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int g_iMenu;
|
void CoopVoteMenu( CBasePlayer *pPlayer );
|
||||||
|
|
||||||
|
|
||||||
//*********************************************************
|
//*********************************************************
|
||||||
@ -228,6 +228,8 @@ CHalfLifeMultiplay::CHalfLifeMultiplay()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CoopProcessMenu( CBasePlayer *pPlayer, int imenu );
|
||||||
|
|
||||||
BOOL CHalfLifeMultiplay::ClientCommand( CBasePlayer *pPlayer, const char *pcmd )
|
BOOL CHalfLifeMultiplay::ClientCommand( CBasePlayer *pPlayer, const char *pcmd )
|
||||||
{
|
{
|
||||||
#ifndef NO_VOICEGAMEMGR
|
#ifndef NO_VOICEGAMEMGR
|
||||||
@ -246,6 +248,7 @@ BOOL CHalfLifeMultiplay::ClientCommand( CBasePlayer *pPlayer, const char *pcmd )
|
|||||||
if( FStrEq( pcmd, "menuselect" ) )
|
if( FStrEq( pcmd, "menuselect" ) )
|
||||||
{
|
{
|
||||||
int imenu = atoi( CMD_ARGV( 1 ) );
|
int imenu = atoi( CMD_ARGV( 1 ) );
|
||||||
|
|
||||||
switch( pPlayer->m_state )
|
switch( pPlayer->m_state )
|
||||||
{
|
{
|
||||||
case STATE_SPECTATOR_BEGIN:
|
case STATE_SPECTATOR_BEGIN:
|
||||||
@ -259,6 +262,11 @@ BOOL CHalfLifeMultiplay::ClientCommand( CBasePlayer *pPlayer, const char *pcmd )
|
|||||||
pPlayer->m_state = STATE_SPECTATOR;
|
pPlayer->m_state = STATE_SPECTATOR;
|
||||||
}
|
}
|
||||||
case STATE_SPAWNED:
|
case STATE_SPAWNED:
|
||||||
|
if( g_iMenu )
|
||||||
|
{
|
||||||
|
CoopProcessMenu( pPlayer, imenu );
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
if( imenu == 1 )
|
if( imenu == 1 )
|
||||||
{
|
{
|
||||||
SpawnPlayer( pPlayer );
|
SpawnPlayer( pPlayer );
|
||||||
@ -272,6 +280,10 @@ BOOL CHalfLifeMultiplay::ClientCommand( CBasePlayer *pPlayer, const char *pcmd )
|
|||||||
pPlayer->RemoveAllItems( TRUE );
|
pPlayer->RemoveAllItems( TRUE );
|
||||||
BecomeSpectator( pPlayer );
|
BecomeSpectator( pPlayer );
|
||||||
}
|
}
|
||||||
|
if( imenu == 4 )
|
||||||
|
{
|
||||||
|
CoopVoteMenu( pPlayer );
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1513,6 +1513,146 @@ void CoopClearData( void )
|
|||||||
SavedCoords l_SavedCoords = {};
|
SavedCoords l_SavedCoords = {};
|
||||||
g_SavedCoords = l_SavedCoords;
|
g_SavedCoords = l_SavedCoords;
|
||||||
}
|
}
|
||||||
|
int g_iMenu;
|
||||||
|
void ShowMenu( CBasePlayer *pPlayer, const char *title, int count, const char **slot, signed char time = -1 );
|
||||||
|
// Show to all spawned players: voting, etc..
|
||||||
|
class GlobalMenu
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
int m_iConfirm;
|
||||||
|
int m_iVoteCount;
|
||||||
|
int m_iMaxCount;
|
||||||
|
float flTime;
|
||||||
|
const char *maps[5];
|
||||||
|
int votes[5];
|
||||||
|
CBaseEntity *triggers[5];
|
||||||
|
EHANDLE m_pTrigger;
|
||||||
|
|
||||||
|
void Process( CBasePlayer *pPlayer, int imenu )
|
||||||
|
{
|
||||||
|
if( pPlayer->pev->flags & FL_SPECTATOR )
|
||||||
|
return;
|
||||||
|
if( gpGlobals->time - flTime > 30 )
|
||||||
|
{
|
||||||
|
g_iMenu = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch( g_iMenu )
|
||||||
|
{
|
||||||
|
case 1: // touch blue trigger
|
||||||
|
m_iVoteCount++;
|
||||||
|
if( imenu == 1 ) // confirm
|
||||||
|
{
|
||||||
|
m_iConfirm++;
|
||||||
|
}
|
||||||
|
if( imenu == 2 ) // cancel
|
||||||
|
{
|
||||||
|
m_iConfirm--;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 2: // vote by request
|
||||||
|
if( imenu < m_iConfirm )
|
||||||
|
{
|
||||||
|
votes[imenu]++;
|
||||||
|
m_iVoteCount++;
|
||||||
|
if( m_iVoteCount == m_iMaxCount )
|
||||||
|
{
|
||||||
|
for( int i = 0; i < m_iConfirm; i++ )
|
||||||
|
if( votes[i] == m_iMaxCount )
|
||||||
|
{
|
||||||
|
if( triggers[i])
|
||||||
|
triggers[i]->Use( NULL, NULL, USE_TOGGLE, 0 );
|
||||||
|
g_iMenu = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void ShowGlobalMenu( const char *title, int count, const char **menu )
|
||||||
|
{
|
||||||
|
int count2 = 0;
|
||||||
|
for( int i = 1; i <= gpGlobals->maxClients; i++ )
|
||||||
|
{
|
||||||
|
CBaseEntity *plr = UTIL_PlayerByIndex( i );
|
||||||
|
|
||||||
|
if( plr && plr->IsPlayer() )
|
||||||
|
{
|
||||||
|
count2++;
|
||||||
|
ShowMenu( (CBasePlayer *)plr, title, count, menu, 30 );
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
m_iMaxCount = count2;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ConfirmMenu( CBaseEntity *trigger, const char *mapname )
|
||||||
|
{
|
||||||
|
if( g_iMenu && gpGlobals->time - flTime < 30 )
|
||||||
|
return; // wait 30s befor new confirm vote
|
||||||
|
g_iMenu = 1;
|
||||||
|
flTime = gpGlobals->time;
|
||||||
|
m_pTrigger = trigger;
|
||||||
|
const char *menu[] = {
|
||||||
|
"Confirm",
|
||||||
|
"Cancel"
|
||||||
|
};
|
||||||
|
ShowGlobalMenu(UTIL_VarArgs("Confirm changing map to %s?", mapname), ARRAYSIZE(menu), menu);
|
||||||
|
|
||||||
|
}
|
||||||
|
void VoteMenu( CBasePlayer *player )
|
||||||
|
{
|
||||||
|
if( g_iMenu && gpGlobals->time - flTime < 30 )
|
||||||
|
return; // wait 30s befor new confirm vote
|
||||||
|
CBaseEntity *pTrigger = NULL;
|
||||||
|
int i;
|
||||||
|
g_iMenu = 2;
|
||||||
|
while( pTrigger = UTIL_FindEntityByClassname( pTrigger, "trigger_changelevel" ) )
|
||||||
|
{
|
||||||
|
CChangeLevel *ent = (CChangeLevel *)pTrigger;
|
||||||
|
votes[i] = 0;
|
||||||
|
triggers[i] = pTrigger;
|
||||||
|
maps[i++] = ent->m_szMapName;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
votes[i] = 0;
|
||||||
|
triggers[i] = NULL;
|
||||||
|
maps[i++] = "Keep this map";
|
||||||
|
m_iConfirm = i;
|
||||||
|
m_iVoteCount = 0;
|
||||||
|
ShowGlobalMenu(UTIL_VarArgs("%s requested to force change map", ""), i, maps);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
};
|
||||||
|
GlobalMenu g_GlobalMenu;
|
||||||
|
|
||||||
|
void CoopVoteMenu( CBasePlayer *pPlayer )
|
||||||
|
{
|
||||||
|
int count;
|
||||||
|
for( int i = 1; i <= gpGlobals->maxClients; i++ )
|
||||||
|
{
|
||||||
|
CBaseEntity *plr = UTIL_PlayerByIndex( i );
|
||||||
|
|
||||||
|
if( plr && plr->IsPlayer() )
|
||||||
|
{
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if( count < 5 )
|
||||||
|
return;
|
||||||
|
g_GlobalMenu.VoteMenu(pPlayer);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CoopProcessMenu( CBasePlayer *pPlayer, int imenu )
|
||||||
|
{
|
||||||
|
return g_GlobalMenu.Process( pPlayer, imenu );
|
||||||
|
}
|
||||||
|
|
||||||
static void validateoffset( void )
|
static void validateoffset( void )
|
||||||
{
|
{
|
||||||
@ -1739,19 +1879,13 @@ void CChangeLevel::ChangeLevelNow( CBaseEntity *pActivator )
|
|||||||
|
|
||||||
if( m_fIsBack )
|
if( m_fIsBack )
|
||||||
{
|
{
|
||||||
if( count2 - count1 > 1 )
|
if( g_iMenu != 1 )
|
||||||
{
|
{
|
||||||
UTIL_HudMessageAll( params, UTIL_VarArgs( "%s requested to changelevel backwards, but not enough players\n",
|
g_GlobalMenu.ConfirmMenu( this, m_szMapName );
|
||||||
( pActivator->pev->netname && STRING( pActivator->pev->netname )[0] != 0 ) ? STRING( pActivator->pev->netname ) : "unconnected",
|
|
||||||
st_szNextMap, st_szNextSpot, i ) );
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
/* not done, need to send confirmation menus
|
if( g_GlobalMenu.m_iConfirm < count2 )
|
||||||
else if (g_SavedCoords.changeback < 2)
|
|
||||||
{
|
|
||||||
UTIL_ChangebackMenu(( pActivator->pev->netname && STRING( pActivator->pev->netname )[0] != 0 ) ? STRING( pActivator->pev->netname ) : "unconnected");
|
|
||||||
return;
|
return;
|
||||||
}*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if( m_fSpawnSaved )
|
if( m_fSpawnSaved )
|
||||||
|
Loading…
x
Reference in New Issue
Block a user