Перейти к содержанию

Рекомендуемые сообщения

  • Администратор

20200814074607_1.jpg

Просто полезный инструмент для перемещения игрока из команды в команду. Проверено на нашем сервере Left 4 Dead 2. В панель администратора добавляется 4 новых раздела.

Команды:

  • sm_swap <игрок> - поменять местами команду игрока (ов).
  • sm_swap @all - поменять местами сразу всех игроков
  • sm_swapround <игрок> - поменять местами команду игрока (ов) в конце раунда / при смерти игрока.
  • sm_exch <игрок 1> <игрок 2> - меняет местами двух игроков в противоположных командах.
  • sm_exchround <игрок 1> <игрок 2> - меняет местами двух игроков в противоположных командах в конце раунда / при смерти игрока.

Перемещение игрока происходит мгновенно. Без таймеров и кулдаунов.

swapper.zip

Ссылка на комментарий
Поделиться на другие сайты
  • Администратор

Не рекомендуется использовать данную версию плагина на публичных серверах.

Мне надо было протестировать один из плагинов, и для тестов мне понадобилось установить этот плагин. И благодаря этому я обнаружил следующую ошибку.

С помощью спама командой "Сменить Команду", можно заспавнить огромное количество ботов.

 

И вообще, копаясь в исходнике плагина я понял что он написан исключительно для Counter Strike: Source. Как он у меня заработал (Хоть и с багом), ума не приложу.

#pragma semicolon 1
#include <sourcemod>
#include <sdktools>

#undef REQUIRE_EXTENSIONS
#include <cstrike>
#undef REQUIRE_PLUGIN
#include <adminmenu>

#define PLUGIN_VERSION "0.02"

#define YELLOW               0x01
#define NAME_TEAMCOLOR       0x02
#define TEAMCOLOR            0x03
#define GREEN                0x04 

public Plugin:myinfo =
{
	name = "Player swapper",
	author = "X@IDER",
	description = "Useful tool for swapping players",
	version = PLUGIN_VERSION,
	url = "http://www.sourcemod.net/"
};

// Array for end round swaps
new NewTeam[64];

// Handle to top menu
new Handle:hTopMenu;

// Handles to change models
new Handle:hGameConf;
new Handle:hSetModel;

// Handle to drop weapons
new Handle:hDrop;

// Teams
new TEAM1,TEAM2;
new game;

new String:t_models[4][PLATFORM_MAX_PATH] =
{
	"models/player/t_phoenix.mdl",
	"models/player/t_leet.mdl",
	"models/player/t_arctic.mdl",
	"models/player/t_guerilla.mdl"
};

new String:ct_models[4][PLATFORM_MAX_PATH] =
{
	"models/player/ct_urban.mdl",
	"models/player/ct_gsg9.mdl",
	"models/player/ct_sas.mdl",
	"models/player/ct_gign.mdl"
};

// Team names
new String:teams[4][16] = 
{
	"N/A",
	"SPEC",
	"T",
	"CT"
};

public OnPluginStart()
{
	LoadTranslations("common.phrases");
	LoadTranslations("plugin.swapper");

	decl String:gdir[PLATFORM_MAX_PATH];
	GetGameFolderName(gdir, sizeof(gdir));
	if (StrEqual(gdir,"cstrike",false)) game = 0;
	else if (StrEqual(gdir,"dod",false)) game = 1;
	else if (StrEqual(gdir,"hl2mp",false)) game = 2;
	else if (StrEqual(gdir,"Insurgency",false)) game = 3;
	else if (StrEqual(gdir,"tf",false)) game = 4;
	else game = 5;

	TEAM1 = 2;
	TEAM2 = 3;
	
	// Loading SetModel & WeaponDrop for CS:S
	if (!game)
	{
		hGameConf = LoadGameConfigFile("swapper.gamedata");
	
		StartPrepSDKCall(SDKCall_Player);
		PrepSDKCall_SetFromConf(hGameConf, SDKConf_Virtual, "SetModel");
		PrepSDKCall_AddParameter(SDKType_String, SDKPass_Pointer);
		hSetModel = EndPrepSDKCall();

		StartPrepSDKCall(SDKCall_Player);
		PrepSDKCall_SetFromConf(hGameConf, SDKConf_Signature, "DropWeapon");
		PrepSDKCall_AddParameter(SDKType_CBaseEntity, SDKPass_Pointer);
		PrepSDKCall_AddParameter(SDKType_Bool, SDKPass_Plain);
		PrepSDKCall_AddParameter(SDKType_Bool, SDKPass_Plain);
		hDrop = EndPrepSDKCall();
	}

	RegAdminCmd("sm_swap", Swap, ADMFLAG_GENERIC);
	RegAdminCmd("sm_swapround", SwapRound, ADMFLAG_GENERIC);
	RegAdminCmd("sm_exch", Exchange, ADMFLAG_GENERIC);
	RegAdminCmd("sm_exchround", ExchangeRound, ADMFLAG_GENERIC);

	if (game) HookEvent("player_death",PlayerDeath);

	HookEvent("player_spawn",PlayerSpawn);
	HookEvent("round_end",RoundEnd);
}

public OnMapStart()
{
	// Getting team names for mods other than cstrike
	if (game)
	{
		GetTeamName(TEAM1,teams[TEAM1],16);
		GetTeamName(TEAM2,teams[TEAM2],16);
	}
}

public PrintToChatAllEx(from,const String:format[], any:...)
{
	decl String:message[256];
	VFormat(message,sizeof(message),format,3);
	
	if (game == 1)
	{
		PrintToChatAll(message);
		return;
	}

	new Handle:hBf = StartMessageAll("SayText2");
	if (hBf != INVALID_HANDLE)
	{
		BfWriteByte(hBf, from);
		BfWriteByte(hBf, true);
		BfWriteString(hBf, message);
	
		EndMessage();
	}
}

public ChangeClientTeamEx(client,team)
{
	if (game)
	{
		ChangeClientTeam(client,team);
		return;
	}

	new oldTeam = GetClientTeam(client);
	CS_SwitchTeam(client,team);

	decl String:model[PLATFORM_MAX_PATH],String:newmodel[PLATFORM_MAX_PATH];
	GetClientModel(client,model,sizeof(model));
	newmodel = model;

	if (oldTeam == TEAM1)
	{
		new c4 = GetPlayerWeaponSlot(client,CS_SLOT_C4);
		if (c4 != -1) SDKCall(hDrop,client,c4,true,false);

		if (StrContains(model,t_models[0],false)) newmodel = ct_models[0];
		if (StrContains(model,t_models[1],false)) newmodel = ct_models[1];
		if (StrContains(model,t_models[2],false)) newmodel = ct_models[2];
		if (StrContains(model,t_models[3],false)) newmodel = ct_models[3];		
	} else
	if (oldTeam == TEAM2)
	{
		SetEntProp(client, Prop_Send, "m_bHasDefuser", 0, 1);

		if (StrContains(model,ct_models[0],false)) newmodel = t_models[0];
		if (StrContains(model,ct_models[1],false)) newmodel = t_models[1];
		if (StrContains(model,ct_models[2],false)) newmodel = t_models[2];
		if (StrContains(model,ct_models[3],false)) newmodel = t_models[3];		
	}

	SDKCall(hSetModel, client, newmodel);
}

public SwapPlayer(client,target)
{
	if (GetClientTeam(target) == TEAM1) ChangeClientTeamEx(target,TEAM2); else
	if (GetClientTeam(target) == TEAM2) ChangeClientTeamEx(target,TEAM1);
}

public SwapPlayerRound(client,target)
{
	decl String:buffer[64];
	GetClientName(target,buffer,sizeof(buffer));
	if (NewTeam[target])
	{
		PrintToChatAllEx(target,"%t","Swap Cancel",YELLOW,TEAMCOLOR,buffer,YELLOW,GREEN,teams[NewTeam[target]],YELLOW);
		NewTeam[target] = 0;
		return;
	}
	if (GetClientTeam(target) == TEAM1) NewTeam[target] = TEAM2; else
	if (GetClientTeam(target) == TEAM2) NewTeam[target] = TEAM1;
	PrintToChatAllEx(target,"%t","Swap",YELLOW,TEAMCOLOR,buffer,YELLOW,GREEN,teams[NewTeam[target]],YELLOW);
}

