Offline |
|
|
Csatlakozott:2017.12.04. 09:15 Hozzászólások:116 Megköszönt másnak: 58 alkalommal Megköszönték neki: 2 alkalommal
|
Rangrendszer #include < amxmodx > #include < amxmisc > #include < fakemeta > #include < engine > #include < sqlx > //#define USE_ICHAT #if defined USE_ICHAT #include < ichat > #endif #pragma semicolon 1 #define MinOnlineTime 18000 #define SubPoint 200 #define MaxRang 19 new const g_sPrefix[ ] = "Prefix"; new const g_sTable[ ] = "rang_system_new"; new const g_sSQL_INFOS[ ][ ] = { "Host", // HOST "Username", // USERNAME "Password", // PASSWORD "DB" // DATABASE }; new Handle: g_iSqlTuple; enum _:ePlayerInfos { iOnlineTime, iOnlineTimeW, iKills, iDeaths, iPoints, iFCTime, sPrefix[ 16 ] }; enum _:eRangInfos { sRangName[ 32 ], iRangPoint }; new g_iUserData[ 33 ][ ePlayerInfos ]; new const g_iRangs[ MaxRang ][ eRangInfos ] = { { "Újonc", 0 }, { "Honvéd", 300 }, { "Õrvezetõ", 500 }, { "Tizedes", 700 }, { "Szakaszvezetõ", 900 }, { "Õrmester", 1100 }, { "Törzsõrmester", 1400 }, { "Fõtörzsõrmester", 1700 }, { "Hadnagy", 2100 }, { "Fõhadnagy", 2600 }, { "Százados", 3300 }, { "Õrnagy", 4000 }, { "Alezredes", 4600 }, { "Ezredes", 5300 }, { "Dandártábornok", 6500 }, { "Vezérnagy", 8000 }, { "Altábornok", 10000 }, { "Vezérezredes", 12000 }, { "Egyedi prefix", 15000 } }; new g_iRoundKills[ 33 ], g_iRang[ 33 ], g_sAuthID[ 33 ][ 32 ], g_sUsername[ 33 ][ 32 ], bool: g_bHud[ 33 ]; public plugin_init( ) { register_plugin( "Rang Rendszer", "1.0", "Demon" ); register_cvar( "Rang Rendsze", "By Demon", FCVAR_SERVER ); register_dictionary( "RangSystem.txt" ); g_iSqlTuple = SQL_MakeDbTuple( g_sSQL_INFOS[ 0 ], g_sSQL_INFOS[ 1 ], g_sSQL_INFOS[ 2 ], g_sSQL_INFOS[ 3 ] ); new sThread[ 512 ]; formatex( sThread, charsmax( sThread ), "CREATE TABLE IF NOT EXISTS `%s` (`authid` varchar(32) NOT NULL,`online_time` INT(11) NOT NULL,`online_timew` INT(11) NOT NULL,`kills` INT(11) NOT NULL,`deaths` INT(11) NOT NULL,`points` INT(11) NOT NULL,`first_con_time` INT(15) NOT NULL,`prefix` varchar(16) NOT NULL,`id` INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY);", g_sTable ); SQL_ThreadQuery( g_iSqlTuple, "ThreadHandler", sThread, { 0 }, 1 ); Load( ); register_event( "SendAudio", "evCTWin", "a", "2&%!MRAD_ctwin" ); register_event( "SendAudio", "evTEWin", "a", "2&%!MRAD_terwin" ); register_event( "DeathMsg", "evDeath", "a" ); register_clcmd( "say /hud", "cmdHud" ); register_clcmd( "say /rang", "cmdRang" ); register_clcmd( "say /myrank", "cmdRang" ); register_clcmd( "say /rangok", "cmdRangs" ); register_clcmd( "say /ranks", "cmdRangs" ); register_clcmd( "say /prefix", "cmdPrefix" ); register_clcmd( "reset_prefix", "cmdResetPrefix", ADMIN_RCON, "<jatekos> - Reset prefix." ); register_concmd( "PREFIX", "GetPrefix" ); register_forward( FM_ClientUserInfoChanged, "fwClientUserInfoChanged" ); } public plugin_natives( ) { register_library( "rang_sys" ); register_native( "get_user_rang", "_get_rang", 1 ); } public _get_rang( iPlayerId, sRang[ ], iLen ) { param_convert( 2 ); if ( g_iRang[ iPlayerId ] >= MaxRang ) copy( sRang, iLen, g_iUserData[ iPlayerId ][ sPrefix ] ); else copy( sRang, iLen, g_iRangs[ g_iRang[ iPlayerId ] - 1 ][ sRangName ] ); } public SaveDatas( iPlayerId, iMode ) { static sText[ 512 ]; if ( iMode == 1 ) formatex( sText, charsmax( sText ), "INSERT INTO `%s` (`authid`,`first_con_time`,`prefix`) VALUES (^"%s^",^"%d^",^"%s^");", g_sTable, g_sAuthID[ iPlayerId ], get_systime( ), g_iRangs[ MaxRang - 1 ][ sRangName ] ); else if ( iMode == 2 ) formatex( sText, charsmax( sText ), "UPDATE `%s` SET online_time = ^"%d^", online_timew = ^"%d^", kills = ^"%d^", deaths = ^"%d^", points = ^"%d^", prefix = ^"%s^" WHERE authid = ^"%s^";", g_sTable, g_iUserData[ iPlayerId ][ iOnlineTime ], g_iUserData[ iPlayerId ][ iOnlineTimeW ], g_iUserData[ iPlayerId ][ iKills ], g_iUserData[ iPlayerId ][ iDeaths ], g_iUserData[ iPlayerId ][ iPoints ], g_iUserData[ iPlayerId ][ sPrefix ], g_sAuthID[ iPlayerId ] ); else if ( iMode == 3 ) formatex( sText, charsmax( sText ), "UPDATE `%s` SET online_timew = ^"0^";", g_sTable ); else formatex( sText, charsmax( sText ), "UPDATE `%s` SET points = points - %d WHERE %d - first_con_time > 604799 AND online_timew < %d AND points > %d;", g_sTable, SubPoint, get_systime( ), MinOnlineTime, ( SubPoint - 1 ) ); SQL_ThreadQuery( g_iSqlTuple, "ThreadHandler", sText, { 0 }, 1 ); } public LoadDatas( iPlayerId ) { static sText[ 128 ], iArray[ 1 ]; formatex( sText, charsmax( sText ), "SELECT * FROM `%s` WHERE authid = ^"%s^";", g_sTable, g_sAuthID[ iPlayerId ] ); iArray[ 0 ] = iPlayerId; SQL_ThreadQuery( g_iSqlTuple, "ThreadHandler", sText, iArray, sizeof ( iArray ) ); } public ThreadHandler( iFailState, Handle:iQuery, const sErrorMsg[ ], iErrorCode, const iARRAY[ ], iArraySize, Float:fQueueTime ) { if ( iFailState == TQUERY_CONNECT_FAILED ) { set_fail_state( "Nem tudtam csatlakozni az adatbazishoz." ); return; } else if ( iFailState == TQUERY_QUERY_FAILED ) { set_fail_state( "Query Error" ); return; } if ( iErrorCode ) { log_amx( "%i - %s", iErrorCode, sErrorMsg ); return; } new iPlayerId = iARRAY[ 0 ]; if ( iPlayerId ) { if ( SQL_NumResults( iQuery ) > 0 ) { g_iUserData[ iPlayerId ][ iOnlineTime ] = SQL_ReadResult( iQuery, 1 ); g_iUserData[ iPlayerId ][ iOnlineTimeW ] = SQL_ReadResult( iQuery, 2 ); g_iUserData[ iPlayerId ][ iKills ] = SQL_ReadResult( iQuery, 3 ); g_iUserData[ iPlayerId ][ iDeaths ] = SQL_ReadResult( iQuery, 4 ); g_iUserData[ iPlayerId ][ iPoints ] = SQL_ReadResult( iQuery, 5 ); g_iUserData[ iPlayerId ][ iFCTime ] = SQL_ReadResult( iQuery, 6 ); SQL_ReadResult( iQuery, 7, g_iUserData[ iPlayerId ][ sPrefix ], charsmax( g_iUserData[ ][ sPrefix ] ) ); g_iRang[ iPlayerId ] = 0; for ( new i; i < MaxRang; ++i ) if ( g_iUserData[ iPlayerId ][ iPoints ] >= g_iRangs[ i ][ iRangPoint ] ) ++g_iRang[ iPlayerId ]; #if defined USE_ICHAT if ( g_iRang[ iPlayerId ] >= MaxRang ) iChatSendCustomData( iPlayerId, 0, g_iUserData[ iPlayerId ][ sPrefix ] ); else iChatSendCustomData( iPlayerId, 0, g_iRangs[ g_iRang[ iPlayerId ] - 1 ][ sRangName ] ); #endif } else SaveDatas( iPlayerId, 1 ); } return; } public evCTWin( ) { GivePoint( "CT" ); } public evTEWin( ) { GivePoint( "TERRORIST" ); } public GivePoint( const sTeam[ ] ) { static iPlayers[ 32 ], iPlrNum, iPlayerId; get_players( iPlayers, iPlrNum, "ech", sTeam ); for ( new i; i < iPlrNum; ++i ) { iPlayerId = iPlayers[ i ]; if ( g_iRoundKills[ iPlayerId ] == 0 ) continue; if ( get_playersnum( ) > 11 ) { if ( 14400 <= g_iUserData[ iPlayerId ][ iOnlineTimeW ] < 21600 ) g_iRoundKills[ iPlayerId ] *= 2; else if ( 21600 <= g_iUserData[ iPlayerId ][ iOnlineTimeW ] < 28800 ) g_iRoundKills[ iPlayerId ] *= 3; else if ( g_iUserData[ iPlayerId ][ iOnlineTimeW ] >= 28800 ) g_iRoundKills[ iPlayerId ] *= 4; } g_iUserData[ iPlayerId ][ iPoints ] += g_iRoundKills[ iPlayerId ]; if ( g_iRang[ iPlayerId ] < MaxRang ) { if ( g_iUserData[ iPlayerId ][ iPoints ] >= g_iRangs[ g_iRang[ iPlayerId ] ][ iRangPoint ] ) { ++g_iRang[ iPlayerId ]; #if defined USE_ICHAT if ( g_iRang[ iPlayerId ] >= MaxRang ) iChatSendCustomData( iPlayerId, 0, g_iUserData[ iPlayerId ][ sPrefix ] ); else iChatSendCustomData( iPlayerId, 0, g_iRangs[ g_iRang[ iPlayerId ] - 1 ][ sRangName ] ); #endif } } } arrayset( g_iRoundKills, 0, sizeof( g_iRoundKills ) ); } public evDeath( ) { new iKiller = read_data( 1 ); new iVictim = read_data( 2 ); if ( ( iKiller != iVictim ) && !( get_user_team( iKiller ) == get_user_team( iVictim ) )) { ++g_iUserData[ iKiller ][ iKills ]; ++g_iUserData[ iVictim ][ iDeaths ]; ++g_iRoundKills[ iKiller ]; } } public cmdHud( iPlayerId ) { ChatColor( iPlayerId, "%L", iPlayerId, "HUD", iPlayerId, ( g_bHud[ iPlayerId ] ^= true ) ? "ON" : "OFF" ); } public cmdRang( iPlayerId ) { static sCurRang[ 32 ], sNextRang[ 32 ], iLen = 0, sMotd[ 2048 ], iMotdLen = charsmax( sMotd ), iTime; copy( sCurRang, charsmax( sCurRang ), g_iRangs[ g_iRang[ iPlayerId ] - 1 ][ sRangName ] ); iTime = get_systime( ) - g_iUserData[ iPlayerId ][ iFCTime ]; if ( g_iRang[ iPlayerId ] >= MaxRang ) format( sCurRang, charsmax( sCurRang ), "%s (%s)", sCurRang, g_iUserData[ iPlayerId ][ sPrefix ] ); if ( g_iRang[ iPlayerId ] < MaxRang ) copy( sNextRang, charsmax( sNextRang ), g_iRangs[ g_iRang[ iPlayerId ] ][ sRangName ] ); iLen = formatex( sMotd, iMotdLen, "<meta charset=utf-8><body bgcolor=#000000><font color=#FFB000><pre>" ); iLen += formatex( sMotd[ iLen ], iMotdLen - iLen, "%L^n", iPlayerId, "MOTD0", iTime / 3600,( iTime / 60 ) % 60, iTime % 60 ); iLen += formatex( sMotd[ iLen ], iMotdLen - iLen, "%L^n", iPlayerId, "MOTD1", g_iUserData[ iPlayerId ][ iOnlineTime ] / 3600,(g_iUserData[ iPlayerId ][ iOnlineTime ] / 60 ) % 60, g_iUserData[ iPlayerId ][ iOnlineTime ] % 60 ); iLen += formatex( sMotd[ iLen ], iMotdLen - iLen, "%L^n", iPlayerId, "MOTD2", g_iUserData[ iPlayerId ][ iOnlineTimeW ] / 3600, (g_iUserData[ iPlayerId ][ iOnlineTimeW ] / 60 ) % 60, g_iUserData[ iPlayerId ][ iOnlineTimeW ] % 60 ); iLen += formatex( sMotd[ iLen ], iMotdLen - iLen, "%L^n%L^n%L^n", iPlayerId, "MOTD3", g_iUserData[ iPlayerId ][ iKills ], iPlayerId, "MOTD4", g_iUserData[ iPlayerId ][ iDeaths ], iPlayerId, "MOTD5", g_iUserData[ iPlayerId ][ iPoints ] ); if ( g_iRang[ iPlayerId ] >= MaxRang ) iLen += formatex( sMotd[ iLen ], iMotdLen - iLen, "%L^n^n", iPlayerId, "MOTD6", sCurRang ); else iLen += formatex( sMotd[ iLen ], iMotdLen - iLen, "%L^n%L^n^n", iPlayerId, "MOTD6", sCurRang, iPlayerId, "MOTD7", sNextRang, ( g_iRangs[ g_iRang[ iPlayerId ] ][ iRangPoint ] - g_iUserData[ iPlayerId ][ iPoints ] ) ); iLen += formatex( sMotd[ iLen ], iMotdLen - iLen, "%L^n", iPlayerId, "MOTD8", MinOnlineTime / 3600 ); iLen += formatex( sMotd[ iLen ], iMotdLen - iLen, "%L^n", iPlayerId, "MOTD9" ); iLen += formatex( sMotd[ iLen ], iMotdLen - iLen, "%L^n", iPlayerId, "MOTD13" ); iLen += formatex( sMotd[ iLen ], iMotdLen - iLen, "%L", iPlayerId, "MOTD10" ); show_motd( iPlayerId, sMotd, "Rangrendszer info" ); } public cmdRangs( iPlayerId ) { static sRang[ 32 ], iLen = 0, sMotd[ 2048 ], iMotdLen = charsmax( sMotd ); iLen = formatex( sMotd, iMotdLen, "<meta charset=utf-8><style>table{color:#FFB000;} td,th{border:1px solid #666;text-align:center;}</style><body bgcolor=#000000><center><h1><font color=#FFB000>%L</h1><br><table width='400'><tr><th>%L</th><th>%L</th><tr>", iPlayerId, "MOTD11", iPlayerId, "RANG", iPlayerId, "MOTD12" ); for ( new i; i < MaxRang; ++i ) { copy( sRang, charsmax( sRang ), g_iRangs[ i ][ sRangName ] ); if ( i < g_iRang[ iPlayerId ] - 1 ) iLen += formatex( sMotd[ iLen ], iMotdLen - iLen, "<tr><td>%s</td><td>0</td><tr>", sRang ); else if ( i == g_iRang[ iPlayerId ] - 1 ) iLen += formatex( sMotd[ iLen ], iMotdLen - iLen, "<tr style='background-color:#666;'><td>%s</td><td>0</td><tr>", sRang ); else iLen += formatex( sMotd[ iLen ], iMotdLen - iLen, "<tr><td>%s</td><td>%d</td><tr>", sRang, ( g_iRangs[ i ][ iRangPoint ] - g_iUserData[ iPlayerId ][ iPoints ] ) ); } show_motd( iPlayerId, sMotd, "Rangrendszer info" ); } public cmdPrefix( iPlayerId ) { if ( g_iRang[ iPlayerId ] < MaxRang ) { ChatColor( iPlayerId, "%L", iPlayerId, "PREFIX1" ); return; } ChatColor( iPlayerId, "%L", iPlayerId, "PREFIX2" ); client_cmd( iPlayerId, "messagemode PREFIX" ); } public cmdResetPrefix( iPlayerId, iLevel, iCid ) { if ( !cmd_access( iPlayerId, iLevel, iCid, 2 ) ) return PLUGIN_HANDLED; static sUser[ 32 ], iPlrId; read_argv( 1, sUser, charsmax( sUser ) ); iPlrId = cmd_target( iPlayerId, sUser, ( CMDTARGET_OBEY_IMMUNITY | CMDTARGET_ALLOW_SELF ) ); if ( !iPlrId ) { ChatColor( iPlayerId, "Nincs %s nevezetű játékos.", sUser ); return PLUGIN_HANDLED; } copy( g_iUserData[ iPlrId ][ sPrefix ], charsmax( g_iUserData[ ][ sPrefix ] ), g_iRangs[ MaxRang - 1 ][ sRangName ] ); #if defined USE_ICHAT iChatSendCustomData( iPlrId, 0, g_iRangs[ MaxRang - 1 ][ sRangName ] ); #endif ChatColor( iPlayerId, "Sikeresen resetelted a jatekos prefixet." ); return PLUGIN_CONTINUE; } public GetPrefix( iPlayerId ) { if ( g_iRang[ iPlayerId ] < MaxRang ) return PLUGIN_HANDLED; static sString[ 17 ], iLen; read_args( sString, charsmax( sString ) ); remove_quotes( sString ); replace_all( sString, charsmax( sString ), "'", "" ); replace_all( sString, charsmax( sString ), "^"", "" ); replace_all( sString, charsmax( sString ), "`", "" ); iLen = strlen( sString ); if ( iLen < 3 || iLen > 15 ) { ChatColor( iPlayerId, "%L", iPlayerId, "PREFIX3" ); return PLUGIN_HANDLED; } format( sString, charsmax( sString ), "%s", sString ); copy( g_iUserData[ iPlayerId ][ sPrefix ], charsmax( g_iUserData[ ][ sPrefix ] ), sString ); #if defined USE_ICHAT iChatSendCustomData( iPlayerId, 0, sString ); #endif ChatColor( iPlayerId, "%L", iPlayerId, "PREFIX4", sString ); return PLUGIN_CONTINUE; } public fwClientUserInfoChanged( iPlayerId, iBuffer ) { if ( !is_user_connected( iPlayerId ) ) return FMRES_IGNORED; static sOldName[ 32 ], sNewName[ 32 ]; get_user_name( iPlayerId, sOldName, charsmax( sOldName ) ); engfunc( EngFunc_InfoKeyValue, iBuffer, "name", sNewName, charsmax( sNewName ) ); if ( equal( sNewName, sOldName ) ) return FMRES_IGNORED; engfunc( EngFunc_SetClientKeyValue, iPlayerId, iBuffer, "name", sOldName ); client_cmd( iPlayerId, "name ^"%s^"; setinfo name ^"%s^"", sOldName, sOldName ); return FMRES_SUPERCEDE; } public OnlineTimeCounter( iPlayerId ) { ++g_iUserData[ iPlayerId ][ iOnlineTime ]; ++g_iUserData[ iPlayerId ][ iOnlineTimeW ]; if ( g_bHud[ iPlayerId ] ) { if ( !is_user_alive( iPlayerId ) ) { set_hudmessage( 0, 255, 0, 0.01, 0.20, 0, 6.0, 0.9 ); new iTarget = entity_get_int( iPlayerId, EV_INT_iuser2 ); if ( iTarget != 0 ) { show_hudmessage( iPlayerId, "%L^n%L^n%L^n%L^n%L^n%L^n%L", iPlayerId, "HUD1", g_sUsername[ iTarget ], iPlayerId, "HUD2", g_iUserData[ iTarget ][ iOnlineTime ] / 3600,( g_iUserData[ iTarget ][ iOnlineTime ] / 60 ) % 60, g_iUserData[ iTarget ][ iOnlineTime ] % 60, iPlayerId, "HUD3", g_iUserData[ iTarget ][ iOnlineTimeW ] / 3600, ( g_iUserData[ iTarget ][ iOnlineTimeW ] / 60 ) % 60, g_iUserData[ iTarget ][ iOnlineTimeW ] % 60, iPlayerId, "HUD4", g_iUserData[ iTarget ][ iKills ], iPlayerId, "HUD5", g_iUserData[ iTarget ][ iDeaths ], iPlayerId, "HUD6", g_iRangs[ g_iRang[ iTarget ] - 1 ][ sRangName ], g_iUserData[ iTarget ][ iPoints ], iPlayerId, "MOTD10" ); } else { show_hudmessage( iPlayerId, "%L^n%L^n%L^n%L^n%L^n%L^n%L", iPlayerId, "HUD7", iPlayerId, "HUD2", g_iUserData[ iPlayerId ][ iOnlineTime ] / 3600,( g_iUserData[ iPlayerId ][ iOnlineTime ] / 60 ) % 60, g_iUserData[ iPlayerId ][ iOnlineTime ] % 60, iPlayerId, "HUD3", g_iUserData[ iPlayerId ][ iOnlineTimeW ] / 3600, ( g_iUserData[ iPlayerId ][ iOnlineTimeW ] / 60 ) % 60, g_iUserData[ iPlayerId ][ iOnlineTimeW ] % 60, iPlayerId, "HUD4", g_iUserData[ iPlayerId ][ iKills ], iPlayerId, "HUD5", g_iUserData[ iPlayerId ][ iDeaths ], iPlayerId, "HUD6", g_iRangs[ g_iRang[ iPlayerId ] - 1 ][ sRangName ], g_iUserData[ iPlayerId ][ iPoints ], iPlayerId, "MOTD10" ); } } } } public Save( iNum ) { new sNewLine[ 16 ]; formatex( sNewLine, charsmax( sNewLine ), "^"%d^"", iNum ); write_file( "addons/amxmodx/configs/rangsys.ini", sNewLine, 0 ); } public Load( ) { new pFile = fopen( "addons/amxmodx/configs/rangsys.ini", "rt" ); if ( pFile ) { new sLine[ 16 ], sTime[ 64 ], iNum; fgets( pFile, sLine, charsmax( sLine ) ); trim( sLine ); remove_quotes( sLine ); iNum = str_to_num( sLine ); get_time( "%a", sTime, charsmax( sTime ) ); if ( equal( sTime, "Mon" ) ) { if ( iNum == 0 ) { SaveDatas( 0, 4 ); Save( 1 ); set_task( 2.5, "ResetOTimeW" ); } } else { if ( iNum == 1 ) Save( 0 ); } fclose(pFile); } else Save( 0 ); } public ResetOTimeW( ) { SaveDatas( 0, 3 ); } public client_putinserver( iPlayerId ) { if ( is_user_bot( iPlayerId ) || is_user_hltv( iPlayerId ) ) return; g_iRoundKills[ iPlayerId ] = 0; g_bHud[ iPlayerId ] = true; g_iRang[ iPlayerId ] = 1; arrayset( g_iUserData[ iPlayerId ], 0, sizeof( g_iUserData[ ] ) ); copy( g_iUserData[ iPlayerId ][ sPrefix ], charsmax( g_iUserData[ ][ sPrefix ] ), g_iRangs[ MaxRang - 1 ][ sRangName ] ); #if defined USE_ICHAT iChatSendCustomData( iPlayerId, 0, g_iRangs[ 0 ][ sRangName ] ); #endif get_user_name( iPlayerId, g_sUsername[ iPlayerId ], charsmax( g_sUsername[ ] ) ); get_user_authid( iPlayerId, g_sAuthID[ iPlayerId ], charsmax( g_sAuthID[ ] ) ); LoadDatas( iPlayerId ); set_task( 1.0, "OnlineTimeCounter", iPlayerId, _, _, "b" ); } public client_disconnect( iPlayerId ) { if ( task_exists( iPlayerId ) ) remove_task( iPlayerId ); SaveDatas( iPlayerId, 2 ); } public plugin_end( ) { SQL_FreeHandle( g_iSqlTuple ); } stock ChatColor( iPlayerId, const sMessage[ ], any:... ) { static iPlrNum, iPlayers[ 32 ], sMsg[ 256 ], iIdMsg, iMsgLen = charsmax( sMsg ); vformat( sMsg, iMsgLen, sMessage, 3 ); format( sMsg, iMsgLen, "!g[%s]!y %s", g_sPrefix, sMsg ); replace_all( sMsg, iMsgLen, "!g", "^4" ); replace_all( sMsg, iMsgLen, "!y", "^1" ); replace_all( sMsg, iMsgLen, "!t", "^3" ); if ( !iIdMsg ) iIdMsg = get_user_msgid( "SayText" ); if ( iPlayerId ) { iPlayers[ 0 ] = iPlayerId; iPlrNum = 1; } else get_players( iPlayers, iPlrNum, "ch" ); for ( new i, iPId; i < iPlrNum; ++i ) { iPId = iPlayers[ i ]; if ( !is_user_connected( iPId ) ) continue; message_begin( MSG_ONE, iIdMsg, _, iPId ); write_byte( iPId ); write_string( sMsg ); message_end( ); } } /* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE *{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1033\\ f0\\ fs16 \n\\ par } */
Ichat #include < amxmodx > #include < amxmisc > #include < hamsandwich > #include < fakemeta > #pragma semicolon 1 #define ICHAT_VERSION "2.3.3" #define ICHAT_HOST "forums.alliedmods.net" #define ICHAT_THREAD "showthread.php?t=173113" #define USE_TEAM_FIX #define ICHAT_MAX_PLAYERS 32 #define ICHAT_MAX_SAID_LEN 128 #define ICHAT_MAX_MSG_LEN 496 #define TASK_NOTIFY 5987 #define NOTIFY_TASK_TIME 15.0 #define FORMAT_MAX_SIZE 264 #define FORMAT_SMALL_MAX_SIZE 36 #define MAX_CUSTOM_TAGS 2 #define MAX_CUSTOM_TAGS_SIZE 24 #define TEAM_AA_1 0 #define TEAM_AA_2 3 #define ICHAT_RETURN PLUGIN_HANDLED #if defined USE_TEAM_FIX #define TeamInfo_PlayerID 1 #define XO_PLAYER 5 #define m_iTeam 114 #define m_iDeaths 444 new gMsgScoreInfo; #endif enum _:formats { formatAllDefAlive = 0, formatAllAdminAlive, formatAllVIPAlive, formatTeamDefAlive, formatTeamAdminAlive, formatTeamVIPAlive, formatAllDefDead, formatAllAdminDead, formatAllVIPDead, formatTeamDefDead, formatTeamAdminDead, formatTeamVIPDead, formatMeMessage, formatMeCommand, formatClearCommand, formatMax }; enum _:formatTypes { formatDefAlive = 0, formatDefDead, formatTeamAlive, formatTeamDead, formatTypesMax }; enum _:messageType { messageToAll = 0, messageToTeam }; enum _:formatMode { USER = 0, ADMIN, VIP, CUSTOM }; enum _:teamTags { NONE = 0, T, CT, SPEC }; enum _:deadOrAlive { DEAD = 0, ALIVE }; enum _:usersFlags { FLAG_RELOAD = 0, FLAG_SPY, FLAG_ADMIN, FLAG_VIP, FLAG_CHAT, FLAG_SEE_CHAT }; new gszChatFormats[ formatMax ][ FORMAT_MAX_SIZE ]; new gszFormatTeamTags[ SPEC + 1 ][ ALIVE + 1 ][ FORMAT_SMALL_MAX_SIZE ]; new gszAccesFlags[ FLAG_SEE_CHAT + 1 ][ 26 ]; new gszCustomTags[ ICHAT_MAX_PLAYERS + 1 ][ MAX_CUSTOM_TAGS ][ MAX_CUSTOM_TAGS_SIZE ]; new gszAuthid[ ICHAT_MAX_PLAYERS + 1 ][ 35 ]; new Trie:gtCustomFormats[ formatTypesMax ]; new Trie:gtCustomFormatEnabled[ formatTypesMax ]; new giRemoveOnSlash; new giUserNotify; new giAdminsSpy; new giUseCustomColor; new giRemoveNameChanged; new giRed; new giGreen; new giBlue; new giPunishment; new giAllTalk; new giUseCustomTags; new giUseCustomFormats; new giForceSimplePrint; new giMustBeUpdated; new giAllowStop; new giAdminOverrides; new Float:gFlPrintRadiusAll; new Float:gFlPrintRadiusTeam; new giCheckArray[ 3 ][ ICHAT_MAX_PLAYERS + 1 ]; #define SetUserFirstSpawn(%1) giCheckArray[0][%1]=1 #define ClearUserFirstSpawn(%1) giCheckArray[0][%1]=0 #define IsFirstSpawn(%1) giCheckArray[0][%1] #define EnableUserChat(%1) giCheckArray[1][%1]=1 #define DisableUserChat(%1) giCheckArray[1][%1]=0 #define IsUserChatEnabled(%1) giCheckArray[1][%1] #define SetUserVip(%1) giCheckArray[2][%1]=1 #define ClearUserVip(%1) giCheckArray[2][%1]=0 #define IsUserVip(%1) giCheckArray[2][%1] new giLocation; new gszLocation[ ICHAT_MAX_PLAYERS + 1 ][ FORMAT_SMALL_MAX_SIZE ]; new gMsgSayText; new gMsgTeamInfo; new giPluginIndex; public plugin_init( ) { giPluginIndex = register_plugin( "iChat", ICHAT_VERSION, "Kidev" ); iChatCheckErrors( ); register_dictionary( "iChat.txt" ); register_dictionary( "common.txt" ); gMsgSayText = get_user_msgid( "SayText" ); gMsgTeamInfo = get_user_msgid( "TeamInfo" ); #if defined USE_TEAM_FIX gMsgScoreInfo = get_user_msgid( "ScoreInfo" ); #endif register_message( gMsgSayText, "messageSayText" ); RegisterHam( Ham_Spawn, "player", "hamPlayerSpawnPost", 1 ); register_concmd( "amx_reload_ichat", "iChatReloadConfig" ); register_clcmd( "say", "iChatHookSay", 0 ); register_clcmd( "say_team", "iChatHookSay", 1 ); new szModShortName[ 7 ]; if ( get_modname( szModShortName, charsmax( szModShortName ) ) == 5 && equal( szModShortName, "czero" ) ) { register_event( "Location", "eventLocation", "be" ); } register_event( "TeamInfo", "eventTeamInfoAll", "a" ); new iSutppCvar = register_cvar( "ichat_version", ICHAT_VERSION, FCVAR_SERVER | FCVAR_EXTDLL | FCVAR_SPONLY ); set_pcvar_string( iSutppCvar, ICHAT_VERSION ); new iFormatType; for ( iFormatType = 0; iFormatType < formatTypesMax; iFormatType++ ) { gtCustomFormats[ iFormatType ] = TrieCreate( ); gtCustomFormatEnabled[ iFormatType ] = TrieCreate( ); } iChatConfig( ); } public plugin_unpause( ) { iChatPause( 1, "ad", "Hiba: Valaki megprobalta leallitani az iChatet. iChat leallt.", "" ); } public iChatPause( iForcePause, const szFlags[ ], const szError[ ], const szWarning[ ] ) { if ( giAllowStop || iForcePause ) { log_amx( szError ); pause( szFlags ); } else { log_amx( szWarning ); } } public iChatCheckErrors( ) { new iPluginsNum; if ( ( giPluginIndex + 1 ) < ( iPluginsNum = get_pluginsnum( ) ) ) { log_amx( "The following plugins are called after iChat. You have to fix this." ); new i, szFileName[ 15 ], szStatus[ 15 ]; for ( i = ( giPluginIndex + 1 ); i < iPluginsNum; i++ ) { if ( get_plugin( i, szFileName, charsmax( szFileName ), _, _, _, _, _, _, szStatus, charsmax( szStatus ) ) >= 0 ) { log_amx( "[%d] %s is %s", ( i + 1 ), szFileName, szStatus ); } else break; } iChatPause( 0, "ad", "HIBA: iChat nem az utolso a plugins.ini-ben. iChat leallt.", "FIGYELEM: Az iChat nem az utolso plugin a plugins.ini-ben." ); } if ( is_plugin_loaded( "Admin Chat Colors" ) != -1 ) { log_amx( "FIGYELEM: iChat ezt a plugint talalta 'Admin Chat Colors' ami eppen fut. A plugin leallitva." ); pause( "acd", "Admin Chat Colors" ); } } public iChatCheckUpdates( ) // Being worked on { new iOutdated = 0; if ( iOutdated ) { log_amx( "FIGYELEM: Az iChat egy regebbi verziojat hasznalod. Toltsd le a frissitest itt http://%s/%s", ICHAT_HOST, ICHAT_THREAD ); giMustBeUpdated = 1; } } public plugin_natives( ) { register_library( "iChat" ); register_native( "iChatSendCustomData", "iChatSendCustomData" ); register_native( "iChatVipAction", "iChatVipAction" ); } public iChatReloadConfig( id ) { if ( !has_flag( id, gszAccesFlags[ FLAG_RELOAD ] ) && gszAccesFlags[ FLAG_RELOAD ][ 0 ] ) { client_print( id, print_console, "%L", id, "NO_ACC_COM" ); return PLUGIN_HANDLED; } iChatConfig( ); client_print( id, print_console, "[iChat] %L", id, "ICHAT_RELOADED" ); return PLUGIN_CONTINUE; } public iChatConfig( ) { new szCfgFile[ 128 ]; get_configsdir( szCfgFile, charsmax( szCfgFile ) ); formatex( szCfgFile, charsmax( szCfgFile ), "%s/ichat.cfg", szCfgFile ); new iCfgFileHandle = fopen( szCfgFile, "rt" ); if ( !iCfgFileHandle ) { set_fail_state( "No configuration file" ); return; } new szLineData[ 364 ], szLineKey[ 96 ], szLineValue[ 264 ]; while ( !feof( iCfgFileHandle ) ) { fgets( iCfgFileHandle, szLineData, charsmax( szLineData ) ); trim( szLineData ); if ( szLineData[ 0 ] == ';' || szLineData[ 0 ] == '#' || ( szLineData[ 0 ] == '/' && szLineData[ 1 ] == '/' ) || !szLineData[ 0 ] ) { continue; } parse( szLineData, szLineKey, charsmax( szLineKey ), szLineValue, charsmax( szLineValue ) ); switch ( szLineKey[ 0 ] ) { case 'F': { switch ( szLineKey[ 7 ] ) { case 'D': { switch ( szLineKey[ 11 ] ) { case 'A': { if ( equal( szLineKey, "FORMAT_DEF_ALIVE" ) ) { copy( gszChatFormats[ formatAllDefAlive ], charsmax( gszChatFormats[ ] ), szLineValue ); } } case 'D': { if ( equal( szLineKey, "FORMAT_DEF_DEAD" ) ) { copy( gszChatFormats[ formatAllDefDead ], charsmax( gszChatFormats[ ] ), szLineValue ); } } } } case 'A': { switch ( szLineKey[ 13 ] ) { case 'A': { if ( equal( szLineKey, "FORMAT_ADMIN_ALIVE" ) ) { copy( gszChatFormats[ formatAllAdminAlive ], charsmax( gszChatFormats[ ] ), szLineValue ); } } case 'D': { if ( equal( szLineKey, "FORMAT_ADMIN_DEAD" ) ) { copy( gszChatFormats[ formatAllAdminDead ], charsmax( gszChatFormats[ ] ), szLineValue ); } } } } case 'V': { switch ( szLineKey[ 11 ] ) { case 'A': { if ( equal( szLineKey, "FORMAT_VIP_ALIVE" ) ) { copy( gszChatFormats[ formatAllVIPAlive ], charsmax( gszChatFormats[ ] ), szLineValue ); } } case 'D': { if ( equal( szLineKey, "FORMAT_VIP_DEAD" ) ) { copy( gszChatFormats[ formatAllVIPDead ], charsmax( gszChatFormats[ ] ), szLineValue ); } } } } case 'T': { switch ( szLineKey[ 12 ] ) { case 'D': { switch ( szLineKey[ 16 ] ) { case 'A': { if ( equal( szLineKey, "FORMAT_TEAM_DEF_ALIVE" ) ) { copy( gszChatFormats[ formatTeamDefAlive ], charsmax( gszChatFormats[ ] ), szLineValue ); } } case 'D': { if ( equal( szLineKey, "FORMAT_TEAM_DEF_DEAD" ) ) { copy( gszChatFormats[ formatTeamDefDead ], charsmax( gszChatFormats[ ] ), szLineValue ); } } } } case 'A': { switch ( szLineKey[ 18 ] ) { case 'A': { if ( equal( szLineKey, "FORMAT_TEAM_ADMIN_ALIVE" ) ) { copy( gszChatFormats[ formatTeamAdminAlive ], charsmax( gszChatFormats[ ] ), szLineValue ); } } case 'D': { if ( equal( szLineKey, "FORMAT_TEAM_ADMIN_DEAD" ) ) { copy( gszChatFormats[ formatTeamAdminDead ], charsmax( gszChatFormats[ ] ), szLineValue ); } } } } case 'V': { switch ( szLineKey[ 16 ] ) { case 'A': { if ( equal( szLineKey, "FORMAT_TEAM_VIP_ALIVE" ) ) { copy( gszChatFormats[ formatTeamVIPAlive ], charsmax( gszChatFormats[ ] ), szLineValue ); } } case 'D': { if ( equal( szLineKey, "FORMAT_TEAM_VIP_DEAD" ) ) { copy( gszChatFormats[ formatTeamVIPDead ], charsmax( gszChatFormats[ ] ), szLineValue ); } } } } } } case 'M': { switch ( szLineKey[ 10 ] ) { case 'M': { if ( equal( szLineKey, "FORMAT_ME_MESSAGE" ) ) { copy( gszChatFormats[ formatMeMessage ], charsmax( gszChatFormats[ ] ), szLineValue ); } } case 'C': { if ( equal( szLineKey, "FORMAT_ME_COMMAND" ) ) { copy( gszChatFormats[ formatMeCommand ], charsmax( gszChatFormats[ ] ), szLineValue ); add( gszChatFormats[ formatMeCommand ], charsmax( gszChatFormats[ ] ), " " ); } } } } } } case 'C': { switch ( szLineKey[ 5 ] ) { case 'C': { switch ( szLineKey[ 11 ] ) { case 'R': { if ( equal( szLineKey, "CHAT_CLCMD_REMOVE" ) ) { giRemoveOnSlash = str_to_num( szLineValue ); } } case 'C': { if ( equal( szLineKey, "CHAT_CLCMD_CLEAR" ) ) { copy( gszChatFormats[ formatClearCommand ], charsmax( gszChatFormats[ ] ), szLineValue ); } } case 'U': { if ( equal( szLineKey, "CHAT_CHECK_UPDATES" ) ) { if ( str_to_num( szLineValue ) == 1 ) { giMustBeUpdated = 0; iChatCheckUpdates( ); } } } case 'O': { if ( equal( szLineKey, "CHAT_CAN_STOP_ITSELF" ) ) { giAllowStop = str_to_num( szLineValue ); } } } } case 'F': { switch ( szLineKey[ 10 ] ) { case 'R': { if ( equal( szLineKey, "CHAT_FLAG_RELOAD" ) ) { if ( equal( szLineValue, "ALL" ) ) { gszAccesFlags[ FLAG_RELOAD ][ 0 ] = 0; } else { copy( gszAccesFlags[ FLAG_RELOAD ], charsmax( gszAccesFlags[ ] ), szLineValue ); } } } case 'S': { switch ( szLineKey[ 11 ] ) { case 'P': { if ( equal( szLineKey, "CHAT_FLAG_SPY" ) ) { if ( equal( szLineValue, "ALL" ) ) { gszAccesFlags[ FLAG_SPY ][ 0 ] = 0; } else { copy( gszAccesFlags[ FLAG_SPY ], charsmax( gszAccesFlags[ ] ), szLineValue ); } } } case 'E': { if ( equal( szLineKey, "CHAT_FLAG_SEE_CHAT" ) ) { if ( equal( szLineValue, "ALL" ) ) { gszAccesFlags[ FLAG_SEE_CHAT ][ 0 ] = 0; } else { copy( gszAccesFlags[ FLAG_SEE_CHAT ], charsmax( gszAccesFlags[ ] ), szLineValue ); } } } } } case 'A': { if ( equal( szLineKey, "CHAT_FLAG_ADMIN" ) ) { if ( equal( szLineValue, "ALL" ) ) { gszAccesFlags[ FLAG_ADMIN ][ 0 ] = 0; } else { copy( gszAccesFlags[ FLAG_ADMIN ], charsmax( gszAccesFlags[ ] ), szLineValue ); } } } case 'V': { if ( equal( szLineKey, "CHAT_FLAG_VIP" ) ) { if ( equal( szLineValue, "ALL" ) ) { gszAccesFlags[ FLAG_VIP ][ 0 ] = 0; } else { copy( gszAccesFlags[ FLAG_VIP ], charsmax( gszAccesFlags[ ] ), szLineValue ); } } } case 'C': { if ( equal( szLineKey, "CHAT_FLAG_CHAT" ) ) { if ( equal( szLineValue, "ALL" ) ) { gszAccesFlags[ FLAG_CHAT ][ 0 ] = 0; } else { copy( gszAccesFlags[ FLAG_CHAT ], charsmax( gszAccesFlags[ ] ), szLineValue ); } } } case 'L': { if ( equal( szLineKey, "CHAT_NO_COLORS" ) ) { giForceSimplePrint = str_to_num( szLineValue ); } } } } case 'A': { switch ( szLineKey[ 11 ] ) { case 'S': { if ( equal( szLineKey, "CHAT_ADMIN_SPY" ) ) { giAdminsSpy = str_to_num( szLineValue ); } } case 'L': { if ( equal( szLineKey, "CHAT_ALL_TALK" ) ) { giAllTalk = str_to_num( szLineValue ); } } case 'O': { if ( equal( szLineKey, "CHAT_ADMIN_OVERRIDES" ) ) { giAdminOverrides = str_to_num( szLineValue ); } } } } case 'D': { if ( equal( szLineKey, "CHAT_DEFAULT_COLOR" ) ) { new iColor = str_to_num( szLineValue ); if ( iColor < 0 || iColor > 255255255 ) { giUseCustomColor = 0; } else { giUseCustomColor = 1; giRed = iColor / 1000000; iColor %= 1000000; giGreen = iColor / 1000; giBlue = iColor % 1000; } } } case 'P': { if ( equal( szLineKey, "CHAT_PUNISHMENT" ) ) { giPunishment = str_to_num( szLineValue ); if ( giPunishment > 1 || giPunishment < 0 ) { giPunishment = 1; } } } case 'N': { if ( equal( szLineKey, "CHAT_NOTIFY" ) ) { giUserNotify = str_to_num( szLineValue ); } } case 'R': { switch ( szLineKey[ 12 ] ) { case 'A': { if ( equal( szLineKey, "CHAT_RADIUS_ALL" ) ) { gFlPrintRadiusAll = str_to_float( szLineValue ); } } case 'T': { if ( equal( szLineKey, "CHAT_RADIUS_TEAM" ) ) { gFlPrintRadiusTeam = str_to_float( szLineValue ); } } case 'C': { if ( equal( szLineKey, "CHAT_REMOVE_CHANGE_NAME" ) ) { giRemoveNameChanged = str_to_num( szLineValue ); } } } } case 'T': { switch ( szLineKey[ 14 ] ) { case '1': { switch ( szLineKey[ 16 ] ) { case 'A': { if ( equal( szLineKey, "CHAT_TEAM_TAG_1_A" ) ) { copy( gszFormatTeamTags[ T ][ ALIVE ], charsmax( gszFormatTeamTags[ ][ ] ), szLineValue ); } } case 'D': { if ( equal( szLineKey, "CHAT_TEAM_TAG_1_D" ) ) { copy( gszFormatTeamTags[ T ][ DEAD ], charsmax( gszFormatTeamTags[ ][ ] ), szLineValue ); } } } } case '2': { switch ( szLineKey[ 16 ] ) { case 'A': { if ( equal( szLineKey, "CHAT_TEAM_TAG_2_A" ) ) { copy( gszFormatTeamTags[ CT ][ ALIVE ], charsmax( gszFormatTeamTags[ ][ ] ), szLineValue ); } } case 'D': { if ( equal( szLineKey, "CHAT_TEAM_TAG_2_D" ) ) { copy( gszFormatTeamTags[ CT ][ DEAD ], charsmax( gszFormatTeamTags[ ][ ] ), szLineValue ); } } } } case '3': { if ( equal( szLineKey, "CHAT_TEAM_TAG_3" ) ) { copy( gszFormatTeamTags[ SPEC ][ DEAD ], charsmax( gszFormatTeamTags[ ][ ] ), szLineValue ); } } } } case 'U': { switch ( szLineKey[ 16 ] ) { case 'T': { if ( equal( szLineKey, "CHAT_USE_CUSTOM_TAGS" ) ) { giUseCustomTags = str_to_num( szLineValue ); } } case 'F': { if ( equal( szLineKey, "CHAT_USE_CUSTOM_FORMATS" ) ) { giUseCustomFormats = str_to_num( szLineValue ); } } } } } } } } fclose( iCfgFileHandle ); if ( giUseCustomFormats ) { iChatCustomFormats( ); } } public iChatCustomFormats( ) { new szIniFile[ 128 ]; get_configsdir( szIniFile, charsmax( szIniFile ) ); formatex( szIniFile, charsmax( szIniFile ), "%s/ichat_custom_formats.ini", szIniFile ); new iIniFileHandle = fopen( szIniFile, "rt" ); if ( !iIniFileHandle ) { set_fail_state( "No custom formats file" ); return; } new szLineData[ 456 ], szLineKey[ 96 ], szLineKeyValue[ 96 ], szLineValue[ 264 ], iFormatType; for ( iFormatType = 0; iFormatType < formatTypesMax; iFormatType++ ) { TrieClear( gtCustomFormats[ iFormatType ] ); TrieClear( gtCustomFormatEnabled[ iFormatType ] ); } while ( !feof( iIniFileHandle ) ) { fgets( iIniFileHandle, szLineData, charsmax( szLineData ) ); trim( szLineData ); if ( szLineData[ 0 ] == ';' || szLineData[ 0 ] == '#' || ( szLineData[ 0 ] == '/' && szLineData[ 1 ] == '/' ) || !szLineData[ 0 ] ) { continue; } parse( szLineData, szLineKey, charsmax( szLineKey ), szLineKeyValue, charsmax( szLineKeyValue ), szLineValue, charsmax( szLineValue ) ); if ( ( iFormatType = iChatGetFormatFromString( szLineKeyValue ) ) < 0 ) { continue; } if ( ( equal( szLineKey, "STEAM_", 6 ) || equal( szLineKey, "BOT" ) ) && szLineValue[ 0 ] ) { TrieSetString( gtCustomFormats[ iFormatType ], szLineKey, szLineValue ); TrieSetCell( gtCustomFormatEnabled[ iFormatType ], szLineKey, 1 ); } } fclose( iIniFileHandle ); } public iChatGetFormatFromString( const szKey[ ] ) { switch ( szKey[ 5 ] ) { case 'L': return formatDefAlive; case 'E': return formatDefDead; case 'A': return formatTeamAlive; case 'D': return formatTeamDead; } return -1; } public iChatHookSay( id, iTeamMessage ) { return iChatGenerateMessage( id, iTeamMessage ); } public iChatGenerateMessage( id, iTeamMessage ) { if ( !is_user_connected( id ) || ( !has_flag( id, gszAccesFlags[ FLAG_CHAT ] ) && gszAccesFlags[ FLAG_CHAT ][ 0 ] ) ) { return ICHAT_RETURN; } new szSaid[ ICHAT_MAX_SAID_LEN ], iSaidLen; iSaidLen = charsmax( szSaid ); read_args( szSaid, charsmax( szSaid ) ); remove_quotes( szSaid ); trim( szSaid ); if ( iChatIsChatValid( szSaid ) ) { iChatSendToHLSW( id, szSaid, iTeamMessage ); } if ( !contain( szSaid, gszChatFormats[ formatMeCommand ] ) ) { iChatMeCommand( id, szSaid, iSaidLen ); return ICHAT_RETURN; } if ( !contain( szSaid, gszChatFormats[ formatClearCommand ] ) ) { iChatChangeChatStatus( id, IsUserChatEnabled( id ) ); return ICHAT_RETURN; } if ( ( !szSaid[ 0 ] ) || ( ( giRemoveOnSlash && ( szSaid[ 0 ] == '/' || szSaid[ 0 ] == '@' || szSaid[ 0 ] == '!' ) ) || ( szSaid[ 0 ] == ' ' ) ) || ( !IsUserChatEnabled( id ) ) ) { return ICHAT_RETURN; } new iAlive = is_user_alive( id ); new szMessage[ ICHAT_MAX_MSG_LEN ], szColor[ 16 ], szTeam[ 16 ]; get_user_team( id, szTeam, charsmax( szTeam ) ); iChatFormatMessage( id, iAlive, iTeamMessage, 0, szMessage, charsmax( szMessage ), szColor, charsmax( szColor ) ); if ( giForceSimplePrint > 0 ) { client_print( 0, print_chat, szMessage ); return ICHAT_RETURN; } new iGenCheck = ( giAllTalk && !iTeamMessage ); iChatChangeTeamInfo( id, szColor, iGenCheck ); if ( iGenCheck ) { iChatMessageAll( id, szMessage, szSaid ); } else { iChatMessageRest( id, iAlive, iTeamMessage, szMessage, szSaid ); } iChatChangeTeamInfo( id, szTeam, iGenCheck ); return ICHAT_RETURN; } public iChatMeCommand( id, szSaid[ ], iSaidLen ) { new szMessage[ ICHAT_MAX_MSG_LEN ], szColor[ 16 ], szTeam[ 16 ]; get_user_team( id, szTeam, charsmax( szTeam ) ); replace_all( szSaid, iSaidLen, gszChatFormats[ formatMeCommand ], " " ); trim( szSaid ); iChatFormatMessage( id, ALIVE, 0, 1, szMessage, charsmax( szMessage ), szColor, charsmax( szColor ) ); if ( giForceSimplePrint > 0 ) { client_print( 0, print_chat, szMessage ); } else { iChatChangeTeamInfo( id, szColor, 1 ); iChatMessageAll( id, szMessage, szSaid ); iChatChangeTeamInfo( id, szTeam, 1 ); } } public iChatChangeChatStatus( id, iEnabled ) { if ( iEnabled ) { if ( giForceSimplePrint > 0 ) { client_print( id, print_chat, "[iChat] %L", id, "ICHAT_CHAT_DISABLED_NOC" ); } else { iChatSimplePrint( id, "!g[iChat]!d %L", id, "ICHAT_CHAT_DISABLED" ); } DisableUserChat( id ); } else { EnableUserChat( id ); if ( giForceSimplePrint > 0 ) { client_print( id, print_chat, "[iChat] %L", id, "ICHAT_CHAT_ENABLED_NOC" ); } else { iChatSimplePrint( id, "!g[iChat]!d %L", id, "ICHAT_CHAT_ENABLED" ); } } } public iChatFormatMessage( id, iAlive, iSayTeam, iMeCmd, szMessage[ ], iMessageLen, szColor[ ], iColorLen ) { new szLife[ 16 ], iLife, iTeam; iLife = get_user_health( id ); num_to_str( iLife, szLife, charsmax( szLife ) ); iTeam = get_user_team( id ); if ( iTeam < NONE || iTeam > SPEC ) { iTeam = 0; } if ( iMeCmd ) { copy( szMessage, iMessageLen, gszChatFormats[ formatMeMessage ] ); } else { new iFormatType = ( iSayTeam ? ( ( iAlive || iTeam == TEAM_AA_1 || iTeam == TEAM_AA_2 ) ? formatTeamAlive : formatTeamDead ) : ( ( iAlive || iTeam == TEAM_AA_1 || iTeam == TEAM_AA_2 ) ? formatDefAlive : formatDefDead ) ); new iHasCustom = 0; if ( giUseCustomFormats ) { if ( TrieKeyExists( gtCustomFormatEnabled[ iFormatType ], gszAuthid[ id ] ) ) { TrieGetCell( gtCustomFormatEnabled[ iFormatType ], gszAuthid[ id ], iHasCustom ); } } new iModeFormat = USER; new iCrusher = ( giAdminOverrides ? ADMIN : VIP ); new iCrushed = ( giAdminOverrides ? VIP : ADMIN ); if ( iHasCustom ) { iModeFormat = CUSTOM; } else if ( has_flag( id, gszAccesFlags[ ( iCrusher + 1 ) ] ) || !gszAccesFlags[ ( iCrusher + 1 ) ][ 0 ] ) { iModeFormat = iCrusher; } else if ( has_flag( id, gszAccesFlags[ ( iCrushed + 1 ) ] ) || IsUserVip( id ) || !gszAccesFlags[ ( iCrushed + 1 ) ][ 0 ] ) { iModeFormat = iCrushed; } switch ( iModeFormat ) { case USER: { switch ( iFormatType ) { case formatTeamAlive: copy( szMessage, iMessageLen, gszChatFormats[ formatTeamDefAlive ] ); case formatTeamDead: copy( szMessage, iMessageLen, gszChatFormats[ formatTeamDefDead ] ); case formatDefAlive: copy( szMessage, iMessageLen, gszChatFormats[ formatAllDefAlive ] ); case formatDefDead: copy( szMessage, iMessageLen, gszChatFormats[ formatAllDefDead ] ); } } case ADMIN: { switch ( iFormatType ) { case formatTeamAlive: copy( szMessage, iMessageLen, gszChatFormats[ formatTeamAdminAlive ] ); case formatTeamDead: copy( szMessage, iMessageLen, gszChatFormats[ formatTeamAdminDead ] ); case formatDefAlive: copy( szMessage, iMessageLen, gszChatFormats[ formatAllAdminAlive ] ); case formatDefDead: copy( szMessage, iMessageLen, gszChatFormats[ formatAllAdminDead ] ); } } case VIP: { switch ( iFormatType ) { case formatTeamAlive: copy( szMessage, iMessageLen, gszChatFormats[ formatTeamVIPAlive ] ); case formatTeamDead: copy( szMessage, iMessageLen, gszChatFormats[ formatTeamVIPDead ] ); case formatDefAlive: copy( szMessage, iMessageLen, gszChatFormats[ formatAllVIPAlive ] ); case formatDefDead: copy( szMessage, iMessageLen, gszChatFormats[ formatAllVIPDead ] ); } } case CUSTOM: { TrieGetString( gtCustomFormats[ iFormatType ], gszAuthid[ id ], szMessage, iMessageLen ); } } } new szFormatTemp[ 64 ], iCustomTagsCount; replace_all( szMessage, iMessageLen, "%TEAMTAG%", gszFormatTeamTags[ iTeam ][ iAlive ] ); if ( giUseCustomTags ) { for ( iCustomTagsCount = 0; iCustomTagsCount < MAX_CUSTOM_TAGS; iCustomTagsCount++ ) { formatex( szFormatTemp, charsmax( szFormatTemp ), "#CUSTOM%i#", iCustomTagsCount ); replace_all( szMessage, iMessageLen, szFormatTemp, gszCustomTags[ id ][ iCustomTagsCount ] ); } } if ( giForceSimplePrint <= 0 ) { replace_all( szMessage, iMessageLen, "<default>", "^1" ); replace_all( szMessage, iMessageLen, "<green>", "^4" ); if ( contain( szMessage, "<red>" ) != -1 ) { copy( szColor, iColorLen, "TERRORIST" ); } else if ( contain( szMessage, "<blue>" ) != -1 ) { copy( szColor, iColorLen, "CT" ); } else if ( contain( szMessage, "<grey>" ) != -1 ) { copy( szColor, iColorLen, "SPECTATOR" ); } else { get_user_team( id, szFormatTemp, iColorLen ); copy( szColor, iColorLen, szFormatTemp ); } replace_all( szMessage, iMessageLen, "<team>", "^3" ); replace_all( szMessage, iMessageLen, "<red>", "^3" ); replace_all( szMessage, iMessageLen, "<blue>", "^3" ); replace_all( szMessage, iMessageLen, "<grey>", "^3" ); } replace_all( szMessage, iMessageLen, "%STEAMID%", gszAuthid[ id ] ); replace_all( szMessage, iMessageLen, "%LIFE%", szLife ); replace_all( szMessage, iMessageLen, "%POS%", giLocation ? gszLocation[ id ] : "" ); new szLangOpt[ 16 ]; formatex( szLangOpt, charsmax( szLangOpt ), "ICHAT_TEAM%i", iTeam ); formatex( szFormatTemp, charsmax( szFormatTemp ), "%L", LANG_SERVER, szLangOpt ); replace_all( szMessage, iMessageLen, "%TEAM%", szFormatTemp ); replace_all( szMessage, iMessageLen, "%NAME%", "%s1" ); replace_all( szMessage, iMessageLen, "%MESSAGE%", "%s2" ); } public iChatMessageAll( id, const szMessage[ ], const szSaid[ ] ) // szMessage is safe, generated by OP or plugin. szSaid is unsafe, generated by client { message_begin( MSG_BROADCAST, gMsgSayText, .player = id ); write_byte( id ); write_string( szMessage ); write_string( "" ); write_string( szSaid ); message_end( ); } public iChatMessageRest( id, iAlive, iTeamMessage, const szMessage[ ], const szSaid[ ] ) { new iTeam = get_user_team( id ); new iPlayers[ ICHAT_MAX_PLAYERS ], iNum, tid, iPlayerCounter, iTempAlive, iTempTeam, iTeamCheck, iRadiusCheck, iCanSeeCheck, iSupercedeCheck; get_players( iPlayers, iNum ); for ( iPlayerCounter = 0; iPlayerCounter < iNum; iPlayerCounter++ ) { tid = iPlayers[ iPlayerCounter ]; if ( !( iSupercedeCheck = ( id == tid ) ) ) { iTempAlive = is_user_alive( tid ); if ( iTeamMessage ) { iTempTeam = get_user_team( tid ); } iTeamCheck = ( !iTeamMessage || ( iTeam == iTempTeam ) ); iRadiusCheck = iChatIsInRadius( id, tid, iTeamMessage, iAlive, iTempAlive ); iCanSeeCheck = ( ( has_flag( tid, gszAccesFlags[ FLAG_SEE_CHAT ] ) || !gszAccesFlags[ FLAG_SEE_CHAT ][ 0 ] ) && IsUserChatEnabled( tid ) ); } if ( ( iSupercedeCheck ) || ( ( ( ( giAllTalk || ( iAlive && iTempAlive ) ) || ( !iAlive && !iTempAlive ) ) && iTeamCheck && iRadiusCheck && iCanSeeCheck ) || ( giAdminsSpy && ( has_flag( tid, gszAccesFlags[ FLAG_SPY ] ) || !gszAccesFlags[ FLAG_SPY ][ 0 ] ) ) || ( is_user_hltv( tid ) ) ) ) { message_begin( MSG_ONE, gMsgSayText, .player = tid ); write_byte( id ); write_string( szMessage ); write_string( "" ); write_string( szSaid ); message_end( ); } } } public iChatIsInRadius( iSender, iReceiver, iTeamMessage, iSenderAlive, iReceiverAlive ) { new Float:flSenderOrigin[ 3 ], Float:flRecieverOrigin[ 3 ], Float:flDistance, Float:flMaxRadius; pev( iSender, pev_origin, flSenderOrigin ); pev( iReceiver, pev_origin, flRecieverOrigin ); flDistance = get_distance_f( flSenderOrigin, flRecieverOrigin ); if ( iTeamMessage ) { flMaxRadius = gFlPrintRadiusTeam; } else { flMaxRadius = gFlPrintRadiusAll; } if ( flDistance <= flMaxRadius || flMaxRadius <= 0 || !iSenderAlive || !iReceiverAlive ) { return 1; } return 0; } public eventLocation( id ) { giLocation = 1; if ( read_data( 1 ) == id ) { read_data( 2, gszLocation[ id ], charsmax( gszLocation[ ] ) ); } } public client_putinserver( id ) { if ( giUserNotify ) { set_task( NOTIFY_TASK_TIME, "iChatNotify", id + TASK_NOTIFY ); } get_user_authid( id, gszAuthid[ id ], charsmax( gszAuthid[ ] ) ); SetUserFirstSpawn( id ); EnableUserChat( id ); } public plugin_end( ) { new iFormatType; for ( iFormatType = 0; iFormatType < formatTypesMax; iFormatType++ ) { TrieDestroy( gtCustomFormats[ iFormatType ] ); TrieDestroy( gtCustomFormatEnabled[ iFormatType ] ); } } public hamPlayerSpawnPost( id ) { if ( giUseCustomColor && is_user_connected( id ) && !is_user_bot( id ) && IsFirstSpawn( id ) ) { iChatAskChangeCvar( id ); } ClearUserFirstSpawn( id ); } public iChatAskChangeCvar( id ) { new szMenuFormat[ 164 ], iLen = charsmax( szMenuFormat ); formatex( szMenuFormat, iLen, "%L", id, "ICHAT_MENU_TITLE", giRed, giGreen, giBlue ); new iAskMenu = menu_create( szMenuFormat, "iChatAskMenuHandler" ); new szMenuAction[ 16 ]; formatex( szMenuAction, charsmax( szMenuAction ), "ICHAT_MENU_ACTION%i", giPunishment ); formatex( szMenuFormat, iLen, "%L %L", id, "ICHAT_MENU_NO", id, szMenuAction ); menu_additem( iAskMenu, szMenuFormat ); formatex( szMenuFormat, iLen, "%L", id, "ICHAT_MENU_YES" ); menu_additem( iAskMenu, szMenuFormat ); menu_setprop( iAskMenu, MPROP_EXIT, MEXIT_NEVER ); menu_display( id, iAskMenu ); } public iChatAskMenuHandler( id, iMenu, iItem ) { if ( iItem == 1 ) { client_cmd( id, "con_color ^"%i %i %i^"", giRed, giGreen, giBlue ); } else if ( giPunishment ) { server_cmd( "kick #%d ^"%L^"", get_user_userid( id ), id, "ICHAT_KICK_REASON" ); } menu_destroy( iMenu ); } public iChatIsChatValid( const szChat[ ] ) { new cChar, iCharCounter; while ( ( cChar = szChat[ iCharCounter++ ] ) != EOS ) { if ( cChar != ' ' ) { return 1; } } return 0; } public iChatSendToHLSW( id, const szSaid[ ], iTeamMessage ) { new szName[ 32 ], szTeam[ 10 ]; get_user_name( id, szName, charsmax( szName ) ); get_user_team( id, szTeam, charsmax( szTeam ) ); if( szTeam[ 0 ] == 'U' ) { szTeam[ 0 ] = EOS; } log_message( "^"%s<%d><%s><%s>^" %s ^"%s^"%s", szName, get_user_userid( id ), gszAuthid[ id ], szTeam, ( iTeamMessage ? "say_team" : "say" ), szSaid, is_user_alive( id ) ? "" : " (dead)" ); } public iChatChangeTeamInfo( id, const szColor[ ], iToAll ) { message_begin( ( iToAll ? MSG_BROADCAST : MSG_ONE_UNRELIABLE ), gMsgTeamInfo, .player = id ); write_byte( id ); write_string( szColor ); message_end( ); } public messageSayText( iMsgId, iMsgDest, iMsgEntity ) { if ( giRemoveNameChanged ) { new szMessage[ 196 ]; get_msg_arg_string( 2, szMessage, charsmax( szMessage ) ); if ( equal( szMessage, "#Cstrike_Name_Change" ) ) { return PLUGIN_HANDLED; } } return PLUGIN_CONTINUE; } public iChatNotify( id ) { id -= TASK_NOTIFY; if ( giForceSimplePrint > 0 ) { client_print( id, print_chat, "[iChat] Ez a szerver iChatet hasznal, fejlesztoje Kidev. Letoltesi link a konzolban." ); } else { iChatSimplePrint( id, "!g[iChat]!d a szerver iChatet hasznal !tiChat!d fejlesztoje !tKidev!d. Letoltesi link a konzolban." ); } if ( giMustBeUpdated && ( has_flag( id, gszAccesFlags[ FLAG_RELOAD ] ) || !gszAccesFlags[ FLAG_RELOAD ][ 0 ] ) ) { client_print( id, print_chat, "[iChat] FIGYELEM! iChat elavult! Ajanlott frissiteni!" ); } client_print( id, print_console, "[iChat] Toltsd le az 'iChat'-et 'https://forums.alliedmods.net/showthread.php?t=173113'." ); client_print( id, print_console, "[iChat] Vagy githubon 'https://github.com/Kidev/iChat'" ); } public iChatSimplePrint( id, const szMessage[ ], any:... ) // Do not use if clients are able to modify anything in the string passed ! { new szBuffer[ 512 ]; vformat( szBuffer, charsmax( szBuffer ), szMessage, 3 ); replace_all( szBuffer, charsmax( szBuffer ), "!d", "^1" ); replace_all( szBuffer, charsmax( szBuffer ), "!t", "^3" ); replace_all( szBuffer, charsmax( szBuffer ), "!g", "^4" ); message_begin( MSG_ONE, gMsgSayText, .player = id ); write_byte( id ); write_string( szBuffer ); write_string( "" ); write_string( "" ); message_end( ); } #if defined USE_TEAM_FIX public eventTeamInfoAll( ) { new id = read_data( TeamInfo_PlayerID ); if ( !is_user_alive( id ) && is_user_connected( id ) ) { new iTeam = get_pdata_int( id, m_iTeam, XO_PLAYER ); if ( iTeam != get_user_team( id ) ) { emessage_begin( MSG_BROADCAST, gMsgScoreInfo ); ewrite_byte( id ); ewrite_short( get_user_frags( id ) ); ewrite_short( get_pdata_int( id, m_iDeaths, XO_PLAYER ) ); ewrite_short( 0 ); ewrite_short( iTeam ); emessage_end( ); } } } #endif public iChatSendCustomData( iPlugin, iParams ) { new iTagIndex = get_param( 2 ); new szData[ MAX_CUSTOM_TAGS_SIZE ]; get_string( 3, szData, charsmax( szData ) ); copy( gszCustomTags[ get_param( 1 ) ][ ( ( iTagIndex < 0 || iTagIndex >= MAX_CUSTOM_TAGS ) ? 0 : iTagIndex ) ], charsmax( gszCustomTags[ ][ ] ), szData ); } public iChatVipAction( iPlugin, iParams ) { new id = get_param( 1 ); switch ( get_param( 2 ) ) { case 0: return IsUserVip( id ); case 1: return SetUserVip( id ); case 2: return ClearUserVip( id ); } return -1; }
|
|