Лека редакция на плъгина gag system

В този раздел можете да подавате всякакви заявки за намиране, изработка или преработка на плъгини/модове.
Аватар
impossible
Извън линия
Потребител
Потребител
Мнения: 488
Регистриран на: 15 Юни 2019, 12:41
Се отблагодари: 23 пъти
Получена благодарност: 47 пъти

Лека редакция на плъгина gag system

Мнение от impossible » 21 Авг 2020, 11:08

Здравейте, ще може ли да се промени командата за отваряне на менюто в момента е направено да се отваря само с gag в чата и конзолата

бих искал да се промени само командата - да стане amx_gag и amx_gagmenu и да работи само ако е изписана в конзолата двете команди да правят едно и също да отварят менюто.

Код за потвърждение: Избери целия код

// #define DEBUG
// #define CHOOSE_STORAGE [0 .. 3]


#include <amxmodx>
#include <amxmisc>
#include <time>

#include <ChatAdditions>
#include <CA_GAG_API>

#pragma semicolon 1
#pragma ctrlchar '\'
#pragma dynamic 524288


		/* ----- START SETTINGS----- */
new const MSG_PREFIX[] = "\4[GAG]\1";

/**
 *	Database type for storage gags
 *		DB_NVault,
 *		DB_JSON,  // TODO: 
 *		DB_MySQL,
 *		DB_SQLite
 */
#define DATABASE_TYPE DB_SQLite

#define FLAGS_ACCESS    ( ADMIN_KICK )
#define FLAGS_IMMUNITY    ( ADMIN_IMMUNITY )
		/* ----- END OF SETTINGS----- */


enum any: TIME_CONST_s (+=1) { FOREVER = -1 };

new g_aCurrentGags[MAX_PLAYERS + 1][gag_s];
static g_aGags_AdminEditor[MAX_PLAYERS + 1][gag_s];

static Array: g_aReasons, g_iArraySize_Reasons;
static Array: g_aGagTimes, g_iArraySize_GagTimes;

#if defined DEBUG && defined CHOOSE_STORAGE
	#undef DATABASE_TYPE
	#define DATABASE_TYPE CHOOSE_STORAGE
#endif

#if defined DATABASE_TYPE
	#if DATABASE_TYPE == DB_NVault
		#include <ChatAdditions_inc/_NVault>
	#elseif DATABASE_TYPE == DB_JSON
		// #include <ChatAdditions_inc/_JSON>
	#elseif DATABASE_TYPE == DB_MySQL
		#include <ChatAdditions_inc/_MySQL>
	#elseif DATABASE_TYPE == DB_SQLite
		#include <ChatAdditions_inc/_SQLite>
	#endif
#else // DATABASE_TYPE
	#error Please uncomment DATABASE_TYPE and select!
#endif // DATABASE_TYPE

static bool: g_bStorageInitialized;

public plugin_precache() {
	register_plugin("[CA] Gag", "1.0.0-beta", "Sergey Shorokhov");

	register_dictionary("CA_Gag.txt");
	register_dictionary("common.txt");
	register_dictionary("time.txt");

	register_srvcmd("ca_gag_add_reason", "SrvCmd_AddReason");
	register_srvcmd("ca_gag_show_templates", "SrvCmd_ShowTemplates"); // debug

	hook_cvar_change(
		create_cvar("ca_gag_times", "1, 5, 30, 60, 1440, 10080"),
		"Hook_CVar_Times"
	);

	new sConfigsDir[PLATFORM_MAX_PATH];
	get_localinfo("amxx_configsdir", sConfigsDir, charsmax(sConfigsDir));
	server_cmd("exec %s/ChatAdditions/gag_reasons.cfg", sConfigsDir);
	server_exec();

	g_aGagTimes = ArrayCreate();

	new const szCmd[] = "gag";
	new const szCtrlChar[][] = {"!", "/", "\\", "." , "?", ""};
	for(new i; i < sizeof(szCtrlChar); i++) {
		register_clcmd(fmt("%s%s", szCtrlChar[i], szCmd), "ClCmd_Gag", FLAGS_ACCESS);
		register_clcmd(fmt("say %s%s", szCtrlChar[i], szCmd), "ClCmd_Gag", FLAGS_ACCESS);
		register_clcmd(fmt("say_team %s%s", szCtrlChar[i], szCmd), "ClCmd_Gag", FLAGS_ACCESS);
	}

	register_clcmd("enter_GagReason", "ClCmd_EnterGagReason");
	register_clcmd("enter_GagTime", "ClCmd_EnterGagTime");

	const Float: UPDATER_FREQ = 3.0;
	set_task(UPDATER_FREQ, "Gags_Thinker", .flags = "b");
}

