Помогите написать плагин перемешивающий команды

awp-sirius

Участник
Сообщения
26
Реакции
0
Хочу сделать такой плагин...

В конце раунда все игроки, которые на сервере заносятся в массив, потом там случайным образом перемешиваются и каждому игроку циклом по очереди присваивается команда (т, кт). ну естественно это всё работает когда это выбрал админ в меню.

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

Помогите пожалуйста!:umnik2: знаю C#, а с SourcePawn сталкивался 1 раз, переделывал один плагин, ну чисто слова менял
 

The End Is Near...

Russian Roulette
Сообщения
874
Реакции
691
Re: Помогите написать плагиг

PHP:
#include <sourcemod>

new ct[MAXPLAYERS+1] = 0, t[MAXPLAYERS+1] = 0;

public OnPluginStart()
{
	// Ловим событие конца раунда
	HookEvent("round_end", Event_OnRoundEnd);
}

// Обрабатываем
public Event_OnRoundEnd(Handle:event, const String:name[], bool:dontBroadcast)
{
	// цикл
	for(new i = 0; i < MaxClients; i++)
	{
		// Кто в игре
		if(IsClientInGame(i))
		{
			// Кто за Т
			if(GetClientTeam(i) == 2)
			{
				// число игроков за Т
				t[i]++;
			}
			// Кто за КТ
			if(GetClientTeam(i) == 3)
			{
				// число игроков за КТ
				ct[i]++;
			}
		}
	}
}
Получить рандом http://docs.sourcemod.net/api/index.php?fastload=show&id=96&
Переместить игрока http://docs.sourcemod.net/api/index.php?fastload=show&id=312&
 
Последнее редактирование:

awp-sirius

Участник
Сообщения
26
Реакции
0
Re: Помогите написать плагиг

DoK, а что это? [MAXPLAYERS+1]
 

Flekon

aka IceMeN
Сообщения
41
Реакции
35
Это значит, что плагин создает количество переменных ct и t равное максимальному количеству игроков на сервере + 1.
То есть, на пример, у тебя будет 20 переменных ct[индекс] и t[индекс].

Что то типо этого... Просто не знаю как еще понятнее объяснить, хотя можно эту переменную назвать некоторым массивом с количеством ячеек равным максимально возможному кол-ву игроков +1.
 

awp-sirius

Участник
Сообщения
26
Реакции
0
а вот пример, который скинул мне DoK_1997

Во первых я так понимаю в
// Кто за КТ
if(GetClientTeam(i) == 2)
должно быть не 2, а 3

а во вторых я не пойму. тоесть в массив t будут 1 заноситься?

и в 3-х как тут будут игроки идти? (IsClientInGame(i)) вот это i если = 1, то какого игрока дальше плагин будет рассматривать?
 

The End Is Near...

Russian Roulette
Сообщения
874
Реакции
691
awp-sirius
Не заметил что цифру не ту поставил
PHP:
// Приравниваем к нулю
i = 0;

// i меньше чем клиентов
i < MaxClients;

// Прибавлем 1 за клиента
i++
 

awp-sirius

Участник
Сообщения
26
Реакции
0
ну я понял как узнать количество игроков на сервере, только как теперь каждого занести в массив (я так понимаю с помощью userid) и раскидать их рандомно по командам, так что бы не получилось 3 х 7, а 5х5, ну это грубо говоря
 

awp-sirius

Участник
Сообщения
26
Реакции
0
найдите ошибки плиз

Хочу сделать такой плагин...

В конце раунда все игроки, которые на сервере заносятся в массив, потом там случайным образом перемешиваются и каждому игроку циклом по очереди присваивается команда (т, кт).

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

знаю C# а с этим впервые сталкиваюсь. вот сделал что-то типо кода, там сама суть изложена, уверен с синтаксисом много ошибок

C-подобный:
#include <sourcemod> 

new ct = 0, t = 0, tct[MAXPLAYERS+1] = 0, ctp = 0, tp = 0;



public OnPluginStart() 
{ 
    // Ловим событие конца раунда 
    HookEvent("round_end", Event_OnRoundEnd); 
} 

