Преработка на плъгин Rank System

В този раздел можете да подавате всякакви заявки за намиране, изработка или преработка на плъгини/модове.
Аватар
Punch*
Извън линия
Потребител
Потребител
Мнения: 143
Регистриран на: 15 Фев 2018, 20:12
Получена благодарност: 1 път
Обратна връзка:

Преработка на плъгин Rank System

Мнение от Punch* » 19 Фев 2018, 18:40

Здравейте,
някой ако може да ми помогне ,защото аз не мога трябва ми помощ от някого и аз си помислих ,че вие ще ми помогнете. Въпроса е ,че искам admin prefix , color chat и rank system да са в 1 плъгин admin prefix'a да се може и по име и по ип да се зададе prefix . Ето ви кода за ранк система:

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

#include < amxmodx >
#include < amxmisc >
#include < fakemeta >
#include < engine >
#include < colorchat >
#include < hamsandwich >
#include < fun >
#include < nvault >

#define MAXRANKS 32

#define PLUGIN "Cs-G AdminPrefixWithRanks"
#define VERSION "1.3"
#define AUTHOR "Cs-Gaming"

//ПРОМЕНЛИВИ
new PlayerRank[33], message[192]
new sayText, teamInfo, maxPlayers, g_AdminListen,  g_AdminListenFlag,g_MsgHud, gVault
new strName[191], strText[191], alive[11], temp_cvar[2], g_name[32]
new gPlayerPoints[33], give[33],iTarget[33]

new const rankNames[MAXRANKS][] =
{
"[Newbie]", 
"[Rednik]", 
"[Incredible]", 
"[Unstoppable]", 
"[Perfect]", 
"[Ultimate]", 
"[Killer]", 
"[Mega Killer]", 
"[Ultra Killer]", 
"[Predator]", 
"[Terminator]", 
"[Monster]", 
"[Master Guardian I]", 
"[Master Guardian II]", 
"[Advanced]", 
"[Machine]",
"[Hunter]", 
"[Hacker]", 
"[Almost KING]", 
"[Maniac]",
"[Master Guardian Elite]", 
"[Headshoot Machine]", 
"[MASTER]", 
"[Almost PRO]", 
"*PRO*", 
"[ULTRA MASTER]", 
"[Distinguished Master Guardian]", 
"[ProffesionaL]", 
"[Legendary Eagle]", 
"[Legendary Eagle Master]",
"*SUPREME*", 
"[*GLOBAL ELITE*]"
};

new const rankXP[MAXRANKS] =
{
	0, 25, 50, 100, 150, 200, 350, 500, 700, 850, 1100, 1400, 1800, 2400, 3000, 3500, 4300, 5200, 5800, 6500, 7300, 8000, 9600, 10500, 12000, 13800, 15000, 17200, 20000, 21500, 24000, 26000
};
public plugin_init()
{
	register_plugin(PLUGIN, VERSION, AUTHOR)

	register_clcmd("say", "hook_say")
	register_clcmd("say_team", "hook_teamsay")
	register_clcmd("say /myrank", "cmdJumpRank")
	register_clcmd("say_team /myrank", "cmdJumpRank")
	register_clcmd("say /checkrank", "cmdCheckLevel")
	register_clcmd("say_team /checkrank", "cmdCheckLevel")
	register_clcmd("say /rankmenu", "cmdRankMenu", ADMIN_RCON)
	register_clcmd("say_team /rankmenu", "cmdRankMenu", ADMIN_RCON)

	register_concmd("Points_Amount", "cmdTyped", ADMIN_RCON);

	sayText = get_user_msgid("SayText")
	teamInfo = get_user_msgid("TeamInfo")
	maxPlayers = get_maxplayers()
	g_MsgHud = CreateHudSyncObj()
	
	register_message(sayText, "avoid_duplicated")
	register_event("DeathMsg", "Hook_Deathmessage", "a");
	RegisterHam(Ham_Spawn, "player", "player_spawn", 1);
	
	set_task(1.0, "taskHud", 0, _, _, "b")
	
	gVault = nvault_open( "PlayerRanks" );
}

public player_spawn(id)
{
	if( !is_user_alive( id ) ) return;

	if(MAXRANKS == PlayerRank[id]+1)
		ColorChat(id, RED, "[Cs-Gaming]^x01 Your level is ^x04#%d ^x01with rank ^x04%s ^x01. You have got ^x03 %d points", PlayerRank[id]+1, rankNames[PlayerRank[id]], gPlayerPoints[id])
	else
		ColorChat(id, RED, "[Cs-Gaming]^x01 Your level is ^x04#%d ^x01with rank ^x04%s^x01. You have got ^x03 %d^x01 /^x04 %d^x01 points to become^x04 %s^x01.", PlayerRank[id]+1, rankNames[PlayerRank[id]], gPlayerPoints[id], rankXP[PlayerRank[id]+1], rankNames[PlayerRank[id]+1])
	
	switch( PlayerRank[ id ] )
	{
		case 28: set_user_health( id, get_user_health( id ) + 5 );
		case 29: set_user_health( id, get_user_health( id ) + 10 );
		case 30: set_user_health( id, get_user_health( id ) + 15 );
		case 31: set_user_health( id, get_user_health( id ) + 20 );
		case 32: set_user_health( id, get_user_health( id ) + 30 );
	}
}

public cmdCheckLevel(id)
{
	new iMenu = menu_create("\yCs-Gaming \d- \wChoose Player\r:", "checklevel_menu_handler")
	
	new iPlayers[32], iNum, iTarget;
	new UserName[34], szTempID[10];
	get_players(iPlayers, iNum);
	for(new i; i < iNum; i++)
	{
		iTarget = iPlayers[i];
		if(!is_user_connected(iTarget))
			continue;
		get_user_name(iTarget, UserName, sizeof UserName - 1);
		num_to_str(iTarget, szTempID, charsmax(szTempID));
		menu_additem(iMenu, UserName, szTempID);
	}
	menu_setprop(iMenu, MPROP_EXIT, MEXIT_ALL);
	menu_display(id, iMenu, 0);
}

public checklevel_menu_handler(id, iMenu, Item)
{
	if(Item == MENU_EXIT)
	{
		menu_destroy(iMenu);
		return PLUGIN_HANDLED;
	}
	new iData[6], iName[64];
	new access, callback;
	menu_item_getinfo(iMenu, Item, access, iData, charsmax(iData), iName, charsmax(iName), callback);
	new target = str_to_num(iData);
	if(!is_user_connected(target))
	{
		ColorChat(id, GREEN, "[Cs-Gaming]^x01 The player you chose is not in the server.")
		menu_destroy(iMenu);
		cmdCheckLevel(id);
		return PLUGIN_HANDLED;
	}
	menu_destroy(iMenu);
	new szText[256], player_name[32];
	get_user_name(target, player_name, 31);
	if(MAXRANKS == PlayerRank[target]+1)
		formatex(szText, charsmax(szText), "<html><head></head><body><br/>Name: %s<br/>Points: %d<br/>Level: %d/%d<br/>Rank: %s<br/></body></html>", player_name, gPlayerPoints[target], PlayerRank[target]+1, MAXRANKS, rankNames[PlayerRank[target]]);
	else
		formatex(szText, charsmax(szText), "<html><head></head><body><br/>Name: %s<br/>Points: %d/%d<br/>Level: %d/%d<br/>Rank: %s<br/>Next Rank: %s</body></html>", player_name, gPlayerPoints[target], rankXP[PlayerRank[target]+1], PlayerRank[target]+1, MAXRANKS, rankNames[PlayerRank[target]], rankNames[PlayerRank[target]+1]);
	show_motd(id, szText, "Cs-Gaming Rank System");
	cmdCheckLevel(id);
	return PLUGIN_HANDLED;
}

public taskHud()
{
	new iPlayers[32], iNum, iTarget;
	get_players(iPlayers, iNum);
	for(new i; i < iNum; i++)
	{
		iTarget = iPlayers[i];
		if(!is_user_connected(iTarget))
			continue;
	
		set_hudmessage(0, 139, 139, 0.02, 0.17, 0, 6.0, 12.0)
		if(MAXRANKS == PlayerRank[iTarget]+1)
			ShowSyncHudMsg(iTarget, g_MsgHud, "Level: %d/%d^nRank : %s^nPoints : %d",PlayerRank[iTarget]+1, MAXRANKS, rankNames[PlayerRank[iTarget]], gPlayerPoints[iTarget])
		else
			ShowSyncHudMsg(iTarget, g_MsgHud, "Level: %d/%d^nRank : %s^nPoints : %d/%d",PlayerRank[iTarget]+1, MAXRANKS, rankNames[PlayerRank[iTarget]], gPlayerPoints[iTarget], rankXP[PlayerRank[iTarget]+1])
	}
}

public cmdJumpRank(id)
{
	if(MAXRANKS == PlayerRank[id]+1)
		ColorChat(id, RED, "[Cs-Gaming]^x01 Your level is ^x04#%d ^x01| Rank ^x04%s ^x01| Points:^x03 %d", PlayerRank[id]+1, rankNames[PlayerRank[id]], gPlayerPoints[id])
	else
		ColorChat(id, RED, "[Cs-Gaming^x01 Your level is ^x04#%d ^x01| Rank ^x04%s ^x01| Points:^x03 %d^x01 /^x04 %d^x01 to become^x04 %s^x01.", PlayerRank[id]+1, rankNames[PlayerRank[id]], gPlayerPoints[id], rankXP[PlayerRank[id]+1], rankNames[PlayerRank[id]+1])
}

public cmdRankMenu(id, level, cid)
{
	if(!cmd_access(id, level, cid, 1))
		return PLUGIN_HANDLED;
	new iMenu = menu_create("Rank Menu", "rankmenu_menu_handler")
	menu_additem(iMenu, "Give Points", "1");
	menu_additem(iMenu, "Take Points", "2");
	menu_setprop(iMenu, MPROP_EXIT, MEXIT_ALL);
	menu_display(id, iMenu, 0);
	return PLUGIN_CONTINUE;
}

public rankmenu_menu_handler(id, iMenu, Item)
{
	if(Item == MENU_EXIT)
	{
		menu_destroy(iMenu);
		return PLUGIN_HANDLED;
	}
	new iData[6], iName[64];
	new access, callback;
	menu_item_getinfo(iMenu, Item, access, iData, charsmax(iData), iName, charsmax(iName), callback);
	give[id] = str_to_num(iData);
	GiveTakeMenu(id);
	return PLUGIN_HANDLED;
}

public GiveTakeMenu(id)
{
	static szText[64]
	formatex(szText, 63, "%s Points", give[id] == 1 ? "Give" : "Take")
	new iMenu = menu_create(szText, "givetake_menu_handler")

	new iPlayers[32], iNum, iTarget;
	new UserName[34], szTempID[10];
	get_players(iPlayers, iNum);
	for(new i; i < iNum; i++)
	{
		iTarget = iPlayers[i];
		if(!is_user_connected(iTarget))
			continue;
		get_user_name(iTarget, UserName, sizeof UserName - 1);
		num_to_str(iTarget, szTempID, charsmax(szTempID));
		menu_additem(iMenu, UserName, szTempID);
	}
	menu_setprop(iMenu, MPROP_EXIT, MEXIT_ALL);
	menu_display(id, iMenu, 0);
}

public givetake_menu_handler(id, iMenu, Item)
{
	if(Item == MENU_EXIT)
	{
		menu_destroy(iMenu);
		return PLUGIN_HANDLED;
	}

	new iData[6], iName[64];
	new access, callback;
	menu_item_getinfo(iMenu, Item, access, iData, charsmax(iData), iName, charsmax(iName), callback);
	iTarget[id] = str_to_num(iData);
	if(!is_user_connected(iTarget[id]))
	{
		iTarget[id] = 0
		ColorChat(id, GREEN, "[Cs-Gaming]^x01 The player you chose is not in the server.")
		return PLUGIN_HANDLED;
	}
	menu_destroy(iMenu);
	client_cmd(id, "messagemode Points_Amount");
	return PLUGIN_HANDLED;
}

public cmdTyped(id, level, cid)
{
	if(!cmd_access(id, level, cid, 1))
		return PLUGIN_HANDLED;

	if(!iTarget[id] || give[id] <= 0)
		return PLUGIN_HANDLED;
	if(!is_user_connected(iTarget[id]))
	{
		ColorChat(id, RED, "[Cs-Gaming]^x01 The player you chose is not in the server.")
		return PLUGIN_HANDLED;
	}

	new iTyped[12];
	read_argv(1, iTyped, sizeof iTyped - 1);
	new g_points = str_to_num(iTyped)
	new AdminName[32], PlayerName[32];
	get_user_name(id, AdminName, 31)
	get_user_name(iTarget[id], PlayerName, 31)
	if(give[id] == 1)
	{
		gPlayerPoints[iTarget[id]] += g_points
		ColorChat(0, GREEN,"[Cs-Gaming]^x03 %s^x01 gave^x04 %d^x01 rank points to^x03 %s^x01.", AdminName, g_points, PlayerName)
	}
	else
	{
		if(g_points > gPlayerPoints[iTarget[id]])
			gPlayerPoints[iTarget[id]] = 0
		else
			gPlayerPoints[iTarget[id]] -= g_points;
		ColorChat(0, GREEN,"[Cs-Gaming]^x03 %s^x01 took^x04 %d^x01 rank points from^x03 %s^x01.", AdminName, g_points, PlayerName)
	}
	new currentPlayerRank = 0;
	while(currentPlayerRank < (MAXRANKS - 1))
	{       
		if(gPlayerPoints[iTarget[id]] >= rankXP[currentPlayerRank + 1])
			++currentPlayerRank;     
		else         
			break;
	}
	PlayerRank[iTarget[id]] = currentPlayerRank;
	iTarget[id] = 0;
	GiveTakeMenu(id);
	Save( id );
	return PLUGIN_HANDLED;
}

public client_authorized( id )
{
	Load( id );
}

public client_disconnect( id )
{
	Save( id );
}

public client_putinserver(id)
{
	new currentPlayerRank = 0;
	while(currentPlayerRank < (MAXRANKS - 1))
	{       
		if(gPlayerPoints[id] >= rankXP[currentPlayerRank + 1])
			++currentPlayerRank;     
		else         
			break;
	}
	PlayerRank[id] = currentPlayerRank;
}

public Load( id )
{
	if( !is_user_bot( id ) && !is_user_hltv( id ) )
	{
		new vaultkey[ 64 ], vaultdata[ 256 ], points[ 33 ], UserName[ 33 ];
		get_user_name( id, UserName, charsmax( UserName ) );
		
		format( vaultkey, charsmax( vaultkey ), "%s", UserName );
		format( vaultdata, charsmax( vaultdata ), "%i#", gPlayerPoints[ id ] );
		
		nvault_get( gVault, vaultkey, vaultdata, 255 );
		replace_all( vaultdata, 255, "#", " " );
		
		parse( vaultdata, points, 32 );
		gPlayerPoints[ id ] = str_to_num( points );
	}
}

public Save( id )
{
	if( !is_user_bot( id ) && !is_user_hltv( id ) )
	{
		new vaultkey[ 64 ], vaultdata[ 256 ], UserName[ 33 ];
		get_user_name( id, UserName, charsmax( UserName ) );
		
		format( vaultkey, charsmax( vaultkey ), "%s", UserName );
		format( vaultdata, charsmax( vaultdata ), "%i#", gPlayerPoints[ id ] );
		
		nvault_set( gVault, vaultkey, vaultdata );
	}
}

public avoid_duplicated(msgId, msgDest, receiver)
	return PLUGIN_HANDLED;

public hook_say(id)
{
	read_args(message, 191)
	remove_quotes(message)

	if(message[0] == '@' || message[0] == '/' || message[0] == '!' || message[0] == '#' || message[0] == '$' || equal(message, ""))
		return PLUGIN_CONTINUE

	get_user_name(id, g_name, charsmax(g_name))

	new isAlive	

	if(is_user_alive(id))
	{
		isAlive = 1
		alive = "^x01"
	}
	else
	{
		isAlive = 0
		alive = "^x01*DEAD* "
	}

	static  color[10]
	{
		get_user_name(id, g_name, 32)
		get_user_team(id, color, 9)
		format(strName, 191, "%s^x04%s ^x03%s", alive, rankNames[PlayerRank[id]], g_name)
		format(strText, 191, "%s", message)
	}

	format(message, 191, "%s ^x01: %s", strName, strText)

	sendMessage(color, isAlive)// Sends the colored message
	return PLUGIN_CONTINUE;
}

public hook_teamsay(id)
{
	read_args(message, 191)
	remove_quotes(message)

	if(message[0] == '@' || message[0] == '/' || message[0] == '!' || message[0] == '#' || message[0] == '$' || equal(message, "")) // Ignores Admin Hud Messages, Admin Slash commands
		return PLUGIN_CONTINUE

	new playerTeam = get_user_team(id)
	new playerTeamName[19]

	switch(playerTeam) // Team names which appear on team-only messages
	{
		case 1: copy(playerTeamName, 11, "Terrorists")
		case 2: copy(playerTeamName, 18, "Counter-Terrorists")
		default: copy(playerTeamName, 9, "Spectator")
	}

	get_user_name(id, g_name, charsmax(g_name))
	new isAlive	

	if(is_user_alive(id))
	{
		isAlive = 1
		alive = "^x01"
	}
	else
	{
		isAlive = 0
		alive = "^x01*DEAD* "
	}

	static  color[10]
	{
		get_user_name(id, g_name, 32)
		get_user_team(id, color, 9);
		format(strName, 191, "%s(%s) ^x04%s ^x03%s", alive, playerTeamName, rankNames[PlayerRank[id]], g_name)
		format(strText, 191, "%s", message)
	}

	format(message, 191, "%s ^x01: %s", strName, strText)
	sendTeamMessage(color, isAlive, playerTeam)
	return PLUGIN_CONTINUE
}

public sendMessage(color[], alive)
{
	new teamName[10]
   
	for(new player = 1; player < maxPlayers; player++)
	{
		if(!is_user_connected(player))
			continue

		get_pcvar_string(g_AdminListenFlag, temp_cvar, charsmax(temp_cvar))
		if(alive && is_user_alive(player) || !alive && !is_user_alive(player) || get_pcvar_num(g_AdminListen) && get_user_flags(player) & read_flags(temp_cvar))
		{
			get_user_team(player, teamName, 9)// Stores user's team name to change back after sending the message
			changeTeamInfo(player, color)// Changes user's team according to color choosen
			writeMessage(player, message)// Writes the message on player's chat
			changeTeamInfo(player, teamName)// Changes user's team back to original
		}
	}
}

