Заявка за преработка [Simple Menu Builder]

В този раздел можете да подавате всякакви заявки за намиране, изработка или преработка на плъгини/модове.
Аватар
LUMIS43
Извън линия
Потребител
Потребител
Мнения: 44
Регистриран на: 16 Ное 2016, 14:41

Заявка за преработка [Simple Menu Builder]

Мнение от LUMIS43 » 28 Окт 2017, 14:33

Здравейте, бих искал да се добави нова опция в познатото Simple Menu Builder. Опцията да дава възможността менюто да е достъпно само за Simon, в Jailbreak сървър. Благодаря предварително.

Аватар
OciXCrom
Извън линия
Администратор
Администратор
Мнения: 7206
Регистриран на: 06 Окт 2016, 19:20
Местоположение: /resetscore
Се отблагодари: 117 пъти
Получена благодарност: 1295 пъти
Обратна връзка:

Заявка за преработка [Simple Menu Builder]

Мнение от OciXCrom » 28 Окт 2017, 14:41

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

#include <amxmodx>
#include <amxmisc>

#define PLUGIN_VERSION "2.1 + JB"
#define MAX_MENUS 20

native is_user_simon(id)

enum
{
	SECTION_DEFAULTS = 0,
	SECTION_SETTINGS,
	SECTION_MENUITEMS
}

enum _:Settings
{
	MENU_TITLE[128],
	MENU_TITLE_PAGE[128],
	MENU_PREFIX[32],
	MENU_BACKK[32],
	MENU_NEXT[32],
	MENU_EXITT[32],
	MENU_FLAG,
	MENU_TEAM,
	MENU_ALIVEONLY,
	MENU_SIMONONLY,
	MENU_ITEMS_PER_PAGE,
	MENU_REOPEN,
	MENU_ITEM_FORMAT[64],
	MENU_NOACCESS[160],
	MENU_NOTEAM[160],
	MENU_ALIVE[160],
	MENU_DEAD[160],
	MENU_SIMON[160],
	MENU_SOUND[128]
}

enum _:Items
{
	Name[64],
	Command[64],
	Flag[5],
	Team,
	bool:UseFunc,
	Plugin[64],
	Function[64]
}

new g_eDefaults[Settings],
	g_eSettings[MAX_MENUS][Settings],
	g_iTotalItems[MAX_MENUS],
	g_szMap[32],
	g_msgSayText
	
new Trie:g_tCommands,
	Array:g_aMenuItems[MAX_MENUS]

new const g_szAll[] = "#all"
new const g_szItemField[] = "%item%"
new const g_szNameField[] = "%name%"
new const g_szUserIdField[] = "%userid%"
new const g_szBlankField[] = "#blank"
new const g_szTextField[] = "#text"
new const g_szPlayersField[] = "#addplayers"
new const g_szFunc[] = "do.func"
new const g_szAMXX[] = ".amxx"
new const g_szNewLine[2][] = { "%newline%", "^n" }
new const g_szSayStuff[2][] = { "say ", "say_team " }

public plugin_init()
{
	register_plugin("Simple Menu", PLUGIN_VERSION, "OciXCrom")
	register_cvar("SimpleMenu", PLUGIN_VERSION, FCVAR_SERVER|FCVAR_SPONLY|FCVAR_UNLOGGED)
	g_msgSayText = get_user_msgid("SayText")
}

public plugin_precache()
{
	for(new i; i < MAX_MENUS; i++)
		g_aMenuItems[i] = ArrayCreate(Items)
		
	get_mapname(g_szMap, charsmax(g_szMap))
	g_tCommands = TrieCreate()
	fileRead()
}

public plugin_end()
{
	for(new i; i < MAX_MENUS; i++)
		ArrayDestroy(g_aMenuItems[i])
		
	TrieDestroy(g_tCommands)
}

