View Single Post
Author Message
AnimalMonster
Senior Member
Join Date: May 2020
Old 11-18-2022 , 13:20   Any thoughts on this code?
Reply With Quote #1

I always wanted full control of the round and wanted to try a different approach.
Thoughts?

PHP Code:
/* Require Semicolons */
#pragma semicolon 1


/* ~(Includes)~ */
#include <amxmodx>
#include <amxmisc>
#include <fakemeta>
#include <hamsandwich>
#include <reapi>

#include <zextract_const>

/* ~(Debug)~ */
//#define DEBUG // Enables Debug


/* ~(Frame)~ */
#define NextFrame RequestFrame( "OnNextFrame" );


/* ~(Round)~ */
#define MaxRoundTime 540

#define PlayersAlive ( ( GetPlayers( TEAM_CT ) ) && ( GetPlayers( TEAM_TERRORIST ) ) )

new const RoundWinMessagesWinType ][  ] = {
    
"",
    
"Restarting",
    
"No One Won",
    
"Humans Win",
    
"Zombies Win"
};


/* ~(Cvar)~ */
#define CvarValueMaxLen CI_Value - CI_Name - CI_Id

enum cvarInfo
{
    
CI_Id,
    
CI_Name50 ],
    
CI_Value50 ],
    
FloatCI_flValue,
    
CI_IntValue
};

enum _plgCvars
{
    
PCV_WFPDelay,
    
PCV_WFPMin,
    
PCV_Rounds,
    
PCV_RoundStartDelay,
    
PCV_RoundEndDelay
};

new 
g_iCvarsplgCvars ][ cvarInfo ] = 
{
    { 
0"ZExtract_WfpDelay""3.0",  0.0},
    { 
0"ZExtract_WfpMinPlayers""2"0.0},
    { 
0"ZExtract_Rounds""10"0.0},
    { 
0"ZExtract_RoundStartDelay""15.0"0.0},
    { 
0"ZExtract_RoundEndDelay""5.0"0.0}
};


/* ~(Variables)~ */
new /*==*/ g_MaxRoundTime,
    
/*==*/ g_MaxRounds,
    
/*==*/ g_iRound,

    
Floatg_flRoundStartTime,
    
Floatg_flCountNextTime,
    
Floatg_flWFPTime,

    
boolg_bRoundStarted,
    
boolg_bRoundEnded,
    
boolg_bWFP,

    
RsTypeg_rRestart,

    
cvarRestart],
    
cvarRoundTime,
    
cvarFreezeTime,

    
imTextMsg,
    
imRoundTimer;


/* ~(Private Functions)~ */
RegisterCvars( )
{
    for ( new 
0plgCvars; ++)
    {
        
g_iCvars][ CI_Id ] = register_cvarg_iCvars][ CI_Name ], g_iCvars][ CI_Value ] );
        
bind_pcvar_stringg_iCvars][ CI_Id ], g_iCvars][ CI_Value ], CvarValueMaxLen );
        
bind_pcvar_floatg_iCvars][ CI_Id ], g_iCvars][ CI_flValue ] );
        
bind_pcvar_numg_iCvars][ CI_Id ], g_iCvars][ CI_IntValue ] );
    }
}

CheckRestart( )
{
    if ( 
g_rRestart Rs_Not )
        return;

    new 
cvarStr];

    
get_pcvar_stringcvarRestart], cvarStrcharsmaxcvarStr ) );

    if ( 
containcvarStr"." ) )
    {
        if ( 
get_pcvar_floatcvarRestart] ) > 0.0 )
        {
            
#if defined DEBUG
            
server_print"Server Game Restart" );
            
#endif
            
g_rRestart Rs_All;
            
OnRoundEnd( );
        }
    }
    else {
        if ( 
get_pcvar_numcvarRestart] ) > )
        {
            
#if defined DEBUG
            
server_print"Server Game Restart" );
            
#endif
            
g_rRestart Rs_All;
            
OnRoundEnd( );
        }
    }

    
get_pcvar_stringcvarRestart], cvarStrcharsmaxcvarStr ) );

    if ( 
containcvarStr"." ) )
    {
        if ( 
get_pcvar_floatcvarRestart] ) > 0.0 )
        {
            
#if defined DEBUG
            
server_print"Server Round Restart" );
            
#endif
            
g_rRestart Rs_Round;
            
OnRoundEnd( );
        }
    }
    else {
        if ( 
get_pcvar_numcvarRestart] ) > )
        {
            
#if defined DEBUG
            
server_print"Server Round Restart" );
            
#endif
            
g_rRestart Rs_Round;
            
OnRoundEnd( );
        }
    }
}

CheckRoundEndFloatflGameTime )
{
    static 
FloatTimePassed;
    
TimePassed = ( flGameTime g_flRoundStartTime );

    if ( ( 
0.0 > ( floatg_MaxRoundTime ) - TimePassed ) ) || !PlayersAlive )
    {
        
OnRoundEnd( );
    }

    
#if defined DEBUG
    
server_print"CheckRoundEnd Works: PlayersAlive:%i"PlayersAlive);
    
#endif
}

CheckWFP( )
{
    static 
PlayersOnPlayersOn get_playersnum( );
    static 
FloatflGameTimeflGameTime get_gametime( );

    if ( !
g_bWFP && PlayersOn >= g_iCvarsPCV_WFPMin ][ CI_IntValue ] )
    {
        return;
    }

    if ( 
PlayersOn g_iCvarsPCV_WFPMin ][ CI_IntValue ] && !g_bWFP )
    {
        
g_bWFP true;
        
g_bRoundEnded true;
    }

    if ( 
g_bWFP && PlayersOn >= g_iCvarsPCV_WFPMin ][ CI_IntValue ] )
    {
        if ( 
g_flRoundStartTime g_flWFPTime )
            
g_flWFPTime flGameTime;

        if ( 
flGameTime g_flWFPTime g_iCvarsPCV_WFPDelay ][ CI_flValue ] )
        {
            
g_bWFP false;
            
OnRoundEnd( );
        }
    }

    
#if defined DEBUG
    
server_print"WaitForPlayers: Players: %i, Required: %i, Waiting: %i, Passed Delay: %i, Delay: %.2f"PlayersOng_iCvarsPCV_WFPMin ][ CI_IntValue ], g_bWFPflGameTime g_flWFPTime g_iCvarsPCV_WFPDelay ][ CI_flValue ], g_iCvarsPCV_WFPDelay ][ CI_flValue ] );
    
#endif
}

CountFloatflGameTime )
{
    static 
FloatTimePassed;
    
TimePassed = ( flGameTime g_flRoundStartTime ) - 1.0;

    static 
FloatStartDelay;
    
StartDelay g_iCvarsPCV_RoundStartDelay ][ CI_flValue ];

    if ( 
TimePassed StartDelay )
    {
        
OnRoundStart( );
    }
    else if ( 
g_flCountNextTime flGameTime )
    {
        
g_flCountNextTime += 1.0;

        
PrintCenter_"Game Starting in %i.."floatroundStartDelay TimePassed ) );
    }
}

/* ~(plugin_* Functions)~ */
public plugin_init()
{
    
/* Register to AMXX PLugin's List */
    
register_plugin"ZExtract: Rounds""v1.0""DeclineD" );

    
/* Handle "Round Start/End" */
    
register_event"HLTV""OnRoundStart2""a""1=0""2=0" );
    
RegisterHookChainRG_RoundEnd"OnRoundEnd2" );

    
/* Handle "Map Change" */
    
RegisterHookChainRG_CSGameRules_GoToIntermission"ReHook_ChangeMap" );

    
/* Register plugin cvars */
    
RegisterCvars( );

    
/* Get Pointer of Game Cvars */
    
cvarRestart] = get_cvar_pointer"sv_restart" );
    
cvarRestart] = get_cvar_pointer"sv_restartround" );
    
cvarRoundTime get_cvar_pointer"mp_roundtime" );
    
cvarFreezeTime get_cvar_pointer"mp_freezetime" );

    
/* Get Required MsgIds for the plugin */
    
imTextMsg get_user_msgid"TextMsg" );
    
imRoundTimer get_user_msgid"RoundTime" );

    
/* Rounds */
    
g_MaxRounds get_pcvar_numg_iCvarsPCV_Rounds ][ CI_Id ] );
    
g_flRoundStartTime get_gametime( );

    
/* Have a check function on every frame */
    
NextFrame
}

public 
plugin_precache( )
{
    
}

public 
plugin_natives( )
{
    
}


/* ~(Public Functions)~ */
// [ Round ]
public OnRoundStart( )
{
    
g_bRoundStarted true;
}

public 
OnRoundStart2( )
{
    if ( !( 
g_rRestart Rs_Not ) || !g_bWFP )
    {
        ++
g_iRound;
    }

    
g_rRestart Rs_Not;
    
g_bRoundEnded false;
    
g_bRoundStarted false;

    
g_MaxRoundTime GetRoundTime( );

    
g_flRoundStartTime get_gametime( );
    
g_flCountNextTime g_flRoundStartTime 1.0;

    
SetRoundTimer( );

    
#if defined DEBUG
    
server_print"Server Round Started" );
    
