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

Тема в разделе "Программирование / Скриптинг", создана пользователем awp-sirius, 25 ноя 2012.

  1. awp-sirius

    awp-sirius

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

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

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

    Помогите пожалуйста!:umnik2: знаю C#, а с SourcePawn сталкивался 1 раз, переделывал один плагин, ну чисто слова менял
     
  2. ☆★☆БАТЯ☆★☆™

    ☆★☆БАТЯ☆★☆™

    Сообщения:
    2.585
    Симпатии:
    1.341
    Re: Помогите написать плагиг

    Чет мелковато напостил. ЭТО не пойдет?
     
  3. The End Is Near...

    The End Is Near... Russian Roulette

    Сообщения:
    892
    Симпатии:
    659
    Re: Помогите написать плагиг

    PHP:
    #include <sourcemod>

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

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

    // Обрабатываем
    public Event_OnRoundEnd(Handle:event, const String:name[], bool:dontBroadcast)
    {
        
    // цикл
        
    for(new 0MaxClientsi++)
        {
            
    // Кто в игре
            
    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&
     
    Последнее редактирование: 25 ноя 2012
    awp-sirius нравится это.
  4. awp-sirius

    awp-sirius

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

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

    Flekon aka IceMeN

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

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

    awp-sirius

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

    Во первых я так понимаю в
    должно быть не 2, а 3

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

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

    The End Is Near... Russian Roulette

    Сообщения:
    892
    Симпатии:
    659
    awp-sirius
    Не заметил что цифру не ту поставил
    PHP:
    // Приравниваем к нулю
    0;

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

    // Прибавлем 1 за клиента
    i++
     
  8. awp-sirius

    awp-sirius

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

    awp-sirius

    Сообщения:
    26
    Симпатии:
    0
    найдите ошибки плиз

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

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

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

    знаю 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. и как добавить, что бы этот плагин срабатывал не в каждом раунде, а только когда админ выберет его в меню. ну тоесть на середине раунда админ залез в меню, нажал а в конце уже он сработал
     
    Последнее редактирование модератором: 25 ноя 2012
  10. Flekon

    Flekon aka IceMeN

    Сообщения:
    42
    Симпатии:
    38
    Re: найдите ошибки плиз

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

    awp-sirius

    Сообщения:
    26
    Симпатии:
    0
    Re: найдите ошибки плиз

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


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

    Код:
    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++;
    			}
    
    	}
    }
     
    Последнее редактирование модератором: 25 ноя 2012
  12. The End Is Near...

    The End Is Near... Russian Roulette

    Сообщения:
    892
    Симпатии:
    659
    Ну администраторское меню будет наверное так
    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_hTopMenuADMINMENU_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(buffermaxlength"Перемешать игроков"param);
        }
        else if (
    action == TopMenuAction_SelectOption)
        {
            
    // Устанавливаем 1 если выбрал пункт
            
    Use[param] = 1;
        }
    }
    Далее можно понять, то есть в конце раунда смотришь на Use
    То есть в конце раунда делаешь условие на то что если use равна 1, то значит администратор выбрал пункт

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

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

    awp-sirius

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

    [​IMG]
     
  14. The End Is Near...

    The End Is Near... Russian Roulette

    Сообщения:
    892
    Симпатии:
    659
    Ну вот код (не раб)
    не спец в этом, но что смог
    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_hTopMenuADMINMENU_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(buffermaxlength"Перемешать игроков"param);
        }
        else if (
    action == TopMenuAction_SelectOption)
        {
            
    UseMenu[param] = 1;
            
    PrintToChatAll("\x01\x05[SM] \x03Смешивание игроков произойдет в конце раунда");
            
            for(new 
    1MaxClientsi++) 
            {
                
    t[i] = 0;
                
    ct[i] = 0;
                if(
    IsClientInGame(i) && IsClientConnected(i)) 
                { 
                    new 
    team GetClientTeam(i);
                    if(
    team == 2t[i]++;
                    if(
    team == 3ct[i]++; 
                }
            } 
        }
    }

    public 
    Event_OnRoundEnd(Handle:event, const String:name[], bool:dontBroadcast
    {
        for(new 
    1MaxClientsi++) 
        { 
            if(
    UseMenu[i] == 1
            { 
                if(
    t[i] > 0)
                {
                    
    CS_SwitchTeam(t[GetRandomInt(1t[i])], 3)
                    
    PrintToChatAll("\x01\x05[SM] \x03t >> ct");
                }
                if(
    ct[i] > 0)
                {
                    
    CS_SwitchTeam(ct[GetRandomInt(1ct[i])], 2)
                    
    PrintToChatAll("\x01\x05[SM] \x03ct >> t");
                }
                
    UseMenu[i] = 0;
            }
        } 
    }  
    Ошибка думаю в if(ct > 0) и if(t > 0)
    Пробуй менять что нибудь