public OnConfigsExecuted() {
	new sTimes[128];
	get_cvar_string("ca_gag_times", sTimes, charsmax(sTimes));

	ParseTimes(sTimes);
}

public plugin_natives() {
	register_library("ChatAdditions_GAG_API");

	// TODO: Need CRUD
	register_native("ca_set_user_gag", "native_ca_set_user_gag");
	register_native("ca_get_user_gag", "native_ca_get_user_gag");
	register_native("ca_has_user_gag", "native_ca_has_user_gag");
	// register_native("ca_update_user_gag", "native_ca_update_user_gag");
	register_native("ca_remove_user_gag", "native_ca_remove_user_gag");

	// TODO: Create forwards: gagged, ungagged, loaded from storage, saved to storage
}

public Gags_Thinker() {
	static aPlayers[MAX_PLAYERS], iCount;
	get_players_ex(aPlayers, iCount, .flags = (GetPlayers_ExcludeBots | GetPlayers_ExcludeHLTV));

	static iSysTime; iSysTime = get_systime();

	for(new i; i < iCount; i++) {
		new id = aPlayers[i];

		// server_print("GAG TIME LEFT: %n (%i)", id, (g_aCurrentGags[id][_ExpireTime] - iSysTime));
		if(g_aCurrentGags[id][_bitFlags] != m_REMOVED && g_aCurrentGags[id][_ExpireTime] < iSysTime)
			GagExpired(id);
	}
}

public ClCmd_Gag(id, level, cid) {
	#if !defined DEBUG
	if(!cmd_access(id, level, cid, 1))
		return PLUGIN_HANDLED;
	#endif

	if(get_playersnum() < 2) {
		client_print_color(id, print_team_default, "%s %L", MSG_PREFIX, id, "NotEnoughPlayers");
		return PLUGIN_HANDLED;
	}

	Menu_Show_PlayersList(id);
	return PLUGIN_HANDLED;
}

static Menu_Show_PlayersList(id) {
	new hMenu = menu_create(fmt("%L", id, "CA_Gag_TITLE"), "Menu_Handler_PlayersList");

	new aPlayers[MAX_PLAYERS], iCount;
	get_players(aPlayers, iCount, .flags = "ch");

	new hCallback = menu_makecallback("Callback_PlayersMenu");

	for(new i; i < iCount; i++) {
		if(id != aPlayers[i])
			menu_additem(hMenu, "-", fmt("%i", get_user_userid(aPlayers[i])), .callback = hCallback);
	}
	menu_display(id, hMenu);
}

public Callback_PlayersMenu(id, menu, item) {
	new null, sInfo[64], sName[64];
	menu_item_getinfo(menu, item, null, sInfo, charsmax(sInfo), sName, charsmax(sName), null);

	new target = find_player_ex((FindPlayer_MatchUserId | FindPlayer_ExcludeBots), strtol(sInfo));
	new bool:bHaveImmunity = !!(get_user_flags(target) & FLAGS_IMMUNITY);

	menu_item_setname(menu, item, fmt("%n %s", target, GetPostfix(id, target, bHaveImmunity)));

	return (!bHaveImmunity) ? ITEM_ENABLED : ITEM_DISABLED;
}

public Menu_Handler_PlayersList(id, menu, item) {
	if(item == MENU_EXIT || item < 0) {
		menu_destroy(menu);
		return PLUGIN_HANDLED;
	}

	new null, sInfo[64], sName[64];
	menu_item_getinfo(menu, item, null, sInfo, charsmax(sInfo), sName, charsmax(sName), null);

	new target = find_player_ex((FindPlayer_MatchUserId | FindPlayer_ExcludeBots), strtol(sInfo));

	if(!is_user_connected(target)) {
		menu_destroy(menu);
		Menu_Show_PlayersList(id);
		client_print_color(id, print_team_red, "%s %L", MSG_PREFIX, id, "Player_NotConnected");

		return PLUGIN_HANDLED;
	}

	if(g_aCurrentGags[target][_bitFlags] != m_REMOVED) {
		GagData_Copy(g_aGags_AdminEditor[id], g_aCurrentGags[target]);
		g_aGags_AdminEditor[id][_Player] = target;
		Menu_Show_ConfirmRemove(id);
	}else {
		GagData_GetPersonalData(id, target, g_aGags_AdminEditor[id]);

		Menu_Show_GagProperties(id);
	}

	menu_destroy(menu);
	return PLUGIN_HANDLED;
}

// Confirm remove gag
static Menu_Show_ConfirmRemove(id) {
	new hMenu = menu_create(fmt("%L", id, "GAG_Confirm"), "Menu_Handler_ConfirmRemove");

	menu_additem(hMenu, fmt("%L", id, "CA_GAG_YES"));
	menu_additem(hMenu, fmt("%L", id, "CA_GAG_NO"));

	menu_display(id, hMenu);
}

