PDA

Просмотр полной версии : [Вопрос] Кол-во игроков на ДМ зоне



grc
18.02.2017, 15:10
Доброго времени суток, форумчане.

Возник вопрос и два варианта решения. Как, при вызове диалога со списком ДМ зон, выдать количество игроков на этих зонах.
В моде, при входе игрока на зону ему присваивается значение этой зоны. Т.е. можно определить, на какой зоне данный человек находится.

Первый вариант решения: через stock blabla(zoneid) и foreach (т.е. идет проверка всех игроков на сервере, равна ли переменная зоны на которой они находятся и переменная zoneid и в итоге вывести кол-во этих игроков). Но, получается, что если у тебя диалог лист из 10 ДМ зон (к примеру), тогда надо будет вызывать сток 10 раз? И в итоге, если на сервере 200 человек происходит 200*10 = 2000 интераций?

Тогда появляется второй вариант решения: через глобальную переменную. Игрок заходит на определенную зону, глобальная переменная увеличивается, выходит - уменьшается соответственно.

Есть ли другие способы решения данного вопроса? Либо же я ошибаюсь, и первый способ вполне подойдет.

StevenH
18.02.2017, 15:15
Создай глобальную переменную, например:


new deagle_zone; // допустим будет зона, где будут игроки бегать с диглом

При входе в зону, прибавляй deagle_zone++; // +1
При выходе из зоны, отбавляй deagle_zone--; // -1

В итоге, потом выводи эту переменную, куда тебе надо, и все.. Никакие стоки и тд не нужны!

vovandolg
18.02.2017, 15:29
Можно написать функцию для просчета координат игрока и сравнивать с периметром ганг зоны,
а можно подключить YSF plugin и перехватить каллбеки:


forward OnPlayerEnterGangZone(playerid, zoneid);
forward OnPlayerLeaveGangZone(playerid, zoneid);

grc
18.02.2017, 15:33
Можно написать функцию для просчета координат игрока и сравнивать с периметром ганг зоны,
а можно подключить YSF plugin и вставить в итерацию игроков эту функцию:


native IsPlayerInGangZone(playerid, zoneid);

С зоны можно просто убежать )
А проверку находится ли игрок в квадарте зоны я не ставлю, ибо не вижу в этом смысла, так как для каждой зоны присваивается своё значение virtualworld, следовательно на другие ДМ зоны этот игрок не попадет.

Да и проблему с кол-вом интераций это не решает.

upd: в перехватах не силен, увы.

vovandolg
18.02.2017, 16:13
#define MAX_GANG_ZONES (500) //макс. кол-во ганг зон

new ZoneCountPlayers[MAX_GANG_ZONES];

public OnPlayerEnterGangZone(playerid, zoneid)
{
ZoneCountPlayers[zoneid]++;
return 1;
}

public OnPlayerLeaveGangZone(playerid, zoneid)
{
ZoneCountPlayers[zoneid]--;
return 1;
}

//где то в коде, твой перебор ГЗ
for(new i = 0; i < (MAX_GANG_ZONES - 1) ; i++)
{
printf("GZ_ID [%d] | Кол-во игроков внутри GZ [%d]", i, ZoneCountPlayers[i]);
}

DeimoS
18.02.2017, 22:03
Гораздо проще создать новый итератор для foreach, типа такого:


#define MAX_DM_ZONES 10


new Iterator:PlayersInDM[MAX_DM_ZONES]<MAX_PLAYERS>;

public OnGameModeInit()
{
Iter_Init(PlayersInDM);
return 1;
}

//При телепортации на ДМ зону
Iter_Add(PlayersInDM[/*Тут_ID_ДМ_зоны*/], playerid);

//При выходе с ДМ зоны
Iter_Remove(PlayersInDM[/*Тут_ID_ДМ_зоны*/], playerid);

//Для подсчёта числа игроков на ДМ зоне для удобства можно написать такую функцию:
stock GetPlayersInDMZone(dmzoneid)
return ((0 <= dmzoneid < sizeof(PlayersInDM)) ? Iter_Count(PlayersInDM[dmzoneid]) : -1);

И тем самым сразу убить двух зайцев: добавить возможность выполнять действия только над игроками в ДМ зоне без лишних телодвижений и иметь возможность узнать число игроков на ДМ зоне