Циклы

gameuser425

Участник
Сообщения
30
Реакции
3
Здравствуйте.

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


Научите пожалуйста меня пользоваться циклами)

Переменная MaxClients это что? Максимальное количество игроков на сервере? Или Самый верхний id игрока который находится сейчас на сервере?
То есть, слотов доступно 65. На сервере было 20 игроков, все ушли, а 20 id остался. И функция MaxClients будет равняться 20-ти и указывать что считать нужно до 20-ти?
for(new i = 1; i <= MaxClients; i++)

Ещё вопрос.
В цикле вероятно нужно проверять находится ли игрок на сервере.
C-подобный:
for(new i = 1; i <= MaxClients; i++)
{
    if(IsClientConnected(i))
    {
    }
}
Правильно ли я делаю?


Ещё вопрос.
Почему знающие скриптеры используют в условии цикла i <= MaxClients;" Вот так - "for(new i = 1; i <= MaxClients; i++)

Допустим создал я глобальную переменную.

C-подобный:
#define MAX_PLAYERS (65)
new blablabla[MAX_PLAYERS];

Теперь мне нужно пересчитать игроков и присвоить какие-то значения этой переменной.

C-подобный:
for(new i = 1; i <= MaxClients; i++)
{
blablabla = 8;
}

Ну так вот. Почему цикл начинается с 1? Потому что игроки начинаются с 1, а 0 эти типа консоль? Про нулевую ячейку для консоли я где-то вычитал и ни черта не понял...

Если использовать "i <= MaxClients;" то цикл выходит за рамки массива.
Если объявлять массив new blablabla[MAX_PLAYERS +1]; то не много ли ячеек лишних будет? Ячейки же считаются с нуля вроде как. Получается, на сервере доступно 65 слотов... Нулевую ячейку я использовать не буду, да и прибавлю ещё одну что-бы цикл не выходил за рамки...

А можно сделать вот так???
C-подобный:
#define MAX_PLAYERS (64)
new bool:grenade[MAX_PLAYERS];

public OnMapStart()
{  
    for(new i = 1; i < MaxClients; i++)
    {
        grenade[i-1] = false;//Для того что-бы использовать нулевую ячейку.
    }
}

public void Event_PlayerSpawn(Handle:event, const String:name[], bool:dontBroadcast)
{
    new clientid= GetClientOfUserId(GetEventInt(event, "userid"));
    GivePlayerItem(clientid, "weapon_hegrenade");
    grenade[clientid-1] = true;//Для того что-бы использовать нулевую ячейку.
}

Да и ещё... Почему я первый раз указал MAX_PLAYERS (65), а второй MAX_PLAYERS (64)

Почему в панели управления хостинга я указываю 64 слота, а в игре, в поиске серверов показывает 65 слотов? Резервный слот? Слот "консоли"?
Как правильно указывать мне MAX_PLAYERS в моих скриптах?

Ну и ещё... Есть какие нибудь сообщества? Где можно написать вопрос и пообщаться о нём, узнать больше и вникнуть в тему.
 
Последнее редактирование модератором:

Kaiser

Участник
Сообщения
15
Реакции
2
1. MaxClients это переменная, которая равна количеству слотов на сервере.
2. Правильный цикл по игрокам:
C-подобный:
for (new i = 1; i <= MaxClients; i++)
{
    if (IsClientInGame(i))
    {
        ...
    }
}
3. Объявлять глобальные переменные для всех игроков нужно вот так:
C-подобный:
new blablabla[MAXPLAYERS + 1];
//1. MAXPLAYERS равно 65 и это есть в инклюдах, непонятно зачем ты делал свой дефайн MAX_PLAYERS
//2. Добавление единицы нужно, потому что индекс 0 - это консоль/сервер, как угодно

Вообще, настоятельно рекомендую почитать пару уроков для новичков, там про индексы игроков тоже рассказывается: [SourcePawn] Уроки (Содержание)
 
Последнее редактирование:

Someone

Участник
Сообщения
1,933
Реакции
1,653
1. MaxClients это магическая переменная, которая равна текущему количеству игроков на сервере.
Вообще-то это максимальное число игроков, которое сервер в принципе поддерживает (по крайней мере в CS:GO). А так, в идеале кол-во слотов.
C-подобный:
public const int MaxClients;   /**< Maximum number of players the server supports (dynamic) */
 
Последнее редактирование:

Kaiser

Участник
Сообщения
15
Реакции
2
Вообще-то это максимальное число игроков, которое сервер в принципе поддерживает (по крайней мере в CS:GO). А так, в идеале кол-во слотов.
C-подобный:
public const int MaxClients;   /**< Maximum number of players the server supports (dynamic) */
Да, я не подумав написал одну из догадок другого новичка в SM, которая почему-то отложилась в памяти.
Исправил.
 

DarklSide

Участник
Сообщения
931
Реакции
468
Я только начинаю писать плагины
Есть уроки от R1KO и перевод от Dragokas для понимании основ:
MaxClients и MAXPLAYERS упоминается в разделе "Самые, самые основы".

Ответы на некоторые вопросы:
# Вам не нужно объявлять MAX_PLAYERS, т.к. для этого уже существует в include/clients.inc под другим именем MAXPLAYERS.

"for(new i = 1; i <= MaxClients; i++)"
Если вам нужен использовать 0-ой индекс, то и начинайте с него цикл.
"for(new i = 0; i <= MaxClients; i++)"

new blablabla[MAX_PLAYERS +1]; то не много ли ячеек лишних будет
Как правильно указывать мне MAX_PLAYERS в моих скриптах?
MAX_PLAYERS -> MAXPLAYERS
Т.к. MAXPLAYERS = 65, это максимальное поддерживаемое кол-во игроков "SM".
Индекс entity/сущности 0 = worldspawn,
MaxClients = это максимальное поддерживаемое кол-во игроков "Сервером", макс. слотов на сервере, например через параметр запуска -maxplayers или -maxplayers_override.
Индексы entity/сущности От 1 до MaxClients зарезервированы для игроков.

Для чего увеличивают размер массива на "+ 1"?
Когда сервером используется 65 индекс массива, для того чтобы не выходить за границу массива, мы заранее прибавляем "+ 1".
Например blablabla[MAXPLAYERS] = blablabla[65], допустимые индексы 0-64.
При использовании индекса 65 будет ошибка времени выполнения:
error 032: array index out of bounds;
blablabla[MAXPLAYERS + 1] = blablabla[65 + 1] -> 0-65.

Т.к. MaxClients может быть разный на каждом сервере [слотов], использовать ёё во время объявления глобальной переменной не получится, т.к. она доступна только во времени выполнения, и поэтому её так часто используют в циклах [итерация по игрокам] или при объявления массива размерность которая определяется во время выполнения: "int[] clients = new int[MaxClients];"

Почему используют MAXPLAYERS, а не например 32 [слотов + 1] при создании глоб. переменных, так будет меньше итераций в циклах, а так же будет меньше размер массива?
В циклах, как написал выше, используется MaxClients, а не MAXPLAYERS, поэтому итераций будет столько, сколько нужно для перебора всех доступных игроков/клиентов.
Если размер массива будет [32 + 1], то при применении этого плагина, после компиляции, на сервере где будет больше 32 слотов [например при увеличении слотов], будут ошибки выхода за границу, т.к. размер массива меньше чем используемых слотов на сервере.

MAXPLAYERS из clients.inc после компиляции, дает возможность использовать плагин вне зависимости от того, сколько сервер использует слотов.
 
Сверху Снизу