public ExchangePlayers(client,cl1,cl2)
{
	if ((GetClientTeam(cl1) == TEAM1) && (GetClientTeam(cl2) == TEAM2))
	{
		ChangeClientTeamEx(cl1,TEAM2);
		ChangeClientTeamEx(cl2,TEAM1);
	} else
	if ((GetClientTeam(cl1) == TEAM2) && (GetClientTeam(cl2) == TEAM1))
	{
		ChangeClientTeamEx(cl1,TEAM1);
		ChangeClientTeamEx(cl2,TEAM2);
	} else
	ReplyToCommand(client,"%t","Bad targets");
}

public ExchangePlayersRound(client,cl1,cl2)
{
	if (((GetClientTeam(cl1) == TEAM1) && (GetClientTeam(cl2) == TEAM2)) || 
		((GetClientTeam(cl1) == TEAM2) && (GetClientTeam(cl2) == TEAM1)))
	{
		SwapPlayerRound(client,cl1);
		SwapPlayerRound(client,cl2);
	} else
	ReplyToCommand(client,"%t","Bad targets");
}

public Action:Swap(client,args)
{
	if (!args)
	{
		ReplyToCommand(client,"\x04sm_swap <player>");
		return Plugin_Handled;
	}
	decl String:pattern[64],String:buffer[64];
	GetCmdArg(1,pattern,sizeof(pattern));

	new Targets[64],bool:mb;

	new count = ProcessTargetString(pattern,client,Targets,sizeof(Targets),0,buffer,sizeof(buffer),mb);

	if (!count) ReplyToCommand(client,"%t","No target",YELLOW,TEAMCOLOR,pattern,YELLOW);
	else
	for (new i = 0; i < count; i++) SwapPlayer(client,Targets[i]);

	return Plugin_Handled;
}

public Action:SwapRound(client,args)
{
	if (!args)
	{
		ReplyToCommand(client,"\x04sm_swapround <player>");
		return Plugin_Handled;
	}
	new String:pattern[64],String:buffer[64];
	GetCmdArg(1,pattern,sizeof(pattern));

	new Targets[64],bool:mb;

	new count = ProcessTargetString(pattern,client,Targets,sizeof(Targets),0,buffer,sizeof(buffer),mb);

	if (!count) ReplyToCommand(client,"%t","No target",YELLOW,TEAMCOLOR,pattern,YELLOW);
	else
	for (new i = 0; i < count; i++) SwapPlayerRound(client,Targets[i]);

	return Plugin_Handled;	
}

public Action:Exchange(client,args)
{
	if (args < 2)
	{
		ReplyToCommand(client,"\x04sm_exch <player1> <player2>");
		return Plugin_Handled;
	}

	new String:p1[64],String:p2[64];
	GetCmdArg(1,p1,sizeof(p1));
	GetCmdArg(2,p2,sizeof(p2));

	new cl1 = FindTarget(client,p1);
	new cl2 = FindTarget(client,p2);

	if (cl1 == -1) ReplyToCommand(client,"%t","No target",YELLOW,TEAMCOLOR,p1,YELLOW);
	if (cl2 == -1) ReplyToCommand(client,"%t","No target",YELLOW,TEAMCOLOR,p2,YELLOW);

	if ((cl1 > 0) && (cl2 > 0)) ExchangePlayers(client,cl1,cl2);

	return Plugin_Handled;	
}

public Action:ExchangeRound(client,args)
{
	if (args < 2)
	{
		ReplyToCommand(client,"\x04sm_exchround <player1> <player2>");
		return Plugin_Handled;
	}

	new String:p1[64],String:p2[64];
	GetCmdArg(1,p1,sizeof(p1));
	GetCmdArg(2,p2,sizeof(p2));

	new cl1 = FindTarget(client,p1);
	new cl2 = FindTarget(client,p2);

	if (cl1 == -1) ReplyToCommand(client,"%t","No target",YELLOW,TEAMCOLOR,p1,YELLOW);
	if (cl2 == -1) ReplyToCommand(client,"%t","No target",YELLOW,TEAMCOLOR,p2,YELLOW);

	if ((cl1 > 0) && (cl2 > 0)) ExchangePlayersRound(client,cl1,cl2);

	return Plugin_Handled;	
}

public PlayerSpawn(Handle:event, const String:name[], bool:dontBroadcast)
{
	// mystery protection
	new client = GetClientOfUserId(GetEventInt(event,"userid"));
	NewTeam[client] = 0;
}

public PlayerDeath(Handle:event, const String:name[], bool:dontBroadcast)
{
	new client = GetClientOfUserId(GetEventInt(event,"userid"));
	if (NewTeam[client])
	{
		ChangeClientTeamEx(client,NewTeam[client]);
		NewTeam[client] = 0;
	}
}

public RoundEnd(Handle:event, const String:name[], bool:dontBroadcast)
{
	for (new i = 1; i < sizeof(NewTeam); i++)
	if (NewTeam[i] && IsClientInGame(i))
	{
		ChangeClientTeamEx(i,NewTeam[i]);
		NewTeam[i] = 0;
	}
}

public OnAdminMenuReady(Handle:topmenu)
{
	if (topmenu == hTopMenu)
	{
		return;
	}
	hTopMenu = topmenu;

	new TopMenuObject:player_commands = FindTopMenuCategory(hTopMenu, ADMINMENU_PLAYERCOMMANDS);

	if (player_commands != INVALID_TOPMENUOBJECT)
	{
		AddToTopMenu(hTopMenu,"sm_swap",TopMenuObject_Item,AdminMenu_Swap,player_commands,"sm_swap",ADMFLAG_GENERIC);
		AddToTopMenu(hTopMenu,"sm_swapround",TopMenuObject_Item,AdminMenu_SwapRound,player_commands,"sm_swap",ADMFLAG_GENERIC);
		AddToTopMenu(hTopMenu,"sm_exch",TopMenuObject_Item,AdminMenu_Exchange,player_commands,"sm_swap",ADMFLAG_GENERIC);
		AddToTopMenu(hTopMenu,"sm_exchround",TopMenuObject_Item,AdminMenu_ExchangeRound,player_commands,"sm_swap",ADMFLAG_GENERIC);
	}
}

public AdminMenu_Swap(Handle:topmenu,TopMenuAction:action,TopMenuObject:object_id,param,String:buffer[],maxlength)
{
	if (action == TopMenuAction_DisplayOption)
	{
		Format(buffer, maxlength, "%T", "Swap Now", param);
	}
	else if (action == TopMenuAction_SelectOption)
	{
		DisplaySwapMenu(param,false);
	}
}

public AdminMenu_SwapRound(Handle:topmenu,TopMenuAction:action,TopMenuObject:object_id,param,String:buffer[],maxlength)
{
	if (action == TopMenuAction_DisplayOption)
	{
		Format(buffer, maxlength, "%T", "Swap Round", param);
	}
	else if (action == TopMenuAction_SelectOption)
	{
		DisplaySwapMenu(param,true);
	}
}

public AdminMenu_Exchange(Handle:topmenu,TopMenuAction:action,TopMenuObject:object_id,param,String:buffer[],maxlength)
{
	if (action == TopMenuAction_DisplayOption)
	{
		Format(buffer, maxlength, "%T", "Exchange Now", param);
	}
	else if (action == TopMenuAction_SelectOption)
	{
		DisplayExchangeMenu(param,false);
	}
}

public AdminMenu_ExchangeRound(Handle:topmenu,TopMenuAction:action,TopMenuObject:object_id,param,String:buffer[],maxlength)
{
	if (action == TopMenuAction_DisplayOption)
	{
		Format(buffer, maxlength, "%T", "Exchange Round", param);
	}
	else if (action == TopMenuAction_SelectOption)
	{
		DisplayExchangeMenu(param,true);
	}
}

