#include <amxmodx>
#include <amxmisc>
#include <cstrike>
#include <fakemeta>
#include <hamsandwich>
#include <PugCore>
#include <PugStocks>
#pragma semicolon 1
new bool:g_bActive = false;
new bool:g_bReady[MAX_PLAYERS+1];
new g_pAutoSwap;
new g_pPlayersMin;
new g_pRoundsMax;
new g_pSwapDelay;
public plugin_init()
{
register_plugin("Pug Mod (Ready System)",PUG_MOD_VERSION,PUG_MOD_AUTHOR);
register_dictionary("PugReady.txt");
g_pAutoSwap = create_cvar("pug_force_auto_swap","1",FCVAR_NONE,"Auto Swap teams without Ready-System if the teams are complete");
PugRegCommand("ready","fnReady",ADMIN_ALL,"PUG_DESC_READY");
PugRegCommand("notready","fnNotReady",ADMIN_ALL,"PUG_DESC_NOTREADY");
PugRegAdminCommand("forceready","fnForceReady",PUG_CMD_LVL,"PUG_DESC_FORCEREADY");
PugRegAdminCommand("forceunready","fnForceUnReady",PUG_CMD_LVL,"PUG_DESC_FORCENOTREADY");
g_pPlayersMin = get_cvar_pointer("pug_players_min");
g_pRoundsMax = get_cvar_pointer("pug_rounds_max");
g_pSwapDelay = get_cvar_pointer("pug_swap_delay");
register_event("ResetHUD","fnKeepMenu","bf");
hook_cvar_change(g_pPlayersMin,"fnKeepMenu");
hook_cvar_change(get_cvar_pointer("amx_language"),"fnKeepMenu");
register_clcmd("joinclass","fnJoinedClass");
register_clcmd("menuselect","fnJoinedClass");
RegisterHamPlayer(Ham_Killed,"fnKilledPost",true);
RegisterHamPlayer(Ham_Spawn,"fnSpawnPost",true);
register_forward(FM_CmdStart,"fnCmdStart",true);
register_forward(FM_SetModel,"fnSetModel",true);
register_message(get_user_msgid("Money"),"fnMoney");
}
public client_disconnected(id,bool:bDrop,szMessage[],iLen)
{
if(g_bActive)
{
g_bReady[id] = false;
RequestFrame("fnKeepMenu");
}
}
public client_infochanged(id)
{
if(g_bActive)
{
RequestFrame("fnKeepMenu");
}
}
public PugEventWarmup(iStage)
{
fnReadySystem(true);
}
public PugEventStart(iStage)
{
fnReadySystem(false);
}
public PugEventHalfTime(iStage)
{
if(PugGetPlayersNum(true) < get_pcvar_num(g_pPlayersMin))
{
fnReadySystem(true);
}
else
{
if(get_pcvar_num(g_pAutoSwap))
{
arrayset(g_bReady,true,sizeof(g_bReady));
set_task(get_pcvar_float(g_pSwapDelay),"fnCheckReady");
}
else
{
fnReadySystem(true);
}
}
}
public PugEventSecondHalf(iStage)
{
fnReadySystem(false);
}
public PugEventOvertime(iStage)
{
fnReadySystem(false);
}
fnReadySystem(bool:bActive)
{
g_bActive = bActive;
PugRemoveMapEntities(bActive);
if(g_bActive)
{
fnKeepMenu();
PugChat(0,"%L",LANG_SERVER,"PUG_READY_SYSTEM_1");
}
else
{
fnDisplay(0.0);
PugChat(0,"%L",LANG_SERVER,"PUG_READY_SYSTEM_2");
}
arrayset(g_bReady,false,sizeof(g_bReady));
}
public fnReady(id)
{
if(g_bActive && is_user_connected(id) && (CS_TEAM_T <= cs_get_user_team(id) <= CS_TEAM_CT))
{
if(g_bReady[id])
{
PugChat(id,"%L",LANG_SERVER,"PUG_READY_A");
}
else
{
g_bReady[id] = true;
new szName[MAX_NAME_LENGTH];
get_user_name(id,szName,charsmax(szName));
PugChat(id,"%L",LANG_SERVER,"PUG_READY_1",szName);
fnCheckReady();
}
}
else
{
PugChat(id,"%L",LANG_SERVER,"PUG_UNABLE_CMD");
}
return PLUGIN_HANDLED;
}
public fnNotReady(id)
{
if(g_bActive && is_user_connected(id) && (CS_TEAM_T <= cs_get_user_team(id) <= CS_TEAM_CT))
{
if(!g_bReady[id])
{
PugChat(id,"%L",LANG_SERVER,"PUG_READY_B");
}
else
{
g_bReady[id] = false;
new szName[MAX_NAME_LENGTH];
get_user_name(id,szName,charsmax(szName));
PugChat(id,"%L",LANG_SERVER,"PUG_READY_2",szName);
fnCheckReady();
}
}
else
{
PugChat(id,"%L",LANG_SERVER,"PUG_UNABLE_CMD");
}
return PLUGIN_HANDLED;
}
public fnForceReady(id)
{
if(g_bActive)
{
if(!access(id,PUG_CMD_LVL) && (id != 0))
{
PugChat(id,"PUG_CMD_NOTALLOWED");
}
else
{
new szArg[32];
read_argv(1,szArg,charsmax(szArg));
new iPlayer = cmd_target(id,szArg,CMDTARGET_OBEY_IMMUNITY);
if(iPlayer && (1 <= get_user_team(id) <= 2) && !g_bReady[iPlayer])
{
PugRunCmdOnClient(id,"Force .ready","PUG_FORCE_READY",iPlayer,fnReady(iPlayer));
}
}
}
else
{
PugChat(id,"%L",LANG_SERVER,"PUG_UNABLE_CMD");
}
return PLUGIN_HANDLED;
}
public fnForceUnReady(id)
{
if(g_bActive)
{
if(!access(id,PUG_CMD_LVL) && (id != 0))
{
PugChat(id,"PUG_CMD_NOTALLOWED");
}
else
{
new szArg[32];
read_argv(1,szArg,charsmax(szArg));
new iPlayer = cmd_target(id,szArg,CMDTARGET_OBEY_IMMUNITY);
if(iPlayer && (1 <= get_user_team(id) <= 2) && g_bReady[iPlayer])
{
PugRunCmdOnClient(id,"Force .notready","PUG_FORCE_NOTREADY",iPlayer,fnNotReady(iPlayer));
}
}
}
else
{
PugChat(id,"%L",LANG_SERVER,"PUG_UNABLE_CMD");
}
return PLUGIN_HANDLED;
}
public fnKeepMenu()
{
if(g_bActive)
{
fnDisplay(999.0);
}
}
public fnDisplay(Float:fHoldTime)
{
new iPlayers[MAX_PLAYERS],iNum,iPlayer;
get_players(iPlayers,iNum,"ch");
new iPlayersNum,iReadys;
new szList[2][512],sName[MAX_NAME_LENGTH];
for(new i;i < iNum;i++)
{
iPlayer = iPlayers[i];
if(CS_TEAM_T <= cs_get_user_team(iPlayer) <= CS_TEAM_CT)
{
iPlayersNum++;
get_user_name(iPlayer,sName,charsmax(sName));
if(g_bReady[iPlayer])
{
iReadys++;
format(szList[0],charsmax(szList[]),"%s%s^n",szList[0],sName);
}
else
{
format(szList[1],charsmax(szList[]),"%s%s^n",szList[1],sName);
}
}
}
new iMinPlayers = get_pcvar_num(g_pPlayersMin);
set_hudmessage(0,255,0,0.23,0.02,0,0.0,fHoldTime,0.0,0.0,1);
show_hudmessage(0,"%L",LANG_SERVER,"PUG_LIST_A",(iPlayersNum - iReadys),iMinPlayers);
set_hudmessage(0,255,0,0.58,0.02,0,0.0,fHoldTime,0.0,0.0,2);
show_hudmessage(0,"%L",LANG_SERVER,"PUG_LIST_B",iReadys,iMinPlayers);
set_hudmessage(255,255,225,0.58,0.02,0,0.0,fHoldTime,0.0,0.0,3);
show_hudmessage(0,"^n%s",szList[0]);
set_hudmessage(255,255,225,0.23,0.02,0,0.0,fHoldTime,0.0,0.0,4);
show_hudmessage(0,"^n%s",szList[1]);
}
public fnCheckReady()
{
fnKeepMenu();
new iReady = 0;
for(new i;i < sizeof(g_bReady);i++)
{
if(g_bReady[i])
{
iReady++;
}
}
if(iReady >= get_pcvar_num(g_pPlayersMin))
{
switch(GET_PUG_STAGE())
{
case STAGE_WARMUP:
{
PugStart();
}
case STAGE_HALFTIME:
{
if(GET_PUG_ROUND() < get_pcvar_num(g_pRoundsMax))
{
PugSecondHalf();
}
else
{
PugOvertime();
}
}
}
}
}
public fnJoinedClass(id)
{
if(g_bActive)
{
if(get_ent_data(id,"CBasePlayer","m_iMenu") == CS_Menu_ChooseAppearance)
{
set_task(0.75,"fnRespawn",id);
}
}
return PLUGIN_CONTINUE;
}
public fnKilledPost(id)
{
if(g_bActive)
{
set_task(0.75,"fnRespawn",id);
}
}
public fnRespawn(id)
{
if(is_user_connected(id) && !is_user_alive(id) && (CS_TEAM_T <= cs_get_user_team(id) <= CS_TEAM_CT))
{
ExecuteHamB(Ham_CS_RoundRespawn,id);
}
}
public fnSpawnPost(id)
{
if(g_bActive)
{
set_pev(id,pev_takedamage,DAMAGE_NO);
}
}
public fnCmdStart(id,Handle,Seed)
{
if(g_bActive)
{
if(is_user_alive(id) && pev(id,pev_takedamage) == DAMAGE_NO)
{
if(get_uc(Handle,UC_Buttons) & (IN_FORWARD|IN_BACK|IN_MOVELEFT|IN_MOVERIGHT|IN_DUCK|IN_ATTACK|IN_ATTACK2))
{
set_pev(id,pev_takedamage,DAMAGE_AIM);
}
}
}
}
public fnSetModel(iEntity)
{
if(g_bActive)
{
if(pev_valid(iEntity))
{
new szName[MAX_NAME_LENGTH];
pev(iEntity,pev_classname,szName,charsmax(szName));
if(equali(szName,"weaponbox"))
{
set_pev(iEntity,pev_effects,EF_NODRAW);
set_pev(iEntity,pev_nextthink,get_gametime() + 0.1);
}
else if(equali(szName,"weapon_shield"))
{
set_pev(iEntity,pev_effects,EF_NODRAW);
RequestFrame("fnRemoveEntity",iEntity);
}
}
}
}
public fnRemoveEntity(iEntity)
{
dllfunc(DLLFunc_Think,iEntity);
}
public fnMoney(iMsg,iMsgDest,id)
{
if(g_bActive)
{
if(is_user_alive(id))
{
cs_set_user_money(id,16000,0);
}
return PLUGIN_HANDLED;
}
return PLUGIN_CONTINUE;
}
public CS_OnBuy(id,iWeapon)
{
if(g_bActive)
{
if(cs_get_weapon_class(iWeapon) == CS_WEAPONCLASS_GRENADE)
{
return PLUGIN_HANDLED;
}
}
return PLUGIN_CONTINUE;
}