Solved GAG problem with prefixes.

Coding Help/Re-API Supported
neverminddw
Member
Member
Posts: 32
Joined: 6 years ago
Contact:

GAG problem with prefixes.

#1

Post by neverminddw » 4 years ago

I have a plugin of prefixes. Works perfectly except that gag doesn't work. You can gag someone, but he will still be able to write.

Here's the code:
  1. #include <amxmodx>
  2. #include <cstrike>
  3.  
  4. // Prefixes
  5. new const szOwnerPrefix[] = "^1[^4Owner^1]", szHeadPrefix[] = "^1[^4Head Admin^1]", szAdminPrefix[] = "^1[^4Admin^1]"
  6.  
  7. new g_iMaxPlayers, g_iSayText
  8. new g_pCvarLogMessages
  9.  
  10. public plugin_init()
  11. {
  12.     register_plugin("Prefixes", "2.0", "alKapone")
  13.    
  14.     register_clcmd("say", "Hook_Say")
  15.     register_clcmd("say_team", "Hook_SayTeam")
  16.    
  17.     g_pCvarLogMessages = register_cvar("rgc_log_messages", "1")
  18.    
  19.     g_iMaxPlayers = get_maxplayers()
  20.     g_iSayText = get_user_msgid("SayText")
  21.    
  22.     register_message(g_iSayText, "BlockDoubleMessages")
  23. }
  24.  
  25. public BlockDoubleMessages()
  26. {
  27.     return PLUGIN_HANDLED
  28. }
  29.  
  30. public Hook_Say(id)
  31. {
  32.     if (!is_user_connected(id))
  33.         return PLUGIN_CONTINUE
  34.    
  35.     new szName[32], szMessage[200]
  36.     get_user_name(id, szName, charsmax(szName))
  37.     read_args(szMessage, charsmax(szMessage))
  38.     remove_quotes(szMessage)
  39.     trim(szMessage)
  40.    
  41.     for(new iChar = 0; iChar <= charsmax(szMessage); iChar++)
  42.     {
  43.         if (szMessage[iChar] == '^2' || szMessage[iChar] == '^3' || szMessage[iChar] == '^4')
  44.             szMessage[iChar] = '^1'
  45.     }
  46.  
  47.     if (!is_valid_msg(szMessage))
  48.         return PLUGIN_CONTINUE
  49.    
  50.     // Message format
  51.     if (is_user_alive(id) && (get_user_flags(id) & ADMIN_RCON) && (get_user_flags(id) & ADMIN_CVAR)) // Owner alive
  52.         format(szMessage, charsmax(szMessage), "%s ^3%s ^1: ^1%s", szOwnerPrefix, szName, szMessage)
  53.     else if (!is_user_alive(id) && (get_user_flags(id) & ADMIN_RCON) && (get_user_flags(id) & ADMIN_CVAR)) // Owner dead
  54.         format(szMessage, charsmax(szMessage), "^1*DEAD* %s ^3%s ^1: ^1%s", szOwnerPrefix, szName, szMessage)
  55.     else if (is_user_alive(id) && (get_user_flags(id) & ADMIN_CVAR) && (get_user_flags(id) & ADMIN_KICK)) // Head alive
  56.         format(szMessage, charsmax(szMessage), "%s ^3%s ^1: ^1%s", szHeadPrefix, szName, szMessage)
  57.     else if (!is_user_alive(id) && (get_user_flags(id) & ADMIN_CVAR) && (get_user_flags(id) & ADMIN_KICK)) // Head dead
  58.         format(szMessage, charsmax(szMessage), "^1*DEAD* %s ^3%s ^1: ^1%s", szHeadPrefix, szName, szMessage)
  59.     else if (is_user_alive(id) && (get_user_flags(id) & ADMIN_KICK))
  60.         format(szMessage, charsmax(szMessage), "%s ^3%s ^1: ^1%s", szAdminPrefix, szName, szMessage)
  61.     else if (!is_user_alive(id) && (get_user_flags(id) & ADMIN_KICK))
  62.         format(szMessage, charsmax(szMessage), "^1*DEAD* %s ^3%s ^1: ^1%s", szAdminPrefix, szName, szMessage)
  63.     else if (is_user_alive(id)) // Alive
  64.         format(szMessage, charsmax(szMessage), "^3%s ^1: ^1%s", szName, szMessage)
  65.     else if (!is_user_alive(id)) // Dead
  66.         format(szMessage, charsmax(szMessage), "^1*DEAD* ^3%s ^1: ^1%s", szName, szMessage)
  67.  
  68.     // Send the message
  69.     for (new i = 1; i <= g_iMaxPlayers; i++)
  70.     {
  71.         if (!is_user_connected(i))
  72.             continue
  73.  
  74.         Send_Message(szMessage, id, i)
  75.     }
  76.    
  77.     // Log messages
  78.     if (get_pcvar_num(g_pCvarLogMessages))
  79.     {
  80.         new szSteamID[36], szIP[16]
  81.         get_user_authid(id, szSteamID, charsmax(szSteamID))
  82.         get_user_ip(id, szIP, charsmax(szIP), 1)
  83.         Log_Messages("[%s|%s|%s] %s", szName, szSteamID, szIP, szMessage)
  84.     }
  85.    
  86.     return PLUGIN_CONTINUE
  87. }
  88.  
  89. public Hook_SayTeam(id)
  90. {
  91.     if (!is_user_connected(id))
  92.         return PLUGIN_CONTINUE
  93.    
  94.     new szName[32], szMessage[200]
  95.     get_user_name(id, szName, charsmax(szName))
  96.     read_args(szMessage, charsmax(szMessage))
  97.     remove_quotes(szMessage)
  98.     trim(szMessage)
  99.    
  100.     for(new iChar = 0; iChar <= charsmax(szMessage); iChar++)
  101.     {
  102.         if (szMessage[iChar] == '^2' || szMessage[iChar] == '^3' || szMessage[iChar] == '^4')
  103.             szMessage[iChar] = '^1'
  104.     }
  105.  
  106.     if (!is_valid_msg(szMessage))
  107.         return PLUGIN_CONTINUE
  108.  
  109.     // Message format
  110.     if(is_user_alive(id) && get_user_team(id) == 2)
  111.         format(szMessage, charsmax(szMessage), "^1(Counter-Terrorist) ^3%s ^1: ^1%s", szName, szMessage)
  112.     else if (!is_user_alive(id) && get_user_team(id) == 2)
  113.         format(szMessage, charsmax(szMessage), "^1*DEAD* ^1(Counter-Terrorist) ^3%s ^1: ^1%s", szName, szMessage)
  114.     else if (is_user_alive(id) && get_user_team(id) == 1)
  115.         format(szMessage, charsmax(szMessage), "^1(Terrorist) ^3%s ^1: ^1%s", szName, szMessage)
  116.     else if (!is_user_alive(id) && get_user_team(id) == 1)
  117.         format(szMessage, charsmax(szMessage), "^1*DEAD* ^1(Terrorist) ^3%s ^1: ^1%s", szName, szMessage)
  118.  
  119.     // Send the message
  120.     for (new i = 1; i <= g_iMaxPlayers; i++)
  121.     {
  122.         if(!is_user_connected(i) || get_user_team(i) != get_user_team(id))
  123.             continue
  124.  
  125.         Send_Message(szMessage, id, i)
  126.     }
  127.  
  128.     // Log messages
  129.     if (get_pcvar_num(g_pCvarLogMessages))
  130.     {
  131.         new szSteamID[36], szIP[16]
  132.         get_user_authid(id, szSteamID, charsmax(szSteamID))
  133.         get_user_ip(id, szIP, charsmax(szIP), 1)
  134.         Log_Messages("[%s|%s|%s] %s", szName, szSteamID, szIP, szMessage)
  135.     }
  136.    
  137.     return PLUGIN_CONTINUE
  138. }
  139.  
  140. bool:is_valid_msg(const szMessage[])
  141. {
  142.     if (!strlen(szMessage) || szMessage[0] == '/' && szMessage[1] == 'r' && szMessage[2] == 's')
  143.         return false
  144.        
  145.     return true
  146. }
  147.  
  148. stock Log_Messages(const szMessage_Fmt[], any:...)
  149. {
  150.     static szMessage[256], szFileName[32], szDate[16]
  151.     vformat(szMessage, charsmax(szMessage), szMessage_Fmt, 2)
  152.     replace_all(szMessage, charsmax(szMessage), "^4", "")
  153.     replace_all(szMessage, charsmax(szMessage), "^1", "")
  154.     replace_all(szMessage, charsmax(szMessage), "^1", "")
  155.     replace_all(szMessage, charsmax(szMessage), "^3", "")
  156.     format_time(szDate, charsmax(szDate), "%d%m%Y")
  157.     formatex(szFileName, charsmax(szFileName), "RGC_Messages_%s.log", szDate)
  158.     log_to_file(szFileName, "%s", szMessage)
  159. }
  160.  
  161. stock Send_Message(const szMessage[], const id, const iIndex)
  162. {
  163.     message_begin(MSG_ONE, g_iSayText, {0, 0, 0}, iIndex)
  164.     write_byte(id)
  165.     write_string(szMessage)
  166.     message_end()
  167. }

User avatar
Night Fury
Mod Developer
Mod Developer
Posts: 677
Joined: 7 years ago
Contact:

#2

Post by Night Fury » 4 years ago

Make sure your gag plugin comes before the prefix plugin.
Want your own mod edition? PM me.
Accepting private projects.
Discord: Fury#7469
Image

neverminddw
Member
Member
Posts: 32
Joined: 6 years ago
Contact:

#3

Post by neverminddw » 4 years ago

Mohamed Alaa wrote: 4 years ago Make sure your gag plugin comes before the prefix plugin.
You mean?
amx_gag.amxx
...
...
...
prefixes.amxx
I tried, still same problem.

User avatar
Night Fury
Mod Developer
Mod Developer
Posts: 677
Joined: 7 years ago
Contact:

#4

Post by Night Fury » 4 years ago

Provide your gag plugin.
Want your own mod edition? PM me.
Accepting private projects.
Discord: Fury#7469
Image


User avatar
Night Fury
Mod Developer
Mod Developer
Posts: 677
Joined: 7 years ago
Contact:

#6

Post by Night Fury » 4 years ago

Try to re-compile your both plugins, i have tried both plugins and when someone was gagged, he wasn't able to talk.
Want your own mod edition? PM me.
Accepting private projects.
Discord: Fury#7469
Image

