Skip to content

Instantly share code, notes, and snippets.

@SmileYzn
Created July 28, 2021 17:30
Show Gist options
  • Save SmileYzn/87900361451645395670f59c33b7e08b to your computer and use it in GitHub Desktop.
Save SmileYzn/87900361451645395670f59c33b7e08b to your computer and use it in GitHub Desktop.
CS Mix Maker Beta Plugin 0.01
#include <amxmodx>
#include <amxmisc>
#include <reapi>
#pragma semicolon 1
#define MIX_MAKER_PLUGIN "Mix Maker"
#define MIX_MAKER_BUILD "0.0.1"
#define MIX_MAKER_AUTHOR "SmileY"
#define MIX_MAKER_TAG "^4[MM]^1"
enum _:MM_STATES
{
STATE_DEAD = 0,
STATE_WARMUP = 1,
STATE_START = 2,
STATE_FIRST_HALF = 3,
STATE_HALFTIME = 4,
STATE_SECOND_HALF = 5,
STATE_OVERTIME = 6,
STATE_END = 7
};
new g_iState = STATE_DEAD;
new const MM_TEAMS_STR[TeamName][] =
{
"Unassigned",
"Terrorists",
"Counter-Terrorists",
"Spectators"
};
new Float:g_fCBasePlayer_PostThink_Time;
new g_iSystemTime;
new g_iNumTRWins;
new g_iNumCTWins;
new g_iScore[MAX_PLAYERS+1];
new g_iDeath[MAX_PLAYERS+1];
new g_iPlayersMin;
new g_iPlayersMax;
new g_iHandleTime;
new g_iChangeTeam;
new g_iPlayRounds;
new g_iPlayOvertime;
new g_iOvertimeRounds;
new g_pSvRestart;
new g_pHumansJoinTeam;
new g_szConfig[MM_STATES][32];
new HookChain:g_hCBasePlayer_PostThink;
new HookChain:g_hCBasePlayer_GetIntoGame;
new HookChain:g_hCBasePlayer_AddAccount;
new HookChain:g_hRoundEnd;
new HookChain:g_hCSGameRules_OnRoundFreezeEnd;
new g_iMessageTeamScore;
new g_iMessageScoreInfo;
public plugin_init()
{
register_plugin(MIX_MAKER_PLUGIN,MIX_MAKER_BUILD,MIX_MAKER_AUTHOR);
// Mix Maker Console Variables
bind_pcvar_num(create_cvar("mm_players_min","10",FCVAR_NONE,"Minimum of players to start a match"),g_iPlayersMin);
bind_pcvar_num(create_cvar("mm_players_max","10",FCVAR_NONE,"Maximum of players allowed in teams"),g_iPlayersMax);
bind_pcvar_num(create_cvar("mm_handle_time","60",FCVAR_NONE,"Time to start Mix Maker in Warmup"),g_iHandleTime);
bind_pcvar_num(create_cvar("mm_change_team","1",FCVAR_NONE,"Swap Teams before start match"),g_iChangeTeam);
bind_pcvar_num(create_cvar("mm_play_rounds","30",FCVAR_NONE,"Number of rounds to play"),g_iPlayRounds);
bind_pcvar_num(create_cvar("mm_play_overtime","1",FCVAR_NONE,"0 End Tied, 1 Play Overtime, 2 Sudden Death"),g_iPlayOvertime);
bind_pcvar_num(create_cvar("mm_play_overtime_rounds","3",FCVAR_NONE,"Overtime playout rounds"),g_iOvertimeRounds);
// Mix Maker Config Files
bind_pcvar_string(create_cvar("mm_cfg_mixmaker","mixmaker.rc",FCVAR_NONE,"Mix Maker Settings"),g_szConfig[STATE_DEAD],sizeof(g_szConfig[]));
bind_pcvar_string(create_cvar("mm_cfg_warmup","warmup.rc",FCVAR_NONE,"Warmup Settings"),g_szConfig[STATE_WARMUP],sizeof(g_szConfig[]));
bind_pcvar_string(create_cvar("mm_cfg_start","start.rc",FCVAR_NONE,"Vote Settings"),g_szConfig[STATE_START],sizeof(g_szConfig[]));
bind_pcvar_string(create_cvar("mm_cfg_1st","esl.rc",FCVAR_NONE,"First Half Settings"),g_szConfig[STATE_FIRST_HALF],sizeof(g_szConfig[]));
bind_pcvar_string(create_cvar("mm_cfg_halftime","warmup.rc",FCVAR_NONE,"Halftime Settings"),g_szConfig[STATE_HALFTIME],sizeof(g_szConfig[]));
bind_pcvar_string(create_cvar("mm_cfg_2nd","esl.rc",FCVAR_NONE,"Second Half Settings"),g_szConfig[STATE_SECOND_HALF],sizeof(g_szConfig[]));
bind_pcvar_string(create_cvar("mm_cfg_overtime","esl-ot.rc",FCVAR_NONE,"Overtime Settings"),g_szConfig[STATE_OVERTIME],sizeof(g_szConfig[]));
bind_pcvar_string(create_cvar("mm_cfg_end","warmup.rc",FCVAR_NONE,"Game Finished Settings"),g_szConfig[STATE_END],sizeof(g_szConfig[]));
// Server variables
g_pSvRestart = get_cvar_pointer("sv_restart");
g_pHumansJoinTeam = get_cvar_pointer("humans_join_team");
// Block Choose Team and Menus
register_clcmd("chooseteam","HOOK_TeamChange");
register_clcmd("jointeam","HOOK_TeamChange");
// Player think (To handle hud messages)
DisableHookChain(g_hCBasePlayer_PostThink = RegisterHookChain(RG_CBasePlayer_PostThink,"HOOK_CBasePlayer_PostThink",true));
// Display mesasges when user join
DisableHookChain(g_hCBasePlayer_GetIntoGame = RegisterHookChain(RG_CBasePlayer_GetIntoGame,"HOOK_RG_CBasePlayer_GetIntoGame",false));
// Infinite money display in warmup
DisableHookChain(g_hCBasePlayer_AddAccount = RegisterHookChain(RG_CBasePlayer_AddAccount,"HOOK_CBasePlayer_AddAccount",false));
// Round end hook
DisableHookChain(g_hRoundEnd = RegisterHookChain(RG_RoundEnd,"HOOK_RoundEnd",true));
// Freezetime end hook
DisableHookChain(g_hCSGameRules_OnRoundFreezeEnd = RegisterHookChain(RG_CSGameRules_OnRoundFreezeEnd,"HOOK_CSGameRules_OnRoundFreezeEnd",true));
}
public plugin_cfg()
{
MM_SetState(STATE_DEAD);
}
public client_putinserver(id)
{
set_pcvar_string(g_pHumansJoinTeam,(get_playersnum() < g_iPlayersMax) ? "ANY" : "SPEC");
}
public client_disconnected(id)
{
if(g_iState != STATE_DEAD)
{
if(get_playersnum() <= 1)
{
MM_SetState(STATE_DEAD);
}
else
{
if(STATE_FIRST_HALF <= g_iState <= STATE_OVERTIME)
{
new TeamName:iTeam = get_member_s(id,m_iTeam);
if(TEAM_TERRORIST <= iTeam <= TEAM_CT)
{
if(get_member_game((iTeam == TEAM_TERRORIST) ? m_iNumTerrorist : m_iNumCT) <= (g_iPlayersMin / 2))
{
new iPlayers[MAX_PLAYERS],iNum;
get_players(iPlayers,iNum,"he","SPECTATOR");
if(iNum)
{
new iPlayer = iPlayers[random(iNum)];
set_member_s(iPlayer,m_iJoiningState,CS_STATE_GET_INTO_GAME);
rg_join_team(iPlayer,iTeam);
rg_set_user_team(iPlayer,iTeam);
}
}
}
}
}
}
}
public MM_SetState(iState)
{
g_iState = iState;
switch(iState)
{
case STATE_DEAD:
{
DisableHookChain(g_hCBasePlayer_PostThink);
EnableHookChain(g_hCBasePlayer_GetIntoGame);
DisableHookChain(g_hCBasePlayer_AddAccount);
unregister_message(get_user_msgid("TeamScore"),g_iMessageTeamScore);
unregister_message(get_user_msgid("ScoreInfo"),g_iMessageScoreInfo);
}
case STATE_WARMUP:
{
EnableHookChain(g_hCBasePlayer_PostThink);
EnableHookChain(g_hCBasePlayer_AddAccount);
g_iMessageTeamScore = register_message(get_user_msgid("TeamScore"),"HOOK_TeamScore");
g_iMessageScoreInfo = register_message(get_user_msgid("ScoreInfo"),"HOOK_ScoreInfo");
client_print_color(0,print_team_red,"%s Starting %s (^3Build %s^1)",MIX_MAKER_TAG,MIX_MAKER_PLUGIN,MIX_MAKER_BUILD);
}
case STATE_START:
{
DisableHookChain(g_hCBasePlayer_PostThink);
DisableHookChain(g_hCBasePlayer_GetIntoGame);
DisableHookChain(g_hCBasePlayer_AddAccount);
if(g_iChangeTeam)
{
rg_balance_teams();
rg_swap_all_players();
}
g_iNumTRWins = 0;
g_iNumCTWins = 0;
arrayset(g_iScore,0,sizeof(g_iScore));
arrayset(g_iDeath,0,sizeof(g_iDeath));
client_print_color(0,print_team_red,"%s ^4Get Ready!^1 Balancing Teams!!",MIX_MAKER_TAG);
MM_SetState(STATE_FIRST_HALF);
}
case STATE_FIRST_HALF:
{
MM_LO3(1);
set_member_game(m_bGameStarted,true);
EnableHookChain(g_hRoundEnd);
EnableHookChain(g_hCSGameRules_OnRoundFreezeEnd);
client_print_color(0,print_team_red,"%s ^4Get Ready!^1 Live in Three Restarts!!",MIX_MAKER_TAG);
}
case STATE_HALFTIME:
{
DisableHookChain(g_hRoundEnd);
DisableHookChain(g_hCSGameRules_OnRoundFreezeEnd);
rg_swap_all_players();
new iTemp = g_iNumTRWins;
g_iNumTRWins = g_iNumCTWins;
g_iNumCTWins = iTemp;
g_iSystemTime = get_systime();
new iPlayers[MAX_PLAYERS],iNum,iPlayer;
get_players(iPlayers,iNum,"h");
for(new i = 0;i < iNum;i++)
{
iPlayer = iPlayers[i];
g_iScore[iPlayer] += get_user_frags(iPlayer);
g_iDeath[iPlayer] += get_user_deaths(iPlayer);
}
EnableHookChain(g_hCBasePlayer_PostThink);
EnableHookChain(g_hCBasePlayer_GetIntoGame);
EnableHookChain(g_hCBasePlayer_AddAccount);
client_print_color(0,print_team_red,"%s ^4Half Time:^1 Changing Teams Sides!!",MIX_MAKER_TAG);
}
case STATE_SECOND_HALF:
{
MM_LO3(1);
set_member_game(m_bGameStarted,true);
EnableHookChain(g_hRoundEnd);
EnableHookChain(g_hCSGameRules_OnRoundFreezeEnd);
DisableHookChain(g_hCBasePlayer_PostThink);
DisableHookChain(g_hCBasePlayer_GetIntoGame);
DisableHookChain(g_hCBasePlayer_AddAccount);
client_print_color(0,print_team_red,"%s ^4Get Ready!^1 Second Half Start In Three Restarts!!",MIX_MAKER_TAG);
}
case STATE_OVERTIME:
{
MM_LO3(1);
set_member_game(m_bGameStarted,true);
EnableHookChain(g_hRoundEnd);
EnableHookChain(g_hCSGameRules_OnRoundFreezeEnd);
DisableHookChain(g_hCBasePlayer_PostThink);
DisableHookChain(g_hCBasePlayer_GetIntoGame);
DisableHookChain(g_hCBasePlayer_AddAccount);
client_print_color(0,print_team_red,"%s ^4Get Ready!^1 Overtime Start In Three Restarts!!",MIX_MAKER_TAG);
}
case STATE_END:
{
DisableHookChain(g_hRoundEnd);
DisableHookChain(g_hCSGameRules_OnRoundFreezeEnd);
EnableHookChain(g_hCBasePlayer_PostThink);
EnableHookChain(g_hCBasePlayer_GetIntoGame);
EnableHookChain(g_hCBasePlayer_AddAccount);
MM_ShowScores(0);
}
}
new szPath[MAX_RESOURCE_PATH_LENGTH];
get_localinfo("mix_maker_path",szPath,charsmax(szPath));
server_cmd("exec %s/%s",szPath,g_szConfig[iState]);
}
MM_NextState()
{
DisableHookChain(g_hCBasePlayer_PostThink);
if(g_iState == STATE_WARMUP)
{
MM_SetState(STATE_START);
}
else if(g_iState == STATE_HALFTIME)
{
if((g_iNumTRWins+g_iNumCTWins) < g_iPlayRounds)
{
MM_SetState(STATE_SECOND_HALF);
}
else
{
MM_SetState(STATE_OVERTIME);
}
}
else if(g_iState == STATE_END)
{
}
}
public MM_LO3(iDelay)
{
if(1 <= iDelay <= 3)
{
set_task(float(iDelay+1),"MM_LO3",iDelay+1);
set_pcvar_num(g_pSvRestart,iDelay);
}
else
{
set_hudmessage(0,255,0,-1.0,0.3,0,6.0,6.0);
show_hudmessage(0,"--- MATCH IS LIVE ---");
client_print_color(0,print_team_red,"%s ^4Match Is Live, Good Luck & Have Fun!",MIX_MAKER_TAG);
}
}
public MM_ShowScores(id)
{
if(STATE_FIRST_HALF <= g_iState <= STATE_OVERTIME)
{
client_print_color(id,id,"%s [^3%s^1] [^4%d^1] : [^4%d^1] [^3%s^1]",MIX_MAKER_TAG,MM_TEAMS_STR[TEAM_TERRORIST],g_iNumTRWins,g_iNumCTWins,MM_TEAMS_STR[TEAM_CT]);
}
else if(g_iState == STATE_END)
{
if(g_iNumTRWins > g_iNumCTWins)
{
client_print_color(id,print_team_red,"%s Game Over! The ^3%s^1 have won the match: ^4%d-%d",MIX_MAKER_TAG,MM_TEAMS_STR[TEAM_TERRORIST],g_iNumTRWins,g_iNumCTWins);
}
else if(g_iNumTRWins < g_iNumCTWins)
{
client_print_color(id,print_team_blue,"%s Game Over! The ^3%s^1 have won the match: ^4%d-%d",MIX_MAKER_TAG,MM_TEAMS_STR[TEAM_CT],g_iNumCTWins,g_iNumTRWins);
}
else
{
client_print_color(id,id,"%s Game Over! The match end tied: ^4%d-%d",MIX_MAKER_TAG,g_iNumTRWins,g_iNumCTWins);
}
}
else
{
client_print_color(id,id,"%s ^4%s^1 is not started yet.",MIX_MAKER_TAG,MIX_MAKER_PLUGIN);
}
return PLUGIN_HANDLED;
}
public HOOK_TeamChange(id)
{
if(g_iState != STATE_DEAD)
{
client_print_color(0,id,"%s ^3Change Teams is not allowed.",MIX_MAKER_TAG);
return PLUGIN_HANDLED;
}
return PLUGIN_CONTINUE;
}
public HOOK_RoundEnd(WinStatus:Status)
{
if(Status == WINSTATUS_TERRORISTS)
{
g_iNumTRWins++;
}
else if(Status == WINSTATUS_CTS)
{
g_iNumCTWins++;
}
if(g_iState == STATE_FIRST_HALF)
{
if((g_iNumTRWins+g_iNumCTWins) == (g_iPlayRounds / 2))
{
MM_SetState(STATE_HALFTIME);
}
}
else if(g_iState == STATE_SECOND_HALF)
{
if((g_iNumTRWins+g_iNumCTWins) == g_iPlayRounds)
{
if(g_iPlayOvertime == 1)
{
MM_SetState(STATE_HALFTIME);
}
else if(g_iPlayOvertime == 0)
{
MM_SetState(STATE_END);
}
}
else if(g_iNumTRWins > (g_iPlayRounds / 2))
{
MM_SetState(STATE_END);
}
else if(g_iNumCTWins > (g_iPlayRounds / 2))
{
MM_SetState(STATE_END);
}
}
else if(g_iState == STATE_OVERTIME)
{
if(((g_iNumTRWins+g_iNumCTWins) % g_iOvertimeRounds) == 0)
{
MM_SetState(STATE_HALFTIME);
}
else if((g_iNumTRWins-g_iNumCTWins) > g_iOvertimeRounds)
{
MM_SetState(STATE_END);
}
else if((g_iNumCTWins-g_iNumTRWins) > g_iOvertimeRounds)
{
MM_SetState(STATE_END);
}
}
return HC_CONTINUE;
}
public HOOK_CSGameRules_OnRoundFreezeEnd()
{
MM_ShowScores(0);
}
public HOOK_CBasePlayer_PostThink()
{
if(get_gametime() >= g_fCBasePlayer_PostThink_Time)
{
set_hudmessage(0,255,0,-1.0,0.3,0,0.0,0.8,0.0,0.0,1);
new iNeeded = (g_iPlayersMin - get_playersnum());
if(iNeeded > 0)
{
g_iSystemTime = get_systime();
show_hudmessage(0,"WAITING^n%d %s LEFT",iNeeded,(iNeeded == 1) ? "PLAYER" : "PLAYERS");
}
else
{
new iRemainTime = (g_iHandleTime - (get_systime() - g_iSystemTime));
if(iRemainTime > 0)
{
new szTime[16];
format_time(szTime,charsmax(szTime),"%M:%S",iRemainTime);
show_hudmessage(0,"STARTING IN^n%s",szTime);
}
else
{
MM_NextState();
}
}
g_fCBasePlayer_PostThink_Time = (get_gametime() + 0.5);
}
return HC_CONTINUE;
}
public HOOK_RG_CBasePlayer_GetIntoGame(id)
{
if(g_iState == STATE_DEAD)
{
MM_SetState(STATE_WARMUP);
}
else
{
new szName[MAX_NAME_LENGTH];
get_user_name(id,szName,charsmax(szName));
new TeamName:iTeam = get_member_s(id,m_iTeam);
if(TEAM_TERRORIST <= iTeam <= TEAM_CT)
{
client_print_color(0,id,"%s ^3%s joined %s^1.",MIX_MAKER_TAG,szName,MM_TEAMS_STR[iTeam]);
}
}
return HC_CONTINUE;
}
public HOOK_CBasePlayer_AddAccount(id,iAmount,RewardType:Type)
{
if(Type == RT_PLAYER_BOUGHT_SOMETHING)
{
SetHookChainArg(2,ATYPE_INTEGER,0);
}
return HC_CONTINUE;
}
public HOOK_TeamScore()
{
new szTeam[2];
get_msg_arg_string(1,szTeam,charsmax(szTeam));
set_msg_arg_int(2,ARG_SHORT,(szTeam[0] == 'T') ? g_iNumTRWins : g_iNumCTWins);
}
public HOOK_ScoreInfo(iMsg,iDest)
{
if(iDest == MSG_ALL || iDest == MSG_BROADCAST)
{
if(get_msg_arg_int(5))
{
new id = get_msg_arg_int(1);
if(is_user_connected(id))
{
set_msg_arg_int(2,ARG_SHORT,get_msg_arg_int(2) + g_iScore[id]);
set_msg_arg_int(3,ARG_SHORT,get_msg_arg_int(3) + g_iDeath[id]);
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment