Code:
#include < amxmodx >
#include < amxmisc >
#include < cstrike >
#include < nvault >
new const VERSION[] = "0.0.8"
new const g_VaultFile[] = "MapTeams"
new Trie:g_Trie
new Array:g_Array
new bool:Writing = false
new bool:MapStart = true
new bool:JoinTeam = false
new g_TotalMaps, g_iVault
new g_Team[32], g_MapsFile[64]
enum _:g_szMapNames
{
g_szMapName[32],
}
new const szDataList[][] =
{
"CT",
"T",
"S",
"0"
}
public plugin_init()
{
register_plugin ("Remember The Teams", VERSION, "Rohanlogs")
register_clcmd ("amx_map", "cmdAmxMap")
register_clcmd ("jointeam", "cmdJoinTeam")
register_message ( get_user_msgid("ShowMenu"), "MsgShowMenu" )
register_message ( get_user_msgid("VGUIMenu"), "MsgVGUIMenu" )
get_configsdir ( g_MapsFile, charsmax(g_MapsFile) )
add ( g_MapsFile, charsmax(g_MapsFile), "/mapsdata.txt" )
set_task (0.5, "EventMapchange", 809091, "", 0, "d", 1)
set_task (60.0, "boolJoinTeam", 809092, "", 0, "d", 1)
g_Trie = TrieCreate()
g_Array = ArrayCreate(g_szMapNames)
LoadMaps()
}
public plugin_precache()
{
MapStart = true
JoinTeam = false
Writing = false
set_task(20.0, "boolMapStart")
ClearOldEntries()
}
public boolMapStart()
{
MapStart = false
JoinTeam = true
}
public boolJoinTeam()
{
remove_task(809092)
JoinTeam = false
}
public ClearOldEntries()
{
g_iVault = nvault_open(g_VaultFile)
if (g_iVault == INVALID_HANDLE)
set_fail_state("Error opening nVault")
nvault_prune( g_iVault, 0, get_systime() - (120) ) // 2 minutes
}
public LoadMaps()
{
if(g_TotalMaps)
{
TrieClear(g_Trie)
ArrayClear(g_Array)
}
if( file_exists(g_MapsFile) )
{
new f = fopen(g_MapsFile, "rt")
static filedata[512], data[g_szMapNames]
while( !feof(f) )
{
fgets( f, filedata, charsmax(filedata) )
if( !filedata[0] ) continue
parse( filedata,\
data[g_szMapName], charsmax( data[g_szMapName] ) )
ArrayPushArray(g_Array, data)
TrieSetCell( g_Trie, data[g_szMapName], g_TotalMaps )
g_TotalMaps++
}
fclose(f)
}
}
public EventMapchange()
{
remove_task(809091)
Writing = true
new Players[32], PlayersNum, iPlayer
get_players(Players, PlayersNum, "ch")
for(new i; i < PlayersNum; i++)
{
iPlayer = Players[i]
if( !is_user_connected(iPlayer) ) continue
WriteTeams(iPlayer)
}
}
public client_authorized(id)
{
if(MapStart == false)
return PLUGIN_CONTINUE
g_Team[id] = 0
new szAuthID[33], szData[10]
new iTimestamp, iDataExists
get_user_authid( id, szAuthID, charsmax(szAuthID) )
iDataExists = nvault_lookup( g_iVault, szAuthID, szData, charsmax(szData), iTimestamp )
if (iDataExists)
{
if( equal(szData, szDataList[0]) )
g_Team[id] = 2
else if( equal(szData, szDataList[1]) )
g_Team[id] = 1
else if( equal(szData, szDataList[2]) )
g_Team[id] = 3
else if( equal(szData, szDataList[3]) )
g_Team[id] = 0
}
nvault_remove(g_iVault, szAuthID)
return PLUGIN_CONTINUE
}
public client_putinserver(id)
{
if(Writing == true)
WriteTeams(id)
if( g_Team[id] == 3 )
set_task(1.4, "DelaySpecJoin", id)
}
public DelaySpecJoin(id)
{
if( !is_user_connected(id) )
return PLUGIN_HANDLED
if( is_user_alive(id) )
user_silentkill(id)
cs_set_user_team(id, CS_TEAM_SPECTATOR)
return PLUGIN_HANDLED
}
public cmdAmxMap(id)
{
if( ~get_user_flags(id) & ADMIN_MAP )
return PLUGIN_HANDLED
new Args[32]
read_args(Args, 31)
if( TrieKeyExists(g_Trie, Args) )
{
new Players[32], PlayersNum, iPlayer
get_players(Players, PlayersNum, "ch")
for(new i; i < PlayersNum; i++)
{
iPlayer = Players[i]
if( !is_user_connected(iPlayer) ) continue
WriteTeams(iPlayer)
}
}
return PLUGIN_CONTINUE
}
public cmdJoinTeam(id)
{
if(MapStart == true || JoinTeam == false)
return ( CS_TEAM_T <= cs_get_user_team(id) <= CS_TEAM_CT ) ? PLUGIN_HANDLED : PLUGIN_CONTINUE
return PLUGIN_CONTINUE
}
WriteTeams(id)
{
if( !is_user_connected(id) )
return PLUGIN_CONTINUE
new szAuth[35]
get_user_authid( id , szAuth , charsmax(szAuth) )
new szCT[] = "CT"
new szT[] = "T"
new szSPEC[] = "S"
new szUnassigned[] = "0"
new CsTeams:szTeam
szTeam = cs_get_user_team(id)
switch (szTeam)
{
case (CS_TEAM_CT):
nvault_set(g_iVault , szAuth , szCT)
case (CS_TEAM_T):
nvault_set(g_iVault , szAuth , szT)
case (CS_TEAM_SPECTATOR):
nvault_set(g_iVault , szAuth , szSPEC)
case (CS_TEAM_UNASSIGNED):
nvault_set(g_iVault , szAuth , szUnassigned)
}
return PLUGIN_CONTINUE
}
public MsgShowMenu(msgid, dest, id)
{
if(MapStart == true || JoinTeam == false)
{
static team_select[] = "#Team_Select"
static menu_text_code[sizeof team_select]
get_msg_arg_string( 4, menu_text_code, charsmax (menu_text_code) )
if ( !equal(menu_text_code, team_select) )
return PLUGIN_CONTINUE
set_force_team_join_task(id, msgid)
return PLUGIN_HANDLED
}
return PLUGIN_CONTINUE
}
public MsgVGUIMenu(msgid, dest, id)
{
if(MapStart == true || JoinTeam == false)
{
if ( get_msg_arg_int(1) != 2 )
return PLUGIN_CONTINUE
set_force_team_join_task(id, msgid)
return PLUGIN_HANDLED
}
return PLUGIN_CONTINUE
}
public set_force_team_join_task(id, menu_msgid)
{
static param_menu_msgid[2]
param_menu_msgid[0] = menu_msgid
set_task( 0.1, "task_force_team_join", id, param_menu_msgid, charsmax (param_menu_msgid) )
}
public task_force_team_join( menu_msgid[], id )
{
if ( get_user_team(id) )
return
force_team_join( id, menu_msgid[0] )
}
public force_team_join(id, menu_msgid)
{
static jointeam[] = "jointeam"
static msg_block, joinclass[] = "joinclass"
msg_block = get_msg_block(menu_msgid)
set_msg_block(menu_msgid, BLOCK_SET)
switch( g_Team[id] )
{
case(1):
engclient_cmd(id, jointeam, "1")
case(2):
engclient_cmd(id, jointeam, "2")
case(3):
engclient_cmd(id, jointeam, "5")
case(0):
engclient_cmd(id, jointeam, "5")
}
engclient_cmd(id, joinclass, "3")
set_msg_block(menu_msgid, msg_block)
}
public plugin_end( )
nvault_close( g_iVault )