public sendTeamMessage(color[], alive, playerTeam)
{
	new teamName[10]

	for(new player = 1; player < maxPlayers; player++)
	{
		if(!is_user_connected(player))
			continue

		get_pcvar_string(g_AdminListenFlag, temp_cvar, charsmax(temp_cvar))
		if(get_user_team(player) == playerTeam || get_pcvar_num(g_AdminListen) && get_user_flags(player) & read_flags(temp_cvar))
		{
			if(alive && is_user_alive(player) || !alive && !is_user_alive(player) || get_pcvar_num(g_AdminListen) && get_user_flags(player) & read_flags(temp_cvar))
			{
				get_user_team(player, teamName, 9)// Stores user's team name to change back after sending the message
				changeTeamInfo(player, color)// Changes user's team according to color choosen
				writeMessage(player, message)// Writes the message on player's chat
				changeTeamInfo(player, teamName)// Changes user's team back to original
			}
		}
	}
}


public changeTeamInfo(player, team[])
{
	message_begin(MSG_ONE, teamInfo, _, player)// Tells to to modify teamInfo(Which is responsable for which time player is)
	write_byte(player)// Write byte needed
	write_string(team)// Changes player's team
	message_end()// Also Needed
}


public writeMessage(player, message[])
{
	message_begin(MSG_ONE, sayText, {0, 0, 0}, player)// Tells to modify sayText(Which is responsable for writing colored messages)
	write_byte(player)// Write byte needed
	write_string(message)// Effectively write the message, finally, afterall
	message_end()// Needed as always
}

public Hook_Deathmessage()
{
	new killer = read_data(1);
	new victim = read_data(2);

	if(killer == victim)
		return PLUGIN_CONTINUE;
	if(!killer || killer > maxPlayers)
		return PLUGIN_CONTINUE;

	gPlayerPoints[killer]++
	new currentPlayerRank = 0;
	while(currentPlayerRank < (MAXRANKS - 1))
	{       
		if(gPlayerPoints[killer] >= rankXP[currentPlayerRank + 1])
			++currentPlayerRank;     
		else         
			break;
	}
	new OldRank = PlayerRank[killer]
	PlayerRank[killer] = currentPlayerRank
	Save( killer );
	if(OldRank < currentPlayerRank)
	{
		new g_name[32]
		get_user_name(killer, g_name, 31)
		ColorChat(0, GREEN, "[Cs-Gaming] ^1Congratulations! ^x03%s^x01 got a new rank ^x04%s", g_name, rankNames[PlayerRank[killer]])
	}
	return PLUGIN_CONTINUE;
}
/* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
*{\\ rtf1\\ ansi\\ ansicpg1251\\ deff0\\ deflang1026{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ f0\\ fs16 \n\\ par }
*/
Ето и за Chat Manager:

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

#include <amxmodx>
#include <amxmisc>
#include <cromchat>
#include <cstrike>

#define PLUGIN_VERSION "3.6.5"
#define DELAY_ON_REGISTER 1.0
#define DELAY_ON_CONNECT 1.0
#define DELAY_ON_CHANGE 0.1
#define PLACEHOLDER_LENGTH 64

/* 	You can comment placeholders you don't need from the lines below and that will completely deactivate them.
	You can also activate the additional ones if you want to use them.
	Feel free to experiment in making your custom ones as well. */
	
#define ARG_ADMIN_PREFIX 		"%admin_prefix%"
#define ARG_DEAD_PREFIX 		"%dead_prefix%"
#define ARG_TEAM 				"%team%"
#define ARG_NAME 				"%name%"
#define ARG_IP 					"%ip%"
#define ARG_STEAM 				"%steam%"
#define ARG_USERID 				"%userid%"
#define ARG_CHAT_COLOR 			"%chat_color%"
#define ARG_MESSAGE 			"%message%"
#define ARG_TIME 				"%time%"
#define ARG_RANK				"%rank%"
//#define ARG_HEALTH 			"%health%"
//#define ARG_ARMOR 			"%armor%"
//#define ARG_FRAGS 			"%frags%"
//#define ARG_DEATHS 			"%deaths%"
//#define ARG_CITY 				"%city%"
//#define ARG_COUNTRY 			"%country%"
//#define ARG_COUNTRY_CODE 		"%country_code%"
//#define ARG_CONTINENT 		"%continent%"
//#define ARG_CONTINENT_CODE 	"%continent_code%"

/*	The settings end here. Don't modify anything below this if you don't know what you're doing. */

#if defined ARG_CITY || defined ARG_COUNTRY || defined ARG_COUNTRY_CODE || defined ARG_CONTINENT || defined ARG_CONTINENT_CODE
	#include <geoip>
#endif

#if defined ARG_RANK
native get_rank_prefix(id, prefix[], len)
#endif

enum
{
	SECTION_NONE,
	SECTION_SETTINGS,
	SECTION_ADMIN_PREFIXES,
	SECTION_CHAT_COLORS,
	SECTION_NAME_IP_STEAM
}

enum _:Settings
{
	ADMIN_LISTEN_FLAGS[32],
	DEAD_PREFIX[32],
	ALIVE_PREFIX[32],
	TEAM_PREFIX_T[32],
	TEAM_PREFIX_CT[32],
	TEAM_PREFIX_SPEC[32],
	ERROR_TEXT[32],
	FORMAT_TIME[64],
	FORMAT_SAY[160],
	FORMAT_SAY_TEAM[160],
	bool:ALL_CHAT
}

enum _:PlayerData
{
	PDATA_NAME[32],
	PDATA_NAME_LOWER[32],
	PDATA_IP[16],
	PDATA_STEAM[35],
	PDATA_USERID[10],
	PDATA_PREFIX[32],
	PDATA_CHAT_COLOR[6],
	bool:PDATA_ADMIN_LISTEN
}

new g_eSettings[Settings],
	g_ePlayerData[33][PlayerData],
	Array:g_aAdminFlags,
	Array:g_aAdminPrefixes,
	Array:g_aChatColors,
	Array:g_aChatColorsFlags,
	Trie:g_tName,
	Trie:g_tIP,
	Trie:g_tSteam,
	Trie:g_tBlockFirst,
	g_iAdminPrefixes,
	g_iChatColors

public plugin_init()
{
	register_plugin("Chat Manager", PLUGIN_VERSION, "OciXCrom")
	register_cvar("CRXChatManager", PLUGIN_VERSION, FCVAR_SERVER|FCVAR_SPONLY|FCVAR_UNLOGGED)
	set_task(DELAY_ON_REGISTER, "RegisterCommands")
	g_aAdminFlags = ArrayCreate(32)
	g_aAdminPrefixes = ArrayCreate(32)
	g_aChatColors = ArrayCreate(6)
	g_aChatColorsFlags = ArrayCreate(32)
	g_tBlockFirst = TrieCreate()
	g_tName = TrieCreate()
	g_tIP = TrieCreate()
	g_tSteam = TrieCreate()
	ReadFile()
}