#endif
}

public 
OnRoundEnd( )
{
    if ( 
g_bWFP )
        return;

    
#if defined DEBUG
    
server_print"Server Round Ending" );
    
#endif

    
static FloatTimePassed;
    
TimePassed = ( get_gametime() - g_flRoundStartTime 1.0 );

    
g_bRoundEnded true;

    new 
WinTypeiWinWinStatusfWinScenarioEventEndRoundWinEvent;

    if ( 
g_rRestart Rs_Not )
    {
        
iWin WIN_RESTART;
        
fWin WINSTATUS_NONE;
        
WinEvent ROUND_GAME_RESTART;

        
set_pcvar_num(cvarRestart], 0);
        
set_pcvar_num(cvarRestart], 0);
    }
    else if ( ( 
0.0 > ( floatg_MaxRoundTime ) - TimePassed ) ) )
    {
        
iWin WIN_DRAW;
        
fWin WINSTATUS_DRAW;
        
WinEvent ROUND_END_DRAW;

    }
    else if ( 
GetPlayersTEAM_CT ) == )
    {
        
iWin WIN_ZOMBIE;
        
fWin WINSTATUS_TERRORISTS;
        
WinEvent ROUND_TERRORISTS_WIN;
    }
    else if ( 
GetPlayersTEAM_TERRORIST ) == )
    {
        
iWin WIN_HUMAN;
        
fWin WINSTATUS_CTS;
        
WinEvent ROUND_CTS_WIN;
    }

    
rg_round_end(g_iCvarsPCV_RoundEndDelay ][ CI_flValue ], fWinWinEventRoundWinMessagesiWin ], "");
}

public 
OnRoundEnd2WinStatusstatusScenarioEventEndRoundeventFloattmDelay )
{
    
SetHookChainReturn(ATYPE_BOOLfalse);
    return 
HC_SUPERCEDE;
}

// [ Checks ]
public OnNextFrame( )
{
    static 
FloatflGameTime
    
flGameTime get_gametime( );

    
// Resume game if not waiting for players
    
if ( !g_bWFP )
    {
        
// Functions that will be called in pre-game
        
if ( !g_bRoundStarted && !g_bRoundEnded )
        {
            
CountflGameTime );
        }
        
// Functions that will be called in game
        
else if ( !g_bRoundEnded )
        {
            
CheckRoundEndflGameTime );
        }
        
// Functions that will be called in post-game
        
else
        {

        }
    }

    
/* Functions that will be called anyway */
    
CheckRestart( );
    
CheckWFP( );

    
/* Keep calling the next frame */
    
NextFrame
}


/* ~(Map Change)~ */
public ReHook_ChangeMap( )
{
    return 
HC_SUPERCEDE;
}


/* ~(Stock Functions)~ */
stock GetRoundTime( )
{
    new 
rTime[5], fTime[5];
    
get_pcvar_string(cvarRoundTimerTimecharsmax(rTime));
    
get_pcvar_string(cvarFreezeTimefTimecharsmax(fTime));

    new 
iRTime floatround( ( containrTime"." ) ? str_to_floatrTime ) : floatstr_to_numrTime ) ) ) * 60.0 );
    new 
iFTime = ( containfTime"." ) ? floatroundstr_to_floatfTime ) ) : str_to_numfTime ) );

    if ( 
iRTime MaxRoundTime )
        
iRTime MaxRoundTime;

    
iRTime += iFTime;

    return 
iRTime;
}

stock SetRoundTimer( )
{
    
message_beginMSG_BROADCASTimRoundTimer );
    
write_shortg_MaxRoundTime );
    
message_end( );
}

stock GetPlayersTeamNameTeam )
{
    new 
ctt;

    
rg_initialize_player_countstct );

    switch( 
Team )
    {
        case 
TEAM_CT: return ct;
        case 
TEAM_TERRORIST: return t;
        default: return 
0;
    }

    return 
0;
}

stock PrintCenter(id 0, const msg[ ] = ""any:...)
{
    new 
szMsg150 ];
    
vformatszMsgcharsmaxszMsg ), msg);

    
message_begin( ( id == MSG_BROADCAST MSG_ONE_UNRELIABLE ), imTextMsg_id );
    
write_byte);
    
write_stringszMsg );
    
message_end( );

    
server_printszMsg );


Last edited by AnimalMonster; 11-18-2022 at 13:20.
AnimalMonster is offline