rxki
Пользователь
- Регистрация
- 5 Янв 2019
- Сообщения
- 208
- Симпатии
- 5
- Пол
- Мужской
- OS
- Linux
- Amx Mod X
- ReAMXX 1.8.3
- Билд
- [code=cpp]3.4.0.668-dev[/code]
- ReGamedll
- [code=cpp] 5.7.0.314-dev[/code]
- Metamod
- [code=cpp] 1.21p37[/code]
- Meta модули
-
Код:
Спойлер: meta list C++: [ 1] AMX Mod X RUN - amxmodx_mm_i386. v1.9.0.5 ini Start ANY [ 2] Reunion RUN - reunion_mm_i386. v0.1.0.9 ini Start Never [ 3] WHBlocker RUN - whblocker_mm_i38 v1.5.696 ini Chlvl ANY [ 4] hackdetector RUN - hackdetector_amx v0.15.32 ini ANY ANY [ 5] SoftBlocker RUN - softblocker_mm_i v1.1g ini ANY Never [ 6] ReSemiclip RUN - resemiclip_mm_i3 v2.3.9 ini Chlvl ANY [ 7] ReFreeLook RUN - refreelook_amxx_ v1.3 ini ANY ANY [ 8] VoiceTranscoder RUN - VoiceTranscoder. v2017RC3 ini ANY ANY [ 9] MySQL RUN - mysql_amxx_i386. v1.9.0.5 pl1 ANY ANY [10] Fun RUN - fun_amxx_i386.so v1.9.0.5 pl1 ANY ANY [11] FakeMeta RUN - fakemeta_amxx_i3 v1.9.0.5 pl1 ANY ANY [12] Ham Sandwich RUN - hamsandwich_amxx v1.9.0.5 pl1 ANY ANY [13] ReAPI RUN - reapi_amxx_i386. v5.9.0.1 pl1 ANY Never [14] CStrike RUN - cstrike_amxx_i38 v1.9.0.5 pl1 ANY ANY [15] CSX RUN - csx_amxx_i386.so v1.9.0.5 pl1 ANY ANY [16] Engine RUN - engine_amxx_i386 v1.9.0.5 pl1 ANY ANY
- Плагины
-
Код:
Спойлер: plugins C++: [ 1] AMXBans: Core Gm 1.6 Larte Team amxbans_core.am running [ 2] FreshBan 1.0.5b kanagava fresh_bans.amxx running [ 3] DopBan 3.0.3b kanagava dop_ban.amxx running [ 4] Ultimate Chats Control 5.2(c) neygomon ucc.amxx running [ 5] Admin Commands 1.9.0.5247 AMXX Dev Team admincmd.amxx running [ 6] Slots Reservation 1.9.0.5247 AMXX Dev Team adminslots.amxx running [ 7] Menus Front-End 1.9.0.5247 AMXX Dev Team menufront.amxx running [ 8] Commands Menu 1.9.0.5247 AMXX Dev Team cmdmenu.amxx running [ 9] Players Menu 1.9.0.5247 AMXX Dev Team plmenu.amxx running [ 10] Maps Menu 1.9.0.5247 AMXX Dev Team mapsmenu.amxx running [ 11] Plugin Menu 1.9.0.5247 AMXX Dev Team pluginmenu.amxx running [ 12] Admin Chat 1.9.0.5247 AMXX Dev Team adminchat.amxx running [ 13] Anti Flood 1.9.0.5247 AMXX Dev Team antiflood.amxx running [ 14] Admin Votes 1.9.0.5247 AMXX Dev Team adminvote.amxx running [ 15] Pause Plugins 1.9.0.5247 AMXX Dev Team pausecfg.amxx running [ 16] Stats Configuration 1.9.0.5247 AMXX Dev Team statscfg.amxx running [ 17] gameME Plugin 2.4[v4.5.4 TTS Oetzel & Goe gameme_cstrike. running [ 18] PlrMdls 1.0 rxki plr_mdls.amxx running [ 19] VIP:Easy 1.0 rxki vip_easy.amxx running [ 20] Reset Score 1.0 Silenttt resetscore.amxx running [ 21] AWP Control 1.4.3 PAffAEJIkA :3 awp_limit.amxx running
- Amxx Модули
-
Код:
Спойлер: modules C++: MySQL 1.9.0.5247 AMX Mod X Dev Team running Fun 1.9.0.5247 AMX Mod X Dev Team running FakeMeta 1.9.0.5247 AMX Mod X Dev Team running nVault 1.9.0.5247 AMX Mod X Dev Team running Ham Sandwich 1.9.0.5247 AMX Mod X Dev Team running ReAPI 5.9.0.167- Asmodai & s1lent running CStrike 1.9.0.5247 AMX Mod X Dev Team running CSX 1.9.0.5247 AMX Mod X Dev Team running Engine 1.9.0.5247 AMX Mod X Dev Team running Sockets 1.9.0.5247 AMX Mod X Dev Team running
- Ошибка
-
Код:
C++: [AMXX] Run time error 10 (plugin "ucc.amxx") (native "RegisterHookChain")
- Исходник
-
Код:
Спойлер: sma #include <amxmodx> #include <amxmisc> #include <sqlx> #include <reapi> //#define CSX_EASY_STATS // use only with CSX Easy Stats plugin!!! const MYSQL_TIMEOUT = 2; const REASON_LENGTH = 64; const GAG_MENU_ITEMS = 5; const MUTE_MENU_ITEMS = 6; enum natives_return { RETURN_ERR = 0, RETURN_OK }; enum chats_by_stats { DISABLE = -1, CSX, CSSTATS_MYSQL, CSSTATSX_SQL, AES #if defined CSX_EASY_STATS , CSXES_GAMETIME #endif }; enum block_types { NONE = -2, STATS, TEXT_CHAT, VOICE_CHAT, ALL_CHATS }; enum _:menu_settings { SELECTED_TIME, SELECTED_REASON, SELECTED_TYPE, CURRENT_POS }; enum _:block_data { EXPIRED, REASON[REASON_LENGTH], ADMIN_STEAMID[MAX_AUTHID_LENGTH], block_types:GAG_BLOCK_TYPE }; enum _:cvars { MYSQL_HOST, MYSQL_USER, MYSQL_PASS, MYSQL_DBNAME, MYSQL_CLEAR_EXPIRED, SAY_SORRY, SAY_MUTE, chats_by_stats:CHATS_BY_STATS, BLOCK_INFO, block_typesEFAULT_BLOCK, MIN_ALLOW_VAL, GAG_ACCESS, SUPER_ACCESS, C_BY_S_IMMUNITY }; new Trie:g_tAllowCmds; new Array:g_arrGagTimes, Array:g_arrBlockTypes, Array:g_arrReasons new Handle:g_hTuple, g_thData[3]; new g_PlayerData[MAX_PLAYERS + 1][block_data], g_PlayerMute[MAX_PLAYERS + 1][MAX_PLAYERS + 1], g_arrPlayers[MAX_PLAYERS + 1][MAX_PLAYERS], g_MenuData[MAX_PLAYERS + 1][menu_settings], g_iFragStats[MAX_PLAYERS + 1]; new g_szAesLevelName[64]; new g_Cvar[cvars]; new pCvar1, // mysql host pCvar2, // mysql user pCvar3, // mysql pass pCvar4, // mysql db pCvar5, // mysql expired period pCvar6, // gag access pCvar7, // super access pCvar8; // immunity #define is_blocked_text_chat(%0) (g_PlayerData[%0][GAG_BLOCK_TYPE] == STATS || g_PlayerData[%0][GAG_BLOCK_TYPE] == TEXT_CHAT || g_PlayerData[%0][GAG_BLOCK_TYPE] == ALL_CHATS) #define is_blocked_voice_chat(%0) (g_PlayerData[%0][GAG_BLOCK_TYPE] == STATS || g_PlayerData[%0][GAG_BLOCK_TYPE] == VOICE_CHAT || g_PlayerData[%0][GAG_BLOCK_TYPE] == ALL_CHATS) native get_user_stats(index, st[8], bh[8]); native csstats_get_user_stats(index, st[22]); native get_user_stats_sql(index, st[8], bh[8]); native aes_get_player_level(index); native aes_get_level_name(index, name[], len, lang); public plugin_natives() { register_library("Ultimate Chats Controller"); register_native("ucc_is_client_gaged", "native_ucc_is_client_gaged"); register_native("ucc_set_client_gag", "native_ucc_set_client_gag"); register_native("ucc_is_client_muted", "native_ucc_is_client_muted"); register_native("ucc_set_client_muted", "native_ucc_set_client_muted"); set_native_filter("native_filter"); } public native_filter(const name[], index, trap) return trap ? PLUGIN_CONTINUE : PLUGIN_HANDLED; public plugin_init() { #define PNAME "Ultimate Chats Controller" #define VERSION "5.2(c)" #define AUTHOR "neygomon" register_plugin(PNAME, VERSION, AUTHOR); register_dictionary("ucc.txt"); create_cvar("ucc_version", VERSION, .flags = FCVAR_SERVER, .description = "Plugin version. Don't edit, please "); pCvar1 = create_cvar( "ucc_mysql_host", "127.0.0.1", .flags = FCVAR_PROTECTED, .description = fmt("%l", "DESC_MYSQL_HOST") ); pCvar2 = create_cvar( "ucc_mysql_user", "root", .flags = FCVAR_PROTECTED, .description = fmt("%l", "DESC_MYSQL_USER") ); pCvar3 = create_cvar( "ucc_mysql_pass", "", .flags = FCVAR_PROTECTED, .description = fmt("%l", "DESC_MYSQL_PASS") ); pCvar4 = create_cvar( "ucc_mysql_dbname", "dbname", .flags = FCVAR_PROTECTED, .description = fmt("%l", "DESC_MYSQL_DBNAME") ); pCvar5 = create_cvar( "ucc_mysql_clear_expired", "30", .description = fmt("%l", "DESC_MYSQL_CLEAR_EXPIRED"), .has_min = true, .min_val = 0.0 ); pCvar6 = create_cvar( "ucc_gag_access", "d", .description = fmt("%l", "DESC_GAG_ACCESS") ); pCvar7 = create_cvar( "ucc_superadmin_access", "l", .description = fmt("%l", "DESC_SUPER_ACCESS") ); pCvar8 = create_cvar( "ucc_chats_by_stats_immunity", "u", .description = fmt("%l", "DESC_C_BY_S_IMMUNITY") ); bind_pcvar_num( create_cvar( "ucc_say_sorry", "15", .description = fmt("%l", "DESC_SAY_SORRY"), .has_min = true, .min_val = 0.0 ), g_Cvar[SAY_SORRY] ); bind_pcvar_num( create_cvar( "ucc_say_mute", "1", .description = fmt("%l", "DESC_SAY_MUTE"), .has_min = true, .has_max = true, .min_val = 0.0, .max_val = 1.0 ), g_Cvar[SAY_MUTE] ); bind_pcvar_num( create_cvar( "ucc_chats_by_stats", "0", .description = fmt("%l", "DESC_CHATS_BY_STATS"), .has_min = true, .has_max = true, .min_val = -1.0, .max_val = 4.0 ), g_Cvar[CHATS_BY_STATS] ); bind_pcvar_num( create_cvar( "ucc_block_info", "1", .description = fmt("%l", "DESC_BLOCK_INFO"), .has_min = true, .has_max = true, .min_val = 0.0, .max_val = 1.0 ), g_Cvar[BLOCK_INFO] ); bind_pcvar_num( create_cvar( "ucc_default_block", "1", .description = fmt("%l", "DESC_DEFAULT_BLOCK"), .has_min = true, .has_max = true, .min_val = 0.0, .max_val = 2.0 ), g_Cvar[DEFAULT_BLOCK] ); bind_pcvar_num( create_cvar( "ucc_min_allow_value", "1", .description = fmt("%l", "DESC_MIN_ALLOW_VAL"), .has_min = true, .min_val = 0.0 ), g_Cvar[MIN_ALLOW_VAL] ); AutoExecConfig(.autoCreate = true, .name = "ucc"); if(SQL__Connect()) { Get_Flags(); Get_ArrayCvars(); Reg_Commands(); if(g_Cvar[CHATS_BY_STATS] == AES && g_Cvar[BLOCK_INFO]) set_task_ex(1.0, "get_allow_level"); register_menucmd(register_menuid("UCC GagMenu"), 1023, "GagMenuHandler"); register_menucmd(register_menuid("UCC MuteMenu"), 1023, "MuteMenuHandler"); set_task_ex(60.0, "CheckBlockedUsers", .flags = SetTask_Repeat); } } public plugin_end() { SQL_FreeHandle(g_hTuple); TrieDestroy(g_tAllowCmds); ArrayDestroy(g_arrGagTimes); ArrayDestroy(g_arrBlockTypes); ArrayDestroy(g_arrReasons); } public client_putinserver(id) { if(is_user_bot(id) || is_user_hltv(id)) return; arrayset(g_PlayerMute[id], 0, sizeof g_PlayerMute[]); g_PlayerData[id][EXPIRED] = -1; g_PlayerData[id][REASON][0] = EOS; g_PlayerData[id][ADMIN_STEAMID][0] = EOS; g_PlayerData[id][GAG_BLOCK_TYPE] = NONE; if(g_Cvar[CHATS_BY_STATS] > DISABLE) { if(!get_chats_access(id)) set_user_block(id, STATS); } new szIP[MAX_IP_LENGTH], szAuth[MAX_AUTHID_LENGTH]; get_user_ip(id, szIP, charsmax(szIP), true); get_user_authid(id, szAuth, charsmax(szAuth)); g_thData[0] = id; SQL_ThreadQuery( g_hTuple, "SQL_ThreadHandler_LoadPlayer", fmt("SELECT `expired_time`, `reason`, `admin_steamid`, `block_type` FROM `ucc_gag` WHERE (`ip` = '%s' OR `steamid` = '%s') AND (`expired_time` = '0' OR `expired_time` > '%d')", szIP, szAuth, get_systime()), g_thData, sizeof(g_thData) ); } /* HookChain Handlers */ public CBasePlayer_Spawn_Post(const id) { if(!is_user_connected(id)) return; if(g_PlayerData[id][GAG_BLOCK_TYPE] != STATS) return; if(get_chats_access(id)) { VTC_UnmuteClient(id); g_PlayerData[id][GAG_BLOCK_TYPE] = NONE; } else if(g_Cvar[BLOCK_INFO]) { custom_color_chat(id, 0, "%l %l", "MSG_PREFIX", "MSG_BLOCK_CHATS0"); switch(g_Cvar[CHATS_BY_STATS]) { case AES: custom_color_chat(id, 0, "%l %l", "MSG_PREFIX", "MSG_BLOCK_CHATS2", g_szAesLevelName); #if defined CSX_EASY_STATS case CSXES_GAMETIME: custom_color_chat(id, 0, "%l %l", "MSG_PREFIX", "MSG_BLOCK_CHATS4", g_Cvar[MIN_ALLOW_VAL]); #endif default: custom_color_chat(id, 0, "%l %l", "MSG_PREFIX", "MSG_BLOCK_CHATS3", g_iFragStats[id], g_Cvar[MIN_ALLOW_VAL]); } } } public CanPlayerHearPlayer_Pre(const iReciever, const iSender) { if(iSender != iReciever) { if(g_PlayerMute[iReciever][iSender]) { SetHookChainReturn(ATYPE_INTEGER, false); return HC_SUPERCEDE; } } return HC_CONTINUE; } /* srvcmd_Flush */ public srvcmd_Flush() { SQL_ThreadQuery(g_hTuple, "SQL_ThreadHandler_Truncate", "TRUNCATE `ucc_gag`"); for(new id; id < sizeof g_PlayerData; ++id) { if(g_PlayerData[id][EXPIRED] >= 0 && is_user_connected(id)) VTC_UnmuteClient(id); g_PlayerData[id][EXPIRED] = -1; g_PlayerData[id][REASON][0] = EOS; g_PlayerData[id][ADMIN_STEAMID][0]= EOS; g_PlayerData[id][GAG_BLOCK_TYPE] = NONE; } log_amx("%s [v: %s][a: %s] flushed all gags", PNAME, VERSION, AUTHOR); } /* clcmd_SaySorry */ public clcmd_SaySorry(id) { if(is_blocked_text_chat(id)) { static iFloodTime[MAX_PLAYERS + 1], systime; if(iFloodTime[id] > (systime = get_systime())) custom_color_chat(id, 0, "%l %l", "MSG_PREFIX", "MSG_SORRY_FLOOD", iFloodTime[id] - systime); else { new szName[MAX_NAME_LENGTH]; get_user_name(id, szName, charsmax(szName)); new players[MAX_PLAYERS], pnum; get_players_ex(players, pnum, GetPlayers_ExcludeBots|GetPlayers_ExcludeHLTV); for(new i, admin, flags, auth[MAX_AUTHID_LENGTH]; i < pnum; ++i) { admin = players; flags = get_user_flags(admin); if(flags & g_Cvar[SUPER_ACCESS]) custom_color_chat(admin, 0, "%l %l", "MSG_PREFIX", "MSG_SORRY_ADMIN", szName, g_PlayerData[id][REASON]); else if(flags & g_Cvar[GAG_ACCESS]) { if(strcmp(g_PlayerData[id][ADMIN_STEAMID], auth) == 0) custom_color_chat(admin, 0, "%l %l", "MSG_PREFIX", "MSG_SORRY_ADMIN", szName, g_PlayerData[id][REASON]); } } iFloodTime[id] = systime + g_Cvar[SAY_SORRY]; } } return PLUGIN_HANDLED; } /* clcmd_SayChat */ public clcmd_SayChat(id) { if(!is_blocked_text_chat(id)) return PLUGIN_CONTINUE; new szMessage[64]; read_args(szMessage, charsmax(szMessage)); remove_quotes(szMessage); if(TrieKeyExists(g_tAllowCmds, szMessage)) return PLUGIN_CONTINUE; else if(g_PlayerData[id][GAG_BLOCK_TYPE] == STATS) { if(g_Cvar[BLOCK_INFO]) { custom_color_chat(id, 0, "%l %l", "MSG_PREFIX", "MSG_BLOCK_CHATS0"); switch(g_Cvar[CHATS_BY_STATS]) { case AES: custom_color_chat(id, 0, "%l %l", "MSG_PREFIX", "MSG_BLOCK_CHATS2", g_szAesLevelName); #if defined CSX_EASY_STATS case CSXES_GAMETIME: custom_color_chat(id, 0, "%l %l", "MSG_PREFIX", "MSG_BLOCK_CHATS4", g_Cvar[MIN_ALLOW_VAL]); #endif default: custom_color_chat(id, 0, "%l %l", "MSG_PREFIX", "MSG_BLOCK_CHATS3", g_iFragStats[id], g_Cvar[MIN_ALLOW_VAL]); } } } else { new szName[MAX_NAME_LENGTH], ost; get_user_name(id, szName, charsmax(szName)); custom_color_chat(id, 0, "%l %l", "MSG_PREFIX", "MSG_CHAT_IS_BLOCKED", szName, g_PlayerData[id][REASON]); if(g_PlayerData[id][EXPIRED] > 0) { if((ost = g_PlayerData[id][EXPIRED] - get_systime()) / 60 > 0) custom_color_chat(id, 0, "%l %l", "MSG_PREFIX", "MSG_BLOCK_EXPIRED_TIME", ost / 60); else custom_color_chat(id, 0, "%l %l", "MSG_PREFIX", "MSG_BLOCK_EXPIRED"); } else custom_color_chat(id, 0, "%l %l", "MSG_PREFIX", "MSG_SAY_SORRY"); } return PLUGIN_HANDLED; } /* clcmd_GagMenu */ public clcmd_GagMenu(id) { if(get_user_flags(id) & g_Cvar[GAG_ACCESS]) { g_MenuData[id][SELECTED_TIME] = 0; g_MenuData[id][SELECTED_TYPE] = any:g_Cvar[DEFAULT_BLOCK]; g_MenuData[id][CURRENT_POS] = 0; Show_GagMenu(id, 0); } return PLUGIN_HANDLED; } /* clcmd_MuteMenu */ public clcmd_MuteMenu(id) { g_MenuData[id][CURRENT_POS] = 0; Show_MuteMenu(id, 0); return PLUGIN_HANDLED; } /* MySQL handlers */ public SQL_ThreadHandler_Init(failstate, Handle:query, err[], errcode) { if(failstate != TQUERY_SUCCESS) log_amx("MySQL INIT is FAILED... [#%d] %s", errcode, err); return PLUGIN_CONTINUE; } public SQL_ThreadHandler_LoadPlayer(failstate, Handle:query, err[], errcode, data[], datasize) { if(failstate == TQUERY_SUCCESS) { if(SQL_NumResults(query)) { new id = data[0]; g_PlayerData[id][EXPIRED] = SQL_ReadResult(query, 0); g_PlayerData[id][GAG_BLOCK_TYPE] = any:SQL_ReadResult(query, 3); SQL_ReadResult(query, 1, g_PlayerData[id][REASON], charsmax(g_PlayerData[][REASON])); SQL_ReadResult(query, 2, g_PlayerData[id][ADMIN_STEAMID], charsmax(g_PlayerData[][ADMIN_STEAMID])); set_user_block(id, g_PlayerData[id][GAG_BLOCK_TYPE]); } } else log_amx("MySQL LoadPlayer is FAILED... [#%d] %s", errcode, err); return PLUGIN_CONTINUE; } public SQL_ThreadHandler_BlockPlayer(failstate, Handle:query, err[], errcode) { if(failstate != TQUERY_SUCCESS) log_amx("MySQL BLOCK is FAILED... [#%d] %s", errcode, err); return PLUGIN_CONTINUE; } public SQL_ThreadHandler_UnblockPlayer(failstate, Handle:query, err[], errcode) { if(failstate != TQUERY_SUCCESS) log_amx("MySQL UNBLOCK is FAILED... [#%d] %s", errcode, err); return PLUGIN_CONTINUE; } public SQL_ThreadHandler_Truncate(failstate, Handle:query, err[], errcode) { if(failstate != TQUERY_SUCCESS) log_amx("MySQL FLUSH is FAILED... [#%d] %s", errcode, err); return PLUGIN_CONTINUE; } /* Tasks handlers */ public get_allow_level() aes_get_level_name(g_Cvar[MIN_ALLOW_VAL], g_szAesLevelName, charsmax(g_szAesLevelName), LANG_SERVER); public CheckBlockedUsers() { new players[MAX_PLAYERS], pnum; get_players_ex(players, pnum); for(new i, id, sys = get_systime(); i < pnum; ++i) { id = players; if(g_PlayerData[id][EXPIRED] > 0) { if(sys > g_PlayerData[id][EXPIRED]) user_unblock(id); } } } /* Menu Handlers */ public GagMenuHandler(id, iKey) { switch(iKey) { case 5: { if(++g_MenuData[id][SELECTED_TIME] > ArraySize(g_arrGagTimes)-1) g_MenuData[id][SELECTED_TIME] = 0; Show_GagMenu(id, g_MenuData[id][CURRENT_POS]); } case 6: { if(++g_MenuData[id][SELECTED_TYPE] > ArraySize(g_arrBlockTypes)-1) g_MenuData[id][SELECTED_TYPE] = 0; Show_GagMenu(id, g_MenuData[id][CURRENT_POS]); } case 7: { if(++g_MenuData[id][SELECTED_REASON] > ArraySize(g_arrReasons)-1) g_MenuData[id][SELECTED_REASON] = 0; Show_GagMenu(id, g_MenuData[id][CURRENT_POS]); } case 8: Show_GagMenu(id, ++g_MenuData[id][CURRENT_POS]); case 9: { if(g_MenuData[id][CURRENT_POS]) Show_GagMenu(id, --g_MenuData[id][CURRENT_POS]); } default: { new player = g_arrPlayers[id][g_MenuData[id][CURRENT_POS] * GAG_MENU_ITEMS + iKey]; if(!is_user_connected(player)) { Show_GagMenu(id, g_MenuData[id][CURRENT_POS]); return PLUGIN_HANDLED; } new szAdminName[MAX_NAME_LENGTH], szPlayerName[MAX_NAME_LENGTH]; get_user_name(id, szAdminName, charsmax(szAdminName)); get_user_name(player, szPlayerName, charsmax(szPlayerName)); if(g_PlayerData[player][GAG_BLOCK_TYPE] > STATS) { user_unblock(player); custom_color_chat(0, player, "%l %l", "MSG_PREFIX", "MSG_CHAT_UNBLOCK_ALL", szPlayerName, szAdminName); custom_color_chat(player, 0, "%l %l", "MSG_PREFIX", "MSG_CHAT_UNBLOCK_PL", szPlayerName, szAdminName); } else { new blocktime = ArrayGetCell(g_arrGagTimes, g_MenuData[id][SELECTED_TIME]), block_types:block_type = any:g_MenuData[id][SELECTED_TYPE], blockreason[REASON_LENGTH]; ArrayGetString(g_arrReasons, g_MenuData[id][SELECTED_REASON], blockreason, charsmax(blockreason)); user_block(player, id, blocktime, blockreason, block_type); new blocktimeinfo[32]; if(!blocktime) formatex(blocktimeinfo, charsmax(blocktimeinfo), "навсегда"); else formatex(blocktimeinfo, charsmax(blocktimeinfo), "Р Р…Р В° %d Р СРёРЅСѓС‚", blocktime); switch(block_type) { case TEXT_CHAT: { custom_color_chat(0, player, "%l %l", "MSG_PREFIX", "MSG_TEXTCHAT_BLOCK_ALL", szAdminName, szPlayerName, blocktimeinfo, blockreason); custom_color_chat(player, 0, "%l %l", "MSG_PREFIX", "MSG_TEXTCHAT_BLOCK_PL", szPlayerName, szAdminName, blocktimeinfo, blockreason); } case VOICE_CHAT: { custom_color_chat(0, player, "%l %l", "MSG_PREFIX", "MSG_VOICECHAT_BLOCK_ALL", szAdminName, szPlayerName, blocktimeinfo, blockreason); custom_color_chat(player, 0, "%l %l", "MSG_PREFIX", "MSG_VOICECHAT_BLOCK_PL", szPlayerName, szAdminName, blocktimeinfo, blockreason); } case ALL_CHATS: { custom_color_chat(0, player, "%l %l", "MSG_PREFIX", "MSG_ALLCHATS_BLOCK_ALL", szAdminName, szPlayerName, blocktimeinfo, blockreason); custom_color_chat(player, 0, "%l %l", "MSG_PREFIX", "MSG_ALLCHATS_BLOCK_PL", szPlayerName, szAdminName, blocktimeinfo, blockreason); } } } Show_GagMenu(id, g_MenuData[id][CURRENT_POS]); } } return PLUGIN_HANDLED; } public MuteMenuHandler(id, iKey) { switch(iKey) { case 6: { arrayset(g_PlayerMute[id], 1, sizeof g_PlayerMute[]); custom_color_chat(id, 0, "%l %l", "MSG_PREFIX", "MSG_MUTE_ALL_PLAYERS"); } case 7: { arrayset(g_PlayerMute[id], 0, sizeof g_PlayerMute[]); custom_color_chat(id, 0, "%l %l", "MSG_PREFIX", "MSG_UNMUTE_ALL_PLAYERS"); } case 8: Show_MuteMenu(id, ++g_MenuData[id][CURRENT_POS]); case 9: { if(g_MenuData[id][CURRENT_POS]) Show_MuteMenu(id, --g_MenuData[id][CURRENT_POS]); } default: { new player = g_arrPlayers[id][g_MenuData[id][CURRENT_POS] * MUTE_MENU_ITEMS + iKey]; if(!is_user_connected(player)) { Show_MuteMenu(id, g_MenuData[id][CURRENT_POS]); return PLUGIN_HANDLED; } new szName[MAX_NAME_LENGTH]; get_user_name(player, szName, charsmax(szName)); g_PlayerMute[id][player] = !g_PlayerMute[id][player]; custom_color_chat(id, 0, "%l %l", "MSG_PREFIX", g_PlayerMute[id][player] ? "MSG_MUTE_PLAYER" : "MSG_UNMUTE_PLAYER", szName); Show_MuteMenu(id, g_MenuData[id][CURRENT_POS]); } } return PLUGIN_HANDLED; } /* Plugin API */ public native_ucc_is_client_gaged(plugin, params) { enum { index = 1, exp_time, gag_reason, gag_type }; new id = get_param(index); if(is_user_connected(id)) { set_param_byref(exp_time, g_PlayerData[id][EXPIRED]); set_string(gag_reason, g_PlayerData[id][REASON], charsmax(g_PlayerData[][REASON])); if(params > 3) set_param_byref(gag_type, any:g_PlayerData[id][GAG_BLOCK_TYPE]); return (g_PlayerData[id][GAG_BLOCK_TYPE] > NONE); } log_error(AMX_ERR_NATIVE, "Client %d not connected or index out of range!", id); return RETURN_ERR; } public native_ucc_set_client_gag(plugin, params) { enum { index = 1, admin_id, block_time, gag_reason, gag_type }; new id = get_param(index); new admin = get_param(admin_id); new type = (params > 4) ? get_param(gag_type) : any:ALL_CHATS; if(!is_user_connected(id)) { log_error(AMX_ERR_NATIVE, "Client %d not connected or index out of range!", id); return RETURN_ERR; } if(!is_user_connected(admin)) admin = 0; new szReason[REASON_LENGTH]; get_string(gag_reason, szReason, charsmax(szReason)); user_block(id, admin, get_param(block_time), szReason, any:type); return RETURN_OK; } public native_ucc_is_client_muted(plugin, params) { enum { index = 1, player }; new id = get_param(index); new victim = get_param(player); if(!is_user_connected(id)) { log_error(AMX_ERR_NATIVE, "Client %d not connected or index out of range!", id); return RETURN_ERR; } if(!is_user_connected(victim)) { log_error(AMX_ERR_NATIVE, "Client %d not connected or index out of range!", victim); return RETURN_ERR; } return g_PlayerMute[id][victim]; } public native_ucc_set_client_muted(plugin, params) { enum { index = 1, player, muted }; new id = get_param(index); new victim = get_param(player); new set_mute = get_param(muted); if(!is_user_connected(id)) { log_error(AMX_ERR_NATIVE, "Client %d not connected or index out of range!", id); return RETURN_ERR; } if(!is_user_connected(victim)) { log_error(AMX_ERR_NATIVE, "Client %d not connected or index out of range!", victim); return RETURN_ERR; } g_PlayerMute[id][victim] = (set_mute > 0) ? 1 : 0; return RETURN_OK; } /* hook__cvar_change callbacks */ public hook__cvar_change_ga(pCvar, szOldValue[], szNewValue[]) read__flags(szNewValue, cvars:GAG_ACCESS); public hook__cvar_change_sa(pCvar, szOldValue[], szNewValue[]) read__flags(szNewValue, cvars:SUPER_ACCESS); public hook__cvar_change_cbs_imm(pCvar, szOldValue[], szNewValue[]) read__flags(szNewValue, cvars:C_BY_S_IMMUNITY); /* Private functions */ Get_Flags() { hook_cvar_change(pCvar6, "hook__cvar_change_ga"); hook_cvar_change(pCvar7, "hook__cvar_change_sa"); hook_cvar_change(pCvar8, "hook__cvar_change_cbs_imm"); new szFlags[32]; get_pcvar_string(pCvar6, szFlags, charsmax(szFlags)); read__flags(szFlags, cvars:GAG_ACCESS); get_pcvar_string(pCvar7, szFlags, charsmax(szFlags)); read__flags(szFlags, cvars:SUPER_ACCESS); get_pcvar_string(pCvar8, szFlags, charsmax(szFlags)); read__flags(szFlags, cvars:C_BY_S_IMMUNITY); } Get_ArrayCvars() { g_tAllowCmds = TrieCreate(); g_arrGagTimes = ArrayCreate(); g_arrBlockTypes = ArrayCreate(REASON_LENGTH); // РІРґСЂСѓРі кто-то РїРѕРґ спайсоРС... g_arrReasons = ArrayCreate(REASON_LENGTH); enum { times = 0, block_names, reasons, allowed_commands }; get_lang_settings(times); get_lang_settings(block_names); get_lang_settings(reasons); get_lang_settings(allowed_commands); } SQL__Connect() { /* fucking amxx... @ force load config configs/plugins/ucc.cfg @ plugin stopped, if config not found */ new szPath[64]; get_localinfo("amxx_configsdir", szPath, charsmax(szPath)); add(szPath, charsmax(szPath), "/plugins/ucc.cfg"); if(file_exists(szPath)) { server_cmd("exec %s", szPath); server_exec(); } else { log_amx("%l", "INSTALL_INFO"); pause("d"); return false; } new szHost[64], szUser[64], szPass[64], szDB[32]; get_pcvar_string(pCvar1, szHost, charsmax(szHost)); get_pcvar_string(pCvar2, szUser, charsmax(szUser)); get_pcvar_string(pCvar3, szPass, charsmax(szPass)); get_pcvar_string(pCvar4, szDB, charsmax(szDB)); SQL_SetAffinity("mysql"); g_hTuple = SQL_MakeDbTuple(szHost, szUser, szPass, szDB, MYSQL_TIMEOUT); new errcode, errstr[128], Handle:hTest = SQL_Connect(g_hTuple, errcode, errstr, charsmax(errstr)); if(hTest == Empty_Handle) set_fail_state("[SQL ERROR #%d] %s", errcode, errstr); else { SQL_FreeHandle(hTest); SQL_SetCharset(g_hTuple, "utf8"); new iClearPeriod = get_systime() - 86400 * get_pcvar_num(pCvar5); new szQuery[1024]; formatex(szQuery, charsmax(szQuery), "CREATE TABLE IF NOT EXISTS `ucc_gag` ( \ `id` smallint(6) NOT NULL AUTO_INCREMENT, \ `name` varchar(32) NOT NULL, \ `steamid` varchar(32) NOT NULL, \ `ip` varchar(16) NOT NULL, \ `admin_name` varchar(32) NOT NULL, \ `admin_steamid` varchar(32) NOT NULL, \ `admin_ip` varchar(32) NOT NULL, \ `create_time` int(11) NOT NULL, \ `expired_time` int(11) NOT NULL, \ `reason` varchar(%d) NOT NULL, \ `block_type` int(11) NOT NULL, \ PRIMARY KEY (`id`), \ UNIQUE KEY `steamid` (`steamid`) \ )ENGINE=InnoDB DEFAULT CHARSET=utf8; \ DELETE FROM `ucc_gag` WHERE (`expired_time` < '%d' AND `expired_time` > '0') OR (`expired_time` = '-1' AND `create_time` < '%d');", REASON_LENGTH, iClearPeriod, iClearPeriod ); SQL_ThreadQuery(g_hTuple, "SQL_ThreadHandler_Init", szQuery); return true; } return false; } Reg_Commands() { if(has_vtc()) { register_clcmd("amx_gagmenu", "clcmd_GagMenu"); if(g_Cvar[CHATS_BY_STATS] > DISABLE) RegisterHookChain(RG_CBasePlayer_Spawn, "CBasePlayer_Spawn_Post", true); } else log_amx("For amx_gagmenu needed meta plugin VTC"); if(g_Cvar[SAY_MUTE]) { register_clcmd("say /mute", "clcmd_MuteMenu"); register_clcmd("say_team /mute", "clcmd_MuteMenu"); RegisterHookChain(RG_CSGameRules_CanPlayerHearPlayer, "CanPlayerHearPlayer_Pre", false); } if(g_Cvar[SAY_SORRY]) { register_clcmd("say /sorry", "clcmd_SaySorry"); register_clcmd("say_team /sorry", "clcmd_SaySorry"); } register_clcmd("say", "clcmd_SayChat"); register_clcmd("say_team", "clcmd_SayChat"); register_srvcmd("uРЎРѓc_flush", "srvcmd_Flush"); } /* Main Menu for gags/mute */ Show_GagMenu(id, iPos) { new szAuth[MAX_AUTHID_LENGTH]; new start, end, pnum; new iLen, szMenu[512]; new iKeys = MENU_KEY_0|MENU_KEY_6|MENU_KEY_7|MENU_KEY_8; get_players_ex(g_arrPlayers[id], pnum, GetPlayers_ExcludeBots|GetPlayers_ExcludeHLTV); get_user_authid(id, szAuth, charsmax(szAuth)); start = iPos * GAG_MENU_ITEMS; end = start + GAG_MENU_ITEMS; iLen = formatex(szMenu, charsmax(szMenu), "%l\w\R%d/%d^n^n", "MENU_GAG_HEADER", iPos + 1, (pnum / GAG_MENU_ITEMS + ((pnum % GAG_MENU_ITEMS) ? 1 : 0))); if(start >= pnum) start = iPos = g_MenuData[id][CURRENT_POS] = 0; if(end > pnum) end = pnum; for(new i = start, bool:bSuper = boolget_user_flags(id) & g_Cvar[SUPER_ACCESS]), szName[MAX_NAME_LENGTH], player, a; i < end; ++i) { player = g_arrPlayers[id]; get_user_name(player, szName, charsmax(szName)); if(id == player) iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r%d. \d%s %l^n", ++a, szName, "MENU_GAG_ITEM_YOU"); else if(!bSuper && get_user_flags(player) & ADMIN_IMMUNITY) iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r%d. \d%s %l^n", ++a, szName, "MENU_GAG_ITEM_IMMUNITY"); else if(g_PlayerData[player][GAG_BLOCK_TYPE] > NONE) { if(g_PlayerData[player][GAG_BLOCK_TYPE] == STATS) iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r%d. \d%s %l^n", ++a, szName, "MENU_GAG_ITEM_LOWSTATS"); else if(bSuper || strcmp(g_PlayerData[player][ADMIN_STEAMID], szAuth) == 0) { iKeys |= (1 << a++); iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r%d. \w%s %l^n", a, szName, "MENU_GAG_ITEM_UNGAG"); } } else { iKeys |= (1 << a++); if(VTC_IsClientSpeaking(player)) iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r%d. \w%s %l^n", a, szName, "MENU_GAG_ITEM_SPEAKING"); else iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r%d. \w%s^n", a, szName); } } static selected_string[REASON_LENGTH], selected_time; selected_time = ArrayGetCell(g_arrGagTimes, g_MenuData[id][SELECTED_TIME]); if(!selected_time) iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n\r6. %l^n", "MENU_GAG_PERMANENT"); else iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n\r6. %l^n", "MENU_GAG_MINUTES", selected_time); ArrayGetString(g_arrBlockTypes, g_MenuData[id][SELECTED_TYPE], selected_string, charsmax(selected_string)); iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r7. %l^n", "MENU_GAG_BLOCK_TYPE", selected_string); ArrayGetString(g_arrReasons, g_MenuData[id][SELECTED_REASON], selected_string, charsmax(selected_string)); iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r8. %l^n^n", "MENU_GAG_REASON", selected_string); if(end != pnum) { formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r9. %l^n\r0. %l", "MENU_ITEM_NEXT", iPos ? "MENU_ITEM_BACK" : "MENU_ITEM_EXIT"); iKeys |= MENU_KEY_9; } else formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r0. %l", iPos ? "MENU_ITEM_BACK" : "MENU_ITEM_EXIT"); show_menu(id, iKeys, szMenu, -1, "UCC GagMenu"); return PLUGIN_HANDLED; } Show_MuteMenu(id, iPos) { new start, end, pnum; new iLen, szMenu[512]; new iKeys = MENU_KEY_0|MENU_KEY_7|MENU_KEY_8; get_players_ex(g_arrPlayers[id], pnum, GetPlayers_ExcludeBots|GetPlayers_ExcludeHLTV); start = iPos * MUTE_MENU_ITEMS; end = start + MUTE_MENU_ITEMS; iLen = formatex(szMenu, charsmax(szMenu), "%l\w\R%d/%d^n^n", "MENU_MUTE_HEADER", iPos + 1, (pnum / MUTE_MENU_ITEMS + ((pnum % MUTE_MENU_ITEMS) ? 1 : 0))); if(start >= pnum) start = iPos = g_MenuData[id][CURRENT_POS] = 0; if(end > pnum) end = pnum; for(new i = start, szName[MAX_NAME_LENGTH], player, a; i < end; ++i) { player = g_arrPlayers[id]; get_user_name(player, szName, charsmax(szName)); if(id == player) iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r%d. \d%s %l^n", ++a, szName, "MENU_MUTE_ITEM_YOU"); else { iKeys |= (1 << a++); if(g_PlayerMute[id][player]) iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r%d. \w%s %l^n", a, szName, "MENU_MUTE_ITEM_MUTED"); else iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r%d. \w%s^n", a, szName); } } iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n\r7. %l^n\r8. %l^n^n", "MENU_MUTE_ALL_GAG", "MENU_MUTE_ALL_UNGAG"); if(end != pnum) { formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r9. %l^n\r0. %l", "MENU_ITEM_NEXT", iPos ? "MENU_ITEM_BACK" : "MENU_ITEM_EXIT"); iKeys |= MENU_KEY_9; } else formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r0. %l", iPos ? "MENU_ITEM_BACK" : "MENU_ITEM_EXIT"); show_menu(id, iKeys, szMenu, -1, "UCC MuteMenu"); return PLUGIN_HANDLED; } user_block(id, admin, blocktime, blockreason[REASON_LENGTH], block_types:block_type) { set_user_block(id, block_type); new szName[MAX_NAME_LENGTH * 2], szIP[MAX_IP_LENGTH], szAuth[MAX_AUTHID_LENGTH]; get_user_name(id, szName, charsmax(szName)); get_user_ip(id, szIP, charsmax(szIP), true); get_user_authid(id, szAuth, charsmax(szAuth)); new szAdminName[MAX_NAME_LENGTH * 2], szAdminIP[MAX_IP_LENGTH], szAdminAuth[MAX_AUTHID_LENGTH]; get_user_name(admin, szAdminName, charsmax(szAdminName)); get_user_ip(admin, szAdminIP, charsmax(szAdminIP), true); get_user_authid(admin, szAdminAuth, charsmax(szAdminAuth)); new iSystime = get_systime(); g_PlayerData[id][EXPIRED] = !blocktime ? 0 : iSystime + blocktime * 60; g_PlayerData[id][REASON] = blockreason; g_PlayerData[id][ADMIN_STEAMID] = szAdminAuth; mysql_escape_string(szName, charsmax(szName)); mysql_escape_string(szAdminName, charsmax(szAdminName)); mysql_escape_string(g_PlayerData[id][REASON], charsmax(g_PlayerData[][REASON])); new szQuery[1024]; formatex(szQuery, charsmax(szQuery), "INSERT INTO `ucc_gag` (`name`, `steamid`, `ip`, `admin_name`, `admin_steamid`, `admin_ip`, `create_time`, `expired_time`, `reason`, `block_type`) \ VALUES ('%s', '%s', '%s', '%s', '%s', '%s', '%d', '%d', '%s', '%d') \ ON DUPLICATE KEY UPDATE `name` = '%s', `ip` = '%s', `admin_name` = '%s', `admin_steamid` = '%s', `admin_ip` = '%s', `create_time` = '%d', `expired_time` = '%d', `reason` = '%s', `block_type` = '%d'", szName, szAuth, szIP, szAdminName, szAdminAuth, szAdminIP, iSystime, g_PlayerData[id][EXPIRED], g_PlayerData[id][REASON], any:block_type, szName, szIP, szAdminName, szAdminAuth, szAdminIP, iSystime, g_PlayerData[id][EXPIRED], g_PlayerData[id][REASON], any:block_type ); SQL_ThreadQuery(g_hTuple, "SQL_ThreadHandler_BlockPlayer", szQuery); } user_unblock(id) { if(is_blocked_voice_chat(id)) VTC_UnmuteClient(id); g_PlayerData[id][EXPIRED] = -1; g_PlayerData[id][REASON][0] = EOS; g_PlayerData[id][ADMIN_STEAMID][0] = EOS; g_PlayerData[id][GAG_BLOCK_TYPE] = NONE; new szIP[MAX_IP_LENGTH], szAuth[MAX_AUTHID_LENGTH]; get_user_ip(id, szIP, charsmax(szIP), true); get_user_authid(id, szAuth, charsmax(szAuth)); SQL_ThreadQuery( g_hTuple, "SQL_ThreadHandler_UnblockPlayer", fmt("UPDATE `ucc_gag` SET `expired_time` = '-1' WHERE `ip` = '%s' OR `steamid` = '%s'", szIP, szAuth) ); } set_user_block(id, block_types:block_type) { g_PlayerData[id][GAG_BLOCK_TYPE] = block_type; switch(block_type) { case STATS, VOICE_CHAT, ALL_CHATS: { VTC_MuteClient(id); client_cmd(id, "-voicerecord"); } } } bool:get_chats_access(id) { if(get_user_flags(id) & g_Cvar[C_BY_S_IMMUNITY]) return true; new value; switch(g_Cvar[CHATS_BY_STATS]) { case DISABLE: return true; case CSX: { #if defined CSX_EASY_STATS new st[8], bh[12]; #else new st[8], bh[HIT_RIGHTLEG + 1]; #endif if(!get_user_stats(id, st, bh)) return false; value = st[0]; } case CSSTATS_MYSQL: { new st[22]; if(csstats_get_user_stats(id, st) <= 0) return false; value = st[0]; } case CSSTATSX_SQL: { new st[8], bh[HIT_RIGHTLEG + 1]; if(!get_user_stats_sql(id, st, bh)) return false; value = st[0]; } case AES: { new st[1]; if((st[0] = aes_get_player_level(id)) == -1) return false; value = st[0]; } #if defined CSX_EASY_STATS case CSXES_GAMETIME: { new st[8], bh[12]; if(!get_user_stats(id, st, bh)) return false; value = bh[10] * 60; } #endif } g_iFragStats[id] = value; return (value < g_Cvar[MIN_ALLOW_VAL]) ? false : true; } /* Stocks */ stock read__flags(str[], cvars:cvar) g_Cvar[cvar] = read_flags(str); stock custom_color_chat(id, id2, const szMessage[], any:...) { new szMsg[190]; vformat(szMsg, charsmax(szMsg), szMessage, 4); if(id) client_print_color(id, print_team_default, szMsg); else { new players[MAX_PLAYERS], pnum; get_players_ex(players, pnum, GetPlayers_ExcludeBots); for(new i; i < pnum; ++i) { if(players != id2) { client_print_color(players, print_team_default, szMsg); } } } } stock get_lang_settings(cvar_type) { enum { times = 0, block_names, reasons, allowed_commands }; new Key, dummy, szLangKey[32], szLangValue[256]; switch(cvar_type) { case times: { do { formatex(szLangKey, charsmax(szLangKey), "CFG_GAG_TIMES_%d", Key++); dummy = LookupLangKey(szLangValue, charsmax(szLangValue), szLangKey, dummy); if(dummy) ArrayPushCell(g_arrGagTimes, str_to_num(szLangValue)); } while(dummy) } case block_names: { for(new i; i < any:ALL_CHATS+1; ++i) { formatex(szLangKey, charsmax(szLangKey), "CFG_BLOCK_NAMES_%d", i); if(LookupLangKey(szLangValue, charsmax(szLangValue), szLangKey, dummy)) ArrayPushString(g_arrBlockTypes, szLangValue); } } case reasons: { do { formatex(szLangKey, charsmax(szLangKey), "CFG_REASONS_%d", Key++); dummy = LookupLangKey(szLangValue, charsmax(szLangValue), szLangKey, dummy); if(dummy) ArrayPushString(g_arrReasons, szLangValue); } while(dummy) } case allowed_commands: { do { formatex(szLangKey, charsmax(szLangKey), "CFG_ALLOW_COMMANDS_%d", Key++); dummy = LookupLangKey(szLangValue, charsmax(szLangValue), szLangKey, dummy); if(dummy) TrieSetCell(g_tAllowCmds, szLangValue, 1); } while(dummy) } } } stock mysql_escape_string(output[], len) { static const szReplaceIn[][] = { "\\", "\0", "\n", "\r", "\x1a", "'", "^"" }; static const szReplaceOut[][] = { "\\\\", "\\0", "\\n", "\\r", "\Z", "\'", "\^"" }; for(new i; i < sizeof szReplaceIn; i++) replace_string(output, len, szReplaceIn, szReplaceOut); }
Доброго всем времени суток. Установил Ultimate Chats Control от неугомона (последняя версия). Вроде бы сделал все по инструкции. Меню мута и гага открываются, но после ничего не происходит. Жму на ники - меню просто пропадает. Прошу помощи у светлых и благородных умов разобраться, где я накосячил 
upd: забыл вытянуть еще одну строку из логов. Полная ошибка выглядит так:
аналогично с reapi. Стоят последние версии.
upd: наткнулся на решение, может кому пригодится.
upd: забыл вытянуть еще одну строку из логов. Полная ошибка выглядит так:
regamedll качал из этого сайта. cs.co кинул в dlls, конфиг в cstrike. Почему сервер его не видит - не знаю...L 06/22/2019 - 14:02:29: [ReAPI] RegisterHookChain: function (CSGameRules_CanPlayerHearPlayer) is not available, ReGameDLL required.
L 06/22/2019 - 14:02:29: [AMXX] Run time error 10 (plugin "ucc.amxx") (native "RegisterHookChain") - debug not enabled!
аналогично с reapi. Стоят последние версии.
upd: наткнулся на решение, может кому пригодится.
Проконсультируйте только в одном. У меня в папке dlls помимо cs.so лежали файлы: cs_amd64.so, cs_before.so, director_i386.so. Подскажите, что из этих файлов нужно, а что нет. Я удалил все эти файлы, ребутнул сервер и плагин заработал. Но, может я что то лишнее снес, подскажите)1. удалить строчку gamedll dlls/cs.so из конфига addons/metamod/config.ini
2. в папке cstrike/dlls/ из файлов касающиеся к gamedll оставить только cs.so
Последнее редактирование: