Страница 1 от 1

Създаване на меню с информация взета от nvault

Публикувано на: 05 Фев 2020, 11:37
от boro2277
Здравейте, ползвам този плъгин за CTban и всичко си работи както трябва, но сега ми е необходимо да има команда дакажем /ctbans , с която да ми отваря меню с имената на играчите които имат сложена забрана да са СТ и за колко време е наказанието. Ето и кода:

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

/* Plugin generated by AMXX-Studio */

#include <amxmodx>
#include <amxmisc>
#include <nvault>
#include <cstrike>
#include <hamsandwich>
#include <colorchat>

#define PLUGIN "[JB] CT BAN"
#define VERSION "1.3"
#define AUTHOR "Natsheh"

#define TASK_UNBANCT 876542

#define ADMIN_FLAG ADMIN_BAN

#define set_flag(%1,%2)		(%1 |= (1<<(%2&31)))
#define remove_flag(%1,%2)	(%1 &= ~(1<<(%2&31)))
#define check_flag(%1,%2)	(%1 & (1<<(%2&31)))


new g_CTBanned;
new g_vault;

public plugin_init()
{
	register_plugin(PLUGIN, VERSION, AUTHOR)
	
	register_concmd("jb_banct", "concmd_banct", ADMIN_FLAG, "Ban a client from CT!")
	RegisterHam(Ham_Respawn, "player", "fw_player_respawn_post", 1)
	RegisterHam(Ham_Spawn, "player", "fw_player_respawn_post", 1)
	
	g_vault = nvault_open("jailbreak_ctban");
	
	if(g_vault == INVALID_HANDLE)
	{
		set_fail_state("Error opening nVault!");
	}
}

public plugin_end()
{
	nvault_close(g_vault);
}

public fw_player_respawn_post(id)
{
	if(get_user_team(id) == CS_TEAM_CT && check_flag(g_CTBanned,id))
	{
		jointeam_ct(id)
	}
}

jointeam_ct(id)
{
	new sAuthid[32];
	get_user_authid(id, sAuthid, 31)
	
	engclient_cmd(id, "jointeam", "1")
	cs_set_user_team(id, CS_TEAM_T);
	if(is_user_alive(id)) user_kill(id);
	new sValue[64], timestmp;
	nvault_lookup(g_vault, sAuthid, sValue, charsmax(sValue), timestmp)
	new iValue = str_to_num(sValue);
	if(iValue)
	{
		Transfer_seconds(((iValue + timestmp) - get_systime()), sValue, charsmax(sValue))
		ColorChat(id,TEAM_COLOR, "^3Sorry^4, ^1But you are ^4banned ^1from the CT! ^3(^4Ban Lift : %s^3)", sValue)
	}
	else ColorChat(id,TEAM_COLOR, "^3Sorry^4, ^1But you are ^4banned ^1from the CT! ^3(^4Ban Lift : Never^3)")
}

public client_putinserver(id)
{
	if(is_user_bot(id)) return;
	
	check_CTBanned(id);
}

public client_disconnect(id)
{
	if(is_user_bot(id)) return;
	
	if(task_exists(id+TASK_UNBANCT))
		remove_task(id+TASK_UNBANCT)
}

check_CTBanned(id)
{
	new sAuthid[32], sValue[16], iTimestamp;
	get_user_authid(id, sAuthid, charsmax(sAuthid))
	
	if(nvault_lookup(g_vault, sAuthid, sValue, charsmax(sValue), iTimestamp))
	{
		new iValue = str_to_num(sValue);
		
		if(!iValue)
		{
			set_flag(g_CTBanned,id);
			return;
		}
		
		new length = ((iTimestamp + iValue) - get_systime());
		
		if( length <= 0 )
		{
			nvault_remove(g_vault, sAuthid)
		}
		else
		{
			set_task(float(length), "task_unBanCT", id+TASK_UNBANCT)
			set_flag(g_CTBanned,id);
			return;
		}
	}
	
	remove_flag(g_CTBanned,id);
}

public task_unBanCT(const taskid)
{
	new id = taskid - TASK_UNBANCT;
	
	new sAuthid[32];
	get_user_authid(id, sAuthid, charsmax(sAuthid))
	nvault_remove(g_vault, sAuthid)
	
	ColorChat(id,TEAM_COLOR, "You are no longer banned from the CT!")
	
	new sName[32];
	get_user_name(id, sName, charsmax(sName))
	
	remove_flag(g_CTBanned,id);
	
	new players[32], pnum;
	get_players(players, pnum, "ch");
	
	for(new i, player; i < pnum; i++)
	{
		player = players[i];
		if(id != player) ColorChat(player,TEAM_COLOR, "^4%s ^1is no longer ^3banned ^1from the CT!", sName)
	}
	
	remove_task(taskid);
}

public concmd_banct(id, level, cid)
{
	if(!cmd_access(id, level, cid, 2))
		return 1;
	
	new sTarget[32];
	read_argv(1, sTarget, charsmax(sTarget))
	
	new player = cmd_target(id, sTarget, CMDTARGET_NO_BOTS | CMDTARGET_OBEY_IMMUNITY);
	if(!player) return 1;
	
	new sLength[64];
	read_argv(2, sLength, charsmax(sLength))
	
	new iLength = str_to_num(sLength);
	
	if(iLength < 0 || !is_str_num(sLength))
	{
		console_print(id, "Please add a positive length time (inSecond's) Or 0 - for permanent!")
		return 1;
	}
	
	new sAuthid[64];
	get_user_authid(player, sAuthid, charsmax(sAuthid))
	
	new bool:is_CTBanned = check_flag(g_CTBanned,player) ? true:false
	
	if(!is_CTBanned)
	{
		set_flag(g_CTBanned,player)
		nvault_set(g_vault, sAuthid, sLength)
		
		if(iLength > 0)
		{
			set_task(float(iLength), "task_unBanCT", player+TASK_UNBANCT)
			Transfer_seconds(iLength, sAuthid, charsmax(sAuthid))
		}
		
		if(get_user_team(player) == CS_TEAM_CT)
		{
			jointeam_ct(player)
		}
	}
	else
	{
		remove_flag(g_CTBanned,player);
		nvault_remove(g_vault, sAuthid)
	}
	
	is_CTBanned = check_flag(g_CTBanned,player) ? true:false 
	
	new sName[32], sAdminname[32];
	get_user_name(id, sAdminname, charsmax(sAdminname))
	get_user_name(player, sName, charsmax(sName))
	formatex(sLength, charsmax(sLength), "^4Ban Lift: %s ", iLength ? sAuthid:"Never")
	ColorChat(0,TEAM_COLOR, "^4%s ^1has been %s ^1from the CT %s^1By ADMIN ^3%s!", sName, is_CTBanned ? "^3Banned":"^4unBanned", is_CTBanned ? sLength:"", sAdminname)
	formatex(sLength, charsmax(sLength), " LENGTH: %s", iLength ? sAuthid:"Permanent")
	log_amx("ADMIN %s HAS %s %s FROM THE CT%s!",  sAdminname, is_CTBanned ? "^3Banned":"^4unBanned", sName, is_CTBanned ? sLength:"")
	return 1;
}

Transfer_seconds(Seconds, string[], len)
{
	if(Seconds < 0) return 0;
	
	new hours = floatround(Seconds / 3600.0, floatround_floor), iLen
	
	Seconds -= hours * 3600;
	
	new sString[64]
	
	if(hours)
	{
		iLen = formatex(sString, charsmax(sString), "%d Hour%s, ", hours, hours > 1 ? "s":"");
	}
	
	new minutes = floatround(Seconds / 60.0, floatround_floor);
	
	Seconds -= minutes * 60;
	
	if(minutes)
	{
		iLen += formatex(sString[iLen], charsmax(sString), "%d Minute%s, ", minutes, minutes > 1 ? "s":"");
	}
	
	iLen += formatex(sString[iLen], charsmax(sString), "%d Second%s.", Seconds, Seconds > 1 ? "s":"");
	
	copy(string, len, sString);
	return 1;
}


/* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
*{\\ rtf1\\ ansi\\ ansicpg1252\\ deff0{\\ fonttbl{\\ f0\\ fnil\\ fcharset0 Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1033\\ f0\\ fs16 \n\\ par }
*/

Създаване на меню с информация взета от nvault

Публикувано на: 05 Фев 2020, 14:55
от OciXCrom
Изработих отделен плъгин за тази цел:

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

#include <amxmodx>
#tryinclude <nvault_util>

#if !defined _nvault_util_included
	#error "nvault_util.inc" is missing in your "scripting/include" folder. Download it from: "https://amxx-bg.info/forum/inc/"
#endif

new g_iVault
const MAX_KEY_LENGTH = 64

public plugin_init()
{
	register_plugin("[JB] CT BAN: Banlist", "1.0", "OciXCrom")
	register_clcmd("say /ctbans", "Cmd_Banlist")
	register_clcmd("say_team /ctbans", "Cmd_Banlist")
	g_iVault = nvault_util_open("jailbreak_ctban")
}

public plugin_end()
{
	nvault_util_close(g_iVault)
}

public Cmd_Banlist(id)
{
	new iMenu = menu_create("[JB] \wCT Banlist", "Banlist_Handler")
	new iCount = nvault_util_count(g_iVault)

	for(new szItem[MAX_KEY_LENGTH * 2], szKey[MAX_KEY_LENGTH], szValue[MAX_KEY_LENGTH], iPos, i = 1; i <= iCount; i++)
	{
		iPos = nvault_util_read(g_iVault, iPos, szKey, charsmax(szKey), szValue, charsmax(szValue))

		if(szValue[0] == '0')
		{
			formatex(szItem, charsmax(szItem), "%s \r[PERMANENT]", szKey, szValue)
		}
		else
		{
			formatex(szItem, charsmax(szItem), "%s \r[%s seconds]", szKey, szValue)
		}

		menu_additem(iMenu, szItem)
	}

	menu_display(id, iMenu)
	return PLUGIN_HANDLED
}

public Banlist_Handler(id, iMenu, iItem)
{
	menu_destroy(iMenu)
	return PLUGIN_HANDLED
}
Не е тествано.

Създаване на меню с информация взета от nvault

Публикувано на: 05 Фев 2020, 15:21
от boro2277
Благодаря , ще го тествам и ще пиша дали всичко е ок.

Създаване на меню с информация взета от nvault

Публикувано на: 14 Фев 2020, 09:48
от boro2277
Всичко работи идеално може да заключвате темата. Благодаря за помоща.