public MenuHandler_Swap(Handle:menu, MenuAction:action, param1, param2)
{
	if (action == MenuAction_End) CloseHandle(menu);
    else if (action == MenuAction_Cancel)
    {
        if ((param2 == MenuCancel_ExitBack) && (hTopMenu != INVALID_HANDLE))
            DisplayTopMenu(hTopMenu, param1, TopMenuPosition_LastCategory);
    }
	else if (action == MenuAction_Select)
	{
		decl String:title[100],String:id[16],String:Round[100];
        GetMenuItem(menu, param2, id, sizeof(id));
		new target = GetClientOfUserId(StringToInt(id));

		GetMenuTitle(menu, title, sizeof(title));
		Format(Round, sizeof(Round), "%t", "Swap Round", param1);
		if (!strcmp(Round,title)) SwapPlayerRound(param1,target);
		else SwapPlayer(param1,target);

		DisplaySwapMenu(param1,!strcmp(Round,title));
	}
}

public DisplaySwapMenu(client,bool:round)
{
	new Handle:menu = CreateMenu(MenuHandler_Swap);
	SetMenuExitBackButton(menu,true);
	
	decl String:title[100],String:name[64],String:id[16];
	if (round) Format(title, sizeof(title), "%t", "Swap Round", client);
	else Format(title, sizeof(title), "%t", "Swap Now", client);
	SetMenuTitle(menu, title);

	for (new i = 1; i <= MaxClients; i++)
	if (IsClientInGame(i))
	{
		new team = GetClientTeam(i);
		if (team > CS_TEAM_SPECTATOR)
		{
			GetClientName(i,name,sizeof(name));
			if (NewTeam[i]) Format(title, sizeof(title), "[>>%s] %s",teams[NewTeam[i]],name);
			else Format(title, sizeof(title), "[%s] %s",teams[team],name);
			IntToString(GetClientUserId(i),id,sizeof(id));
			AddMenuItem(menu,id,title);
		}
	}

	DisplayMenu(menu, client, MENU_TIME_FOREVER);
}

public MenuHandler_Exchange2(Handle:menu, MenuAction:action, param1, param2)
{
	if (action == MenuAction_End)
		CloseHandle(menu);
    else if (action == MenuAction_Cancel)
    {
        if ((param2 == MenuCancel_ExitBack) && (hTopMenu != INVALID_HANDLE))
            DisplayTopMenu(hTopMenu, param1, TopMenuPosition_LastCategory);
    }
	else if (action == MenuAction_Select)
	{
		decl String:id1[16],String:id2[16],String:Round[100];
        GetMenuItem(menu, 0, id1, sizeof(id1));
        GetMenuItem(menu, param2, id2, sizeof(id2));

		new cl1 = GetClientOfUserId(StringToInt(id1));
		new cl2 = GetClientOfUserId(StringToInt(id2));

		decl String:title[100];
		GetMenuTitle(menu, title, sizeof(title));
		Format(Round, sizeof(Round), "%t", "Exchange Round", param1);
		if (!strcmp(Round,title)) ExchangePlayersRound(param1,cl1,cl2);
		else ExchangePlayers(param1,cl1,cl2);
	}
}

public MenuHandler_Exchange(Handle:menu, MenuAction:action, param1, param2)
{
	if (action == MenuAction_End)
		CloseHandle(menu);
    else if (action == MenuAction_Cancel)
    {
        if ((param2 == MenuCancel_ExitBack) && (hTopMenu != INVALID_HANDLE))
            DisplayTopMenu(hTopMenu, param1, TopMenuPosition_LastCategory);
    }
	else if (action == MenuAction_Select)
	{
		decl String:title[100],String:id[16],String:name[64];
        GetMenuItem(menu, param2, id, sizeof(id));
		new target = GetClientOfUserId(StringToInt(id));

		new team = GetClientTeam(target);

		new Handle:menu2 = CreateMenu(MenuHandler_Exchange2);
		SetMenuExitBackButton(menu2,true);
		GetMenuTitle(menu, title, sizeof(title));
		SetMenuTitle(menu2, title);

		GetClientName(target,name,sizeof(name));
		Format(title, sizeof(title), "[%s] %s",teams[team],name);
		AddMenuItem(menu2,id,title,ITEMDRAW_DISABLED);

		for (new i = 1; i <= MaxClients; i++)
		if (IsClientInGame(i) && (i != target))
		{
			new team2 = GetClientTeam(i);
			if ((team2 > CS_TEAM_SPECTATOR) && (team != team2))
			{
				GetClientName(i,name,sizeof(name));
				Format(title, sizeof(title), "[%s] %s",teams[team2],name);
				IntToString(GetClientUserId(i),id,sizeof(id));
				AddMenuItem(menu2,id,title);
			}
		}
		DisplayMenu(menu2, param1, MENU_TIME_FOREVER);
	}
}

