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

awp-sirius

Участник
Сообщения
26
Реакции
0
как я понял происходит зацикливание, но из-за чего не ясно.. вообщем вот рабочий код:
C-подобный:
#include <sourcemod> 

public OnPluginStart() 
{ 
	HookEvent("round_start", round_start, EventHookMode_PostNoCopy);
} 

public round_start(Handle:event, const String:name[], bool:dontBroadcast)
{ 
	PrintToChatAll("ы");
}

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

C-подобный:
#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)?? ну к примеру

C-подобный:
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

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

Flekon

aka IceMeN
Сообщения
41
Реакции
35
Проблема в использовании PrintToChat(...) дважды в одном событии.
 

awp-sirius

Участник
Сообщения
26
Реакции
0
неа.

сделат так:

C-подобный:
#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); 
}

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

SenatoR

Участник
Сообщения
773
Реакции
344
неа.

сделат так:

C-подобный:
#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); 
}

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

Тебе айсмен правильно сказал
 

awp-sirius

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

C-подобный:
#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
 

Flekon

aka IceMeN
Сообщения
41
Реакции
35
Ты напиши, что конкретно нужно? Чего ты пытаешься добиться?
 

awp-sirius

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

C-подобный:
#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;
			}
		}
	}
}

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

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

Flekon

aka IceMeN
Сообщения
41
Реакции
35
Вот попробуй...
Не тестировал, но должно работать...

C-подобный:
#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++;
            }
        }
    }
}
 
Последнее редактирование:

SenatoR

Участник
Сообщения
773
Реакции
344
хукая евент раунд старт, зачем называть его раунд енд?

:D
 

Flekon

aka IceMeN
Сообщения
41
Реакции
35
Ахахах... Не заметил, сам не знаю как мог так написать..)
Пишу об одном, а мысли о другом.
Спасибо тебе, что заметил. Исправил.
 

awp-sirius

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

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

Flekon

aka IceMeN
Сообщения
41
Реакции
35
Нет.
Индексы игроков начинаются с 1.
Поэтому и в цикле от одного, до макс.игроков...
 

The End Is Near...

Russian Roulette
Сообщения
874
Реакции
691
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

Участник
Сообщения
26
Реакции
0
хм, ну ладно думаю не важно вот тут же всех игроков проверяет?
C-подобный:
for(new j = 1; j <= MaxClients; j++)

я ща про другое ещё спросить хотел вот так правильно?

C-подобный:
if ((GetClientTeam(j) != 1) && (GetClientTeam(j) != 0) && (IsClientInGame(j))
 

Flekon

aka IceMeN
Сообщения
41
Реакции
35
хм, ну ладно думаю не важно вот тут же всех игроков проверяет?
C-подобный:
for(new j = 1; j <= MaxClients; j++)
я ща про другое ещё спросить хотел вот так правильно?

C-подобный:
if ((GetClientTeam(j) != 1) && (GetClientTeam(j) != 0) && (IsClientInGame(j))

Да, всех.
Ну должно работать.
Но я бы сделал так:
C-подобный:
if(GetClientTeam(j) > 1 && IsClientInGame(j))
 

awp-sirius

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

C-подобный:
#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 минуту
Но я бы сделал так:
C-подобный:
if(GetClientTeam(j) > 1 && IsClientInGame(j))

Тупанул :-D
 
Последнее редактирование:

Flekon

aka IceMeN
Сообщения
41
Реакции
35
Ахахах... Это как напишите мне плагин, который я хочу бесплатно.

Оффтоп
 

The End Is Near...

Russian Roulette
Сообщения
874
Реакции
691
Попробуй, не уверен что правильно
PHP:
#include <sourcemod>
#include <adminmenu>
#include <cstrike>

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

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

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

public Event_OnRoundEnd(Handle:event, const String:name[], bool:dontBroadcast)
{
    new k, tp = 0, ctp = 0;
	ct = 0, t = 0;
	for(new j = 1; j <= MaxClients; j++) 
	{
		if (GetClientTeam(j) != 1 && IsClientInGame(j) && UseMenu[j] == 1)
		{
			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++;
				}
			}
			UseMenu[j] = 0;
		}
	}
	PrintToChatAll("[SM] Игроки перемешаны"); 
}
 
Последнее редактирование модератором:

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 минуту
Попробуй, не уверен что правильно
PHP:
#include <sourcemod>
#include <adminmenu>
#include <cstrike>

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

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

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

public Event_OnRoundEnd(Handle:event, const String:name[], bool:dontBroadcast)
{
    new k, tp = 0, ctp = 0;
	ct = 0, t = 0;
	for(new j = 1; j <= MaxClients; j++) 
	{
		if (GetClientTeam(j) != 1 && IsClientInGame(j) && UseMenu[j] == 1)
		{
			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++;
				}
			}
			UseMenu[j] = 0;
		}
	}
	PrintToChatAll("[SM] Игроки перемешаны"); 
}

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

_wS_

Участник
Сообщения
383
Реакции
760
Да, всех.
Ну должно работать.
Но я бы сделал так:
C-подобный:
if(GetClientTeam(j) > 1 && IsClientInGame(j))
Как можно получить команду игрока, если его нет в игре?

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

Проблема в использовании PrintToChat(...) дважды в одном событии.
Хоть пицот раз в событии - нет ограничений, это не ошибка.
Оффтоп
 
Сверху Снизу