Created
July 28, 2021 17:30
-
-
Save SmileYzn/87900361451645395670f59c33b7e08b to your computer and use it in GitHub Desktop.
CS Mix Maker Beta Plugin 0.01
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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