public Menu_Handler_ConfirmRemove(id, menu, item) {
	enum { menu_Yes, menu_No };

	new target = g_aGags_AdminEditor[id][_Player];
	if(!is_user_connected(target)) {
		menu_destroy(menu);
		client_print_color(id, print_team_red, "%s %L", MSG_PREFIX, id, "Player_NotConnected");
		Menu_Show_PlayersList(id);
		
		return PLUGIN_HANDLED;
	}

	if(item == MENU_EXIT || item < 0) {
		menu_destroy(menu);
		ResetTargetData(id);
		Menu_Show_PlayersList(id);

		return PLUGIN_HANDLED;
	}
	
	switch(item) {
		case menu_Yes: {
			RemoveGag(id, target);
		}
		case menu_No: {
			// Copy target to temporary
			new aGagData[gag_s]; {
				GagData_GetPersonalData(id, target, aGagData);

				// Get old gag data
				copy(aGagData[_Reason], charsmax(aGagData[_Reason]), g_aCurrentGags[target][_Reason]);
				aGagData[_Time] = g_aCurrentGags[target][_Time];
				aGagData[_bitFlags] = g_aCurrentGags[target][_bitFlags];
			}
			GagData_Copy(g_aGags_AdminEditor[id], aGagData);

			// DEBUG__Dump_GagData("Menu_Handler_ConfirmRemove", g_aGags_AdminEditor[id]);

			Menu_Show_GagProperties(id);
			
			return PLUGIN_HANDLED;
		}
	}

	menu_destroy(menu);
	Menu_Show_PlayersList(id);

	return PLUGIN_HANDLED;
}

// Gag Properties menu
static Menu_Show_GagProperties(id) {
	new target = g_aGags_AdminEditor[id][_Player];
	new hMenu = menu_create(fmt("%L", id, "CA_Gag_Properties", target), "Menu_Handler_GagProperties");
	new hCallback = menu_makecallback("Callback_GagProperties");

	menu_additem(hMenu, "Chat:", .callback = hCallback);
	menu_additem(hMenu, "Team chat:", .callback = hCallback);
	menu_additem(hMenu, "Voice chat:", .callback = hCallback);
	menu_addblank(hMenu, false);
	menu_additem(hMenu, "Reason:", .callback = hCallback);
	menu_additem(hMenu, "Time:", .callback = hCallback);
	menu_addblank(hMenu, false);
	menu_additem(hMenu, "Confirm!", .callback = hCallback);

	menu_display(id, hMenu);
}

public Callback_GagProperties(id, menu, item) {
	enum { menu_Chat, menu_TeamChat, menu_VoiceChat,
			menu_Reason, menu_Time, menu_Confirm
		};

	new gag_flags_s: gagFlags = g_aGags_AdminEditor[id][_bitFlags];
	new target = g_aGags_AdminEditor[id][_Player];
	new bool: hasAlreadyGag = g_aCurrentGags[target][_bitFlags] != m_REMOVED;
	new bool: hasChanges = !GagData_Equal(g_aCurrentGags[target], g_aGags_AdminEditor[id]);

	// DEBUG__Dump_GagData("Callback_GagProperties", g_aGags_AdminEditor[id]);

	new null, sInfo[64], sName[64];
	menu_item_getinfo(menu, item, null, sInfo, charsmax(sInfo), sName, charsmax(sName), null);

	switch(item) {
		case menu_Chat:
			formatex(sName, charsmax(sName), "%L [ %s ]", id, "CA_Gag_Say", (gagFlags & m_Say) ? " \\r+\\w " : "-");
		case menu_TeamChat:
			formatex(sName, charsmax(sName), "%L [ %s ]", id, "CA_Gag_SayTeam", (gagFlags & m_SayTeam) ? " \\r+\\w " : "-");
		case menu_VoiceChat:
			formatex(sName, charsmax(sName), "%L [ %s ]", id, "CA_Gag_Voice", (gagFlags & m_Voice) ? " \\r+\\w " : "-");
		case menu_Reason:
			formatex(sName, charsmax(sName), "%L [ \\y%s\\w ]", id, "CA_Gag_Reason", Get_GagStringReason(id, target));
		case menu_Time:
			formatex(sName, charsmax(sName), "%L [ \\y%s\\w ]", id, "CA_Gag_Time", GetStringTime_seconds(id, g_aGags_AdminEditor[id][_Time]));
		case menu_Confirm: {
			formatex(sName, charsmax(sName), "%L %s", id, "CA_Gag_Confirm", (hasAlreadyGag && hasChanges) ? "edit" : "");
		}
	}

	menu_item_setname(menu, item, sName);

	return (
		item == menu_Confirm && !Ready_To_Gag(id)
		|| DATABASE_TYPE == DB_NVault && item == menu_Reason
		) ? ITEM_DISABLED : ITEM_ENABLED;
}

public Menu_Handler_GagProperties(id, menu, item) {	
	enum { menu_Chat, menu_TeamChat, menu_VoiceChat,
			menu_Reason, menu_Time, menu_Confirm
		};

	if(item == MENU_EXIT || item < 0) {
		menu_destroy(menu);
		ResetTargetData(id);
		Menu_Show_PlayersList(id);

		return PLUGIN_HANDLED;
	}

	new target = g_aGags_AdminEditor[id][_Player];
	if(!is_user_connected(target)) {
		menu_destroy(menu);
		Menu_Show_PlayersList(id);
		client_print_color(id, print_team_red, "%s %L", MSG_PREFIX, id, "Player_NotConnected");

		return PLUGIN_HANDLED;
	}

	switch(item) {
		case menu_Chat:			Gag_ToggleFlags(id, m_Say);
		case menu_TeamChat: 	Gag_ToggleFlags(id, m_SayTeam);
		case menu_VoiceChat:	Gag_ToggleFlags(id, m_Voice);
		case menu_Reason: {
			menu_destroy(menu);
			Menu_Show_SelectReason(id, target);

			return PLUGIN_HANDLED;
		}
		case menu_Time:	{
			menu_destroy(menu);
			Menu_Show_SelectTime(id, target);

			return PLUGIN_HANDLED;
		}
		case menu_Confirm: {
			menu_destroy(menu);
			SaveGag(id ,target);

			return PLUGIN_HANDLED;
		}
	}

	menu_destroy(menu);
	Menu_Show_GagProperties(id);

	return PLUGIN_HANDLED;
}

stock bool: Ready_To_Gag(id)  {	
	return (g_aGags_AdminEditor[id][_bitFlags] != m_REMOVED ) ? true : false;
}


public Menu_Show_SelectReason(id, target) {
	if(!is_user_connected(target)) {
		client_print_color(id, print_team_red, "%s %L", MSG_PREFIX, id, "Player_NotConnected");

		return PLUGIN_HANDLED;
	}

	new szTemp[MAX_REASON_LEN];
	formatex(szTemp, charsmax(szTemp), "%L", id, "MENU_SelectReason");

	new hMenu = menu_create(szTemp, "Menu_Handler_SelectReason");

	formatex(szTemp, charsmax(szTemp), "%L", id, "EnterReason");
	menu_additem(hMenu, szTemp, "-1");

	if(g_iArraySize_Reasons) {
		for(new i; i < g_iArraySize_Reasons; i++) {
			new aReason[gag_s];
			ArrayGetArray(g_aReasons, i, aReason);

			menu_additem(hMenu,
				fmt("%s (\\y%s\\w)", aReason[_Reason], GetStringTime_seconds(id, aReason[_Time])),
				fmt("%i", i));
			// server_print("ADDMNU[%i]:%s, szInfo(%s)", i, szItemName, szItemInfo);
		}
	} else menu_addtext(hMenu, fmt("\\d		%L", id, "NoHaveReasonsTemplates"), .slot = false);

	return menu_display(id, hMenu);
}

public Menu_Handler_SelectReason(id, menu, item) {
	if(item == MENU_EXIT || item < 0) {
		menu_destroy(menu);
		Menu_Show_GagProperties(id);
		return PLUGIN_HANDLED;
	}

	new target = g_aGags_AdminEditor[id][_Player];

	if(!is_user_connected(target)) {
		menu_destroy(menu);
		client_print_color(id, print_team_red, "%s %L", MSG_PREFIX, id, "Player_NotConnected");
		Menu_Show_PlayersList(id);

		return PLUGIN_HANDLED;
	}

	static szItemInfo[3], dummy[1];
	menu_item_getinfo(menu, item, dummy[0], szItemInfo, charsmax(szItemInfo), dummy[0], charsmax(dummy), dummy[0]);

	new iReason = str_to_num(szItemInfo)/*  + 1 */;

	if(iReason == -1) {
		client_cmd(id, "messagemode enter_GagReason");
		return PLUGIN_HANDLED;
	}

	new aReason[gag_s];
	ArrayGetArray(g_aReasons, iReason, aReason);

	copy(g_aGags_AdminEditor[id][_Reason], charsmax(g_aGags_AdminEditor[][_Reason]), aReason[_Reason]);

// IF NEED OFC
	g_aGags_AdminEditor[id][_Time] = aReason[_Time];

	// log_amx("aReason[_Time]=%i, aReason[_Reason]=%s", aReason[_Time], aReason[_Reason]);

	menu_destroy(menu);
	Menu_Show_GagProperties(id);

	return PLUGIN_HANDLED;
}

public Menu_Show_SelectTime(id, target) {
	if(!is_user_connected(target)) {
		client_print_color(id, print_team_red, "%s %L", MSG_PREFIX, id, "Player_NotConnected");
		Menu_Show_PlayersList(id);

		return PLUGIN_HANDLED;
	}

	new hMenu = menu_create(fmt("%L", id, "MENU_SelectTime"), "Menu_Handler_SelectTime");
	menu_additem(hMenu, fmt("%L", id, "SET_CustomTime"));
	menu_additem(hMenu, fmt("%L", id, "CA_Gag_Perpapent"));
	menu_addblank(hMenu, .slot = false);

	if(g_iArraySize_GagTimes) {
		for(new i; i < g_iArraySize_GagTimes; i++) {
			new iTime = ArrayGetCell(g_aGagTimes, i) * SECONDS_IN_MINUTE;

			menu_additem(hMenu, GetStringTime_seconds(id, iTime), fmt("%i", iTime));
		}
	} else menu_addtext(hMenu, fmt("\\d		%L", id, "NoHaveTimeTemplates"), .slot = false);

	return menu_display(id, hMenu);
}

public Menu_Handler_SelectTime(id, menu, item) {
	enum { menu_CustomTime, menu_Permament };

	if(item == MENU_EXIT || item < 0) {
		menu_destroy(menu);
		Menu_Show_GagProperties(id);
		return PLUGIN_HANDLED;
	}
	
	new target = g_aGags_AdminEditor[id][_Player];
	if(!is_user_connected(target)) {
		menu_destroy(menu);
		client_print_color(id, print_team_red, "%s %L", MSG_PREFIX, id, "Player_NotConnected");
		Menu_Show_PlayersList(id);

		return PLUGIN_HANDLED;
	}

	switch(item) {
		case menu_CustomTime: {
			menu_destroy(menu);
			client_cmd(id, "messagemode enter_GagTime");

			return PLUGIN_HANDLED;
		}
		case menu_Permament: {
			menu_destroy(menu);
			g_aGags_AdminEditor[id][_Time] = FOREVER;
			Menu_Show_GagProperties(id);

			return PLUGIN_HANDLED;
		}
	}

	static sInfo[64], dummy[1];
	menu_item_getinfo(menu, item, dummy[0], sInfo, charsmax(sInfo), dummy[0], charsmax(dummy), dummy[0]);

	g_aGags_AdminEditor[id][_Time] = strtol(sInfo);

	menu_destroy(menu);
	Menu_Show_GagProperties(id);
	return PLUGIN_HANDLED;
}

public ClCmd_EnterGagTime(id) {
	new target = g_aGags_AdminEditor[id][_Player];
	
	if(!is_user_connected(target)) {
		client_print_color(id, print_team_red, "%s %L", MSG_PREFIX, id, "Player_NotConnected");
		Menu_Show_PlayersList(id);

		return PLUGIN_HANDLED;
	}
	
	static sCustomTime[128];
	read_argv(1, sCustomTime, charsmax(sCustomTime));

	if(!sCustomTime[0]) {
		Menu_Show_SelectTime(id, target);
		return PLUGIN_HANDLED;
	}
	
	g_aGags_AdminEditor[id][_Time] = strtol(sCustomTime);

	client_print(id, print_chat, "%L '%s'", id, "CustomTime_Setted", GetStringTime_seconds(id, g_aGags_AdminEditor[id][_Time]));
	Menu_Show_GagProperties(id);

	return PLUGIN_HANDLED;
}

public ClCmd_EnterGagReason(id) {
	new target = g_aGags_AdminEditor[id][_Player];
	
	if(!is_user_connected(target))
		return PLUGIN_HANDLED;
	
	static szCustomReason[128];
	read_argv(1, szCustomReason, charsmax(szCustomReason));

	if(!szCustomReason[0])
	{
		Menu_Show_SelectReason(id, target);
		return PLUGIN_HANDLED;
	}

	copy(g_aGags_AdminEditor[id][_Reason], charsmax(g_aGags_AdminEditor[][_Reason]), szCustomReason);

	client_print(id, print_chat, "%L '%s'", id, "CustomReason_Setted", g_aGags_AdminEditor[id][_Reason]);
	Menu_Show_GagProperties(id);
	return PLUGIN_HANDLED;
}

Gag_ToggleFlags(id, gag_flags_s: flag) {
	g_aGags_AdminEditor[id][_bitFlags] ^= flag;
}

stock GetStringTime_seconds(const id, const iSeconds) {
	new sTime[32];
	get_time_length(id, iSeconds, timeunit_seconds, sTime, charsmax(sTime));

	if(iSeconds == FOREVER)
		formatex(sTime, charsmax(sTime), "%L", id, "CA_Gag_Perpapent");

	if(sTime[0] == EOS)
		formatex(sTime, charsmax(sTime), "%L", id, "CA_Gag_NotSet");

	return sTime;
}

Get_GagStringReason(const id, const target) {
	static sText[MAX_REASON_LEN], len = charsmax(sText);

	if(id != LANG_PLAYER)
		copy(sText, len, g_aGags_AdminEditor[id][_Reason]);
	else copy(sText, len, g_aCurrentGags[target][_Reason]);

	if(sText[0] == EOS)
		formatex(sText, len, "%L", id, "CA_Gag_NotSet");

	return sText;
}


public SrvCmd_AddReason() {
	if(!g_aReasons) g_aReasons = ArrayCreate(gag_s);

	enum any: args_s { arg0, arg1, arg2, arg3 };

	new szArgs[args_s][32];
	for(new iArg = arg0; iArg < sizeof szArgs; iArg++)
		read_argv(iArg, szArgs[iArg], charsmax(szArgs[]));

	new iArgsCount = read_argc();

	if(iArgsCount < 2){
		log_amx("\tUsage: ca_gag_add_reason <reason> [flags] [time in minutes]");
		return;
	}

	new aReason[gag_s];
	copy(aReason[_Reason], charsmax(aReason[_Reason]), szArgs[arg1]);
	aReason[_bitFlags] = gag_flags_s: flags_to_bit(szArgs[arg2]);
	aReason[_Time] = str_to_num(szArgs[arg3]) * SECONDS_IN_MINUTE;
	// num_to_str(str_to_num(szArgs[arg3]) * SECONDS_IN_MINUTE, aReason[_Time], charsmax(aReason[_Time]));
	
	ArrayPushArray(g_aReasons, aReason);
	g_iArraySize_Reasons = ArraySize(g_aReasons);

	log_amx("ADD: Reason[#%i]: '%s' (Flags:'%s', Time:'%i s.')",
			g_iArraySize_Reasons, aReason[_Reason], bits_to_flags(aReason[_bitFlags]), aReason[_Time]
		);
}

public SrvCmd_ShowTemplates() {
	if(/* !g_iArraySize_GagTimes || */ !g_iArraySize_Reasons) {
		log_amx("\t[WARN] NO REASONS FOUNDED!");
		return PLUGIN_HANDLED;
	} else {
		for(new i; i < g_iArraySize_Reasons; i++) {
			new aReason[gag_s];
			ArrayGetArray(g_aReasons, i, aReason);

			server_print("Reason[#%i]: '%s' (Flags:'%s', Time:'%i')",
				i, aReason[_Reason], bits_to_flags(aReason[_bitFlags]), aReason[_Time]
			);
		}
	}

	return PLUGIN_HANDLED;
}

public Hook_CVar_Times(pcvar, const old_value[], const new_value[]) {

	if(!strlen(new_value)) {
		log_amx("[WARN] not found times! ca_gag_add_time ='%s'", new_value);
		return;
	}

	ParseTimes(new_value);
}

static ParseTimes(const sTimes[]) {
	ArrayClear(g_aGagTimes);

	new ePos, stPos, rawPoint[32];
	do {
		ePos = strfind(sTimes[stPos],",");
		formatex(rawPoint, ePos, sTimes[stPos]);
		stPos += ePos + 1;

		trim(rawPoint);

		if(rawPoint[0]) {
			ArrayPushCell(g_aGagTimes, strtol(rawPoint));

			// server_print("Time added: Time:'%i'", strtol(rawPoint));
		}
	} while(ePos != -1);

	g_iArraySize_GagTimes = ArraySize(g_aGagTimes);
}

static SaveGag(const id, const target) {
	GagData_Copy(g_aCurrentGags[target], g_aGags_AdminEditor[id]);

	if(id == 0) {
		client_print_color(0, print_team_default, "%s %L", MSG_PREFIX,
			LANG_PLAYER, "Player_Gagged_ByServer", target, GetStringTime_seconds(LANG_PLAYER, g_aCurrentGags[target][_Time]));
	} else {
		client_print_color(0, print_team_default, "%s %L", MSG_PREFIX,
			LANG_PLAYER, "Player_Gagged", id, target, GetStringTime_seconds(LANG_PLAYER, g_aCurrentGags[target][_Time]));
	}
	if(g_aCurrentGags[target][_Reason][0])
		client_print_color(0, print_team_default, "\4%L '\3%s\1'", LANG_PLAYER, "CA_Gag_Reason", Get_GagStringReason(LANG_PLAYER, target));

	if(g_aCurrentGags[target][_Time] == FOREVER)
		g_aCurrentGags[target][_ExpireTime] = FOREVER;
	else g_aCurrentGags[target][_ExpireTime] = get_systime() + g_aCurrentGags[target][_Time];

	GagData_Reset(g_aGags_AdminEditor[id]);
	
	client_cmd(target, "-voicerecord");

	save_to_storage(g_aCurrentGags[target]);

	return PLUGIN_CONTINUE;
}

static RemoveGag(const id, const target) {
	if(g_aGags_AdminEditor[id][_bitFlags] != m_REMOVED) {
		ResetTargetData(id);

		remove_from_storage(g_aCurrentGags[id]);

		GagData_Reset(g_aCurrentGags[target]);
		client_print_color(0, print_team_default, "%L",
			LANG_PLAYER, "Player_UnGagged", id, target);
	} else {
		client_print(id, print_chat, "%s %L", MSG_PREFIX, id, "Player_AlreadyRemovedGag", target);
	}

	Menu_Show_PlayersList(id);

	return PLUGIN_HANDLED;
}

static GagExpired(const id) {
	g_aCurrentGags[id][_bitFlags] = m_REMOVED;

	remove_from_storage(g_aCurrentGags[id]);

	client_print_color(0, print_team_default, "%s %L",MSG_PREFIX, LANG_PLAYER, "Player_ExpiredGag", id);
}

static LoadGag(const target) {
	new aGagData[gag_s]; {
		GagData_GetPersonalData(0, target, aGagData);
	}

	load_from_storage(aGagData);
}

stock ResetTargetData(const id) {
	GagData_Reset(g_aGags_AdminEditor[id]);
}

	// TODO!
GetPostfix(const id, const target, const bHaveImmunity) {
	static szPostfix[32];

	if(bHaveImmunity)
		formatex(szPostfix, charsmax(szPostfix), " [\\r%L]", id, "Immunity");
	else if(g_aCurrentGags[target][_bitFlags])
		formatex(szPostfix, charsmax(szPostfix), " [\\y%L\\w]", id, "Gag");
	else szPostfix[0] = '\0';

	return szPostfix;
}

public client_putinserver(id) {
	if(!g_bStorageInitialized)
		return;

	LoadGag(id);
}

public client_disconnected(id) {
	GagData_Reset(g_aCurrentGags[id]);
}
/** <- On Players Events */



public CA_Client_Voice(const listener, const sender) {
	return (g_aCurrentGags[sender][_bitFlags] & m_Voice) ? CA_SUPERCEDE : CA_CONTINUE;
}

public CA_Client_SayTeam(id) {
	return (g_aCurrentGags[id][_bitFlags] & m_SayTeam) ? CA_SUPERCEDE : CA_CONTINUE;
}

public CA_Client_Say(id) {
	return (g_aCurrentGags[id][_bitFlags] & m_Say) ? CA_SUPERCEDE : CA_CONTINUE;
}

/** API -> */
public native_ca_set_user_gag(pPlugin, iParams) {
	enum { Player = 1, Reason, Time, Flags };
	CHECK_NATIVE_ARGS_NUM(iParams, 4, 0)

	new target = get_param(Player);
	CHECK_NATIVE_PLAYER(target, 0)

	static sReason[MAX_REASON_LEN]; get_array(Reason, sReason, sizeof sReason);
	new iTime = get_param(Time) * SECONDS_IN_MINUTE;
	new gag_flags_s: iFlags = gag_flags_s: get_param(Flags);

	GagData_GetPersonalData(0, target, g_aGags_AdminEditor[0]);
	g_aGags_AdminEditor[0][_Player] = 0;
	formatex(g_aGags_AdminEditor[0][_AdminName], charsmax(g_aGags_AdminEditor[][_AdminName]), "SERVER");
	copy(g_aGags_AdminEditor[0][_Reason], charsmax(g_aGags_AdminEditor[][_Reason]), sReason);
	g_aGags_AdminEditor[0][_Time] = iTime;
	g_aGags_AdminEditor[0][_bitFlags] = iFlags;

	SaveGag(0, target);

	return 0;
}

public native_ca_get_user_gag(pPlugin, iParams) {
	enum { Player = 1, Reason, Time, Flags };
	CHECK_NATIVE_ARGS_NUM(iParams, 4, false)

	new id = get_param(Player);
	CHECK_NATIVE_PLAYER(id, false)

	set_array(Reason, g_aCurrentGags[id][_Reason], charsmax(g_aCurrentGags[][_Reason]));

	set_param_byref(Time, g_aCurrentGags[id][_Time]);
	set_param_byref(Flags, g_aCurrentGags[id][_bitFlags]);

	return (g_aCurrentGags[id][_bitFlags] != m_REMOVED);
}

public native_ca_has_user_gag(pPlugin, iParams) {
	enum { Player = 1 };
	CHECK_NATIVE_ARGS_NUM(iParams, 1, 0)

	new id = get_param(Player);
	CHECK_NATIVE_PLAYER(id, 0)

	return (g_aCurrentGags[id][_bitFlags] != m_REMOVED);
}

public native_ca_remove_user_gag(pPlugin, iParams) {
	/* 	
	enum { Player = 1 };
	CHECK_NATIVE_ARGS_NUM(iParams, 1, false)

	new id = get_param(Player);
	CHECK_NATIVE_PLAYER(id, false)
	*/
}

public DB_Types: native_ca_get_storage_type(pPlugin, iParams) {
	return DB_Types:DATABASE_TYPE;
}
/** <- API */


// Storage
Storage_Inited(Float: fTime) {
	g_bStorageInitialized = true;
	server_print("[%s] Storage initialized! (%.4f sec)", DB_Names[DATABASE_TYPE], fTime);
}

Storage_PlayerSaved(const iUserID) {
	new target = find_player_ex((FindPlayer_MatchUserId | FindPlayer_ExcludeBots), iUserID);

	server_print("[%s] Target [%s] SAVED!", DB_Names[DATABASE_TYPE],
		is_user_connected(target) ?
			fmt("%n (UsedID:%i)", target, iUserID) :
			fmt("UsedID:%i", iUserID)
	);
}

Storage_PlayerLoaded(const iUserID, bool: bFound = false) {
	new target = find_player_ex((FindPlayer_MatchUserId | FindPlayer_ExcludeBots), iUserID);
	GagData_GetPersonalData(0, target, g_aCurrentGags[target]);

	if(!bFound)
		return;

#if defined DEBUG
	server_print("[%s] Target [%s] Loaded! (gag found)", DB_Names[DATABASE_TYPE],
		is_user_connected(target) ?
			fmt("%n (UsedID:%i)", target, iUserID) :
			fmt("UsedID:%i", iUserID)
	);
#endif
}

Storage_PlayerRemoved(const iUserID) {
#if defined DEBUG
	new target = find_player_ex((FindPlayer_MatchUserId | FindPlayer_ExcludeBots), iUserID);

	server_print("[%s] Target [%s] removed!", DB_Names[DATABASE_TYPE],
		is_user_connected(target) ?
			fmt("%n (UsedID:%i)", target, iUserID) :
			fmt("UsedID:%i", iUserID)
	);
#endif
}
Последно промяна от impossible на 03 Сеп 2020, 14:44, променено общо 1 път.

Аватар
impossible
Извън линия
Потребител
Потребител
Мнения: 488
Регистриран на: 15 Юни 2019, 12:41
Се отблагодари: 23 пъти
Получена благодарност: 47 пъти

Лека редакция на плъгина gag system

Мнение от impossible » 21 Авг 2020, 11:23

Пробвах тук да регистрирам функцията компилира се но има предупреждения :д

new const szCmd[] = "gag"; new const szCtrlChar[][] = {"!", "/", "\\", "." , "?", ""}; for(new i; i < sizeof(szCtrlChar); i++) { register_clcmd(fmt("%s%s", szCtrlChar, szCmd), "ClCmd_Gag", FLAGS_ACCESS); register_clcmd(fmt("say %s%s", szCtrlChar, szCmd), "ClCmd_Gag", FLAGS_ACCESS); register_clcmd(fmt("say_team %s%s", szCtrlChar, szCmd), "ClCmd_Gag", FLAGS_ACCESS); }
Последно промяна от thoughtz на 21 Авг 2020, 12:09, променено общо 1 път.
Причина: Можеше и в първия пост да го вмъкнеш това..

Аватар
gadinkata
Извън линия
Потребител
Потребител
Мнения: 259
Регистриран на: 21 Мар 2018, 12:33
Местоположение: Враца
Се отблагодари: 25 пъти
Получена благодарност: 7 пъти
Обратна връзка:

Лека редакция на плъгина gag system

Мнение от gadinkata » 21 Авг 2020, 11:35

Код за потвърждение: Избери целия код

new const szCmd[] = "gag";
Го променина

Код за потвърждение: Избери целия код

new const szCmd[] = "amx_gag";
Искаш да регистрираш и втора команда за чата и конзонала?
Пробвай така

Код за потвърждение: Избери целия код

new const szCmd[] ={ "amx_gag"," amx_gagmenu"};

Аватар
impossible
Извън линия
Потребител
Потребител
Мнения: 488
Регистриран на: 15 Юни 2019, 12:41
Се отблагодари: 23 пъти
Получена благодарност: 47 пъти

Лека редакция на плъгина gag system

Мнение от impossible » 21 Авг 2020, 11:41

без чата само в конзолата да е активна командата понеже така и другите играчи ще виждат, че пишеш в чата предполагам и ще стане спам

Публикувай отговор
  • Подобни теми
    Отговори
    Преглеждания
     Последно мнение

Обратно към “Заявки за плъгини”

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 25 госта