fileRead()
{
	new szConfigsName[256], szFilename[256]
	get_configsdir(szConfigsName, charsmax(szConfigsName))
	formatex(szFilename, charsmax(szFilename), "%s/SimpleMenu.ini", szConfigsName)
	new iFilePointer = fopen(szFilename, "rt")
	
	if(iFilePointer)
	{
		new szData[256], szKey[128], szValue[128], szTeam[2], iSection, iSize
		new eItem[Items], iMenuId = -1, bool:blRead = true
		
		while(!feof(iFilePointer))
		{
			fgets(iFilePointer, szData, charsmax(szData))
			trim(szData)
			
			switch(szData[0])
			{
				case EOS, ';': continue
				case '-':
				{
					iSize = strlen(szData)
					
					if(szData[iSize - 1] == '-')
					{
						szData[0] = ' '
						szData[iSize - 1] = ' '
						trim(szData)
						
						if(contain(szData, "*") != -1)
						{
							strtok(szData, szKey, charsmax(szKey), szValue, charsmax(szValue), '*')
							copy(szValue, strlen(szKey), g_szMap)
							blRead = equal(szValue, szKey) ? true : false
						}
						else
							blRead = equal(szData, g_szAll) || equali(szData, g_szMap)
					}
					else continue
				}
				case '[':
				{
					if(szData[strlen(szData) - 1] == ']')
					{
						if(containi(szData, "default settings") != -1)
							iSection = SECTION_DEFAULTS
						else if(containi(szData, "new menu") != -1)
						{
							iMenuId++
							
							for(new i; i < sizeof(g_eDefaults); i++)
								g_eSettings[iMenuId][i] = g_eDefaults[i]
						}
						else if(containi(szData, "menu settings") != -1)
						{
							if(iMenuId < 0)
								iMenuId = 0
								
							iSection = SECTION_SETTINGS
						}
						else if(containi(szData, "menu items") != -1)
						{
							if(iMenuId < 0)
								iMenuId = 0
								
							iSection = SECTION_MENUITEMS
						}
					}
					else continue
				}
				default:
				{
					if(!blRead)
						continue
						
					switch(iSection)
					{
						case SECTION_DEFAULTS:
						{
							strtok(szData, szKey, charsmax(szKey), szValue, charsmax(szValue), '=')
							trim(szKey); trim(szValue)
							
							if(szValue[0] == EOS)
								continue
							
							if(equal(szKey, "MENU_TITLE"))
							{
								if(contain(szValue, g_szNewLine[0]) != -1)
									replace_all(szValue, charsmax(szValue), g_szNewLine[0], g_szNewLine[1])
									
								copy(g_eDefaults[MENU_TITLE], charsmax(g_eDefaults[MENU_TITLE]), szValue)
							}
							if(equal(szKey, "MENU_TITLE_PAGE"))
							{
								if(contain(szValue, g_szNewLine[0]) != -1)
									replace_all(szValue, charsmax(szValue), g_szNewLine[0], g_szNewLine[1])
									
								copy(g_eDefaults[MENU_TITLE_PAGE], charsmax(g_eDefaults[MENU_TITLE_PAGE]), szValue)
							}
							else if(equal(szKey, "MENU_PREFIX"))
								copy(g_eDefaults[MENU_PREFIX], charsmax(g_eDefaults[MENU_PREFIX]), szValue)
							else if(equal(szKey, "MENU_BACK"))
								copy(g_eDefaults[MENU_BACKK], charsmax(g_eDefaults[MENU_BACKK]), szValue)
							else if(equal(szKey, "MENU_NEXT"))
								copy(g_eDefaults[MENU_NEXT], charsmax(g_eDefaults[MENU_NEXT]), szValue)
							else if(equal(szKey, "MENU_EXIT"))
								copy(g_eDefaults[MENU_EXITT], charsmax(g_eDefaults[MENU_EXITT]), szValue)
							else if(equal(szKey, "MENU_FLAG"))
								g_eDefaults[MENU_FLAG] = szValue[0] == '0' ? 0 : read_flags(szValue)
							else if(equal(szKey, "MENU_TEAM"))
								g_eDefaults[MENU_TEAM] = clamp(str_to_num(szValue), 0, 3)
							else if(equal(szKey, "MENU_ALIVEONLY"))
								g_eDefaults[MENU_ALIVEONLY] = str_to_num(szValue)
							else if(equal(szKey, "MENU_SIMONONLY"))
								g_eDefaults[MENU_SIMONONLY] = str_to_num(szValue)
							else if(equal(szKey, "MENU_ITEMS_PER_PAGE"))
								g_eDefaults[MENU_ITEMS_PER_PAGE] = str_to_num(szValue)
							else if(equal(szKey, "MENU_REOPEN"))
								g_eDefaults[MENU_REOPEN] = str_to_num(szValue)
							else if(equal(szKey, "MENU_ITEM_FORMAT"))
								copy(g_eDefaults[MENU_ITEM_FORMAT], charsmax(g_eDefaults[MENU_ITEM_FORMAT]), szValue)
							else if(equal(szKey, "MENU_NOACCESS"))
								copy(g_eDefaults[MENU_NOACCESS], charsmax(g_eDefaults[MENU_NOACCESS]), szValue)
							else if(equal(szKey, "MENU_NOTEAM"))
								copy(g_eDefaults[MENU_NOTEAM], charsmax(g_eDefaults[MENU_NOTEAM]), szValue)
							else if(equal(szKey, "MENU_ALIVE"))
								copy(g_eDefaults[MENU_ALIVE], charsmax(g_eDefaults[MENU_ALIVE]), szValue)
							else if(equal(szKey, "MENU_DEAD"))
								copy(g_eDefaults[MENU_DEAD], charsmax(g_eDefaults[MENU_DEAD]), szValue)
							else if(equal(szKey, "MENU_SIMON"))
								copy(g_eDefaults[MENU_SIMON], charsmax(g_eDefaults[MENU_SIMON]), szValue)
							else if(equal(szKey, "MENU_SOUND"))
							{
								copy(g_eDefaults[MENU_SOUND], charsmax(g_eDefaults[MENU_SOUND]), szValue)
								precache_sound(szValue)
							}
						}
						case SECTION_SETTINGS:
						{
							strtok(szData, szKey, charsmax(szKey), szValue, charsmax(szValue), '=')
							trim(szKey); trim(szValue)
							
							if(szValue[0] == EOS)
								continue
							
							if(equal(szKey, "MENU_TITLE"))
							{
								if(contain(szValue, g_szNewLine[0]) != -1)
									replace_all(szValue, charsmax(szValue), g_szNewLine[0], g_szNewLine[1])
									
								copy(g_eSettings[iMenuId][MENU_TITLE], charsmax(g_eSettings[][MENU_TITLE]), szValue)
							}
							if(equal(szKey, "MENU_TITLE_PAGE"))
							{
								if(contain(szValue, g_szNewLine[0]) != -1)
									replace_all(szValue, charsmax(szValue), g_szNewLine[0], g_szNewLine[1])
									
								copy(g_eSettings[iMenuId][MENU_TITLE_PAGE], charsmax(g_eSettings[][MENU_TITLE_PAGE]), szValue)
							}
							else if(equal(szKey, "MENU_PREFIX"))
								copy(g_eSettings[iMenuId][MENU_PREFIX], charsmax(g_eSettings[][MENU_PREFIX]), szValue)
							else if(equal(szKey, "MENU_BACK"))
								copy(g_eSettings[iMenuId][MENU_BACKK], charsmax(g_eSettings[][MENU_BACKK]), szValue)
							else if(equal(szKey, "MENU_NEXT"))
								copy(g_eSettings[iMenuId][MENU_NEXT], charsmax(g_eSettings[][MENU_NEXT]), szValue)
							else if(equal(szKey, "MENU_EXIT"))
								copy(g_eSettings[iMenuId][MENU_EXITT], charsmax(g_eSettings[][MENU_EXITT]), szValue)
							else if(equal(szKey, "MENU_FLAG"))
								g_eSettings[iMenuId][MENU_FLAG] = szValue[0] == '0' ? 0 : read_flags(szValue)
							else if(equal(szKey, "MENU_TEAM"))
								g_eSettings[iMenuId][MENU_TEAM] = clamp(str_to_num(szValue), 0, 3)
							else if(equal(szKey, "MENU_ALIVEONLY"))
								g_eSettings[iMenuId][MENU_ALIVEONLY] = str_to_num(szValue)
							else if(equal(szKey, "MENU_SIMONONLY"))
								g_eSettings[iMenuId][MENU_SIMONONLY] = str_to_num(szValue)
							else if(equal(szKey, "MENU_ITEMS_PER_PAGE"))
								g_eSettings[iMenuId][MENU_ITEMS_PER_PAGE] = str_to_num(szValue)
							else if(equal(szKey, "MENU_REOPEN"))
								g_eSettings[iMenuId][MENU_REOPEN] = str_to_num(szValue)
							else if(equal(szKey, "MENU_OPEN"))
							{
								while(szValue[0] != 0 && strtok(szValue, szKey, charsmax(szKey), szValue, charsmax(szValue), ','))
								{
									trim(szKey); trim(szValue)
									register_clcmd(szKey, "cmdMenu")
									TrieSetCell(g_tCommands, szKey, iMenuId)
								}
							}
							else if(equal(szKey, "MENU_ITEM_FORMAT"))
								copy(g_eSettings[iMenuId][MENU_ITEM_FORMAT], charsmax(g_eSettings[][MENU_ITEM_FORMAT]), szValue)
							else if(equal(szKey, "MENU_NOACCESS"))
								copy(g_eSettings[iMenuId][MENU_NOACCESS], charsmax(g_eSettings[][MENU_NOACCESS]), szValue)
							else if(equal(szKey, "MENU_NOTEAM"))
								copy(g_eSettings[iMenuId][MENU_NOTEAM], charsmax(g_eSettings[][MENU_NOTEAM]), szValue)
							else if(equal(szKey, "MENU_ALIVE"))
								copy(g_eSettings[iMenuId][MENU_ALIVE], charsmax(g_eSettings[][MENU_ALIVE]), szValue)
							else if(equal(szKey, "MENU_DEAD"))
								copy(g_eSettings[iMenuId][MENU_DEAD], charsmax(g_eSettings[][MENU_DEAD]), szValue)
							else if(equal(szKey, "MENU_SIMON"))
								copy(g_eSettings[iMenuId][MENU_SIMON], charsmax(g_eSettings[][MENU_SIMON]), szValue)
							else if(equal(szKey, "MENU_SOUND"))
							{
								copy(g_eSettings[iMenuId][MENU_SOUND], charsmax(g_eSettings[][MENU_SOUND]), szValue)
								precache_sound(szValue)
							}
						}
						case SECTION_MENUITEMS:
						{
							parse(szData, eItem[Name], charsmax(eItem[Name]), eItem[Command], charsmax(eItem[Command]), eItem[Flag], charsmax(eItem[Flag]), szTeam, charsmax(szTeam))
							eItem[UseFunc] = bool:(equal(eItem[Command], g_szFunc, charsmax(g_szFunc)))
							eItem[Team] = str_to_num(szTeam)
							
							if(eItem[UseFunc])
							{
								replace(eItem[Command], charsmax(eItem[Command]), g_szFunc, "")
								replace(eItem[Command], charsmax(eItem[Command]), "(", "")
								replace(eItem[Command], charsmax(eItem[Command]), ")", "")
								strtok(eItem[Command], eItem[Plugin], charsmax(eItem[Plugin]), eItem[Function], charsmax(eItem[Function]), ',')
								trim(eItem[Plugin]); trim(eItem[Function])
								
								if(contain(eItem[Plugin], g_szAMXX) == -1)
									add(eItem[Plugin], charsmax(eItem[Plugin]), g_szAMXX)
							}
							
							ArrayPushArray(g_aMenuItems[iMenuId], eItem)
							eItem[Flag][0] = EOS
							szTeam[0] = EOS
							g_iTotalItems[iMenuId]++
						}
					}
				}
			}			
		}
		
		fclose(iFilePointer)
	}
}

