Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Показано с 1 по 6 из 6
  1. #1
    Аватар для grc
    Пользователь

    Статус
    Оффлайн
    Регистрация
    15.02.2017
    Сообщений
    12
    Репутация:
    0 ±

    Кол-во игроков на ДМ зоне

    Доброго времени суток, форумчане.

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

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

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

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

  2. #2
    Аватар для StevenH
    Пользователь

    Статус
    Оффлайн
    Регистрация
    13.10.2015
    Сообщений
    516
    Репутация:
    21 ±
    Создай глобальную переменную, например:

    PHP код:
    new deagle_zone// допустим будет зона, где будут игроки бегать с диглом 
    При входе в зону, прибавляй deagle_zone++; // +1
    При выходе из зоны, отбавляй deagle_zone--; // -1

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

  3. #3
    Аватар для vovandolg
    Пользователь

    Статус
    Оффлайн
    Регистрация
    17.11.2015
    Адрес
    Stavropol
    Сообщений
    1,369
    Репутация:
    113 ±
    Можно написать функцию для просчета координат игрока и сравнивать с периметром ганг зоны,
    а можно подключить YSF plugin и перехватить каллбеки:
    PHP код:
    forward OnPlayerEnterGangZone(playeridzoneid);
    forward OnPlayerLeaveGangZone(playeridzoneid); 
    [Anticheat]___Invisible Fly Hack
    [Anticheat]____Weapon/Ammo Hack
    [Function]______ResetPlayerWeaponSlot
    [Function]_______FIX_SetPlayerAmmo
    [ServerMod]______TDM | Zombie Apokalypse

  4. #4
    Аватар для grc
    Пользователь

    Статус
    Оффлайн
    Регистрация
    15.02.2017
    Сообщений
    12
    Репутация:
    0 ±
    Цитата Сообщение от vovandolg Посмотреть сообщение
    Можно написать функцию для просчета координат игрока и сравнивать с периметром ганг зоны,
    а можно подключить YSF plugin и вставить в итерацию игроков эту функцию:
    PHP код:
    native IsPlayerInGangZone(playeridzoneid); 
    С зоны можно просто убежать )
    А проверку находится ли игрок в квадарте зоны я не ставлю, ибо не вижу в этом смысла, так как для каждой зоны присваивается своё значение virtualworld, следовательно на другие ДМ зоны этот игрок не попадет.

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

    upd: в перехватах не силен, увы.
    Последний раз редактировалось grc; 18.02.2017 в 15:35.

  5. #5
    Аватар для vovandolg
    Пользователь

    Статус
    Оффлайн
    Регистрация
    17.11.2015
    Адрес
    Stavropol
    Сообщений
    1,369
    Репутация:
    113 ±
    PHP код:

    #define MAX_GANG_ZONES (500) //макс. кол-во ганг зон

    new ZoneCountPlayers[MAX_GANG_ZONES];

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

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

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

    [Anticheat]___Invisible Fly Hack
    [Anticheat]____Weapon/Ammo Hack
    [Function]______ResetPlayerWeaponSlot
    [Function]_______FIX_SetPlayerAmmo
    [ServerMod]______TDM | Zombie Apokalypse

  6. #6
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Гораздо проще создать новый итератор для foreach, типа такого:

    PHP код:
    #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 ((
    <= dmzoneid sizeof(PlayersInDM)) ? Iter_Count(PlayersInDM[dmzoneid]) : -1); 
    И тем самым сразу убить двух зайцев: добавить возможность выполнять действия только над игроками в ДМ зоне без лишних телодвижений и иметь возможность узнать число игроков на ДМ зоне
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  7. 4 пользователя(ей) сказали cпасибо:
    Daniel_Cortez (18.02.2017) grc (18.02.2017) [ForD] (18.02.2017) Роуди. (24.02.2017)
 

 

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •