Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 1 из 2 1 2 ПоследняяПоследняя
Показано с 1 по 10 из 11
  1. #1
    Аватар для TheMallard
    Пользователь

    Статус
    Оффлайн
    Регистрация
    08.12.2015
    Адрес
    San Fierro
    Сообщений
    217
    Репутация:
    39 ±

    Большой массив

    Хочу сделать систему, которая будет присваивать уровень розыска игроку, который напал на другого.
    При этом мне нужно, чтобы атакованный игрок (игроки) мог применить самооборону, но за это не получить розыска. А также так, чтобы розыск давался лишь один раз.
    Для этого я планирую использовать 2D массив такого вида:
    Код:
    new WantedInfo[MAX_PLAYERS][MAX_PLAYERS];
    Вопрос: можно ли выполнить это как-нибудь экономнее? И это нужно сделать неограниченным количеством людей (массовая драка).

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

    Статус
    Оффлайн
    Регистрация
    20.12.2017
    Сообщений
    36
    Репутация:
    0 ±
    Есть второй вариант объяснения? Ибо вообще не понятно, что вам нужно.

  3. #3
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2590 ±
    Т.е. что-то вроде "всевидящего ока", которое мониторит весь штат и выдаёт розыск? В таком случае сомнения вызывает не столько реализация, сколько сама задумка, её реалистичность.

    Но да, можно реализовать и экономнее, обойдясь лишь одномерным массивом.
    В enum pInfo добавляем новый элемент:
    PHP код:
    enum pInfo
    {
        
    // ...
        
    pCrimeLevel
    }; 
    Затем, когда игрок получает урон (т.е. в OnPlayerTakeDamage), проверяем, что он пришёлся он от другого игрока и уровень розыска нападающего больше, чем у жертвы. Если да - повышаем уровень розыска у нападающего.
    Естественно, вместо "PlayerInfo" в вашем моде массив может называться по другому.
    PHP код:
    if (issuerid != INVALID_PLAYER_ID && PlayerInfo[issuerid][pCrimeLevel] >= PlayerInfo[playerid][pCrimeLevel])
    {
        
    PlayerInfo[issuerid][pCrimeLevel] += 1;

    Также можно добавить в if ещё одно условие, чтобы ограничить уровень розыска за обычные нападения (например, до 3 звёзд максимум), а также реализовать сохранение/загрузку розыска в файл/БД. Надеюсь, сами дальше разберётесь.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

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

    Статус
    Оффлайн
    Регистрация
    08.12.2015
    Адрес
    San Fierro
    Сообщений
    217
    Репутация:
    39 ±
    Спасибо.

    Я так понимаю, что crimelevel это не wantedlevel?

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

    Статус
    Оффлайн
    Регистрация
    04.01.2015
    Адрес
    Гомель, Беларусь
    Сообщений
    547
    Репутация:
    158 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Но да, можно реализовать и экономнее, обойдясь лишь одномерным массивом.
    В enum pInfo добавляем новый элемент:
    PHP код:
    enum pInfo
    {
        
    // ...
        
    pCrimeLevel
    }; 
    Затем, когда игрок получает урон (т.е. в OnPlayerTakeDamage), проверяем, что он пришёлся он от другого игрока и уровень розыска нападающего больше, чем у жертвы. Если да - повышаем уровень розыска у нападающего.
    Естественно, вместо "PlayerInfo" в вашем моде массив может называться по другому.
    PHP код:
    if (issuerid != INVALID_PLAYER_ID && PlayerInfo[issuerid][pCrimeLevel] >= PlayerInfo[playerid][pCrimeLevel])
    {
        
    PlayerInfo[issuerid][pCrimeLevel] += 1;

    Также можно добавить в if ещё одно условие, чтобы ограничить уровень розыска за обычные нападения (например, до 3 звёзд максимум), а также реализовать сохранение/загрузку розыска в файл/БД. Надеюсь, сами дальше разберётесь.
    Задумка норм, но не учитывается то, что можно атаковать игрока со звёздами розыска за иные преступления: т.е. к примеру имеем игрока с одной звездой, полученной копом как штраф за превышение скорости/угон транспорта/просто потому что он захотел её выдать; имеем игрока вне розыска. И если игрок вне розыска начнёт драку с игроком со звездой (т.е. нападёт первым), то по алгоритму выше ему ничего не прибавится, а прибавится ещё одна лишь игроку со звездой тогда, когда он начнёт защищаться. Так что нужно учитывать ещё и причину, за которую эта звезда розыска была выдана.
    Не хотите постоянно проверять обновления моих скриптов?
    Подключите его последним, после всех остальных
    Nexius's Update Checker

  6. #6
    Аватар для BENGO
    Пользователь

    Статус
    Оффлайн
    Регистрация
    23.12.2017
    Сообщений
    16
    Репутация:
    0 ±
    Сама задумка идиотская для РП режима, и нормальные сервера не используют вообще систему с звездами из синглплеера.
    Советую лучше вообще отказаться от идеи выдачи розыска игроку из вне.

  7. #7
    Аватар для Nexius_Tailer
    Пользователь

    Статус
    Оффлайн
    Регистрация
    04.01.2015
    Адрес
    Гомель, Беларусь
    Сообщений
    547
    Репутация:
    158 ±
    Цитата Сообщение от BENGO Посмотреть сообщение
    Сама задумка идиотская для РП режима, и нормальные сервера не используют вообще систему с звездами из синглплеера.
    Советую лучше вообще отказаться от идеи выдачи розыска игроку из вне.
    Нормальные это какие?) Сами звёзды как раз вполне уместны в рп режиме.
    Не хотите постоянно проверять обновления моих скриптов?
    Подключите его последним, после всех остальных
    Nexius's Update Checker

  8. #8
    Аватар для BENGO
    Пользователь

    Статус
    Оффлайн
    Регистрация
    23.12.2017
    Сообщений
    16
    Репутация:
    0 ±
    Цитата Сообщение от Nexius_Tailer Посмотреть сообщение
    Нормальные это какие?) Сами звёзды как раз вполне уместны в рп режиме.
    Я не собираюсь пиарить, или же оскорблять какие-либо проекты. Хочу донести мысль, что данный подход к системе уместен для донат машин, а не РП режима.
    Мое имхо: не создавать ситуаций, из-за которых розыск будет выдавать сервер, не использовать звезды из сингла, а реализовать лишь причину по-которой выдается розыск.

  9. #9
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2590 ±
    Цитата Сообщение от Nexius_Tailer Посмотреть сообщение
    И если игрок вне розыска начнёт драку с игроком со звездой (т.е. нападёт первым), то по алгоритму выше ему ничего не прибавится, а прибавится ещё одна лишь игроку со звездой тогда, когда он начнёт защищаться.
    Да, в курсе, просто объяснил то, что проще всего реализовать. Вообще, ИМХО, самый адекватный вариант здесь не двумерный массив, а хеш-таблица (для этого понадобится GVar), в которую записывается время (timestamp) нападения игрока A на игрока B по ключу (playerid << (cellbits / charbits * 4) | issuerid) - только так и можно избежать расточительства. Но такой способ куда сложнее, едва ли кто-то возьмётся реализовывать это за бесплатно.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  10. #10
    Аватар для TheMallard
    Пользователь

    Статус
    Оффлайн
    Регистрация
    08.12.2015
    Адрес
    San Fierro
    Сообщений
    217
    Репутация:
    39 ±
    Можете пожалуйста объяснить формулу ключа.

 

 
Страница 1 из 2 1 2 ПоследняяПоследняя

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

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

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

Ваши права

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