работа с циклами

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

  1. awp-sirius

    awp-sirius

    Сообщения:
    26
    Симпатии:
    0
    как я понял происходит зацикливание, но из-за чего не ясно.. вообщем вот рабочий код:
    Код:
    #include <sourcemod> 
    
    public OnPluginStart() 
    { 
    	HookEvent("round_start", round_start, EventHookMode_PostNoCopy);
    } 
    
    public round_start(Handle:event, const String:name[], bool:dontBroadcast)
    { 
    	PrintToChatAll("ы");
    } 

    ну в начале каждого раунда тупо пишется в чат "ы", но если добавляю немного то вообще ничего не происходит:

    Код:
    #include <sourcemod> 
    #include <cstrike>
    
    public OnPluginStart() 
    { 
    	HookEvent("round_start", round_start, EventHookMode_PostNoCopy);
    } 
    
    public round_start(Handle:event, const String:name[], bool:dontBroadcast)
    { 
    	new ct = 0, t = 0, i = 0; //ctp = 0, tp = 0, k = 0
    
    	while (i < MaxClients)
    	{
    		if(IsClientInGame(i))
    		{ 
                // Кто за Т 
    			if(GetClientTeam(i) == 2)
    			{ 
    				// число игроков за Т
    				t=t+1;
    			}
    			// Кто за КТ 
    			if(GetClientTeam(i) == 3) 
    			{ 
    				// число игроков за КТ 
    				ct=ct+1; 
    			}
    		}
    		i=i+1;
    	}
    	PrintToChatAll("ы");
    	PrintToChatAll("Количество КТ: %i", ct); 
    } 

    делал вообще первоначально через цикл for, но там ситуация аналогича.


    P.S. и ещё вопрос, вот как вывести переменную в чат: PrintToChatAll("Количество КТ: %i", ct)?? ну к примеру

    Код:
    new ct = 5;
    PrintToChatAll("Количество КТ: %i", ct);
    работать не будет? %d или %c?

    Нашёл на http://docs.sourcemod.net/api/index.php?fastload=show&id=96&

    PrintToChat(client, "this is a string: %s", stringVariable); // string
    PrintToChat(client, "this is a number: %c", numberVariable); // whole number
    PrintToChat(client, "this is a number: %d", numberVariable); // whole number
    PrintToChat(client, "this is a number: %i", numberVariable); // whole number
    PrintToChat(client, "this is a float: %f", floatVariable); // float
    PrintToChat(client, "this is a float: %t", floatVariable); // float

    но отличий не особо много:( Заранее спасибо
     
  2. Flekon

    Flekon aka IceMeN

    Сообщения:
    42
    Симпатии:
    38
    Проблема в использовании PrintToChat(...) дважды в одном событии.
     
    awp-sirius нравится это.
  3. awp-sirius

    awp-sirius

    Сообщения:
    26
    Симпатии:
    0
    неа.

    сделат так:

    Код:
    #include <sourcemod> 
    #include <cstrike>
    
    public OnPluginStart() 
    { 
    	HookEvent("round_start", round_start, EventHookMode_PostNoCopy);
    } 
    
    public round_start(Handle:event, const String:name[], bool:dontBroadcast)
    { 
    	new ct = 0, t = 0, i = 0; //ctp = 0, tp = 0, k = 0
    	while (i < MaxClients)
    	{
    		if(IsClientInGame(i))
    		{ 
                // Кто за Т 
    			if(GetClientTeam(i) == 2)
    			{ 
    				// число игроков за Т
    				t=t+1;
    			}
    			// Кто за КТ 
    			if(GetClientTeam(i) == 3) 
    			{ 
    				// число игроков за КТ 
    				ct=ct+1; 
    			}
    		}
    		i = i + 1;
    	}
    	PrintToChatAll("КТ %i", ct); 
    } 

    в чат вообще ничего не выводится
     
  4. SenatoR

    SenatoR Модератор

    Сообщения:
    714
    Симпатии:
    270
    Тебе айсмен правильно сказал
     
    Flekon нравится это.
  5. awp-sirius

    awp-sirius

    Сообщения:
    26
    Симпатии:
    0
    так я и говорю что не то что-то( тобишь сделал вообще вот так:

    Код:
    #include <sourcemod> 
    #include <cstrike>
    
    public OnPluginStart() 
    { 
    	HookEvent("round_start", round_start, EventHookMode_PostNoCopy);
    } 
    
    public round_start(Handle:event, const String:name[], bool:dontBroadcast)
    { 
    	new ct = 0, t = 0, i = 0; //ctp = 0, tp = 0, k = 0
    	while (i < MaxClients)
    	{
    		if(IsClientInGame(i))
    		{ 
                // Кто за Т 
    			if(GetClientTeam(i) == 2)
    			{ 
    				// число игроков за Т
    				t=t+1;
    			}
    			// Кто за КТ 
    			if(GetClientTeam(i) == 3) 
    			{ 
    				// число игроков за КТ 
    				ct=ct+1; 
    			}
    		}
    		i = i + 1;
    	}
    	PrintToChatAll("ы"); 
    	//PrintToChatAll("КТ %i", ct); 
    } 

    просто в конце один раз PrintToChatAll("ы"); , везде удалил и ничего всё равно не показывается, если вставить до цикла, то всё норм.

    сервер css v.34
     
  6. Flekon

    Flekon aka IceMeN

    Сообщения:
    42
    Симпатии:
    38
    Ты напиши, что конкретно нужно? Чего ты пытаешься добиться?
     
  7. awp-sirius

    awp-sirius

    Сообщения:
    26
    Симпатии:
    0
    м, щас скину полный код, просто я так понял после этого цикла ничего не выполняется. вот как-то так:

    Код:
    #include <sourcemod> 
    #include <cstrike>
    
    public OnPluginStart() 
    { 
    	HookEvent("round_end", round_end, EventHookMode_PostNoCopy);
    } 
    
    public round_end(Handle:event, const String:name[], bool:dontBroadcast)
    { 
    	new ct = 0, t = 0, i = 0, ctp = 0, tp = 0, k = 0;
    	while (i < MaxClients)
    	{
    		if(IsClientInGame(i))
    		{ 
    			// Кто за Т 
    			if(GetClientTeam(i) == 2)
    			{ 
    				// число игроков за Т
    				t=t+1;
    			}
    			// Кто за КТ 
    			if(GetClientTeam(i) == 3) 
    			{ 
    				// число игроков за КТ 
    				ct=ct+1; 
    			}
    		}
    		i = i + 1;
    	}
    	
    	for(new j = 0; j < (ct + t); j++) 
    	{
    		//случайно присваиваем переменной k 2 или 3
    		k = GetRandomInt(2, 3);
    		if (k == 2)
    		{
    				if (tp == t)
    				{
    					//если команда террористов уже заполнена (тоесть было к примеру 6 человек и уже 6 перемещено), то перемещается за кт
    					CS_SwitchTeam(j, 3);
    					//считает количество перемещённых игроков за кт
    					ctp = ctp + 1;
    				}
    				//если за теров перемещено недостаточно человек (было 6 а переместило только 3-х)
    				else
    				{
    					//перемещает
    					CS_SwitchTeam(j, 2);
    					//считает количество перемещённых игроков за кт
    					tp = tp + 1;
    				}
    		}
    		//далее всё аналогично, только если к = 3
    		else
    		{
    			if (ctp == ct)
    			{
    					CS_SwitchTeam(j, 2);
    					tp = tp + 1;
    			}
    			else
    			{
    				CS_SwitchTeam(j, 3);
    				ctp = ctp + 1;
    			}
    		}
    	}
    } 

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

    пока что получается, что будет работать в конце каждого раунда, но потом буду пытаться как-то связать это с меню админа. мне писали вобщем-то тут, но там нифига не понял) хотя может просто не разбирался, пока это не важно, сам плагин не оробит:(
     
  8. Flekon

    Flekon aka IceMeN

    Сообщения:
    42
    Симпатии:
    38
    Вот попробуй...
    Не тестировал, но должно работать...

    Код:
    #include <sourcemod>
    #include <cstrike>
    
    public OnPluginStart()
    {
        HookEvent("round_end", Event_RoundEnd);
    }
    public Action:Event_RoundEnd(Handle:event, const String:name[], bool:dontBroadcast)
    {
        new ct = 0,
            t = 0;
        for (new i = 1; i <= MaxClients; i++) 
        {
            if(IsClientInGame(i))
            { 
                if(GetClientTeam(i) == 2)
                    t++;
                if(GetClientTeam(i) == 3) 
                    ct++; 
            }
        }
        
        new k;
        new tp = 0,
            ctp = 0;
        for(new j = 1; j < (ct + t); j++) 
        {
            k = GetRandomInt(2, 3);
            if(k == 2)
            {
                if(tp < t)
                {
                    CS_SwitchTeam(j, 2);    
                    tp++;
                }
                else
                {
                    CS_SwitchTeam(j, 3);
                    ctp++;
                }
            }
            else
            {
                if (ctp < ct)
                {
                    CS_SwitchTeam(j, 3);
                    ctp++;
                }
                else
                {
                    CS_SwitchTeam(j, 2);
                    tp++;
                }
            }
        }
    }
     
    Последнее редактирование: 27 ноя 2012
    awp-sirius нравится это.
  9. SenatoR

    SenatoR Модератор

    Сообщения:
    714
    Симпатии:
    270
    хукая евент раунд старт, зачем называть его раунд енд?

    :D
     
    awp-sirius нравится это.
  10. Flekon

    Flekon aka IceMeN

    Сообщения:
    42
    Симпатии:
    38
    Ахахах... Не заметил, сам не знаю как мог так написать..)
    Пишу об одном, а мысли о другом.
    Спасибо тебе, что заметил. Исправил.
     
  11. awp-sirius

    awp-sirius

    Сообщения:
    26
    Симпатии:
    0
    хм) работает, а индексы начинаются с 0? тоесть если количество слотов на серве 21, то максимальный индекс будет = 20 ?

    ты указал с 1-цы если не ошибаюсь for (new i = 1...
     
    Последнее редактирование: 27 ноя 2012
  12. Flekon

    Flekon aka IceMeN

    Сообщения:
    42
    Симпатии:
    38
    Нет.
    Индексы игроков начинаются с 1.
    Поэтому и в цикле от одного, до макс.игроков...
     
  13. The End Is Near...

    The End Is Near... Russian Roulette

    Сообщения:
    893
    Симпатии:
    659
    awp-sirius
    Если
    PHP:
    new awp[MAXPLAYERS+1];
    то значит значит индекс игрока от 1 до количества слотов
    так например
    если у тебя 4 слота, то можно делать так
    PHP:
    new awp[4+1];
    или сразу так
    PHP:
    new awp[5];
    То есть получается в этом примере, что индекс игрока от 1 до 4

    P.S. wS
     
    awp-sirius нравится это.
  14. awp-sirius

    awp-sirius

    Сообщения:
    26
    Симпатии:
    0
    хм, ну ладно думаю не важно вот тут же всех игроков проверяет?
    Код:
    for(new j = 1; j <= MaxClients; j++)
    я ща про другое ещё спросить хотел вот так правильно?

    Код:
    if ((GetClientTeam(j) != 1) && (GetClientTeam(j) != 0) && (IsClientInGame(j))
     
  15. Flekon

    Flekon aka IceMeN

    Сообщения:
    42
    Симпатии:
    38
    Да, всех.
    Ну должно работать.
    Но я бы сделал так:
    Код:
    if(GetClientTeam(j) > 1 && IsClientInGame(j))
     
    awp-sirius нравится это.
  16. awp-sirius

    awp-sirius

    Сообщения:
    26
    Симпатии:
    0
    ну вот теперь вроде бы точно всё)) с самим плагином, ну не считая там версии какой-нибудь и тп) вот:

    Код:
    #include <sourcemod>
    #include <cstrike>
    
    public OnPluginStart()
    {
        HookEvent("round_end", Event_RoundEnd);
    }
    public Action:Event_RoundEnd(Handle:event, const String:name[], bool:dontBroadcast)
    {
        new ct = 0,
            t = 0;
        for (new i = 1; i <= MaxClients; i++) 
        {
            if(IsClientInGame(i))
            { 
                if(GetClientTeam(i) == 2)
                    t++;
                if(GetClientTeam(i) == 3) 
                    ct++; 
            }
        }
    
        new k;
        new tp = 0, ctp = 0;
        for(new j = 1; j <= MaxClients; j++) 
        {
    		if ((GetClientTeam(j) != 1) && (GetClientTeam(j) != 0) && (IsClientInGame(j))
    		{
    			k = GetRandomInt(2, 3);
    			if(k == 2)
    			{
    				if(tp < t)
    				{
    					CS_SwitchTeam(j, 2);    
    					tp++;
    				}
    				else
    				{
    					CS_SwitchTeam(j, 3);
    					ctp++;
    				}
    			}
    			else
    			{
    				if (ctp < ct)
    				{
    					CS_SwitchTeam(j, 3);
    					ctp++;
    				}
    				else
    				{
    					CS_SwitchTeam(j, 2);
    					tp++;
    				}
    			}
    		}
        }
    	PrintToChatAll("[SM] Игроки перемешаны (By s1r1uS)"); 
    }

    как меню сделать?))) вот прописывает в консоле админ "sm_admin" у него появляется меню. ну типо управление игроками, управление сервером, управление голосованиями, Карта, и тп, вот как туда засунуть что бы не очень сложно.

    Можно даже что бы внутри не было ещё 1-го меню. ну как к примеру когда нажимаешь на "Управление игроками" ещё список появляется: Убить игрока, шлёпнуть и тд.


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

    Добавлено через 1 минуту
    Тупанул :-D
     
    Последнее редактирование: 27 ноя 2012
  17. Flekon

    Flekon aka IceMeN

    Сообщения:
    42
    Симпатии:
    38
    Ахахах... Это как напишите мне плагин, который я хочу бесплатно.

    Оффтоп
     
    SenatoR нравится это.
  18. The End Is Near...

    The End Is Near... Russian Roulette

    Сообщения:
    893
    Симпатии:
    659
    Попробуй, не уверен что правильно
    PHP:
    #include <sourcemod>
    #include <adminmenu>
    #include <cstrike>

    new UseMenu[MAXPLAYERS+1];
    new 
    ctt;

    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Смешивание игроков произойдет в конце раунда");
            
    votdlyamenu();
        }
    }

    votdlyamenu()
    {
        
    ct 00;
        for (new 
    1<= MaxClientsi++) 
        {
            if(
    IsClientInGame(i))
            { 
                new 
    team GetClientTeam(i);
                if(
    team == 2t++;
                if(
    team == 3ct++; 
            }
        }
    }

    public 
    Event_OnRoundEnd(Handle:event, const String:name[], bool:dontBroadcast)
    {
        new 
    ktp 0ctp 0;
        
    ct 00;
        for(new 
    1<= MaxClientsj++) 
        {
            if (
    GetClientTeam(j) != && IsClientInGame(j) && UseMenu[j] == 1)
            {
                
    GetRandomInt(23);
                if(
    == 2)
                {
                    if(
    tp t)
                    {
                        
    CS_SwitchTeam(j2);    
                        
    tp++;
                    }
                    else
                    {
                        
    CS_SwitchTeam(j3);
                        
    ctp++;
                    }
                }
                else
                {
                    if (
    ctp ct)
                    {
                        
    CS_SwitchTeam(j3);
                        
    ctp++;
                    }
                    else
                    {
                        
    CS_SwitchTeam(j2);
                        
    tp++;
                    }
                }
                
    UseMenu[j] = 0;
            }
        }
        
    PrintToChatAll("[SM] Игроки перемешаны"); 
    }
     
    Последнее редактирование модератором: 27 ноя 2012
    awp-sirius нравится это.
  19. awp-sirius

    awp-sirius

    Сообщения:
    26
    Симпатии:
    0
    кстати щас пробовал, в чат ничего не пишет. тобишь PrintToChatAll("[SM] Игроки перемешаны"); не работает, хотя перекидывает игроков нормально, не понимаю

    ________________________
    И ещё
    Если думаешь что я такой лентяй, то ты ошибаешься. Уже литературы сколько прочитал, видео уроки даже нашёл, кстати вроде бы с вашего сайта делали, 2 урока

    Просто с синтаксисом и событиями кс разобраться не могу, это не дело 3-х дней

    А так вот могу скинуть игрушку с 0 писал года пол назад где-то: http://rghost.ru/41844210 Ток она под 4-й Framework, скачать тут можно http://www.microsoft.com/ru-ru/download/details.aspx?id=17851

    Добавлено через 21 минуту
    СПАСИБО) работает только из написанного только [SM] ну это я кажись просто забыл кодировку сменить, и вобщем работает только на меня. тоесть включал несколько раз и если и перекидывает то только меня, не думаю, что это совпадение(
     
    Последнее редактирование: 27 ноя 2012
  20. schmidt

    schmidt wS (skype: ws.css)

    Сообщения:
    188
    Симпатии:
    347
    Как можно получить команду игрока, если его нет в игре?

    PHP:
    if (IsClientInGame(j) && GetClientTeam(j) > 1)
    А иногда перед IsClientInGame(j) надо и такую проверку делать: IsValidEntity(j)
    Просто ошибка может быть, если код выполняется сразу после вкл плагина или когда карта меняется.

    Хоть пицот раз в событии - нет ограничений, это не ошибка.
    Оффтоп