public DisplayExchangeMenu(client,bool:round)
{
	new Handle:menu = CreateMenu(MenuHandler_Exchange);
	SetMenuExitBackButton(menu,true);
	
	decl String:title[100],String:name[64],String:id[16];
	if (round) Format(title, sizeof(title), "%t", "Exchange Round", client);
	else Format(title, sizeof(title), "%t", "Exchange Now", client);
	SetMenuTitle(menu, title);

	for (new i = 1; i <= MaxClients; i++)
	if (IsClientInGame(i))
	{
		new team = GetClientTeam(i);
		if (team > CS_TEAM_SPECTATOR)
		{
			GetClientName(i,name,sizeof(name));
			Format(title, sizeof(title), "[%s] %s",teams[team],name);
			IntToString(GetClientUserId(i),id,sizeof(id));
			AddMenuItem(menu,id,title);
		}
	}

	DisplayMenu(menu, client, MENU_TIME_FOREVER);
}

 

Ссылка на комментарий
Поделиться на другие сайты
  • Администратор

20200819011632_1.jpg

Версия, которая кикает абсолютно всех ботов при подключении. Это может пригодится, если сервер заточен на игру без ботов.

 

swapper.smx swapper.sp

Ссылка на комментарий
Поделиться на другие сайты
  • 8 месяцев спустя...
  • Администратор

Актуальная версия, которая в данный момент работает на нашем |IP-Gamers.Net| Classic.

SwapTeam.rar

Ссылка на комментарий
Поделиться на другие сайты
  • CSS Админ
23 минуты назад, Ryancoolround сказал:

Актуальная версия, которая в данный момент работает на нашем |IP-Gamers.Net| Classic.

SwapTeam.rar 16 \u041a\u0431 · 0 скачиваний

Будет ли исправление бага локализации?
Иногда при использовании админки слова могут быть на одном языка, а иногда на двух

Так же "немедленно переместить" (или как то так) показано не полностью, а лишь "немедленно..."