public cmdMenu(id)
{
	new szCommand[64], szArgs[32], iMenuId
	read_argv(0, szCommand, charsmax(szCommand))
	
	if(equal(szCommand[0], g_szSayStuff[0], 3) || equal(szCommand[0], g_szSayStuff[1], 8))
	{
		read_argv(1, szArgs, charsmax(szArgs))
		remove_quotes(szArgs)
		format(szCommand, charsmax(szCommand), "%s %s", szCommand, szArgs)
	}
	
	TrieGetCell(g_tCommands, szCommand, iMenuId)
	menuMain(id, iMenuId)
	return PLUGIN_HANDLED
}

menuMain(id, iMenuId, iPage = 0)
{
	if(g_eSettings[iMenuId][MENU_FLAG] && !(get_user_flags(id) & g_eSettings[iMenuId][MENU_FLAG]))
	{
		ColorChat(id, "%s %s", g_eSettings[iMenuId][MENU_PREFIX], g_eSettings[iMenuId][MENU_NOACCESS])
		return PLUGIN_HANDLED
	}
	
	if(g_eSettings[iMenuId][MENU_SIMONONLY] && !is_user_simon(id))
	{
		ColorChat(id, "%s %s", g_eSettings[iMenuId][MENU_PREFIX], g_eSettings[iMenuId][MENU_SIMONONLY])
		return PLUGIN_HANDLED
	}
	
	if(!get_team_access(id, iMenuId))
	{
		ColorChat(id, "%s %s", g_eSettings[iMenuId][MENU_PREFIX], g_eSettings[iMenuId][MENU_NOTEAM])
		return PLUGIN_HANDLED
	}
	
	if(!get_alive_access(id, iMenuId))
	{
		ColorChat(id, "%s %s", g_eSettings[iMenuId][MENU_PREFIX], g_eSettings[iMenuId][MENU_ALIVEONLY] == 1 ? g_eSettings[iMenuId][MENU_ALIVE] : g_eSettings[iMenuId][MENU_DEAD])
		return PLUGIN_HANDLED
	}
	
	if(g_eSettings[iMenuId][MENU_SOUND][0] != EOS)
		client_cmd(id, "spk %s", g_eSettings[iMenuId][MENU_SOUND])
	
	new szItem[128], szData[20]
	new eItem[Items], iMenu = menu_create(g_eSettings[iMenuId][MENU_TITLE], "handlerMain")
	
	for(new i, iTeam = get_user_team(id); i < g_iTotalItems[iMenuId]; i++)
	{
		ArrayGetArray(g_aMenuItems[iMenuId], i, eItem)
		
		if(eItem[Team] && eItem[Team] != iTeam)
			continue
		else if(equal(eItem[Name], g_szBlankField))
			menu_addblank(iMenu, str_to_num(eItem[Command]))
		else if(equal(eItem[Name], g_szTextField))
			menu_addtext(iMenu, eItem[Command], str_to_num(eItem[Flag]))
		else if(equal(eItem[Name], g_szPlayersField))
		{
			new szName[32], iPlayers[32], iPnum
			get_players(iPlayers, iPnum, get_flag(eItem[Flag], "c") ? "a" : "")
			
			for(new j, iPlayer; j < iPnum; j++)
			{
				iPlayer = iPlayers[j]
				
				if(iPlayer == id)
				{
					if(!get_flag(eItem[Flag], "b"))
						continue
				}
				else if(get_user_flags(iPlayer) & ADMIN_IMMUNITY)
				{
					if(get_flag(eItem[Flag], "a"))
						continue
				}

				get_user_name(iPlayer, szName, charsmax(szName))
				copy(szItem, charsmax(szItem), g_eSettings[iMenuId][MENU_ITEM_FORMAT])
				replace_all(szItem, charsmax(szItem), g_szItemField, szName)
				formatex(szData, charsmax(szData), "%i %i %i p", iMenuId, i, get_user_userid(iPlayer))
				menu_additem(iMenu, szItem, szData)
			}
		}
		else
		{
			copy(szItem, charsmax(szItem), g_eSettings[iMenuId][MENU_ITEM_FORMAT])
			replace_all(szItem, charsmax(szItem), g_szItemField, eItem[Name])
			formatex(szData, charsmax(szData), "%i %i", iMenuId, i)
			menu_additem(iMenu, szItem, szData, read_flags(eItem[Flag]))
		}
	}
	
	if(menu_pages(iMenu) > 1)
	{
		new szTitle[256]
		formatex(szTitle, charsmax(szTitle), "%s %s", g_eSettings[iMenuId][MENU_TITLE], g_eSettings[iMenuId][MENU_TITLE_PAGE])
		menu_setprop(iMenu, MPROP_TITLE, szTitle)
	}
	
	menu_setprop(iMenu, MPROP_BACKNAME, g_eSettings[iMenuId][MENU_BACKK])
	menu_setprop(iMenu, MPROP_NEXTNAME, g_eSettings[iMenuId][MENU_NEXT])
	menu_setprop(iMenu, MPROP_EXITNAME, g_eSettings[iMenuId][MENU_EXITT])
	menu_setprop(iMenu, MPROP_PERPAGE, g_eSettings[iMenuId][MENU_ITEMS_PER_PAGE])
	menu_display(id, iMenu, iPage)
	return PLUGIN_HANDLED
}