// Обрабатываем 
public Event_OnRoundEnd(Handle:event, const String:name[], bool:dontBroadcast) 
{ 
    // цикл 
    for(new i = 0; i < MaxClients; i++) 
    { 
        // Кто в игре 
        if(IsClientInGame(i)) 
        { 
            // Кто за Т 
            if(GetClientTeam(i) == 2) 
            { 
                // число игроков за Т 
                t++; 
            } 
            // Кто за КТ 
            if(GetClientTeam(i) == 3) 
            { 
                // число игроков за КТ 
                ct++; 
            } 

		tct[GetClientOfUserId(GetEventInt(i, "userid")];  
        } 
    } 
}  



//когда есть массив tct с userid всех игроков и переменные ct, t в которых содержится колличество игроков в определённой команде:


for(new i = 0; i < (ct + t); i++) 
{
	k = native GetRandomInt(2, 3);
	
	if (k == 2)
	{
		if (tp == t)
			{
			native CS_SwitchTeam(tct[i], 3);
			ctp++;
			}
		else
			{
			native CS_SwitchTeam(tct[i], 2);
			tp++;
			}

	}

	else
	{
	if (ctp == ct)
			{
			native CS_SwitchTeam(tct[i], 2);
			tp++;
			}
		else
			{
			native CS_SwitchTeam(tct[i], 3);
			ctp++;
			}

	}
}
P.S. и как добавить, что бы этот плагин срабатывал не в каждом раунде, а только когда админ выберет его в меню. ну тоесть на середине раунда админ залез в меню, нажал а в конце уже он сработал
 
Последнее редактирование модератором:

Flekon

aka IceMeN
Сообщения
41
Реакции
35
Re: найдите ошибки плиз

Не проще ли тебе заказать этот плагин у того, кто их пишет, и посмотреть код?
Конечно понимаю, что хочется все самому сделать, но то что ты добавил в конце, практически другой плагин.
 

awp-sirius

Участник
Сообщения
26
Реакции
0
Re: найдите ошибки плиз

почему? могу каждую строчку прокомментить:


в начале просто посчитал кол-во теров и ментов, тоесть после срабатывания плагина если играли 5х6 то так же и останется, соотвественно ct кол-во ментов (5), t - теров (6)

C-подобный:
for(new i = 0; i < (ct + t); i++) 
{
//случайно присваиваем переменной k 2 или 3
	k = native GetRandomInt(2, 3);
	
	if (k == 2)
	{
		if (tp == t)
			{
                        //если команда террористов уже заполнена (тоесть было 6 человек и уже 6 перемещено), то перемещается за кт
			native CS_SwitchTeam(tct[i], 3);
                        //считает количество перемещённых игроков за кт
			ctp++;
			}
                //если за теров перемещено недостаточно человек (было 6 а переместило только 3-х)
		else
			{
                        //перемещает
			native CS_SwitchTeam(tct[i], 2);
                        //считает количество перемещённых игроков за кт
			tp++;
			}

	}
//далее всё аналогично, только если к = 3
	else
	{
	if (ctp == ct)
			{
			native CS_SwitchTeam(tct[i], 2);
			tp++;
			}
		else
			{
			native CS_SwitchTeam(tct[i], 3);
			ctp++;
			}

	}
}
 
Последнее редактирование модератором:

The End Is Near...

Russian Roulette
Сообщения
874
Реакции
691
Ну администраторское меню будет наверное так
PHP:
// Узнаем что админгистратор выбрал пункт в меню
new Use[MAXPLAYERS+1] = 0;

new Handle:g_hTopMenu = INVALID_HANDLE;

public OnPluginStart()
{
	new Handle:_hTemp = INVALID_HANDLE;
	if(LibraryExists("adminmenu") && ((_hTemp = GetAdminTopMenu()) != INVALID_HANDLE))
	{
		OnAdminMenuReady(_hTemp);
	}
} 

public OnLibraryRemoved(const String:name[])
{
	if(StrEqual(name, "adminmenu"))
		g_hTopMenu = INVALID_HANDLE;
}

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

	g_hTopMenu = topmenu;
	
	new TopMenuObject:server_commands = FindTopMenuCategory(g_hTopMenu, ADMINMENU_SERVERCOMMANDS);
	if(server_commands != INVALID_TOPMENUOBJECT)
	{
		AddToTopMenu(g_hTopMenu, 
			"switch",
			TopMenuObject_Item,
			swithmenu,
			server_commands,
			"switch",
			ADMFLAG_CHAT);
	}
}

