Участник
Пользователь
- Сообщения
- 145
- Реакции
- 8
- Предупреждения
- 1
- Ошибка
-
после наказания ничего не происходит
- ОС
- Linux
- Amx Mod X
-
AMX Mod X 1.9.0.5263
- Билд
-
Build date: 03:13:55 Oct 25 2021 (2753)
- ReGamedll
-
ReGameDLL version: 5.21.0.540-dev
- Версия Metamod
-
Metamod-r v1.3.0.128, API (5:13)
- Список метамодулей
-
[ 1] Reunion RUN - reunion_mm_i386.so v0.1.92d ini Start Never
[ 2] VoiceTranscoder RUN - VoiceTranscoder.so v2017RC5 ini ANY ANY
[ 3] AMX Mod X RUN - amxmodx_mm_i386.so v1.9.0.5263 ini Start ANY
[ 4] ReSemiclip RUN - resemiclip_mm_i386.so v2.3.9 ini Chlvl ANY
[ 5] MySQL RUN - mysql_amxx_i386.so v1.9.0.5263 pl3 ANY ANY
[ 6] SQLite RUN - sqlite_amxx_i386.so v1.9.0.5263 pl3 ANY ANY
[ 7] Fun RUN - fun_amxx_i386.so v1.9.0.5263 pl3 ANY ANY
[ 8] Engine RUN - engine_amxx_i386.so v1.9.0.5263 pl3 ANY ANY
[ 9] FakeMeta RUN - fakemeta_amxx_i386.so v1.9.0.5263 pl3 ANY ANY
[10] Ham Sandwich RUN - hamsandwich_amxx_i386.so v1.9.0.5263 pl3 ANY ANY
[11] ReAPI RUN - reapi_amxx_i386.so v5.21.0.252-dev pl3 ANY Never
[12] ReAimDetector RUN - reaimdetector_amxx_i386.so v0.2.2 pl3 ANY Never
[13] CStrike RUN - cstrike_amxx_i386.so v1.9.0.5263 pl3 ANY ANY
[14] CSX RUN - csx_amxx_i386.so v1.8.3-Re pl3 ANY ANY
[15] GeoIP RUN - geoip_amxx_i386.so v1.9.0.5263 pl3 ANY ANY
- Список плагинов
-
[ 1] admin_loader 0.5.7 kanagava admin_loader-05 running
[ 2] FreshBans 1.4.6b kanagava fresh_bans_143_ running
[ 3] WebHS 0.1 kanagava fb_web_online.a running
[ 4] ReAimDetector API 0.2.2 ReHLDS Team reaimdetector.a running
[ 5] Anti-Ad 0.1 Mati antiad.amxx running
[ 6] Killer ScreenFade 0.0.5 Vaqtincha reapi_killer_sc running
[ 7] pd_screen 1.4.3 wellasgood pd_screen.amxx running
[ 8] Admin Commands 1.9.0.5263 AMXX Dev Team admincmd.amxx running
[ 9] Commands Menu 1.9.0.5263 AMXX Dev Team cmdmenu.amxx running
[ 10] Players Menu 1.9.0.5263 AMXX Dev Team plmenu.amxx running
[ 11] Maps Menu 1.9.0.5263 AMXX Dev Team mapsmenu.amxx running
[ 12] Admin Chat 1.9.0.5263 AMXX Dev Team adminchat.amxx running
[ 13] Scrolling Message 1.9.0.5263 AMXX Dev Team scrollmsg.amxx running
[ 14] Info. Messages 1.9.0.5263 AMXX Dev Team imessage.amxx running
[ 15] Admin Votes 1.9.0.5263 AMXX Dev Team adminvote.amxx running
[ 16] Stats Configuration 1.9.0.5263 AMXX Dev Team statscfg.amxx running
[ 17] Restrict Weapons 1.9.0.5263 AMXX Dev Team restmenu.amxx running
[ 18] CS Misc. Stats 1.9.0.5263 AMXX Dev Team miscstats.amxx running
[ 19] CS Stats Logging 1.9.0.5263 AMXX Dev Team stats_logging.a running
[ 20] Advanced Gag 1.9.0 neygomon amx_gag.amxx running
[ 21] HS_Blood 1.1 tuty hs_blood.amxx running
[ 22] recoil_manager 1.0.0 fl0wer recoil_manager. running
[ 23] CSX Easy Stats 1.5 neugomon csx_easy_stats. running
[ 24] Server Menu [INI] 1.0 Leo_[BH] menu_leo.amxx running
[ 25] Admin Spectator ESP 1.3 KoST admin_spec_esp. running
[ 26] Prefix Manager 0.1 serfreeman1337 prefixManager.a running
[ 27] [ReAPI] Custom Models 1.6.1 neugomon custom_models.a running
[ 28] Auto recording demo 2.0 IzI | Bonaqua (R amx_autodemorec running
[ 29] [Customizable] AmxModM 0.0.5 Albertio amxmodmenu.amxx running
[ 30] Mode 2x2 2.5re s1lent mode.amxx running
[ 31] Team Balance Control 1.3.9 gyxoBka TeamBalanceCont debug
[ 32] [ReAPI] Hint blocker 0.1.0 F@tn0M reapi_hint_bloc running
[ 33] [ReAPI] No Team Flash 0.0.3 Vaqtincha no_team_flash.a running
[ 34] Parachute Lite [ReAPI] 11.0 Leo_[BH] parachute_lite. running
[ 35] [GM] AWP Limit 0.0.0.1 [GM] NWC gm_awp_limit.am running
[ 36] [ReAPI] AdminFreeLook 1.0 ReHLDS Team adminfreelook_r running
[ 37] Mute Menu 1.1.0 szawesome mute_menu.amxx running
[ 38] Advanced Ultimate Weap 0.1.0b steelzzz auw.amxx running
[ 39] Auto VIP [STEAM] 1.1 ArtHa auto_steam_vip. running
[ 40] Simple Damager 2.1.0 fl0wer simple_damager. running
[ 41] Remove Dropped Weapons Alpha WPMG PRoSToTeM@ RemoveDroppedWe running
[ 42] Invisible Spectator 1.0 ReHLDS Team invisible_spect running
[ 43] Autoresponder/Advertis 0.5 MaximusBrood ad_manager.amxx running
[ 44] Game Namer 1.1 NeuroToxin gamenamechanger running
[ 45] AFK Manager 1.2 Xramer afk_manager.amx running
[ 46] Real Damage [ReApi] 1.0 Leo_[BH] real_damage_rea running
[ 47] [ReAPI] Healthnade 0.0.10f DEV-CS.RU Commun reapi_healthnad running
[ 48] [GRENADE] Molotov 1.0.2 medusa grenade_molotov running
[ 49] In-Game Ads(MastaMan E 1.83 (Edit stupok in_game_ads_Mas running
[ 50] [GeoIP] Connect Info 1.0.0 Nordic Warrior geoip_connect_i running
[ 51] Advanced Experience Sy 0.5.9 [REA serfreeman1337/s aes_main.amxx running
[ 52] AES: CStrike Addon 0.5.9 [REA serfreeman1337/s aes_exp_cstrike running
[ 53] AES: Informer 0.5 Vega serfreeman1337 aes_informer.am running
[ 54] AES: Admin Tools 0.5.9 [REA serfreeman1337/s aes_exp_editor. running
[ 55] AES: Bonus System 0.5.9 Vega serfreeman1337/s aes_bonus_syste running
[ 56] AES: Bonus CSTRIKE 0.5.9.1 [R serfreeman1337/s aes_bonus_cstri running
[ 57] [VipM-I] AUW 1.0.0 ArKaNeMaN VipM-I-Advanced running
[ 58] [VipM][I] Default 5.0.0-beta ArKaNeMaN VipM-I-Default. running
[ 59] [VipM-I] Limits 5.0.0-beta ArKaNeMaN VipM-I-Limits.a running
[ 60] [VipM] Items Controlle 5.0.0-beta ArKaNeMaN VipM-ItemsContr running
[ 61] [VipM][L] Default 5.0.0-beta ArKaNeMaN VipM-L-Default. running
[ 62] [VipM][L] Logic 5.0.0-beta ArKaNeMaN VipM-L-Logic.am running
[ 63] [VipM][M] Spawn Health 5.0.0-beta ArKaNeMaN VipM-M-SpawnHea running
[ 64] [VipM-M] Spawn Items 5.0.0-beta ArKaNeMaN VipM-M-SpawnIte running
[ 65] [VipM][M] Vampire 5.0.0-beta ArKaNeMaN VipM-M-Vampire. running
[ 66] [VipM-M] Vip in TAB 5.0.0-beta ArKaNeMaN VipM-M-VipInTab running
[ 67] [VipM][M] Weapon Menu 5.0.0-beta ArKaNeMaN VipM-M-WeaponMe running
[ 68] [VipM] Misc 5.0.0-beta ArKaNeMaN VipM-Misc.amxx running
[ 69] [VipM] Modules Limiter 5.0.0-beta ArKaNeMaN VipM-ModulesLim running
[ 70] Vip Modular 5.0.0-beta ArKaNeMaN VipModular.amxx running
[ 71] Map Manager: Core 3.1.5 Mistrick map_manager_cor running
[ 72] Map Manager: Scheduler 0.1.10 Mistrick map_manager_sch running
[ 73] Map Manager: Rtv 0.1.1 Mistrick map_manager_rtv running
[ 74] Map Manager: Nominatio 0.2.1 Mistrick map_manager_nom running
[ 75] Map Manager: BlockList 0.0.4 Mistrick map_manager_blo running
[ 76] Map Manager: Online so 0.0.4 Mistrick map_manager_onl running
[ 77] Map Manager: Effects 0.1.1 Mistrick map_manager_eff running
[ 78] Map Manager: Informer 0.0.5 Mistrick map_manager_inf running
[ 79] Map Manager: Sounds 0.0.2 Mistrick map_manager_sou running
- Автор плагина
- wellasgood
- Версия плагина
- 1.4.3
- Исходный код
-
/*
* - ----------
Плагин - "Punishment disabled screen" // Rus: "Наказание отключенный экран"
* - ----------
Описание:
Если какой-то игрок плохо себя ведет или какая-то другая причина, игроку можно отключить экран, таким образом он не сможет нормально играть.
* - ----------
Функционал и возможности начальной версии (остальное в разделе 'Журнал изменений'):
1. Через команду в консоли можно наказать игрока отключив ему экран.
2. Отключенный экран сохранится за игроком даже если он выйдет с сервера (попытается перезайти)
3. При вводе команды в консоли есть ряд защитных проверок, на введенные некорректные значения и тп.
4. Если при попытке наказать или освободить игрока, его не будет на сервере, то в ответ на команду будет соответствующее оповещение.
5. Если при попытке наказать игрока, его не будет на сервере, его AuthID сохранится. (т.е даже если он зайдет позже, то будет наказанный)
6. Если при попытке освободить игрока, его не будет на сервере, его AuthID удалится из сохраненных. (т.е даже если он зайдет позже, то будет освобожден)
7. В случае того, если при попытке наказать игрока, он будет на сервере, и он будет живой, то ему сразу будет предоставлено наказание, а также оповещение.
8. В случае того, если при попытке освободить игрока, он будет на сервере, и он будет живой, то сразу же будет применено освобождение, а также оповещение.
9. Если при попытке наказать игрока, он будет на сервере, и он будет мертвый, то ему будет оповещение, а наказание будет действовать с следующего спавна.
10. Если при попытке освободить игрока, он будет на сервере, и он будет мертвый, то ему будет оповещение, а освобождение будет действовать с следующего спавна.
11. При вводе команды, очень много оповещений касательно наказания/освобождения. (за каждым событием как бы следует результат)
12. Мультиязычность всех оповещений (HUD + console)
13. Если на игроке уже действует наказание/освобождение, то повторная команда на этого игрока не будет реализована. (защита)
14. Сделано 2 режима для установки цвета экрана, задается дефайном COLOR_MODE.
15. Если вы поставили значение режима цвета 1, то будет рандом цвет (мин и макс значения для рандом вычисления задается в конст VALUE_RANDOM)
16. Если вы поставили значение режима цвета 2, то необходимо в дефайн вписать RGB цвет. (по стандарту идет черный)
17. Выполнение команды на наказание и освобождение разрешено только по флагу доступа.
18. Если игроку назначено наказание, то после смерти и спавна оно ему будет возвращено. (т.е не исчезнет отключенный экран)
20. При вводе команды на authid, если игрока не будет на сервере, то он всеравно сохраняется/удаляется. (какой бы вы не ввели, необходимо использовать с осторожностью)
* - ----------
!!! Важная информация !!!
С обновления 1.4.0 плагину требуется наличие файла причин (.ini) по пути: 'addons\amxmodx\configs\'
Без этого файла плагин работать не будет, а также если в файле не будет ни одной причины.
* - ----------
Поддержка плагина:
Dev-Cs: @wellasgood
Telegram: @WellAsGood
* - ----------
*/
/*
Журнал изменений:
ver 1.0.1:
1. Обнаружен баг, когда использовав флешку (ослепляющую гранату) отключенный экран сбрасывался у игрока, исправлено, thx: jumper
2. Убрана поддержка hamsandwich (в пользу reapi)
ver 1.1.0:
1. Добавлено логирование наказаний/освобождений (дата, время, кого, от кого; спасибо: present)
2. Включить или отключить логирование можно дефайном.
3. Изменен код, с учетом нового обновления.
4. Дополнен LANG файл.
ver 1.1.1:
1. Теперь можно назвать файл лога в конст. (не учтено из предыдущего обновления)
2. Изменен код, с учетом нового обновления.
ver 1.2.0:
1. Разработана система добавления наказаний на время.
а) К основной команде добавился 3 аргумент - время.
б) Если время не будет введено, то будет оповещение об этом.
в) Если Вы введете вместо время, буквы и тп, то будет оповещение.
г) Вводить можно только целочисленные значения в минутах.
д) Если Вы введете "0" - то такое расценивается что наказание будет навсегда.
е) Наказанному игроку будет оповещение (если включен режим #define USE_HUD_MESSAGE), сколько времени ему осталось отбывать наказание.
ж) После истечения времени, AuthID удаляется из сохраненных при новом спавне. (с оповещением что освобожден)
з) Каждый спавн время сверяется между временной отметкой nvailt 'timestamp' и системным временем (get_systime)
к) Теперь в логировании (если включен #define USE_LOG) время наказания указывается тоже.
л) Если у игрока остается чуть меньше 2 минут до освобождения, то в оповещение он будет видеть секунды до конца.
2. Разработана система причин наказаний.
а) К основной команде добавился 4 аргумент - номер причины.
б) Причины Вы вписываете сами в конст массив в исходнике сколько душе угодно..
в) Создана инструкция как что делать.
г) Сделана специальная команда на просмотр в консоли причин из конст массива с их номерами.
д) Что-бы активировать причину, нужно просто вписать допустимый номер из списка причин.
е) Что-бы активировать наказание без причины, нужно вписать "0".
ж) Если Вы введете вместо причины: буквы || номер больше размера массива || вообще не введете ничего, будет оповещение.
з) В случае успеха игрок будет наказан с этой причиной (в логах это укажется).
к) Игроку будет оповещение с указание причины при выдаче наказания, или если его не будет на сервере, то при следующем заходе. (+кжд спавн)
л) Что-бы посмотреть причины самому с помощью команды в консоли, достаточно ввести команду и через пробел любое значение.
3. Созданы две новые константы массивы, для наименований консольных команд.
4. Переделаны многие оповещения связанные с новыми обновлениями. (добавлены новые аргументы)
5. Дополнен и изменен LANG файл.
ver 1.3.0:
1. Реализована выдача наказаний/освобождений через меню.
а) Добавлен конст массив на команды для открытия меню (в plugin_init).
б) В главном меню необходимо выбрать что делать: Наказать или освободить.
в) После выбора нужного пункта, откроется следующее меню, с выбором игрока.
г) В случае выбора пункта наказать, будет еще 2 меню, с выбором времени и причины наказания.
д) В случае выбора пункта освобождения, нужно только нажать на игрока.
е) При пункте наказать, в меню времени, необходимо нажать на пункт, и вписать значение посредством messagemode
ж) При пункте наказать, меню причин формируется основываясь на конст массиве REASONS_PUNISHMENT, необходимо только нажать на пункт.
з) Реализована защита от того, если игрок уже наказан/освобожден. (при нажатии не будет выполнено действие и будет оповещение)
к) Если наказание/освобождение прошло успешно, то также будет оповещение.
л) Наказание/освобождение работает через консольные команды, подставляются значения, выбранные в меню.
м) После наказания/освобождения через меню, происходит все то же самое, как и через консольные команды (пишутся логи и инфа в консоли)
2. Сохранение AuthID игрока сделано в событие client_putinserver, дабы не узнавать каждый раз при спавне и тп. (спасибо: CSBishop)
3. Добавлена возможность очищать nVault записи, которые старше указанного значения (в днях) в define. (спасибо: CSBishop)
4. Переделаны многие оповещения связанные с новыми обновлениями. (добавлены новые аргументы)
5. Дополнен и изменен LANG файл.
6. Сделан define на выставления общего флага доступа к командам меню и консольным командам наказания/освобождения.
ver 1.4.0:
1. Вместо многих настроек плагина в define, сделаны квары.
2. Добавлен эффект заморозки игрока (настройка кваром)
3. Вместо const массива с причинами, сделан конфигурационный файл (.ini), причины теперь указываются там. (без файла плагин работать не будет)
4. Удалены лишние проверки по коду, вместо них проверятся по bool CheckPlayer (признак наказан/освобожден)
5. Добавлен define на авто-создание конфига + небольшая инструкция, что делать если описание к кварам получились не на нужном языке.
6. Сделаны новые функции обработчики, с учетом новых обновлений.
7. Добавлен макрос мультиязычности для описаний кваров и крит.ошибок работы плагина. (set_fail_state)
8. Дополнен LANG файл.
9. Был найден баг, когда через меню освобождался игрок, то освобождение не задействовалось. (исправлено)
ver 1.4.1:
1. Убраны set_task_ex на выполнение функций, вместо этого сделано быстрое чтение cfg в plugin_init (до вызова функций);
ver 1.4.2:
1. Исправлен хардкодный способ использования (написания) пути до папки configs.
ver 1.4.3:
1. Найдены критические ошибки! Необходимо обновиться!
а) Были проблемы с признаком игрока наказан/освобожден, чекеры стояли и переключались в других местах. (исправлено)
б) Добавлена защита от использования messagemode обычными игроками, так как, любой мог вписать в консоль messagemode и открылось бы меню наказания (времени и причины)
2. Изменен способ отправки команды где это возможно (с client_cmd на amxclient_cmd)
*/
#include <amxmodx>
#include <amxmisc>
#include <reapi>
#include <nvault>
#define MULTI_DESC(%0) fmt("%L", LANG_SERVER, %0)
/*
Если откомментировано, то конфиг создается автоматически.
Если при запуске сервера описание к кварам не на нужном Вам языке:
1. Проверяем квар amx_language.
2. Удаляем конфиг по пути: 'amxmodx\configs\plugins\pd_screen' и меняем карту.
*/
#define AUTO_CONFIG
/*
Флаг доступа к главному меню и консольным командам наказаний/освобождений.
После запуска сервера (смены карты), можно отредактировать флаг доступа в файле по пути: "amxmodx\configs\cmdaccess.ini"
Редактирование флагов доступа в файле cmdaccess.ini применимо только к консольным командам.
*/
#define PD_SCREEN_ACCESS ADMIN_BAN
enum _:CVAR_DATA
{
USE_NVAULT_CLEANING,
NVAULT_CLEANING_RECORDS,
USE_HUD_MESSAGE,
USE_LOG,
COLOR_MODE,
COLOR_VALUE[64],
USE_PLAYER_FROZEN,
COLOR_CACHING
};
new const PLUGIN[] = "pd_screen";
new const VERSION[] = "1.4.3";
new const AUTHOR[] = "wellasgood";
new const CMD_PD_SCREEN[] = "pd_screen"; //наименование для главной команды наказаний/освобождений + выбора время и причины.
new const CMD_PD_SCREEN_REASONS[] = "pd_screen_reasons"; //наименование для команды просмотра причин.
new const LOG_DIR[] = "logs/pd_screen";
new const LOG_FILE_NAME[] = "pd_screen-log";
new const REASON_FILE_NAME[] = "pd_screen_reasons.ini"; //Наименование файла конфигурации причин, если меняете название, менять и название самого файла.
new eCvarData[CVAR_DATA], LogPath[MAX_RESOURCE_PATH_LENGTH * 2], Vault, bool:CheckPlayer[MAX_PLAYERS+1], Color[3];
new PlayerAuthID[MAX_PLAYERS+1][MAX_AUTHID_LENGTH], PlayersSaveID[MAX_PLAYERS+1], PlayerSaveTime[MAX_PLAYERS+1];
new Array:ReasonsPunishment, ReasonArraySize, bool:CheckMessageMode[MAX_PLAYERS+1];
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR);
register_dictionary("pd_screen.txt");
/*
Команды на вход в меню наказаний/освобождений. (можно менять/добавлять соблюдая структуру)
Если Вы укажите здесь консольную команду на открытие меню, то вводя команду в игре подставьте рядом любое значение.
Если будете указывать здесь консольные команды, то они не должны быть такими же как и (CMD_PD_SCREEN|CMD_PD_SCREEN_REASONS)
*/
new const CMD_MENU_OPEN[][] =
{
"say /pd_screen",
"say pd_screen",
"say_team /pd_screen",
"say_team pd_screen",
"pd_scr_menu"
};
for(new i; i < sizeof CMD_MENU_OPEN; i++)
{
register_clcmd(CMD_MENU_OPEN[i], "@Open_PD_Menu_Main", PD_SCREEN_ACCESS, "Usage console: command all value | Usage chat: command");
}
register_clcmd(CMD_PD_SCREEN, "@cmd_pd_screen", PD_SCREEN_ACCESS, "Usage: command AuthID 0/1 time reasons_number");
register_clcmd(CMD_PD_SCREEN_REASONS, "@cmd_pd_screen_reasons", PD_SCREEN_ACCESS, "Usage: command all value");
RegisterHookChain(RG_CBasePlayer_Spawn, "@EventSpawn", true);
RegisterHookChain(RG_PlayerBlind, "@PlayerBlind", false);
register_concmd("TimeValue", "@TimeValueHandler");
Vault = nvault_open("pd_screen");
if(Vault == INVALID_HANDLE)
{
set_fail_state(MULTI_DESC("PD_NVAULT_OPEN_FILE_ERROR"));
}
ReasonsPunishment = ArrayCreate(191);
CreateCvars();
#if defined AUTO_CONFIG
AutoExecConfig(true, "pd_screen");
#endif
new Path[MAX_RESOURCE_PATH_LENGTH];
get_localinfo("amxx_configsdir", Path, charsmax(Path));
server_cmd("exec %s/pd_screen.cfg", Path); //Обновляем информацию кваров из cfg побыстрее.
server_exec(); //заставляем сервер немедленно выполнить очередь команд.
ParseReasons(Path, charsmax(Path));
NvaultCleaning(); //Чистка nVault записей.
PreparingForLogging(); //Подготовка к логированию.
ColorChaching(); //Кеширование цвета.
}
NvaultCleaning()
{
if(eCvarData[USE_NVAULT_CLEANING])
{
//thx: DJ_WEST (https://amx-x.ru/viewtopic.php?p=12940)
nvault_prune(Vault, 0, get_systime() - (86400 * eCvarData[NVAULT_CLEANING_RECORDS]));
}
}
PreparingForLogging()
{
if(eCvarData[USE_LOG])
{
get_localinfo("amxx_basedir", LogPath, charsmax(LogPath));
new Len = formatex(LogPath, charsmax(LogPath), "%s/%s", LogPath, LOG_DIR);
if(!dir_exists(LogPath))
{
mkdir(LogPath);
}
new Date[16];
get_time("%d_%m_%y", Date, charsmax(Date));
formatex(LogPath[Len], charsmax(LogPath) - Len, "/%s_%s.txt", LOG_FILE_NAME, Date);
}
}
ColorChaching()
{
if(!eCvarData[COLOR_CACHING])
{
ColorHandler();
}
}
public client_putinserver(id)
{
if(is_user_bot(id) || is_user_hltv(id))
{
return;
}
arrayset(PlayerAuthID[id], 0, charsmax(PlayerAuthID[]));
get_user_authid(id, PlayerAuthID[id], charsmax(PlayerAuthID[]));
new Data[64];
new timestamp, AccessResult = nvault_lookup(Vault, PlayerAuthID[id], Data, charsmax(Data), timestamp);
if(AccessResult)
{
CheckPlayer[id] = true;
}
CheckMessageMode[id] = false;
}
@cmd_pd_screen_reasons(id, level, cid)
{
if(!cmd_access(id, level, cid, 2))
{
return;
}
console_print(id, "=====================================");
console_print(id, "^n%L^n", id, "PD_SCREEN_REASONS_NAME");
ReasonsHandler(2, id);
console_print(id, "^n%L^n", id, "PD_SCREEN_ERROR_REASONS_NUM2", (ReasonArraySize - 1));
console_print(id, "=====================================");
}
@cmd_pd_screen(id, level, cid)
{
if(!cmd_access(id, level, cid, 2))
{
return;
}
new DataAuthID[MAX_AUTHID_LENGTH], DataValue[6], DataTime[32], DataReasons[32];
read_argv(1, DataAuthID, charsmax(DataAuthID));
read_argv(2, DataValue, charsmax(DataValue));
read_argv(3, DataTime, charsmax(DataTime));
read_argv(4, DataReasons, charsmax(DataReasons));
if(is_str_num(DataAuthID))
{
console_print(id, "%L", id, "PD_SCREEN_ERROR_DATA_AUTHID");
return;
}
if(!DataValue[0])
{
console_print(id, "%L", id, "PD_SCREEN_ERROR_DATAVALUE");
return;
}
if(!is_str_num(DataValue))
{
console_print(id, "%L", id, "PD_SCREEN_ERROR_VALUE_NUM1");
return;
}
if(str_to_num(DataValue) >= 2)
{
console_print(id, "%L", id, "PD_SCREEN_ERROR_VALUE_NUM2");
return;
}
if(str_to_num(DataValue) == 1)
{
if(!DataTime[0])
{
console_print(id, "%L %L", id, "PD_SCREEN_ERROR_TIME", id, "PD_SCREEN_MINUTES");
return;
}
if(!is_str_num(DataTime))
{
console_print(id, "%L", id, "PD_SCREEN_ERROR_TIME_NUM");
return;
}
if(!DataReasons[0])
{
amxclient_cmd(id, CMD_PD_SCREEN_REASONS, "view");
console_print(id, "%L", id, "PD_SCREEN_ERROR_REASONS");
return;
}
if(!is_str_num(DataReasons))
{
amxclient_cmd(id, CMD_PD_SCREEN_REASONS, "view");
console_print(id, "%L", id, "PD_SCREEN_ERROR_REASONS_NUM1");
return;
}
if(str_to_num(DataReasons) > (ReasonArraySize - 1))
{
amxclient_cmd(id, CMD_PD_SCREEN_REASONS, "view");
return;
}
}
new PlayersID[MAX_PLAYERS], PlayersCount;
get_players_ex(PlayersID, PlayersCount, GetPlayers_ExcludeHLTV|GetPlayers_ExcludeBots);
new SavePlayerID;
for(new i; i < PlayersCount; i++)
{
if(equal(PlayerAuthID[PlayersID[i]], DataAuthID))
{
SavePlayerID = PlayersID[i];
break;
}
}
switch(str_to_num(DataValue))
{
case 0:
{
if(!SavePlayerID)
{
console_print(id, "%L", id, "PD_SCREEN_ERROR_PLAYER_NOT_FOUND");
}
else
{
if(CheckPlayer[SavePlayerID])
{
CheckPlayer[SavePlayerID] = false;
if(is_user_alive(SavePlayerID))
{
PunishHandler(SavePlayerID);
console_print(id, "%L", id, "PD_SCREEN_PLAYER_UNLOCKED");
}
else
{
console_print(id, "%L", id, "PD_SCREEN_ERROR_ALIVE_PLAYER1");
}
if(eCvarData[USE_HUD_MESSAGE])
{
HudMessage(SavePlayerID);
}
if(eCvarData[USE_LOG])
{
log_to_file(LogPath, "%L", LANG_SERVER, "PD_SCREEN_LOG_UNPUNISHED1", SavePlayerID, id);
}
}
else
{
console_print(id, "%L", id, "PD_SCREEN_ERROR_RE_UNLOCKING");
}
}
new Data[MAX_AUTHID_LENGTH];
new timestamp, AccessResult = nvault_lookup(Vault, DataAuthID, Data, charsmax(Data), timestamp);
if(!AccessResult)
{
console_print(id, "%L", id, "PD_SCREEN_ERROR_SEARCH_AUTHID");
}
else
{
nvault_remove(Vault, DataAuthID);
console_print(id, "%L", id, "PD_SCREEN_SEARCH_AUTHID_NO");
if(eCvarData[USE_LOG])
{
log_to_file(LogPath, "%L", LANG_SERVER, "PD_SCREEN_LOG_UNPUNISHED2", DataAuthID, id);
}
}
}
case 1:
{
new Time = str_to_num(DataTime);
new ReasonNum = str_to_num(DataReasons);
new Buffer[191];
ArrayGetString(ReasonsPunishment, ReasonNum, Buffer, charsmax(Buffer));
if(!SavePlayerID)
{
console_print(id, "%L", id, "PD_SCREEN_ERROR_PLAYER_NOT_FOUND");
}
else
{
if(!CheckPlayer[SavePlayerID])
{
if(Time == 0)
{
console_print(id, "%L %L (%L) | %L", id, "PD_SCREEN_PLAYER_PUNISHED_TIME", Time, id, "PD_SCREEN_MINUTES", id, "PD_SCREEN_PUNISHED_FOREVER", id, "PD_SCREEN_REASON", Buffer);
}
else
{
console_print(id, "%L %L | %L", id, "PD_SCREEN_PLAYER_PUNISHED_TIME", Time, id, "PD_SCREEN_MINUTES", id, "PD_SCREEN_REASON", Buffer);
}
CheckPlayer[SavePlayerID] = true;
if(is_user_alive(SavePlayerID))
{
PunishHandler(SavePlayerID);
}
else
{
console_print(id, "%L", id, "PD_SCREEN_ERROR_ALIVE_PLAYER2");
}
if(eCvarData[USE_HUD_MESSAGE])
{
HudMessage(SavePlayerID, Time, 0, ReasonNum, Time == 0 ? 1 : 2);
}
if(eCvarData[USE_LOG])
{
if(Time == 0)
{
log_to_file(LogPath, "%L %L (%L) | %L", LANG_SERVER, "PD_SCREEN_LOG_PUNISHED1", SavePlayerID, id, Time, LANG_SERVER, "PD_SCREEN_MINUTES", LANG_SERVER, "PD_SCREEN_PUNISHED_FOREVER", LANG_SERVER, "PD_SCREEN_REASON", Buffer);
}
else
{
log_to_file(LogPath, "%L %L | %L", LANG_SERVER, "PD_SCREEN_LOG_PUNISHED1", SavePlayerID, id, Time, LANG_SERVER, "PD_SCREEN_MINUTES", LANG_SERVER, "PD_SCREEN_REASON", Buffer);
}
}
}
else
{
console_print(id, "%L", id, "PD_SCREEN_ERROR_RE_LOCKING");
}
}
new Data[64];
new timestamp, AccessResult = nvault_lookup(Vault, DataAuthID, Data, charsmax(Data), timestamp);
if(!AccessResult)
{
nvault_set(Vault, DataAuthID, fmt("%d %d", Time, ReasonNum));
console_print(id, "%L", id, "PD_SCREEN_SAVE_NVAULT_AUTHID");
if(eCvarData[USE_LOG])
{
if(Time == 0)
{
log_to_file(LogPath, "%L %L (%L) | %L", LANG_SERVER, "PD_SCREEN_LOG_PUNISHED2", DataAuthID, id, Time, LANG_SERVER, "PD_SCREEN_MINUTES", LANG_SERVER, "PD_SCREEN_PUNISHED_FOREVER", LANG_SERVER, "PD_SCREEN_REASON", Buffer);
}
else
{
log_to_file(LogPath, "%L %L | %L", LANG_SERVER, "PD_SCREEN_LOG_PUNISHED2", DataAuthID, id, Time, LANG_SERVER, "PD_SCREEN_MINUTES", LANG_SERVER, "PD_SCREEN_REASON", Buffer);
}
}
}
else
{
console_print(id, "%L", id, "PD_SCREEN_SEARCH_AUTHID_YES");
}
}
}
}
@Open_PD_Menu_Main(id, level, cid)
{
if(!cmd_access(id, level, cid, 2))
{
return;
}
PD_Menu_Main(id);
}
PD_Menu_Main(id)
{
if(!is_user_connected(id))
{
return;
}
new TempString[MAX_MENU_LENGTH];
formatex(TempString, charsmax(TempString), "%L", id, "PD_MENU_MAIN_TITLE");
new Menu = menu_create(TempString, "@Handle_PD_Menu_Main");
formatex(TempString, charsmax(TempString), "%L", id, "PD_MENU_MAIN_ITEM1");
menu_additem(Menu, TempString, "1");
formatex(TempString, charsmax(TempString), "%L", id, "PD_MENU_MAIN_ITEM2");
menu_additem(Menu, TempString, "2");
FormingItemMenu(id, Menu, TempString, charsmax(TempString), 2);
menu_display(id, Menu);
}
@Handle_PD_Menu_Main(id, Menu, Item)
{
if(Item == MENU_EXIT)
{
menu_destroy(Menu);
return;
}
new Info[6];
menu_item_getinfo(Menu, Item, _, Info, charsmax(Info));
menu_destroy(Menu);
str_to_num(Info) == 1 ? @PD_Menu_punish(id) : @PD_Menu_unpunish(id);
}
@PD_Menu_unpunish(id)
{
if(!is_user_connected(id))
{
return;
}
new TempString[MAX_MENU_LENGTH];
formatex(TempString, charsmax(TempString), "%L", id, "PD_MENU_UNPUNISH_TITLE");
new Menu = menu_create(TempString, "@Handle_PD_Menu_unpunish");
FormingItemMenu(id, Menu, TempString, charsmax(TempString), 1);
FormingItemMenu(id, Menu, TempString, charsmax(TempString), 2);
menu_display(id, Menu);
}
@Handle_PD_Menu_unpunish(id, Menu, Item)
{
if(Item == MENU_EXIT)
{
menu_destroy(Menu);
PD_Menu_Main(id);
return;
}
new Info[6];
menu_item_getinfo(Menu, Item, _, Info, charsmax(Info));
new PlayerID = str_to_num(Info);
menu_destroy(Menu);
set_dhudmessage(random_num(100, 255), random_num(100, 255), random_num(100, 255), -1.0, -0.55, 1, 1.5, 3.0, 2.0, 3.0);
show_dhudmessage(id, "%l", CheckPlayer[PlayerID] ? "PD_MENU_HUD_INFO_UNPUNISH1" : "PD_MENU_HUD_INFO_UNPUNISH2", PlayerID);
if(!CheckPlayer[PlayerID])
{
@PD_Menu_unpunish(id);
return;
}
amxclient_cmd(id, CMD_PD_SCREEN, PlayerAuthID[PlayerID], "0");
set_task_ex(0.3, "@PD_Menu_unpunish", id); //небольшая задержка, так как не успевает обновиться bool CheckPlayer
}
@PD_Menu_punish(id)
{
if(!is_user_connected(id))
{
return;
}
new TempString[MAX_MENU_LENGTH];
formatex(TempString, charsmax(TempString), "%L", id, "PD_MENU_PUNISH_TITLE");
new Menu = menu_create(TempString, "@Handle_PD_Menu_punish");
FormingItemMenu(id, Menu, TempString, charsmax(TempString), 1);
FormingItemMenu(id, Menu, TempString, charsmax(TempString), 2);
menu_display(id, Menu);
}
@Handle_PD_Menu_punish(id, Menu, Item)
{
if(Item == MENU_EXIT)
{
menu_destroy(Menu);
PD_Menu_Main(id);
return;
}
new Info[6];
menu_item_getinfo(Menu, Item, _, Info, charsmax(Info));
menu_destroy(Menu);
PlayersSaveID[id] = str_to_num(Info);
if(CheckPlayer[PlayersSaveID[id]])
{
set_dhudmessage(random_num(100, 255), random_num(100, 255), random_num(100, 255), -1.0, -0.45, 1, 1.5, 3.0, 0.9, 1.0);
show_dhudmessage(id, "%l", "PD_MENU_HUD_INFO_PUNISH2", PlayersSaveID[id]);
@PD_Menu_punish(id);
return;
}
PD_Menu_Time(id);
}
PD_Menu_Time(id)
{
if(!is_user_connected(id))
{
return;
}
new TempString[MAX_MENU_LENGTH];
formatex(TempString, charsmax(TempString), "%L", id, "PD_MENU_TIME_TITLE");
new Menu = menu_create(TempString, "@Handle_PD_Menu_Time");
formatex(TempString, charsmax(TempString), "%L \у[\r%d\y]", id, "PD_MENU_TIME_ITEM1", PlayerSaveTime[id]);
menu_additem(Menu, TempString);
formatex(TempString, charsmax(TempString), "%L", id, "PD_MENU_TIME_ITEM2");
menu_additem(Menu, TempString);
FormingItemMenu(id, Menu, TempString, charsmax(TempString), 2);
menu_display(id, Menu);
}
@Handle_PD_Menu_Time(id, Menu, Item)
{
if(Item == MENU_EXIT)
{
menu_destroy(Menu);
@PD_Menu_punish(id);
return;
}
menu_destroy(Menu);
if(Item == 0)
{
CheckMessageMode[id] = true;
client_cmd(id, "messagemode ^"TimeValue^"");
}
else
{
PD_Menu_Reasons(id);
}
}
@TimeValueHandler(id)
{
if(!CheckMessageMode[id]) return;
new String[64];
read_argv(1, String, charsmax(String));
if(is_str_num(String))
{
PlayerSaveTime[id] = str_to_num(String);
}
CheckMessageMode[id] = false;
PD_Menu_Time(id);
}
PD_Menu_Reasons(id)
{
if(!is_user_connected(id))
{
return;
}
new TempString[MAX_MENU_LENGTH];
formatex(TempString, charsmax(TempString), "%L", id, "PD_MENU_REASON_TITLE");
new Menu = menu_create(TempString, "@Handle_PD_Menu_Reasons");
ReasonsHandler(1, 0, Menu);
FormingItemMenu(id, Menu, TempString, charsmax(TempString), 2);
menu_display(id, Menu);
}
@Handle_PD_Menu_Reasons(id, Menu, Item)
{
if(Item == MENU_EXIT)
{
menu_destroy(Menu);
PD_Menu_Time(id);
return;
}
new Info[6];
menu_item_getinfo(Menu, Item, _, Info, charsmax(Info));
new ReasonNum = str_to_num(Info);
menu_destroy(Menu);
client_cmd(id, fmt("%s %s 1 %d %d", CMD_PD_SCREEN, PlayerAuthID[PlayersSaveID[id]], PlayerSaveTime[id], ReasonNum));
new Buffer[191];
ArrayGetString(ReasonsPunishment, ReasonNum, Buffer, charsmax(Buffer));
set_dhudmessage(random_num(100, 255), random_num(100, 255), random_num(100, 255), -1.0, -0.45, 1, 1.5, 3.0, 0.9, 1.0);
show_dhudmessage(id, "%l %l %l", "PD_MENU_HUD_INFO_PUNISH1", PlayersSaveID[id], PlayerSaveTime[id], "PD_SCREEN_MINUTES", "PD_SCREEN_REASON", Buffer);
set_task_ex(0.3, "@PD_Menu_punish", id); //небольшая задержка, так как не успевает обновиться bool CheckPlayer
}
@EventSpawn(id)
{
if(!is_user_alive(id) || !CheckPlayer[id])
{
return;
}
new Data[64];
new timestamp, AccessResult = nvault_lookup(Vault, PlayerAuthID[id], Data, charsmax(Data), timestamp);
if(AccessResult)
{
new Time = ReasonsAndTimeHandler(Data, 1);
if(((timestamp + (Time * 60))) < get_systime() && Time != 0)
{
nvault_remove(Vault, PlayerAuthID[id]);
CheckPlayer[id] = false;
if(eCvarData[USE_HUD_MESSAGE])
{
HudMessage(id);
}
}
else
{
PunishHandler(id);
if(eCvarData[USE_HUD_MESSAGE])
{
HudMessage(id, Time, timestamp, ReasonsAndTimeHandler(Data, 2), Time == 0 ? 1 : 2);
}
}
}
}
//thx: jumper
@PlayerBlind(const index, const inflictor, const Float:fadeTime, const Float:fadeHold, const alpha, Float:color[3])
{
return CheckPlayer[index] ? HC_SUPERCEDE : HC_CONTINUE;
}
HudMessage(id, time = 0, timestamp = 0, reason = 0, check = 0)
{
set_dhudmessage(random_num(100, 255), random_num(100, 255), random_num(100, 255), -1.0, -0.55, 1, 1.5, 3.0, 2.0, 3.0);
if(CheckPlayer[id])
{
if(check == 1)
{
show_dhudmessage(id, "%l", "PD_SCREEN_HUD_MESSAGE_PUNISHED_FOREVER", id);
}
else
{
new time_format = timestamp > 1 ? ((((timestamp / 60) + time) - (get_systime() / 60)) < 2 ? (timestamp + (time * 60)) - get_systime() : (((timestamp / 60) + time) - (get_systime() / 60))) : time;
show_dhudmessage(id, "%l %l", "PD_SCREEN_HUD_MESSAGE_PUNISHED", id, time_format, timestamp > 1 ? ((((timestamp / 60) + time) - (get_systime() / 60)) < 2 ? "PD_SCREEN_SECOND" : "PD_SCREEN_MINUTES") : "PD_SCREEN_MINUTES");
}
new Buffer[191];
ArrayGetString(ReasonsPunishment, reason, Buffer, charsmax(Buffer));
set_dhudmessage(random_num(100, 255), random_num(100, 255), random_num(100, 255), -1.0, -0.52, 1, 1.5, 3.0, 2.0, 3.0);
show_dhudmessage(id, "%l", "PD_SCREEN_REASON", Buffer);
}
else
{
show_dhudmessage(id, "%l", "PD_SCREEN_HUD_MESSAGE_UNPUNISHED", id);
}
}
FormingItemMenu(id, Menu, TempString[], len, check)
{
switch(check)
{
case 1:
{
new PlayersID[MAX_PLAYERS], PlayersCount;
get_players_ex(PlayersID, PlayersCount, GetPlayers_ExcludeHLTV|GetPlayers_ExcludeBots);
for(new i; i < PlayersCount; i++)
{
new player_name[MAX_NAME_LENGTH];
get_user_name(PlayersID[i], player_name, charsmax(player_name));
if(CheckPlayer[PlayersID[i]])
{
formatex(TempString, len, "%s \y[\r%L\y]", player_name, id, "PD_MENU_PUNISH");
}
menu_additem(Menu, !CheckPlayer[PlayersID[i]] ? player_name : TempString, fmt("%d", PlayersID[i]));
}
}
case 2:
{
formatex(TempString, len, "%L", id, "PD_MENU_BACK");
menu_setprop(Menu, MPROP_BACKNAME, TempString);
formatex(TempString, len, "%L", id, "PD_MENU_NEXT");
menu_setprop(Menu, MPROP_NEXTNAME, TempString);
formatex(TempString, len, "%L", id, "PD_MENU_EXIT");
menu_setprop(Menu, MPROP_EXITNAME, TempString);
}
}
}
ReasonsHandler(value, id = 0, menu = 0)
{
for(new i; i < ReasonArraySize; i++)
{
new Buffer[191];
ArrayGetString(ReasonsPunishment, i, Buffer, charsmax(Buffer));
switch(value)
{
case 1:
{
menu_additem(menu, Buffer, fmt("%d", i));
}
case 2:
{
console_print(id, "[%d] - %s", i, Buffer);
}
}
}
}
PunishHandler(id)
{
static msg_screenfade;
if(!msg_screenfade)
{
msg_screenfade = get_user_msgid("ScreenFade");
}
message_begin(MSG_ONE, msg_screenfade, _, id);
write_short(1);
write_short(1);
write_short(CheckPlayer[id] ? 4 : 1);
if(eCvarData[COLOR_CACHING])
{
ColorHandler();
}
write_byte(Color[0]);
write_byte(Color[1]);
write_byte(Color[2]);
write_byte(255);
message_end();
if(eCvarData[USE_PLAYER_FROZEN])
{
set_entvar(id, var_flags, CheckPlayer[id] ? get_entvar(id, var_flags) | FL_FROZEN : get_entvar(id, var_flags) & ~FL_FROZEN);
}
}
ReasonsAndTimeHandler(value[], check)
{
new Num[2][32];
parse(value, Num[0], charsmax(Num[]), Num[1], charsmax(Num[]));
return check == 1 ? str_to_num(Num[0]) : str_to_num(Num[1]);
}
ColorHandler()
{
new ColorValue[6][9];
if(eCvarData[COLOR_MODE] == 2)
{
parse(eCvarData[COLOR_VALUE], ColorValue[0], charsmax(ColorValue[]), ColorValue[1], charsmax(ColorValue[]), ColorValue[2], charsmax(ColorValue[]));
Color[0] = str_to_num(ColorValue[0]);
Color[1] = str_to_num(ColorValue[1]);
Color[2] = str_to_num(ColorValue[2]);
}
else
{
parse(eCvarData[COLOR_VALUE], ColorValue[0], charsmax(ColorValue[]), ColorValue[1], charsmax(ColorValue[]), ColorValue[2], charsmax(ColorValue[]), ColorValue[3], charsmax(ColorValue[]), ColorValue[4], charsmax(ColorValue[]), ColorValue[5], charsmax(ColorValue[]));
Color[0] = random_num(str_to_num(ColorValue[0]), str_to_num(ColorValue[1]));
Color[1] = random_num(str_to_num(ColorValue[2]), str_to_num(ColorValue[3]));
Color[2] = random_num(str_to_num(ColorValue[4]), str_to_num(ColorValue[5]));
}
}
ParseReasons(Path[], len)
{
formatex(Path, len, "%s/%s", Path, REASON_FILE_NAME);
if(!file_exists(Path))
{
set_fail_state(fmt("%s %s", MULTI_DESC("PD_REASON_FILE_ERROR_OPEN"), Path));
}
new ReasonData[191], f = fopen(Path, "rt");
while(!feof(f))
{
fgets(f, ReasonData, charsmax(ReasonData));
trim(ReasonData);
if(ReasonData[0] == '[')
{
log_amx("%s", ReasonData);
continue;
}
if(!ReasonData[0] || ReasonData[0] == ';')
{
continue;
}
ArrayPushString(ReasonsPunishment, ReasonData);
}
fclose(f);
ReasonArraySize = ArraySize(ReasonsPunishment);
if(ReasonArraySize == 0)
{
set_fail_state(fmt("%s %s", MULTI_DESC("PD_REASON_FILE_ERROR_SIZE"), Path));
}
}
CreateCvars()
{
bind_pcvar_num(create_cvar(
.name = "pd_use_nvault_cleaning",
.string = "1",
.description = MULTI_DESC("PD_DESC_USE_NVAULT_CLEANING"),
.has_min = true,
.min_val = 0.0,
.has_max = true,
.max_val = 1.0),
eCvarData[USE_NVAULT_CLEANING]
);
bind_pcvar_num(create_cvar(
.name = "pd_nvault_cleaning_records",
.string = "15",
.description = MULTI_DESC("PD_DESC_NVAULT_CLEANING_RECORDS")),
eCvarData[NVAULT_CLEANING_RECORDS]
);
bind_pcvar_num(create_cvar(
.name = "pd_use_hud_message",
.string = "1",
.description = MULTI_DESC("PD_DESC_USE_HUD_MESSAGE"),
.has_min = true,
.min_val = 0.0,
.has_max = true,
.max_val = 1.0),
eCvarData[USE_HUD_MESSAGE]
);
bind_pcvar_num(create_cvar(
.name = "pd_use_log",
.string = "1",
.description = MULTI_DESC("PD_DESC_USE_LOG"),
.has_min = true,
.min_val = 0.0,
.has_max = true,
.max_val = 1.0),
eCvarData[USE_LOG]
);
bind_pcvar_num(create_cvar(
.name = "pd_color_mode",
.string = "1",
.description = MULTI_DESC("PD_DESC_COLOR_MODE"),
.has_min = true,
.min_val = 1.0,
.has_max = true,
.max_val = 2.0),
eCvarData[COLOR_MODE]
);
bind_pcvar_num(create_cvar(
.name = "pd_color_caching",
.string = "0",
.description = MULTI_DESC("PD_DESC_COLOR_CACHING"),
.has_min = true,
.min_val = 0.0,
.has_max = true,
.max_val = 1.0),
eCvarData[COLOR_CACHING]
);
bind_pcvar_string(create_cvar(
.name = "pd_color_value",
.string = "0 255 100 200 50 255",
.description = MULTI_DESC("PD_DESC_COLOR_VALUE")),
eCvarData[COLOR_VALUE],
charsmax(eCvarData[COLOR_VALUE])
);
bind_pcvar_num(create_cvar(
.name = "pd_use_player_frozen",
.string = "1",
.description = MULTI_DESC("PD_DESC_USE_PLAYER_FROZEN"),
.has_min = true,
.min_val = 0.0,
.has_max = true,
.max_val = 1.0),
eCvarData[USE_PLAYER_FROZEN]
);
}
public plugin_end()
{
nvault_close(Vault);
}
в чате ввожу команду /pd_screen , выбираю игрока , указываю время , причину а дальше ничего не происходит .
Может я не так что то делаю ?
в исходнике сменил только
ADMIN_RCON
на
ADMIN_BAN
и все .
Может я не так что то делаю ?
в исходнике сменил только
ADMIN_RCON
на
ADMIN_BAN
и все .
В этой теме было размещено решение! Перейти к решению.