neverminddw
Member
Member
Posts: 32
Joined: 6 years ago
Contact:

#7

Post by neverminddw » 4 years ago

Do you mean putting both sources of prefixes and gag in 1? Making 1 plugin from both?
Because if you mean to recompile them as they are like that... I don't seem to understand why recompiling will solve the problem.

Muhammet20
Veteran Member
Veteran Member
Posts: 408
Joined: 5 years ago
Contact:

#8

Post by Muhammet20 » 4 years ago

neverminddw wrote: 4 years ago Do you mean putting both sources of prefixes and gag in 1? Making 1 plugin from both?
Because if you mean to recompile them as they are like that... I don't seem to understand why recompiling will solve the problem.
re-compile mean open it with AmxModX studio and press compile then replace the new compiled one with the new one(make it for the both)
not mean merge them in one plugin

neverminddw
Member
Member
Posts: 32
Joined: 6 years ago
Contact:

#9

Post by neverminddw » 4 years ago

I did that to both when I installed them. Lol...
Still same problem, the problem should be on my prefix plugin for sure, but nobody seems to be able and find what's wrong there.

Muhammet20
Veteran Member
Veteran Member
Posts: 408
Joined: 5 years ago
Contact:

#10

Post by Muhammet20 » 4 years ago

neverminddw wrote: 4 years ago I did that to both when I installed them. Lol...
Still same problem, the problem should be on my prefix plugin for sure, but nobody seems to be able and find what's wrong there.
i found a fix for you
but i cant post it cuz i exploring with phone
i will post it when turn my pc on

neverminddw
Member
Member
Posts: 32
Joined: 6 years ago
Contact:

#11

Post by neverminddw » 4 years ago

I'll be waiting for u.

User avatar
Night Fury
Mod Developer
Mod Developer
Posts: 677
Joined: 7 years ago
Contact:

#12

Post by Night Fury » 4 years ago

Provide your plugin list (all plugins' names).
Want your own mod edition? PM me.
Accepting private projects.
Discord: Fury#7469
Image

neverminddw
Member
Member
Posts: 32
Joined: 6 years ago
Contact:

#13

Post by neverminddw » 4 years ago

Here u go.

Code: Select all

; AMX Mod X plugins

advanced_bans.amxx

; Admin Base - Always one has to be activated
admin.amxx		; admin base (required for any admin-related)
;admin_sql.amxx		; admin base - SQL version (comment admin.amxx)

; Basic
admincmd.amxx		; basic admin console commands
adminhelp.amxx		; help command for admin console commands
adminslots.amxx		; slot reservation
multilingual.amxx	; Multi-Lingual management

; Menus
menufront.amxx		; front-end for admin menus
cmdmenu.amxx		; command menu (speech, settings)
plmenu.amxx		; players menu (kick, ban, client cmds.)
;telemenu.amxx		; teleport menu (Fun Module required!)
mapsmenu.amxx		; maps menu (vote, changelevel)
pluginmenu.amxx		; Menus for commands/cvars organized by plugin

; Chat / Messages
rgc_adminchat.amxx ; [b]<---- This only affects amx_say and amx_tsay, nothing more.[/b]
adminchat.amxx		; console chat commands
antiflood.amxx		; prevent clients from chat-flooding the server
scrollmsg.amxx		; displays a scrolling message
imessage.amxx		; displays information messages
adminvote.amxx		; vote commands

; Map related
nextmap.amxx		; displays next map in mapcycle
;mapchooser.amxx		; allows to vote for next map
;timeleft.amxx		; displays time left on map

; Configuration
pausecfg.amxx		; allows to pause and unpause some plugins
statscfg.amxx		; allows to manage stats plugins via menu and commands

; Counter-Strike
restmenu.amxx		; restrict weapons menu
statsx.amxx		; stats on death or round end (CSX Module required!)
;miscstats.amxx		; bunch of events announcement for Counter-Strike
;stats_logging.amxx	; weapons stats logging (CSX Module required!)

; Enable to use AMX Mod plugins
;amxmod_compat.amxx	; AMX Mod backwards compatibility layer

; Custom - Add 3rd party plugins here

;Primary Plugins
amx_gag.amxx
rgc_autoteam_join.amxx
rgc_balancer.amxx
fast_sniper_switch.amxx
sniperlimit.amxx
bad_camper.amxx
amx_demorecorder.amxx
kgbbots.amxx
no_team_flash.amxx
autoreloadadmins.amxx
;highping_kicker.amxx

;Secondary Plugins
rgc_level_system.amxx
rgc_weapon_menu.amxx
rgc_prefixes.amxx ; [b]<----- This is the chat plugin.[/b]
rgc_hpsystem.amxx
rgc_resetscore.amxx
admin_spec_esp.amxx
ad_manager.amxx
multijump.amxx
rgc_knife_damage.amxx
parachute.amxx
abd.amxx
kill_assist.amxx
;afk_manager.amxx
c4timer.amxx
slaylosers.amxx
rgc_admin_models.amxx
rgc_admin_vip_knife_model.amxx
rgc_backweapons.amxx

Muhammet20
Veteran Member
Veteran Member
Posts: 408
Joined: 5 years ago
Contact:

#14

Post by Muhammet20 » 4 years ago

why you added them to plugins.ini
i mean why you dont add them to zombie escape plugins?

neverminddw
Member
Member
Posts: 32
Joined: 6 years ago
Contact:

#15

Post by neverminddw » 4 years ago

I'm running 2 servers. Zombie escape and public. Same problem in both. So... same.

You mentioned you found a solution, is there anything?

Muhammet20
Veteran Member
Veteran Member
Posts: 408
Joined: 5 years ago
Contact:

#16

Post by Muhammet20 » 4 years ago

oh im rly sorry i forgot
tommorow i will post it inchallah

Muhammet20
Veteran Member
Veteran Member
Posts: 408
Joined: 5 years ago
Contact:

#17

Post by Muhammet20 » 4 years ago

what the, i forgot again, i was playing PUBG Mobile xd sorry

neverminddw
Member
Member
Posts: 32
Joined: 6 years ago
Contact:

#18

Post by neverminddw » 4 years ago

Set an alarm dude... I still haven't found a solution to it.

Muhammet20
Veteran Member
Veteran Member
Posts: 408
Joined: 5 years ago
Contact:

#19

Post by Muhammet20 » 4 years ago

try to replace now, but make a backup to if not work

GAG Plugin

Code: Select all

#include < amxmodx >
#include < amxmisc >
#include < engine >
#include < sqlx >

#define MAX_PLAYERS 32

#define MAX_PATTERN_LEN 255

enum ( <<= 1 )
{
	GAG_CHAT = 1,
	GAG_TEAMSAY,
	GAG_VOICE
};

enum _:GagData
{
	GAG_AUTHID[ 35 ],
	GAG_TIME,
	GAG_START,
	GAG_FLAGS
};

enum _:TimeUnit
{
	TIMEUNIT_SECONDS = 0,
	TIMEUNIT_MINUTES,
	TIMEUNIT_HOURS,
	TIMEUNIT_DAYS,
	TIMEUNIT_WEEKS
};

new const g_szTimeUnitName[ TimeUnit ][ 2 ][ ] =
{
	{ "second", "seconds" },
	{ "minute", "minutes" },
	{ "hour",   "hours"   },
	{ "day",    "days"    },
	{ "week",   "weeks"   }
};

new const g_iTimeUnitMult[ TimeUnit ] =
{
	1,
	60,
	3600,
	86400,
	604800
};

new const DATETIME_FORMAT[ ] = "%Y-%m-%d %H:%M:%S";
const DATE_SIZE = 20;

new Array:g_aGagTimes;
new Array:g_aGagData;
new Trie:g_tArrayPos;
new Trie:g_tTimeUnitWords;

new g_iGagged;
new g_iThinker;
new g_iTotalGagTimes;
new g_iMsgSayText;

new g_szAuthid[ MAX_PLAYERS + 1 ][ 35 ];
new g_iMenuOption[ MAX_PLAYERS + 1 ];
new g_iMenuPosition[ MAX_PLAYERS + 1 ];
new g_iMenuPlayers[ MAX_PLAYERS + 1 ][ 32 ];
new g_iMenuFlags[ MAX_PLAYERS + 1 ];

new g_szGagFile[ 64 ];

new bool:g_bColorSupported;

new g_pCvarDefaultFlags;
new g_pCvarDefaultTime;
new g_pCvarTimeUnit;
new g_pCvarMaxTime;
new g_pCvarSQL;
new g_pCvarSQLHost;
new g_pCvarSQLUser;
new g_pCvarSQLPass;
new g_pCvarSQLDb;

new bool:g_bUsingSQL = false;
new Handle:g_hSqlTuple;

new gag_prefix_fix[33]
public plugin_init( )
{
	register_plugin( "AMXX Gag", "1.4.9", "xPaw & Exolent" );
	
	register_clcmd( "say",        "CmdSay" );
	register_clcmd( "say_team",   "CmdTeamSay" );
	
	register_concmd( "amx_gag",       "CmdGagPlayer",   ADMIN_KICK, "<nick or #userid> <time> <a|b|c> -- Use 0 time for permanent" );
	register_concmd( "amx_addgag",    "CmdAddGag",      ADMIN_KICK, "<authid> <time> <a|b|c> -- Use 0 time for permanent" );
	register_concmd( "amx_ungag",     "CmdUnGagPlayer", ADMIN_KICK, "<nick or #userid>" );
	register_concmd( "amx_gagmenu",   "CmdGagMenu",     ADMIN_KICK, "- displays gag menu" );
	register_srvcmd( "amx_gag_times", "CmdSetBanTimes" );
	
	register_menu( "Gag Menu", 1023, "ActionGagMenu" );
	register_menu( "Gag Flags", 1023, "ActionGagFlags" );
	register_message( get_user_msgid( "SayText" ), "MessageSayText" );
	
	g_pCvarDefaultFlags = register_cvar( "amx_gag_default_flags", "abc"   );
	g_pCvarDefaultTime  = register_cvar( "amx_gag_default_time",  "600"   );
	g_pCvarTimeUnit     = register_cvar( "amx_gag_time_units",    "0"     );
	g_pCvarMaxTime      = register_cvar( "amx_gag_max_time",      "86400" );
	g_pCvarSQL          = register_cvar( "amx_gag_sql",           "0"     );
	g_pCvarSQLHost      = register_cvar( "amx_gag_sql_host",      ""      );
	g_pCvarSQLUser      = register_cvar( "amx_gag_sql_user",      ""      );
	g_pCvarSQLPass      = register_cvar( "amx_gag_sql_pass",      ""      );
	g_pCvarSQLDb        = register_cvar( "amx_gag_sql_db",        ""      );
	
	g_tArrayPos       = TrieCreate( );
	g_aGagTimes       = ArrayCreate( );
	g_aGagData        = ArrayCreate( GagData );
	g_bColorSupported = bool:colored_menus( );
	g_iMsgSayText     = get_user_msgid( "SayText" );
	
	// let words work with the time unit cvar
	g_tTimeUnitWords = TrieCreate( );
	
	for( new i = 0; i < TimeUnit; i++ )
	{
		TrieSetCell( g_tTimeUnitWords, g_szTimeUnitName[ i ][ 0 ], i );
		TrieSetCell( g_tTimeUnitWords, g_szTimeUnitName[ i ][ 1 ], i );
	}
	
	// this is used for ungag in the menu
	ArrayPushCell( g_aGagTimes, 0 );
	
	// Gag times for the gag menu (amx_gagmenu)
	// Default values: 60 300 600 1800 3600 7200 86400
	new const iDefaultTimes[ ] = { 60, 300, 600, 1800, 3600, 7200, 86400, 0 };
	
	// Load up standart times
	for( new i = 0; i < sizeof( iDefaultTimes ); i++ )
	{
		ArrayPushCell( g_aGagTimes, iDefaultTimes[ i ] );
	}
	
	g_iTotalGagTimes = sizeof( iDefaultTimes ) + 1;
	
	// Set up entity-thinker
	new const szClassName[ ] = "gag_thinker";
	
	g_iThinker = create_entity( "info_target" );
	entity_set_string( g_iThinker, EV_SZ_classname, szClassName );
	
	register_think( szClassName, "FwdThink" );
	
	// load gags from file
	get_datadir( g_szGagFile, charsmax( g_szGagFile ) );
	add( g_szGagFile, charsmax( g_szGagFile ), "/gags.txt" );
	
	// set server's SteamID to "SERVER"
	copy( g_szAuthid[ 0 ], charsmax( g_szAuthid[ ] ), "SERVER" );
}
public plugin_natives()
{
	register_native("ze_is_user_gagged","is_user_gagged",1)
}
public is_user_gagged(id)
{
	return gag_prefix_fix[id]
}
public plugin_cfg( )
{
	// check SQL
	InitSQL( );
	
	if( !g_bUsingSQL )
	{
		// if no SQL, load file
		LoadFromFile( );
	}
}

InitSQL( )
{
	// init SQL after configs were executed
	if( get_pcvar_num( g_pCvarSQL ) )
	{
		new szHost[ 64 ], szUser[ 64 ], szPass[ 64 ], szDb[ 64 ];
		get_pcvar_string( g_pCvarSQLHost, szHost, charsmax( szHost ) );
		get_pcvar_string( g_pCvarSQLUser, szUser, charsmax( szUser ) );
		get_pcvar_string( g_pCvarSQLPass, szPass, charsmax( szPass ) );
		get_pcvar_string( g_pCvarSQLDb,   szDb,   charsmax( szDb   ) );
		
		g_hSqlTuple = SQL_MakeDbTuple( szHost, szUser, szPass, szDb );
		
		if( g_hSqlTuple == Empty_Handle ) return;
		
		// TABLE STRUCTURE
		// admin_name VARCHAR(32) NOT NULL
		// admin_steamid VARCHAR(35) NOT NULL
		// admin_ip VARCHAR(15) NOT NULL
		// player_name VARCHAR(32) NOT NULL
		// player_steamid VARCHAR(35) NOT NULL PRIMARY KEY
		// player_ip VARCHAR(15) NOT NULL
		// date_gagged DATETIME NOT NULL
		// date_ungag DATETIME NOT NULL
		// gag_seconds INT NOT NULL
		// gag_flags VARCHAR(3) NOT NULL
		
		new iError, szError[ 128 ];
		new Handle:hDb = SQL_Connect( g_hSqlTuple, iError, szError, charsmax( szError ) );
		
		if( hDb == Empty_Handle )
		{
			log_amx( "Failed to connect to database: (%d) %s", iError, szError );
			return;
		}
		
		new Handle:hQuery = SQL_PrepareQuery( hDb, "CREATE TABLE IF NOT EXISTS gagged_players (\
			admin_name VARCHAR(32) NOT NULL,\
			admin_steamid VARCHAR(35) NOT NULL,\
			admin_ip VARCHAR(15) NOT NULL,\
			player_name VARCHAR(32) NOT NULL,\
			player_steamid VARCHAR(35) NOT NULL PRIMARY KEY,\
			player_ip VARCHAR(15) NOT NULL,\
			date_gagged DATETIME NOT NULL,\
			date_ungag DATETIME NOT NULL,\
			gag_seconds INT NOT NULL,\
			gag_flags VARCHAR(3) NOT NULL);" );
		
		if( !SQL_Execute( hQuery ) )
		{
			SQL_QueryError( hQuery, szError, charsmax( szError ) );
			log_amx( "Failed create table query: %s", szError );
		}
		else
		{
			SQL_FreeHandle( hQuery );
			
			new szDate[ DATE_SIZE ];
			get_time( DATETIME_FORMAT, szDate, charsmax( szDate ) );
			
			// load all users
			hQuery = SQL_PrepareQuery( hDb, "SELECT * FROM gagged_players WHERE date_ungag > '%s';", szDate );
			
			if( !SQL_Execute( hQuery ) )
			{
				SQL_QueryError( hQuery, szError, charsmax( szError ) );
				log_amx( "Failed load gags query: %s", szError );
			}
			else
			{
				g_bUsingSQL = true;
				
				if( SQL_NumResults( hQuery ) )
				{
					new data[ GagData ];
					new szFlags[ 4 ];
					
					new iFieldSteamID = SQL_FieldNameToNum( hQuery, "player_steamid" );
					new iFieldDateGagged = SQL_FieldNameToNum( hQuery, "date_gagged" );
					new iFieldGagTime = SQL_FieldNameToNum( hQuery, "gag_seconds" );
					new iFieldGagFlags = SQL_FieldNameToNum( hQuery, "gag_flags" );
					
					while( SQL_MoreResults( hQuery ) )
					{
						SQL_ReadResult( hQuery, iFieldSteamID, data[ GAG_AUTHID ], charsmax( data[ GAG_AUTHID ] ) );
						SQL_ReadResult( hQuery, iFieldDateGagged, szDate, charsmax( szDate ) );
						data[ GAG_TIME ] = SQL_ReadResult( hQuery, iFieldGagTime );
						SQL_ReadResult( hQuery, iFieldGagFlags, szFlags, charsmax( szFlags ) );
						
						data[ GAG_START ] = strtotime( szDate );
						data[ GAG_FLAGS ] = read_flags( szFlags );
						
						ArrayPushArray( g_aGagData, data );
						TrieSetCell( g_tArrayPos, data[ GAG_AUTHID ], g_iGagged );
						g_iGagged++;
						
						SQL_NextRow( hQuery );
					}
				}
			}
		}
		
		SQL_FreeHandle( hQuery );
		SQL_FreeHandle( hDb );
	}
}

public plugin_end( )
{
	TrieDestroy( g_tArrayPos );
	ArrayDestroy( g_aGagData );
	ArrayDestroy( g_aGagTimes );
	TrieDestroy( g_tTimeUnitWords );
}

public CmdSetBanTimes( )
{
	new iArgs = read_argc( );
	
	if( iArgs <= 1 )
	{
		server_print( "Usage: amx_gag_times <time1> [time2] [time3] ..." );
		return PLUGIN_HANDLED;
	}
	
	ArrayClear( g_aGagTimes );
	
	// this is used for ungag in the menu
	ArrayPushCell( g_aGagTimes, 0 );
	g_iTotalGagTimes = 1;
	
	// get max time allowed
	new iTimeLimit = get_pcvar_num( g_pCvarMaxTime );
	
	new szBuffer[ 32 ], iTime;
	for( new i = 1; i < iArgs; i++ )
	{
		read_argv( i, szBuffer, 31 );
		
		if( !is_str_num( szBuffer ) )
		{
			server_print( "[AMXX GAG] Time must be an integer!" );
			continue;
		}
		
		iTime = str_to_num( szBuffer );
		
		if( iTime < 0 )
		{
			server_print( "[AMXX GAG] Time must be a positive integer!" );
			continue;
		}
		
		if( 0 < iTimeLimit < iTime )
		{
			server_print( "[AMXX GAG] Time more then %d is not allowed!", iTimeLimit );
			continue;
		}
		
		ArrayPushCell( g_aGagTimes, iTime );
		g_iTotalGagTimes++;
	}
	
	return PLUGIN_HANDLED;
}

public client_putinserver( id )
{
	if( CheckGagFlag( id, GAG_VOICE ) )
	{
		set_speak( id, SPEAK_MUTED );
	}
	
	// default flags to "abc"
	g_iMenuFlags[ id ] = GAG_CHAT | GAG_TEAMSAY | GAG_VOICE;
}

public client_authorized( id )
	get_user_authid( id, g_szAuthid[ id ], 34 );

public client_disconnect( id )
{
	if( TrieKeyExists( g_tArrayPos, g_szAuthid[ id ] ) )
	{
		new szName[ 32 ];
		get_user_name( id, szName, 31 );
		
		new iPlayers[ 32 ], iNum, iPlayer;
		get_players( iPlayers, iNum, "ch" );
		
		for( new i; i < iNum; i++ )
		{
			iPlayer = iPlayers[ i ];
			
			if( get_user_flags( iPlayer ) & ADMIN_KICK )
			{
				if( g_bColorSupported )
				{
					GreenPrint( iPlayer, id, "^4[AMXX GAG]^1 Gagged player ^"^3%s^1<^4%s^1>^" has disconnected!", szName, g_szAuthid[ id ] );
				}
				else
				{
					client_print( iPlayer, print_chat, "[AMXX GAG] Gagged player ^"%s<%s>^" has disconnected!", szName, g_szAuthid[ id ] );
				}
			}
		}
	}
	
	g_szAuthid[ id ][ 0 ] = '^0';
}

public client_infochanged( id )
{
	if( !CheckGagFlag( id, ( GAG_CHAT | GAG_TEAMSAY ) ) )
	{
		return;
	}
	
	static const name[ ] = "name";
	
	static szNewName[ 32 ], szOldName[ 32 ];
	get_user_info( id, name, szNewName, 31 );
	get_user_name( id, szOldName, 31 );
	
	if( !equal( szNewName, szOldName ) )
	{
		if( g_bColorSupported )
		{
			GreenPrint( id, id, "^4[AMXX GAG]^1 Gagged players cannot change their names!" );
		}
		else
		{
			client_print( id, print_chat, "[AMXX GAG] Gagged players cannot change their names!" );
		}
		
		set_user_info( id, name, szOldName );
	}
}

public MessageSayText( )
{
	static const Cstrike_Name_Change[ ] = "#Cstrike_Name_Change";
	
	new szMessage[ sizeof( Cstrike_Name_Change ) + 1 ];
	get_msg_arg_string( 2, szMessage, charsmax( szMessage ) );
	
	if( equal( szMessage, Cstrike_Name_Change ) )
	{
		new szName[ 32 ], id;
		for( new i = 3; i <= 4; i++ )
		{
			get_msg_arg_string( i, szName, 31 );
			
			id = get_user_index( szName );
			
			if( is_user_connected( id ) )
			{
				if( CheckGagFlag( id, ( GAG_CHAT | GAG_TEAMSAY ) ) )
				{
					return PLUGIN_HANDLED;
				}
				
				break;
			}
		}
	}
	
	return PLUGIN_CONTINUE;
}

public FwdThink( const iEntity )
{
	if( !g_iGagged )
		return;
	
	new iSystime = get_systime( );
	new bool:bRemovedGags = false;
	
	new bool:bUsingSQL = g_bUsingSQL;
	new Array:aRemoveSteamIDs, iNumRemoveSteamIDs;
	
	if( bUsingSQL )
	{
		aRemoveSteamIDs = ArrayCreate( 35 );
		g_bUsingSQL = false;
	}
	
	new data[ GagData ], id, szName[ 32 ];
	for( new i = 0; i < g_iGagged; i++ )
	{
		ArrayGetArray( g_aGagData, i, data );
		
		if( data[ GAG_TIME ] > 0 && ( data[ GAG_START ] + data[ GAG_TIME ] ) <= iSystime )
		{
			id = find_player( "c", data[ GAG_AUTHID ] );
			
			if( is_user_connected( id ) )
			{
				get_user_name( id, szName, 31 );
				
				if( g_bColorSupported )
				{
					GreenPrint( 0, id, "^4[AMXX GAG]^1 Player ^"^3%s^1^" is no longer gagged", szName );
				}
				else
				{
					client_print( 0, print_chat, "[AMXX GAG] Player ^"%s^" is no longer gagged", szName );
				}
			}
			else
			{
				if( g_bColorSupported )
				{
					GreenPrint( 0, 0, "^4[AMXX GAG]^1 SteamID ^"^3%s^1^" is no longer gagged", data[ GAG_AUTHID ] );
				}
				else
				{
					client_print( 0, print_chat, "[AMXX GAG] SteamID ^"%s^" is no longer gagged", data[ GAG_AUTHID ] );
				}
			}
			
			DeleteGag( i-- );
			
			bRemovedGags = true;
			
			if( bUsingSQL )
			{
				ArrayPushString( aRemoveSteamIDs, data[ GAG_AUTHID ] );
				iNumRemoveSteamIDs++;
			}
		}
	}
	
	if( !bUsingSQL )
	{
		if( bRemovedGags )
		{
			SaveToFile( );
		}
	}
	else
	{
		if( iNumRemoveSteamIDs )
		{
			static szQuery[ 1024 ];
			new iLen = copy( szQuery, charsmax( szQuery ), "DELETE FROM gagged_players WHERE " );
			
			for( new i = 0; i < iNumRemoveSteamIDs; i++ )
			{
				ArrayGetString( aRemoveSteamIDs, i, data[ GAG_AUTHID ], charsmax( data[ GAG_AUTHID ] ) );
				
				iLen += formatex( szQuery[ iLen ], charsmax( szQuery ) - iLen, "%splayer_steamid = ^"%s^"", i ? " OR " : "", data[ GAG_AUTHID ] );
			}
			
			szQuery[ iLen++ ] = ';';
			szQuery[ iLen ] = 0;
			
			SQL_ThreadQuery( g_hSqlTuple, "QueryDeleteMultiple", szQuery );
		}
		
		ArrayDestroy( aRemoveSteamIDs );
		
		g_bUsingSQL = true;
	}
	
	if( !g_iGagged )
		return;
	
	new iNextTime = 999999;
	for( new i = 0; i < g_iGagged; i++ )
	{
		ArrayGetArray( g_aGagData, i, data );
		
		if( data[ GAG_TIME ] > 0 )
			iNextTime = min( iNextTime, data[ GAG_START ] + data[ GAG_TIME ] - iSystime );
	}
	
	if( iNextTime < 999999 )
		entity_set_float( iEntity, EV_FL_nextthink, get_gametime( ) + iNextTime );
}

public QueryDeleteMultiple( iFailState, Handle:hQuery, szError[ ], iError, iData[ ], iDataSize, Float:flQueueTime )
{
	switch( iFailState )
	{
		case TQUERY_CONNECT_FAILED: log_amx( "Failed to connect to database: (%d) %s", iError, szError );
		case TQUERY_QUERY_FAILED:   log_amx( "Failed delete multiple query: (%d) %s", iError, szError );
	}
}

public CmdSay( const id )
	return CheckSay( id, 0 );

public CmdTeamSay( const id )
	return CheckSay( id, 1 );

CheckSay( const id, const bTeam )
{
	new iArrayPos;
	if( TrieGetCell( g_tArrayPos, g_szAuthid[ id ], iArrayPos ) )
	{
		new data[ GagData ];
		ArrayGetArray( g_aGagData, iArrayPos, data );
		
		new const iFlags[ ] = { GAG_CHAT, GAG_TEAMSAY };
		
		if( data[ GAG_FLAGS ] & iFlags[ bTeam ] )
		{
			if( data[ GAG_TIME ] > 0 )
			{
				new szInfo[ 128 ], iTime = data[ GAG_START ] + data[ GAG_TIME ] - get_systime( );
				
				GetTimeLength( iTime, szInfo, charsmax( szInfo ) );
				
				if( g_bColorSupported )
				{
					GreenPrint( id, id, "^4[AMXX GAG]^3 %s^1 left before your ungag!", szInfo );
				}
				else
				{
					client_print( id, print_chat, "[AMXX GAG] %s left before your ungag!", szInfo );
				}
			}
			else
			{
				if( g_bColorSupported )
				{
					GreenPrint( id, id, "^4[AMXX GAG]^3 You are gagged permanently!" );
				}
				else
				{
					client_print( id, print_chat, "[AMXX GAG] You are gagged permanently!" );
				}
			}
			
			client_print( id, print_center, "** You are gagged from%s chat! **", bTeam ? " team" : "" );
			
			return PLUGIN_HANDLED;
		}
	}
	
	return PLUGIN_CONTINUE;
}

public CmdGagPlayer( const id, const iLevel, const iCid )
{
	if( !cmd_access( id, iLevel, iCid, 2 ) )
	{
		console_print( id, "Flags: a - Chat | b - Team Chat | c - Voice communications" );
		return PLUGIN_HANDLED;
	}
	
	new szArg[ 32 ];
	read_argv( 1, szArg, 31 );
	
	new iPlayer = cmd_target( id, szArg, CMDTARGET_OBEY_IMMUNITY | CMDTARGET_NO_BOTS );
	
	if( !iPlayer )
	{
		return PLUGIN_HANDLED;
	}
	
	new szName[ 20 ];
	get_user_name( iPlayer, szName, 19 );
	
	if( TrieKeyExists( g_tArrayPos, g_szAuthid[ iPlayer ] ) )
	{
		console_print( id, "User ^"%s^" is already gagged!", szName );
		return PLUGIN_HANDLED;
	}
	
	new iFlags;
	new iGagTime;
	
	read_argv( 2, szArg, 31 );
	
	if( szArg[ 0 ] ) // No time entered
	{
		if( is_str_num( szArg ) ) // Seconds entered
		{
			iGagTime = abs( str_to_num( szArg ) );
		}
		else
		{
			console_print( id, "The value must be in seconds!" );
			return PLUGIN_HANDLED;
		}
		
		read_argv( 3, szArg, 31 );
		
		if( szArg[ 0 ] )
		{
			iFlags = read_flags( szArg );
		}
	}
	
	GagPlayer( id, iPlayer, iGagTime, iFlags );
	
	return PLUGIN_HANDLED;
}

GagPlayer( id, iPlayer, iGagTime, iFlags )
{
	new iTimeUnit = GetTimeUnit( );
	new iMaxTime = get_pcvar_num( g_pCvarMaxTime );
	iGagTime = clamp( iGagTime, 1, iMaxTime ) * g_iTimeUnitMult[ iTimeUnit ];
	
	if( !iFlags )
	{
		new szFlags[ 27 ];
		get_pcvar_string( g_pCvarDefaultFlags, szFlags, charsmax( szFlags ) );
		
		iFlags = read_flags( szFlags );
	}
	
	new data[ GagData ];
	data[ GAG_START ] = get_systime( );
	data[ GAG_TIME ]  = iGagTime;
	data[ GAG_FLAGS ] = iFlags;
	copy( data[ GAG_AUTHID ], 34, g_szAuthid[ iPlayer ] );
	
	TrieSetCell( g_tArrayPos, g_szAuthid[ iPlayer ], g_iGagged );
	ArrayPushArray( g_aGagData, data );
	
	new szFrom[ 64 ];
	
	if( iFlags & GAG_CHAT )
	{
		copy( szFrom, 63, "say" );
	}
	
	if( iFlags & GAG_TEAMSAY )
	{
		if( !szFrom[ 0 ] )
			copy( szFrom, 63, "say_team" );
		else
			add( szFrom, 63, " / say_team" );
	}
	
	if( iFlags & GAG_VOICE )
	{
		set_speak( iPlayer, SPEAK_MUTED );
		gag_prefix_fix[iPlayer] = true
		
		if( !szFrom[ 0 ] )
			copy( szFrom, 63, "voicecomm" );
		else
			add( szFrom, 63, " / voicecomm" );
	}
	
	g_iGagged++;
	
	if( iGagTime > 0 )
	{
		new Float:flGametime = get_gametime( ), Float:flNextThink;
		flNextThink = entity_get_float( g_iThinker, EV_FL_nextthink );
		
		if( !flNextThink || flNextThink > ( flGametime + iGagTime ) )
			entity_set_float( g_iThinker, EV_FL_nextthink, flGametime + iGagTime );
	}
	
	if( g_bUsingSQL )
	{
		AddGag( id, iPlayer, iGagTime, iFlags );
	}
	else
	{
		SaveToFile( );
	}
	
	new szName[ 20 ];
	get_user_name( iPlayer, szName, 19 );
	
	new szInfo[ 32 ], szAdmin[ 20 ];
	get_user_name( id, szAdmin, 19 );
	
	if( iGagTime > 0 )
	{
		new iLen = copy( szInfo, 31, "for " );
		GetTimeLength( iGagTime, szInfo[ iLen ], charsmax( szInfo ) - iLen );
	}
	else
	{
		copy( szInfo, 31, "permanently" );
	}
	
	show_activity( id, szAdmin, "Has gagged %s from speaking %s! (%s)", szName, szInfo, szFrom );
	
	console_print( id, "You have gagged ^"%s^" (%s) !", szName, szFrom );
	
	log_amx( "Gag: ^"%s<%s>^" has gagged ^"%s<%s>^" %s. (%s)", szAdmin, g_szAuthid[ id ], szName, g_szAuthid[ iPlayer ], szInfo, szFrom );
}

public CmdAddGag( const id, const iLevel, const iCid )
{
	if( !cmd_access( id, iLevel, iCid, 2 ) )
	{
		console_print( id, "Flags: a - Chat | b - Team Chat | c - Voice communications" );
		return PLUGIN_HANDLED;
	}
	
	new szArg[ 32 ];
	read_argv( 1, szArg, 31 );
	
	if( !IsValidSteamID( szArg ) )
	{
		console_print( id, "Invalid SteamID provided (%s). Must be in ^"STEAM_0:X:XXXXX^" format (remember to use quotes!)", szArg );
		return PLUGIN_HANDLED;
	}
	
	new iPlayer = find_player( "c", szArg );
	
	if( is_user_connected( iPlayer ) )
	{
		new szTime[ 12 ], szFlags[ 4 ];
		read_argv( 2, szTime,  charsmax( szTime  ) );
		read_argv( 3, szFlags, charsmax( szFlags ) );
		
		client_cmd( id, "amx_gag #%d ^"%s^" ^"%s^"", get_user_userid( iPlayer ), szTime, szFlags );
		return PLUGIN_HANDLED;
	}
	
	if( TrieKeyExists( g_tArrayPos, szArg ) )
	{
		console_print( id, "This user is already gagged!" );
		return PLUGIN_HANDLED;
	}
	
	if( GetAccessBySteamID( szArg ) & ADMIN_IMMUNITY )
	{
		console_print( id, "This user has immunity!" );
		return PLUGIN_HANDLED;
	}
	
	new data[ GagData ];
	copy( data[ GAG_AUTHID ], 34, szArg );
	
	get_pcvar_string( g_pCvarDefaultFlags, szArg, charsmax( szArg ) );
	new iFlags = read_flags( szArg );
	
	new iTimeUnit = GetTimeUnit( );
	new iMaxTime = get_pcvar_num( g_pCvarMaxTime );
	new iGagTime = clamp( get_pcvar_num( g_pCvarDefaultTime ), 1, iMaxTime );
	
	read_argv( 2, szArg, 31 );
	
	if( szArg[ 0 ] ) // No time entered
	{
		if( is_str_num( szArg ) ) // Seconds entered
		{
			iGagTime = min( abs( str_to_num( szArg ) ), iMaxTime );
		}
		else
		{
			console_print( id, "The value must be in seconds!" );
			return PLUGIN_HANDLED;
		}
		
		read_argv( 3, szArg, 31 );
		
		if( szArg[ 0 ] )
		{
			iFlags = read_flags( szArg );
		}
	}
	
	// convert to seconds
	iGagTime *= g_iTimeUnitMult[ iTimeUnit ];
	
	data[ GAG_START ] = get_systime( );
	data[ GAG_TIME ]  = iGagTime;
	data[ GAG_FLAGS ] = iFlags;
	
	TrieSetCell( g_tArrayPos, data[ GAG_AUTHID ], g_iGagged );
	ArrayPushArray( g_aGagData, data );
	
	new szFrom[ 64 ];
	
	if( iFlags & GAG_CHAT )
	{
		copy( szFrom, 63, "say" );
	}
	
	if( iFlags & GAG_TEAMSAY )
	{
		if( !szFrom[ 0 ] )
			copy( szFrom, 63, "say_team" );
		else
			add( szFrom, 63, " / say_team" );
	}
	
	if( iFlags & GAG_VOICE )
	{
		if( !szFrom[ 0 ] )
			copy( szFrom, 63, "voicecomm" );
		else
			add( szFrom, 63, " / voicecomm" );
	}
	
	g_iGagged++;
	
	if( iGagTime > 0 )
	{
		new Float:flGametime = get_gametime( ), Float:flNextThink;
		flNextThink = entity_get_float( g_iThinker, EV_FL_nextthink );
		
		if( !flNextThink || flNextThink > ( flGametime + iGagTime ) )
			entity_set_float( g_iThinker, EV_FL_nextthink, flGametime + iGagTime );
	}
	
	if( g_bUsingSQL )
	{
		AddGag( id, iPlayer, iGagTime, iFlags );
	}
	else
	{
		SaveToFile( );
	}
	
	new szInfo[ 32 ], szAdmin[ 20 ];
	get_user_name( id, szAdmin, 19 );
	
	if( iGagTime > 0 )
	{
		new iLen = copy( szInfo, 31, "for " );
		GetTimeLength( iGagTime, szInfo[ iLen ], charsmax( szInfo ) - iLen );
	}
	else
	{
		copy( szInfo, 31, "permanently" );
	}
	
	show_activity( id, szAdmin, "Has gagged a non-connected player <%s> from speaking %s! (%s)", data[ GAG_AUTHID ], szInfo, szFrom );
	
	console_print( id, "You have gagged ^"%s^" (%s) !", data[ GAG_AUTHID ], szFrom );
	
	log_amx( "Gag: ^"%s<%s>^" has gagged a non-connected player ^"<%s>^" %s. (%s)", szAdmin, g_szAuthid[ id ], data[ GAG_AUTHID ], szInfo, szFrom );
	
	return PLUGIN_HANDLED;
}

public CmdUnGagPlayer( const id, const iLevel, const iCid )
{
	if( !cmd_access( id, iLevel, iCid, 2 ) )
		return PLUGIN_HANDLED;
	
	new szArg[ 32 ];
	read_argv( 1, szArg, 31 );
	
	if( szArg[ 0 ] == '@' && equali( szArg[ 1 ], "all" ) )
	{
		if( !g_iGagged )
		{
			console_print( id, "No gagged players!" );
			return PLUGIN_HANDLED;
		}
		
		DeleteAllGags( );
		
		if( entity_get_float( g_iThinker, EV_FL_nextthink ) > 0.0 )
			entity_set_float( g_iThinker, EV_FL_nextthink, 0.0 );
		
		console_print( id, "You have ungagged all players!" );
		
		new szAdmin[ 32 ];
		get_user_name( id, szAdmin, 31 );
		
		show_activity( id, szAdmin, "Has ungagged all players." );
		
		log_amx( "UnGag: ^"%s<%s>^" has ungagged all players.", szAdmin, g_szAuthid[ id ] );
		
		return PLUGIN_HANDLED;
	}
	
	new iPlayer = cmd_target( id, szArg, CMDTARGET_NO_BOTS );
	new iArrayPos, szName[ 32 ];
	
	if( !iPlayer )
	{
		// Maybe it's a steamid
		
		if( !IsValidSteamID( szArg ) )
		{
			return PLUGIN_HANDLED;
		}
		
		if( !TrieGetCell( g_tArrayPos, szArg, iArrayPos ) )
		{
			console_print( id, "This steamid is not gagged!" );
			return PLUGIN_HANDLED;
		}
		
		copy( szName, charsmax( szName ), szArg );
	}
	else
	{
		get_user_name( iPlayer, szName, charsmax( szName ) );
		
		if( !TrieGetCell( g_tArrayPos, g_szAuthid[ iPlayer ], iArrayPos ) )
		{
			console_print( id, "User ^"%s^" is not gagged!", szName );
			return PLUGIN_HANDLED;
		}
	}
	
	DeleteGag( iArrayPos );
	
	if( !g_bUsingSQL )
	{
		SaveToFile( );
	}
	
	new szAdmin[ 32 ];
	get_user_name( id, szAdmin, 31 );
	
	show_activity( id, szAdmin, "Has ungagged %s.", szName );
	
	console_print( id, "You have ungagged ^"%s^" !", szName );
	
	log_amx( "UnGag: ^"%s<%s>^" has ungagged ^"%s<%s>^"", szAdmin, g_szAuthid[ id ], szName, g_szAuthid[ iPlayer ] );
	
	return PLUGIN_HANDLED;
}

public CmdGagMenu( const id, const iLevel, const iCid )
{
	if( !cmd_access( id, iLevel, iCid, 1 ) )
	{
		return PLUGIN_HANDLED;
	}
	
	g_iMenuOption[ id ] = 0;
	arrayset( g_iMenuPlayers[ id ], 0, 32 );
	
	DisplayGagMenu( id, g_iMenuPosition[ id ] = 0 );
	
	return PLUGIN_HANDLED;
}

#define PERPAGE 6

public ActionGagMenu( const id, const iKey )
{
	switch( iKey )
	{
		case 6: DisplayGagFlags( id );
		case 7:
		{
			++g_iMenuOption[ id ];
			g_iMenuOption[ id ] %= g_iTotalGagTimes;
			
			DisplayGagMenu( id, g_iMenuPosition[ id ] );
		}
		case 8: DisplayGagMenu( id, ++g_iMenuPosition[ id ] );
		case 9: DisplayGagMenu( id, --g_iMenuPosition[ id ] );
		default:
		{
			new iPlayer = g_iMenuPlayers[ id ][ g_iMenuPosition[ id ] * PERPAGE + iKey ];
			
			if( is_user_connected( iPlayer ) )
			{
				if( !g_iMenuOption[ id ] )
				{
					//client_cmd( id, "amx_ungag #%i", get_user_userid( iPlayer ) );
					
					new iArrayPos;
					
					if( TrieGetCell( g_tArrayPos, g_szAuthid[ iPlayer ], iArrayPos ) )
					{
						DeleteGag( iArrayPos );
						
						if( !g_bUsingSQL )
						{
							SaveToFile( );
						}
						
						new szName[ 32 ];
						get_user_name( iPlayer, szName, 31 );
						
						new szAdmin[ 32 ];
						get_user_name( id, szAdmin, 31 );
						
						show_activity( id, szAdmin, "Has ungagged %s.", szName );
						
						console_print( id, "You have ungagged ^"%s^" !", szName );
						
						log_amx( "UnGag: ^"%s<%s>^" has ungagged ^"%s<%s>^"", szAdmin, g_szAuthid[ id ], szName, g_szAuthid[ iPlayer ] );
					}
				}
				else if( !TrieKeyExists( g_tArrayPos, g_szAuthid[ iPlayer ] ) )
				{
					/*new szFlags[ 4 ];
					get_flags( g_iMenuFlags[ id ], szFlags, 3 );
					
					client_cmd( id, "amx_gag #%i %i %s", get_user_userid( iPlayer ), ArrayGetCell( g_aGagTimes, g_iMenuOption[ id ] ), szFlags );*/
					
					GagPlayer( id, iPlayer, ArrayGetCell( g_aGagTimes, g_iMenuOption[ id ] ), g_iMenuFlags[ id ] );
				}
			}
			
			DisplayGagMenu( id, g_iMenuPosition[ id ] );
		}
	}
}

// I just copied this from AMXX Ban menu, so don't blame me :D
DisplayGagMenu( const id, iPosition )
{
	if( iPosition < 0 )
	{
		arrayset( g_iMenuPlayers[ id ], 0, 32 );
		return;
	}
	
	new iPlayers[ 32 ], iNum, iCount, szMenu[ 512 ], iPlayer, iFlags, szName[ 32 ];
	get_players( iPlayers, iNum, "ch" ); // Ignore bots and hltv
	
	new iStart = iPosition * PERPAGE;
	
	if( iStart >= iNum )
		iStart = iPosition = g_iMenuPosition[ id ] = 0;
	
	new iEnd = iStart + PERPAGE, iKeys = MENU_KEY_0 | MENU_KEY_8;
	new iLen = formatex( szMenu, 511, g_bColorSupported ? "\rGag Menu\R%i/%i^n^n" : "Gag Menu %i/%i^n^n", iPosition + 1, ( ( iNum + PERPAGE - 1 ) / PERPAGE ) );
	
	new bool:bUngag = bool:!g_iMenuOption[ id ];
	
	if( iEnd > iNum ) iEnd = iNum;
	
	for( new i = iStart; i < iEnd; ++i )
	{
		iPlayer = iPlayers[ i ];
		iFlags  = get_user_flags( iPlayer );
		get_user_name( iPlayer, szName, 31 );
		
		if( iPlayer == id || ( iFlags & ADMIN_IMMUNITY ) || bUngag != TrieKeyExists( g_tArrayPos, g_szAuthid[ iPlayer ] ) )
		{
			++iCount;
			
			if( g_bColorSupported )
				iLen += formatex( szMenu[ iLen ], 511 - iLen, "\d%i. %s^n", iCount, szName );
			else
				iLen += formatex( szMenu[ iLen ], 511 - iLen, "#. %s^n", szName );
		}
		else
		{
			iKeys |= ( 1 << iCount );
			++iCount;
			
			iLen += formatex( szMenu[ iLen ], 511 - iLen, g_bColorSupported ? "\r%i.\w %s\y%s\r%s^n" : "%i. %s%s%s^n", iCount, szName, TrieKeyExists( g_tArrayPos, g_szAuthid[ iPlayer ] ) ? " GAGGED" : "", ( ~iFlags & ADMIN_USER ? " *" : "" ) );
		}
	}
	
	g_iMenuPlayers[ id ] = iPlayers;
	
	new szFlags[ 4 ];
	get_flags( g_iMenuFlags[ id ], szFlags, 3 );
	
	iLen += formatex( szMenu[ iLen ], 511 - iLen, g_bColorSupported ? ( bUngag ? "^n\d7. Flags: %s" : "^n\r7.\y Flags:\w %s" ) : ( bUngag ? "^n#. Flags: %s" : "^n7. Flags: %s" ), szFlags );
	
	if( !bUngag )
	{
		iKeys |= MENU_KEY_7;
		
		new iGagTime = ArrayGetCell( g_aGagTimes, g_iMenuOption[ id ] );
		
		if( iGagTime )
		{
			new szTime[ 128 ];
			GetTimeLength( iGagTime * g_iTimeUnitMult[ GetTimeUnit( ) ], szTime, charsmax( szTime ) );
			
			iLen += formatex( szMenu[ iLen ], 511 - iLen, g_bColorSupported ? "^n\r8.\y Time:\w %s^n" : "^n8. Time: %s^n", szTime );
		}
		else
			iLen += copy( szMenu[ iLen ], 511 - iLen, g_bColorSupported ? "^n\r8.\y Time: Permanent^n" : "^n8. Time: Permanent^n" );
	}
	else
		iLen += copy( szMenu[ iLen ], 511 - iLen, g_bColorSupported ? "^n\r8.\w Ungag^n" : "^n8. Ungag^n" );
	
	if( iEnd != iNum )
	{
		formatex( szMenu[ iLen ], 511 - iLen, g_bColorSupported ? "^n\r9.\w More...^n\r0.\w %s" : "^n9. More...^n0. %s", iPosition ? "Back" : "Exit" );
		iKeys |= MENU_KEY_9;
	}
	else
		formatex( szMenu[ iLen ], 511 - iLen, g_bColorSupported ? "^n\r0.\w %s" : "^n0. %s", iPosition ? "Back" : "Exit" );
	
	show_menu( id, iKeys, szMenu, -1, "Gag Menu" );
}

public ActionGagFlags( const id, const iKey )
{
	switch( iKey )
	{
		case 9: DisplayGagMenu( id, g_iMenuPosition[ id ] );
		default:
		{
			g_iMenuFlags[ id ] ^= ( 1 << iKey );
			
			DisplayGagFlags( id );
		}
	}
}

DisplayGagFlags( const id )
{
	new szMenu[ 512 ];
	new iLen = copy( szMenu, 511, g_bColorSupported ? "\rGag Flags^n^n" : "Gag Flags^n^n" );
	
	if( g_bColorSupported )
	{
		iLen += formatex( szMenu[ iLen ], 511 - iLen, "\r1.\w Chat: %s^n", ( g_iMenuFlags[ id ] & GAG_CHAT ) ? "\yYES" : "\rNO" );
		iLen += formatex( szMenu[ iLen ], 511 - iLen, "\r2.\w TeamSay: %s^n", ( g_iMenuFlags[ id ] & GAG_TEAMSAY ) ? "\yYES" : "\rNO" );
		iLen += formatex( szMenu[ iLen ], 511 - iLen, "\r3.\w Voice: %s^n", ( g_iMenuFlags[ id ] & GAG_VOICE ) ? "\yYES" : "\rNO" );
	}
	else
	{
		iLen += formatex( szMenu[ iLen ], 511 - iLen, "1. Chat: %s^n", ( g_iMenuFlags[ id ] & GAG_CHAT ) ? "YES" : "NO" );
		iLen += formatex( szMenu[ iLen ], 511 - iLen, "2. TeamSay: %s^n", ( g_iMenuFlags[ id ] & GAG_TEAMSAY ) ? "YES" : "NO" );
		iLen += formatex( szMenu[ iLen ], 511 - iLen, "3. Voice: %s^n", ( g_iMenuFlags[ id ] & GAG_VOICE ) ? "YES" : "NO" );
	}
	
	copy( szMenu[ iLen ], 511 - iLen, g_bColorSupported ? "^n\r0. \wBack to Gag Menu" : "^n0. Back to Gag Menu" );
	
	show_menu( id, ( MENU_KEY_1 | MENU_KEY_2 | MENU_KEY_3 | MENU_KEY_0 ), szMenu, -1, "Gag Flags" );
}

CheckGagFlag( const id, const iFlag )
{
	new iArrayPos;
	
	if( TrieGetCell( g_tArrayPos, g_szAuthid[ id ], iArrayPos ) )
	{
		new data[ GagData ];
		ArrayGetArray( g_aGagData, iArrayPos, data );
		
		return ( data[ GAG_FLAGS ] & iFlag );
	}
	
	return 0;
}

DeleteAllGags( )
{
	new data[ GagData ];
	new iPlayer;
	
	for( new i = 0; i < g_iGagged; i++ )
	{
		ArrayGetArray( g_aGagData, i, data );
		
		iPlayer = find_player( "c", data[ GAG_AUTHID ] );
		if( is_user_connected( iPlayer ) )
			set_speak( iPlayer, SPEAK_NORMAL );
	}
	
	ArrayClear( g_aGagData );
	TrieClear( g_tArrayPos );
	g_iGagged = 0;
	
	if( g_bUsingSQL )
	{
		SQL_ThreadQuery( g_hSqlTuple, "QueryDeleteAll", "DELETE FROM gagged_players;" );
	}
}

public QueryDeleteAll( iFailState, Handle:hQuery, szError[ ], iError, iData[ ], iDataSize, Float:flQueueTime )
{
	switch( iFailState )
	{
		case TQUERY_CONNECT_FAILED: log_amx( "Failed to connect to database: (%d) %s", iError, szError );
		case TQUERY_QUERY_FAILED:   log_amx( "Failed delete all query: (%d) %s", iError, szError );
	}
}

DeleteGag( const iArrayPos )
{
	new data[ GagData ];
	ArrayGetArray( g_aGagData, iArrayPos, data );
	
	if( data[ GAG_FLAGS ] & GAG_VOICE )
	{
		new iPlayer = find_player( "c", data[ GAG_AUTHID ] );
		if( is_user_connected( iPlayer ) )
			set_speak( iPlayer, SPEAK_NORMAL ); gag_prefix_fix[iPlayer] = false
	}
	
	TrieDeleteKey( g_tArrayPos, data[ GAG_AUTHID ] );
	ArrayDeleteItem( g_aGagData, iArrayPos );
	g_iGagged--;
	
	for( new i = iArrayPos; i < g_iGagged; i++ )
	{
		ArrayGetArray( g_aGagData, i, data );
		TrieSetCell( g_tArrayPos, data[ GAG_AUTHID ], i );
	}
	
	if( g_bUsingSQL )
	{
		new szQuery[ 128 ];
		formatex( szQuery, charsmax( szQuery ), "DELETE FROM gagged_players WHERE player_steamid = '%s';", data[ GAG_AUTHID ] );
		
		SQL_ThreadQuery( g_hSqlTuple, "QueryDelete", szQuery );
	}
}

public QueryDelete( iFailState, Handle:hQuery, szError[ ], iError, iData[ ], iDataSize, Float:flQueueTime )
{
	switch( iFailState )
	{
		case TQUERY_CONNECT_FAILED: log_amx( "Failed to connect to database: (%d) %s", iError, szError );
		case TQUERY_QUERY_FAILED:   log_amx( "Failed delete query: (%d) %s", iError, szError );
	}
}

LoadFromFile( )
{
	new hFile = fopen( g_szGagFile, "rt" );
	
	if( hFile )
	{
		new szData[ 128 ], szTime[ 16 ], szStart[ 16 ], szFlags[ 4 ];
		new data[ GagData ], iSystime = get_systime( ), iTimeLeft, iShortestTime = 999999;
		new bool:bRemovedGags = false;
		
		while( !feof( hFile ) )
		{
			fgets( hFile, szData, charsmax( szData ) );
			trim( szData );
			
			if( !szData[ 0 ] ) continue;
			
			parse( szData,
				data[ GAG_AUTHID ], charsmax( data[ GAG_AUTHID ] ),
				szTime, charsmax( szTime ),
				szStart, charsmax( szStart ),
				szFlags, charsmax( szFlags )
			);
			
			// remove old gags
			if( contain( szStart, "." ) > 0 ) continue;
			
			data[ GAG_TIME ] = str_to_num( szTime );
			data[ GAG_START ] = str_to_num( szStart );
			data[ GAG_FLAGS ] = read_flags( szFlags );
			
			if( data[ GAG_TIME ] > 0 )
			{
				iTimeLeft = data[ GAG_START ] + data[ GAG_TIME ] - iSystime;
				
				if( iTimeLeft <= 0 )
				{
					bRemovedGags = true;
					continue;
				}
				
				if( iShortestTime > iTimeLeft )
				{
					iShortestTime = iTimeLeft;
				}
			}
			
			TrieSetCell( g_tArrayPos, data[ GAG_AUTHID ], g_iGagged );
			ArrayPushArray( g_aGagData, data );
			g_iGagged++;
		}
		
		fclose( hFile );
		
		if( bRemovedGags )
		{
			SaveToFile( );
		}
		
		if( iShortestTime < 999999 )
		{
			entity_set_float( g_iThinker, EV_FL_nextthink, get_gametime( ) + iShortestTime );
		}
	}
}

SaveToFile( )
{
	new hFile = fopen( g_szGagFile, "wt" );
	
	if( hFile )
	{
		new data[ GagData ], szFlags[ 4 ];
		
		for( new i = 0; i < g_iGagged; i++ )
		{
			ArrayGetArray( g_aGagData, i, data );
			
			get_flags( data[ GAG_FLAGS ], szFlags, charsmax( szFlags ) );
			
			fprintf( hFile, "^"%s^" ^"%i^" ^"%i^" ^"%s^"^n", data[ GAG_AUTHID ], data[ GAG_TIME ], data[ GAG_START ], szFlags );
		}
		
		fclose( hFile );
	}
}

GetTimeUnit( )
{
	new szTimeUnit[ 64 ], iTimeUnit;
	get_pcvar_string( g_pCvarTimeUnit, szTimeUnit, charsmax( szTimeUnit ) );
	
	if( is_str_num( szTimeUnit ) )
	{
		iTimeUnit = get_pcvar_num( g_pCvarTimeUnit );
		
		if( !( 0 <= iTimeUnit < TimeUnit ) )
		{
			iTimeUnit = -1;
		}
	}
	else
	{
		strtolower( szTimeUnit );
		
		if( !TrieGetCell( g_tTimeUnitWords, szTimeUnit, iTimeUnit ) )
		{
			iTimeUnit = -1;
		}
	}
	
	if( iTimeUnit == -1 )
	{
		iTimeUnit = TIMEUNIT_SECONDS;
		
		set_pcvar_num( g_pCvarTimeUnit, TIMEUNIT_SECONDS );
	}
	
	return iTimeUnit;
}

GetTimeLength( iTime, szOutput[ ], iOutputLen )
{
	new szTimes[ TimeUnit ][ 32 ];
	new iUnit, iValue, iTotalDisplay;
	
	for( new i = TimeUnit - 1; i >= 0; i-- )
	{
		iUnit = g_iTimeUnitMult[ i ];
		iValue = iTime / iUnit;
		
		if( iValue )
		{
			formatex( szTimes[ i ], charsmax( szTimes[ ] ), "%d %s", iValue, g_szTimeUnitName[ i ][ iValue != 1 ] );
			
			iTime %= iUnit;
			
			iTotalDisplay++;
		}
	}
	
	new iLen, iTotalLeft = iTotalDisplay;
	szOutput[ 0 ] = 0;
	
	for( new i = TimeUnit - 1; i >= 0; i-- )
	{
		if( szTimes[ i ][ 0 ] )
		{
			iLen += formatex( szOutput[ iLen ], iOutputLen - iLen, "%s%s%s",
				( iTotalDisplay > 2 && iLen ) ? ", " : "",
				( iTotalDisplay > 1 && iTotalLeft == 1 ) ? ( ( iTotalDisplay > 2 ) ? "and " : " and " ) : "",
				szTimes[ i ]
			);
			
			iTotalLeft--;
		}
	}
	
	return iLen
}

GreenPrint( id, iSender, const szRawMessage[ ], any:... )
{
	if( !iSender )
	{
		new iPlayers[ 32 ], iNum;
		get_players( iPlayers, iNum, "ch" );
		
		if( !iNum ) return;
		
		iSender = iPlayers[ 0 ];
	}
	
	new szMessage[ 192 ];
	vformat( szMessage, charsmax( szMessage ), szRawMessage, 4 );
	
	message_begin( id ? MSG_ONE_UNRELIABLE : MSG_BROADCAST, g_iMsgSayText, _, id );
	write_byte( iSender );
	write_string( szMessage );
	message_end( );
}

bool:IsValidSteamID( const szSteamID[ ] )
{
	// STEAM_0:(0|1):\d+
	// 012345678    90
	
	// 0-7 = STEAM_0:
	// 8 = 0 or 1
	// 9 = :
	// 10+ = integer
	
	return ( ( '0' <= szSteamID[ 8 ] <= '1' ) && szSteamID[ 9 ] == ':' && equal( szSteamID, "STEAM_0:", 8 ) && is_str_num( szSteamID[ 10 ] ) );
}

GetAccessBySteamID( const szSteamID[ ] )
{
	new szAuthData[ 44 ], iCount = admins_num( );
	
	for( new i; i < iCount; i++ )
	{
		if( admins_lookup( i, AdminProp_Flags ) & FLAG_AUTHID )
		{
			admins_lookup( i, AdminProp_Auth, szAuthData, charsmax( szAuthData ) );
			
			if( equal( szAuthData, szSteamID ) )
			{
				return admins_lookup( i, AdminProp_Access );
			}
		}
	}
	
	return 0;
}

strtotime(const string[])
{
	new szTemp[ 32 ];
	new szYear[ 5 ], szMonth[ 3 ], szDay[ 3 ], szHour[ 3 ], szMinute[ 3 ], szSecond[ 3 ];
	strtok( string, szYear,   charsmax( szYear   ), szTemp,   charsmax( szTemp   ), '-' );
	strtok( szTemp, szMonth,  charsmax( szMonth  ), szTemp,   charsmax( szTemp   ), '-' );
	strtok( szTemp, szDay,    charsmax( szDay    ), szTemp,   charsmax( szTemp   ), ' ' );
	strtok( szTemp, szHour,   charsmax( szHour   ), szTemp,   charsmax( szTemp   ), ':' );
	strtok( szTemp, szMinute, charsmax( szMinute ), szSecond, charsmax( szSecond ), ':' );
	
	return TimeToUnix( str_to_num( szYear ), str_to_num( szMonth ), str_to_num( szDay ), str_to_num( szHour ), str_to_num( szMinute ), str_to_num( szSecond ) );
}

AddGag( admin, player, iGagTime, iFlags )
{
	new szAdminName[ 32 ], szAdminIP[ 16 ];
	
	if( admin )
	{
		get_user_name( admin, szAdminName, charsmax( szAdminName ) );
	}
	else
	{
		copy( szAdminName, charsmax( szAdminName ), "SERVER" );
	}
	
	get_user_ip( admin, szAdminIP, charsmax( szAdminIP ), 1 );
	
	new szPlayerName[ 32 ], szPlayerIP[ 16 ];
	get_user_name( player, szPlayerName, charsmax( szPlayerName ) );
	get_user_ip( player, szPlayerIP, charsmax( szPlayerIP ), 1 );
	
	new szDateNow[ DATE_SIZE ], szDateUngag[ DATE_SIZE ];
	get_time( DATETIME_FORMAT, szDateNow, charsmax( szDateNow ) );
	format_time( szDateUngag, charsmax( szDateUngag ), DATETIME_FORMAT, get_systime( ) + iGagTime );
	
	new szFlags[ 4 ];
	get_flags( iFlags, szFlags, charsmax( szFlags ) );
	
	new szQuery[ 256 ];
	formatex( szQuery, charsmax( szQuery ), "REPLACE INTO gagged_players \
		(admin_name, admin_steamid, admin_ip, player_name, player_steamid, player_ip, date_gagged, date_ungag, gag_seconds, gag_flags) \
		VALUES \
		(^"%s^", ^"%s^", ^"%s^", ^"%s^", ^"%s^", ^"%s^", ^"%s^", ^"%s^", %d, ^"%s^");",\
		szAdminName,  g_szAuthid[ admin  ], szAdminIP,\
		szPlayerName, g_szAuthid[ player ], szPlayerIP,\
		szDateNow, szDateUngag, iGagTime, szFlags );
	
	SQL_ThreadQuery( g_hSqlTuple, "QueryAdd", szQuery );
}

public QueryAdd( iFailState, Handle:hQuery, szError[ ], iError, iData[ ], iDataSize, Float:flQueueTime )
{
	switch( iFailState )
	{
		case TQUERY_CONNECT_FAILED: log_amx( "Failed to connect to database: (%d) %s", iError, szError );
		case TQUERY_QUERY_FAILED:   log_amx( "Failed add gag query: (%d) %s", iError, szError );
	}
}

// CODE BELOW FROM BUGSY'S UNIX TIME INCLUDE
// 

stock const YearSeconds[2] = 
{ 
	31536000,	//Normal year
	31622400 	//Leap year
};

stock const MonthSeconds[12] = 
{ 
	2678400, //January	31 
	2419200, //February	28
	2678400, //March	31
	2592000, //April	30
	2678400, //May		31
	2592000, //June		30
	2678400, //July		31
	2678400, //August	31
	2592000, //September	30
	2678400, //October	31
	2592000, //November	30
	2678400  //December	31
};

stock const DaySeconds = 86400;
stock const HourSeconds = 3600;
stock const MinuteSeconds = 60;

stock TimeToUnix( const iYear , const iMonth , const iDay , const iHour , const iMinute , const iSecond )
{
	new i;
	new iTimeStamp;

	for ( i = 1970 ; i < iYear ; i++ )
		iTimeStamp += YearSeconds[ IsLeapYear(i) ];

	for ( i = 1 ; i < iMonth ; i++ )
		iTimeStamp += SecondsInMonth( iYear , i );

	iTimeStamp += ( ( iDay - 1 ) * DaySeconds );
	iTimeStamp += ( iHour * HourSeconds );
	iTimeStamp += ( iMinute * MinuteSeconds );
	iTimeStamp += iSecond;

	return iTimeStamp;
}

stock SecondsInMonth( const iYear , const iMonth ) 
{
	return ( ( IsLeapYear( iYear ) && ( iMonth == 2 ) ) ? ( MonthSeconds[iMonth - 1] + DaySeconds ) : MonthSeconds[iMonth - 1] );
}

stock IsLeapYear( const iYear ) 
{
	return ( ( (iYear % 4) == 0) && ( ( (iYear % 100) != 0) || ( (iYear % 400) == 0 ) ) );
}
Prefixes Plugin

Code: Select all

#include <amxmodx>
#include <cstrike>
 
// Prefixes
new const szOwnerPrefix[] = "^1[^4Owner^1]", szHeadPrefix[] = "^1[^4Head Admin^1]", szAdminPrefix[] = "^1[^4Admin^1]"
 
new g_iMaxPlayers, g_iSayText
new g_pCvarLogMessages
 
native ze_is_user_gagged(id)
public plugin_init()
{
    register_plugin("Prefixes", "2.0", "alKapone")
   
    register_clcmd("say", "Hook_Say")
    register_clcmd("say_team", "Hook_SayTeam")
   
    g_pCvarLogMessages = register_cvar("rgc_log_messages", "1")
   
    g_iMaxPlayers = get_maxplayers()
    g_iSayText = get_user_msgid("SayText")
   
    register_message(g_iSayText, "BlockDoubleMessages")
}
 
public BlockDoubleMessages()
{
    return PLUGIN_HANDLED
}
 
public Hook_Say(id)
{
    if (!is_user_connected(id))
        return PLUGIN_CONTINUE
   
    new szName[32], szMessage[200]
    get_user_name(id, szName, charsmax(szName))
    read_args(szMessage, charsmax(szMessage))
    remove_quotes(szMessage)
    trim(szMessage)
   
    for(new iChar = 0; iChar <= charsmax(szMessage); iChar++)
    {
        if (szMessage[iChar] == '^2' || szMessage[iChar] == '^3' || szMessage[iChar] == '^4')
            szMessage[iChar] = '^1'
    }
 
    if (!is_valid_msg(szMessage))
        return PLUGIN_CONTINUE
   
    // Message format
    if (is_user_alive(id) && (get_user_flags(id) & ADMIN_RCON) && (get_user_flags(id) & ADMIN_CVAR) && !ze_is_user_gagged(id)) // Owner alive
        format(szMessage, charsmax(szMessage), "%s ^3%s ^1: ^1%s", szOwnerPrefix, szName, szMessage)
    else if (!is_user_alive(id) && (get_user_flags(id) & ADMIN_RCON) && (get_user_flags(id) & ADMIN_CVAR) && !ze_is_user_gagged(id)) // Owner dead
        format(szMessage, charsmax(szMessage), "^1*DEAD* %s ^3%s ^1: ^1%s", szOwnerPrefix, szName, szMessage)
    else if (is_user_alive(id) && (get_user_flags(id) & ADMIN_CVAR) && (get_user_flags(id) & ADMIN_KICK) && !ze_is_user_gagged(id)) // Head alive
        format(szMessage, charsmax(szMessage), "%s ^3%s ^1: ^1%s", szHeadPrefix, szName, szMessage)
    else if (!is_user_alive(id) && (get_user_flags(id) & ADMIN_CVAR) && (get_user_flags(id) & ADMIN_KICK) && !ze_is_user_gagged(id)) // Head dead
        format(szMessage, charsmax(szMessage), "^1*DEAD* %s ^3%s ^1: ^1%s", szHeadPrefix, szName, szMessage)
    else if (is_user_alive(id) && (get_user_flags(id) & ADMIN_KICK) && !ze_is_user_gagged(id))
        format(szMessage, charsmax(szMessage), "%s ^3%s ^1: ^1%s", szAdminPrefix, szName, szMessage)
    else if (!is_user_alive(id) && (get_user_flags(id) & ADMIN_KICK) && !ze_is_user_gagged(id))
        format(szMessage, charsmax(szMessage), "^1*DEAD* %s ^3%s ^1: ^1%s", szAdminPrefix, szName, szMessage)
    else if (is_user_alive(id) && !ze_is_user_gagged(id)) // Alive
        format(szMessage, charsmax(szMessage), "^3%s ^1: ^1%s", szName, szMessage)
    else if (!is_user_alive(id) && !ze_is_user_gagged(id)) // Dead
        format(szMessage, charsmax(szMessage), "^1*DEAD* ^3%s ^1: ^1%s", szName, szMessage)
 
    // Send the message
    for (new i = 1; i <= g_iMaxPlayers; i++)
    {
        if (!is_user_connected(i))
            continue
 
        Send_Message(szMessage, id, i)
    }
   
    // Log messages
    if (get_pcvar_num(g_pCvarLogMessages))
    {
        new szSteamID[36], szIP[16]
        get_user_authid(id, szSteamID, charsmax(szSteamID))
        get_user_ip(id, szIP, charsmax(szIP), 1)
        Log_Messages("[%s|%s|%s] %s", szName, szSteamID, szIP, szMessage)
    }
   
    return PLUGIN_CONTINUE
}
 
public Hook_SayTeam(id)
{
    if (!is_user_connected(id))
        return PLUGIN_CONTINUE
   
    new szName[32], szMessage[200]
    get_user_name(id, szName, charsmax(szName))
    read_args(szMessage, charsmax(szMessage))
    remove_quotes(szMessage)
    trim(szMessage)
   
    for(new iChar = 0; iChar <= charsmax(szMessage); iChar++)
    {
        if (szMessage[iChar] == '^2' || szMessage[iChar] == '^3' || szMessage[iChar] == '^4')
            szMessage[iChar] = '^1'
    }
 
    if (!is_valid_msg(szMessage))
        return PLUGIN_CONTINUE
 
    // Message format
    if(is_user_alive(id) && get_user_team(id) == 2 && !ze_is_user_gagged(id))
        format(szMessage, charsmax(szMessage), "^1(Counter-Terrorist) ^3%s ^1: ^1%s", szName, szMessage)
    else if (!is_user_alive(id) && get_user_team(id) == 2 && !ze_is_user_gagged(id))
        format(szMessage, charsmax(szMessage), "^1*DEAD* ^1(Counter-Terrorist) ^3%s ^1: ^1%s", szName, szMessage)
    else if (is_user_alive(id) && get_user_team(id) == 1 && !ze_is_user_gagged(id))
        format(szMessage, charsmax(szMessage), "^1(Terrorist) ^3%s ^1: ^1%s", szName, szMessage)
    else if (!is_user_alive(id) && get_user_team(id) == 1 && !ze_is_user_gagged(id))
        format(szMessage, charsmax(szMessage), "^1*DEAD* ^1(Terrorist) ^3%s ^1: ^1%s", szName, szMessage)
 
    // Send the message
    for (new i = 1; i <= g_iMaxPlayers; i++)
    {
        if(!is_user_connected(i) || get_user_team(i) != get_user_team(id))
            continue
 
        Send_Message(szMessage, id, i)
    }
 
    // Log messages
    if (get_pcvar_num(g_pCvarLogMessages))
    {
        new szSteamID[36], szIP[16]
        get_user_authid(id, szSteamID, charsmax(szSteamID))
        get_user_ip(id, szIP, charsmax(szIP), 1)
        Log_Messages("[%s|%s|%s] %s", szName, szSteamID, szIP, szMessage)
    }
   
    return PLUGIN_CONTINUE
}
 
bool:is_valid_msg(const szMessage[])
{
    if (!strlen(szMessage) || szMessage[0] == '/' && szMessage[1] == 'r' && szMessage[2] == 's')
        return false
       
    return true
}
 
stock Log_Messages(const szMessage_Fmt[], any:...)
{
    static szMessage[256], szFileName[32], szDate[16]
    vformat(szMessage, charsmax(szMessage), szMessage_Fmt, 2)
    replace_all(szMessage, charsmax(szMessage), "^4", "")
    replace_all(szMessage, charsmax(szMessage), "^1", "")
    replace_all(szMessage, charsmax(szMessage), "^1", "")
    replace_all(szMessage, charsmax(szMessage), "^3", "")
    format_time(szDate, charsmax(szDate), "%d%m%Y")
    formatex(szFileName, charsmax(szFileName), "RGC_Messages_%s.log", szDate)
    log_to_file(szFileName, "%s", szMessage)
}
 
stock Send_Message(const szMessage[], const id, const iIndex)
{
    message_begin(MSG_ONE, g_iSayText, {0, 0, 0}, iIndex)
    write_byte(id)
    write_string(szMessage)
    message_end()
}
i hope it will work

neverminddw
Member
Member
Posts: 32
Joined: 6 years ago
Contact:

#20

Post by neverminddw » 4 years ago

Aaa how didn't I think about it... You connected the functions with native. Works, fine now. Thank you btw =)
Gg.

Post Reply

Create an account or sign in to join the discussion

You need to be a member in order to post a reply

Create an account

Not a member? register to join our community
Members can start their own topics & subscribe to topics
It’s free and only takes a minute

Register

Sign in

Who is online

Users browsing this forum: No registered users and 7 guests