public plugin_end()
{
	ArrayDestroy(g_aAdminFlags)
	ArrayDestroy(g_aAdminPrefixes)
	ArrayDestroy(g_aChatColors)
	ArrayDestroy(g_aChatColorsFlags)
	TrieDestroy(g_tBlockFirst)
	TrieDestroy(g_tName)
	TrieDestroy(g_tIP)
	TrieDestroy(g_tSteam)
}

public RegisterCommands()
{
	register_clcmd("say", "Hook_Say")
	register_clcmd("say_team", "Hook_Say")
}

public client_putinserver(id)
{
	get_user_name(id, g_ePlayerData[id][PDATA_NAME], charsmax(g_ePlayerData[][PDATA_NAME]))
	copy(g_ePlayerData[id][PDATA_NAME_LOWER], charsmax(g_ePlayerData[][PDATA_NAME_LOWER]), g_ePlayerData[id][PDATA_NAME])
	strtolower(g_ePlayerData[id][PDATA_NAME_LOWER])
	get_user_ip(id, g_ePlayerData[id][PDATA_IP], charsmax(g_ePlayerData[][PDATA_IP]), 1)
	get_user_authid(id, g_ePlayerData[id][PDATA_STEAM], charsmax(g_ePlayerData[][PDATA_STEAM]))
	num_to_str(get_user_userid(id), g_ePlayerData[id][PDATA_USERID], charsmax(g_ePlayerData[][PDATA_USERID]))
	set_task(DELAY_ON_CONNECT, "UpdateData", id)
}
	
public client_infochanged(id)
{
	if(!is_user_connected(id))
		return
		
	static szNewName[32]
	get_user_info(id, "name", szNewName, charsmax(szNewName))
	
	if(!equal(szNewName, g_ePlayerData[id][PDATA_NAME]))
	{
		copy(g_ePlayerData[id][PDATA_NAME], charsmax(g_ePlayerData[][PDATA_NAME]), szNewName)
		copy(g_ePlayerData[id][PDATA_NAME_LOWER], charsmax(g_ePlayerData[][PDATA_NAME_LOWER]), szNewName)
		strtolower(g_ePlayerData[id][PDATA_NAME_LOWER])
		set_task(DELAY_ON_CHANGE, "UpdateData", id)
	}
}
	
public UpdateData(id)
{
	if(g_iChatColors)
	{
		g_ePlayerData[id][PDATA_CHAT_COLOR][0] = EOS
		
		for(new szFlags[32], i; i < g_iChatColors; i++)
		{
			ArrayGetString(g_aChatColorsFlags, i, szFlags, charsmax(szFlags))
			
			if(has_all_flags(id, szFlags))
			{
				ArrayGetString(g_aChatColors, i, g_ePlayerData[id][PDATA_CHAT_COLOR], charsmax(g_ePlayerData[][PDATA_CHAT_COLOR]))
				break
			}
		}
	}
	
	if(g_eSettings[ADMIN_LISTEN_FLAGS][0])
		g_ePlayerData[id][PDATA_ADMIN_LISTEN] = bool:has_all_flags(id, g_eSettings[ADMIN_LISTEN_FLAGS])
		
	g_ePlayerData[id][PDATA_PREFIX][0] = EOS
		
	if(TrieKeyExists(g_tSteam, g_ePlayerData[id][PDATA_STEAM]))
		TrieGetString(g_tSteam, g_ePlayerData[id][PDATA_STEAM], g_ePlayerData[id][PDATA_PREFIX], charsmax(g_ePlayerData[][PDATA_PREFIX]))
	else if(TrieKeyExists(g_tIP, g_ePlayerData[id][PDATA_IP]))
		TrieGetString(g_tIP, g_ePlayerData[id][PDATA_IP], g_ePlayerData[id][PDATA_PREFIX], charsmax(g_ePlayerData[][PDATA_PREFIX]))
	else if(TrieKeyExists(g_tName, g_ePlayerData[id][PDATA_NAME_LOWER]))
		TrieGetString(g_tName, g_ePlayerData[id][PDATA_NAME_LOWER], g_ePlayerData[id][PDATA_PREFIX], charsmax(g_ePlayerData[][PDATA_PREFIX]))
	else if(g_iAdminPrefixes)
	{
		for(new szFlags[32], i; i < g_iAdminPrefixes; i++)
		{
			ArrayGetString(g_aAdminFlags, i, szFlags, charsmax(szFlags))
			
			if(has_all_flags(id, szFlags))
			{
				ArrayGetString(g_aAdminPrefixes, i, g_ePlayerData[id][PDATA_PREFIX], charsmax(g_ePlayerData[][PDATA_PREFIX]))
				break
			}
		}
	}
}

public Hook_Say(id)
{
	if(!is_user_connected(id))
		return PLUGIN_HANDLED
		
	new szArgs[192]
	read_args(szArgs, charsmax(szArgs)); remove_quotes(szArgs)
	CC_RemoveColors(szArgs, charsmax(szArgs))
	
	new szFirstChar[2]
	szFirstChar[0] = szArgs[0]
	
	if(!szArgs[0] || TrieKeyExists(g_tBlockFirst, szFirstChar))
		return PLUGIN_HANDLED
		
	new szCommand[5]
	read_argv(0, szCommand, charsmax(szCommand))
	
	new szMessage[192], iPlayers[32], iPnum, bool:bTeam = szCommand[3] == '_', iAlive = is_user_alive(id), CsTeams:iTeam = cs_get_user_team(id)
	format_chat_message(bTeam, id, iAlive, iTeam, szArgs, szMessage, charsmax(szMessage))
	get_players(iPlayers, iPnum, "ch")
	
	for(new i, iPlayer; i < iPnum; i++)
	{
		iPlayer = iPlayers[i]
		
		if(g_ePlayerData[iPlayer][PDATA_ADMIN_LISTEN] || (bTeam && iTeam == cs_get_user_team(iPlayer) && iAlive == is_user_alive(iPlayer)) || (!bTeam && (g_eSettings[ALL_CHAT] || iAlive == is_user_alive(iPlayer))))
			CC_SendMatched(iPlayer, id, szMessage)
	}
	
	return PLUGIN_HANDLED
}

ReadFile()
{
	new szConfigsName[256], szFilename[256]
	get_configsdir(szConfigsName, charsmax(szConfigsName))
	formatex(szFilename, charsmax(szFilename), "%s/ChatManager.ini", szConfigsName)
	
	new iFilePointer = fopen(szFilename, "rt")
	
	if(iFilePointer)
	{
		new szData[192], szValue[160], szKey[32], szInfo[32], szPrefix[32], iSection = SECTION_NONE, iSize
		
		while(!feof(iFilePointer))
		{
			fgets(iFilePointer, szData, charsmax(szData))
			trim(szData)
			
			switch(szData[0])
			{
				case EOS, ';': continue
				case '[':
				{
					iSize = strlen(szData)
					
					if(szData[iSize - 1] == ']')
					{
						switch(szData[1])
						{
							case 'S', 's': iSection = SECTION_SETTINGS
							case 'A', 'a': iSection = SECTION_ADMIN_PREFIXES
							case 'C', 'c': iSection = SECTION_CHAT_COLORS
							case 'N', 'n': iSection = SECTION_NAME_IP_STEAM
							default: iSection = SECTION_NONE
						}
					}
					else continue
				}
				default:
				{
					if(iSection == SECTION_NONE)
						continue
						
					switch(iSection)
					{
						case SECTION_SETTINGS:
						{
							strtok(szData, szKey, charsmax(szKey), szValue, charsmax(szValue), '=')
							trim(szKey); trim(szValue)
									
							if(!szValue[0])
								continue
								
							if(equal(szKey, "ADMIN_LISTEN_FLAGS"))
								copy(g_eSettings[ADMIN_LISTEN_FLAGS], charsmax(g_eSettings[ADMIN_LISTEN_FLAGS]), szValue)
							else if(equal(szKey, "BLOCK_FIRST_SYMBOLS"))
							{
								while(szValue[0] != 0 && strtok(szValue, szKey, charsmax(szKey), szValue, charsmax(szValue), ','))
								{
									trim(szKey); trim(szValue)
									TrieSetCell(g_tBlockFirst, szKey, 1)
								}
							}
							else if(equal(szKey, "DEAD_PREFIX"))
								copy(g_eSettings[DEAD_PREFIX], charsmax(g_eSettings[DEAD_PREFIX]), szValue)
							else if(equal(szKey, "ALIVE_PREFIX"))
								copy(g_eSettings[ALIVE_PREFIX], charsmax(g_eSettings[ALIVE_PREFIX]), szValue)
							else if(equal(szKey, "TEAM_PREFIX_T"))
								copy(g_eSettings[TEAM_PREFIX_T], charsmax(g_eSettings[TEAM_PREFIX_T]), szValue)
							else if(equal(szKey, "TEAM_PREFIX_CT"))
								copy(g_eSettings[TEAM_PREFIX_CT], charsmax(g_eSettings[TEAM_PREFIX_CT]), szValue)
							else if(equal(szKey, "TEAM_PREFIX_SPEC"))
								copy(g_eSettings[TEAM_PREFIX_SPEC], charsmax(g_eSettings[TEAM_PREFIX_SPEC]), szValue)
							else if(equal(szKey, "ERROR_TEXT"))
								copy(g_eSettings[ERROR_TEXT], charsmax(g_eSettings[ERROR_TEXT]), szValue)
							else if(equal(szKey, "FORMAT_TIME"))
								copy(g_eSettings[FORMAT_TIME], charsmax(g_eSettings[FORMAT_TIME]), szValue)
							else if(equal(szKey, "FORMAT_SAY"))
								copy(g_eSettings[FORMAT_SAY], charsmax(g_eSettings[FORMAT_SAY]), szValue)
							else if(equal(szKey, "FORMAT_SAY_TEAM"))
								copy(g_eSettings[FORMAT_SAY_TEAM], charsmax(g_eSettings[FORMAT_SAY_TEAM]), szValue)
							else if(equal(szKey, "ALL_CHAT"))
								g_eSettings[ALL_CHAT] = _:clamp(str_to_num(szValue), false, true)
						}
						case SECTION_ADMIN_PREFIXES:
						{
							strtok(szData, szKey, charsmax(szKey), szValue, charsmax(szValue), '=')
							trim(szKey); trim(szValue)
									
							if(!szValue[0])
								continue
								
							ArrayPushString(g_aAdminFlags, szKey)
							ArrayPushString(g_aAdminPrefixes, szValue)
							g_iAdminPrefixes++
						}
						case SECTION_CHAT_COLORS:
						{
							strtok(szData, szKey, charsmax(szKey), szValue, charsmax(szValue), '=')
							trim(szKey); trim(szValue)
									
							if(!szValue[0])
								continue
								
							ArrayPushString(g_aChatColorsFlags, szKey)
							ArrayPushString(g_aChatColors, szValue)
							g_iChatColors++
						}
						case SECTION_NAME_IP_STEAM:
						{
							parse(szData, szKey, charsmax(szKey), szInfo, charsmax(szInfo), szPrefix, charsmax(szPrefix))
							{
								switch(szKey[0])
								{
									case 'N', 'n': { strtolower(szInfo); TrieSetString(g_tName, szInfo, szPrefix); }
									case 'I', 'i': TrieSetString(g_tIP, szInfo, szPrefix)
									case 'S', 's': TrieSetString(g_tSteam, szInfo, szPrefix)
								}
							}
						}
					}
				}
			}
		}
		
		fclose(iFilePointer)
	}
}