public swithmenu(Handle:topmenu,
                         TopMenuAction:action,
                         TopMenuObject:object_id,
                         param,
                         String:buffer[],
                         maxlength)
{
	if ((action == TopMenuAction_DisplayOption) || (action == TopMenuAction_DisplayTitle))
	{
		Format(buffer, maxlength, "Перемешать игроков", param);
	}
	else if (action == TopMenuAction_SelectOption)
	{
		// Устанавливаем 1 если выбрал пункт
		Use[param] = 1;
	}
}
Далее можно понять, то есть в конце раунда смотришь на Use
То есть в конце раунда делаешь условие на то что если use равна 1, то значит администратор выбрал пункт

Кстати используй без native, то есть например CS_SwitchTeam(client, 1)

P.S. Если что то неправильно - я не виноватЪ :blush2:
 

awp-sirius

Участник
Сообщения
26
Реакции
0
попробовал скомпилировать.. ошибка:

ac45b74c24c8.jpg
 

The End Is Near...

Russian Roulette
Сообщения
874
Реакции
691
Ну вот код (не раб)
не спец в этом, но что смог
PHP:
#include <sourcemod>
#include <adminmenu>
#include <cstrike>

new UseMenu[MAXPLAYERS+1];

new t[MAXPLAYERS+1];
new ct[MAXPLAYERS+1];

new Handle:g_hTopMenu = INVALID_HANDLE;

public OnPluginStart()
{
	new Handle:_hTemp = INVALID_HANDLE;
	
	if(LibraryExists("adminmenu") && ((_hTemp = GetAdminTopMenu()) != INVALID_HANDLE))
	{
		OnAdminMenuReady(_hTemp);
	}

	HookEvent("round_end", Event_OnRoundEnd); 
} 

public OnLibraryRemoved(const String:name[])
{
	if(StrEqual(name, "adminmenu"))
	{
		g_hTopMenu = INVALID_HANDLE;
	}
}

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

	g_hTopMenu = topmenu;
	
	new TopMenuObject:server_commands = FindTopMenuCategory(g_hTopMenu, ADMINMENU_SERVERCOMMANDS);
	if(server_commands != INVALID_TOPMENUOBJECT)
	{
		AddToTopMenu(g_hTopMenu, 
			"switch",
			TopMenuObject_Item,
			swithmenu,
			server_commands,
			"switch",
			ADMFLAG_CHAT);
	}
}

public swithmenu(Handle:topmenu,
                         TopMenuAction:action,
                         TopMenuObject:object_id,
                         param,
                         String:buffer[],
                         maxlength)
{
	if ((action == TopMenuAction_DisplayOption) || (action == TopMenuAction_DisplayTitle))
	{
		Format(buffer, maxlength, "Перемешать игроков", param);
	}
	else if (action == TopMenuAction_SelectOption)
	{
		UseMenu[param] = 1;
		PrintToChatAll("\x01\x05[SM] \x03Смешивание игроков произойдет в конце раунда");
		
		for(new i = 1; i < MaxClients; i++) 
		{
			t[i] = 0;
			ct[i] = 0;
			if(IsClientInGame(i) && IsClientConnected(i)) 
			{ 
				new team = GetClientTeam(i);
				if(team == 2) t[i]++;
				if(team == 3) ct[i]++; 
			}
		} 
	}
}

public Event_OnRoundEnd(Handle:event, const String:name[], bool:dontBroadcast) 
{
	for(new i = 1; i < MaxClients; i++) 
	{ 
		if(UseMenu[i] == 1) 
		{ 
			if(t[i] > 0)
			{
				CS_SwitchTeam(t[GetRandomInt(1, t[i])], 3)
				PrintToChatAll("\x01\x05[SM] \x03t >> ct");
			}
			if(ct[i] > 0)
			{
				CS_SwitchTeam(ct[GetRandomInt(1, ct[i])], 2)
				PrintToChatAll("\x01\x05[SM] \x03ct >> t");
			}
			UseMenu[i] = 0;
		}
	} 
}

Ошибка думаю в if(ct > 0) и if(t > 0)
Пробуй менять что нибудь
 
Сверху Снизу