public handlerMain(id, iMenu, iItem)
{
	if(iItem == MENU_EXIT)
		goto @DESTROY
		
	new szData[20], szMenuId[3], szKey[3], szUserId[5], iMenuId, iKey, iUserId, iAccess, iCallback
	menu_item_getinfo(iMenu, iItem, iAccess, szData, charsmax(szData), .callback = iCallback)
	parse(szData, szMenuId, charsmax(szMenuId), szKey, charsmax(szKey), szUserId, charsmax(szUserId))
	
	iMenuId = str_to_num(szMenuId)
	iKey = str_to_num(szKey)
	iUserId = str_to_num(szUserId)
	
	if(get_alive_access(id, iMenuId) && get_team_access(id, iMenuId))
	{
		new eItem[Items]
		ArrayGetArray(g_aMenuItems[iMenuId], iKey, eItem)
		
		if(szData[strlen(szData) - 1] == 'p')
		{
			new szCommand[64]
			copy(szCommand, charsmax(szCommand), eItem[Command])
			
			if(get_flag(szCommand, g_szNameField))
			{
				new szName[32]
				get_user_name(find_player("k", iUserId), szName, charsmax(szName))
				replace_all(szCommand, charsmax(szCommand), g_szNameField, szName)
			}
			
			if(get_flag(szCommand, g_szUserIdField))
				replace_all(szCommand, charsmax(szCommand), g_szUserIdField, szUserId)
				
			client_cmd(id, szCommand)
		}
		else
		{
			if(eItem[UseFunc])
			{
				callfunc_begin(eItem[Function], eItem[Plugin])
				callfunc_push_int(id)
				callfunc_end()
			}
			else
				client_cmd(id, eItem[Command])
		}
	}
	
	if(g_eSettings[iMenuId][MENU_REOPEN])
	{
		new iMenu2, iPage
		player_menu_info(id, iMenu2, iMenu2, iPage)
		menu_destroy(iMenu)
		menuMain(id, iMenuId, iPage)
		return PLUGIN_HANDLED
	}
	
	@DESTROY:	
	menu_destroy(iMenu)
	return PLUGIN_HANDLED
}

ColorChat(const id, const szInput[], any:...)
{
	new iPlayers[32], iCount = 1
	static szMessage[191]
	vformat(szMessage, charsmax(szMessage), szInput, 3)
	
	replace_all(szMessage, charsmax(szMessage), "!g", "^4")
	replace_all(szMessage, charsmax(szMessage), "!n", "^1")
	replace_all(szMessage, charsmax(szMessage), "!t", "^3")
	
	if(id)
		iPlayers[0] = id
	else
		get_players(iPlayers, iCount, "ch")
	
	for(new i; i < iCount; i++)
	{
		if(is_user_connected(iPlayers[i]))
		{
			message_begin(MSG_ONE_UNRELIABLE, g_msgSayText, _, iPlayers[i])
			write_byte(iPlayers[i])
			write_string(szMessage)
			message_end()
		}
	}
}

bool:get_flag(szString[], const szFlag[])
	return (contain(szString, szFlag) != -1) ? true : false

bool:get_alive_access(id, iMenuId)
	return ((g_eSettings[iMenuId][MENU_ALIVEONLY] == 1 && !is_user_alive(id)) || (g_eSettings[iMenuId][MENU_ALIVEONLY] == 2 && is_user_alive(id))) ? false : true

bool:get_team_access(id, iMenuId)
	return (!g_eSettings[iMenuId][MENU_TEAM] || g_eSettings[iMenuId][MENU_TEAM] == get_user_team(id))
В .ini файла добави тези две настройки:

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

MENU_SIMONONLY = 0
MENU_SIMON = Only Simon can use this menu.
Ако първата е сложена на 1, менюто ще е само за Саймън.

Аватар
LUMIS43
Извън линия
Потребител
Потребител
Мнения: 44
Регистриран на: 16 Ное 2016, 14:41

Заявка за преработка [Simple Menu Builder]

Мнение от LUMIS43 » 28 Окт 2017, 16:30

Евала! Благодаря! Лок.

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

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

Кой е на линия

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