format_chat_message(const bool:bTeam, const id, const iAlive, const CsTeams:iTeam, const szArgs[], szMessage[], const iLen)
{
	static szPlaceHolder[PLACEHOLDER_LENGTH]
	copy(szMessage, iLen, g_eSettings[bTeam ? FORMAT_SAY_TEAM : FORMAT_SAY])
	
	#if defined ARG_ADMIN_PREFIX
	replace_all(szMessage, iLen, ARG_ADMIN_PREFIX, g_ePlayerData[id][PDATA_PREFIX])
	#endif
	
	#if defined ARG_DEAD_PREFIX
	replace_all(szMessage, iLen, ARG_DEAD_PREFIX, g_eSettings[iAlive ? ALIVE_PREFIX : DEAD_PREFIX])
	#endif
	
	#if defined ARG_TEAM
	replace_all(szMessage, iLen, ARG_TEAM, g_eSettings[iTeam == CS_TEAM_CT ? TEAM_PREFIX_CT : iTeam == CS_TEAM_T ? TEAM_PREFIX_T : TEAM_PREFIX_SPEC])
	#endif
	
	#if defined ARG_NAME
	replace_all(szMessage, iLen, ARG_NAME, g_ePlayerData[id][PDATA_NAME])
	#endif
	
	#if defined ARG_IP
	replace_all(szMessage, iLen, ARG_IP, g_ePlayerData[id][PDATA_IP])
	#endif
	
	#if defined ARG_STEAM
	replace_all(szMessage, iLen, ARG_STEAM, g_ePlayerData[id][PDATA_STEAM])
	#endif
	
	#if defined ARG_USERID
	replace_all(szMessage, iLen, ARG_USERID, g_ePlayerData[id][PDATA_USERID])
	#endif
	
	#if defined ARG_CHAT_COLOR
	replace_all(szMessage, iLen, ARG_CHAT_COLOR, g_ePlayerData[id][PDATA_CHAT_COLOR])
	#endif
	
	#if defined ARG_MESSAGE
	replace_all(szMessage, iLen, ARG_MESSAGE, szArgs)	
	#endif
	
	#if defined ARG_TIME
	if(has_argument(szMessage, ARG_TIME))
	{
		get_time(g_eSettings[FORMAT_TIME], szPlaceHolder, charsmax(szPlaceHolder))
		replace_all(szMessage, iLen, ARG_TIME, szPlaceHolder)
	}
	#endif
	
	#if defined ARG_RANK
	if(has_argument(szMessage, ARG_RANK))
	{
		get_rank_prefix(id, szPlaceHolder, charsmax(szPlaceHolder))
		replace_all(szMessage, iLen, ARG_RANK, szPlaceHolder)
	}
	#endif
	
	#if defined ARG_HEALTH
	if(has_argument(szMessage, ARG_HEALTH))
	{
		num_to_str(iAlive ? get_user_health(id) : 0, szPlaceHolder, charsmax(szPlaceHolder))
		replace_all(szMessage, iLen, ARG_HEALTH, szPlaceHolder)
	}
	#endif
	
	#if defined ARG_ARMOR
	if(has_argument(szMessage, ARG_ARMOR))
	{
		num_to_str(iAlive ? get_user_armor(id) : 0, szPlaceHolder, charsmax(szPlaceHolder))
		replace_all(szMessage, iLen, ARG_ARMOR, szPlaceHolder)
	}
	#endif
	
	#if defined ARG_FRAGS
	if(has_argument(szMessage, ARG_FRAGS))
	{
		num_to_str(get_user_frags(id), szPlaceHolder, charsmax(szPlaceHolder))
		replace_all(szMessage, iLen, ARG_FRAGS, szPlaceHolder)
	}
	#endif
	
	#if defined ARG_DEATHS
	if(has_argument(szMessage, ARG_DEATHS))
	{
		num_to_str(cs_get_user_deaths(id), szPlaceHolder, charsmax(szPlaceHolder))
		replace_all(szMessage, iLen, ARG_DEATHS, szPlaceHolder)
	}
	#endif
	
	#if defined ARG_CITY
	if(has_argument(szMessage, ARG_CITY))
	{
		geoip_city(g_ePlayerData[id][PDATA_IP], szPlaceHolder, charsmax(szPlaceHolder))
		check_validity(szPlaceHolder, charsmax(szPlaceHolder))
		replace_all(szMessage, iLen, ARG_CITY, szPlaceHolder)
	}
	#endif
	
	#if defined ARG_COUNTRY
	if(has_argument(szMessage, ARG_COUNTRY))
	{
		#if defined geoip_country_ex
		geoip_country_ex(g_ePlayerData[id][PDATA_IP], szPlaceHolder, charsmax(szPlaceHolder))
		#else
		geoip_country(g_ePlayerData[id][PDATA_IP], szPlaceHolder, charsmax(szPlaceHolder))
		#endif
		
		check_validity(szPlaceHolder, charsmax(szPlaceHolder))
		replace_all(szMessage, iLen, ARG_COUNTRY, szPlaceHolder)
	}
	#endif
	
	#if defined ARG_COUNTRY_CODE
	if(has_argument(szMessage, ARG_COUNTRY_CODE))
	{
		new szCountryCode[3]
		
		#if defined geoip_code2_ex
		geoip_code2_ex(g_ePlayerData[id][PDATA_IP], szCountryCode)
		#else
		geoip_code2(g_ePlayerData[id][PDATA_IP], szCountryCode)
		#endif
		
		check_validity(szCountryCode, charsmax(szCountryCode))
		replace_all(szMessage, iLen, ARG_COUNTRY_CODE, szCountryCode)
	}
	#endif
	
	#if defined ARG_CONTINENT
	if(has_argument(szMessage, ARG_CONTINENT))
	{
		geoip_continent_name(g_ePlayerData[id][PDATA_IP], szPlaceHolder, charsmax(szPlaceHolder))
		check_validity(szPlaceHolder, charsmax(szPlaceHolder))
		replace_all(szMessage, iLen, ARG_CONTINENT, szPlaceHolder)
	}
	#endif
	
	#if defined ARG_CONTINENT_CODE
	if(has_argument(szMessage, ARG_CONTINENT_CODE))
	{
		new szContinentCode[3]
		geoip_continent_code(g_ePlayerData[id][PDATA_IP], szContinentCode)
		check_validity(szContinentCode, charsmax(szContinentCode))
		replace_all(szMessage, iLen, ARG_CONTINENT_CODE, szContinentCode)
	}
	#endif
	
	replace_all(szMessage, iLen, "  ", "")
	trim(szMessage)
}

stock bool:has_argument(const szMessage[], const szArgument[])
	return contain(szMessage, szArgument) != -1

stock check_validity(szText[], const iLen)
{
	if(!szText[0])
		copy(szText, iLen, g_eSettings[ERROR_TEXT])
}

public plugin_natives()
{
	register_library("chatmanager")
	register_native("cm_get_admin_listen_flags", "_cm_get_admin_listen_flags")
	register_native("cm_get_admin_prefix", "_cm_get_admin_prefix")
	register_native("cm_get_chat_color", "_cm_get_chat_color")
	register_native("cm_get_chat_color_by_num", "_cm_get_chat_color_by_num")
	register_native("cm_get_prefix_by_num", "_cm_get_prefix_by_num")
	register_native("cm_has_user_admin_listen", "_cm_has_user_admin_listen")
	register_native("cm_total_chat_colors", "_cm_total_chat_colors")
	register_native("cm_total_prefixes", "_cm_total_chat_colors")
	register_native("cm_update_player_data", "_cm_update_player_data")
	register_native("cm_set_user_prefix", "_cm_set_user_prefix")
}