Меня не трогать - ушёл в запой (не алкоголь, а тархун)
Не хочу смотреть демки (

Ссылка на комментарий
Поделиться на другие сайты
  • Администратор
20 минут назад, CHIKI_BRIKI сказал:

Будет ли исправление бага локализации?
Иногда при использовании админки слова могут быть на одном языка, а иногда на двух

Могу сделать его только на русском, только тогда не будет случайной смены языка в админке.

21 минуту назад, CHIKI_BRIKI сказал:

Так же "немедленно переместить" (или как то так) показано не полностью, а лишь "немедленно..."

Скорее всего так и было задумано. "Немедленно переместить" слишком долго читается.

Ссылка на комментарий
Поделиться на другие сайты
  • CSS Админ
1 час назад, Ryancoolround сказал:

Могу сделать его только на русском, только тогда не будет случайной смены языка в админке.

Скорее всего так и было задумано. "Немедленно переместить" слишком долго читается.

Смысл случайной смены языка в админке - не знаю зачем?
А вот на счёт "читать долго" - по незнанию можно ведь дел наворошить, а так ты будешь хотя бы знать на что жмёшь

Меня не трогать - ушёл в запой (не алкоголь, а тархун)
Не хочу смотреть демки (

Ссылка на комментарий
Поделиться на другие сайты
  • Администратор

Попробовал объединить языки в один файл.

На следующей карте проверь как работает....


Для держателей серверов:

swapteam.phrases.txt - Попробуйте этот файл положить в общую папку переводов:

/addons/sourcemod/translations

Затем зайдите в папку:

/addons/sourcemod/translations/ru

И удалите точно такой же файл в этой папке.


Для наших игроков:

Вы часто говорите про перевод фраз на украинский язык. Кто хорошо знает Украинский, могут скачать этот файл swapteam.phrases.txt и добавить в него украинские строчки с кодом ua соответственно.

Если кто то опубликует здесь такую версию, я с радостью загружу ее на сервер.

Ссылка на комментарий
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
  • Похожий контент

    • Автор Райан
      Приветствую тебя, милый друг! Ты спросишь, Что это такое и с чем это кушают.. 
      Лучший Охотник сообщества - настоящий феномен и по счету второе мероприятие на просторах IP-Gamers!, которое проводится впервые.
      Чтобы в нем поучаствовать не нужно никаких заявок, не нужно, сломя голову, заполнять свой профиль на сто процентов. Тебе нужно всего лишь кинуть демку в этой теме, играя за Охотника на одном из наших серверов, в игре Left 4 Dead 2.
      Не призов ради, только из за вклада в комьюнити. Поэтому призы все же есть, но они специфические.
      Правила мероприятия:
      Твоя задача кинуть демку в этой теме, играя за Охотника в режиме сражение, записанную на наших серверах, в игре Left 4 Dead 2 Количество демок неограниченно Демки принимаются до 6 Мая 2020 года, 04:00 по МСК Призы:
      100 Репутации на форуме Эксклюзивное звание на форуме Досрочный перевод на группу выше Снятие всех предупреждений, если они имеются Удаление из базы трекера банов, если там есть данные. Награда в профиле Лучший Охотник сообщества Ваши демки попадут на наш канал Youtube. Как я и говорил, призы специфичные. А что ты ожидал за скриншот получить? Айфон? 
      Вы принимаете участие, благодаря этому мы сближаемся.
    • Автор Райан
      В данном форуме ведется набор администраторов, модераторов и людей кому интересен наш проект с административной точки зрения, для поддерживания порядка на всем сообществе IP-Gamers.
      Пример заявки для админа сервера:
      Имя; Возраст (кол-во полных лет); Город (проживание); Как можно связаться помимо форума и игры; IP адрес и его тип (статический / динамический); Ник в игре; Стаж игры Left 4 Dead 2; Знание SourceMod, Серверостроения. Опыт Администрирования (IP, адрес форума, срок); Пользовались ли читами; На каком сервере хотели бы быть администратором (один на ваш выбор); Удобное время посещения сервера (утро / день / вечер / ночь); Полезная информация о себе (Также указывайте такие качества как владение языками программирования, графическими программами и всё в таком духе). Ваш Steam ID (Можно узнать, прописав в консоли игры "Status", находясь на сервере). Пример заявки для модератора форума:
      Имя; Возраст (кол-во полных лет); Город (проживание); Как можно связаться помимо форума и игры; Заполнен ли твой профиль на форуме на 100 процентов; Есть ли 5 сообщений на форуме; Опыт модерирования (адрес форума, срок); Удобное время посещения форума (утро / день / вечер / ночь); Полезная информация о себе (Также указывайте такие качества как владение языками программирования, графическими программами и всё в таком духе). Пример заявки для модераторов группы Steam:
      Имя; Возраст (кол-во полных лет); Город (проживание); Как можно связаться помимо форума и игры; Ссылка на профиль Steam; Как долго состоишь в группе Steam; Опыт модерирования (адрес группы Steam, срок); Удобное время посещения форума (утро / день / вечер / ночь); Полезная информация о себе (Также указывайте такие качества как владение языками программирования, графическими программами и всё в таком духе). Халатное, несерьезное отношение к этой должности недопустимо. У нас очень жесткие правила, подумайте сразу, нужно вам это или нет, чтобы лишний раз не беспокоить администрацию, и не тратить свое и наше время.
      Написание заявки означает, что Вы знаете правила нашего сообщества.
      Заявки может оставить любой желающий пользователь.
      Рассмотрим все предложения!
      Решения о принятии заявки или ее отказе, могут быть обоснованы с причинами и без них, которые не обсуждаются!
      Тема закроется автоматически, спустя 3 суток.
    • Автор Райан
      На уровне сложно Эксперт Реализм в Left 4 Dead 2 ваш самый большой враг — не орда. Это не Танк и не Ведьма. Это твоя собственная команда (Да в принципе везде, где включен Friendly Fire, твоя команда это твой основной враг). Но в Left 4 Dead 2 чаще всего вы будете выведены из строя именно товарищами по команде, потому что они думали, что выстрел из дробовика поразит только толпу вокруг вас. Предлагаю несколько советов, как избежать подобных ситуаций:
      ЗНАЙТЕ, ГДЕ НАХОДИТСЯ ВАША КОМАНДА. Вы не сражаетесь в этом бою в одиночку, остальная часть команды тоже стреляет. Если вы видите, что они стреляют, не бегите перед ними. Если вы идете впереди и вам нужно отойти назад, потому что на вас идет толпа, не забывайте, что ваша команда все еще позади вас. ДРОБОВИК ОЗНАЧАЕТ ОТВЕТСТВЕННОСТЬ. Самое лучшее оружие в зомби-апокалипсисе также является худшим кошмаром вашего товарища по команде. Дробь дробовика сильно разлетается и может легко убить половину вашей команды, если вы не будете осторожны. Используйте его, когда вы УВЕРЕННО знаете, что ваша команда в безопасности! ИСПОЛЬЗУЙТЕ ПРАВУЮ МЫШЬ. Пожалуй лучший совет. Если вы не можете стрелять, вступайте в рукопашную. Когда вам нужно сразиться с толпой зомби, пока ваша команда находится прямо за ней, начните бить правой кнопкой мыши, чтобы заставить зомби двигаться в нужном вам направлении, чтобы, наконец, нанести им смертельный выстрел. Также этим очень удобно снимать Охотников с товарищей по команде, не рискуя подстрелить их в процессе. Благодаря этим советам ваша команда обязательно станет намного здоровее к тому времени, когда вы столкнетесь со следующим испытанием!
    • Автор Райан
      Следующий код способен выводить определенную информацию игроку, если он будет набирать необходимые триггер команды, которые вы интегрируете в этот код. Интегрируется все настолько легко, что даже я такой паразит, смог его переделать под свои нужды.
      Кстати, @dr.lex считает этот код мусором ? Но я все же им поделюсь, так как форум в первую очередь рассчитан на новичков.
      Пример работы:
      Сам код, работать в L4D2 будет:
      #include <sourcemod> #include <sdktools> #include <colors> #pragma semicolon 1 #pragma newdecls required public Plugin myinfo = { name = "Информация по триггер запосам", author = "L4D2Noob.Ru", description = "Отображает необходимую информацию по триггер запросам в чате", version = "3.5", url = "https://l4d2noob.ru/" }; ConVar g_site; ConVar g_grup; ConVar g_easteregg; ConVar g_adminka; char g_sBuffer[64]; public void OnPluginStart() { RegConsoleCmd("sm_site", CommandSite); RegConsoleCmd("sm_grup", CommandGrup); RegConsoleCmd("sm_easteregg", CommandEasteregg); RegConsoleCmd("sm_adminka", CommandAdminka); g_site = CreateConVar("sm_link_site", "https://l4d2noob.ru/"); g_grup = CreateConVar("sm_link_grup", "https://steamcommunity.com/groups/l4d2noobru"); g_easteregg = CreateConVar("sm_link_easteregg", "Торта нет"); g_adminka = CreateConVar("sm_link_adminka", "На форуме бесплатно!"); } public Action CommandSite(int client, int args) { g_site.GetString(g_sBuffer, sizeof(g_sBuffer)); CPrintToChat(client, "» \x04Форум для админов и кодеров:\x04 \x05%s", g_sBuffer); return Plugin_Handled; } public Action CommandGrup(int client, int args) { g_grup.GetString(g_sBuffer, sizeof(g_sBuffer)); CPrintToChat(client, "» \x04Группа в Steam:\x04 \x05%s", g_sBuffer); return Plugin_Handled; } public Action CommandEasteregg(int client, int args) { g_easteregg.GetString(g_sBuffer, sizeof(g_sBuffer)); CPrintToChat (client, "» \x04[ОТСЫЛКА]: \x04 \x05%s", g_sBuffer); return Plugin_Handled; } public Action CommandAdminka(int client, int args) { g_adminka.GetString(g_sBuffer, sizeof(g_sBuffer)); CPrintToChat (client, "» \x04[СТАТЬ АДМИНОМ]: \x04 \x05%s", g_sBuffer); return Plugin_Handled; } Ну и готовый пример можно посмотреть на нашем VS#3 сервере.
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...