public _cm_get_admin_prefix(iPlugin, iParams)
	set_string(2, g_ePlayerData[get_param(1)][PDATA_PREFIX], get_param(3))
	
public _cm_get_chat_color(iPlugin, iParams)
	set_string(2, g_ePlayerData[get_param(1)][PDATA_CHAT_COLOR], get_param(3))
	
public _cm_total_prefixes(iPlugin, iParams)
	return g_iAdminPrefixes

public _cm_total_chat_colors(iPlugin, iParams)
	return g_iChatColors
	
public _cm_get_prefix_by_num(iPlugin, iParams)
{
	new iNum = get_param(1)
	
	if(iNum < 0 || iNum >= g_iAdminPrefixes)
		return 0
	
	new szPrefix[32]
	ArrayGetString(g_aAdminPrefixes, iNum, szPrefix, charsmax(szPrefix))
	set_string(2, szPrefix, get_param(3))
	return 1
}

public _cm_get_chat_color_by_num(iPlugin, iParams)
{
	new iNum = get_param(1)
	
	if(iNum < 0 || iNum >= g_iChatColors)
		return 0
	
	new szColor[32]
	ArrayGetString(g_aChatColors, iNum, szColor, charsmax(szColor))
	set_string(2, szColor, get_param(3))
	return 1
}

public _cm_get_admin_listen_flags(iPlugin, iParams)
	set_string(1, g_eSettings[ADMIN_LISTEN_FLAGS], get_param(2))
	
public bool:_cm_has_user_admin_listen(iPlugin, iParams)
	return g_ePlayerData[get_param(1)][PDATA_ADMIN_LISTEN]
	
public _cm_update_player_data(iPlugin, iParams)
	UpdateData(get_param(1))

public _cm_set_user_prefix(iPlugin, iParams)
	get_string(2, g_ePlayerData[get_param(1)][PDATA_PREFIX], charsmax(g_ePlayerData[][PDATA_PREFIX]))
Последно промяна от Punch* на 19 Фев 2018, 19:47, променено общо 1 път.

Аватар
ElitePower
Извън линия
Потребител
Потребител
Мнения: 547
Регистриран на: 13 Окт 2016, 14:20
Се отблагодари: 7 пъти
Получена благодарност: 13 пъти

Преработка на плъгин Rank System

Мнение от ElitePower » 19 Фев 2018, 19:23

Точно това, което искаш го има в плъгина, който Николов е вързал с на Крома - клик . В тази тема пише как се слага префикс по ип.

Аватар
Punch*
Извън линия
Потребител
Потребител
Мнения: 143
Регистриран на: 15 Фев 2018, 20:12
Получена благодарност: 1 път
Обратна връзка:

Преработка на плъгин Rank System

Мнение от Punch* » 19 Фев 2018, 19:27

Не е същия ранк система на мен ми трябва същият ранк система

Аватар
ElitePower
Извън линия
Потребител
Потребител
Мнения: 547
Регистриран на: 13 Окт 2016, 14:20
Се отблагодари: 7 пъти
Получена благодарност: 13 пъти

Преработка на плъгин Rank System

Мнение от ElitePower » 19 Фев 2018, 19:30

Плъгина от 4в е по-добър от този, който си дал. Ранковете можеш да си ги смениш сам.

Аватар
DoPe ;]]
Извън линия
Потребител
Потребител
Мнения: 402
Регистриран на: 27 Фев 2017, 22:10
Обратна връзка:

Преработка на плъгин Rank System

Мнение от DoPe ;]] » 19 Фев 2018, 19:36

...
Прикачени файлове
AdminRankSystem.sma
(37.69 KiB) Свалено 105 пъти
AdminRankSystem.sma
(37.69 KiB) Свалено 105 пъти
The Best Deathrun Server: 79.124.49.91:27019
The Best Respawn Server: 79.124.49.88:27021

Аватар
Punch*
Извън линия
Потребител
Потребител
Мнения: 143
Регистриран на: 15 Фев 2018, 20:12
Получена благодарност: 1 път
Обратна връзка:

Преработка на плъгин Rank System

Мнение от Punch* » 19 Фев 2018, 19:42

За мен е по-добър, който съм дал. Мога да сменя, но не ми хареса стила му.

Добавено преди 5 минути 26 секунди:
DoPe ;]] написа: 19 Фев 2018, 19:36...
Не мога да го превръщам на .амхх значи има проблем.

Аватар
Drea<M>40BG ;]]
Извън линия
Потребител
Потребител
Мнения: 750
Регистриран на: 11 Окт 2016, 11:35
Се отблагодари: 115 пъти
Получена благодарност: 63 пъти
Обратна връзка:

Преработка на плъгин Rank System

Мнение от Drea<M>40BG ;]] » 19 Фев 2018, 19:45

Punch* написа: 19 Фев 2018, 19:42 За мен е по-добър, който съм дал. Мога да сменя, но не ми хареса стила му.

Добавено преди 5 минути 26 секунди:
DoPe ;]] написа: 19 Фев 2018, 19:36...
Не мога да го превръщам на .амхх значи има проблем.
И какво ти пише?

Аватар
Punch*
Извън линия
Потребител
Потребител
Мнения: 143
Регистриран на: 15 Фев 2018, 20:12
Получена благодарност: 1 път
Обратна връзка:

Преработка на плъгин Rank System

Мнение от Punch* » 19 Фев 2018, 19:50

Аз от amx.freakz.ro ги превръщам на .амхх и това ми изписва на червено There was an error while compiling, please see the log below.

Аватар
DoPe ;]]
Извън линия
Потребител
Потребител
Мнения: 402
Регистриран на: 27 Фев 2017, 22:10
Обратна връзка:

Преработка на плъгин Rank System

Мнение от DoPe ;]] » 19 Фев 2018, 20:08

Нямам думи просто... АМИ изтегли си тогава AMXX 1.8.3 от интернет за да не ти дава "грешки"
The Best Deathrun Server: 79.124.49.91:27019
The Best Respawn Server: 79.124.49.88:27021

Аватар
Punch*
Извън линия
Потребител
Потребител
Мнения: 143
Регистриран на: 15 Фев 2018, 20:12
Получена благодарност: 1 път
Обратна връзка:

Преработка на плъгин Rank System

Мнение от Punch* » 19 Фев 2018, 20:24

Не е от сайта , а е от .сма

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

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

Кой е на линия

Потребители разглеждащи този форум: Bing [Bot] и 9 госта